From 42b351127d1aea17ce932c438dd0b473f0324cd2 Mon Sep 17 00:00:00 2001 From: voed Date: Tue, 10 Jul 2018 12:50:31 +0300 Subject: [PATCH 01/98] Fix for precache_event (#490) --- amxmodx/amxmodx.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index bfd7ee5e..ee0eac70 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -4699,7 +4699,8 @@ AMX_NATIVE_INFO amxmodx_Natives[] = {"plugin_flags", plugin_flags}, {"precache_model", precache_model}, {"precache_sound", precache_sound}, - {"precache_generic", precache_generic}, + {"precache_generic", precache_generic}, + {"precache_event", precache_event}, {"random_float", random_float}, {"random_num", random_num}, {"read_argc", read_argc}, From 66e3fa6db225fa2537566708bb59436600cfe78f Mon Sep 17 00:00:00 2001 From: IgnacioFDM Date: Tue, 10 Jul 2018 06:57:37 -0300 Subject: [PATCH 02/98] Fix typo (#488) --- plugins/include/cellarray.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/cellarray.inc b/plugins/include/cellarray.inc index 992e42cd..20313440 100644 --- a/plugins/include/cellarray.inc +++ b/plugins/include/cellarray.inc @@ -239,7 +239,7 @@ native ArraySetString(Array:which, item, const input[]); native ArrayPushArray(Array:which, const any:input[], size = -1); /** - * Creates a new item ath the end of the array and sets the item's single cell + * Creates a new item at the end of the array and sets the item's single cell * value. * * @param which Array handle From 339a27579d966394dc450f8bf918029e3f3be218 Mon Sep 17 00:00:00 2001 From: voed Date: Tue, 10 Jul 2018 12:59:53 +0300 Subject: [PATCH 03/98] Improved mprop description (#478) --- plugins/include/newmenus.inc | 85 +++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 15 deletions(-) diff --git a/plugins/include/newmenus.inc b/plugins/include/newmenus.inc index 5d42cb19..4ded31d9 100644 --- a/plugins/include/newmenus.inc +++ b/plugins/include/newmenus.inc @@ -12,31 +12,86 @@ #endif #define _newmenus_included -#define MEXIT_ALL 1 /* Menu will have an exit option (default)*/ -#define MEXIT_FORCE 2 /* Menu will have an exit option, even when pagination is disabled. +/** + * @section Menu properties for using in menu_setprop + */ + +/** + * Menu will have an exit option (default) + */ +#define MEXIT_ALL 1 + +/** + * Menu will have an exit option, even when pagination is disabled. * There have to be less than 10 items in the menu or it won't appear. The exit * option will be appended to the last item with no extra slot padding. If you - * want it in the 10th slot you have to pad it manually with menu_addblank2 */ -#define MEXIT_NEVER -1 /* Menu will not have an exit option */ + * want it in the 10th slot you have to pad it manually with menu_addblank2 + */ +#define MEXIT_FORCE 2 -#define MPROP_PERPAGE 1 /* Number of items per page (param1 = number, 0=no paginating, 7=default) */ -#define MPROP_BACKNAME 2 /* Name of the back button (param1 = string) */ -#define MPROP_NEXTNAME 3 /* Name of the next button (param1 = string) */ -#define MPROP_EXITNAME 4 /* Name of the exit button (param1 = string) */ -#define MPROP_TITLE 5 /* Menu title text (param1 = string) */ -#define MPROP_EXIT 6 /* Exit functionality (param1 = number, see MEXIT constants) */ -#define MPROP_NOCOLORS 8 /* Sets whether colors are not auto (param1 = number, 0=default) */ -#define MPROP_NUMBER_COLOR 10 /* Color indicator to use for numbers (param1 = string, "\r"=default) */ -#define MPROP_PAGE_CALLBACK 11 /* Function to be called on Back and Next (param1 = string) */ - /* public function(id, status); where status is either MENU_BACK or MENU_MORE */ - /* Pass NULL_STRING to disable the callback */ +/** + * Menu will not have an exit option + */ +#define MEXIT_NEVER -1 +/** + * Number of items per page (param1 = number, 0=no paginating, 7=default) + */ +#define MPROP_PERPAGE 1 + +/** + * Name of the back button (param1 = string) + */ +#define MPROP_BACKNAME 2 + +/** + * Name of the next button (param1 = string) + */ +#define MPROP_NEXTNAME 3 + +/** + * Name of the exit button (param1 = string) + */ +#define MPROP_EXITNAME 4 + +/** + * Menu title text (param1 = string) + */ +#define MPROP_TITLE 5 + +/** + * Exit functionality (param1 = number, see MEXIT constants) + */ +#define MPROP_EXIT 6 + +/** + * Sets whether colors are not auto (param1 = number, 0=default) + */ +#define MPROP_NOCOLORS 8 + +/** + * Color indicator to use for numbers (param1 = string, "\r"=default) + */ +#define MPROP_NUMBER_COLOR 10 + +/** + * Function to be called on Back and Next (param1 = string) + * public function(id, status); where status is either MENU_BACK or MENU_MORE + * Pass NULL_STRING to disable the callback + */ +#define MPROP_PAGE_CALLBACK 11 + +/** + * @deprecated + */ #define MEXIT_NORMAL 0 /* DEPRECATED, do not use (has no effect) */ #define MENUPAD_NONE 0 /* DEPRECATED, do not use (has no effect) */ #define MENUPAD_PAGE 1 /* DEPRECATED, do not use (has no effect) */ #define MPROP_ORDER 7 /* DEPRECATED, do not use (has no effect) */ #define MPROP_PADMENU 9 /* DEPRECATED, do not use (has no effect) */ +/** @endsection */ + /** * @brief Creates a new menu object. * From 528fec1a29125e5b976d00b61bd4d357a8ec8819 Mon Sep 17 00:00:00 2001 From: OciXCrom Date: Tue, 10 Jul 2018 12:02:47 +0200 Subject: [PATCH 04/98] Macedonian & Bulgarian translation fix (#477) * Macedonian & Bulgarian translations fix * Macedonian & Bulgarian translations fix --- plugins/lang/admin.txt | 34 ++--- plugins/lang/adminchat.txt | 28 ++--- plugins/lang/admincmd.txt | 226 +++++++++++++++++----------------- plugins/lang/adminhelp.txt | 24 ++-- plugins/lang/adminslots.txt | 10 +- plugins/lang/adminvote.txt | 70 +++++------ plugins/lang/antiflood.txt | 4 +- plugins/lang/cmdmenu.txt | 6 +- plugins/lang/common.txt | 50 ++++---- plugins/lang/imessage.txt | 4 +- plugins/lang/mapchooser.txt | 22 ++-- plugins/lang/menufront.txt | 46 +++---- plugins/lang/miscstats.txt | 112 ++++++++--------- plugins/lang/multilingual.txt | 32 ++--- plugins/lang/nextmap.txt | 10 +- plugins/lang/pausecfg.txt | 131 ++++++++++---------- plugins/lang/plmenu.txt | 42 +++---- plugins/lang/restmenu.txt | 166 +++++++++++++++++-------- plugins/lang/scrollmsg.txt | 12 +- plugins/lang/stats_dod.txt | 164 ++++++++++++------------ plugins/lang/statscfg.txt | 78 ++++++------ plugins/lang/statsx.txt | 104 ++++++++-------- plugins/lang/telemenu.txt | 4 +- plugins/lang/time.txt | 16 +-- plugins/lang/timeleft.txt | 12 +- 25 files changed, 735 insertions(+), 672 deletions(-) diff --git a/plugins/lang/admin.txt b/plugins/lang/admin.txt index f1dc2c98..32b42784 100755 --- a/plugins/lang/admin.txt +++ b/plugins/lang/admin.txt @@ -168,17 +168,17 @@ PRIV_SET = Etuoikeudet laitettu NO_ENTRY = Sinulla ei ole merkintaa palvelimella... [bg] -LOADED_ADMIN = Nameren e edin administrator ot fila. -LOADED_ADMINS = Namereni sa %d administratori ot fila -SQL_CANT_CON = SQL gre6ka: nemoje da se cannectnete: '%s' -SQL_CANT_LOAD_ADMINS = SQL gre6ka: nemoje da nameri administratori: '%s' -NO_ADMINS = Nemoje da nameri administratori. -SQL_LOADED_ADMIN = Nameren e edin administrator ot database -SQL_LOADED_ADMINS = Namereni %d administratori ot database -INV_PAS = Greshna Parola! +LOADED_ADMIN = Nameren e 1 administrator ot faila. +LOADED_ADMINS = Namereni sa %d administratori ot faila +SQL_CANT_CON = SQL greshka: ne moje da se svurje s: '%s' +SQL_CANT_LOAD_ADMINS = SQL greshka: ne moje da zaredqt administratorite: '%s' +NO_ADMINS = Nqma namereni administratori. +SQL_LOADED_ADMIN = Nameren e 1 administrator ot bazata danni +SQL_LOADED_ADMINS = Namereni sa %d administratori ot bazata danni +INV_PAS = Greshna parola! PAS_ACC = Parolata e prieta PRIV_SET = Priviligiite sa nastroeni -NO_ENTRY = Nqmate vhod kam servara... +NO_ENTRY = Nqmate dostup do servera... [ro] LOADED_ADMIN = 1 administrator a fost incarcat din fisier @@ -233,17 +233,17 @@ PRIV_SET = Privilegium nastavene NO_ENTRY = Nemas ziadny zaznam na servery... [mk] -LOADED_ADMIN = Vcitan e 1 administrator od fajlot -LOADED_ADMINS = Vcitani se %d administratori od fajlot -SQL_CANT_CON = SQL greska: ne e mozno da se vospostavi vrska so: '%s' -SQL_CANT_LOAD_ADMINS = SQL greska: ne e mozno da se vcitaat administratorite: '%s' +LOADED_ADMIN = Vchitan e 1 administrator od fajlot +LOADED_ADMINS = Vchitani se %d administratori od fajlot +SQL_CANT_CON = SQL greshka: ne e mozhno da se vospostavi vrska so: '%s' +SQL_CANT_LOAD_ADMINS = SQL greshka: ne e mozhno da se vchitaat administratorite: '%s' NO_ADMINS = Nema najdeni administratori. -SQL_LOADED_ADMIN = Vcitan e 1 administrator od bazata na podatoci -SQL_LOADED_ADMINS = Vcitani se %d administratori od bazata na podatoci -INV_PAS = Pogresna lozinka! +SQL_LOADED_ADMIN = Vchitan e 1 administrator od bazata na podatoci +SQL_LOADED_ADMINS = Vchitani se %d administratori od bazata na podatoci +INV_PAS = Pogreshna lozinka! PAS_ACC = Lozinkata e prifatena PRIV_SET = Privilegiite se podeseni -NO_ENTRY = Nemate pristap vo serverot... +NO_ENTRY = Nemate pristap do serverot... [hr] LOADED_ADMIN = Ucitan 1 administrator iz datoteke diff --git a/plugins/lang/adminchat.txt b/plugins/lang/adminchat.txt index acda5541..0c303e16 100755 --- a/plugins/lang/adminchat.txt +++ b/plugins/lang/adminchat.txt @@ -168,17 +168,17 @@ COL_MAROON = viininpunainen PRINT_ALL = (KAIKKI) %s : %s [bg] -COL_WHITE = Bql -COL_RED = 4erven +COL_WHITE = bql +COL_RED = cherven COL_GREEN = zelen COL_BLUE = sin -COL_YELLOW = jalt -COL_MAGENTA = magenta -COL_CYAN = cyan -COL_ORANGE = orangev +COL_YELLOW = jult +COL_MAGENTA = rozov +COL_CYAN = cian +COL_ORANGE = oranjev COL_OCEAN = okeanski -COL_MAROON = maroon -PRINT_ALL = (ALL) %s : %s +COL_MAROON = kafqv +PRINT_ALL = (VSICHKI) %s : %s [ro] COL_WHITE = alb @@ -236,14 +236,14 @@ PRINT_ALL = (ALL) %s : %s COL_WHITE = bela COL_RED = crvena COL_GREEN = zelena -COL_BLUE = plava -COL_YELLOW = zolta -COL_MAGENTA = ljubicesta +COL_BLUE = sina +COL_YELLOW = zholta +COL_MAGENTA = rozova COL_CYAN = tirkizna COL_ORANGE = portokalova -COL_OCEAN = okean -COL_MAROON = modra -PRINT_ALL = (KON SITE) %s : %s +COL_OCEAN = okeansko sino +COL_MAROON = kafeava +PRINT_ALL = (SITE) %s : %s [hr] COL_WHITE = bijela diff --git a/plugins/lang/admincmd.txt b/plugins/lang/admincmd.txt index b3113189..e540231c 100755 --- a/plugins/lang/admincmd.txt +++ b/plugins/lang/admincmd.txt @@ -1,7 +1,7 @@ -[en] +[en] ADMIN_KICK_1 = ADMIN: kick %s ADMIN_KICK_2 = ADMIN %s: kick %s -IP_REMOVED = Ip "%s" removed from ban list +IP_REMOVED = IP "%s" removed from ban list AUTHID_REMOVED = Authid "%s" removed from ban list ADMIN_UNBAN_1 = ADMIN: unban %s ADMIN_UNBAN_2 = ADMIN %s: unban %s @@ -978,76 +978,76 @@ MAP_EXTENDED = Kartta "%s" Has ollut laajennettu varten %d minuuttia [bg] ADMIN_KICK_1 = ADMINISTRATOR: kickna %s ADMIN_KICK_2 = ADMINISTRATOR %s: kickna %s -IP_REMOVED = Ip "%s" e mahnato ot ban lista -AUTHID_REMOVED = Authid "%s" e mahnato ot ban lista +IP_REMOVED = IP adresut "%s" e premahnat ot ban lista +AUTHID_REMOVED = Authid "%s" e premahnato ot ban lista ADMIN_UNBAN_1 = ADMINISTRATOR: unbanna %s ADMIN_UNBAN_2 = ADMINISTRATOR %s: unbanna %s ADMIN_ADDBAN_1 = ADMINISTRATOR: banna %s ADMIN_ADDBAN_2 = ADMINISTRATOR %s: banna %s BANNED = banna FOR_MIN = za %s minuti -PERM = do jivot -CLIENT_BANNED = Clienta "%s" e bannat +PERM = zavinagi +CLIENT_BANNED = Igrachut "%s" e bannat ADMIN_SLAY_1 = ADMINISTRATOR: slayna %s ADMIN_SLAY_2 = ADMINISTRATOR %s: slayna %s -CLIENT_SLAYED = Clienta "%s" e slaynat -ADMIN_SLAP_1 = ADMINISTRATOR: slapna %s s %d damage -ADMIN_SLAP_2 = ADMINISTRATOR %s: slapna %s s %d damage -CLIENT_SLAPED = Clienta "%s" e slapnat s %d damage -MAP_NOT_FOUND = Karta s tova ime ne e namerena ili kartata e nevalidna +CLIENT_SLAYED = Igrachut "%s" e slaynat +ADMIN_SLAP_1 = ADMINISTRATOR: slapna %s s %d shteta +ADMIN_SLAP_2 = ADMINISTRATOR %s: slapna %s s %d shteta +CLIENT_SLAPED = Igrachut "%s" e slapnat s %d shteta +MAP_NOT_FOUND = Karta s tova ime ne e namerena ili nevalidna ADMIN_MAP_1 = ADMINISTRATOR: smeni kartata na %s ADMIN_MAP_2 = ADMINISTRATOR %s: smeni kartata na %s -NO_MORE_CVARS = Nomeje da se dobavqt pove4e cvars kam rcon dostapa! +NO_MORE_CVARS = Ne moje da se dobavqt poveche cvarove kum rcon dostupa! UNKNOWN_CVAR = Nepoznat cvar: %s UNKNOWN_XVAR = Nepoznat xvar: %s -CVAR_NO_ACC = Nqmate dostap do tozi cvar -XVAR_NO_ACC = Nqmate dostap do tozi xvar -CVAR_IS = Cvar "%s" e "%s" -XVAR_IS = Xvar "%s" e "%s" -PROTECTED = predpazen -SET_CVAR_TO = %s nastroi cvar %s na "%s" -SET_XVAR_TO = %s nastroi xvar %s na "%s" -CVAR_CHANGED = Cvar "%s" smenen na "%s" -XVAR_CHANGED = Xvar "%s" smenen na "%s" -LOADED_PLUGINS = v momenta ka4eni plugini +CVAR_NO_ACC = Nqmate dostup do tozi cvar +XVAR_NO_ACC = Nqmate dostup do tozi xvar +CVAR_IS = Cvarut "%s" e "%s" +XVAR_IS = Xvarut "%s" e "%s" +PROTECTED = ZASHTITEN +SET_CVAR_TO = %s nastroi cvara %s na "%s" +SET_XVAR_TO = %s nastroi xvara %s na "%s" +CVAR_CHANGED = Cvarut "%s" smenen na "%s" +XVAR_CHANGED = Xvarut "%s" smenen na "%s" +LOADED_PLUGINS = Aktivni plugini NAME = ime VERSION = versiq -AUTHOR = pisatel -FILE = fila -STATUS = status -PLUGINS_RUN = %d plugins, %d pusnati -LOADED_MODULES = V momenta ka4eni moduls -NUM_MODULES = %d moduls -FILE_NOT_FOUND = Fila "%s" ne e nameren -ADMIN_CONF_1 = ADMINISTRATOR: izpolzva configuracia %s -ADMIN_CONF_2 = ADMINISTRATOR %s: izpolzva configuracia %s -PAUSED = pausnat -UNPAUSED = pusnat -UNABLE_PAUSE = Servara ne uspq da pausne igrata. Istinski igra4i sa nujni na servara. -SERVER_PROC = Servara e produljen %s -PAUSING = pausing -UNPAUSING = unpausing -PAUSE = pauza -UNPAUSE = produljenie -COM_SENT_SERVER = Comandata "%s" ispratena kam consolata na servara -CLIENTS_ON_SERVER = Clienti na servara -IMMU = imm -RESERV = res -ACCESS = dostap -TOTAL_NUM = Ob6to %d -SKIP_MATCH = propuska "%s" (ednakvi "%s") -SKIP_IMM = propuska "%s" (predpazva) -KICK_PL = Kickva "%s" -YOU_DROPPED = Bqh te isklu4eni poneje administratora iska samo specifi4ni grupi ot clienti da ostanat -KICKED_CLIENTS = Kickna %d clienti +AUTHOR = avtor +FILE = file +STATUS = sustoqnie +PLUGINS_RUN = %d plugini, %d pusnati +LOADED_MODULES = Aktivni moduli +NUM_MODULES = %d moduli +FILE_NOT_FOUND = Failut "%s" ne e nameren +ADMIN_CONF_1 = ADMINISTRATOR: izpolzva konfiguraciqta %s +ADMIN_CONF_2 = ADMINISTRATOR %s: izpolzva konfiguraciqta %s +PAUSED = na pauza +UNPAUSED = aktiven +UNABLE_PAUSE = Servrut ne uspq da postavi igrata na pauza. Nujno e da ima istinski igrachi v servera. +SERVER_PROC = Serverut e produljen %s +PAUSING = postavqne na pauza +UNPAUSING = preustanovqvane +PAUSE = na pauza +UNPAUSE = preustanovi +COM_SENT_SERVER = Komandata "%s" e izpratena kum servernata konzola +CLIENTS_ON_SERVER = Igrachi v servera +IMMU = imu +RESERV = rez +ACCESS = dostup +TOTAL_NUM = Obshto %d +SKIP_MATCH = Propuskane na "%s" (suvpadane na "%s") +SKIP_IMM = Propuskane na "%s" (imunitet) +KICK_PL = Kickvane na "%s" +YOU_DROPPED = Bqhte premahnati, zashtoto administratorut ostavi samo opredelena grupa igrachi +KICKED_CLIENTS = Kickna %d igrachi ADMIN_LEAVE_1 = ADMINISTRATOR: ostavi %s %s %s %s ADMIN_LEAVE_2 = ADMINISTRATOR %s: ostavi %s %s %s %s -ADMIN_NICK_1 = ADMINISTRATOR: smeni imeto ot %s na "%s" -ADMIN_NICK_2 = ADMINISTRATOR %s: smeni imeto ot %s na "%s" -CHANGED_NICK = smeni imeto ot %s na "%s" -ADMIN_EXTEND_1 = ADMIN: udalji kartata s %d minuti -ADMIN_EXTEND_2 = ADMIN %s: udalji kartata s %d minuti -MAP_EXTENDED = Kartata "%s" beshe udaljena s %d minuti +ADMIN_NICK_1 = ADMINISTRATOR: smeni imeto na %s na "%s" +ADMIN_NICK_2 = ADMINISTRATOR %s: smeni imeto na %s na "%s" +CHANGED_NICK = smeni imeto na %s na "%s" +ADMIN_EXTEND_1 = ADMIN: udulji kartata s %d minuti +ADMIN_EXTEND_2 = ADMIN %s: udulji kartata s %d minuti +MAP_EXTENDED = Kartata "%s" beshe uduljena s %d minuti [ro] ADMIN_KICK_1 = ADMIN: kick %s @@ -1349,79 +1349,79 @@ ADMIN_EXTEND_2 = ADMIN %s: cas mapypredlzeny o %d min MAP_EXTENDED = Map "%s" bola predlzena o %d min [mk] -ADMIN_KICK_1 = ADMIN: kick %s -ADMIN_KICK_2 = ADMIN %s: kick %s -IP_REMOVED = Ip adresata "%s" e izbrisana od listata so banirani igraci -AUTHID_REMOVED = Authid "%s" e izbrisan od listata so banirani igraci -ADMIN_UNBAN_1 = ADMIN: mu trgna ban na %s -ADMIN_UNBAN_2 = ADMIN %s: mu trgna ban na %s -ADMIN_ADDBAN_1 = ADMIN: ban %s -ADMIN_ADDBAN_2 = ADMIN %s: ban %s -BANNED = baniran si -REASON = pricina -FOR_MIN = na %s min -PERM = zasekogas -CLIENT_BANNED = Klientot "%s" e baniran -ADMIN_SLAY_1 = ADMIN: slay %s -ADMIN_SLAY_2 = ADMIN %s: slay %s -CLIENT_SLAYED = Klientot "%s" dobi slay -ADMIN_SLAP_1 = ADMIN: mu udri samar na %s so %d steta -ADMIN_SLAP_2 = ADMIN %s: mu udri samar na %s so %d steta -CLIENT_SLAPED = Klientot "%s" e nasamaren so %d steta -MAP_NOT_FOUND = Mapa so toa ime ne e najdena ili ne postoi -ADMIN_MAP_1 = ADMIN: ja smeni mapata vo %s -ADMIN_MAP_2 = ADMIN %s: ja smeni mapata vo %s -NO_MORE_CVARS = Ne e mozno da se dodadat uste komandi za RCON pristap! +ADMIN_KICK_1 = ADMIN: kickna %s +ADMIN_KICK_2 = ADMIN %s: kickna %s +IP_REMOVED = IP adresata "%s" e izbrishana od listata so banirani igrachi +AUTHID_REMOVED = Authid "%s" e izbrishan od listata so banirani igrachi +ADMIN_UNBAN_1 = ADMIN: go otstrani banot na %s +ADMIN_UNBAN_2 = ADMIN %s: go otstrani banot na %s +ADMIN_ADDBAN_1 = ADMIN: banira %s +ADMIN_ADDBAN_2 = ADMIN %s: banira %s +BANNED = baniran +REASON = prichina +FOR_MIN = za %s min +PERM = zasekogash +CLIENT_BANNED = Igrachot "%s" e baniran +ADMIN_SLAY_1 = ADMIN: slayna %s +ADMIN_SLAY_2 = ADMIN %s: slayna %s +CLIENT_SLAYED = Igrachot "%s" beshe slaynat +ADMIN_SLAP_1 = ADMIN: mu udri shamar na %s so %d shteta +ADMIN_SLAP_2 = ADMIN %s: mu udri shamar na %s so %d shteta +CLIENT_SLAPED = Igrachot "%s" e nashamaran so %d shteta +MAP_NOT_FOUND = Mapa so toa ime ne e pronajdena ili ne postoi +ADMIN_MAP_1 = ADMIN: ja smeni mapata na %s +ADMIN_MAP_2 = ADMIN %s: ja smeni mapata na %s +NO_MORE_CVARS = Ne e mozhno da se dodadat ushte komandi za RCON pristap! UNKNOWN_CVAR = Nepoznata komanda: %s UNKNOWN_XVAR = Nepoznata komanda: %s -CVAR_NO_ACC = Nemate pristap na ovaa komanda -XVAR_NO_ACC = Nemate pristap na ovaa komanda +CVAR_NO_ACC = Nemate pristap do ovaa komanda +XVAR_NO_ACC = Nemate pristap do ovaa komanda CVAR_IS = Komandata "%s" e "%s" XVAR_IS = Komandata "%s" e "%s" -PROTECTED = ZASTITENO -SET_CVAR_TO = %s ja izvrsi komandata %s na "%s" -SET_XVAR_TO = %s ja izvrsi komandata %s na "%s" -CVAR_CHANGED = Komandata "%s" e promeneta vo "%s" -XVAR_CHANGED = Komandata "%s" e promeneta vo "%s" -LOADED_PLUGINS = Momentalno vcitani plagini +PROTECTED = ZASHTITEN +SET_CVAR_TO = %s go promeni cvarot %s na "%s" +SET_XVAR_TO = %s go promeni xvarot %s na "%s" +CVAR_CHANGED = Cvarot "%s" e promenet na "%s" +XVAR_CHANGED = Xvarot "%s" e promenet na "%s" +LOADED_PLUGINS = Aktivni plugini NAME = ime VERSION = verzija AUTHOR = avtor FILE = fajl STATUS = status -PLUGINS_RUN = %d plagini, %d se aktivni -LOADED_MODULES = Momentalno vcitani moduli +PLUGINS_RUN = %d plugini, %d aktivni +LOADED_MODULES = Momentalno vchitani moduli NUM_MODULES = %d moduli FILE_NOT_FOUND = Fajlot "%s" ne e pronajden -ADMIN_CONF_1 = ADMIN: ja izvrsi konfiguracijata %s -ADMIN_CONF_2 = ADMIN %s: ja izvrsi konfiguracijata %s +ADMIN_CONF_1 = ADMIN: ja aktivira konfiguracijata %s +ADMIN_CONF_2 = ADMIN %s: ja aktivira konfiguracijata %s PAUSED = pauza -UNPAUSED = ne e veke pauza -UNABLE_PAUSE = Serverot ne mozese da ja pauzira igrata. Na serverot mu se potrebni vistinski igraci. -SERVER_PROC = Server proceed %s +UNPAUSED = ne e vekje na pauza +UNABLE_PAUSE = Serverot ne mozheshe da ja pauzira igrata. Potrebni se vistinski igrachi. +SERVER_PROC = Serverot prodolzhi %s PAUSING = pauziram -UNPAUSING = pustam -PAUSE = pauza na -UNPAUSE = ne e veke pauza na -COM_SENT_SERVER = Komandata "%s" e pratena na konzolata od serverot -CLIENTS_ON_SERVER = Klienti na serverot -IMMU = imm -RESERV = res +UNPAUSING = pushtam +PAUSE = pauza +UNPAUSE = ne e vekje na pauza +COM_SENT_SERVER = Komandata "%s" e pratena do konzolata na serverot +CLIENTS_ON_SERVER = Igrachi na serverot +IMMU = imu +RESERV = rez ACCESS = pristap TOTAL_NUM = Vkupno %d -SKIP_MATCH = Preskokam: "%s" (Se poklopuvaat: "%s") -SKIP_IMM = Preskokam: "%s" (imunitet) -KICK_PL = kiknuvam: "%s" -YOU_DROPPED = Vie ste isfrleni bidejki adminot ostavi samo izbrana grupa na igraci -KICKED_CLIENTS = Kiknati se %d klienti +SKIP_MATCH = Preskoknuvam: "%s" (sovpagjam: "%s") +SKIP_IMM = Preskoknuvam: "%s" (imunitet) +KICK_PL = Kickam: "%s" +YOU_DROPPED = Vie bevte otstraneti, bidejkji administratorot ostavi samo izbrana grupa na igrachi +KICKED_CLIENTS = Kicknati se %d igrachi ADMIN_LEAVE_1 = ADMIN: ostavi %s %s %s %s ADMIN_LEAVE_2 = ADMIN %s: ostavi %s %s %s %s -ADMIN_NICK_1 = ADMIN: go promeni imeto na %s vo "%s" -ADMIN_NICK_2 = ADMIN %s: go promeni imeto na %s vo "%s" -CHANGED_NICK = Smeneto e imeto na %s vo "%s" -ADMIN_EXTEND_1 = ADMIN: produljiti mapa za %d minuta -ADMIN_EXTEND_2 = ADMIN %s: protezu mapa za %d minuta -MAP_EXTENDED = Mapa "%s" je produzen za %d minuta +ADMIN_NICK_1 = ADMIN: go promeni imeto na %s na "%s" +ADMIN_NICK_2 = ADMIN %s: go promeni imeto na %s na "%s" +CHANGED_NICK = Smeneto e imeto na %s na "%s" +ADMIN_EXTEND_1 = ADMIN: ja prodolzhi mapata za %d minuti +ADMIN_EXTEND_2 = ADMIN %s: ja prodolzhi mapata za %d minuti +MAP_EXTENDED = Mapata "%s" e prodolzhena za %d minuti [hr] ADMIN_KICK_1 = ADMIN: kickao %s @@ -1566,7 +1566,7 @@ ADMIN_LEAVE_1 = ADMIN: ostavi %s %s %s %s ADMIN_LEAVE_2 = ADMIN %s: ostavi %s %s %s %s ADMIN_NICK_1 = ADMIN: promijenio nick %s u "%s" ADMIN_NICK_2 = ADMIN %s: promijenio nick of %s u "%s" -CHANGED_NICK = Promijenjen nick %s u "%s +CHANGED_NICK = Promijenjen nick %s u "%s" ADMIN_EXTEND_1 = ADMIN: protegnuti karta za %d minuta igre ADMIN_EXTEND_2 = ADMIN %s: protegnuti karta za %d minuta igre MAP_EXTENDED = Karta "%s" je dugotrajan za %d minuta igre diff --git a/plugins/lang/adminhelp.txt b/plugins/lang/adminhelp.txt index 6910bb94..2a2a249f 100755 --- a/plugins/lang/adminhelp.txt +++ b/plugins/lang/adminhelp.txt @@ -121,13 +121,13 @@ TIME_INFO_1 = Aikaa jaljella: %d:%02d minuuttia. Seuraava mappi: %s TIME_INFO_2 = Ei aikarajaa. Seuraava mappi: %s [bg] -HELP_COMS = AMX Mod X Help: Comandi +HELP_COMS = AMX Mod X Help: Komandi HELP_ENTRIES = Vkarani %d - %d ot %d -HELP_USE_MORE = Izpolzvaite '%s %d' za pove4e -HELP_USE_BEGIN = izpolzvaite '%s 1' za na4alo -TYPE_HELP = napi6ete '%s' '%s' v consolata za da vidite pove4e comandi -TIME_INFO_1 = Ostava6to vreme: %d:%02d min. Sledva6tata karta: %s -TIME_INFO_2 = Nqma limit na vremeto. Sledva6tata karta: %s +HELP_USE_MORE = Izpolzvaite '%s %d' za poveche +HELP_USE_BEGIN = Izpolzvaite '%s 1' za nachalo +TYPE_HELP = Napishete '%s' '%s' v konzolata za da vidite povehe komandi +TIME_INFO_1 = Ostavashto vreme: %d:%02d min. Sledvashta karta: %s +TIME_INFO_2 = Nqma limit na vremeto. Sledvashta karta: %s [ro] HELP_COMS = Ajutor AMX Mod X: Comenzi @@ -166,13 +166,13 @@ TIME_INFO_1 = Ostava este: %d:%02d min. Dalsia mapa: %s TIME_INFO_2 = Neni casovy limit. Dalsia mapa: %s [mk] -HELP_COMS = AMX Mod X Pomos - Dozvoleni komandi se: +HELP_COMS = AMX Mod X Pomosh - Komandi HELP_ENTRIES = Komandi %d - %d od %d -HELP_USE_MORE = Napisi '%s %d' za uste komandi -HELP_USE_BEGIN = Napisi '%s 1' za od pocetok -TYPE_HELP = Napisi '%s' '%s' vo konzolata za da gi vidis dozvolenite komandi -TIME_INFO_1 = Preostanato Vreme: %d:%02d min. Sledna Mapa: %s -TIME_INFO_2 = Nema vremensko ogranicuvanje. Sledna Mapa: %s +HELP_USE_MORE = Napishi '%s %d' za ushte komandi +HELP_USE_BEGIN = Napishi '%s 1' za vrakjanje na pochetok +TYPE_HELP = Napishi '%s' '%s' vo konzolata za da gi vidish site komandi +TIME_INFO_1 = Preostanato vreme: %d:%02d min. Sledna mapa: %s +TIME_INFO_2 = Nema ogranichuvanje na vremeto. Sledna mapa: %s [hr] HELP_COMS = AMX Mod X Pomoc: Naredbe diff --git a/plugins/lang/adminslots.txt b/plugins/lang/adminslots.txt index 7ce8d16e..f9e1dd60 100755 --- a/plugins/lang/adminslots.txt +++ b/plugins/lang/adminslots.txt @@ -2,7 +2,7 @@ DROPPED_RES = Dropped due to slot reservation [de] -DROPPED_RES = Sorry, dieser Slot ist reserviert. +DROPPED_RES = Sorry, dieser Slot ist reserviert [sr] DROPPED_RES = Server je pun, nemate pristup rezervisanim mestima @@ -11,7 +11,7 @@ DROPPED_RES = Server je pun, nemate pristup rezervisanim mestima DROPPED_RES = Reservasyon nedeniyle atildiniz [fr] -DROPPED_RES = Desole, un admin vient de prendre sa place reservee, tu as ete ejecte du serveur. +DROPPED_RES = Desole, un admin vient de prendre sa place reservee, tu as ete ejecte du serveur [sv] DROPPED_RES = Nerkopplad pga platsreservation @@ -38,10 +38,10 @@ DROPPED_RES = Vyhozen, slot je rezervovan DROPPED_RES = Pudotettiin palvelimelta slotvarauksen takia (adminslot) [bg] -DROPPED_RES = Izklu4en poneje mqstoto e rezervirano +DROPPED_RES = Premahnat poradi rezervaciq na slot [ro] -DROPPED_RES = Ai primit kick pentru rezervare slot. +DROPPED_RES = Ai primit kick pentru rezervare slot [hu] DROPPED_RES = Nincs szabad hely. @@ -53,7 +53,7 @@ DROPPED_RES = Atjungtas, nes nera laisvos vietos DROPPED_RES = Prepac,ale slot je rezervovany [mk] -DROPPED_RES = Serverot e poln, nemate pristap vo rezerviranite mesta +DROPPED_RES = Otstranet poradi rezervacija na slot [hr] DROPPED_RES = Server je pun, nemate pristup rezerviranim mjestima diff --git a/plugins/lang/adminvote.txt b/plugins/lang/adminvote.txt index 4de370c2..fbf26f2a 100755 --- a/plugins/lang/adminvote.txt +++ b/plugins/lang/adminvote.txt @@ -441,36 +441,36 @@ ADMIN_VOTE_FOR_1 = %s: votea %s %s:n puolesta ADMIN_VOTE_FOR_2 = %s %s: votea %s %s:n puolesta [bg] -ADMIN_CANC_VOTE_1 = %s: kanselira glasuvaneto -ADMIN_CANC_VOTE_2 = %s %s: kanselira glasuvaneto -VOTING_CANC = Glasuvaneto e kanselirano -NO_VOTE_CANC = Nqma nikakvo glasuvane za kanselirane ili glasuvaneto nemoje da se kanselira s tazi camanda -RES_REF = Resultata ne e priet -RES_ACCEPTED = Resultata e priet +ADMIN_CANC_VOTE_1 = %s: otmeni glasuvaneto +ADMIN_CANC_VOTE_2 = %s %s: otmeni glasuvaneto +VOTING_CANC = Glasuvaneto e otmeneno +NO_VOTE_CANC = Nqma nikakvo glasuvane za otmenqne ili glasuvaneto ne moje da se otmeni s tazi komanda +RES_REF = Rezultatut ne e priet +RES_ACCEPTED = Rezultatut e priet VOTING_FAILED = Glasivaneto se e provalilo VOTING_RES_1 = %s (da "%d") (ne "%d") (nujni "%d") -VOTING_RES_2 = %s (polu4eni "%d") (nujni "%d") -VOTING_SUCCESS = Glasuvaneto e uspe6no -VOTING_RES_3 = %s (polu4eni "%d") (nujni "%d"). Resultata: %s -THE_RESULT = Resultata -WANT_CONTINUE = Iskateli da produljite? +VOTING_RES_2 = %s (polucheni "%d") (nujni "%d") +VOTING_SUCCESS = Glasuvaneto e uspeshno +VOTING_RES_3 = %s (polucheni "%d") (nujni "%d"). Rezultat: %s +THE_RESULT = Rezultatut +WANT_CONTINUE = Iskate li da produljite? VOTED_FOR = %s glasuva za VOTED_AGAINST = %s glasuva protiv VOTED_FOR_OPT = %s glasuva za #%d -ALREADY_VOTING = V momenta ima edno glasuvane... +ALREADY_VOTING = V momenta ima glasuvane... VOTING_NOT_ALLOW = Ne e pozvoleno da se glasuva v momenta GIVEN_NOT_VALID = Davaneto %s ne e validno MAP_IS = kartata e MAPS_ARE = kartite sa CHOOSE_MAP = Izbirane na karta -ADMIN_VOTE_MAP_1 = %s: glasuvane za karta(i) -ADMIN_VOTE_MAP_2 = %s %s: glasuvane za karta(i) -VOTING_STARTED = Glasuvaneto zapo4na... +ADMIN_VOTE_MAP_1 = %s: glasuvane za karta/karti +ADMIN_VOTE_MAP_2 = %s %s: glasuvane za karta/karti +VOTING_STARTED = Glasuvaneto zapochna... VOTING_FORBIDDEN = Glasuvaneto za tova e zabraneno -ADMIN_VOTE_CUS_1 = %s: vote custom -ADMIN_VOTE_CUS_2 = %s %s: vote custom +ADMIN_VOTE_CUS_1 = %s: personalizirano glasuvane +ADMIN_VOTE_CUS_2 = %s %s: personalizirano glasuvane VOTE = Glasuvane -ACTION_PERFORMED = tazi commanda nemoje da se izpolzva varhu bota "%s" +ACTION_PERFORMED = Tazi commanda ne moje da se izpolzva vurhu bota "%s" ADMIN_VOTE_FOR_1 = %s: glasuva %s za %s ADMIN_VOTE_FOR_2 = %s %s: glasuva %s za %s @@ -611,38 +611,38 @@ ADMIN_VOTE_FOR_1 = %s: hlasoval %s za %s ADMIN_VOTE_FOR_2 = %s %s: hlasoval %s za %s [mk] -ADMIN_CANC_VOTE_1 = %s: otkazi go glasanjeto -ADMIN_CANC_VOTE_2 = %s %s: otkazi go glasanjeto -VOTING_CANC = Glasanjeto e otkazano -NO_VOTE_CANC = Momentalno nema glasanje koe bi mozelo da se prekine ili glasanjeto ne moze da bide prekinato so taa komanda +ADMIN_CANC_VOTE_1 = %s: otkazhi go glasanjeto +ADMIN_CANC_VOTE_2 = %s %s: otkazhi go glasanjeto +VOTING_CANC = Glasanjeto e otkazhano +NO_VOTE_CANC = Momentalno nema glasanje koe bi mozhelo da se prekine ili glasanjeto ne mozhe da bide prekinato so ovaa komanda RES_REF = Rezultatot e odbien RES_ACCEPTED = Rezultatot e prifaten -VOTING_FAILED = Glasanjeto e neuspesno +VOTING_FAILED = Glasanjeto e neuspeshno VOTING_RES_1 = %s (da "%d") (ne "%d") (potrebno e "%d") VOTING_RES_2 = %s (dobieno e "%d") (potrebno e "%d") -VOTING_SUCCESS = Glasanjeto e uspesno +VOTING_SUCCESS = Glasanjeto e uspeshno VOTING_RES_3 = %s (dobieno e "%d") (potrebno e "%d"). Rezultatot e: %s THE_RESULT = Rezultat -WANT_CONTINUE = Dali sakate da prodolzite? -VOTED_FOR = %s glasase DA -VOTED_AGAINST = %s glasase NE -VOTED_FOR_OPT = %s glasase za #%d +WANT_CONTINUE = Dali sakate da prodolzhite? +VOTED_FOR = %s glasashe DA +VOTED_AGAINST = %s glasashe NE +VOTED_FOR_OPT = %s glasashe za #%d ALREADY_VOTING = Edno glasanje e veke vo tek... -VOTING_NOT_ALLOW = Glasanje momentalno ne e dozvoleno +VOTING_NOT_ALLOW = Glasanjeto momentalno ne e dozvoleno GIVEN_NOT_VALID = Dadenite %s glasovi ne se validni MAP_IS = mapata e MAPS_ARE = mapite se CHOOSE_MAP = Izberi mapa ADMIN_VOTE_MAP_1 = %s: glasanje za mapa ADMIN_VOTE_MAP_2 = %s %s: glasanje za mapa -VOTING_STARTED = Glasanjeto zapocna... +VOTING_STARTED = Glasanjeto zapochna... VOTING_FORBIDDEN = Glasanjeto za toa e zabraneto -ADMIN_VOTE_CUS_1 = %s: Specificno glasanje -ADMIN_VOTE_CUS_2 = %s %s: Specificno glasanje +ADMIN_VOTE_CUS_1 = %s: specifichno glasanje +ADMIN_VOTE_CUS_2 = %s %s: specifichno glasanje VOTE = Glasanje -ACTION_PERFORMED = Taa akcija ne moze da bide izvrsena na bot "%s" -ADMIN_VOTE_FOR_1 = %s: glasase %s za %s -ADMIN_VOTE_FOR_2 = %s %s: glasase %s za %s +ACTION_PERFORMED = Ovaa akcija ne mozhe da bide izvrshena na botot "%s" +ADMIN_VOTE_FOR_1 = %s: glasashe %s za %s +ADMIN_VOTE_FOR_2 = %s %s: glasashe %s za %s [hr] ADMIN_CANC_VOTE_1 = %s: otkazao glasanje diff --git a/plugins/lang/antiflood.txt b/plugins/lang/antiflood.txt index 979b9e5d..989363a6 100755 --- a/plugins/lang/antiflood.txt +++ b/plugins/lang/antiflood.txt @@ -38,7 +38,7 @@ STOP_FLOOD = Prestan floodovat! STOP_FLOOD = Lopeta floodiminen! [bg] -STOP_FLOOD = Sprete da pretovarvate servara! +STOP_FLOOD = Ne fluudvai servera! [ro] STOP_FLOOD = Nu mai flooda server-ul! @@ -53,7 +53,7 @@ STOP_FLOOD = Nustok greitai rasyti! STOP_FLOOD = Prestan floodovat! [mk] -STOP_FLOOD = Prestani na flodiras na serverot! +STOP_FLOOD = Ne go floodiraj serverot! [hr] STOP_FLOOD = Prestani opterecivati server porukama! diff --git a/plugins/lang/cmdmenu.txt b/plugins/lang/cmdmenu.txt index e49ca817..b7bbc477 100755 --- a/plugins/lang/cmdmenu.txt +++ b/plugins/lang/cmdmenu.txt @@ -64,9 +64,9 @@ CONF_MENU = Saatovalikko SPE_MENU = Puhevalikko [bg] -CMD_MENU = Comandnoto Menu -CONF_MENU = Configuracionno Menu -SPE_MENU = Menu za Govorene +CMD_MENU = Menu s komandi +CONF_MENU = Konfiguracionno menu +SPE_MENU = Menu za govorene [ro] CMD_MENU = Menu Comenzi diff --git a/plugins/lang/common.txt b/plugins/lang/common.txt index 608fe918..461ffa48 100755 --- a/plugins/lang/common.txt +++ b/plugins/lang/common.txt @@ -286,25 +286,25 @@ OFF = Poissa paalta [bg] BACK = Nazad -EXIT = Izhot -MORE = O6te -NONE = nikolko +EXIT = Izhod +MORE = Oshte +NONE = Nikolko ADMIN = ADMINISTRATOR -PLAYER = Igra4 -ERROR = gre6ka +PLAYER = IGRACH +ERROR = greshka YES = Da NO = Ne BAN = ban KICK = kick -NO_ACC_COM = Nqmate dostap do tazi commanda -USAGE = Ispolzvane -MORE_CL_MATCHT = eto o6te igra4i koito otgovarqt na commandata -CL_NOT_FOUND = Igra4 s tova ime ili userid ne e nameren -CLIENT_IMM = Igra4a "%s" ima immunity -CANT_PERF_DEAD = Tazi comanda nemoje da se izpolzva na umrql igra4 "%s" -CANT_PERF_BOT = Tazi comanda nemoje da se izpolzva na bot "%s" -ON = Vklu4eno -OFF = Isklu4eno +NO_ACC_COM = Nqmate dostup do tazi komanda +USAGE = Izpolzvane +MORE_CL_MATCHT = Ima poveche igrachi koito se suvpadat s agrumenta +CL_NOT_FOUND = Igrash s tova ime ili userid ne e nameren +CLIENT_IMM = Igrachut "%s" ima imunitet +CANT_PERF_DEAD = Tazi komanda ne moje da se izpolzva na murtviq igrach "%s" +CANT_PERF_BOT = Tazi komanda ne moje da se izpolzva na bota "%s" +ON = Vklucheno +OFF = Isklucheno [ro] BACK = Inapoi @@ -397,24 +397,24 @@ OFF = OFF [mk] BACK = Nazad EXIT = Izlez -MORE = Uste +MORE = Ushte NONE = Nema ADMIN = ADMIN -PLAYER = IGRAC -ERROR = greska +PLAYER = IGRACH +ERROR = greshka YES = Da NO = Ne BAN = ban KICK = kick -NO_ACC_COM = Nemate pristap na dadenata komanda +NO_ACC_COM = Nemate pristap do ovaa komanda USAGE = Koristenje -MORE_CL_MATCHT = Poveke igraci go zadovoluvaat vaseto baranje -CL_NOT_FOUND = Igrac so toa ime ili so toj korisnicki ID ne e najden -CLIENT_IMM = Igracot "%s" ima imunitet -CANT_PERF_DEAD = Komandata ne moze da bide izvrsena na igracot "%s" bidejki e mrtov -CANT_PERF_BOT = Komandata ne moze da bide izvrsena na botot "%s" -ON = Uklucen -OFF = Isklucen +MORE_CL_MATCHT = Povekje igrachi go zadovoluvaat vasheto baranje +CL_NOT_FOUND = Igrach so toa ime ili so userid ne e pronajden +CLIENT_IMM = Igrachot "%s" ima imunitet +CANT_PERF_DEAD = Komandata ne mozhe da bide izvrshena na igrachot "%s" bidejkji e mrtov +CANT_PERF_BOT = Komandata ne mozhe da bide izvrshena na botot "%s" +ON = Ukluchen +OFF = Iskluchen [hr] BACK = Nazad diff --git a/plugins/lang/imessage.txt b/plugins/lang/imessage.txt index f6198e20..03b58ee6 100755 --- a/plugins/lang/imessage.txt +++ b/plugins/lang/imessage.txt @@ -38,7 +38,7 @@ INF_REACH = Limit informacnich zprav presazen! INF_REACH = Information Message -raja ylitetty! [bg] -INF_REACH = Informacionnoto saob6tenie dostigna limita! +INF_REACH = Dostignat e limitut za ingormacionni suobshteniq! [ro] INF_REACH = Limita mesajelor informative a fost atinsa! @@ -53,7 +53,7 @@ INF_REACH = Informacijos zinuciu limitas pasiektas INF_REACH = Limit informacnych sprav prekroceny! [mk] -INF_REACH = Dostignat e limitot za Informacioni Poraki! +INF_REACH = Dostignat e limitot za informacioni poraki! [hr] INF_REACH = Ogranicenje informativnih poruka dosegnuto! diff --git a/plugins/lang/mapchooser.txt b/plugins/lang/mapchooser.txt index 07b86a8d..f1f22b6e 100755 --- a/plugins/lang/mapchooser.txt +++ b/plugins/lang/mapchooser.txt @@ -116,13 +116,13 @@ EXTED_MAP = Jatka mappia %s TIME_CHOOSE = On aika valita seruaava mappi... [bg] -CHO_FIN_EXT = Izbiraneto priklu4i. Nastoq6tata karta 6te e odaljena za o6te %.0f minuti -CHO_FIN_NEXT = Izbiraneto priklu4i. Sledva6tata karta 6te e %s -CHOSE_EXT = %s izbra odaljenie na nastoq6tata karta +CHO_FIN_EXT = Izbiraneto prikluchi. Nastoqshtata karta shte e udaljena za ushte %.0f minuti +CHO_FIN_NEXT = Izbiraneto prikluchi. Sledvashtata karta shte e %s +CHOSE_EXT = %s izbra udaljenie na nastoqshtata karta X_CHOSE_X = %s izbra %s -CHOOSE_NEXTM = AMX Izberete sledva6tata karta -EXTED_MAP = Odalji kartata %s -TIME_CHOOSE = Vreme e da se izbere sledva6tata karta... +CHOOSE_NEXTM = AMX Izberete sledvashta karta +EXTED_MAP = Udalji kartata %s +TIME_CHOOSE = Vreme e da se izbere sledvashtata karta... [ro] CHO_FIN_EXT = Votarea s-a incheiat. Harta actuala va fi prelungita %.0f minute @@ -161,12 +161,12 @@ EXTED_MAP = Predlzuje mapu %s TIME_CHOOSE = Je cas pre volbu dalsej mapy... [mk] -CHO_FIN_EXT = Izborot e zavrsen. Segasnata mapa ke bide prodolzena za %.0f minuti -CHO_FIN_NEXT = Izborot e zavrsen. Slednata mapa ke bide %s -CHOSE_EXT = %s izbra prodolzuvanje na mapata +CHO_FIN_EXT = Izborot e zavrshen. Segashnata mapa kje bide prodolzhena za %.0f minuti +CHO_FIN_NEXT = Izborot e zavrshen. Slednata mapa kje bide %s +CHOSE_EXT = %s izbra prodolzjuvanje na mapata X_CHOSE_X = %s ja izbra mapata %s -CHOOSE_NEXTM = AMX izberete sledna mapa -EXTED_MAP = Prodolzi ja mapata %s +CHOOSE_NEXTM = AMX Izberete sledna mapa +EXTED_MAP = Prodolzhi ja mapata %s TIME_CHOOSE = Vreme e da se izbere sledna mapa... [hr] diff --git a/plugins/lang/menufront.txt b/plugins/lang/menufront.txt index 20c382ff..1a99d286 100755 --- a/plugins/lang/menufront.txt +++ b/plugins/lang/menufront.txt @@ -233,22 +233,22 @@ RES_WEAP = Kiella aseita TELE_PLAYER = Teleporttaa pelaaja [bg] -KICK_PLAYER = Kickni Igra4 -BAN_PLAYER = Banni Igra4 -SLAP_SLAY = Slapni/Slayni Igra4 -TEAM_PLAYER = Smeni Otbora na Igra4 ^n -CHANGEL = Smeni karta +KICK_PLAYER = Kickni Igrach +BAN_PLAYER = Banni Igrach +SLAP_SLAY = Slapni/Slayni Igrach +TEAM_PLAYER = Smeni otbora na igrach ^n +CHANGEL = Smeni kartata VOTE_MAPS = Glasuvai za karta ^n -SPECH_STUFF = Ne6ta za govorene -CLIENT_COM = klient Comandi -SERVER_COM = Server Comandi -CVARS_SET = Nastroiki za Cvars -CONFIG = Configuracia +SPECH_STUFF = Komandi za govorene +CLIENT_COM = Klientski komandi +SERVER_COM = Serverni komandi +CVARS_SET = Nastroiki za cvarove +CONFIG = Konfiguraciq LANG_SET = Ezikovi nastroiki -STATS_SET = Nastroiki za Statistikite ^n -PAUSE_PLUG = Pause Plugini -RES_WEAP = Blokirai Orajia -TELE_PLAYER = Teleportirai Igra4i +STATS_SET = Nastroiki za statistikite ^n +PAUSE_PLUG = Postavi plugini na pauza +RES_WEAP = Zabrani orujiq +TELE_PLAYER = Teleportirai igrachi [ro] KICK_PLAYER = Kick Jucator @@ -323,22 +323,22 @@ RES_WEAP = Obmedzit zbrane TELE_PLAYER = Teleportovat hraca [mk] -KICK_PLAYER = Kikni igrac -BAN_PLAYER = Baniraj igrac -SLAP_SLAY = Slap/Slay igrac -TEAM_PLAYER = Promeni go timot na igracite ^n -CHANGEL = Promeni mapa +KICK_PLAYER = Kikni igrach +BAN_PLAYER = Baniraj igrach +SLAP_SLAY = Slapni/Slayni igrach +TEAM_PLAYER = Promeni go timot na igrach ^n +CHANGEL = Promeni ja mapata VOTE_MAPS = Glasanje za mapa ^n -SPECH_STUFF = Glasovni Komandi +SPECH_STUFF = Glasovni komandi CLIENT_COM = Komandi za klientite SERVER_COM = Komandi za serverot CVARS_SET = Podesuvanje na serverot CONFIG = Gotovi konfiguracii za serverot LANG_SET = Izbor na jazik STATS_SET = Podesuvanje na statistikata ^n -PAUSE_PLUG = Pauza na plaginite -RES_WEAP = Ogranicuvanje na oruzja -TELE_PLAYER = Teleportiranje na igraci +PAUSE_PLUG = Pauza na pluginite +RES_WEAP = Ogranichuvanje na oruzhja +TELE_PLAYER = Teleportiranje na igrachi [hr] KICK_PLAYER = Kick igraca diff --git a/plugins/lang/miscstats.txt b/plugins/lang/miscstats.txt index 5616416e..41665c63 100755 --- a/plugins/lang/miscstats.txt +++ b/plugins/lang/miscstats.txt @@ -610,50 +610,50 @@ KILLS = tapot HS = hs [bg] -WITH = sas -KNIFE_MSG_1 = %s nakalcan i ubit %s -KNIFE_MSG_2 = %s izvadi no6 i zasrami %s -KNIFE_MSG_3 = %s zaobikoli skri6no i nakalca %s -KNIFE_MSG_4 = %s ubi s no6 %s -LAST_MSG_1 = Sega vsi4ko zavisi ot teb! -LAST_MSG_2 = Nadqvam se vse o6te da ima6 mnogo krav. -LAST_MSG_3 = Vsi4ki te ti saotbornici sa martvi. Uspeh! -LAST_MSG_4 = Sega si sam. Radvai se! -HE_MSG_1 = %s isprati malak podarak do %s -HE_MSG_2 = %s hvarli malak podarak do %s -HE_MSG_3 = %s napravi to4no hvarlqne do %s -HE_MSG_4 = %s ima golqm explosiv za %s -SHE_MSG_1 = %s samoubi se s granata -SHE_MSG_2 = %s opitava effecta ot an HE Grenata -SHE_MSG_3 = %s Gla6ta celi granati! -SHE_MSG_4 = %s explodira! -HS_MSG_1 = $kn ubi $vn sas mnogo precenen istrel v glavata! +WITH = s +KNIFE_MSG_1 = %s nakulca i ubi %s +KNIFE_MSG_2 = %s izvadi noj i zasrami %s +KNIFE_MSG_3 = %s zaobikoli skrishno i nakulca %s +KNIFE_MSG_4 = %s ubi s noj %s +LAST_MSG_1 = Sega vsichko zavisi ot teb! +LAST_MSG_2 = Nadqvam se, che vse oshte imash dostatuchno kruv. +LAST_MSG_3 = Vsichkite ti suotbornici sa murtvi. Uspeh! +LAST_MSG_4 = Sega si sam. Uspeh! +HE_MSG_1 = %s izprati maluk podaruk do %s +HE_MSG_2 = %s hvurli maluk podaruk do %s +HE_MSG_3 = %s napravi tochno hvurlqne do %s +HE_MSG_4 = %s ima golqm exploziv za %s +SHE_MSG_1 = %s se samoubi s granata +SHE_MSG_2 = %s vkusi efekta na HE granata +SHE_MSG_3 = %s pogulna granata! +SHE_MSG_4 = %s eksplodira! +HS_MSG_1 = $kn ubi $vn s mnogo precenen izstrel v glavata! HS_MSG_2 = $kn premahna glavata na $vn s $wn -HS_MSG_3 = $kn napravi glavata na $vn ^nna puding sas $wn -HS_MSG_4 = $vn be6e razmazan ot $kn -HS_MSG_5 = glavata na $vn ^n e prevarnata na 4erven krem -HS_MSG_6 = $kn ima mnogo dobar istrel s $wn,^nas $vn mnogo dobre znae. -HS_MSG_7 = glavata na $vn ostana mnogo vreme na mernika na $kn -DOUBLE_KILL = Wow! %s napravi doublekill!!! -PREPARE_FIGHT = Prigotvete se da se biete!^nRound %d -KILLED_ROW = Za momenta ste obili %d podred -DIED_ROUNDS = Vnimatelno! Sega ste umrqli za %d rundove podred... -KILLED_CHICKEN = Nqkoi obi koko6ka!!! -BLEW_RADIO = Nqkoi gramna radioto!!! +HS_MSG_3 = $kn napravi glavata na $vn^nna puding s $wn +HS_MSG_4 = $vn beshe razmazan ot $kn +HS_MSG_5 = Glavata na $vn^n be prevurnata na cherven krem +HS_MSG_6 = $kn ima mnogo dobur izstrel s $wn,^na $vn mnogo dobre znae tova. +HS_MSG_7 = Glavata na $vn ostana mnogo vreme na mernika na $kn +DOUBLE_KILL = Wow! %s napravi dvoino ubiistvo!!! +PREPARE_FIGHT = Prigotvete se da se biete!^nRund %d +KILLED_ROW = Za momenta ste ubili %d igrachi podred +DIED_ROUNDS = Vnimatelno! Umrqli ste %d rundove podred... +KILLED_CHICKEN = Nqkoi ubi kokoshka!!! +BLEW_RADIO = Nqkoi grumna radioto!!! REACHED_TARGET = Gospodi! %s stigna do targeta! PLANT_BOMB = %s zalaga bombata! DEFUSING_BOMB = %s obezvrejda bombata... SET_UP_BOMB = %s zaloji bombata!!! DEFUSED_BOMB = %s obezvredi bombata! -FAILED_DEFU = %s neuspq da obezvredi bombata... +FAILED_DEFU = %s ne uspq da obezvredi bombata... PICKED_BOMB = %s vze bombata... -DROPPED_BOMB = %s ispusna bombata!!! -CT = CT -CTS = CTS -TERRORIST = TERRORIST -TERRORISTS = TERRORISTI -REMAINING = %d %s Ostavat... -KILLS = Obiistva +DROPPED_BOMB = %s izpusna bombata!!! +CT = KONTRA-TERORIST +CTS = KONTRA-TERORISTI +TERRORIST = TERORIST +TERRORISTS = TERORISTI +REMAINING = %d %s ostavat... +KILLS = ubiistva HS = hs [ro] @@ -847,48 +847,48 @@ HS = hs [mk] WITH = so KNIFE_MSG_1 = %s go iskasapi %s -KNIFE_MSG_2 = %s go izvadi nozot i go zakla %s +KNIFE_MSG_2 = %s go izvadi nozhot i go zakla %s KNIFE_MSG_3 = %s se prikrade i go zakla %s KNIFE_MSG_4 = %s go zakla %s -LAST_MSG_1 = Sega se zavisi od tebe! -LAST_MSG_2 = Se nadevam deka imas prva pomos! -LAST_MSG_3 = Site tvoi soigraci se ubieni. So srekja! -LAST_MSG_4 = Sega ostana sam. Ubavo da si pomines! +LAST_MSG_1 = Sega se' zavisi od tebe! +LAST_MSG_2 = Se nadevam deka imash prva pomosh! +LAST_MSG_3 = Site tvoi soigrachi se ubieni. So srekja! +LAST_MSG_4 = Sega si sam. Ubavo da si pominesh! HE_MSG_1 = %s mu isprati mal poklon na %s -HE_MSG_2 = %s mu frli bomba vo dzeb na %s +HE_MSG_2 = %s mu frli bomba vo dzheb na %s HE_MSG_3 = %s go raznese %s so bomba! HE_MSG_4 = %s go digna %s vo vozduh! -SHE_MSG_1 = %s se digna sebe si vo vozduh! -SHE_MSG_2 = %s ja proveri ispravnosta na granata! +SHE_MSG_1 = %s se digna sebesi vo vozduh! +SHE_MSG_2 = %s ja proveri ispravnosta na granatata! SHE_MSG_3 = %s ja izede granatata! SHE_MSG_4 = %s se raznese sebesi! HS_MSG_1 = $kn go pogodi $vn^npravo vo glava! -HS_MSG_2 = $kn go izbrici $vn^nna glava so $wn +HS_MSG_2 = $kn ja izbrichi na $vn^nglavata so $wn HS_MSG_3 = $kn go napravi $vn^npuding vo glavata so $wn HS_MSG_4 = $vn ostana bez glava od $kn -HS_MSG_5 = $vn e napraven ketchap! -HS_MSG_6 = $kn odlicno nisani vo glava so $wn^nkako sto primeti i $vn -HS_MSG_7 = $vn ostana na nisanot od $kn^npodolgo otkolku sto trebase... -DOUBLE_KILL = %s napravi duplo ubistvo!!! +HS_MSG_5 = $vn e napraven kechap! +HS_MSG_6 = $kn odlicnho nishani vo glava so $wn^nkako shto primeti i $vn +HS_MSG_7 = $vn ostana na nishanot na $kn^npodolgo otkolku shto trebashe... +DOUBLE_KILL = %s napravi dvojno ubistvo!!! PREPARE_FIGHT = Pripremi se za BORBA!^nRunda %d KILLED_ROW = Ti napravi %d ubistva edno po drugo DIED_ROUNDS = Vnimavaj!!! Pogina vo %d rundi po red... -KILLED_CHICKEN = Nekoj go ubi pileto!!! +KILLED_CHICKEN = Nekoj ubi kokoshka!!! BLEW_RADIO = Nekoj go rasipa radioto!!! REACHED_TARGET = %s pristigna na lokacijata! PLANT_BOMB = %s ja postavuva bombata! DEFUSING_BOMB = %s ja demontira bombata... SET_UP_BOMB = %s ja postavi bombata!!! -DEFUSED_BOMB = %s uspesno ja demontira bombata! +DEFUSED_BOMB = %s uspeshno ja demontira bombata! FAILED_DEFU = %s ne uspea da ja demontira bombata... PICKED_BOMB = %s ja zede bombata... DROPPED_BOMB = %s ja frli bombata!!! -CT = CT -CTS = CTS +CT = KANTER-TEORIRIST +CTS = KANTER-TEORIRISTI TERRORIST = TERORIST TERRORISTS = TERORISTI -REMAINING = %d %s Preostanuva... -KILLS = Ubistva +REMAINING = %d %s preostanuva... +KILLS = ubistva HS = hs [hr] diff --git a/plugins/lang/multilingual.txt b/plugins/lang/multilingual.txt index 9aab44ec..a2c0e4fe 100755 --- a/plugins/lang/multilingual.txt +++ b/plugins/lang/multilingual.txt @@ -106,7 +106,7 @@ SAVE_LANG = Guardar Idioma SET_LANG_SERVER = El idioma del servidor se ha cambiado a "%s" SET_LANG_USER = Tu idioma se ha cambiado a "%s" TYPE_LANGMENU = Escribe 'amx_langmenu' en la consola para mostrar un menu en el cual puedes elegir tu idioma -LANG_MENU_DISABLED = Menu de Idioma desactivado +LANG_MENU_DISABLED = Menu de Idioma desactivado. [bp] LANG_NOT_EXISTS = Este idioma nao existe @@ -117,7 +117,7 @@ SAVE_LANG = Salvar Idioma SET_LANG_SERVER = O idioma do servidor foi ajustada para "%s" SET_LANG_USER = Seu idioma foi configurado para "%s" TYPE_LANGMENU = Escreva 'amx_langmenu' no console para mostrar um menu onde voce pode escolher seu idioma preferido -LANG_MENU_DISABLED = Menu de Idiomas desativado +LANG_MENU_DISABLED = Menu de Idiomas desativado. [cz] LANG_NOT_EXISTS = Zvoleny jazyk neexistuje @@ -139,18 +139,18 @@ SAVE_LANG = Tallenna kieli SET_LANG_SERVER = palvelimen kieli on nyt "%s" SET_LANG_USER = Kielesi on nyt "%s" TYPE_LANGMENU = Kirjoita 'amx_langmenu' konsoliin nahdaksesi kielivalikon -LANG_MENU_DISABLED = Kielivalikko poistettu kaytosta +LANG_MENU_DISABLED = Kielivalikko poistettu kaytosta. [bg] -LANG_NOT_EXISTS = Nqma takav ezik -PERSO_LANG = Li4ni Ezici -LANG_MENU = Ezikovoto Menu -SERVER_LANG = Server Ezik -SAVE_LANG = Zapameti Ezik -SET_LANG_SERVER = Ezika na servera e smenen na "%s" -SET_LANG_USER = Tvoq ezik e smenen na "%s" -TYPE_LANGMENU = Napi5i 'amx_langmenu' v consolata za da vidite menu kadeto mojete da si izberete ezik -LANG_MENU_DISABLED = Ezikovoto menu e izklu4eno. +LANG_NOT_EXISTS = Nqma takuv ezik +PERSO_LANG = Lichni ezici +LANG_MENU = Ezikovo menu +SERVER_LANG = Serveren ezik +SAVE_LANG = Zapameti ezik +SET_LANG_SERVER = Ezikut na servera e smenen na "%s" +SET_LANG_USER = Tvoqt ezik e smenen na "%s" +TYPE_LANGMENU = Napishi 'amx_langmenu' v konzolata za da vidish menuto kudeto mojesh da si izberesh ezik +LANG_MENU_DISABLED = Ezikovoto menu e izkliucheno. [ro] LANG_NOT_EXISTS = Acest limbaj nu exista @@ -201,11 +201,11 @@ LANG_NOT_EXISTS = Jazikot ne postoi PERSO_LANG = Jazik LANG_MENU = Meni za jazikot SERVER_LANG = Jazik na serverot -SAVE_LANG = Zacuvaj go izbraniot jazik +SAVE_LANG = Zachuvaj go izbraniot jazik SET_LANG_SERVER = Jazikot na serverot e postaven na "%s" -SET_LANG_USER = Vasiot jazik e postaven na "%s" -TYPE_LANGMENU = Napisi 'amx_langmenu' vo konzolata za da go otvoris menito za promena na jazikot -LANG_MENU_DISABLED = Menito za izbor na jazik e iskluceno. +SET_LANG_USER = Vashiot jazik e postaven na "%s" +TYPE_LANGMENU = Napishi 'amx_langmenu' vo konzolata za da go otvorish menito za promena na jazikot +LANG_MENU_DISABLED = Menito za izbor na jazik e isklucheno. [hr] LANG_NOT_EXISTS = Jezik ne postoji diff --git a/plugins/lang/nextmap.txt b/plugins/lang/nextmap.txt index 1c17e751..717c7f32 100755 --- a/plugins/lang/nextmap.txt +++ b/plugins/lang/nextmap.txt @@ -64,9 +64,9 @@ PLAYED_MAP = Pelattu map FRIEND_FIRE = Friendly fire [bg] -NEXT_MAP = Sledva6tata karta: +NEXT_MAP = Sledvashta karta: PLAYED_MAP = Igrana karta -FRIEND_FIRE = Friendly fire +FRIEND_FIRE = Priqtelski ogun [ro] NEXT_MAP = Urmatoarea Harta: @@ -89,9 +89,9 @@ PLAYED_MAP = Aktualna mapa FRIEND_FIRE = Friendly fire [mk] -NEXT_MAP = Slednata mapa ke bide: -PLAYED_MAP = Mapata sto ja igras se vika -FRIEND_FIRE = Friendly fire +NEXT_MAP = Sledna mapa: +PLAYED_MAP = Momentalna mapa +FRIEND_FIRE = Prijatelski ogan [hr] NEXT_MAP = Sljedeca mapa: diff --git a/plugins/lang/pausecfg.txt b/plugins/lang/pausecfg.txt index b533ca79..972a2dcb 100755 --- a/plugins/lang/pausecfg.txt +++ b/plugins/lang/pausecfg.txt @@ -509,39 +509,44 @@ COM_PAUSE_LIST = ^tlist [id] - listaa pluginit COM_PAUSE_ADD = ^tadd - merkkaa kaikki pluginit pysayttamattomiksi [bg] -PAUSE_COULDNT_FIND = Ne uspq da nameri plugin koito da savbada s "%s" -PAUSE_PLUGIN_MATCH = Plugin savpada "%s" -PAUSE_CONF_CLEARED = Iz4isti configuracionia file. Zaredi na novo kartata ako e nujno -PAUSE_ALR_CLEARED = Configuracionia file e ve4e iz4isten! -PAUSE_CONF_SAVED = configuraciata be6e zapametena -PAUSE_SAVE_FAILED = configuraciata ne be6e zapametena!!! -LOCKED = ZAKLU$ENO -PAUSE_UNPAUSE = Pause/Unpause Plugin -CLEAR_STOPPED = Iz4isti file sas spreni +PAUSE_COULDNT_FIND = Neuspeshno namirane na plugin koito suvpada s "%s" +PAUSE_PLUGIN_MATCH = Plugin suvpadasht "%s" +PAUSE_CONF_CLEARED = Izchisti konfiguracionniq fail. Zaredi nanovo kartata ako e nujno +PAUSE_ALR_CLEARED = Kongfiguracionniqt fail e veche izchisten! +PAUSE_CONF_SAVED = Konfiguraciqta beshe uspeshno zapametena +PAUSE_SAVE_FAILED = Konfiguraciqta ne beshe zapametena!!! +LOCKED = ZAKLUCHENO +PAUSE_UNPAUSE = Sloji na pauza/Pusni plugin +CLEAR_STOPPED = Izchisti fail sus spreni SAVE_STOPPED = Zapameti spreni -PAUSED_PLUGIN = Paused %d plugin -PAUSED_PLUGINS = Paused %d plugins -UNPAUSED_PLUGIN = Unpaused %d plugin -UNPAUSED_PLUGINS = Unpaused %d plugins -CANT_MARK_MORE = Nemoje da markirate pove4e plugini kato unpauseable! -PAUSE_LOADED = Pause Plugins: Loaded plugins +PAUSED_PLUGIN = %d plugin postaven na pauza +PAUSED_PLUGINS = %d plugina postaveni na pauza +UNPAUSED_PLUGIN = %d plugin premahnat ot pauza +UNPAUSED_PLUGINS = %d plugina premahnati ot pauza +CANT_MARK_MORE = Ne moje da markirate poveche plugini kato nespirasht! +PAUSE_LOADED = Plugini na pauza: Aktivni plugini STOPPED = Sprqn -VERSION = versia +VERSION = verziq FILE = file -PAUSE_ENTRIES = Vklu4ni %d - %d ot %d (%d sa pusnati) -PAUSE_USE_MORE = Izpolzvai 'amx_pausecfg list %d' za pve4e -PAUSE_USE_BEGIN = Izpolzvai 'amx_pausecfg list 1' za na4alo -PAUSE_USAGE = Izpolzvano: amx_pausecfg <comanda> [ime] -PAUSE_COMMANDS = Comandi -COM_PAUSE_OFF = ^toff - slaga na pausa vsi4kite plugini koito ne sa na lista -COM_PAUSE_ON = ^ton - puska vsi4kite plugini -COM_PAUSE_STOP = ^tstop <file> - spira edin plugin -COM_PAUSE_PAUSE = ^tpause <file> - pauses edin plugin -COM_PAUSE_ENABLE = ^tenable <file> - puska edin plugin -COM_PAUSE_SAVE = ^tsave - zapameti list ot sprqni plugini -COM_PAUSE_CLEAR = ^tclear - iz4isti list ot sprqni plugini -COM_PAUSE_LIST = ^tlist [id] - pokazva plugini -COM_PAUSE_ADD = ^tadd <title> - markira plugin kato nespira6t +PAUSE_ENTRIES = Vklucheni %d - %d ot %d (%d sa pusnati) +PAUSE_USE_MORE = Izpolzvai 'amx_pausecfg list %d' za poveche +PAUSE_USE_BEGIN = Izpolzvai 'amx_pausecfg list 1' za nachalo +PAUSE_USAGE = Izpolzvane: amx_pausecfg <komanda> [ime] +PAUSE_COMMANDS = Komandi +COM_PAUSE_OFF = ^toff - slaga na pauza vsichkite plugini koito ne sa na lista +COM_PAUSE_ON = ^ton - puska vsichkite plugini +COM_PAUSE_STOP = ^tstop <fail> - spira edin plugin +COM_PAUSE_PAUSE = ^tpause <fail> - slaga na pauza edin plugin +COM_PAUSE_ENABLE = ^tenable <fail> - puska edin plugin +COM_PAUSE_SAVE = ^tsave - zapameti lista ot sprqni plugini +COM_PAUSE_CLEAR = ^tclear - izchisti lista ot sprqni plugini +COM_PAUSE_LIST = ^tlist [id] - pokaji vsichki plugini +COM_PAUSE_ADD = ^tadd <title> - markirai plugin kato nespirasht +SAVE_PAUSED = Zapazi pluginite na pauza +COM_PAUSE_SAVE_PAUSED = ^tsave - zapameti lista ot sprqni plugini +COM_PAUSE_CLEAR_PAUSED = ^tclear - izchisti lista ot sprqni plugini +CANT_UNPAUSE_PLUGIN = Pluginut "%s" e sprqn i ne moje da bude slojen/premahnat na/ot pauza. +CLEAR_PAUSED = Izchisti faila s plugini na pauza [ro] PAUSE_COULDNT_FIND = Nu a fost gasit un plugin ce rezulta cautarea "%s" @@ -699,44 +704,44 @@ CANT_UNPAUSE_PLUGIN = Plugin "%s" je zastaveny ,nie je mozne ho pozastavit. CLEAR_PAUSED = vymaz subor s pozastavenymi [mk] -PAUSE_COULDNT_FIND = Ne e najden plugin koj se poklopuva so baranjeto za "%s" +PAUSE_COULDNT_FIND = Ne e pronajden plugin koj se poklopuva so baranjeto za "%s" PAUSE_PLUGIN_MATCH = Pronajdeniot plugin e "%s" -PAUSE_CONF_CLEARED = Listata so pauzirani plagini e izbrisana. Pustete ja mapata odnovo ako e potrebno. -PAUSE_ALR_CLEARED = Listata so pauzirani plagini e prazna! -PAUSE_CONF_SAVED = Listata so pauzirani plagini e uspesno zacuvana -PAUSE_SAVE_FAILED = Listata so pauzirani plagini ne e zacuvana!!! -LOCKED = ZAKLUCEN -PAUSE_UNPAUSE = Pauziraj/Pusti Plugin -CLEAR_STOPPED = Izbrisi go fajlot so stopirani plugini -SAVE_STOPPED = Zacuvaj gi stopiranite -PAUSED_PLUGIN = Pauziran e %d plagin -PAUSED_PLUGINS = Pauzirani se %d plagini -UNPAUSED_PLUGIN = Pusten e %d plugin -UNPAUSED_PLUGINS = Pusteni se %d plagini -CANT_MARK_MORE = Ne e mozno da se izberat poveke plugini kako zakluceni! -PAUSE_LOADED = Pauza na plaginite: Vcitanite plugini +PAUSE_CONF_CLEARED = Listata so pauzirani plugini e izbrishana. Pushtete ja mapata odnovo ako e potrebno +PAUSE_ALR_CLEARED = Listata so pauzirani plugini e prazna! +PAUSE_CONF_SAVED = Listata so pauzirani plugini e uspeshno zachuvana +PAUSE_SAVE_FAILED = Listata so pauzirani plugini ne e zachuvana!!! +LOCKED = ZAKLUCHEN +PAUSE_UNPAUSE = Pauziraj/Pushti plugin +CLEAR_STOPPED = Izbrishi go fajlot so stopirani plugini +SAVE_STOPPED = Zachuvaj gi stopiranite +PAUSED_PLUGIN = Pauziran e %d plugin +PAUSED_PLUGINS = Pauzirani se %d plugini +UNPAUSED_PLUGIN = Pushten e %d plugin +UNPAUSED_PLUGINS = Pushteni se %d plugini +CANT_MARK_MORE = Ne e mozhno da se izberat povekje plugini kako zaklucheni! +PAUSE_LOADED = Pauza na plugini: Aktivni plugini STOPPED = stopiran VERSION = verzija FILE = fajl -PAUSE_ENTRIES = Plagini %d - %d od %d (%d se aktivni) -PAUSE_USE_MORE = Napisi 'amx_pausecfg list %d' za uste -PAUSE_USE_BEGIN = Napisi 'amx_pausecfg list 1' za od pocetok -PAUSE_USAGE = Koristenje: amx_pausecfg <komanda> [ime] +PAUSE_ENTRIES = Plugini %d - %d od %d (%d se aktivni) +PAUSE_USE_MORE = Napishi 'amx_pausecfg list %d' za ushte +PAUSE_USE_BEGIN = Napishi 'amx_pausecfg list 1' za vrakjanje na pochetok +PAUSE_USAGE = Upotreba: amx_pausecfg <komanda> [ime] PAUSE_COMMANDS = Komandi -COM_PAUSE_OFF = ^toff - gi pauzira site aktivni plagini -COM_PAUSE_ON = ^ton - gi pusta site pauzirani plagini -COM_PAUSE_STOP = ^tstop <fajl> - go stopira plaginot -COM_PAUSE_PAUSE = ^tpause <fajl> - go pauzira plaginot -COM_PAUSE_ENABLE = ^tenable <fajl> - go pusta plaginot -COM_PAUSE_SAVE = ^tsave - ja zacuvuva listata so stopirani plagini -COM_PAUSE_CLEAR = ^tclear - ja brise listata so stopirani plagini -COM_PAUSE_LIST = ^tlist [id] - gi lista site plagini -COM_PAUSE_ADD = ^tadd <title> - go markira plaginot kako nekoj sto ne moze da se pauzira -SAVE_PAUSED = Zacuvaj gi pauziranite plagini -COM_PAUSE_SAVE_PAUSED = ^tsave - ja zacuvuva listata so pauzirani plagini -COM_PAUSE_CLEAR_PAUSED = ^tclear - ja brise listata so pauzirani plagini -CANT_UNPAUSE_PLUGIN = Plaginot "%s" e stopiran i ne moze da se pauzira ili da se iskluci pauzata. -CLEAR_PAUSED = Izbrisi ja listata so pauzirani plagini +COM_PAUSE_OFF = ^toff - gi pauzira site aktivni plugini +COM_PAUSE_ON = ^ton - gi pusta site pauzirani plugini +COM_PAUSE_STOP = ^tstop <fajl> - go stopira pluginot +COM_PAUSE_PAUSE = ^tpause <fajl> - go pauzira pluginot +COM_PAUSE_ENABLE = ^tenable <fajl> - go pushta pluginot +COM_PAUSE_SAVE = ^tsave - ja zachuvuva listata so stopirani plugini +COM_PAUSE_CLEAR = ^tclear - ja brishe listata so stopirani plugini +COM_PAUSE_LIST = ^tlist [id] - gi lista site plugini +COM_PAUSE_ADD = ^tadd <title> - go markira pluginot kako takov shto ne mozhe da se pauzira +SAVE_PAUSED = Zachuvaj gi pauziranite plugini +COM_PAUSE_SAVE_PAUSED = ^tsave - ja zachuvuva listata so pauzirani plugini +COM_PAUSE_CLEAR_PAUSED = ^tclear - ja brishe listata so pauzirani plugini +CANT_UNPAUSE_PLUGIN = Pluginot "%s" e stopiran i ne mozhe da se pauzira ili da se iskluchi pauzata. +CLEAR_PAUSED = Izbrishi ja listata so pauzirani plugini [hr] PAUSE_COULDNT_FIND = Nije moguce naci plugin koji se poklapa sa "%s" diff --git a/plugins/lang/plmenu.txt b/plugins/lang/plmenu.txt index 293c1911..8c6b3d72 100755 --- a/plugins/lang/plmenu.txt +++ b/plugins/lang/plmenu.txt @@ -1,4 +1,4 @@ -[en] +[en] ADMIN_BAN_1 = ADMIN: ban %s ADMIN_BAN_2 = ADMIN %s: ban %s BAN_MENU = Ban Menu @@ -249,20 +249,20 @@ CANT_PERF_PLAYER = Tuota toimintoa ei voida suorittaa pelaaja "%s" ADMIN_BAN_1 = ADMINISTRATOR: banna %s ADMIN_BAN_2 = ADMINISTRATOR %s: banna %s BAN_MENU = Ban Menu -BAN_FOR_MIN = Ban za %d minuti -BAN_PERM = Banni za vinagi +BAN_FOR_MIN = Banni za %d minuti +BAN_PERM = Banni zavinagi SLAP_SLAY_MENU = Slap/Slay Menu -SLAP_WITH_DMG = Slapni s %d damage -SLAY = Slay +SLAP_WITH_DMG = Slapni s %d shteta +SLAY = Slayni KICK_MENU = Kick Menu -ADMIN_TRANSF_1 = ADMINISTRATOR: transferira %s kam %s -ADMIN_TRANSF_2 = ADMINISTRATOR %s: transferira %s kam %s +ADMIN_TRANSF_1 = ADMINISTRATOR: transferira %s kum %s +ADMIN_TRANSF_2 = ADMINISTRATOR %s: transferira %s kum %s TEAM_MENU = Otborno Menu -TRANSF_TO = Transferirai kam %s -TRANSF_SILENT = Стилър трансфер -CL_CMD_MENU = Klient Comandno Menu -NO_CMDS = Nqma nikakvi pozvoleni comandi -CANT_PERF_PLAYER = Tazi comanda nemoje da se izpolzva na igra4 "%s" +TRANSF_TO = Transferirai kum %s +TRANSF_SILENT = Tih transfer +CL_CMD_MENU = Menu s klientski komandi +NO_CMDS = Nqma dostupni komandi +CANT_PERF_PLAYER = Tazi comanda ne moje da se izpolzva vurhu igracha "%s" [ro] ADMIN_BAN_1 = ADMIN: ban %s @@ -340,22 +340,22 @@ NO_CMDS = Ziadny cmds CANT_PERF_PLAYER = Tato operacia nejde previest na hrac "%s" [mk] -ADMIN_BAN_1 = ADMIN: ban %s -ADMIN_BAN_2 = ADMIN %s: ban %s +ADMIN_BAN_1 = ADMIN: banira %s +ADMIN_BAN_2 = ADMIN %s: banira %s BAN_MENU = Ban Meni -BAN_FOR_MIN = Ban na %d minuti -BAN_PERM = Ban zasekogas +BAN_FOR_MIN = Ban za %d minuti +BAN_PERM = Ban zasekogash SLAP_SLAY_MENU = Slap/Slay Meni -SLAP_WITH_DMG = Udri mu samar so %d steta -SLAY = Nasilno ubij go +SLAP_WITH_DMG = Udri mu shamar so %d shteta +SLAY = Slayni KICK_MENU = Kick Meni -ADMIN_TRANSF_1 = ADMIN: napravi transfer na %s vo %s -ADMIN_TRANSF_2 = ADMIN %s: napravi transfer na %s vo %s +ADMIN_TRANSF_1 = ADMIN: izvrshi transfer na %s vo %s +ADMIN_TRANSF_2 = ADMIN %s: izvrshi transfer na %s vo %s TEAM_MENU = Meni za timot TRANSF_TO = Transfer vo %s CL_CMD_MENU = Meni so komandi za klientite NO_CMDS = Nema dostapni komandi -CANT_PERF_PLAYER = Komandata ne moze da bide izvrsena na igrac "%s" +CANT_PERF_PLAYER = Komandata ne mozhe da bide izvrshena na igrachot "%s" [hr] ADMIN_BAN_1 = ADMIN: banao %s diff --git a/plugins/lang/restmenu.txt b/plugins/lang/restmenu.txt index 86df843b..96a0000b 100755 --- a/plugins/lang/restmenu.txt +++ b/plugins/lang/restmenu.txt @@ -631,43 +631,43 @@ CONF_SAV_SUC = Saadot tallennettu onnistuneesti CONF_SAV_FAIL = Saatojen tallentaminen epaonnistui [bg] -EQ_WE_RES = Orajiata ne sa pozvoleni -EQ_WE_UNRES = Orajiata sa pozvoleni +EQ_WE_RES = Orujiqta ne sa pozvoleni +EQ_WE_UNRES = Orujiqta sa pozvoleni HAVE_BEEN = sa HAS_BEEN = sa -RESTRICTED = ne sa pozvoleni -UNRESTRICTED = sa pozvoleni -NO_EQ_WE = Neuspq da nameri orajieto -WEAP_RES = Orajiata ne sa pozvoleni -VALUE = status +RESTRICTED = zabraneni +UNRESTRICTED = pozvoleni +NO_EQ_WE = Orujieto ne e namereno +WEAP_RES = Zabrana na orujiq +VALUE = stoinost REST_ENTRIES_OF = Vkarani %i - %i ot %i -REST_USE_MORE = Ispolzvai 'amx_restrict list %i' za pove4e -REST_USE_BEGIN = Ispolzvai 'amx_restrict list 1' za na4alo -REST_USE_HOW = Ispolzvai 'amx_restrict list <value>' (1 -> 8) -REST_CONF_SAVED = Configuraciqta be6e zapametena (file "%s") -REST_COULDNT_SAVE = Cofiguraciqta nebe6e zapametena (file "%s") -REST_CONF_LOADED = Configuraciqta be6e zaredena (file "%s") -REST_COULDNT_LOAD = Configuraciqta ne be6e zaredena (file "%s") -COM_REST_USAGE = Ispolzvai: amx_restrict <comanda> [value] -COM_REST_COMMANDS = Comandi: -COM_REST_ON = " on - Pusni zabrana na vsi4kite orajia" -COM_REST_OFF = " off - Mahni zabranata na vsi4kite orajia" -COM_REST_ONV = " on <value> [...] - Nastroi specifi4na zabrana" -COM_REST_OFFV = " off <value> [...] - Mahni specifi4nata zabrana" -COM_REST_LIST = " list <value> - Pokaji list na pozvoleni orajiq" +REST_USE_MORE = Izpolzvai 'amx_restrict list %i' za poveche +REST_USE_BEGIN = Izpolzvai 'amx_restrict list 1' za nachalo +REST_USE_HOW = Izpolzvai 'amx_restrict list <stoinost>' (1 -> 8) +REST_CONF_SAVED = Konfiguraciqta beshe zapametena (fail "%s") +REST_COULDNT_SAVE = Konfiguraciqta ne beshe zapametena (fail "%s") +REST_CONF_LOADED = Konfiguraciqta beshe zaredena (fail "%s") +REST_COULDNT_LOAD = Konfiguraciqta ne beshe zaredena (fail "%s") +COM_REST_USAGE = Izpolzvane: amx_restrict <komanda> [stoinost] +COM_REST_COMMANDS = Komanda: +COM_REST_ON = " on - Pusni zabrana za vsichki orujiq" +COM_REST_OFF = " off - Premahni zabranata ot vsichki orujiq" +COM_REST_ONV = " on <stoinost> [...] - Zadai specifichna zabrana" +COM_REST_OFFV = " off <stoinost> [...] - Premahni specifichna zabrana" +COM_REST_LIST = " list <stoinost> - Pokaji spisuk s pozvoleni orujiq" COM_REST_SAVE = " save - Zapameti zabranata" -COM_REST_LOAD = " load [file] - Zaredi zabrana [ot file]" -COM_REST_VALUES = Pozvoleni orajia za zabrana sa:^nammo, equip, pistol, shotgun, sub, rifle, sniper, machine -COM_REST_TYPE = Napi6i 'amx_restrict list' za po specifi4ni orajia -REST_WEAP = Zabrani Orajia +COM_REST_LOAD = " load [fail] - Zaredi zabrana [ot fail]" +COM_REST_VALUES = Pozvoleni stoinosti za zabrana sa:^nammo, equip, pistol, shotgun, sub, rifle, sniper, machine +COM_REST_TYPE = Napishi 'amx_restrict list' za specifichni orujiq +REST_WEAP = Zabrani orujiq SAVE_SET = Zapameti nastroikite -CONF_SAV_SUC = Configuraciqta be6e zapametena -CONF_SAV_FAIL = Configuraciqta ne be6e zapametena!!! +CONF_SAV_SUC = Konfiguraciqta beshe zapametena +CONF_SAV_FAIL = Konfiguraciqta ne beshe zapametena!!! REG_CMD_MENU = - pokazva menuto za zabrani na orujiq REG_CMD_REST = - pomosht za zabranqvaneto na orujiq RESTRICTED_ITEM = * Tova orujie e zabraneno * MENU_TITLE_HANDGUNS = Pistoleti -MENU_TITLE_SHOTGUNS = Shotgun-i +MENU_TITLE_SHOTGUNS = Shotguni MENU_TITLE_SUBMACHINES = Polu-avtomatichni orujiq MENU_TITLE_RIFLES = Assault orujiq MENU_TITLE_SNIPERS = Snaiperi @@ -709,6 +709,12 @@ MENU_ITEM_SHIELD = Shtit MENU_ITEM_PRIAMMO = Purvichni amunicii MENU_ITEM_SECAMMO = Vtorichni amunicii (pistolet) CONFIG_FILE_HEADER = ; Suzdadeno ot %s Plugin. Ne promenqite!^n; ime na stoinostta^n +ADMIN_UPD_RES_1 = ADMIN: obnovi zabranite za orujiqta +ADMIN_UPD_RES_2 = ADMIN %s: obnovi zabranite za orujiqta +ADMIN_CMD_UPDATEDCFG = Cmd: %N obnovi zabranite za orujiqta +ADMIN_CMD_LOADEDCFG = Cmd: %N zaredi zabranite za orujiqta ot "%s" +ADMIN_CMD_SAVEDCFG = Cmd: %N zapazi zabranite za orujiqta v "%s" +ADMIN_MENU_SAVEDCFG = Menu: %N zapazi zabranite za orujiqta v "%s" [ro] EQ_WE_RES = Echipamentul si armele au fost restrictionate @@ -939,38 +945,90 @@ MENU_ITEM_SECAMMO = Náboje do sekundárnej zbrane CONFIG_FILE_HEADER = ; Vytvorené pluginom: %s. Neupravovať!^n; názov hodnota^n [mk] -EQ_WE_RES = Opremata i oruzjeto se celosno zabraneti -EQ_WE_UNRES = Opremata i oruzjeto se oslobodeni od zabranata -HAVE_BEEN = bese -HAS_BEEN = bese +EQ_WE_RES = Opremata i oruzhjeto se celosno zabraneti +EQ_WE_UNRES = Opremata i oruzhjeto se oslobodeni od zabranata +HAVE_BEEN = beshe +HAS_BEEN = beshe RESTRICTED = zabraneto -UNRESTRICTED = orizjeto moze slobodno da se koristi -NO_EQ_WE = Ne moze da se najde takva oprema ili oruzje -WEAP_RES = Zabrana za oprema i oruzja +UNRESTRICTED = oruzhjeto mozhe slobodno da se koristi +NO_EQ_WE = Ne e pronajdena takva oprema ili oruzhje +WEAP_RES = Zabrana za oprema i oruzhja VALUE = vrednost REST_ENTRIES_OF = Vrednosti %i - %i od %i -REST_USE_MORE = Napisi 'amx_restrict list %i' za uste mozni vrednosti -REST_USE_BEGIN = Napisi 'amx_restrict list 1' za od pocetok -REST_USE_HOW = Napisi 'amx_restrict list <vrednost>' (1 -> 8) -REST_CONF_SAVED = Listata so zabraneti oruzja e uspesno zacuvana (fajl "%s") -REST_COULDNT_SAVE = Listata so zabraneti oruzja ne e zacuvana (fajl "%s") -REST_CONF_LOADED = Listata so zabraneti oruzja e uspesno vcitana (fajl "%s") -REST_COULDNT_LOAD = Listata so zabraneti oruzja ne e vcitana (fajl "%s") -COM_REST_USAGE = Koristenje: amx_restrict <komanda> [vrednost] +REST_USE_MORE = Napishi 'amx_restrict list %i' za ushte mozhni vrednosti +REST_USE_BEGIN = Napishi 'amx_restrict list 1' za vrakjanje na pochetok +REST_USE_HOW = Napishi 'amx_restrict list <vrednost>' (1 -> 8) +REST_CONF_SAVED = Listata so zabraneti oruzhja e uspeshno zachuvana (fajl "%s") +REST_COULDNT_SAVE = Listata so zabraneti oruzhja ne e zachuvana (fajl "%s") +REST_CONF_LOADED = Listata so zabraneti oruzhja e uspeshno vchitana (fajl "%s") +REST_COULDNT_LOAD = Listata so zabraneti oruzhja ne e vchitana (fajl "%s") +COM_REST_USAGE = Upotreba: amx_restrict <komanda> [vrednost] COM_REST_COMMANDS = Komandi: COM_REST_ON = " on - Postavi zabrana za cela oprema" COM_REST_OFF = " off - Trgni ja zabranata za cela oprema" -COM_REST_ONV = " on <vrednost> [...] - Postavi zabrana za dadeno oruzje" -COM_REST_OFFV = " off <vrednost> [...] - Trgni ja zabranata za dadenoto oruzje -COM_REST_LIST = " list <vrednost> - Prikazi ja listata so mozni oruzja i oprema" -COM_REST_SAVE = " save - Zacuvaj gi zabranite" -COM_REST_LOAD = " load [fajl] - Vcitaj zabrani [od fajl]" -COM_REST_VALUES = Primer za mozni vrednosti za zabrana se:^nammo, equip, pistol, shotgun, sub, rifle, sniper, machine itn... -COM_REST_TYPE = Napisi 'amx_restrict list' za site mozni vrednosti -REST_WEAP = Zabrana za oprema i oruzja -SAVE_SET = Zacuvaj gi podesuvanjata -CONF_SAV_SUC = Listata so zabraneti oruzja e uspesno zacuvana -CONF_SAV_FAIL = Listata so zabraneti oruzja ne e zacuvana!!! +COM_REST_ONV = " on <vrednost> [...] - Postavi zabrana za dadeno oruzhje" +COM_REST_OFFV = " off <vrednost> [...] - Trgni ja zabranata za dadeno oruzhje" +COM_REST_LIST = " list <vrednost> - Prikazhi ja listata so mozhni oruzhja i oprema" +COM_REST_SAVE = " save - Zachuvaj gi zabranite" +COM_REST_LOAD = " load [fajl] - Vchitaj zabrani [od fajl]" +COM_REST_VALUES = Mozhni vrednosti za zabrana se:^nammo, equip, pistol, shotgun, sub, rifle, sniper, machine +COM_REST_TYPE = Napishi 'amx_restrict list' za site mozhni vrednosti +REST_WEAP = Zabrana za oprema i oruzhja +SAVE_SET = Zachuvaj gi podesuvanjata +CONF_SAV_SUC = Listata so zabraneti oruzhja e uspeshno zachuvana +CONF_SAV_FAIL = Listata so zabraneti oruzhja ne e zachuvana!!! +REG_CMD_MENU = - go otvara menito za zabrana na oruzhja +REG_CMD_REST = - pokazhuva pomosh za zabrana na oruzhjata +RESTRICTED_ITEM = * Ova oruzhje e zabraneto * +MENU_TITLE_HANDGUNS = Rachni pishtoli +MENU_TITLE_SHOTGUNS = Shotguns +MENU_TITLE_SUBMACHINES = Sub-Machine Guns +MENU_TITLE_RIFLES = Assault Rifles +MENU_TITLE_SNIPERS = Snajperi +MENU_TITLE_MACHINE = Machine Guns +MENU_TITLE_EQUIPMENT = Oprema +MENU_TITLE_AMMUNITION = Municija +MENU_ITEM_USP = H&K USP .45 Tactical +MENU_ITEM_GLOCK18 = Glock18 Select Fire +MENU_ITEM_DEAGLE = Desert Eagle .50AE +MENU_ITEM_P228 = SIG P228 +MENU_ITEM_ELITE = Dual Beretta 96G Elite +MENU_ITEM_FIVESEVEN = FN Five-Seven +MENU_ITEM_M3 = Benelli M3 Super90 +MENU_ITEM_XM1014 = Benelli XM1014 +MENU_ITEM_MP5NAVY = H&K MP5-Navy +MENU_ITEM_TMP = Steyr Tactical Machine Pistol +MENU_ITEM_P90 = FN P90 +MENU_ITEM_MAC10 = Ingram MAC-10 +MENU_ITEM_UMP45 = H&K UMP45 +MENU_ITEM_AK47 = AK-47 +MENU_ITEM_SG552 = Sig SG-552 Commando +MENU_ITEM_M4A1 = Colt M4A1 Carbine +MENU_ITEM_GALIL = Galil +MENU_ITEM_FAMAS = Famas +MENU_ITEM_AUG = Steyr Aug +MENU_ITEM_SCOUT = Steyr Scout +MENU_ITEM_AWP = AI Arctic Warfare/Magnum +MENU_ITEM_G3SG1 = H&K G3/SG-1 Sniper Rifle +MENU_ITEM_SG550 = Sig SG-550 Sniper +MENU_ITEM_M249 = FN M249 Para +MENU_ITEM_VEST = Kevlar Vest +MENU_ITEM_VESTHELM = Kevlar Vest & Helmet +MENU_ITEM_FLASHBANG = Flashbang +MENU_ITEM_HEGRENADE = HE Grenade +MENU_ITEM_SMOKEGRENADE = Smoke Grenade +MENU_ITEM_DEFUSER = Defuse Kit +MENU_ITEM_NVGS = NightVision Goggles +MENU_ITEM_SHIELD = Tactical Shield +MENU_ITEM_PRIAMMO = Primary weapon ammo +MENU_ITEM_SECAMMO = Secondary weapon ammo +CONFIG_FILE_HEADER = ; Generirano od pluginot %s. Ne menuvaj!^n; ime na vrednosta^n +ADMIN_UPD_RES_1 = ADMIN: gi obnovi zabranite za oruzhjata +ADMIN_UPD_RES_2 = ADMIN %s: gi obnovi zabranite za oruzhjata +ADMIN_CMD_UPDATEDCFG = Cmd: %N gi obnovi zabranite za oruzhjata +ADMIN_CMD_LOADEDCFG = Cmd: %N gi vchita zabranite za oruzhjata od "%s" +ADMIN_CMD_SAVEDCFG = Cmd: %N gi zashtiti zabranite za oruzhjata vo "%s" +ADMIN_MENU_SAVEDCFG = Menu: %N gi zashtiti zabranite za oruzhjata vo "%s" [hr] EQ_WE_RES = Oprema i oruzje su zabranjeni diff --git a/plugins/lang/scrollmsg.txt b/plugins/lang/scrollmsg.txt index d4396adb..1a485e6d 100755 --- a/plugins/lang/scrollmsg.txt +++ b/plugins/lang/scrollmsg.txt @@ -64,9 +64,9 @@ MSG_FREQ = Vierivan tekstin taajuus on: %d:%02d minuuttia MSG_DISABLED = Vieriva teksti poissa kaytosta [bg] -MIN_FREQ = Minimalnoto povtarq6to vreme za tova saob6tenie e %d secundi -MSG_FREQ = Scrolling saob6tenieto se pokazva vseki: %d:%02d minuti -MSG_DISABLED = Scrolling saob6tenieto e isklu4eno +MIN_FREQ = Minimalnoto povtarqshto vreme za tova suobshtenie e %d sekundi +MSG_FREQ = Skrolvashtoto suobshtenie se pokazva vseki: %d:%02d minuti +MSG_DISABLED = Skrolvashtoto suobshtenie e izkliucheno [ro] MIN_FREQ = Frecventa minima pentru acest mesaj este %d secunde @@ -89,9 +89,9 @@ MSG_FREQ = Frekvencia zobrazenia skrolovacej spravy: %d:%02d minut MSG_DISABLED = Skrolovacie zpravy vypnute [mk] -MIN_FREQ = Minimalnoto vreme na prikazuvanje na ovaa poraka e %d sekundi -MSG_FREQ = Vreme za prikazuvanje na leteckite poraki: %d:%02d minuti -MSG_DISABLED = Leteckata poraka e isklucena +MIN_FREQ = Minimalnoto vreme na prikazhuvanje na ovaa poraka e %d sekundi +MSG_FREQ = Vreme za prikazhuvanje na letechkite poraki: %d:%02d minuti +MSG_DISABLED = Letechkata poraka e iskluchena [hr] MIN_FREQ = Minimalno vrijeme prikazivanja za ovu poruku je %d sekundi diff --git a/plugins/lang/stats_dod.txt b/plugins/lang/stats_dod.txt index 251098af..f002968c 100755 --- a/plugins/lang/stats_dod.txt +++ b/plugins/lang/stats_dod.txt @@ -1236,10 +1236,10 @@ M_OF = [bg] WHOLEBODY = cqloto tqlo HEAD = glava -CHEST = graden ko6 +CHEST = graden kosh STOMACH = stomak -LEFTARM = lqva raka -RIGHTARM = dqsna raka +LEFTARM = lqva ruka +RIGHTARM = dqsna ruka LEFTLEG = lqv krak RIGHTLEG = desen krak MULTI_MSG = Multi-Kill! %s^ns %d ubiistva (%d glavi) @@ -1256,37 +1256,37 @@ RAMPAGE_SMALL = %s: RAMPAGE!!! UNSTOPPABLE_SMALL = %s IS UNSTOPPABLE!!! MONSTER_SMALL = %s IS A MONSTER! GODLIKE_SMALL = %s IS GODLIKE!!! -KNIFE_MSG1 = %s nakalcan i ubit %s -KNIFE_MSG2 = %s izvadi no6 i zasrami %s -KNIFE_MSG3 = %s zaobikoli skri6no i nakalca %s -KNIFE_MSG4 = %s ubi s no6 %s -HE_MSG1 = %s isprati malak podarak do %s -HE_MSG2 = %s hvarli malak podarak do %s -HE_MSG3 = %s napravi to4no hvarlqne do %s -HE_MSG4 = %s ima golqm explosiv za %s -SHE_MSG1 = %s samoubi se s granata -SHE_MSG2 = %s opitava effecta ot an HE Grenata -SHE_MSG3 = %s Gla6ta celi granati! +KNIFE_MSG1 = %s nakulca i ubi %s +KNIFE_MSG2 = %s izvadi noj i zasrami %s +KNIFE_MSG3 = %s zaobikoli skrishno i nakulca %s +KNIFE_MSG4 = %s ubi s noj %s +HE_MSG1 = %s izprati maluk podaruk do %s +HE_MSG2 = %s hvurli maluk podaruk do %s +HE_MSG3 = %s napravi tochno hvurlqne do %s +HE_MSG4 = %s ima golqm exploziv za %s +SHE_MSG1 = %s se samoubi s granata +SHE_MSG2 = %s vkusi efekta na HE granata +SHE_MSG3 = %s pogulna granata SHE_MSG4 = %s explodira! -HEAD_MSG1 = $kn ubi $vn sas mnogo precenen istrel v glavata! +HEAD_MSG1 = $kn ubi $vn s mnogo precenen izstrel v glavata! HEAD_MSG2 = $kn premahna glavata na $vn s $wn -HEAD_MSG3 = $kn napravi glavata na $vn ^nna puding sas $wn -HEAD_MSG4 = $vn be6e razmazan ot $kn -HEAD_MSG5 = $vn's head has been^nturned into red jello -HEAD_MSG6 = $kn ima mnogo dobar istrel s $wn,^nas $vn mnogo dobre znae. +HEAD_MSG3 = $kn napravi glavata na $vn ^nna puding s $wn +HEAD_MSG4 = $vn beshe razmazan ot $kn +HEAD_MSG5 = Glavata na $vn^n be prevurnata na cherven krem +HEAD_MSG6 = $kn ima mnogo dobur izstrel s $wn,^na $vn mnogo dobre znae tova. HEAD_MSG7 = glavata na $vn ostana mnogo vreme na mernika na $kn -DOUBLE_MSG1 = Wow! %s napravi double kill !!! -DOUBLE_MSG2 = Neveroqtno! %s napravi triple kill !!! -DOUBLE_MSG3 = Udivitelno! %s napravi %d ubiistva na vedna6 !!! +DOUBLE_MSG1 = Wow! %s napravi dvoino ubiistvo!!! +DOUBLE_MSG2 = Neveroqtno! %s napravi troino ubiistvo!!! +DOUBLE_MSG3 = Udivitelno! %s napravi %d ubiistva navednuj!!! MORTAR_MSG1 = %s set up mortar well and blow out %s -MORTAR_MSG2 = %s napravi dalak istrel do %s -KILL_INFO1 = %s ubi vi s %s^not distancia ot %.2f metra.^n -KILL_INFO2 = Toi vi napravi %d damage s %d udar(i)^ni vse o6te ima %dhp krav.^n -KILL_INFO3 = Vie napravihte %d damage kam nego s %d udar(i).^n -KILL_INFO4 = toi vi odari v:^n%s^n -STILL_HAS = %s vse o6te ima %dhp +MORTAR_MSG2 = %s napravi dulug izstrel do %s +KILL_INFO1 = %s vi ubi s %s^not razstoqnie ot %.2f metra.^n +KILL_INFO2 = Toi vi napravi %d shteta s %d udar(i)^ni vse oshte ima %dhp kruv.^n +KILL_INFO3 = Vie napravihte %d shteta kum nego s %d udar(i).^n +KILL_INFO4 = Toi vi udari v:^n%s^n +STILL_HAS = %s vse oshte ima %dhp NO_KILLER = Nqmate ubiec... -TOPX = Nai %d +TOPX = Nai-dobri %d FFIRE_IS = Friendly fire: ATTACKERS = Attackers: VICTIMS = Victims: @@ -1296,36 +1296,36 @@ YOU_HIT = vie udarihte %s v: SERVER_STATS = Server Statistiki SHOW_STATS = Pokaji statistiki SHOW_RANK = Pokaji rank -TA_MSG = %s atakuva saotbornik -TK_MSG = %s ubi saotbornik ! +TA_MSG = %s atakuva suotbornik +TK_MSG = %s ubi suotbornik ! NADE_CAUGHT = Wow! %s hvana na protivnika granatata! -NADE_FAILEDTK = Oops.. %s vi ubi kato se ma4e6e da hvarli granata na protivnia otbor... -NADE_FAILED = %s neuspq da hvarli granatata na protivnia otbor... -NADE_MASTER = OMG! %s e mastara na granatite !!! -DISABLED_MSG = Servare e isklu4il tazi opcq -MOST_KILLS = Nai mnogo ubiistva +NADE_FAILEDTK = Ups.. %s vi ubi kato se mucheshe da hvurli granata na protivniq otbor... +NADE_FAILED = %s ne uspq da hvurli granatata na protivniq otbor... +NADE_MASTER = OMG! %s e mastura na granatite !!! +DISABLED_MSG = Servara e izkliuchil tazi opciq +MOST_KILLS = Nai-mnogo ubiistva KILL = ubiistvo KILLS = ubiistva HEADSHOT = udar v glavata HEADSHOTS = udari v glavata -BEST_SCORE = Nai dobar resultat -POINTS = to4ki -MOST_DAMAGE = Nai mnogo damage -DAMAGE = damage +BEST_SCORE = Nai-dobir rezultat +POINTS = tochki +MOST_DAMAGE = Nai-mnogo shteta +DAMAGE = shteta HIT = udar HITS = udari -M_KILLS = ubiistva: -M_DEATHS = umirania: -M_SCORE = Resultat: +M_KILLS = Ubiistva: +M_DEATHS = Umiraniq: +M_SCORE = Rezultat: M_TKS = TKS: -M_HITS = udari: -M_SHOTS = istreli: -M_HS = udari v glavata: -M_WEAPON = urajie: -M_DAMAGE = Damage: +M_HITS = Udari: +M_SHOTS = Izstreli: +M_HS = Udari v glavata: +M_WEAPON = Orujie: +M_DAMAGE = Shteta: M_NICK = Ime: -M_YOUR_RANK_IS = Va6ia rank e -M_THEIR_RANK_IS = Tqhnia rank e +M_YOUR_RANK_IS = Vashiq rank e +M_THEIR_RANK_IS = Tqhniq rank e M_OF = ot [ro] @@ -1731,53 +1731,53 @@ RAMPAGE_SMALL = %s: RAMPAGE!!! UNSTOPPABLE_SMALL = %s IS UNSTOPPABLE!!! MONSTER_SMALL = %s IS A MONSTER! GODLIKE_SMALL = %s IS GODLIKE!!! -KNIFE_MSG1 = %s go isece na parcinja %s -KNIFE_MSG2 = %s go izvadi nozot i go zakla %s +KNIFE_MSG1 = %s go ishece na parchinja %s +KNIFE_MSG2 = %s go izvadi nozhot i go zakla %s KNIFE_MSG3 = %s se prikrade i go zakla %s KNIFE_MSG4 = %s go zakla %s HE_MSG1 = %s mu isprati mal poklon na %s -HE_MSG2 = %s mu frli bomba vo dzeb na %s +HE_MSG2 = %s mu frli bomba vo dzheb na %s HE_MSG3 = %s precizno nafrli kon %s HE_MSG4 = %s go digna %s vo vozduh -SHE_MSG1 = %s se digna sebe si vo vozduh! -SHE_MSG2 = %s ja proveri ispravnosta na granata! +SHE_MSG1 = %s se digna sebesi vo vozduh! +SHE_MSG2 = %s ja proveri ispravnosta na granatata! SHE_MSG3 = %s ja izede granatata! SHE_MSG4 = %s se raznese sebesi! -HEAD_MSG1 = $kn go pogodi $vn so kursum vo glava! -HEAD_MSG2 = $kn go izbrici $vn^nna glava so $wn +HEAD_MSG1 = $kn go pogodi $vn so kurshum vo glava! +HEAD_MSG2 = $kn ja izbrichi na $vn^nglavata so $wnn HEAD_MSG3 = $kn go napravi $vn^npuding vo glavata so $wn HEAD_MSG4 = $vn ostana bez glava od $kn HEAD_MSG5 = $vn e napraven kechap! -HEAD_MSG6 = $kn odlicno nisani vo glava so $wn^nkako sto primeti i $vn -HEAD_MSG7 = $vn ostana na nisanot od $kn^npodolgo otkolku sto trebase... +HEAD_MSG6 = $kn odlicno nishani vo glava so $wn^nkako shto primeti i $vn +HEAD_MSG7 = $vn ostana na nishanot od $kn^npodolgo otkolku shto trebase... DOUBLE_MSG1 = Lele! %s napravi duplo ubistvo!!! -DOUBLE_MSG2 = Kakvo cudo! %s napravi trojno ubistvo !!! -DOUBLE_MSG3 = %s napravi %d ubistva odednas !!! +DOUBLE_MSG2 = Kakvo chudo! %s napravi trojno ubistvo !!! +DOUBLE_MSG3 = %s napravi %d ubistva odednash !!! MORTAR_MSG1 = %s go raznese %s -MORTAR_MSG2 = %s go ubi %s na golema dalecina -KILL_INFO1 = %s te ubi so %s^nna dalecina od %.2f metri.^n -KILL_INFO2 = Toj ti napravi %d steta so %d pogodok(a)^ni seuste ima %d energija.^n -KILL_INFO3 = Ti mu napravi %d steta so %d pogodok(a).^n +MORTAR_MSG2 = %s go ubi %s od golema dalechina +KILL_INFO1 = %s te ubi so %s^nna dalechina od %.2f metri.^n +KILL_INFO2 = Toj ti napravi %d shteta so %d pogodok(a)^ni se' ushte ima %d zhivot.^n +KILL_INFO3 = Ti mu napravi %d shteta so %d pogodok(a).^n KILL_INFO4 = Toj te pogodi vo:^n%s^n -STILL_HAS = %s seuste ima %d energija -NO_KILLER = Nemas ubiec... -TOPX = Top %d -FFIRE_IS = Friendly fire: -ATTACKERS = Te napadnaa: -VICTIMS = Zrtvi: -DMG = steta +STILL_HAS = %s se' ushte ima %d zhivot +NO_KILLER = Nemash ubiec... +TOPX = Najdobri %d +FFIRE_IS = Prijatelski ogan: +ATTACKERS = Napagjachi: +VICTIMS = Zhrtvi: +DMG = shteta HIT_S = pogodok(a) YOU_HIT = Ti go pogodi %s vo: SERVER_STATS = Statistika na serverot -SHOW_STATS = Pokazi ja statistikata -SHOW_RANK = Pokazi go rankot -TA_MSG = %s napadna soigrac -TK_MSG = %s ubi svoj soigrac ! +SHOW_STATS = Pokazhi ja statistikata +SHOW_RANK = Pokazhi go rankot +TA_MSG = %s napadna soigrach +TK_MSG = %s ubi svoj soigrach ! NADE_CAUGHT = Lele! %s ja fati bombata na protivnikot! -NADE_FAILEDTK = Uups.. %s te ubi dodeka sakase da mu ja vratis bombata na neprijatelot +NADE_FAILEDTK = Ups.. %s te ubi dodeka sakashe da mu ja vratish bombata na neprijatelot NADE_FAILED = %s ne uspea da mu ja vrati bombata na neprijatelot NADE_MASTER = LELE! %s e majstor za granati !!! -DISABLED_MSG = Serverot ja iskluci taa opcija +DISABLED_MSG = Serverot ja ima isklucheno ovaa opcija MOST_KILLS = Najmnogu ubistva KILL = ubistvo KILLS = ubistva @@ -1785,8 +1785,8 @@ HEADSHOT = pogodok vo glava HEADSHOTS = pogodoci vo glava BEST_SCORE = Najdobar rezultat POINTS = poeni -MOST_DAMAGE = Najmnogu steta -DAMAGE = steta +MOST_DAMAGE = Najmnogu shteta +DAMAGE = shteta HIT = pogodok HITS = pogodoci M_KILLS = Ubistva: @@ -1796,8 +1796,8 @@ M_TKS = TKs: M_HITS = Pocodoci: M_SHOTS = Pukanja: M_HS = Vo glava: -M_WEAPON = Oruzje: -M_DAMAGE = Steta: +M_WEAPON = Oruzhje: +M_DAMAGE = Shteta: M_NICK = Ime: M_YOUR_RANK_IS = Tvojot rank e M_THEIR_RANK_IS = Nivniot rank e diff --git a/plugins/lang/statscfg.txt b/plugins/lang/statscfg.txt index 408b7c91..d97dad6f 100755 --- a/plugins/lang/statscfg.txt +++ b/plugins/lang/statscfg.txt @@ -1078,28 +1078,28 @@ ST_HE_KILL_SOUND = Grenade Kill Sound ST_HE_SUICIDE_SOUND = Grenade Suicide Sound [bg] -NO_OPTION = Neuspe6no namerena opcia(i) s takav variable (ime "%s") -STATS_CONF_SAVED = configuraciata na statisticata e zapametena uspe6no -STATS_CONF_FAILED = configuraciata na statisticata ne e zapametena uspe6no!!! -STATS_CONF_LOADED = configuraciata na statisticata e prika4ena uspe6no -STATS_CONF_FAIL_LOAD = configuraciata na statisticata ne e prika4ena uspe6no!!! -STATS_CONF = configuraciata na statisticata +NO_OPTION = Ne e namerena opciq s takava promenliva (ime "%s") +STATS_CONF_SAVED = Konfiguraciqta na statistikata e zapametena uspeshno +STATS_CONF_FAILED = Konfiguraciqta na statistikata ne e zapametena uspeshno!!! +STATS_CONF_LOADED = Konfiguraciqta na statistikata e prikachena uspeshno +STATS_CONF_FAIL_LOAD = Konfiguraciqta na statistikata ne e prikachena uspeshno!!! +STATS_CONF = Konfiguraciq na statistikata STATS_ENTRIES_OF = Vkarani %i - %i ot %i -STATS_USE_MORE = Izpolzvai 'amx_statscfg list %i' za pove4e -STATS_USE_BEGIN = Izpolzvai 'amx_statscfg list 1' za na4alo -STATS_ENABLED = statisticata e vklu4ena -STATS_DISABLED = statisticata e izklu4ena -CANT_ADD_STATS = Nemoje da se dobavi statisticata kam tozi list, limita e dostignat! -COM_STATS_USAGE = Izpolzvano: amx_statscfg <comanda> [parametri] ... -COM_STATS_COM = Comandi: -COM_STATS_ON = ^ton <variable> - vklu4ena e specifi4nata opcia -COM_STATS_OFF = ^toff <variable> - izklu4ena e specifi4nata opcia -COM_STATS_SAVE = ^tsave - zapameti configuraciata na statistikata -COM_STATS_LOAD = ^tload - prika4i configuraciata na statistikata +STATS_USE_MORE = Izpolzvai 'amx_statscfg list %i' za poveche +STATS_USE_BEGIN = Izpolzvai 'amx_statscfg list 1' za nachalo +STATS_ENABLED = Statistikata e vkliuchena +STATS_DISABLED = Statistikata e izckliuchena +CANT_ADD_STATS = Ne moje da se dobavi statistikata kum tozi spisuk, limitut e dostignat! +COM_STATS_USAGE = Izpolzvane: amx_statscfg <komanda> [parametri] ... +COM_STATS_COM = Komandi: +COM_STATS_ON = ^ton <promenliva> - vkliuchena e specifichnata opciq +COM_STATS_OFF = ^toff <promenliva> - izckliuchena e specifichnata opciq +COM_STATS_SAVE = ^tsave - zapameti konfiguraciqta na statistikata +COM_STATS_LOAD = ^tload - prika4i konfiguraciqta na statistikata COM_STATS_LIST = ^tlist [id] - list na statusa na statistikata -COM_STATS_ADD = ^tadd <name> <variable> - dobavi statistikata kam lista -NO_STATS = pluginite za statistikata ne sa^ninstalirani na tozi server^n -SAVE_CONF = Zapameti configuraciata +COM_STATS_ADD = ^tadd <name> <promenliva> - dobavi statistikata kum lista +NO_STATS = Pluginite za statistikata ne sa^ninstalirani na tozi server^n +SAVE_CONF = Zapameti konfiguraciqta ST_MULTI_KILL = MultiKill ST_MULTI_KILL_SOUND = MultiKillSound ST_BOMB_PLANTING = Bomb Planting @@ -1494,27 +1494,27 @@ ST_HE_SUICIDE_SOUND = Grenade Suicide Sound [mk] NO_OPTION = Ne postoi opcija so takva vrednost (ime "%s") -STATS_CONF_SAVED = Izmenite vo statistikata se uspesno zacuvani -STATS_CONF_FAILED = Izmenite vo statistikata ne se zacuvani!!! -STATS_CONF_LOADED = Izmenite vo statistikata se uspesno vcitani -STATS_CONF_FAIL_LOAD = Izmenite vo statistikata ne se vcitani!!! -STATS_CONF = Podesuvanja Za Statistikata +STATS_CONF_SAVED = Izmenite vo statistikata se uspeshno zachuvani +STATS_CONF_FAILED = Izmenite vo statistikata ne se zachuvani!!! +STATS_CONF_LOADED = Izmenite vo statistikata se uspeshno vchitani +STATS_CONF_FAIL_LOAD = Izmenite vo statistikata ne se vchitani!!! +STATS_CONF = Podesuvanja za statistikata STATS_ENTRIES_OF = Vrednosti %i - %i od %i -STATS_USE_MORE = Napisi 'amx_statscfg list %i' za uste -STATS_USE_BEGIN = Napisi 'amx_statscfg list 1' za od pocetok -STATS_ENABLED = Statistikata e uklucena -STATS_DISABLED = Statistikata e isklucena -CANT_ADD_STATS = Ne moze da se dodade statistika na listata, limitot e dostignat! -COM_STATS_USAGE = Koristenje: amx_statscfg <komanda> [vrednost] ... +STATS_USE_MORE = Napishi 'amx_statscfg list %i' za uhste +STATS_USE_BEGIN = Napishi 'amx_statscfg list 1' za vrakjanje na pochetok +STATS_ENABLED = Statistikata e ukluchena +STATS_DISABLED = Statistikata e iskluchena +CANT_ADD_STATS = Ne mozhe da se dodade statistika na listata, limitot e dostignat! +COM_STATS_USAGE = Upotreba: amx_statscfg <komanda> [vrednost] ... COM_STATS_COM = Komandi: -COM_STATS_ON = ^ton <vrednost> - ukluci ja izbranata opcijata -COM_STATS_OFF = ^toff <vrednost> - iskluci ja izbranata opcijata -COM_STATS_SAVE = ^tsave - zacuvaj gi podesuvanjata za statistikata -COM_STATS_LOAD = ^tload - vcitaj podesuvanja za statistikata -COM_STATS_LIST = ^tlist [id] - prikazi go statusot za statistikata -COM_STATS_ADD = ^tadd <name> <variable> - dodaj statistika na krajot od listata -NO_STATS = Plaginot za statistika^nne e instaliran na ovoj server^n -SAVE_CONF = Zacuvaj ja konfiguracijata +COM_STATS_ON = ^ton <vrednost> - ukluchi ja izbranata opcijata +COM_STATS_OFF = ^toff <vrednost> - iskluchi ja izbranata opcijata +COM_STATS_SAVE = ^tsave - zachuvaj gi podesuvanjata za statistikata +COM_STATS_LOAD = ^tload - vchitaj podesuvanja za statistikata +COM_STATS_LIST = ^tlist [id] - prikazhi go statusot za statistikata +COM_STATS_ADD = ^tadd <ime> <promenliva> - dodaj statistika na krajot od listata +NO_STATS = Pluginot za statistika^nne e instaliran na ovoj server^n +SAVE_CONF = Zachuvaj ja konfiguracijata ST_MULTI_KILL = MultiKill ST_MULTI_KILL_SOUND = MultiKillSound ST_BOMB_PLANTING = Bomb Planting diff --git a/plugins/lang/statsx.txt b/plugins/lang/statsx.txt index 644a0996..89428e87 100755 --- a/plugins/lang/statsx.txt +++ b/plugins/lang/statsx.txt @@ -664,53 +664,53 @@ DISABLED_MSG = Palvelin on poistanut tuon vaihtoehdon kaytosta [bg] WHOLEBODY = cqloto tqlo HEAD = glava -CHEST = graden ko6 +CHEST = graden kosh STOMACH = stomah -LEFTARM = lqva raka -RIGHTARM = dqsna raka +LEFTARM = lqva ruka +RIGHTARM = dqsna ruka LEFTLEG = lqv krak RIGHTLEG = desen krak MODE_SET_TO = "amx_statsx_mode" naglasen na "%s" -ATTACKERS = Attackers -ACC = to4. +ATTACKERS = Napadateli +ACC = toch. HIT_S = udar(i) DMG = dmg -VICTIMS = Ubiti -MOST_DMG = Nai mnogo damage napraven ot -KILLED_YOU_DIST = %s te ubi s %s^not %0.2f meters. -DID_DMG_HITS = toi napravi %d damage na teb s %d udar(i)^ni vse o6te ima %dhp i %dap. -YOU_DID_DMG = Ti napravi %d damage na nego s %d udar(i). +VICTIMS = Jertvi +MOST_DMG = Nai-mnogo shteta napravena ot +KILLED_YOU_DIST = %s te ubi s %s^not %0.2f metri. +DID_DMG_HITS = Toi napravi %d shteta na teb s %d udar(i)^ni vse oshte ima %dhp i %dap. +YOU_DID_DMG = Ti napravi %d shteta na nego s %d udar(i). EFF = eff. -BEST_SCORE = Nai dobar resultat -KILL_S = ubiistrvo(a) -TOTAL = Ob6to -SHOT_S = Istrela(i) +BEST_SCORE = Nai-dobur rezultat +KILL_S = ubiistva +TOTAL = Obshto +SHOT_S = izstreli HITS_YOU_IN = %s vi oceli v KILLED_BY_WITH = Ubit ot %s s %s @ %0.0fm NO_HITS = Nqma udari -YOU_NO_KILLER = nqnate ubiec... -YOU_HIT = Vie ucelihte %s %d put(i), %d damage -LAST_RES = Posleden resultat: %d put(i), %d damage +YOU_NO_KILLER = Nqmate ubiec... +YOU_HIT = Vie ucelihte %s %d put(i), %d shteta +LAST_RES = Posleden rezultat: %d put(i), %d shteta KILLS = Ubiistva -DEATHS = umirania +DEATHS = Umiraniq HITS = Udari -SHOTS = Istreli -YOUR = Va6ia -PLAYERS = Igra4i -RANK_IS = ranka e %d ot %d -DAMAGE = Damage -WEAPON = Orajie -YOUR_RANK_IS = Va6ia rank e %d ot %d s %d ubiistvo(a), %d udar(i), %0.2f%% eff. i %0.2f%% acc. +SHOTS = Izstreli +YOUR = Vashiq +PLAYERS = Igrachi +RANK_IS = rank e %d ot %d +DAMAGE = Shteta +WEAPON = Orujie +YOUR_RANK_IS = Vashiqt rank e %d ot %d s %d ubiistva, %d udar(i), %0.2f%% eff. i %0.2f%% acc. AMMO = patroni -HEALTH = krav +HEALTH = kruv ARMOR = bronq -GAME_SCORE = Resultat na igrata -STATS_ANNOUNCE = Vie imate %s statistiki obqveni -ENABLED = vklu4en -DISABLED = izklu4en -SERVER_STATS = Statistiki na server -X_RANK_IS = ranka na %s e %d ot %d -DISABLED_MSG = Servera e isklu4il tazi optia +GAME_SCORE = Rezultat na igrata +STATS_ANNOUNCE = Vie imate %s suobshteniq za statistika +ENABLED = vkliuchen +DISABLED = izkliuchen +SERVER_STATS = Statistiki na servera +X_RANK_IS = Rankut na %s e %d ot %d +DISABLED_MSG = Serverut e izkliuchil tazi opciq [ro] WHOLEBODY = tot corpul @@ -925,47 +925,47 @@ LEFTARM = leva raka RIGHTARM = desna raka LEFTLEG = leva noga RIGHTLEG = desna noga -MODE_SET_TO = "amx_statsx_mode" e namesten na "%s" -ATTACKERS = Te napadnaa +MODE_SET_TO = "amx_statsx_mode" e podesen na "%s" +ATTACKERS = Napagjachi ACC = preciznost HIT_S = pogodok(a) -DMG = steta -VICTIMS = Zrtvi -MOST_DMG = Najmnogu steta e nanesena od -KILLED_YOU_DIST = %s te ubi so %s^nna dalecina od %0.2f metri. -DID_DMG_HITS = Toj ti napravi %d steta so %d pogodok(a)^ni seuste ima %d energija i %d pancir. -YOU_DID_DMG = Ti mu napravi %d steta so %d pogodok(a). +DMG = shteta +VICTIMS = Zhrtvi +MOST_DMG = Najmnogu shteta e nanesena od +KILLED_YOU_DIST = %s te ubi so %s^nna dalechina od %0.2f metri. +DID_DMG_HITS = Toj ti napravi %d shteta so %d pogodok(a)^ni se' ushte ima %d energija i %d pancir. +YOU_DID_DMG = Ti mu napravi %d shteta so %d pogodok(a). EFF = efikasnost BEST_SCORE = Najdobar rezultat -KILL_S = Ubistva +KILL_S = ubistva TOTAL = Vkupno SHOT_S = pukanja HITS_YOU_IN = %s te pogodi vo KILLED_BY_WITH = Ubien si od %s so %s @ %0.0fm NO_HITS = nema pogodoci YOU_NO_KILLER = Nikoj te nema ubieno... -YOU_HIT = Ti go pogodi %s %d pati, %d steta -LAST_RES = Posleden rezultat: %d pogodoci, %d steta +YOU_HIT = Ti go pogodi %s %d pati, %d shteta +LAST_RES = Posleden rezultat: %d pogodoci, %d shteta KILLS = Ubistva -DEATHS = Bil ubien +DEATHS = Umiranja HITS = Pogodoci SHOTS = Pukanja YOUR = Tvojot -PLAYERS = Za igracot +PLAYERS = Za igrachot RANK_IS = rank e %d od %d -DAMAGE = Steta -WEAPON = Oruzje +DAMAGE = Shteta +WEAPON = Oruzhje YOUR_RANK_IS = Tvojot rank e %d od %d so %d ubistva, %d pogodok(a), %0.2f%% efikasnost i %0.2f%% preciznost. AMMO = municija HEALTH = energija ARMOR = pancir GAME_SCORE = Rezultat na igrata -STATS_ANNOUNCE = Imate %s najava -ENABLED = uklucen -DISABLED = isklucen +STATS_ANNOUNCE = Imate %s izvestuvanja za statistika +ENABLED = ukluchen +DISABLED = iskluchen SERVER_STATS = Statistika na serverot X_RANK_IS = %s rank e %d od %d -DISABLED_MSG = Taa opcija e isklucena vo serverot +DISABLED_MSG = Taa opcija e iskluchena vo serverot [hr] WHOLEBODY = cijelo tijelo diff --git a/plugins/lang/telemenu.txt b/plugins/lang/telemenu.txt index b81ce79d..40e5a826 100755 --- a/plugins/lang/telemenu.txt +++ b/plugins/lang/telemenu.txt @@ -128,8 +128,8 @@ SAVE_LOC = Ulozit miesto ADMIN_TELEPORT_1 = ADMIN: go teleportira %s ADMIN_TELEPORT_2 = ADMIN %s: go teleportira %s TELE_MENU = Meni za teleportiranje -CUR_LOC = Vidi ja zacuvanata lokacija -SAVE_LOC = Zacuvaj ja segasnata lokacija +CUR_LOC = Vidi ja zachuvanata lokacija +SAVE_LOC = Zachuvaj ja segashnata lokacija [hr] ADMIN_TELEPORT_1 = ADMIN: teleportirao %s diff --git a/plugins/lang/time.txt b/plugins/lang/time.txt index a7fcc5b1..3676fb88 100644 --- a/plugins/lang/time.txt +++ b/plugins/lang/time.txt @@ -167,17 +167,17 @@ TIME_ELEMENT_PERMANENTLY = permanent TIME_ELEMENT_AND = og [bg] -TIME_ELEMENT_SECOND = secunda -TIME_ELEMENT_SECONDS = secundi +TIME_ELEMENT_SECOND = sekunda +TIME_ELEMENT_SECONDS = sekundi TIME_ELEMENT_MINUTE = minuta TIME_ELEMENT_MINUTES = minuti -TIME_ELEMENT_HOUR = 4as -TIME_ELEMENT_HOURS = 4asove +TIME_ELEMENT_HOUR = chas +TIME_ELEMENT_HOURS = chasove TIME_ELEMENT_DAY = den TIME_ELEMENT_DAYS = dni TIME_ELEMENT_WEEK = sedmica TIME_ELEMENT_WEEKS = sedmici -TIME_ELEMENT_PERMANENTLY = do jivot +TIME_ELEMENT_PERMANENTLY = zavinagi TIME_ELEMENT_AND = i [ro] @@ -241,13 +241,13 @@ TIME_ELEMENT_SECOND = sekunda TIME_ELEMENT_SECONDS = sekundi TIME_ELEMENT_MINUTE = minuta TIME_ELEMENT_MINUTES = minuti -TIME_ELEMENT_HOUR = cas -TIME_ELEMENT_HOURS = casovi +TIME_ELEMENT_HOUR = chas +TIME_ELEMENT_HOURS = chasovi TIME_ELEMENT_DAY = den TIME_ELEMENT_DAYS = denovi TIME_ELEMENT_WEEK = nedela TIME_ELEMENT_WEEKS = nedeli -TIME_ELEMENT_PERMANENTLY = zasekogas +TIME_ELEMENT_PERMANENTLY = zasekogash TIME_ELEMENT_AND = i [hr] diff --git a/plugins/lang/timeleft.txt b/plugins/lang/timeleft.txt index c0510d54..c8b8e754 100755 --- a/plugins/lang/timeleft.txt +++ b/plugins/lang/timeleft.txt @@ -116,13 +116,13 @@ SECOND = sekunti SECONDS = sekuntia [bg] -THE_TIME = 4asa -TIME_LEFT = Ostanalo Vreme +THE_TIME = Chasut +TIME_LEFT = Ostanalo vreme NO_T_LIMIT = Nqma limit na vremeto MINUTE = minuta MINUTES = minuti -SECOND = secunda -SECONDS = secundi +SECOND = sekunda +SECONDS = sekundi [ro] THE_TIME = Ora @@ -162,8 +162,8 @@ SECONDS = sekund [mk] THE_TIME = Vreme -TIME_LEFT = Preostanato Vreme -NO_T_LIMIT = Nema Ogranicuvanje Na Vremeto +TIME_LEFT = Preostanato vreme +NO_T_LIMIT = Nema ogranicuvanje na vremeto MINUTE = minuta MINUTES = minuti SECOND = sekunda From 387dc6a1882b3362f51cd2c8f9b71aa8596b674f Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Tue, 10 Jul 2018 12:09:20 +0200 Subject: [PATCH 05/98] Fix a menu recursion issue (#471) * Factorize menu close logic in show_menu() * Use CS-specific player's m_iMenu offset instead of menuselect command --- amxmodx/CGameConfigs.h | 13 +++++++++ amxmodx/amxmodx.cpp | 65 +++++++++++++++++++++--------------------- amxmodx/newmenus.cpp | 11 +++---- 3 files changed, 52 insertions(+), 37 deletions(-) diff --git a/amxmodx/CGameConfigs.h b/amxmodx/CGameConfigs.h index 72f31358..3ced7691 100644 --- a/amxmodx/CGameConfigs.h +++ b/amxmodx/CGameConfigs.h @@ -166,6 +166,19 @@ class CGameConfigManager : public IGameConfigManager StringHashMap<ITextListener_SMC*> m_customHandlers; }; +#define GET_OFFSET(classname, member) \ + static int member = -1; \ + if (member == -1) \ + { \ + TypeDescription type; \ + if (!CommonConfig->GetOffsetByClass(classname, #member, &type) || type.fieldOffset < 0)\ + { \ + LogError(amx, AMX_ERR_NATIVE, "Invalid %s offset. Native %s is disabled", #member, __FUNCTION__);\ + return 0; \ + } \ + member = type.fieldOffset; \ + } + extern CGameConfigManager ConfigManager; extern IGameConfig *CommonConfig; diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index ee0eac70..2cfeec5e 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -1246,31 +1246,48 @@ static cell AMX_NATIVE_CALL get_user_team(AMX *amx, cell *params) /* 3 param */ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ { + auto closeMenu = [amx](int index) -> int + { + auto pPlayer = GET_PLAYER_POINTER_I(index); + + if (!pPlayer->ingame) + { + return 1; + } + + pPlayer->keys = 0; + pPlayer->menu = 0; + + // Fire newmenu callback so closing it can be handled by the plugin + if (!CloseNewMenus(pPlayer)) + { + LogError(amx, AMX_ERR_NATIVE, "Plugin called menu_display when item=MENU_EXIT"); + return 2; + } + + if (g_bmod_cstrike) + { + GET_OFFSET("CBasePlayer", m_iMenu); + set_pdata<int>(pPlayer->pEdict, m_iMenu, 0); + } + + return 0; + }; + + int index = params[1]; + // If show_menu is called from within a newmenu callback upon receiving MENU_EXIT // it is possible for this native to recurse. We need to close newmenus right away // because the recursive call would otherwise modify/corrupt the static get_amxstring // buffer mid execution. This will either display incorrect text or result in UTIL_ShowMenu // running into an infinite loop. - int index = params[1]; if (index == 0) { for (int i = 1; i <= gpGlobals->maxClients; ++i) { - CPlayer* pPlayer = GET_PLAYER_POINTER_I(i); - - if (pPlayer->ingame) + if (closeMenu(i) == 2) { - pPlayer->keys = 0; - pPlayer->menu = 0; - - // Fire newmenu callback so closing it can be handled by the plugin - if (!CloseNewMenus(pPlayer)) - { - LogError(amx, AMX_ERR_NATIVE, "Plugin called menu_display when item=MENU_EXIT"); - return 0; - } - - UTIL_FakeClientCommand(pPlayer->pEdict, "menuselect", "10", 0); + return 0; } } } @@ -1282,23 +1299,7 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ return 0; } - CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); - - if (pPlayer->ingame) - { - pPlayer->keys = 0; - pPlayer->menu = 0; - - // Fire newmenu callback so closing it can be handled by the plugin - if (!CloseNewMenus(pPlayer)) - { - LogError(amx, AMX_ERR_NATIVE, "Plugin called menu_display when item=MENU_EXIT"); - return 0; - } - - UTIL_FakeClientCommand(pPlayer->pEdict, "menuselect", "10", 0); - } - else + if (closeMenu(index)) { return 0; } diff --git a/amxmodx/newmenus.cpp b/amxmodx/newmenus.cpp index 478be49e..5e6d0773 100755 --- a/amxmodx/newmenus.cpp +++ b/amxmodx/newmenus.cpp @@ -316,11 +316,6 @@ bool Menu::Display(int player, page_t page) CPlayer *pPlayer = GET_PLAYER_POINTER_I(player); - pPlayer->keys = 0; - pPlayer->menu = 0; - - UTIL_FakeClientCommand(pPlayer->pEdict, "menuselect", "10", 0); - pPlayer->keys = keys; pPlayer->menu = menuId; pPlayer->newmenu = thisId; @@ -828,6 +823,12 @@ static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params) return 0; } + if (g_bmod_cstrike) + { + GET_OFFSET("CBasePlayer", m_iMenu); + set_pdata<int>(pPlayer->pEdict, m_iMenu, 0); + } + int time = -1; if (params[0] / sizeof(cell) >= 4) time = params[4]; From fc337d12a49506818ea6f4bc6fb82ce0de61378b Mon Sep 17 00:00:00 2001 From: regener <dtomi24@hotmail.com> Date: Tue, 10 Jul 2018 12:10:25 +0200 Subject: [PATCH 06/98] Hungarian language update (#474) The important parts have been updated* and the missing parts added according to my best knowledge. *admincmd.txr was UTF8 instead of UTF8 without BOM, I'm not sure it was a mistake or not. --- plugins/lang/admin.txt | 18 ++--- plugins/lang/adminchat.txt | 14 ++-- plugins/lang/admincmd.txt | 126 +++++++++++++++++----------------- plugins/lang/adminhelp.txt | 17 +++-- plugins/lang/adminslots.txt | 2 +- plugins/lang/adminvote.txt | 54 +++++++-------- plugins/lang/antiflood.txt | 2 +- plugins/lang/cmdmenu.txt | 6 +- plugins/lang/common.txt | 26 +++---- plugins/lang/imessage.txt | 2 +- plugins/lang/mapchooser.txt | 10 +-- plugins/lang/mapsmenu.txt | 44 ++++++------ plugins/lang/menufront.txt | 30 ++++---- plugins/lang/miscstats.txt | 68 +++++++++--------- plugins/lang/multilingual.txt | 16 ++--- plugins/lang/nextmap.txt | 6 +- plugins/lang/pausecfg.txt | 68 +++++++++--------- plugins/lang/plmenu.txt | 34 ++++----- plugins/lang/restmenu.txt | 120 +++++++++++++++++++++++--------- plugins/lang/scrollmsg.txt | 6 +- plugins/lang/statscfg.txt | 32 ++++----- plugins/lang/statsx.txt | 76 ++++++++++---------- plugins/lang/telemenu.txt | 2 +- plugins/lang/time.txt | 16 ++--- plugins/lang/timeleft.txt | 10 +-- 25 files changed, 431 insertions(+), 374 deletions(-) diff --git a/plugins/lang/admin.txt b/plugins/lang/admin.txt index 32b42784..df49cb9d 100755 --- a/plugins/lang/admin.txt +++ b/plugins/lang/admin.txt @@ -194,17 +194,17 @@ PRIV_SET = Privilegii acordate NO_ENTRY = Acest nume este rezervat pe server. [hu] -LOADED_ADMIN = 1 admin betoltve a file-bol. -LOADED_ADMINS = %d admin betoltve a filebol. +LOADED_ADMIN = 1 admin betöltve a fájlból. +LOADED_ADMINS = %d admin betöltve a fájlból. SQL_CANT_CON = SQL hiba: nem lehet csatlakozni: '%s' -SQL_CANT_LOAD_ADMINS = SQL hiba: nem lehet az adminokat betolteni: '%s' +SQL_CANT_LOAD_ADMINS = SQL hiba: nem lehet az adminokat betölteni: '%s' NO_ADMINS = Nincsenek adminok. -SQL_LOADED_ADMIN = 1 admin betoltve a adatbazisbol -SQL_LOADED_ADMINS = %d admin betoltve a adatbazisbol -INV_PAS = Hibas jelszo! -PAS_ACC = Jelszo elfogadva -PRIV_SET = Beallitasok -NO_ENTRY = Neked nincs bejegyzesed a szerveren... +SQL_LOADED_ADMIN = 1 admin betöltve a adatbázisból. +SQL_LOADED_ADMINS = %d admin betöltve a adatbázisból. +INV_PAS = Hibas jelszó! +PAS_ACC = Jelszó elfogadva. +PRIV_SET = Beállítások +NO_ENTRY = Nincs hozzáférésed a szerverhez... [lt] LOADED_ADMIN = Uzkrautas 1 adminas is failo diff --git a/plugins/lang/adminchat.txt b/plugins/lang/adminchat.txt index 0c303e16..088e1d70 100755 --- a/plugins/lang/adminchat.txt +++ b/plugins/lang/adminchat.txt @@ -194,16 +194,16 @@ COL_MAROON = maro PRINT_ALL = (TOTI) %s : %s [hu] -COL_WHITE = feher +COL_WHITE = fehér COL_RED = piros -COL_GREEN = zold -COL_BLUE = kek -COL_YELLOW = csarga +COL_GREEN = zöld +COL_BLUE = kék +COL_YELLOW = csárga COL_MAGENTA = magenta COL_CYAN = cyan -COL_ORANGE = nsarga -COL_OCEAN = ocean -COL_MAROON = maroon +COL_ORANGE = nsárga +COL_OCEAN = óceán +COL_MAROON = barna PRINT_ALL = (MIND) %s : %s [lt] diff --git a/plugins/lang/admincmd.txt b/plugins/lang/admincmd.txt index e540231c..796c94b6 100755 --- a/plugins/lang/admincmd.txt +++ b/plugins/lang/admincmd.txt @@ -1125,79 +1125,81 @@ ADMIN_EXTEND_2 = ADMIN %s: extinde harta pentru %d minute MAP_EXTENDED = Harta "%s" a fost extinsa pentru %d minute [hu] -ADMIN_KICK_1 = ADMIN: %s kirugva -ADMIN_KICK_2 = ADMIN %s: %s kirugva -IP_REMOVED = Ip "%s" eltavolitva a ban-listarol -AUTHID_REMOVED = Authid "%s" eltavolitva a ban-listarol -ADMIN_UNBAN_1 = ADMIN: %s ban visszavonasa -ADMIN_UNBAN_2 = ADMIN %s: %s ban visszavonasa +ADMIN_KICK_1 = ADMIN: %s kirúgva +ADMIN_KICK_2 = ADMIN %s: %s kirúgva +IP_REMOVED = Ip "%s" eltávolítva a ban-listárol +AUTHID_REMOVED = Authid "%s" eltávolítva a ban-listáról +ADMIN_UNBAN_1 = ADMIN: %s ban visszavonva +ADMIN_UNBAN_2 = ADMIN %s: %s ban visszavonva ADMIN_ADDBAN_1 = ADMIN: ban %s ADMIN_ADDBAN_2 = ADMIN %s: ban %s -BANNED = banolva -REASON = ok +BANNED = Bannolva +REASON = Indok FOR_MIN = %s percre -PERM = orokre -CLIENT_BANNED = felhasznalo "%s" banolva -ADMIN_SLAY_1 = ADMIN: %s megolve -ADMIN_SLAY_2 = ADMIN %s: %s megolve -CLIENT_SLAYED = Client "%s" megolve -ADMIN_SLAP_1 = ADMIN: %s megutve %d sebzessel -ADMIN_SLAP_2 = ADMIN %s: megutve %s %d sebzessel -CLIENT_SLAPED = Client "%s" megutve %d sebzessel -MAP_NOT_FOUND = Palya ezen a neven nem talalhato vagy nem megfelelo -ADMIN_MAP_1 = ADMIN: palyavaltas %s -ADMIN_MAP_2 = ADMIN %s: palyavaltas %s -NO_MORE_CVARS = Nem lehet tobb cvars hozaadni az rcon hozzafereshez! +PERM = örökre +CLIENT_BANNED = felhasználó "%s" banolva +ADMIN_SLAY_1 = ADMIN: %s megölve +ADMIN_SLAY_2 = ADMIN %s: %s megölve +CLIENT_SLAYED = Client "%s" megölve +ADMIN_SLAP_1 = ADMIN: %s megütve %d sebzéssel +ADMIN_SLAP_2 = ADMIN %s: megütve %s %d sebzéssel +CLIENT_SLAPED = Client "%s" megütve %d sebzéssel +MAP_NOT_FOUND = Nem található ilyen nevű pálya +ADMIN_MAP_1 = ADMIN: pályaváltás %s +ADMIN_MAP_2 = ADMIN %s: pályaváltás %s +NO_MORE_CVARS = Nem lehet több cvart hozzáadni az rcon hozzáféreshez! UNKNOWN_CVAR = Ismeretlen cvar: %s UNKNOWN_XVAR = Ismeretlen xvar: %s -CVAR_NO_ACC = Nincs engedelyed a cvar-hoz -XVAR_NO_ACC = Nincs engedelyed a xvar-hoz -CVAR_IS = Cvar "%s" is "%s" -XVAR_IS = Xvar "%s" is "%s" -PROTECTED = PROTECTED -SET_CVAR_TO = %s beallitva cvar %s to "%s" -SET_XVAR_TO = %s beallitva xvar %s to "%s" -CVAR_CHANGED = Cvar "%s" atalitva "%s"-ra. -XVAR_CHANGED = Xvar "%s" atalitva "%s"-ra. -LOADED_PLUGINS = Aktualis betoltott pluginok -NAME = nev -VERSION = verzio -AUTHOR = keszito -FILE = file -STATUS = allas -PLUGINS_RUN = %d plugin osszesen, %d fut -LOADED_MODULES = Aktualis betoltott pluginok +CVAR_NO_ACC = Nincs engedélyed a cvar-hoz +XVAR_NO_ACC = Nincs engedélyed a xvar-hoz +CVAR_IS = Cvar "%s" jelenleg "%s" +XVAR_IS = Xvar "%s" jelenleg "%s" +PROTECTED = Védett +SET_CVAR_TO = %s beállítva cvar %s to "%s" +SET_XVAR_TO = %s beállítva xvar %s to "%s" +CVAR_CHANGED = Cvar "%s" átállítva "%s"-ra. +XVAR_CHANGED = Xvar "%s" átállítva "%s"-ra. +LOADED_PLUGINS = Jelenleg betöltött pluginok +NAME = Név +VERSION = Verzió +AUTHOR = Készitő +FILE = fájl +STATUS = Státusz +PLUGINS_RUN = %d plugin összesen, %d fut +LOADED_MODULES = Jelenleg betöltött modulok NUM_MODULES = %d mod -FILE_NOT_FOUND = File "%s" nem talalhato -ADMIN_CONF_1 = ADMIN: config vegrehajtasa %s -ADMIN_CONF_2 = ADMIN %s: config vegrehajtasa %s -PAUSED = Pillanat alj -UNPAUSED = Pillanat alj vege -UNABLE_PAUSE = A szerveren nem lehet megallitani a jatekot. Valodi jatekosok kellenek. +FILE_NOT_FOUND = Fájl "%s" nem talalható +ADMIN_CONF_1 = ADMIN: config végrehajtása %s +ADMIN_CONF_2 = ADMIN %s: config végrehajtása %s +PAUSED = Szüneteltetve +UNPAUSED = Elindítva +UNABLE_PAUSE = A szerveren nem lehet megállítani a játékot. Valódi játékosok kellenek. SERVER_PROC = Server proceed %s -PAUSING = Pillanat alj -UNPAUSING = Pillanat alj vege -PAUSE = Pillanat alj -UNPAUSE = Pillanat alj vege -COM_SENT_SERVER = Parancssor "%s" elkuldve a szerver konzolba -CLIENTS_ON_SERVER = Jatekosok a szerveren +PAUSING = Szüneteltetés +UNPAUSING = Szüneteltetés vége +PAUSE = Szünet +UNPAUSE = Szünet vége +COM_SENT_SERVER = Parancssor "%s" elküldve a szerver konzolba +CLIENTS_ON_SERVER = Játékosok a szerveren IMMU = imm RESERV = res -ACCESS = engedely -TOTAL_NUM = Osszesen %d -SKIP_MATCH = kihagy "%s" (matching "%s") -SKIP_IMM = kihagy "%s" (immunity) -KICK_PL = Kirug "%s" -YOU_DROPPED = Le lettel csatlakoztatva, mert az admin csak bizonyos csapat tagjait hagyta fent -KICKED_CLIENTS = kirugva %d clients +ACCESS = engedély +TOTAL_NUM = Összesen %d +SKIP_MATCH = "%s" Kihagyása (egyezés "%s") +SKIP_IMM = "%s" Kihagyása (immunitás) +KICK_PL = Kirúg "%s" +YOU_DROPPED = Le lettél csatlakoztatva, mert az admin csak bizonyos csapat tagjait hagyta fent +KICKED_CLIENTS = kirúgva %d felhasználó ADMIN_LEAVE_1 = ADMIN: leave %s %s %s %s ADMIN_LEAVE_2 = ADMIN %s: leave %s %s %s %s -ADMIN_NICK_1 = ADMIN: nevvaltas %s-rol "%s"-ra -ADMIN_NICK_2 = ADMIN %s: nevvaltas %s rol "%s"ra -CHANGED_NICK = Nevvaltas %s rol "%s"ra -ADMIN_EXTEND_1 = ADMIN: Bov�tett t�rk�p sz�m�ra %d percig -ADMIN_EXTEND_2 = ADMIN %s: Bov�tett t�rk�p sz�m�ra %d percig -MAP_EXTENDED = T�rk�p "%s" rendelkezik volna bov�tett sz�m�ra %d percig +ADMIN_NICK_1 = ADMIN: névváltás %s-ról "%s"-ra +ADMIN_NICK_2 = ADMIN %s: nevváltás %s-ról "%s"ra +CHANGED_NICK = Névvaltás %s-ról "%s"ra +ADMIN_EXTEND_1 = ADMIN: Páya hosszabbítása %d perccel +ADMIN_EXTEND_2 = ADMIN %s: Páya hosszabbítása %d perccel +MAP_EXTENDED = %s pálya meghosszabbítva %d perccel +ADMIN_MUST_TEMPBAN = Csak időhöz kötött bant tudsz kiosztani, maximum %d percet +ADMIN_MUST_TEMPUNBAN = Csak a nemrég általad bannolt játékosokat oldhatod fel [lt] ADMIN_KICK_1 = ADMINAS: iskikino %s diff --git a/plugins/lang/adminhelp.txt b/plugins/lang/adminhelp.txt index 2a2a249f..c214c522 100755 --- a/plugins/lang/adminhelp.txt +++ b/plugins/lang/adminhelp.txt @@ -139,13 +139,16 @@ TIME_INFO_1 = Timp Ramas: %d:%02d. Urmatoarea Harta: %s TIME_INFO_2 = Nici o Limita a Timpului. Urmatoarea Harta: %s [hu] -HELP_COMS = AMX Mod X segitseg: Parancsok -HELP_ENTRIES = Bejegyzes %d - %d of %d -HELP_USE_MORE = Irj '%s %d' -t tobbhoz -HELP_USE_BEGIN = Irj '%s 1' -t az elso oldalhoz -TYPE_HELP = Irj '%s' '%s' -t a konzolba hogy lathasd a parancsokat -TIME_INFO_1 = Hatralevo ido: %d:%02d perc. kovetkezo palya: %s -TIME_INFO_2 = Nincs idohatar. A kovetkezo palya: %s +HELP_COMS = AMX Mod X segítség: Parancsok +HELP_ENTRIES = Bejegyzés %d - %d of %d +HELP_USE_MORE = Írj 'amx_help %d' -t többhöz +HELP_USE_BEGIN = Yrj 'amx_help 1' -t az első oldalhoz +TYPE_HELP = Írj 'amx_help' -t a konzolba hogy láthasd a parancsokat +TIME_INFO_1 = Hátrálévő idő: %d:%02d perc. következő pálya: %s +TIME_INFO_2 = Nincs időhatár. A következő pálya: %s +HELP_CMD_INFO = <bejegyzés száma.> [megjeneítendő bejegyzések száma (csak szerver)] - információt nyújt az elérhető parancsokhoz +SEARCH_CMD_INFO = <egyezés> <bejegyzés száma> [megjeneítendő bejegyzések száma (csak szerver)] - információt nyújt az egyező parancsokhoz +NO_MATCHING_RESULTS = ^nNem található egyezés^n [lt] HELP_COMS = AMX Mod X Pagalba: Komandos diff --git a/plugins/lang/adminslots.txt b/plugins/lang/adminslots.txt index f9e1dd60..e7dfef86 100755 --- a/plugins/lang/adminslots.txt +++ b/plugins/lang/adminslots.txt @@ -44,7 +44,7 @@ DROPPED_RES = Premahnat poradi rezervaciq na slot DROPPED_RES = Ai primit kick pentru rezervare slot [hu] -DROPPED_RES = Nincs szabad hely. +DROPPED_RES = Helyfenntartás miatt kidobva. [lt] DROPPED_RES = Atjungtas, nes nera laisvos vietos diff --git a/plugins/lang/adminvote.txt b/plugins/lang/adminvote.txt index fbf26f2a..ae213d8c 100755 --- a/plugins/lang/adminvote.txt +++ b/plugins/lang/adminvote.txt @@ -509,38 +509,38 @@ ADMIN_VOTE_FOR_1 = %s: vot %s pentru %s ADMIN_VOTE_FOR_2 = %s %s: vot %s pentru %s [hu] -ADMIN_CANC_VOTE_1 = %s: szavazas visszavonasa -ADMIN_CANC_VOTE_2 = %s %s: szavazas visszavonasa -VOTING_CANC = Szavazas visszavonva. -NO_VOTE_CANC = Ezzel a parancsal nem lehet visszavonni a szavazast. -RES_REF = Eredmeny elutasitva -RES_ACCEPTED = Eredmeny elfogadva. -VOTING_FAILED = Szavazas sikertelen +ADMIN_CANC_VOTE_1 = %s: szavazás visszavonása +ADMIN_CANC_VOTE_2 = %s %s: szavazás visszavonása +VOTING_CANC = Szavazás visszavonva. +NO_VOTE_CANC = Ezzel a parancsal nem lehet visszavonni a szavazást. +RES_REF = A szavazás eredménytelen. +RES_ACCEPTED = A szavazás sikeres. +VOTING_FAILED = Szavazás sikertelen VOTING_RES_1 = %s (igen "%d") (nem "%d") (kell "%d") VOTING_RES_2 = %s (van "%d") (kell "%d") -VOTING_SUCCESS = Szavazas sikeres +VOTING_SUCCESS = Szavazás sikeres VOTING_RES_3 = %s (van "%d") (kell "%d"). Az eredmeny: %s -THE_RESULT = Az eredmeny +THE_RESULT = Az eredmény WANT_CONTINUE = Folytatod? -VOTED_FOR = %s igen-re szavazott -VOTED_AGAINST = %s nemre szavazott -VOTED_FOR_OPT = %s a #%d - re szavazott -ALREADY_VOTING = Mar folyik 1 szavazas... -VOTING_NOT_ALLOW = A szavazas most nincs engedelyezve +VOTED_FOR = %s az igenre szavazott +VOTED_AGAINST = %s a nemre szavazott +VOTED_FOR_OPT = %s a #%d -re szavazott +ALREADY_VOTING = Már folyik 1 szavazás... +VOTING_NOT_ALLOW = A szavazás most nincs engedélyezve GIVEN_NOT_VALID = Az adott %s nem helyes -MAP_IS = a palya -MAPS_ARE = a palya -CHOOSE_MAP = Valasz palyat -ADMIN_VOTE_MAP_1 = %s: Palya szavazas -ADMIN_VOTE_MAP_2 = %s %s: Palya szavazas -VOTING_STARTED = Szavazas inditva... -VOTING_FORBIDDEN = Voting for that has been forbidden -ADMIN_VOTE_CUS_1 = %s: szavazas custom -ADMIN_VOTE_CUS_2 = %s %s: szavazas custom -VOTE = Szavazas -ACTION_PERFORMED = Az akciot nem lehet "%s"-boton vegrehalytani -ADMIN_VOTE_FOR_1 = %s: szavazas %s vagy %s -ADMIN_VOTE_FOR_2 = %s %s: szavazas %s vagy %s +MAP_IS = a pálya +MAPS_ARE = a pálya +CHOOSE_MAP = Válassz pályát +ADMIN_VOTE_MAP_1 = %s: Pálya szavazás +ADMIN_VOTE_MAP_2 = %s %s: Pálya szavazás +VOTING_STARTED = Szavazás indítva... +VOTING_FORBIDDEN = A szavazás letiltva. +ADMIN_VOTE_CUS_1 = %s: szavazás custom +ADMIN_VOTE_CUS_2 = %s %s: szavazás custom +VOTE = Szavazás +ACTION_PERFORMED = A műveletet nem lehet "%s"-boton végrehajtani +ADMIN_VOTE_FOR_1 = %s: szavazás %s vagy %s +ADMIN_VOTE_FOR_2 = %s %s: szavazás %s vagy %s [lt] ADMIN_CANC_VOTE_1 = %s: atsaukti balsavima diff --git a/plugins/lang/antiflood.txt b/plugins/lang/antiflood.txt index 989363a6..e6b5ad9e 100755 --- a/plugins/lang/antiflood.txt +++ b/plugins/lang/antiflood.txt @@ -44,7 +44,7 @@ STOP_FLOOD = Ne fluudvai servera! STOP_FLOOD = Nu mai flooda server-ul! [hu] -STOP_FLOOD = Ne irj ilyen sokat! +STOP_FLOOD = Ne floodolj és ne spamelj! [lt] STOP_FLOOD = Nustok greitai rasyti! diff --git a/plugins/lang/cmdmenu.txt b/plugins/lang/cmdmenu.txt index b7bbc477..c9b7998c 100755 --- a/plugins/lang/cmdmenu.txt +++ b/plugins/lang/cmdmenu.txt @@ -74,9 +74,9 @@ CONF_MENU = Menu Configuratie SPE_MENU = Menu Speech [hu] -CMD_MENU = Parancs Menu -CONF_MENU = Beallitas Menu -SPE_MENU = Beszed Menu +CMD_MENU = Parancs Menü +CONF_MENU = Beállítás Menü +SPE_MENU = Beszéd Menü [lt] CMD_MENU = Komandu meniu diff --git a/plugins/lang/common.txt b/plugins/lang/common.txt index 461ffa48..eda3c15b 100755 --- a/plugins/lang/common.txt +++ b/plugins/lang/common.txt @@ -330,25 +330,25 @@ OFF = Dezactivat [hu] BACK = Vissza -EXIT = Kilepes -MORE = Tobb +EXIT = Kilépés +MORE = Több NONE = Egyiksem ADMIN = ADMIN -PLAYER = Jatekos +PLAYER = Játékos ERROR = hiba YES = Igen NO = Nem BAN = ban -KICK = kirugas -NO_ACC_COM = Nincs elerhetoseged ehhez a parancshoz. -USAGE = Hasznalat -MORE_CL_MATCHT = here are more clients matching to your argument -CL_NOT_FOUND = Nincs ilyen nevu jatekos -CLIENT_IMM = "%s" ellen all -CANT_PERF_DEAD = Ezt az akciot nem hajthatod vegre "%s"-on mert halott -CANT_PERF_BOT = Ezt az akciot nem hajthatod vegre "%s"-on mert bot -ON = Be -OFF = Ki +KICK = kirúgás +NO_ACC_COM = Nincs elérhetőséged ehhez a parancshoz. +USAGE = Használat +MORE_CL_MATCHT = Több játékosra is egyezik a megadott feltétel +CL_NOT_FOUND = Nincs ilyen nevű játékos +CLIENT_IMM = "%s" immunitás joggal rendelkezik +CANT_PERF_DEAD = Ezt a műveletet nem hajthatod végre "%s"-on mert halott +CANT_PERF_BOT = Ezt a műveletet nem hajthatod végre "%s"-on mert bot +ON = BE +OFF = KI [lt] BACK = Atgal diff --git a/plugins/lang/imessage.txt b/plugins/lang/imessage.txt index 03b58ee6..84e5b33d 100755 --- a/plugins/lang/imessage.txt +++ b/plugins/lang/imessage.txt @@ -44,7 +44,7 @@ INF_REACH = Dostignat e limitut za ingormacionni suobshteniq! INF_REACH = Limita mesajelor informative a fost atinsa! [hu] -INF_REACH = Informacio uzenetek limit elerve! +INF_REACH = Információs üzenetek limitje elérve! [lt] INF_REACH = Informacijos zinuciu limitas pasiektas diff --git a/plugins/lang/mapchooser.txt b/plugins/lang/mapchooser.txt index f1f22b6e..0d6a4a54 100755 --- a/plugins/lang/mapchooser.txt +++ b/plugins/lang/mapchooser.txt @@ -134,13 +134,13 @@ EXTED_MAP = Prelungirea hartii actuale %s TIME_CHOOSE = E timpul sa alegeti harta urmatoare... [hu] -CHO_FIN_EXT = A valasztas veget ert. A mostani palya meg %.0f percig lesz. -CHO_FIN_NEXT = A valasztas veget ert. A kovetkezo palya a %s lesz. -CHOSE_EXT = %s meg maradni szeretne +CHO_FIN_EXT = A választás véget ért. A mostani pálya még %.0f percig lesz. +CHO_FIN_NEXT = A választás véget ért. A következő pálya a %s lesz. +CHOSE_EXT = %s még maradni szeretne X_CHOSE_X = %s a %s-ra szavazott -CHOOSE_NEXTM = Valaszd ki a kovetkezo palyat. +CHOOSE_NEXTM = Válaszd ki a következő pályát. EXTED_MAP = Maradjunk a %s-n! -TIME_CHOOSE = Itt az ido hogy kivalaszd a kovetkezo palyat. +TIME_CHOOSE = Itt az idő hogy kiválaszd a következő pályát. [lt] CHO_FIN_EXT = Pasirinkimai baigti. Sis zemelapis dar bus %.0f minutes diff --git a/plugins/lang/mapsmenu.txt b/plugins/lang/mapsmenu.txt index d735c75e..15fe486e 100755 --- a/plugins/lang/mapsmenu.txt +++ b/plugins/lang/mapsmenu.txt @@ -359,28 +359,28 @@ ADMIN_CHANGEL_2 = ADMIN %s: schimbare harta pe %s CHANGLE_MENU = Menu Schimbare Harta [hu] -RESULT_REF = Ergebnis abgelehnt -RESULT_ACC = Ergebnis angenommen -VOTE_SUCCESS = Abstimmung beendet. Map wird gewechselt zu -VOTE_FAILED = Abstimmung gescheitert -THE_WINNER = Der Gewinner -WANT_CONT = Willst du fortfahren? -VOT_CANC = Abstimmung abgebrochen -X_VOTED_FOR = %s stimmten fuer Option #%d -VOTEMAP_MENU = Mapwahl Menu -START_VOT = Start Abstimmung -SEL_MAPS = Ausgewaehlte Maps -ALREADY_VOT = Es laeuft bereits eine Abstimmung... -NO_MAPS_MENU = Es sind keine Maps im Menu vorhanden -VOT_NOW_ALLOW = Abstimmung zur Zeit nicht moeglich -WHICH_MAP = Welche Map moechtest du? -CHANGE_MAP_TO = Wechsle zu Map -CANC_VOTE = Abstimmung abgebrochen -ADMIN_V_MAP_1 = ADMIN: waehlt Map(s) -ADMIN_V_MAP_2 = ADMIN %s: waehlt Map(s) -ADMIN_CHANGEL_1 = ADMIN: wechselt zur Map %s -ADMIN_CHANGEL_2 = ADMIN %s: wechselt zur Map %s -CHANGLE_MENU = Mapwechsel Menu +RESULT_REF = A szavazás eredménytelen. +RESULT_ACC = A szavazás sikeres. +VOTE_SUCCESS = A szavazás sikeres. A pálya el lesz váltva +VOTE_FAILED = A szavazás sikertelen. +THE_WINNER = A nyertes pálya +WANT_CONT = Folytatni akarod? +VOT_CANC = A szavazás megszakítva. +X_VOTED_FOR = %s szavazott erre: #%d +VOTEMAP_MENU = Mapszavazó menü +START_VOT = Szavazás elindítása +SEL_MAPS = Kiválasztott pályák +ALREADY_VOT = Már egy szavazás folyamatban van... +NO_MAPS_MENU = Nincsenek pályák a szavazó menüben. +VOT_NOW_ALLOW = Most nem lehet szavazni. +WHICH_MAP = Melyik pályákat szeretnéd a szavazásba? +CHANGE_MAP_TO = Pálya váltása +CANC_VOTE = Szavazás megszakítása +ADMIN_V_MAP_1 = ADMIN: szavazás pályaváltásról +ADMIN_V_MAP_2 = ADMIN %s: szavazás pályaváltásról +ADMIN_CHANGEL_1 = ADMIN: pályaváltás %s +ADMIN_CHANGEL_2 = ADMIN %s: pályaváltás %s +CHANGLE_MENU = Pályaváltó menü [lt] RESULT_REF = Rezultatas atsauktas diff --git a/plugins/lang/menufront.txt b/plugins/lang/menufront.txt index 1a99d286..db0b4c9f 100755 --- a/plugins/lang/menufront.txt +++ b/plugins/lang/menufront.txt @@ -269,22 +269,22 @@ RES_WEAP = Restrictioneaza Arme TELE_PLAYER = Teleporteaza Jucator [hu] -KICK_PLAYER = Jatekos kirugasa -BAN_PLAYER = Jatekos ban -SLAP_SLAY = Jatekos Megutes/Megoles -TEAM_PLAYER = Jatekos csapatvaltasa ^n -CHANGEL = Palyavaltas -VOTE_MAPS = Szavazas palyara ^n -SPECH_STUFF = Beszed menu -CLIENT_COM = Jatekos parancsok +KICK_PLAYER = Játékos kirúgása +BAN_PLAYER = Játékos ban +SLAP_SLAY = Játékos Megütes/Megölés +TEAM_PLAYER = Játékos csapatváltása ^n +CHANGEL = Pályaváltás +VOTE_MAPS = Szavazás pályára ^n +SPECH_STUFF = Beszéd menü +CLIENT_COM = Játekos parancsok SERVER_COM = Szerver parancsok -CVARS_SET = Cvars Beallitasok -CONFIG = Configuracio -LANG_SET = Nyelv Beallitasok -STATS_SET = Stat beallitasok ^n -PAUSE_PLUG = Pillanat alj Pluginok -RES_WEAP = Felfuggesztett fegyverek -TELE_PLAYER = Teleport jatekos +CVARS_SET = Cvar Beállítások +CONFIG = Configuráció +LANG_SET = Nyelv Beállítások +STATS_SET = Stat beállítások ^n +PAUSE_PLUG = Pillanat állj Pluginok +RES_WEAP = Felfüggesztett fegyverek +TELE_PLAYER = Játékos teleportálása [lt] KICK_PLAYER = Ismesti zaideja diff --git a/plugins/lang/miscstats.txt b/plugins/lang/miscstats.txt index 41665c63..d0e56092 100755 --- a/plugins/lang/miscstats.txt +++ b/plugins/lang/miscstats.txt @@ -705,49 +705,49 @@ HS = hs [hu] WITH = with -KNIFE_MSG_1 = %s Felvagta %s -t -KNIFE_MSG_2 = %s Szetszabta %s-t -KNIFE_MSG_3 = %s szetvagta %s-t -KNIFE_MSG_4 = %s megkeselte %s-t -LAST_MSG_1 = Mostmar minden rajtad mullik! -LAST_MSG_2 = Remelem van nallad 1 eletcsomag! -LAST_MSG_3 = Mar csak te maradtal. Hajra! +KNIFE_MSG_1 = %s felvágta %s-t! +KNIFE_MSG_2 = %s szétszabta %s-t! +KNIFE_MSG_3 = %s felnyársalta %s-t! +KNIFE_MSG_4 = %s megkéselte %s-t! +LAST_MSG_1 = Mostmár minden rajtad múlik! +LAST_MSG_2 = Remélem van nálad életcsomag! +LAST_MSG_3 = Már csak te maradtál. Hajrá! LAST_MSG_4 = A csapatod elveszett... -HE_MSG_1 = %s megajandekozta %s-r egy granattal +HE_MSG_1 = %s megajándékozta %s egy gránáttal HE_MSG_2 = %s felrobbantotta %s-t HE_MSG_3 = %s kirobbantotta %s-t -HE_MSG_4 = %s szetrobbantotta %s-t -SHE_MSG_1 = %s felrobbantotta magat... -SHE_MSG_2 = %s megnezte kozelebrol a granatjat... -SHE_MSG_3 = %s azt hitte krumpli van a kezeben... +HE_MSG_4 = %s szétrobbantotta %s-t +SHE_MSG_1 = %s felrobbantotta magát... +SHE_MSG_2 = %s megnézte közelebbről a gránátját... +SHE_MSG_3 = %s azt hitte krumpli van a kezében... SHE_MSG_4 = %s Felrobbant! -HS_MSG_1 = $kn megolte $vn t egy fejlovessel! -HS_MSG_2 = $kn eltavolittotta $vn fejet^naz $wn-vel. -HS_MSG_3 = $kn hullocsillagot csinalt $vn fejobel egy $wn-vel -HS_MSG_4 = $vn orbalotte $kn-t -HS_MSG_5 = $vn feje foldkoruli palyara alt. -HS_MSG_6 = $kn segitsegevel $wn feje mar a csillagok kozott tundokolhet... -HS_MSG_7 = Miaz? Talan egy repulo? Dehogy... Csak $vn-feje +HS_MSG_1 = $kn megölte $vn t egy fejlövéssel! +HS_MSG_2 = $kn eltávolíttotta $vn fejét^naz $wn-vel. +HS_MSG_3 = $kn hullócsillagot csinált $vn fejéből egy $wn-vel +HS_MSG_4 = $vn orbalőtte $kn-t +HS_MSG_5 = $vn feje földkörüli pályára állt. +HS_MSG_6 = $kn segítségével $wn feje már a csillagok között tündökölhet... +HS_MSG_7 = Miaz? Talán egy repölő? Dehogy... Csak $vn-feje DOUBLE_KILL = Wow! %s: Duplagyilok!!! -PREPARE_FIGHT = Keszulj fel a harcra!^n%d KOR -KILLED_ROW = Egymas utan %d -ot oltel. -DIED_ROUNDS = Ovatosan! Mar %d korben meghaltal egymas utan... -KILLED_CHICKEN = Valaki megolt egy csirket!!! -BLEW_RADIO = Valaki felrobbantotta a radiot!!! -REACHED_TARGET = Omg! %s Elerte a celpontot! -PLANT_BOMB = %s elesiti a bombat! -DEFUSING_BOMB = %s Hatastalanitja a bombat... -SET_UP_BOMB = %s elesitette a bombat!!! -DEFUSED_BOMB = %s hatastalanitotta a bombat! -FAILED_DEFU = %s -nek nem sikerult hatastalanitania a bombat... -PICKED_BOMB = %s felvette a bombat... -DROPPED_BOMB = %s Elejtette a bombat!!! +PREPARE_FIGHT = Készulj fel a harcra!^n%d. KÖR +KILLED_ROW = Egymás után %d ölés. +DIED_ROUNDS = Óvatosan! Már %d körben meghaltál egymás után... +KILLED_CHICKEN = Valaki megölt egy csirkét!!! +BLEW_RADIO = Valaki felrobbantotta a rádiót!!! +REACHED_TARGET = Omg! %s Elérte a célpontot! +PLANT_BOMB = %s élesíti a bombát! +DEFUSING_BOMB = %s hatástalanítja a bombát... +SET_UP_BOMB = %s élesítette a bombát!!! +DEFUSED_BOMB = %s hatástalanította a bombát! +FAILED_DEFU = %s nem tudta hatástalanítani a bombát... +PICKED_BOMB = %s felvette a bombát... +DROPPED_BOMB = %s elejtette a bombát!!! CT = CT CTS = CT TERRORIST = TERRORIST TERRORISTS = TERRORIST -REMAINING = %d %s van meg hatra... -KILLS = oles +REMAINING = %d %s van még hátra... +KILLS = ölés HS = fej [lt] diff --git a/plugins/lang/multilingual.txt b/plugins/lang/multilingual.txt index a2c0e4fe..9d2a3a03 100755 --- a/plugins/lang/multilingual.txt +++ b/plugins/lang/multilingual.txt @@ -164,15 +164,15 @@ TYPE_LANGMENU = Scrie 'amx_langmenu' in consola pentru afisarea unui menu cu lim LANG_MENU_DISABLED = Menu limbaj dezactivat. [hu] -LANG_NOT_EXISTS = A nyelv nem letezik -PERSO_LANG = Szemelyi nyelv -LANG_MENU = Nyelv menu +LANG_NOT_EXISTS = A nyelv nem létezik +PERSO_LANG = Személyi nyelv +LANG_MENU = Nyelv menü SERVER_LANG = Szerver nyelv -SAVE_LANG = Nyelv mentese -SET_LANG_SERVER = A szerver nyelve "%s"-ra lett alitva. -SET_LANG_USER = A nyelved "%s"-ra lett allitva. -TYPE_LANGMENU = Irj 'amx_langmenu'-t a konzolba hogy nyelvet valaszthass. -LANG_MENU_DISABLED = Nyelv menu letiltva. +SAVE_LANG = Nyelv mentése +SET_LANG_SERVER = A szerver nyelve "%s"-ra lett állítva. +SET_LANG_USER = A nyelved "%s"-ra lett állítva. +TYPE_LANGMENU = Írj 'amx_langmenu'-t a konzolba hogy nyelvet választhass. +LANG_MENU_DISABLED = Nyelv menü letiltva. [lt] LANG_NOT_EXISTS = Kalba neegzistuoja diff --git a/plugins/lang/nextmap.txt b/plugins/lang/nextmap.txt index 717c7f32..a9c2a1ff 100755 --- a/plugins/lang/nextmap.txt +++ b/plugins/lang/nextmap.txt @@ -74,9 +74,9 @@ PLAYED_MAP = Harta Actuala FRIEND_FIRE = Friendly-Fire [hu] -NEXT_MAP = A kovetkezo palya: -PLAYED_MAP = Jatszott Palya -FRIEND_FIRE = Csapattars Sebzes +NEXT_MAP = A következő pálya: +PLAYED_MAP = Jelenlegi Pálya +FRIEND_FIRE = Csapattárs Sebzés [lt] NEXT_MAP = Kitas zemelapis: diff --git a/plugins/lang/pausecfg.txt b/plugins/lang/pausecfg.txt index 972a2dcb..94183a90 100755 --- a/plugins/lang/pausecfg.txt +++ b/plugins/lang/pausecfg.txt @@ -589,44 +589,44 @@ CANT_UNPAUSE_PLUGIN = Pluginul "%s" este oprit si nu poate fi pus pe pauza sau s CLEAR_PAUSED = Goleste fisier-ul cu cele oprite [hu] -PAUSE_COULDNT_FIND = Nem lehet a plugint talalni "%s" -PAUSE_PLUGIN_MATCH = Plugin matching "%s" -PAUSE_CONF_CLEARED = Beallitasok file betoltve. Valts palyat a hasznalatahoz -PAUSE_ALR_CLEARED = A beallitasok mar ki vannak uritve! -PAUSE_CONF_SAVED = Beallitasok sikeresen elmentve -PAUSE_SAVE_FAILED = Nem sikerult a mentes!!! +PAUSE_COULDNT_FIND = Nem található a plugin "%s" +PAUSE_PLUGIN_MATCH = Plugin egyezik "%s" +PAUSE_CONF_CLEARED = Beállitások fájl betöltve. Válts pályát a használatához +PAUSE_ALR_CLEARED = A beállítások már ki vannak ürítve! +PAUSE_CONF_SAVED = Beállítások sikeresen elmentve +PAUSE_SAVE_FAILED = Nem sikerült a mentés!!! LOCKED = LEZARVA -PAUSE_UNPAUSE = Ki/Be kapcsolas Pluginok -CLEAR_STOPPED = A leallitot pluginok filejenak uritese -SAVE_STOPPED = Megallitottak mentese -PAUSED_PLUGIN = Leallitva %d plugin -PAUSED_PLUGINS = Leallitva %d plugin -UNPAUSED_PLUGIN = Engedelyezve %d plugin -UNPAUSED_PLUGINS = Engedelyezve %d plugin -CANT_MARK_MORE = Nem lehet mark tobb plugint megallitani! +PAUSE_UNPAUSE = Ki/Be kapcsolás Pluginok +CLEAR_STOPPED = A leállított pluginok fájljának ürítése +SAVE_STOPPED = Megállítottak mentése +PAUSED_PLUGIN = Leállítva %d plugin +PAUSED_PLUGINS = Leállítva %d plugin +UNPAUSED_PLUGIN = Engedélyezve %d plugin +UNPAUSED_PLUGINS = Engedélyezve %d plugin +CANT_MARK_MORE = Nem lehet már több plugint megállítani! PAUSE_LOADED = Pause Plugins: Loaded plugins -STOPPED = leallitva -VERSION = verzio -FILE = file -PAUSE_ENTRIES = Bejegyzes %d - %d a %d-bol (%d fut) -PAUSE_USE_MORE = Irj 'amx_pausecfg list %d' a tobbihez -PAUSE_USE_BEGIN = Irj 'amx_pausecfg list 1' az elejehez -PAUSE_USAGE = Hasznalat: amx_pausecfg <parancs> [nev] +STOPPED = leállítva +VERSION = verzió +FILE = fájl +PAUSE_ENTRIES = Bejegyzés %d - %d a %d-bol (%d fut) +PAUSE_USE_MORE = Írj 'amx_pausecfg list %d' a többihez +PAUSE_USE_BEGIN = Írj 'amx_pausecfg list 1' az elejéhez +PAUSE_USAGE = Használat: amx_pausecfg <parancs> [név] PAUSE_COMMANDS = Parancsok -COM_PAUSE_OFF = ^tki - minden plugin leallitasa a listan -COM_PAUSE_ON = ^tbe - osszes plugin engedelyezese -COM_PAUSE_STOP = ^tstop <file> - plugin megallitasa +COM_PAUSE_OFF = ^tki - minden plugin leállítása a listán +COM_PAUSE_ON = ^tbe - összes plugin engedélyezése +COM_PAUSE_STOP = ^tstop <file> - plugin megállítása COM_PAUSE_PAUSE = ^tpause <file> - kikapcsolt pluginok -COM_PAUSE_ENABLE = ^tenable <file> - plugin engedelyezese -COM_PAUSE_SAVE = ^tsave - lista mentese a leallitott pluginokkal -COM_PAUSE_CLEAR = ^tclear - a megallitott pluginok listajanak kiuritese -COM_PAUSE_LIST = ^tlist [id] - pluginok listaja -COM_PAUSE_ADD = ^tadd <nev> - megjelolni a plugint megalithatokent -SAVE_PAUSED = Mentes Szunetelve -COM_PAUSE_SAVE_PAUSED = ^tsave - menti a szunetelt pluginok listajat -COM_PAUSE_CLEAR_PAUSED = ^tclear - torli a szunetelt pluginok listajat -CANT_UNPAUSE_PLUGIN = A "%s" plugint nemlehet szuneteltetni vagy engedelyezni. -CLEAR_PAUSED = Torli a szunetelt pluginok listajat +COM_PAUSE_ENABLE = ^tenable <file> - plugin engedélyezése +COM_PAUSE_SAVE = ^tsave - lista mentése a leállított pluginokkal +COM_PAUSE_CLEAR = ^tclear - a megállított pluginok listájának kiürítése +COM_PAUSE_LIST = ^tlist [id] - pluginok listája +COM_PAUSE_ADD = ^tadd <nev> - megjelölni a plugint megallíthatóként +SAVE_PAUSED = Mentés Szünetelve +COM_PAUSE_SAVE_PAUSED = ^tsave - menti a szünetelt pluginok listáját +COM_PAUSE_CLEAR_PAUSED = ^tclear - törli a szünetelt pluginok listáját +CANT_UNPAUSE_PLUGIN = A "%s" plugint nemlehet szüneteltetni vagy engedályezni. +CLEAR_PAUSED = Törli a szünetelt pluginok listáját [lt] PAUSE_COULDNT_FIND = Negali surasti plugino "%s" diff --git a/plugins/lang/plmenu.txt b/plugins/lang/plmenu.txt index 8c6b3d72..34753087 100755 --- a/plugins/lang/plmenu.txt +++ b/plugins/lang/plmenu.txt @@ -284,23 +284,23 @@ NO_CMDS = Nici o comanda valabila CANT_PERF_PLAYER = Aceasta comanda nu poate fi executata pe jucatorul "%s" [hu] -ADMIN_BAN_1 = ADMIN: %s banolva -ADMIN_BAN_2 = ADMIN %s: %s banolva -BAN_MENU = Ban Menu -BAN_FOR_MIN = Banolva %d percre -BAN_PERM = Orokos ban -SLAP_SLAY_MENU = Utes/Oles Menu -SLAP_WITH_DMG = Megutve %d sebzessel -SLAY = Megoles -KICK_MENU = kick Menu -ADMIN_TRANSF_1 = ADMIN: %s atallitva %s-nak -ADMIN_TRANSF_2 = ADMIN %s: %s atallitva %s-nak -TEAM_MENU = CSapat Menu -TRANSF_TO = Atallitva %s-nek -TRANSF_SILENT = transfer átutalás -CL_CMD_MENU = Client Cmds Menu -NO_CMDS = Nincs elerheto parancs -CANT_PERF_PLAYER = Ezt az akciot nem hajthatod vegre "%s"-on jatekos +ADMIN_BAN_1 = ADMIN: %s bannolva +ADMIN_BAN_2 = ADMIN %s: %s bannolva +BAN_MENU = Ban Menü +BAN_FOR_MIN = Bannolva %d percre +BAN_PERM = Örökös ban +SLAP_SLAY_MENU = Ütés/Ölés Menü +SLAP_WITH_DMG = Megütve %d sebzéssel +SLAY = Megölés +KICK_MENU = Kick Menü +ADMIN_TRANSF_1 = ADMIN: %s átállítva %s-nak +ADMIN_TRANSF_2 = ADMIN %s: %s átállítva %s-nak +TEAM_MENU = Csapat Menü +TRANSF_TO = Átállítva %s-nek +TRANSF_SILENT = Csendes Átállítás +CL_CMD_MENU = Kliens parancsok Menü +NO_CMDS = Nincs elérhető parancs +CANT_PERF_PLAYER = Nem végrehajtható "%s" játékoson [lt] ADMIN_BAN_1 = ADMINAS: isbanino %s diff --git a/plugins/lang/restmenu.txt b/plugins/lang/restmenu.txt index 96a0000b..439b7f8f 100755 --- a/plugins/lang/restmenu.txt +++ b/plugins/lang/restmenu.txt @@ -674,7 +674,7 @@ MENU_TITLE_SNIPERS = Snaiperi MENU_TITLE_MACHINE = Avtomatichni orujiq MENU_TITLE_EQUIPMENT = Ekipirovka MENU_TITLE_AMMUNITION = Amunicii -MENU_ITEM_USP = USP +MENU_ITEM_USP = USP MENU_ITEM_GLOCK18 = Glock18 MENU_ITEM_DEAGLE = Deagle MENU_ITEM_P228 = P228 @@ -794,41 +794,93 @@ MENU_ITEM_NVGS = Ochelari de Noapte MENU_ITEM_SHIELD = Scut Tactic MENU_ITEM_PRIAMMO = Gloante pentru armele principale MENU_ITEM_SECAMMO = Gloante pentru armele secundare -CONFIG_FILE_HEADER = ; Generat de pluginul %s. Nu modifica!^n; numele valorii^n +CONFIG_FILE_HEADER = ; Generat de pluginul %s. Nu modifica!^n; numele valorii^n [hu] -EQ_WE_RES = Felszereles es a fegyverek felfugesztve -EQ_WE_UNRES = Felszereles es a fegyverek engedelyezve -HAVE_BEEN = lettek -HAS_BEEN = lettek -RESTRICTED = felfiggesztve -UNRESTRICTED = engedelyezve -NO_EQ_WE = Nem lehet talalni ezt a fegyvert -WEAP_RES = Fegyver felfuggesztes -VALUE = ertek -REST_ENTRIES_OF = Entries %i - %i of %i -REST_USE_MORE = Irj 'amx_restrict list %i' a tobbhoz -REST_USE_BEGIN = Irj 'amx_restrict list 1' az elsohoz -REST_USE_HOW = Irj 'amx_restrict list <value>' (1 -> 8) -REST_CONF_SAVED = Beallitas elmentve (file "%s") -REST_COULDNT_SAVE = Nem lehet menteni (file "%s") -REST_CONF_LOADED = Beallitas betoltve (file "%s") -REST_COULDNT_LOAD = Nem lehet betolteni a beallitast(file "%s") -COM_REST_USAGE = Usage: amx_restrict <command> [value] -COM_REST_COMMANDS = Parancsok: -COM_REST_ON = " on - Set restriction on whole equipment" -COM_REST_OFF = " off - Remove restriction from whole equipment" -COM_REST_ONV = " on <value> [...] - Set specified restriction" -COM_REST_OFFV = " off <value> [...] - Remove specified restriction" -COM_REST_LIST = " list <value> - Az elerheto fegyverek mutatasa" -COM_REST_SAVE = " save - Felfuggesztes mentese" -COM_REST_LOAD = " load [file] - Felfuggesztes botoltese [filebol]" -COM_REST_VALUES = Available values to restrict are:^nammo, equip, pistol, shotgun, sub, rifle, sniper, machine -COM_REST_TYPE = Irj 'amx_restrict list' a tobbi ertekhez -REST_WEAP = Felfiggesztett fegyverek -SAVE_SET = Beallitasok mentese -CONF_SAV_SUC = Beallitasok sikeresen elmentve -CONF_SAV_FAIL = Nem sikerult a mentes!!! +EQ_WE_RES = Felszerelések és fegyverek felfüggesztve +EQ_WE_UNRES = Felszerelések és fegyverek engedélyezve +HAVE_BEEN = lettek +HAS_BEEN = lettek +RESTRICTED = felfüggesztve +UNRESTRICTED = engedélyezve +NO_EQ_WE = Nem található ilyen felszerelés vagy fegyver +WEAP_RES = Fegyver felfüggesztés +VALUE = érték +REST_ENTRIES_OF = Bejegyzések %i - %i összesen %i +REST_USE_MORE = Írd be 'amx_restrict list %i' a többhöz +REST_USE_BEGIN = Írd be 'amx_restrict list 1' az elsőhöz +REST_USE_HOW = Írd be 'amx_restrict list <érték>' (1 -> 8) +REST_CONF_SAVED = Beállitások elmentve (file "%s") +REST_COULDNT_SAVE = Mentés sikertelen (file "%s") +REST_CONF_LOADED = Beállítások betöltve (file "%s") +REST_COULDNT_LOAD = Nem lehet betölteni a beállításokat (file "%s") +COM_REST_USAGE = Használat: amx_restrict <parancs> [érték] +COM_REST_COMMANDS = Parancsok: +COM_REST_ON = " on - A teljes felszerelés tiltása" +COM_REST_OFF = " off - A teljes felszerelés engedélyezése" +COM_REST_ONV = " on <érték> [...] - Egyedi tiltás beállítása" +COM_REST_OFFV = " off <érték> [...] - Egyedi tiltás visszavonása" +COM_REST_LIST = " list <érték> - Az elérhető felszerelések és fegyverek listázása +COM_REST_SAVE = " save - Felfüggesztések mentése" +COM_REST_LOAD = " load [file] - Felfüggesztések betöltése [fájlból]" +COM_REST_VALUES = Elérhető felfüggesztési értékek:^nammo, equip, pistol, shotgun, sub, rifle, sniper, machine +COM_REST_TYPE = Írd be 'amx_restrict list' a többi speciális értékhez +REST_WEAP = Fegyverek felfüggesztése +SAVE_SET = Beállítások mentése +CONF_SAV_SUC = Beállítások sikeresen elmentve +CONF_SAV_FAIL = Nem sikerült a mentés!!! +REG_CMD_MENU = - mutassa a fegyver felfüggesztés menüt +REG_CMD_REST = - segítség megjelenítése a fegyver felfüggesztéshez +RESTRICTED_ITEM = * Ez a tárgy tiltott * +MENU_TITLE_HANDGUNS = Handguns +MENU_TITLE_SHOTGUNS = Shotguns +MENU_TITLE_SUBMACHINES = Sub-Machine Guns +MENU_TITLE_RIFLES = Assault Rifles +MENU_TITLE_SNIPERS = Sniper Rifles +MENU_TITLE_MACHINE = Machine Guns +MENU_TITLE_EQUIPMENT = Equipment +MENU_TITLE_AMMUNITION = Ammunition +MENU_ITEM_USP = H&K USP .45 Tactical +MENU_ITEM_GLOCK18 = Glock18 Select Fire +MENU_ITEM_DEAGLE = Desert Eagle .50AE +MENU_ITEM_P228 = SIG P228 +MENU_ITEM_ELITE = Dual Beretta 96G Elite +MENU_ITEM_FIVESEVEN = FN Five-Seven +MENU_ITEM_M3 = Benelli M3 Super90 +MENU_ITEM_XM1014 = Benelli XM1014 +MENU_ITEM_MP5NAVY = H&K MP5-Navy +MENU_ITEM_TMP = Steyr Tactical Machine Pistol +MENU_ITEM_P90 = FN P90 +MENU_ITEM_MAC10 = Ingram MAC-10 +MENU_ITEM_UMP45 = H&K UMP45 +MENU_ITEM_AK47 = AK-47 +MENU_ITEM_SG552 = Sig SG-552 Commando +MENU_ITEM_M4A1 = Colt M4A1 Carbine +MENU_ITEM_GALIL = Galil +MENU_ITEM_FAMAS = Famas +MENU_ITEM_AUG = Steyr Aug +MENU_ITEM_SCOUT = Steyr Scout +MENU_ITEM_AWP = AI Arctic Warfare/Magnum +MENU_ITEM_G3SG1 = H&K G3/SG-1 Sniper Rifle +MENU_ITEM_SG550 = Sig SG-550 Sniper +MENU_ITEM_M249 = FN M249 Para +MENU_ITEM_VEST = Kevlar Vest +MENU_ITEM_VESTHELM = Kevlar Vest & Helmet +MENU_ITEM_FLASHBANG = Flashbang +MENU_ITEM_HEGRENADE = HE Grenade +MENU_ITEM_SMOKEGRENADE = Smoke Grenade +MENU_ITEM_DEFUSER = Defuse Kit +MENU_ITEM_NVGS = NightVision Goggles +MENU_ITEM_SHIELD = Tactical Shield +MENU_ITEM_PRIAMMO = Primary weapon ammo +MENU_ITEM_SECAMMO = Secondary weapon ammo +CONFIG_FILE_HEADER = ; Generated by %s Plugin. Do not modify!^n; value name^n +ADMIN_UPD_RES_1 = ADMIN: frissítette a felfüggesztett tárgyakat +ADMIN_UPD_RES_2 = ADMIN %s: frissítette a felfüggesztett tárgyakat +ADMIN_CMD_UPDATEDCFG = Cmd: %N frissítette a felfüggesztett tárgyakat +ADMIN_CMD_LOADEDCFG = Cmd: %N felfüggesztett tárgyak betöltve "%s" fájlból +ADMIN_CMD_SAVEDCFG = Cmd: %N felfüggesztett tárgyak betöltve "%s" fájlba +ADMIN_MENU_SAVEDCFG = Menu: %N felfüggesztett tárgyak betöltve "%s" fájlba [lt] EQ_WE_RES = Amunicija ir ginklai buvo uzdrausti diff --git a/plugins/lang/scrollmsg.txt b/plugins/lang/scrollmsg.txt index 1a485e6d..eb7cec2c 100755 --- a/plugins/lang/scrollmsg.txt +++ b/plugins/lang/scrollmsg.txt @@ -74,9 +74,9 @@ MSG_FREQ = Frecventa afisarii messajului Rulant: %d:%02d minute MSG_DISABLED = Mesajul Rulant dezactivat [hu] -MIN_FREQ = A minimum ido erre az uzenetre %d perc -MSG_FREQ = Mozgo uzenet: %d:%02d percenkent -MSG_DISABLED = Scrolling uzenet letiltva +MIN_FREQ = A minimum idő erre az üzenetre %d perc +MSG_FREQ = Mozgó üzenet: %d:%02d percenként +MSG_DISABLED = A gördülő üzenet letiltva [lt] MIN_FREQ = Minimalus daznumas siai zinutei yra %d sekundes diff --git a/plugins/lang/statscfg.txt b/plugins/lang/statscfg.txt index d97dad6f..f6f88e36 100755 --- a/plugins/lang/statscfg.txt +++ b/plugins/lang/statscfg.txt @@ -1244,28 +1244,28 @@ ST_HE_KILL_SOUND = Grenade Kill Sound ST_HE_SUICIDE_SOUND = Grenade Suicide Sound [hu] -NO_OPTION = Nem talalhato Funkcio a megadott nevvel (nev "%s") -STATS_CONF_SAVED = Beallitasok sikeresen mentve -STATS_CONF_FAILED = Nem sikerult a mentes!!! -STATS_CONF_LOADED = Beallitasok sikeresen betoltbe -STATS_CONF_FAIL_LOAD = Nem sikerult betolteni a beallitasokat!!! -STATS_CONF = Statisztika beallitasok -STATS_ENTRIES_OF = Entries %i - %i of %i -STATS_USE_MORE = Irj 'amx_statscfg list %i' a tobbihez -STATS_USE_BEGIN = Irj 'amx_statscfg list 1' az elsohoz -STATS_ENABLED = Stats engedelyezve +NO_OPTION = Nem található Funkció a megadott névvel (név "%s") +STATS_CONF_SAVED = Beállitások sikeresen mentve +STATS_CONF_FAILED = Nem sikerült a mentés!!! +STATS_CONF_LOADED = Beállítások sikeresen betöltve +STATS_CONF_FAIL_LOAD = Nem sikerült betölteni a beállításokat!!! +STATS_CONF = Statisztika beállítások +STATS_ENTRIES_OF = Bejegyzések %i - %i a %i -ból/-ből +STATS_USE_MORE = Írj 'amx_statscfg list %i' a többihez +STATS_USE_BEGIN = Írj 'amx_statscfg list 1' az elsőhoz +STATS_ENABLED = Stats engedélyezve STATS_DISABLED = Stats letiltva -CANT_ADD_STATS = Nem lehet tobb statot hozzaadni, limit elerve! -COM_STATS_USAGE = Hasznalat: amx_statscfg <command> [parameters] ... +CANT_ADD_STATS = Nem lehet tobb statot hozzáadni, limit elérve! +COM_STATS_USAGE = Használat: amx_statscfg <command> [parameters] ... COM_STATS_COM = Parancsok: COM_STATS_ON = ^ton <variable> - enable specified option COM_STATS_OFF = ^toff <variable> - disable specified option -COM_STATS_SAVE = ^tsave - beallitasok mentese -COM_STATS_LOAD = ^tload - beallitasok betoltese +COM_STATS_SAVE = ^tsave - beállítások mentése +COM_STATS_LOAD = ^tload - beállítások betöltése COM_STATS_LIST = ^tlist [id] - list stats status COM_STATS_ADD = ^tadd <name> <variable> - add stats to the list -NO_STATS = Statisztika pluginok^nnincsenek installalva ezen a szerveren^n -SAVE_CONF = Beallitasok mentese +NO_STATS = Statisztika pluginok^nnincsenek telepítve ezen a szerveren^n +SAVE_CONF = Beállítások mentése ST_MULTI_KILL = MultiKill ST_MULTI_KILL_SOUND = MultiKillSound ST_BOMB_PLANTING = Bomb Planting diff --git a/plugins/lang/statsx.txt b/plugins/lang/statsx.txt index 89428e87..774d2044 100755 --- a/plugins/lang/statsx.txt +++ b/plugins/lang/statsx.txt @@ -764,55 +764,55 @@ X_RANK_IS = Pozitia lui %s este %d din %d DISABLED_MSG = Server-ul a dezactivat aceasta optiune [hu] -WHOLEBODY = egesz test +WHOLEBODY = egész test HEAD = fej -CHEST = csipo +CHEST = csipő STOMACH = has LEFTARM = balkar RIGHTARM = jobbkar -LEFTLEG = ballab -RIGHTLEG = jobblab +LEFTLEG = balláb +RIGHTLEG = jobbláb MODE_SET_TO = "amx_statsx_mode" set to "%s" -ATTACKERS = Tamadok -ACC = Pontossag -HIT_S = talalat -DMG = sebzes -VICTIMS = Aldozatok -MOST_DMG = Legtobb sebzes: -KILLED_YOU_DIST = %s megolt teged %s^n %0.2f meterrol. -DID_DMG_HITS = O %d -t sebzett rajtad ^n talalattal es maradt neki %dhp es %dap-ja. -YOU_DID_DMG = Te %d sebeztel rajta %d talalattal. -EFF = eff. +ATTACKERS = Támadók +ACC = Pontosság +HIT_S = Találat +DMG = sebzés +VICTIMS = Áldozatok +MOST_DMG = Legtöbb sebzés: +KILLED_YOU_DIST = %s megölt téged %s^n %0.2f méterről. +DID_DMG_HITS = O %d -t sebzett rajtad ^n találattal és maradt neki %dhp és %dap-ja. +YOU_DID_DMG = Te %d sebeztél rajta %d találattal. +EFF = Hatékonyság BEST_SCORE = Legjobb pont -KILL_S = Oles -TOTAL = Total -SHOT_S = loves -HITS_YOU_IN = %s eltalalt teged -KILLED_BY_WITH = Megolt %s, %s-el %0.0fmeterrol -NO_HITS = nincs talalat +KILL_S = Ölés +TOTAL = Totál +SHOT_S = Lövések +HITS_YOU_IN = %s eltalált téged +KILLED_BY_WITH = Megölt %s, %s-el %0.0fméterrol +NO_HITS = nincs találat YOU_NO_KILLER = Nincs gyilkosod... -YOU_HIT = You hit %s %d time(s), %d damage -LAST_RES = Last result: %d hit(s), %d damage -KILLS = Olesek -DEATHS = Halal -HITS = Talalat -SHOTS = Loves +YOU_HIT = Eltaláltad %s %d alkalommal, %d összes sebzés rajta +LAST_RES = Utolsó eredmény: %d találat, %d sebzés +KILLS = Ölések +DEATHS = Halál +HITS = Találat +SHOTS = Lövés YOUR = Te -PLAYERS = Jatekosok -RANK_IS = helyezese %d of %d -DAMAGE = Sebzes +PLAYERS = Játékosok +RANK_IS = helyezése %d a %d -ból/ből +DAMAGE = Sebzés WEAPON = Fegyver -YOUR_RANK_IS = A te helyezesed %d a %d -bol %d olessel, %d talalattal, %0.2f% effel es %0.2f% accal. -AMMO = tolteny -HEALTH = elet -ARMOR = pancel -GAME_SCORE = Jatek pont +YOUR_RANK_IS = A te helyezésed %d a %d -ból %d ölessel, %d találattal, %0.2f% effel és %0.2f% accal. +AMMO = töltény +HEALTH = élet +ARMOR = páncél +GAME_SCORE = Játék pont STATS_ANNOUNCE = Neked van %s stats announcements -ENABLED = engedelyezve +ENABLED = engedélyezve DISABLED = letiltva -SERVER_STATS = Szerver Status -X_RANK_IS = %s helyezese %d a %d-bol -DISABLED_MSG = A szerver letiltotta ezt az opciot +SERVER_STATS = Szerver státusz +X_RANK_IS = %s helyezése %d a %d-ból +DISABLED_MSG = A szerver letiltotta ezt az opciót [lt] WHOLEBODY = kunas diff --git a/plugins/lang/telemenu.txt b/plugins/lang/telemenu.txt index 40e5a826..f1aed2e4 100755 --- a/plugins/lang/telemenu.txt +++ b/plugins/lang/telemenu.txt @@ -108,7 +108,7 @@ ADMIN_TELEPORT_1 = ADMIN: %s teleport ADMIN_TELEPORT_2 = ADMIN %s: %s teleport TELE_MENU = Teleport Menu CUR_LOC = Mostani hely -SAVE_LOC = Hely mentese +SAVE_LOC = Hely mentése [lt] ADMIN_TELEPORT_1 = ADMINAS: teleportavo %s diff --git a/plugins/lang/time.txt b/plugins/lang/time.txt index 3676fb88..7a502bfe 100644 --- a/plugins/lang/time.txt +++ b/plugins/lang/time.txt @@ -195,18 +195,18 @@ TIME_ELEMENT_PERMANENTLY = permanent TIME_ELEMENT_AND = si [hu] -TIME_ELEMENT_SECOND = masodperc -TIME_ELEMENT_SECONDS = masodperc +TIME_ELEMENT_SECOND = másodperc +TIME_ELEMENT_SECONDS = másodperc TIME_ELEMENT_MINUTE = perc TIME_ELEMENT_MINUTES = perc -TIME_ELEMENT_HOUR = ora -TIME_ELEMENT_HOURS = ora +TIME_ELEMENT_HOUR = óra +TIME_ELEMENT_HOURS = óra TIME_ELEMENT_DAY = nap TIME_ELEMENT_DAYS = nap -TIME_ELEMENT_WEEK = het -TIME_ELEMENT_WEEKS = het -TIME_ELEMENT_PERMANENTLY = vegleges -TIME_ELEMENT_AND = es +TIME_ELEMENT_WEEK = hét +TIME_ELEMENT_WEEKS = hét +TIME_ELEMENT_PERMANENTLY = végleges +TIME_ELEMENT_AND = és [lt] TIME_ELEMENT_SECOND = sekunde diff --git a/plugins/lang/timeleft.txt b/plugins/lang/timeleft.txt index c8b8e754..4ddf524d 100755 --- a/plugins/lang/timeleft.txt +++ b/plugins/lang/timeleft.txt @@ -134,13 +134,13 @@ SECOND = secunda SECONDS = secunde [hu] -THE_TIME = Az ido -TIME_LEFT = Hatralevo ido -NO_T_LIMIT = NIncs idohatar +THE_TIME = Az idő +TIME_LEFT = Hátralévő idő +NO_T_LIMIT = Nincs időhatár MINUTE = perc MINUTES = perc -SECOND = masodperc -SECONDS = masodperc +SECOND = másodperc +SECONDS = másodperc [lt] THE_TIME = Laikas From 651745b1d47e0fd678936cd84c95760b06d42c6d Mon Sep 17 00:00:00 2001 From: voed <iwmyc@ex.ua> Date: Tue, 10 Jul 2018 13:27:27 +0300 Subject: [PATCH 07/98] Updated compiler exitcodes (#486) --- compiler/amxxpc/amxxpc.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/compiler/amxxpc/amxxpc.cpp b/compiler/amxxpc/amxxpc.cpp index 3c6833de..ba227344 100755 --- a/compiler/amxxpc/amxxpc.cpp +++ b/compiler/amxxpc/amxxpc.cpp @@ -65,7 +65,7 @@ int main(int argc, char **argv) # else printf("compiler failed to instantiate: %d\n", GetLastError()); # endif - exit(0); + exit(EXIT_FAILURE); } COMPILER sc32 = (COMPILER)dlsym(lib, "Compile32"); @@ -79,7 +79,7 @@ int main(int argc, char **argv) #else printf("compiler failed to link: %d.\n", GetLastError()); #endif - exit(0); + exit(EXIT_FAILURE); } pc_printf("AMX Mod X Compiler %s\n", AMXX_VERSION); @@ -91,7 +91,7 @@ int main(int argc, char **argv) pc_printf("Usage: <file.sma> [options]\n"); pc_printf("Use -? or --help to see full options\n\n"); getchar(); - exit(0); + exit(EXIT_FAILURE); } if (!strcmp(argv[1], "-?") || !strcmp(argv[1], "--help")) @@ -99,7 +99,7 @@ int main(int argc, char **argv) show_help(); pc_printf("Press any key to continue.\n"); getchar(); - exit(0); + exit(EXIT_SUCCESS); } sc32(argc, argv); @@ -109,16 +109,16 @@ int main(int argc, char **argv) if (file == NULL) { pc_printf("Could not locate the output file.\n"); - exit(0); + exit(EXIT_FAILURE); } else if (strstr(file, ".asm")) { pc_printf("Assembler output succeeded.\n"); - exit(0); + exit(EXIT_SUCCESS); } else { FILE *fp = fopen(file, "rb"); if (fp == NULL) { pc_printf("Could not locate output file %s (compile failed).\n", file); - exit(0); + exit(EXIT_FAILURE); } ReadFileIntoPl(&pl32, fp); pl32.cellsize = 4; @@ -142,7 +142,7 @@ int main(int argc, char **argv) if (!fp) { pc_printf("Error trying to write file %s.\n", newfile); - exit(0); + exit(EXIT_FAILURE); } BinPlugin bh32; @@ -179,7 +179,7 @@ int main(int argc, char **argv) #if !defined EMSCRIPTEN dlclose(lib); #endif - exit(0); + exit(EXIT_FAILURE); } fclose(fp); @@ -195,7 +195,7 @@ int main(int argc, char **argv) dlclose(lib); #endif - exit(0); + exit(EXIT_SUCCESS); } void WriteBh(BinaryWriter *bw, BinPlugin *bh) @@ -228,7 +228,7 @@ bool CompressPl(abl *pl) if (err != Z_OK) { pc_printf("internal error - compression failed on first pass: %d\n", err); - exit(0); + exit(EXIT_FAILURE); } return true; From cec42bdcae4464c301e7de0dc8f7abedebe64923 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Tue, 10 Jul 2018 14:42:45 +0200 Subject: [PATCH 08/98] API documentation fix for some .inc files (#489) * Fixed param information * Removed whitespace that prevented the API to generate client_disconnected information * Fixed documentation. * Update lang.inc * Documentation fix (g/s)et_user_hitzones() functions weren't generating properly in the API due to a whitespace in front of the comment blocks. @return for give item() was missing. * Whitespace prevented API documentation from generating * Update lang.inc --- plugins/include/amxmodx.inc | 2 +- plugins/include/core.inc | 6 +- plugins/include/file.inc | 1332 +++++++++++++++++------------------ plugins/include/float.inc | 842 +++++++++++----------- plugins/include/fun.inc | 610 ++++++++-------- plugins/include/lang.inc | 84 ++- plugins/include/time.inc | 44 +- 7 files changed, 1485 insertions(+), 1435 deletions(-) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index e24059e6..f99b2089 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -178,7 +178,7 @@ forward client_authorized(id, const authid[]); #pragma deprecated Use client_disconnected() instead. forward client_disconnect(id); - /** +/** * Called when a client is disconnected from the server. * * @note This will be called in some additional cases that client_disconnect doesn't cover, diff --git a/plugins/include/core.inc b/plugins/include/core.inc index 93626ca1..d78e9b21 100755 --- a/plugins/include/core.inc +++ b/plugins/include/core.inc @@ -167,9 +167,9 @@ native time(&hour = 0, &minute = 0, &second = 0); /** * Retrieves the current date in year, month and day. * - * @param hour Variable to store year in - * @param minute Variable to store month in - * @param second Variable to store day in + * @param year Variable to store year in + * @param month Variable to store month in + * @param day Variable to store day in * * @noreturn */ diff --git a/plugins/include/file.inc b/plugins/include/file.inc index c675bffc..9cae711f 100755 --- a/plugins/include/file.inc +++ b/plugins/include/file.inc @@ -1,666 +1,666 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -// -// File Functions -// - -#if defined _file_included - #endinput -#endif -#define _file_included - -/** - * @note All paths in AMX Mod X natives are relative to the mod folder - * unless otherwise noted. - * - * Most functions in AMX Mod X (at least, ones that deal with direct - * file manipulation) will support an alternate path specification. - */ - -/** - * Maximum path length. - */ -#define PLATFORM_MAX_PATH 256 - -/** - * File inode types for use with open_dir() and next_file(). - */ -enum FileType -{ - FileType_Unknown, /* Unknown file type (device/socket) */ - FileType_Directory, /* File is a directory */ - FileType_File, /* File is a file */ -}; - -/** - * File time modes for use with GetFileTime(). - */ -enum FileTimeType -{ - FileTime_LastAccess, /* Last access (not available on FAT) */ - FileTime_Created, /* Creation (not available on FAT) */ - FileTime_LastChange, /* Last modification */ -}; - -/** - * File position modes for use with fseek(). - */ -#define SEEK_SET 0 /* Seek from start */ -#define SEEK_CUR 1 /* Seek from current position */ -#define SEEK_END 2 /* Seek from end position */ - -/** - * Options for use with file_size() flag parameter. - */ -#define FSOPT_BYTES_COUNT 0 /* Returns the file size in number of bytes */ -#define FSOPT_LINES_COUNT 1 /* Returns how many lines there are in this file */ -#define FSOPT_END_WITH_LF 2 /* Returns whether the last line is '\n' */ - -/** - * Data block modes for use with fread*() and fwrite*(). - */ -#define BLOCK_INT 4 -#define BLOCK_SHORT 2 -#define BLOCK_CHAR 1 -#define BLOCK_BYTE 1 - -/** - * File permissions flags for use with mkdir() and SetFilePermissions(). - */ -#define FPERM_U_READ 0x0100 /* User can read. */ -#define FPERM_U_WRITE 0x0080 /* User can write. */ -#define FPERM_U_EXEC 0x0040 /* User can exec. */ -#define FPERM_U_RWX FPERM_U_READ | FPERM_U_WRITE | FPERM_U_EXEC - -#define FPERM_G_READ 0x0020 /* Group can read. */ -#define FPERM_G_WRITE 0x0010 /* Group can write. */ -#define FPERM_G_EXEC 0x0008 /* Group can exec. */ -#define FPERM_G_RWX FPERM_G_READ | FPERM_G_WRITE | FPERM_G_EXEC - -#define FPERM_O_READ 0x0004 /* Anyone can read. */ -#define FPERM_O_WRITE 0x0002 /* Anyone can write. */ -#define FPERM_O_EXEC 0x0001 /* Anyone can exec. */ -#define FPERM_O_RWX FPERM_O_READ | FPERM_O_WRITE | FPERM_O_EXEC - -#define FPERM_DIR_DEFAULT FPERM_U_RWX | FPERM_G_RWX | FPERM_O_RWX /* rwx r-x r-x (0755) */ - - -/** - * Reads content from directory - * - * @note This native is expensive. Consider the use of open_dir(), next_file() and close_dir() instead. - * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. - * - * @param dirname Path to open - * @param pos Index the element - * @param output String buffer to hold content - * @param len Maximum size of string buffer - * @param outlen Number of characters written to the buffer - * - * @return Returns index of next element, otherwiwe 0 when end of dir is reached - */ -native read_dir(const dirname[], pos, output[], len, &outlen = 0); - -/** - * Reads line from file. - * - * @note This native is expensive. Consider the use of new file natives (fopen(), fgets(), etc.) - * if purpose is to read several lines of a file. - * - * @param file Path to open - * @param line Index of the line, starting to 0 - * @param text String buffer to hold line read - * @param len Maximum size of string buffer - * @param txtlen Number of characters written to the buffer - * - * @return Returns index of next line, otherwise 0 when end of file is reached - * @error Unable to read the file - */ -native read_file(const file[], line, text[], len, &txtlen = 0); - -/** - * Writes text to file. - * - * @note This native is expensive. Consider the use of new file natives (fopen(), fputs(), etc.) - * if purpose is to write several lines of a file. - * - * @param file Path to open - * @param text String to write to - * @param line Index of the line, starting to 0 - * If < 0, content will be appended - * - * @noreturn - * @error Unable to write [temporary] file - */ -native write_file(const file[], const text[], line = -1); - -/** - * Deletes a file. - * - * @param file Path of the file to delete - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to delete files existing in the Valve - * search path, rather than solely files existing directly - * in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. - * - * @return 1 on success, 0 on failure or if file not immediately removed. - */ -native delete_file(const file[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); - -/** - * Checks if a file exists. - * - * @param file Path to the file - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * - * @return 1 if the file exists, 0 otherwise - */ -native file_exists(const file[], bool:use_valve_fs = false); - - /** - * Renames a file. - * - * @param oldname New path to the file - * @param newname Path to the existing file - * @param relative If true, native will act like other natives which - * use the moddir as a base directory. Otherwise, the - * current directory is undefined (but assumed to be hlds). - * - * @return 1 on success, 0 otherwise - */ -native rename_file(const oldname[], const newname[], relative = 0); - -/** - * Checks if a directory exists. - * - * @param dir Path to the directory - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * - * @return 1 if the directory exists, 0 otherwise - */ -native dir_exists(const dir[], bool:use_valve_fs = false); - -/** - * Get the file size in bytes. - * - * @param file Path to the file - * @param flag Flag options, see FSOPT_* constants - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * If used, flag option is ignored. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths - * - * @return If flag is FSOPT_BYTES_COUNT or use_valve_fs to true, the file size in bytes - * If flag is FSOPT_LINES_COUNT, the number of lines in the file - * If flag is FSOPT_END_WITH_LF, 1 is returned if file ends with line feed - * If file doesn't exist, -1 - */ -native file_size(const file[], flag = FSOPT_BYTES_COUNT, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); - -/** - * Opens or creates a file, returning a file handle on success. File handles - * should be closed with fclose(). - * - * @note The open mode may be one of the following strings: - * "r": Open an existing file for reading. - * "w": Create a file for writing, or truncate (delete the contents of) an - * existing file and then open it for writing. - * "a": Create a file for writing, or open an existing file such that writes - * will be appended to the end. - * "r+": Open an existing file for both reading and writing. - * "w+": Create a file for reading and writing, or truncate an existing file - * and then open it for reading and writing. - * "a+": Create a file for both reading and writing, or open an existing file - * such that writes will be appended to the end. - * - * @note The open mode may also contain an additional character after "r", "w", or "a", - * but before any "+" sign. This character may be "b" (indicating binary mode) or - * "t" (indicating text mode). By default, "text" mode is implied. On Linux and - * Mac, this has no distinction from binary mode. On Windows, it causes the '\n' - * character (0xA) to be written as "\r\n" (0xD, 0xA). - * - * Example: "rb" opens a binary file for writing; "at" opens a text file for - * appending. - * - * @note Registered paths ID are (in priority order) : - * GAME All paths related to current mod, including fallback - * Depending settings, it includes: <gamedir>_lv/_addon/_<language>/_hd - * and <gamedir> itself - * GAMECONFIG The default writable directory (<gamedir>) - * GAMEDOWNLOAD The download directory (<gamedir>_download) - * GAME_FALLBACK All paths related to fallback game, same as GAME - * DEFAULTGAME All paths related to the default game which is "valve", same as GAME - * BASE The base path where server is installed - * - * Note that some paths are non-writable. It includes all <gamedir>_* (expect _download) - * and DEFAULTGAME. Any file inside a non-writable path will be ignored if you try to open - * it in writing mode. - * - * @param filename File to open - * @param mode Open mode - * @param use_valve_fs If true, the Valve file system will be used instead - * This can be used to finred files existing in valve - * search paths, rather than solely files existing directly - * in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths - * - * @return A file handle, or null if the file could not be opened. - */ -native fopen(const filename[], const mode[], bool:use_valve_fs = false, const valve_path_id[] = "GAME"); - -/** - * Closes a file handle. - * - * @param file File handle - */ -native fclose(file); - -/** - * Reads a single binary data from a file. - * - * @param file Handle to the file - * @param data Variable to store item read - * @param mode Size of each element, in bytes, to be read - * See BLOCK_* constants - * - * @return Number of elements read - */ -native fread(file, &any:data, mode); - -/** - * Reads binary data from a file. - * - * @param file Handle to the file - * @param data Array to store each item read - * @param blocks Number of items to read into the array - * @param mode Size of each element, in bytes, to be read - * Valid sizes are 1, 2, or 4. See BLOCK_* constants. - * - * @return Number of elements read - */ -native fread_blocks(file, any:data[], blocks, mode); - -/** - * Reads raw binary data from a file. - * - * @param file Handle to the file - * @param stream Array to store each item read - * @param blocksize Number of items to read into the array - * @param blocks Size of each element, in bytes. The data is read directly. - * That is, in 1 or 2-byte mode, the lower byte(s) in - * each cell are used directly, rather than performing - * any casts from a 4-byte number to a smaller number. - * - * @return Number of elements read - */ -native fread_raw(file, any:stream[], blocksize, blocks); - -/** - * Writes a single binary data to a file. - * - * @param file Handle to the file - * @param data Item to write - * @param mode Size of each item in the array in bytes - * Valid sizes are 1, 2, or 4. See BLOCK_* constants - * - * @return Number of elements written - */ -native fwrite(file, any:data, mode); - -/** - * Writes binary data to a file. - * - * @param file Handle to the file - * @param data Array of items to write - * @param blocks Number of items in the array - * @param mode Size of each item in the array in bytes - * Valid sizes are 1, 2, or 4. See BLOCK_* constants - * - * @return Number of elements written - */ -native fwrite_blocks(file, const any:data[], blocks, mode); - -/** - * Writes raw binary data to a file. - * - * @param file Handle to the file. - * @param stream Array of items to write. The data is written directly. - * That is, in 1 or 2-byte mode, the lower byte(s) in - * each cell are used directly, rather than performing - * any casts from a 4-byte number to a smaller number. - * @param blocks Size of each item in the array in bytes. - * @param mode Number of items in the array. - * - * @return Number of elements written - */ -native fwrite_raw(file, const any:stream[], blocks, mode); - -/** - * Tests if the end of file has been reached. - * - * @param file Handle to the file - * - * @return 1 if end of file has been reached, 0 otherwise. - */ -native feof(file); - -/** - * Reads a line from a text file. - * - * @param file Handle to the file. - * @param buffer String buffer to hold the line - * @param maxlength Maximum size of string buffer - * - * @return Total number of characters written on success, 0 otherwise - */ -native fgets(file, buffer[], maxlength); - -/** - * Writes a line of text to a text file. - * - * @param file Handle to the file - * @param text String to write - * @param null_term True to append NULL terminator, false otherwise - * - * @return 0 on success, -1 otherwise - */ -native fputs(file, const text[], bool:null_term = false); - -/** - * Writes a line of formatted text to a text file. - * - * @param file Handle to the file - * @param format Formatting rules - * @param ... Variable number of format parameters - * - * @return Total number of characters written on success, 0 otherwise - */ -native fprintf(file, const fmt[], any:...); - -/** - * Sets the file position indicator. - * - * @param file Handle to the file - * @param position Position relative to what is specified in whence - * @param start SEEK_ constant value of where to see from - * - * @return 0 on success, a non-zero value otherwise - */ -native fseek(file, position, start); - -/** - * Gets current position in the file. - * - * @param file Handle to the file - * - * @return Value for the file position indicator - */ -native ftell(file); - -/** - * Gets character from file. - * - * @param file Handle to the file - * - * @return Character read on success, -1 otherwise - */ -native fgetc(file); - -/** - * Writes character to file - * - * @param file Handle to the file - * @param data Character to put - * - * @return Character written on success, -1 otherwise - */ -native fputc(file, data); - -/** - * Ungets character from file. - * - * @param file Handle to the file - * @param data Character to unget - * - * @return On success, the character put back is returned, -1 otherwise - */ -native fungetc(file, data); - -/** - * Flushes a buffered output stream. - * - * @param file File handle, or 0 for all open streams - * - * @return 0 on success, -1 on failure - */ -native fflush(file); - -/** - * Gets the formatted file size in bytes. - * - * @param filename Path to the file - * @param ... Variable number of format parameters - * - * @return File size in bytes, otherwise -1 if file not found - */ -native filesize(const filename[], any:...); - -/** - * Removes a directory. - * - * @note On most Operating Systems you cannot remove a directory which has files inside it. - * - * @param path Path to the directory - * - * @return 1 on success, 0 otherwise - */ -native rmdir(const path[]); - -/** - * Creates a directory. - * - * @param path Path to create - * @param mode Permissions (default is o=rx,g=rx,u=rwx). Note that folders must have - * the execute bit set on Linux. On Windows, the mode is ignored. - * @param use_valve_fs If true, the Valve file system will be used instead - * This can be used to create folders in the game's - * Valve search paths, rather than directly in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for default - * In this case, mode is ignored - * - * @return 0 on success, -1 otherwise - */ -native mkdir(const dirname[], mode = FPERM_DIR_DEFAULT, bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); - -/** - * Deletes a file (delete_file macro) - * - * @param filename Path of the file to delete - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to delete files existing in the Valve - * search path, rather than solely files existing directly - * in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths - * - * @return 1 on success, 0 on failure or if file not immediately removed - */ -native unlink(const filename[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); - -/** - * Opens a directory/folder for contents enumeration. - * - * @note Directories are closed with close_dir(). - * - * @param dir Path to open. - * @param firstfile String buffer to hold first file name - * @param length Maximum size of the string buffer - * @param type Optional variable to store the file type - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. - * - * @return Handle to the directory, 0 otherwise - */ -native open_dir(dir[], firstfile[], length, &FileType:type = FileType_Unknown, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); - -/** - * Reads the next directory entry as a local filename. - * - * @note Contents of buffers are undefined when returning false. - * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. - * - * @param dirh Handle to a directory - * @param buffer String buffer to hold directory name - * @param length Maximum size of string buffer - * @param type Optional variable to store the file type. FileType_* constants - * - * @return 1 on success, 0 if there are no more files to read. - */ -native next_file(dirh, buffer[], length, &FileType:type = FileType_Unknown); - -/** - * Closes the directory. - * - * @param dirh Handle to a directory - */ -native close_dir(dirh); - -/** - * Loads a file using the LoadFileForMe engine function. - * - * The data is truncated if there is not enough space. No null-terminator - * is applied; the data is the raw contents of the file. - * - * @param file File to load (may be a file from the GCF) - * @param buffer Buffer to store file contents - * @param maxlength Maximum size of the file buffer - * @param length Variable to store the file length. This may return - * a number larger than the buffer size - * @return -1 if the file could not be loaded. Otherwise, - * the number of cells actually written to the buffer - * are returned. - */ -native LoadFileForMe(const file[], buffer[], maxlength, &length = 0); - -/** - * Returns a file timestamp as a unix timestamp. - * - * @param file File name - * @param tmode Time mode, see FileTime_* constants - * - * @return Returns a file timestamp as a unix timestamp - */ -native GetFileTime(const file[], FileTimeType:tmode); - -/** - * Changes a file or directories permissions. - * - * @param path Path to the file - * @param mode Permissions to set, see FPERM_* constants - * - * @return True on success, false otherwise - */ -native bool:SetFilePermissions(const path[], mode); - -/** - * Reads a single int8 (byte) from a file. The returned value is sign- - * extended to an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadInt8(file, &any:data); - -/** - * Reads a single uint8 (unsigned byte) from a file. The returned value is - * zero-extended to an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadUint8(file, &any:data); - -/** - * Reads a single int16 (short) from a file. The value is sign-extended to - * an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadInt16(file, &any:data); - -/** - * Reads a single unt16 (unsigned short) from a file. The value is zero- - * extended to an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadUint16(file, &any:data); - -/** - * Reads a single int32 (int/cell) from a file. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadInt32(file, &any:data); - -/** - * Writes a single int8 (byte) to a file. - * - * @param file Handle to the file - * @param data Data to write (truncated to an int8) - * - * @return True on success, false on failure - */ -native bool:FileWriteInt8(file, any:data); - -/** - * Writes a single int16 (short) to a file. - * - * @param file Handle to the file - * @param data Data to write (truncated to an int16) - * - * @return True on success, false on failure - */ -native bool:FileWriteInt16(file, any:data); - -/** - * Writes a single int32 (int/cell) to a file. - * - * @param file Handle to the file - * @param data Data to write - * - * @return True on success, false on failure - */ -native bool:FileWriteInt32(file, any:data); - +// vim: set ts=4 sw=4 tw=99 noet: +// +// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). +// Copyright (C) The AMX Mod X Development Team. +// +// This software is licensed under the GNU General Public License, version 3 or higher. +// Additional exceptions apply. For full license details, see LICENSE.txt or visit: +// https://alliedmods.net/amxmodx-license + +// +// File Functions +// + +#if defined _file_included + #endinput +#endif +#define _file_included + +/** + * @note All paths in AMX Mod X natives are relative to the mod folder + * unless otherwise noted. + * + * Most functions in AMX Mod X (at least, ones that deal with direct + * file manipulation) will support an alternate path specification. + */ + +/** + * Maximum path length. + */ +#define PLATFORM_MAX_PATH 256 + +/** + * File inode types for use with open_dir() and next_file(). + */ +enum FileType +{ + FileType_Unknown, /* Unknown file type (device/socket) */ + FileType_Directory, /* File is a directory */ + FileType_File, /* File is a file */ +}; + +/** + * File time modes for use with GetFileTime(). + */ +enum FileTimeType +{ + FileTime_LastAccess, /* Last access (not available on FAT) */ + FileTime_Created, /* Creation (not available on FAT) */ + FileTime_LastChange, /* Last modification */ +}; + +/** + * File position modes for use with fseek(). + */ +#define SEEK_SET 0 /* Seek from start */ +#define SEEK_CUR 1 /* Seek from current position */ +#define SEEK_END 2 /* Seek from end position */ + +/** + * Options for use with file_size() flag parameter. + */ +#define FSOPT_BYTES_COUNT 0 /* Returns the file size in number of bytes */ +#define FSOPT_LINES_COUNT 1 /* Returns how many lines there are in this file */ +#define FSOPT_END_WITH_LF 2 /* Returns whether the last line is '\n' */ + +/** + * Data block modes for use with fread*() and fwrite*(). + */ +#define BLOCK_INT 4 +#define BLOCK_SHORT 2 +#define BLOCK_CHAR 1 +#define BLOCK_BYTE 1 + +/** + * File permissions flags for use with mkdir() and SetFilePermissions(). + */ +#define FPERM_U_READ 0x0100 /* User can read. */ +#define FPERM_U_WRITE 0x0080 /* User can write. */ +#define FPERM_U_EXEC 0x0040 /* User can exec. */ +#define FPERM_U_RWX FPERM_U_READ | FPERM_U_WRITE | FPERM_U_EXEC + +#define FPERM_G_READ 0x0020 /* Group can read. */ +#define FPERM_G_WRITE 0x0010 /* Group can write. */ +#define FPERM_G_EXEC 0x0008 /* Group can exec. */ +#define FPERM_G_RWX FPERM_G_READ | FPERM_G_WRITE | FPERM_G_EXEC + +#define FPERM_O_READ 0x0004 /* Anyone can read. */ +#define FPERM_O_WRITE 0x0002 /* Anyone can write. */ +#define FPERM_O_EXEC 0x0001 /* Anyone can exec. */ +#define FPERM_O_RWX FPERM_O_READ | FPERM_O_WRITE | FPERM_O_EXEC + +#define FPERM_DIR_DEFAULT FPERM_U_RWX | FPERM_G_RWX | FPERM_O_RWX /* rwx r-x r-x (0755) */ + + +/** + * Reads content from directory + * + * @note This native is expensive. Consider the use of open_dir(), next_file() and close_dir() instead. + * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. + * + * @param dirname Path to open + * @param pos Index the element + * @param output String buffer to hold content + * @param len Maximum size of string buffer + * @param outlen Number of characters written to the buffer + * + * @return Returns index of next element, otherwiwe 0 when end of dir is reached + */ +native read_dir(const dirname[], pos, output[], len, &outlen = 0); + +/** + * Reads line from file. + * + * @note This native is expensive. Consider the use of new file natives (fopen(), fgets(), etc.) + * if purpose is to read several lines of a file. + * + * @param file Path to open + * @param line Index of the line, starting to 0 + * @param text String buffer to hold line read + * @param len Maximum size of string buffer + * @param txtlen Number of characters written to the buffer + * + * @return Returns index of next line, otherwise 0 when end of file is reached + * @error Unable to read the file + */ +native read_file(const file[], line, text[], len, &txtlen = 0); + +/** + * Writes text to file. + * + * @note This native is expensive. Consider the use of new file natives (fopen(), fputs(), etc.) + * if purpose is to write several lines of a file. + * + * @param file Path to open + * @param text String to write to + * @param line Index of the line, starting to 0 + * If < 0, content will be appended + * + * @noreturn + * @error Unable to write [temporary] file + */ +native write_file(const file[], const text[], line = -1); + +/** + * Deletes a file. + * + * @param file Path of the file to delete + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to delete files existing in the Valve + * search path, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * + * @return 1 on success, 0 on failure or if file not immediately removed. + */ +native delete_file(const file[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); + +/** + * Checks if a file exists. + * + * @param file Path to the file + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * + * @return 1 if the file exists, 0 otherwise + */ +native file_exists(const file[], bool:use_valve_fs = false); + +/** + * Renames a file. + * + * @param oldname New path to the file + * @param newname Path to the existing file + * @param relative If true, native will act like other natives which + * use the moddir as a base directory. Otherwise, the + * current directory is undefined (but assumed to be hlds). + * + * @return 1 on success, 0 otherwise + */ +native rename_file(const oldname[], const newname[], relative = 0); + +/** + * Checks if a directory exists. + * + * @param dir Path to the directory + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * + * @return 1 if the directory exists, 0 otherwise + */ +native dir_exists(const dir[], bool:use_valve_fs = false); + +/** + * Get the file size in bytes. + * + * @param file Path to the file + * @param flag Flag options, see FSOPT_* constants + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * If used, flag option is ignored. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths + * + * @return If flag is FSOPT_BYTES_COUNT or use_valve_fs to true, the file size in bytes + * If flag is FSOPT_LINES_COUNT, the number of lines in the file + * If flag is FSOPT_END_WITH_LF, 1 is returned if file ends with line feed + * If file doesn't exist, -1 + */ +native file_size(const file[], flag = FSOPT_BYTES_COUNT, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); + +/** + * Opens or creates a file, returning a file handle on success. File handles + * should be closed with fclose(). + * + * @note The open mode may be one of the following strings: + * "r": Open an existing file for reading. + * "w": Create a file for writing, or truncate (delete the contents of) an + * existing file and then open it for writing. + * "a": Create a file for writing, or open an existing file such that writes + * will be appended to the end. + * "r+": Open an existing file for both reading and writing. + * "w+": Create a file for reading and writing, or truncate an existing file + * and then open it for reading and writing. + * "a+": Create a file for both reading and writing, or open an existing file + * such that writes will be appended to the end. + * + * @note The open mode may also contain an additional character after "r", "w", or "a", + * but before any "+" sign. This character may be "b" (indicating binary mode) or + * "t" (indicating text mode). By default, "text" mode is implied. On Linux and + * Mac, this has no distinction from binary mode. On Windows, it causes the '\n' + * character (0xA) to be written as "\r\n" (0xD, 0xA). + * + * Example: "rb" opens a binary file for writing; "at" opens a text file for + * appending. + * + * @note Registered paths ID are (in priority order) : + * GAME All paths related to current mod, including fallback + * Depending settings, it includes: <gamedir>_lv/_addon/_<language>/_hd + * and <gamedir> itself + * GAMECONFIG The default writable directory (<gamedir>) + * GAMEDOWNLOAD The download directory (<gamedir>_download) + * GAME_FALLBACK All paths related to fallback game, same as GAME + * DEFAULTGAME All paths related to the default game which is "valve", same as GAME + * BASE The base path where server is installed + * + * Note that some paths are non-writable. It includes all <gamedir>_* (expect _download) + * and DEFAULTGAME. Any file inside a non-writable path will be ignored if you try to open + * it in writing mode. + * + * @param filename File to open + * @param mode Open mode + * @param use_valve_fs If true, the Valve file system will be used instead + * This can be used to finred files existing in valve + * search paths, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths + * + * @return A file handle, or null if the file could not be opened. + */ +native fopen(const filename[], const mode[], bool:use_valve_fs = false, const valve_path_id[] = "GAME"); + +/** + * Closes a file handle. + * + * @param file File handle + */ +native fclose(file); + +/** + * Reads a single binary data from a file. + * + * @param file Handle to the file + * @param data Variable to store item read + * @param mode Size of each element, in bytes, to be read + * See BLOCK_* constants + * + * @return Number of elements read + */ +native fread(file, &any:data, mode); + +/** + * Reads binary data from a file. + * + * @param file Handle to the file + * @param data Array to store each item read + * @param blocks Number of items to read into the array + * @param mode Size of each element, in bytes, to be read + * Valid sizes are 1, 2, or 4. See BLOCK_* constants. + * + * @return Number of elements read + */ +native fread_blocks(file, any:data[], blocks, mode); + +/** + * Reads raw binary data from a file. + * + * @param file Handle to the file + * @param stream Array to store each item read + * @param blocksize Number of items to read into the array + * @param blocks Size of each element, in bytes. The data is read directly. + * That is, in 1 or 2-byte mode, the lower byte(s) in + * each cell are used directly, rather than performing + * any casts from a 4-byte number to a smaller number. + * + * @return Number of elements read + */ +native fread_raw(file, any:stream[], blocksize, blocks); + +/** + * Writes a single binary data to a file. + * + * @param file Handle to the file + * @param data Item to write + * @param mode Size of each item in the array in bytes + * Valid sizes are 1, 2, or 4. See BLOCK_* constants + * + * @return Number of elements written + */ +native fwrite(file, any:data, mode); + +/** + * Writes binary data to a file. + * + * @param file Handle to the file + * @param data Array of items to write + * @param blocks Number of items in the array + * @param mode Size of each item in the array in bytes + * Valid sizes are 1, 2, or 4. See BLOCK_* constants + * + * @return Number of elements written + */ +native fwrite_blocks(file, const any:data[], blocks, mode); + +/** + * Writes raw binary data to a file. + * + * @param file Handle to the file. + * @param stream Array of items to write. The data is written directly. + * That is, in 1 or 2-byte mode, the lower byte(s) in + * each cell are used directly, rather than performing + * any casts from a 4-byte number to a smaller number. + * @param blocks Size of each item in the array in bytes. + * @param mode Number of items in the array. + * + * @return Number of elements written + */ +native fwrite_raw(file, const any:stream[], blocks, mode); + +/** + * Tests if the end of file has been reached. + * + * @param file Handle to the file + * + * @return 1 if end of file has been reached, 0 otherwise. + */ +native feof(file); + +/** + * Reads a line from a text file. + * + * @param file Handle to the file. + * @param buffer String buffer to hold the line + * @param maxlength Maximum size of string buffer + * + * @return Total number of characters written on success, 0 otherwise + */ +native fgets(file, buffer[], maxlength); + +/** + * Writes a line of text to a text file. + * + * @param file Handle to the file + * @param text String to write + * @param null_term True to append NULL terminator, false otherwise + * + * @return 0 on success, -1 otherwise + */ +native fputs(file, const text[], bool:null_term = false); + +/** + * Writes a line of formatted text to a text file. + * + * @param file Handle to the file + * @param format Formatting rules + * @param ... Variable number of format parameters + * + * @return Total number of characters written on success, 0 otherwise + */ +native fprintf(file, const fmt[], any:...); + +/** + * Sets the file position indicator. + * + * @param file Handle to the file + * @param position Position relative to what is specified in whence + * @param start SEEK_ constant value of where to see from + * + * @return 0 on success, a non-zero value otherwise + */ +native fseek(file, position, start); + +/** + * Gets current position in the file. + * + * @param file Handle to the file + * + * @return Value for the file position indicator + */ +native ftell(file); + +/** + * Gets character from file. + * + * @param file Handle to the file + * + * @return Character read on success, -1 otherwise + */ +native fgetc(file); + +/** + * Writes character to file + * + * @param file Handle to the file + * @param data Character to put + * + * @return Character written on success, -1 otherwise + */ +native fputc(file, data); + +/** + * Ungets character from file. + * + * @param file Handle to the file + * @param data Character to unget + * + * @return On success, the character put back is returned, -1 otherwise + */ +native fungetc(file, data); + +/** + * Flushes a buffered output stream. + * + * @param file File handle, or 0 for all open streams + * + * @return 0 on success, -1 on failure + */ +native fflush(file); + +/** + * Gets the formatted file size in bytes. + * + * @param filename Path to the file + * @param ... Variable number of format parameters + * + * @return File size in bytes, otherwise -1 if file not found + */ +native filesize(const filename[], any:...); + +/** + * Removes a directory. + * + * @note On most Operating Systems you cannot remove a directory which has files inside it. + * + * @param path Path to the directory + * + * @return 1 on success, 0 otherwise + */ +native rmdir(const path[]); + +/** + * Creates a directory. + * + * @param path Path to create + * @param mode Permissions (default is o=rx,g=rx,u=rwx). Note that folders must have + * the execute bit set on Linux. On Windows, the mode is ignored. + * @param use_valve_fs If true, the Valve file system will be used instead + * This can be used to create folders in the game's + * Valve search paths, rather than directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for default + * In this case, mode is ignored + * + * @return 0 on success, -1 otherwise + */ +native mkdir(const dirname[], mode = FPERM_DIR_DEFAULT, bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); + +/** + * Deletes a file (delete_file macro) + * + * @param filename Path of the file to delete + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to delete files existing in the Valve + * search path, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths + * + * @return 1 on success, 0 on failure or if file not immediately removed + */ +native unlink(const filename[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); + +/** + * Opens a directory/folder for contents enumeration. + * + * @note Directories are closed with close_dir(). + * + * @param dir Path to open. + * @param firstfile String buffer to hold first file name + * @param length Maximum size of the string buffer + * @param type Optional variable to store the file type + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * + * @return Handle to the directory, 0 otherwise + */ +native open_dir(dir[], firstfile[], length, &FileType:type = FileType_Unknown, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); + +/** + * Reads the next directory entry as a local filename. + * + * @note Contents of buffers are undefined when returning false. + * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. + * + * @param dirh Handle to a directory + * @param buffer String buffer to hold directory name + * @param length Maximum size of string buffer + * @param type Optional variable to store the file type. FileType_* constants + * + * @return 1 on success, 0 if there are no more files to read. + */ +native next_file(dirh, buffer[], length, &FileType:type = FileType_Unknown); + +/** + * Closes the directory. + * + * @param dirh Handle to a directory + */ +native close_dir(dirh); + +/** + * Loads a file using the LoadFileForMe engine function. + * + * The data is truncated if there is not enough space. No null-terminator + * is applied; the data is the raw contents of the file. + * + * @param file File to load (may be a file from the GCF) + * @param buffer Buffer to store file contents + * @param maxlength Maximum size of the file buffer + * @param length Variable to store the file length. This may return + * a number larger than the buffer size + * @return -1 if the file could not be loaded. Otherwise, + * the number of cells actually written to the buffer + * are returned. + */ +native LoadFileForMe(const file[], buffer[], maxlength, &length = 0); + +/** + * Returns a file timestamp as a unix timestamp. + * + * @param file File name + * @param tmode Time mode, see FileTime_* constants + * + * @return Returns a file timestamp as a unix timestamp + */ +native GetFileTime(const file[], FileTimeType:tmode); + +/** + * Changes a file or directories permissions. + * + * @param path Path to the file + * @param mode Permissions to set, see FPERM_* constants + * + * @return True on success, false otherwise + */ +native bool:SetFilePermissions(const path[], mode); + +/** + * Reads a single int8 (byte) from a file. The returned value is sign- + * extended to an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadInt8(file, &any:data); + +/** + * Reads a single uint8 (unsigned byte) from a file. The returned value is + * zero-extended to an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadUint8(file, &any:data); + +/** + * Reads a single int16 (short) from a file. The value is sign-extended to + * an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadInt16(file, &any:data); + +/** + * Reads a single unt16 (unsigned short) from a file. The value is zero- + * extended to an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadUint16(file, &any:data); + +/** + * Reads a single int32 (int/cell) from a file. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadInt32(file, &any:data); + +/** + * Writes a single int8 (byte) to a file. + * + * @param file Handle to the file + * @param data Data to write (truncated to an int8) + * + * @return True on success, false on failure + */ +native bool:FileWriteInt8(file, any:data); + +/** + * Writes a single int16 (short) to a file. + * + * @param file Handle to the file + * @param data Data to write (truncated to an int16) + * + * @return True on success, false on failure + */ +native bool:FileWriteInt16(file, any:data); + +/** + * Writes a single int32 (int/cell) to a file. + * + * @param file Handle to the file + * @param data Data to write + * + * @return True on success, false on failure + */ +native bool:FileWriteInt32(file, any:data); + diff --git a/plugins/include/float.inc b/plugins/include/float.inc index a8c9ee06..72c8f1a3 100755 --- a/plugins/include/float.inc +++ b/plugins/include/float.inc @@ -1,422 +1,422 @@ -/* Float arithmetic -* -* (c) Copyright 1999, Artran, Inc. -* Written by Greg Garner (gmg@artran.com) -* Modified in March 2001 to include user defined -* operators for the floating point functions. -* -* This file is provided as is (no warranties). -*/ - -#if defined _float_included - #endinput -#endif -#define _float_included - -#pragma rational Float - -/** - * Different methods of rounding - */ -enum floatround_method { - floatround_round = 0, - floatround_floor, - floatround_ceil, - floatround_tozero -}; - -/** - * Different units of measurement for angles - */ -enum anglemode { - radian = 0, - degrees, - grades -}; - -/** - * Converts an integer into a floating point value. - * - * @param value Value to be converted - * - * @return Converted value - */ -native Float:float(value); - -/** - * Converts a string into a floating point value. - * - * @param string Input string to be converted - * - * @return Converted value - */ -native Float:floatstr(const string[]); - -/** - * Returns the fractional part of a floating point value - * - * @param string Floating point value to get the fractional part from - * - * @return The fractional part - */ -native Float:floatfract(Float:value); - -/** - * Rounds a floating point value to an integer value - * - * @note For the list of available rounding methods look at - * floatround_method enumeration. - * - * @param value Floating point value to be rounded - * @param method Rounding method - * - * @return Converted value - */ -native floatround(Float:value, floatround_method:method=floatround_round); - -/** - * Compares two floating point values. - * - * @param fOne First value to be compared - * @param fTwo Second value to be compared - * - * @return If arguments are equal, returns 0. - * If the first one is greater, returns 1. - * If the second one is greater, returns -1. - */ -native floatcmp(Float:fOne, Float:fTwo); - -/** - * Returns the square root of a floating point value - * - * @note Same as floatpower(value, 0.5) - * - * @param value Floating point value to get square root from - * - * @return Square root of the input value - */ -native Float:floatsqroot(Float:value); - -/** - * Returns the value raised to the power of the exponent - * - * @param value Floating point value to be raised - * @param exponent The exponent - * - * @return Value raised to the power of the exponent - */ -native Float:floatpower(Float:value, Float:exponent); - -/** - * Returns the logarithm of value - * - * @param value Floating point value to calculate the logarithm for - * @param base The optional logarithmic base to use. - * Defaults to 10, or the natural logarithm - * - * @return Square root of the input value - */ -native Float:floatlog(Float:value, Float:base=10.0); - -/** - * Returns the sine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the sine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The sine of a given angle - */ -native Float:floatsin(Float:value, anglemode:mode=radian); - -/** - * Returns the cosine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the cosine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The cosine of a given angle - */ -native Float:floatcos(Float:value, anglemode:mode=radian); - -/** - * Returns the tangent of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the tangent from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The tangent of a given angle - */ -native Float:floattan(Float:value, anglemode:mode=radian); - - /** - * Returns the hyperbolic sine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the hyperbolic sine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The hyperbolic sine of a given angle - */ -native Float:floatsinh(Float:angle, anglemode:mode=radian); - - /** - * Returns the hyperbolic cosine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the hyperbolic cosine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The hyperbolic cosine of a given angle - */ -native Float:floatcosh(Float:angle, anglemode:mode=radian); - - /** - * Returns the hyperbolic tangent of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the hyperbolic tangent from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The hyperbolic tangent of a given angle - */ -native Float:floattanh(Float:angle, anglemode:mode=radian); - - /** - * Returns the absolute value of a floating point value - * - * @param value The floating point value to get the absolute value from - * - * @return The absolute value - */ -native Float:floatabs(Float:value); - -/* Return the angle of a sine, cosine or tangent. - * The output angle may be in radians, degrees, or grades. */ - - /** - * Returns the angle of the given tangent - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The tangent to calculate the angle from - * @param mode What unit of measurement should the output angle be in - * - * @return The angle of a tangent - */ -native Float:floatatan(Float:angle, {anglemode,_}:radix); - - /** - * Returns the angle of the given cosine - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The cosine to calculate the angle from - * @param mode What unit of measurement should the output angle be in - * - * @return The angle of a cosine - */ -native Float:floatacos(Float:angle, {anglemode,_}:radix); - - /** - * Returns the angle of the given sine - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The sine to calculate the angle from - * @param mode What unit of measurement should the output angle be in - * - * @return The angle of a sine - */ -native Float:floatasin(Float:angle, {anglemode,_}:radix); - - /** - * Computes the principal value of arctangent of y/x - * - * @note Someone should verify this native, not sure what it actually does. - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param x Value representing the proportion of the x-coordinate. - * @param y Value representing the proportion of the x-coordinate. - * @param mode What unit of measurement should the output angle be in - * - * @return Arctangent of y/x - */ -native Float:floatatan2(Float:x, Float:y, {anglemode,_}:radix); - - - -/* Multiply two floats together */ -native Float:floatmul(Float:oper1, Float:oper2); - -/* Divide the dividend float by the divisor float */ -native Float:floatdiv(Float:dividend, Float:divisor); - -/* Add two floats together */ -native Float:floatadd(Float:dividend, Float:divisor); - -/* Subtract oper2 float from oper1 float */ -native Float:floatsub(Float:oper1, Float:oper2); - -/* user defined operators */ -native Float:operator*(Float:oper1, Float:oper2) = floatmul; -native Float:operator/(Float:oper1, Float:oper2) = floatdiv; -native Float:operator+(Float:oper1, Float:oper2) = floatadd; -native Float:operator-(Float:oper1, Float:oper2) = floatsub; - -stock Float:operator++(Float:oper) - return oper+1.0; - -stock Float:operator--(Float:oper) - return oper-1.0; - -stock Float:operator-(Float:oper) - return oper^Float:cellmin; /* IEEE values are sign/magnitude */ - -stock Float:operator*(Float:oper1, oper2) - return floatmul(oper1, float(oper2)); /* "*" is commutative */ - -stock Float:operator/(Float:oper1, oper2) - return floatdiv(oper1, float(oper2)); - -stock Float:operator/(oper1, Float:oper2) - return floatdiv(float(oper1), oper2); - -stock Float:operator+(Float:oper1, oper2) - return floatadd(oper1, float(oper2)); /* "+" is commutative */ - -stock Float:operator-(Float:oper1, oper2) - return floatsub(oper1, float(oper2)); - -stock Float:operator-(oper1, Float:oper2) - return floatsub(float(oper1), oper2); - -stock bool:operator==(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) == 0; - -stock bool:operator==(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) == 0; /* "==" is commutative */ - -stock bool:operator!=(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) != 0; - -stock bool:operator!=(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) != 0; /* "==" is commutative */ - -stock bool:operator>(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) > 0; - -stock bool:operator>(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) > 0; - -stock bool:operator>(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) > 0; - -stock bool:operator>=(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) >= 0; - -stock bool:operator>=(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) >= 0; - -stock bool:operator>=(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) >= 0; - -stock bool:operator<(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) < 0; - -stock bool:operator<(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) < 0; - -stock bool:operator<(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) < 0; - -stock bool:operator<=(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) <= 0; - -stock bool:operator<=(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) <= 0; - -stock bool:operator<=(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) <= 0; - -stock bool:operator!(Float:oper) - return (_:oper & ((-1)/2)) == 0; /* -1 = all bits to 1; /2 = remove most significant bit (sign) - works on both 32bit and 64bit systems; no constant required */ -/* forbidden operations */ -forward operator%(Float:oper1, Float:oper2); -forward operator%(Float:oper1, oper2); -forward operator%(oper1, Float:oper2); - - - /** - * Returns whichever value is the smaller one - * - * @param ValueA The first value - * @param ValueB The second value - * - * @return ValueA if it is smaller than ValueB, and vice versa - */ -stock Float:floatmin(Float:ValueA, Float:ValueB) -{ - if (ValueA<=ValueB) - { - return ValueA; - } - - return ValueB; -} - - /** - * Returns whichever value is the greater one - * - * @param ValueA The first value - * @param ValueB The second value - * - * @return ValueA if it is greater than ValueB, and vice versa - */ -stock Float:floatmax(Float:ValueA, Float:ValueB) -{ - if (ValueA>=ValueB) - { - return ValueA; - } - - return ValueB; -} - - /** - * Clamps a value between a minimum and a maximum floating point value - * - * @param Value The value to be clamped - * @param MinValue Minimum value - * @param MaxValue Maximum value - * - * @return The Value clamped between MinValue and MaxValue - */ -stock Float:floatclamp(Float:Value, Float:MinValue, Float:MaxValue) -{ - if (Value<=MinValue) - { - return MinValue; - } - if (Value>=MaxValue) - { - return MaxValue; - } - - return Value; +/* Float arithmetic +* +* (c) Copyright 1999, Artran, Inc. +* Written by Greg Garner (gmg@artran.com) +* Modified in March 2001 to include user defined +* operators for the floating point functions. +* +* This file is provided as is (no warranties). +*/ + +#if defined _float_included + #endinput +#endif +#define _float_included + +#pragma rational Float + +/** + * Different methods of rounding + */ +enum floatround_method { + floatround_round = 0, + floatround_floor, + floatround_ceil, + floatround_tozero +}; + +/** + * Different units of measurement for angles + */ +enum anglemode { + radian = 0, + degrees, + grades +}; + +/** + * Converts an integer into a floating point value. + * + * @param value Value to be converted + * + * @return Converted value + */ +native Float:float(value); + +/** + * Converts a string into a floating point value. + * + * @param string Input string to be converted + * + * @return Converted value + */ +native Float:floatstr(const string[]); + +/** + * Returns the fractional part of a floating point value + * + * @param string Floating point value to get the fractional part from + * + * @return The fractional part + */ +native Float:floatfract(Float:value); + +/** + * Rounds a floating point value to an integer value + * + * @note For the list of available rounding methods look at + * floatround_method enumeration. + * + * @param value Floating point value to be rounded + * @param method Rounding method + * + * @return Converted value + */ +native floatround(Float:value, floatround_method:method=floatround_round); + +/** + * Compares two floating point values. + * + * @param fOne First value to be compared + * @param fTwo Second value to be compared + * + * @return If arguments are equal, returns 0. + * If the first one is greater, returns 1. + * If the second one is greater, returns -1. + */ +native floatcmp(Float:fOne, Float:fTwo); + +/** + * Returns the square root of a floating point value + * + * @note Same as floatpower(value, 0.5) + * + * @param value Floating point value to get square root from + * + * @return Square root of the input value + */ +native Float:floatsqroot(Float:value); + +/** + * Returns the value raised to the power of the exponent + * + * @param value Floating point value to be raised + * @param exponent The exponent + * + * @return Value raised to the power of the exponent + */ +native Float:floatpower(Float:value, Float:exponent); + +/** + * Returns the logarithm of value + * + * @param value Floating point value to calculate the logarithm for + * @param base The optional logarithmic base to use. + * Defaults to 10, or the natural logarithm + * + * @return Square root of the input value + */ +native Float:floatlog(Float:value, Float:base=10.0); + +/** + * Returns the sine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the sine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The sine of a given angle + */ +native Float:floatsin(Float:value, anglemode:mode=radian); + +/** + * Returns the cosine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the cosine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The cosine of a given angle + */ +native Float:floatcos(Float:value, anglemode:mode=radian); + +/** + * Returns the tangent of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the tangent from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The tangent of a given angle + */ +native Float:floattan(Float:value, anglemode:mode=radian); + +/** + * Returns the hyperbolic sine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the hyperbolic sine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The hyperbolic sine of a given angle + */ +native Float:floatsinh(Float:angle, anglemode:mode=radian); + +/** + * Returns the hyperbolic cosine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the hyperbolic cosine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The hyperbolic cosine of a given angle + */ +native Float:floatcosh(Float:angle, anglemode:mode=radian); + +/** + * Returns the hyperbolic tangent of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the hyperbolic tangent from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The hyperbolic tangent of a given angle + */ +native Float:floattanh(Float:angle, anglemode:mode=radian); + +/** + * Returns the absolute value of a floating point value + * + * @param value The floating point value to get the absolute value from + * + * @return The absolute value + */ +native Float:floatabs(Float:value); + +/* Return the angle of a sine, cosine or tangent. + * The output angle may be in radians, degrees, or grades. */ + +/** + * Returns the angle of the given tangent + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The tangent to calculate the angle from + * @param mode What unit of measurement should the output angle be in + * + * @return The angle of a tangent + */ +native Float:floatatan(Float:angle, {anglemode,_}:radix); + +/** + * Returns the angle of the given cosine + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The cosine to calculate the angle from + * @param mode What unit of measurement should the output angle be in + * + * @return The angle of a cosine + */ +native Float:floatacos(Float:angle, {anglemode,_}:radix); + +/** + * Returns the angle of the given sine + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The sine to calculate the angle from + * @param mode What unit of measurement should the output angle be in + * + * @return The angle of a sine + */ +native Float:floatasin(Float:angle, {anglemode,_}:radix); + +/** + * Computes the principal value of arctangent of y/x + * + * @note Someone should verify this native, not sure what it actually does. + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param x Value representing the proportion of the x-coordinate. + * @param y Value representing the proportion of the x-coordinate. + * @param mode What unit of measurement should the output angle be in + * + * @return Arctangent of y/x + */ +native Float:floatatan2(Float:x, Float:y, {anglemode,_}:radix); + + + +/* Multiply two floats together */ +native Float:floatmul(Float:oper1, Float:oper2); + +/* Divide the dividend float by the divisor float */ +native Float:floatdiv(Float:dividend, Float:divisor); + +/* Add two floats together */ +native Float:floatadd(Float:dividend, Float:divisor); + +/* Subtract oper2 float from oper1 float */ +native Float:floatsub(Float:oper1, Float:oper2); + +/* user defined operators */ +native Float:operator*(Float:oper1, Float:oper2) = floatmul; +native Float:operator/(Float:oper1, Float:oper2) = floatdiv; +native Float:operator+(Float:oper1, Float:oper2) = floatadd; +native Float:operator-(Float:oper1, Float:oper2) = floatsub; + +stock Float:operator++(Float:oper) + return oper+1.0; + +stock Float:operator--(Float:oper) + return oper-1.0; + +stock Float:operator-(Float:oper) + return oper^Float:cellmin; /* IEEE values are sign/magnitude */ + +stock Float:operator*(Float:oper1, oper2) + return floatmul(oper1, float(oper2)); /* "*" is commutative */ + +stock Float:operator/(Float:oper1, oper2) + return floatdiv(oper1, float(oper2)); + +stock Float:operator/(oper1, Float:oper2) + return floatdiv(float(oper1), oper2); + +stock Float:operator+(Float:oper1, oper2) + return floatadd(oper1, float(oper2)); /* "+" is commutative */ + +stock Float:operator-(Float:oper1, oper2) + return floatsub(oper1, float(oper2)); + +stock Float:operator-(oper1, Float:oper2) + return floatsub(float(oper1), oper2); + +stock bool:operator==(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) == 0; + +stock bool:operator==(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) == 0; /* "==" is commutative */ + +stock bool:operator!=(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) != 0; + +stock bool:operator!=(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) != 0; /* "==" is commutative */ + +stock bool:operator>(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) > 0; + +stock bool:operator>(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) > 0; + +stock bool:operator>(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) > 0; + +stock bool:operator>=(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) >= 0; + +stock bool:operator>=(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) >= 0; + +stock bool:operator>=(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) >= 0; + +stock bool:operator<(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) < 0; + +stock bool:operator<(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) < 0; + +stock bool:operator<(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) < 0; + +stock bool:operator<=(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) <= 0; + +stock bool:operator<=(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) <= 0; + +stock bool:operator<=(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) <= 0; + +stock bool:operator!(Float:oper) + return (_:oper & ((-1)/2)) == 0; /* -1 = all bits to 1; /2 = remove most significant bit (sign) + works on both 32bit and 64bit systems; no constant required */ +/* forbidden operations */ +forward operator%(Float:oper1, Float:oper2); +forward operator%(Float:oper1, oper2); +forward operator%(oper1, Float:oper2); + + +/** + * Returns whichever value is the smaller one + * + * @param ValueA The first value + * @param ValueB The second value + * + * @return ValueA if it is smaller than ValueB, and vice versa + */ +stock Float:floatmin(Float:ValueA, Float:ValueB) +{ + if (ValueA<=ValueB) + { + return ValueA; + } + + return ValueB; +} + +/** + * Returns whichever value is the greater one + * + * @param ValueA The first value + * @param ValueB The second value + * + * @return ValueA if it is greater than ValueB, and vice versa + */ +stock Float:floatmax(Float:ValueA, Float:ValueB) +{ + if (ValueA>=ValueB) + { + return ValueA; + } + + return ValueB; +} + +/** + * Clamps a value between a minimum and a maximum floating point value + * + * @param Value The value to be clamped + * @param MinValue Minimum value + * @param MaxValue Maximum value + * + * @return The Value clamped between MinValue and MaxValue + */ +stock Float:floatclamp(Float:Value, Float:MinValue, Float:MaxValue) +{ + if (Value<=MinValue) + { + return MinValue; + } + if (Value>=MaxValue) + { + return MaxValue; + } + + return Value; } \ No newline at end of file diff --git a/plugins/include/fun.inc b/plugins/include/fun.inc index b11deffe..1096e767 100755 --- a/plugins/include/fun.inc +++ b/plugins/include/fun.inc @@ -1,304 +1,306 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -// -// Fun Functions -// - -#if defined _fun_included - #endinput -#endif -#define _fun_included - -#pragma reqlib fun -#if !defined AMXMODX_NOAUTOLOAD - #pragma loadlib fun -#endif - -/** - * Tells whether receiver hears sender via voice communication. - * - * @param receiver Receiver - * @param sender Sender - * - * @return 1 if receiver hears the sender, 0 otherwise. - * @error If receiver or sender are not connected or not - * within the range of 1 to MaxClients. - */ -native get_client_listen(receiver, sender); - -/** - * Sets who can listen who. - * - * @param receiver Receiver - * @param sender Sender - * @param listen 1 if receiver should be able to hear sender, 0 if not - * - * @return 0 if the setting can't be done for some reason. - * @error If receiver or sender are not connected or not - * within the range of 1 to MaxClients. - */ -native set_client_listen(receiver, sender, listen); - -/** - * Sets player's godmode - * - * @param index Client index - * @param godmode 1 to enable godmode, 0 to disable - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_godmode(index, godmode = 0); - -/** - * Tells whether a player has godmode on - * - * @param index Client index - * - * @return 1 if player has godmode on, 0 if not - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_godmode(index); - -/** - * Sets player's armor amount - * - * @param index Client index - * @param armor The armor amount to set - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_armor(index, armor); - -/** - * Sets player's health amount - * - * @param index Client index - * @param health The health amount to set - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_health(index, health); - -/** - * Moves a player to the given origin - * - * @param index Client index - * @param origin Origin to move a player to - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_origin(index, const origin[3]); - -/** - * Sets player's rendering mode - * - * @note A really useful render modes reference: - * https://sites.google.com/site/svenmanor/rendermodes - * - * @param index Client index - * @param fx Rendering effects. One of kRenderFx* constants. - * @param r The amount of red color (0 to 255) - * @param g The amount of green color (0 to 255) - * @param b The amount of blue color (0 to 255) - * @param render Render mode. One of kRender* constants. - * @param amount Render amount (0 to 255) - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_rendering(index, fx = kRenderFxNone, r = 0, g = 0, b = 0, render = kRenderNormal, amount = 0); - - /** - * Gives an item to a player. - * - * @param index Client index - * @param item Classname of the item to give. Should start with either - * "weapon_", "ammo_", "item_" or "tf_weapon_". - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients or item creation fails. - */ -native give_item(index, const item[]); - - /** - * Sets (adds, removes) hit zones for a player. - * - * @note This actually set rules of how any player can hit any other. Example: - * set_user_hitzones(id, target, 2); - * makes @id be able to hit @target only in the head. - * - * @param index Client index - * @param target The target player - * @param body A bitsum of the body parts that can/can't be shot. - * 1 generic - * 2 - head - * 4 - chest - * 8 - stomach - * 16 - left arm - * 32 - right arm - * 64 - left leg - * 128 - right leg - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_hitzones(index = 0, target = 0, body = 255); - -/** - * Gets the set of hit zone "rules" between @index and @target players. - * - * @note For the body part bitsum take a look at the set_user_hitzones() native. - * - * @param index Client index - * @param target The target player - * - * @return The bitsum of @target's body parts @index is able to hit - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_hitzones(index, target); - -/** - * Sets player's maximum movement speed - * - * @param index Client index - * @param speed The maximum speed player will be able to run at - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_maxspeed(index, Float:speed = -1.0); - -/** - * Gets player's maximum movement speed - * - * @param index Client index - * - * @return Player's maximum movement speed - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native Float:get_user_maxspeed(index); - -/** - * Sets player's gravity - * - * @param index Client index - * @param gravity Gravity value to set, 1.0 being normal gravity (800) - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_gravity(index, Float:gravity = 1.0); - -/** - * Gets player's gravity - * - * @param index Client index - * - * @return Player's gravity value, 1.0 being normal gravity (800) - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native Float:get_user_gravity(index); - -/** - * Spawns an entity - * - * @param index Entity index - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native spawn(index); - -/** - * Sets player's noclip - * - * @param index Client index - * @param noclip 1 to enable noclip, 0 to disable - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_noclip(index, noclip = 0); - -/** - * Gets player's noclip - * - * @param index Client index - * - * @return 1 if noclip is enabled, 0 if disabled - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_noclip(index); - -/** - * Tells whether a player has silent footsteps - * - * @param index Client index - * - * @return 1 if silent footsteps are enabled, 0 if not - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_footsteps(index); - -/** - * Sets player's silent footsteps - * - * @param index Client index - * @param set 1 if player should have silent footsteps, 0 otherwise - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_footsteps(id, set = 1); - -/** - * Strips all weapons from a player, including their knife. - * - * @param index Client index - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native strip_user_weapons(index); - -/** - * Sets player's frags amount - * - * @param index Client index - * @param frags The amount of frags to set - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_frags(index, frags); +// vim: set ts=4 sw=4 tw=99 noet: +// +// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). +// Copyright (C) The AMX Mod X Development Team. +// +// This software is licensed under the GNU General Public License, version 3 or higher. +// Additional exceptions apply. For full license details, see LICENSE.txt or visit: +// https://alliedmods.net/amxmodx-license + +// +// Fun Functions +// + +#if defined _fun_included + #endinput +#endif +#define _fun_included + +#pragma reqlib fun +#if !defined AMXMODX_NOAUTOLOAD + #pragma loadlib fun +#endif + +/** + * Tells whether receiver hears sender via voice communication. + * + * @param receiver Receiver + * @param sender Sender + * + * @return 1 if receiver hears the sender, 0 otherwise. + * @error If receiver or sender are not connected or not + * within the range of 1 to MaxClients + */ +native get_client_listen(receiver, sender); + +/** + * Sets who can listen who. + * + * @param receiver Receiver + * @param sender Sender + * @param listen 1 if receiver should be able to hear sender, 0 if not + * + * @return 0 if the setting can't be done for some reason + * @error If receiver or sender are not connected or not + * within the range of 1 to MaxClients. + */ +native set_client_listen(receiver, sender, listen); + +/** + * Sets player's godmode. + * + * @param index Client index + * @param godmode 1 to enable godmode, 0 to disable + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_godmode(index, godmode = 0); + +/** + * Tells whether a player has godmode on. + * + * @param index Client index + * + * @return 1 if player has godmode on, 0 if not + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_godmode(index); + +/** + * Sets player's armor amount. + * + * @param index Client index + * @param armor The armor amount to set + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_armor(index, armor); + +/** + * Sets player's health amount. + * + * @param index Client index + * @param health The health amount to set + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_health(index, health); + +/** + * Moves a player to the given origin. + * + * @param index Client index + * @param origin Origin to move a player to + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_origin(index, const origin[3]); + +/** + * Sets player's rendering mode. + * + * @note A really useful render modes reference: + * https://sites.google.com/site/svenmanor/rendermodes + * + * @param index Client index + * @param fx Rendering effects. One of kRenderFx* constants + * @param r The amount of red color (0 to 255) + * @param g The amount of green color (0 to 255) + * @param b The amount of blue color (0 to 255) + * @param render Render mode. One of kRender* constants + * @param amount Render amount (0 to 255) + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_rendering(index, fx = kRenderFxNone, r = 0, g = 0, b = 0, render = kRenderNormal, amount = 0); + +/** + * Gives an item to a player. + * + * @param index Client index + * @param item Classname of the item to give. Should start with either + * "weapon_", "ammo_", "item_" or "tf_weapon_" + * + * @return Item entity index. If an invalid item name is + * given or the item failed to create, it will return 0. + * If the item was removed, it will return -1 + * @error If player is not connected or not within the range + * of 1 to MaxClients or item creation fails. + */ +native give_item(index, const item[]); + +/** + * Sets (adds, removes) hit zones for a player. + * + * @note This actually sets rules of how any player can hit any other. + * Example: set_user_hitzones(id, target, 2) - makes @id able to + * hit @target only in the head. + * + * @param index Client index + * @param target The target player + * @param body A bitsum of the body parts that can/can't be shot: + * 1 - generic + * 2 - head + * 4 - chest + * 8 - stomach + * 16 - left arm + * 32 - right arm + * 64 - left leg + * 128 - right leg + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_hitzones(index = 0, target = 0, body = 255); + +/** + * Gets the set of hit zone "rules" between @index and @target players. + * + * @note For the body part bitsum take a look at the set_user_hitzones() native. + * + * @param index Client index + * @param target The target player + * + * @return The bitsum of @target's body parts @index is able to hit + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_hitzones(index, target); + +/** + * Sets player's maximum movement speed. + * + * @param index Client index + * @param speed The maximum speed player will be able to run at + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_maxspeed(index, Float:speed = -1.0); + +/** + * Gets player's maximum movement speed. + * + * @param index Client index + * + * @return Player's maximum movement speed + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native Float:get_user_maxspeed(index); + +/** + * Sets player's gravity. + * + * @param index Client index + * @param gravity Gravity value to set, 1.0 being normal gravity (800) + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_gravity(index, Float:gravity = 1.0); + +/** + * Gets player's gravity. + * + * @param index Client index + * + * @return Player's gravity value, 1.0 being normal gravity (800) + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native Float:get_user_gravity(index); + +/** + * Spawns an entity. + * + * @param index Entity index + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native spawn(index); + +/** + * Enables or disables player's noclip. + * + * @param index Client index + * @param noclip 1 to enable noclip, 0 to disable + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_noclip(index, noclip = 0); + +/** + * Gets whether a player has noclip enabled or not. + * + * @param index Client index + * + * @return 1 if noclip is enabled, 0 if disabled + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_noclip(index); + +/** + * Tells whether a player has silent footsteps enabled. + * + * @param index Client index + * + * @return 1 if silent footsteps are enabled, 0 if not + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_footsteps(index); + +/** + * Enables or disables player's silent footsteps. + * + * @param index Client index + * @param set 1 if player should have silent footsteps, 0 otherwise + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_footsteps(id, set = 1); + +/** + * Strips all weapons from a player, including their knife. + * + * @param index Client index + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native strip_user_weapons(index); + +/** + * Sets player's frags amount. + * + * @param index Client index + * @param frags The amount of frags to set + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_frags(index, frags); diff --git a/plugins/include/lang.inc b/plugins/include/lang.inc index 1bf1ebc7..247a6004 100755 --- a/plugins/include/lang.inc +++ b/plugins/include/lang.inc @@ -16,19 +16,43 @@ #endif #define _lang_included -//return the number of languages loaded +/** + * Returns the number of languages loaded. + * + * @return Number of languages loaded. + */ native get_langsnum(); -//sets name to the two-letter name of a language returned by get_langsnum -//index starts at 0 +/** + * Returns the two-letter name of a language returned by get_langsnum() + * + * @param id Language index, starting at 0 + * @param name Buffer to store the name in + * + * @noreturn + */ native get_lang(id, name[3]); -//registers a dictionary file, making sure the words are in the dictionary -// the file should be in "addons/amxx/data/lang/", but only the name needs to be -// given. (e.g. register_dictionary("file.txt") will be addons/amxx/data/file.txt). +/** + * Registers a dictionary file, making sure the words are in the dictionary. + * + * @note The file should be in "addons/amxmodx/data/lang", but only the name + * needs to be given. For example, register_dictionary("file.txt") will + * be "addons/amxmodx/data/lang/file.txt". + * + * @param filename Dictionary file name + * + * @return On success, the function will return 1, otherwise it will + * return 0 if the file couldn't be found or opened, and -1 if + * the dictionary was already registered by a plugin + */ native register_dictionary(const filename[]); -//returns 1 if the language is loaded, 0 otherwise. +/** + * Checks if the language is loaded. + * + * @return 1 if it is, 0 otherwise + */ native lang_exists(const name[]); enum TransKey @@ -37,35 +61,55 @@ enum TransKey }; /** - * Adds or finds a translation key. + * Creates a new or finds an existing translation key. + * + * @param key Key to create or find + * + * @return Key index */ native TransKey:CreateLangKey(const key[]); - + /** - * Finds a translation key id without adding on failure. - * Returns -1 on not found. + * Finds a translation key index without adding on failure. + * + * @param key Key to search for + * + * @return Key index, or -1 if not found */ native TransKey:GetLangTransKey(const key[]); - + /** - * Adds a translation. + * Adds a new translation. + * + * @param lang Two-letter language name + * @param key Language key + * @param phrase Translated text + * + * @noreturn */ native AddTranslation(const lang[3], TransKey:key, const phrase[]); /** - * Looks up the translation of the key for the given type - * This does NOT format the output text. - * eg: If the key includes %s, the outputted text will also contain %s. - * NOTE: LANG_PLAYER is invalid in this, use a player index - * or LANG_SERVER + * Looks up the translation of the key for the given type. + * + * @note This does NOT format the output text! For example, if the key + * contains %s, the outputted text will also contain %s. + * @note LANG_PLAYER is invalid in this, use a player index or LANG_SERVER. + * + * @param Output Buffer to store the output in + * @param OutputSize Maximum buffer size + * @param Key Language key + * @param id Client index or LANG_SERVER + * + * @return 1 on success, 0 otherwise */ native LookupLangKey(Output[], OutputSize, const Key[], &id); /** - * Sets the global language target. + * Sets the global language target. * * @note This is useful for creating functions - * that will be compatible with the %l format specifier. Note that invalid + * that will be compatible with the %l format specifier. Note that invalid * indexes can be specified but the error will occur during translation, * not during this function call. * diff --git a/plugins/include/time.inc b/plugins/include/time.inc index a70cf9d8..34b91f65 100644 --- a/plugins/include/time.inc +++ b/plugins/include/time.inc @@ -26,23 +26,27 @@ enum timeunit_weeks, }; -// seconds are in each time unit +/* Seconds in each time unit */ #define SECONDS_IN_MINUTE 60 #define SECONDS_IN_HOUR 3600 #define SECONDS_IN_DAY 86400 #define SECONDS_IN_WEEK 604800 -/* Stock by Brad */ +/** + * Stock by Brad. + * + * @note You must add register_dictionary("time.txt") in plugin_init() + * + * @param id The player whose language the length should be translated to + * @param unitCnt The number of time units you want translated into verbose text + * @param type The type of unit (i.e. seconds, minutes, hours, days, weeks) that you are passing in + * @param output The variable you want the verbose text to be placed in + * @param outputLen The length of the output variable + * + * @noreturn + */ stock get_time_length(id, unitCnt, type, output[], outputLen) { -// IMPORTANT: You must add register_dictionary("time.txt") in plugin_init() - -// id: The player whose language the length should be translated to (or 0 for server language). -// unitCnt: The number of time units you want translated into verbose text. -// type: The type of unit (i.e. seconds, minutes, hours, days, weeks) that you are passing in. -// output: The variable you want the verbose text to be placed in. -// outputLen: The length of the output variable. - if (unitCnt > 0) { // determine the number of each time unit there are @@ -74,23 +78,23 @@ stock get_time_length(id, unitCnt, type, output[], outputLen) new timeElement[5][33]; if (weekCnt > 0) - format(timeElement[++maxElementIdx], 32, "%i %L", weekCnt, id, (weekCnt == 1) ? "TIME_ELEMENT_WEEK" : "TIME_ELEMENT_WEEKS"); + format(timeElement[++maxElementIdx], charsmax(timeElement[]), "%i %L", weekCnt, id, (weekCnt == 1) ? "TIME_ELEMENT_WEEK" : "TIME_ELEMENT_WEEKS"); if (dayCnt > 0) - format(timeElement[++maxElementIdx], 32, "%i %L", dayCnt, id, (dayCnt == 1) ? "TIME_ELEMENT_DAY" : "TIME_ELEMENT_DAYS"); + format(timeElement[++maxElementIdx], charsmax(timeElement[]), "%i %L", dayCnt, id, (dayCnt == 1) ? "TIME_ELEMENT_DAY" : "TIME_ELEMENT_DAYS"); if (hourCnt > 0) - format(timeElement[++maxElementIdx], 32, "%i %L", hourCnt, id, (hourCnt == 1) ? "TIME_ELEMENT_HOUR" : "TIME_ELEMENT_HOURS"); + format(timeElement[++maxElementIdx], charsmax(timeElement[]), "%i %L", hourCnt, id, (hourCnt == 1) ? "TIME_ELEMENT_HOUR" : "TIME_ELEMENT_HOURS"); if (minuteCnt > 0) - format(timeElement[++maxElementIdx], 32, "%i %L", minuteCnt, id, (minuteCnt == 1) ? "TIME_ELEMENT_MINUTE" : "TIME_ELEMENT_MINUTES"); + format(timeElement[++maxElementIdx], charsmax(timeElement[]), "%i %L", minuteCnt, id, (minuteCnt == 1) ? "TIME_ELEMENT_MINUTE" : "TIME_ELEMENT_MINUTES"); if (secondCnt > 0) - format(timeElement[++maxElementIdx], 32, "%i %L", secondCnt, id, (secondCnt == 1) ? "TIME_ELEMENT_SECOND" : "TIME_ELEMENT_SECONDS"); + format(timeElement[++maxElementIdx], charsmax(timeElement[]), "%i %L", secondCnt, id, (secondCnt == 1) ? "TIME_ELEMENT_SECOND" : "TIME_ELEMENT_SECONDS"); switch(maxElementIdx) { - case 0: format(output, outputLen, "%s", timeElement[0]); - case 1: format(output, outputLen, "%s %L %s", timeElement[0], id, "TIME_ELEMENT_AND", timeElement[1]); - case 2: format(output, outputLen, "%s, %s %L %s", timeElement[0], timeElement[1], id, "TIME_ELEMENT_AND", timeElement[2]); - case 3: format(output, outputLen, "%s, %s, %s %L %s", timeElement[0], timeElement[1], timeElement[2], id, "TIME_ELEMENT_AND", timeElement[3]); - case 4: format(output, outputLen, "%s, %s, %s, %s %L %s", timeElement[0], timeElement[1], timeElement[2], timeElement[3], id, "TIME_ELEMENT_AND", timeElement[4]); + case 0: formatex(output, outputLen, "%s", timeElement[0]); + case 1: formatex(output, outputLen, "%s %L %s", timeElement[0], id, "TIME_ELEMENT_AND", timeElement[1]); + case 2: formatex(output, outputLen, "%s, %s %L %s", timeElement[0], timeElement[1], id, "TIME_ELEMENT_AND", timeElement[2]); + case 3: formatex(output, outputLen, "%s, %s, %s %L %s", timeElement[0], timeElement[1], timeElement[2], id, "TIME_ELEMENT_AND", timeElement[3]); + case 4: formatex(output, outputLen, "%s, %s, %s, %s %L %s", timeElement[0], timeElement[1], timeElement[2], timeElement[3], id, "TIME_ELEMENT_AND", timeElement[4]); } } } From a87eb50441ccfc14cb4200b031ae82fab9392bcc Mon Sep 17 00:00:00 2001 From: Cleverson <SmileYzn@users.noreply.github.com> Date: Wed, 11 Jul 2018 19:09:23 -0300 Subject: [PATCH 09/98] Fix missing register_event() reference on event_enable/disable descriptions (#491) Lack register_event() on enable_event and disable_event descriptions --- plugins/include/amxmodx.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index f99b2089..94a51abb 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -587,7 +587,7 @@ native register_event_ex(const event[], const function[], RegisterEventFlags:fla /** * Enables a function hook of a game event which has been previously registered with register_event_ex(). * - * @param handle Value returned from register_event_ex() + * @param handle Value returned from register_event() or register_event_ex() * * @noreturn * @error If an invalid handle is provided, an error will be thrown. @@ -597,7 +597,7 @@ native enable_event(handle); /** * Disables a function hook of a game event which has been previously registered with register_event_ex(). * - * @param handle Value returned from register_event_ex() + * @param handle Value returned from register_event() or register_event_ex() * * @noreturn * @error If an invalid handle is provided, an error will be thrown. From 92ebb6ef056cc824a41280a15b68314bad25a20f Mon Sep 17 00:00:00 2001 From: voed <iwmyc@ex.ua> Date: Thu, 12 Jul 2018 11:17:49 +0300 Subject: [PATCH 10/98] Add link to API reference in README (#493) * Add link to API reference * Update README.md * Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ce981191..6a4af833 100644 --- a/README.md +++ b/README.md @@ -15,4 +15,5 @@ Development ----------- - [Issue tracker](https://bugs.alliedmods.net): Issues that require back and forth communication - [Building AMXX](https://wiki.alliedmods.net/Building_AMX_Mod_X): Instructions on how to build AMXX itself using [AMBuild](https://github.com/alliedmodders/ambuild) +- [AMX Mod X API](https://amxmodx.org/api/): AMX Mod X API reference generated from include files - [AMXX scripting](https://wiki.alliedmods.net/Category:Scripting_(AMX_Mod_X)): Pawn examples and introduction to the language From afbb3b88d77281f8818541ec72671d21629ec237 Mon Sep 17 00:00:00 2001 From: regener <dtomi24@hotmail.com> Date: Thu, 12 Jul 2018 14:40:48 +0200 Subject: [PATCH 11/98] Further Hungarian translation update (#494) * Hungarian language update The important parts have been updated* and the missing parts added according to my best knowledge. *admincmd.txr was UTF8 instead of UTF8 without BOM, I'm not sure it was a mistake or not. * Further Hungarian translation update Further grammar and typo fixes in Hungarian translation. SERVER_PROC - Unused in admincmd.sma and .txt too. --- plugins/lang/adminchat.txt | 6 +++--- plugins/lang/admincmd.txt | 27 +++++++++++++-------------- plugins/lang/adminvote.txt | 6 +++--- plugins/lang/common.txt | 4 ++-- plugins/lang/mapchooser.txt | 4 ++-- plugins/lang/miscstats.txt | 12 ++++++------ plugins/lang/multilingual.txt | 4 ++-- plugins/lang/pausecfg.txt | 12 ++++++------ plugins/lang/scrollmsg.txt | 4 ++-- plugins/lang/statscfg.txt | 18 +++++++++--------- plugins/lang/statsx.txt | 6 +++--- 11 files changed, 51 insertions(+), 52 deletions(-) diff --git a/plugins/lang/adminchat.txt b/plugins/lang/adminchat.txt index 088e1d70..dd13690d 100755 --- a/plugins/lang/adminchat.txt +++ b/plugins/lang/adminchat.txt @@ -198,10 +198,10 @@ COL_WHITE = fehér COL_RED = piros COL_GREEN = zöld COL_BLUE = kék -COL_YELLOW = csárga +COL_YELLOW = citrom COL_MAGENTA = magenta -COL_CYAN = cyan -COL_ORANGE = nsárga +COL_CYAN = cián +COL_ORANGE = narancs COL_OCEAN = óceán COL_MAROON = barna PRINT_ALL = (MIND) %s : %s diff --git a/plugins/lang/admincmd.txt b/plugins/lang/admincmd.txt index 796c94b6..fa2c4186 100755 --- a/plugins/lang/admincmd.txt +++ b/plugins/lang/admincmd.txt @@ -1127,7 +1127,7 @@ MAP_EXTENDED = Harta "%s" a fost extinsa pentru %d minute [hu] ADMIN_KICK_1 = ADMIN: %s kirúgva ADMIN_KICK_2 = ADMIN %s: %s kirúgva -IP_REMOVED = Ip "%s" eltávolítva a ban-listárol +IP_REMOVED = IP "%s" eltávolítva a ban-listárol AUTHID_REMOVED = Authid "%s" eltávolítva a ban-listáról ADMIN_UNBAN_1 = ADMIN: %s ban visszavonva ADMIN_UNBAN_2 = ADMIN %s: %s ban visszavonva @@ -1137,17 +1137,17 @@ BANNED = Bannolva REASON = Indok FOR_MIN = %s percre PERM = örökre -CLIENT_BANNED = felhasználó "%s" banolva +CLIENT_BANNED = felhasználó "%s" bannolva ADMIN_SLAY_1 = ADMIN: %s megölve ADMIN_SLAY_2 = ADMIN %s: %s megölve -CLIENT_SLAYED = Client "%s" megölve +CLIENT_SLAYED = "%s" játékos megölve ADMIN_SLAP_1 = ADMIN: %s megütve %d sebzéssel ADMIN_SLAP_2 = ADMIN %s: megütve %s %d sebzéssel -CLIENT_SLAPED = Client "%s" megütve %d sebzéssel +CLIENT_SLAPED = "%s" játékos megütve %d sebzéssel MAP_NOT_FOUND = Nem található ilyen nevű pálya ADMIN_MAP_1 = ADMIN: pályaváltás %s ADMIN_MAP_2 = ADMIN %s: pályaváltás %s -NO_MORE_CVARS = Nem lehet több cvart hozzáadni az rcon hozzáféreshez! +NO_MORE_CVARS = Nem lehet több cvart hozzáadni az rcon hozzáféréshez! UNKNOWN_CVAR = Ismeretlen cvar: %s UNKNOWN_XVAR = Ismeretlen xvar: %s CVAR_NO_ACC = Nincs engedélyed a cvar-hoz @@ -1155,8 +1155,8 @@ XVAR_NO_ACC = Nincs engedélyed a xvar-hoz CVAR_IS = Cvar "%s" jelenleg "%s" XVAR_IS = Xvar "%s" jelenleg "%s" PROTECTED = Védett -SET_CVAR_TO = %s beállítva cvar %s to "%s" -SET_XVAR_TO = %s beállítva xvar %s to "%s" +SET_CVAR_TO = %s beállítva cvar %s -> "%s" +SET_XVAR_TO = %s beállítva xvar %s -> "%s" CVAR_CHANGED = Cvar "%s" átállítva "%s"-ra. XVAR_CHANGED = Xvar "%s" átállítva "%s"-ra. LOADED_PLUGINS = Jelenleg betöltött pluginok @@ -1167,19 +1167,18 @@ FILE = fájl STATUS = Státusz PLUGINS_RUN = %d plugin összesen, %d fut LOADED_MODULES = Jelenleg betöltött modulok -NUM_MODULES = %d mod +NUM_MODULES = %d modul FILE_NOT_FOUND = Fájl "%s" nem talalható ADMIN_CONF_1 = ADMIN: config végrehajtása %s ADMIN_CONF_2 = ADMIN %s: config végrehajtása %s PAUSED = Szüneteltetve UNPAUSED = Elindítva -UNABLE_PAUSE = A szerveren nem lehet megállítani a játékot. Valódi játékosok kellenek. -SERVER_PROC = Server proceed %s +UNABLE_PAUSE = A szerver nem tudja megállítani a játékot. Valódi játékosok kellenek. PAUSING = Szüneteltetés UNPAUSING = Szüneteltetés vége PAUSE = Szünet UNPAUSE = Szünet vége -COM_SENT_SERVER = Parancssor "%s" elküldve a szerver konzolba +COM_SENT_SERVER = Parancs "%s" elküldve a szerver konzolba CLIENTS_ON_SERVER = Játékosok a szerveren IMMU = imm RESERV = res @@ -1190,11 +1189,11 @@ SKIP_IMM = "%s" Kihagyása (immunitás) KICK_PL = Kirúg "%s" YOU_DROPPED = Le lettél csatlakoztatva, mert az admin csak bizonyos csapat tagjait hagyta fent KICKED_CLIENTS = kirúgva %d felhasználó -ADMIN_LEAVE_1 = ADMIN: leave %s %s %s %s -ADMIN_LEAVE_2 = ADMIN %s: leave %s %s %s %s +ADMIN_LEAVE_1 = ADMIN: ledobta %s %s %s %s +ADMIN_LEAVE_2 = ADMIN %s: ledobta %s %s %s %s ADMIN_NICK_1 = ADMIN: névváltás %s-ról "%s"-ra ADMIN_NICK_2 = ADMIN %s: nevváltás %s-ról "%s"ra -CHANGED_NICK = Névvaltás %s-ról "%s"ra +CHANGED_NICK = Névváltás %s-ról "%s"ra ADMIN_EXTEND_1 = ADMIN: Páya hosszabbítása %d perccel ADMIN_EXTEND_2 = ADMIN %s: Páya hosszabbítása %d perccel MAP_EXTENDED = %s pálya meghosszabbítva %d perccel diff --git a/plugins/lang/adminvote.txt b/plugins/lang/adminvote.txt index ae213d8c..6cf967e1 100755 --- a/plugins/lang/adminvote.txt +++ b/plugins/lang/adminvote.txt @@ -535,10 +535,10 @@ ADMIN_VOTE_MAP_1 = %s: Pálya szavazás ADMIN_VOTE_MAP_2 = %s %s: Pálya szavazás VOTING_STARTED = Szavazás indítva... VOTING_FORBIDDEN = A szavazás letiltva. -ADMIN_VOTE_CUS_1 = %s: szavazás custom -ADMIN_VOTE_CUS_2 = %s %s: szavazás custom +ADMIN_VOTE_CUS_1 = %s: egyedi szavazás +ADMIN_VOTE_CUS_2 = %s %s: egyedi szavazás VOTE = Szavazás -ACTION_PERFORMED = A műveletet nem lehet "%s"-boton végrehajtani +ACTION_PERFORMED = A műveletet nem lehet "%s" boton végrehajtani ADMIN_VOTE_FOR_1 = %s: szavazás %s vagy %s ADMIN_VOTE_FOR_2 = %s %s: szavazás %s vagy %s diff --git a/plugins/lang/common.txt b/plugins/lang/common.txt index eda3c15b..03f6c60a 100755 --- a/plugins/lang/common.txt +++ b/plugins/lang/common.txt @@ -345,8 +345,8 @@ USAGE = Használat MORE_CL_MATCHT = Több játékosra is egyezik a megadott feltétel CL_NOT_FOUND = Nincs ilyen nevű játékos CLIENT_IMM = "%s" immunitás joggal rendelkezik -CANT_PERF_DEAD = Ezt a műveletet nem hajthatod végre "%s"-on mert halott -CANT_PERF_BOT = Ezt a műveletet nem hajthatod végre "%s"-on mert bot +CANT_PERF_DEAD = Ezt a műveletet nem hajthatod végre "%s" játékoson mert halott +CANT_PERF_BOT = Ezt a műveletet nem hajthatod végre "%s" játékoson mert bot ON = BE OFF = KI diff --git a/plugins/lang/mapchooser.txt b/plugins/lang/mapchooser.txt index 0d6a4a54..9c66acdf 100755 --- a/plugins/lang/mapchooser.txt +++ b/plugins/lang/mapchooser.txt @@ -137,9 +137,9 @@ TIME_CHOOSE = E timpul sa alegeti harta urmatoare... CHO_FIN_EXT = A választás véget ért. A mostani pálya még %.0f percig lesz. CHO_FIN_NEXT = A választás véget ért. A következő pálya a %s lesz. CHOSE_EXT = %s még maradni szeretne -X_CHOSE_X = %s a %s-ra szavazott +X_CHOSE_X = %s a %s pályára szavazott CHOOSE_NEXTM = Válaszd ki a következő pályát. -EXTED_MAP = Maradjunk a %s-n! +EXTED_MAP = Maradjunk a %s pályán! TIME_CHOOSE = Itt az idő hogy kiválaszd a következő pályát. [lt] diff --git a/plugins/lang/miscstats.txt b/plugins/lang/miscstats.txt index d0e56092..78bfed00 100755 --- a/plugins/lang/miscstats.txt +++ b/plugins/lang/miscstats.txt @@ -704,7 +704,7 @@ KILLS = Ucideri HS = hs [hu] -WITH = with +WITH = eddig KNIFE_MSG_1 = %s felvágta %s-t! KNIFE_MSG_2 = %s szétszabta %s-t! KNIFE_MSG_3 = %s felnyársalta %s-t! @@ -712,7 +712,7 @@ KNIFE_MSG_4 = %s megkéselte %s-t! LAST_MSG_1 = Mostmár minden rajtad múlik! LAST_MSG_2 = Remélem van nálad életcsomag! LAST_MSG_3 = Már csak te maradtál. Hajrá! -LAST_MSG_4 = A csapatod elveszett... +LAST_MSG_4 = Egyedül maradtál. Sok sikert! HE_MSG_1 = %s megajándékozta %s egy gránáttal HE_MSG_2 = %s felrobbantotta %s-t HE_MSG_3 = %s kirobbantotta %s-t @@ -724,13 +724,13 @@ SHE_MSG_4 = %s Felrobbant! HS_MSG_1 = $kn megölte $vn t egy fejlövéssel! HS_MSG_2 = $kn eltávolíttotta $vn fejét^naz $wn-vel. HS_MSG_3 = $kn hullócsillagot csinált $vn fejéből egy $wn-vel -HS_MSG_4 = $vn orbalőtte $kn-t +HS_MSG_4 = $kn orbalőtte $vn-t HS_MSG_5 = $vn feje földkörüli pályára állt. HS_MSG_6 = $kn segítségével $wn feje már a csillagok között tündökölhet... -HS_MSG_7 = Miaz? Talán egy repölő? Dehogy... Csak $vn-feje +HS_MSG_7 = Miaz? Talán egy repülő? Dehogy... Csak $vn-feje DOUBLE_KILL = Wow! %s: Duplagyilok!!! -PREPARE_FIGHT = Készulj fel a harcra!^n%d. KÖR -KILLED_ROW = Egymás után %d ölés. +PREPARE_FIGHT = Készülj fel a harcra!^n%d. KÖR +KILLED_ROW = Egymás utáni %d ölés. DIED_ROUNDS = Óvatosan! Már %d körben meghaltál egymás után... KILLED_CHICKEN = Valaki megölt egy csirkét!!! BLEW_RADIO = Valaki felrobbantotta a rádiót!!! diff --git a/plugins/lang/multilingual.txt b/plugins/lang/multilingual.txt index 9d2a3a03..d1ab9b36 100755 --- a/plugins/lang/multilingual.txt +++ b/plugins/lang/multilingual.txt @@ -169,8 +169,8 @@ PERSO_LANG = Személyi nyelv LANG_MENU = Nyelv menü SERVER_LANG = Szerver nyelv SAVE_LANG = Nyelv mentése -SET_LANG_SERVER = A szerver nyelve "%s"-ra lett állítva. -SET_LANG_USER = A nyelved "%s"-ra lett állítva. +SET_LANG_SERVER = A szerver nyelve mostantól: "%s". +SET_LANG_USER = A nyelved mostantól: "%s". TYPE_LANGMENU = Írj 'amx_langmenu'-t a konzolba hogy nyelvet választhass. LANG_MENU_DISABLED = Nyelv menü letiltva. diff --git a/plugins/lang/pausecfg.txt b/plugins/lang/pausecfg.txt index 94183a90..da49c978 100755 --- a/plugins/lang/pausecfg.txt +++ b/plugins/lang/pausecfg.txt @@ -596,15 +596,15 @@ PAUSE_ALR_CLEARED = A beállítások már ki vannak ürítve! PAUSE_CONF_SAVED = Beállítások sikeresen elmentve PAUSE_SAVE_FAILED = Nem sikerült a mentés!!! LOCKED = LEZARVA -PAUSE_UNPAUSE = Ki/Be kapcsolás Pluginok +PAUSE_UNPAUSE = Pluginok Ki-/Bekapcsolása CLEAR_STOPPED = A leállított pluginok fájljának ürítése -SAVE_STOPPED = Megállítottak mentése +SAVE_STOPPED = Leállítottak mentése PAUSED_PLUGIN = Leállítva %d plugin PAUSED_PLUGINS = Leállítva %d plugin UNPAUSED_PLUGIN = Engedélyezve %d plugin UNPAUSED_PLUGINS = Engedélyezve %d plugin CANT_MARK_MORE = Nem lehet már több plugint megállítani! -PAUSE_LOADED = Pause Plugins: Loaded plugins +PAUSE_LOADED = Pluginok szüneteltetése: Betöltött pluginok STOPPED = leállítva VERSION = verzió FILE = fájl @@ -613,7 +613,7 @@ PAUSE_USE_MORE = Írj 'amx_pausecfg list %d' a többihez PAUSE_USE_BEGIN = Írj 'amx_pausecfg list 1' az elejéhez PAUSE_USAGE = Használat: amx_pausecfg <parancs> [név] PAUSE_COMMANDS = Parancsok -COM_PAUSE_OFF = ^tki - minden plugin leállítása a listán +COM_PAUSE_OFF = ^tki - minden plugin szüneteltetése a listán COM_PAUSE_ON = ^tbe - összes plugin engedélyezése COM_PAUSE_STOP = ^tstop <file> - plugin megállítása COM_PAUSE_PAUSE = ^tpause <file> - kikapcsolt pluginok @@ -622,11 +622,11 @@ COM_PAUSE_SAVE = ^tsave - lista mentése a leállított pluginokkal COM_PAUSE_CLEAR = ^tclear - a megállított pluginok listájának kiürítése COM_PAUSE_LIST = ^tlist [id] - pluginok listája COM_PAUSE_ADD = ^tadd <nev> - megjelölni a plugint megallíthatóként -SAVE_PAUSED = Mentés Szünetelve +SAVE_PAUSED = Szüneteltetettek mentése COM_PAUSE_SAVE_PAUSED = ^tsave - menti a szünetelt pluginok listáját COM_PAUSE_CLEAR_PAUSED = ^tclear - törli a szünetelt pluginok listáját CANT_UNPAUSE_PLUGIN = A "%s" plugint nemlehet szüneteltetni vagy engedályezni. -CLEAR_PAUSED = Törli a szünetelt pluginok listáját +CLEAR_PAUSED = Törli a szüneteltetett pluginok listáját [lt] PAUSE_COULDNT_FIND = Negali surasti plugino "%s" diff --git a/plugins/lang/scrollmsg.txt b/plugins/lang/scrollmsg.txt index eb7cec2c..120615c7 100755 --- a/plugins/lang/scrollmsg.txt +++ b/plugins/lang/scrollmsg.txt @@ -74,9 +74,9 @@ MSG_FREQ = Frecventa afisarii messajului Rulant: %d:%02d minute MSG_DISABLED = Mesajul Rulant dezactivat [hu] -MIN_FREQ = A minimum idő erre az üzenetre %d perc +MIN_FREQ = A minimum idő erre az üzenetre %d másodperc MSG_FREQ = Mozgó üzenet: %d:%02d percenként -MSG_DISABLED = A gördülő üzenet letiltva +MSG_DISABLED = A gördülő üzenet kikapcsolva [lt] MIN_FREQ = Minimalus daznumas siai zinutei yra %d sekundes diff --git a/plugins/lang/statscfg.txt b/plugins/lang/statscfg.txt index f6f88e36..3cba2697 100755 --- a/plugins/lang/statscfg.txt +++ b/plugins/lang/statscfg.txt @@ -1244,7 +1244,7 @@ ST_HE_KILL_SOUND = Grenade Kill Sound ST_HE_SUICIDE_SOUND = Grenade Suicide Sound [hu] -NO_OPTION = Nem található Funkció a megadott névvel (név "%s") +NO_OPTION = Nem található opció a megadott névvel (név "%s") STATS_CONF_SAVED = Beállitások sikeresen mentve STATS_CONF_FAILED = Nem sikerült a mentés!!! STATS_CONF_LOADED = Beállítások sikeresen betöltve @@ -1253,17 +1253,17 @@ STATS_CONF = Statisztika beállítások STATS_ENTRIES_OF = Bejegyzések %i - %i a %i -ból/-ből STATS_USE_MORE = Írj 'amx_statscfg list %i' a többihez STATS_USE_BEGIN = Írj 'amx_statscfg list 1' az elsőhoz -STATS_ENABLED = Stats engedélyezve -STATS_DISABLED = Stats letiltva -CANT_ADD_STATS = Nem lehet tobb statot hozzáadni, limit elérve! -COM_STATS_USAGE = Használat: amx_statscfg <command> [parameters] ... +STATS_ENABLED = Statisztika engedélyezve +STATS_DISABLED = Statisztika letiltva +CANT_ADD_STATS = Nem lehet több statot hozzáadni, limit elérve! +COM_STATS_USAGE = Használat: amx_statscfg <parancs> [paraméterek] ... COM_STATS_COM = Parancsok: -COM_STATS_ON = ^ton <variable> - enable specified option -COM_STATS_OFF = ^toff <variable> - disable specified option +COM_STATS_ON = ^ton <változó> - megadott opció engedélyezése +COM_STATS_OFF = ^toff <változó> - megadott opció tiltása COM_STATS_SAVE = ^tsave - beállítások mentése COM_STATS_LOAD = ^tload - beállítások betöltése -COM_STATS_LIST = ^tlist [id] - list stats status -COM_STATS_ADD = ^tadd <name> <variable> - add stats to the list +COM_STATS_LIST = ^tlist [id] - statisztika státusz listázása +COM_STATS_ADD = ^tadd <név> <változó> - statisztika a listához adása NO_STATS = Statisztika pluginok^nnincsenek telepítve ezen a szerveren^n SAVE_CONF = Beállítások mentése ST_MULTI_KILL = MultiKill diff --git a/plugins/lang/statsx.txt b/plugins/lang/statsx.txt index 774d2044..f41a28cf 100755 --- a/plugins/lang/statsx.txt +++ b/plugins/lang/statsx.txt @@ -780,7 +780,7 @@ DMG = sebzés VICTIMS = Áldozatok MOST_DMG = Legtöbb sebzés: KILLED_YOU_DIST = %s megölt téged %s^n %0.2f méterről. -DID_DMG_HITS = O %d -t sebzett rajtad ^n találattal és maradt neki %dhp és %dap-ja. +DID_DMG_HITS = Ő %d -t sebzett rajtad ^n találattal és maradt neki %d hp és %d ap. YOU_DID_DMG = Te %d sebeztél rajta %d találattal. EFF = Hatékonyság BEST_SCORE = Legjobb pont @@ -788,7 +788,7 @@ KILL_S = Ölés TOTAL = Totál SHOT_S = Lövések HITS_YOU_IN = %s eltalált téged -KILLED_BY_WITH = Megölt %s, %s-el %0.0fméterrol +KILLED_BY_WITH = Megölt %s, %s-el %0.0fméterről NO_HITS = nincs találat YOU_NO_KILLER = Nincs gyilkosod... YOU_HIT = Eltaláltad %s %d alkalommal, %d összes sebzés rajta @@ -807,7 +807,7 @@ AMMO = töltény HEALTH = élet ARMOR = páncél GAME_SCORE = Játék pont -STATS_ANNOUNCE = Neked van %s stats announcements +STATS_ANNOUNCE = Statisztika bejelentések %s ENABLED = engedélyezve DISABLED = letiltva SERVER_STATS = Szerver státusz From 975d8778005842efb0a2729f09017c359176f58d Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 13 Jul 2018 12:18:16 +0200 Subject: [PATCH 12/98] Fix typos in few localinfo identifiers for the AMXX config directory retrieval (#496) --- amxmodx/CoreConfig.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/amxmodx/CoreConfig.cpp b/amxmodx/CoreConfig.cpp index 8c9fe9a1..ede4048d 100644 --- a/amxmodx/CoreConfig.cpp +++ b/amxmodx/CoreConfig.cpp @@ -53,7 +53,7 @@ void CoreConfig::ExecuteMainConfig() char path[PLATFORM_MAX_PATH]; char command[PLATFORM_MAX_PATH + sizeof(CommandFormat)]; - ke::SafeSprintf(path, sizeof(path), "%s/%s/%s", g_mod_name.chars(), get_localinfo("amx_configdir", "addons/amxmodx/configs"), MainConfigFile); + ke::SafeSprintf(path, sizeof(path), "%s/%s/%s", g_mod_name.chars(), get_localinfo("amxx_configsdir", "addons/amxmodx/configs"), MainConfigFile); ke::SafeSprintf(command, sizeof(command), CommandFormat, path); SERVER_COMMAND(command); @@ -80,7 +80,7 @@ bool CoreConfig::ExecuteAutoConfig(CPluginMngr::CPlugin *plugin, AutoConfig *con { bool will_create = false; - const char *configsDir = get_localinfo("amx_configdir", "addons/amxmodx/configs"); + const char *configsDir = get_localinfo("amxx_configsdir", "addons/amxmodx/configs"); if (can_create && config->create) { @@ -254,7 +254,7 @@ bool CoreConfig::ExecuteAutoConfig(CPluginMngr::CPlugin *plugin, AutoConfig *con void CoreConfig::ExecuteMapConfig() { - const char *configsDir = get_localinfo("amx_configdir", "addons/amxmodx/configs"); + const char *configsDir = get_localinfo("amxx_configsdir", "addons/amxmodx/configs"); char cfgPath[PLATFORM_MAX_PATH]; char mapName[PLATFORM_MAX_PATH]; From 5f5d6f1d5d2dcf7a996d4e2a4bc49ae7c7029cc9 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 13 Jul 2018 16:23:03 +0200 Subject: [PATCH 13/98] Fix a buffer issue in RegisterHam (#495) * Fix a buffer issue in RegisterHam * AString classname as well --- modules/hamsandwich/hook.h | 2 +- modules/hamsandwich/hook_native.cpp | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/modules/hamsandwich/hook.h b/modules/hamsandwich/hook.h index 4024bdea..744d69be 100644 --- a/modules/hamsandwich/hook.h +++ b/modules/hamsandwich/hook.h @@ -39,7 +39,7 @@ public: char *ent; // ent name that's being hooked int trampSize; - Hook(void **vtable_, int entry_, void *target_, bool voidcall, bool retbuf, int paramcount, char *name) : + Hook(void **vtable_, int entry_, void *target_, bool voidcall, bool retbuf, int paramcount, const char *name) : func(NULL), vtable(vtable_), entry(entry_), target(target_), exec(0), del(0), tramp(NULL), trampSize(0) { // original function is vtable[entry] diff --git a/modules/hamsandwich/hook_native.cpp b/modules/hamsandwich/hook_native.cpp index 42a8ed87..c88c364f 100644 --- a/modules/hamsandwich/hook_native.cpp +++ b/modules/hamsandwich/hook_native.cpp @@ -534,21 +534,24 @@ static cell AMX_NATIVE_CALL RegisterHam(AMX *amx, cell *params) CHECK_FUNCTION(func); - char *function=MF_GetAmxString(amx, params[3], 0, NULL); - char *classname=MF_GetAmxString(amx, params[2], 1, NULL); - + // Fixes a buffer issue by copying locally the strings. + // REMOVE_ENTITY invokes pfnOnFreeEntPrivateData which plugins can hook and `function` and `classname` strings are used after that + // but it is pointing to the AMXX static buffer. Basically, hooking this forward and doing stuff inside could invalid all RegisterHam calls. + ke::AString function(MF_GetAmxString(amx, params[3], 0, NULL)); + ke::AString classname(MF_GetAmxString(amx, params[2], 1, NULL)); + // Check the entity // create an entity, assign it the gamedll's class, hook it and destroy it edict_t *Entity=CREATE_ENTITY(); - CALL_GAME_ENTITY(PLID,classname,&Entity->v); + CALL_GAME_ENTITY(PLID,classname.chars(),&Entity->v); if (Entity->pvPrivateData == NULL) { REMOVE_ENTITY(Entity); - MF_LogError(amx, AMX_ERR_NATIVE,"Failed to retrieve classtype for \"%s\", hook for \"%s\" not active.",classname,function); + MF_LogError(amx, AMX_ERR_NATIVE,"Failed to retrieve classtype for \"%s\", hook for \"%s\" not active.",classname.chars(),function.chars()); return 0; } @@ -558,18 +561,18 @@ static cell AMX_NATIVE_CALL RegisterHam(AMX *amx, cell *params) if (vtable == NULL) { - MF_LogError(amx, AMX_ERR_NATIVE,"Failed to retrieve vtable for \"%s\", hook for \"%s\" not active.",classname,function); + MF_LogError(amx, AMX_ERR_NATIVE,"Failed to retrieve vtable for \"%s\", hook for \"%s\" not active.",classname.chars(),function.chars()); return 0; } // Verify that the function is valid // Don't fail the plugin if this fails, just emit a normal error - int fwd=hooklist[func].makefunc(amx, function); + int fwd=hooklist[func].makefunc(amx, function.chars()); if (fwd == -1) { - MF_LogError(amx, AMX_ERR_NATIVE, "Function %s not found.", function); + MF_LogError(amx, AMX_ERR_NATIVE, "Function %s not found.", function.chars()); return 0; } @@ -586,9 +589,9 @@ static cell AMX_NATIVE_CALL RegisterHam(AMX *amx, cell *params) pfwd->AddRef(); // We've passed all tests... - if (strcmp(classname, "player") == 0 && enableSpecialBot) + if (strcmp(classname.chars(), "player") == 0 && enableSpecialBot) { - SpecialbotHandler.RegisterHamSpecialBot(amx, func, function, post, pfwd); + SpecialbotHandler.RegisterHamSpecialBot(amx, func, function.chars(), post, pfwd); } int **ivtable=(int **)vtable; @@ -615,7 +618,7 @@ static cell AMX_NATIVE_CALL RegisterHam(AMX *amx, cell *params) } // If we got here, the function is not hooked - Hook *hook = new Hook(vtable, hooklist[func].vtid, hooklist[func].targetfunc, hooklist[func].isvoid, hooklist[func].needsretbuf, hooklist[func].paramcount, classname); + Hook *hook = new Hook(vtable, hooklist[func].vtid, hooklist[func].targetfunc, hooklist[func].isvoid, hooklist[func].needsretbuf, hooklist[func].paramcount, classname.chars()); hooks[func].append(hook); if (post) From fba3d706fc7cc5a2b6b878bc7ae6ed344021225a Mon Sep 17 00:00:00 2001 From: Arkshine <github@arkshine.me> Date: Wed, 18 Jul 2018 14:39:53 +0200 Subject: [PATCH 14/98] Normalize EOL of few files changed in #489 --- plugins/include/file.inc | 1332 ++++++++++++++++++------------------- plugins/include/float.inc | 842 +++++++++++------------ plugins/include/fun.inc | 612 ++++++++--------- 3 files changed, 1393 insertions(+), 1393 deletions(-) diff --git a/plugins/include/file.inc b/plugins/include/file.inc index 9cae711f..55ee53ac 100755 --- a/plugins/include/file.inc +++ b/plugins/include/file.inc @@ -1,666 +1,666 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -// -// File Functions -// - -#if defined _file_included - #endinput -#endif -#define _file_included - -/** - * @note All paths in AMX Mod X natives are relative to the mod folder - * unless otherwise noted. - * - * Most functions in AMX Mod X (at least, ones that deal with direct - * file manipulation) will support an alternate path specification. - */ - -/** - * Maximum path length. - */ -#define PLATFORM_MAX_PATH 256 - -/** - * File inode types for use with open_dir() and next_file(). - */ -enum FileType -{ - FileType_Unknown, /* Unknown file type (device/socket) */ - FileType_Directory, /* File is a directory */ - FileType_File, /* File is a file */ -}; - -/** - * File time modes for use with GetFileTime(). - */ -enum FileTimeType -{ - FileTime_LastAccess, /* Last access (not available on FAT) */ - FileTime_Created, /* Creation (not available on FAT) */ - FileTime_LastChange, /* Last modification */ -}; - -/** - * File position modes for use with fseek(). - */ -#define SEEK_SET 0 /* Seek from start */ -#define SEEK_CUR 1 /* Seek from current position */ -#define SEEK_END 2 /* Seek from end position */ - -/** - * Options for use with file_size() flag parameter. - */ -#define FSOPT_BYTES_COUNT 0 /* Returns the file size in number of bytes */ -#define FSOPT_LINES_COUNT 1 /* Returns how many lines there are in this file */ -#define FSOPT_END_WITH_LF 2 /* Returns whether the last line is '\n' */ - -/** - * Data block modes for use with fread*() and fwrite*(). - */ -#define BLOCK_INT 4 -#define BLOCK_SHORT 2 -#define BLOCK_CHAR 1 -#define BLOCK_BYTE 1 - -/** - * File permissions flags for use with mkdir() and SetFilePermissions(). - */ -#define FPERM_U_READ 0x0100 /* User can read. */ -#define FPERM_U_WRITE 0x0080 /* User can write. */ -#define FPERM_U_EXEC 0x0040 /* User can exec. */ -#define FPERM_U_RWX FPERM_U_READ | FPERM_U_WRITE | FPERM_U_EXEC - -#define FPERM_G_READ 0x0020 /* Group can read. */ -#define FPERM_G_WRITE 0x0010 /* Group can write. */ -#define FPERM_G_EXEC 0x0008 /* Group can exec. */ -#define FPERM_G_RWX FPERM_G_READ | FPERM_G_WRITE | FPERM_G_EXEC - -#define FPERM_O_READ 0x0004 /* Anyone can read. */ -#define FPERM_O_WRITE 0x0002 /* Anyone can write. */ -#define FPERM_O_EXEC 0x0001 /* Anyone can exec. */ -#define FPERM_O_RWX FPERM_O_READ | FPERM_O_WRITE | FPERM_O_EXEC - -#define FPERM_DIR_DEFAULT FPERM_U_RWX | FPERM_G_RWX | FPERM_O_RWX /* rwx r-x r-x (0755) */ - - -/** - * Reads content from directory - * - * @note This native is expensive. Consider the use of open_dir(), next_file() and close_dir() instead. - * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. - * - * @param dirname Path to open - * @param pos Index the element - * @param output String buffer to hold content - * @param len Maximum size of string buffer - * @param outlen Number of characters written to the buffer - * - * @return Returns index of next element, otherwiwe 0 when end of dir is reached - */ -native read_dir(const dirname[], pos, output[], len, &outlen = 0); - -/** - * Reads line from file. - * - * @note This native is expensive. Consider the use of new file natives (fopen(), fgets(), etc.) - * if purpose is to read several lines of a file. - * - * @param file Path to open - * @param line Index of the line, starting to 0 - * @param text String buffer to hold line read - * @param len Maximum size of string buffer - * @param txtlen Number of characters written to the buffer - * - * @return Returns index of next line, otherwise 0 when end of file is reached - * @error Unable to read the file - */ -native read_file(const file[], line, text[], len, &txtlen = 0); - -/** - * Writes text to file. - * - * @note This native is expensive. Consider the use of new file natives (fopen(), fputs(), etc.) - * if purpose is to write several lines of a file. - * - * @param file Path to open - * @param text String to write to - * @param line Index of the line, starting to 0 - * If < 0, content will be appended - * - * @noreturn - * @error Unable to write [temporary] file - */ -native write_file(const file[], const text[], line = -1); - -/** - * Deletes a file. - * - * @param file Path of the file to delete - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to delete files existing in the Valve - * search path, rather than solely files existing directly - * in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. - * - * @return 1 on success, 0 on failure or if file not immediately removed. - */ -native delete_file(const file[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); - -/** - * Checks if a file exists. - * - * @param file Path to the file - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * - * @return 1 if the file exists, 0 otherwise - */ -native file_exists(const file[], bool:use_valve_fs = false); - -/** - * Renames a file. - * - * @param oldname New path to the file - * @param newname Path to the existing file - * @param relative If true, native will act like other natives which - * use the moddir as a base directory. Otherwise, the - * current directory is undefined (but assumed to be hlds). - * - * @return 1 on success, 0 otherwise - */ -native rename_file(const oldname[], const newname[], relative = 0); - -/** - * Checks if a directory exists. - * - * @param dir Path to the directory - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * - * @return 1 if the directory exists, 0 otherwise - */ -native dir_exists(const dir[], bool:use_valve_fs = false); - -/** - * Get the file size in bytes. - * - * @param file Path to the file - * @param flag Flag options, see FSOPT_* constants - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * If used, flag option is ignored. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths - * - * @return If flag is FSOPT_BYTES_COUNT or use_valve_fs to true, the file size in bytes - * If flag is FSOPT_LINES_COUNT, the number of lines in the file - * If flag is FSOPT_END_WITH_LF, 1 is returned if file ends with line feed - * If file doesn't exist, -1 - */ -native file_size(const file[], flag = FSOPT_BYTES_COUNT, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); - -/** - * Opens or creates a file, returning a file handle on success. File handles - * should be closed with fclose(). - * - * @note The open mode may be one of the following strings: - * "r": Open an existing file for reading. - * "w": Create a file for writing, or truncate (delete the contents of) an - * existing file and then open it for writing. - * "a": Create a file for writing, or open an existing file such that writes - * will be appended to the end. - * "r+": Open an existing file for both reading and writing. - * "w+": Create a file for reading and writing, or truncate an existing file - * and then open it for reading and writing. - * "a+": Create a file for both reading and writing, or open an existing file - * such that writes will be appended to the end. - * - * @note The open mode may also contain an additional character after "r", "w", or "a", - * but before any "+" sign. This character may be "b" (indicating binary mode) or - * "t" (indicating text mode). By default, "text" mode is implied. On Linux and - * Mac, this has no distinction from binary mode. On Windows, it causes the '\n' - * character (0xA) to be written as "\r\n" (0xD, 0xA). - * - * Example: "rb" opens a binary file for writing; "at" opens a text file for - * appending. - * - * @note Registered paths ID are (in priority order) : - * GAME All paths related to current mod, including fallback - * Depending settings, it includes: <gamedir>_lv/_addon/_<language>/_hd - * and <gamedir> itself - * GAMECONFIG The default writable directory (<gamedir>) - * GAMEDOWNLOAD The download directory (<gamedir>_download) - * GAME_FALLBACK All paths related to fallback game, same as GAME - * DEFAULTGAME All paths related to the default game which is "valve", same as GAME - * BASE The base path where server is installed - * - * Note that some paths are non-writable. It includes all <gamedir>_* (expect _download) - * and DEFAULTGAME. Any file inside a non-writable path will be ignored if you try to open - * it in writing mode. - * - * @param filename File to open - * @param mode Open mode - * @param use_valve_fs If true, the Valve file system will be used instead - * This can be used to finred files existing in valve - * search paths, rather than solely files existing directly - * in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths - * - * @return A file handle, or null if the file could not be opened. - */ -native fopen(const filename[], const mode[], bool:use_valve_fs = false, const valve_path_id[] = "GAME"); - -/** - * Closes a file handle. - * - * @param file File handle - */ -native fclose(file); - -/** - * Reads a single binary data from a file. - * - * @param file Handle to the file - * @param data Variable to store item read - * @param mode Size of each element, in bytes, to be read - * See BLOCK_* constants - * - * @return Number of elements read - */ -native fread(file, &any:data, mode); - -/** - * Reads binary data from a file. - * - * @param file Handle to the file - * @param data Array to store each item read - * @param blocks Number of items to read into the array - * @param mode Size of each element, in bytes, to be read - * Valid sizes are 1, 2, or 4. See BLOCK_* constants. - * - * @return Number of elements read - */ -native fread_blocks(file, any:data[], blocks, mode); - -/** - * Reads raw binary data from a file. - * - * @param file Handle to the file - * @param stream Array to store each item read - * @param blocksize Number of items to read into the array - * @param blocks Size of each element, in bytes. The data is read directly. - * That is, in 1 or 2-byte mode, the lower byte(s) in - * each cell are used directly, rather than performing - * any casts from a 4-byte number to a smaller number. - * - * @return Number of elements read - */ -native fread_raw(file, any:stream[], blocksize, blocks); - -/** - * Writes a single binary data to a file. - * - * @param file Handle to the file - * @param data Item to write - * @param mode Size of each item in the array in bytes - * Valid sizes are 1, 2, or 4. See BLOCK_* constants - * - * @return Number of elements written - */ -native fwrite(file, any:data, mode); - -/** - * Writes binary data to a file. - * - * @param file Handle to the file - * @param data Array of items to write - * @param blocks Number of items in the array - * @param mode Size of each item in the array in bytes - * Valid sizes are 1, 2, or 4. See BLOCK_* constants - * - * @return Number of elements written - */ -native fwrite_blocks(file, const any:data[], blocks, mode); - -/** - * Writes raw binary data to a file. - * - * @param file Handle to the file. - * @param stream Array of items to write. The data is written directly. - * That is, in 1 or 2-byte mode, the lower byte(s) in - * each cell are used directly, rather than performing - * any casts from a 4-byte number to a smaller number. - * @param blocks Size of each item in the array in bytes. - * @param mode Number of items in the array. - * - * @return Number of elements written - */ -native fwrite_raw(file, const any:stream[], blocks, mode); - -/** - * Tests if the end of file has been reached. - * - * @param file Handle to the file - * - * @return 1 if end of file has been reached, 0 otherwise. - */ -native feof(file); - -/** - * Reads a line from a text file. - * - * @param file Handle to the file. - * @param buffer String buffer to hold the line - * @param maxlength Maximum size of string buffer - * - * @return Total number of characters written on success, 0 otherwise - */ -native fgets(file, buffer[], maxlength); - -/** - * Writes a line of text to a text file. - * - * @param file Handle to the file - * @param text String to write - * @param null_term True to append NULL terminator, false otherwise - * - * @return 0 on success, -1 otherwise - */ -native fputs(file, const text[], bool:null_term = false); - -/** - * Writes a line of formatted text to a text file. - * - * @param file Handle to the file - * @param format Formatting rules - * @param ... Variable number of format parameters - * - * @return Total number of characters written on success, 0 otherwise - */ -native fprintf(file, const fmt[], any:...); - -/** - * Sets the file position indicator. - * - * @param file Handle to the file - * @param position Position relative to what is specified in whence - * @param start SEEK_ constant value of where to see from - * - * @return 0 on success, a non-zero value otherwise - */ -native fseek(file, position, start); - -/** - * Gets current position in the file. - * - * @param file Handle to the file - * - * @return Value for the file position indicator - */ -native ftell(file); - -/** - * Gets character from file. - * - * @param file Handle to the file - * - * @return Character read on success, -1 otherwise - */ -native fgetc(file); - -/** - * Writes character to file - * - * @param file Handle to the file - * @param data Character to put - * - * @return Character written on success, -1 otherwise - */ -native fputc(file, data); - -/** - * Ungets character from file. - * - * @param file Handle to the file - * @param data Character to unget - * - * @return On success, the character put back is returned, -1 otherwise - */ -native fungetc(file, data); - -/** - * Flushes a buffered output stream. - * - * @param file File handle, or 0 for all open streams - * - * @return 0 on success, -1 on failure - */ -native fflush(file); - -/** - * Gets the formatted file size in bytes. - * - * @param filename Path to the file - * @param ... Variable number of format parameters - * - * @return File size in bytes, otherwise -1 if file not found - */ -native filesize(const filename[], any:...); - -/** - * Removes a directory. - * - * @note On most Operating Systems you cannot remove a directory which has files inside it. - * - * @param path Path to the directory - * - * @return 1 on success, 0 otherwise - */ -native rmdir(const path[]); - -/** - * Creates a directory. - * - * @param path Path to create - * @param mode Permissions (default is o=rx,g=rx,u=rwx). Note that folders must have - * the execute bit set on Linux. On Windows, the mode is ignored. - * @param use_valve_fs If true, the Valve file system will be used instead - * This can be used to create folders in the game's - * Valve search paths, rather than directly in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for default - * In this case, mode is ignored - * - * @return 0 on success, -1 otherwise - */ -native mkdir(const dirname[], mode = FPERM_DIR_DEFAULT, bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); - -/** - * Deletes a file (delete_file macro) - * - * @param filename Path of the file to delete - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to delete files existing in the Valve - * search path, rather than solely files existing directly - * in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths - * - * @return 1 on success, 0 on failure or if file not immediately removed - */ -native unlink(const filename[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); - -/** - * Opens a directory/folder for contents enumeration. - * - * @note Directories are closed with close_dir(). - * - * @param dir Path to open. - * @param firstfile String buffer to hold first file name - * @param length Maximum size of the string buffer - * @param type Optional variable to store the file type - * @param use_valve_fs If true, the Valve file system will be used instead. - * This can be used to find files existing in any of - * the Valve search paths, rather than solely files - * existing directly in the gamedir. - * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. - * - * @return Handle to the directory, 0 otherwise - */ -native open_dir(dir[], firstfile[], length, &FileType:type = FileType_Unknown, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); - -/** - * Reads the next directory entry as a local filename. - * - * @note Contents of buffers are undefined when returning false. - * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. - * - * @param dirh Handle to a directory - * @param buffer String buffer to hold directory name - * @param length Maximum size of string buffer - * @param type Optional variable to store the file type. FileType_* constants - * - * @return 1 on success, 0 if there are no more files to read. - */ -native next_file(dirh, buffer[], length, &FileType:type = FileType_Unknown); - -/** - * Closes the directory. - * - * @param dirh Handle to a directory - */ -native close_dir(dirh); - -/** - * Loads a file using the LoadFileForMe engine function. - * - * The data is truncated if there is not enough space. No null-terminator - * is applied; the data is the raw contents of the file. - * - * @param file File to load (may be a file from the GCF) - * @param buffer Buffer to store file contents - * @param maxlength Maximum size of the file buffer - * @param length Variable to store the file length. This may return - * a number larger than the buffer size - * @return -1 if the file could not be loaded. Otherwise, - * the number of cells actually written to the buffer - * are returned. - */ -native LoadFileForMe(const file[], buffer[], maxlength, &length = 0); - -/** - * Returns a file timestamp as a unix timestamp. - * - * @param file File name - * @param tmode Time mode, see FileTime_* constants - * - * @return Returns a file timestamp as a unix timestamp - */ -native GetFileTime(const file[], FileTimeType:tmode); - -/** - * Changes a file or directories permissions. - * - * @param path Path to the file - * @param mode Permissions to set, see FPERM_* constants - * - * @return True on success, false otherwise - */ -native bool:SetFilePermissions(const path[], mode); - -/** - * Reads a single int8 (byte) from a file. The returned value is sign- - * extended to an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadInt8(file, &any:data); - -/** - * Reads a single uint8 (unsigned byte) from a file. The returned value is - * zero-extended to an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadUint8(file, &any:data); - -/** - * Reads a single int16 (short) from a file. The value is sign-extended to - * an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadInt16(file, &any:data); - -/** - * Reads a single unt16 (unsigned short) from a file. The value is zero- - * extended to an int32. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadUint16(file, &any:data); - -/** - * Reads a single int32 (int/cell) from a file. - * - * @param file Handle to the file - * @param data Variable to store the data read - * - * @return True on success, false on failure - */ -native bool:FileReadInt32(file, &any:data); - -/** - * Writes a single int8 (byte) to a file. - * - * @param file Handle to the file - * @param data Data to write (truncated to an int8) - * - * @return True on success, false on failure - */ -native bool:FileWriteInt8(file, any:data); - -/** - * Writes a single int16 (short) to a file. - * - * @param file Handle to the file - * @param data Data to write (truncated to an int16) - * - * @return True on success, false on failure - */ -native bool:FileWriteInt16(file, any:data); - -/** - * Writes a single int32 (int/cell) to a file. - * - * @param file Handle to the file - * @param data Data to write - * - * @return True on success, false on failure - */ -native bool:FileWriteInt32(file, any:data); - +// vim: set ts=4 sw=4 tw=99 noet: +// +// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). +// Copyright (C) The AMX Mod X Development Team. +// +// This software is licensed under the GNU General Public License, version 3 or higher. +// Additional exceptions apply. For full license details, see LICENSE.txt or visit: +// https://alliedmods.net/amxmodx-license + +// +// File Functions +// + +#if defined _file_included + #endinput +#endif +#define _file_included + +/** + * @note All paths in AMX Mod X natives are relative to the mod folder + * unless otherwise noted. + * + * Most functions in AMX Mod X (at least, ones that deal with direct + * file manipulation) will support an alternate path specification. + */ + +/** + * Maximum path length. + */ +#define PLATFORM_MAX_PATH 256 + +/** + * File inode types for use with open_dir() and next_file(). + */ +enum FileType +{ + FileType_Unknown, /* Unknown file type (device/socket) */ + FileType_Directory, /* File is a directory */ + FileType_File, /* File is a file */ +}; + +/** + * File time modes for use with GetFileTime(). + */ +enum FileTimeType +{ + FileTime_LastAccess, /* Last access (not available on FAT) */ + FileTime_Created, /* Creation (not available on FAT) */ + FileTime_LastChange, /* Last modification */ +}; + +/** + * File position modes for use with fseek(). + */ +#define SEEK_SET 0 /* Seek from start */ +#define SEEK_CUR 1 /* Seek from current position */ +#define SEEK_END 2 /* Seek from end position */ + +/** + * Options for use with file_size() flag parameter. + */ +#define FSOPT_BYTES_COUNT 0 /* Returns the file size in number of bytes */ +#define FSOPT_LINES_COUNT 1 /* Returns how many lines there are in this file */ +#define FSOPT_END_WITH_LF 2 /* Returns whether the last line is '\n' */ + +/** + * Data block modes for use with fread*() and fwrite*(). + */ +#define BLOCK_INT 4 +#define BLOCK_SHORT 2 +#define BLOCK_CHAR 1 +#define BLOCK_BYTE 1 + +/** + * File permissions flags for use with mkdir() and SetFilePermissions(). + */ +#define FPERM_U_READ 0x0100 /* User can read. */ +#define FPERM_U_WRITE 0x0080 /* User can write. */ +#define FPERM_U_EXEC 0x0040 /* User can exec. */ +#define FPERM_U_RWX FPERM_U_READ | FPERM_U_WRITE | FPERM_U_EXEC + +#define FPERM_G_READ 0x0020 /* Group can read. */ +#define FPERM_G_WRITE 0x0010 /* Group can write. */ +#define FPERM_G_EXEC 0x0008 /* Group can exec. */ +#define FPERM_G_RWX FPERM_G_READ | FPERM_G_WRITE | FPERM_G_EXEC + +#define FPERM_O_READ 0x0004 /* Anyone can read. */ +#define FPERM_O_WRITE 0x0002 /* Anyone can write. */ +#define FPERM_O_EXEC 0x0001 /* Anyone can exec. */ +#define FPERM_O_RWX FPERM_O_READ | FPERM_O_WRITE | FPERM_O_EXEC + +#define FPERM_DIR_DEFAULT FPERM_U_RWX | FPERM_G_RWX | FPERM_O_RWX /* rwx r-x r-x (0755) */ + + +/** + * Reads content from directory + * + * @note This native is expensive. Consider the use of open_dir(), next_file() and close_dir() instead. + * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. + * + * @param dirname Path to open + * @param pos Index the element + * @param output String buffer to hold content + * @param len Maximum size of string buffer + * @param outlen Number of characters written to the buffer + * + * @return Returns index of next element, otherwiwe 0 when end of dir is reached + */ +native read_dir(const dirname[], pos, output[], len, &outlen = 0); + +/** + * Reads line from file. + * + * @note This native is expensive. Consider the use of new file natives (fopen(), fgets(), etc.) + * if purpose is to read several lines of a file. + * + * @param file Path to open + * @param line Index of the line, starting to 0 + * @param text String buffer to hold line read + * @param len Maximum size of string buffer + * @param txtlen Number of characters written to the buffer + * + * @return Returns index of next line, otherwise 0 when end of file is reached + * @error Unable to read the file + */ +native read_file(const file[], line, text[], len, &txtlen = 0); + +/** + * Writes text to file. + * + * @note This native is expensive. Consider the use of new file natives (fopen(), fputs(), etc.) + * if purpose is to write several lines of a file. + * + * @param file Path to open + * @param text String to write to + * @param line Index of the line, starting to 0 + * If < 0, content will be appended + * + * @noreturn + * @error Unable to write [temporary] file + */ +native write_file(const file[], const text[], line = -1); + +/** + * Deletes a file. + * + * @param file Path of the file to delete + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to delete files existing in the Valve + * search path, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * + * @return 1 on success, 0 on failure or if file not immediately removed. + */ +native delete_file(const file[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); + +/** + * Checks if a file exists. + * + * @param file Path to the file + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * + * @return 1 if the file exists, 0 otherwise + */ +native file_exists(const file[], bool:use_valve_fs = false); + +/** + * Renames a file. + * + * @param oldname New path to the file + * @param newname Path to the existing file + * @param relative If true, native will act like other natives which + * use the moddir as a base directory. Otherwise, the + * current directory is undefined (but assumed to be hlds). + * + * @return 1 on success, 0 otherwise + */ +native rename_file(const oldname[], const newname[], relative = 0); + +/** + * Checks if a directory exists. + * + * @param dir Path to the directory + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * + * @return 1 if the directory exists, 0 otherwise + */ +native dir_exists(const dir[], bool:use_valve_fs = false); + +/** + * Get the file size in bytes. + * + * @param file Path to the file + * @param flag Flag options, see FSOPT_* constants + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * If used, flag option is ignored. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths + * + * @return If flag is FSOPT_BYTES_COUNT or use_valve_fs to true, the file size in bytes + * If flag is FSOPT_LINES_COUNT, the number of lines in the file + * If flag is FSOPT_END_WITH_LF, 1 is returned if file ends with line feed + * If file doesn't exist, -1 + */ +native file_size(const file[], flag = FSOPT_BYTES_COUNT, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); + +/** + * Opens or creates a file, returning a file handle on success. File handles + * should be closed with fclose(). + * + * @note The open mode may be one of the following strings: + * "r": Open an existing file for reading. + * "w": Create a file for writing, or truncate (delete the contents of) an + * existing file and then open it for writing. + * "a": Create a file for writing, or open an existing file such that writes + * will be appended to the end. + * "r+": Open an existing file for both reading and writing. + * "w+": Create a file for reading and writing, or truncate an existing file + * and then open it for reading and writing. + * "a+": Create a file for both reading and writing, or open an existing file + * such that writes will be appended to the end. + * + * @note The open mode may also contain an additional character after "r", "w", or "a", + * but before any "+" sign. This character may be "b" (indicating binary mode) or + * "t" (indicating text mode). By default, "text" mode is implied. On Linux and + * Mac, this has no distinction from binary mode. On Windows, it causes the '\n' + * character (0xA) to be written as "\r\n" (0xD, 0xA). + * + * Example: "rb" opens a binary file for writing; "at" opens a text file for + * appending. + * + * @note Registered paths ID are (in priority order) : + * GAME All paths related to current mod, including fallback + * Depending settings, it includes: <gamedir>_lv/_addon/_<language>/_hd + * and <gamedir> itself + * GAMECONFIG The default writable directory (<gamedir>) + * GAMEDOWNLOAD The download directory (<gamedir>_download) + * GAME_FALLBACK All paths related to fallback game, same as GAME + * DEFAULTGAME All paths related to the default game which is "valve", same as GAME + * BASE The base path where server is installed + * + * Note that some paths are non-writable. It includes all <gamedir>_* (expect _download) + * and DEFAULTGAME. Any file inside a non-writable path will be ignored if you try to open + * it in writing mode. + * + * @param filename File to open + * @param mode Open mode + * @param use_valve_fs If true, the Valve file system will be used instead + * This can be used to finred files existing in valve + * search paths, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths + * + * @return A file handle, or null if the file could not be opened. + */ +native fopen(const filename[], const mode[], bool:use_valve_fs = false, const valve_path_id[] = "GAME"); + +/** + * Closes a file handle. + * + * @param file File handle + */ +native fclose(file); + +/** + * Reads a single binary data from a file. + * + * @param file Handle to the file + * @param data Variable to store item read + * @param mode Size of each element, in bytes, to be read + * See BLOCK_* constants + * + * @return Number of elements read + */ +native fread(file, &any:data, mode); + +/** + * Reads binary data from a file. + * + * @param file Handle to the file + * @param data Array to store each item read + * @param blocks Number of items to read into the array + * @param mode Size of each element, in bytes, to be read + * Valid sizes are 1, 2, or 4. See BLOCK_* constants. + * + * @return Number of elements read + */ +native fread_blocks(file, any:data[], blocks, mode); + +/** + * Reads raw binary data from a file. + * + * @param file Handle to the file + * @param stream Array to store each item read + * @param blocksize Number of items to read into the array + * @param blocks Size of each element, in bytes. The data is read directly. + * That is, in 1 or 2-byte mode, the lower byte(s) in + * each cell are used directly, rather than performing + * any casts from a 4-byte number to a smaller number. + * + * @return Number of elements read + */ +native fread_raw(file, any:stream[], blocksize, blocks); + +/** + * Writes a single binary data to a file. + * + * @param file Handle to the file + * @param data Item to write + * @param mode Size of each item in the array in bytes + * Valid sizes are 1, 2, or 4. See BLOCK_* constants + * + * @return Number of elements written + */ +native fwrite(file, any:data, mode); + +/** + * Writes binary data to a file. + * + * @param file Handle to the file + * @param data Array of items to write + * @param blocks Number of items in the array + * @param mode Size of each item in the array in bytes + * Valid sizes are 1, 2, or 4. See BLOCK_* constants + * + * @return Number of elements written + */ +native fwrite_blocks(file, const any:data[], blocks, mode); + +/** + * Writes raw binary data to a file. + * + * @param file Handle to the file. + * @param stream Array of items to write. The data is written directly. + * That is, in 1 or 2-byte mode, the lower byte(s) in + * each cell are used directly, rather than performing + * any casts from a 4-byte number to a smaller number. + * @param blocks Size of each item in the array in bytes. + * @param mode Number of items in the array. + * + * @return Number of elements written + */ +native fwrite_raw(file, const any:stream[], blocks, mode); + +/** + * Tests if the end of file has been reached. + * + * @param file Handle to the file + * + * @return 1 if end of file has been reached, 0 otherwise. + */ +native feof(file); + +/** + * Reads a line from a text file. + * + * @param file Handle to the file. + * @param buffer String buffer to hold the line + * @param maxlength Maximum size of string buffer + * + * @return Total number of characters written on success, 0 otherwise + */ +native fgets(file, buffer[], maxlength); + +/** + * Writes a line of text to a text file. + * + * @param file Handle to the file + * @param text String to write + * @param null_term True to append NULL terminator, false otherwise + * + * @return 0 on success, -1 otherwise + */ +native fputs(file, const text[], bool:null_term = false); + +/** + * Writes a line of formatted text to a text file. + * + * @param file Handle to the file + * @param format Formatting rules + * @param ... Variable number of format parameters + * + * @return Total number of characters written on success, 0 otherwise + */ +native fprintf(file, const fmt[], any:...); + +/** + * Sets the file position indicator. + * + * @param file Handle to the file + * @param position Position relative to what is specified in whence + * @param start SEEK_ constant value of where to see from + * + * @return 0 on success, a non-zero value otherwise + */ +native fseek(file, position, start); + +/** + * Gets current position in the file. + * + * @param file Handle to the file + * + * @return Value for the file position indicator + */ +native ftell(file); + +/** + * Gets character from file. + * + * @param file Handle to the file + * + * @return Character read on success, -1 otherwise + */ +native fgetc(file); + +/** + * Writes character to file + * + * @param file Handle to the file + * @param data Character to put + * + * @return Character written on success, -1 otherwise + */ +native fputc(file, data); + +/** + * Ungets character from file. + * + * @param file Handle to the file + * @param data Character to unget + * + * @return On success, the character put back is returned, -1 otherwise + */ +native fungetc(file, data); + +/** + * Flushes a buffered output stream. + * + * @param file File handle, or 0 for all open streams + * + * @return 0 on success, -1 on failure + */ +native fflush(file); + +/** + * Gets the formatted file size in bytes. + * + * @param filename Path to the file + * @param ... Variable number of format parameters + * + * @return File size in bytes, otherwise -1 if file not found + */ +native filesize(const filename[], any:...); + +/** + * Removes a directory. + * + * @note On most Operating Systems you cannot remove a directory which has files inside it. + * + * @param path Path to the directory + * + * @return 1 on success, 0 otherwise + */ +native rmdir(const path[]); + +/** + * Creates a directory. + * + * @param path Path to create + * @param mode Permissions (default is o=rx,g=rx,u=rwx). Note that folders must have + * the execute bit set on Linux. On Windows, the mode is ignored. + * @param use_valve_fs If true, the Valve file system will be used instead + * This can be used to create folders in the game's + * Valve search paths, rather than directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for default + * In this case, mode is ignored + * + * @return 0 on success, -1 otherwise + */ +native mkdir(const dirname[], mode = FPERM_DIR_DEFAULT, bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); + +/** + * Deletes a file (delete_file macro) + * + * @param filename Path of the file to delete + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to delete files existing in the Valve + * search path, rather than solely files existing directly + * in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths + * + * @return 1 on success, 0 on failure or if file not immediately removed + */ +native unlink(const filename[], bool:use_valve_fs = false, const valve_path_id[] = "GAMECONFIG"); + +/** + * Opens a directory/folder for contents enumeration. + * + * @note Directories are closed with close_dir(). + * + * @param dir Path to open. + * @param firstfile String buffer to hold first file name + * @param length Maximum size of the string buffer + * @param type Optional variable to store the file type + * @param use_valve_fs If true, the Valve file system will be used instead. + * This can be used to find files existing in any of + * the Valve search paths, rather than solely files + * existing directly in the gamedir. + * @param valve_path_id If use_valve_fs, a search path from gameinfo or NULL_STRING for all search paths. + * + * @return Handle to the directory, 0 otherwise + */ +native open_dir(dir[], firstfile[], length, &FileType:type = FileType_Unknown, bool:use_valve_fs = false, const valve_path_id[] = "GAME"); + +/** + * Reads the next directory entry as a local filename. + * + * @note Contents of buffers are undefined when returning false. + * @note Both the '.' and '..' automatic directory entries will be retrieved for Windows and Linux. + * + * @param dirh Handle to a directory + * @param buffer String buffer to hold directory name + * @param length Maximum size of string buffer + * @param type Optional variable to store the file type. FileType_* constants + * + * @return 1 on success, 0 if there are no more files to read. + */ +native next_file(dirh, buffer[], length, &FileType:type = FileType_Unknown); + +/** + * Closes the directory. + * + * @param dirh Handle to a directory + */ +native close_dir(dirh); + +/** + * Loads a file using the LoadFileForMe engine function. + * + * The data is truncated if there is not enough space. No null-terminator + * is applied; the data is the raw contents of the file. + * + * @param file File to load (may be a file from the GCF) + * @param buffer Buffer to store file contents + * @param maxlength Maximum size of the file buffer + * @param length Variable to store the file length. This may return + * a number larger than the buffer size + * @return -1 if the file could not be loaded. Otherwise, + * the number of cells actually written to the buffer + * are returned. + */ +native LoadFileForMe(const file[], buffer[], maxlength, &length = 0); + +/** + * Returns a file timestamp as a unix timestamp. + * + * @param file File name + * @param tmode Time mode, see FileTime_* constants + * + * @return Returns a file timestamp as a unix timestamp + */ +native GetFileTime(const file[], FileTimeType:tmode); + +/** + * Changes a file or directories permissions. + * + * @param path Path to the file + * @param mode Permissions to set, see FPERM_* constants + * + * @return True on success, false otherwise + */ +native bool:SetFilePermissions(const path[], mode); + +/** + * Reads a single int8 (byte) from a file. The returned value is sign- + * extended to an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadInt8(file, &any:data); + +/** + * Reads a single uint8 (unsigned byte) from a file. The returned value is + * zero-extended to an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadUint8(file, &any:data); + +/** + * Reads a single int16 (short) from a file. The value is sign-extended to + * an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadInt16(file, &any:data); + +/** + * Reads a single unt16 (unsigned short) from a file. The value is zero- + * extended to an int32. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadUint16(file, &any:data); + +/** + * Reads a single int32 (int/cell) from a file. + * + * @param file Handle to the file + * @param data Variable to store the data read + * + * @return True on success, false on failure + */ +native bool:FileReadInt32(file, &any:data); + +/** + * Writes a single int8 (byte) to a file. + * + * @param file Handle to the file + * @param data Data to write (truncated to an int8) + * + * @return True on success, false on failure + */ +native bool:FileWriteInt8(file, any:data); + +/** + * Writes a single int16 (short) to a file. + * + * @param file Handle to the file + * @param data Data to write (truncated to an int16) + * + * @return True on success, false on failure + */ +native bool:FileWriteInt16(file, any:data); + +/** + * Writes a single int32 (int/cell) to a file. + * + * @param file Handle to the file + * @param data Data to write + * + * @return True on success, false on failure + */ +native bool:FileWriteInt32(file, any:data); + diff --git a/plugins/include/float.inc b/plugins/include/float.inc index 72c8f1a3..a731ffb6 100755 --- a/plugins/include/float.inc +++ b/plugins/include/float.inc @@ -1,422 +1,422 @@ -/* Float arithmetic -* -* (c) Copyright 1999, Artran, Inc. -* Written by Greg Garner (gmg@artran.com) -* Modified in March 2001 to include user defined -* operators for the floating point functions. -* -* This file is provided as is (no warranties). -*/ - -#if defined _float_included - #endinput -#endif -#define _float_included - -#pragma rational Float - -/** - * Different methods of rounding - */ -enum floatround_method { - floatround_round = 0, - floatround_floor, - floatround_ceil, - floatround_tozero -}; - -/** - * Different units of measurement for angles - */ -enum anglemode { - radian = 0, - degrees, - grades -}; - -/** - * Converts an integer into a floating point value. - * - * @param value Value to be converted - * - * @return Converted value - */ -native Float:float(value); - -/** - * Converts a string into a floating point value. - * - * @param string Input string to be converted - * - * @return Converted value - */ -native Float:floatstr(const string[]); - -/** - * Returns the fractional part of a floating point value - * - * @param string Floating point value to get the fractional part from - * - * @return The fractional part - */ -native Float:floatfract(Float:value); - -/** - * Rounds a floating point value to an integer value - * - * @note For the list of available rounding methods look at - * floatround_method enumeration. - * - * @param value Floating point value to be rounded - * @param method Rounding method - * - * @return Converted value - */ -native floatround(Float:value, floatround_method:method=floatround_round); - -/** - * Compares two floating point values. - * - * @param fOne First value to be compared - * @param fTwo Second value to be compared - * - * @return If arguments are equal, returns 0. - * If the first one is greater, returns 1. - * If the second one is greater, returns -1. - */ -native floatcmp(Float:fOne, Float:fTwo); - -/** - * Returns the square root of a floating point value - * - * @note Same as floatpower(value, 0.5) - * - * @param value Floating point value to get square root from - * - * @return Square root of the input value - */ -native Float:floatsqroot(Float:value); - -/** - * Returns the value raised to the power of the exponent - * - * @param value Floating point value to be raised - * @param exponent The exponent - * - * @return Value raised to the power of the exponent - */ -native Float:floatpower(Float:value, Float:exponent); - -/** - * Returns the logarithm of value - * - * @param value Floating point value to calculate the logarithm for - * @param base The optional logarithmic base to use. - * Defaults to 10, or the natural logarithm - * - * @return Square root of the input value - */ -native Float:floatlog(Float:value, Float:base=10.0); - -/** - * Returns the sine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the sine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The sine of a given angle - */ -native Float:floatsin(Float:value, anglemode:mode=radian); - -/** - * Returns the cosine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the cosine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The cosine of a given angle - */ -native Float:floatcos(Float:value, anglemode:mode=radian); - -/** - * Returns the tangent of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the tangent from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The tangent of a given angle - */ -native Float:floattan(Float:value, anglemode:mode=radian); - -/** - * Returns the hyperbolic sine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the hyperbolic sine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The hyperbolic sine of a given angle - */ -native Float:floatsinh(Float:angle, anglemode:mode=radian); - -/** - * Returns the hyperbolic cosine of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the hyperbolic cosine from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The hyperbolic cosine of a given angle - */ -native Float:floatcosh(Float:angle, anglemode:mode=radian); - -/** - * Returns the hyperbolic tangent of a given angle - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The angle to calculate the hyperbolic tangent from - * @param mode What unit of measurement is the angle specified in - * Defaults to radians - * - * @return The hyperbolic tangent of a given angle - */ -native Float:floattanh(Float:angle, anglemode:mode=radian); - -/** - * Returns the absolute value of a floating point value - * - * @param value The floating point value to get the absolute value from - * - * @return The absolute value - */ -native Float:floatabs(Float:value); - -/* Return the angle of a sine, cosine or tangent. - * The output angle may be in radians, degrees, or grades. */ - -/** - * Returns the angle of the given tangent - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The tangent to calculate the angle from - * @param mode What unit of measurement should the output angle be in - * - * @return The angle of a tangent - */ -native Float:floatatan(Float:angle, {anglemode,_}:radix); - -/** - * Returns the angle of the given cosine - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The cosine to calculate the angle from - * @param mode What unit of measurement should the output angle be in - * - * @return The angle of a cosine - */ -native Float:floatacos(Float:angle, {anglemode,_}:radix); - -/** - * Returns the angle of the given sine - * - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param value The sine to calculate the angle from - * @param mode What unit of measurement should the output angle be in - * - * @return The angle of a sine - */ -native Float:floatasin(Float:angle, {anglemode,_}:radix); - -/** - * Computes the principal value of arctangent of y/x - * - * @note Someone should verify this native, not sure what it actually does. - * @note For available units of measurements(modes) look at the anglemode enum - * - * @param x Value representing the proportion of the x-coordinate. - * @param y Value representing the proportion of the x-coordinate. - * @param mode What unit of measurement should the output angle be in - * - * @return Arctangent of y/x - */ -native Float:floatatan2(Float:x, Float:y, {anglemode,_}:radix); - - - -/* Multiply two floats together */ -native Float:floatmul(Float:oper1, Float:oper2); - -/* Divide the dividend float by the divisor float */ -native Float:floatdiv(Float:dividend, Float:divisor); - -/* Add two floats together */ -native Float:floatadd(Float:dividend, Float:divisor); - -/* Subtract oper2 float from oper1 float */ -native Float:floatsub(Float:oper1, Float:oper2); - -/* user defined operators */ -native Float:operator*(Float:oper1, Float:oper2) = floatmul; -native Float:operator/(Float:oper1, Float:oper2) = floatdiv; -native Float:operator+(Float:oper1, Float:oper2) = floatadd; -native Float:operator-(Float:oper1, Float:oper2) = floatsub; - -stock Float:operator++(Float:oper) - return oper+1.0; - -stock Float:operator--(Float:oper) - return oper-1.0; - -stock Float:operator-(Float:oper) - return oper^Float:cellmin; /* IEEE values are sign/magnitude */ - -stock Float:operator*(Float:oper1, oper2) - return floatmul(oper1, float(oper2)); /* "*" is commutative */ - -stock Float:operator/(Float:oper1, oper2) - return floatdiv(oper1, float(oper2)); - -stock Float:operator/(oper1, Float:oper2) - return floatdiv(float(oper1), oper2); - -stock Float:operator+(Float:oper1, oper2) - return floatadd(oper1, float(oper2)); /* "+" is commutative */ - -stock Float:operator-(Float:oper1, oper2) - return floatsub(oper1, float(oper2)); - -stock Float:operator-(oper1, Float:oper2) - return floatsub(float(oper1), oper2); - -stock bool:operator==(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) == 0; - -stock bool:operator==(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) == 0; /* "==" is commutative */ - -stock bool:operator!=(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) != 0; - -stock bool:operator!=(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) != 0; /* "==" is commutative */ - -stock bool:operator>(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) > 0; - -stock bool:operator>(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) > 0; - -stock bool:operator>(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) > 0; - -stock bool:operator>=(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) >= 0; - -stock bool:operator>=(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) >= 0; - -stock bool:operator>=(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) >= 0; - -stock bool:operator<(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) < 0; - -stock bool:operator<(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) < 0; - -stock bool:operator<(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) < 0; - -stock bool:operator<=(Float:oper1, Float:oper2) - return floatcmp(oper1, oper2) <= 0; - -stock bool:operator<=(Float:oper1, oper2) - return floatcmp(oper1, float(oper2)) <= 0; - -stock bool:operator<=(oper1, Float:oper2) - return floatcmp(float(oper1), oper2) <= 0; - -stock bool:operator!(Float:oper) - return (_:oper & ((-1)/2)) == 0; /* -1 = all bits to 1; /2 = remove most significant bit (sign) - works on both 32bit and 64bit systems; no constant required */ -/* forbidden operations */ -forward operator%(Float:oper1, Float:oper2); -forward operator%(Float:oper1, oper2); -forward operator%(oper1, Float:oper2); - - -/** - * Returns whichever value is the smaller one - * - * @param ValueA The first value - * @param ValueB The second value - * - * @return ValueA if it is smaller than ValueB, and vice versa - */ -stock Float:floatmin(Float:ValueA, Float:ValueB) -{ - if (ValueA<=ValueB) - { - return ValueA; - } - - return ValueB; -} - -/** - * Returns whichever value is the greater one - * - * @param ValueA The first value - * @param ValueB The second value - * - * @return ValueA if it is greater than ValueB, and vice versa - */ -stock Float:floatmax(Float:ValueA, Float:ValueB) -{ - if (ValueA>=ValueB) - { - return ValueA; - } - - return ValueB; -} - -/** - * Clamps a value between a minimum and a maximum floating point value - * - * @param Value The value to be clamped - * @param MinValue Minimum value - * @param MaxValue Maximum value - * - * @return The Value clamped between MinValue and MaxValue - */ -stock Float:floatclamp(Float:Value, Float:MinValue, Float:MaxValue) -{ - if (Value<=MinValue) - { - return MinValue; - } - if (Value>=MaxValue) - { - return MaxValue; - } - - return Value; +/* Float arithmetic +* +* (c) Copyright 1999, Artran, Inc. +* Written by Greg Garner (gmg@artran.com) +* Modified in March 2001 to include user defined +* operators for the floating point functions. +* +* This file is provided as is (no warranties). +*/ + +#if defined _float_included + #endinput +#endif +#define _float_included + +#pragma rational Float + +/** + * Different methods of rounding + */ +enum floatround_method { + floatround_round = 0, + floatround_floor, + floatround_ceil, + floatround_tozero +}; + +/** + * Different units of measurement for angles + */ +enum anglemode { + radian = 0, + degrees, + grades +}; + +/** + * Converts an integer into a floating point value. + * + * @param value Value to be converted + * + * @return Converted value + */ +native Float:float(value); + +/** + * Converts a string into a floating point value. + * + * @param string Input string to be converted + * + * @return Converted value + */ +native Float:floatstr(const string[]); + +/** + * Returns the fractional part of a floating point value + * + * @param string Floating point value to get the fractional part from + * + * @return The fractional part + */ +native Float:floatfract(Float:value); + +/** + * Rounds a floating point value to an integer value + * + * @note For the list of available rounding methods look at + * floatround_method enumeration. + * + * @param value Floating point value to be rounded + * @param method Rounding method + * + * @return Converted value + */ +native floatround(Float:value, floatround_method:method=floatround_round); + +/** + * Compares two floating point values. + * + * @param fOne First value to be compared + * @param fTwo Second value to be compared + * + * @return If arguments are equal, returns 0. + * If the first one is greater, returns 1. + * If the second one is greater, returns -1. + */ +native floatcmp(Float:fOne, Float:fTwo); + +/** + * Returns the square root of a floating point value + * + * @note Same as floatpower(value, 0.5) + * + * @param value Floating point value to get square root from + * + * @return Square root of the input value + */ +native Float:floatsqroot(Float:value); + +/** + * Returns the value raised to the power of the exponent + * + * @param value Floating point value to be raised + * @param exponent The exponent + * + * @return Value raised to the power of the exponent + */ +native Float:floatpower(Float:value, Float:exponent); + +/** + * Returns the logarithm of value + * + * @param value Floating point value to calculate the logarithm for + * @param base The optional logarithmic base to use. + * Defaults to 10, or the natural logarithm + * + * @return Square root of the input value + */ +native Float:floatlog(Float:value, Float:base=10.0); + +/** + * Returns the sine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the sine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The sine of a given angle + */ +native Float:floatsin(Float:value, anglemode:mode=radian); + +/** + * Returns the cosine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the cosine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The cosine of a given angle + */ +native Float:floatcos(Float:value, anglemode:mode=radian); + +/** + * Returns the tangent of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the tangent from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The tangent of a given angle + */ +native Float:floattan(Float:value, anglemode:mode=radian); + +/** + * Returns the hyperbolic sine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the hyperbolic sine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The hyperbolic sine of a given angle + */ +native Float:floatsinh(Float:angle, anglemode:mode=radian); + +/** + * Returns the hyperbolic cosine of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the hyperbolic cosine from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The hyperbolic cosine of a given angle + */ +native Float:floatcosh(Float:angle, anglemode:mode=radian); + +/** + * Returns the hyperbolic tangent of a given angle + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The angle to calculate the hyperbolic tangent from + * @param mode What unit of measurement is the angle specified in + * Defaults to radians + * + * @return The hyperbolic tangent of a given angle + */ +native Float:floattanh(Float:angle, anglemode:mode=radian); + +/** + * Returns the absolute value of a floating point value + * + * @param value The floating point value to get the absolute value from + * + * @return The absolute value + */ +native Float:floatabs(Float:value); + +/* Return the angle of a sine, cosine or tangent. + * The output angle may be in radians, degrees, or grades. */ + +/** + * Returns the angle of the given tangent + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The tangent to calculate the angle from + * @param mode What unit of measurement should the output angle be in + * + * @return The angle of a tangent + */ +native Float:floatatan(Float:angle, {anglemode,_}:radix); + +/** + * Returns the angle of the given cosine + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The cosine to calculate the angle from + * @param mode What unit of measurement should the output angle be in + * + * @return The angle of a cosine + */ +native Float:floatacos(Float:angle, {anglemode,_}:radix); + +/** + * Returns the angle of the given sine + * + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param value The sine to calculate the angle from + * @param mode What unit of measurement should the output angle be in + * + * @return The angle of a sine + */ +native Float:floatasin(Float:angle, {anglemode,_}:radix); + +/** + * Computes the principal value of arctangent of y/x + * + * @note Someone should verify this native, not sure what it actually does. + * @note For available units of measurements(modes) look at the anglemode enum + * + * @param x Value representing the proportion of the x-coordinate. + * @param y Value representing the proportion of the x-coordinate. + * @param mode What unit of measurement should the output angle be in + * + * @return Arctangent of y/x + */ +native Float:floatatan2(Float:x, Float:y, {anglemode,_}:radix); + + + +/* Multiply two floats together */ +native Float:floatmul(Float:oper1, Float:oper2); + +/* Divide the dividend float by the divisor float */ +native Float:floatdiv(Float:dividend, Float:divisor); + +/* Add two floats together */ +native Float:floatadd(Float:dividend, Float:divisor); + +/* Subtract oper2 float from oper1 float */ +native Float:floatsub(Float:oper1, Float:oper2); + +/* user defined operators */ +native Float:operator*(Float:oper1, Float:oper2) = floatmul; +native Float:operator/(Float:oper1, Float:oper2) = floatdiv; +native Float:operator+(Float:oper1, Float:oper2) = floatadd; +native Float:operator-(Float:oper1, Float:oper2) = floatsub; + +stock Float:operator++(Float:oper) + return oper+1.0; + +stock Float:operator--(Float:oper) + return oper-1.0; + +stock Float:operator-(Float:oper) + return oper^Float:cellmin; /* IEEE values are sign/magnitude */ + +stock Float:operator*(Float:oper1, oper2) + return floatmul(oper1, float(oper2)); /* "*" is commutative */ + +stock Float:operator/(Float:oper1, oper2) + return floatdiv(oper1, float(oper2)); + +stock Float:operator/(oper1, Float:oper2) + return floatdiv(float(oper1), oper2); + +stock Float:operator+(Float:oper1, oper2) + return floatadd(oper1, float(oper2)); /* "+" is commutative */ + +stock Float:operator-(Float:oper1, oper2) + return floatsub(oper1, float(oper2)); + +stock Float:operator-(oper1, Float:oper2) + return floatsub(float(oper1), oper2); + +stock bool:operator==(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) == 0; + +stock bool:operator==(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) == 0; /* "==" is commutative */ + +stock bool:operator!=(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) != 0; + +stock bool:operator!=(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) != 0; /* "==" is commutative */ + +stock bool:operator>(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) > 0; + +stock bool:operator>(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) > 0; + +stock bool:operator>(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) > 0; + +stock bool:operator>=(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) >= 0; + +stock bool:operator>=(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) >= 0; + +stock bool:operator>=(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) >= 0; + +stock bool:operator<(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) < 0; + +stock bool:operator<(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) < 0; + +stock bool:operator<(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) < 0; + +stock bool:operator<=(Float:oper1, Float:oper2) + return floatcmp(oper1, oper2) <= 0; + +stock bool:operator<=(Float:oper1, oper2) + return floatcmp(oper1, float(oper2)) <= 0; + +stock bool:operator<=(oper1, Float:oper2) + return floatcmp(float(oper1), oper2) <= 0; + +stock bool:operator!(Float:oper) + return (_:oper & ((-1)/2)) == 0; /* -1 = all bits to 1; /2 = remove most significant bit (sign) + works on both 32bit and 64bit systems; no constant required */ +/* forbidden operations */ +forward operator%(Float:oper1, Float:oper2); +forward operator%(Float:oper1, oper2); +forward operator%(oper1, Float:oper2); + + +/** + * Returns whichever value is the smaller one + * + * @param ValueA The first value + * @param ValueB The second value + * + * @return ValueA if it is smaller than ValueB, and vice versa + */ +stock Float:floatmin(Float:ValueA, Float:ValueB) +{ + if (ValueA<=ValueB) + { + return ValueA; + } + + return ValueB; +} + +/** + * Returns whichever value is the greater one + * + * @param ValueA The first value + * @param ValueB The second value + * + * @return ValueA if it is greater than ValueB, and vice versa + */ +stock Float:floatmax(Float:ValueA, Float:ValueB) +{ + if (ValueA>=ValueB) + { + return ValueA; + } + + return ValueB; +} + +/** + * Clamps a value between a minimum and a maximum floating point value + * + * @param Value The value to be clamped + * @param MinValue Minimum value + * @param MaxValue Maximum value + * + * @return The Value clamped between MinValue and MaxValue + */ +stock Float:floatclamp(Float:Value, Float:MinValue, Float:MaxValue) +{ + if (Value<=MinValue) + { + return MinValue; + } + if (Value>=MaxValue) + { + return MaxValue; + } + + return Value; } \ No newline at end of file diff --git a/plugins/include/fun.inc b/plugins/include/fun.inc index 1096e767..d284af1e 100755 --- a/plugins/include/fun.inc +++ b/plugins/include/fun.inc @@ -1,306 +1,306 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -// -// Fun Functions -// - -#if defined _fun_included - #endinput -#endif -#define _fun_included - -#pragma reqlib fun -#if !defined AMXMODX_NOAUTOLOAD - #pragma loadlib fun -#endif - -/** - * Tells whether receiver hears sender via voice communication. - * - * @param receiver Receiver - * @param sender Sender - * - * @return 1 if receiver hears the sender, 0 otherwise. - * @error If receiver or sender are not connected or not - * within the range of 1 to MaxClients - */ -native get_client_listen(receiver, sender); - -/** - * Sets who can listen who. - * - * @param receiver Receiver - * @param sender Sender - * @param listen 1 if receiver should be able to hear sender, 0 if not - * - * @return 0 if the setting can't be done for some reason - * @error If receiver or sender are not connected or not - * within the range of 1 to MaxClients. - */ -native set_client_listen(receiver, sender, listen); - -/** - * Sets player's godmode. - * - * @param index Client index - * @param godmode 1 to enable godmode, 0 to disable - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_godmode(index, godmode = 0); - -/** - * Tells whether a player has godmode on. - * - * @param index Client index - * - * @return 1 if player has godmode on, 0 if not - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_godmode(index); - -/** - * Sets player's armor amount. - * - * @param index Client index - * @param armor The armor amount to set - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_armor(index, armor); - -/** - * Sets player's health amount. - * - * @param index Client index - * @param health The health amount to set - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_health(index, health); - -/** - * Moves a player to the given origin. - * - * @param index Client index - * @param origin Origin to move a player to - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_origin(index, const origin[3]); - -/** - * Sets player's rendering mode. - * - * @note A really useful render modes reference: - * https://sites.google.com/site/svenmanor/rendermodes - * - * @param index Client index - * @param fx Rendering effects. One of kRenderFx* constants - * @param r The amount of red color (0 to 255) - * @param g The amount of green color (0 to 255) - * @param b The amount of blue color (0 to 255) - * @param render Render mode. One of kRender* constants - * @param amount Render amount (0 to 255) - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_rendering(index, fx = kRenderFxNone, r = 0, g = 0, b = 0, render = kRenderNormal, amount = 0); - -/** - * Gives an item to a player. - * - * @param index Client index - * @param item Classname of the item to give. Should start with either - * "weapon_", "ammo_", "item_" or "tf_weapon_" - * - * @return Item entity index. If an invalid item name is - * given or the item failed to create, it will return 0. - * If the item was removed, it will return -1 - * @error If player is not connected or not within the range - * of 1 to MaxClients or item creation fails. - */ -native give_item(index, const item[]); - -/** - * Sets (adds, removes) hit zones for a player. - * - * @note This actually sets rules of how any player can hit any other. - * Example: set_user_hitzones(id, target, 2) - makes @id able to - * hit @target only in the head. - * - * @param index Client index - * @param target The target player - * @param body A bitsum of the body parts that can/can't be shot: - * 1 - generic - * 2 - head - * 4 - chest - * 8 - stomach - * 16 - left arm - * 32 - right arm - * 64 - left leg - * 128 - right leg - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_hitzones(index = 0, target = 0, body = 255); - -/** - * Gets the set of hit zone "rules" between @index and @target players. - * - * @note For the body part bitsum take a look at the set_user_hitzones() native. - * - * @param index Client index - * @param target The target player - * - * @return The bitsum of @target's body parts @index is able to hit - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_hitzones(index, target); - -/** - * Sets player's maximum movement speed. - * - * @param index Client index - * @param speed The maximum speed player will be able to run at - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_maxspeed(index, Float:speed = -1.0); - -/** - * Gets player's maximum movement speed. - * - * @param index Client index - * - * @return Player's maximum movement speed - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native Float:get_user_maxspeed(index); - -/** - * Sets player's gravity. - * - * @param index Client index - * @param gravity Gravity value to set, 1.0 being normal gravity (800) - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_gravity(index, Float:gravity = 1.0); - -/** - * Gets player's gravity. - * - * @param index Client index - * - * @return Player's gravity value, 1.0 being normal gravity (800) - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native Float:get_user_gravity(index); - -/** - * Spawns an entity. - * - * @param index Entity index - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native spawn(index); - -/** - * Enables or disables player's noclip. - * - * @param index Client index - * @param noclip 1 to enable noclip, 0 to disable - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_noclip(index, noclip = 0); - -/** - * Gets whether a player has noclip enabled or not. - * - * @param index Client index - * - * @return 1 if noclip is enabled, 0 if disabled - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_noclip(index); - -/** - * Tells whether a player has silent footsteps enabled. - * - * @param index Client index - * - * @return 1 if silent footsteps are enabled, 0 if not - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native get_user_footsteps(index); - -/** - * Enables or disables player's silent footsteps. - * - * @param index Client index - * @param set 1 if player should have silent footsteps, 0 otherwise - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_footsteps(id, set = 1); - -/** - * Strips all weapons from a player, including their knife. - * - * @param index Client index - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native strip_user_weapons(index); - -/** - * Sets player's frags amount. - * - * @param index Client index - * @param frags The amount of frags to set - * - * @noreturn - * @error If player is not connected or not within the range - * of 1 to MaxClients. - */ -native set_user_frags(index, frags); +// vim: set ts=4 sw=4 tw=99 noet: +// +// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). +// Copyright (C) The AMX Mod X Development Team. +// +// This software is licensed under the GNU General Public License, version 3 or higher. +// Additional exceptions apply. For full license details, see LICENSE.txt or visit: +// https://alliedmods.net/amxmodx-license + +// +// Fun Functions +// + +#if defined _fun_included + #endinput +#endif +#define _fun_included + +#pragma reqlib fun +#if !defined AMXMODX_NOAUTOLOAD + #pragma loadlib fun +#endif + +/** + * Tells whether receiver hears sender via voice communication. + * + * @param receiver Receiver + * @param sender Sender + * + * @return 1 if receiver hears the sender, 0 otherwise. + * @error If receiver or sender are not connected or not + * within the range of 1 to MaxClients + */ +native get_client_listen(receiver, sender); + +/** + * Sets who can listen who. + * + * @param receiver Receiver + * @param sender Sender + * @param listen 1 if receiver should be able to hear sender, 0 if not + * + * @return 0 if the setting can't be done for some reason + * @error If receiver or sender are not connected or not + * within the range of 1 to MaxClients. + */ +native set_client_listen(receiver, sender, listen); + +/** + * Sets player's godmode. + * + * @param index Client index + * @param godmode 1 to enable godmode, 0 to disable + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_godmode(index, godmode = 0); + +/** + * Tells whether a player has godmode on. + * + * @param index Client index + * + * @return 1 if player has godmode on, 0 if not + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_godmode(index); + +/** + * Sets player's armor amount. + * + * @param index Client index + * @param armor The armor amount to set + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_armor(index, armor); + +/** + * Sets player's health amount. + * + * @param index Client index + * @param health The health amount to set + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_health(index, health); + +/** + * Moves a player to the given origin. + * + * @param index Client index + * @param origin Origin to move a player to + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_origin(index, const origin[3]); + +/** + * Sets player's rendering mode. + * + * @note A really useful render modes reference: + * https://sites.google.com/site/svenmanor/rendermodes + * + * @param index Client index + * @param fx Rendering effects. One of kRenderFx* constants + * @param r The amount of red color (0 to 255) + * @param g The amount of green color (0 to 255) + * @param b The amount of blue color (0 to 255) + * @param render Render mode. One of kRender* constants + * @param amount Render amount (0 to 255) + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_rendering(index, fx = kRenderFxNone, r = 0, g = 0, b = 0, render = kRenderNormal, amount = 0); + +/** + * Gives an item to a player. + * + * @param index Client index + * @param item Classname of the item to give. Should start with either + * "weapon_", "ammo_", "item_" or "tf_weapon_" + * + * @return Item entity index. If an invalid item name is + * given or the item failed to create, it will return 0. + * If the item was removed, it will return -1 + * @error If player is not connected or not within the range + * of 1 to MaxClients or item creation fails. + */ +native give_item(index, const item[]); + +/** + * Sets (adds, removes) hit zones for a player. + * + * @note This actually sets rules of how any player can hit any other. + * Example: set_user_hitzones(id, target, 2) - makes @id able to + * hit @target only in the head. + * + * @param index Client index + * @param target The target player + * @param body A bitsum of the body parts that can/can't be shot: + * 1 - generic + * 2 - head + * 4 - chest + * 8 - stomach + * 16 - left arm + * 32 - right arm + * 64 - left leg + * 128 - right leg + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_hitzones(index = 0, target = 0, body = 255); + +/** + * Gets the set of hit zone "rules" between @index and @target players. + * + * @note For the body part bitsum take a look at the set_user_hitzones() native. + * + * @param index Client index + * @param target The target player + * + * @return The bitsum of @target's body parts @index is able to hit + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_hitzones(index, target); + +/** + * Sets player's maximum movement speed. + * + * @param index Client index + * @param speed The maximum speed player will be able to run at + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_maxspeed(index, Float:speed = -1.0); + +/** + * Gets player's maximum movement speed. + * + * @param index Client index + * + * @return Player's maximum movement speed + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native Float:get_user_maxspeed(index); + +/** + * Sets player's gravity. + * + * @param index Client index + * @param gravity Gravity value to set, 1.0 being normal gravity (800) + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_gravity(index, Float:gravity = 1.0); + +/** + * Gets player's gravity. + * + * @param index Client index + * + * @return Player's gravity value, 1.0 being normal gravity (800) + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native Float:get_user_gravity(index); + +/** + * Spawns an entity. + * + * @param index Entity index + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native spawn(index); + +/** + * Enables or disables player's noclip. + * + * @param index Client index + * @param noclip 1 to enable noclip, 0 to disable + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_noclip(index, noclip = 0); + +/** + * Gets whether a player has noclip enabled or not. + * + * @param index Client index + * + * @return 1 if noclip is enabled, 0 if disabled + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_noclip(index); + +/** + * Tells whether a player has silent footsteps enabled. + * + * @param index Client index + * + * @return 1 if silent footsteps are enabled, 0 if not + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_footsteps(index); + +/** + * Enables or disables player's silent footsteps. + * + * @param index Client index + * @param set 1 if player should have silent footsteps, 0 otherwise + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_footsteps(id, set = 1); + +/** + * Strips all weapons from a player, including their knife. + * + * @param index Client index + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native strip_user_weapons(index); + +/** + * Sets player's frags amount. + * + * @param index Client index + * @param frags The amount of frags to set + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native set_user_frags(index, frags); From 98ab26671c53492e39630d59a69aca0fdcc9d866 Mon Sep 17 00:00:00 2001 From: KliPPy <deki.1998@hotmail.com> Date: Wed, 18 Jul 2018 17:10:37 +0200 Subject: [PATCH 15/98] Add MPROP_SHOWPAGE (#473) --- amxmodx/newmenus.cpp | 9 +++++++-- amxmodx/newmenus.h | 2 ++ plugins/include/newmenus.inc | 5 +++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/amxmodx/newmenus.cpp b/amxmodx/newmenus.cpp index 5e6d0773..b16b9b57 100755 --- a/amxmodx/newmenus.cpp +++ b/amxmodx/newmenus.cpp @@ -92,7 +92,7 @@ bool CloseNewMenus(CPlayer *pPlayer) Menu::Menu(const char *title, AMX *amx, int fid) : m_Title(title), m_ItemColor("\\r"), m_NeverExit(false), m_AutoColors(g_coloredmenus), thisId(0), func(fid), -isDestroying(false), pageCallback(-1), items_per_page(7) +isDestroying(false), pageCallback(-1), showPageNumber(true), items_per_page(7) { CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx); menuId = g_menucmds.registerMenuId(title, amx); @@ -357,7 +357,7 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) m_Text = nullptr; char buffer[255]; - if (items_per_page && (pages != 1)) + if (showPageNumber && items_per_page && (pages != 1)) { if (m_AutoColors) ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s %d/%d\n\\w\n", m_Title.chars(), page + 1, pages); @@ -983,6 +983,11 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params) unregisterSPForward(pMenu->pageCallback); pMenu->pageCallback = callback; + break; + } + case MPROP_SHOWPAGE: + { + pMenu->showPageNumber = (get_amxaddr(amx, params[3]) != 0); break; } case MPROP_SET_NUMBER_COLOR: diff --git a/amxmodx/newmenus.h b/amxmodx/newmenus.h index 936188c3..df132df1 100755 --- a/amxmodx/newmenus.h +++ b/amxmodx/newmenus.h @@ -31,6 +31,7 @@ #define MPROP_PADMENU 9 #define MPROP_SET_NUMBER_COLOR 10 #define MPROP_PAGE_CALLBACK 11 +#define MPROP_SHOWPAGE 12 typedef int (*MENUITEM_CALLBACK)(int, int, int); @@ -125,6 +126,7 @@ public: int func; bool isDestroying; int pageCallback; + bool showPageNumber; public: unsigned int items_per_page; }; diff --git a/plugins/include/newmenus.inc b/plugins/include/newmenus.inc index 4ded31d9..98faad81 100644 --- a/plugins/include/newmenus.inc +++ b/plugins/include/newmenus.inc @@ -81,6 +81,11 @@ */ #define MPROP_PAGE_CALLBACK 11 +/** + * Whether to show the page number in menu title (param1 = bool, true = default) + */ +#define MPROP_SHOWPAGE 12 + /** * @deprecated */ From a9ce39dee0057abeefc4584de1575d7b32957cc4 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Tue, 24 Jul 2018 10:37:05 +0200 Subject: [PATCH 16/98] Fix a buffer issue in server_changelevel forward caused by engine_changelevel native (#503) --- amxmodx/amxmodx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 2cfeec5e..396d9237 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -2615,11 +2615,11 @@ static cell AMX_NATIVE_CALL change_task(AMX *amx, cell *params) static cell AMX_NATIVE_CALL engine_changelevel(AMX *amx, cell *params) { int length; - const char* new_map = get_amxstring(amx, params[1], 0, length); + ke::AString new_map(get_amxstring(amx, params[1], 0, length)); // Same as calling "changelevel" command but will trigger "server_changelevel" AMXX forward as well. // Filling second param will call "changelevel2" command, but this is not usable in multiplayer game. - g_pEngTable->pfnChangeLevel(new_map, NULL); + g_pEngTable->pfnChangeLevel(new_map.chars(), NULL); return 1; } From 7062d210a7a4dd7c7d3af13962437902bba94dc8 Mon Sep 17 00:00:00 2001 From: justgo97 <hamdi2050@live.com> Date: Tue, 24 Jul 2018 09:37:19 +0100 Subject: [PATCH 17/98] fix hlsdk_const.inc identation (#502) a copy past from reapi hlsdk_const.inc file --- plugins/include/hlsdk_const.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/include/hlsdk_const.inc b/plugins/include/hlsdk_const.inc index 316325e7..8c9d7525 100644 --- a/plugins/include/hlsdk_const.inc +++ b/plugins/include/hlsdk_const.inc @@ -625,7 +625,7 @@ #define TRAIN_MEDIUM 0x03 #define TRAIN_FAST 0x04 #define TRAIN_BACK 0x05 - + /** * Valve Mod Weapon Constants */ @@ -660,7 +660,7 @@ #define ITEM_FLAG_NOAUTORELOAD (1<<1) #define ITEM_FLAG_NOAUTOSWITCHEMPTY (1<<2) #define ITEM_FLAG_LIMITINWORLD (1<<3) -#define ITEM_FLAG_EXHAUSTIBLE (1<<4) +#define ITEM_FLAG_EXHAUSTIBLE (1<<4) #define FEV_NOTHOST (1<<0) // Skip local host for event send. From 57abc4a1c549c729964d73a4e0762f0fccfe785a Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Tue, 24 Jul 2018 10:37:56 +0200 Subject: [PATCH 18/98] Fix a compilation regression in LookupLangKey (introduced with #222) (#499) --- plugins/include/lang.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/lang.inc b/plugins/include/lang.inc index 247a6004..a88c66c4 100755 --- a/plugins/include/lang.inc +++ b/plugins/include/lang.inc @@ -103,7 +103,7 @@ native AddTranslation(const lang[3], TransKey:key, const phrase[]); * * @return 1 on success, 0 otherwise */ -native LookupLangKey(Output[], OutputSize, const Key[], &id); +native LookupLangKey(Output[], OutputSize, const Key[], const &id); /** * Sets the global language target. From 4ae31f6f263e02e7f7b326884b4077fdcf7d8219 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Tue, 24 Jul 2018 15:36:31 +0200 Subject: [PATCH 19/98] nvault.inc documentation fix (#501) * Update lang.inc * Update lang.inc * Update nvault.inc * Update nvault.inc --- plugins/include/nvault.inc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/include/nvault.inc b/plugins/include/nvault.inc index 85cadc48..4c025c1a 100755 --- a/plugins/include/nvault.inc +++ b/plugins/include/nvault.inc @@ -37,7 +37,7 @@ native nvault_open(const name[]); /** - * Retrieves a value from the given key + * Retrieves a value from the given key. * * @note An example of retrieving a string: * nvault_get(vaultHandle, "myKey", myString, charsmax(myString)); @@ -50,13 +50,16 @@ native nvault_open(const name[]); * vault and copies it to the third argument, up to * 4th argument characters. * - * @noreturn + * @return Result as integer if only the first two arguments + * of the function are used. + * 1 if only the first three arguments are used. + * String length if all four parameters are used. * @error On invalid vault handle. */ native nvault_get(vault, const key[], any:...); /** - * Retrieves full information about a vault entry + * Retrieves full information about a vault entry. * * @param vault A vault handle returned from nvault_open() * @param key A key to get information from @@ -109,7 +112,7 @@ native nvault_pset(vault, const key[], const value[]); * @param start The timestamp to start erasing from * @param end The timestamp to erase to * - * @noreturn + * @return Number of erased values. * @error On invalid vault handle. */ native nvault_prune(vault, start, end); From 9700caefaeda5dae3d2cc6b19e756cd8fc2f4884 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Tue, 24 Jul 2018 15:45:50 +0200 Subject: [PATCH 20/98] Fix client_print_color where the color is ignored if string starts with an unicode character (#504) --- amxmodx/amxmodx.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 396d9237..33b010d5 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -338,7 +338,7 @@ static cell AMX_NATIVE_CALL client_print_color(AMX *amx, cell *params) /* 3 para g_langMngr.SetDefLang(i); msg = format_amxstring(amx, params, 3, len); - if (*msg > 4) // Insert default color code at the start if not present, otherwise message will not be colored. + if (static_cast<byte>(*msg) > 4) // Insert default color code at the start if not present, otherwise message will not be colored. { memmove(msg + 1, msg, ke::Min(len++, 191)); *msg = 1; @@ -376,7 +376,7 @@ static cell AMX_NATIVE_CALL client_print_color(AMX *amx, cell *params) /* 3 para msg = format_amxstring(amx, params, 3, len); - if (*msg > 4) // Insert default color code at the start if not present, otherwise message will not be colored. + if (static_cast<byte>(*msg) > 4) // Insert default color code at the start if not present, otherwise message will not be colored. { memmove(msg + 1, msg, ke::Min(len++, 191)); *msg = 1; From faf7da4c2c5aa1bbe3f2351391c0a781073f9b38 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 28 Jul 2018 21:35:34 +0200 Subject: [PATCH 21/98] Fix a buffer issue in EngFunc_LightStyle (#508) --- modules/fakemeta/engfunc.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/fakemeta/engfunc.cpp b/modules/fakemeta/engfunc.cpp index efcf35ac..4bec6225 100644 --- a/modules/fakemeta/engfunc.cpp +++ b/modules/fakemeta/engfunc.cpp @@ -12,9 +12,12 @@ // #include "fakemeta_amxx.h" +#include <engine_strucs.h> TraceResult g_tr; +ke::AString LightStyleBuffers[MAX_LIGHTSTYLES]; + //by mahnsawce from his NS module static cell AMX_NATIVE_CALL engfunc(AMX *amx, cell *params) { @@ -595,8 +598,13 @@ static cell AMX_NATIVE_CALL engfunc(AMX *amx, cell *params) case EngFunc_LightStyle: // void ) (int style, const char* val); cRet = MF_GetAmxAddr(amx,params[2]); iparam1=cRet[0]; - temp = MF_GetAmxString(amx,params[3],0,&len); - (*g_engfuncs.pfnLightStyle)(iparam1,temp); + if (iparam1 < 0 || iparam1 >= ARRAYSIZE(LightStyleBuffers)) + { + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid style %d", iparam1); + return 0; + } + LightStyleBuffers[iparam1] = MF_GetAmxString(amx, params[3], 0, &len); + (*g_engfuncs.pfnLightStyle)(iparam1, LightStyleBuffers[iparam1].chars()); return 1; From a784a345615185cbfbcf94fba8a2be3aebb2f4eb Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Thu, 9 Aug 2018 15:37:24 +0200 Subject: [PATCH 22/98] Fix documentation (#513) --- plugins/include/amxmodx.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index 94a51abb..ce554cf8 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -459,7 +459,7 @@ native client_print_color(index, sender, const message[], any:...); * last, to the client with the highest index. * * @param player Client index, use 0 to display to all clients - * @param type Message type, see print_* destination constants in + * @param type Message type, see engprint_* destination constants in * amxconst.inc * @param message Formatting rules * @param ... Variable number of formatting parameters From 0bfc65c635dd24177170d37e092c6b7cc4e7d634 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Thu, 9 Aug 2018 15:38:58 +0200 Subject: [PATCH 23/98] Add default values for menu_item_getinfo (#511) --- plugins/include/newmenus.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/newmenus.inc b/plugins/include/newmenus.inc index 98faad81..9485ab2f 100644 --- a/plugins/include/newmenus.inc +++ b/plugins/include/newmenus.inc @@ -221,7 +221,7 @@ native menu_find_id(menu, page, key); * @return 1 on success, 0 on failure. * @error Invalid menu resource. */ -native menu_item_getinfo(menu, item, &access, info[], infolen, name[]="", namelen=0, &callback); +native menu_item_getinfo(menu, item, &access = 0, info[] = "", infolen = 0, name[]="", namelen=0, &callback = 0); /** * Sets an item's display text. From 05b74111d3d1935716cef4c35cfac56a27425867 Mon Sep 17 00:00:00 2001 From: justgo97 <hamdi2050@live.com> Date: Mon, 20 Aug 2018 18:46:00 +0100 Subject: [PATCH 24/98] Allow arrayset to accept any type (#516) --- plugins/include/amxmodx.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index ce554cf8..0eb42b1e 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -3283,7 +3283,7 @@ native DestroyForward(forward_handle); * * @noreturn */ -native arrayset(array[], value, size); +native arrayset(any:array[], any:value, size); /** * Returns the weapon id associated with a weapon name. From eff74fe8628f09243ed54dd132855ba9571b74b0 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 20 Aug 2018 19:46:26 +0200 Subject: [PATCH 25/98] Execute amxx.cfg before plugin_init to keep compatibility (#512) --- amxmodx/meta_api.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/amxmodx/meta_api.cpp b/amxmodx/meta_api.cpp index 32c81cfd..e0b19859 100755 --- a/amxmodx/meta_api.cpp +++ b/amxmodx/meta_api.cpp @@ -657,10 +657,11 @@ void C_ServerActivate_Post(edict_t *pEdictList, int edictCount, int clientMax) pPlayer->Init(pEdictList + i, i); } + CoreCfg.ExecuteMainConfig(); // Execute amxx.cfg + executeForwards(FF_PluginInit); executeForwards(FF_PluginCfg); - CoreCfg.ExecuteMainConfig(); // Execute amxx.cfg CoreCfg.ExecuteAutoConfigs(); // Execute configs created with AutoExecConfig native. CoreCfg.SetMapConfigTimer(6.1); // Prepare per-map configs to be executed 6.1 seconds later. // Original value which was used in admin.sma. From 0765dc8a0d15e4b3547385cb9abaffc4c05b1566 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Mon, 20 Aug 2018 19:49:47 +0200 Subject: [PATCH 26/98] Improve messages.inc and message_stocks.inc documentation (#510) * Improve messages.inc and message_stocks.inc documentation * Fix typos * Fixed typos, added a bunch of @notes and better register_message callback function explanation * Removed extra argument in set_msg_arg_string * Creates => Sends --- plugins/include/message_stocks.inc | 30 +- plugins/include/messages.inc | 569 +++++++++++++++++++++++++++-- 2 files changed, 561 insertions(+), 38 deletions(-) diff --git a/plugins/include/message_stocks.inc b/plugins/include/message_stocks.inc index 219446dc..a9161945 100644 --- a/plugins/include/message_stocks.inc +++ b/plugins/include/message_stocks.inc @@ -16,7 +16,15 @@ #endif #define _message_stocks_included -/* Creates a death message. */ +/** + * Sends a death message. + * + * @param killer Killer id + * @param victim Victim id + * @param weaponNUM Weapon index + * + * @noreturn + */ stock dod_make_deathmsg(killer, victim, weaponNUM) { static msgid = 0; @@ -33,7 +41,14 @@ stock dod_make_deathmsg(killer, victim, weaponNUM) return 1; } -/* Kills a user without a message. */ +/** + * Kills a user without a message. + * + * @param index Client index + * @param flag If nonzero, the death will not affect the client's score + * + * @noreturn + */ stock user_silentkill(index, flag = 1) { static msgid = 0; @@ -50,7 +65,16 @@ stock user_silentkill(index, flag = 1) return 1; } -/* Creates a death message. */ +/** + * Creates a death message. + * + * @param killer Killer id + * @param victim Victim id + * @param headshot Headshot + * @param weapon Weapon + * + * @noreturn + */ stock make_deathmsg(killer, victim, headshot, const weapon[]) { static msgid = 0; diff --git a/plugins/include/messages.inc b/plugins/include/messages.inc index 97ed18d0..c0ef1569 100644 --- a/plugins/include/messages.inc +++ b/plugins/include/messages.inc @@ -18,88 +18,587 @@ #include <message_const> -/* These functinos are used to generate client messages. - * You may generate menu, smoke, shockwaves, thunderlights, - * intermission and many many others messages. - * See HL SDK for more examples. */ +/** + * Marks the beginning of a client message. + * + * @note You may generate menus, smoke, shockwaves, thunderlights, + * intermission and many other messages. + * @note For a list of HL game events, visit https://wiki.alliedmods.net/Half-Life_1_Game_Events + * @note For a list of HL engine messages, visit https://wiki.alliedmods.net/Half-Life_1_Engine_Messages + * @note You may also refer to the messages_const.inc file for examples. + * @note Each message starts with a message_begin() or message_begin_f() function + * and ends with message_end(). The specific message arguments go in between + * these two by using the write_*() functions found in messages.inc. + * + * @param dest Destination type (see MSG_* constants in messages_const.inc) + * @param msg_type Message id + * @param origin Message origin + * @param player Client index receiving the message or 0 for all clients + * + * @noreturn + * @error If an invalid message id is specified or an invalid number + * of parameters is passed, an error will be thrown. + */ native message_begin(dest, msg_type, const origin[3] = {0,0,0}, player = 0); + +/** + * Marks the beginning of a client message. + * + * @note You may generate menus, smoke, shockwaves, thunderlights, + * intermission and many other messages. + * @note For a list of HL game events, visit https://wiki.alliedmods.net/Half-Life_1_Game_Events + * @note For a list of HL engine messages, visit https://wiki.alliedmods.net/Half-Life_1_Engine_Messages + * @note You may also refer to the messages_const.inc file for examples. + * @note This function is the same as message_begin(), but the origin + * argument accepts only float values in this one. + * @note Each message starts with a message_begin() or message_begin_f() function + * and ends with message_end(). The specific message arguments go in between + * these two by using the write_*() functions found in messages.inc. + * + * @param dest Destination type (see MSG_* constants in messages_const.inc) + * @param msg_type Message id + * @param origin Message origin + * @param player Client index receiving the message or 0 for all clients + * + * @noreturn + * @error If an invalid message id is specified or an invalid number + * of parameters is passed, an error will be thrown. + */ native message_begin_f(dest, msg_type, const Float:origin[3] = {0.0,0.0,0.0}, player = 0); + +/** + * Ends a message that was started with message_begin() or message_begin_f(). + * + * @note If the function is called without using message_begin() or + * message_begin_f() first, the server will crash immediately. + * + * @noreturn + */ native message_end(); + +/** + * Writes a single byte to a message. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Byte to write + * + * @noreturn + */ native write_byte(x); + +/** + * Writes a single character to a message. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Character to write + * + * @noreturn + */ native write_char(x); + +/** + * Writes a single number to a message (short). + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Number to write + * + * @noreturn + */ native write_short(x); + +/** + * Writes a single number to a message (long). + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Number to write + * + * @noreturn + */ native write_long(x); + +/** + * Writes an entity index to a message. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Entity index to write + * + * @noreturn + */ native write_entity(x); + +/** + * Writes an angle entry to a message. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Angle to write + * + * @noreturn + */ native write_angle(x); + +/** + * Writes an angle entry to a message using a float value. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Angle to write + * + * @noreturn + */ native write_angle_f(Float:x); + +/** + * Writes a coordinate entry to a message. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Coordinate to write + * + * @noreturn + */ native write_coord(x); + +/** + * Writes a coordinate entry to a message using a float value. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Coordinate to write + * + * @noreturn + */ native write_coord_f(Float:x); + +/** + * Writes a string to a message. + * + * @note This function should only be used in between a message_begin() + * or message_begin_f() and a message_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x String to write + * + * @noreturn + */ native write_string(const x[]); -/* These are the same as above, except that the messages sent - * are also sent to all other plugins and Metamod plugins. - * This means that if you send one of these messages, other plugins will - * be notified, which was previously impossible. - * BE CAREFUL! Using these incorrectly, or not for their intended purpose, - * could cause infinite recursion or something just as bad. - * NOTE! These natives are experimental. +/** + * Marks the beginning of a client message. + * + * @note You may generate menus, smoke, shockwaves, thunderlights, + * intermission and many other messages. + * @note For a list of HL game events, visit https://wiki.alliedmods.net/Half-Life_1_Game_Events + * @note For a list of HL engine messages, visit https://wiki.alliedmods.net/Half-Life_1_Engine_Messages + * @note You may also refer to the messages_const.inc file for examples. + * @note This function is the same as message_begin(), except that the messages + * sent with this one are also sent to all other AMXX and Metamod plugins. + * This means that if you send one of these messages, other plugins will + * be notified of that message, which was previously impossible. + * @note BE CAREFUL! Using this incorrectly, or not for its intended purpose, + * could cause infinite recursion or something just as bad! + * @note Each message starts with a emessage_begin() or emessage_begin_f() function + * and ends with emessage_end(). The specific message arguments go in between + * these two by using the ewrite_*() functions found in messages.inc. + * + * @param dest Destination type (see MSG_* constants in messages_const.inc) + * @param msg_type Message id + * @param origin Message origin + * @param player Client index receiving the message or 0 for all clients + * + * @noreturn + * @error If an invalid message id is specified or an invalid number + * of parameters is passed, an error will be thrown. */ native emessage_begin(dest, msg_type, const origin[3] = {0,0,0}, player = 0); + +/** + * Marks the beginning of a client message. + * + * @note You may generate menus, smoke, shockwaves, thunderlights, + * intermission and many other messages. + * @note For a list of HL game events, visit https://wiki.alliedmods.net/Half-Life_1_Game_Events + * @note For a list of HL engine messages, visit https://wiki.alliedmods.net/Half-Life_1_Engine_Messages + * @note You may also refer to the messages_const.inc file for examples. + * @note This function is the same as message_begin_f(), except that the messages + * sent with this one are also sent to all other AMXX and Metamod plugins. + * This means that if you send one of these messages, other plugins will + * be notified of that message, which was previously impossible. + * @note BE CAREFUL! Using this incorrectly, or not for its intended purpose, + * could cause infinite recursion or something just as bad! + * @note This function is the same as emessage_begin(), but the origin + * argument accepts only float values in this one. + * @note Each message starts with a emessage_begin() or emessage_begin_f() function + * and ends with emessage_end(). The specific message arguments go in between + * these two by using the ewrite_*() functions found in messages.inc. + * + * @param dest Destination type (see MSG_* constants in messages_const.inc) + * @param msg_type Message id + * @param origin Message origin + * @param player Client index receiving the message or 0 for all clients + * + * @noreturn + * @error If an invalid message id is specified or an invalid number + * of parameters is passed, an error will be thrown. + */ native emessage_begin_f(dest, msg_type, const Float:origin[3] = {0.0,0.0,0.0}, player = 0); + +/** + * Ends a message that was started with emessage_begin() or emessage_begin_f(). + * + * @note If the function is called without using emessage_begin() or + * emessage_begin_f() first, the server will crash immediately. + * + * @noreturn + */ native emessage_end(); + +/** + * Writes a single byte to a message. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Byte to write + * + * @noreturn + */ native ewrite_byte(x); + +/** + * Writes a single character to a message. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Character to write + * + * @noreturn + */ native ewrite_char(x); + +/** + * Writes a single number to a message (short). + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Number to write + * + * @noreturn + */ native ewrite_short(x); + +/** + * Writes a single number to a message (long). + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Number to write + * + * @noreturn + */ native ewrite_long(x); + +/** + * Writes an entity index to a message. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Entity index to write + * + * @noreturn + */ native ewrite_entity(x); + +/** + * Writes an angle entry to a message. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Angle to write + * + * @noreturn + */ native ewrite_angle(x); + +/** + * Writes an angle entry to a message using a float value. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Angle to write + * + * @noreturn + */ native ewrite_angle_f(Float:x); + +/** + * Writes a coordinate entry to a message. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Coordinate to write + * + * @noreturn + */ native ewrite_coord(x); + +/** + * Writes a coordinate entry to a message using a float value. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x Coordinate to write + * + * @noreturn + */ native ewrite_coord_f(Float:x); + +/** + * Writes a string to a message. + * + * @note This function should only be used in between a emessage_begin() + * or emessage_begin_f() and a emessage_end() function. Trying to use + * it outside of these functions will crash the server immediately. + * + * @param x String to write + * + * @noreturn + */ native ewrite_string(const x[]); -/* Sets/Gets what engine messages are blocked. */ +/** + * Sets whether or not an engine message will be blocked. + * + * @note For a list of message flags, have a look at the BLOCK_* constants + * in message_const.inc. + * + * @param iMessage Message id + * @param iMessageFlags BLOCK_* constant + * + * @noreturn + * @error If an invalid message id is specified, an error + * will be thrown. + */ native set_msg_block(iMessage, iMessageFlags); + +/** + * Gets whether or not an engine message is blocked. + * + * @param iMessage Message id + * + * @return BLOCK_* constant + * @error If an invalid message id is specified, an error + * will be thrown. + */ native get_msg_block(iMessage); -/* Lets you directly hook a message in the engine! - * You can overwrite the message before anything happens and either let the message continue - * or fully block it. Here is how it works: - * If you hook a message, the message is stored but not sent. You have the opportunity to - * not only execute code, but to get/set the contents of the message, before you choose to - * either block it or let it go on its way. The hooked function will be passed a msg_id, msg_dest, and entity index. - * The return value can be passed to unregister_message() to stop the message from being hooked */ +/** + * Lets you directly hook a message in the engine. + * + * @note The function is called in the following manner: + * msg_id - Message id + * msg_dest - Destination type (see MSG_* constants in messages_const.inc) + * msg_entity - Entity receiving the message + * + * @note You can overwrite the message before anything happens by using the + * set_msg_arg_* functions and either let the message continue by + * returning PLUGIN_CONTINUE or fully block it with PLUGIN_HANDLED. + * @note If you hook a message, the message is stored but not sent. You have + * the opportunity to not only execute code, but to get/set the contents + * of the message before you choose to either block it or let it go on + * its way. + * @note The return value can be passed to unregister_message() in order to + * stop the message from being hooked. + * + * @param iMsgId Message id + * @param szFunction Function that will be called + * + * @return Id that can be passed to unregister_message() on + * success, or 0 if an invalid message id is passed + * @error If the specified function can't be found, an + * error will be thrown. + */ native register_message(iMsgId, const szFunction[]); -/* Unregisters a message hook previously created with register_message - * You must pass the proper message id, and return value from the message to unregister the message successfully. */ +/** + * Unregisters a message hook previously created with register_message(). + * + * @note You must pass the proper message id and return value from the + * message to unregister the message successfully. + * + * @param iMsgId Message id + * @param registeredmsg Registered message id + * + * @return Id that can again be passed to register_message() on + * success, or 0 if an invalid message id is passed + * @error If an invalid registered message handle is passed, an + * error will be thrown. + */ native unregister_message(iMsgId, registeredmsg); - -/* The get/set _msg commands will fail if used outside a hooked message scope. - * They should never be used unless inside a registered message function. - * There are eight different ways of sending a message, five are ints, two are floats, and one is string. - * These are denoted by iArgType. argn is the number - * of the argument. Exceeding the bounds of 1 to get_msg_args() is a bad idea. - * As of AMX Mod X 1.5, the middle parameter of set_* no longer does anything. - * You cannot change the message argument type (as this would crash the mod anyway) +/** + * Gets number of arguments that were passed to a message. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @return Number of arguments */ - -/* Gets number of arguments that were passed to this message */ native get_msg_args(); -/* Gets the argument type of argument argn */ +/** + * Gets the argument type of a specified argument. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param argn Argument number + * + * @return Argument type (see ARG_* constants in message_const.inc) + */ native get_msg_argtype(argn); -/* Gets the value of argn. */ +/** + * Gets the integer value of a specified argument. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param argn Argument number + * + * @return Argument value as an integer + * @error If an invalid message argument is passed, an + * error will be thrown. + */ native get_msg_arg_int(argn); + +/** + * Gets the float value of a specified argument. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param argn Argument number + * + * @return Argument value as a float + * @error If an invalid message argument is passed, an + * error will be thrown. + */ native Float:get_msg_arg_float(argn); + +/** + * Gets the string value from a specified argument. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param argn Argument number + * @param szReturn Buffer to store the value in + * @param iLength Maximum buffer length + * + * @return String length + * @error If an invalid message argument is passed, an + * error will be thrown. + */ native get_msg_arg_string(argn, szReturn[], iLength); -/* sets the value of argn. */ +/** + * Sets the integer value of a specified argument. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param argn Argument number + * @param argtype Argument type (see ARG_* constants in message_const.inc) + * @param iValue Argument value + * + * @noreturn + * @error If an invalid message argument is passed, an + * error will be thrown. + */ native set_msg_arg_int(argn, argtype, iValue); + +/** + * Sets the float value of a specified argument. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param argn Argument number + * @param argtype Argument type (see ARG_* constants in message_const.inc) + * @param fValue Argument value + * + * @noreturn + * @error If an invalid message argument is passed, an + * error will be thrown. + */ native set_msg_arg_float(argn, argtype, Float:fValue); + +/** + * Sets the string value of a specified argument. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param argn Argument number + * @param szString Argument value + * + * @noreturn + * @error If an invalid message argument is passed, an + * error will be thrown. + */ native set_msg_arg_string(argn, const szString[]); -/* Gets the origin of a message */ +/** + * Gets the origin of a message. + * + * @note This function will fail if used outside a hooked message scope, thus + * it should never be used unless inside a registered message function. + * + * @param _Origin Array to store the origin in + * + * @noreturn + * @error If the function is used outside a message hook, an + * error will be thrown. + */ native get_msg_origin(const Float:_Origin[3]); From 6528677dcc51441421117f46c6046f16aa289a85 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Mon, 20 Aug 2018 19:50:43 +0200 Subject: [PATCH 27/98] Add @note in get_user_msgid() (#506) * Update lang.inc * Update lang.inc * Update amxmodx.inc * Improve @note phrasing --- plugins/include/amxmodx.inc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index 0eb42b1e..a60bd0ad 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -2142,6 +2142,9 @@ native random_num(a, b); * @note Example usage: get_user_msgid("TextMsg") * @note The message id is unique as long as the server is running, but might * change between updates. They should not be hardcoded into plugins. + * @note On first server start, this function will return 0 if used inside + * plugin_precache(). Consider hooking RegUserMsg in order to retrieve + * the correct message id. * * @param name Client message name * From ac57ed5b449e80dfb3d1ea9e7faa55a977af5c43 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Sat, 25 Aug 2018 09:18:26 +0200 Subject: [PATCH 28/98] Add get_user_rendering (#514) * Add get_user_rendering * Added & in arguments * Changed zeroes to kRender constants * Changed zeros to kRender constants --- modules/fun/fun.cpp | 27 +++++++++++++++++++++++++++ plugins/include/fun.inc | 20 ++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/modules/fun/fun.cpp b/modules/fun/fun.cpp index 86f00fd8..44e42790 100644 --- a/modules/fun/fun.cpp +++ b/modules/fun/fun.cpp @@ -325,6 +325,32 @@ static cell AMX_NATIVE_CALL set_user_rendering(AMX *amx, cell *params) // set_us return 1; } +static cell AMX_NATIVE_CALL get_user_rendering(AMX *amx, cell *params) // get_user_rendering(index, &fx = kRenderFxNone, &r = 0, &g = 0, &b = 0, &render = kRenderNormal, &amount = 0); = 7 arguments +{ + // Gets user rendering. + // params[1] = index + // params[2] = fx + // params[3] = r + // params[4] = g + // params[5] = b + // params[6] = render + // params[7] = amount + + // Check index + CHECK_PLAYER(params[1]); + + // Fetch player pointer + edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + + *MF_GetAmxAddr(amx, params[2]) = pPlayer->v.renderfx; + *MF_GetAmxAddr(amx, params[3]) = pPlayer->v.rendercolor[0]; + *MF_GetAmxAddr(amx, params[4]) = pPlayer->v.rendercolor[1]; + *MF_GetAmxAddr(amx, params[5]) = pPlayer->v.rendercolor[2]; + *MF_GetAmxAddr(amx, params[6]) = pPlayer->v.rendermode; + *MF_GetAmxAddr(amx, params[7]) = pPlayer->v.renderamt; + + return 1; +} static cell AMX_NATIVE_CALL set_user_maxspeed(AMX *amx, cell *params) // set_user_maxspeed(index, Float:speed = -1.0) = 2 arguments { @@ -548,6 +574,7 @@ AMX_NATIVE_INFO fun_Exports[] = { {"set_user_armor", set_user_armor}, {"set_user_origin", set_user_origin}, {"set_user_rendering", set_user_rendering}, + {"get_user_rendering", get_user_rendering}, {"set_user_maxspeed", set_user_maxspeed}, {"get_user_maxspeed", get_user_maxspeed}, {"set_user_gravity", set_user_gravity}, diff --git a/plugins/include/fun.inc b/plugins/include/fun.inc index d284af1e..a68213a8 100755 --- a/plugins/include/fun.inc +++ b/plugins/include/fun.inc @@ -125,6 +125,26 @@ native set_user_origin(index, const origin[3]); */ native set_user_rendering(index, fx = kRenderFxNone, r = 0, g = 0, b = 0, render = kRenderNormal, amount = 0); +/** + * Gets player's rendering mode. + * + * @note A really useful render modes reference: + * https://sites.google.com/site/svenmanor/rendermodes + * + * @param index Client index + * @param fx Variable to store the rendering effect + * @param r Variable to store the amount of red color + * @param g Variable to store the amount of green color + * @param b Variable to store the amount of blue color + * @param render Variable to store the render mode + * @param amount Variable to store the render amount + * + * @noreturn + * @error If player is not connected or not within the range + * of 1 to MaxClients. + */ +native get_user_rendering(index, &fx = kRenderFxNone, &r = 0, &g = 0, &b = 0, &render = kRenderNormal, &amount = 0); + /** * Gives an item to a player. * From 605d1a5b1eb2576f10805b61a77aac8d33684269 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 25 Aug 2018 09:18:39 +0200 Subject: [PATCH 29/98] Fix callback from amx_clientcmd not working properly (#518) --- amxmodx/util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/amxmodx/util.cpp b/amxmodx/util.cpp index 913e1427..8b3713dc 100755 --- a/amxmodx/util.cpp +++ b/amxmodx/util.cpp @@ -373,8 +373,8 @@ void UTIL_FakeClientCommand(edict_t *pEdict, const char *cmd, const char *arg1, { if ((*aa).matchCommandLine(cmd, arg1) && (*aa).getPlugin()->isExecutable((*aa).getFunction())) { - if (executeForwards((*aa).getFunction(), static_cast<cell>(GET_PLAYER_POINTER(pEdict)->index)), - static_cast<cell>((*aa).getFlags()), static_cast<cell>((*aa).getId()) > 0) + if (executeForwards((*aa).getFunction(), static_cast<cell>(GET_PLAYER_POINTER(pEdict)->index), + static_cast<cell>((*aa).getFlags()), static_cast<cell>((*aa).getId())) > 0) { g_fakecmd.notify = false; return; From ce14df0c77289905ef44e2919c3cfd8098d24445 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 25 Aug 2018 09:18:51 +0200 Subject: [PATCH 30/98] CStrike: Fix a missing RemoveEntityHashValue function address check (#519) --- modules/cstrike/cstrike/CstrikeHacks.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cstrike/cstrike/CstrikeHacks.cpp b/modules/cstrike/cstrike/CstrikeHacks.cpp index 562c6a34..2e0f27ad 100644 --- a/modules/cstrike/cstrike/CstrikeHacks.cpp +++ b/modules/cstrike/cstrike/CstrikeHacks.cpp @@ -721,9 +721,9 @@ void InitFuncsAddresses() MF_Log("UTIL_FindEntByString is not available - native cs_find_ent_by_class() has been disabled"); } - if (!AddEntityHashValue || !AddEntityHashValue) + if (!AddEntityHashValue || !RemoveEntityHashValue) { - MF_Log("AddEntityHashValue or AddEntityHashValue is not available - native cs_set_ent_class() has been disabled"); + MF_Log("AddEntityHashValue or RemoveEntityHashValue is not available - native cs_set_ent_class() has been disabled"); } if (!HasReGameDll && !GetWeaponInfo) From f822cc610f974dfd526ea1f598109f7e3109747f Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 25 Aug 2018 09:20:06 +0200 Subject: [PATCH 31/98] Update ReSDK API to latest version (#520) --- modules/cstrike/cstrike/CstrikeItemsInfos.cpp | 2 +- modules/cstrike/cstrike/CstrikeItemsInfos.h | 8 +- .../cstrike/cstrike/CstrikeUserMessages.cpp | 2 +- .../cstrike/cstrike/msvc12/cstrike.vcxproj | 13 +- .../cstrike/msvc12/cstrike.vcxproj.filters | 36 +- modules/fakemeta/msvc12/fakemeta.vcxproj | 9 +- .../fakemeta/msvc12/fakemeta.vcxproj.filters | 22 +- public/engine_strucs.h | 12 + public/resdk/common/hookchains.h | 1 + public/resdk/cstrike/API/CSEntity.h | 65 +++ .../CSInterfaces.h} | 83 +-- public/resdk/cstrike/API/CSPlayer.h | 123 +++++ public/resdk/cstrike/API/CSPlayerItem.h | 68 +++ public/resdk/cstrike/API/CSPlayerWeapon.h | 50 ++ public/resdk/cstrike/regamedll_api.h | 498 +++++++++++------- public/resdk/engine/IObjectContainer.h | 47 ++ public/resdk/engine/ObjectList.h | 65 +++ public/resdk/engine/cmd_rehlds.h | 4 +- public/resdk/engine/pr_dlls.h | 48 ++ public/resdk/engine/rehlds_api.h | 28 +- public/resdk/engine/rehlds_interfaces.h | 1 + public/resdk/mod_regamedll_api.cpp | 6 +- public/resdk/mod_rehlds_api.cpp | 8 +- 23 files changed, 891 insertions(+), 308 deletions(-) create mode 100644 public/resdk/cstrike/API/CSEntity.h rename public/resdk/cstrike/{regamedll_interfaces.h => API/CSInterfaces.h} (75%) create mode 100644 public/resdk/cstrike/API/CSPlayer.h create mode 100644 public/resdk/cstrike/API/CSPlayerItem.h create mode 100644 public/resdk/cstrike/API/CSPlayerWeapon.h create mode 100644 public/resdk/engine/IObjectContainer.h create mode 100644 public/resdk/engine/ObjectList.h create mode 100644 public/resdk/engine/pr_dlls.h diff --git a/modules/cstrike/cstrike/CstrikeItemsInfos.cpp b/modules/cstrike/cstrike/CstrikeItemsInfos.cpp index 72934985..bf20b937 100644 --- a/modules/cstrike/cstrike/CstrikeItemsInfos.cpp +++ b/modules/cstrike/cstrike/CstrikeItemsInfos.cpp @@ -17,7 +17,7 @@ #include <resdk/mod_regamedll_api.h> CsItemInfo ItemsManager; -ItemInfo WeaponsList[MAX_WEAPONS]; +ItemInfos WeaponsList[MAX_WEAPONS]; #define PSTATE_ALIASES_TYPE 0 #define PSTATE_ALIASES_ALIAS 1 diff --git a/modules/cstrike/cstrike/CstrikeItemsInfos.h b/modules/cstrike/cstrike/CstrikeItemsInfos.h index 294843a9..49223e89 100644 --- a/modules/cstrike/cstrike/CstrikeItemsInfos.h +++ b/modules/cstrike/cstrike/CstrikeItemsInfos.h @@ -20,12 +20,12 @@ #include <amtl/am-string.h> #include <sm_stringhashmap.h> -struct ItemInfo +struct ItemInfos { - ItemInfo() : name("Empty"), ammoIndex1(-1), maxAmmo1(0), ammoIndex2(-1), maxAmmo2(0), slot(0), position(0), id(0), flags(0) + ItemInfos() : name("Empty"), ammoIndex1(-1), maxAmmo1(0), ammoIndex2(-1), maxAmmo2(0), slot(0), position(0), id(0), flags(0) {} - ItemInfo &operator = (ItemInfo &other) + ItemInfos &operator = (ItemInfos &other) { name = other.name; ammoIndex1 = other.ammoIndex1; @@ -133,7 +133,7 @@ class CsItemInfo : public ITextListener_SMC int m_EquipmentsPrice[static_cast<size_t>(Equipments::Count)]; }; -extern ItemInfo WeaponsList[MAX_WEAPONS]; +extern ItemInfos WeaponsList[MAX_WEAPONS]; extern CsItemInfo ItemsManager; #endif // _CSTRIKE_WEAPONS_INFOS_H_ diff --git a/modules/cstrike/cstrike/CstrikeUserMessages.cpp b/modules/cstrike/cstrike/CstrikeUserMessages.cpp index e05329d1..c1995eae 100644 --- a/modules/cstrike/cstrike/CstrikeUserMessages.cpp +++ b/modules/cstrike/cstrike/CstrikeUserMessages.cpp @@ -22,7 +22,7 @@ bool ShouldBlock; bool ShouldBlockHLTV; bool ShouldDisableHooks; bool RetrieveWeaponList; -ItemInfo CurrentWeaponList; +ItemInfos CurrentWeaponList; int ArgPosition; int MessageIdArmorType; diff --git a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj index a4236b78..91f3b0ab 100644 --- a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj +++ b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj @@ -165,9 +165,18 @@ <ClInclude Include="..\..\..\..\public\memtools\CDetour\detours.h" /> <ClInclude Include="..\..\..\..\public\memtools\MemoryUtils.h" /> <ClInclude Include="..\..\..\..\public\resdk\common\hookchains.h" /> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSEntity.h" /> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSInterfaces.h" /> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSPlayer.h" /> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSPlayerItem.h" /> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSPlayerWeapon.h" /> <ClInclude Include="..\..\..\..\public\resdk\cstrike\regamedll_api.h" /> <ClInclude Include="..\..\..\..\public\resdk\cstrike\regamedll_const.h" /> - <ClInclude Include="..\..\..\..\public\resdk\cstrike\regamedll_interfaces.h" /> + <ClInclude Include="..\..\..\..\public\resdk\engine\cmd_rehlds.h" /> + <ClInclude Include="..\..\..\..\public\resdk\engine\FlightRecorder.h" /> + <ClInclude Include="..\..\..\..\public\resdk\engine\IObjectContainer.h" /> + <ClInclude Include="..\..\..\..\public\resdk\engine\ObjectList.h" /> + <ClInclude Include="..\..\..\..\public\resdk\engine\pr_dlls.h" /> <ClInclude Include="..\..\..\..\public\resdk\engine\rehlds_api.h" /> <ClInclude Include="..\..\..\..\public\resdk\engine\rehlds_interfaces.h" /> <ClInclude Include="..\..\..\..\public\resdk\mod_regamedll_api.h" /> @@ -188,4 +197,4 @@ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters index 784cc11c..3d023ab5 100644 --- a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters +++ b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters @@ -39,6 +39,9 @@ <Filter Include="ReSDK\cstrike"> <UniqueIdentifier>{ba0b72ba-25d8-48c3-af84-c1d4d7436636}</UniqueIdentifier> </Filter> + <Filter Include="ReSDK\cstrike\API"> + <UniqueIdentifier>{67de85cb-b8e7-4cd6-b8cf-2ff7ed540c2b}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CstrikeHacks.cpp"> @@ -127,9 +130,6 @@ <ClInclude Include="..\..\..\..\public\resdk\cstrike\regamedll_const.h"> <Filter>ReSDK\cstrike</Filter> </ClInclude> - <ClInclude Include="..\..\..\..\public\resdk\cstrike\regamedll_interfaces.h"> - <Filter>ReSDK\cstrike</Filter> - </ClInclude> <ClInclude Include="..\..\..\..\public\resdk\engine\rehlds_api.h"> <Filter>ReSDK\engine</Filter> </ClInclude> @@ -142,6 +142,36 @@ <ClInclude Include="..\..\..\..\public\resdk\mod_rehlds_api.h"> <Filter>ReSDK</Filter> </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSEntity.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSInterfaces.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSPlayer.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSPlayerItem.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\cstrike\API\CSPlayerWeapon.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\engine\cmd_rehlds.h"> + <Filter>ReSDK\engine</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\engine\FlightRecorder.h"> + <Filter>ReSDK\engine</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\engine\IObjectContainer.h"> + <Filter>ReSDK\engine</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\engine\ObjectList.h"> + <Filter>ReSDK\engine</Filter> + </ClInclude> + <ClInclude Include="..\..\..\..\public\resdk\engine\pr_dlls.h"> + <Filter>ReSDK\engine</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="..\..\..\..\plugins\include\cstrike.inc"> diff --git a/modules/fakemeta/msvc12/fakemeta.vcxproj b/modules/fakemeta/msvc12/fakemeta.vcxproj index 25774f26..3cf5703f 100644 --- a/modules/fakemeta/msvc12/fakemeta.vcxproj +++ b/modules/fakemeta/msvc12/fakemeta.vcxproj @@ -120,11 +120,14 @@ <ClInclude Include="..\..\..\public\HLTypeConversion.h" /> <ClInclude Include="..\..\..\public\memtools\MemoryUtils.h" /> <ClInclude Include="..\..\..\public\resdk\common\hookchains.h" /> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSEntity.h" /> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSInterfaces.h" /> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSPlayer.h" /> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSPlayerItem.h" /> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSPlayerWeapon.h" /> <ClInclude Include="..\..\..\public\resdk\cstrike\regamedll_api.h" /> <ClInclude Include="..\..\..\public\resdk\cstrike\regamedll_const.h" /> - <ClInclude Include="..\..\..\public\resdk\cstrike\regamedll_interfaces.h" /> <ClInclude Include="..\..\..\public\resdk\mod_regamedll_api.h" /> - <ClInclude Include="..\..\..\public\resdk\mod_rehlds_api.h" /> <ClInclude Include="..\fakemeta_amxx.h" /> <ClInclude Include="..\fm_tr.h" /> <ClInclude Include="..\dllfunc.h" /> @@ -148,4 +151,4 @@ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/fakemeta/msvc12/fakemeta.vcxproj.filters b/modules/fakemeta/msvc12/fakemeta.vcxproj.filters index 4c16bd55..bc479670 100644 --- a/modules/fakemeta/msvc12/fakemeta.vcxproj.filters +++ b/modules/fakemeta/msvc12/fakemeta.vcxproj.filters @@ -45,6 +45,9 @@ <Filter Include="ReSDK\cstrike"> <UniqueIdentifier>{0d1c5025-071d-43aa-b19a-2eee0d34a906}</UniqueIdentifier> </Filter> + <Filter Include="ReSDK\cstrike\API"> + <UniqueIdentifier>{2800175e-06bf-42bf-b3c1-f86561471531}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\fakemeta_amxx.cpp"> @@ -145,14 +148,23 @@ <ClInclude Include="..\..\..\public\resdk\cstrike\regamedll_const.h"> <Filter>ReSDK\cstrike</Filter> </ClInclude> - <ClInclude Include="..\..\..\public\resdk\cstrike\regamedll_interfaces.h"> - <Filter>ReSDK\cstrike</Filter> - </ClInclude> <ClInclude Include="..\..\..\public\resdk\mod_regamedll_api.h"> <Filter>ReSDK</Filter> </ClInclude> - <ClInclude Include="..\..\..\public\resdk\mod_rehlds_api.h"> - <Filter>ReSDK</Filter> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSEntity.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSInterfaces.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSPlayer.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSPlayerItem.h"> + <Filter>ReSDK\cstrike\API</Filter> + </ClInclude> + <ClInclude Include="..\..\..\public\resdk\cstrike\API\CSPlayerWeapon.h"> + <Filter>ReSDK\cstrike\API</Filter> </ClInclude> </ItemGroup> <ItemGroup> diff --git a/public/engine_strucs.h b/public/engine_strucs.h index c426466d..bb3bf806 100644 --- a/public/engine_strucs.h +++ b/public/engine_strucs.h @@ -516,4 +516,16 @@ typedef struct client_s } client_t; +using cvar_callback_t = void (*)(const char *pszNewValue); + +struct cvar_listener_t +{ + cvar_listener_t(const char *var_name, cvar_callback_t handler) : + func(handler), name(var_name) {} + + cvar_callback_t func; + const char *name; +}; + + #endif //_ENGINE_STRUCTS_H_ diff --git a/public/resdk/common/hookchains.h b/public/resdk/common/hookchains.h index 7ea472a6..38b8747a 100644 --- a/public/resdk/common/hookchains.h +++ b/public/resdk/common/hookchains.h @@ -25,6 +25,7 @@ * version. * */ + #pragma once template<typename t_ret, typename ...t_args> diff --git a/public/resdk/cstrike/API/CSEntity.h b/public/resdk/cstrike/API/CSEntity.h new file mode 100644 index 00000000..ef47f30f --- /dev/null +++ b/public/resdk/cstrike/API/CSEntity.h @@ -0,0 +1,65 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +class CBaseEntity; +class CCSEntity +{ +public: + virtual ~CCSEntity() {} + virtual void FireBullets(int iShots, Vector &vecSrc, Vector &vecDirShooting, Vector &vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker); + virtual Vector FireBullets3(Vector &vecSrc, Vector &vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand); + +public: + CBaseEntity *m_pContainingEntity; +}; + +class CCSDelay: public CCSEntity +{ +public: + +}; + +class CCSAnimating: public CCSDelay +{ +public: + +}; + +class CCSToggle: public CCSAnimating +{ +public: + +}; + +class CCSMonster: public CCSToggle +{ +public: + +}; diff --git a/public/resdk/cstrike/regamedll_interfaces.h b/public/resdk/cstrike/API/CSInterfaces.h similarity index 75% rename from public/resdk/cstrike/regamedll_interfaces.h rename to public/resdk/cstrike/API/CSInterfaces.h index cf49c325..a17e3379 100644 --- a/public/resdk/cstrike/regamedll_interfaces.h +++ b/public/resdk/cstrike/API/CSInterfaces.h @@ -28,89 +28,17 @@ #pragma once -#include "regamedll_const.h" +#include "CSEntity.h" +#include "CSPlayer.h" -class CBaseEntity; -class CBasePlayer; - -// Implementation wrapper -class CCSEntity { -public: - virtual ~CCSEntity() {} - virtual void FireBullets(int iShots, Vector &vecSrc, Vector &vecDirShooting, Vector &vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker); - virtual Vector FireBullets3(Vector &vecSrc, Vector &vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand); -public: - CBaseEntity *m_pContainingEntity; -}; - -class CCSDelay: public CCSEntity {}; -class CCSAnimating: public CCSDelay {}; -class CCSPlayerItem: public CCSAnimating {}; -class CCSToggle: public CCSAnimating {}; -class CCSMonster: public CCSToggle {}; class CCSWeaponBox: public CCSEntity {}; class CCSArmoury: public CCSEntity {}; - -class CCSPlayer: public CCSMonster { -public: - CCSPlayer() : m_bForceShowMenu(false) - { - m_szModel[0] = '\0'; - } - - virtual bool IsConnected() const; - virtual void SetAnimation(PLAYER_ANIM playerAnim); - virtual void AddAccount(int amount, RewardType type = RT_NONE, bool bTrackChange = true); - virtual CBaseEntity *GiveNamedItem(const char *pszName); - virtual CBaseEntity *GiveNamedItemEx(const char *pszName); - virtual void GiveDefaultItems(); - virtual void GiveShield(bool bDeploy = true); - virtual void DropShield(bool bDeploy = true); - virtual void DropPlayerItem(const char *pszItemName); - virtual void RemoveShield(); - virtual void RemoveAllItems(bool bRemoveSuit); - virtual bool RemovePlayerItem(const char* pszItemName); - virtual void SetPlayerModel(bool bHasC4); - virtual void SetPlayerModelEx(const char *modelName); - virtual void SetNewPlayerModel(const char *modelName); - virtual void ClientCommand(const char *cmd, const char *arg1 = nullptr, const char *arg2 = nullptr, const char *arg3 = nullptr); - virtual void SetProgressBarTime(int time); - virtual void SetProgressBarTime2(int time, float timeElapsed); - virtual struct edict_s *EntSelectSpawnPoint(); - virtual void SetBombIcon(bool bFlash = false); - virtual void SetScoreAttrib(CBasePlayer *dest); - virtual void SendItemStatus(); - virtual void ReloadWeapons(CBasePlayerItem *pWeapon = nullptr, bool bForceReload = false, bool bForceRefill = false); - virtual void Observer_SetMode(int iMode); - virtual bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot); - virtual bool SwitchWeapon(CBasePlayerItem *pWeapon); - virtual void SwitchTeam(); - virtual bool JoinTeam(TeamName team); - virtual void StartObserver(Vector& vecPosition, Vector& vecViewAngle); - virtual void TeamChangeUpdate(); - virtual void DropSecondary(); - virtual void DropPrimary(); - virtual bool HasPlayerItem(CBasePlayerItem *pCheckItem); - virtual bool HasNamedPlayerItem(const char *pszItemName); - virtual CBasePlayerItem *GetItemById(WeaponIdType weaponID); - virtual CBasePlayerItem *GetItemByName(const char *itemName); - virtual void Disappear(); - virtual void MakeVIP(); - virtual bool MakeBomber(); - - CBasePlayer *BasePlayer() const; -public: - char m_szModel[32]; - bool m_bForceShowMenu; -}; - class CAPI_Bot: public CCSPlayer {}; class CAPI_CSBot: public CAPI_Bot {}; class CCSShield: public CCSEntity {}; class CCSDeadHEV: public CCSMonster {}; class CCSSprayCan: public CCSEntity {}; class CCSBloodSplat: public CCSEntity {}; -class CCSPlayerWeapon: public CCSPlayerItem {}; class CCSWorld: public CCSEntity {}; class CCSDecal: public CCSEntity {}; class CCSCorpse: public CCSEntity {}; @@ -297,7 +225,6 @@ class CCSTriggerChangeTarget: public CCSDelay {}; class CCSTriggerCamera: public CCSDelay {}; class CCSWeather: public CCSTrigger {}; class CCSClientFog: public CCSEntity {}; - -inline CBasePlayer *CCSPlayer::BasePlayer() const { - return reinterpret_cast<CBasePlayer *>(this->m_pContainingEntity); -} +class CCSTriggerSetOrigin: public CCSDelay {}; +class CCSTriggerRandom: public CCSDelay {}; +class CCSItemAirBox: public CCSArmoury {}; diff --git a/public/resdk/cstrike/API/CSPlayer.h b/public/resdk/cstrike/API/CSPlayer.h new file mode 100644 index 00000000..46a88fe4 --- /dev/null +++ b/public/resdk/cstrike/API/CSPlayer.h @@ -0,0 +1,123 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +#include "CSPlayerItem.h" +#include "CSPlayerWeapon.h" + +class CCSPlayer: public CCSMonster { +public: + CCSPlayer() : m_bForceShowMenu(false), m_flRespawnPending(0), m_flSpawnProtectionEndTime(0) + { + m_szModel[0] = '\0'; + } + + virtual bool IsConnected() const; + virtual void SetAnimation(PLAYER_ANIM playerAnim); + virtual void AddAccount(int amount, RewardType type = RT_NONE, bool bTrackChange = true); + virtual CBaseEntity *GiveNamedItem(const char *pszName); + virtual CBaseEntity *GiveNamedItemEx(const char *pszName); + virtual void GiveDefaultItems(); + virtual void GiveShield(bool bDeploy = true); + virtual void DropShield(bool bDeploy = true); + virtual void DropPlayerItem(const char *pszItemName); + virtual void RemoveShield(); + virtual void RemoveAllItems(bool bRemoveSuit); + virtual bool RemovePlayerItem(const char* pszItemName); + virtual void SetPlayerModel(bool bHasC4); + virtual void SetPlayerModelEx(const char *modelName); + virtual void SetNewPlayerModel(const char *modelName); + virtual void ClientCommand(const char *cmd, const char *arg1 = nullptr, const char *arg2 = nullptr, const char *arg3 = nullptr); + virtual void SetProgressBarTime(int time); + virtual void SetProgressBarTime2(int time, float timeElapsed); + virtual struct edict_s *EntSelectSpawnPoint(); + virtual void SetBombIcon(bool bFlash = false); + virtual void SetScoreAttrib(CBasePlayer *dest); + virtual void SendItemStatus(); + virtual void ReloadWeapons(CBasePlayerItem *pWeapon = nullptr, bool bForceReload = false, bool bForceRefill = false); + virtual void Observer_SetMode(int iMode); + virtual bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot); + virtual bool SwitchWeapon(CBasePlayerItem *pWeapon); + virtual void SwitchTeam(); + virtual bool JoinTeam(TeamName team); + virtual void StartObserver(Vector& vecPosition, Vector& vecViewAngle); + virtual void TeamChangeUpdate(); + virtual void DropSecondary(); + virtual void DropPrimary(); + virtual bool HasPlayerItem(CBasePlayerItem *pCheckItem); + virtual bool HasNamedPlayerItem(const char *pszItemName); + virtual CBasePlayerItem *GetItemById(WeaponIdType weaponID); + virtual CBasePlayerItem *GetItemByName(const char *itemName); + virtual void Disappear(); + virtual void MakeVIP(); + virtual bool MakeBomber(); + virtual void ResetSequenceInfo(); + virtual void StartDeathCam(); + virtual bool RemovePlayerItemEx(const char* pszItemName, bool bRemoveAmmo); + virtual void SetSpawnProtection(float flProtectionTime); + virtual void RemoveSpawnProtection(); + + CBasePlayer *BasePlayer() const; + +public: + enum EProtectionState + { + ProtectionSt_NoSet, + ProtectionSt_Active, + ProtectionSt_Expired, + }; + + EProtectionState GetProtectionState() const; + +public: + char m_szModel[32]; + bool m_bForceShowMenu; + float m_flRespawnPending; + float m_flSpawnProtectionEndTime; +}; + +// Inlines +inline CBasePlayer *CCSPlayer::BasePlayer() const +{ + return reinterpret_cast<CBasePlayer *>(this->m_pContainingEntity); +} + +inline CCSPlayer::EProtectionState CCSPlayer::GetProtectionState() const +{ + // no protection set + if (m_flSpawnProtectionEndTime <= 0.0f) + return ProtectionSt_NoSet; + + // check if end time of protection isn't expired yet + if (m_flSpawnProtectionEndTime >= gpGlobals->time) + return ProtectionSt_Active; + + // has expired + return ProtectionSt_Expired; +} diff --git a/public/resdk/cstrike/API/CSPlayerItem.h b/public/resdk/cstrike/API/CSPlayerItem.h new file mode 100644 index 00000000..633f3252 --- /dev/null +++ b/public/resdk/cstrike/API/CSPlayerItem.h @@ -0,0 +1,68 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +typedef struct +{ + int iSlot; + int iPosition; + const char *pszAmmo1; + int iMaxAmmo1; + const char *pszAmmo2; + int iMaxAmmo2; + const char *pszName; + int iMaxClip; + int iId; + int iFlags; + int iWeight; +} +ItemInfo; + +class CBasePlayerItem; +class CCSPlayerItem: public CCSAnimating +{ +public: + CCSPlayerItem() + { + memset(&m_ItemInfo, 0, sizeof(m_ItemInfo)); + } + + virtual void SetItemInfo(ItemInfo *pInfo); + + CBasePlayerItem *BasePlayerItem() const; + +public: + ItemInfo m_ItemInfo; +}; + +// Inlines +inline CBasePlayerItem *CCSPlayerItem::BasePlayerItem() const +{ + return reinterpret_cast<CBasePlayerItem *>(this->m_pContainingEntity); +} diff --git a/public/resdk/cstrike/API/CSPlayerWeapon.h b/public/resdk/cstrike/API/CSPlayerWeapon.h new file mode 100644 index 00000000..32e32f90 --- /dev/null +++ b/public/resdk/cstrike/API/CSPlayerWeapon.h @@ -0,0 +1,50 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +class CBasePlayerWeapon; +class CCSPlayerWeapon: public CCSPlayerItem +{ +public: + CCSPlayerWeapon() : + m_bHasSecondaryAttack(false) + { + } + + CBasePlayerWeapon *BasePlayerWeapon() const; + +public: + bool m_bHasSecondaryAttack; +}; + +// Inlines +inline CBasePlayerWeapon *CCSPlayerWeapon::BasePlayerWeapon() const +{ + return reinterpret_cast<CBasePlayerWeapon *>(this->m_pContainingEntity); +} diff --git a/public/resdk/cstrike/regamedll_api.h b/public/resdk/cstrike/regamedll_api.h index 81999943..e92845bc 100644 --- a/public/resdk/cstrike/regamedll_api.h +++ b/public/resdk/cstrike/regamedll_api.h @@ -25,23 +25,24 @@ * version. * */ + #pragma once #include <engine_strucs.h> -#include "regamedll_interfaces.h" #include "regamedll_const.h" +#include "API/CSInterfaces.h" #include "../common/hookchains.h" #define REGAMEDLL_API_VERSION_MAJOR 5 -#define REGAMEDLL_API_VERSION_MINOR 1 +#define REGAMEDLL_API_VERSION_MINOR 8 // CBasePlayer::Spawn hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_Spawn; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_Spawn; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Spawn; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_Spawn; // CBasePlayer::Precache hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_Precache; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_Precache; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Precache; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_Precache; // CBasePlayer::ObjectCaps hook typedef IHookChainClass<int, class CBasePlayer> IReGameHook_CBasePlayer_ObjectCaps; @@ -52,8 +53,8 @@ typedef IHookChainClass<int, class CBasePlayer> IReGameHook_CBasePlayer_Classify typedef IHookChainRegistryClass<int, class CBasePlayer> IReGameHookRegistry_CBasePlayer_Classify; // CBasePlayer::TraceAttack hook -typedef IVoidHookChainClass<class CBasePlayer, struct entvars_s *, float, Vector &, TraceResult *, int> IReGameHook_CBasePlayer_TraceAttack; -typedef IVoidHookChainRegistryClass<class CBasePlayer, struct entvars_s *, float, Vector &, TraceResult *, int> IReGameHookRegistry_CBasePlayer_TraceAttack; +typedef IHookChainClass<void, class CBasePlayer, struct entvars_s *, float, Vector &, TraceResult *, int> IReGameHook_CBasePlayer_TraceAttack; +typedef IHookChainRegistryClass<void, class CBasePlayer, struct entvars_s *, float, Vector &, TraceResult *, int> IReGameHookRegistry_CBasePlayer_TraceAttack; // CBasePlayer::TakeDamage hook typedef IHookChainClass<BOOL, class CBasePlayer, struct entvars_s *, struct entvars_s *, float&, int> IReGameHook_CBasePlayer_TakeDamage; @@ -64,16 +65,16 @@ typedef IHookChainClass<BOOL, class CBasePlayer, float, int> IReGameHook_CBasePl typedef IHookChainRegistryClass<BOOL, class CBasePlayer, float, int> IReGameHookRegistry_CBasePlayer_TakeHealth; // CBasePlayer::Killed hook -typedef IVoidHookChainClass<class CBasePlayer, struct entvars_s *, int> IReGameHook_CBasePlayer_Killed; -typedef IVoidHookChainRegistryClass<class CBasePlayer, struct entvars_s *, int> IReGameHookRegistry_CBasePlayer_Killed; +typedef IHookChainClass<void, class CBasePlayer, struct entvars_s *, int> IReGameHook_CBasePlayer_Killed; +typedef IHookChainRegistryClass<void, class CBasePlayer, struct entvars_s *, int> IReGameHookRegistry_CBasePlayer_Killed; // CBasePlayer::AddPoints hook -typedef IVoidHookChainClass<class CBasePlayer, int, BOOL> IReGameHook_CBasePlayer_AddPoints; -typedef IVoidHookChainRegistryClass<class CBasePlayer, int, BOOL> IReGameHookRegistry_CBasePlayer_AddPoints; +typedef IHookChainClass<void, class CBasePlayer, int, BOOL> IReGameHook_CBasePlayer_AddPoints; +typedef IHookChainRegistryClass<void, class CBasePlayer, int, BOOL> IReGameHookRegistry_CBasePlayer_AddPoints; // CBasePlayer::AddPointsToTeam hook -typedef IVoidHookChainClass<class CBasePlayer, int, BOOL> IReGameHook_CBasePlayer_AddPointsToTeam; -typedef IVoidHookChainRegistryClass<class CBasePlayer, int, BOOL> IReGameHookRegistry_CBasePlayer_AddPointsToTeam; +typedef IHookChainClass<void, class CBasePlayer, int, BOOL> IReGameHook_CBasePlayer_AddPointsToTeam; +typedef IHookChainRegistryClass<void, class CBasePlayer, int, BOOL> IReGameHookRegistry_CBasePlayer_AddPointsToTeam; // CBasePlayer::AddPlayerItem hook typedef IHookChainClass<BOOL, class CBasePlayer, class CBasePlayerItem *> IReGameHook_CBasePlayer_AddPlayerItem; @@ -84,72 +85,72 @@ typedef IHookChainClass<BOOL, class CBasePlayer, class CBasePlayerItem *> IReGam typedef IHookChainRegistryClass<BOOL, class CBasePlayer, class CBasePlayerItem *> IReGameHookRegistry_CBasePlayer_RemovePlayerItem; // CBasePlayer::GiveAmmo hook -typedef IHookChainClass<int, class CBasePlayer, int , char *, int> IReGameHook_CBasePlayer_GiveAmmo; -typedef IHookChainRegistryClass<int, class CBasePlayer, int , char *, int> IReGameHookRegistry_CBasePlayer_GiveAmmo; +typedef IHookChainClass<int, class CBasePlayer, int , const char *, int> IReGameHook_CBasePlayer_GiveAmmo; +typedef IHookChainRegistryClass<int, class CBasePlayer, int , const char *, int> IReGameHookRegistry_CBasePlayer_GiveAmmo; // CBasePlayer::ResetMaxSpeed hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_ResetMaxSpeed; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_ResetMaxSpeed; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_ResetMaxSpeed; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_ResetMaxSpeed; // CBasePlayer::Jump hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_Jump; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_Jump; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Jump; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_Jump; // CBasePlayer::Duck hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_Duck; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_Duck; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Duck; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_Duck; // CBasePlayer::PreThink hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_PreThink; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_PreThink; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_PreThink; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_PreThink; // CBasePlayer::PostThink hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_PostThink; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_PostThink; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_PostThink; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_PostThink; // CBasePlayer::UpdateClientData hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_UpdateClientData; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_UpdateClientData; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_UpdateClientData; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_UpdateClientData; // CBasePlayer::ImpulseCommands hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_ImpulseCommands; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_ImpulseCommands; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_ImpulseCommands; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_ImpulseCommands; // CBasePlayer::RoundRespawn hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_RoundRespawn; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_RoundRespawn; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_RoundRespawn; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_RoundRespawn; // CBasePlayer::Blind hook -typedef IVoidHookChainClass<class CBasePlayer, float, float, float, int> IReGameHook_CBasePlayer_Blind; -typedef IVoidHookChainRegistryClass<class CBasePlayer, float, float, float, int> IReGameHookRegistry_CBasePlayer_Blind; +typedef IHookChainClass<void, class CBasePlayer, float, float, float, int> IReGameHook_CBasePlayer_Blind; +typedef IHookChainRegistryClass<void, class CBasePlayer, float, float, float, int> IReGameHookRegistry_CBasePlayer_Blind; // CBasePlayer::Observer_IsValidTarget hook typedef IHookChainClass<class CBasePlayer *, class CBasePlayer, int, bool> IReGameHook_CBasePlayer_Observer_IsValidTarget; typedef IHookChainRegistryClass<class CBasePlayer *, class CBasePlayer, int, bool> IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget; // CBasePlayer::SetAnimation hook -typedef IVoidHookChainClass<class CBasePlayer, PLAYER_ANIM> IReGameHook_CBasePlayer_SetAnimation; -typedef IVoidHookChainRegistryClass<class CBasePlayer, PLAYER_ANIM> IReGameHookRegistry_CBasePlayer_SetAnimation; +typedef IHookChainClass<void, class CBasePlayer, PLAYER_ANIM> IReGameHook_CBasePlayer_SetAnimation; +typedef IHookChainRegistryClass<void, class CBasePlayer, PLAYER_ANIM> IReGameHookRegistry_CBasePlayer_SetAnimation; // CBasePlayer::GiveDefaultItems hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_GiveDefaultItems; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_GiveDefaultItems; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_GiveDefaultItems; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_GiveDefaultItems; // CBasePlayer::GiveNamedItem hook typedef IHookChainClass<class CBaseEntity *, class CBasePlayer, const char *> IReGameHook_CBasePlayer_GiveNamedItem; typedef IHookChainRegistryClass<class CBaseEntity *, class CBasePlayer, const char *> IReGameHookRegistry_CBasePlayer_GiveNamedItem; // CBasePlayer::AddAccount hook -typedef IVoidHookChainClass<class CBasePlayer, int, RewardType, bool> IReGameHook_CBasePlayer_AddAccount; -typedef IVoidHookChainRegistryClass<class CBasePlayer, int, RewardType, bool> IReGameHookRegistry_CBasePlayer_AddAccount; +typedef IHookChainClass<void, class CBasePlayer, int, RewardType, bool> IReGameHook_CBasePlayer_AddAccount; +typedef IHookChainRegistryClass<void, class CBasePlayer, int, RewardType, bool> IReGameHookRegistry_CBasePlayer_AddAccount; // CBasePlayer::GiveShield hook -typedef IVoidHookChainClass<class CBasePlayer, bool> IReGameHook_CBasePlayer_GiveShield; -typedef IVoidHookChainRegistryClass<class CBasePlayer, bool> IReGameHookRegistry_CBasePlayer_GiveShield; +typedef IHookChainClass<void, class CBasePlayer, bool> IReGameHook_CBasePlayer_GiveShield; +typedef IHookChainRegistryClass<void, class CBasePlayer, bool> IReGameHookRegistry_CBasePlayer_GiveShield; // CBasePlayer:SetClientUserInfoModel hook -typedef IVoidHookChainClass<class CBasePlayer, char *, char *> IReGameHook_CBasePlayer_SetClientUserInfoModel; -typedef IVoidHookChainRegistryClass<class CBasePlayer, char *, char *> IReGameHookRegistry_CBasePlayer_SetClientUserInfoModel; +typedef IHookChainClass<void, class CBasePlayer, char *, char *> IReGameHook_CBasePlayer_SetClientUserInfoModel; +typedef IHookChainRegistryClass<void, class CBasePlayer, char *, char *> IReGameHookRegistry_CBasePlayer_SetClientUserInfoModel; // CBasePlayer:SetClientUserInfoName hook typedef IHookChainClass<bool, class CBasePlayer, char *, char *> IReGameHook_CBasePlayer_SetClientUserInfoName; @@ -160,56 +161,56 @@ typedef IHookChainClass<bool, class CBasePlayer, ItemID, ItemRestType> IReGameHo typedef IHookChainRegistryClass<bool, class CBasePlayer, ItemID, ItemRestType> IReGameHookRegistry_CBasePlayer_HasRestrictItem; // CBasePlayer::DropPlayerItem hook -typedef IVoidHookChainClass<class CBasePlayer, const char *> IReGameHook_CBasePlayer_DropPlayerItem; -typedef IVoidHookChainRegistryClass<class CBasePlayer, const char *> IReGameHookRegistry_CBasePlayer_DropPlayerItem; +typedef IHookChainClass<class CBaseEntity *, class CBasePlayer, const char *> IReGameHook_CBasePlayer_DropPlayerItem; +typedef IHookChainRegistryClass<class CBaseEntity *, class CBasePlayer, const char *> IReGameHookRegistry_CBasePlayer_DropPlayerItem; // CBasePlayer::DropShield hook -typedef IVoidHookChainClass<class CBasePlayer, bool> IReGameHook_CBasePlayer_DropShield; -typedef IVoidHookChainRegistryClass<class CBasePlayer, bool> IReGameHookRegistry_CBasePlayer_DropShield; +typedef IHookChainClass<class CBaseEntity *, class CBasePlayer, bool> IReGameHook_CBasePlayer_DropShield; +typedef IHookChainRegistryClass<class CBaseEntity *, class CBasePlayer, bool> IReGameHookRegistry_CBasePlayer_DropShield; // CBasePlayer::OnSpawnEquip hook -typedef IVoidHookChainClass<class CBasePlayer, bool, bool> IReGameHook_CBasePlayer_OnSpawnEquip; -typedef IVoidHookChainRegistryClass<class CBasePlayer, bool, bool> IReGameHookRegistry_CBasePlayer_OnSpawnEquip; +typedef IHookChainClass<void, class CBasePlayer, bool, bool> IReGameHook_CBasePlayer_OnSpawnEquip; +typedef IHookChainRegistryClass<void, class CBasePlayer, bool, bool> IReGameHookRegistry_CBasePlayer_OnSpawnEquip; // CBasePlayer::Radio hook -typedef IVoidHookChainClass<class CBasePlayer, const char *, const char *, short, bool> IReGameHook_CBasePlayer_Radio; -typedef IVoidHookChainRegistryClass<class CBasePlayer, const char *, const char *, short, bool> IReGameHookRegistry_CBasePlayer_Radio; +typedef IHookChainClass<void, class CBasePlayer, const char *, const char *, short, bool> IReGameHook_CBasePlayer_Radio; +typedef IHookChainRegistryClass<void, class CBasePlayer, const char *, const char *, short, bool> IReGameHookRegistry_CBasePlayer_Radio; // CBasePlayer::Disappear hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_Disappear; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_Disappear; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_Disappear; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_Disappear; // CBasePlayer::MakeVIP hook -typedef IVoidHookChainClass<class CBasePlayer> IReGameHook_CBasePlayer_MakeVIP; -typedef IVoidHookChainRegistryClass<class CBasePlayer> IReGameHookRegistry_CBasePlayer_MakeVIP; +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_MakeVIP; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_MakeVIP; // CBasePlayer::MakeBomber hook typedef IHookChainClass<bool, class CBasePlayer> IReGameHook_CBasePlayer_MakeBomber; typedef IHookChainRegistryClass<bool, class CBasePlayer> IReGameHookRegistry_CBasePlayer_MakeBomber; // CBasePlayer::StartObserver hook -typedef IVoidHookChainClass<class CBasePlayer, Vector &, Vector &> IReGameHook_CBasePlayer_StartObserver; -typedef IVoidHookChainRegistryClass<class CBasePlayer, Vector &, Vector &> IReGameHookRegistry_CBasePlayer_StartObserver; +typedef IHookChainClass<void, class CBasePlayer, Vector &, Vector &> IReGameHook_CBasePlayer_StartObserver; +typedef IHookChainRegistryClass<void, class CBasePlayer, Vector &, Vector &> IReGameHookRegistry_CBasePlayer_StartObserver; // CBasePlayer::GetIntoGame hook typedef IHookChainClass<bool, class CBasePlayer> IReGameHook_CBasePlayer_GetIntoGame; typedef IHookChainRegistryClass<bool, class CBasePlayer> IReGameHookRegistry_CBasePlayer_GetIntoGame; // CBaseAnimating::ResetSequenceInfo hook -typedef IVoidHookChainClass<class CBaseAnimating> IReGameHook_CBaseAnimating_ResetSequenceInfo; -typedef IVoidHookChainRegistryClass<class CBaseAnimating> IReGameHookRegistry_CBaseAnimating_ResetSequenceInfo; +typedef IHookChainClass<void, class CBaseAnimating> IReGameHook_CBaseAnimating_ResetSequenceInfo; +typedef IHookChainRegistryClass<void, class CBaseAnimating> IReGameHookRegistry_CBaseAnimating_ResetSequenceInfo; // GetForceCamera hook typedef IHookChain<int, class CBasePlayer *> IReGameHook_GetForceCamera; typedef IHookChainRegistry<int, class CBasePlayer *> IReGameHookRegistry_GetForceCamera; // PlayerBlind hook -typedef IVoidHookChain<class CBasePlayer *, struct entvars_s *, struct entvars_s *, float, float, int, Vector &> IReGameHook_PlayerBlind; -typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct entvars_s *, float, float, int, Vector &> IReGameHookRegistry_PlayerBlind; +typedef IHookChain<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *, float, float, int, Vector &> IReGameHook_PlayerBlind; +typedef IHookChainRegistry<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *, float, float, int, Vector &> IReGameHookRegistry_PlayerBlind; // RadiusFlash_TraceLine hook -typedef IVoidHookChain<class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, TraceResult *> IReGameHook_RadiusFlash_TraceLine; -typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, TraceResult *> IReGameHookRegistry_RadiusFlash_TraceLine; +typedef IHookChain<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, TraceResult *> IReGameHook_RadiusFlash_TraceLine; +typedef IHookChainRegistry<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *, Vector &, Vector &, TraceResult *> IReGameHookRegistry_RadiusFlash_TraceLine; // RoundEnd hook typedef IHookChain<bool, int, ScenarioEventEndRound, float> IReGameHook_RoundEnd; @@ -220,32 +221,32 @@ typedef IHookChain<class CGameRules *> IReGameHook_InstallGameRules; typedef IHookChainRegistry<class CGameRules *> IReGameHookRegistry_InstallGameRules; // PM_Init hook -typedef IVoidHookChain<struct playermove_s *> IReGameHook_PM_Init; -typedef IVoidHookChainRegistry<struct playermove_s *> IReGameHookRegistry_PM_Init; +typedef IHookChain<void, struct playermove_s *> IReGameHook_PM_Init; +typedef IHookChainRegistry<void, struct playermove_s *> IReGameHookRegistry_PM_Init; // PM_Move hook -typedef IVoidHookChain<struct playermove_s *, int> IReGameHook_PM_Move; -typedef IVoidHookChainRegistry<struct playermove_s *, int> IReGameHookRegistry_PM_Move; +typedef IHookChain<void, struct playermove_s *, int> IReGameHook_PM_Move; +typedef IHookChainRegistry<void, struct playermove_s *, int> IReGameHookRegistry_PM_Move; // PM_AirMove hook -typedef IVoidHookChain<int> IReGameHook_PM_AirMove; -typedef IVoidHookChainRegistry<int> IReGameHookRegistry_PM_AirMove; +typedef IHookChain<void, int> IReGameHook_PM_AirMove; +typedef IHookChainRegistry<void, int> IReGameHookRegistry_PM_AirMove; // HandleMenu_ChooseAppearance hook -typedef IVoidHookChain<class CBasePlayer *, int> IReGameHook_HandleMenu_ChooseAppearance; -typedef IVoidHookChainRegistry<class CBasePlayer *, int> IReGameHookRegistry_HandleMenu_ChooseAppearance; +typedef IHookChain<void, class CBasePlayer *, int> IReGameHook_HandleMenu_ChooseAppearance; +typedef IHookChainRegistry<void, class CBasePlayer *, int> IReGameHookRegistry_HandleMenu_ChooseAppearance; // HandleMenu_ChooseTeam hook typedef IHookChain<BOOL, class CBasePlayer *, int> IReGameHook_HandleMenu_ChooseTeam; typedef IHookChainRegistry<BOOL, class CBasePlayer *, int> IReGameHookRegistry_HandleMenu_ChooseTeam; // ShowMenu hook -typedef IVoidHookChain<class CBasePlayer *, int, int, BOOL, char *> IReGameHook_ShowMenu; -typedef IVoidHookChainRegistry<class CBasePlayer *, int, int, BOOL, char *> IReGameHookRegistry_ShowMenu; +typedef IHookChain<void, class CBasePlayer *, int, int, BOOL, char *> IReGameHook_ShowMenu; +typedef IHookChainRegistry<void, class CBasePlayer *, int, int, BOOL, char *> IReGameHookRegistry_ShowMenu; // ShowVGUIMenu hook -typedef IVoidHookChain<class CBasePlayer *, int, int, char *> IReGameHook_ShowVGUIMenu; -typedef IVoidHookChainRegistry<class CBasePlayer *, int, int, char *> IReGameHookRegistry_ShowVGUIMenu; +typedef IHookChain<void, class CBasePlayer *, int, int, char *> IReGameHook_ShowVGUIMenu; +typedef IHookChainRegistry<void, class CBasePlayer *, int, int, char *> IReGameHookRegistry_ShowVGUIMenu; // BuyGunAmmo hook typedef IHookChain<bool, class CBasePlayer *, class CBasePlayerItem *, bool> IReGameHook_BuyGunAmmo; @@ -256,8 +257,8 @@ typedef IHookChain<class CBaseEntity *, class CBasePlayer *, WeaponIdType> IReGa typedef IHookChainRegistry<class CBaseEntity *, class CBasePlayer *, WeaponIdType> IReGameHookRegistry_BuyWeaponByWeaponID; // InternalCommand hook -typedef IVoidHookChain<edict_t *, const char *, const char *> IReGameHook_InternalCommand; -typedef IVoidHookChainRegistry<edict_t *, const char *, const char *> IReGameHookRegistry_InternalCommand; +typedef IHookChain<void, edict_t *, const char *, const char *> IReGameHook_InternalCommand; +typedef IHookChainRegistry<void, edict_t *, const char *, const char *> IReGameHookRegistry_InternalCommand; // CHalfLifeMultiplay::FShouldSwitchWeapon hook typedef IHookChain<BOOL, class CBasePlayer *, class CBasePlayerItem *> IReGameHook_CSGameRules_FShouldSwitchWeapon; @@ -276,8 +277,8 @@ typedef IHookChain<BOOL, class CBasePlayer *, CBaseEntity *> IReGameHook_CSGameR typedef IHookChainRegistry<BOOL, class CBasePlayer *, CBaseEntity *> IReGameHookRegistry_CSGameRules_FPlayerCanTakeDamage; // CHalfLifeMultiplay::PlayerSpawn hook -typedef IVoidHookChain<class CBasePlayer *> IReGameHook_CSGameRules_PlayerSpawn; -typedef IVoidHookChainRegistry<class CBasePlayer *> IReGameHookRegistry_CSGameRules_PlayerSpawn; +typedef IHookChain<void, class CBasePlayer *> IReGameHook_CSGameRules_PlayerSpawn; +typedef IHookChainRegistry<void, class CBasePlayer *> IReGameHookRegistry_CSGameRules_PlayerSpawn; // CHalfLifeMultiplay::FPlayerCanRespawn hook typedef IHookChain<BOOL, class CBasePlayer *> IReGameHook_CSGameRules_FPlayerCanRespawn; @@ -288,16 +289,16 @@ typedef IHookChain<struct edict_s *, class CBasePlayer *> IReGameHook_CSGameRule typedef IHookChainRegistry<struct edict_s *, class CBasePlayer *> IReGameHookRegistry_CSGameRules_GetPlayerSpawnSpot; // CHalfLifeMultiplay::ClientUserInfoChanged hook -typedef IVoidHookChain<class CBasePlayer *, char *> IReGameHook_CSGameRules_ClientUserInfoChanged; -typedef IVoidHookChainRegistry<class CBasePlayer *, char *> IReGameHookRegistry_CSGameRules_ClientUserInfoChanged; +typedef IHookChain<void, class CBasePlayer *, char *> IReGameHook_CSGameRules_ClientUserInfoChanged; +typedef IHookChainRegistry<void, class CBasePlayer *, char *> IReGameHookRegistry_CSGameRules_ClientUserInfoChanged; // CHalfLifeMultiplay::PlayerKilled hook -typedef IVoidHookChain<class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHook_CSGameRules_PlayerKilled; -typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHookRegistry_CSGameRules_PlayerKilled; +typedef IHookChain<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHook_CSGameRules_PlayerKilled; +typedef IHookChainRegistry<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHookRegistry_CSGameRules_PlayerKilled; // CHalfLifeMultiplay::DeathNotice hook -typedef IVoidHookChain<class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHook_CSGameRules_DeathNotice; -typedef IVoidHookChainRegistry<class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHookRegistry_CSGameRules_DeathNotice; +typedef IHookChain<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHook_CSGameRules_DeathNotice; +typedef IHookChainRegistry<void, class CBasePlayer *, struct entvars_s *, struct entvars_s *> IReGameHookRegistry_CSGameRules_DeathNotice; // CHalfLifeMultiplay::CanHavePlayerItem hook typedef IHookChain<BOOL, class CBasePlayer *, class CBasePlayerItem *> IReGameHook_CSGameRules_CanHavePlayerItem; @@ -308,142 +309,237 @@ typedef IHookChain<int, class CBasePlayer *> IReGameHook_CSGameRules_DeadPlayerW typedef IHookChainRegistry<int, class CBasePlayer *> IReGameHookRegistry_CSGameRules_DeadPlayerWeapons; // CHalfLifeMultiplay::ServerDeactivate hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_ServerDeactivate; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_ServerDeactivate; +typedef IHookChain<void> IReGameHook_CSGameRules_ServerDeactivate; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_ServerDeactivate; // CHalfLifeMultiplay::CheckMapConditions hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_CheckMapConditions; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_CheckMapConditions; +typedef IHookChain<void> IReGameHook_CSGameRules_CheckMapConditions; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_CheckMapConditions; // CHalfLifeMultiplay::CleanUpMap hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_CleanUpMap; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_CleanUpMap; +typedef IHookChain<void> IReGameHook_CSGameRules_CleanUpMap; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_CleanUpMap; // CHalfLifeMultiplay::RestartRound hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_RestartRound; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_RestartRound; +typedef IHookChain<void> IReGameHook_CSGameRules_RestartRound; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_RestartRound; // CHalfLifeMultiplay::CheckWinConditions hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_CheckWinConditions; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_CheckWinConditions; +typedef IHookChain<void> IReGameHook_CSGameRules_CheckWinConditions; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_CheckWinConditions; // CHalfLifeMultiplay::RemoveGuns hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_RemoveGuns; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_RemoveGuns; +typedef IHookChain<void> IReGameHook_CSGameRules_RemoveGuns; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_RemoveGuns; // CHalfLifeMultiplay::GiveC4 hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_GiveC4; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_GiveC4; +typedef IHookChain<void> IReGameHook_CSGameRules_GiveC4; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_GiveC4; // CHalfLifeMultiplay::ChangeLevel hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_ChangeLevel; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_ChangeLevel; +typedef IHookChain<void> IReGameHook_CSGameRules_ChangeLevel; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_ChangeLevel; // CHalfLifeMultiplay::GoToIntermission hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_GoToIntermission; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_GoToIntermission; +typedef IHookChain<void> IReGameHook_CSGameRules_GoToIntermission; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_GoToIntermission; // CHalfLifeMultiplay::BalanceTeams hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_BalanceTeams; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_BalanceTeams; +typedef IHookChain<void> IReGameHook_CSGameRules_BalanceTeams; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_BalanceTeams; // CHalfLifeMultiplay::OnRoundFreezeEnd hook -typedef IVoidHookChain<> IReGameHook_CSGameRules_OnRoundFreezeEnd; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd; +typedef IHookChain<void> IReGameHook_CSGameRules_OnRoundFreezeEnd; +typedef IHookChainRegistry<void> IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd; + +// CSGameRules::CanPlayerHearPlayer hook +typedef IHookChain<bool, class CBasePlayer *, class CBasePlayer *> IReGameHook_CSGameRules_CanPlayerHearPlayer; +typedef IHookChainRegistry<bool, class CBasePlayer *, class CBasePlayer *> IReGameHookRegistry_CSGameRules_CanPlayerHearPlayer; // PM_UpdateStepSound hook -typedef IVoidHookChain<> IReGameHook_PM_UpdateStepSound; -typedef IVoidHookChainRegistry<> IReGameHookRegistry_PM_UpdateStepSound; +typedef IHookChain<void> IReGameHook_PM_UpdateStepSound; +typedef IHookChainRegistry<void> IReGameHookRegistry_PM_UpdateStepSound; + +// CBasePlayer::StartDeathCam hook +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_StartDeathCam; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_StartDeathCam; + +// CBasePlayer::SwitchTeam hook +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_SwitchTeam; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_SwitchTeam; + +// CBasePlayer::CanSwitchTeam hook +typedef IHookChainClass<bool, class CBasePlayer, TeamName> IReGameHook_CBasePlayer_CanSwitchTeam; +typedef IHookChainRegistryClass<bool, class CBasePlayer, TeamName> IReGameHookRegistry_CBasePlayer_CanSwitchTeam; + +// CBasePlayer::ThrowGrenade hook +typedef IHookChainClass<class CGrenade *, class CBasePlayer, class CBasePlayerWeapon *, Vector &, Vector &, float, unsigned short> IReGameHook_CBasePlayer_ThrowGrenade; +typedef IHookChainRegistryClass<class CGrenade *, class CBasePlayer, class CBasePlayerWeapon *, Vector &, Vector &, float, unsigned short> IReGameHookRegistry_CBasePlayer_ThrowGrenade; + +// CWeaponBox::SetModel hook +typedef IHookChainClass<void, class CWeaponBox, const char *> IReGameHook_CWeaponBox_SetModel; +typedef IHookChainRegistryClass<void, class CWeaponBox, const char *> IReGameHookRegistry_CWeaponBox_SetModel; + +// CGrenade::DefuseBombStart hook +typedef IHookChainClass<void, class CGrenade, class CBasePlayer *> IReGameHook_CGrenade_DefuseBombStart; +typedef IHookChainRegistryClass<void, class CGrenade, class CBasePlayer *> IReGameHookRegistry_CGrenade_DefuseBombStart; + +// CGrenade::DefuseBombEnd hook +typedef IHookChainClass<void, class CGrenade, class CBasePlayer *, bool> IReGameHook_CGrenade_DefuseBombEnd; +typedef IHookChainRegistryClass<void, class CGrenade, class CBasePlayer *, bool> IReGameHookRegistry_CGrenade_DefuseBombEnd; + +// CGrenade::ExplodeHeGrenade hook +typedef IHookChainClass<void, class CGrenade, TraceResult *, int> IReGameHook_CGrenade_ExplodeHeGrenade; +typedef IHookChainRegistryClass<void, class CGrenade, TraceResult *, int> IReGameHookRegistry_CGrenade_ExplodeHeGrenade; + +// CGrenade::ExplodeFlashbang hook +typedef IHookChainClass<void, class CGrenade, TraceResult *, int> IReGameHook_CGrenade_ExplodeFlashbang; +typedef IHookChainRegistryClass<void, class CGrenade, TraceResult *, int> IReGameHookRegistry_CGrenade_ExplodeFlashbang; + +// CGrenade::ExplodeSmokeGrenade hook +typedef IHookChainClass<void, class CGrenade> IReGameHook_CGrenade_ExplodeSmokeGrenade; +typedef IHookChainRegistryClass<void, class CGrenade> IReGameHookRegistry_CGrenade_ExplodeSmokeGrenade; + +// CGrenade::ExplodeBomb hook +typedef IHookChainClass<void, class CGrenade, TraceResult *, int> IReGameHook_CGrenade_ExplodeBomb; +typedef IHookChainRegistryClass<void, class CGrenade, TraceResult *, int> IReGameHookRegistry_CGrenade_ExplodeBomb; + +// ThrowHeGrenade hook +typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &, float, int, unsigned short> IReGameHook_ThrowHeGrenade; +typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &, float, int, unsigned short> IReGameHookRegistry_ThrowHeGrenade; + +// ThrowFlashbang hook +typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &, float> IReGameHook_ThrowFlashbang; +typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &, float> IReGameHookRegistry_ThrowFlashbang; + +// ThrowSmokeGrenade hook +typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &, float, unsigned short> IReGameHook_ThrowSmokeGrenade; +typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &, float, unsigned short> IReGameHookRegistry_ThrowSmokeGrenade; + +// PlantBomb hook +typedef IHookChain<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHook_PlantBomb; +typedef IHookChainRegistry<class CGrenade *, entvars_t *, Vector &, Vector &> IReGameHookRegistry_PlantBomb; + +// CBasePlayer::SetSpawnProtection hook +typedef IHookChainClass<void, class CBasePlayer, float> IReGameHook_CBasePlayer_SetSpawnProtection; +typedef IHookChainRegistryClass<void, class CBasePlayer, float> IReGameHookRegistry_CBasePlayer_SetSpawnProtection; + +// CBasePlayer::RemoveSpawnProtection hook +typedef IHookChainClass<void, class CBasePlayer> IReGameHook_CBasePlayer_RemoveSpawnProtection; +typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBasePlayer_RemoveSpawnProtection; + +// IsPenetrableEntity hook +typedef IHookChain<bool, Vector &, Vector &, entvars_t *, edict_t *> IReGameHook_IsPenetrableEntity; +typedef IHookChainRegistry<bool, Vector &, Vector &, entvars_t *, edict_t *> IReGameHookRegistry_IsPenetrableEntity; class IReGameHookchains { public: virtual ~IReGameHookchains() {} // CBasePlayer virtual - virtual IReGameHookRegistry_CBasePlayer_Spawn* CBasePlayer_Spawn() = 0; - virtual IReGameHookRegistry_CBasePlayer_Precache* CBasePlayer_Precache() = 0; - virtual IReGameHookRegistry_CBasePlayer_ObjectCaps* CBasePlayer_ObjectCaps() = 0; - virtual IReGameHookRegistry_CBasePlayer_Classify* CBasePlayer_Classify() = 0; - virtual IReGameHookRegistry_CBasePlayer_TraceAttack* CBasePlayer_TraceAttack() = 0; - virtual IReGameHookRegistry_CBasePlayer_TakeDamage* CBasePlayer_TakeDamage() = 0; - virtual IReGameHookRegistry_CBasePlayer_TakeHealth* CBasePlayer_TakeHealth() = 0; - virtual IReGameHookRegistry_CBasePlayer_Killed* CBasePlayer_Killed() = 0; - virtual IReGameHookRegistry_CBasePlayer_AddPoints* CBasePlayer_AddPoints() = 0; - virtual IReGameHookRegistry_CBasePlayer_AddPointsToTeam* CBasePlayer_AddPointsToTeam() = 0; - virtual IReGameHookRegistry_CBasePlayer_AddPlayerItem* CBasePlayer_AddPlayerItem() = 0; - virtual IReGameHookRegistry_CBasePlayer_RemovePlayerItem* CBasePlayer_RemovePlayerItem() = 0; - virtual IReGameHookRegistry_CBasePlayer_GiveAmmo* CBasePlayer_GiveAmmo() = 0; - virtual IReGameHookRegistry_CBasePlayer_ResetMaxSpeed* CBasePlayer_ResetMaxSpeed() = 0; - virtual IReGameHookRegistry_CBasePlayer_Jump* CBasePlayer_Jump() = 0; - virtual IReGameHookRegistry_CBasePlayer_Duck* CBasePlayer_Duck() = 0; - virtual IReGameHookRegistry_CBasePlayer_PreThink* CBasePlayer_PreThink() = 0; - virtual IReGameHookRegistry_CBasePlayer_PostThink* CBasePlayer_PostThink() = 0; - virtual IReGameHookRegistry_CBasePlayer_UpdateClientData* CBasePlayer_UpdateClientData() = 0; - virtual IReGameHookRegistry_CBasePlayer_ImpulseCommands* CBasePlayer_ImpulseCommands() = 0; - virtual IReGameHookRegistry_CBasePlayer_RoundRespawn* CBasePlayer_RoundRespawn() = 0; - virtual IReGameHookRegistry_CBasePlayer_Blind* CBasePlayer_Blind() = 0; + virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn() = 0; + virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache() = 0; + virtual IReGameHookRegistry_CBasePlayer_ObjectCaps *CBasePlayer_ObjectCaps() = 0; + virtual IReGameHookRegistry_CBasePlayer_Classify *CBasePlayer_Classify() = 0; + virtual IReGameHookRegistry_CBasePlayer_TraceAttack *CBasePlayer_TraceAttack() = 0; + virtual IReGameHookRegistry_CBasePlayer_TakeDamage *CBasePlayer_TakeDamage() = 0; + virtual IReGameHookRegistry_CBasePlayer_TakeHealth *CBasePlayer_TakeHealth() = 0; + virtual IReGameHookRegistry_CBasePlayer_Killed *CBasePlayer_Killed() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddPoints *CBasePlayer_AddPoints() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddPointsToTeam *CBasePlayer_AddPointsToTeam() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddPlayerItem *CBasePlayer_AddPlayerItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_RemovePlayerItem *CBasePlayer_RemovePlayerItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveAmmo *CBasePlayer_GiveAmmo() = 0; + virtual IReGameHookRegistry_CBasePlayer_ResetMaxSpeed *CBasePlayer_ResetMaxSpeed() = 0; + virtual IReGameHookRegistry_CBasePlayer_Jump *CBasePlayer_Jump() = 0; + virtual IReGameHookRegistry_CBasePlayer_Duck *CBasePlayer_Duck() = 0; + virtual IReGameHookRegistry_CBasePlayer_PreThink *CBasePlayer_PreThink() = 0; + virtual IReGameHookRegistry_CBasePlayer_PostThink *CBasePlayer_PostThink() = 0; + virtual IReGameHookRegistry_CBasePlayer_UpdateClientData *CBasePlayer_UpdateClientData() = 0; + virtual IReGameHookRegistry_CBasePlayer_ImpulseCommands *CBasePlayer_ImpulseCommands() = 0; + virtual IReGameHookRegistry_CBasePlayer_RoundRespawn *CBasePlayer_RoundRespawn() = 0; + virtual IReGameHookRegistry_CBasePlayer_Blind *CBasePlayer_Blind() = 0; - virtual IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget* CBasePlayer_Observer_IsValidTarget() = 0; - virtual IReGameHookRegistry_CBasePlayer_SetAnimation* CBasePlayer_SetAnimation() = 0; - virtual IReGameHookRegistry_CBasePlayer_GiveDefaultItems* CBasePlayer_GiveDefaultItems() = 0; - virtual IReGameHookRegistry_CBasePlayer_GiveNamedItem* CBasePlayer_GiveNamedItem() = 0; - virtual IReGameHookRegistry_CBasePlayer_AddAccount* CBasePlayer_AddAccount() = 0; - virtual IReGameHookRegistry_CBasePlayer_GiveShield* CBasePlayer_GiveShield() = 0; - virtual IReGameHookRegistry_CBasePlayer_SetClientUserInfoModel* CBasePlayer_SetClientUserInfoModel() = 0; - virtual IReGameHookRegistry_CBasePlayer_SetClientUserInfoName* CBasePlayer_SetClientUserInfoName() = 0; - virtual IReGameHookRegistry_CBasePlayer_HasRestrictItem* CBasePlayer_HasRestrictItem() = 0; - virtual IReGameHookRegistry_CBasePlayer_DropPlayerItem* CBasePlayer_DropPlayerItem() = 0; - virtual IReGameHookRegistry_CBasePlayer_DropShield* CBasePlayer_DropShield() = 0; - virtual IReGameHookRegistry_CBasePlayer_OnSpawnEquip* CBasePlayer_OnSpawnEquip() = 0; - virtual IReGameHookRegistry_CBasePlayer_Radio* CBasePlayer_Radio() = 0; - virtual IReGameHookRegistry_CBasePlayer_Disappear* CBasePlayer_Disappear() = 0; - virtual IReGameHookRegistry_CBasePlayer_MakeVIP* CBasePlayer_MakeVIP() = 0; - virtual IReGameHookRegistry_CBasePlayer_MakeBomber* CBasePlayer_MakeBomber() = 0; - virtual IReGameHookRegistry_CBasePlayer_StartObserver* CBasePlayer_StartObserver() = 0; - virtual IReGameHookRegistry_CBasePlayer_GetIntoGame* CBasePlayer_GetIntoGame() = 0; + virtual IReGameHookRegistry_CBasePlayer_Observer_IsValidTarget *CBasePlayer_Observer_IsValidTarget() = 0; + virtual IReGameHookRegistry_CBasePlayer_SetAnimation *CBasePlayer_SetAnimation() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveDefaultItems *CBasePlayer_GiveDefaultItems() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveNamedItem *CBasePlayer_GiveNamedItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_AddAccount *CBasePlayer_AddAccount() = 0; + virtual IReGameHookRegistry_CBasePlayer_GiveShield *CBasePlayer_GiveShield() = 0; + virtual IReGameHookRegistry_CBasePlayer_SetClientUserInfoModel *CBasePlayer_SetClientUserInfoModel() = 0; + virtual IReGameHookRegistry_CBasePlayer_SetClientUserInfoName *CBasePlayer_SetClientUserInfoName() = 0; + virtual IReGameHookRegistry_CBasePlayer_HasRestrictItem *CBasePlayer_HasRestrictItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_DropPlayerItem *CBasePlayer_DropPlayerItem() = 0; + virtual IReGameHookRegistry_CBasePlayer_DropShield *CBasePlayer_DropShield() = 0; + virtual IReGameHookRegistry_CBasePlayer_OnSpawnEquip *CBasePlayer_OnSpawnEquip() = 0; + virtual IReGameHookRegistry_CBasePlayer_Radio *CBasePlayer_Radio() = 0; + virtual IReGameHookRegistry_CBasePlayer_Disappear *CBasePlayer_Disappear() = 0; + virtual IReGameHookRegistry_CBasePlayer_MakeVIP *CBasePlayer_MakeVIP() = 0; + virtual IReGameHookRegistry_CBasePlayer_MakeBomber *CBasePlayer_MakeBomber() = 0; + virtual IReGameHookRegistry_CBasePlayer_StartObserver *CBasePlayer_StartObserver() = 0; + virtual IReGameHookRegistry_CBasePlayer_GetIntoGame *CBasePlayer_GetIntoGame() = 0; - virtual IReGameHookRegistry_CBaseAnimating_ResetSequenceInfo* CBaseAnimating_ResetSequenceInfo() = 0; + virtual IReGameHookRegistry_CBaseAnimating_ResetSequenceInfo *CBaseAnimating_ResetSequenceInfo() = 0; - virtual IReGameHookRegistry_GetForceCamera* GetForceCamera() = 0; - virtual IReGameHookRegistry_PlayerBlind* PlayerBlind() = 0; - virtual IReGameHookRegistry_RadiusFlash_TraceLine* RadiusFlash_TraceLine() = 0; - virtual IReGameHookRegistry_RoundEnd* RoundEnd() = 0; - virtual IReGameHookRegistry_InstallGameRules* InstallGameRules() = 0; - virtual IReGameHookRegistry_PM_Init* PM_Init() = 0; - virtual IReGameHookRegistry_PM_Move* PM_Move() = 0; - virtual IReGameHookRegistry_PM_AirMove* PM_AirMove() = 0; - virtual IReGameHookRegistry_HandleMenu_ChooseAppearance* HandleMenu_ChooseAppearance() = 0; - virtual IReGameHookRegistry_HandleMenu_ChooseTeam* HandleMenu_ChooseTeam() = 0; - virtual IReGameHookRegistry_ShowMenu* ShowMenu() = 0; - virtual IReGameHookRegistry_ShowVGUIMenu* ShowVGUIMenu() = 0; - virtual IReGameHookRegistry_BuyGunAmmo* BuyGunAmmo() = 0; - virtual IReGameHookRegistry_BuyWeaponByWeaponID* BuyWeaponByWeaponID() = 0; - virtual IReGameHookRegistry_InternalCommand* InternalCommand() = 0; + virtual IReGameHookRegistry_GetForceCamera *GetForceCamera() = 0; + virtual IReGameHookRegistry_PlayerBlind *PlayerBlind() = 0; + virtual IReGameHookRegistry_RadiusFlash_TraceLine *RadiusFlash_TraceLine() = 0; + virtual IReGameHookRegistry_RoundEnd *RoundEnd() = 0; + virtual IReGameHookRegistry_InstallGameRules *InstallGameRules() = 0; + virtual IReGameHookRegistry_PM_Init *PM_Init() = 0; + virtual IReGameHookRegistry_PM_Move *PM_Move() = 0; + virtual IReGameHookRegistry_PM_AirMove *PM_AirMove() = 0; + virtual IReGameHookRegistry_HandleMenu_ChooseAppearance *HandleMenu_ChooseAppearance() = 0; + virtual IReGameHookRegistry_HandleMenu_ChooseTeam *HandleMenu_ChooseTeam() = 0; + virtual IReGameHookRegistry_ShowMenu *ShowMenu() = 0; + virtual IReGameHookRegistry_ShowVGUIMenu *ShowVGUIMenu() = 0; + virtual IReGameHookRegistry_BuyGunAmmo *BuyGunAmmo() = 0; + virtual IReGameHookRegistry_BuyWeaponByWeaponID *BuyWeaponByWeaponID() = 0; + virtual IReGameHookRegistry_InternalCommand *InternalCommand() = 0; - virtual IReGameHookRegistry_CSGameRules_FShouldSwitchWeapon* CSGameRules_FShouldSwitchWeapon() = 0; - virtual IReGameHookRegistry_CSGameRules_GetNextBestWeapon* CSGameRules_GetNextBestWeapon() = 0; - virtual IReGameHookRegistry_CSGameRules_FlPlayerFallDamage* CSGameRules_FlPlayerFallDamage() = 0; - virtual IReGameHookRegistry_CSGameRules_FPlayerCanTakeDamage* CSGameRules_FPlayerCanTakeDamage() = 0; - virtual IReGameHookRegistry_CSGameRules_PlayerSpawn* CSGameRules_PlayerSpawn() = 0; - virtual IReGameHookRegistry_CSGameRules_FPlayerCanRespawn* CSGameRules_FPlayerCanRespawn() = 0; - virtual IReGameHookRegistry_CSGameRules_GetPlayerSpawnSpot* CSGameRules_GetPlayerSpawnSpot() = 0; - virtual IReGameHookRegistry_CSGameRules_ClientUserInfoChanged* CSGameRules_ClientUserInfoChanged() = 0; - virtual IReGameHookRegistry_CSGameRules_PlayerKilled* CSGameRules_PlayerKilled() = 0; - virtual IReGameHookRegistry_CSGameRules_DeathNotice* CSGameRules_DeathNotice() = 0; - virtual IReGameHookRegistry_CSGameRules_CanHavePlayerItem* CSGameRules_CanHavePlayerItem() = 0; - virtual IReGameHookRegistry_CSGameRules_DeadPlayerWeapons* CSGameRules_DeadPlayerWeapons() = 0; - virtual IReGameHookRegistry_CSGameRules_ServerDeactivate* CSGameRules_ServerDeactivate() = 0; - virtual IReGameHookRegistry_CSGameRules_CheckMapConditions* CSGameRules_CheckMapConditions() = 0; - virtual IReGameHookRegistry_CSGameRules_CleanUpMap* CSGameRules_CleanUpMap() = 0; - virtual IReGameHookRegistry_CSGameRules_RestartRound* CSGameRules_RestartRound() = 0; - virtual IReGameHookRegistry_CSGameRules_CheckWinConditions* CSGameRules_CheckWinConditions() = 0; - virtual IReGameHookRegistry_CSGameRules_RemoveGuns* CSGameRules_RemoveGuns() = 0; - virtual IReGameHookRegistry_CSGameRules_GiveC4* CSGameRules_GiveC4() = 0; - virtual IReGameHookRegistry_CSGameRules_ChangeLevel* CSGameRules_ChangeLevel() = 0; - virtual IReGameHookRegistry_CSGameRules_GoToIntermission* CSGameRules_GoToIntermission() = 0; - virtual IReGameHookRegistry_CSGameRules_BalanceTeams* CSGameRules_BalanceTeams() = 0; - virtual IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd* CSGameRules_OnRoundFreezeEnd() = 0; - virtual IReGameHookRegistry_PM_UpdateStepSound* PM_UpdateStepSound() = 0; + virtual IReGameHookRegistry_CSGameRules_FShouldSwitchWeapon *CSGameRules_FShouldSwitchWeapon() = 0; + virtual IReGameHookRegistry_CSGameRules_GetNextBestWeapon *CSGameRules_GetNextBestWeapon() = 0; + virtual IReGameHookRegistry_CSGameRules_FlPlayerFallDamage *CSGameRules_FlPlayerFallDamage() = 0; + virtual IReGameHookRegistry_CSGameRules_FPlayerCanTakeDamage *CSGameRules_FPlayerCanTakeDamage() = 0; + virtual IReGameHookRegistry_CSGameRules_PlayerSpawn *CSGameRules_PlayerSpawn() = 0; + virtual IReGameHookRegistry_CSGameRules_FPlayerCanRespawn *CSGameRules_FPlayerCanRespawn() = 0; + virtual IReGameHookRegistry_CSGameRules_GetPlayerSpawnSpot *CSGameRules_GetPlayerSpawnSpot() = 0; + virtual IReGameHookRegistry_CSGameRules_ClientUserInfoChanged *CSGameRules_ClientUserInfoChanged() = 0; + virtual IReGameHookRegistry_CSGameRules_PlayerKilled *CSGameRules_PlayerKilled() = 0; + virtual IReGameHookRegistry_CSGameRules_DeathNotice *CSGameRules_DeathNotice() = 0; + virtual IReGameHookRegistry_CSGameRules_CanHavePlayerItem *CSGameRules_CanHavePlayerItem() = 0; + virtual IReGameHookRegistry_CSGameRules_DeadPlayerWeapons *CSGameRules_DeadPlayerWeapons() = 0; + virtual IReGameHookRegistry_CSGameRules_ServerDeactivate *CSGameRules_ServerDeactivate() = 0; + virtual IReGameHookRegistry_CSGameRules_CheckMapConditions *CSGameRules_CheckMapConditions() = 0; + virtual IReGameHookRegistry_CSGameRules_CleanUpMap *CSGameRules_CleanUpMap() = 0; + virtual IReGameHookRegistry_CSGameRules_RestartRound *CSGameRules_RestartRound() = 0; + virtual IReGameHookRegistry_CSGameRules_CheckWinConditions *CSGameRules_CheckWinConditions() = 0; + virtual IReGameHookRegistry_CSGameRules_RemoveGuns *CSGameRules_RemoveGuns() = 0; + virtual IReGameHookRegistry_CSGameRules_GiveC4 *CSGameRules_GiveC4() = 0; + virtual IReGameHookRegistry_CSGameRules_ChangeLevel *CSGameRules_ChangeLevel() = 0; + virtual IReGameHookRegistry_CSGameRules_GoToIntermission *CSGameRules_GoToIntermission() = 0; + virtual IReGameHookRegistry_CSGameRules_BalanceTeams *CSGameRules_BalanceTeams() = 0; + virtual IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd *CSGameRules_OnRoundFreezeEnd() = 0; + virtual IReGameHookRegistry_PM_UpdateStepSound *PM_UpdateStepSound() = 0; + virtual IReGameHookRegistry_CBasePlayer_StartDeathCam *CBasePlayer_StartDeathCam() = 0; + virtual IReGameHookRegistry_CBasePlayer_SwitchTeam *CBasePlayer_SwitchTeam() = 0; + virtual IReGameHookRegistry_CBasePlayer_CanSwitchTeam *CBasePlayer_CanSwitchTeam() = 0; + virtual IReGameHookRegistry_CBasePlayer_ThrowGrenade *CBasePlayer_ThrowGrenade() = 0; + virtual IReGameHookRegistry_CSGameRules_CanPlayerHearPlayer *CSGameRules_CanPlayerHearPlayer() = 0; + virtual IReGameHookRegistry_CWeaponBox_SetModel *CWeaponBox_SetModel() = 0; + virtual IReGameHookRegistry_CGrenade_DefuseBombStart *CGrenade_DefuseBombStart() = 0; + virtual IReGameHookRegistry_CGrenade_DefuseBombEnd *CGrenade_DefuseBombEnd() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeHeGrenade *CGrenade_ExplodeHeGrenade() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeFlashbang *CGrenade_ExplodeFlashbang() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeSmokeGrenade *CGrenade_ExplodeSmokeGrenade() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeBomb *CGrenade_ExplodeBomb() = 0; + virtual IReGameHookRegistry_ThrowHeGrenade *ThrowHeGrenade() = 0; + virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang() = 0; + virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade() = 0; + virtual IReGameHookRegistry_PlantBomb *PlantBomb() = 0; + virtual IReGameHookRegistry_CBasePlayer_RemoveSpawnProtection *CBasePlayer_RemoveSpawnProtection() = 0; + virtual IReGameHookRegistry_CBasePlayer_SetSpawnProtection *CBasePlayer_SetSpawnProtection() = 0; + virtual IReGameHookRegistry_IsPenetrableEntity *IsPenetrableEntity() = 0; }; struct ReGameFuncs_t { @@ -466,17 +562,19 @@ public: virtual int GetMajorVersion() = 0; virtual int GetMinorVersion() = 0; - virtual const ReGameFuncs_t* GetFuncs() = 0; - virtual IReGameHookchains* GetHookchains() = 0; + virtual const ReGameFuncs_t *GetFuncs() = 0; + virtual IReGameHookchains *GetHookchains() = 0; - virtual class CGameRules* GetGameRules() = 0; - virtual struct WeaponInfoStruct* GetWeaponInfo(int weaponID) = 0; - virtual struct WeaponInfoStruct* GetWeaponInfo(const char* weaponName) = 0; - virtual struct playermove_s* GetPlayerMove() = 0; - virtual struct WeaponSlotInfo* GetWeaponSlot(WeaponIdType weaponID) = 0; - virtual struct WeaponSlotInfo* GetWeaponSlot(const char* weaponName) = 0; - virtual struct ItemInfo* GetItemInfo(WeaponIdType weaponID) = 0; - virtual struct AmmoInfo* GetAmmoInfo(AmmoType ammoID) = 0; + virtual class CGameRules *GetGameRules() = 0; + virtual struct WeaponInfoStruct *GetWeaponInfo(int weaponID) = 0; + virtual struct WeaponInfoStruct *GetWeaponInfo(const char *weaponName) = 0; + virtual struct playermove_s *GetPlayerMove() = 0; + virtual struct WeaponSlotInfo *GetWeaponSlot(WeaponIdType weaponID) = 0; + virtual struct WeaponSlotInfo *GetWeaponSlot(const char *weaponName) = 0; + virtual ItemInfo *GetItemInfo(WeaponIdType weaponID) = 0; + virtual struct AmmoInfo *GetAmmoInfo(AmmoType ammoID) = 0; + virtual struct AmmoInfoStruct *GetAmmoInfoEx(AmmoType ammoID) = 0; + virtual struct AmmoInfoStruct *GetAmmoInfoEx(const char *ammoName) = 0; }; #define VRE_GAMEDLL_API_VERSION "VRE_GAMEDLL_API_VERSION001" diff --git a/public/resdk/engine/IObjectContainer.h b/public/resdk/engine/IObjectContainer.h new file mode 100644 index 00000000..333e9d04 --- /dev/null +++ b/public/resdk/engine/IObjectContainer.h @@ -0,0 +1,47 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +class IObjectContainer { +public: + virtual ~IObjectContainer() {} + + virtual void Init() = 0; + + virtual bool Add(void *newObject) = 0; + virtual bool Remove(void *object) = 0; + virtual void Clear(bool freeElementsMemory) = 0; + + virtual void *GetFirst() = 0; + virtual void *GetNext() = 0; + + virtual int CountElements() = 0; + virtual bool Contains(void *object) = 0; + virtual bool IsEmpty() = 0; +}; diff --git a/public/resdk/engine/ObjectList.h b/public/resdk/engine/ObjectList.h new file mode 100644 index 00000000..aa023f84 --- /dev/null +++ b/public/resdk/engine/ObjectList.h @@ -0,0 +1,65 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +#include "IObjectContainer.h" + +class ObjectList: public IObjectContainer { +public: + EXT_FUNC void Init(); + EXT_FUNC bool Add(void *newObject); + EXT_FUNC void *GetFirst(); + EXT_FUNC void *GetNext(); + + ObjectList(); + virtual ~ObjectList(); + + EXT_FUNC void Clear(bool freeElementsMemory = false); + EXT_FUNC int CountElements(); + void *RemoveTail(); + void *RemoveHead(); + + bool AddTail(void *newObject); + bool AddHead(void *newObject); + EXT_FUNC bool Remove(void *object); + EXT_FUNC bool Contains(void *object); + EXT_FUNC bool IsEmpty(); + + typedef struct element_s { + struct element_s *prev; // pointer to the last element or NULL + struct element_s *next; // pointer to the next elemnet or NULL + void *object; // the element's object + } element_t; + +protected: + element_t *m_head; // first element in list + element_t *m_tail; // last element in list + element_t *m_current; // current element in list + int m_number; +}; diff --git a/public/resdk/engine/cmd_rehlds.h b/public/resdk/engine/cmd_rehlds.h index 7660e561..003cb600 100644 --- a/public/resdk/engine/cmd_rehlds.h +++ b/public/resdk/engine/cmd_rehlds.h @@ -27,11 +27,13 @@ */ #pragma once +#include "archtypes.h" + typedef void(*xcommand_t)(void); typedef struct cmd_function_s { struct cmd_function_s *next; - char *name; + const char *name; xcommand_t function; int flags; } cmd_function_t; diff --git a/public/resdk/engine/pr_dlls.h b/public/resdk/engine/pr_dlls.h new file mode 100644 index 00000000..95c34304 --- /dev/null +++ b/public/resdk/engine/pr_dlls.h @@ -0,0 +1,48 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#pragma once + +const int MAX_EXTENSION_DLL = 50; + +typedef struct functiontable_s +{ + uint32 pFunction; + char *pFunctionName; +} functiontable_t; + +typedef struct extensiondll_s +{ + void *lDLLHandle; + functiontable_t *functionTable; + int functionCount; +} extensiondll_t; + +typedef void(*ENTITYINIT)(struct entvars_s *); +typedef void(*DISPATCHFUNCTION)(struct entvars_s *, void *); +typedef void(*FIELDIOFUNCTION)(SAVERESTOREDATA *, const char *, void *, TYPEDESCRIPTION *, int); diff --git a/public/resdk/engine/rehlds_api.h b/public/resdk/engine/rehlds_api.h index a6d8ebb3..63348948 100644 --- a/public/resdk/engine/rehlds_api.h +++ b/public/resdk/engine/rehlds_api.h @@ -27,15 +27,25 @@ */ #pragma once +#if defined(WIN32) + #define FORCE_STACK_ALIGN +#else + #define FORCE_STACK_ALIGN __attribute__((force_align_arg_pointer)) +#endif + +#define EXT_FUNC FORCE_STACK_ALIGN + #include <engine_strucs.h> #include <com_model.h> #include "cmd_rehlds.h" +#include "ObjectList.h" +#include "pr_dlls.h" #include "rehlds_interfaces.h" #include "FlightRecorder.h" #include "../common/hookchains.h" #define REHLDS_API_VERSION_MAJOR 3 -#define REHLDS_API_VERSION_MINOR 0 +#define REHLDS_API_VERSION_MINOR 4 //Steam_NotifyClientConnect hook typedef IHookChain<qboolean, IGameClient*, const void*, unsigned int> IRehldsHook_Steam_NotifyClientConnect; @@ -189,6 +199,10 @@ typedef IHookChainRegistry<int, enum sv_delta_s, IGameClient *, struct packet_en typedef IHookChain<bool, edict_t *, IGameClient *, int, const char*, float, float, int, int, int, const float*> IRehldsHook_SV_EmitSound2; typedef IHookChainRegistry<bool, edict_t *, IGameClient *, int, const char*, float, float, int, int, int, const float*> IRehldsHookRegistry_SV_EmitSound2; +//CreateFakeClient hook +typedef IHookChain<edict_t *, const char *> IRehldsHook_CreateFakeClient; +typedef IHookChainRegistry<edict_t *, const char *> IRehldsHookRegistry_CreateFakeClient; + class IRehldsHookchains { public: virtual ~IRehldsHookchains() { } @@ -231,6 +245,7 @@ public: virtual IRehldsHookRegistry_SV_Spawn_f* SV_Spawn_f() = 0; virtual IRehldsHookRegistry_SV_CreatePacketEntities* SV_CreatePacketEntities() = 0; virtual IRehldsHookRegistry_SV_EmitSound2* SV_EmitSound2() = 0; + virtual IRehldsHookRegistry_CreateFakeClient* CreateFakeClient() = 0; }; struct RehldsFuncs_t { @@ -267,7 +282,7 @@ struct RehldsFuncs_t { cvar_t*(*GetCvarVars)(); int (*SV_GetChallenge)(const netadr_t& adr); void (*SV_AddResource)(resourcetype_t type, const char *name, int size, unsigned char flags, int index); - int(*MSG_ReadShort)(void); + int(*MSG_ReadShort)(); int(*MSG_ReadBuf)(int iSize, void *pbuf); void(*MSG_WriteBuf)(sizebuf_t *sb, int iSize, void *buf); void(*MSG_WriteByte)(sizebuf_t *sb, int c); @@ -282,6 +297,13 @@ struct RehldsFuncs_t { bool(*SV_EmitSound2)(edict_t *entity, IGameClient *receiver, int channel, const char *sample, float volume, float attenuation, int flags, int pitch, int emitFlags, const float *pOrigin); void(*SV_UpdateUserInfo)(IGameClient *pGameClient); bool(*StripUnprintableAndSpace)(char *pch); + void(*Cmd_RemoveCmd)(const char *cmd_name); + void(*GetCommandMatches)(const char *string, ObjectList *pMatchList); + bool(*AddExtDll)(void *hModule); + void(*AddCvarListener)(const char *var_name, cvar_callback_t func); + void(*RemoveExtDll)(void *hModule); + void(*RemoveCvarListener)(const char *var_name, cvar_callback_t func); + ENTITYINIT(*GetEntityInit)(char *pszClassName); }; class IRehldsApi { @@ -297,4 +319,4 @@ public: virtual IRehldsFlightRecorder* GetFlightRecorder() = 0; }; -#define VREHLDS_HLDS_API_VERSION "VREHLDS_HLDS_API_VERSION001" \ No newline at end of file +#define VREHLDS_HLDS_API_VERSION "VREHLDS_HLDS_API_VERSION001" diff --git a/public/resdk/engine/rehlds_interfaces.h b/public/resdk/engine/rehlds_interfaces.h index 4ad70346..30f15f0f 100644 --- a/public/resdk/engine/rehlds_interfaces.h +++ b/public/resdk/engine/rehlds_interfaces.h @@ -81,6 +81,7 @@ public: virtual IGameClient* GetClient(int id) = 0; virtual client_t* GetClient_t(int id) = 0; virtual int GetIndexOfClient_t(client_t* client) = 0; + virtual int GetMaxClientsLimit() = 0; }; class IRehldsServerData { diff --git a/public/resdk/mod_regamedll_api.cpp b/public/resdk/mod_regamedll_api.cpp index 0139fc71..74464ad4 100644 --- a/public/resdk/mod_regamedll_api.cpp +++ b/public/resdk/mod_regamedll_api.cpp @@ -7,15 +7,15 @@ IReGameHookchains * ReGameHookchains; bool RegamedllApi_Init() { - auto library = GET_GAME_INFO(PLID, GINFO_DLL_FULLPATH); + const auto library = GET_GAME_INFO(PLID, GINFO_DLL_FULLPATH); if (!library || !GET_IFACE<IReGameApi>(library, ReGameApi, VRE_GAMEDLL_API_VERSION, false) || !ReGameApi) { return false; } - auto majorVersion = ReGameApi->GetMajorVersion(); - auto minorVersion = ReGameApi->GetMinorVersion(); + const auto majorVersion = ReGameApi->GetMajorVersion(); + const auto minorVersion = ReGameApi->GetMinorVersion(); if (majorVersion != REGAMEDLL_API_VERSION_MAJOR || minorVersion < REGAMEDLL_API_VERSION_MINOR) { diff --git a/public/resdk/mod_rehlds_api.cpp b/public/resdk/mod_rehlds_api.cpp index 8312e771..14724704 100644 --- a/public/resdk/mod_rehlds_api.cpp +++ b/public/resdk/mod_rehlds_api.cpp @@ -15,9 +15,9 @@ bool RehldsApi_Init() } #if defined(PLATFORM_WINDOWS) - auto library = "swds"; + const auto library = "swds"; #elif defined(PLATFORM_POSIX) - auto library = "engine_i486"; + const auto library = "engine_i486"; #endif if (!GET_IFACE<IRehldsApi>(library, RehldsApi, VREHLDS_HLDS_API_VERSION) || !RehldsApi) @@ -25,8 +25,8 @@ bool RehldsApi_Init() return false; } - auto majorVersion = RehldsApi->GetMajorVersion(); - auto minorVersion = RehldsApi->GetMinorVersion(); + const auto majorVersion = RehldsApi->GetMajorVersion(); + const auto minorVersion = RehldsApi->GetMinorVersion(); if (majorVersion != REHLDS_API_VERSION_MAJOR || minorVersion < REHLDS_API_VERSION_MINOR) { From 197db8c82b9be41bc05ce939561659e7231afc4a Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 25 Aug 2018 11:29:54 +0200 Subject: [PATCH 32/98] Update AMTL from upstream (#521) --- amxmodx/CGameConfigs.h | 1 + amxmodx/CPlugin.h | 1 + public/amtl | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/amxmodx/CGameConfigs.h b/amxmodx/CGameConfigs.h index 3ced7691..b7d58c85 100644 --- a/amxmodx/CGameConfigs.h +++ b/amxmodx/CGameConfigs.h @@ -12,6 +12,7 @@ #include <IGameConfigs.h> #include "CLibrarySys.h" +#include <amtl/am-autoptr.h> #include <amtl/am-vector.h> #include <amtl/am-string.h> #include <amtl/am-refcounting.h> diff --git a/amxmodx/CPlugin.h b/amxmodx/CPlugin.h index 60fb899f..791c3a4c 100755 --- a/amxmodx/CPlugin.h +++ b/amxmodx/CPlugin.h @@ -15,6 +15,7 @@ #include "amxxfile.h" #include <amtl/am-string.h> #include <amtl/am-vector.h> +#include <amtl/am-autoptr.h> // ***************************************************** // class CPluginMngr diff --git a/public/amtl b/public/amtl index c91e8560..bee3fc51 160000 --- a/public/amtl +++ b/public/amtl @@ -1 +1 @@ -Subproject commit c91e8560fb00984465a1a916172123b80a76dd04 +Subproject commit bee3fc51a95a6aab4143779316353ed64531fbf3 From 8aeefc3fcab74813b788db959600ef62deaa3047 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Sat, 25 Aug 2018 20:52:48 +0200 Subject: [PATCH 33/98] Add constants for stats functions (#509) * Add constants for stats functions * Changed STATS_ to STATSX_ and added 2 more defines * Added constants for all games * Add csstats_const.inc and add _MAX_ constats to enum * Change bodyhits --- modules/cstrike/csx/msvc12/csx.vcxproj | 1 + .../cstrike/csx/msvc12/csx.vcxproj.filters | 3 ++ plugins/include/amxconst.inc | 17 +++++++++ plugins/include/csstats.inc | 38 ++++++++++++++----- plugins/include/csstats_const.inc | 29 ++++++++++++++ plugins/include/dodconst.inc | 14 +++++++ plugins/include/dodstats.inc | 18 ++++----- plugins/include/tfcstats.inc | 14 +++---- plugins/include/tsstats.inc | 16 ++++---- support/PackageScript | 1 + 10 files changed, 118 insertions(+), 33 deletions(-) create mode 100644 plugins/include/csstats_const.inc diff --git a/modules/cstrike/csx/msvc12/csx.vcxproj b/modules/cstrike/csx/msvc12/csx.vcxproj index 6a6d695b..2badf907 100644 --- a/modules/cstrike/csx/msvc12/csx.vcxproj +++ b/modules/cstrike/csx/msvc12/csx.vcxproj @@ -160,6 +160,7 @@ </ItemGroup> <ItemGroup> <None Include="..\..\..\plugins\include\csstats.inc" /> + <None Include="..\..\..\plugins\include\csstats_const.inc" /> <None Include="..\..\..\plugins\include\csx.inc" /> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> diff --git a/modules/cstrike/csx/msvc12/csx.vcxproj.filters b/modules/cstrike/csx/msvc12/csx.vcxproj.filters index e0865b43..cc5eab35 100644 --- a/modules/cstrike/csx/msvc12/csx.vcxproj.filters +++ b/modules/cstrike/csx/msvc12/csx.vcxproj.filters @@ -60,6 +60,9 @@ <None Include="..\..\..\plugins\include\csstats.inc"> <Filter>Pawn Includes</Filter> </None> + <None Include="..\..\..\plugins\include\csstats_const.inc"> + <Filter>Pawn Includes</Filter> + </None> <None Include="..\..\..\plugins\include\csx.inc"> <Filter>Pawn Includes</Filter> </None> diff --git a/plugins/include/amxconst.inc b/plugins/include/amxconst.inc index 1e7ac379..ca5011ee 100755 --- a/plugins/include/amxconst.inc +++ b/plugins/include/amxconst.inc @@ -151,6 +151,7 @@ public stock const Float:NULL_VECTOR[3]; #define HIT_LEFTLEG 6 #define HIT_RIGHTLEG 7 #define HIT_SHIELD 8 // CS only +#define MAX_BODYHITS 8 /** * @section emit_sound() constants @@ -516,4 +517,20 @@ enum FindPlayerFlags (<<= 1) FindPlayer_IncludeConnecting // Include connecting clients } +/** + * Constants for client statistics + */ +enum +{ + STATSX_KILLS = 0, + STATSX_DEATHS, + STATSX_HEADSHOTS, + STATSX_TEAMKILLS, + STATSX_SHOTS, + STATSX_HITS, + STATSX_DAMAGE, + STATSX_RANK, + STATSX_MAX_STATS +} + #include <cstrike_const> // To keep backward compatibility diff --git a/plugins/include/csstats.inc b/plugins/include/csstats.inc index 96e168ef..84b7a4da 100755 --- a/plugins/include/csstats.inc +++ b/plugins/include/csstats.inc @@ -12,6 +12,8 @@ #endif #define _csstats_included +#include <csstats_const> + /** * Retrieves the client's current weapon statistics. * @@ -19,6 +21,8 @@ * amxconst.inc, this function also works on custom weapons. * @note For a list of possible body hitplaces see the HIT_* constants in * amxconst.inc + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - Kills * 1 - Deaths @@ -39,7 +43,7 @@ * @error If an invalid client index or weapon id is provided, an * error will be thrown. */ -native get_user_wstats(index, wpnindex, stats[8], bodyhits[8]); +native get_user_wstats(index, wpnindex, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS]); /** * Retrieves the client's weapon statistics from the current round. @@ -48,6 +52,8 @@ native get_user_wstats(index, wpnindex, stats[8], bodyhits[8]); * amxconst.inc, this function also works on custom weapons. * @note For a list of possible body hitplaces see the HIT_* constants in * amxconst.inc + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - Kills * 1 - Deaths @@ -68,7 +74,7 @@ native get_user_wstats(index, wpnindex, stats[8], bodyhits[8]); * @error If an invalid client index or weapon id is provided, an * error will be thrown. */ -native get_user_wrstats(index, wpnindex, stats[8], bodyhits[8]); +native get_user_wrstats(index, wpnindex, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS]); /** * Retrieves the client's weapon statistics from the permanent storage on the @@ -80,6 +86,8 @@ native get_user_wrstats(index, wpnindex, stats[8], bodyhits[8]); * deaths/teamkills. * @note For a list of possible body hitplaces see the HIT_* constants in * amxconst.inc + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - Kills * 1 - Deaths @@ -99,13 +107,15 @@ native get_user_wrstats(index, wpnindex, stats[8], bodyhits[8]); * @error If an invalid client index is provided, an error will be * thrown. */ -native get_user_stats(index, stats[8], bodyhits[8]); +native get_user_stats(index, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS]); /** * Retrieves the client's statistics from the current round. * * @note For a list of possible body hitplaces see the HIT_* constants in * amxconst.inc + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - Kills * 1 - Deaths @@ -123,7 +133,7 @@ native get_user_stats(index, stats[8], bodyhits[8]); * @error If an invalid client index is provided, an error will be * thrown. */ -native get_user_rstats(index, stats[8], bodyhits[8]); +native get_user_rstats(index, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS]); /** * Retrieves the client's statistics inflicted upon another client from the @@ -131,6 +141,8 @@ native get_user_rstats(index, stats[8], bodyhits[8]); * * @note For a list of possible body hitplaces see the HIT_* constants in * amxconst.inc + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - Kills * 1 - Deaths @@ -153,7 +165,7 @@ native get_user_rstats(index, stats[8], bodyhits[8]); * @error If an invalid client index is provided, an error will be * thrown. */ -native get_user_vstats(index, victim, stats[8], bodyhits[8], wpnname[] = "", len = 0); +native get_user_vstats(index, victim, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS], wpnname[] = "", len = 0); /** * Retrieves the client's statistics received from another client from the @@ -161,6 +173,8 @@ native get_user_vstats(index, victim, stats[8], bodyhits[8], wpnname[] = "", len * * @note For a list of possible body hitplaces see the HIT_* constants in * amxconst.inc + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - Kills * 1 - Deaths @@ -183,7 +197,7 @@ native get_user_vstats(index, victim, stats[8], bodyhits[8], wpnname[] = "", len * @error If an invalid client index is provided, an error will be * thrown. */ -native get_user_astats(index, wpnindex, stats[8], bodyhits[8], wpnname[] = "", len = 0); +native get_user_astats(index, wpnindex, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS], wpnname[] = "", len = 0); /** * Resets the current round weapon, attacker and victim statistics. @@ -206,6 +220,8 @@ native reset_user_wstats(index); * deaths/teamkills. * @note For a list of possible body hitplaces see the HIT_* constants in * amxconst.inc + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - Kills * 1 - Deaths @@ -227,7 +243,7 @@ native reset_user_wstats(index); * @return Next rank index (> 0 and > index), or 0 if no more * statistics exist */ -native get_stats(index, stats[8], bodyhits[8], name[], len, authid[] = "", authidlen = 0); +native get_stats(index, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS], name[], len, authid[] = "", authidlen = 0); /** * Returns the number of all entries in the permanent statistics storage. @@ -240,6 +256,8 @@ native get_statsnum(); * Retrieves the client's objective statistics from the permanent storage. * * @note The permanent storage is updated on every respawn or client disconnect. + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - total defusions * 1 - bomb defused @@ -254,13 +272,15 @@ native get_statsnum(); * @error If an invalid client index is provided, an error will be * thrown. */ -native get_user_stats2(index, stats[4]); +native get_user_stats2(index, stats[STATSX_MAX_OBJECTIVE]); /** * Retrieves objective statistics from the permanent storage on the server via * iterative, incremental access. * * @note The permanent storage is updated on every respawn or client disconnect. + * @note For a list of possible stat constants see the STATSX_* constants in + * amxconst.inc * @note The fields in the statistics are: * 0 - total defusions * 1 - bomb defused @@ -275,4 +295,4 @@ native get_user_stats2(index, stats[4]); * @return Next rank index (> 0 and > index), or 0 if no more * statistics exist */ -native get_stats2(index, stats[4], authid[] = "", authidlen = 0); +native get_stats2(index, stats[STATSX_MAX_OBJECTIVE], authid[] = "", authidlen = 0); diff --git a/plugins/include/csstats_const.inc b/plugins/include/csstats_const.inc new file mode 100644 index 00000000..a392d1bb --- /dev/null +++ b/plugins/include/csstats_const.inc @@ -0,0 +1,29 @@ +// vim: set ts=4 sw=4 tw=99 noet: +// +// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). +// Copyright (C) The AMX Mod X Development Team. +// +// This software is licensed under the GNU General Public License, version 3 or higher. +// Additional exceptions apply. For full license details, see LICENSE.txt or visit: +// https://alliedmods.net/amxmodx-license + +// +// Counter-Strike Functions +// + +#if defined _csstats_const_included + #endinput +#endif +#define _csstats_const_included + +/** + * Constants for objective based statistics + */ +enum +{ + STATSX_TOTAL_DEFUSIONS = 0, + STATSX_BOMBS_DEFUSED, + STATSX_BOMBS_PLANTED, + STATSX_BOMB_EXPLOSIONS, + STATSX_MAX_OBJECTIVE +} diff --git a/plugins/include/dodconst.inc b/plugins/include/dodconst.inc index ca53e802..14807e53 100755 --- a/plugins/include/dodconst.inc +++ b/plugins/include/dodconst.inc @@ -136,3 +136,17 @@ enum { DODC_PIAT, //DODC_BRIT_MORTAR, }; + +/* DoD stats constants */ +enum { + DODX_KILLS = 0, + DODX_DEATHS, + DODX_HEADSHOTS, + DODX_TEAMKILLS, + DODX_SHOTS, + DODX_HITS, + DODX_DAMAGE, + DODX_POINTS, + DODX_RANK, + DODX_MAX_STATS +} diff --git a/plugins/include/dodstats.inc b/plugins/include/dodstats.inc index a250a2ba..381496a2 100755 --- a/plugins/include/dodstats.inc +++ b/plugins/include/dodstats.inc @@ -28,34 +28,34 @@ * 6 - damage * 7 - score * For body hits fields see amxconst.inc. */ -native get_user_wstats(index,wpnindex,stats[9],bodyhits[8]); +native get_user_wstats(index,wpnindex,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets round stats from given weapon index.*/ -native get_user_wrstats(index,wpnindex,stats[9],bodyhits[8]); +native get_user_wrstats(index,wpnindex,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets life (from spawn to spawn) stats from given weapon index.*/ -native get_user_wlstats(index,wpnindex,stats[9],bodyhits[8]); +native get_user_wlstats(index,wpnindex,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets overall stats which are stored in file on server * and updated on every respawn or user disconnect. * Function returns the position in stats by diff. kills to deaths. */ -native get_user_stats(index,stats[9],bodyhits[8]); +native get_user_stats(index,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets round stats of player. */ -native get_user_rstats(index,stats[9],bodyhits[8]); +native get_user_rstats(index,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets life (from spawn to spawn) stats of player. */ -native get_user_lstats(index,stats[9],bodyhits[8]); +native get_user_lstats(index,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets stats with which user have killed/hurt his victim. If victim is 0 * then stats are from all victims. If victim has not been hurt, function * returns 0 in other case 1. User stats are reset on his respawn. */ -native get_user_vstats(index,victim,stats[9],bodyhits[8],wpnname[]="",len=0); +native get_user_vstats(index,victim,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS],wpnname[]="",len=0); /* Gets stats with which user have been killed/hurt. If killer is 0 * then stats are from all attacks. If killer has not hurt user, function * returns 0 in other case 1. User stats are reset on his respawn. */ -native get_user_astats(index,wpnindex,stats[9],bodyhits[8],wpnname[]="",len=0); +native get_user_astats(index,wpnindex,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS],wpnname[]="",len=0); /* Resets life, weapon, victims and attackers user stats. */ native reset_user_wstats(index); @@ -63,7 +63,7 @@ native reset_user_wstats(index); /* Gets overall stats which stored in stats.dat file in amx folder * and updated on every mapchange or user disconnect. * Function returns next index of stats entry or 0 if no more exists. */ -native get_stats(index,stats[9],bodyhits[8],name[],len); +native get_stats(index,stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS],name[],len); /* Returns number of all entries in stats. */ native get_statsnum(); diff --git a/plugins/include/tfcstats.inc b/plugins/include/tfcstats.inc index 9417a0f6..367406a3 100755 --- a/plugins/include/tfcstats.inc +++ b/plugins/include/tfcstats.inc @@ -27,28 +27,28 @@ * 5 - hits * 6 - damage * For body hits fields see amxconst.inc. */ -native get_user_wstats(index,wpnindex,stats[8],bodyhits[8]); +native get_user_wstats(index,wpnindex,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets round stats from given weapon index.*/ -native get_user_wrstats(index,wpnindex,stats[8],bodyhits[8]); +native get_user_wrstats(index,wpnindex,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets overall stats which are stored in file on server * and updated on every respawn or user disconnect. * Function returns the position in stats by diff. kills to deaths. */ -native get_user_stats(index,stats[8],bodyhits[8]); +native get_user_stats(index,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets round stats of player. */ -native get_user_rstats(index,stats[8],bodyhits[8]); +native get_user_rstats(index,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets stats with which user have killed/hurt his victim. If victim is 0 * then stats are from all victims. If victim has not been hurt, function * returns 0 in other case 1. User stats are reset on his respawn. */ -native get_user_vstats(index,victim,stats[8],bodyhits[8],wpnname[]="",len=0); +native get_user_vstats(index,victim,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS],wpnname[]="",len=0); /* Gets stats with which user have been killed/hurt. If killer is 0 * then stats are from all attacks. If killer has not hurt user, function * returns 0 in other case 1. User stats are reset on his respawn. */ -native get_user_astats(index,wpnindex,stats[8],bodyhits[8],wpnname[]="",len=0); +native get_user_astats(index,wpnindex,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS],wpnname[]="",len=0); /* Resets life, weapon, victims and attackers user stats. */ native reset_user_wstats(index); @@ -56,7 +56,7 @@ native reset_user_wstats(index); /* Gets overall stats which stored in stats.dat file in amx folder * and updated on every mapchange or user disconnect. * Function returns next index of stats entry or 0 if no more exists. */ -native get_stats(index,stats[8],bodyhits[8],name[],len); +native get_stats(index,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS],name[],len); /* Returns number of all entries in stats. */ native get_statsnum(); diff --git a/plugins/include/tsstats.inc b/plugins/include/tsstats.inc index 4b43a784..dd2ba60a 100755 --- a/plugins/include/tsstats.inc +++ b/plugins/include/tsstats.inc @@ -27,31 +27,31 @@ * 5 - hits * 6 - damage * For body hits fields see amxconst.inc. */ -native get_user_wstats(index,wpnindex,stats[8],bodyhits[8]); +native get_user_wstats(index,wpnindex,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets round stats from given weapon index.*/ -native get_user_wrstats(index,wpnindex,stats[8],bodyhits[8]); +native get_user_wrstats(index,wpnindex,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets life (from spawn to spawn) stats from given weapon index.*/ -native get_user_wlstats(index,wpnindex,stats[8],bodyhits[8]); +native get_user_wlstats(index,wpnindex,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets overall stats which are stored in file on server * and updated on every respawn or user disconnect. * Function returns the position in stats by diff. kills to deaths. */ -native get_user_stats(index,stats[8],bodyhits[8]); +native get_user_stats(index,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets round stats of player. */ -native get_user_rstats(index,stats[8],bodyhits[8]); +native get_user_rstats(index,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS]); /* Gets stats with which user have killed/hurt his victim. If victim is 0 * then stats are from all victims. If victim has not been hurt, function * returns 0 in other case 1. User stats are reset on his respawn. */ -native get_user_vstats(index,victim,stats[8],bodyhits[8],wpnname[]="",len=0); +native get_user_vstats(index,victim,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS],wpnname[]="",len=0); /* Gets stats with which user have been killed/hurt. If killer is 0 * then stats are from all attacks. If killer has not hurt user, function * returns 0 in other case 1. User stats are reset on his respawn. */ -native get_user_astats(index,wpnindex,stats[8],bodyhits[8],wpnname[]="",len=0); +native get_user_astats(index,wpnindex,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS],wpnname[]="",len=0); /* Resets life, weapon, victims and attackers user stats. */ native reset_user_wstats(index); @@ -59,7 +59,7 @@ native reset_user_wstats(index); /* Gets overall stats which stored in stats.dat file in amx folder * and updated on every mapchange or user disconnect. * Function returns next index of stats entry or 0 if no more exists. */ -native get_stats(index,stats[8],bodyhits[8],name[],len); +native get_stats(index,stats[STATSX_MAX_STATS],bodyhits[MAX_BODYHITS],name[],len); /* Returns number of all entries in stats. */ native get_statsnum(); diff --git a/support/PackageScript b/support/PackageScript index fb754562..fe70fe8f 100644 --- a/support/PackageScript +++ b/support/PackageScript @@ -275,6 +275,7 @@ scripting_files = [ 'include/amxmodx.inc', 'include/core.inc', 'include/csstats.inc', + 'include/csstats_const.inc', 'include/cstrike.inc', 'include/cstrike_const.inc', 'include/csx.inc', From 9bcabfeb1f774439475313c30fb3fe256870268f Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sun, 26 Aug 2018 17:18:39 +0200 Subject: [PATCH 34/98] Add or adjust a bunch of safety checks (#433) --- amxmodx/amxmodx.cpp | 52 +++++++++++------- amxmodx/emsg.cpp | 1 + amxmodx/meta_api.cpp | 11 +++- modules/cstrike/cstrike/CstrikeNatives.cpp | 2 +- modules/cstrike/cstrike/CstrikeUtils.cpp | 5 +- modules/cstrike/cstrike/CstrikeUtils.h | 12 ++++- modules/cstrike/csx/meta_api.cpp | 35 ++++++------ modules/engine/engine.cpp | 21 ++++++++ modules/fakemeta/fakemeta_amxx.h | 10 ++++ modules/fakemeta/fm_tr.cpp | 4 +- modules/fakemeta/fm_tr2.cpp | 4 +- modules/fakemeta/misc.cpp | 2 +- modules/fakemeta/pdata.cpp | 63 ++++++++++++---------- modules/fakemeta/pdata_entities.cpp | 20 +++---- 14 files changed, 156 insertions(+), 86 deletions(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 33b010d5..ac6d79dc 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -214,7 +214,7 @@ static cell AMX_NATIVE_CALL console_print(AMX *amx, cell *params) /* 2 param */ { CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); - if (pPlayer->ingame) + if (pPlayer->ingame && !pPlayer->IsBot()) { if (len > 126) // Client console truncates after byte 127. (126 + \n = 127) { @@ -247,7 +247,7 @@ static cell AMX_NATIVE_CALL client_print(AMX *amx, cell *params) /* 3 param */ { CPlayer *pPlayer = GET_PLAYER_POINTER_I(i); - if (pPlayer->ingame) + if (pPlayer->ingame && !pPlayer->IsBot()) { g_langMngr.SetDefLang(i); msg = format_amxstring(amx, params, 3, len); @@ -280,7 +280,7 @@ static cell AMX_NATIVE_CALL client_print(AMX *amx, cell *params) /* 3 param */ CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); - if (pPlayer->ingame) + if (pPlayer->ingame && !pPlayer->IsBot()) { g_langMngr.SetDefLang(index); @@ -427,7 +427,7 @@ static cell AMX_NATIVE_CALL show_motd(AMX *amx, cell *params) /* 3 param */ { CPlayer* pPlayer = GET_PLAYER_POINTER_I(i); - if (pPlayer->ingame) + if (pPlayer->ingame && !pPlayer->IsBot()) UTIL_ShowMOTD(pPlayer->pEdict, sToShow, ilen, szHead); } } else { @@ -444,7 +444,7 @@ static cell AMX_NATIVE_CALL show_motd(AMX *amx, cell *params) /* 3 param */ CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); - if (pPlayer->ingame) + if (pPlayer->ingame && !pPlayer->IsBot()) UTIL_ShowMOTD(pPlayer->pEdict, sToShow, ilen, szHead); } @@ -524,7 +524,7 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param * { CPlayer *pPlayer = GET_PLAYER_POINTER_I(i); - if (pPlayer->ingame) + if (pPlayer->ingame && !pPlayer->IsBot()) { g_langMngr.SetDefLang(i); message = UTIL_SplitHudMessage(format_amxstring(amx, params, 2, len)); @@ -551,7 +551,7 @@ static cell AMX_NATIVE_CALL show_hudmessage(AMX *amx, cell *params) /* 2 param * CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); - if (pPlayer->ingame) + if (pPlayer->ingame && !pPlayer->IsBot()) { if (aut) { @@ -787,22 +787,27 @@ static cell AMX_NATIVE_CALL is_user_alive(AMX *amx, cell *params) /* 1 param */ if (index < 1 || index > gpGlobals->maxClients) { - return 0; + return FALSE; } CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); + if (!pPlayer->ingame) + { + return FALSE; + } + if (g_bmod_tfc) { edict_t *e = pPlayer->pEdict; if (e->v.flags & FL_SPECTATOR || (!e->v.team || !e->v.playerclass)) { - return 0; + return FALSE; } } - return ((pPlayer->ingame && pPlayer->IsAlive()) ? 1 : 0); + return pPlayer->IsAlive() ? TRUE : FALSE; } static cell AMX_NATIVE_CALL get_amxx_verstring(AMX *amx, cell *params) /* 2 params */ @@ -1106,6 +1111,12 @@ static cell AMX_NATIVE_CALL user_has_weapon(AMX *amx, cell *params) } CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); + + if (!pPlayer->ingame) + { + return 0; + } + edict_t *pEntity = pPlayer->pEdict; if (params[3] == -1) @@ -1344,17 +1355,20 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ } else { CPlayer* pPlayer = GET_PLAYER_POINTER_I(index); - pPlayer->keys = keys; - pPlayer->menu = menuid; - pPlayer->vgui = false; + if (pPlayer->ingame) + { + pPlayer->keys = keys; + pPlayer->menu = menuid; + pPlayer->vgui = false; - if (time == -1) - pPlayer->menuexpire = INFINITE; - else - pPlayer->menuexpire = gpGlobals->time + static_cast<float>(time); + if (time == -1) + pPlayer->menuexpire = INFINITE; + else + pPlayer->menuexpire = gpGlobals->time + static_cast<float>(time); - pPlayer->page = 0; - UTIL_ShowMenu(pPlayer->pEdict, keys, time, sMenu, ilen); + pPlayer->page = 0; + UTIL_ShowMenu(pPlayer->pEdict, keys, time, sMenu, ilen); + } } return 1; diff --git a/amxmodx/emsg.cpp b/amxmodx/emsg.cpp index 2c76801b..9e6da0cf 100755 --- a/amxmodx/emsg.cpp +++ b/amxmodx/emsg.cpp @@ -87,6 +87,7 @@ void Client_TeamInfo(void* mValue) case 1: if (index < 1 || index > gpGlobals->maxClients) break; char* msg = (char*)mValue; + if (!msg) break; g_players[index].team = msg; g_teamsIds.registerTeam(msg, -1); g_players[index].teamId = g_teamsIds.findTeamId(msg); diff --git a/amxmodx/meta_api.cpp b/amxmodx/meta_api.cpp index e0b19859..6a4e10ad 100755 --- a/amxmodx/meta_api.cpp +++ b/amxmodx/meta_api.cpp @@ -1434,8 +1434,15 @@ int C_Cmd_Argc(void) // Only here we may find out who is an owner. void C_SetModel(edict_t *e, const char *m) { - if (e->v.owner && m[7]=='w' && m[8]=='_' && m[9]=='h') - g_grenades.put(e, 1.75, 4, GET_PLAYER_POINTER(e->v.owner)); + if (!m || strcmp(m, "models/w_hegrenade.mdl") != 0) + { + RETURN_META(MRES_IGNORED); + } + + if (e->v.owner) + { + g_grenades.put(e, 1.75f, 4, GET_PLAYER_POINTER(e->v.owner)); + } RETURN_META(MRES_IGNORED); } diff --git a/modules/cstrike/cstrike/CstrikeNatives.cpp b/modules/cstrike/cstrike/CstrikeNatives.cpp index 97cae380..fb973847 100644 --- a/modules/cstrike/cstrike/CstrikeNatives.cpp +++ b/modules/cstrike/cstrike/CstrikeNatives.cpp @@ -882,7 +882,7 @@ static cell AMX_NATIVE_CALL cs_set_user_model(AMX *amx, cell *params) GET_OFFSET("CBasePlayer", m_modelIndexPlayer); - char modelpath[260]; + char modelpath[PLATFORM_MAX_PATH]; ke::SafeSprintf(modelpath, sizeof(modelpath), "models/player/%s/%s.mdl", newModel, newModel); auto modelIndex = 0; diff --git a/modules/cstrike/cstrike/CstrikeUtils.cpp b/modules/cstrike/cstrike/CstrikeUtils.cpp index b0992f62..863b9d62 100644 --- a/modules/cstrike/cstrike/CstrikeUtils.cpp +++ b/modules/cstrike/cstrike/CstrikeUtils.cpp @@ -13,12 +13,13 @@ #include "amxxmodule.h" #include <amtl/am-algorithm.h> +#include <amtl/am-string.h> extern int MessageIdTextMsg; bool UTIL_IsPlayer(edict_t *pPlayer) { - return strcmp(STRING(pPlayer->v.classname), "player") == 0; + return pPlayer && strcmp(STRING(pPlayer->v.classname), "player") == 0; } void UTIL_TextMsg_Generic(edict_t* pPlayer, const char* message) @@ -36,7 +37,7 @@ bool UTIL_CheckForPublic(const char *publicname) int i = 0; char blah[64]; - strncpy(blah, publicname, sizeof(blah) - 1); + ke::SafeStrcpy(blah, sizeof(blah), publicname); while ((amx = MF_GetScriptAmx(i++))) { diff --git a/modules/cstrike/cstrike/CstrikeUtils.h b/modules/cstrike/cstrike/CstrikeUtils.h index c5b9acdc..d0a7a2ec 100644 --- a/modules/cstrike/cstrike/CstrikeUtils.h +++ b/modules/cstrike/cstrike/CstrikeUtils.h @@ -49,6 +49,10 @@ void UTIL_StringToLower(const char *str, char *buffer, size_t maxlength); MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not in-game)", x); \ return 0; \ } \ + else if (!MF_GetPlayerEdict(x)->pvPrivateData) { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (no private data)", x); \ + return 0; \ + } \ } else { \ if (x != 0 && FNullEnt(TypeConversion.id_to_edict(x))) { \ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d", x); \ @@ -62,8 +66,12 @@ void UTIL_StringToLower(const char *str, char *buffer, size_t maxlength); MF_LogError(amx, AMX_ERR_NATIVE, "Player out of range (%d)", x); \ return 0; \ } else { \ - if (!MF_IsPlayerIngame(x) || FNullEnt(MF_GetPlayerEdict(x))) { \ - MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d", x); \ + if (!MF_IsPlayerIngame(x)) { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not in-game)", x); \ + return 0; \ + } \ + else if (!MF_GetPlayerEdict(x)->pvPrivateData) { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (no private data)", x); \ return 0; \ } \ } diff --git a/modules/cstrike/csx/meta_api.cpp b/modules/cstrike/csx/meta_api.cpp index 19f0f495..f438d84f 100644 --- a/modules/cstrike/csx/meta_api.cpp +++ b/modules/cstrike/csx/meta_api.cpp @@ -178,14 +178,18 @@ void PlayerPreThink_Post( edict_t *pEntity ) { RETURN_META(MRES_IGNORED); } -void ServerDeactivate() { +void ServerDeactivate() +{ int i; - for( i = 1;i<=gpGlobals->maxClients; ++i){ - CPlayer *pPlayer = GET_PLAYER_POINTER_I(i); - if (pPlayer->rank) pPlayer->Disconnect(); + + for( i = 1; i <= gpGlobals->maxClients; ++i) + { + GET_PLAYER_POINTER_I(i)->Disconnect(); } - if ( (g_rank.getRankNum() >= (int)csstats_maxsize->value) || ((int)csstats_reset->value == 1 ) ) { - CVAR_SET_FLOAT("csstats_reset",0.0); + + if (static_cast<int>(csstats_maxsize->value) <= 0 || g_rank.getRankNum() >= static_cast<int>(csstats_maxsize->value) || static_cast<int>(csstats_reset->value) != 0) + { + CVAR_SET_FLOAT("csstats_reset", 0.0f); g_rank.clear(); // clear before save to file } g_rank.saveRank( MF_BuildPathname("%s",get_localinfo("csstats")) ); @@ -197,27 +201,26 @@ void ServerDeactivate() { RETURN_META(MRES_IGNORED); } -BOOL ClientConnect_Post( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[ 128 ] ){ +BOOL ClientConnect_Post( edict_t *pEntity, const char *pszName, const char *pszAddress, char szRejectReason[128]) +{ CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity); - if (pPlayer->pEdict == NULL) - { - pPlayer->Init(ENTINDEX(pEntity), pEntity); - } - pPlayer->Connect(pszAddress); RETURN_META_VALUE(MRES_IGNORED, TRUE); } -void ClientDisconnect( edict_t *pEntity ) { - CPlayer *pPlayer = GET_PLAYER_POINTER(pEntity); - if (pPlayer->rank) pPlayer->Disconnect(); +void ClientDisconnect( edict_t *pEntity ) +{ + GET_PLAYER_POINTER(pEntity)->Disconnect(); + RETURN_META(MRES_IGNORED); } -void ClientPutInServer_Post( edict_t *pEntity ) { +void ClientPutInServer_Post( edict_t *pEntity ) +{ GET_PLAYER_POINTER(pEntity)->PutInServer(); + RETURN_META(MRES_IGNORED); } diff --git a/modules/engine/engine.cpp b/modules/engine/engine.cpp index 55506857..f574bfca 100644 --- a/modules/engine/engine.cpp +++ b/modules/engine/engine.cpp @@ -456,6 +456,13 @@ static cell AMX_NATIVE_CALL set_view(AMX *amx, cell *params) { plinfo[iIndex].iViewType = CAMERA_3RDPERSON; pNewCamera = CREATE_NAMED_ENTITY(MAKE_STRING("info_target")); + + if (!pNewCamera) + { + MF_LogError(amx, AMX_ERR_NATIVE, "Could not create camera entity."); + return 0; + } + pNewCamera->v.classname = MAKE_STRING("VexdCam"); SET_MODEL(pNewCamera, "models/rpgrocket.mdl"); @@ -486,6 +493,13 @@ static cell AMX_NATIVE_CALL set_view(AMX *amx, cell *params) { plinfo[iIndex].iViewType = CAMERA_UPLEFT; pNewCamera = CREATE_NAMED_ENTITY(MAKE_STRING("info_target")); + + if (!pNewCamera) + { + MF_LogError(amx, AMX_ERR_NATIVE, "Could not create camera entity."); + return 0; + } + pNewCamera->v.classname = MAKE_STRING("VexdCam"); SET_MODEL(pNewCamera, "models/rpgrocket.mdl"); @@ -516,6 +530,13 @@ static cell AMX_NATIVE_CALL set_view(AMX *amx, cell *params) { plinfo[iIndex].iViewType = CAMERA_TOPDOWN; pNewCamera = CREATE_NAMED_ENTITY(MAKE_STRING("info_target")); + + if (!pNewCamera) + { + MF_LogError(amx, AMX_ERR_NATIVE, "Could not create camera entity."); + return 0; + } + pNewCamera->v.classname = MAKE_STRING("VexdCam"); SET_MODEL(pNewCamera, "models/rpgrocket.mdl"); diff --git a/modules/fakemeta/fakemeta_amxx.h b/modules/fakemeta/fakemeta_amxx.h index 9b7b084b..6fb0518c 100644 --- a/modules/fakemeta/fakemeta_amxx.h +++ b/modules/fakemeta/fakemeta_amxx.h @@ -50,6 +50,16 @@ #define CHECK_ENTITY(x) if (x != 0 && (FNullEnt(TypeConversion.id_to_edict(x)) || x < 0 || x > gpGlobals->maxEntities)) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity"); return 0; } #define CHECK_OFFSET(x) if (x < 0) { MF_LogError(amx, AMX_ERR_NATIVE, "Invalid offset"); return 0; } +#define CHECK_ENTITY_PDATA(x) \ + if (FNullEnt(TypeConversion.id_to_edict(x))) { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d", x); \ + return 0; \ + } \ + else if (!TypeConversion.id_to_edict(x)->pvPrivateData) { \ + MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d (no private data)", x); \ + return 0; \ + } + extern AMX_NATIVE_INFO engfunc_natives[]; extern AMX_NATIVE_INFO dllfunc_natives[]; diff --git a/modules/fakemeta/fm_tr.cpp b/modules/fakemeta/fm_tr.cpp index fa002c9e..6b735f06 100644 --- a/modules/fakemeta/fm_tr.cpp +++ b/modules/fakemeta/fm_tr.cpp @@ -86,7 +86,7 @@ static cell AMX_NATIVE_CALL set_tr(AMX *amx, cell *params) case TR_pHit: { e = TypeConversion.id_to_edict(*ptr); - if (!e || FNullEnt(e)) + if (*ptr != -1 && FNullEnt(e)) return 0; //TODO: return error gfm_tr->pHit = e; return 1; @@ -167,7 +167,7 @@ static cell AMX_NATIVE_CALL get_tr(AMX *amx, cell *params) } case TR_pHit: { - if (gfm_tr->pHit == NULL || FNullEnt(gfm_tr->pHit)) + if (FNullEnt(gfm_tr->pHit)) return -1; return ENTINDEX(gfm_tr->pHit); break; diff --git a/modules/fakemeta/fm_tr2.cpp b/modules/fakemeta/fm_tr2.cpp index e9305191..57db06c9 100644 --- a/modules/fakemeta/fm_tr2.cpp +++ b/modules/fakemeta/fm_tr2.cpp @@ -99,7 +99,7 @@ static cell AMX_NATIVE_CALL set_tr2(AMX *amx, cell *params) case TR_pHit: { edict_t *e = TypeConversion.id_to_edict(*ptr); - if (!e || FNullEnt(e)) + if (*ptr != -1 && FNullEnt(e)) return 0; //TODO: return error tr->pHit = e; return 1; @@ -187,7 +187,7 @@ static cell AMX_NATIVE_CALL get_tr2(AMX *amx, cell *params) } case TR_pHit: { - if (tr->pHit == NULL || FNullEnt(tr->pHit)) + if (FNullEnt(tr->pHit)) return -1; return ENTINDEX(tr->pHit); break; diff --git a/modules/fakemeta/misc.cpp b/modules/fakemeta/misc.cpp index 8c38c4c6..c6022444 100644 --- a/modules/fakemeta/misc.cpp +++ b/modules/fakemeta/misc.cpp @@ -18,7 +18,7 @@ static cell AMX_NATIVE_CALL copy_infokey_buffer(AMX *amx, cell *params) { char *infobuffer = reinterpret_cast<char *>(params[1]); - return MF_SetAmxString(amx, params[2], infobuffer, params[3]); + return MF_SetAmxString(amx, params[2], infobuffer ? infobuffer : "", params[3]); } // lookup_sequence(entid, "sequence name", &Float:framerate = 0.0, &bool:loops = false, &Float:groundspeed = 0.0); diff --git a/modules/fakemeta/pdata.cpp b/modules/fakemeta/pdata.cpp index b69dfbe0..870be62e 100644 --- a/modules/fakemeta/pdata.cpp +++ b/modules/fakemeta/pdata.cpp @@ -32,18 +32,18 @@ //implement these with setjmp later. bool IsBadReadPtr(void *l, size_t size) { - return false; + return l ? false : true; } bool IsBadWritePtr(void *l, size_t size) { - return false; + return l ? false : true; } #endif static cell AMX_NATIVE_CALL set_pdata_int(AMX *amx, cell *params) { int index=params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int iOffset=params[2]; CHECK_OFFSET(iOffset); @@ -65,7 +65,7 @@ static cell AMX_NATIVE_CALL set_pdata_int(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_int(AMX *amx, cell *params) { int index=params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int iOffset=params[2]; CHECK_OFFSET(iOffset); @@ -87,7 +87,7 @@ static cell AMX_NATIVE_CALL get_pdata_int(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_float(AMX *amx, cell *params) { int index=params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int iOffset=params[2]; CHECK_OFFSET(iOffset); @@ -109,7 +109,7 @@ static cell AMX_NATIVE_CALL set_pdata_float(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_float(AMX *amx, cell *params) { int index=params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int iOffset=params[2]; CHECK_OFFSET(iOffset); @@ -130,7 +130,7 @@ static cell AMX_NATIVE_CALL get_pdata_float(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_string(AMX *amx, cell *params) { int index=params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int iOffset=params[2]; CHECK_OFFSET(iOffset); @@ -167,7 +167,7 @@ static cell AMX_NATIVE_CALL get_pdata_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_string(AMX *amx, cell *params) { int index=params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int iOffset=params[2]; CHECK_OFFSET(iOffset); @@ -192,30 +192,35 @@ static cell AMX_NATIVE_CALL set_pdata_string(AMX *amx, cell *params) szData = get_pdata_direct<char*>(pEdict, iOffset); if (IsBadWritePtr(szData, 1)) return 0; - strcpy(szData, data); } else { szData = get_pdata<char*>(pEdict, iOffset); if (IsBadWritePtr(szData, 1)) return 0; - if (params[4] == 1) + + if (len > static_cast<int>(strlen(szData))) { - free(szData); - szData = (char *)malloc(len + 1); - } else if (params[4] == 2) { - delete [] szData; - szData = new char[len + 1]; + if (params[4] == 1) + { + free(szData); + szData = (char *)malloc(len + 1); + } + else if (params[4] == 2) { + delete[] szData; + szData = new char[len + 1]; + } + set_pdata<char*>(pEdict, iOffset, szData); } - strcpy(szData, data); - set_pdata<char*>(pEdict, iOffset, szData); } + strncopy(szData, data, len + 1); + return 1; } static cell AMX_NATIVE_CALL get_pdata_ent(AMX *amx, cell *params) { int index=params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int iOffset=params[2]; CHECK_OFFSET(iOffset); @@ -256,7 +261,7 @@ static cell AMX_NATIVE_CALL get_pdata_ent(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_ent(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -282,7 +287,7 @@ static cell AMX_NATIVE_CALL set_pdata_ent(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_bool(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -303,7 +308,7 @@ static cell AMX_NATIVE_CALL get_pdata_bool(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_bool(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -328,7 +333,7 @@ static cell AMX_NATIVE_CALL set_pdata_bool(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_byte(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -349,7 +354,7 @@ static cell AMX_NATIVE_CALL get_pdata_byte(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_byte(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -374,7 +379,7 @@ static cell AMX_NATIVE_CALL set_pdata_byte(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_short(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -395,7 +400,7 @@ static cell AMX_NATIVE_CALL get_pdata_short(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_short(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -420,7 +425,7 @@ static cell AMX_NATIVE_CALL set_pdata_short(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_vector(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -449,7 +454,7 @@ static cell AMX_NATIVE_CALL get_pdata_vector(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_vector(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -476,7 +481,7 @@ static cell AMX_NATIVE_CALL set_pdata_vector(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_pdata_ehandle(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); @@ -524,7 +529,7 @@ static cell AMX_NATIVE_CALL get_pdata_ehandle(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_pdata_ehandle(AMX *amx, cell *params) { int index = params[1]; - CHECK_ENTITY(index); + CHECK_ENTITY_PDATA(index); int offset = params[2]; CHECK_OFFSET(offset); diff --git a/modules/fakemeta/pdata_entities.cpp b/modules/fakemeta/pdata_entities.cpp index 039e3fca..c2420264 100644 --- a/modules/fakemeta/pdata_entities.cpp +++ b/modules/fakemeta/pdata_entities.cpp @@ -18,7 +18,7 @@ static cell AMX_NATIVE_CALL get_ent_data(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -33,7 +33,7 @@ static cell AMX_NATIVE_CALL get_ent_data(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_ent_data(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -57,7 +57,7 @@ static cell AMX_NATIVE_CALL set_ent_data(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_ent_data_float(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -72,7 +72,7 @@ static cell AMX_NATIVE_CALL get_ent_data_float(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_ent_data_float(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -90,7 +90,7 @@ static cell AMX_NATIVE_CALL set_ent_data_float(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_ent_data_vector(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -107,7 +107,7 @@ static cell AMX_NATIVE_CALL get_ent_data_vector(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_ent_data_vector(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -125,7 +125,7 @@ static cell AMX_NATIVE_CALL set_ent_data_vector(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_ent_data_entity(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -142,7 +142,7 @@ static cell AMX_NATIVE_CALL set_ent_data_entity(AMX *amx, cell *params) int entity = params[1]; int value = params[4]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); if (value != -1) { @@ -165,7 +165,7 @@ static cell AMX_NATIVE_CALL set_ent_data_entity(AMX *amx, cell *params) static cell AMX_NATIVE_CALL get_ent_data_string(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); @@ -190,7 +190,7 @@ static cell AMX_NATIVE_CALL get_ent_data_string(AMX *amx, cell *params) static cell AMX_NATIVE_CALL set_ent_data_string(AMX *amx, cell *params) { int entity = params[1]; - CHECK_ENTITY(entity); + CHECK_ENTITY_PDATA(entity); TypeDescription data; GET_TYPE_DESCRIPTION(2, data, CommonConfig); From 46d1ef68bda5bbd19baec078f3156a7b2132243e Mon Sep 17 00:00:00 2001 From: David Anderson <dvander@alliedmods.net> Date: Sun, 26 Aug 2018 11:28:25 -0700 Subject: [PATCH 35/98] Build assembly files with AMBuild. (#481) * Remove prebuilt nasm-generated object files from the tree, and use AMBuild to compile them. * Add commands in VS project to build the object files * Rename elf to elf32 for consistency --- .gitignore | 2 ++ .travis.yml | 3 +- AMBuildScript | 57 ++++++++++++++++++++++++++++++ amxmodx/AMBuilder | 29 +++++---------- amxmodx/JIT/amxexecn-darwin.o | Bin 12049 -> 0 bytes amxmodx/JIT/amxexecn.o | Bin 13024 -> 0 bytes amxmodx/JIT/amxexecn.obj | Bin 12627 -> 0 bytes amxmodx/JIT/amxjitsn-darwin.o | Bin 24220 -> 0 bytes amxmodx/JIT/amxjitsn.o | Bin 25968 -> 0 bytes amxmodx/JIT/amxjitsn.obj | Bin 26250 -> 0 bytes amxmodx/JIT/helpers-darwin-x86.o | Bin 365 -> 0 bytes amxmodx/JIT/helpers-x86.o | Bin 592 -> 0 bytes amxmodx/JIT/helpers-x86.obj | Bin 381 -> 0 bytes amxmodx/JIT/natives-amd64.o | Bin 2304 -> 0 bytes amxmodx/JIT/natives-darwin-x86.o | Bin 708 -> 0 bytes amxmodx/JIT/natives-x86.o | Bin 1040 -> 0 bytes amxmodx/JIT/natives-x86.obj | Bin 788 -> 0 bytes amxmodx/msvc12/amxmodx_mm.vcxproj | 18 +++++++++- appveyor.yml | 9 +++-- configure.py | 2 ++ support/checkout-deps.sh | 39 +++++++++++++++----- 21 files changed, 127 insertions(+), 32 deletions(-) delete mode 100644 amxmodx/JIT/amxexecn-darwin.o delete mode 100755 amxmodx/JIT/amxexecn.o delete mode 100755 amxmodx/JIT/amxexecn.obj delete mode 100644 amxmodx/JIT/amxjitsn-darwin.o delete mode 100755 amxmodx/JIT/amxjitsn.o delete mode 100755 amxmodx/JIT/amxjitsn.obj delete mode 100644 amxmodx/JIT/helpers-darwin-x86.o delete mode 100644 amxmodx/JIT/helpers-x86.o delete mode 100644 amxmodx/JIT/helpers-x86.obj delete mode 100755 amxmodx/JIT/natives-amd64.o delete mode 100644 amxmodx/JIT/natives-darwin-x86.o delete mode 100755 amxmodx/JIT/natives-x86.o delete mode 100755 amxmodx/JIT/natives-x86.obj diff --git a/.gitignore b/.gitignore index 75af3bbf..8692a2f5 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,5 @@ Thumbs.db # AMXX plugin build related files plugins/compile.dat plugins/compiled/ + +build_deps/ diff --git a/.travis.yml b/.travis.yml index 0237f218..5dfce31c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ addons: - linux-libc-dev - gcc-multilib - g++-multilib + - nasm sources: - llvm-toolchain-precise-3.7 - ubuntu-toolchain-r-test @@ -23,4 +24,4 @@ script: - mkdir build && cd build - PATH="~/.local/bin:$PATH" - CC=clang-3.7 CXX=clang-3.7 python ../configure.py --enable-optimize - - ambuild \ No newline at end of file + - ambuild diff --git a/AMBuildScript b/AMBuildScript index 7c4388bf..12f361ed 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -20,6 +20,7 @@ class AMXXConfig(object): self.utf8rewind = None self.csx_app = None self.stdcxx_path = None + self.nasm_path = None def use_auto_versioning(self): if builder.backend != 'amb2': @@ -105,6 +106,31 @@ class AMXXConfig(object): if not self.mysql_path: raise Exception('Could not find MySQL! Try passing --mysql to configure.py.') + def detectNASM(self): + import subprocess + + nasm_paths = [ + getattr(builder.options, 'nasm_path', 'nasm'), + ] + if builder.target_platform == 'windows': + nasm_paths += [os.path.join( + builder.sourcePath, + 'build_deps', + 'nasm', + 'nasm.exe') + ] + + for nasm_path in nasm_paths: + try: + subprocess.check_output([nasm_path, '-v']) + self.nasm_path = nasm_path + break + except: + pass + + if self.nasm_path is None: + raise Exception('Could not find a suitable path for nasm') + # Returns list of lines of output from the compiler @staticmethod def invokeCompiler(args): @@ -369,11 +395,42 @@ class AMXXConfig(object): binary = context.compiler.Program(name) return self.AddVersioning(binary) + def AddAssembly(self, context, binary, input_file, output_file, includes=[], extra_argv=[]): + if builder.target_platform == 'windows': + obj_type = 'win32' + elif builder.target_platform == 'linux': + obj_type = 'elf32' + elif builder.target_platform == 'mac': + obj_type = 'macho32' + + input_path = os.path.join(context.currentSourcePath, input_file) + output_path = output_file + + argv = [ + self.nasm_path, + '-I{0}{1}'.format(context.currentSourcePath, os.sep), + input_path, + '-f', obj_type, + '-o', output_path, + ] + extra_argv + + extra_includes = [] + for include_file in includes: + extra_includes.append(os.path.join(context.currentSourcePath, include_file)) + + cmd_node, output_nodes = context.AddCommand( + inputs = [input_path] + extra_includes, + argv = argv, + outputs = [output_path]) + + binary.compiler.linkflags += [output_nodes[0]] + AMXX = AMXXConfig() AMXX.detectProductVersion() AMXX.detectMetamod() AMXX.detectHlsdk() AMXX.detectMysql() +AMXX.detectNASM() AMXX.configure() if AMXX.use_auto_versioning(): diff --git a/amxmodx/AMBuilder b/amxmodx/AMBuilder index 92da4709..815271f7 100644 --- a/amxmodx/AMBuilder +++ b/amxmodx/AMBuilder @@ -9,36 +9,25 @@ binary.compiler.defines += [ 'HAVE_STDINT_H', ] +AMXX.AddAssembly(builder, binary, 'helpers-x86.asm', 'helpers-asm.obj') +AMXX.AddAssembly(builder, binary, 'natives-x86.asm', 'natives-asm.obj') +AMXX.AddAssembly(builder, binary, 'amxexecn.asm', 'amxexecn-asm.obj', + includes=['amxdefn.asm']) +AMXX.AddAssembly(builder, binary, 'amxjitsn.asm', 'amxjitsn-asm.obj', + includes=['amxdefn.asm'], + # Opcode sizes must be maximum width for patching to work. + extra_argv=['-O0']) + if builder.target_platform == 'mac': - jit_objects = [ - binary.Dep('JIT/amxexecn-darwin.o'), - binary.Dep('JIT/amxjitsn-darwin.o'), - binary.Dep('JIT/natives-darwin-x86.o'), - binary.Dep('JIT/helpers-darwin-x86.o'), - ] binary.compiler.postlink += [ '-Wl,-read_only_relocs,suppress' ] -elif builder.target_platform == 'linux': - jit_objects = [ - binary.Dep('JIT/amxexecn.o'), - binary.Dep('JIT/amxjitsn.o'), - binary.Dep('JIT/natives-x86.o'), - binary.Dep('JIT/helpers-x86.o'), - ] elif builder.target_platform == 'windows': - jit_objects = [ - binary.Dep('JIT/amxexecn.obj'), - binary.Dep('JIT/amxjitsn.obj'), - binary.Dep('JIT/helpers-x86.obj'), - binary.Dep('JIT/natives-x86.obj'), - ] binary.compiler.linkflags += [ '/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1', '/SECTION:.data,RW', ] -binary.compiler.linkflags += jit_objects binary.compiler.linkflags += [AMXX.zlib.binary, AMXX.hashing.binary, AMXX.utf8rewind.binary] binary.sources = [ diff --git a/amxmodx/JIT/amxexecn-darwin.o b/amxmodx/JIT/amxexecn-darwin.o deleted file mode 100644 index b215a7fb52d9f2093e7218025ab3913119209e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12049 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 NgIH%Gj)Otk`hV_(?g0P* diff --git a/amxmodx/JIT/amxexecn.o b/amxmodx/JIT/amxexecn.o deleted file mode 100755 index a4970395797555b7be365e6e5171525f0d356c57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13024 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 G<Np9P?TFm~ diff --git a/amxmodx/JIT/amxexecn.obj b/amxmodx/JIT/amxexecn.obj deleted file mode 100755 index ba9b1d777cc47509a934da837196dd927556f0dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12627 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 Pf5=HBhvAC%gvI}V*K0_+ diff --git a/amxmodx/JIT/amxjitsn-darwin.o b/amxmodx/JIT/amxjitsn-darwin.o deleted file mode 100644 index 1a6d578d5d57eba6f9dceaf6902dd1be98d20686..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24220 zcmb7s349b))_p}92#A0X1RNNH1SN_rf)0udgrp&XY$Rb*pb1G6qS;J$FeoZf8ExCR zppNUf45+w`_>DT~IAt&bIx3>L0B*>*0O|-LvWVn=&Z|?Mj&}e3K7PKObML$NZT0Ha ztA4lKc=+3+9WBdhhm?SH4AK@P{-fMP664>yCtKDJ&=cv;L|^{%`GWrXpu-)x$UC#B zRVGVLcKqq{>Ojj{#md@SOYztI^Z81PgT=1IGBeVO(pqKuKLh8a0ZzS%BP{DdW+$}T zu<Sla-OskH*P*{{ie)ACw5(}`Gp2_#Qj)?&DSg7TQ~IqKoNQU)%r4>a-9vA+JC0Jj z_WYahX{dh+a78lyY-m3OfB7%;ddq<D88m3vz;SE%>PSmV%Z%_@Gz;e>ou1Qu-^#G@ zoSXVdD9}CiwK2!hIdF2=(>c7Pv!`KgBK<aa@HcFw9t=%7;#kyv(yp>gIK5xOPN=t> zp57&t-Y<Mva_W!aDJiLk7K8(xJG~a{750p2H2^=5y7!W=*PtwGuJ3|5&Ea&<iZ1A{ z-5GzL?*MgZOhYqk+_!Q}e>Sq))#stbEd#^X)=wYRgZAgq{@nQXT^##6T>A>zUl`y1 zqobz$t6lqhX@7To`zIXxTWN2<OuJ5MH^->8-PahqmR{r0i?F97njZEn<Jhj~fXi(k zp=Vclw(arcww{CBmYq$%QTP+7v8`VZr)ADanHpD=)1@rF%cnn^&O3vZ)SKgbFJ11A z@A8D>;*6J5%Ug7LGrr4W$Hfd;*r_D})6wR={CxYEV=&RUtZ}<OoaV#goA);6FSzDD zn$M*<@AhBMshzwH2Aa~_C9u;s)8VH04*xI?ru=rt)8S=0G|?gUto@U52t{V?_q5*= z-+sDdADOi$V=~#v_!Fo6QylxqtSz8@eti2Me`1eA&aADcUF=!A(b%>0%D_Yoc{m}) zVxn4gr`u0PJGGs7cSSi}=jlBbmR4|x{V6><$GiY#Q639Wk9{nrL8M7-OCJ+u>ojS_ zcv#zijPH_YT*6OrK7>5Oc)<d6xj4Sddxy=P;J73imxt-HGQP`S9hb+WYS~Jc58}I2 zN4q2qvyZ{-dA^H=h{M*peq<QaM$c7|CFJ^a&tK1lgFTvFvDc2S#%t~N9toQwe)dAz zWA2$dp=~Xn9AdXo3k$!4h2KtN^dQD<^RzKGg|A^Tr(<0IO`q4|`&@2(&f*wFe2&uR zXZj$;s3*(#G<>hyc`S^qx<U3Z+{}?~w4EcpjYl{w$(gMw_64-XiWH;tuMe7A;ow+i zqu4*iFSf~;hSNM_IeK-2?f;=|>_*?_*p_z>dsECEP<M*`8O=FTzg~j;PAm4L9vsWT zu1m4IqDyg_JlZKcAvE?J7}=v~8T%4-HJ0wW>2|T44(<d1kD6v5A26eVF0!2%j@#qg zK5c9pM~!xxJlN*uAkJ_sbINTFB_#ah_P%AHy^kL5b!j^l3muP5c5f_AacqV;HZR*_ zXv39>Ww$NoSYxx?o=X#Vl-io?{L#$%MMpv%>}B!I)<(=u;1cp2EbV7#9{b)~Zp^1X z&uQDpvUePsMZdlD`-Xl<F{Z-#ZZ#V^XvVKd!Ln(egg?(88`I@f*F|gGP}VbxPDSyZ zzTdB2hn*#BsNF#0*h93=7>7GFF7nu`;+x&)n4JJKHsM1y;RBj?kJ;{OV;=gxVLf}A zdbp)mW-_)%@a&C_+Q;Kh9M7|yil%xR(meES>6HynJDncKsjjvcxt;OAg$SpHhK5Fj z_NAU<*Ty%0_Xmzn`1j}u{tNX@_^H``kml~~-nR6IjCsqTnQZ?V+}EKOA<t=zlRAeo zPV+RFJveVQ`%4xQd&bN&g`kNWSc$chf9w<RJcwNOwv`TVYu~b|ZOsY4sCgbsaxX92 z()x7yavyuUOY_YsrZJ;WqUpi^p`80nIc=Na`9(9nVl!C1yAHHA!)M$(HFdj&UH|_V zGZdFOPBDGlVwU}OF?I2adHZ_~$~l|<H?4Uwelgd(#r!W?(+(3OPN&k{Vy^n_PEC$q z%#pq7)SrI4m|Nl(^Q>FUwZC1=miWa~xy4-l+r^yJE$-Ny>K1duZx^#5elgqkXl!o$ z?P8vcU(8)@F*p5oF+apFrob(xk;T}*#}XQ6@fmC^r-t6%ynU8EF}|G@vD-Pzu8MEB z<vWf8%R4xW8^H%)YTrlu*qeq`#vU6%8ox>7*W(*s<{0lV#)oNqFurlFW4zNCpL#ru z2jNegW(;tQclWR-(}-*3ueSq7{>#1<9N2xnT|=wb%lZ4ps-@TLWK?-4?XY!=QQF^( z-EtYOjbH6DRlDPS`zu;u4UAEo&sc@tOMR!MS3asfu;1?01J<~KVpxxGtk;D$McI34 zAA3iYVC)k%+2!$VKK_=&le)=nq)qH0eBRg`*n*P&9>1hpjn#ln_6PB8s*O#jP4-Xm zZKfET5u5Cj@C#Vv@zwT0c&b{|w`sgRk!G<6z>=ALVSJm9zTp5I*u+i99Wb;199?bO zr{-#7+uq%!y-M?SG>`psYcS>o<xO-r-~Nu4u^T$WSf)1FJ(J?vjC5??VMEhkW{;yS z_F879v~6fdW4pop`~U;9!>XfCAimG$uQ?DK%ufpRvG1pC?AzrLW4m^HpS1`3*c;;8 zUFq2E=(F~4AN#xLy4zmQ8OH9MP3EV;Znrhrzv~s%x3;#Yx3Rsw$(|J7wq-Z_<d(a< z$qvM~-Q33Z&rSCI@ogVzV|z!F{d#=c%i7r9+GHPyZ=2V~_TDCY;0bZZVPG5E`<m>$ z__hajMUTV%P4;E+ZC`I=`<Eupx79GWpP~=8Ju&9n9mZ!Y=ec_c>9(70U(yYG;23W6 zj9Y3`!(n>zy7%l2<Jj+YBaQKR`|S88-HpivR$T%syO^f#3~qaee6f=w(h~WB?pE60 z65sw=$KKo>_VcuJAB}BiXQN~1>1cmKqu5<pXpA!L1pMe9$HZ$)CbKI;VPy}YY3#0? z=u~-=yDZJ6{p|SmyT3AB57XYhhIX;L^0H&sg}+^|_&W=In#Qqb!0pD^dHHSWH80t+ z%)9Syy6uebHn)visp~eNFWgSTpE$Lh+Qx06>$ZSy)9H3%%=xzGOZL2BF(1ZOutT`K zOUP@PA4^&W6`>Gz^d6RRH_M1UXP+=-{ELIv(yKyFo9Ogbe5Xr{lT%Z#8aUbS(%8M8 zZKu#=V~n<h#x%}um*^gZj5KO)aM*lT+h1CkM;mvDX}sqP_TR3@=)`#tZ8R1w$&Hgb z9N03*%!{?FZ{GJ<XpFsuUTiUri~=6#n5JPpn;!0(rdPKPkB2AnEf{|r)|-do61)qq zBYQlnZhOeQDC4&4wItb$cH`{kE@)7v-=XN(JEXCuLE)k1wH&{xgm&70h;QAkt@R0^ z-Mpk#aIh<*z1pq?TR-Qpm`mC&mA~8!weO)dS{-8-_PDWTx$9Z(I$Fk_Dh<Z+pUzYX zqQ~wFuzT_583T9E>S`w&t^NCcC>T5C7)=;#EVfScY{^Y*_=cBYYrmA4c7A-1AOFKH z(qmDy$5rt?UWs^2jP`gYzQ^*2$AV~&FX`bf8f|C#Jmc{pCQEB4di95SZp?0vFy;%9 zXNA7FXY1uw*lXnv|GXePJ+Wa2=jz%W$0WYH^o@2ZZlY(|J9V9wzTw%@{)S}uc&)9K z*485*Vyw=e6B?4Tbx6t_dl~B+z#@P3OXAuc&Y&e?+_vrdbo)K`b<1df4NB@Zsr_|? z3GJ5x*6^m7>zg&FdB*f<h0*7=;p~*;hHp5rTWb2X)buGRoZ3>86wddA7bb@5yM$}H zhi4{*t%RQvjwUQgNpyY%3Vqh{-Y=IZlwj>LTgNx1P7RlL5A97o6v|1S70&X6a{7d} zQc4PWi$c?8&PrXJ*zigU94?qM*Vnv;<FacVI<kguG`s!@Hs<2QEB7|9;Z3mXamk;d z)Np0LbILtSzHDC8o>@0DD=jgwcTAe6wqxUv(dX>1{i1oy)WpE2W2PF-xzKEG4!t+x z<-6*S?euN8Yp#OdfuEZ@eH*;&z|WoD3ARhvo!NZz&E{7%XRQeJHTN>Q{9g=L<EV~} z=k=btcGofc9-7tg8QZ#VC0fm#-i_yV9MQDz;b6zUP5sf77V2S5<Hvo?V_|D8X@Abn zD-)W{$-=JfIR8Y=5P3W9dK+Tsi-ynn4&3lfGE||8lzyS?l<uKmN*8oD^=N2nzffIr z_+n4EZ>X+MXiie&tUjUHDT$$s6c6S{%e2HWP2mzQP3dQ9?6zz%$_=OW2~X`8=8uG} zRhWCVBBcweNJJH$UsRF6D!fT7cQcAiM3HPo!{ym%n$>OD0G6vlo99do=U9yuZze8# zEqL4*@4;YV!?(O%JNC_LS9zr6i#5DMn&}w*uLVL2{}^m(x$5_bB|w^iREBisNr*!L zzKZlP(x*s=kdBAGA5t39N~A+bhmknyEQ`As{2TW$?v?Ez-JuwdRD;wR(~{>5HApLv z9)ON94DW-t#|0gQ<VX55(t4yHkxs!fkc2rl3F%U#Cy}N@*MPJgyesagiAWbA-Ho&n zsU4>8SPa42Nc)lc;>Yy!kV=rQM|v4)KhkM<Bl02r3F%3suaE{{LgXV|iS!844@d)W zTl$e!A$^B*HkPQ%kzPSM7VqB$NOvJ^M>-Wh+EgJui*y7j1(!M-DTwqS(nh48kOt#T zKNo2c()~#5koF-B#M|y9q>GSlL3$QxE7H$MDR?W)M5;i#2kA|uy-2<Awv>f*InqN& zZz3H+8icopsYsV2J&N=mQUbQvXCTc&T88u@(q5z_Y(f8kREBg1(u+u+A{~Pb*_lZ5 zk*-Cuk@h1E!KS1JX&cf*NJo%*;<2BKG#+U>(xphBAbo|@3(vlEq{T>lVs1kE66pxi zP%QiNkd`C8g0v5*1oP*wNSGR)dxW<M7Yj>)m_DA#k~;~1fIs!yfb?G{d6nc_B`=a( zEIC8+Fv&e6|BN=Wygfjcw@vtl@Oj}%AnooK-X#5{l8Ys0OP(Y=UHTIw|BUfsJv)J> zAClh@J|S#Weud;2k|#?ZCG0QkDBOc<#qvJ{vi$cYHw*tJ{iDJMrN2?QSo)x_Li)+V zv!ov`JXQLh!lRf!toM*`50LHoNVq}zmxa$u|B&!z>BGW$=}RQ%OCBTnY+<tW$4c%X z+|PNA`nLnwu6HE=OY)PF@07eua*gDRgwv!SFL{jcH0gUu?kM?t+;`^s0$Kk$$xXr) z(%&dKB&?SHe97sOhf3}(`54Jx<GyG4@ALi#z9jiE$+t?rLUNhp0?A_}pCY-N<il8F zSl)ktEPtcqe@cE>@~x7ukX$CYKyr?7r1Za++*jC9`tPyUnfidHKFQBZUMcy0;q}tj zNv;vjl|D=IxsnG-?kV{w)?C*29gy{Hll;2m=OjNOdAZ~U$rY04NY0dej^q@{{Uvu2 z{($EI>-`qUdOsAdm;PDF4@ka8@(sdEq_34+D$JAqkCIa*_m%9C+=Ay5>;DGG`ah8T zj_@VvACvr$aJlrCORg8rmp(`GxsnG-?jiYSJTF=AP9W>uEcxG({~>%(c!Tn<mRut| zU+7i-d6H9wJ%vZ{yk>p-fvj(b@D1TVl>ax$_Xw8>Ym{Fmxk&g&VXE?zB_Ag|fPI6h z56JqrN?tEqExbqh%OzhaEEg6je~RSM!jpx^Dc>V`FZM31_e0@&AnX5^<i~{f3a?fE z6_PI$7752G|7^(vg`I`_v3Fwm+kmWho#YoKKPp@yyj{2yNWTS=r%L{V<dY@$m)u^s z2m3ereJ%VCkoCSUd`|kOh4)H-t>ik%^CV|V9w~XKu&4A#v4>=RhlJaKrasB*g{!2$ zRq~C(#nP8bE|5G{@-WFKN<LQdkJ!_)-mieH?;Xj{N`63cNODl}9LbrIhe+-%xrgu= z>A%H3n)SQ~WIauiAC`QJ<Vz*{CFe;#SMor~T_x|u9-ZZV1Z4Ri2>&JhD#<H^A?bsX ztA(?rpCoyl<RQY|()SQ{l>SG&H?aQCfUN&@$<IlCT6m}QS4+M^=$AfU@)Y5j()X9# zM|hm{EqG^Py}N;|_cO_xg|_rhNq$gxgY=h5t`N?UK11>_$)^dEq;J7{6ze-I{2a)3 zye0YH!e^wvU-I3;tEI1!TrMn-o*{26f3$F*^j#%)68?ZnS?{O#L;G#QwbDN!`4Qob z(l3@A6kZ_xM9FEw!P57X+*NoKm4SNp2tNd}{`ZA%OaF@SIpKrKzftmH$wA><>9Ztf z2!~4FS8|f@DBg$Jj$J^gJf92ikiJe>CY&XlC>$+3Q+S4OkPxrorhGic4X#%I-Emzd zd8P0HA>+8&o;!uN32zqOAiPd^jc}=OiLhSiUMIfiv)l^dLSd<Jo^ZBsrm#quFU%HZ z3NwV`h35%J3r7iu3x@~?3sZ#2!hXU&!X#mLVHaVd&?B^j4A5sk4+?(}a=uajjc}*% zbK!R3N5U<_cZHjTZwOx%a-QNpPm}OP;TqvH!qvhjg!~=_|9Msl9}wOvyi<6a@Mhr+ z!s~?B2$u?%2<wGGVU4gtxKLOsoF|+uoGC04<_oihnZgX=c;R`%(ZW%};ld%p!NL?_ zvap}9k1$EtUD!pKDD(&|;St<#pq_)mAB1~^-w1aK-TQvK<d1|~gzpMB3EvRDDttxQ zBz#f0M)-_yweShyD&b1u1HyZScM5M4-YmR9c%ASX;ZoreVZAUYtP#!@&J-32^M%>M zOksv_yzo5XXyGW~aN!W)U}1_dS;+q2RyF_bj^Yo9dw`FMCj$R2-UaxAcz57S;z__) z#QOkW6YmGyD4q=5EY9|95oa4e6=%EoEMVK%$9>`)kHg{|qYju{wBfiNE6%ax{G^`a z`#bS@;HQX}f{zei2+oLi+E*a)ULvnSDijB`=0x!lagGl^i=sWYP!{iVa%|_UW#Sw+ zJtr+}kF7hT=NR5A&N1XOmA)LqRpK1Or^Gpidj49;;4ewfF?>~=W4KwIWB8HyaPS@C zqrkrv9}Rv)9MtNB2CxlKStp279wd(Kip4LesAJ!~;@HMnGsHO#e4f#U<G?)%ImaO+ z-U*zaM^Vo)c~l&)E7lruj?a2=j?a7Ie1?B6j-LgrAH?y~g!!!;q8Y=U&R)yHPcqg3 zas2FK4Hd^vP1ZPZj&r^^eu}gB?Gwwv&w>{BcI5a8(z-&Na-%rM;XZNp@hNe(d9AoL z9>2M}d?|hp2k(kO&VbE-#V-RtD!v@NGYY27U%*ckUkiSQ`1|0a#kYfVuS<J=2AC(# z```j`e(twGd^~tiob#7w2K22#x=Ea$@7*i@0Qke={9KRwaN6^Xg7I$ToJTK<x5of& z6zAE-HgWDhz7Xem$6j%MU3WyBd!x>nP%M*kq_;TFMFxrUJ2}2n(1vFu<HRkDAKy8s z=efyDaennyD$cW%8gYK!c9}TOSFRQ3S8U70dFFDTcoX=e;yj0WR-7NDHHq_VW}`Si zKKoFd=QX>;`H>mlwb)Lc*>Le7uLtiW&TG<BoZpR|B>o)u8RGmp>>Tl3;2Gk_qU?Ne zo)PhVkmd7puQG9-8wJGqP1hCTJWIMkoF8u8CC>AuN5uJc)-&QfYkE<fpJFwO^Ze;e zaei#|zBtdMJ`?9hRbPwqoa&%Bzn}78@nD;Ic6Gcszme)M&hxC(#Q7c6+2TCo8Yj-L zowCHw1Wpy_mrYD8e-5xjoS!jOiid!8;{0UkN^u?mUn|aUllZRBa=rlGCC<-~R)}{8 ze_Wg&9X%_~b2wX^-xj?pUID&IoZk^`6TcIDhd93(`bK;M_#ttg>$OK>d-#<Q>n7(} zUq5kv8FZ>R&;N#r^J}29#d#(;L7ble<%si~aF#f~`6(6W*<r0XKkm6w`~~o^IL{W@ zAGU`d^4urR^Tx-c_}|6(<<1M@Jdb1m41LMp66c3HTf})@`9&1pBhK%04vX_Vvpwo# zIs71}n>f!n`-t<)n`CjGdkz-ocQyRoiN3!B=XjCxTr^#rU(!q#=UM4gaegv0L!9TQ zK5>2<vp}3@s#W6r+@((ZJMb&TdFC1t=O-@9#d!{Uw>Upoc~G2ZvyY1NjP_}9eoeAQ zoaeSLiSzT2b>ckBeM6kzd%Ppg^WAOY{D9*#ai00^7Uvfk-;47c_^>!Xu}Hv}a@=?} z+*zF8O!N@vdGU$j{0L%zIM0wz7w1<Eqr`cxJXV~aDR{+s)|@BK?+#{)^ZdD3oF5XD zi}OsnMx37wEE4BA_2uIHOyFv9o?VB<`B}hnah_-2FV67)$HjTZy+)jo{;!Dh-1}{D z2K9d|&a?2{;*8(_QJm-FN5vVk&);}Co;))@PMksdN#Z<5PZnoT{^{a8TOTRT82od^ zdEP!joKg2#;yi<&CeHZ!dEz{mFB4}ReWf_h>Vx8poxfC^=l9FR883g6IM4L|EY1k| zd&POq|5tHF#q&O4e|h%*H*rS7KO@d~fPacJ`hBf9V+39mXSn-DamEd75od_|XX1<{ z*e%X*_V2|RUvNa6aqI1I|FAubIXGUNQR@A~8HX@foRR4x#TlD0Mx0UT6T}&>kS)$g z^J(IYVJH@7RC$Fs;~MJ48AX1zIAa|`;*1)<QJnD)w~I4E{2p<}M63{JG&s*Z*e}LO zJT1=1?|+ChcH$**MtSqhg!YW5cvGAa-J8W3WATwVqqjd7XWRwDyXebE?S0~m#W*6) zsBE6q(1!6DUBnrI-BX+~8z+e~%K9{M#&K{hqc6j#)5ICukuA=M>FMH(_b3);nDj;B zi~*??XH0axIO9SZ#2Nb>5@)Ok&!<=~W1a67XZ*-R;tX$oN}MqzFNiaynd>Qi8E5jk zI0Km97H90qHgN_j?+|A^%GcryOx`EX7?q#I8H0Qb)>D?xxRuW03^G1moUtr@#TiA+ zvpU){zGbjD!-R*4`@zRW@hox1!W4=#BzU$sV`CPIGwL@W&Y<2U;*6oWUYv0>%f%T_ zbGJC-YF3IfzJ_O#Y$xMvUJz%n?mBVC-n=Eg8vH|XhUR`Q&e)vq#2KUWlQ?5+JK#CN z@)@_&L!8mH{lyu}!}C<yFkW_)IOBW9h%?S7EsE!eGY)p9IOBlki!&bRB5}qA)r&K{ z^%`-;3f&^kAlAQ#Gk)kXafYfsC(f9nW^o3jz9r5$qYuRycKW3_V~_TWGrqJPo=@y! zE;yf;<mZEr5NDjyAH^9TI$50YZ_~sNfiDnGL=4?h@gCr}h%?siF7b5m72-MItHl|c zw^n=(I6tRjdl;|xv3NcB*W!%nJ1TxFIM4TK&p5x{;tzrM7iXLwV*+Ti2K+4Xb>QQ~ z84ox`oH2nj#2Fh{BHk4T5#{2H7pxO!+~C#XgTZeUXRP60#Qy-kN}Mr<&xzj!{-!wN z4nG!W{NZkK#vvXQ@0g6=W$=t-Uy{I2Ajdm&GWbd2Dd1;_4+cL=d<ghB@!{Z%+o11w z@EPJ6;0wev!54{VgD(@$2ft0c2>gEWnc%C$XM;a2J`el_@lx<+@rB@Th*yAff57(C zfbS3wf-_Eq`g-s~;!D6ics5hd|F6{`3-1FMlhv4$OUa?X88&zX89l(7Abw)9^Z%N1 z?JKF5J&K6f7f8Pp_H)E<03S&XLzZI|2P%EFbybtIiY#9gFRrZj`Rn~9z6;BP$cUE8 z{K1^!`t<5je_{Ehe#`d@xy-kqqPQ$TzcOEKbzN1dugYIs>kkAi7E@hQ0?&%_K(Mvw zU+8ESuzd5211O#UYp#I5%<`2KS5(X|F1ZLQ|NJ^C%4;m&g4#;Ux6ogVKNXi)zCaN9 zfgm&32+LO&@Ye<-%=~}8eE!<n>RQWJQ(RkIS%L<lgEh6~=w$^M8tM-^<v7$79#|Y; z{k~EfR8*Jv0;cQiibGACBNRTR?1E!eSzK0Lf)<rm_<f7~wSn^LDrZO|!a}#XrTztx zl1<;yFLlr9)<UP-HFfhV%1cl~RdKL<ksqX@e12_lZ8<427ZulnI32GluJi|s=U4bS z{!YuBhNb1q^mz*ke7SkKUdt7{GcglfA+4~`ThJ;N7Nw<6fkz~NLf*98jKYYR<IPD+ zPxltKYO->tXXO?awR)H$vh!v{d@{Xh`O$KET6XpXR1-1CO)JWp-rBy5tm#=9tzu!e z*P9=)MFa8*W<|t_c?CIXt<9hAEhx;&%Z+5`<`qq32O^5B+zju`h?L=-Fl|yq%F2xz zmuVOl^Z$r*2a35q-b1b;Kdm4wr*#}M@^aF$T5F!<&Gi<fWgF{>*=dt}t#uhOJufFe zE!`>2C??D*^5*5Iw>sqJrDuB6r#Lk@CIxvj3Y~#5a)CEHFWoXTw9H@SE3K~bTh81y zx{B)R8tanU@}S?D(b0KPwwh=@WA3<{+`N2Wc3xVBFTWtmx)8aT@4Saxby{|jtL9zh zstcp-18qDCeNjFEb1%AHks4Hf#sr_EDxL2uH`S2%0+pto0`Ek(mRkRUNF7wG2CCgw zQ5|U&Gg@2aWJUQzT9uxMIju@cs;jV+sqapP<Kkqfp0tdN0yz|yme#uVM(vmzwX6$^ z@?7gcusULG)Q+`LM_apnFd30P7!P-3l@;y9VKizpvbay3kqrcEIiMrvTZUCt2S?0b z9P}GwlXIqWMzvLsn$Igx*m?y5QCGmI)%vI_VAPS;x48n!it>qEf$Xe|nY{AlrS;~b zL-b9M!e?3m4M!I`*l=)ZC#5l!+ObZ{&YG0#UZ9HdvZ}}xG8wu=CPU+wonBOs%^FLB zwH3bMmV+ZAni0~R8PS|6&B%ymq%@-<no-i6715j}&Djyn*=CSceZW+IrsW_Da+!lH z$Yl<qbJewemXVV;-K#!VRxk3qT{dc`$40FV&rHvpgu?1e7M9UDe_COtoNMX=3teZU zcASk`&PMIdX_Mj1>I?C(g0op&+(Oe)i_w-uh|gbD>Q*YHn-`ViD|D5C2#I*IbhB2~ zRM$ir3#Hl$W#q=-(}(v3Hyg0v6ACh(oHYWo7cuQAz!Hnr)>fBLEbwyGtM!`&4??aZ zRWXmxHHh3r2z>t0ZiZRU%m%~Uh?A$~u*M7PDr;yl8B4jr^SzwU7hdW&lX-IP`IM?I zHF@5t6#N$(A=i<rBxduGjNA%;AYk&do%{;rPb$C@8u?|lL8s(NPJWs4@sM>22t-PN z%2WuAQ)QuBNFY*5p^6EpoWe|wKwx17+fbOvDgz5mg@uw_F*DnjuFC~;Ux|CcPy#ZX zOXg&_7cH|O%A+>ggBh*|GhC0HX{I%mbxw1zuV8yh%NLo}L3F*Ka-F6*PIYpc<~Y^K ziK3jSa-FaYp=2yUrr>E@rUG@&N;z$UTS?vgh&eVSFn1<=9tR1VRSein!|NRZTNh+t zVP;OQmp5h=HpvjM<KmVL%U%_>mnI(#@Nt@=2|hDV3(*au37{j63R5djBaZ1+?GCt6 zJELdR8a%2|AXTi>SaF6K8#BcUTi4S-)N*Rnx*AlgJTsS^iR4UO&0Nhpch)&`PBTvP z&7Ez|Tytld93%5p)771=?qrS3RZUfQrh2DFW|RNo*2!elPV0?Yt<TDJCu@0CWU5l> zm{QqlX|9a93bf#$G2e_C6?`I7Vb*~RuUl{_-o&)WpwcOrN)-$x9HHRlpalzNzA2ar z7EFaH7)v}2u)Lf6^qhQ(C6zTsoS0>nD!i|lTO-q{Z6T||G6=xL^DQc_sN;^n$j;VF zZvz+l=JT!36jeA24{;184Dkw8%TbF^HdXmtnIWNKFEKj{FC->6XF{G?`U(ruawi!b z*G5fLu8;1h6wb&hO3y^uC3stOo+qgClJa25LY9=CR_HC7;1o3@%`G5sNpVyGP&+*} zY7HzOT-rzQndELHa`U)AS78fnnrS-8+g6=)ZuMC?MQM|0FrmPkHicv&_RK{-XAxO| zO>@wvmBh(#mJ=sKYl@TMEFn&Y77{0;&@3lTh87hkqlovXqYs*U)KM3h_Z>IKyq!nv zj5IWGQF)E8q`J1&U&71n6yapK8-J%LOqxhOW)8cDwFeui47^GN>uRff!D{ok!_(@Q ziq;9lrzLIiRCXS?QdoFN*CRN>Dys2@pPo4-C#_&oR<6&yN*X&pntzdL9@_M*^j8*_ zl<>jl!@`&~aTc#89%nv(alN$&e@6T&1AEFv{!(P%h0e$8%j?1?176`vOYt6Ucv&@G z<7Hu<_2TB<5;r#%Z>vaI=H61S?iaRFcMN-n%J70~R#@hs+VWDrTak0Ww3UY9O(R%d zg}YJZ>ZZzYWoP=ina+)Z{f={YIQL4cXf_?#RACOF+LG$Z8vJY_NxvWHRk5nB(yFM& zs~4YDc-E9JSd2$Ztp>JL#Bi1@yvSEsTw7L-cO~wsT4l4VqUiL~JW=q|kvj`St1J@p qa3(S97KvH0NX%MAqJboJ?nTGbS$j&2Fu&Gce37Ge)(0=1xc?6?XL(Nm diff --git a/amxmodx/JIT/amxjitsn.o b/amxmodx/JIT/amxjitsn.o deleted file mode 100755 index 2a4375ed8d690a249554b03274f6065f4ed58067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25968 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 Mk?Ta_aWlXF147`ucK`qY diff --git a/amxmodx/JIT/amxjitsn.obj b/amxmodx/JIT/amxjitsn.obj deleted file mode 100755 index c96c9a8ea2496c3e2167c46fec1251c639ce20dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26250 zcma)^349bq-u^pez^Kt628fD^8kHy_D7YZF5|WTab5A%0#~cF*<|2~-a=ada)p3m1 zdM+rwf{KE>?yj!rYHu*!qT;~{>aM7`g2;-Z0;1-9o~rI&bwlRQKOZW2`dd#`S65ee zS66jWkkG^W<jkf?y+>Nsy9t*18PXD-*P^BRebPymRSk6={_<xPd;_hLD~428v{Yc5 z@%(wRhh_CS*Roz7rnmnWf5uuvJ0=7tO^juyr^d?D(_+)o2dqd!L@X~kHnw;4?Zl(F zmDrQN6F!Na7{K2Z2-Yh-llccf(KotIiJe13+bfA}U;aEPHi9@-n0j_$@7*h7D$V5? z|Bgm_XS_E0C?-p38$d_kh}gm-0&VM(+Fl97tc<<U+@E!P^VY=r<XF~#gl)i^&dy4X zW(|lf7?|;6?9%j%eKTT_BMyHpWpQ7X$7o{;j852-@$K9lYY|~x9=dFLXDlnQq9^LZ zPQ<TgdI3jAw{<4%UOD<idQ#f5y6|&a?D}~VhxeiRJer5bG56EvyIpgL=IL?F+kaI# zx4Gt<XudIy`8jR=J<ax?Xgb^}YrvHCZe{A~I}lN^z+otEEU<*txndXd{tuHK?IiOY z;uZd6r@I9@5$(Y~0l#Elo<wKs0_l2D`&v;*|D|#K`+reKtE(opKdW*P{R`sw-_U+t zJ39Zz>0cekzf}8G1;up!AJhL4{XGvp=qr_ft$VCViSQnVU)^~xR^De_?{Iq0r}waf z^F7w&o0!0(tfadlj{A$BSt}~%#AE2bjqY3M?xrn1t=v&*i#E;A#WCNg&C(Wk(7Zj4 zdAc@BTTH`cZ1=;j?us!~n{`_pO;a~*@knLr>YL6g3h;cl?M+BoG6<V?qc@GGO?|MR zwV~785a{2wH;}S8g9#pBf+G&D?1w!GW?(P&YjJX3<T2{ftk@5$y)TZxQ2Aqj;wg^? z&gGdo8;!`$z%MykPsva8`cswvGWw^)@$dXeT@9-}`N!yw#_>Pz^{1X||Cv5s*}PkM z?f`cxUwhy>xe45u6?pJJ%z7)6baVArswC^S^hwwtiR@$0`kp~sIWYebZvM>nBAD#a zbRz2m@0&-OY}cZat+P>u^-NF~C&7pNSS2G^Ba+~LCb*9Y5DwhKqbk9*-#M3M+g>YW z$*Hi}Z!v*ec+W|irxL_6Q&memh1Pwv;tp|O-i68<-P^Xehm+}PxYoPN^fV_^H1EWe zC8smfB3ipC@ZP=Zq}TS2<)pK1FFB3wg><uq4tVgquH4aG87M^0lqIUTtLW{fxcBRv z6QUPwfWv;9wr<YJTxE0bdFI%<=<lY&a&-|hacn59s@t>h81K$HKv~;|k5q+K)i8n9 zZmQwiJ*<XkXEY&UzdGiw)9h>Mbq~zbo?p`54fca^3@f$a1-p|5Jm6F{dU9w}hTHAW z8SmDKC%#I>x6k=G+RHu+_p$Cg7mKGK?*t=Yv(Kluo6G4~<t=@Nty1Os*}f@ERL?{; zOoVXYx&HT$tP<E?>E*QM75CA95B*0T?Ej<dckWO_xQDly;`KNw7D@_z&lzHWPiHq3 zQl^}-UhQ)Nb{g)v-Fb#+Pd|9L=RDZ#Y<hbiT-F}S8~yIumw9LzKXvsT1QU~8%VZ1U zBzxlrb+MENuFVWEVOQV5NM=7q`%%tbJg0G)vZDrL8POrpVbR?gqwIgi@iytKPeSSO zFM3?U{!Y6GYFQeqC*N%4?K&OZYb$mR@3<&=G;mh?^~l_cW}g*kQ~lf|JDWLl(;#}d zC3}U}g0+pm?AbKCC)TsOjo(W{ps#C#Z=bmd-W@*0JlqrLxy{|C^4RV)B%MKfc3Kik z{r{IkvC6@}>wtIHLs1dW;DS1^9rsfS5AR4>%+miqGMF7FgN?g+{K#O*Au{+&oDA+z z8I0O+$P(<1lR?nU;7}zPj#k)R9rSTCxb6^#&>AO$cfMmC;1GUyhz$M~Cxctv46Z*! z27BUUQ0!*Vc8Cl{qP=%l2S>XZ+;oTxu8Nbvo8LNhaPuKDcs5Q3H@O+ya)=D}$I0MQ zH-mO&V4s?TBXu8Uo(ncz*-E4DytieFog2s0wTnkX)3zygT^!SgV%j@}y{o10+4s`i z&6D|YWk#os&X?%yjN@$6&d-$d8#;H!aZb_BZOVBZ?&NlV{OWG+=W6Fyee6+mxSbbI zwH&1!WqZDwYEPr3o0|LT8&*nJ-!ZJ-YiU9+<iMx*OUiV+<9Z~{-j*v@*`Cj)+ON}s zOZ&i#7Ai}0W5&B(eTO1?&kyzwwBqa^Xf4&&m!cay=2MS>xtk73x-uthu(RSA5|tri zgI!HSH&yl7e_0QEHX)De<K*!VWjSSoy(*63eq}g(gZ)|@!y;uEw!!|22KS-iIbqYB zQXJPY);_vV_s2TY@!03aG4$7l4ScvyfybUqqq{fHBkI39dCWcCzRvaZE~dAeXUYr8 zTUOga_f&f|ZQY!RrOKAkVXu#4n6C}*vT%F2!yjl=PjUZ<PpLA#qTaI6I#gF>(6LBx z27YyyV4zN*UY?o2E~c@YCco!v9`?E|Y3uf;*)4HQ?`qR$Y3qJUv+wop(sQ~VSEf-L z)Ie6s9Ub-yag2+7#ydOg9dV48`HZ)B*r}<WqxJ0iJfHEd4*Q}w#>0KayF2U|ag1Ab zuv*-M`F)3dOC00VKI5_udu<%!%|7G(9rmYjjA5T~d53)j#th{gdyaaH&v;)4ThSPJ z?a@qt=jef5p(9m-i`Z!0lf*O;rfFmvxA*6{EI#;(6_L?#?N3a`(|RwR-MrO2uAF1- zXX3=StN3x;<LBJtr}Vik(zC~~@^#6GQty5+AB|t#nMZ1~YUlR(G`UYEPemQ8O@YJg z33PN*_HVcIDD&*rIPveO_)A#!<*?ZI(brAcA634tTim<IdYWI4V_vAuF`DgfXzHfy zle8(BBd04)=#T7<!>{hn?m5b--}1Wpj>YL$FL}jGQy3@BzHK~iH%+#irj2Q?jg#gj zUz$8O&C5*l6w{mlbilyDZ7NOMRmoP$VpdzMHaVJOski>F(}xq_==L&)J<Oq-c37-( zc%F6D)wjS&aaI~qWZ+kKDNa-=^gjBQAcZ}IPWP;N+Q;rMSqmsabaeZ)#3Xl^{bPlB zB*`v%%|Y;boqsvlxm+RpW$v<@N5eHLx@%y2Zm&I?+O{M{*FACT?#H5|?X=^ZGGY=U z62P#3+slF2(V5PBORv?j@qE?8@3xndq6_h=_fpd8{MP?O)q5cOF4J_~v`_0y#vsOc zX4g&M!&3W?4N>o#7-xuXvuDS#Zv2m`9oO0~`V~*sLvY(Gy-7Tm@PjIeI$4Ps9B~+8 zzfCKOc3{tDuFf4f?qQBU($>xCFHyF?>(gKEWFu$lJQd3`6>!hg$qL!yk4Jv)t<ZDI zEfu|ad|*>iQrp*o%>&XW+s$#j?|;Dxpm&aV?~mhMCEoGkeLaqMp?GJA_eXl&4uGe; zCCd8|PP<dslW~<jlYel1o~ewptmqd@H!recIabNgt!1%^No}7cuKTP<()-t}Ph=M3 z154gbS%Tpf>zeg}O+D+FQI55_-rD^0N2rUb)1!maHxEvqZeP#+aG+1su9?^Q$5ve_ zNyzHM?VoH}dVflG&uaKma(mYB&$ymf;LloKZkLCqOz)gDaYE2LV;3t(AK3PFa#z!U zuBNoIU};xVYOEv>t4WH@OO7@5j!jODSqb|Seoa`Io}`B<qMvqcJm?mJ?5*wU0$X2N z8msLc{WfD?v~b{*SbiW{m=@j4t<-2vd33_$DH&HKwY`{r+4Rdpoojik-SNg+_V0JR zIC^%{)!%onWlwL%)7<zHImPM+jH(SR+}^pCy~Q2NM`tEQz8{?#NV$%Q+6Rvu^+WU4 z&e5ewk$;aa6?!4)Tb<F3!(O;I<pwt7!*`}Ez6F2x{L)FeSjofRO<BwmBz%?Ed25WL zKDf-I$EoWP2mN2vR{QY7+Q;-SUAMi*?uVwdeVVv?C5lblzkSSM!#Z|9oU)kZI<BK_ zQx{`krgwFylcUZz@zjpmmU0UpcAaYQdi#f%9%B(SV%fI80u=qCZR@VKuLnl!(g#Ef z(tAf+(vxxc8NWtL2Si&3#%2d%$3<JyqSI5`r=&%vr6)zR(*tN8T@#XGv?58YI(>i| z>z<4JVwq{N(g86JVL4g%M%Ky5Itf_^4#+xzS?8oOzxR+;60+jn+ZGjI=zI{fbMoq( zUK%U3+Uwp-T7qd*z9Ws!*{kcIZD-PF-%UxZ|GDdnwY(%c@j_wowWgPKvZ&KVog?Zz zQ6oi-7Zns$A*xXn&#B(W7AUsBUe*_)_CV>_qfp&CwvVWEC>?vDu!}{NO6*Kwb)x=9 zVs8_+LfD^0*`hkd_o}E5C3c&ry%PJ2s1y`kmvj)6K8|xlT`aMag-sXLD6uyPYZtX# zV%G|LUewzXyHyx3bNoX+@0Zx#xQaCEE9y)rUFP2k%Mvv~V(Wy>7S$%P_X@jT)Dsf> zvamNq{YzqZ3)?H|2oy<|ir*IKGM_8#B2lFhTP19^sOu#54q*?9S}n293wuM<KPC1f zQ9C8J7w#syR7Z+B5ef#>_yxj7iz<}Z8N#j<wMb%rFYF;<e-pJ%VqX@uNn&@1+AXm? z@l4UBN`um6K2g-U5}PlqNYoV)J73t<qHdGeCxpEq>?2`2h4sX<K$oCDlrGg!VdI2d zF04t|jlz}*TO;hxqB<q^Q(?P>CF7~3OK=jDF2Qev<qNA4)+%hVu)BmkB<yKnFA4iV z*mhz2h4sc$N0+6qs57B-sd9u}B5In%whEgsicc|}_7P!gMA;JiPhs1H{Uj_I{VAQx zDNwq6XNVdpu_dA=OYC$}jS|ag7M<Ts5_`X}wZdK(wpG}V!UA{z>s*cyHBi(UP`ace zg$0F$h5e7H+eF<hzDI@qL)3esHj8hEuzjME@z$Wr*9S_MC0*Esq6$R?#TOQ~K-A5m z?hxO@!k!cLwy2Hb`%>61qI#oOugljDN|$etu-}R*6*WnGwZg6zb-Sp0#P^u64pHxk z+AO{u!V=Ii(WOcibv%?V-(X?mL`@KNnfU63wTZe*)H3n?QP_*3J`nXU@qHsKfPr>h zmVQvWq#43S3o8<Kg|Ioo7Kmz>*aw6?B<g92eO=hwqCS<_?}hCXbtHzub@@(!(q%qJ z*l&fE2)kTVmBh9RTP!Lnu}g)m5oQb9AnF5&-7f4GQ2}%}ojQfmWj<ZlZ-k8(Hd$D$ zum!?y6t+y*YGKa{TQBV2!gdMkfuUqwmSdoF`A!oyLfD0(3M95d*bGtgB(`1Ha$$cI z)*<X&VIPRvF0qLi^wp(G5_LS3F7q&9S;8g?s}Z(9Si7*5!u}@gO<|u1`%zdDhGO-8 zPlnQ^8YV1H*i>P&g|!L$gRnKiI)!Z%_O-BIg{5IIRPXmhQRhPGQWXd*6;&m%3xu@` zTPo~vVYaYNQ5z+8hp=6udSFmem!L0{F5j8Lej_Yj*d$@K!sZLRTGVY4`-reLqHKwM zN7(1WeiXJ})KM5V)FnMd)LBrv%;$>Al-LQPE|=IUQLPdi6?MDB-Yx1;iCr)1eTm&H zYKO%BDykR826g$46m=q$K8~THMo4U~u**fw7IlNDrJ`0r>3uvaY_qWMg!RF=o8Is7 zq6R_fv=<5s3JVLnR@m=E-6OGo7S<{3Jz<+feI>EKh)Tj}m@d@`q6R@Zr4m*yY=*FF zgxxM|jWAo-CShL*OTeI)-p8>}x&+0dY9)4ou)9RvCu*fAyh8bYy0F#7U+QmHR|H>{ zM-hq;E<+fJ54}_IcRj*#ge?er5RL&KfN&|o!wBCY>_)&)oXQQa?fkiT754lw#NhxJ zAXFiIkC2XoDo0q1a4WXgBJd0QEeOeYQ@s$O2H{SG7ZAQdco&D?1MgnvAygs^z;-sm z?a<F7e20*V_o1-}vk_JxypOk&O1u@cA*@7r5n&rbGWz712(uAZAZ$d~hj1c##pMVw zgr^ZcM@T|Xv<zV(!m|i_5JsZ+hdBi6S%m!vW6<wfgkU3dA&f;o=URjp5E9Xo7=%!W z(2TGQ;bnwf2*=~ueGx(>!VL(k5&nsgh^J>dLJmR=LKNXKgf|erLFkRA*D!?X2sa@- zj_?*j7s60HO(r1BM_7Td9^nUslW>pEMQB2}7vTkj9SEto%jO}>NB9H6vj|@zq~e}- z0m4LtIS4BdHXwY5a0c!jQxR@P*nlvcS298nVHUz7ggX!(L3kD6BwR^nB9tL4LU;m! z1MvxH>8S{3A_NhxMp%vT0fL3LQ-d%N63qhd{^_Cyi5e_wsHowhMv59EYOJViQF)>Y zM3smt7d2VbG*L~WT13qgwNTVGq85v~LDWs6ZWVQhsCz^$6ZL?om7-ROS|jQSQBR6m zE9yB>9im<o^{S}#qBe+nU(_a1AB)-|YOAPiqP`ZjOVszG_KNyhl!beQZU+HTNurWP z^%j*XDoxY?Q3FMB6jbLtNYr3aT+gCohl?61YK*9{qOwKhi7F6PBC1@}WKq*ZT_LJk zRE;Pz4%;NGMbtb|3q@TcYO$yrMBOCnR#A6|x<}M9Q4fe(DQcCdHKLvn^`xk^qMj4g zA?ig@uZmhPYJ;fvMQsxGv8XMgwu;&&>T6NEM13!6uc)6zu@N}!PgIhqWKq3ErHV=u zH9*urQG6QWAMS8wY<sY<p`wP18YyawsIj85MdgVq5LF_IPhkARe$A-)G+|eWsuoov zs!mjss1{N4L@g9`jVM0#@eljGLDWs6ZWVQhsCz^$6ZL?om7-ROS|jQSQA1|b)`hWO z{``u5%FKj{`gyZzTOtiZDkAlod)Eiz)LV%OTmi^-ZGPOffh5Qro+t6=e~kfZNJV9& zv97g+kbR;=3;PO19FHcU%8H0v9*1z%VI({=AgP#uTS-Df)#1w4ndrk9QdQf84Xd{y zGn&=$q#9BauAnE)L+a*|3@{|pawW+?FHt$C8#1G=VkQn_kPrw9-5hJMk8nR@goMJ) z&5g~LRUibyIu)TrNT{i~mbBcEiaJ$)lZ7yT2*NZU8HKGYd?XuN)jm>;tr{P>3|n<R zG6P#YTzxJetl9j9ALr~uYUdwtzUnJx)>i2=WKu0a3Uod_`9!gWuBe+&O-R+E@0`wH z=ICy^o~lM3fcGq;ZIF1*a!p8`Rqt62MOttO-m@H1t;2Jcn_4UDYO5jxk(YB^4HYf5 zbHWjGmbst15X@N)A=R9U=7>4Vp%&E;tf7(*Q}HSo?jvikHPT1^jxGL}8haI62|ltB zTfDZ6XDhbw8sH&6U@PDw0c3*L0FS31i2q!i31ZF#%+^Q{b1q2oK=3-?$!7|PIXm>! zfZ$cY<CzPR>?2D+%=uy}K2y<w_oU*SDZ1?*@>dXa*gb?#M01uArPec}lkV~Gd55mK zhwKDF=iEbn1u<;{Q5NS_(GmA}P6A=~+tfVgS<w;qkc&X@&qMfp@t+IMzxr#n0mNS$ z*D#Z@-h6oXx32LL&d>4(MOXX8o6tezZy?!@hiwFJdLUQ%$on8S`p6cLJAGsq$n!pu zi0t0=k)uIA_L1X35>Y&sQ1AV8{NX#VA;Un1`p6g%z7reIB_Lc7ZO9}LzB3yV2H`qr zLz+Qu6*4PS*H}><s^v0h<5>s~`&^pPQ(YOV<(g;X`5ipp_{i-b>=PLeXP~+0*^oy; z(tYG95H55!o(_<5A9)Lei<^z-BM|lr4B>KIE@(F7M-V<~4M{|k<0585Qb2fK4dFNe z7cUz!2!x{yh71ScqGdxa2H_}#A(w)1sj?vxK{!fbNF@jtC>v4_!ch!Et^(n@WJ4B% zaFoN4+d+8zhAao+D2O4CgK!nHA<trqN2|#!JPI0{L$zFlY&<Vwi=!rnyoD_;IyU4( zY|ZnLZP<FiN503_V?NS_EiN%O`EdT8qc(>02ifN%r-E=)$9RTdi%W?O8HFv5`WTXn zttmcIjxCM~84tI(WLT5pl2Ac@_GC3$qzSHq+Uj|h#pS{#RU@`In&kC_D!D$`c&@@0 zN1F`c7f@UlY{<<Z9E~z$DF_z?8}bOqSRZ*3glm9}rvrqeS%$m`!ezgj@VK(d%L+K! zWjveV;Ywdk>Z)3r>q5h<cZA?ZWql6MJ|Wt3p0!^HJv-sy;$Ck)=UZn8p=S>~T-EFK z47bXK(35~%xt7=K8DU)`gq|be;Tm4A=K||7A@uZxhYNVM2ge@dv2&D96M9aDhl_SK ziKt^AZuP*U$apf~;c8v4XN1N7hQoNyhlk5_4dI&Z%Y5V#5RNYz&qNR|*fpdAgyWBf zaH%)f>}rCen4FcDtHvianH8E>RWlQxkBNuJH4mvcerfXI7tEjg$Soio-!z`3AY8g@ z$ipBU|1{)D5H8s@WF5#TA9)jmBc|Fj3*Es;O{j`%c1@}e;Ngg>COEE=3Bf!M(Wxwp zD|bz*tw_Z&SVO+?5occ!uHH2swp@<d8qy2r+)s`H;YwcPIRS*@yoRtXb0x1PY*FQz zS(kDgSQFkwE2^%vxPn(ac{!OSYMj{hpc{@}H<#;b!t=$iZ<YvQZIl&fsgY$jRa0|g z74D*5Pgzd69(i^>&EXd0#nrl+ARl;&)X22Q(}24uI-}yr$}A{QBiF8{s-g}rJ6wmW z2}?KzB`oxj@gN-Q_NEHeazU=-e945u5;Yd?dS<oO<Jh_2)_BTt3e;G+Ayae8)X2G{ znjgmdAlJ$oPtjC8vM!#6`6wlq!x~RcsUCS3Pnhp$T=8l=MKEz>UOWvnaZ#)B6yyYh z9Jv=yT{sf4xNg<!DODr;9uM;2(p2NgEh{hM$iH}IHn%ieTz%^Cpgf!zFdmkN3rscP zxhO%+bLK!i5f+GRNKHP$f}B#$EO<S$EiMx^`AkJVoOv)F7KkfBJ^AG3lyYXm<3WMA z*i$^gyaM!PF+<^cA~kg=C0BZSJY{-j!+3B?EiUvlo?u>?n)wh<qy{Fg^VEdLUX3zy zX2g)$AY9&Q$RZHVoEXBd*0`|Kkh?%Qvtq~!5H9I7<WC@+c`@WU5H9A_gm-|#2?c6q zMiblt>RWN}T+V4c+4&RI%#C=eYv*8GLOeXKSCKPkcC?3tPbx0wlzb*|U!3`I^J!K4 z;$lwY;l4OCBp$UduIAK)Ie&tjIdf#l4iGNmlzcL?vvE$3amlPuMRhe&a`mQof)mE+ znI}zf?5&mXWQm9S`Vl#EX3Fd<0nZ$+;gozbi?A=wT)FvFG;m*B#3`O)G#@py<$5?m zgg$`RGnppNe7T-^%EYCdl21`F?wOn!b3F}>yk~MXr}5<E>X|d~glEFT)ts7e&qv}Y zIJ4$@Y8&Q+n_IY`Q}RI_hO#*G=6X<vp(=}OIZZx&kq>9)To2n%sETVijpt-|ICE#n z*&tlNX~+d2oY^yE9LRbhXsfub7OR;*?U@zAZM6~ST|7LlLZsr%pw|<MaK)y{c@jLF zIW(jSgo`x|X#nBOq9OA^xK>jWl!v!xHS?&+tdP1rTU@Fs9^RhS%%tm4w`Ys1G{wW) zvzobdJ?i#sae=1CgM2u%X*{#BcdpG84{y(E=F|14+q1=Gna0ENaAs6Is?c1KDIVN< zgF()mx*m0VwzwG6>nT+;s~!&u#C4d)!vb;URXnOdT!QKGpg^3NH69j-t1mU-IbDL9 z=gh4kw}EiMr6J2eIJ0ZWDiAKPG~}-!ocT4x2I105LtX{p%&;NvfpB@HCOGf;MOk|0 zSd&?y+6HuOEH16|dO|_YEPFf{5$B3ZpC_L)&t6Zh#RZj`@Yw%_y>n*T5cYYwq|%V@ zKsa-4$S)vVR;dZfoSlO*b7otUSr}MnnYpCW>j?!p^X>7V%v?$7^W<}8-0P{exR6pj zg~bztYUbSa)HlwFVB`(MbK=P=ED5Tab=Ol>-vkerOp0fGKKgZ>d3QaS(!jHcOC-gU zmswD*X69W_jT%Sil1NQhhkPe^$w&GhL{0(W?7o{%Wn*hYb%YBeO+IJC!<m0Wegnd# zkZ!8TRgvcKY%X~;o^kN-n*mL5E^u5q>gxd^1^Goe>RSSnssyR{Wq~16LHM14A=M!K z>cEgD5UzeSWB~}jN-%^A(0&wxr{3J!mZ};qfi#}m;Nf=+hAac&R}F@&0^v$WL;ecF zuO1Bf2MCuq8p1aleidN|za!_GMomyZMa3ohs|ihJg&G>0a2C}!6!@FSQ)+#RRDQA( zgew_M&U-=l)rI6dt}G|>QhtMBJU#HX!7nllNde&sMng^j;TIc*3<BZGMMH*z@QV&Z zGC{av(U3wAe(_<*R1mIIG-L({zX&m;8H6ho4Os-jL25(zO*|JT8uAB_ppQHS67rE( zLHN~)NwpD#iw_O?6og+k8S*vAUmSwLNBrzNh#ZDDq`kgWX&_0Mm@)aB2hvAK2rqxF z%?;`cEaS<7XRLU*FTTU&`p8ree#2!_T?ta|BXdFcjhFFU4^rnNcY^SnFzuNWu9!Cr z`@2C1_r3}qelzBJs+H${A@uwm9)3S&_Vo(LQ$E7=0I&PVzd-oqnMt)Bgx{bU@&gFJ zNYjLOOqTFye2Zp03Ca44HADFSsPg+YLrwr0;v;8(@cTF883B^%BV$4M4V>{5fh_eA zu0h~8a>mmN!Y}3wxekQi&lz$nNB}d>hAao^<0F3rNppy9b<g`qxB-3B#_BN70OR#t z;!Wl(1hdi@yr@<)HOBK1Jox9NQnLl<z~g1Ylg}404D^xjLDGFB5pT4EeB@Y=!9H>- z$WR{{1~Oa-Cg^z~G>r6-2;PCl_z0h<V||3J0k0uWnVAotmU%)T)cbvbkK|(SxY>G+ zv<#%&M?xTzeS|AHruj$<$Q2IJXNPM%>U`uD5Z=cbuRRa?NDg14@WWXT#wV(gg%AgG zDmf|@YK`Cxh4ZjVssFP$)Kt-2QD22;b&G|Hi-cP+gaxaXoG=dIk<2VY)ueTeRUtL8 zt=fu~>RSboY#`|Lu=c_syb?uf8yl<;J+e_(TiIOETpNa~p`t$AQc;O7Eu6L$is+m& z3nzzi%F6I8!;{_J$eEm9E*qJ_U{0CYR6}t{A@SpiClqA|WwS7+Ff%KQZwhX1`9%}+ zi-PF#yFg`8P&`Qhhwi-F94H%y5kD~$WtQhpH08s)cYe0n#Ct$aiFi?f;<72SIlj28 zFw+!&Voq5wzqm-E@t!)K2OuE7C_87eY-Q(+n~*D8`9+?3nSg4^&MeRL#fC2NI7%|h zG7C*TWEU4^=9@j|<`m_WWfrL9;|nr#(e-urr8cvQ3rjMybjcMMH>EtMxFpLYC@Rj% z%gMS_??GG2iYEni#i(rz`C)hy-_eAcTN_xkkVo?_6q*@s2vs*Wge~3X6sv1QKW1)o zZA)0UL~oqO>wL0+c}v)Jauti7Q9*HLHilO7EobJFUy-<&9bpHv3+&>c*B?>eotP+3 znn=i-DqpA19v9O4;tVQ=h7>K!8Sm!V9G)RL5<B@3ySWid85m*8prbr#qzqZbXxPq9 zsu~+2E$&`)gifL(oc&;|qRdHvQHo~Quduc&?6`yF#jab;8#?u<uy!l#b-Tx)BIFoU zilB4cPLwy5sz+R-x*j7f&8){^m6lQ%x*1k^RZAGB&51eBi5c$4!z)?wK~wQ~$&iXy z*eSH9;uV%c`zqdv@}!Z9=d@vH9QOvn%0t;Oamc#!KsW@4RM|2M@^g#a`md{<*&ruC zML1_bMX-9%PSsS^P*KA~ohRyiQNu-z5Oo2Rp73G{ck0VkBP>l&l*Z;T%Z|6w9H)eM zdWPKsDy++=uygh}o8!3E?2pqz6xMEqy>7QfsR-Qyo#`BPC8G!`brwpiCzL|yv$z|S zt|REeh;k4!sLQ^ovB@ntp;Ht<U9Fs(QBO={p`Lo-k<6Aieq6~=m#D!Vt<-oC7{<Rt zSx){K`VLjOd(aVjA3DN0UJP`5QZ##0Fv3m22sZ_uEiOlI#>Ep1ZuMY{%(~{*O4p0$ z9Uqu1Fb0xCSyUVnbV|;_K)2uu>ryD}6hh&k%E2_(h^Ms%iJj6DJLz&t<!HmR&A}?H z-3mKy3=cU)!nlxIB0_B?betHJahw>9ah-(PNl53c5C=8z795&WQP;}bh1%A)W2c+I zTA6|i8zn`&9)`eJt-)+QYO8Quae-20nMJudRGj5<%E9?9w;;hu`Q=%8sv$+f`e_7n zR%S4#e4Nf<Ql^_OG8gU6y^9h%l}PLyEE~UbM`81KZz)cxvrVbhg%F%lSe}{7(v8PM zuRO%5gIV~Ju(6^g#90H0;Cz7_!Kng?z`i5`J2Md+_IFco#9vaB7YlD`G`LLlW84(Y z92XLw+8PqMvKCieV{>!3if2ogQb)N@ZhaIO^^$mW*trk1YTP`t)fcnjc{t<fy6gU? zZ0R@SP)nn_q%oCvATUh>9Sgoihj5$FQ@QvS)tS^4Ro6Jz3T5S8T9{dun_r~ofGx)I z=5auzn*3#4eYn1&s*2NwAzX#|<EQXcqBk1CYw|$|Uz(s(6vEL3d3yNzg8p=MHM+@4 z&um1W+Ht4}UPr5eLr1FtLPx8CKu0_6on_KPbm~~J8}wY&1Oa2P!&<xwI!SaB^KT77 z@1do(0augH6v}qD)liYU;am#1&FaB2eKnX(H7z_d+)`LEFAKfDAU~Z&7tps|)mYzz zcM9h%Rrl)}TI(&mR@Bb83iDIVsxG~osK=_BD?{}a%`<D!3F1qT+2+|&oBCkYT!{1f z$Z-@(r-CT;9YIm&=72^_OLMs5N{!Vppfyu}u8TNG)rLb2;R?J@wWucA*u<`ET`js~ Lw5S)O1K9ro$FEyf diff --git a/amxmodx/JIT/helpers-darwin-x86.o b/amxmodx/JIT/helpers-darwin-x86.o deleted file mode 100644 index 384475097d776857738e7e7993025b7fbbc87ab6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 365 zcmX^2>+L^w1_lOZAZ7$&CLo>y#2^6T*MM1=gac4$0}z8~kbV#bsRx1h_>$C$5(pc@ z4{?nMLGVE=2OtLNM*%Dd9>^UMK>PuSLBa|^!+n8tXy?=59YC6ae^K)f#v1J%AWQid zsWt!|aPS3t^AFY%@#Y^aB|-;Z@i#wWZ2rYi!VXsRn#u4$bnIazpmIK-9%~?N0cG0) vX+a?7hk5{PB$UmNm|Ia1?_5wCTv||&UsS>nPe?#7Eip3(Lz!M`UJ3&M<vKzi diff --git a/amxmodx/JIT/helpers-x86.o b/amxmodx/JIT/helpers-x86.o deleted file mode 100644 index 1d7e9590dfd2a57fb6712cff0ae3340c9fdf2561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmb<-^>JflWMqH=Mh0dE1doBi0V-hvrZpH?8JJ*7Nuoh!f-oCYmjICC0A+(H0Vtat zNHas(ASwW;P7#R@G6Mtzff(5(4M2$kpco4fvqEW*nUX+^Y~BZ;x>%qX48Y8T@k2YG z2JZlI_!l+*V64&J0aC!fNVNgzu!Aqyn}4vDh&TUWDG@sOiof|0WAiVD5_Yhf*Gz^7 zqGJy;=#`{alrZQOXB3wdl_VwsS(UjE8p4NJgo8$Q4-3P`|H#TfF=GT2u!ajVGI#*l zwn%(XxWIq_P`x6I1EfKGhK$slg4Cj7-3kjcy~N^NhQ!>8ig@RO(%{m9g8ZTqhIm2( SdTEK7IT*_HQu9(kRsjG`{7onT diff --git a/amxmodx/JIT/helpers-x86.obj b/amxmodx/JIT/helpers-x86.obj deleted file mode 100644 index d9268b7f526d8d3a53c2d1682129c26f5fef3af6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeZaWMtTKQre}Pfq{V&h(SQFB(<Uh!UU84K+*<?L26(?fgvCvwDW234v+x<B3niv zRb#OOMDZ_DZD40$IQW9ymKDe?QL<$LQPKxr@i#sKDQNr!Bp6D#z^Y#|0ojHJqGJ#1 zrDf)%f@FZ;-+u;%bjFO-oPyM%V%-W0Grh#(T%b6z(?CWsGlCq43iJ|_it}?y!9Ms8 zG=~{14RQkrfOLVZWMB{hlgJ{fKoKt>2Ad3)wFZ(taFGBYD>1jCBHp>6G`O^&Ait=D UA)b(cURq*i4u&$l)Vvf10JykGb^rhX diff --git a/amxmodx/JIT/natives-amd64.o b/amxmodx/JIT/natives-amd64.o deleted file mode 100755 index ed6413e26146c1eb0d6a46f8dba100a2c12307f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2304 zcmbuAOHUL*5XXy$qKJn0jv5t24Ms*J_y~yz%diY_i3bEtjM<FLCZfAb!i;1wG2(IK zK@XVt0X!PxQ7(Ge10KA1^aFU)gO7^|5$iuwJ=5E}#DkUeRQ0c_yQ?3mc{G|yH#Rho zk_H;2q^Bs+(&oe-3e6#E<w&P|3BAhnb?04(`Qxl~in;dlW%h>ic(o0*+`?8XtS6h` zXHc1P%3qxF52yUcd0(3D--+g|C~N)Gt%~zjO;%~bD3(TUTez*QM}pZQ$Q!=P=&)Rf zR872K*=GmcWPq`rICin_5*x~<y<rcmn(qraJ~nm8e6TyiH6z|dDsP*P({>qQ(+N_e zZ8}N&W8O^%V*3;wjP28OD7Jg(SZtr+nIf^NmwIBmkNVj@$E`YN&`50Uu5CUwoE^lb z6ooew+9TmvM?6j2V6fQa(4NR-dz_BM_7y$}qBOVabu$uyu~XVvO~-S360ut}-ipcz z=qNrc;Al!NiUFqH0?=2D?+_cx!)3D|UhNb8WsPqIP*QY**@c|n;}*R0{g&$&$Sssg zS$nbQju&Txf%Mq~Ot|-QRUm!8I0KN4$AF9$JwPHW$dv-JJU4L3n$P830e;}#77&^E z`oTO|{0V*jVj<FZgwQ|o)KWm&)j4ZUY$0(XTg_>7N9MeoKl?z7kBL>x`g6v}$-tct ztQj|-uj?qxE#wRbACy7DIcO|%H8q^cjtyTMRo7Hc<4T+9`+7ZJ6MIbg76Pr<Nx<h& zH^;R_jawD&Dj@o`@Nt7b7d~llbepJl-KP?tH{wyF+Uw-su>tQDj=HJKAa^j2$tQ%X zTB^pNRwCZycZHkh@NfgJ=KEir;t5oJ)#q9gm{c9zo7jCDjQ=R(e<z`JtpTQbjZ#4$ z<Y~RZ17txA>Ww;QRqx?OGjD!~8N|Hz_6Wyc{7-6MG0`iDa71G}h%?u3VTSe1GyKI2 zqT-`o?OND}Y*B@TdQEyS#Hs43%C$}WhgmBoC{)XGsLuo<Kjf<NQRmmq%*-7_x&-3A I>SE^l7n!Q@y#N3J diff --git a/amxmodx/JIT/natives-darwin-x86.o b/amxmodx/JIT/natives-darwin-x86.o deleted file mode 100644 index 9ad779d29ebf8ac2a2b709718302802ccbd40bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmZ`#!Ab&A6n)izE`|glh=RVLWxF7lauPu?a5Oje7<2@S#>g?Iz?CbRRo_tb4bvt9 zg?6p`ftIam6_K4YzH|b+aNa%VzI*O{yywri?}QLy30MFYffs;5{YWw=>ZpAH%=8oV zGNkkz-<$A>w#=$E(@_lv{fsIWalg=bOhU?r?b*MIGc$%|#55?|OMK)%!S}2JXXw${ zgTe@@Ja`Sv<c$OkX|D}YIjjV|<ij@P{Thz1_gm=xlNOlzAaNvTjiF!JN{_qxxSKo} zuW(3zq(>t{8f!xwLgWFg)7Fu(LsS2w^`Mtg;G%2AcaZNCFC&NKFmv`XkU~G}ImPKs zDUKvI6;C5q6=#3cr*<JlbCAS_;_Mgpsqf3orEBNhmM7$2IaLMw#ED%-a(cPnb?dRq wNKP;J+6|}Ex{AB!l;|mW_IdmTh4zJ0Y&JViyvRn=ZHR2XxNGEP*04<R126N1bpQYW diff --git a/amxmodx/JIT/natives-x86.o b/amxmodx/JIT/natives-x86.o deleted file mode 100755 index b8f58393cb700a956067ffb864952febbaa976fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcmbW0%Syvg5QZnU+6on_Ac`(r>c)T|A}Hc56|th=4Hp`ZHe%7H(4>-z;=+}5<um9j z2z4WZf-YV73houRLj5PrX-}&w2To?bng7h><Z^B#6Pl)xG>w|5MnscAVc7Qr6hZwz z#yxqp1e<pNrqU=L#1VMb$te$ju%eT3o1)?JD|ADOj(f0mVTJsta)~pb*bEoN;(k24 z4@=HONO8a$2Z70c{oq!ag#Uo98=m{HhCTO{ws!emG@{pxC9ZEhBD1kxJd56s0q=Tn z`Tn{AUp$A4M(i@OZPtV(Z+*C<oR5|B(dBX{q;&BV^IMd7<JKdm>P>eo&m}!2TtT{X z;J7(g>>?^;Dn8(xbyQK-@BT&d+*}CLXIT~0e<}R@LUaHDAFN^;og$c!h$nP~cunD# zYRo~1+7*sN&+kPVvkvG863pWbya1N-xxU%J{3hgluHQB=*}_d9Th5?2I-(0FLn7mO z=4`<h^LE-LvmUFoC=M;9=wr2*$lH5L@ef>aMNVzLm_4?Z_V*o2P4Yg&PSx&cCY!RH l^ocsSnwm>4O;07wxv5nHC#;$Of8m?$MM}fJkYo>*_5)fjkX--( diff --git a/amxmodx/JIT/natives-x86.obj b/amxmodx/JIT/natives-x86.obj deleted file mode 100755 index 60855c6ab7206c8235be58de78974fbd33623d17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 788 zcmZvY%}T>S5P&Cb(H?q`q8GjB0~mV{5d>+~ScH^TwDll0t|pOSn}SJ76g<^S>D?F5 zgD)Ud1Q9CqIXv_UJSxVSq)oQeftj88c7AqN7Gm)HJ+nUmfLT-$(bil$aDA(wRZ)9G z7RPfDN~faAY&K+cBv3z5sn<xdka;h+2OTN-K&UIAsrHZ@RXVrHw+#$m=F$9oJ!0JI zCpuE9J$<4?iCwp{n)aNO=Ojzs9Hv6+BjvZ~Qem|>jh04F!2;Tt@5v!U2SnYdY2={% zdH@%K$!w#kS<CMFn#im=a(-!gWL%)NY1K&hg=tP)pt<8BvNNkubNv7Fa8}S^lt-PZ z5+LncfQT#&X+%~g$R-l{vnYo)9Vf>e38puYP$g9b<PN>^7`f+2@WQ7F@`{AS-yO2L z#%wW@p{~KEee_t}b(NiKlkJ&?4a#^JMg?}MahHA=UhX>PId}O_cwn<DzImb1)QY-p gX*{Gl$yB2kZ8ucSGH&?6A<E0et(>gnbB7ZA0Uf=R`~Uy| diff --git a/amxmodx/msvc12/amxmodx_mm.vcxproj b/amxmodx/msvc12/amxmodx_mm.vcxproj index 5ced2abd..e1675884 100644 --- a/amxmodx/msvc12/amxmodx_mm.vcxproj +++ b/amxmodx/msvc12/amxmodx_mm.vcxproj @@ -96,6 +96,14 @@ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <SpecifySectionAttributes>.data,RW</SpecifySectionAttributes> </Link> + <PreBuildEvent> + <Command>cd .. +md -p JIT 2>NUL +%NASM_PATH%nasm.exe -f win32 helpers-x86.asm -o JIT/helpers-x86.obj +%NASM_PATH%nasm.exe -f win32 natives-x86.asm -o JIT/natives-x86.obj +%NASM_PATH%nasm.exe -f win32 amxexecn.asm -o JIT/amxexecn.obj +%NASM_PATH%nasm.exe -O0 -f win32 amxjitsn.asm -o JIT/amxjitsn.obj</Command> + </PreBuildEvent> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='JITRelease|Win32'"> <Midl> @@ -148,6 +156,14 @@ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> <SpecifySectionAttributes>.data,RW</SpecifySectionAttributes> </Link> + <PreBuildEvent> + <Command>cd .. +md -p JIT 2>NUL +%NASM_PATH%nasm.exe -f win32 helpers-x86.asm -o JIT/helpers-x86.obj +%NASM_PATH%nasm.exe -f win32 natives-x86.asm -o JIT/natives-x86.obj +%NASM_PATH%nasm.exe -f win32 amxexecn.asm -o JIT/amxexecn.obj +%NASM_PATH%nasm.exe -O0 -f win32 amxjitsn.asm -o JIT/amxjitsn.obj</Command> + </PreBuildEvent> </ItemDefinitionGroup> <ItemGroup> <ClCompile Include="..\..\public\memtools\CDetour\asm\asm.c" /> @@ -474,4 +490,4 @@ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 6fa4a461..71556206 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,6 +3,11 @@ clone_folder: c:\projects\amxmodx install: - git submodule update --init --recursive - 'c:' +- mkdir c:\nasm +- set PATH=c:\nasm\nasm-2.13.03;%PATH% +- curl -o "c:\nasm\nasm.zip" http://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win32/nasm-2.13.03-win32.zip +- chdir c:\nasm +- 7z x nasm.zip - chdir c:\projects - git clone https://github.com/alliedmodders/ambuild - git clone https://github.com/alliedmodders/metamod-hl1 @@ -22,5 +27,5 @@ build_script: - '"%VS120COMNTOOLS%\vsvars32.bat"' - mkdir build - cd build -- c:\python27\python ../configure.py --enable-optimize -- c:\python27\scripts\ambuild \ No newline at end of file +- c:\python27\python ../configure.py --enable-optimize --nasm="C:\nasm\nasm-2.13.03\nasm.exe" +- c:\python27\scripts\ambuild diff --git a/configure.py b/configure.py index 6c8ab69d..567b09fd 100644 --- a/configure.py +++ b/configure.py @@ -30,4 +30,6 @@ run.options.add_option('--mysql', type='string', dest='mysql_path', default='', help='Path to MySQL') run.options.add_option('--disable-auto-versioning', action='store_true', dest='disable_auto_versioning', default=False, help='Disable the auto versioning script') +run.options.add_option('--nasm', type='string', dest='nasm_path', + default='nasm', help='Path to NASM') run.Configure() diff --git a/support/checkout-deps.sh b/support/checkout-deps.sh index 0153595f..df15be39 100755 --- a/support/checkout-deps.sh +++ b/support/checkout-deps.sh @@ -5,6 +5,22 @@ if [ ! -d "amxmodx" ]; then git clone --recursive https://github.com/alliedmodders/amxmodx.git fi +if [ ! -d "amxmodx/build_deps" ]; then + mkdir amxmodx/build_deps +fi + +download_archive () +{ + if [ `command -v wget` ]; then + wget "$url" -O "$dest" + elif [ `command -v curl` ]; then + curl -o $dest $url + else + echo "Failed to locate wget or curl. Please install one of these programs." + exit 1 + fi +} + if [ "$1" != "--no-mysql" ]; then ismac=0 iswin=0 @@ -34,14 +50,9 @@ if [ "$1" != "--no-mysql" ]; then fi if [ ! -d "mysql-5.5" ]; then - if [ `command -v wget` ]; then - wget $mysqlurl -O mysql.$archive_ext - elif [ `command -v curl` ]; then - curl -o mysql.$archive_ext $mysqlurl - else - echo "Failed to locate wget or curl. Install one of these programs to download MySQL." - exit 1 - fi + url=$mysqlurl + dest=mysql.$archive_ext + download_archive $decomp mysql.$archive_ext mv $mysqlver mysql-5.5 rm mysql.$archive_ext @@ -95,3 +106,15 @@ if [ $? -eq 1 ]; then python setup.py install --user fi fi + +if [ $iswin -eq 1 ]; then + if [ ! -d "amxmodx/build_deps/nasm-2.13.03" ]; then + url=http://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win32/nasm-2.13.03-win32.zip + dest=amxmodx/build_deps/nasm-2.13.03-win32.zip + download_archive + cd amxmodx/build_deps + unzip nasm-2.13.03-win32.zip + rm nasm-2.13.03-win32.zip + mv nasm-2.13.03 nasm + fi +fi From 1ddf199e7179b540d8eb5d13605c87cf3edf2387 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 27 Aug 2018 14:36:38 +0200 Subject: [PATCH 36/98] Fix AppVeyor (#528) --- appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 71556206..ab621320 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,14 +5,14 @@ install: - 'c:' - mkdir c:\nasm - set PATH=c:\nasm\nasm-2.13.03;%PATH% -- curl -o "c:\nasm\nasm.zip" http://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win32/nasm-2.13.03-win32.zip +- curl -L -o "c:\nasm\nasm.zip" https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win32/nasm-2.13.03-win32.zip - chdir c:\nasm - 7z x nasm.zip - chdir c:\projects - git clone https://github.com/alliedmodders/ambuild - git clone https://github.com/alliedmodders/metamod-hl1 - git clone https://github.com/alliedmodders/hlsdk -- ps: Start-FileDownload 'http://cdn.mysql.com/archives/mysql-5.5/mysql-5.5.54-win32.zip' +- ps: Start-FileDownload 'https://cdn.mysql.com/archives/mysql-5.5/mysql-5.5.54-win32.zip' - 7z x mysql-5.5.54-win32.zip -o"mysql" - cd mysql - ren mysql-5.5.54-win32 mysql-5.5 From c820db4dc7fc32e8b0cd8e52673b40b92951ecbf Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 27 Aug 2018 15:06:59 +0200 Subject: [PATCH 37/98] Add GeoIP data update to the automatic build system (#524) * Add GeoIP data update to the automatic build system * Apply few fixes --- support/buildbot/package.pl | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/support/buildbot/package.pl b/support/buildbot/package.pl index 753404ec..ad8f7a1c 100755 --- a/support/buildbot/package.pl +++ b/support/buildbot/package.pl @@ -4,7 +4,10 @@ use strict; use Cwd; use File::Basename; +use File::stat; use Net::FTP; +use IO::Uncompress::Gunzip qw(gunzip $GunzipError); +use Time::localtime; my ($ftp_file, $ftp_host, $ftp_user, $ftp_pass, $ftp_path); @@ -34,6 +37,47 @@ $version .= '-git' . Build::GitRevNum('.'); #Switch to the output folder. chdir(Build::PathFormat('../../../OUTPUT')); +my $needNewGeoIP = 1; +if (-e '../GeoLite2-Country.tar.gz') +{ + my $stats = stat('../GeoLite2-Country.tar.gz'); + if ($stats->size != 0) + { + my $fileModifiedTime = $stats->mtime; + my $fileModifiedMonth = localtime($fileModifiedTime)->mon; + my $currentMonth = localtime->mon; + my $thirtyOneDays = 60 * 60 * 24 * 31; + + # GeoIP file only updates once per month + if ($currentMonth == $fileModifiedMonth || (time() - $fileModifiedTime) < $thirtyOneDays) + { + $needNewGeoIP = 0; + } + } +} + +if ($needNewGeoIP) +{ + print "Downloading GeoLite2-Country.mmdb...\n"; + system('wget -q -O ../GeoLite2-Country.tar.gz https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz'); +} +else +{ + print "Reusing existing GeoLite2-Country.mmdb\n"; +} + +my $geoIPfile = 'packages/base/addons/amxmodx/data/GeoLite2-Country.mmdb'; +if (-e $geoIPfile) { + unlink($geoIPfile); +} + +open(my $fh, ">", $geoIPfile) + or die "cannot open $geoIPfile for writing: $!"; +binmode($fh); +gunzip '../GeoLite2-Country.tar.gz' => $fh + or die "gunzip failed: $GunzipError\n"; +close($fh); + my (@packages,@mac_exclude); @packages = ('base', 'cstrike', 'dod', 'esf', 'ns', 'tfc', 'ts'); @mac_exclude = ('esf', 'ns', 'ts'); From 9e2c76abdc42364a1622b472cc09e1ede50784aa Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 27 Aug 2018 15:42:35 +0200 Subject: [PATCH 38/98] Update libmaxminddb to v1.3.2 (#526) * Update libmaxminddb to v1.3.2 * Move PACKAGE_VERSION declaration --- modules/geoip/AMBuilder | 1 + modules/geoip/msvc12/geoip.vcxproj | 4 +- modules/geoip/msvc12/geoip.vcxproj.filters | 6 + third_party/libmaxminddb/data-pool.c | 180 +++++ third_party/libmaxminddb/data-pool.h | 52 ++ third_party/libmaxminddb/maxminddb.c | 757 +++++++++++++++------ third_party/libmaxminddb/maxminddb.h | 28 +- 7 files changed, 809 insertions(+), 219 deletions(-) create mode 100644 third_party/libmaxminddb/data-pool.c create mode 100644 third_party/libmaxminddb/data-pool.h diff --git a/modules/geoip/AMBuilder b/modules/geoip/AMBuilder index 78bb0580..2e79c52e 100644 --- a/modules/geoip/AMBuilder +++ b/modules/geoip/AMBuilder @@ -13,6 +13,7 @@ binary.compiler.defines += [ binary.sources = [ '../../public/sdk/amxxmodule.cpp', + '../../third_party/libmaxminddb/data-pool.c', '../../third_party/libmaxminddb/maxminddb.c', 'geoip_main.cpp', 'geoip_natives.cpp', diff --git a/modules/geoip/msvc12/geoip.vcxproj b/modules/geoip/msvc12/geoip.vcxproj index 464f19ba..e23c0fb0 100644 --- a/modules/geoip/msvc12/geoip.vcxproj +++ b/modules/geoip/msvc12/geoip.vcxproj @@ -102,6 +102,7 @@ </Link> </ItemDefinitionGroup> <ItemGroup> + <ClCompile Include="..\..\..\third_party\libmaxminddb\data-pool.c" /> <ClCompile Include="..\..\..\third_party\libmaxminddb\maxminddb.c" /> <ClCompile Include="..\geoip_main.cpp" /> <ClCompile Include="..\geoip_natives.cpp" /> @@ -109,6 +110,7 @@ <ClCompile Include="..\..\..\public\sdk\amxxmodule.cpp" /> </ItemGroup> <ItemGroup> + <ClInclude Include="..\..\..\third_party\libmaxminddb\data-pool.h" /> <ClInclude Include="..\..\..\third_party\libmaxminddb\maxminddb-compat-util.h" /> <ClInclude Include="..\..\..\third_party\libmaxminddb\maxminddb.h" /> <ClInclude Include="..\..\..\third_party\libmaxminddb\maxminddb_config.h" /> @@ -124,4 +126,4 @@ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/geoip/msvc12/geoip.vcxproj.filters b/modules/geoip/msvc12/geoip.vcxproj.filters index ee2e53ea..6836a135 100644 --- a/modules/geoip/msvc12/geoip.vcxproj.filters +++ b/modules/geoip/msvc12/geoip.vcxproj.filters @@ -38,6 +38,9 @@ <ClCompile Include="..\..\..\third_party\libmaxminddb\maxminddb.c"> <Filter>GeoIP2</Filter> </ClCompile> + <ClCompile Include="..\..\..\third_party\libmaxminddb\data-pool.c"> + <Filter>GeoIP2</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ClInclude Include="..\geoip_util.h"> @@ -64,6 +67,9 @@ <ClInclude Include="..\..\..\third_party\libmaxminddb\maxminddb-compat-util.h"> <Filter>GeoIP2</Filter> </ClInclude> + <ClInclude Include="..\..\..\third_party\libmaxminddb\data-pool.h"> + <Filter>GeoIP2</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="..\..\..\plugins\include\geoip.inc"> diff --git a/third_party/libmaxminddb/data-pool.c b/third_party/libmaxminddb/data-pool.c new file mode 100644 index 00000000..48521b64 --- /dev/null +++ b/third_party/libmaxminddb/data-pool.c @@ -0,0 +1,180 @@ +#include "data-pool.h" +#include "maxminddb.h" + +#include <stdbool.h> +#include <stddef.h> +#include <stdlib.h> + +static bool can_multiply(size_t const, size_t const, size_t const); + +// Allocate an MMDB_data_pool_s. It initially has space for size +// MMDB_entry_data_list_s structs. +MMDB_data_pool_s *data_pool_new(size_t const size) +{ + MMDB_data_pool_s *const pool = calloc(1, sizeof(MMDB_data_pool_s)); + if (!pool) { + return NULL; + } + + if (size == 0 || + !can_multiply(SIZE_MAX, size, sizeof(MMDB_entry_data_list_s))) { + data_pool_destroy(pool); + return NULL; + } + pool->size = size; + pool->blocks[0] = calloc(pool->size, sizeof(MMDB_entry_data_list_s)); + if (!pool->blocks[0]) { + data_pool_destroy(pool); + return NULL; + } + pool->blocks[0]->pool = pool; + + pool->sizes[0] = size; + + pool->block = pool->blocks[0]; + + return pool; +} + +// Determine if we can multiply m*n. We can do this if the result will be below +// the given max. max will typically be SIZE_MAX. +// +// We want to know if we'll wrap around. +static bool can_multiply(size_t const max, size_t const m, size_t const n) +{ + if (m == 0) { + return false; + } + + return n <= max / m; +} + +// Clean up the data pool. +void data_pool_destroy(MMDB_data_pool_s *const pool) +{ + if (!pool) { + return; + } + + for (size_t i = 0; i <= pool->index; i++) { + free(pool->blocks[i]); + } + + free(pool); +} + +// Claim a new struct from the pool. Doing this may cause the pool's size to +// grow. +MMDB_entry_data_list_s *data_pool_alloc(MMDB_data_pool_s *const pool) +{ + if (!pool) { + return NULL; + } + + if (pool->used < pool->size) { + MMDB_entry_data_list_s *const element = pool->block + pool->used; + pool->used++; + return element; + } + + // Take it from a new block of memory. + + size_t const new_index = pool->index + 1; + if (new_index == DATA_POOL_NUM_BLOCKS) { + // See the comment about not growing this on DATA_POOL_NUM_BLOCKS. + return NULL; + } + + if (!can_multiply(SIZE_MAX, pool->size, 2)) { + return NULL; + } + size_t const new_size = pool->size * 2; + + if (!can_multiply(SIZE_MAX, new_size, sizeof(MMDB_entry_data_list_s))) { + return NULL; + } + pool->blocks[new_index] = calloc(new_size, sizeof(MMDB_entry_data_list_s)); + if (!pool->blocks[new_index]) { + return NULL; + } + + // We don't need to set this, but it's useful for introspection in tests. + pool->blocks[new_index]->pool = pool; + + pool->index = new_index; + pool->block = pool->blocks[pool->index]; + + pool->size = new_size; + pool->sizes[pool->index] = pool->size; + + MMDB_entry_data_list_s *const element = pool->block; + pool->used = 1; + return element; +} + +// Turn the structs in the array-like pool into a linked list. +// +// Before calling this function, the list isn't linked up. +MMDB_entry_data_list_s *data_pool_to_list(MMDB_data_pool_s *const pool) +{ + if (!pool) { + return NULL; + } + + if (pool->index == 0 && pool->used == 0) { + return NULL; + } + + for (size_t i = 0; i <= pool->index; i++) { + MMDB_entry_data_list_s *const block = pool->blocks[i]; + + size_t size = pool->sizes[i]; + if (i == pool->index) { + size = pool->used; + } + + for (size_t j = 0; j < size - 1; j++) { + MMDB_entry_data_list_s *const cur = block + j; + cur->next = block + j + 1; + } + + if (i < pool->index) { + MMDB_entry_data_list_s *const last = block + size - 1; + last->next = pool->blocks[i + 1]; + } + } + + return pool->blocks[0]; +} + +#ifdef TEST_DATA_POOL + +#include <libtap/tap.h> +#include <maxminddb_test_helper.h> + +static void test_can_multiply(void); + +int main(void) +{ + plan(NO_PLAN); + test_can_multiply(); + done_testing(); +} + +static void test_can_multiply(void) +{ + { + ok(can_multiply(SIZE_MAX, 1, SIZE_MAX), "1*SIZE_MAX is ok"); + } + + { + ok(!can_multiply(SIZE_MAX, 2, SIZE_MAX), "2*SIZE_MAX is not ok"); + } + + { + ok(can_multiply(SIZE_MAX, 10240, sizeof(MMDB_entry_data_list_s)), + "1024 entry_data_list_s's are okay"); + } +} + +#endif diff --git a/third_party/libmaxminddb/data-pool.h b/third_party/libmaxminddb/data-pool.h new file mode 100644 index 00000000..25d09923 --- /dev/null +++ b/third_party/libmaxminddb/data-pool.h @@ -0,0 +1,52 @@ +#ifndef DATA_POOL_H +#define DATA_POOL_H + +#include "maxminddb.h" + +#include <stdbool.h> +#include <stddef.h> + +// This should be large enough that we never need to grow the array of pointers +// to blocks. 32 is enough. Even starting out of with size 1 (1 struct), the +// 32nd element alone will provide 2**32 structs as we exponentially increase +// the number in each block. Being confident that we do not have to grow the +// array lets us avoid writing code to do that. That code would be risky as it +// would rarely be hit and likely not be well tested. +#define DATA_POOL_NUM_BLOCKS 32 + +// A pool of memory for MMDB_entry_data_list_s structs. This is so we can +// allocate multiple up front rather than one at a time for performance +// reasons. +// +// The order you add elements to it (by calling data_pool_alloc()) ends up as +// the order of the list. +// +// The memory only grows. There is no support for releasing an element you take +// back to the pool. +typedef struct MMDB_data_pool_s { + // Index of the current block we're allocating out of. + size_t index; + + // The size of the current block, counting by structs. + size_t size; + + // How many used in the current block, counting by structs. + size_t used; + + // The current block we're allocating out of. + MMDB_entry_data_list_s *block; + + // The size of each block. + size_t sizes[DATA_POOL_NUM_BLOCKS]; + + // An array of pointers to blocks of memory holding space for list + // elements. + MMDB_entry_data_list_s *blocks[DATA_POOL_NUM_BLOCKS]; +} MMDB_data_pool_s; + +MMDB_data_pool_s *data_pool_new(size_t const); +void data_pool_destroy(MMDB_data_pool_s *const); +MMDB_entry_data_list_s *data_pool_alloc(MMDB_data_pool_s *const); +MMDB_entry_data_list_s *data_pool_to_list(MMDB_data_pool_s *const); + +#endif diff --git a/third_party/libmaxminddb/maxminddb.c b/third_party/libmaxminddb/maxminddb.c index c08b35ba..7580e1ea 100644 --- a/third_party/libmaxminddb/maxminddb.c +++ b/third_party/libmaxminddb/maxminddb.c @@ -1,12 +1,14 @@ #if HAVE_CONFIG_H #include <config.h> #endif +#include "data-pool.h" #include "maxminddb.h" #include "maxminddb-compat-util.h" #include <assert.h> #include <errno.h> #include <fcntl.h> #include <inttypes.h> +#include <stdint.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> @@ -21,6 +23,7 @@ #endif #define MMDB_DATA_SECTION_SEPARATOR (16) +#define MAXIMUM_DATA_STRUCTURE_DEPTH (512) #ifdef MMDB_DEBUG #define LOCAL @@ -105,6 +108,18 @@ DEBUG_FUNC char *type_num_to_name(uint8_t num) } #endif +/* None of the values we check on the lhs are bigger than uint32_t, so on + * platforms where SIZE_MAX is a 64-bit integer, this would be a no-op, and it + * makes the compiler complain if we do the check anyway. */ +#if SIZE_MAX == UINT32_MAX +#define MAYBE_CHECK_SIZE_OVERFLOW(lhs, rhs, error) \ + if ((lhs) > (rhs)) { \ + return error; \ + } +#else +#define MAYBE_CHECK_SIZE_OVERFLOW(...) +#endif + typedef struct record_info_s { uint16_t record_length; uint32_t (*left_record_getter)(const uint8_t *); @@ -116,6 +131,9 @@ typedef struct record_info_s { /* This is 128kb */ #define METADATA_BLOCK_MAX_SIZE 131072 +// 64 leads us to allocating 4 KiB on a 64bit system. +#define MMDB_POOL_INIT_SIZE 64 + /* *INDENT-OFF* */ /* --prototypes automatically generated by dev-bin/regen-prototypes.pl - don't remove this comment */ LOCAL int map_file(MMDB_s *const mmdb); @@ -123,10 +141,14 @@ LOCAL const uint8_t *find_metadata(const uint8_t *file_content, ssize_t file_size, uint32_t *metadata_size); LOCAL int read_metadata(MMDB_s *mmdb); LOCAL MMDB_s make_fake_metadata_db(MMDB_s *mmdb); -LOCAL uint16_t value_for_key_as_uint16(MMDB_entry_s *start, char *key); -LOCAL uint32_t value_for_key_as_uint32(MMDB_entry_s *start, char *key); -LOCAL uint64_t value_for_key_as_uint64(MMDB_entry_s *start, char *key); -LOCAL char *value_for_key_as_string(MMDB_entry_s *start, char *key); +LOCAL int value_for_key_as_uint16(MMDB_entry_s *start, char *key, + uint16_t *value); +LOCAL int value_for_key_as_uint32(MMDB_entry_s *start, char *key, + uint32_t *value); +LOCAL int value_for_key_as_uint64(MMDB_entry_s *start, char *key, + uint64_t *value); +LOCAL int value_for_key_as_string(MMDB_entry_s *start, char *key, + char const **value); LOCAL int populate_languages_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, MMDB_entry_s *metadata_start); LOCAL int populate_description_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, @@ -136,11 +158,15 @@ LOCAL int find_address_in_search_tree(MMDB_s *mmdb, uint8_t *address, sa_family_t address_family, MMDB_lookup_result_s *result); LOCAL record_info_s record_info_for_database(MMDB_s *mmdb); -LOCAL MMDB_ipv4_start_node_s find_ipv4_start_node(MMDB_s *mmdb); -LOCAL int populate_result(MMDB_s *mmdb, uint32_t node_count, uint32_t value, - uint16_t netmask, MMDB_lookup_result_s *result); +LOCAL int find_ipv4_start_node(MMDB_s *mmdb); +LOCAL uint8_t maybe_populate_result(MMDB_s *mmdb, uint32_t record, + uint16_t netmask, + MMDB_lookup_result_s *result); +LOCAL uint8_t record_type(MMDB_s *const mmdb, uint64_t record); LOCAL uint32_t get_left_28_bit_record(const uint8_t *record); LOCAL uint32_t get_right_28_bit_record(const uint8_t *record); +LOCAL uint32_t data_section_offset_for_record(MMDB_s *const mmdb, + uint64_t record); LOCAL int path_length(va_list va_path); LOCAL int lookup_path_in_array(const char *path_elem, MMDB_s *mmdb, MMDB_entry_data_s *entry_data); @@ -154,8 +180,11 @@ LOCAL int decode_one(MMDB_s *mmdb, uint32_t offset, LOCAL int get_ext_type(int raw_ext_type); LOCAL uint32_t get_ptr_from(uint8_t ctrl, uint8_t const *const ptr, int ptr_size); -LOCAL int get_entry_data_list(MMDB_s *mmdb, uint32_t offset, - MMDB_entry_data_list_s *const entry_data_list); +LOCAL int get_entry_data_list(MMDB_s *mmdb, + uint32_t offset, + MMDB_entry_data_list_s *const entry_data_list, + MMDB_data_pool_s *const pool, + int depth); LOCAL float get_ieee754_float(const uint8_t *restrict p); LOCAL double get_ieee754_double(const uint8_t *restrict p); LOCAL uint32_t get_uint32(const uint8_t *p); @@ -163,7 +192,6 @@ LOCAL uint32_t get_uint24(const uint8_t *p); LOCAL uint32_t get_uint16(const uint8_t *p); LOCAL uint64_t get_uintX(const uint8_t *p, int length); LOCAL int32_t get_sintX(const uint8_t *p, int length); -LOCAL MMDB_entry_data_list_s *new_entry_data_list(void); LOCAL void free_mmdb_struct(MMDB_s *const mmdb); LOCAL void free_languages_metadata(MMDB_s *mmdb); LOCAL void free_descriptions_metadata(MMDB_s *mmdb); @@ -175,20 +203,24 @@ LOCAL char *bytes_to_hex(uint8_t *bytes, uint32_t size); /* --prototypes end - don't remove this comment-- */ /* *INDENT-ON* */ -#define CHECKED_DECODE_ONE(mmdb, offset, entry_data) \ - do { \ - int status = decode_one(mmdb, offset, entry_data); \ - if (MMDB_SUCCESS != status) { \ - return status; \ - } \ +#define CHECKED_DECODE_ONE(mmdb, offset, entry_data) \ + do { \ + int status = decode_one(mmdb, offset, entry_data); \ + if (MMDB_SUCCESS != status) { \ + DEBUG_MSGF("CHECKED_DECODE_ONE failed." \ + " status = %d (%s)", status, MMDB_strerror(status)); \ + return status; \ + } \ } while (0) -#define CHECKED_DECODE_ONE_FOLLOW(mmdb, offset, entry_data) \ - do { \ - int status = decode_one_follow(mmdb, offset, entry_data); \ - if (MMDB_SUCCESS != status) { \ - return status; \ - } \ +#define CHECKED_DECODE_ONE_FOLLOW(mmdb, offset, entry_data) \ + do { \ + int status = decode_one_follow(mmdb, offset, entry_data); \ + if (MMDB_SUCCESS != status) { \ + DEBUG_MSGF("CHECKED_DECODE_ONE_FOLLOW failed." \ + " status = %d (%s)", status, MMDB_strerror(status)); \ + return status; \ + } \ } while (0) #define FREE_AND_SET_NULL(p) { free((void *)(p)); (p) = NULL; } @@ -214,7 +246,7 @@ int MMDB_open(const char *const filename, uint32_t flags, MMDB_s *const mmdb) } mmdb->flags = flags; - if (MMDB_SUCCESS != (status = map_file(mmdb)) ) { + if (MMDB_SUCCESS != (status = map_file(mmdb))) { goto cleanup; } @@ -247,12 +279,38 @@ int MMDB_open(const char *const filename, uint32_t flags, MMDB_s *const mmdb) uint32_t search_tree_size = mmdb->metadata.node_count * mmdb->full_record_byte_size; - mmdb->data_section = mmdb->file_content + search_tree_size; - mmdb->data_section_size = mmdb->file_size - search_tree_size; + mmdb->data_section = mmdb->file_content + search_tree_size + + MMDB_DATA_SECTION_SEPARATOR; + if (search_tree_size + MMDB_DATA_SECTION_SEPARATOR > + (uint32_t)mmdb->file_size) { + status = MMDB_INVALID_METADATA_ERROR; + goto cleanup; + } + mmdb->data_section_size = (uint32_t)mmdb->file_size - search_tree_size - + MMDB_DATA_SECTION_SEPARATOR; + + // Although it is likely not possible to construct a database with valid + // valid metadata, as parsed above, and a data_section_size less than 3, + // we do this check as later we assume it is at least three when doing + // bound checks. + if (mmdb->data_section_size < 3) { + status = MMDB_INVALID_DATA_ERROR; + goto cleanup; + } + mmdb->metadata_section = metadata; mmdb->ipv4_start_node.node_value = 0; mmdb->ipv4_start_node.netmask = 0; + // We do this immediately as otherwise there is a race to set + // ipv4_start_node.node_value and ipv4_start_node.netmask. + if (mmdb->metadata.ip_version == 6) { + status = find_ipv4_start_node(mmdb); + if (status != MMDB_SUCCESS) { + goto cleanup; + } + } + cleanup: if (MMDB_SUCCESS != status) { int saved_errno = errno; @@ -262,16 +320,15 @@ int MMDB_open(const char *const filename, uint32_t flags, MMDB_s *const mmdb) return status; } +#ifdef _WIN32 + LOCAL int map_file(MMDB_s *const mmdb) { - ssize_t size; + DWORD size; int status = MMDB_SUCCESS; -#ifdef _WIN32 - HANDLE fd = INVALID_HANDLE_VALUE; HANDLE mmh = NULL; - - fd = CreateFileA(mmdb->filename, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE fd = CreateFileA(mmdb->filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (fd == INVALID_HANDLE_VALUE) { status = MMDB_FILE_OPEN_ERROR; goto cleanup; @@ -282,7 +339,9 @@ LOCAL int map_file(MMDB_s *const mmdb) goto cleanup; } mmh = CreateFileMappingA(fd, NULL, PAGE_READONLY, 0, size, NULL); - if (NULL == mmh) { /* Microsoft documentation for CreateFileMapping indicates this returns NULL not INVALID_HANDLE_VALUE on error */ + /* Microsoft documentation for CreateFileMapping indicates this returns + NULL not INVALID_HANDLE_VALUE on error */ + if (NULL == mmh) { status = MMDB_IO_ERROR; goto cleanup; } @@ -292,8 +351,35 @@ LOCAL int map_file(MMDB_s *const mmdb) status = MMDB_IO_ERROR; goto cleanup; } + + mmdb->file_size = size; + mmdb->file_content = file_content; + + cleanup:; + int saved_errno = errno; + if (INVALID_HANDLE_VALUE != fd) { + CloseHandle(fd); + } + if (NULL != mmh) { + CloseHandle(mmh); + } + errno = saved_errno; + + return status; +} + #else - int fd = open(mmdb->filename, O_RDONLY); + +LOCAL int map_file(MMDB_s *const mmdb) +{ + ssize_t size; + int status = MMDB_SUCCESS; + + int flags = O_RDONLY; +#ifdef O_CLOEXEC + flags |= O_CLOEXEC; +#endif + int fd = open(mmdb->filename, flags); struct stat s; if (fd < 0 || fstat(fd, &s)) { status = MMDB_FILE_OPEN_ERROR; @@ -301,6 +387,10 @@ LOCAL int map_file(MMDB_s *const mmdb) } size = s.st_size; + if (size < 0 || size != s.st_size) { + status = MMDB_OUT_OF_MEMORY_ERROR; + goto cleanup; + } uint8_t *file_content = (uint8_t *)mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); @@ -312,53 +402,56 @@ LOCAL int map_file(MMDB_s *const mmdb) } goto cleanup; } -#endif mmdb->file_size = size; mmdb->file_content = file_content; cleanup:; int saved_errno = errno; -#ifdef _WIN32 - if (INVALID_HANDLE_VALUE != fd) { - CloseHandle(fd); - } - if (NULL != mmh) { - CloseHandle(mmh); - } -#else if (fd >= 0) { close(fd); } -#endif errno = saved_errno; return status; } +#endif + LOCAL const uint8_t *find_metadata(const uint8_t *file_content, ssize_t file_size, uint32_t *metadata_size) { + const ssize_t marker_len = sizeof(METADATA_MARKER) - 1; ssize_t max_size = file_size > METADATA_BLOCK_MAX_SIZE ? METADATA_BLOCK_MAX_SIZE : file_size; uint8_t *search_area = (uint8_t *)(file_content + (file_size - max_size)); + uint8_t *start = search_area; uint8_t *tmp; do { tmp = mmdb_memmem(search_area, max_size, - METADATA_MARKER, strlen(METADATA_MARKER)); + METADATA_MARKER, marker_len); if (NULL != tmp) { max_size -= tmp - search_area; search_area = tmp; + + /* Continue searching just after the marker we just read, in case + * there are multiple markers in the same file. This would be odd + * but is certainly not impossible. */ + max_size -= marker_len; + search_area += marker_len; } - } while (NULL != tmp && tmp != search_area); + } while (NULL != tmp); - const uint8_t *metadata_start = search_area + strlen(METADATA_MARKER); - *metadata_size = file_size - (search_area - file_content); + if (search_area == start) { + return NULL; + } - return metadata_start; + *metadata_size = (uint32_t)max_size; + + return search_area; } LOCAL int read_metadata(MMDB_s *mmdb) @@ -374,15 +467,22 @@ LOCAL int read_metadata(MMDB_s *mmdb) .offset = 0 }; - mmdb->metadata.node_count = - value_for_key_as_uint32(&metadata_start, "node_count"); + int status = + value_for_key_as_uint32(&metadata_start, "node_count", + &mmdb->metadata.node_count); + if (MMDB_SUCCESS != status) { + return status; + } if (!mmdb->metadata.node_count) { DEBUG_MSG("could not find node_count value in metadata"); return MMDB_INVALID_METADATA_ERROR; } - mmdb->metadata.record_size = - value_for_key_as_uint16(&metadata_start, "record_size"); + status = value_for_key_as_uint16(&metadata_start, "record_size", + &mmdb->metadata.record_size); + if (MMDB_SUCCESS != status) { + return status; + } if (!mmdb->metadata.record_size) { DEBUG_MSG("could not find record_size value in metadata"); return MMDB_INVALID_METADATA_ERROR; @@ -395,8 +495,11 @@ LOCAL int read_metadata(MMDB_s *mmdb) return MMDB_UNKNOWN_DATABASE_FORMAT_ERROR; } - mmdb->metadata.ip_version = - value_for_key_as_uint16(&metadata_start, "ip_version"); + status = value_for_key_as_uint16(&metadata_start, "ip_version", + &mmdb->metadata.ip_version); + if (MMDB_SUCCESS != status) { + return status; + } if (!mmdb->metadata.ip_version) { DEBUG_MSG("could not find ip_version value in metadata"); return MMDB_INVALID_METADATA_ERROR; @@ -407,33 +510,44 @@ LOCAL int read_metadata(MMDB_s *mmdb) return MMDB_INVALID_METADATA_ERROR; } - mmdb->metadata.database_type = - value_for_key_as_string(&metadata_start, "database_type"); - if (NULL == mmdb->metadata.database_type) { - DEBUG_MSG("could not find database_type value in metadata"); - return MMDB_INVALID_METADATA_ERROR; + status = value_for_key_as_string(&metadata_start, "database_type", + &mmdb->metadata.database_type); + if (MMDB_SUCCESS != status) { + DEBUG_MSG("error finding database_type value in metadata"); + return status; } - int status = + status = populate_languages_metadata(mmdb, &metadata_db, &metadata_start); if (MMDB_SUCCESS != status) { DEBUG_MSG("could not populate languages from metadata"); return status; } - mmdb->metadata.binary_format_major_version = - value_for_key_as_uint16(&metadata_start, "binary_format_major_version"); + status = value_for_key_as_uint16( + &metadata_start, "binary_format_major_version", + &mmdb->metadata.binary_format_major_version); + if (MMDB_SUCCESS != status) { + return status; + } if (!mmdb->metadata.binary_format_major_version) { DEBUG_MSG( "could not find binary_format_major_version value in metadata"); return MMDB_INVALID_METADATA_ERROR; } - mmdb->metadata.binary_format_minor_version = - value_for_key_as_uint16(&metadata_start, "binary_format_minor_version"); + status = value_for_key_as_uint16( + &metadata_start, "binary_format_minor_version", + &mmdb->metadata.binary_format_minor_version); + if (MMDB_SUCCESS != status) { + return status; + } - mmdb->metadata.build_epoch = - value_for_key_as_uint64(&metadata_start, "build_epoch"); + status = value_for_key_as_uint64(&metadata_start, "build_epoch", + &mmdb->metadata.build_epoch); + if (MMDB_SUCCESS != status) { + return status; + } if (!mmdb->metadata.build_epoch) { DEBUG_MSG("could not find build_epoch value in metadata"); return MMDB_INVALID_METADATA_ERROR; @@ -462,36 +576,83 @@ LOCAL MMDB_s make_fake_metadata_db(MMDB_s *mmdb) return fake_metadata_db; } -LOCAL uint16_t value_for_key_as_uint16(MMDB_entry_s *start, char *key) +LOCAL int value_for_key_as_uint16(MMDB_entry_s *start, char *key, + uint16_t *value) { MMDB_entry_data_s entry_data; const char *path[] = { key, NULL }; - MMDB_aget_value(start, &entry_data, path); - return entry_data.uint16; + int status = MMDB_aget_value(start, &entry_data, path); + if (MMDB_SUCCESS != status) { + return status; + } + if (MMDB_DATA_TYPE_UINT16 != entry_data.type) { + DEBUG_MSGF("expect uint16 for %s but received %s", key, + type_num_to_name( + entry_data.type)); + return MMDB_INVALID_METADATA_ERROR; + } + *value = entry_data.uint16; + return MMDB_SUCCESS; } -LOCAL uint32_t value_for_key_as_uint32(MMDB_entry_s *start, char *key) +LOCAL int value_for_key_as_uint32(MMDB_entry_s *start, char *key, + uint32_t *value) { MMDB_entry_data_s entry_data; const char *path[] = { key, NULL }; - MMDB_aget_value(start, &entry_data, path); - return entry_data.uint32; + int status = MMDB_aget_value(start, &entry_data, path); + if (MMDB_SUCCESS != status) { + return status; + } + if (MMDB_DATA_TYPE_UINT32 != entry_data.type) { + DEBUG_MSGF("expect uint32 for %s but received %s", key, + type_num_to_name( + entry_data.type)); + return MMDB_INVALID_METADATA_ERROR; + } + *value = entry_data.uint32; + return MMDB_SUCCESS; } -LOCAL uint64_t value_for_key_as_uint64(MMDB_entry_s *start, char *key) +LOCAL int value_for_key_as_uint64(MMDB_entry_s *start, char *key, + uint64_t *value) { MMDB_entry_data_s entry_data; const char *path[] = { key, NULL }; - MMDB_aget_value(start, &entry_data, path); - return entry_data.uint64; + int status = MMDB_aget_value(start, &entry_data, path); + if (MMDB_SUCCESS != status) { + return status; + } + if (MMDB_DATA_TYPE_UINT64 != entry_data.type) { + DEBUG_MSGF("expect uint64 for %s but received %s", key, + type_num_to_name( + entry_data.type)); + return MMDB_INVALID_METADATA_ERROR; + } + *value = entry_data.uint64; + return MMDB_SUCCESS; } -LOCAL char *value_for_key_as_string(MMDB_entry_s *start, char *key) +LOCAL int value_for_key_as_string(MMDB_entry_s *start, char *key, + char const **value) { MMDB_entry_data_s entry_data; const char *path[] = { key, NULL }; - MMDB_aget_value(start, &entry_data, path); - return mmdb_strndup((char *)entry_data.utf8_string, entry_data.data_size); + int status = MMDB_aget_value(start, &entry_data, path); + if (MMDB_SUCCESS != status) { + return status; + } + if (MMDB_DATA_TYPE_UTF8_STRING != entry_data.type) { + DEBUG_MSGF("expect string for %s but received %s", key, + type_num_to_name( + entry_data.type)); + return MMDB_INVALID_METADATA_ERROR; + } + *value = mmdb_strndup((char *)entry_data.utf8_string, entry_data.data_size); + if (NULL == *value) { + return MMDB_OUT_OF_MEMORY_ERROR; + } + return MMDB_SUCCESS; } LOCAL int populate_languages_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, @@ -500,8 +661,10 @@ LOCAL int populate_languages_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, MMDB_entry_data_s entry_data; const char *path[] = { "languages", NULL }; - MMDB_aget_value(metadata_start, &entry_data, path); - + int status = MMDB_aget_value(metadata_start, &entry_data, path); + if (MMDB_SUCCESS != status) { + return status; + } if (MMDB_DATA_TYPE_ARRAY != entry_data.type) { return MMDB_INVALID_METADATA_ERROR; } @@ -512,11 +675,17 @@ LOCAL int populate_languages_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, }; MMDB_entry_data_list_s *member; - MMDB_get_entry_data_list(&array_start, &member); + status = MMDB_get_entry_data_list(&array_start, &member); + if (MMDB_SUCCESS != status) { + return status; + } MMDB_entry_data_list_s *first_member = member; uint32_t array_size = member->entry_data.data_size; + MAYBE_CHECK_SIZE_OVERFLOW(array_size, SIZE_MAX / sizeof(char *), + MMDB_INVALID_METADATA_ERROR); + mmdb->metadata.languages.count = 0; mmdb->metadata.languages.names = malloc(array_size * sizeof(char *)); if (NULL == mmdb->metadata.languages.names) { @@ -552,9 +721,13 @@ LOCAL int populate_description_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, MMDB_entry_data_s entry_data; const char *path[] = { "description", NULL }; - MMDB_aget_value(metadata_start, &entry_data, path); + int status = MMDB_aget_value(metadata_start, &entry_data, path); + if (MMDB_SUCCESS != status) { + return status; + } if (MMDB_DATA_TYPE_MAP != entry_data.type) { + DEBUG_MSGF("Unexpected entry_data type: %d", entry_data.type); return MMDB_INVALID_METADATA_ERROR; } @@ -564,7 +737,13 @@ LOCAL int populate_description_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, }; MMDB_entry_data_list_s *member; - MMDB_get_entry_data_list(&map_start, &member); + status = MMDB_get_entry_data_list(&map_start, &member); + if (MMDB_SUCCESS != status) { + DEBUG_MSGF( + "MMDB_get_entry_data_list failed while populating description." + " status = %d (%s)", status, MMDB_strerror(status)); + return status; + } MMDB_entry_data_list_s *first_member = member; @@ -574,18 +753,22 @@ LOCAL int populate_description_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, mmdb->metadata.description.descriptions = NULL; goto cleanup; } + MAYBE_CHECK_SIZE_OVERFLOW(map_size, SIZE_MAX / sizeof(MMDB_description_s *), + MMDB_INVALID_METADATA_ERROR); mmdb->metadata.description.descriptions = malloc(map_size * sizeof(MMDB_description_s *)); if (NULL == mmdb->metadata.description.descriptions) { - return MMDB_OUT_OF_MEMORY_ERROR; + status = MMDB_OUT_OF_MEMORY_ERROR; + goto cleanup; } for (uint32_t i = 0; i < map_size; i++) { mmdb->metadata.description.descriptions[i] = malloc(sizeof(MMDB_description_s)); if (NULL == mmdb->metadata.description.descriptions[i]) { - return MMDB_OUT_OF_MEMORY_ERROR; + status = MMDB_OUT_OF_MEMORY_ERROR; + goto cleanup; } mmdb->metadata.description.count = i + 1; @@ -595,7 +778,8 @@ LOCAL int populate_description_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, member = member->next; if (MMDB_DATA_TYPE_UTF8_STRING != member->entry_data.type) { - return MMDB_INVALID_METADATA_ERROR; + status = MMDB_INVALID_METADATA_ERROR; + goto cleanup; } mmdb->metadata.description.descriptions[i]->language = @@ -603,13 +787,15 @@ LOCAL int populate_description_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, member->entry_data.data_size); if (NULL == mmdb->metadata.description.descriptions[i]->language) { - return MMDB_OUT_OF_MEMORY_ERROR; + status = MMDB_OUT_OF_MEMORY_ERROR; + goto cleanup; } member = member->next; if (MMDB_DATA_TYPE_UTF8_STRING != member->entry_data.type) { - return MMDB_INVALID_METADATA_ERROR; + status = MMDB_INVALID_METADATA_ERROR; + goto cleanup; } mmdb->metadata.description.descriptions[i]->description = @@ -617,14 +803,15 @@ LOCAL int populate_description_metadata(MMDB_s *mmdb, MMDB_s *metadata_db, member->entry_data.data_size); if (NULL == mmdb->metadata.description.descriptions[i]->description) { - return MMDB_OUT_OF_MEMORY_ERROR; + status = MMDB_OUT_OF_MEMORY_ERROR; + goto cleanup; } } cleanup: MMDB_free_entry_data_list(first_member); - return MMDB_SUCCESS; + return status; } MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb, @@ -644,20 +831,10 @@ MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb, struct addrinfo *addresses = NULL; *gai_error = resolve_any_address(ipstr, &addresses); - if (*gai_error) { - goto cleanup; + if (!*gai_error) { + result = MMDB_lookup_sockaddr(mmdb, addresses->ai_addr, mmdb_error); } - if (mmdb->metadata.ip_version == 4 - && addresses->ai_addr->sa_family == AF_INET6) { - - *mmdb_error = MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR; - goto cleanup; - } - - result = MMDB_lookup_sockaddr(mmdb, addresses->ai_addr, mmdb_error); - - cleanup: if (NULL != addresses) { freeaddrinfo(addresses); } @@ -668,22 +845,13 @@ MMDB_lookup_result_s MMDB_lookup_string(MMDB_s *const mmdb, LOCAL int resolve_any_address(const char *ipstr, struct addrinfo **addresses) { struct addrinfo hints = { + .ai_family = AF_UNSPEC, + .ai_flags = AI_NUMERICHOST, + // We set ai_socktype so that we only get one result back .ai_socktype = SOCK_STREAM }; - int gai_status; - if (NULL != strchr(ipstr, ':')) { - hints.ai_flags = AI_NUMERICHOST; -#if defined AI_V4MAPPED && !defined __FreeBSD__ - hints.ai_flags |= AI_V4MAPPED; -#endif - hints.ai_family = AF_INET6; - } else { - hints.ai_flags = AI_NUMERICHOST; - hints.ai_family = AF_INET; - } - - gai_status = getaddrinfo(ipstr, NULL, &hints, addresses); + int gai_status = getaddrinfo(ipstr, NULL, &hints, addresses); if (gai_status) { return gai_status; } @@ -708,6 +876,7 @@ MMDB_lookup_result_s MMDB_lookup_sockaddr( uint8_t mapped_address[16], *address; if (mmdb->metadata.ip_version == 4) { if (sockaddr->sa_family == AF_INET6) { + *mmdb_error = MMDB_IPV6_LOOKUP_IN_IPV4_DATABASE_ERROR; return result; } address = (uint8_t *)&((struct sockaddr_in *)sockaddr)->sin_addr.s_addr; @@ -743,23 +912,34 @@ LOCAL int find_address_in_search_tree(MMDB_s *mmdb, uint8_t *address, DEBUG_NL; DEBUG_MSG("Looking for address in search tree"); - uint32_t node_count = mmdb->metadata.node_count; uint32_t value = 0; uint16_t max_depth0 = mmdb->depth - 1; uint16_t start_bit = max_depth0; if (mmdb->metadata.ip_version == 6 && address_family == AF_INET) { - MMDB_ipv4_start_node_s ipv4_start_node = find_ipv4_start_node(mmdb); + int mmdb_error = find_ipv4_start_node(mmdb); + if (MMDB_SUCCESS != mmdb_error) { + return mmdb_error; + } DEBUG_MSGF("IPv4 start node is %u (netmask %u)", - ipv4_start_node.node_value, ipv4_start_node.netmask); - /* We have an IPv6 database with no IPv4 data */ - if (ipv4_start_node.node_value >= node_count) { - return populate_result(mmdb, node_count, ipv4_start_node.node_value, - ipv4_start_node.netmask, result); + mmdb->ipv4_start_node.node_value, + mmdb->ipv4_start_node.netmask); + + uint8_t type = maybe_populate_result(mmdb, + mmdb->ipv4_start_node.node_value, + mmdb->ipv4_start_node.netmask, + result); + if (MMDB_RECORD_TYPE_INVALID == type) { + return MMDB_CORRUPT_SEARCH_TREE_ERROR; } - value = ipv4_start_node.node_value; - start_bit -= ipv4_start_node.netmask; + /* We have an IPv6 database with no IPv4 data */ + if (MMDB_RECORD_TYPE_SEARCH_NODE != type) { + return MMDB_SUCCESS; + } + + value = mmdb->ipv4_start_node.node_value; + start_bit -= mmdb->ipv4_start_node.netmask; } const uint8_t *search_tree = mmdb->file_content; @@ -774,6 +954,9 @@ LOCAL int find_address_in_search_tree(MMDB_s *mmdb, uint8_t *address, DEBUG_MSGF(" current node = %u", value); record_pointer = &search_tree[value * record_info.record_length]; + if (record_pointer + record_info.record_length > mmdb->data_section) { + return MMDB_CORRUPT_SEARCH_TREE_ERROR; + } if (bit_is_true) { record_pointer += record_info.right_record_offset; value = record_info.right_record_getter(record_pointer); @@ -781,20 +964,17 @@ LOCAL int find_address_in_search_tree(MMDB_s *mmdb, uint8_t *address, value = record_info.left_record_getter(record_pointer); } - /* Ideally we'd check to make sure that a record never points to a - * previously seen value, but that's more complicated. For now, we can - * at least check that we don't end up at the top of the tree again. */ - if (0 == value) { - DEBUG_MSGF(" %s record has a value of 0", - bit_is_true ? "right" : "left"); + uint8_t type = maybe_populate_result(mmdb, value, (uint16_t)current_bit, + result); + if (MMDB_RECORD_TYPE_INVALID == type) { return MMDB_CORRUPT_SEARCH_TREE_ERROR; } - if (value >= node_count) { - return populate_result(mmdb, node_count, value, current_bit, result); - } else { - DEBUG_MSGF(" proceeding to search tree node %i", value); + if (MMDB_RECORD_TYPE_SEARCH_NODE != type) { + return MMDB_SUCCESS; } + + DEBUG_MSGF(" proceeding to search tree node %i", value); } DEBUG_MSG( @@ -830,13 +1010,13 @@ LOCAL record_info_s record_info_for_database(MMDB_s *mmdb) return record_info; } -LOCAL MMDB_ipv4_start_node_s find_ipv4_start_node(MMDB_s *mmdb) +LOCAL int find_ipv4_start_node(MMDB_s *mmdb) { /* In a pathological case of a database with a single node search tree, * this check will be true even after we've found the IPv4 start node, but * that doesn't seem worth trying to fix. */ if (mmdb->ipv4_start_node.node_value != 0) { - return mmdb->ipv4_start_node; + return MMDB_SUCCESS; } record_info_s record_info = record_info_for_database(mmdb); @@ -844,9 +1024,12 @@ LOCAL MMDB_ipv4_start_node_s find_ipv4_start_node(MMDB_s *mmdb) const uint8_t *search_tree = mmdb->file_content; uint32_t node_value = 0; const uint8_t *record_pointer; - uint32_t netmask; + uint16_t netmask; for (netmask = 0; netmask < 96; netmask++) { record_pointer = &search_tree[node_value * record_info.record_length]; + if (record_pointer + record_info.record_length > mmdb->data_section) { + return MMDB_CORRUPT_SEARCH_TREE_ERROR; + } node_value = record_info.left_record_getter(record_pointer); /* This can happen if there's no IPv4 data _or_ if there is a subnet * with data that contains the entire IPv4 range (like ::/64) */ @@ -858,23 +1041,57 @@ LOCAL MMDB_ipv4_start_node_s find_ipv4_start_node(MMDB_s *mmdb) mmdb->ipv4_start_node.node_value = node_value; mmdb->ipv4_start_node.netmask = netmask; - return mmdb->ipv4_start_node; + return MMDB_SUCCESS; } -LOCAL int populate_result(MMDB_s *mmdb, uint32_t node_count, uint32_t value, - uint16_t netmask, MMDB_lookup_result_s *result) +LOCAL uint8_t maybe_populate_result(MMDB_s *mmdb, uint32_t record, + uint16_t netmask, + MMDB_lookup_result_s *result) { - uint32_t offset = value - node_count; - DEBUG_MSGF(" data section offset is %i (record value = %i)", offset, value); + uint8_t type = record_type(mmdb, record); - if (offset > mmdb->data_section_size) { - return MMDB_CORRUPT_SEARCH_TREE_ERROR; + if (MMDB_RECORD_TYPE_SEARCH_NODE == type || + MMDB_RECORD_TYPE_INVALID == type) { + return type; } result->netmask = mmdb->depth - netmask; - result->entry.offset = offset; - result->found_entry = result->entry.offset > 0 ? true : false; - return MMDB_SUCCESS; + + result->entry.offset = data_section_offset_for_record(mmdb, record); + + // type is either MMDB_RECORD_TYPE_DATA or MMDB_RECORD_TYPE_EMPTY + // at this point + result->found_entry = MMDB_RECORD_TYPE_DATA == type; + + return type; +} + +LOCAL uint8_t record_type(MMDB_s *const mmdb, uint64_t record) +{ + uint32_t node_count = mmdb->metadata.node_count; + + /* Ideally we'd check to make sure that a record never points to a + * previously seen value, but that's more complicated. For now, we can + * at least check that we don't end up at the top of the tree again. */ + if (record == 0) { + DEBUG_MSG("record has a value of 0"); + return MMDB_RECORD_TYPE_INVALID; + } + + if (record < node_count) { + return MMDB_RECORD_TYPE_SEARCH_NODE; + } + + if (record == node_count) { + return MMDB_RECORD_TYPE_EMPTY; + } + + if (record - node_count < mmdb->data_section_size) { + return MMDB_RECORD_TYPE_DATA; + } + + DEBUG_MSG("record has a value that points outside of the database"); + return MMDB_RECORD_TYPE_INVALID; } LOCAL uint32_t get_left_28_bit_record(const uint8_t *record) @@ -908,9 +1125,31 @@ int MMDB_read_node(MMDB_s *const mmdb, uint32_t node_number, record_pointer += record_info.right_record_offset; node->right_record = record_info.right_record_getter(record_pointer); + node->left_record_type = record_type(mmdb, node->left_record); + node->right_record_type = record_type(mmdb, node->right_record); + + // Note that offset will be invalid if the record type is not + // MMDB_RECORD_TYPE_DATA, but that's ok. Any use of the record entry + // for other data types is a programming error. + node->left_record_entry = (struct MMDB_entry_s) { + .mmdb = mmdb, + .offset = data_section_offset_for_record(mmdb, node->left_record), + }; + node->right_record_entry = (struct MMDB_entry_s) { + .mmdb = mmdb, + .offset = data_section_offset_for_record(mmdb, node->right_record), + }; + return MMDB_SUCCESS; } +LOCAL uint32_t data_section_offset_for_record(MMDB_s *const mmdb, + uint64_t record) +{ + return (uint32_t)record - mmdb->metadata.node_count - + MMDB_DATA_SECTION_SEPARATOR; +} + int MMDB_get_value(MMDB_entry_s *const start, MMDB_entry_data_s *const entry_data, ...) @@ -930,6 +1169,9 @@ int MMDB_vget_value(MMDB_entry_s *const start, const char *path_elem; int i = 0; + MAYBE_CHECK_SIZE_OVERFLOW(length, SIZE_MAX / sizeof(const char *) - 1, + MMDB_INVALID_METADATA_ERROR); + const char **path = malloc((length + 1) * sizeof(const char *)); if (NULL == path) { return MMDB_OUT_OF_MEMORY_ERROR; @@ -1129,14 +1371,20 @@ LOCAL int decode_one_follow(MMDB_s *mmdb, uint32_t offset, { CHECKED_DECODE_ONE(mmdb, offset, entry_data); if (entry_data->type == MMDB_DATA_TYPE_POINTER) { + uint32_t next = entry_data->offset_to_next; + CHECKED_DECODE_ONE(mmdb, entry_data->pointer, entry_data); + /* Pointers to pointers are illegal under the spec */ + if (entry_data->type == MMDB_DATA_TYPE_POINTER) { + DEBUG_MSG("pointer points to another pointer"); + return MMDB_INVALID_DATA_ERROR; + } + /* The pointer could point to any part of the data section but the * next entry for this particular offset may be the one after the * pointer, not the one after whatever the pointer points to. This * depends on whether the pointer points to something that is a simple * value or a compound value. For a compound value, the next one is * the one after the pointer result, not the one after the pointer. */ - uint32_t next = entry_data->offset_to_next; - CHECKED_DECODE_ONE(mmdb, entry_data->pointer, entry_data); if (entry_data->type != MMDB_DATA_TYPE_MAP && entry_data->type != MMDB_DATA_TYPE_ARRAY) { @@ -1164,7 +1412,12 @@ LOCAL int decode_one(MMDB_s *mmdb, uint32_t offset, { const uint8_t *mem = mmdb->data_section; - if (offset > mmdb->data_section_size) { + // We subtract rather than add as it possible that offset + 1 + // could overflow for a corrupt database while an underflow + // from data_section_size - 1 should not be possible. + if (offset > mmdb->data_section_size - 1) { + DEBUG_MSGF("Offset (%d) past data section (%d)", offset, + mmdb->data_section_size); return MMDB_INVALID_DATA_ERROR; } @@ -1181,6 +1434,13 @@ LOCAL int decode_one(MMDB_s *mmdb, uint32_t offset, DEBUG_MSGF("Type: %i (%s)", type, type_num_to_name(type)); if (type == MMDB_DATA_TYPE_EXTENDED) { + // Subtracting 1 to avoid possible overflow on offset + 1 + if (offset > mmdb->data_section_size - 1) { + DEBUG_MSGF("Extended type offset (%d) past data section (%d)", + offset, + mmdb->data_section_size); + return MMDB_INVALID_DATA_ERROR; + } type = get_ext_type(mem[offset++]); DEBUG_MSGF("Extended type: %i (%s)", type, type_num_to_name(type)); } @@ -1188,27 +1448,57 @@ LOCAL int decode_one(MMDB_s *mmdb, uint32_t offset, entry_data->type = type; if (type == MMDB_DATA_TYPE_POINTER) { - int psize = (ctrl >> 3) & 3; + uint8_t psize = ((ctrl >> 3) & 3) + 1; DEBUG_MSGF("Pointer size: %i", psize); + // We check that the offset does not extend past the end of the + // database and that the subtraction of psize did not underflow. + if (offset > mmdb->data_section_size - psize || + mmdb->data_section_size < psize) { + DEBUG_MSGF("Pointer offset (%d) past data section (%d)", offset + + psize, + mmdb->data_section_size); + return MMDB_INVALID_DATA_ERROR; + } entry_data->pointer = get_ptr_from(ctrl, &mem[offset], psize); DEBUG_MSGF("Pointer to: %i", entry_data->pointer); - entry_data->data_size = psize + 1; - entry_data->offset_to_next = offset + psize + 1; + entry_data->data_size = psize; + entry_data->offset_to_next = offset + psize; return MMDB_SUCCESS; } uint32_t size = ctrl & 31; switch (size) { case 29: + // We subtract when checking offset to avoid possible overflow + if (offset > mmdb->data_section_size - 1) { + DEBUG_MSGF("String end (%d, case 29) past data section (%d)", + offset, + mmdb->data_section_size); + return MMDB_INVALID_DATA_ERROR; + } size = 29 + mem[offset++]; break; case 30: + // We subtract when checking offset to avoid possible overflow + if (offset > mmdb->data_section_size - 2) { + DEBUG_MSGF("String end (%d, case 30) past data section (%d)", + offset, + mmdb->data_section_size); + return MMDB_INVALID_DATA_ERROR; + } size = 285 + get_uint16(&mem[offset]); offset += 2; break; case 31: + // We subtract when checking offset to avoid possible overflow + if (offset > mmdb->data_section_size - 3) { + DEBUG_MSGF("String end (%d, case 31) past data section (%d)", + offset, + mmdb->data_section_size); + return MMDB_INVALID_DATA_ERROR; + } size = 65821 + get_uint24(&mem[offset]); offset += 3; default: @@ -1231,32 +1521,46 @@ LOCAL int decode_one(MMDB_s *mmdb, uint32_t offset, return MMDB_SUCCESS; } + // Check that the data doesn't extend past the end of the memory + // buffer and that the calculation in doing this did not underflow. + if (offset > mmdb->data_section_size - size || + mmdb->data_section_size < size) { + DEBUG_MSGF("Data end (%d) past data section (%d)", offset + size, + mmdb->data_section_size); + return MMDB_INVALID_DATA_ERROR; + } + if (type == MMDB_DATA_TYPE_UINT16) { if (size > 2) { + DEBUG_MSGF("uint16 of size %d", size); return MMDB_INVALID_DATA_ERROR; } entry_data->uint16 = (uint16_t)get_uintX(&mem[offset], size); DEBUG_MSGF("uint16 value: %u", entry_data->uint16); } else if (type == MMDB_DATA_TYPE_UINT32) { if (size > 4) { + DEBUG_MSGF("uint32 of size %d", size); return MMDB_INVALID_DATA_ERROR; } entry_data->uint32 = (uint32_t)get_uintX(&mem[offset], size); DEBUG_MSGF("uint32 value: %u", entry_data->uint32); } else if (type == MMDB_DATA_TYPE_INT32) { if (size > 4) { + DEBUG_MSGF("int32 of size %d", size); return MMDB_INVALID_DATA_ERROR; } entry_data->int32 = get_sintX(&mem[offset], size); DEBUG_MSGF("int32 value: %i", entry_data->int32); } else if (type == MMDB_DATA_TYPE_UINT64) { if (size > 8) { + DEBUG_MSGF("uint64 of size %d", size); return MMDB_INVALID_DATA_ERROR; } entry_data->uint64 = get_uintX(&mem[offset], size); DEBUG_MSGF("uint64 value: %" PRIu64, entry_data->uint64); } else if (type == MMDB_DATA_TYPE_UINT128) { if (size > 16) { + DEBUG_MSGF("uint128 of size %d", size); return MMDB_INVALID_DATA_ERROR; } #if MMDB_UINT128_IS_BYTE_ARRAY @@ -1269,6 +1573,7 @@ LOCAL int decode_one(MMDB_s *mmdb, uint32_t offset, #endif } else if (type == MMDB_DATA_TYPE_FLOAT) { if (size != 4) { + DEBUG_MSGF("float of size %d", size); return MMDB_INVALID_DATA_ERROR; } size = 4; @@ -1276,6 +1581,7 @@ LOCAL int decode_one(MMDB_s *mmdb, uint32_t offset, DEBUG_MSGF("float value: %f", entry_data->float_value); } else if (type == MMDB_DATA_TYPE_DOUBLE) { if (size != 8) { + DEBUG_MSGF("double of size %d", size); return MMDB_INVALID_DATA_ERROR; } size = 8; @@ -1313,21 +1619,21 @@ LOCAL uint32_t get_ptr_from(uint8_t ctrl, uint8_t const *const ptr, { uint32_t new_offset; switch (ptr_size) { - case 0: - new_offset = (ctrl & 7) * 256 + ptr[0]; - break; case 1: - new_offset = 2048 + (ctrl & 7) * 65536 + ptr[0] * 256 + ptr[1]; + new_offset = ( (ctrl & 7) << 8) + ptr[0]; break; case 2: - new_offset = 2048 + 524288 + (ctrl & 7) * 16777216 + get_uint24(ptr); + new_offset = 2048 + ( (ctrl & 7) << 16 ) + ( ptr[0] << 8) + ptr[1]; break; case 3: + new_offset = 2048 + 524288 + ( (ctrl & 7) << 24 ) + get_uint24(ptr); + break; + case 4: default: new_offset = get_uint32(ptr); break; } - return MMDB_DATA_SECTION_SEPARATOR + new_offset; + return new_offset; } int MMDB_get_metadata_as_entry_data_list( @@ -1346,16 +1652,40 @@ int MMDB_get_metadata_as_entry_data_list( int MMDB_get_entry_data_list( MMDB_entry_s *start, MMDB_entry_data_list_s **const entry_data_list) { - *entry_data_list = new_entry_data_list(); - if (NULL == *entry_data_list) { + MMDB_data_pool_s *const pool = data_pool_new(MMDB_POOL_INIT_SIZE); + if (!pool) { return MMDB_OUT_OF_MEMORY_ERROR; } - return get_entry_data_list(start->mmdb, start->offset, *entry_data_list); + + MMDB_entry_data_list_s *const list = data_pool_alloc(pool); + if (!list) { + data_pool_destroy(pool); + return MMDB_OUT_OF_MEMORY_ERROR; + } + + int const status = get_entry_data_list(start->mmdb, start->offset, list, + pool, 0); + + *entry_data_list = data_pool_to_list(pool); + if (!*entry_data_list) { + data_pool_destroy(pool); + return MMDB_OUT_OF_MEMORY_ERROR; + } + + return status; } -LOCAL int get_entry_data_list(MMDB_s *mmdb, uint32_t offset, - MMDB_entry_data_list_s *const entry_data_list) +LOCAL int get_entry_data_list(MMDB_s *mmdb, + uint32_t offset, + MMDB_entry_data_list_s *const entry_data_list, + MMDB_data_pool_s *const pool, + int depth) { + if (depth >= MAXIMUM_DATA_STRUCTURE_DEPTH) { + DEBUG_MSG("reached the maximum data structure depth"); + return MMDB_INVALID_DATA_ERROR; + } + depth++; CHECKED_DECODE_ONE(mmdb, offset, &entry_data_list->entry_data); switch (entry_data_list->entry_data.type) { @@ -1363,19 +1693,24 @@ LOCAL int get_entry_data_list(MMDB_s *mmdb, uint32_t offset, { uint32_t next_offset = entry_data_list->entry_data.offset_to_next; uint32_t last_offset; - while (entry_data_list->entry_data.type == - MMDB_DATA_TYPE_POINTER) { - CHECKED_DECODE_ONE(mmdb, last_offset = - entry_data_list->entry_data.pointer, - &entry_data_list->entry_data); + CHECKED_DECODE_ONE(mmdb, last_offset = + entry_data_list->entry_data.pointer, + &entry_data_list->entry_data); + + /* Pointers to pointers are illegal under the spec */ + if (entry_data_list->entry_data.type == MMDB_DATA_TYPE_POINTER) { + DEBUG_MSG("pointer points to another pointer"); + return MMDB_INVALID_DATA_ERROR; } if (entry_data_list->entry_data.type == MMDB_DATA_TYPE_ARRAY || entry_data_list->entry_data.type == MMDB_DATA_TYPE_MAP) { int status = - get_entry_data_list(mmdb, last_offset, entry_data_list); + get_entry_data_list(mmdb, last_offset, entry_data_list, + pool, depth); if (MMDB_SUCCESS != status) { + DEBUG_MSG("get_entry_data_list on pointer failed."); return status; } } @@ -1386,24 +1721,22 @@ LOCAL int get_entry_data_list(MMDB_s *mmdb, uint32_t offset, { uint32_t array_size = entry_data_list->entry_data.data_size; uint32_t array_offset = entry_data_list->entry_data.offset_to_next; - MMDB_entry_data_list_s *previous = entry_data_list; while (array_size-- > 0) { - MMDB_entry_data_list_s *entry_data_list_to = previous->next = - new_entry_data_list(); - if (NULL == entry_data_list_to) { + MMDB_entry_data_list_s *entry_data_list_to = + data_pool_alloc(pool); + if (!entry_data_list_to) { return MMDB_OUT_OF_MEMORY_ERROR; } int status = - get_entry_data_list(mmdb, array_offset, entry_data_list_to); + get_entry_data_list(mmdb, array_offset, entry_data_list_to, + pool, depth); if (MMDB_SUCCESS != status) { + DEBUG_MSG("get_entry_data_list on array element failed."); return status; } array_offset = entry_data_list_to->entry_data.offset_to_next; - while (previous->next) { - previous = previous->next; - } } entry_data_list->entry_data.offset_to_next = array_offset; @@ -1414,41 +1747,33 @@ LOCAL int get_entry_data_list(MMDB_s *mmdb, uint32_t offset, uint32_t size = entry_data_list->entry_data.data_size; offset = entry_data_list->entry_data.offset_to_next; - MMDB_entry_data_list_s *previous = entry_data_list; while (size-- > 0) { - MMDB_entry_data_list_s *entry_data_list_to = previous->next = - new_entry_data_list(); - if (NULL == entry_data_list_to) { + MMDB_entry_data_list_s *list_key = data_pool_alloc(pool); + if (!list_key) { return MMDB_OUT_OF_MEMORY_ERROR; } int status = - get_entry_data_list(mmdb, offset, entry_data_list_to); + get_entry_data_list(mmdb, offset, list_key, pool, depth); if (MMDB_SUCCESS != status) { + DEBUG_MSG("get_entry_data_list on map key failed."); return status; } - while (previous->next) { - previous = previous->next; - } + offset = list_key->entry_data.offset_to_next; - offset = entry_data_list_to->entry_data.offset_to_next; - entry_data_list_to = previous->next = - new_entry_data_list(); - - if (NULL == entry_data_list_to) { + MMDB_entry_data_list_s *list_value = data_pool_alloc(pool); + if (!list_value) { return MMDB_OUT_OF_MEMORY_ERROR; } - status = get_entry_data_list(mmdb, offset, entry_data_list_to); + status = get_entry_data_list(mmdb, offset, list_value, pool, + depth); if (MMDB_SUCCESS != status) { + DEBUG_MSG("get_entry_data_list on map element failed."); return status; } - - while (previous->next) { - previous = previous->next; - } - offset = entry_data_list_to->entry_data.offset_to_next; + offset = list_value->entry_data.offset_to_next; } entry_data_list->entry_data.offset_to_next = offset; } @@ -1464,7 +1789,9 @@ LOCAL float get_ieee754_float(const uint8_t *restrict p) { volatile float f; uint8_t *q = (void *)&f; -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +/* Windows builds don't use autoconf but we can assume they're all + * little-endian. */ +#if MMDB_LITTLE_ENDIAN || _WIN32 q[3] = p[0]; q[2] = p[1]; q[1] = p[2]; @@ -1479,7 +1806,7 @@ LOCAL double get_ieee754_double(const uint8_t *restrict p) { volatile double d; uint8_t *q = (void *)&d; -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#if MMDB_LITTLE_ENDIAN || _WIN32 q[7] = p[0]; q[6] = p[1]; q[5] = p[2]; @@ -1525,22 +1852,12 @@ LOCAL int32_t get_sintX(const uint8_t *p, int length) return (int32_t)get_uintX(p, length); } -LOCAL MMDB_entry_data_list_s *new_entry_data_list(void) -{ - /* We need calloc here in order to ensure that the ->next pointer in the - * struct doesn't point to some random address. */ - return calloc(1, sizeof(MMDB_entry_data_list_s)); -} - void MMDB_free_entry_data_list(MMDB_entry_data_list_s *const entry_data_list) { if (entry_data_list == NULL) { return; } - if (entry_data_list->next) { - MMDB_free_entry_data_list(entry_data_list->next); - } - free(entry_data_list); + data_pool_destroy(entry_data_list->pool); } void MMDB_close(MMDB_s *const mmdb) @@ -1644,6 +1961,11 @@ LOCAL MMDB_entry_data_list_s *dump_entry_data_list( for (entry_data_list = entry_data_list->next; size && entry_data_list; size--) { + if (MMDB_DATA_TYPE_UTF8_STRING != + entry_data_list->entry_data.type) { + *status = MMDB_INVALID_DATA_ERROR; + return NULL; + } char *key = mmdb_strndup( (char *)entry_data_list->entry_data.utf8_string, @@ -1766,6 +2088,10 @@ LOCAL MMDB_entry_data_list_s *dump_entry_data_list( #if MMDB_UINT128_IS_BYTE_ARRAY char *hex_string = bytes_to_hex((uint8_t *)entry_data_list->entry_data.uint128, 16); + if (NULL == hex_string) { + *status = MMDB_OUT_OF_MEMORY_ERROR; + return NULL; + } fprintf(stream, "0x%s <uint128>\n", hex_string); free(hex_string); #else @@ -1801,11 +2127,16 @@ LOCAL void print_indentation(FILE *stream, int i) LOCAL char *bytes_to_hex(uint8_t *bytes, uint32_t size) { - char *hex_string = malloc((size * 2) + 1); - char *hex_pointer = hex_string; + char *hex_string; + MAYBE_CHECK_SIZE_OVERFLOW(size, SIZE_MAX / 2 - 1, NULL); + + hex_string = malloc((size * 2) + 1); + if (NULL == hex_string) { + return NULL; + } for (uint32_t i = 0; i < size; i++) { - sprintf(hex_pointer + (2 * i), "%02X", bytes[i]); + sprintf(hex_string + (2 * i), "%02X", bytes[i]); } return hex_string; diff --git a/third_party/libmaxminddb/maxminddb.h b/third_party/libmaxminddb/maxminddb.h index 40f15a95..1f18e13c 100644 --- a/third_party/libmaxminddb/maxminddb.h +++ b/third_party/libmaxminddb/maxminddb.h @@ -5,10 +5,21 @@ extern "C" { #ifndef MAXMINDDB_H #define MAXMINDDB_H +/* Request POSIX.1-2008. However, we want to remain compatible with + * POSIX.1-2001 (since we have been historically and see no reason to drop + * compatibility). By requesting POSIX.1-2008, we can conditionally use + * features provided by that standard if the implementation provides it. We can + * check for what the implementation provides by checking the _POSIX_VERSION + * macro after including unistd.h. If a feature is in POSIX.1-2008 but not + * POSIX.1-2001, check that macro before using the feature (or check for the + * feature directly if possible). */ #ifndef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200112L +#define _POSIX_C_SOURCE 200809L #endif +/* libmaxminddb package version from configure */ +#define PACKAGE_VERSION "1.3.2" + #include "maxminddb_config.h" #include <stdarg.h> #include <stdbool.h> @@ -24,7 +35,7 @@ typedef ADDRESS_FAMILY sa_family_t; #if defined(_MSC_VER) /* MSVC doesn't define signed size_t, copy it from configure */ -#define ssize_t int +#define ssize_t SSIZE_T /* MSVC doesn't support restricted pointers */ #define restrict @@ -35,9 +46,6 @@ typedef ADDRESS_FAMILY sa_family_t; #include <sys/socket.h> #endif -/* libmaxminddb package version from configure */ -#define PACKAGE_VERSION "1.1.0" - #define MMDB_DATA_TYPE_EXTENDED (0) #define MMDB_DATA_TYPE_POINTER (1) #define MMDB_DATA_TYPE_UTF8_STRING (2) @@ -55,6 +63,11 @@ typedef ADDRESS_FAMILY sa_family_t; #define MMDB_DATA_TYPE_BOOLEAN (14) #define MMDB_DATA_TYPE_FLOAT (15) +#define MMDB_RECORD_TYPE_SEARCH_NODE (0) +#define MMDB_RECORD_TYPE_EMPTY (1) +#define MMDB_RECORD_TYPE_DATA (2) +#define MMDB_RECORD_TYPE_INVALID (3) + /* flags for open */ #define MMDB_MODE_MMAP (1) #define MMDB_MODE_MASK (7) @@ -131,6 +144,7 @@ typedef struct MMDB_entry_data_s { typedef struct MMDB_entry_data_list_s { MMDB_entry_data_s entry_data; struct MMDB_entry_data_list_s *next; + void *pool; } MMDB_entry_data_list_s; typedef struct MMDB_description_s { @@ -179,6 +193,10 @@ typedef struct MMDB_s { typedef struct MMDB_search_node_s { uint64_t left_record; uint64_t right_record; + uint8_t left_record_type; + uint8_t right_record_type; + MMDB_entry_s left_record_entry; + MMDB_entry_s right_record_entry; } MMDB_search_node_s; /* *INDENT-OFF* */ From 8762b578ff58eab7333791e1f7a91a512a66a90d Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 27 Aug 2018 18:21:57 +0200 Subject: [PATCH 39/98] Update SQLite library to v3.24.0. (#525) --- third_party/sqlite/sqlite3.c | 102543 +++++++++++++++++++++++++------- third_party/sqlite/sqlite3.h | 4481 +- 2 files changed, 84620 insertions(+), 22404 deletions(-) diff --git a/third_party/sqlite/sqlite3.c b/third_party/sqlite/sqlite3.c index 38137315..ce4f343f 100644 --- a/third_party/sqlite/sqlite3.c +++ b/third_party/sqlite/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.8.8.2. By combining all the individual C code files into this +** version 3.24.0. By combining all the individual C code files into this ** single large file, the entire code can be compiled as a single translation ** unit. This allows many compilers to do optimizations that would not be ** possible if the files were compiled separately. Performance improvements @@ -9,7 +9,7 @@ ** ** This file is all you need to compile SQLite. To use SQLite in other ** programs, you need this file and the "sqlite3.h" header file that defines -** the programming interface to the SQLite library. (If you do not have +** the programming interface to the SQLite library. (If you do not have ** the "sqlite3.h" header file at hand, you will find a copy embedded within ** the text of this file. Search for "Begin file sqlite3.h" to find the start ** of the embedded sqlite3.h header file.) Additional code files may be needed @@ -22,9 +22,764 @@ #ifndef SQLITE_PRIVATE # define SQLITE_PRIVATE static #endif -#ifndef SQLITE_API -# define SQLITE_API +/************** Begin file ctime.c *******************************************/ +/* +** 2010 February 23 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file implements routines used to report what compile-time options +** SQLite was built with. +*/ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + +/* +** Include the configuration header output by 'configure' if we're using the +** autoconf-based build +*/ +#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H) +#include "config.h" +#define SQLITECONFIG_H 1 #endif + +/* These macros are provided to "stringify" the value of the define +** for those options in which the value is meaningful. */ +#define CTIMEOPT_VAL_(opt) #opt +#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) + +/* +** An array of names of all compile-time options. This array should +** be sorted A-Z. +** +** This array looks large, but in a typical installation actually uses +** only a handful of compile-time options, so most times this array is usually +** rather short and uses little memory space. +*/ +static const char * const sqlite3azCompileOpt[] = { + +/* +** BEGIN CODE GENERATED BY tool/mkctime.tcl +*/ +#if SQLITE_32BIT_ROWID + "32BIT_ROWID", +#endif +#if SQLITE_4_BYTE_ALIGNED_MALLOC + "4_BYTE_ALIGNED_MALLOC", +#endif +#if SQLITE_64BIT_STATS + "64BIT_STATS", +#endif +#if SQLITE_ALLOW_COVERING_INDEX_SCAN + "ALLOW_COVERING_INDEX_SCAN", +#endif +#if SQLITE_ALLOW_URI_AUTHORITY + "ALLOW_URI_AUTHORITY", +#endif +#ifdef SQLITE_BITMASK_TYPE + "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE), +#endif +#if SQLITE_BUG_COMPATIBLE_20160819 + "BUG_COMPATIBLE_20160819", +#endif +#if SQLITE_CASE_SENSITIVE_LIKE + "CASE_SENSITIVE_LIKE", +#endif +#if SQLITE_CHECK_PAGES + "CHECK_PAGES", +#endif +#if defined(__clang__) && defined(__clang_major__) + "COMPILER=clang-" CTIMEOPT_VAL(__clang_major__) "." + CTIMEOPT_VAL(__clang_minor__) "." + CTIMEOPT_VAL(__clang_patchlevel__), +#elif defined(_MSC_VER) + "COMPILER=msvc-" CTIMEOPT_VAL(_MSC_VER), +#elif defined(__GNUC__) && defined(__VERSION__) + "COMPILER=gcc-" __VERSION__, +#endif +#if SQLITE_COVERAGE_TEST + "COVERAGE_TEST", +#endif +#if SQLITE_DEBUG + "DEBUG", +#endif +#if SQLITE_DEFAULT_AUTOMATIC_INDEX + "DEFAULT_AUTOMATIC_INDEX", +#endif +#if SQLITE_DEFAULT_AUTOVACUUM + "DEFAULT_AUTOVACUUM", +#endif +#ifdef SQLITE_DEFAULT_CACHE_SIZE + "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE), +#endif +#if SQLITE_DEFAULT_CKPTFULLFSYNC + "DEFAULT_CKPTFULLFSYNC", +#endif +#ifdef SQLITE_DEFAULT_FILE_FORMAT + "DEFAULT_FILE_FORMAT=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_FORMAT), +#endif +#ifdef SQLITE_DEFAULT_FILE_PERMISSIONS + "DEFAULT_FILE_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_PERMISSIONS), +#endif +#if SQLITE_DEFAULT_FOREIGN_KEYS + "DEFAULT_FOREIGN_KEYS", +#endif +#ifdef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT + "DEFAULT_JOURNAL_SIZE_LIMIT=" CTIMEOPT_VAL(SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT), +#endif +#ifdef SQLITE_DEFAULT_LOCKING_MODE + "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), +#endif +#ifdef SQLITE_DEFAULT_LOOKASIDE + "DEFAULT_LOOKASIDE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOOKASIDE), +#endif +#if SQLITE_DEFAULT_MEMSTATUS + "DEFAULT_MEMSTATUS", +#endif +#ifdef SQLITE_DEFAULT_MMAP_SIZE + "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), +#endif +#ifdef SQLITE_DEFAULT_PAGE_SIZE + "DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_PAGE_SIZE), +#endif +#ifdef SQLITE_DEFAULT_PCACHE_INITSZ + "DEFAULT_PCACHE_INITSZ=" CTIMEOPT_VAL(SQLITE_DEFAULT_PCACHE_INITSZ), +#endif +#ifdef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS + "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS), +#endif +#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS + "DEFAULT_RECURSIVE_TRIGGERS", +#endif +#ifdef SQLITE_DEFAULT_ROWEST + "DEFAULT_ROWEST=" CTIMEOPT_VAL(SQLITE_DEFAULT_ROWEST), +#endif +#ifdef SQLITE_DEFAULT_SECTOR_SIZE + "DEFAULT_SECTOR_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_SECTOR_SIZE), +#endif +#ifdef SQLITE_DEFAULT_SYNCHRONOUS + "DEFAULT_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_SYNCHRONOUS), +#endif +#ifdef SQLITE_DEFAULT_WAL_AUTOCHECKPOINT + "DEFAULT_WAL_AUTOCHECKPOINT=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_AUTOCHECKPOINT), +#endif +#ifdef SQLITE_DEFAULT_WAL_SYNCHRONOUS + "DEFAULT_WAL_SYNCHRONOUS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WAL_SYNCHRONOUS), +#endif +#ifdef SQLITE_DEFAULT_WORKER_THREADS + "DEFAULT_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WORKER_THREADS), +#endif +#if SQLITE_DIRECT_OVERFLOW_READ + "DIRECT_OVERFLOW_READ", +#endif +#if SQLITE_DISABLE_DIRSYNC + "DISABLE_DIRSYNC", +#endif +#if SQLITE_DISABLE_FTS3_UNICODE + "DISABLE_FTS3_UNICODE", +#endif +#if SQLITE_DISABLE_FTS4_DEFERRED + "DISABLE_FTS4_DEFERRED", +#endif +#if SQLITE_DISABLE_INTRINSIC + "DISABLE_INTRINSIC", +#endif +#if SQLITE_DISABLE_LFS + "DISABLE_LFS", +#endif +#if SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS + "DISABLE_PAGECACHE_OVERFLOW_STATS", +#endif +#if SQLITE_DISABLE_SKIPAHEAD_DISTINCT + "DISABLE_SKIPAHEAD_DISTINCT", +#endif +#ifdef SQLITE_ENABLE_8_3_NAMES + "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(SQLITE_ENABLE_8_3_NAMES), +#endif +#if SQLITE_ENABLE_API_ARMOR + "ENABLE_API_ARMOR", +#endif +#if SQLITE_ENABLE_ATOMIC_WRITE + "ENABLE_ATOMIC_WRITE", +#endif +#if SQLITE_ENABLE_BATCH_ATOMIC_WRITE + "ENABLE_BATCH_ATOMIC_WRITE", +#endif +#if SQLITE_ENABLE_CEROD + "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), +#endif +#if SQLITE_ENABLE_COLUMN_METADATA + "ENABLE_COLUMN_METADATA", +#endif +#if SQLITE_ENABLE_COLUMN_USED_MASK + "ENABLE_COLUMN_USED_MASK", +#endif +#if SQLITE_ENABLE_COSTMULT + "ENABLE_COSTMULT", +#endif +#if SQLITE_ENABLE_CURSOR_HINTS + "ENABLE_CURSOR_HINTS", +#endif +#if SQLITE_ENABLE_DBSTAT_VTAB + "ENABLE_DBSTAT_VTAB", +#endif +#if SQLITE_ENABLE_EXPENSIVE_ASSERT + "ENABLE_EXPENSIVE_ASSERT", +#endif +#if SQLITE_ENABLE_FTS1 + "ENABLE_FTS1", +#endif +#if SQLITE_ENABLE_FTS2 + "ENABLE_FTS2", +#endif +#if SQLITE_ENABLE_FTS3 + "ENABLE_FTS3", +#endif +#if SQLITE_ENABLE_FTS3_PARENTHESIS + "ENABLE_FTS3_PARENTHESIS", +#endif +#if SQLITE_ENABLE_FTS3_TOKENIZER + "ENABLE_FTS3_TOKENIZER", +#endif +#if SQLITE_ENABLE_FTS4 + "ENABLE_FTS4", +#endif +#if SQLITE_ENABLE_FTS5 + "ENABLE_FTS5", +#endif +#if SQLITE_ENABLE_HIDDEN_COLUMNS + "ENABLE_HIDDEN_COLUMNS", +#endif +#if SQLITE_ENABLE_ICU + "ENABLE_ICU", +#endif +#if SQLITE_ENABLE_IOTRACE + "ENABLE_IOTRACE", +#endif +#if SQLITE_ENABLE_JSON1 + "ENABLE_JSON1", +#endif +#if SQLITE_ENABLE_LOAD_EXTENSION + "ENABLE_LOAD_EXTENSION", +#endif +#ifdef SQLITE_ENABLE_LOCKING_STYLE + "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), +#endif +#if SQLITE_ENABLE_MEMORY_MANAGEMENT + "ENABLE_MEMORY_MANAGEMENT", +#endif +#if SQLITE_ENABLE_MEMSYS3 + "ENABLE_MEMSYS3", +#endif +#if SQLITE_ENABLE_MEMSYS5 + "ENABLE_MEMSYS5", +#endif +#if SQLITE_ENABLE_MULTIPLEX + "ENABLE_MULTIPLEX", +#endif +#if SQLITE_ENABLE_NULL_TRIM + "ENABLE_NULL_TRIM", +#endif +#if SQLITE_ENABLE_OVERSIZE_CELL_CHECK + "ENABLE_OVERSIZE_CELL_CHECK", +#endif +#if SQLITE_ENABLE_PREUPDATE_HOOK + "ENABLE_PREUPDATE_HOOK", +#endif +#if SQLITE_ENABLE_QPSG + "ENABLE_QPSG", +#endif +#if SQLITE_ENABLE_RBU + "ENABLE_RBU", +#endif +#if SQLITE_ENABLE_RTREE + "ENABLE_RTREE", +#endif +#if SQLITE_ENABLE_SELECTTRACE + "ENABLE_SELECTTRACE", +#endif +#if SQLITE_ENABLE_SESSION + "ENABLE_SESSION", +#endif +#if SQLITE_ENABLE_SNAPSHOT + "ENABLE_SNAPSHOT", +#endif +#if SQLITE_ENABLE_SORTER_REFERENCES + "ENABLE_SORTER_REFERENCES", +#endif +#if SQLITE_ENABLE_SQLLOG + "ENABLE_SQLLOG", +#endif +#if defined(SQLITE_ENABLE_STAT4) + "ENABLE_STAT4", +#elif defined(SQLITE_ENABLE_STAT3) + "ENABLE_STAT3", +#endif +#if SQLITE_ENABLE_STMTVTAB + "ENABLE_STMTVTAB", +#endif +#if SQLITE_ENABLE_STMT_SCANSTATUS + "ENABLE_STMT_SCANSTATUS", +#endif +#if SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + "ENABLE_UNKNOWN_SQL_FUNCTION", +#endif +#if SQLITE_ENABLE_UNLOCK_NOTIFY + "ENABLE_UNLOCK_NOTIFY", +#endif +#if SQLITE_ENABLE_UPDATE_DELETE_LIMIT + "ENABLE_UPDATE_DELETE_LIMIT", +#endif +#if SQLITE_ENABLE_URI_00_ERROR + "ENABLE_URI_00_ERROR", +#endif +#if SQLITE_ENABLE_VFSTRACE + "ENABLE_VFSTRACE", +#endif +#if SQLITE_ENABLE_WHERETRACE + "ENABLE_WHERETRACE", +#endif +#if SQLITE_ENABLE_ZIPVFS + "ENABLE_ZIPVFS", +#endif +#if SQLITE_EXPLAIN_ESTIMATED_ROWS + "EXPLAIN_ESTIMATED_ROWS", +#endif +#if SQLITE_EXTRA_IFNULLROW + "EXTRA_IFNULLROW", +#endif +#ifdef SQLITE_EXTRA_INIT + "EXTRA_INIT=" CTIMEOPT_VAL(SQLITE_EXTRA_INIT), +#endif +#ifdef SQLITE_EXTRA_SHUTDOWN + "EXTRA_SHUTDOWN=" CTIMEOPT_VAL(SQLITE_EXTRA_SHUTDOWN), +#endif +#ifdef SQLITE_FTS3_MAX_EXPR_DEPTH + "FTS3_MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_FTS3_MAX_EXPR_DEPTH), +#endif +#if SQLITE_FTS5_ENABLE_TEST_MI + "FTS5_ENABLE_TEST_MI", +#endif +#if SQLITE_FTS5_NO_WITHOUT_ROWID + "FTS5_NO_WITHOUT_ROWID", +#endif +#if SQLITE_HAS_CODEC + "HAS_CODEC", +#endif +#if HAVE_ISNAN || SQLITE_HAVE_ISNAN + "HAVE_ISNAN", +#endif +#if SQLITE_HOMEGROWN_RECURSIVE_MUTEX + "HOMEGROWN_RECURSIVE_MUTEX", +#endif +#if SQLITE_IGNORE_AFP_LOCK_ERRORS + "IGNORE_AFP_LOCK_ERRORS", +#endif +#if SQLITE_IGNORE_FLOCK_LOCK_ERRORS + "IGNORE_FLOCK_LOCK_ERRORS", +#endif +#if SQLITE_INLINE_MEMCPY + "INLINE_MEMCPY", +#endif +#if SQLITE_INT64_TYPE + "INT64_TYPE", +#endif +#ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX + "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(SQLITE_INTEGRITY_CHECK_ERROR_MAX), +#endif +#if SQLITE_LIKE_DOESNT_MATCH_BLOBS + "LIKE_DOESNT_MATCH_BLOBS", +#endif +#if SQLITE_LOCK_TRACE + "LOCK_TRACE", +#endif +#if SQLITE_LOG_CACHE_SPILL + "LOG_CACHE_SPILL", +#endif +#ifdef SQLITE_MALLOC_SOFT_LIMIT + "MALLOC_SOFT_LIMIT=" CTIMEOPT_VAL(SQLITE_MALLOC_SOFT_LIMIT), +#endif +#ifdef SQLITE_MAX_ATTACHED + "MAX_ATTACHED=" CTIMEOPT_VAL(SQLITE_MAX_ATTACHED), +#endif +#ifdef SQLITE_MAX_COLUMN + "MAX_COLUMN=" CTIMEOPT_VAL(SQLITE_MAX_COLUMN), +#endif +#ifdef SQLITE_MAX_COMPOUND_SELECT + "MAX_COMPOUND_SELECT=" CTIMEOPT_VAL(SQLITE_MAX_COMPOUND_SELECT), +#endif +#ifdef SQLITE_MAX_DEFAULT_PAGE_SIZE + "MAX_DEFAULT_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_DEFAULT_PAGE_SIZE), +#endif +#ifdef SQLITE_MAX_EXPR_DEPTH + "MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_EXPR_DEPTH), +#endif +#ifdef SQLITE_MAX_FUNCTION_ARG + "MAX_FUNCTION_ARG=" CTIMEOPT_VAL(SQLITE_MAX_FUNCTION_ARG), +#endif +#ifdef SQLITE_MAX_LENGTH + "MAX_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LENGTH), +#endif +#ifdef SQLITE_MAX_LIKE_PATTERN_LENGTH + "MAX_LIKE_PATTERN_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_LIKE_PATTERN_LENGTH), +#endif +#ifdef SQLITE_MAX_MEMORY + "MAX_MEMORY=" CTIMEOPT_VAL(SQLITE_MAX_MEMORY), +#endif +#ifdef SQLITE_MAX_MMAP_SIZE + "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE), +#endif +#ifdef SQLITE_MAX_MMAP_SIZE_ + "MAX_MMAP_SIZE_=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE_), +#endif +#ifdef SQLITE_MAX_PAGE_COUNT + "MAX_PAGE_COUNT=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_COUNT), +#endif +#ifdef SQLITE_MAX_PAGE_SIZE + "MAX_PAGE_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_PAGE_SIZE), +#endif +#ifdef SQLITE_MAX_SCHEMA_RETRY + "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY), +#endif +#ifdef SQLITE_MAX_SQL_LENGTH + "MAX_SQL_LENGTH=" CTIMEOPT_VAL(SQLITE_MAX_SQL_LENGTH), +#endif +#ifdef SQLITE_MAX_TRIGGER_DEPTH + "MAX_TRIGGER_DEPTH=" CTIMEOPT_VAL(SQLITE_MAX_TRIGGER_DEPTH), +#endif +#ifdef SQLITE_MAX_VARIABLE_NUMBER + "MAX_VARIABLE_NUMBER=" CTIMEOPT_VAL(SQLITE_MAX_VARIABLE_NUMBER), +#endif +#ifdef SQLITE_MAX_VDBE_OP + "MAX_VDBE_OP=" CTIMEOPT_VAL(SQLITE_MAX_VDBE_OP), +#endif +#ifdef SQLITE_MAX_WORKER_THREADS + "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS), +#endif +#if SQLITE_MEMDEBUG + "MEMDEBUG", +#endif +#if SQLITE_MIXED_ENDIAN_64BIT_FLOAT + "MIXED_ENDIAN_64BIT_FLOAT", +#endif +#if SQLITE_MMAP_READWRITE + "MMAP_READWRITE", +#endif +#if SQLITE_MUTEX_NOOP + "MUTEX_NOOP", +#endif +#if SQLITE_MUTEX_NREF + "MUTEX_NREF", +#endif +#if SQLITE_MUTEX_OMIT + "MUTEX_OMIT", +#endif +#if SQLITE_MUTEX_PTHREADS + "MUTEX_PTHREADS", +#endif +#if SQLITE_MUTEX_W32 + "MUTEX_W32", +#endif +#if SQLITE_NEED_ERR_NAME + "NEED_ERR_NAME", +#endif +#if SQLITE_NOINLINE + "NOINLINE", +#endif +#if SQLITE_NO_SYNC + "NO_SYNC", +#endif +#if SQLITE_OMIT_ALTERTABLE + "OMIT_ALTERTABLE", +#endif +#if SQLITE_OMIT_ANALYZE + "OMIT_ANALYZE", +#endif +#if SQLITE_OMIT_ATTACH + "OMIT_ATTACH", +#endif +#if SQLITE_OMIT_AUTHORIZATION + "OMIT_AUTHORIZATION", +#endif +#if SQLITE_OMIT_AUTOINCREMENT + "OMIT_AUTOINCREMENT", +#endif +#if SQLITE_OMIT_AUTOINIT + "OMIT_AUTOINIT", +#endif +#if SQLITE_OMIT_AUTOMATIC_INDEX + "OMIT_AUTOMATIC_INDEX", +#endif +#if SQLITE_OMIT_AUTORESET + "OMIT_AUTORESET", +#endif +#if SQLITE_OMIT_AUTOVACUUM + "OMIT_AUTOVACUUM", +#endif +#if SQLITE_OMIT_BETWEEN_OPTIMIZATION + "OMIT_BETWEEN_OPTIMIZATION", +#endif +#if SQLITE_OMIT_BLOB_LITERAL + "OMIT_BLOB_LITERAL", +#endif +#if SQLITE_OMIT_BTREECOUNT + "OMIT_BTREECOUNT", +#endif +#if SQLITE_OMIT_CAST + "OMIT_CAST", +#endif +#if SQLITE_OMIT_CHECK + "OMIT_CHECK", +#endif +#if SQLITE_OMIT_COMPLETE + "OMIT_COMPLETE", +#endif +#if SQLITE_OMIT_COMPOUND_SELECT + "OMIT_COMPOUND_SELECT", +#endif +#if SQLITE_OMIT_CONFLICT_CLAUSE + "OMIT_CONFLICT_CLAUSE", +#endif +#if SQLITE_OMIT_CTE + "OMIT_CTE", +#endif +#if SQLITE_OMIT_DATETIME_FUNCS + "OMIT_DATETIME_FUNCS", +#endif +#if SQLITE_OMIT_DECLTYPE + "OMIT_DECLTYPE", +#endif +#if SQLITE_OMIT_DEPRECATED + "OMIT_DEPRECATED", +#endif +#if SQLITE_OMIT_DISKIO + "OMIT_DISKIO", +#endif +#if SQLITE_OMIT_EXPLAIN + "OMIT_EXPLAIN", +#endif +#if SQLITE_OMIT_FLAG_PRAGMAS + "OMIT_FLAG_PRAGMAS", +#endif +#if SQLITE_OMIT_FLOATING_POINT + "OMIT_FLOATING_POINT", +#endif +#if SQLITE_OMIT_FOREIGN_KEY + "OMIT_FOREIGN_KEY", +#endif +#if SQLITE_OMIT_GET_TABLE + "OMIT_GET_TABLE", +#endif +#if SQLITE_OMIT_HEX_INTEGER + "OMIT_HEX_INTEGER", +#endif +#if SQLITE_OMIT_INCRBLOB + "OMIT_INCRBLOB", +#endif +#if SQLITE_OMIT_INTEGRITY_CHECK + "OMIT_INTEGRITY_CHECK", +#endif +#if SQLITE_OMIT_LIKE_OPTIMIZATION + "OMIT_LIKE_OPTIMIZATION", +#endif +#if SQLITE_OMIT_LOAD_EXTENSION + "OMIT_LOAD_EXTENSION", +#endif +#if SQLITE_OMIT_LOCALTIME + "OMIT_LOCALTIME", +#endif +#if SQLITE_OMIT_LOOKASIDE + "OMIT_LOOKASIDE", +#endif +#if SQLITE_OMIT_MEMORYDB + "OMIT_MEMORYDB", +#endif +#if SQLITE_OMIT_OR_OPTIMIZATION + "OMIT_OR_OPTIMIZATION", +#endif +#if SQLITE_OMIT_PAGER_PRAGMAS + "OMIT_PAGER_PRAGMAS", +#endif +#if SQLITE_OMIT_PARSER_TRACE + "OMIT_PARSER_TRACE", +#endif +#if SQLITE_OMIT_POPEN + "OMIT_POPEN", +#endif +#if SQLITE_OMIT_PRAGMA + "OMIT_PRAGMA", +#endif +#if SQLITE_OMIT_PROGRESS_CALLBACK + "OMIT_PROGRESS_CALLBACK", +#endif +#if SQLITE_OMIT_QUICKBALANCE + "OMIT_QUICKBALANCE", +#endif +#if SQLITE_OMIT_REINDEX + "OMIT_REINDEX", +#endif +#if SQLITE_OMIT_SCHEMA_PRAGMAS + "OMIT_SCHEMA_PRAGMAS", +#endif +#if SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS + "OMIT_SCHEMA_VERSION_PRAGMAS", +#endif +#if SQLITE_OMIT_SHARED_CACHE + "OMIT_SHARED_CACHE", +#endif +#if SQLITE_OMIT_SHUTDOWN_DIRECTORIES + "OMIT_SHUTDOWN_DIRECTORIES", +#endif +#if SQLITE_OMIT_SUBQUERY + "OMIT_SUBQUERY", +#endif +#if SQLITE_OMIT_TCL_VARIABLE + "OMIT_TCL_VARIABLE", +#endif +#if SQLITE_OMIT_TEMPDB + "OMIT_TEMPDB", +#endif +#if SQLITE_OMIT_TEST_CONTROL + "OMIT_TEST_CONTROL", +#endif +#if SQLITE_OMIT_TRACE + "OMIT_TRACE", +#endif +#if SQLITE_OMIT_TRIGGER + "OMIT_TRIGGER", +#endif +#if SQLITE_OMIT_TRUNCATE_OPTIMIZATION + "OMIT_TRUNCATE_OPTIMIZATION", +#endif +#if SQLITE_OMIT_UTF16 + "OMIT_UTF16", +#endif +#if SQLITE_OMIT_VACUUM + "OMIT_VACUUM", +#endif +#if SQLITE_OMIT_VIEW + "OMIT_VIEW", +#endif +#if SQLITE_OMIT_VIRTUALTABLE + "OMIT_VIRTUALTABLE", +#endif +#if SQLITE_OMIT_WAL + "OMIT_WAL", +#endif +#if SQLITE_OMIT_WSD + "OMIT_WSD", +#endif +#if SQLITE_OMIT_XFER_OPT + "OMIT_XFER_OPT", +#endif +#if SQLITE_PCACHE_SEPARATE_HEADER + "PCACHE_SEPARATE_HEADER", +#endif +#if SQLITE_PERFORMANCE_TRACE + "PERFORMANCE_TRACE", +#endif +#if SQLITE_POWERSAFE_OVERWRITE + "POWERSAFE_OVERWRITE", +#endif +#if SQLITE_PREFER_PROXY_LOCKING + "PREFER_PROXY_LOCKING", +#endif +#if SQLITE_PROXY_DEBUG + "PROXY_DEBUG", +#endif +#if SQLITE_REVERSE_UNORDERED_SELECTS + "REVERSE_UNORDERED_SELECTS", +#endif +#if SQLITE_RTREE_INT_ONLY + "RTREE_INT_ONLY", +#endif +#if SQLITE_SECURE_DELETE + "SECURE_DELETE", +#endif +#if SQLITE_SMALL_STACK + "SMALL_STACK", +#endif +#ifdef SQLITE_SORTER_PMASZ + "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ), +#endif +#if SQLITE_SOUNDEX + "SOUNDEX", +#endif +#ifdef SQLITE_STAT4_SAMPLES + "STAT4_SAMPLES=" CTIMEOPT_VAL(SQLITE_STAT4_SAMPLES), +#endif +#ifdef SQLITE_STMTJRNL_SPILL + "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL), +#endif +#if SQLITE_SUBSTR_COMPATIBILITY + "SUBSTR_COMPATIBILITY", +#endif +#if SQLITE_SYSTEM_MALLOC + "SYSTEM_MALLOC", +#endif +#if SQLITE_TCL + "TCL", +#endif +#ifdef SQLITE_TEMP_STORE + "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), +#endif +#if SQLITE_TEST + "TEST", +#endif +#if defined(SQLITE_THREADSAFE) + "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), +#elif defined(THREADSAFE) + "THREADSAFE=" CTIMEOPT_VAL(THREADSAFE), +#else + "THREADSAFE=1", +#endif +#if SQLITE_UNLINK_AFTER_CLOSE + "UNLINK_AFTER_CLOSE", +#endif +#if SQLITE_UNTESTABLE + "UNTESTABLE", +#endif +#if SQLITE_USER_AUTHENTICATION + "USER_AUTHENTICATION", +#endif +#if SQLITE_USE_ALLOCA + "USE_ALLOCA", +#endif +#if SQLITE_USE_FCNTL_TRACE + "USE_FCNTL_TRACE", +#endif +#if SQLITE_USE_URI + "USE_URI", +#endif +#if SQLITE_VDBE_COVERAGE + "VDBE_COVERAGE", +#endif +#if SQLITE_WIN32_MALLOC + "WIN32_MALLOC", +#endif +#if SQLITE_ZERO_MALLOC + "ZERO_MALLOC", +#endif +/* +** END CODE GENERATED BY tool/mkctime.tcl +*/ +}; + +SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt){ + *pnOpt = sizeof(sqlite3azCompileOpt) / sizeof(sqlite3azCompileOpt[0]); + return (const char**)sqlite3azCompileOpt; +} + +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + +/************** End of ctime.c ***********************************************/ /************** Begin file sqliteInt.h ***************************************/ /* ** 2001 September 15 @@ -40,8 +795,43 @@ ** Internal interface definitions for SQLite. ** */ -#ifndef _SQLITEINT_H_ -#define _SQLITEINT_H_ +#ifndef SQLITEINT_H +#define SQLITEINT_H + +/* Special Comments: +** +** Some comments have special meaning to the tools that measure test +** coverage: +** +** NO_TEST - The branches on this line are not +** measured by branch coverage. This is +** used on lines of code that actually +** implement parts of coverage testing. +** +** OPTIMIZATION-IF-TRUE - This branch is allowed to alway be false +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** OPTIMIZATION-IF-FALSE - This branch is allowed to alway be true +** and the correct answer is still obtained, +** though perhaps more slowly. +** +** PREVENTS-HARMLESS-OVERREAD - This branch prevents a buffer overread +** that would be harmless and undetectable +** if it did occur. +** +** In all cases, the special comment must be enclosed in the usual +** slash-asterisk...asterisk-slash comment marks, with no spaces between the +** asterisks and the comment text. +*/ + +/* +** Make sure the Tcl calling convention macro is defined. This macro is +** only used by test code and Tcl integration code. +*/ +#ifndef SQLITE_TCLAPI +# define SQLITE_TCLAPI +#endif /* ** Include the header file used to customize the compiler options for MSVC. @@ -65,14 +855,15 @@ ** ** This file contains code that is specific to MSVC. */ -#ifndef _MSVC_H_ -#define _MSVC_H_ +#ifndef SQLITE_MSVC_H +#define SQLITE_MSVC_H #if defined(_MSC_VER) #pragma warning(disable : 4054) #pragma warning(disable : 4055) #pragma warning(disable : 4100) #pragma warning(disable : 4127) +#pragma warning(disable : 4130) #pragma warning(disable : 4152) #pragma warning(disable : 4189) #pragma warning(disable : 4206) @@ -85,11 +876,52 @@ #pragma warning(disable : 4706) #endif /* defined(_MSC_VER) */ -#endif /* _MSVC_H_ */ +#endif /* SQLITE_MSVC_H */ /************** End of msvc.h ************************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ +/* +** Special setup for VxWorks +*/ +/************** Include vxworks.h in the middle of sqliteInt.h ***************/ +/************** Begin file vxworks.h *****************************************/ +/* +** 2015-03-02 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains code that is specific to Wind River's VxWorks +*/ +#if defined(__RTP__) || defined(_WRS_KERNEL) +/* This is VxWorks. Set up things specially for that OS +*/ +#include <vxWorks.h> +#include <pthread.h> /* amalgamator: dontcache */ +#define OS_VXWORKS 1 +#define SQLITE_OS_OTHER 0 +#define SQLITE_HOMEGROWN_RECURSIVE_MUTEX 1 +#define SQLITE_OMIT_LOAD_EXTENSION 1 +#define SQLITE_ENABLE_LOCKING_STYLE 0 +#define HAVE_UTIME 1 +#else +/* This is not VxWorks. */ +#define OS_VXWORKS 0 +#define HAVE_FCHOWN 1 +#define HAVE_READLINK 1 +#define HAVE_LSTAT 1 +#endif /* defined(_WRS_KERNEL) */ + +/************** End of vxworks.h *********************************************/ +/************** Continuing where we left off in sqliteInt.h ******************/ + /* ** These #defines should enable >2GB file support on POSIX if the ** underlying operating system supports it. If the OS lacks @@ -122,6 +954,30 @@ # define _LARGEFILE_SOURCE 1 #endif +/* The GCC_VERSION and MSVC_VERSION macros are used to +** conditionally include optimizations for each of these compilers. A +** value of 0 means that compiler is not being used. The +** SQLITE_DISABLE_INTRINSIC macro means do not use any compiler-specific +** optimizations, and hence set all compiler macros to 0 +** +** There was once also a CLANG_VERSION macro. However, we learn that the +** version numbers in clang are for "marketing" only and are inconsistent +** and unreliable. Fortunately, all versions of clang also recognize the +** gcc version numbers and have reasonable settings for gcc version numbers, +** so the GCC_VERSION macro will be set to a correct non-zero value even +** when compiling with clang. +*/ +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif + /* Needed for various definitions... */ #if defined(__GNUC__) && !defined(_GNU_SOURCE) # define _GNU_SOURCE @@ -170,7 +1026,7 @@ /************** Include sqlite3.h in the middle of sqliteInt.h ***************/ /************** Begin file sqlite3.h *****************************************/ /* -** 2001 September 15 +** 2001-09-15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -194,15 +1050,15 @@ ** ** The official C-language API documentation for SQLite is derived ** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. +** on how SQLite interfaces are supposed to operate. ** ** The name of this file under configuration management is "sqlite.h.in". ** The makefile makes some minor changes to this file (such as inserting ** the version number) and changes its name to "sqlite3.h" as ** part of the build process. */ -#ifndef _SQLITE3_H_ -#define _SQLITE3_H_ +#ifndef SQLITE3_H +#define SQLITE3_H #include <stdarg.h> /* Needed for the definition of va_list */ /* @@ -214,16 +1070,29 @@ extern "C" { /* -** Add the ability to override 'extern' +** Provide the ability to override linkage features of the interface. */ #ifndef SQLITE_EXTERN # define SQLITE_EXTERN extern #endif - #ifndef SQLITE_API # define SQLITE_API #endif - +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif /* ** These no-op macros are used in front of interfaces to mark those @@ -266,37 +1135,40 @@ extern "C" { ** be held constant and Z will be incremented or else Y will be incremented ** and Z will be reset to zero. ** -** Since version 3.6.18, SQLite source code has been stored in the +** Since [version 3.6.18] ([dateof:3.6.18]), +** SQLite source code has been stored in the ** <a href="http://www.fossil-scm.org/">Fossil configuration management ** system</a>. ^The SQLITE_SOURCE_ID macro evaluates to ** a string which identifies a particular check-in of SQLite ** within its configuration management system. ^The SQLITE_SOURCE_ID -** string contains the date and time of the check-in (UTC) and an SHA1 -** hash of the entire source tree. +** string contains the date and time of the check-in (UTC) and a SHA1 +** or SHA3-256 hash of the entire source tree. If the source code has +** been edited in any way since it was last checked in, then the last +** four hexadecimal digits of the hash may be modified. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.8.8.2" -#define SQLITE_VERSION_NUMBER 3008008 -#define SQLITE_SOURCE_ID "2015-01-30 14:30:45 7757fc721220e136620a89c9d28247f28bbbc098" +#define SQLITE_VERSION "3.24.0" +#define SQLITE_VERSION_NUMBER 3024000 +#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca" /* ** CAPI3REF: Run-Time Library Version Numbers -** KEYWORDS: sqlite3_version, sqlite3_sourceid +** KEYWORDS: sqlite3_version sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros ** but are associated with the library instead of the header file. ^(Cautious ** programmers might include assert() statements in their application to ** verify that values returned by these interfaces match the macros in -** the header, and thus insure that the application is +** the header, and thus ensure that the application is ** compiled with matching library and header files. ** ** <blockquote><pre> ** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER ); -** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 ); +** assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 ); ** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 ); ** </pre></blockquote>)^ ** @@ -306,9 +1178,11 @@ extern "C" { ** function is provided for use in DLLs since DLL users usually do not have ** direct access to string constants within the DLL. ^The ** sqlite3_libversion_number() function returns an integer equal to -** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns +** [SQLITE_VERSION_NUMBER]. ^(The sqlite3_sourceid() function returns ** a pointer to a string constant whose value is the same as the -** [SQLITE_SOURCE_ID] C preprocessor macro. +** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built +** using an edited copy of [the amalgamation], then the last four characters +** of the hash might be different from [SQLITE_SOURCE_ID].)^ ** ** See also: [sqlite_version()] and [sqlite_source_id()]. */ @@ -416,7 +1290,11 @@ typedef struct sqlite3 sqlite3; */ #ifdef SQLITE_INT64_TYPE typedef SQLITE_INT64_TYPE sqlite_int64; - typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# ifdef SQLITE_UINT64_TYPE + typedef SQLITE_UINT64_TYPE sqlite_uint64; +# else + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# endif #elif defined(_MSC_VER) || defined(__BORLANDC__) typedef __int64 sqlite_int64; typedef unsigned __int64 sqlite_uint64; @@ -437,6 +1315,7 @@ typedef sqlite_uint64 sqlite3_uint64; /* ** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 ** ** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors ** for the [sqlite3] object. @@ -488,6 +1367,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); /* ** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 ** ** The sqlite3_exec() interface is a convenience wrapper around ** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], @@ -512,7 +1392,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** from [sqlite3_malloc()] and passed back through the 5th parameter. ** To avoid memory leaks, the application should invoke [sqlite3_free()] ** on error message strings returned through the 5th parameter of -** of sqlite3_exec() after the error message string is no longer needed. +** sqlite3_exec() after the error message string is no longer needed. ** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors ** occur, then sqlite3_exec() sets the pointer in its 5th parameter to ** NULL before returning. @@ -539,7 +1419,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** Restrictions: ** ** <ul> -** <li> The application must insure that the 1st parameter to sqlite3_exec() +** <li> The application must ensure that the 1st parameter to sqlite3_exec() ** is a valid and open [database connection]. ** <li> The application must not close the [database connection] specified by ** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. @@ -568,7 +1448,7 @@ SQLITE_API int sqlite3_exec( */ #define SQLITE_OK 0 /* Successful result */ /* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_ERROR 1 /* Generic error */ #define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ #define SQLITE_PERM 3 /* Access permission denied */ #define SQLITE_ABORT 4 /* Callback routine requested an abort */ @@ -583,7 +1463,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_FULL 13 /* Insertion failed because database is full */ #define SQLITE_CANTOPEN 14 /* Unable to open the database file */ #define SQLITE_PROTOCOL 15 /* Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_EMPTY 16 /* Internal use only */ #define SQLITE_SCHEMA 17 /* The database schema changed */ #define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ #define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ @@ -591,7 +1471,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_MISUSE 21 /* Library used incorrectly */ #define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ #define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_FORMAT 24 /* Not used */ #define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ #define SQLITE_NOTADB 26 /* File opened that is not a database file */ #define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ @@ -608,7 +1488,8 @@ SQLITE_API int sqlite3_exec( ** [result codes]. However, experience has shown that many of ** these result codes are too coarse-grained. They do not provide as ** much information about problems as programmers might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include ** support for additional result codes that provide more detailed information ** about errors. These [extended result codes] are enabled or disabled ** on a per database connection basis using the @@ -616,6 +1497,8 @@ SQLITE_API int sqlite3_exec( ** the most recent error can be obtained using ** [sqlite3_extended_errcode()]. */ +#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) +#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) #define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) #define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) #define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) @@ -642,7 +1525,13 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) +#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) +#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) @@ -650,10 +1539,13 @@ SQLITE_API int sqlite3_exec( #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) #define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) +#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) #define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) #define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) @@ -669,6 +1561,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) #define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) #define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) /* ** CAPI3REF: Flags For File Open Operations @@ -723,10 +1616,15 @@ SQLITE_API int sqlite3_exec( ** file that were written at the application level might have changed ** and that adjacent bytes, even bytes within the same sector are ** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN -** flag indicate that a file cannot be deleted when open. The +** flag indicates that a file cannot be deleted when open. The ** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on ** read-only media and cannot be changed even by processes with ** elevated privileges. +** +** The SQLITE_IOCAP_BATCH_ATOMIC property means that the underlying +** filesystem supports doing multiple write operations atomically when those +** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and +** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -742,6 +1640,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 +#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 /* ** CAPI3REF: File Locking Levels @@ -873,6 +1772,10 @@ struct sqlite3_file { ** <li> [SQLITE_IOCAP_ATOMIC64K] ** <li> [SQLITE_IOCAP_SAFE_APPEND] ** <li> [SQLITE_IOCAP_SEQUENTIAL] +** <li> [SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN] +** <li> [SQLITE_IOCAP_POWERSAFE_OVERWRITE] +** <li> [SQLITE_IOCAP_IMMUTABLE] +** <li> [SQLITE_IOCAP_BATCH_ATOMIC] ** </ul> ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of @@ -927,14 +1830,16 @@ struct sqlite3_io_methods { ** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] ** interface. ** +** <ul> +** <li>[[SQLITE_FCNTL_LOCKSTATE]] ** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This ** opcode causes the xFileControl method to write the current state of ** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], ** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) ** into an integer that the pArg argument points to. This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -** <ul> +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** ** <li>[[SQLITE_FCNTL_SIZE_HINT]] ** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS ** layer a hint of how large the database file will grow to be during the @@ -955,8 +1860,13 @@ struct sqlite3_io_methods { ** <li>[[SQLITE_FCNTL_FILE_POINTER]] ** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer ** to the [sqlite3_file] object associated with a particular database -** connection. See the [sqlite3_file_control()] documentation for -** additional information. +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +** <li>[[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. ** ** <li>[[SQLITE_FCNTL_SYNC_OMITTED]] ** No longer in use. @@ -994,7 +1904,7 @@ struct sqlite3_io_methods { ** opcode allows these two values (10 retries and 25 milliseconds of delay) ** to be adjusted. The values are changed for all database connections ** within the same process. The argument is a pointer to an array of two -** integers where the first integer i the new retry count and the second +** integers where the first integer is the new retry count and the second ** integer is the delay. If either integer is negative, then the setting ** is not changed but instead the prior value of that setting is written ** into the array entry, allowing the current retry settings to be @@ -1043,6 +1953,15 @@ struct sqlite3_io_methods { ** pointer in case this file-control is not implemented. This file-control ** is intended for diagnostic use only. ** +** <li>[[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** ** <li>[[SQLITE_FCNTL_PRAGMA]] ** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] ** file control is sent to the open [sqlite3_file] object corresponding @@ -1059,7 +1978,9 @@ struct sqlite3_io_methods { ** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] ** file control returns [SQLITE_OK], then the parser assumes that the ** VFS has handled the PRAGMA itself and the parser generates a no-op -** prepared statement. ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns ** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means ** that the VFS encountered an error while handling the [PRAGMA] and the ** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] @@ -1111,18 +2032,79 @@ struct sqlite3_io_methods { ** on whether or not the file has been renamed, moved, or deleted since it ** was first opened. ** +** <li>[[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** ** <li>[[SQLITE_FCNTL_WIN32_SET_HANDLE]] ** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This ** opcode causes the xFileControl method to swap the file handle with the one ** pointed to by the pArg argument. This capability is used during testing ** and only needs to be supported when SQLITE_TEST is defined. ** +** <li>[[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should <em>not</em> use this file-control. +** +** <li>[[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +** <li>[[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +** +** <li>[[SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]] +** If the [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] opcode returns SQLITE_OK, then +** the file descriptor is placed in "batch write mode", which +** means all subsequent write operations will be deferred and done +** atomically at the next [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. Systems +** that do not support batch atomic writes will return SQLITE_NOTFOUND. +** ^Following a successful SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and prior to +** the closing [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] or +** [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE], SQLite will make +** no VFS interface calls on the same [sqlite3_file] file descriptor +** except for calls to the xWrite method and the xFileControl method +** with [SQLITE_FCNTL_SIZE_HINT]. +** +** <li>[[SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be performed atomically. +** This file control returns [SQLITE_OK] if and only if the writes were +** all performed successfully and have been committed to persistent storage. +** ^Regardless of whether or not it is successful, this file control takes +** the file descriptor out of batch write mode so that all subsequent +** write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_COMMIT_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +** <li>[[SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. +** ^This file control takes the file descriptor out of batch write mode +** so that all subsequent write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]] +** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain +** a file lock using the xLock or xShmLock methods of the VFS to wait +** for up to M milliseconds before failing, where M is the single +** unsigned integer parameter. ** </ul> */ #define SQLITE_FCNTL_LOCKSTATE 1 -#define SQLITE_GET_LOCKPROXYFILE 2 -#define SQLITE_SET_LOCKPROXYFILE 3 -#define SQLITE_LAST_ERRNO 4 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 #define SQLITE_FCNTL_SIZE_HINT 5 #define SQLITE_FCNTL_CHUNK_SIZE 6 #define SQLITE_FCNTL_FILE_POINTER 7 @@ -1141,6 +2123,23 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_SYNC 21 #define SQLITE_FCNTL_COMMIT_PHASETWO 22 #define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 +#define SQLITE_FCNTL_PDB 30 +#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 +#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 +#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 +#define SQLITE_FCNTL_LOCK_TIMEOUT 34 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + /* ** CAPI3REF: Mutex Handle @@ -1154,6 +2153,16 @@ struct sqlite3_io_methods { */ typedef struct sqlite3_mutex sqlite3_mutex; +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + /* ** CAPI3REF: OS Interface Object ** @@ -1162,12 +2171,18 @@ typedef struct sqlite3_mutex sqlite3_mutex; ** in the name of the object stands for "virtual file system". See ** the [VFS | VFS documentation] for further information. ** -** The value of the iVersion field is initially 1 but may be larger in -** future versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. Note that the structure -** of the sqlite3_vfs object changes in the transaction between -** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not -** modified. +** The VFS interface is sometimes extended by adding new methods onto +** the end. Each time such an extension occurs, the iVersion field +** is incremented. The iVersion value started out as 1 in +** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2 +** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased +** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields +** may be appended to the sqlite3_vfs object and the iVersion value +** may increase again in future versions of SQLite. +** Note that the structure +** of the sqlite3_vfs object changes in the transition from +** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] +** and yet the iVersion field was not modified. ** ** The szOsFile field is the size of the subclassed [sqlite3_file] ** structure used by this VFS. mxPathname is the maximum length of @@ -1347,7 +2362,7 @@ struct sqlite3_vfs { const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); /* ** The methods above are in versions 1 through 3 of the sqlite_vfs object. - ** New fields may be appended in figure versions. The iVersion + ** New fields may be appended in future versions. The iVersion ** value will increment whenever this happens. */ }; @@ -1503,9 +2518,11 @@ SQLITE_API int sqlite3_os_end(void); ** applications and so this routine is usually not necessary. It is ** provided to support rare applications with unusual needs. ** -** The sqlite3_config() interface is not threadsafe. The application -** must insure that no other SQLite interfaces are invoked by other -** threads while sqlite3_config() is running. Furthermore, sqlite3_config() +** <b>The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running.</b> +** +** The sqlite3_config() interface ** may only be invoked prior to library initialization using ** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. ** ^If sqlite3_config() is called after [sqlite3_initialize()] and before @@ -1527,6 +2544,7 @@ SQLITE_API int sqlite3_config(int, ...); /* ** CAPI3REF: Configure database connections +** METHOD: sqlite3 ** ** The sqlite3_db_config() interface is used to make configuration ** changes to a [database connection]. The interface is similar to @@ -1692,6 +2710,16 @@ struct sqlite3_mem_methods { ** routines with a wrapper that simulations memory allocation failure or ** tracks memory usage, for example. </dd> ** +** [[SQLITE_CONFIG_SMALL_MALLOC]] <dt>SQLITE_CONFIG_SMALL_MALLOC</dt> +** <dd> ^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +** type int, interpreted as a boolean, which if true provides a hint to +** SQLite that it should avoid large memory allocations if possible. +** SQLite will run faster if it is free to make large memory allocations, +** but some application might prefer to run slower in exchange for +** guarantees about memory fragmentation that are possible if large +** allocations are avoided. This hint is normally off. +** </dd> +** ** [[SQLITE_CONFIG_MEMSTATUS]] <dt>SQLITE_CONFIG_MEMSTATUS</dt> ** <dd> ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, ** interpreted as a boolean, which enables or disables the collection of @@ -1701,7 +2729,7 @@ struct sqlite3_mem_methods { ** <li> [sqlite3_memory_used()] ** <li> [sqlite3_memory_highwater()] ** <li> [sqlite3_soft_heap_limit64()] -** <li> [sqlite3_status()] +** <li> [sqlite3_status64()] ** </ul>)^ ** ^Memory allocation statistics are enabled by default unless SQLite is ** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory @@ -1709,57 +2737,43 @@ struct sqlite3_mem_methods { ** </dd> ** ** [[SQLITE_CONFIG_SCRATCH]] <dt>SQLITE_CONFIG_SCRATCH</dt> -** <dd> ^The SQLITE_CONFIG_SCRATCH option specifies a static memory buffer -** that SQLite can use for scratch memory. ^(There are three arguments -** to SQLITE_CONFIG_SCRATCH: A pointer an 8-byte -** aligned memory buffer from which the scratch allocations will be -** drawn, the size of each scratch allocation (sz), -** and the maximum number of scratch allocations (N).)^ -** The first argument must be a pointer to an 8-byte aligned buffer -** of at least sz*N bytes of memory. -** ^SQLite will not use more than one scratch buffers per thread. -** ^SQLite will never request a scratch buffer that is more than 6 -** times the database page size. -** ^If SQLite needs needs additional -** scratch memory beyond what is provided by this configuration option, then -** [sqlite3_malloc()] will be used to obtain the memory needed.<p> -** ^When the application provides any amount of scratch memory using -** SQLITE_CONFIG_SCRATCH, SQLite avoids unnecessary large -** [sqlite3_malloc|heap allocations]. -** This can help [Robson proof|prevent memory allocation failures] due to heap -** fragmentation in low-memory embedded systems. +** <dd> The SQLITE_CONFIG_SCRATCH option is no longer used. ** </dd> ** ** [[SQLITE_CONFIG_PAGECACHE]] <dt>SQLITE_CONFIG_PAGECACHE</dt> -** <dd> ^The SQLITE_CONFIG_PAGECACHE option specifies a static memory buffer +** <dd> ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool ** that SQLite can use for the database page cache with the default page ** cache implementation. -** This configuration should not be used if an application-define page -** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2] -** configuration option. +** This configuration option is a no-op if an application-define page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. ** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to -** 8-byte aligned -** memory, the size of each page buffer (sz), and the number of pages (N). +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). ** The sz argument should be the size of the largest database page ** (a power of two between 512 and 65536) plus some extra bytes for each ** page header. ^The number of extra bytes needed by the page header -** can be determined using the [SQLITE_CONFIG_PCACHE_HDRSZ] option -** to [sqlite3_config()]. +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. ** ^It is harmless, apart from the wasted memory, -** for the sz parameter to be larger than necessary. The first -** argument should pointer to an 8-byte aligned block of memory that -** is at least sz*N bytes of memory, otherwise subsequent behavior is -** undefined. -** ^SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. ^If additional -** page cache memory is needed beyond what is provided by this option, then -** SQLite goes to [sqlite3_malloc()] for the additional storage space.</dd> +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line. </dd> ** ** [[SQLITE_CONFIG_HEAP]] <dt>SQLITE_CONFIG_HEAP</dt> ** <dd> ^The SQLITE_CONFIG_HEAP option specifies a static memory buffer ** that SQLite will use for all of its dynamic memory allocation needs -** beyond those provided for by [SQLITE_CONFIG_SCRATCH] and -** [SQLITE_CONFIG_PAGECACHE]. +** beyond those provided for by [SQLITE_CONFIG_PAGECACHE]. ** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled ** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns ** [SQLITE_ERROR] if invoked otherwise. @@ -1912,7 +2926,6 @@ struct sqlite3_mem_methods { ** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro ** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value ** that specifies the maximum size of the created heap. -** </dl> ** ** [[SQLITE_CONFIG_PCACHE_HDRSZ]] ** <dt>SQLITE_CONFIG_PCACHE_HDRSZ @@ -1932,6 +2945,36 @@ struct sqlite3_mem_methods { ** is enabled (using the [PRAGMA threads] command) and the amount of content ** to be sorted exceeds the page size times the minimum of the ** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +** <dt>SQLITE_CONFIG_STMTJRNL_SPILL +** <dd>^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +** +** [[SQLITE_CONFIG_SORTERREF_SIZE]] +** <dt>SQLITE_CONFIG_SORTERREF_SIZE +** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter +** of type (int) - the new value of the sorter-reference size threshold. +** Usually, when SQLite uses an external sort to order records according +** to an ORDER BY clause, all fields required by the caller are present in the +** sorted records. However, if SQLite determines based on the declared type +** of a table column that its values are likely to be very large - larger +** than the configured sorter-reference size threshold - then a reference +** is stored in each sorted record and the required column values loaded +** from the database as records are returned in sorted order. The default +** value for this option is to never use this optimization. Specifying a +** negative value for this option restores the default behaviour. +** This option is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. ** </dl> */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -1939,7 +2982,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_SERIALIZED 3 /* nil */ #define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ #define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ #define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ #define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ #define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ @@ -1959,6 +3002,9 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ #define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ #define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ +#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ +#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ /* ** CAPI3REF: Database Connection Configuration Options @@ -2016,15 +3062,117 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the trigger setting is not reported back. </dd> ** +** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt> +** <dd> ^This option is used to enable or disable the two-argument +** version of the [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back. </dd> +** +** <dt>SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION</dt> +** <dd> ^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +** </dd> +** +** <dt>SQLITE_DBCONFIG_MAINDBNAME</dt> +** <dd> ^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +** </dd> +** +** <dt>SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</dt> +** <dd> Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint +** operation before closing the connection. This option may be used to +** override this behaviour. The first parameter passed to this operation +** is an integer - positive to disable checkpoints-on-close, or zero (the +** default) to enable them, and negative to leave the setting unchanged. +** The second parameter is a pointer to an integer +** into which is written 0 or 1 to indicate whether checkpoints-on-close +** have been disabled - 0 if they are not disabled, 1 if they are. +** </dd> +** +** <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt> +** <dd>^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates +** the [query planner stability guarantee] (QPSG). When the QPSG is active, +** a single SQL query statement will always use the same algorithm regardless +** of values of [bound parameters].)^ The QPSG disables some query optimizations +** that look at the values of bound parameters, which can make some queries +** slower. But the QPSG has the advantage of more predictable behavior. With +** the QPSG active, SQLite will always use the same query plan in the field as +** was used during testing in the lab. +** The first argument to this setting is an integer which is 0 to disable +** the QPSG, positive to enable QPSG, or negative to leave the setting +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether the QPSG is disabled or enabled +** following this call. +** </dd> +** +** <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt> +** <dd> By default, the output of EXPLAIN QUERY PLAN commands does not +** include output for any operations performed by trigger programs. This +** option is used to set or clear (the default) a flag that governs this +** behavior. The first parameter passed to this operation is an integer - +** positive to enable output for trigger programs, or zero to disable it, +** or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which is written +** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if +** it is not disabled, 1 if it is. +** </dd> +** +** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt> +** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run +** [VACUUM] in order to reset a database back to an empty database +** with no schema and no content. The following process works even for +** a badly corrupted database file: +** <ol> +** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0); +** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0); +** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0); +** </ol> +** Because resetting a database is destructive and irreversible, the +** process requires the use of this obscure API and multiple steps to help +** ensure that it does not happen by accident. +** </dd> ** </dl> */ -#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ -#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ -#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ - +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ +#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ +#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ +#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 ** ** ^The sqlite3_extended_result_codes() routine enables or disables the ** [extended result codes] feature of SQLite. ^The extended result @@ -2034,6 +3182,7 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); /* ** CAPI3REF: Last Insert Rowid +** METHOD: sqlite3 ** ** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) ** has a unique 64-bit signed @@ -2043,20 +3192,30 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); ** the table has a column of type [INTEGER PRIMARY KEY] then that column ** is another alias for the rowid. ** -** ^The sqlite3_last_insert_rowid(D) interface returns the [rowid] of the -** most recent successful [INSERT] into a rowid table or [virtual table] -** on database connection D. -** ^Inserts into [WITHOUT ROWID] tables are not recorded. -** ^If no successful [INSERT]s into rowid tables -** have ever occurred on the database connection D, -** then sqlite3_last_insert_rowid(D) returns zero. +** ^The sqlite3_last_insert_rowid(D) interface usually returns the [rowid] of +** the most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. ^Inserts into [WITHOUT ROWID] tables are not +** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred +** on the database connection D, then sqlite3_last_insert_rowid(D) returns +** zero. ** -** ^(If an [INSERT] occurs within a trigger or within a [virtual table] -** method, then this routine will return the [rowid] of the inserted -** row as long as the trigger or virtual table method is running. -** But once the trigger or virtual table method ends, the value returned -** by this routine reverts to what it was before the trigger or virtual -** table method began.)^ +** As well as being set automatically as rows are inserted into database +** tables, the value returned by this function may be set explicitly by +** [sqlite3_set_last_insert_rowid()] +** +** Some virtual table implementations may INSERT rows into rowid tables as +** part of committing a transaction (e.g. to flush data accumulated in memory +** to disk). In this case subsequent calls to this function return the rowid +** associated with these internal INSERT operations, which leads to +** unintuitive results. Virtual table implementations that do write to rowid +** tables in this way can avoid this problem by restoring the original +** rowid value using [sqlite3_set_last_insert_rowid()] before returning +** control to the user. +** +** ^(If an [INSERT] occurs within a trigger then this routine will +** return the [rowid] of the inserted row as long as the trigger is +** running. Once the trigger program ends, the value returned +** by this routine reverts to what it was before the trigger was fired.)^ ** ** ^An [INSERT] that fails due to a constraint violation is not a ** successful [INSERT] and does not change the value returned by this @@ -2083,8 +3242,19 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); */ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); +/* +** CAPI3REF: Set the Last Insert Rowid value. +** METHOD: sqlite3 +** +** The sqlite3_set_last_insert_rowid(D, R) method allows the application to +** set the value returned by calling sqlite3_last_insert_rowid(D) to R +** without inserting a row into the database. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); + /* ** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 ** ** ^This function returns the number of rows modified, inserted or ** deleted by the most recently completed INSERT, UPDATE or DELETE @@ -2137,6 +3307,7 @@ SQLITE_API int sqlite3_changes(sqlite3*); /* ** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 ** ** ^This function returns the total number of rows inserted, modified or ** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed @@ -2160,6 +3331,7 @@ SQLITE_API int sqlite3_total_changes(sqlite3*); /* ** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 ** ** ^This function causes any pending database operation to abort and ** return at its earliest opportunity. This routine is typically @@ -2191,9 +3363,6 @@ SQLITE_API int sqlite3_total_changes(sqlite3*); ** ^A call to sqlite3_interrupt(D) that occurs when there are no running ** SQL statements is a no-op and has no effect on SQL statements ** that are started after the sqlite3_interrupt() call returns. -** -** If the database connection closes while [sqlite3_interrupt()] -** is running then bad things will likely happen. */ SQLITE_API void sqlite3_interrupt(sqlite3*); @@ -2236,6 +3405,7 @@ SQLITE_API int sqlite3_complete16(const void *sql); /* ** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors ** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 ** ** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X ** that might be invoked with argument P whenever @@ -2291,10 +3461,11 @@ SQLITE_API int sqlite3_complete16(const void *sql); ** A busy handler must not close the database connection ** or [prepared statement] that invoked the busy handler. */ -SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); +SQLITE_API int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*); /* ** CAPI3REF: Set A Busy Timeout +** METHOD: sqlite3 ** ** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps ** for a specified amount of time when a table is locked. ^The handler @@ -2317,6 +3488,7 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); /* ** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 ** ** This is a legacy interface that is preserved for backwards compatibility. ** Use of this interface is not recommended. @@ -2402,12 +3574,16 @@ SQLITE_API void sqlite3_free_table(char **result); ** ** These routines are work-alikes of the "printf()" family of functions ** from the standard C library. +** These routines understand most of the common formatting options from +** the standard library printf() +** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]). +** See the [built-in printf()] documentation for details. ** ** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. +** results into memory obtained from [sqlite3_malloc64()]. ** The strings returned by these two routines should be ** released by [sqlite3_free()]. ^Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough ** memory to hold the resulting string. ** ** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from @@ -2431,65 +3607,7 @@ SQLITE_API void sqlite3_free_table(char **result); ** ** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). ** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf() formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** ^(The %q option works like %s in that it substitutes a nul-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal.)^ By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, assume the string variable zText contains text as follows: -** -** <blockquote><pre> -** char *zText = "It's a happy day!"; -** </pre></blockquote> -** -** One can use this text in an SQL statement as follows: -** -** <blockquote><pre> -** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText); -** sqlite3_exec(db, zSQL, 0, 0, 0); -** sqlite3_free(zSQL); -** </pre></blockquote> -** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -** <blockquote><pre> -** INSERT INTO table1 VALUES('It''s a happy day!') -** </pre></blockquote> -** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -** <blockquote><pre> -** INSERT INTO table1 VALUES('It's a happy day!'); -** </pre></blockquote> -** -** This second example is an SQL syntax error. As a general rule you should -** always use %q instead of %s when inserting text into a string literal. -** -** ^(The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Additionally, if the parameter in the -** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes).)^ So, for example, one could say: -** -** <blockquote><pre> -** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText); -** sqlite3_exec(db, zSQL, 0, 0, 0); -** sqlite3_free(zSQL); -** </pre></blockquote> -** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** ^(The "%z" formatting option works like "%s" but with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string.)^ +** See also: [built-in printf()], [printf() SQL function] */ SQLITE_API char *sqlite3_mprintf(const char*,...); SQLITE_API char *sqlite3_vmprintf(const char*, va_list); @@ -2642,12 +3760,15 @@ SQLITE_API void sqlite3_randomness(int N, void *P); /* ** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** KEYWORDS: {authorizer callback} ** ** ^This routine registers an authorizer callback with a particular ** [database connection], supplied in the first argument. ** ^The authorizer callback is invoked as SQL statements are being compiled ** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various +** [sqlite3_prepare_v3()], [sqlite3_prepare16()], [sqlite3_prepare16_v2()], +** and [sqlite3_prepare16_v3()]. ^At various ** points during the compilation process, as logic is being created ** to perform various actions, the authorizer callback is invoked to ** see if those actions are allowed. ^The authorizer callback should @@ -2669,8 +3790,10 @@ SQLITE_API void sqlite3_randomness(int N, void *P); ** parameter to the sqlite3_set_authorizer() interface. ^The second parameter ** to the callback is an integer [SQLITE_COPY | action code] that specifies ** the particular action to be authorized. ^The third through sixth parameters -** to the callback are zero-terminated strings that contain additional -** details about the action to be authorized. +** to the callback are either NULL pointers or zero-terminated strings +** that contain additional details about the action to be authorized. +** Applications must always be prepared to encounter a NULL pointer in any +** of the third through the sixth parameters of the authorization callback. ** ** ^If the action code is [SQLITE_READ] ** and the callback returns [SQLITE_IGNORE] then the @@ -2679,6 +3802,10 @@ SQLITE_API void sqlite3_randomness(int N, void *P); ** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] ** return can be used to deny an untrusted user access to individual ** columns of a table. +** ^When a table is referenced by a [SELECT] but no column values are +** extracted from that table (for example in a query like +** "SELECT count(*) FROM tab") then the [SQLITE_READ] authorizer callback +** is invoked once for that table with a column name that is an empty string. ** ^If the action code is [SQLITE_DELETE] and the callback returns ** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the ** [truncate optimization] is disabled and all rows are deleted individually. @@ -2798,6 +3925,10 @@ SQLITE_API int sqlite3_set_authorizer( /* ** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. ** ** These routines register callback functions that can be used for ** tracing and profiling the execution of SQL statements. @@ -2824,12 +3955,107 @@ SQLITE_API int sqlite3_set_authorizer( ** sqlite3_profile() function is considered experimental and is ** subject to change in future versions of SQLite. */ -SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, void(*xProfile)(void*,const char*,sqlite3_uint64), void*); +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The M argument +** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +** <dl> +** [[SQLITE_TRACE_STMT]] <dt>SQLITE_TRACE_STMT</dt> +** <dd>^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]] <dt>SQLITE_TRACE_PROFILE</dt> +** <dd>^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]] <dt>SQLITE_TRACE_ROW</dt> +** <dd>^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]] <dt>SQLITE_TRACE_CLOSE</dt> +** <dd>^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +** </dl> +*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + /* ** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 ** ** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback ** function X to be invoked periodically during long running calls to @@ -2863,6 +4089,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); /* ** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 ** ** ^These routines open an SQLite database file as specified by the ** filename argument. ^The filename argument is interpreted as UTF-8 for @@ -2948,10 +4175,10 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ^If [URI filename] interpretation is enabled, and the filename argument ** begins with "file:", then the filename is interpreted as a URI. ^URI ** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is -** set in the fourth argument to sqlite3_open_v2(), or if it has +** set in the third argument to sqlite3_open_v2(), or if it has ** been enabled globally using the [SQLITE_CONFIG_URI] option with the ** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. -** As of SQLite version 3.7.7, URI filename interpretation is turned off +** URI filename interpretation is turned off ** by default, but future releases of SQLite might enable URI filename ** interpretation by default. See "[URI filenames]" for additional ** information. @@ -3148,12 +4375,15 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int /* ** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 ** -** ^The sqlite3_errcode() interface returns the numeric [result code] or -** [extended result code] for the most recent failed sqlite3_* API call -** associated with a [database connection]. If a prior API call failed -** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** If the most recent API call was successful, +** then the return value from sqlite3_errcode() is undefined. +** ^The sqlite3_extended_errcode() ** interface is the same except that it always returns the ** [extended result code] even when extended result codes are ** disabled. @@ -3191,33 +4421,34 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3*); SQLITE_API const char *sqlite3_errstr(int); /* -** CAPI3REF: SQL Statement Object +** CAPI3REF: Prepared Statement Object ** KEYWORDS: {prepared statement} {prepared statements} ** -** An instance of this object represents a single SQL statement. -** This object is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. ** -** The life of a statement object goes something like this: +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: ** ** <ol> -** <li> Create the object using [sqlite3_prepare_v2()] or a related -** function. -** <li> Bind values to [host parameters] using the sqlite3_bind_*() +** <li> Create the prepared statement object using [sqlite3_prepare_v2()]. +** <li> Bind values to [parameters] using the sqlite3_bind_*() ** interfaces. ** <li> Run the SQL by calling [sqlite3_step()] one or more times. -** <li> Reset the statement using [sqlite3_reset()] then go back +** <li> Reset the prepared statement using [sqlite3_reset()] then go back ** to step 2. Do this zero or more times. ** <li> Destroy the object using [sqlite3_finalize()]. ** </ol> -** -** Refer to documentation on individual methods above for additional -** information. */ typedef struct sqlite3_stmt sqlite3_stmt; /* ** CAPI3REF: Run-time Limits +** METHOD: sqlite3 ** ** ^(This interface allows the size of various constructs to be limited ** on a connection by connection basis. The first parameter is the @@ -3286,9 +4517,9 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** ** [[SQLITE_LIMIT_VDBE_OP]] ^(<dt>SQLITE_LIMIT_VDBE_OP</dt> ** <dd>The maximum number of instructions in a virtual machine program -** used to implement an SQL statement. This limit is not currently -** enforced, though that might be added in some future release of -** SQLite.</dd>)^ +** used to implement an SQL statement. If [sqlite3_prepare_v2()] or +** the equivalent tries to allocate space for more than this many opcodes +** in a single prepared statement, an SQLITE_NOMEM error is returned.</dd>)^ ** ** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(<dt>SQLITE_LIMIT_FUNCTION_ARG</dt> ** <dd>The maximum number of arguments on a function.</dd>)^ @@ -3326,32 +4557,68 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); #define SQLITE_LIMIT_TRIGGER_DEPTH 10 #define SQLITE_LIMIT_WORKER_THREADS 11 +/* +** CAPI3REF: Prepare Flags +** +** These constants define various flags that can be passed into +** "prepFlags" parameter of the [sqlite3_prepare_v3()] and +** [sqlite3_prepare16_v3()] interfaces. +** +** New flags may be added in future releases of SQLite. +** +** <dl> +** [[SQLITE_PREPARE_PERSISTENT]] ^(<dt>SQLITE_PREPARE_PERSISTENT</dt> +** <dd>The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner +** that the prepared statement will be retained for a long time and +** probably reused many times.)^ ^Without this flag, [sqlite3_prepare_v3()] +** and [sqlite3_prepare16_v3()] assume that the prepared statement will +** be used just once or at most a few times and then destroyed using +** [sqlite3_finalize()] relatively soon. The current implementation acts +** on this hint by avoiding the use of [lookaside memory] so as not to +** deplete the limited store of lookaside memory. Future versions of +** SQLite may act on this hint differently. +** </dl> +*/ +#define SQLITE_PREPARE_PERSISTENT 0x01 + /* ** CAPI3REF: Compiling An SQL Statement ** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt ** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. +** To execute an SQL statement, it must first be compiled into a byte-code +** program using one of these routines. Or, in other words, these routines +** are constructors for the [prepared statement] object. +** +** The preferred routine to use is [sqlite3_prepare_v2()]. The +** [sqlite3_prepare()] interface is legacy and should be avoided. +** [sqlite3_prepare_v3()] has an extra "prepFlags" option that is used +** for special purposes. +** +** The use of the UTF-8 interfaces is preferred, as SQLite currently +** does all parsing using UTF-8. The UTF-16 interfaces are provided +** as a convenience. The UTF-16 interfaces work by converting the +** input text into UTF-8, then invoking the corresponding UTF-8 interface. ** ** The first argument, "db", is a [database connection] obtained from a ** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or ** [sqlite3_open16()]. The database connection must not have been closed. ** ** The second argument, "zSql", is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. +** as either UTF-8 or UTF-16. The sqlite3_prepare(), sqlite3_prepare_v2(), +** and sqlite3_prepare_v3() +** interfaces use UTF-8, and sqlite3_prepare16(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() use UTF-16. ** -** ^If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. ^If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. ^When nByte is non-negative, the -** zSql string ends at either the first '\000' or '\u0000' character or -** the nByte-th byte, whichever comes first. If the caller knows -** that the supplied string is nul-terminated, then there is a small -** performance advantage to be gained by passing an nByte parameter that -** is equal to the number of bytes in the input string <i>including</i> -** the nul-terminator bytes as this saves SQLite from having to -** make a copy of the input string. +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string <i>including</i> +** the nul-terminator. ** ** ^If pzTail is not NULL then *pzTail is made to point to the first byte ** past the end of the first SQL statement in zSql. These routines only @@ -3369,10 +4636,11 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; ** otherwise an [error code] is returned. ** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** ^In the "v2" interfaces, the prepared statement +** The sqlite3_prepare_v2(), sqlite3_prepare_v3(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() interfaces are recommended for all new programs. +** The older interfaces (sqlite3_prepare() and sqlite3_prepare16()) +** are retained for backwards compatibility, but their use is discouraged. +** ^In the "vX" interfaces, the prepared statement ** that is returned (the [sqlite3_stmt] object) contains a copy of the ** original SQL text. This causes the [sqlite3_step()] interface to ** behave differently in three ways: @@ -3406,6 +4674,12 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. ** </li> ** </ol> +** +** <p>^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having +** the extra prepFlags parameter, which is a bit array consisting of zero or +** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The +** sqlite3_prepare_v2() interface works exactly the same as +** sqlite3_prepare_v3() with a zero prepFlags parameter. */ SQLITE_API int sqlite3_prepare( sqlite3 *db, /* Database handle */ @@ -3421,6 +4695,14 @@ SQLITE_API int sqlite3_prepare_v2( sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); SQLITE_API int sqlite3_prepare16( sqlite3 *db, /* Database handle */ const void *zSql, /* SQL statement, UTF-16 encoded */ @@ -3435,18 +4717,53 @@ SQLITE_API int sqlite3_prepare16_v2( sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const void **pzTail /* OUT: Pointer to unused portion of zSql */ ); +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); /* ** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt ** -** ^This interface can be used to retrieve a saved copy of the original -** SQL text used to create a [prepared statement] if that statement was -** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The string returned by sqlite3_sql(P) is managed by SQLite and is +** automatically freed when the prepared statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be free by the application +** by passing it to [sqlite3_free()]. */ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); /* ** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt ** ** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if ** and only if the [prepared statement] X makes no direct changes to @@ -3473,15 +4790,21 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); ** sqlite3_stmt_readonly() to return true since, while those statements ** change the configuration of a database connection, they do not make ** changes to the content of the database files on disk. +** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since +** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and +** [BEGIN|BEGIN EXCLUSIVE] commands do touch the database and so +** sqlite3_stmt_readonly() returns false for those commands. */ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt ** ** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the ** [prepared statement] S has been stepped at least once using -** [sqlite3_step(S)] but has not run to completion and/or has not +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor ** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) ** interface returns false if S is a NULL pointer. If S is not a ** NULL pointer and is not a pointer to a valid [prepared statement] @@ -3508,7 +4831,9 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** Some interfaces require a protected sqlite3_value. Other interfaces ** will accept either a protected or an unprotected sqlite3_value. ** Every interface that accepts sqlite3_value arguments specifies -** whether or not it requires a protected sqlite3_value. +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. ** ** The terms "protected" and "unprotected" refer to whether or not ** a mutex is held. An internal mutex is held for a protected @@ -3527,12 +4852,13 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** implementation of [application-defined SQL functions] are protected. ** ^The sqlite3_value object returned by ** [sqlite3_column_value()] is unprotected. -** Unprotected sqlite3_value objects may only be used with -** [sqlite3_result_value()] and [sqlite3_bind_value()]. +** Unprotected sqlite3_value objects may only be used as arguments +** to [sqlite3_result_value()], [sqlite3_bind_value()], and +** [sqlite3_value_dup()]. ** The [sqlite3_value_blob | sqlite3_value_type()] family of ** interfaces require protected sqlite3_value objects. */ -typedef struct Mem sqlite3_value; +typedef struct sqlite3_value sqlite3_value; /* ** CAPI3REF: SQL Function Context Object @@ -3552,6 +4878,7 @@ typedef struct sqlite3_context sqlite3_context; ** CAPI3REF: Binding Values To Prepared Statements ** KEYWORDS: {host parameter} {host parameters} {host parameter name} ** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt ** ** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, ** literals may be replaced by a [parameter] that matches one of following @@ -3633,6 +4960,15 @@ typedef struct sqlite3_context sqlite3_context; ** [sqlite3_blob_open | incremental BLOB I/O] routines. ** ^A negative value for the zeroblob results in a zero-length BLOB. ** +** ^The sqlite3_bind_pointer(S,I,P,T,D) routine causes the I-th parameter in +** [prepared statement] S to have an SQL value of NULL, but to also be +** associated with the pointer P of type T. ^D is either a NULL pointer or +** a pointer to a destructor function for P. ^SQLite will invoke the +** destructor D with a single argument of P when it is finished using +** P. The T parameter should be a static string, preferably a string +** literal. The sqlite3_bind_pointer() routine is part of the +** [pointer passing interface] added for SQLite 3.20.0. +** ** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer ** for the [prepared statement] or with a prepared statement for which ** [sqlite3_step()] has been called more recently than [sqlite3_reset()], @@ -3666,10 +5002,13 @@ SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*) SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, void(*)(void*), unsigned char encoding); SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); /* ** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt ** ** ^This routine can be used to find the number of [SQL parameters] ** in a [prepared statement]. SQL parameters are tokens of the @@ -3690,6 +5029,7 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); /* ** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt ** ** ^The sqlite3_bind_parameter_name(P,N) interface returns ** the name of the N-th [SQL parameter] in the [prepared statement] P. @@ -3706,8 +5046,8 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); ** ^If the value N is out of range or if the N-th parameter is ** nameless, then NULL is returned. ^The returned string is ** always in UTF-8 encoding even if the named parameter was -** originally specified as UTF-16 in [sqlite3_prepare16()] or -** [sqlite3_prepare16_v2()]. +** originally specified as UTF-16 in [sqlite3_prepare16()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and @@ -3717,22 +5057,25 @@ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); /* ** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt ** ** ^Return the index of an SQL parameter given its name. ^The ** index value returned is suitable for use as the second ** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero ** is returned if no matching parameter is found. ^The parameter ** name must be given in UTF-8 even if the original statement -** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()] or +** [sqlite3_prepare16_v3()]. ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. +** [sqlite3_bind_parameter_name()]. */ SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); /* ** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt ** ** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset ** the [sqlite3_bind_blob | bindings] on a [prepared statement]. @@ -3742,10 +5085,15 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); /* ** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt ** ** ^Return the number of columns in the result set returned by the -** [prepared statement]. ^This routine returns 0 if pStmt is an SQL -** statement that does not return data (for example an [UPDATE]). +** [prepared statement]. ^If this routine returns 0, that means the +** [prepared statement] returns no data (for example an [UPDATE]). +** ^However, just because this routine returns a positive number does not +** mean that one or more rows of data will be returned. ^A SELECT statement +** will always have a positive sqlite3_column_count() but depending on the +** WHERE clause constraints and the table content, it might return no rows. ** ** See also: [sqlite3_data_count()] */ @@ -3753,6 +5101,7 @@ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); /* ** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt ** ** ^These routines return the name assigned to a particular column ** in the result set of a [SELECT] statement. ^The sqlite3_column_name() @@ -3782,6 +5131,7 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); /* ** CAPI3REF: Source Of Data In A Query Result +** METHOD: sqlite3_stmt ** ** ^These routines provide a means to determine the database, table, and ** table column that is the origin of a particular result column in @@ -3834,6 +5184,7 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); /* ** CAPI3REF: Declared Datatype Of A Query Result +** METHOD: sqlite3_stmt ** ** ^(The first parameter is a [prepared statement]. ** If this statement is a [SELECT] statement and the Nth column of the @@ -3866,17 +5217,20 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); /* ** CAPI3REF: Evaluate An SQL Statement +** METHOD: sqlite3_stmt ** -** After a [prepared statement] has been prepared using either -** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy +** After a [prepared statement] has been prepared using any of +** [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], [sqlite3_prepare16_v2()], +** or [sqlite3_prepare16_v3()] or one of the legacy ** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function ** must be called one or more times to evaluate the statement. ** ** The details of the behavior of the sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy +** on whether the statement was prepared using the newer "vX" interfaces +** [sqlite3_prepare_v3()], [sqlite3_prepare_v2()], [sqlite3_prepare16_v3()], +** [sqlite3_prepare16_v2()] or the older legacy +** interfaces [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "vX" interface is recommended for new applications but the legacy ** interface will continue to be supported. ** ** ^In the legacy interface, the return value will be either [SQLITE_BUSY], @@ -3922,7 +5276,8 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** other than [SQLITE_ROW] before any subsequent invocation of ** sqlite3_step(). Failure to reset the prepared statement using ** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from -** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began ** calling [sqlite3_reset()] automatically in this circumstance rather ** than returning [SQLITE_MISUSE]. This is not considered a compatibility ** break because any application that ever receives an SQLITE_MISUSE error @@ -3936,15 +5291,17 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** specific [error codes] that better describes the error. ** We admit that this is a goofy design. The problem has been fixed ** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** using [sqlite3_prepare_v3()] or [sqlite3_prepare_v2()] +** or [sqlite3_prepare16_v2()] or [sqlite3_prepare16_v3()] instead ** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, ** then the more specific [error codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. +** by sqlite3_step(). The use of the "vX" interfaces is recommended. */ SQLITE_API int sqlite3_step(sqlite3_stmt*); /* ** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt ** ** ^The sqlite3_data_count(P) interface returns the number of columns in the ** current row of the result set of [prepared statement] P. @@ -3998,8 +5355,29 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); /* ** CAPI3REF: Result Values From A Query ** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt ** -** These routines form the "result set" interface. +** <b>Summary:</b> +** <blockquote><table border=0 cellpadding=0 cellspacing=0> +** <tr><td><b>sqlite3_column_blob</b><td>→<td>BLOB result +** <tr><td><b>sqlite3_column_double</b><td>→<td>REAL result +** <tr><td><b>sqlite3_column_int</b><td>→<td>32-bit INTEGER result +** <tr><td><b>sqlite3_column_int64</b><td>→<td>64-bit INTEGER result +** <tr><td><b>sqlite3_column_text</b><td>→<td>UTF-8 TEXT result +** <tr><td><b>sqlite3_column_text16</b><td>→<td>UTF-16 TEXT result +** <tr><td><b>sqlite3_column_value</b><td>→<td>The result as an +** [sqlite3_value|unprotected sqlite3_value] object. +** <tr><td> <td> <td>  +** <tr><td><b>sqlite3_column_bytes</b><td>→<td>Size of a BLOB +** or a UTF-8 TEXT result in bytes +** <tr><td><b>sqlite3_column_bytes16  </b> +** <td>→  <td>Size of UTF-16 +** TEXT in bytes +** <tr><td><b>sqlite3_column_type</b><td>→<td>Default +** datatype of the result +** </table></blockquote> +** +** <b>Details:</b> ** ** ^These routines return information about a single column of the current ** result row of a query. ^In every case the first argument is a pointer @@ -4022,16 +5400,29 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** are called from a different thread while any of these routines ** are pending, then the results are undefined. ** +** The first six interfaces (_blob, _double, _int, _int64, _text, and _text16) +** each return the value of a result column in a specific data format. If +** the result column is not initially in the requested format (for example, +** if the query returns an integer but the sqlite3_column_text() interface +** is used to extract the value) then an automatic type conversion is performed. +** ** ^The sqlite3_column_type() routine returns the ** [SQLITE_INTEGER | datatype code] for the initial data type ** of the result column. ^The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. +** The return value of sqlite3_column_type() can be used to decide which +** of the first six interface should be used to extract the column value. +** The value returned by sqlite3_column_type() is only meaningful if no +** automatic type conversions have occurred for the value in question. +** After a type conversion, the result of calling sqlite3_column_type() +** is undefined, though harmless. Future ** versions of SQLite may change the behavior of sqlite3_column_type() ** following a type conversion. ** +** If the result is a BLOB or a TEXT string, then the sqlite3_column_bytes() +** or sqlite3_column_bytes16() interfaces can be used to determine the size +** of that BLOB or string. +** ** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() ** routine returns the number of bytes in that BLOB or string. ** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts @@ -4060,16 +5451,21 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** even empty strings, are always zero-terminated. ^The return ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. ** -** ^The object returned by [sqlite3_column_value()] is an -** [unprotected sqlite3_value] object. An unprotected sqlite3_value object -** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. +** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. ** If the [unprotected sqlite3_value] object returned by ** [sqlite3_column_value()] is used in any other way, including calls ** to routines like [sqlite3_value_int()], [sqlite3_value_text()], -** or [sqlite3_value_bytes()], then the behavior is undefined. +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** Hence, the sqlite3_column_value() interface +** is normally only useful within the implementation of +** [application-defined SQL functions] or [virtual tables], not within +** top-level application code. ** -** These routines attempt to convert the value where appropriate. ^For -** example, if the internal representation is FLOAT and a text result +** The these routines may attempt to convert the datatype of the result. +** ^For example, if the internal representation is FLOAT and a text result ** is requested, [sqlite3_snprintf()] is used internally to perform the ** conversion automatically. ^(The following table details the conversions ** that are applied: @@ -4097,12 +5493,6 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** </table> ** </blockquote>)^ ** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** own equivalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** ** Note that when type conversions occur, pointers returned by prior ** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or ** sqlite3_column_text16() may be invalidated. @@ -4127,7 +5517,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** of conversion are done in place when it is possible, but sometimes they ** are not possible and in those cases prior pointers are invalidated. ** -** The safest and easiest to remember policy is to invoke these routines +** The safest policy is to invoke these routines ** in one of the following ways: ** ** <ul> @@ -4147,7 +5537,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** ^The pointers returned are valid until a type conversion occurs as ** described above, or until [sqlite3_step()] or [sqlite3_reset()] or ** [sqlite3_finalize()] is called. ^The memory space used to hold strings -** and BLOBs is freed automatically. Do <b>not</b> pass the pointers returned +** and BLOBs is freed automatically. Do not pass the pointers returned ** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into ** [sqlite3_free()]. ** @@ -4158,18 +5548,19 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** [SQLITE_NOMEM].)^ */ SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); /* ** CAPI3REF: Destroy A Prepared Statement Object +** DESTRUCTOR: sqlite3_stmt ** ** ^The sqlite3_finalize() function is called to delete a [prepared statement]. ** ^If the most recent evaluation of the statement encountered no errors @@ -4197,6 +5588,7 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); /* ** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt ** ** The sqlite3_reset() function is called to reset a [prepared statement] ** object back to its initial state, ready to be re-executed. @@ -4226,6 +5618,7 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** KEYWORDS: {function creation routines} ** KEYWORDS: {application-defined SQL function} ** KEYWORDS: {application-defined SQL functions} +** METHOD: sqlite3 ** ** ^These functions (collectively known as "function creation routines") ** are used to add SQL functions or aggregates or to redefine the behavior @@ -4380,8 +5773,8 @@ SQLITE_API int sqlite3_create_function_v2( ** These functions are [deprecated]. In order to maintain ** backwards compatibility with older code, these functions continue ** to be supported. However, new applications should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you what they do. +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. */ #ifndef SQLITE_OMIT_DEPRECATED SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); @@ -4394,23 +5787,46 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 #endif /* -** CAPI3REF: Obtaining SQL Function Parameter Values +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value ** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. +** <b>Summary:</b> +** <blockquote><table border=0 cellpadding=0 cellspacing=0> +** <tr><td><b>sqlite3_value_blob</b><td>→<td>BLOB value +** <tr><td><b>sqlite3_value_double</b><td>→<td>REAL value +** <tr><td><b>sqlite3_value_int</b><td>→<td>32-bit INTEGER value +** <tr><td><b>sqlite3_value_int64</b><td>→<td>64-bit INTEGER value +** <tr><td><b>sqlite3_value_pointer</b><td>→<td>Pointer value +** <tr><td><b>sqlite3_value_text</b><td>→<td>UTF-8 TEXT value +** <tr><td><b>sqlite3_value_text16</b><td>→<td>UTF-16 TEXT value in +** the native byteorder +** <tr><td><b>sqlite3_value_text16be</b><td>→<td>UTF-16be TEXT value +** <tr><td><b>sqlite3_value_text16le</b><td>→<td>UTF-16le TEXT value +** <tr><td> <td> <td>  +** <tr><td><b>sqlite3_value_bytes</b><td>→<td>Size of a BLOB +** or a UTF-8 TEXT in bytes +** <tr><td><b>sqlite3_value_bytes16  </b> +** <td>→  <td>Size of UTF-16 +** TEXT in bytes +** <tr><td><b>sqlite3_value_type</b><td>→<td>Default +** datatype of the value +** <tr><td><b>sqlite3_value_numeric_type  </b> +** <td>→  <td>Best numeric datatype of the value +** <tr><td><b>sqlite3_value_nochange  </b> +** <td>→  <td>True if the column is unchanged in an UPDATE +** against a virtual table. +** </table></blockquote> ** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 3rd parameter to these callbacks is an array of pointers to -** [protected sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. +** <b>Details:</b> +** +** These routines extract type, size, and content information from +** [protected sqlite3_value] objects. Protected sqlite3_value objects +** are used to pass parameter information into implementation of +** [application-defined SQL functions] and [virtual tables]. ** ** These routines work only with [protected sqlite3_value] objects. ** Any attempt to use these routines on an [unprotected sqlite3_value] -** object results in undefined behavior. +** is not threadsafe. ** ** ^These routines work just like the corresponding [column access functions] ** except that these routines take a single [protected sqlite3_value] object @@ -4421,6 +5837,24 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces ** extract UTF-16 strings as big-endian and little-endian respectively. ** +** ^If [sqlite3_value] object V was initialized +** using [sqlite3_bind_pointer(S,I,P,X,D)] or [sqlite3_result_pointer(C,P,X,D)] +** and if X and Y are strings that compare equal according to strcmp(X,Y), +** then sqlite3_value_pointer(V,Y) will return the pointer P. ^Otherwise, +** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** ^(The sqlite3_value_type(V) interface returns the +** [SQLITE_INTEGER | datatype code] for the initial datatype of the +** [sqlite3_value] object V. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL].)^ +** Other interfaces might change the datatype for an sqlite3_value object. +** For example, if the datatype is initially SQLITE_INTEGER and +** sqlite3_value_text(V) is called to extract a text value for that +** integer, then subsequent calls to sqlite3_value_type(V) might return +** SQLITE_TEXT. Whether or not a persistent internal datatype conversion +** occurs is undefined and may change from one release of SQLite to the next. +** ** ^(The sqlite3_value_numeric_type() interface attempts to apply ** numeric affinity to the value. This means that an attempt is ** made to convert the value to an integer or floating point. If @@ -4429,6 +5863,19 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** then the conversion is performed. Otherwise no conversion occurs. ** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ ** +** ^Within the [xUpdate] method of a [virtual table], the +** sqlite3_value_nochange(X) interface returns true if and only if +** the column corresponding to X is unchanged by the UPDATE operation +** that the xUpdate method call was invoked to implement and if +** and the prior [xColumn] method call that was invoked to extracted +** the value for that column returned without setting a result (probably +** because it queried [sqlite3_vtab_nochange()] and found that the column +** was unchanging). ^Within an [xUpdate] method, any value for which +** sqlite3_value_nochange(X) is true will in all other respects appear +** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other +** than within an [xUpdate] method call for an UPDATE statement, then +** the return value is arbitrary and meaningless. +** ** Please pay particular attention to the fact that the pointer returned ** from [sqlite3_value_blob()], [sqlite3_value_text()], or ** [sqlite3_value_text16()] can be invalidated by a subsequent call to @@ -4439,20 +5886,52 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** the SQL function that supplied the [sqlite3_value*] parameters. */ SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); SQLITE_API double sqlite3_value_double(sqlite3_value*); SQLITE_API int sqlite3_value_int(sqlite3_value*); SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API void *sqlite3_value_pointer(sqlite3_value*, const char*); SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); SQLITE_API int sqlite3_value_type(sqlite3_value*); SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); +SQLITE_API int sqlite3_value_nochange(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); /* ** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context ** ** Implementations of aggregate SQL functions use this ** routine to allocate memory for storing their state. @@ -4497,6 +5976,7 @@ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); /* ** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context ** ** ^The sqlite3_user_data() interface returns a copy of ** the pointer that was the pUserData parameter (the 5th parameter) @@ -4511,6 +5991,7 @@ SQLITE_API void *sqlite3_user_data(sqlite3_context*); /* ** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context ** ** ^The sqlite3_context_db_handle() interface returns a copy of ** the pointer to the [database connection] (the 1st parameter) @@ -4522,6 +6003,7 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); /* ** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context ** ** These functions may be used by (non-aggregate) SQL functions to ** associate metadata with argument values. If the same value is passed to @@ -4534,10 +6016,11 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** the compiled regular expression can be reused on multiple ** invocations of the same function. ** -** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata -** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. ^If there is no metadata -** associated with the function argument, this sqlite3_get_auxdata() interface +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument +** value to the application-defined function. ^N is zero for the left-most +** function argument. ^If there is no metadata +** associated with the function argument, the sqlite3_get_auxdata(C,N) interface ** returns a NULL pointer. ** ** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th @@ -4549,12 +6032,13 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** SQLite will invoke the destructor function X with parameter P exactly ** once, when the metadata is discarded. ** SQLite is free to discard the metadata at any time, including: <ul> -** <li> when the corresponding function parameter changes, or -** <li> when [sqlite3_reset()] or [sqlite3_finalize()] is called for the -** SQL statement, or -** <li> when sqlite3_set_auxdata() is invoked again on the same parameter, or -** <li> during the original sqlite3_set_auxdata() call when a memory -** allocation error occurs. </ul>)^ +** <li> ^(when the corresponding function parameter changes)^, or +** <li> ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +** <li> ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +** <li> ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^ </ul> ** ** Note the last bullet in particular. The destructor X in ** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the @@ -4567,6 +6051,10 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** function parameters that are compile-time constants, including literal ** values and [parameters] and expressions composed from the same.)^ ** +** The value of the N parameter to these interfaces should be non-negative. +** Future enhancements may make use of negative N values to define new +** kinds of function caching behavior. +** ** These routines must be called from the same thread in which ** the SQL function is running. */ @@ -4594,6 +6082,7 @@ typedef void (*sqlite3_destructor_type)(void*); /* ** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context ** ** These routines are used by the xFunc or xFinal callbacks that ** implement SQL functions and aggregates. See @@ -4609,9 +6098,9 @@ typedef void (*sqlite3_destructor_type)(void*); ** to by the second parameter and which is N bytes long where N is the ** third parameter. ** -** ^The sqlite3_result_zeroblob() interfaces set the result of -** the application-defined function to be a BLOB containing all zero -** bytes and N bytes in size, where N is the value of the 2nd parameter. +** ^The sqlite3_result_zeroblob(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. ** ** ^The sqlite3_result_double() interface sets the result from ** an application-defined function to be a floating point value specified @@ -4689,11 +6178,11 @@ typedef void (*sqlite3_destructor_type)(void*); ** when it has finished using that result. ** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT -** then SQLite makes a copy of the result into space obtained from +** then SQLite makes a copy of the result into space obtained ** from [sqlite3_malloc()] before it returns. ** ** ^The sqlite3_result_value() interface sets the result of -** the application-defined function to be a copy the +** the application-defined function to be a copy of the ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or @@ -4702,6 +6191,17 @@ typedef void (*sqlite3_destructor_type)(void*); ** [unprotected sqlite3_value] object is required, so either ** kind of [sqlite3_value] object can be used with this interface. ** +** ^The sqlite3_result_pointer(C,P,T,D) interface sets the result to an +** SQL NULL value, just like [sqlite3_result_null(C)], except that it +** also associates the host-language pointer P or type T with that +** NULL value such that the pointer can be retrieved within an +** [application-defined SQL function] using [sqlite3_value_pointer()]. +** ^If the D parameter is not NULL, then it is a pointer to a destructor +** for the P parameter. ^SQLite invokes D with P as its only argument +** when SQLite is finished with P. The T parameter should be a static +** string and preferably a string literal. The sqlite3_result_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** ** If these routines are called from within the different thread ** than the one containing the application-defined function that received ** the [sqlite3_context] pointer, the results are undefined. @@ -4725,10 +6225,28 @@ SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(* SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_pointer(sqlite3_context*, void*,const char*,void(*)(void*)); SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); /* ** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 ** ** ^These functions add, remove, or modify a [collation] associated ** with the [database connection] specified as the first argument. @@ -4831,6 +6349,7 @@ SQLITE_API int sqlite3_create_collation16( /* ** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 ** ** ^To avoid having to register all collation sequences before a database ** can be used, a single callback function may be registered with the @@ -5035,9 +6554,45 @@ SQLITE_API char *sqlite3_temp_directory; */ SQLITE_API char *sqlite3_data_directory; +/* +** CAPI3REF: Win32 Specific Interface +** +** These interfaces are available only on Windows. The +** [sqlite3_win32_set_directory] interface is used to set the value associated +** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to +** zValue, depending on the value of the type parameter. The zValue parameter +** should be NULL to cause the previous value to be freed via [sqlite3_free]; +** a non-NULL value will be copied into memory obtained from [sqlite3_malloc] +** prior to being used. The [sqlite3_win32_set_directory] interface returns +** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported, +** or [SQLITE_NOMEM] if memory could not be allocated. The value of the +** [sqlite3_data_directory] variable is intended to act as a replacement for +** the current directory on the sub-platforms of Win32 where that concept is +** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and +** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the +** sqlite3_win32_set_directory interface except the string parameter must be +** UTF-8 or UTF-16, respectively. +*/ +SQLITE_API int sqlite3_win32_set_directory( + unsigned long type, /* Identifier for directory being set or reset */ + void *zValue /* New value for directory being set or reset */ +); +SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue); +SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue); + +/* +** CAPI3REF: Win32 Directory Types +** +** These macros are only available on Windows. They define the allowed values +** for the type argument to the [sqlite3_win32_set_directory] interface. +*/ +#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1 +#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2 + /* ** CAPI3REF: Test For Auto-Commit Mode ** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 ** ** ^The sqlite3_get_autocommit() interface returns non-zero or ** zero if the given database connection is or is not in autocommit mode, @@ -5060,6 +6615,7 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*); /* ** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt ** ** ^The sqlite3_db_handle interface returns the [database connection] handle ** to which a [prepared statement] belongs. ^The [database connection] @@ -5072,6 +6628,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); /* ** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 ** ** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename ** associated with database N of connection D. ^The main database file @@ -5088,6 +6645,7 @@ SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); /* ** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 ** ** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N ** of connection D is read-only, 0 if it is read/write, or -1 if N is not @@ -5097,6 +6655,7 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); /* ** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 ** ** ^This interface returns a pointer to the next [prepared statement] after ** pStmt associated with the [database connection] pDb. ^If pStmt is NULL @@ -5112,6 +6671,7 @@ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); /* ** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 ** ** ^The sqlite3_commit_hook() interface registers a callback ** function to be invoked whenever a transaction is [COMMIT | committed]. @@ -5161,11 +6721,12 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); /* ** CAPI3REF: Data Change Notification Callbacks +** METHOD: sqlite3 ** ** ^The sqlite3_update_hook() interface registers a callback function ** with the [database connection] identified by the first argument ** to be invoked whenever a row is updated, inserted or deleted in -** a rowid table. +** a [rowid table]. ** ^Any callback set by a previous call to this function ** for the same database connection is overridden. ** @@ -5186,7 +6747,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** ^The update hook is not invoked when [WITHOUT ROWID] tables are modified. ** ** ^In the current implementation, the update hook -** is not invoked when duplication rows are deleted because of an +** is not invoked when conflicting rows are deleted because of an ** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook ** invoked when rows are deleted using the [truncate optimization]. ** The exceptions defined in this paragraph might change in a future @@ -5204,8 +6765,8 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** on the same [database connection] D, or NULL for ** the first call on D. ** -** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] -** interfaces. +** See also the [sqlite3_commit_hook()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. */ SQLITE_API void *sqlite3_update_hook( sqlite3*, @@ -5222,7 +6783,8 @@ SQLITE_API void *sqlite3_update_hook( ** and disabled if the argument is false.)^ ** ** ^Cache sharing is enabled and disabled for an entire process. -** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, +** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]). +** In prior versions of SQLite, ** sharing was enabled or disabled for each thread separately. ** ** ^(The cache sharing mode set by this interface effects all subsequent @@ -5237,6 +6799,11 @@ SQLITE_API void *sqlite3_update_hook( ** future releases of SQLite. Applications that care about shared ** cache setting should set it explicitly. ** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** ** This interface is threadsafe on processors where writing a ** 32-bit integer is atomic. ** @@ -5262,6 +6829,7 @@ SQLITE_API int sqlite3_release_memory(int); /* ** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 ** ** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap ** memory as possible from database connection D. Unlike the @@ -5310,7 +6878,8 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** from the heap. ** </ul>)^ ** -** Beginning with SQLite version 3.7.3, the soft heap limit is enforced +** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), +** the soft heap limit is enforced ** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] ** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], ** the soft heap limit is enforced on every memory allocation. Without @@ -5339,6 +6908,7 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); /* ** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 ** ** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns ** information about column C of table T in database D @@ -5348,9 +6918,11 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); ** column exists. ^The sqlite3_table_column_metadata() interface returns ** SQLITE_ERROR and if the specified column does not exist. ** ^If the column-name parameter to sqlite3_table_column_metadata() is a -** NULL pointer, then this routine simply checks for the existance of the +** NULL pointer, then this routine simply checks for the existence of the ** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it -** does not. +** does not. If the table name parameter T in a call to +** sqlite3_table_column_metadata(X,D,T,C,...) is NULL then the result is +** undefined behavior. ** ** ^The column is identified by the second, third and fourth parameters to ** this function. ^(The second parameter is either the name of the database @@ -5417,6 +6989,7 @@ SQLITE_API int sqlite3_table_column_metadata( /* ** CAPI3REF: Load An Extension +** METHOD: sqlite3 ** ** ^This interface loads an SQLite extension library from the named file. ** @@ -5444,9 +7017,18 @@ SQLITE_API int sqlite3_table_column_metadata( ** should free this memory by calling [sqlite3_free()]. ** ** ^Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, ** otherwise an error will be returned. ** +** <b>Security warning:</b> It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** ** See also the [load_extension() SQL function]. */ SQLITE_API int sqlite3_load_extension( @@ -5458,6 +7040,7 @@ SQLITE_API int sqlite3_load_extension( /* ** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 ** ** ^So as not to open security holes in older applications that are ** unprepared to deal with [extension loading], and as a means of disabling @@ -5468,6 +7051,17 @@ SQLITE_API int sqlite3_load_extension( ** ^Call the sqlite3_enable_load_extension() routine with onoff==1 ** to turn extension loading on and call it with onoff==0 to turn ** it back off again. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** <b>Security warning:</b> It is recommended that extension loading +** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. */ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); @@ -5481,7 +7075,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); ** ** ^(Even though the function prototype shows that xEntryPoint() takes ** no arguments and returns void, SQLite invokes xEntryPoint() with three -** arguments and expects and integer result as if the signature of the +** arguments and expects an integer result as if the signature of the ** entry point where as follows: ** ** <blockquote><pre> @@ -5507,7 +7101,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); ** See also: [sqlite3_reset_auto_extension()] ** and [sqlite3_cancel_auto_extension()] */ -SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); /* ** CAPI3REF: Cancel Automatic Extension Loading @@ -5519,7 +7113,7 @@ SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); ** unregistered and it returns 0 if X was not on the list of initialization ** routines. */ -SQLITE_API int sqlite3_cancel_auto_extension(void (*xEntryPoint)(void)); +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); /* ** CAPI3REF: Reset Automatic Extension Loading @@ -5629,6 +7223,17 @@ struct sqlite3_module { ** ^Information about the ORDER BY clause is stored in aOrderBy[]. ** ^Each term of aOrderBy records a column of the ORDER BY clause. ** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** ** The [xBestIndex] method must fill aConstraintUsage[] with information ** about what parameters to pass to xFilter. ^If argvIndex>0 then ** the right-hand side of the corresponding aConstraint[] is evaluated @@ -5654,19 +7259,39 @@ struct sqlite3_module { ** ^The estimatedRows value is an estimate of the number of rows that ** will be returned by the strategy. ** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** ** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info -** structure for SQLite version 3.8.2. If a virtual table extension is +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is ** used with an SQLite version earlier than 3.8.2, the results of attempting ** to read or write the estimatedRows field are undefined (but are likely ** to included crashing the application). The estimatedRows field should ** therefore only be used if [sqlite3_libversion_number()] returns a -** value greater than or equal to 3008002. +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. */ struct sqlite3_index_info { /* Inputs */ int nConstraint; /* Number of entries in aConstraint */ struct sqlite3_index_constraint { - int iColumn; /* Column on left-hand side of constraint */ + int iColumn; /* Column constrained. -1 for ROWID */ unsigned char op; /* Constraint operator */ unsigned char usable; /* True if this constraint is usable */ int iTermOffset; /* Used internally - xBestIndex should ignore */ @@ -5688,8 +7313,21 @@ struct sqlite3_index_info { double estimatedCost; /* Estimated cost of using this index */ /* Fields below are only available in SQLite 3.8.2 and later */ sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ }; +/* +** CAPI3REF: Virtual Table Scan Flags +** +** Virtual table implementations are allowed to set the +** [sqlite3_index_info].idxFlags field to some combination of +** these bits. +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + /* ** CAPI3REF: Virtual Table Constraint Operator Codes ** @@ -5698,15 +7336,24 @@ struct sqlite3_index_info { ** an operator that is part of a constraint term in the wHERE clause of ** a query that uses a [virtual table]. */ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 /* ** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 ** ** ^These routines are used to register a new [virtual table module] name. ** ^Module names must be registered before @@ -5764,7 +7411,7 @@ SQLITE_API int sqlite3_create_module_v2( */ struct sqlite3_vtab { const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* NO LONGER USED */ + int nRef; /* Number of open cursors */ char *zErrMsg; /* Error message from sqlite3_mprintf() */ /* Virtual table implementations will typically add additional fields */ }; @@ -5803,6 +7450,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); /* ** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 ** ** ^(Virtual tables can provide alternative implementations of functions ** using the [xFindFunction] method of the [virtual table module]. @@ -5845,6 +7493,8 @@ typedef struct sqlite3_blob sqlite3_blob; /* ** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob ** ** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located ** in row iRow, column zColumn, table zTable in database zDb; @@ -5890,6 +7540,12 @@ typedef struct sqlite3_blob sqlite3_blob; ** [database connection] error code and message accessible via ** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. ** +** A BLOB referenced by sqlite3_blob_open() may be read using the +** [sqlite3_blob_read()] interface and modified by using +** [sqlite3_blob_write()]. The [BLOB handle] can be moved to a +** different row of the same table using the [sqlite3_blob_reopen()] +** interface. However, the column, table, or database of a [BLOB handle] +** cannot be changed after the [BLOB handle] is opened. ** ** ^(If the row that a BLOB handle points to is modified by an ** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects @@ -5913,6 +7569,10 @@ typedef struct sqlite3_blob sqlite3_blob; ** ** To avoid a resource leak, every open [BLOB handle] should eventually ** be released by a call to [sqlite3_blob_close()]. +** +** See also: [sqlite3_blob_close()], +** [sqlite3_blob_reopen()], [sqlite3_blob_read()], +** [sqlite3_blob_bytes()], [sqlite3_blob_write()]. */ SQLITE_API int sqlite3_blob_open( sqlite3*, @@ -5926,12 +7586,13 @@ SQLITE_API int sqlite3_blob_open( /* ** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob ** -** ^This function is used to move an existing blob handle so that it points +** ^This function is used to move an existing [BLOB handle] so that it points ** to a different row of the same database table. ^The new row is identified ** by the rowid value passed as the second argument. Only the row can be ** changed. ^The database, table and column on which the blob handle is open -** remain the same. Moving an existing blob handle to a new row can be +** remain the same. Moving an existing [BLOB handle] to a new row is ** faster than closing the existing handle and opening a new one. ** ** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - @@ -5946,10 +7607,11 @@ SQLITE_API int sqlite3_blob_open( ** ** ^This function sets the database handle error code and message. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); /* ** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob ** ** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed ** unconditionally. Even if this routine returns an error code, the @@ -5972,6 +7634,7 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); /* ** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob ** ** ^Returns the size in bytes of the BLOB accessible via the ** successfully opened [BLOB handle] in its only argument. ^The @@ -5987,6 +7650,7 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); /* ** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob ** ** ^(This function is used to read data from an open [BLOB handle] into a ** caller-supplied buffer. N bytes of data are copied into buffer Z @@ -6015,6 +7679,7 @@ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); /* ** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob ** ** ^(This function is used to write data into an open [BLOB handle] from a ** caller-supplied buffer. N bytes of data are copied from the buffer Z @@ -6138,6 +7803,9 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** <li> SQLITE_MUTEX_STATIC_APP1 ** <li> SQLITE_MUTEX_STATIC_APP2 ** <li> SQLITE_MUTEX_STATIC_APP3 +** <li> SQLITE_MUTEX_STATIC_VFS1 +** <li> SQLITE_MUTEX_STATIC_VFS2 +** <li> SQLITE_MUTEX_STATIC_VFS3 ** </ul> ** ** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) @@ -6332,16 +8000,20 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); #define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ #define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ #define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ #define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ #define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ #define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ #define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ #define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ #define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ /* ** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 ** ** ^This interface returns a pointer the [sqlite3_mutex] object that ** serializes access to the [database connection] given in the argument @@ -6353,6 +8025,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); /* ** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 ** ** ^The [sqlite3_file_control()] interface makes a direct call to the ** xFileControl method for the [sqlite3_io_methods] object associated @@ -6367,9 +8040,9 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); ** the xFileControl method. ^The return value of the xFileControl ** method becomes the return value of this routine. ** -** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes +** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes ** a pointer to the underlying [sqlite3_file] object to be written into -** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER +** the space pointed to by the 4th parameter. ^The [SQLITE_FCNTL_FILE_POINTER] ** case is a short-circuit path which does not actually invoke the ** underlying sqlite3_io_methods.xFileControl method. ** @@ -6381,7 +8054,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); ** an incorrect zDbName and an SQLITE_ERROR return from the underlying ** xFileControl method. ** -** See also: [SQLITE_FCNTL_LOCKSTATE] +** See also: [file control opcodes] */ SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); @@ -6427,21 +8100,207 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 -#define SQLITE_TESTCTRL_ISKEYWORD 16 -#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 +#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ +#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 #define SQLITE_TESTCTRL_NEVER_CORRUPT 20 #define SQLITE_TESTCTRL_VDBE_COVERAGE 21 #define SQLITE_TESTCTRL_BYTEORDER 22 #define SQLITE_TESTCTRL_ISINIT 23 #define SQLITE_TESTCTRL_SORTER_MMAP 24 -#define SQLITE_TESTCTRL_LAST 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_PARSER_COVERAGE 26 +#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */ + +/* +** CAPI3REF: SQL Keyword Checking +** +** These routines provide access to the set of SQL language keywords +** recognized by SQLite. Applications can uses these routines to determine +** whether or not a specific identifier needs to be escaped (for example, +** by enclosing in double-quotes) so as not to confuse the parser. +** +** The sqlite3_keyword_count() interface returns the number of distinct +** keywords understood by SQLite. +** +** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and +** makes *Z point to that keyword expressed as UTF8 and writes the number +** of bytes in the keyword into *L. The string that *Z points to is not +** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns +** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z +** or L are NULL or invalid pointers then calls to +** sqlite3_keyword_name(N,Z,L) result in undefined behavior. +** +** The sqlite3_keyword_check(Z,L) interface checks to see whether or not +** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero +** if it is and zero if not. +** +** The parser used by SQLite is forgiving. It is often possible to use +** a keyword as an identifier as long as such use does not result in a +** parsing ambiguity. For example, the statement +** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and +** creates a new table named "BEGIN" with three columns named +** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid +** using keywords as identifiers. Common techniques used to avoid keyword +** name collisions include: +** <ul> +** <li> Put all identifier names inside double-quotes. This is the official +** SQL way to escape identifier names. +** <li> Put identifier names inside [...]. This is not standard SQL, +** but it is what SQL Server does and so lots of programmers use this +** technique. +** <li> Begin every identifier with the letter "Z" as no SQL keywords start +** with "Z". +** <li> Include a digit somewhere in every identifier name. +** </ul> +** +** Note that the number of keywords understood by SQLite can depend on +** compile-time options. For example, "VACUUM" is not a keyword if +** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also, +** new keywords may be added to future releases of SQLite. +*/ +SQLITE_API int sqlite3_keyword_count(void); +SQLITE_API int sqlite3_keyword_name(int,const char**,int*); +SQLITE_API int sqlite3_keyword_check(const char*,int); + +/* +** CAPI3REF: Dynamic String Object +** KEYWORDS: {dynamic string} +** +** An instance of the sqlite3_str object contains a dynamically-sized +** string under construction. +** +** The lifecycle of an sqlite3_str object is as follows: +** <ol> +** <li> ^The sqlite3_str object is created using [sqlite3_str_new()]. +** <li> ^Text is appended to the sqlite3_str object using various +** methods, such as [sqlite3_str_appendf()]. +** <li> ^The sqlite3_str object is destroyed and the string it created +** is returned using the [sqlite3_str_finish()] interface. +** </ol> +*/ +typedef struct sqlite3_str sqlite3_str; + +/* +** CAPI3REF: Create A New Dynamic String Object +** CONSTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_new(D)] interface allocates and initializes +** a new [sqlite3_str] object. To avoid memory leaks, the object returned by +** [sqlite3_str_new()] must be freed by a subsequent call to +** [sqlite3_str_finish(X)]. +** +** ^The [sqlite3_str_new(D)] interface always returns a pointer to a +** valid [sqlite3_str] object, though in the event of an out-of-memory +** error the returned object might be a special singleton that will +** silently reject new text, always return SQLITE_NOMEM from +** [sqlite3_str_errcode()], always return 0 for +** [sqlite3_str_length()], and always return NULL from +** [sqlite3_str_finish(X)]. It is always safe to use the value +** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter +** to any of the other [sqlite3_str] methods. +** +** The D parameter to [sqlite3_str_new(D)] may be NULL. If the +** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum +** length of the string contained in the [sqlite3_str] object will be +** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead +** of [SQLITE_MAX_LENGTH]. +*/ +SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*); + +/* +** CAPI3REF: Finalize A Dynamic String +** DESTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X +** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()] +** that contains the constructed string. The calling application should +** pass the returned value to [sqlite3_free()] to avoid a memory leak. +** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any +** errors were encountered during construction of the string. ^The +** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the +** string in [sqlite3_str] object X is zero bytes long. +*/ +SQLITE_API char *sqlite3_str_finish(sqlite3_str*); + +/* +** CAPI3REF: Add Content To A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces add content to an sqlite3_str object previously obtained +** from [sqlite3_str_new()]. +** +** ^The [sqlite3_str_appendf(X,F,...)] and +** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf] +** functionality of SQLite to append formatted text onto the end of +** [sqlite3_str] object X. +** +** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S +** onto the end of the [sqlite3_str] object X. N must be non-negative. +** S must contain at least N non-zero bytes of content. To append a +** zero-terminated string in its entirety, use the [sqlite3_str_appendall()] +** method instead. +** +** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of +** zero-terminated string S onto the end of [sqlite3_str] object X. +** +** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the +** single-byte character C onto the end of [sqlite3_str] object X. +** ^This method can be used, for example, to add whitespace indentation. +** +** ^The [sqlite3_str_reset(X)] method resets the string under construction +** inside [sqlite3_str] object X back to zero bytes in length. +** +** These methods do not return a result code. ^If an error occurs, that fact +** is recorded in the [sqlite3_str] object and can be recovered by a +** subsequent call to [sqlite3_str_errcode(X)]. +*/ +SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...); +SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list); +SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N); +SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn); +SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C); +SQLITE_API void sqlite3_str_reset(sqlite3_str*); + +/* +** CAPI3REF: Status Of A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces return the current status of an [sqlite3_str] object. +** +** ^If any prior errors have occurred while constructing the dynamic string +** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return +** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns +** [SQLITE_NOMEM] following any out-of-memory error, or +** [SQLITE_TOOBIG] if the size of the dynamic string exceeds +** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors. +** +** ^The [sqlite3_str_length(X)] method returns the current length, in bytes, +** of the dynamic string under construction in [sqlite3_str] object X. +** ^The length returned by [sqlite3_str_length(X)] does not include the +** zero-termination byte. +** +** ^The [sqlite3_str_value(X)] method returns a pointer to the current +** content of the dynamic string under construction in X. The value +** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X +** and might be freed or altered by any subsequent method on the same +** [sqlite3_str] object. Applications must not used the pointer returned +** [sqlite3_str_value(X)] after any subsequent method call on the same +** object. ^Applications may change the content of the string returned +** by [sqlite3_str_value(X)] as long as they do not write into any bytes +** outside the range of 0 to [sqlite3_str_length(X)] and do not read or +** write any byte after any subsequent sqlite3_str method call. +*/ +SQLITE_API int sqlite3_str_errcode(sqlite3_str*); +SQLITE_API int sqlite3_str_length(sqlite3_str*); +SQLITE_API char *sqlite3_str_value(sqlite3_str*); /* ** CAPI3REF: SQLite Runtime Status ** -** ^This interface is used to retrieve runtime status information +** ^These interfaces are used to retrieve runtime status information ** about the performance of SQLite, and optionally to reset various ** highwater marks. ^The first argument is an integer code for ** the specific parameter to measure. ^(Recognized integer codes @@ -6455,19 +8314,22 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** ^(Other parameters record only the highwater mark and not the current ** value. For these latter parameters nothing is written into *pCurrent.)^ ** -** ^The sqlite3_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. ** -** This routine is threadsafe but is not atomic. This routine can be -** called while other threads are running the same or different SQLite -** interfaces. However the values returned in *pCurrent and -** *pHighwater reflect the status of SQLite at different points in time -** and it is possible that another thread might change the parameter -** in between the times when *pCurrent and *pHighwater are written. +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. ** ** See also: [sqlite3_db_status()] */ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); /* @@ -6482,8 +8344,7 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF ** <dd>This parameter is the current amount of memory checked out ** using [sqlite3_malloc()], either directly or indirectly. The ** figure includes calls made to [sqlite3_malloc()] by the application -** and internal memory usage by the SQLite library. Scratch memory -** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache +** and internal memory usage by the SQLite library. Auxiliary page-cache ** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in ** this parameter. The amount returned is the sum of the allocation ** sizes as reported by the xSize method in [sqlite3_mem_methods].</dd>)^ @@ -6521,32 +8382,18 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF ** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.</dd>)^ ** -** [[SQLITE_STATUS_SCRATCH_USED]] ^(<dt>SQLITE_STATUS_SCRATCH_USED</dt> -** <dd>This parameter returns the number of allocations used out of the -** [scratch memory allocator] configured using -** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not -** in bytes. Since a single thread may only have one scratch allocation -** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.</dd>)^ +** [[SQLITE_STATUS_SCRATCH_USED]] <dt>SQLITE_STATUS_SCRATCH_USED</dt> +** <dd>No longer used.</dd> ** ** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(<dt>SQLITE_STATUS_SCRATCH_OVERFLOW</dt> -** <dd>This parameter returns the number of bytes of scratch memory -** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] -** buffer and where forced to overflow to [sqlite3_malloc()]. The values -** returned include overflows because the requested allocation was too -** larger (that is, because the requested allocation was larger than the -** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer -** slots were available. -** </dd>)^ +** <dd>No longer used.</dd> ** -** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(<dt>SQLITE_STATUS_SCRATCH_SIZE</dt> -** <dd>This parameter records the largest memory allocation request -** handed to [scratch memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.</dd>)^ +** [[SQLITE_STATUS_SCRATCH_SIZE]] <dt>SQLITE_STATUS_SCRATCH_SIZE</dt> +** <dd>No longer used.</dd> ** ** [[SQLITE_STATUS_PARSER_STACK]] ^(<dt>SQLITE_STATUS_PARSER_STACK</dt> -** <dd>This parameter records the deepest parser stack. It is only +** <dd>The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only ** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].</dd>)^ ** </dl> ** @@ -6555,16 +8402,17 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF #define SQLITE_STATUS_MEMORY_USED 0 #define SQLITE_STATUS_PAGECACHE_USED 1 #define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 -#define SQLITE_STATUS_SCRATCH_USED 3 -#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 +#define SQLITE_STATUS_SCRATCH_USED 3 /* NOT USED */ +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 /* NOT USED */ #define SQLITE_STATUS_MALLOC_SIZE 5 #define SQLITE_STATUS_PARSER_STACK 6 #define SQLITE_STATUS_PAGECACHE_SIZE 7 -#define SQLITE_STATUS_SCRATCH_SIZE 8 +#define SQLITE_STATUS_SCRATCH_SIZE 8 /* NOT USED */ #define SQLITE_STATUS_MALLOC_COUNT 9 /* ** CAPI3REF: Database Connection Status +** METHOD: sqlite3 ** ** ^This interface is used to retrieve runtime status information ** about a single [database connection]. ^The first argument is the @@ -6631,6 +8479,18 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** memory used by all pager caches associated with the database connection.)^ ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. ** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(<dt>SQLITE_DBSTATUS_CACHE_USED_SHARED</dt> +** <dd>This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** ** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(<dt>SQLITE_DBSTATUS_SCHEMA_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap ** memory used to store the schema for all databases associated @@ -6670,6 +8530,15 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. ** </dd> ** +** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(<dt>SQLITE_DBSTATUS_CACHE_SPILL</dt> +** <dd>This parameter returns the number of dirty cache entries that have +** been written to disk in the middle of a transaction due to the page +** cache overflowing. Transactions are more efficient if they are written +** to disk all at once. When pages spill mid-transaction, that introduces +** additional overhead. This parameter can be used help identify +** inefficiencies that can be resolve by increasing the cache size. +** </dd> +** ** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(<dt>SQLITE_DBSTATUS_DEFERRED_FKS</dt> ** <dd>This parameter returns zero for the current value if and only if ** all foreign key constraints (deferred or immediate) have been @@ -6688,11 +8557,14 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r #define SQLITE_DBSTATUS_CACHE_MISS 8 #define SQLITE_DBSTATUS_CACHE_WRITE 9 #define SQLITE_DBSTATUS_DEFERRED_FKS 10 -#define SQLITE_DBSTATUS_MAX 10 /* Largest defined DBSTATUS */ +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_CACHE_SPILL 12 +#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */ /* ** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt ** ** ^(Each prepared statement maintains various ** [SQLITE_STMTSTATUS counters] that measure the number @@ -6750,6 +8622,24 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** used as a proxy for the total work done by the prepared statement. ** If the number of virtual machine operations exceeds 2147483647 ** then the value returned by this statement status code is undefined. +** +** [[SQLITE_STMTSTATUS_REPREPARE]] <dt>SQLITE_STMTSTATUS_REPREPARE</dt> +** <dd>^This is the number of times that the prepare statement has been +** automatically regenerated due to schema changes or change to +** [bound parameters] that might affect the query plan. +** +** [[SQLITE_STMTSTATUS_RUN]] <dt>SQLITE_STMTSTATUS_RUN</dt> +** <dd>^This is the number of times that the prepared statement has +** been run. A single "run" for the purposes of this counter is one +** or more calls to [sqlite3_step()] followed by a call to [sqlite3_reset()]. +** The counter is incremented on the first [sqlite3_step()] call of each +** cycle. +** +** [[SQLITE_STMTSTATUS_MEMUSED]] <dt>SQLITE_STMTSTATUS_MEMUSED</dt> +** <dd>^This is the approximate number of bytes of heap memory +** used to store the prepared statement. ^This value is not actually +** a counter, and so the resetFlg parameter to sqlite3_stmt_status() +** is ignored when the opcode is SQLITE_STMTSTATUS_MEMUSED. ** </dd> ** </dl> */ @@ -6757,6 +8647,9 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); #define SQLITE_STMTSTATUS_SORT 2 #define SQLITE_STMTSTATUS_AUTOINDEX 3 #define SQLITE_STMTSTATUS_VM_STEP 4 +#define SQLITE_STMTSTATUS_REPREPARE 5 +#define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_MEMUSED 99 /* ** CAPI3REF: Custom Page Cache Object @@ -7041,7 +8934,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** must be different or else sqlite3_backup_init(D,N,S,M) will fail with ** an error. ** -** ^A call to sqlite3_backup_init() will fail, returning SQLITE_ERROR, if +** ^A call to sqlite3_backup_init() will fail, returning NULL, if ** there is already a read or read-write transaction open on the ** destination database. ** @@ -7137,20 +9030,20 @@ typedef struct sqlite3_backup sqlite3_backup; ** is not a permanent error and does not affect the return value of ** sqlite3_backup_finish(). ** -** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]] +** [[sqlite3_backup_remaining()]] [[sqlite3_backup_pagecount()]] ** <b>sqlite3_backup_remaining() and sqlite3_backup_pagecount()</b> ** -** ^Each call to sqlite3_backup_step() sets two values inside -** the [sqlite3_backup] object: the number of pages still to be backed -** up and the total number of pages in the source database file. -** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces -** retrieve these two values, respectively. -** -** ^The values returned by these functions are only updated by -** sqlite3_backup_step(). ^If the source database is modified during a backup -** operation, then the values are not updated to account for any extra -** pages that need to be updated or the size of the source database file -** changing. +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ ** ** <b>Concurrent Usage of Database Handles</b> ** @@ -7196,6 +9089,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); /* ** CAPI3REF: Unlock Notification +** METHOD: sqlite3 ** ** ^When running in shared-cache mode, a database operation may fail with ** an [SQLITE_LOCKED] error if the required locks on the shared-cache or @@ -7329,18 +9223,43 @@ SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); /* ** CAPI3REF: String Globbing * -** ^The [sqlite3_strglob(P,X)] interface returns zero if string X matches -** the glob pattern P, and it returns non-zero if string X does not match -** the glob pattern P. ^The definition of glob pattern matching used in +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in ** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the -** SQL dialect used by SQLite. ^The sqlite3_strglob(P,X) function is case -** sensitive. +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. ** ** Note that this routine returns zero on a match and non-zero if the strings ** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. */ SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + /* ** CAPI3REF: Error Logging Interface ** @@ -7366,6 +9285,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); /* ** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 ** ** ^The [sqlite3_wal_hook()] function is used to register a callback that ** is invoked each time data is committed to a database in wal mode. @@ -7395,7 +9315,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** previously registered write-ahead log callback. ^Note that the ** [sqlite3_wal_autocheckpoint()] interface and the ** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** those overwrite any prior [sqlite3_wal_hook()] settings. +** overwrite any prior [sqlite3_wal_hook()] settings. */ SQLITE_API void *sqlite3_wal_hook( sqlite3*, @@ -7405,6 +9325,7 @@ SQLITE_API void *sqlite3_wal_hook( /* ** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 ** ** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around ** [sqlite3_wal_hook()] that causes any database on [database connection] D @@ -7435,6 +9356,7 @@ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); /* ** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 ** ** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to ** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ @@ -7456,6 +9378,7 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); /* ** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 ** ** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint ** operation on database X of [database connection] D in mode M. Status @@ -7636,6 +9559,40 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); */ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); +/* +** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE +** +** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn] +** method of a [virtual table], then it returns true if and only if the +** column is being fetched as part of an UPDATE operation during which the +** column value will not change. Applications might use this to substitute +** a return value that is less expensive to compute and that the corresponding +** [xUpdate] method understands as a "no-change" value. +** +** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that +** the column is not changed by the UPDATE statement, then the xColumn +** method can optionally return without setting a result, without calling +** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces]. +** In that case, [sqlite3_value_nochange(X)] will return true for the +** same column in the [xUpdate] method. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); + +/* +** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** +** This function may only be called from within a call to the [xBestIndex] +** method of a [virtual table]. +** +** The first argument must be the sqlite3_index_info object that is the +** first parameter to the xBestIndex() method. The second argument must be +** an index into the aConstraint[] array belonging to the sqlite3_index_info +** structure passed to xBestIndex. This function returns a pointer to a buffer +** containing the name of the collation sequence for the corresponding +** constraint. +*/ +SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); + /* ** CAPI3REF: Conflict resolution modes ** KEYWORDS: {conflict resolution mode} @@ -7710,6 +9667,7 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); /* ** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt ** ** This interface returns information about the predicted and measured ** performance for pStmt. Advanced applications can use this @@ -7738,7 +9696,7 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); ** ** See also: [sqlite3_stmt_scanstatus_reset()] */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_scanstatus( +SQLITE_API int sqlite3_stmt_scanstatus( sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ int idx, /* Index of loop to report on */ int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ @@ -7747,14 +9705,461 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_scanstatus( /* ** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt ** ** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. ** ** This API is only available if the library is built with pre-processor ** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. */ -SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); +/* +** CAPI3REF: Flush caches to disk mid-transaction +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a database table. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to real database tables; the +** preupdate hook is not invoked for changes to [virtual tables] or to +** system tables like sqlite_master or sqlite_stat1. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** +** For an UPDATE or DELETE operation on a [rowid table], the sixth +** parameter passed to the preupdate callback is the initial [rowid] of the +** row being modified or deleted. For an INSERT operation on a rowid table, +** or any operation on a WITHOUT ROWID table, the value of the sixth +** parameter is undefined. For an INSERT or UPDATE on a rowid table the +** seventh parameter is the final rowid value of the row being inserted +** or updated. The value of the seventh parameter passed to the callback +** function is not defined for operations on WITHOUT ROWID tables, or for +** INSERT operations on rowid tables. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** See also: [sqlite3_update_hook()] +*/ +#if defined(SQLITE_ENABLE_PREUPDATE_HOOK) +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +#endif + +/* +** CAPI3REF: Low-level system error code +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} {sqlite3_snapshot} +** EXPERIMENTAL +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +** +** The constructor for this object is [sqlite3_snapshot_get()]. The +** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer +** to an historical snapshot (if possible). The destructor for +** sqlite3_snapshot objects is [sqlite3_snapshot_free()]. +*/ +typedef struct sqlite3_snapshot { + unsigned char hidden[48]; +} sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** If there is not already a read-transaction open on schema S when +** this function is called, one is opened automatically. +** +** The following must be true for this function to succeed. If any of +** the following statements are false when sqlite3_snapshot_get() is +** called, SQLITE_ERROR is returned. The final value of *P is undefined +** in this case. +** +** <ul> +** <li> The database handle must be in [autocommit mode]. +** +** <li> Schema S of [database connection] D must be a [WAL mode] database. +** +** <li> There must not be a write transaction open on schema S of database +** connection D. +** +** <li> One or more transactions must have been written to the current wal +** file since it was created on disk (by any connection). This means +** that a snapshot cannot be taken on a wal mode database with no wal +** file immediately after it is first opened. At least one transaction +** must be written to it first. +** </ul> +** +** This function may also return SQLITE_NOMEM. If it is called with the +** database handle in autocommit mode but fails for some other reason, +** whether or not a read transaction is opened on schema S is undefined. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a +** read transaction for schema S of +** [database connection] D such that the read transaction +** refers to historical [snapshot] P, rather than the most +** recent change to the database. +** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success +** or an appropriate [error code] if it fails. +** +** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be +** the first operation following the [BEGIN] that takes the schema S +** out of [autocommit mode]. +** ^In other words, schema S must not currently be in +** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the +** database connection D must be out of [autocommit mode]. +** ^A [snapshot] will fail to open if it has been overwritten by a +** [checkpoint]. +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** EXPERIMENTAL +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** CAPI3REF: Recover snapshots from a wal file +** EXPERIMENTAL +** +** If all connections disconnect from a database file but do not perform +** a checkpoint, the existing wal file is opened along with the database +** file the next time the database is opened. At this point it is only +** possible to successfully call sqlite3_snapshot_open() to open the most +** recent snapshot of the database (the one at the head of the wal file), +** even though the wal file may contain other valid snapshots for which +** clients have sqlite3_snapshot handles. +** +** This function attempts to scan the wal file associated with database zDb +** of database handle db and make all valid snapshots available to +** sqlite3_snapshot_open(). It is an error if there is already a read +** transaction open on the database, or if the database is not a wal mode +** database. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Serialize a database +** +** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory +** that is a serialization of the S database on [database connection] D. +** If P is not a NULL pointer, then the size of the database in bytes +** is written into *P. +** +** For an ordinary on-disk database file, the serialization is just a +** copy of the disk file. For an in-memory database or a "TEMP" database, +** the serialization is the same sequence of bytes which would be written +** to disk if that database where backed up to disk. +** +** The usual case is that sqlite3_serialize() copies the serialization of +** the database into memory obtained from [sqlite3_malloc64()] and returns +** a pointer to that memory. The caller is responsible for freeing the +** returned value to avoid a memory leak. However, if the F argument +** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations +** are made, and the sqlite3_serialize() function will return a pointer +** to the contiguous memory representation of the database that SQLite +** is currently using for that database, or NULL if the no such contiguous +** memory representation of the database exists. A contiguous memory +** representation of the database will usually only exist if there has +** been a prior call to [sqlite3_deserialize(D,S,...)] with the same +** values of D and S. +** The size of the database is written into *P even if the +** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy +** of the database exists. +** +** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the +** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory +** allocation error occurs. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_DESERIALIZE] option. +*/ +SQLITE_API unsigned char *sqlite3_serialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */ + sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */ + unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_serialize +** +** Zero or more of the following constants can be OR-ed together for +** the F argument to [sqlite3_serialize(D,S,P,F)]. +** +** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return +** a pointer to contiguous in-memory database that it is currently using, +** without making a copy of the database. If SQLite is not currently using +** a contiguous in-memory database, then this option causes +** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be +** using a contiguous in-memory database if it has been initialized by a +** prior call to [sqlite3_deserialize()]. +*/ +#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */ + +/* +** CAPI3REF: Deserialize a database +** +** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the +** [database connection] D to disconnect from database S and then +** reopen S as an in-memory database based on the serialization contained +** in P. The serialized database P is N bytes in size. M is the size of +** the buffer P, which might be larger than N. If M is larger than N, and +** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is +** permitted to add content to the in-memory database as long as the total +** size does not exceed M bytes. +** +** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will +** invoke sqlite3_free() on the serialization buffer when the database +** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then +** SQLite will try to increase the buffer size using sqlite3_realloc64() +** if writes on the database cause it to grow larger than M bytes. +** +** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the +** database is currently in a read transaction or is involved in a backup +** operation. +** +** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the +** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then +** [sqlite3_free()] is invoked on argument P prior to returning. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_DESERIALIZE] option. +*/ +SQLITE_API int sqlite3_deserialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to reopen with the deserialization */ + unsigned char *pData, /* The serialized database content */ + sqlite3_int64 szDb, /* Number bytes in the deserialization */ + sqlite3_int64 szBuf, /* Total size of buffer pData[] */ + unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_deserialize() +** +** The following are allowed values for 6th argument (the F argument) to +** the [sqlite3_deserialize(D,S,P,N,M,F)] interface. +** +** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization +** in the P argument is held in memory obtained from [sqlite3_malloc64()] +** and that SQLite should take ownership of this memory and automatically +** free it when it has finished using it. Without this flag, the caller +** is resposible for freeing any dynamically allocated memory. +** +** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to +** grow the size of the database using calls to [sqlite3_realloc64()]. This +** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used. +** Without this flag, the deserialized database cannot increase in size beyond +** the number of bytes specified by the M parameter. +** +** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database +** should be treated as read-only. +*/ +#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */ +#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */ +#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */ /* ** Undo the hack that converts floating point types to integer for @@ -7767,8 +10172,9 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*) #if 0 } /* End of the 'extern "C"' block */ #endif -#endif /* _SQLITE3_H_ */ +#endif /* SQLITE3_H */ +/******** Begin file sqlite3rtree.h *********/ /* ** 2010 August 30 ** @@ -7868,6 +10274,8 @@ struct sqlite3_rtree_query_info { int eParentWithin; /* Visibility of parent node */ int eWithin; /* OUT: Visiblity */ sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ }; /* @@ -7884,6 +10292,2173 @@ struct sqlite3_rtree_query_info { #endif /* ifndef _SQLITE3RTREE_H_ */ +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +** +** An instance of this object is a [session] that can be used to +** record changes to a database. +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +** +** An instance of this object acts as a cursor for iterating +** over the elements of a [changeset] or [patchset]. +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** CONSTRUCTOR: sqlite3_session +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +SQLITE_API int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** DESTRUCTOR: sqlite3_session +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); + + +/* +** CAPI3REF: Enable Or Disable A Session Object +** METHOD: sqlite3_session +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** METHOD: sqlite3_session +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +** <ul> +** <li> The session object "indirect" flag is set when the change is +** made, or +** <li> The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +** </ul> +** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** METHOD: sqlite3_session +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +** +** <h3>Special sqlite_stat1 Handling</h3> +** +** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to +** some of the rules above. In SQLite, the schema of sqlite_stat1 is: +** <pre> +**   CREATE TABLE sqlite_stat1(tbl,idx,stat) +** </pre> +** +** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are +** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes +** are recorded for rows for which (idx IS NULL) is true. However, for such +** rows a zero-length blob (SQL value X'') is stored in the changeset or +** patchset instead of a NULL value. This allows such changesets to be +** manipulated by legacy implementations of sqlite3changeset_invert(), +** concat() and similar. +** +** The sqlite3changeset_apply() function automatically converts the +** zero-length blob back to a NULL value when updating the sqlite_stat1 +** table. However, if the application calls sqlite3changeset_new(), +** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset +** iterator directly (including on a changeset iterator passed to a +** conflict-handler callback) then the X'' value is returned. The application +** must translate X'' to NULL itself if required. +** +** Legacy (older than 3.22.0) versions of the sessions module cannot capture +** changes made to the sqlite_stat1 table. Legacy versions of the +** sqlite3changeset_apply() function silently ignore any modifications to the +** sqlite_stat1 table that are part of a changeset or patchset. +*/ +SQLITE_API int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** METHOD: sqlite3_session +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes is not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +SQLITE_API void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** METHOD: sqlite3_session +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +** <h3>Changeset Generation</h3> +** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +** <ul> +** <li> For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +** <li> For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +** </ul> +** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +SQLITE_API int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** METHOD: sqlite3_session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +** <ul> +** <li> Has the same name, +** <li> Has the same set of columns declared in the same order, and +** <li> Has the same PRIMARY KEY definition. +** </ul> +** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +** <ul> +** <li> For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +** <li> For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +** <li> For each row (primary key) that exists in both tables, but features +** different non-PK values in each, an UPDATE record is added to the +** session. +** </ul> +** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +SQLITE_API int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** METHOD: sqlite3_session +** +** The differences between a patchset and a changeset are that: +** +** <ul> +** <li> DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +** <li> The original values of any modified fields are omitted from +** UPDATE records. +** </ul> +** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +SQLITE_API int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppPatchset */ + void **ppPatchset /* OUT: Buffer containing patchset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** CONSTRUCTOR: sqlite3_changeset_iter +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +** <ul> +** <li> [sqlite3changeset_next()] +** <li> [sqlite3changeset_op()] +** <li> [sqlite3changeset_new()] +** <li> [sqlite3changeset_old()] +** </ul> +** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +*/ +SQLITE_API int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); + + +/* +** CAPI3REF: Advance A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function may only be used with iterators created by function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** If argument pzTab is not NULL, then *pzTab is set to point to a +** nul-terminated utf-8 encoded string containing the name of the table +** affected by the current change. The buffer remains valid until either +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** set to the number of columns in the table affected by the change. If +** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** type of change that the iterator currently points to. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +SQLITE_API int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** METHOD: sqlite3_changeset_iter +** +** For each modified table, a changeset includes the following: +** +** <ul> +** <li> The number of columns in the table, and +** <li> Which of those columns make up the tables PRIMARY KEY. +** </ul> +** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +SQLITE_API int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** METHOD: sqlite3_changeset_iter +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +SQLITE_API int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +** <pre> +** sqlite3changeset_start(); +** while( SQLITE_ROW==sqlite3changeset_next() ){ +** // Do something with change. +** } +** rc = sqlite3changeset_finalize(); +** if( rc!=SQLITE_OK ){ +** // An error has occurred +** } +** </pre> +*/ +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +** <ul> +** <li> Each DELETE change is changed to an INSERT, and +** <li> Each INSERT change is changed to a DELETE, and +** <li> For each UPDATE change, the old.* and new.* values are exchanged. +** </ul> +** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +SQLITE_API int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +** <pre> +** sqlite3_changegroup *pGrp; +** rc = sqlite3_changegroup_new(&pGrp); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB); +** if( rc==SQLITE_OK ){ +** rc = sqlite3changegroup_output(pGrp, pnOut, ppOut); +** }else{ +** *ppOut = 0; +** *pnOut = 0; +** } +** </pre> +** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +SQLITE_API int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +** +** A changegroup is an object used to combine two or more +** [changesets] or [patchsets] +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** CONSTRUCTOR: sqlite3_changegroup +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +** <ul> +** <li> It is created using a call to sqlite3changegroup_new(). +** +** <li> Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +** <li> The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +** <li> The object is deleted using a call to sqlite3changegroup_delete(). +** </ul> +** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** METHOD: sqlite3_changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** <table border=1 style="margin-left:8ex;margin-right:8ex"> +** <tr><th style="white-space:pre">Existing Change </th> +** <th style="white-space:pre">New Change </th> +** <th>Output Change +** <tr><td>INSERT <td>INSERT <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** <tr><td>INSERT <td>UPDATE <td> +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +** <tr><td>INSERT <td>DELETE <td> +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +** <tr><td>UPDATE <td>INSERT <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** <tr><td>UPDATE <td>UPDATE <td> +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +** <tr><td>UPDATE <td>DELETE <td> +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +** <tr><td>DELETE <td>INSERT <td> +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +** <tr><td>DELETE <td>UPDATE <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** <tr><td>DELETE <td>DELETE <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** </table> +** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the +** final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** METHOD: sqlite3_changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +SQLITE_API int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +** DESTRUCTOR: sqlite3_changegroup +*/ +SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset or patchset to a database. These functions attempt to +** update the "main" database attached to handle db with the changes found in +** the changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to these functions is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument as the first. If the "filter callback" +** returns zero, then no attempt is made to apply any changes to the table. +** Otherwise, if the return value is non-zero or the xFilter argument to +** is NULL, all changes related to the table are attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +** <ul> +** <li> The table has the same name as the name recorded in the +** changeset, and +** <li> The table has at least as many columns as recorded in the +** changeset, and +** <li> The table has primary key columns in the same position as +** recorded in the changeset. +** </ul> +** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +** <dl> +** <dt>DELETE Changes<dd> +** For each DELETE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. If the +** database table has more columns than are recorded in the changeset, +** only the values of those non-primary key fields are compared against +** the current database contents - any trailing database table columns +** are ignored. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +** <dt>INSERT Changes<dd> +** For each INSERT change, an attempt is made to insert the new row into +** the database. If the changeset row contains fewer fields than the +** database table, the trailing fields are populated with their default +** values. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +** <dt>UPDATE Changes<dd> +** For each UPDATE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all modified non-primary key columns also match the values +** stored in the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the modified non-primary key fields contains a value different from an +** original row value stored in the changeset, the conflict-handler function +** is invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** </dl> +** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the applications conflict +** resolution strategy. +** +** All changes made by these functions are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +** +** If the output parameters (ppRebase) and (pnRebase) are non-NULL and +** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2() +** may set (*ppRebase) to point to a "rebase" that may be used with the +** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase) +** is set to the size of the buffer in bytes. It is the responsibility of the +** caller to eventually free any such buffer using sqlite3_free(). The buffer +** is only allocated and populated if one or more conflicts were encountered +** while applying the patchset. See comments surrounding the sqlite3_rebaser +** APIs for further details. +** +** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter. +** +** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b> +** and therefore subject to change. +*/ +SQLITE_API int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, /* OUT: Rebase data */ + int flags /* Combination of SESSION_APPLY_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_apply_v2 +** +** The following flags may passed via the 9th parameter to +** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]: +** +** <dl> +** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd> +** Usually, the sessions module encloses all operations performed by +** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The +** SAVEPOINT is committed if the changeset or patchset is successfully +** applied, or rolled back if an error occurs. Specifying this flag +** causes the sessions module to omit this savepoint. In this case, if the +** caller has an open transaction or savepoint when apply_v2() is called, +** it may revert the partially applied changeset by rolling it back. +*/ +#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +** <dl> +** <dt>SQLITE_CHANGESET_DATA<dd> +** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +** <dt>SQLITE_CHANGESET_NOTFOUND<dd> +** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +** <dt>SQLITE_CHANGESET_CONFLICT<dd> +** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +** <dt>SQLITE_CHANGESET_FOREIGN_KEY<dd> +** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +** <dt>SQLITE_CHANGESET_CONSTRAINT<dd> +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +** </dl> +*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +** <dl> +** <dt>SQLITE_CHANGESET_OMIT<dd> +** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +** <dt>SQLITE_CHANGESET_REPLACE<dd> +** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +** <dt>SQLITE_CHANGESET_ABORT<dd> +** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +** </dl> +*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Rebasing changesets +** EXPERIMENTAL +** +** Suppose there is a site hosting a database in state S0. And that +** modifications are made that move that database to state S1 and a +** changeset recorded (the "local" changeset). Then, a changeset based +** on S0 is received from another site (the "remote" changeset) and +** applied to the database. The database is then in state +** (S1+"remote"), where the exact state depends on any conflict +** resolution decisions (OMIT or REPLACE) made while applying "remote". +** Rebasing a changeset is to update it to take those conflict +** resolution decisions into account, so that the same conflicts +** do not have to be resolved elsewhere in the network. +** +** For example, if both the local and remote changesets contain an +** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)": +** +** local: INSERT INTO t1 VALUES(1, 'v1'); +** remote: INSERT INTO t1 VALUES(1, 'v2'); +** +** and the conflict resolution is REPLACE, then the INSERT change is +** removed from the local changeset (it was overridden). Or, if the +** conflict resolution was "OMIT", then the local changeset is modified +** to instead contain: +** +** UPDATE t1 SET b = 'v2' WHERE a=1; +** +** Changes within the local changeset are rebased as follows: +** +** <dl> +** <dt>Local INSERT<dd> +** This may only conflict with a remote INSERT. If the conflict +** resolution was OMIT, then add an UPDATE change to the rebased +** changeset. Or, if the conflict resolution was REPLACE, add +** nothing to the rebased changeset. +** +** <dt>Local DELETE<dd> +** This may conflict with a remote UPDATE or DELETE. In both cases the +** only possible resolution is OMIT. If the remote operation was a +** DELETE, then add no change to the rebased changeset. If the remote +** operation was an UPDATE, then the old.* fields of change are updated +** to reflect the new.* values in the UPDATE. +** +** <dt>Local UPDATE<dd> +** This may conflict with a remote UPDATE or DELETE. If it conflicts +** with a DELETE, and the conflict resolution was OMIT, then the update +** is changed into an INSERT. Any undefined values in the new.* record +** from the update change are filled in using the old.* values from +** the conflicting DELETE. Or, if the conflict resolution was REPLACE, +** the UPDATE change is simply omitted from the rebased changeset. +** +** If conflict is with a remote UPDATE and the resolution is OMIT, then +** the old.* values are rebased using the new.* values in the remote +** change. Or, if the resolution is REPLACE, then the change is copied +** into the rebased changeset with updates to columns also updated by +** the conflicting remote UPDATE removed. If this means no columns would +** be updated, the change is omitted. +** </dl> +** +** A local change may be rebased against multiple remote changes +** simultaneously. If a single key is modified by multiple remote +** changesets, they are combined as follows before the local changeset +** is rebased: +** +** <ul> +** <li> If there has been one or more REPLACE resolutions on a +** key, it is rebased according to a REPLACE. +** +** <li> If there have been no REPLACE resolutions on a key, then +** the local changeset is rebased according to the most recent +** of the OMIT resolutions. +** </ul> +** +** Note that conflict resolutions from multiple remote changesets are +** combined on a per-field basis, not per-row. This means that in the +** case of multiple remote UPDATE operations, some fields of a single +** local change may be rebased for REPLACE while others are rebased for +** OMIT. +** +** In order to rebase a local changeset, the remote changeset must first +** be applied to the local database using sqlite3changeset_apply_v2() and +** the buffer of rebase information captured. Then: +** +** <ol> +** <li> An sqlite3_rebaser object is created by calling +** sqlite3rebaser_create(). +** <li> The new object is configured with the rebase buffer obtained from +** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure(). +** If the local changeset is to be rebased against multiple remote +** changesets, then sqlite3rebaser_configure() should be called +** multiple times, in the same order that the multiple +** sqlite3changeset_apply_v2() calls were made. +** <li> Each local changeset is rebased by calling sqlite3rebaser_rebase(). +** <li> The sqlite3_rebaser object is deleted by calling +** sqlite3rebaser_delete(). +** </ol> +*/ +typedef struct sqlite3_rebaser sqlite3_rebaser; + +/* +** CAPI3REF: Create a changeset rebaser object. +** EXPERIMENTAL +** +** Allocate a new changeset rebaser object. If successful, set (*ppNew) to +** point to the new object and return SQLITE_OK. Otherwise, if an error +** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew) +** to NULL. +*/ +SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); + +/* +** CAPI3REF: Configure a changeset rebaser object. +** EXPERIMENTAL +** +** Configure the changeset rebaser object to rebase changesets according +** to the conflict resolutions described by buffer pRebase (size nRebase +** bytes), which must have been obtained from a previous call to +** sqlite3changeset_apply_v2(). +*/ +SQLITE_API int sqlite3rebaser_configure( + sqlite3_rebaser*, + int nRebase, const void *pRebase +); + +/* +** CAPI3REF: Rebase a changeset +** EXPERIMENTAL +** +** Argument pIn must point to a buffer containing a changeset nIn bytes +** in size. This function allocates and populates a buffer with a copy +** of the changeset rebased rebased according to the configuration of the +** rebaser object passed as the first argument. If successful, (*ppOut) +** is set to point to the new buffer containing the rebased changset and +** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the +** responsibility of the caller to eventually free the new buffer using +** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) +** are set to zero and an SQLite error code returned. +*/ +SQLITE_API int sqlite3rebaser_rebase( + sqlite3_rebaser*, + int nIn, const void *pIn, + int *pnOut, void **ppOut +); + +/* +** CAPI3REF: Delete a changeset rebaser object. +** EXPERIMENTAL +** +** Delete the changeset rebaser object and all associated resources. There +** should be one call to this function for each successful invocation +** of sqlite3rebaser_create(). +*/ +SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** <table border=1 style="margin-left:8ex;margin-right:8ex"> +** <tr><th>Streaming function<th>Non-streaming equivalent</th> +** <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply] +** <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2] +** <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat] +** <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert] +** <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start] +** <tr><td>sqlite3session_changeset_strm<td>[sqlite3session_changeset] +** <tr><td>sqlite3session_patchset_strm<td>[sqlite3session_patchset] +** </table> +** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +** <pre> +**   int nChangeset, +**   void *pChangeset, +** </pre> +** +** Is replaced by: +** +** <pre> +**   int (*xInput)(void *pIn, void *pData, int *pnData), +**   void *pIn, +** </pre> +** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +** <pre> +**   int *pnChangeset, +**   void **ppChangeset, +** </pre> +** +** Is replaced by: +** +** <pre> +**   int (*xOutput)(void *pOut, const void *pData, int nData), +**   void *pOut +** </pre> +** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +SQLITE_API int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +); +SQLITE_API int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3rebaser_rebase_strm( + sqlite3_rebaser *pRebaser, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + + +/* +** Make sure we can call this stuff from C++. +*/ +#if 0 +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#if 0 +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. The exception is if the table was created +** with the offsets=0 option specified. In this case *piOff is always +** set to -1. +** +** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) +** if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension functions +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** of the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, an +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +** <ul><li> <b>FTS5_TOKENIZE_DOCUMENT</b> - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +** <li> <b>FTS5_TOKENIZE_QUERY</b> - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +** <li> <b>(FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX)</b> - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +** <li> <b>FTS5_TOKENIZE_AUX</b> - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +** </ul> +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +** <ol><li> By mapping all synonyms to a single token. In this case, the +** In the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +** <li> By adding multiple synonyms for a single term to the FTS index. +** In this case, when tokenizing query text, the tokenizer may +** provide multiple synonyms for a single term within the document. +** FTS5 then queries the index for each synonym individually. For +** example, faced with the query: +** +** <codeblock> +** ... MATCH 'first place'</codeblock> +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** <codeblock> +** ... MATCH '(first OR 1st) place'</codeblock> +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +** <li> By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entires in the +** FTS index corresponding to both forms of the first token. +** </ol> +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a <i>tflags</i> argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** <codeblock> +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +**</codeblock> +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is subsituted for "1st" by the tokenizer, then the query: +** +** <codeblock> +** ... MATCH '1s*'</codeblock> +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ /************** End of sqlite3.h *********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -7892,8 +12467,9 @@ struct sqlite3_rtree_query_info { ** Include the configuration header output by 'configure' if we're using the ** autoconf-based build */ -#ifdef _HAVE_SQLITE_CONFIG_H -#include "config.h" +#if defined(_HAVE_SQLITE_CONFIG_H) && !defined(SQLITECONFIG_H) +/* #include "config.h" */ +#define SQLITECONFIG_H 1 #endif /************** Include sqliteLimit.h in the middle of sqliteInt.h ***********/ @@ -7987,7 +12563,7 @@ struct sqlite3_rtree_query_info { ** Not currently enforced. */ #ifndef SQLITE_MAX_VDBE_OP -# define SQLITE_MAX_VDBE_OP 25000 +# define SQLITE_MAX_VDBE_OP 250000000 #endif /* @@ -7998,14 +12574,16 @@ struct sqlite3_rtree_query_info { #endif /* -** The maximum number of in-memory pages to use for the main database -** table and for temporary tables. The SQLITE_DEFAULT_CACHE_SIZE +** The suggested maximum number of in-memory pages to use for +** the main database table and for temporary tables. +** +** IMPLEMENTATION-OF: R-30185-15359 The default suggested cache size is -2000, +** which means the cache size is limited to 2048000 bytes of memory. +** IMPLEMENTATION-OF: R-48205-43578 The default suggested cache size can be +** altered using the SQLITE_DEFAULT_CACHE_SIZE compile-time options. */ #ifndef SQLITE_DEFAULT_CACHE_SIZE -# define SQLITE_DEFAULT_CACHE_SIZE 2000 -#endif -#ifndef SQLITE_DEFAULT_TEMP_CACHE_SIZE -# define SQLITE_DEFAULT_TEMP_CACHE_SIZE 500 +# define SQLITE_DEFAULT_CACHE_SIZE -2000 #endif /* @@ -8018,8 +12596,9 @@ struct sqlite3_rtree_query_info { /* ** The maximum number of attached databases. This must be between 0 -** and 62. The upper bound on 62 is because a 64-bit integer bitmap -** is used internally to track attached databases. +** and 125. The upper bound of 125 is because the attached databases are +** counted using a signed 8-bit integer which has a maximum value of 127 +** and we have to allow 2 extra counts for the "main" and "temp" databases. */ #ifndef SQLITE_MAX_ATTACHED # define SQLITE_MAX_ATTACHED 10 @@ -8054,7 +12633,7 @@ struct sqlite3_rtree_query_info { ** The default size of a database page. */ #ifndef SQLITE_DEFAULT_PAGE_SIZE -# define SQLITE_DEFAULT_PAGE_SIZE 1024 +# define SQLITE_DEFAULT_PAGE_SIZE 4096 #endif #if SQLITE_DEFAULT_PAGE_SIZE>SQLITE_MAX_PAGE_SIZE # undef SQLITE_DEFAULT_PAGE_SIZE @@ -8135,7 +12714,7 @@ struct sqlite3_rtree_query_info { ** to the next, so we have developed the following set of #if statements ** to generate appropriate macros for a wide range of compilers. ** -** The correct "ANSI" way to do this is to use the intptr_t type. +** The correct "ANSI" way to do this is to use the intptr_t type. ** Unfortunately, that typedef is not available on all compilers, or ** if it is available, it requires an #include of specific headers ** that vary from one machine to the next. @@ -8171,6 +12750,25 @@ struct sqlite3_rtree_query_info { # define SQLITE_NOINLINE #endif +/* +** Make sure that the compiler intrinsics we desire are enabled when +** compiling with an appropriate version of MSVC unless prevented by +** the SQLITE_DISABLE_INTRINSIC define. +*/ +#if !defined(SQLITE_DISABLE_INTRINSIC) +# if defined(_MSC_VER) && _MSC_VER>=1400 +# if !defined(_WIN32_WCE) +# include <intrin.h> +# pragma intrinsic(_byteswap_ushort) +# pragma intrinsic(_byteswap_ulong) +# pragma intrinsic(_byteswap_uint64) +# pragma intrinsic(_ReadWriteBarrier) +# else +# include <cmnintrin.h> +# endif +# endif +#endif + /* ** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2. ** 0 means mutexes are permanently disable and the library is never @@ -8181,6 +12779,11 @@ struct sqlite3_rtree_query_info { ** ** Older versions of SQLite used an optional THREADSAFE macro. ** We support that for legacy. +** +** To ensure that the correct value of "THREADSAFE" is reported when querying +** for compile-time options at runtime (e.g. "PRAGMA compile_options"), this +** logic is partially replicated in ctime.c. If it is updated here, it should +** also be updated there. */ #if !defined(SQLITE_THREADSAFE) # if defined(THREADSAFE) @@ -8269,7 +12872,7 @@ struct sqlite3_rtree_query_info { ** is set. Thus NDEBUG becomes an opt-in rather than an opt-out ** feature. */ -#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) # define NDEBUG 1 #endif #if defined(NDEBUG) && defined(SQLITE_DEBUG) @@ -8284,7 +12887,7 @@ struct sqlite3_rtree_query_info { #endif /* -** The testcase() macro is used to aid in coverage testing. When +** The testcase() macro is used to aid in coverage testing. When ** doing coverage testing, the condition inside the argument to ** testcase() must be evaluated both true and false in order to ** get full branch coverage. The testcase() macro is inserted @@ -8330,7 +12933,7 @@ SQLITE_PRIVATE void sqlite3Coverage(int); #endif /* -** The ALWAYS and NEVER macros surround boolean expressions which +** The ALWAYS and NEVER macros surround boolean expressions which ** are intended to always be true or false, respectively. Such ** expressions could be omitted from the code completely. But they ** are included in a few cases in order to enhance the resilience @@ -8344,7 +12947,7 @@ SQLITE_PRIVATE void sqlite3Coverage(int); ** be true and false so that the unreachable code they specify will ** not be counted as untested code. */ -#if defined(SQLITE_COVERAGE_TEST) +#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) # define ALWAYS(X) (1) # define NEVER(X) (0) #elif !defined(NDEBUG) @@ -8355,6 +12958,69 @@ SQLITE_PRIVATE void sqlite3Coverage(int); # define NEVER(X) (X) #endif +/* +** Some conditionals are optimizations only. In other words, if the +** conditionals are replaced with a constant 1 (true) or 0 (false) then +** the correct answer is still obtained, though perhaps not as quickly. +** +** The following macros mark these optimizations conditionals. +*/ +#if defined(SQLITE_MUTATION_TEST) +# define OK_IF_ALWAYS_TRUE(X) (1) +# define OK_IF_ALWAYS_FALSE(X) (0) +#else +# define OK_IF_ALWAYS_TRUE(X) (X) +# define OK_IF_ALWAYS_FALSE(X) (X) +#endif + +/* +** Some malloc failures are only possible if SQLITE_TEST_REALLOC_STRESS is +** defined. We need to defend against those failures when testing with +** SQLITE_TEST_REALLOC_STRESS, but we don't want the unreachable branches +** during a normal build. The following macro can be used to disable tests +** that are always false except when SQLITE_TEST_REALLOC_STRESS is set. +*/ +#if defined(SQLITE_TEST_REALLOC_STRESS) +# define ONLY_IF_REALLOC_STRESS(X) (X) +#elif !defined(NDEBUG) +# define ONLY_IF_REALLOC_STRESS(X) ((X)?(assert(0),1):0) +#else +# define ONLY_IF_REALLOC_STRESS(X) (0) +#endif + +/* +** Declarations used for tracing the operating system interfaces. +*/ +#if defined(SQLITE_FORCE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) + extern int sqlite3OSTrace; +# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X +# define SQLITE_HAVE_OS_TRACE +#else +# define OSTRACE(X) +# undef SQLITE_HAVE_OS_TRACE +#endif + +/* +** Is the sqlite3ErrName() function needed in the build? Currently, +** it is needed by "mutex_w32.c" (when debugging), "os_win.c" (when +** OSTRACE is enabled), and by several "test*.c" files (which are +** compiled using SQLITE_TEST). +*/ +#if defined(SQLITE_HAVE_OS_TRACE) || defined(SQLITE_TEST) || \ + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) +# define SQLITE_NEED_ERR_NAME +#else +# undef SQLITE_NEED_ERR_NAME +#endif + +/* +** SQLITE_ENABLE_EXPLAIN_COMMENTS is incompatible with SQLITE_OMIT_EXPLAIN +*/ +#ifdef SQLITE_OMIT_EXPLAIN +# undef SQLITE_ENABLE_EXPLAIN_COMMENTS +#endif + /* ** Return true (non-zero) if the input is an integer that is too large ** to fit in 32-bits. This macro is used inside of various testcase() @@ -8388,8 +13054,8 @@ SQLITE_PRIVATE void sqlite3Coverage(int); ** This is the header file for the generic hash-table implementation ** used in SQLite. */ -#ifndef _SQLITE_HASH_H_ -#define _SQLITE_HASH_H_ +#ifndef SQLITE_HASH_H +#define SQLITE_HASH_H /* Forward declarations of structures. */ typedef struct Hash Hash; @@ -8469,7 +13135,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); */ /* #define sqliteHashCount(H) ((H)->count) // NOT USED */ -#endif /* _SQLITE_HASH_H_ */ +#endif /* SQLITE_HASH_H */ /************** End of hash.h ************************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -8501,64 +13167,64 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_AS 24 #define TK_WITHOUT 25 #define TK_COMMA 26 -#define TK_ID 27 -#define TK_INDEXED 28 -#define TK_ABORT 29 -#define TK_ACTION 30 -#define TK_AFTER 31 -#define TK_ANALYZE 32 -#define TK_ASC 33 -#define TK_ATTACH 34 -#define TK_BEFORE 35 -#define TK_BY 36 -#define TK_CASCADE 37 -#define TK_CAST 38 -#define TK_COLUMNKW 39 -#define TK_CONFLICT 40 -#define TK_DATABASE 41 -#define TK_DESC 42 -#define TK_DETACH 43 -#define TK_EACH 44 -#define TK_FAIL 45 -#define TK_FOR 46 -#define TK_IGNORE 47 -#define TK_INITIALLY 48 -#define TK_INSTEAD 49 -#define TK_LIKE_KW 50 -#define TK_MATCH 51 -#define TK_NO 52 -#define TK_KEY 53 -#define TK_OF 54 -#define TK_OFFSET 55 -#define TK_PRAGMA 56 -#define TK_RAISE 57 -#define TK_RECURSIVE 58 -#define TK_REPLACE 59 -#define TK_RESTRICT 60 -#define TK_ROW 61 -#define TK_TRIGGER 62 -#define TK_VACUUM 63 -#define TK_VIEW 64 -#define TK_VIRTUAL 65 -#define TK_WITH 66 -#define TK_REINDEX 67 -#define TK_RENAME 68 -#define TK_CTIME_KW 69 -#define TK_ANY 70 -#define TK_OR 71 -#define TK_AND 72 -#define TK_IS 73 -#define TK_BETWEEN 74 -#define TK_IN 75 -#define TK_ISNULL 76 -#define TK_NOTNULL 77 -#define TK_NE 78 -#define TK_EQ 79 -#define TK_GT 80 -#define TK_LE 81 -#define TK_LT 82 -#define TK_GE 83 -#define TK_ESCAPE 84 +#define TK_ABORT 27 +#define TK_ACTION 28 +#define TK_AFTER 29 +#define TK_ANALYZE 30 +#define TK_ASC 31 +#define TK_ATTACH 32 +#define TK_BEFORE 33 +#define TK_BY 34 +#define TK_CASCADE 35 +#define TK_CAST 36 +#define TK_CONFLICT 37 +#define TK_DATABASE 38 +#define TK_DESC 39 +#define TK_DETACH 40 +#define TK_EACH 41 +#define TK_FAIL 42 +#define TK_OR 43 +#define TK_AND 44 +#define TK_IS 45 +#define TK_MATCH 46 +#define TK_LIKE_KW 47 +#define TK_BETWEEN 48 +#define TK_IN 49 +#define TK_ISNULL 50 +#define TK_NOTNULL 51 +#define TK_NE 52 +#define TK_EQ 53 +#define TK_GT 54 +#define TK_LE 55 +#define TK_LT 56 +#define TK_GE 57 +#define TK_ESCAPE 58 +#define TK_ID 59 +#define TK_COLUMNKW 60 +#define TK_DO 61 +#define TK_FOR 62 +#define TK_IGNORE 63 +#define TK_INITIALLY 64 +#define TK_INSTEAD 65 +#define TK_NO 66 +#define TK_KEY 67 +#define TK_OF 68 +#define TK_OFFSET 69 +#define TK_PRAGMA 70 +#define TK_RAISE 71 +#define TK_RECURSIVE 72 +#define TK_REPLACE 73 +#define TK_RESTRICT 74 +#define TK_ROW 75 +#define TK_TRIGGER 76 +#define TK_VACUUM 77 +#define TK_VIEW 78 +#define TK_VIRTUAL 79 +#define TK_WITH 80 +#define TK_REINDEX 81 +#define TK_RENAME 82 +#define TK_CTIME_KW 83 +#define TK_ANY 84 #define TK_BITAND 85 #define TK_BITOR 86 #define TK_LSHIFT 87 @@ -8571,69 +13237,80 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #define TK_CONCAT 94 #define TK_COLLATE 95 #define TK_BITNOT 96 -#define TK_STRING 97 -#define TK_JOIN_KW 98 -#define TK_CONSTRAINT 99 -#define TK_DEFAULT 100 -#define TK_NULL 101 -#define TK_PRIMARY 102 -#define TK_UNIQUE 103 -#define TK_CHECK 104 -#define TK_REFERENCES 105 -#define TK_AUTOINCR 106 -#define TK_ON 107 -#define TK_INSERT 108 -#define TK_DELETE 109 -#define TK_UPDATE 110 -#define TK_SET 111 -#define TK_DEFERRABLE 112 -#define TK_FOREIGN 113 -#define TK_DROP 114 -#define TK_UNION 115 -#define TK_ALL 116 -#define TK_EXCEPT 117 -#define TK_INTERSECT 118 -#define TK_SELECT 119 -#define TK_VALUES 120 -#define TK_DISTINCT 121 -#define TK_DOT 122 -#define TK_FROM 123 -#define TK_JOIN 124 -#define TK_USING 125 -#define TK_ORDER 126 -#define TK_GROUP 127 -#define TK_HAVING 128 -#define TK_LIMIT 129 -#define TK_WHERE 130 -#define TK_INTO 131 -#define TK_INTEGER 132 -#define TK_FLOAT 133 -#define TK_BLOB 134 -#define TK_VARIABLE 135 -#define TK_CASE 136 -#define TK_WHEN 137 -#define TK_THEN 138 -#define TK_ELSE 139 -#define TK_INDEX 140 -#define TK_ALTER 141 -#define TK_ADD 142 -#define TK_TO_TEXT 143 -#define TK_TO_BLOB 144 -#define TK_TO_NUMERIC 145 -#define TK_TO_INT 146 -#define TK_TO_REAL 147 -#define TK_ISNOT 148 -#define TK_END_OF_FILE 149 -#define TK_ILLEGAL 150 -#define TK_SPACE 151 -#define TK_UNCLOSED_STRING 152 -#define TK_FUNCTION 153 -#define TK_COLUMN 154 -#define TK_AGG_FUNCTION 155 -#define TK_AGG_COLUMN 156 -#define TK_UMINUS 157 -#define TK_UPLUS 158 -#define TK_REGISTER 159 +#define TK_ON 97 +#define TK_INDEXED 98 +#define TK_STRING 99 +#define TK_JOIN_KW 100 +#define TK_CONSTRAINT 101 +#define TK_DEFAULT 102 +#define TK_NULL 103 +#define TK_PRIMARY 104 +#define TK_UNIQUE 105 +#define TK_CHECK 106 +#define TK_REFERENCES 107 +#define TK_AUTOINCR 108 +#define TK_INSERT 109 +#define TK_DELETE 110 +#define TK_UPDATE 111 +#define TK_SET 112 +#define TK_DEFERRABLE 113 +#define TK_FOREIGN 114 +#define TK_DROP 115 +#define TK_UNION 116 +#define TK_ALL 117 +#define TK_EXCEPT 118 +#define TK_INTERSECT 119 +#define TK_SELECT 120 +#define TK_VALUES 121 +#define TK_DISTINCT 122 +#define TK_DOT 123 +#define TK_FROM 124 +#define TK_JOIN 125 +#define TK_USING 126 +#define TK_ORDER 127 +#define TK_GROUP 128 +#define TK_HAVING 129 +#define TK_LIMIT 130 +#define TK_WHERE 131 +#define TK_INTO 132 +#define TK_NOTHING 133 +#define TK_FLOAT 134 +#define TK_BLOB 135 +#define TK_INTEGER 136 +#define TK_VARIABLE 137 +#define TK_CASE 138 +#define TK_WHEN 139 +#define TK_THEN 140 +#define TK_ELSE 141 +#define TK_INDEX 142 +#define TK_ALTER 143 +#define TK_ADD 144 +#define TK_TRUEFALSE 145 +#define TK_ISNOT 146 +#define TK_FUNCTION 147 +#define TK_COLUMN 148 +#define TK_AGG_FUNCTION 149 +#define TK_AGG_COLUMN 150 +#define TK_UMINUS 151 +#define TK_UPLUS 152 +#define TK_TRUTH 153 +#define TK_REGISTER 154 +#define TK_VECTOR 155 +#define TK_SELECT_COLUMN 156 +#define TK_IF_NULL_ROW 157 +#define TK_ASTERISK 158 +#define TK_SPAN 159 +#define TK_END_OF_FILE 160 +#define TK_UNCLOSED_STRING 161 +#define TK_SPACE 162 +#define TK_ILLEGAL 163 + +/* The token codes above must all fit in 8 bits */ +#define TKFLG_MASK 0xff + +/* Flags that can be added to a token code when it is not +** being stored in a u8: */ +#define TKFLG_DONTFOLD 0x100 /* Omit constant folding optimizations */ /************** End of parse.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -8643,6 +13320,18 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); #include <assert.h> #include <stddef.h> +/* +** Use a macro to replace memcpy() if compiled with SQLITE_INLINE_MEMCPY. +** This allows better measurements of where memcpy() is used when running +** cachegrind. But this macro version of memcpy() is very slow so it +** should not be used in production. This is a performance measurement +** hack only. +*/ +#ifdef SQLITE_INLINE_MEMCPY +# define memcpy(D,S,N) {char*xxd=(char*)(D);const char*xxs=(const char*)(S);\ + int xxn=(N);while(xxn-->0)*(xxd++)=*(xxs++);} +#endif + /* ** If compiling for a processor that lacks floating point support, ** substitute integer for floating-point @@ -8665,7 +13354,7 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); /* ** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 -** afterward. Having this macro allows us to cause the C compiler +** afterward. Having this macro allows us to cause the C compiler ** to omit code used by TEMP tables without messy #ifndef statements. */ #ifdef SQLITE_OMIT_TEMPDB @@ -8699,12 +13388,11 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); */ #ifndef SQLITE_TEMP_STORE # define SQLITE_TEMP_STORE 1 -# define SQLITE_TEMP_STORE_xc 1 /* Exclude from ctime.c */ #endif /* ** If no value has been provided for SQLITE_MAX_WORKER_THREADS, or if -** SQLITE_TEMP_STORE is set to 3 (never use temporary files), set it +** SQLITE_TEMP_STORE is set to 3 (never use temporary files), set it ** to zero. */ #if SQLITE_TEMP_STORE==3 || SQLITE_THREADSAFE==0 @@ -8722,6 +13410,34 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); # define SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_WORKER_THREADS #endif +/* +** The default initial allocation for the pagecache when using separate +** pagecaches for each database connection. A positive number is the +** number of pages. A negative number N translations means that a buffer +** of -1024*N bytes is allocated and used for as many pages as it will hold. +** +** The default value of "20" was choosen to minimize the run-time of the +** speedtest1 test program with options: --shrink-memory --reprepare +*/ +#ifndef SQLITE_DEFAULT_PCACHE_INITSZ +# define SQLITE_DEFAULT_PCACHE_INITSZ 20 +#endif + +/* +** Default value for the SQLITE_CONFIG_SORTERREF_SIZE option. +*/ +#ifndef SQLITE_DEFAULT_SORTERREF_SIZE +# define SQLITE_DEFAULT_SORTERREF_SIZE 0x7fffffff +#endif + +/* +** The compile-time options SQLITE_MMAP_READWRITE and +** SQLITE_ENABLE_BATCH_ATOMIC_WRITE are not compatible with one another. +** You must choose one or the other (or neither) but not both. +*/ +#if defined(SQLITE_MMAP_READWRITE) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +#error Cannot use both SQLITE_MMAP_READWRITE and SQLITE_ENABLE_BATCH_ATOMIC_WRITE +#endif /* ** GCC does not define the offsetof() macro so we'll have to do it @@ -8734,8 +13450,12 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash*); /* ** Macros to compute minimum and maximum of two numbers. */ -#define MIN(A,B) ((A)<(B)?(A):(B)) -#define MAX(A,B) ((A)>(B)?(A):(B)) +#ifndef MIN +# define MIN(A,B) ((A)<(B)?(A):(B)) +#endif +#ifndef MAX +# define MAX(A,B) ((A)>(B)?(A):(B)) +#endif /* ** Swap two objects of type TYPE. @@ -8843,45 +13563,83 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */ ** 4 -> 20 1000 -> 99 1048576 -> 200 ** 10 -> 33 1024 -> 100 4294967296 -> 320 ** -** The LogEst can be negative to indicate fractional values. +** The LogEst can be negative to indicate fractional values. ** Examples: ** ** 0.5 -> -10 0.1 -> -33 0.0625 -> -40 */ typedef INT16_TYPE LogEst; +/* +** Set the SQLITE_PTRSIZE macro to the number of bytes in a pointer +*/ +#ifndef SQLITE_PTRSIZE +# if defined(__SIZEOF_POINTER__) +# define SQLITE_PTRSIZE __SIZEOF_POINTER__ +# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(_M_ARM) || defined(__arm__) || defined(__x86) +# define SQLITE_PTRSIZE 4 +# else +# define SQLITE_PTRSIZE 8 +# endif +#endif + +/* The uptr type is an unsigned integer large enough to hold a pointer +*/ +#if defined(HAVE_STDINT_H) + typedef uintptr_t uptr; +#elif SQLITE_PTRSIZE==4 + typedef u32 uptr; +#else + typedef u64 uptr; +#endif + +/* +** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to +** something between S (inclusive) and E (exclusive). +** +** In other words, S is a buffer and E is a pointer to the first byte after +** the end of buffer S. This macro returns true if P points to something +** contained within the buffer S. +*/ +#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) + + /* ** Macros to determine whether the machine is big or little endian, ** and whether or not that determination is run-time or compile-time. ** ** For best performance, an attempt is made to guess at the byte-order ** using C-preprocessor macros. If that is unsuccessful, or if -** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined +** -DSQLITE_BYTEORDER=0 is set, then byte-order is determined ** at run-time. */ -#ifdef SQLITE_AMALGAMATION -SQLITE_PRIVATE const int sqlite3one = 1; -#else -SQLITE_PRIVATE const int sqlite3one; -#endif -#if (defined(i386) || defined(__i386__) || defined(_M_IX86) || \ +#ifndef SQLITE_BYTEORDER +# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ - defined(__arm__)) && !defined(SQLITE_RUNTIME_BYTEORDER) -# define SQLITE_BYTEORDER 1234 -# define SQLITE_BIGENDIAN 0 -# define SQLITE_LITTLEENDIAN 1 -# define SQLITE_UTF16NATIVE SQLITE_UTF16LE + defined(__arm__) +# define SQLITE_BYTEORDER 1234 +# elif defined(sparc) || defined(__ppc__) +# define SQLITE_BYTEORDER 4321 +# else +# define SQLITE_BYTEORDER 0 +# endif #endif -#if (defined(sparc) || defined(__ppc__)) \ - && !defined(SQLITE_RUNTIME_BYTEORDER) -# define SQLITE_BYTEORDER 4321 +#if SQLITE_BYTEORDER==4321 # define SQLITE_BIGENDIAN 1 # define SQLITE_LITTLEENDIAN 0 # define SQLITE_UTF16NATIVE SQLITE_UTF16BE -#endif -#if !defined(SQLITE_BYTEORDER) -# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ +#elif SQLITE_BYTEORDER==1234 +# define SQLITE_BIGENDIAN 0 +# define SQLITE_LITTLEENDIAN 1 +# define SQLITE_UTF16NATIVE SQLITE_UTF16LE +#else +# ifdef SQLITE_AMALGAMATION + const int sqlite3one = 1; +# else + extern const int sqlite3one; +# endif # define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) # define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) # define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) @@ -8895,7 +13653,7 @@ SQLITE_PRIVATE const int sqlite3one; #define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) #define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) -/* +/* ** Round up a number to the next larger multiple of 8. This is used ** to force 8-byte alignment on 64-bit architectures. */ @@ -8934,21 +13692,18 @@ SQLITE_PRIVATE const int sqlite3one; */ #ifdef __APPLE__ # include <TargetConditionals.h> -# if TARGET_OS_IPHONE -# undef SQLITE_MAX_MMAP_SIZE -# define SQLITE_MAX_MMAP_SIZE 0 -# endif #endif #ifndef SQLITE_MAX_MMAP_SIZE # if defined(__linux__) \ || defined(_WIN32) \ || (defined(__APPLE__) && defined(__MACH__)) \ - || defined(__sun) + || defined(__sun) \ + || defined(__FreeBSD__) \ + || defined(__DragonFly__) # define SQLITE_MAX_MMAP_SIZE 0x7fff0000 /* 2147418112 */ # else # define SQLITE_MAX_MMAP_SIZE 0 # endif -# define SQLITE_MAX_MMAP_SIZE_xc 1 /* exclude from ctime.c */ #endif /* @@ -8958,7 +13713,6 @@ SQLITE_PRIVATE const int sqlite3one; */ #ifndef SQLITE_DEFAULT_MMAP_SIZE # define SQLITE_DEFAULT_MMAP_SIZE 0 -# define SQLITE_DEFAULT_MMAP_SIZE_xc 1 /* Exclude from ctime.c */ #endif #if SQLITE_DEFAULT_MMAP_SIZE>SQLITE_MAX_MMAP_SIZE # undef SQLITE_DEFAULT_MMAP_SIZE @@ -8983,7 +13737,7 @@ SQLITE_PRIVATE const int sqlite3one; ** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not ** the Select query generator tracing logic is turned on. */ -#if defined(SQLITE_DEBUG) || defined(SQLITE_ENABLE_SELECTTRACE) +#if defined(SQLITE_ENABLE_SELECTTRACE) # define SELECTTRACE_ENABLED 1 #else # define SELECTTRACE_ENABLED 0 @@ -8991,7 +13745,7 @@ SQLITE_PRIVATE const int sqlite3one; /* ** An instance of the following structure is used to store the busy-handler -** callback for a given sqlite handle. +** callback for a given sqlite handle. ** ** The sqlite.busyHandler member of the sqlite struct contains the busy ** callback for the database handle. Each pager opened via the sqlite @@ -9000,9 +13754,10 @@ SQLITE_PRIVATE const int sqlite3one; */ typedef struct BusyHandler BusyHandler; struct BusyHandler { - int (*xFunc)(void *,int); /* The busy callback */ - void *pArg; /* First arg to busy callback */ - int nBusy; /* Incremented with each busy call */ + int (*xBusyHandler)(void *,int); /* The busy callback */ + void *pBusyArg; /* First arg to busy callback */ + int nBusy; /* Incremented with each busy call */ + u8 bExtraFileArg; /* Include sqlite3_file as callback arg */ }; /* @@ -9036,9 +13791,9 @@ struct BusyHandler { /* ** The following value as a destructor means to use sqlite3DbFree(). -** The sqlite3DbFree() routine requires two parameters instead of the -** one parameter that destructors normally want. So we have to introduce -** this magic value that the code knows to handle differently. Any +** The sqlite3DbFree() routine requires two parameters instead of the +** one parameter that destructors normally want. So we have to introduce +** this magic value that the code knows to handle differently. Any ** pointer will work here as long as it is distinct from SQLITE_STATIC ** and SQLITE_TRANSIENT. */ @@ -9062,19 +13817,19 @@ struct BusyHandler { #define SQLITE_WSD const #define GLOBAL(t,v) (*(t*)sqlite3_wsd_find((void*)&(v), sizeof(v))) #define sqlite3GlobalConfig GLOBAL(struct Sqlite3Config, sqlite3Config) -SQLITE_API int sqlite3_wsd_init(int N, int J); -SQLITE_API void *sqlite3_wsd_find(void *K, int L); +SQLITE_API int sqlite3_wsd_init(int N, int J); +SQLITE_API void *sqlite3_wsd_find(void *K, int L); #else - #define SQLITE_WSD + #define SQLITE_WSD #define GLOBAL(t,v) v #define sqlite3GlobalConfig sqlite3Config #endif /* ** The following macros are used to suppress compiler warnings and to -** make it clear to human readers when a function parameter is deliberately +** make it clear to human readers when a function parameter is deliberately ** left unused within the body of a function. This usually happens when -** a function is called via a function pointer. For example the +** a function is called via a function pointer. For example the ** implementation of an SQL aggregate step callback may not use the ** parameter indicating the number of arguments passed to the aggregate, ** if it knows that this is enforced elsewhere. @@ -9102,7 +13857,6 @@ typedef struct Db Db; typedef struct Schema Schema; typedef struct Expr Expr; typedef struct ExprList ExprList; -typedef struct ExprSpan ExprSpan; typedef struct FKey FKey; typedef struct FuncDestructor FuncDestructor; typedef struct FuncDef FuncDef; @@ -9117,6 +13871,7 @@ typedef struct LookasideSlot LookasideSlot; typedef struct Module Module; typedef struct NameContext NameContext; typedef struct Parse Parse; +typedef struct PreUpdate PreUpdate; typedef struct PrintfArguments PrintfArguments; typedef struct RowSet RowSet; typedef struct Savepoint Savepoint; @@ -9124,7 +13879,7 @@ typedef struct Select Select; typedef struct SQLiteThread SQLiteThread; typedef struct SelectDest SelectDest; typedef struct SrcList SrcList; -typedef struct StrAccum StrAccum; +typedef struct sqlite3_str StrAccum; /* Internal alias for sqlite3_str */ typedef struct Table Table; typedef struct TableLock TableLock; typedef struct Token Token; @@ -9133,14 +13888,23 @@ typedef struct Trigger Trigger; typedef struct TriggerPrg TriggerPrg; typedef struct TriggerStep TriggerStep; typedef struct UnpackedRecord UnpackedRecord; +typedef struct Upsert Upsert; typedef struct VTable VTable; typedef struct VtabCtx VtabCtx; typedef struct Walker Walker; typedef struct WhereInfo WhereInfo; typedef struct With With; +/* A VList object records a mapping between parameters/variables/wildcards +** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer +** variable number associated with that parameter. See the format description +** on the sqlite3VListAdd() routine for more information. A VList is really +** just an array of integers. +*/ +typedef int VList; + /* -** Defer sourcing vdbe.h and btree.h until after the "u8" and +** Defer sourcing vdbe.h and btree.h until after the "u8" and ** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque ** pointer types (i.e. FuncDef) defined above. */ @@ -9161,8 +13925,8 @@ typedef struct With With; ** subsystem. See comments in the source code for a detailed description ** of what each interface routine does. */ -#ifndef _BTREE_H_ -#define _BTREE_H_ +#ifndef SQLITE_BTREE_H +#define SQLITE_BTREE_H /* TODO: This definition is just included so other modules compile. It ** needs to be revisited. @@ -9187,6 +13951,7 @@ typedef struct With With; typedef struct Btree Btree; typedef struct BtCursor BtCursor; typedef struct BtShared BtShared; +typedef struct BtreePayload BtreePayload; SQLITE_PRIVATE int sqlite3BtreeOpen( @@ -9211,20 +13976,18 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( SQLITE_PRIVATE int sqlite3BtreeClose(Btree*); SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree*,int); +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree*,int); #if SQLITE_MAX_MMAP_SIZE>0 SQLITE_PRIVATE int sqlite3BtreeSetMmapLimit(Btree*,sqlite3_int64); #endif SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags(Btree*,unsigned); -SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree*); SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int nPagesize, int nReserve, int eFix); SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree*); SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree*,int); SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree*); SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree*,int); -SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree*); -#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3BtreeGetOptimalReserve(Btree*); SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p); -#endif SQLITE_PRIVATE int sqlite3BtreeSetAutoVacuum(Btree *, int); SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *); SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree*,int); @@ -9239,7 +14002,9 @@ SQLITE_PRIVATE int sqlite3BtreeIsInReadTrans(Btree*); SQLITE_PRIVATE int sqlite3BtreeIsInBackup(Btree*); SQLITE_PRIVATE void *sqlite3BtreeSchema(Btree *, int, void(*)(void *)); SQLITE_PRIVATE int sqlite3BtreeSchemaLocked(Btree *pBtree); +#ifndef SQLITE_OMIT_SHARED_CACHE SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *pBtree, int iTab, u8 isWriteLock); +#endif SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *, int, int); SQLITE_PRIVATE const char *sqlite3BtreeGetFilename(Btree *); @@ -9300,10 +14065,75 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p); #define BTREE_DATA_VERSION 15 /* A virtual meta-value */ /* -** Values that may be OR'd together to form the second argument of an -** sqlite3BtreeCursorHints() call. +** Kinds of hints that can be passed into the sqlite3BtreeCursorHint() +** interface. +** +** BTREE_HINT_RANGE (arguments: Expr*, Mem*) +** +** The first argument is an Expr* (which is guaranteed to be constant for +** the lifetime of the cursor) that defines constraints on which rows +** might be fetched with this cursor. The Expr* tree may contain +** TK_REGISTER nodes that refer to values stored in the array of registers +** passed as the second parameter. In other words, if Expr.op==TK_REGISTER +** then the value of the node is the value in Mem[pExpr.iTable]. Any +** TK_COLUMN node in the expression tree refers to the Expr.iColumn-th +** column of the b-tree of the cursor. The Expr tree will not contain +** any function calls nor subqueries nor references to b-trees other than +** the cursor being hinted. +** +** The design of the _RANGE hint is aid b-tree implementations that try +** to prefetch content from remote machines - to provide those +** implementations with limits on what needs to be prefetched and thereby +** reduce network bandwidth. +** +** Note that BTREE_HINT_FLAGS with BTREE_BULKLOAD is the only hint used by +** standard SQLite. The other hints are provided for extentions that use +** the SQLite parser and code generator but substitute their own storage +** engine. */ -#define BTREE_BULKLOAD 0x00000001 +#define BTREE_HINT_RANGE 0 /* Range constraints on queries */ + +/* +** Values that may be OR'd together to form the argument to the +** BTREE_HINT_FLAGS hint for sqlite3BtreeCursorHint(): +** +** The BTREE_BULKLOAD flag is set on index cursors when the index is going +** to be filled with content that is already in sorted order. +** +** The BTREE_SEEK_EQ flag is set on cursors that will get OP_SeekGE or +** OP_SeekLE opcodes for a range search, but where the range of entries +** selected will all have the same key. In other words, the cursor will +** be used only for equality key searches. +** +*/ +#define BTREE_BULKLOAD 0x00000001 /* Used to full index in sorted order */ +#define BTREE_SEEK_EQ 0x00000002 /* EQ seeks only - no range seeks */ + +/* +** Flags passed as the third argument to sqlite3BtreeCursor(). +** +** For read-only cursors the wrFlag argument is always zero. For read-write +** cursors it may be set to either (BTREE_WRCSR|BTREE_FORDELETE) or just +** (BTREE_WRCSR). If the BTREE_FORDELETE bit is set, then the cursor will +** only be used by SQLite for the following: +** +** * to seek to and then delete specific entries, and/or +** +** * to read values that will be used to create keys that other +** BTREE_FORDELETE cursors will seek to and delete. +** +** The BTREE_FORDELETE flag is an optimization hint. It is not used by +** by this, the native b-tree engine of SQLite, but it is available to +** alternative storage engines that might be substituted in place of this +** b-tree system. For alternative storage engines in which a delete of +** the main table row automatically deletes corresponding index rows, +** the FORDELETE flag hint allows those alternative storage engines to +** skip a lot of work. Namely: FORDELETE cursors may treat all SEEK +** and DELETE operations as no-ops, and any READ operation against a +** FORDELETE cursor may return a null row: 0x01 0x00. +*/ +#define BTREE_WRCSR 0x00000004 /* read-write cursor */ +#define BTREE_FORDELETE 0x00000008 /* Cursor is for seek/delete only */ SQLITE_PRIVATE int sqlite3BtreeCursor( Btree*, /* BTree containing table to open */ @@ -9312,8 +14142,13 @@ SQLITE_PRIVATE int sqlite3BtreeCursor( struct KeyInfo*, /* First argument to compare function */ BtCursor *pCursor /* Space to write cursor structure */ ); +SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void); SQLITE_PRIVATE int sqlite3BtreeCursorSize(void); SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor*); +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor*, unsigned); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor*, int, ...); +#endif SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor*); SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( @@ -9325,36 +14160,90 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( ); SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor*); SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor*, int*); -SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const void *pKey, i64 nKey, - const void *pData, int nData, - int nZero, int bias, int seekResult); +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor*, u8 flags); + +/* Allowed flags for sqlite3BtreeDelete() and sqlite3BtreeInsert() */ +#define BTREE_SAVEPOSITION 0x02 /* Leave cursor pointing at NEXT or PREV */ +#define BTREE_AUXDELETE 0x04 /* not the primary delete operation */ +#define BTREE_APPEND 0x08 /* Insert is likely an append */ + +/* An instance of the BtreePayload object describes the content of a single +** entry in either an index or table btree. +** +** Index btrees (used for indexes and also WITHOUT ROWID tables) contain +** an arbitrary key and no data. These btrees have pKey,nKey set to the +** key and the pData,nData,nZero fields are uninitialized. The aMem,nMem +** fields give an array of Mem objects that are a decomposition of the key. +** The nMem field might be zero, indicating that no decomposition is available. +** +** Table btrees (used for rowid tables) contain an integer rowid used as +** the key and passed in the nKey field. The pKey field is zero. +** pData,nData hold the content of the new entry. nZero extra zero bytes +** are appended to the end of the content when constructing the entry. +** The aMem,nMem fields are uninitialized for table btrees. +** +** Field usage summary: +** +** Table BTrees Index Btrees +** +** pKey always NULL encoded key +** nKey the ROWID length of pKey +** pData data not used +** aMem not used decomposed key value +** nMem not used entries in aMem +** nData length of pData not used +** nZero extra zeros after pData not used +** +** This object is used to pass information into sqlite3BtreeInsert(). The +** same information used to be passed as five separate parameters. But placing +** the information into this object helps to keep the interface more +** organized and understandable, and it also helps the resulting code to +** run a little faster by using fewer registers for parameter passing. +*/ +struct BtreePayload { + const void *pKey; /* Key content for indexes. NULL for tables */ + sqlite3_int64 nKey; /* Size of pKey for indexes. PRIMARY KEY for tabs */ + const void *pData; /* Data for tables. */ + sqlite3_value *aMem; /* First of nMem value in the unpacked pKey */ + u16 nMem; /* Number of aMem[] value. Might be zero */ + int nData; /* Size of pData. 0 if none. */ + int nZero; /* Extra zero data appended after pData,nData */ +}; + +SQLITE_PRIVATE int sqlite3BtreeInsert(BtCursor*, const BtreePayload *pPayload, + int flags, int seekResult); SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor*, int *pRes); SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int *pRes); +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor*, int flags); SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor*); -SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int *pRes); -SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor*, i64 *pSize); -SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor*, u32 offset, u32 amt, void*); -SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor*, u32 *pAmt); -SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor*, u32 *pAmt); -SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor*, u32 *pSize); -SQLITE_PRIVATE int sqlite3BtreeData(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor*, int flags); +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor*); +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor*); +#endif +SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor*, u32 offset, u32 amt, void*); +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor*); SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); SQLITE_PRIVATE struct Pager *sqlite3BtreePager(Btree*); +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor*); +#ifndef SQLITE_OMIT_INCRBLOB +SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor*, u32 offset, u32 amt, void*); SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor*, u32 offset, u32 amt, void*); SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *); +#endif SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *); SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBt, int iVersion); -SQLITE_PRIVATE void sqlite3BtreeCursorHints(BtCursor *, unsigned int mask); +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor*, unsigned int mask); SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *pBt); SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void); #ifndef NDEBUG SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor*); #endif +SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor*); #ifndef SQLITE_OMIT_BTREECOUNT SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *, i64 *); @@ -9377,15 +14266,19 @@ SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *); #ifndef SQLITE_OMIT_SHARED_CACHE SQLITE_PRIVATE void sqlite3BtreeEnter(Btree*); SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3*); +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree*); #else # define sqlite3BtreeEnter(X) # define sqlite3BtreeEnterAll(X) +# define sqlite3BtreeSharable(X) 0 +# define sqlite3BtreeEnterCursor(X) +# define sqlite3BtreeConnectionCount(X) 1 #endif #if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE -SQLITE_PRIVATE int sqlite3BtreeSharable(Btree*); SQLITE_PRIVATE void sqlite3BtreeLeave(Btree*); -SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor*); SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor*); SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3*); #ifndef NDEBUG @@ -9396,9 +14289,7 @@ SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); #endif #else -# define sqlite3BtreeSharable(X) 0 # define sqlite3BtreeLeave(X) -# define sqlite3BtreeEnterCursor(X) # define sqlite3BtreeLeaveCursor(X) # define sqlite3BtreeLeaveAll(X) @@ -9408,7 +14299,7 @@ SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); #endif -#endif /* _BTREE_H_ */ +#endif /* SQLITE_BTREE_H */ /************** End of btree.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -9431,8 +14322,8 @@ SQLITE_PRIVATE int sqlite3SchemaMutexHeld(sqlite3*,int,Schema*); ** or VDBE. The VDBE implements an abstract machine that runs a ** simple program to access and modify the underlying database. */ -#ifndef _SQLITE_VDBE_H_ -#define _SQLITE_VDBE_H_ +#ifndef SQLITE_VDBE_H +#define SQLITE_VDBE_H /* #include <stdio.h> */ /* @@ -9446,7 +14337,7 @@ typedef struct Vdbe Vdbe; ** The names of the following types declared in vdbeInt.h are required ** for the VdbeOp definition. */ -typedef struct Mem Mem; +typedef struct sqlite3_value Mem; typedef struct SubProgram SubProgram; /* @@ -9457,25 +14348,29 @@ typedef struct SubProgram SubProgram; struct VdbeOp { u8 opcode; /* What operation to perform */ signed char p4type; /* One of the P4_xxx constants for p4 */ - u8 opflags; /* Mask of the OPFLG_* flags in opcodes.h */ - u8 p5; /* Fifth parameter is an unsigned character */ + u16 p5; /* Fifth parameter is an unsigned 16-bit integer */ int p1; /* First operand */ int p2; /* Second parameter (often the jump destination) */ int p3; /* The third parameter */ - union { /* fourth parameter */ + union p4union { /* fourth parameter */ int i; /* Integer value if p4type==P4_INT32 */ void *p; /* Generic pointer */ char *z; /* Pointer to data for string (char array) types */ i64 *pI64; /* Used when p4type is P4_INT64 */ double *pReal; /* Used when p4type is P4_REAL */ FuncDef *pFunc; /* Used when p4type is P4_FUNCDEF */ + sqlite3_context *pCtx; /* Used when p4type is P4_FUNCCTX */ CollSeq *pColl; /* Used when p4type is P4_COLLSEQ */ Mem *pMem; /* Used when p4type is P4_MEM */ VTable *pVtab; /* Used when p4type is P4_VTAB */ KeyInfo *pKeyInfo; /* Used when p4type is P4_KEYINFO */ int *ai; /* Used when p4type is P4_INTARRAY */ SubProgram *pProgram; /* Used when p4type is P4_SUBPROGRAM */ - int (*xAdvance)(BtCursor *, int *); + Table *pTab; /* Used when p4type is P4_TABLE */ +#ifdef SQLITE_ENABLE_CURSOR_HINTS + Expr *pExpr; /* Used when p4type is P4_EXPR */ +#endif + int (*xAdvance)(BtCursor *, int); } p4; #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS char *zComment; /* Comment to improve readability */ @@ -9499,7 +14394,7 @@ struct SubProgram { int nOp; /* Elements in aOp[] */ int nMem; /* Number of memory cells required */ int nCsr; /* Number of cursors required */ - int nOnce; /* Number of OP_Once instructions */ + u8 *aOnce; /* Array of OP_Once flags */ void *token; /* id that may be used to recursive triggers */ SubProgram *pNext; /* Next sub-program already visited */ }; @@ -9519,22 +14414,27 @@ typedef struct VdbeOpList VdbeOpList; /* ** Allowed values of VdbeOp.p4type */ -#define P4_NOTUSED 0 /* The P4 parameter is not used */ -#define P4_DYNAMIC (-1) /* Pointer to a string obtained from sqliteMalloc() */ -#define P4_STATIC (-2) /* Pointer to a static string */ -#define P4_COLLSEQ (-4) /* P4 is a pointer to a CollSeq structure */ -#define P4_FUNCDEF (-5) /* P4 is a pointer to a FuncDef structure */ -#define P4_KEYINFO (-6) /* P4 is a pointer to a KeyInfo structure */ -#define P4_MEM (-8) /* P4 is a pointer to a Mem* structure */ -#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ -#define P4_VTAB (-10) /* P4 is a pointer to an sqlite3_vtab structure */ -#define P4_MPRINTF (-11) /* P4 is a string obtained from sqlite3_mprintf() */ -#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ -#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ -#define P4_INT32 (-14) /* P4 is a 32-bit signed integer */ -#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ -#define P4_SUBPROGRAM (-18) /* P4 is a pointer to a SubProgram structure */ -#define P4_ADVANCE (-19) /* P4 is a pointer to BtreeNext() or BtreePrev() */ +#define P4_NOTUSED 0 /* The P4 parameter is not used */ +#define P4_TRANSIENT 0 /* P4 is a pointer to a transient string */ +#define P4_STATIC (-1) /* Pointer to a static string */ +#define P4_COLLSEQ (-2) /* P4 is a pointer to a CollSeq structure */ +#define P4_INT32 (-3) /* P4 is a 32-bit signed integer */ +#define P4_SUBPROGRAM (-4) /* P4 is a pointer to a SubProgram structure */ +#define P4_ADVANCE (-5) /* P4 is a pointer to BtreeNext() or BtreePrev() */ +#define P4_TABLE (-6) /* P4 is a pointer to a Table structure */ +/* Above do not own any resources. Must free those below */ +#define P4_FREE_IF_LE (-7) +#define P4_DYNAMIC (-7) /* Pointer to memory from sqliteMalloc() */ +#define P4_FUNCDEF (-8) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-9) /* P4 is a pointer to a KeyInfo structure */ +#define P4_EXPR (-10) /* P4 is a pointer to an Expr tree */ +#define P4_MEM (-11) /* P4 is a pointer to a Mem* structure */ +#define P4_VTAB (-12) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_REAL (-13) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-14) /* P4 is a 64-bit signed integer */ +#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ +#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */ +#define P4_DYNBLOB (-17) /* Pointer to memory from sqliteMalloc() */ /* Error message codes for OP_Halt */ #define P5_ConstraintNotNull 1 @@ -9576,91 +14476,92 @@ typedef struct VdbeOpList VdbeOpList; /************** Include opcodes.h in the middle of vdbe.h ********************/ /************** Begin file opcodes.h *****************************************/ /* Automatically generated. Do not edit */ -/* See the mkopcodeh.awk script for details */ -#define OP_Function 1 /* synopsis: r[P3]=func(r[P2@P5]) */ -#define OP_Savepoint 2 -#define OP_AutoCommit 3 -#define OP_Transaction 4 -#define OP_SorterNext 5 -#define OP_PrevIfOpen 6 -#define OP_NextIfOpen 7 -#define OP_Prev 8 -#define OP_Next 9 -#define OP_AggStep 10 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_Checkpoint 11 -#define OP_JournalMode 12 -#define OP_Vacuum 13 -#define OP_VFilter 14 /* synopsis: iplan=r[P3] zplan='P4' */ -#define OP_VUpdate 15 /* synopsis: data=r[P3@P2] */ -#define OP_Goto 16 -#define OP_Gosub 17 -#define OP_Return 18 +/* See the tool/mkopcodeh.tcl script for details */ +#define OP_Savepoint 0 +#define OP_AutoCommit 1 +#define OP_Transaction 2 +#define OP_SorterNext 3 /* jump */ +#define OP_PrevIfOpen 4 /* jump */ +#define OP_NextIfOpen 5 /* jump */ +#define OP_Prev 6 /* jump */ +#define OP_Next 7 /* jump */ +#define OP_Checkpoint 8 +#define OP_JournalMode 9 +#define OP_Vacuum 10 +#define OP_VFilter 11 /* jump, synopsis: iplan=r[P3] zplan='P4' */ +#define OP_VUpdate 12 /* synopsis: data=r[P3@P2] */ +#define OP_Goto 13 /* jump */ +#define OP_Gosub 14 /* jump */ +#define OP_InitCoroutine 15 /* jump */ +#define OP_Yield 16 /* jump */ +#define OP_MustBeInt 17 /* jump */ +#define OP_Jump 18 /* jump */ #define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ -#define OP_InitCoroutine 20 -#define OP_EndCoroutine 21 -#define OP_Yield 22 -#define OP_HaltIfNull 23 /* synopsis: if r[P3]=null halt */ -#define OP_Halt 24 -#define OP_Integer 25 /* synopsis: r[P2]=P1 */ -#define OP_Int64 26 /* synopsis: r[P2]=P4 */ -#define OP_String 27 /* synopsis: r[P2]='P4' (len=P1) */ -#define OP_Null 28 /* synopsis: r[P2..P3]=NULL */ -#define OP_SoftNull 29 /* synopsis: r[P1]=NULL */ -#define OP_Blob 30 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 31 /* synopsis: r[P2]=parameter(P1,P4) */ -#define OP_Move 32 /* synopsis: r[P2@P3]=r[P1@P3] */ -#define OP_Copy 33 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ -#define OP_SCopy 34 /* synopsis: r[P2]=r[P1] */ -#define OP_ResultRow 35 /* synopsis: output=r[P1@P2] */ -#define OP_CollSeq 36 -#define OP_AddImm 37 /* synopsis: r[P1]=r[P1]+P2 */ -#define OP_MustBeInt 38 -#define OP_RealAffinity 39 -#define OP_Cast 40 /* synopsis: affinity(r[P1]) */ -#define OP_Permutation 41 -#define OP_Compare 42 /* synopsis: r[P1@P3] <-> r[P2@P3] */ -#define OP_Jump 43 -#define OP_Once 44 -#define OP_If 45 -#define OP_IfNot 46 -#define OP_Column 47 /* synopsis: r[P3]=PX */ -#define OP_Affinity 48 /* synopsis: affinity(r[P1@P2]) */ -#define OP_MakeRecord 49 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_Count 50 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 51 -#define OP_SetCookie 52 -#define OP_ReopenIdx 53 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenRead 54 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenWrite 55 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenAutoindex 56 /* synopsis: nColumn=P2 */ -#define OP_OpenEphemeral 57 /* synopsis: nColumn=P2 */ -#define OP_SorterOpen 58 -#define OP_SequenceTest 59 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ -#define OP_OpenPseudo 60 /* synopsis: P3 columns in r[P2] */ -#define OP_Close 61 -#define OP_SeekLT 62 /* synopsis: key=r[P3@P4] */ -#define OP_SeekLE 63 /* synopsis: key=r[P3@P4] */ -#define OP_SeekGE 64 /* synopsis: key=r[P3@P4] */ -#define OP_SeekGT 65 /* synopsis: key=r[P3@P4] */ -#define OP_Seek 66 /* synopsis: intkey=r[P2] */ -#define OP_NoConflict 67 /* synopsis: key=r[P3@P4] */ -#define OP_NotFound 68 /* synopsis: key=r[P3@P4] */ -#define OP_Found 69 /* synopsis: key=r[P3@P4] */ -#define OP_NotExists 70 /* synopsis: intkey=r[P3] */ -#define OP_Or 71 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ -#define OP_And 72 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ -#define OP_Sequence 73 /* synopsis: r[P2]=cursor[P1].ctr++ */ -#define OP_NewRowid 74 /* synopsis: r[P2]=rowid */ -#define OP_Insert 75 /* synopsis: intkey=r[P3] data=r[P2] */ -#define OP_IsNull 76 /* same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ -#define OP_NotNull 77 /* same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ -#define OP_Ne 78 /* same as TK_NE, synopsis: if r[P1]!=r[P3] goto P2 */ -#define OP_Eq 79 /* same as TK_EQ, synopsis: if r[P1]==r[P3] goto P2 */ -#define OP_Gt 80 /* same as TK_GT, synopsis: if r[P1]>r[P3] goto P2 */ -#define OP_Le 81 /* same as TK_LE, synopsis: if r[P1]<=r[P3] goto P2 */ -#define OP_Lt 82 /* same as TK_LT, synopsis: if r[P1]<r[P3] goto P2 */ -#define OP_Ge 83 /* same as TK_GE, synopsis: if r[P1]>=r[P3] goto P2 */ -#define OP_InsertInt 84 /* synopsis: intkey=P3 data=r[P2] */ +#define OP_Once 20 /* jump */ +#define OP_If 21 /* jump */ +#define OP_IfNot 22 /* jump */ +#define OP_IfNullRow 23 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ +#define OP_SeekLT 24 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekLE 25 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGE 26 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGT 27 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NoConflict 28 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NotFound 29 /* jump, synopsis: key=r[P3@P4] */ +#define OP_Found 30 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekRowid 31 /* jump, synopsis: intkey=r[P3] */ +#define OP_NotExists 32 /* jump, synopsis: intkey=r[P3] */ +#define OP_Last 33 /* jump */ +#define OP_IfSmaller 34 /* jump */ +#define OP_SorterSort 35 /* jump */ +#define OP_Sort 36 /* jump */ +#define OP_Rewind 37 /* jump */ +#define OP_IdxLE 38 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGT 39 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxLT 40 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IdxGE 41 /* jump, synopsis: key=r[P3@P4] */ +#define OP_RowSetRead 42 /* jump, synopsis: r[P3]=rowset(P1) */ +#define OP_Or 43 /* same as TK_OR, synopsis: r[P3]=(r[P1] || r[P2]) */ +#define OP_And 44 /* same as TK_AND, synopsis: r[P3]=(r[P1] && r[P2]) */ +#define OP_RowSetTest 45 /* jump, synopsis: if r[P3] in rowset(P1) goto P2 */ +#define OP_Program 46 /* jump */ +#define OP_FkIfZero 47 /* jump, synopsis: if fkctr[P1]==0 goto P2 */ +#define OP_IfPos 48 /* jump, synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 */ +#define OP_IfNotZero 49 /* jump, synopsis: if r[P1]!=0 then r[P1]--, goto P2 */ +#define OP_IsNull 50 /* jump, same as TK_ISNULL, synopsis: if r[P1]==NULL goto P2 */ +#define OP_NotNull 51 /* jump, same as TK_NOTNULL, synopsis: if r[P1]!=NULL goto P2 */ +#define OP_Ne 52 /* jump, same as TK_NE, synopsis: IF r[P3]!=r[P1] */ +#define OP_Eq 53 /* jump, same as TK_EQ, synopsis: IF r[P3]==r[P1] */ +#define OP_Gt 54 /* jump, same as TK_GT, synopsis: IF r[P3]>r[P1] */ +#define OP_Le 55 /* jump, same as TK_LE, synopsis: IF r[P3]<=r[P1] */ +#define OP_Lt 56 /* jump, same as TK_LT, synopsis: IF r[P3]<r[P1] */ +#define OP_Ge 57 /* jump, same as TK_GE, synopsis: IF r[P3]>=r[P1] */ +#define OP_ElseNotEq 58 /* jump, same as TK_ESCAPE */ +#define OP_DecrJumpZero 59 /* jump, synopsis: if (--r[P1])==0 goto P2 */ +#define OP_IncrVacuum 60 /* jump */ +#define OP_VNext 61 /* jump */ +#define OP_Init 62 /* jump, synopsis: Start at P2 */ +#define OP_Return 63 +#define OP_EndCoroutine 64 +#define OP_HaltIfNull 65 /* synopsis: if r[P3]=null halt */ +#define OP_Halt 66 +#define OP_Integer 67 /* synopsis: r[P2]=P1 */ +#define OP_Int64 68 /* synopsis: r[P2]=P4 */ +#define OP_String 69 /* synopsis: r[P2]='P4' (len=P1) */ +#define OP_Null 70 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 71 /* synopsis: r[P1]=NULL */ +#define OP_Blob 72 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 73 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 74 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 75 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 76 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 77 /* synopsis: r[P2]=r[P1] */ +#define OP_ResultRow 78 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 79 +#define OP_AddImm 80 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 81 +#define OP_Cast 82 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 83 +#define OP_Compare 84 /* synopsis: r[P1@P3] <-> r[P2@P3] */ #define OP_BitAnd 85 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ #define OP_BitOr 86 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ #define OP_ShiftLeft 87 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<<r[P1] */ @@ -9671,105 +14572,135 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Divide 92 /* same as TK_SLASH, synopsis: r[P3]=r[P2]/r[P1] */ #define OP_Remainder 93 /* same as TK_REM, synopsis: r[P3]=r[P2]%r[P1] */ #define OP_Concat 94 /* same as TK_CONCAT, synopsis: r[P3]=r[P2]+r[P1] */ -#define OP_Delete 95 +#define OP_IsTrue 95 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ #define OP_BitNot 96 /* same as TK_BITNOT, synopsis: r[P1]= ~r[P1] */ -#define OP_String8 97 /* same as TK_STRING, synopsis: r[P2]='P4' */ -#define OP_ResetCount 98 -#define OP_SorterCompare 99 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ -#define OP_SorterData 100 /* synopsis: r[P2]=data */ -#define OP_RowKey 101 /* synopsis: r[P2]=key */ -#define OP_RowData 102 /* synopsis: r[P2]=data */ -#define OP_Rowid 103 /* synopsis: r[P2]=rowid */ -#define OP_NullRow 104 -#define OP_Last 105 -#define OP_SorterSort 106 -#define OP_Sort 107 -#define OP_Rewind 108 -#define OP_SorterInsert 109 -#define OP_IdxInsert 110 /* synopsis: key=r[P2] */ -#define OP_IdxDelete 111 /* synopsis: key=r[P2@P3] */ -#define OP_IdxRowid 112 /* synopsis: r[P2]=rowid */ -#define OP_IdxLE 113 /* synopsis: key=r[P3@P4] */ -#define OP_IdxGT 114 /* synopsis: key=r[P3@P4] */ -#define OP_IdxLT 115 /* synopsis: key=r[P3@P4] */ -#define OP_IdxGE 116 /* synopsis: key=r[P3@P4] */ -#define OP_Destroy 117 -#define OP_Clear 118 -#define OP_ResetSorter 119 -#define OP_CreateIndex 120 /* synopsis: r[P2]=root iDb=P1 */ -#define OP_CreateTable 121 /* synopsis: r[P2]=root iDb=P1 */ -#define OP_ParseSchema 122 -#define OP_LoadAnalysis 123 -#define OP_DropTable 124 -#define OP_DropIndex 125 -#define OP_DropTrigger 126 -#define OP_IntegrityCk 127 -#define OP_RowSetAdd 128 /* synopsis: rowset(P1)=r[P2] */ -#define OP_RowSetRead 129 /* synopsis: r[P3]=rowset(P1) */ -#define OP_RowSetTest 130 /* synopsis: if r[P3] in rowset(P1) goto P2 */ -#define OP_Program 131 -#define OP_Param 132 -#define OP_Real 133 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ -#define OP_FkCounter 134 /* synopsis: fkctr[P1]+=P2 */ -#define OP_FkIfZero 135 /* synopsis: if fkctr[P1]==0 goto P2 */ -#define OP_MemMax 136 /* synopsis: r[P1]=max(r[P1],r[P2]) */ -#define OP_IfPos 137 /* synopsis: if r[P1]>0 goto P2 */ -#define OP_IfNeg 138 /* synopsis: r[P1]+=P3, if r[P1]<0 goto P2 */ -#define OP_IfZero 139 /* synopsis: r[P1]+=P3, if r[P1]==0 goto P2 */ -#define OP_AggFinal 140 /* synopsis: accum=r[P1] N=P2 */ -#define OP_IncrVacuum 141 -#define OP_Expire 142 -#define OP_TableLock 143 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 144 -#define OP_VCreate 145 -#define OP_VDestroy 146 -#define OP_VOpen 147 -#define OP_VColumn 148 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VNext 149 -#define OP_VRename 150 -#define OP_Pagecount 151 -#define OP_MaxPgcnt 152 -#define OP_Init 153 /* synopsis: Start at P2 */ -#define OP_Noop 154 -#define OP_Explain 155 - +#define OP_Offset 97 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 98 /* synopsis: r[P3]=PX */ +#define OP_String8 99 /* same as TK_STRING, synopsis: r[P2]='P4' */ +#define OP_Affinity 100 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 101 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 102 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 103 +#define OP_SetCookie 104 +#define OP_ReopenIdx 105 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenRead 106 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenWrite 107 /* synopsis: root=P2 iDb=P3 */ +#define OP_OpenDup 108 +#define OP_OpenAutoindex 109 /* synopsis: nColumn=P2 */ +#define OP_OpenEphemeral 110 /* synopsis: nColumn=P2 */ +#define OP_SorterOpen 111 +#define OP_SequenceTest 112 /* synopsis: if( cursor[P1].ctr++ ) pc = P2 */ +#define OP_OpenPseudo 113 /* synopsis: P3 columns in r[P2] */ +#define OP_Close 114 +#define OP_ColumnsUsed 115 +#define OP_Sequence 116 /* synopsis: r[P2]=cursor[P1].ctr++ */ +#define OP_NewRowid 117 /* synopsis: r[P2]=rowid */ +#define OP_Insert 118 /* synopsis: intkey=r[P3] data=r[P2] */ +#define OP_InsertInt 119 /* synopsis: intkey=P3 data=r[P2] */ +#define OP_Delete 120 +#define OP_ResetCount 121 +#define OP_SorterCompare 122 /* synopsis: if key(P1)!=trim(r[P3],P4) goto P2 */ +#define OP_SorterData 123 /* synopsis: r[P2]=data */ +#define OP_RowData 124 /* synopsis: r[P2]=data */ +#define OP_Rowid 125 /* synopsis: r[P2]=rowid */ +#define OP_NullRow 126 +#define OP_SeekEnd 127 +#define OP_SorterInsert 128 /* synopsis: key=r[P2] */ +#define OP_IdxInsert 129 /* synopsis: key=r[P2] */ +#define OP_IdxDelete 130 /* synopsis: key=r[P2@P3] */ +#define OP_DeferredSeek 131 /* synopsis: Move P3 to P1.rowid if needed */ +#define OP_IdxRowid 132 /* synopsis: r[P2]=rowid */ +#define OP_Destroy 133 +#define OP_Real 134 /* same as TK_FLOAT, synopsis: r[P2]=P4 */ +#define OP_Clear 135 +#define OP_ResetSorter 136 +#define OP_CreateBtree 137 /* synopsis: r[P2]=root iDb=P1 flags=P3 */ +#define OP_SqlExec 138 +#define OP_ParseSchema 139 +#define OP_LoadAnalysis 140 +#define OP_DropTable 141 +#define OP_DropIndex 142 +#define OP_DropTrigger 143 +#define OP_IntegrityCk 144 +#define OP_RowSetAdd 145 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 146 +#define OP_FkCounter 147 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 148 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 149 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggStep0 150 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep 151 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggFinal 152 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 153 +#define OP_TableLock 154 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 155 +#define OP_VCreate 156 +#define OP_VDestroy 157 +#define OP_VOpen 158 +#define OP_VColumn 159 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 160 +#define OP_Pagecount 161 +#define OP_MaxPgcnt 162 +#define OP_PureFunc0 163 +#define OP_Function0 164 /* synopsis: r[P3]=func(r[P2@P5]) */ +#define OP_PureFunc 165 +#define OP_Function 166 /* synopsis: r[P3]=func(r[P2@P5]) */ +#define OP_Trace 167 +#define OP_CursorHint 168 +#define OP_Noop 169 +#define OP_Explain 170 +#define OP_Abortable 171 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c ** are encoded into bitvectors as follows: */ -#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */ -#define OPFLG_OUT2_PRERELEASE 0x0002 /* out2-prerelease: */ -#define OPFLG_IN1 0x0004 /* in1: P1 is an input */ -#define OPFLG_IN2 0x0008 /* in2: P2 is an input */ -#define OPFLG_IN3 0x0010 /* in3: P3 is an input */ -#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */ -#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */ +#define OPFLG_JUMP 0x01 /* jump: P2 holds jmp target */ +#define OPFLG_IN1 0x02 /* in1: P1 is an input */ +#define OPFLG_IN2 0x04 /* in2: P2 is an input */ +#define OPFLG_IN3 0x08 /* in3: P3 is an input */ +#define OPFLG_OUT2 0x10 /* out2: P2 is an output */ +#define OPFLG_OUT3 0x20 /* out3: P3 is an output */ #define OPFLG_INITIALIZER {\ -/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,\ -/* 8 */ 0x01, 0x01, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00,\ -/* 16 */ 0x01, 0x01, 0x04, 0x24, 0x01, 0x04, 0x05, 0x10,\ -/* 24 */ 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02,\ -/* 32 */ 0x00, 0x00, 0x20, 0x00, 0x00, 0x04, 0x05, 0x04,\ -/* 40 */ 0x04, 0x00, 0x00, 0x01, 0x01, 0x05, 0x05, 0x00,\ -/* 48 */ 0x00, 0x00, 0x02, 0x02, 0x10, 0x00, 0x00, 0x00,\ -/* 56 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11,\ -/* 64 */ 0x11, 0x11, 0x08, 0x11, 0x11, 0x11, 0x11, 0x4c,\ -/* 72 */ 0x4c, 0x02, 0x02, 0x00, 0x05, 0x05, 0x15, 0x15,\ -/* 80 */ 0x15, 0x15, 0x15, 0x15, 0x00, 0x4c, 0x4c, 0x4c,\ -/* 88 */ 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x00,\ -/* 96 */ 0x24, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,\ -/* 104 */ 0x00, 0x01, 0x01, 0x01, 0x01, 0x08, 0x08, 0x00,\ -/* 112 */ 0x02, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x00,\ -/* 120 */ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 128 */ 0x0c, 0x45, 0x15, 0x01, 0x02, 0x02, 0x00, 0x01,\ -/* 136 */ 0x08, 0x05, 0x05, 0x05, 0x00, 0x01, 0x00, 0x00,\ -/* 144 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,\ -/* 152 */ 0x02, 0x01, 0x00, 0x00,} +/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 8 */ 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x01, 0x01,\ +/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x01, 0x03, 0x03, 0x01,\ +/* 24 */ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,\ +/* 32 */ 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 40 */ 0x01, 0x01, 0x23, 0x26, 0x26, 0x0b, 0x01, 0x01,\ +/* 48 */ 0x03, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ +/* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x01, 0x01, 0x01, 0x02,\ +/* 64 */ 0x02, 0x08, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00,\ +/* 72 */ 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ +/* 80 */ 0x02, 0x02, 0x02, 0x00, 0x00, 0x26, 0x26, 0x26,\ +/* 88 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x12,\ +/* 96 */ 0x12, 0x20, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10,\ +/* 104 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 112 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,\ +/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,\ +/* 128 */ 0x04, 0x04, 0x00, 0x00, 0x10, 0x10, 0x10, 0x00,\ +/* 136 */ 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 144 */ 0x00, 0x06, 0x10, 0x00, 0x04, 0x1a, 0x00, 0x00,\ +/* 152 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 160 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 168 */ 0x00, 0x00, 0x00, 0x00,} + +/* The sqlite3P2Values() routine is able to run faster if it knows +** the value of the largest JUMP opcode. The smaller the maximum +** JUMP opcode the better, so the mkopcodeh.tcl script that +** generated this include file strives to group all JUMP opcodes +** together near the beginning of the list. +*/ +#define SQLITE_MX_JUMP_OPCODE 62 /* Maximum JUMP opcode */ /************** End of opcodes.h *********************************************/ /************** Continuing where we left off in vdbe.h ***********************/ +/* +** Additional non-public SQLITE_PREPARE_* flags +*/ +#define SQLITE_PREPARE_SAVESQL 0x80 /* Preserve SQL text */ +#define SQLITE_PREPARE_MASK 0x0f /* Mask of public flags */ + /* ** Prototypes for the VDBE interface. See comments on the implementation ** for a description of what each of these routines does. @@ -9778,29 +14709,64 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse*); SQLITE_PRIVATE int sqlite3VdbeAddOp0(Vdbe*,int); SQLITE_PRIVATE int sqlite3VdbeAddOp1(Vdbe*,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int); +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe*,int); +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe*,int,const char*); +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe*,int,const char*,...); SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); +SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int); SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); -SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp, int iLineno); +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe*,int); +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N); +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p); +#else +# define sqlite3VdbeVerifyNoMallocRequired(A,B) +# define sqlite3VdbeVerifyNoResultRow(A) +#endif +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int); +#else +# define sqlite3VdbeVerifyAbortable(A,B) +#endif +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); +#ifndef SQLITE_OMIT_EXPLAIN +SQLITE_PRIVATE void sqlite3VdbeExplain(Parse*,u8,const char*,...); +SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse*); +SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse*); +# define ExplainQueryPlan(P) sqlite3VdbeExplain P +# define ExplainQueryPlanPop(P) sqlite3VdbeExplainPop(P) +# define ExplainQueryPlanParent(P) sqlite3VdbeExplainParent(P) +#else +# define ExplainQueryPlan(P) +# define ExplainQueryPlanPop(P) +# define ExplainQueryPlanParent(P) 0 +#endif SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3); -SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5); +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u16 P5); SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr); -SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe*, int addr); +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe*, int addr); SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); +SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe*, int); SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*); SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); +#ifdef SQLITE_COVERAGE_TEST +SQLITE_PRIVATE int sqlite3VdbeLabelHasBeenResolved(Vdbe*,int); +#endif SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe*); #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *, int); @@ -9812,7 +14778,8 @@ SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe*,int); SQLITE_PRIVATE int sqlite3VdbeSetColName(Vdbe*, int, int, const char *, void(*)(void*)); SQLITE_PRIVATE void sqlite3VdbeCountChanges(Vdbe*); SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, int); +SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe*); +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe*,Vdbe*); SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); @@ -9824,7 +14791,8 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem*, const Mem*, const CollSeq*); SQLITE_PRIVATE void sqlite3VdbeRecordUnpack(KeyInfo*,int,const void*,UnpackedRecord*); SQLITE_PRIVATE int sqlite3VdbeRecordCompare(int,const void*,UnpackedRecord*); -SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo *, char *, int, char **); +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip(int, const void *, UnpackedRecord *, int); +SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); @@ -9833,6 +14801,8 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); #endif +SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context*); + /* Use SQLITE_ENABLE_COMMENTS to enable generation of extra comments on ** each VDBE opcode. ** @@ -9899,7 +14869,7 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const ch # define sqlite3VdbeScanStatus(a,b,c,d,e) #endif -#endif +#endif /* SQLITE_VDBE_H */ /************** End of vdbe.h ************************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -9921,8 +14891,8 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const ch ** at a time and provides a journal for rollback. */ -#ifndef _PAGER_H_ -#define _PAGER_H_ +#ifndef SQLITE_PAGER_H +#define SQLITE_PAGER_H /* ** Default maximum size for persistent journal files. A negative @@ -9975,7 +14945,11 @@ typedef struct PgHdr DbPage; #define PAGER_LOCKINGMODE_EXCLUSIVE 1 /* -** Numeric constants that encode the journalmode. +** Numeric constants that encode the journalmode. +** +** The numeric values encoded here (other than PAGER_JOURNALMODE_QUERY) +** are exposed in the API via the "PRAGMA journal_mode" command and +** therefore cannot be changed without a compatibility break. */ #define PAGER_JOURNALMODE_QUERY (-1) /* Query the value of journalmode */ #define PAGER_JOURNALMODE_DELETE 0 /* Commit by deleting journal file */ @@ -9986,22 +14960,28 @@ typedef struct PgHdr DbPage; #define PAGER_JOURNALMODE_WAL 5 /* Use write-ahead logging */ /* -** Flags that make up the mask passed to sqlite3PagerAcquire(). +** Flags that make up the mask passed to sqlite3PagerGet(). */ #define PAGER_GET_NOCONTENT 0x01 /* Do not load data from disk */ #define PAGER_GET_READONLY 0x02 /* Read-only page is acceptable */ /* ** Flags for sqlite3PagerSetFlags() +** +** Value constraints (enforced via assert()): +** PAGER_FULLFSYNC == SQLITE_FullFSync +** PAGER_CKPT_FULLFSYNC == SQLITE_CkptFullFSync +** PAGER_CACHE_SPILL == SQLITE_CacheSpill */ #define PAGER_SYNCHRONOUS_OFF 0x01 /* PRAGMA synchronous=OFF */ #define PAGER_SYNCHRONOUS_NORMAL 0x02 /* PRAGMA synchronous=NORMAL */ #define PAGER_SYNCHRONOUS_FULL 0x03 /* PRAGMA synchronous=FULL */ -#define PAGER_SYNCHRONOUS_MASK 0x03 /* Mask for three values above */ -#define PAGER_FULLFSYNC 0x04 /* PRAGMA fullfsync=ON */ -#define PAGER_CKPT_FULLFSYNC 0x08 /* PRAGMA checkpoint_fullfsync=ON */ -#define PAGER_CACHESPILL 0x10 /* PRAGMA cache_spill=ON */ -#define PAGER_FLAGS_MASK 0x1c /* All above except SYNCHRONOUS */ +#define PAGER_SYNCHRONOUS_EXTRA 0x04 /* PRAGMA synchronous=EXTRA */ +#define PAGER_SYNCHRONOUS_MASK 0x07 /* Mask for four values above */ +#define PAGER_FULLFSYNC 0x08 /* PRAGMA fullfsync=ON */ +#define PAGER_CKPT_FULLFSYNC 0x10 /* PRAGMA checkpoint_fullfsync=ON */ +#define PAGER_CACHESPILL 0x20 /* PRAGMA cache_spill=ON */ +#define PAGER_FLAGS_MASK 0x38 /* All above except SYNCHRONOUS */ /* ** The remainder of this file contains the declarations of the functions @@ -10019,14 +14999,18 @@ SQLITE_PRIVATE int sqlite3PagerOpen( int, void(*)(DbPage*) ); -SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3*); SQLITE_PRIVATE int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); /* Functions used to configure a Pager object. */ -SQLITE_PRIVATE void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); +SQLITE_PRIVATE void sqlite3PagerSetBusyHandler(Pager*, int(*)(void *), void *); SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); +#ifdef SQLITE_HAS_CODEC +SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager*,Pager*); +#endif SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager*, int); SQLITE_PRIVATE void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); SQLITE_PRIVATE void sqlite3PagerSetFlags(Pager*,unsigned); @@ -10036,14 +15020,15 @@ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager*); SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager*); SQLITE_PRIVATE i64 sqlite3PagerJournalSizeLimit(Pager *, i64); SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager*); +SQLITE_PRIVATE int sqlite3PagerFlush(Pager*); /* Functions used to obtain and release page references. */ -SQLITE_PRIVATE int sqlite3PagerAcquire(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); -#define sqlite3PagerGet(A,B,C) sqlite3PagerAcquire(A,B,C,0) +SQLITE_PRIVATE int sqlite3PagerGet(Pager *pPager, Pgno pgno, DbPage **ppPage, int clrFlag); SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno); SQLITE_PRIVATE void sqlite3PagerRef(DbPage*); SQLITE_PRIVATE void sqlite3PagerUnref(DbPage*); SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage*); +SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage*); /* Operations on page references. */ SQLITE_PRIVATE int sqlite3PagerWrite(DbPage*); @@ -10066,11 +15051,21 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager); #ifndef SQLITE_OMIT_WAL -SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int, int*, int*); +SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, sqlite3*, int, int*, int*); SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager); SQLITE_PRIVATE int sqlite3PagerOpenWal(Pager *pPager, int *pisOpen); -SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager); +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3*); +# ifdef SQLITE_DIRECT_OVERFLOW_READ +SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager, Pgno); +# endif +# ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager); +# endif +#else +# define sqlite3PagerUseWal(x,y) 0 #endif #ifdef SQLITE_ENABLE_ZIPVFS @@ -10080,18 +15075,25 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager); /* Functions used to query pager state and configuration. */ SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager*); SQLITE_PRIVATE u32 sqlite3PagerDataVersion(Pager*); -SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PagerRefcount(Pager*); +#endif SQLITE_PRIVATE int sqlite3PagerMemUsed(Pager*); SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager*, int); -SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager*); +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager*); SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager*); +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager*); SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager*); -SQLITE_PRIVATE int sqlite3PagerNosync(Pager*); SQLITE_PRIVATE void *sqlite3PagerTempSpace(Pager*); SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager*); SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *, int, int, int *); -SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *); +SQLITE_PRIVATE void sqlite3PagerClearCache(Pager*); SQLITE_PRIVATE int sqlite3SectorSize(sqlite3_file *); +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +SQLITE_PRIVATE void sqlite3PagerResetLockTimeout(Pager *pPager); +#else +# define sqlite3PagerResetLockTimeout(X) +#endif /* Functions used to truncate the database file. */ SQLITE_PRIVATE void sqlite3PagerTruncateImage(Pager*,Pgno); @@ -10117,7 +15119,7 @@ SQLITE_PRIVATE void sqlite3PagerRefdump(Pager*); # define enable_simulated_io_errors() #endif -#endif /* _PAGER_H_ */ +#endif /* SQLITE_PAGER_H */ /************** End of pager.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ @@ -10151,7 +15153,8 @@ struct PgHdr { sqlite3_pcache_page *pPage; /* Pcache object page handle */ void *pData; /* Page data */ void *pExtra; /* Extra content */ - PgHdr *pDirty; /* Transient list of dirty pages */ + PCache *pCache; /* PRIVATE: Cache that owns this page */ + PgHdr *pDirty; /* Transient list of dirty sorted by pgno */ Pager *pPager; /* The pager this page is part of */ Pgno pgno; /* Page number for this page */ #ifdef SQLITE_CHECK_PAGES @@ -10160,25 +15163,27 @@ struct PgHdr { u16 flags; /* PGHDR flags defined below */ /********************************************************************** - ** Elements above are public. All that follows is private to pcache.c - ** and should not be accessed by other modules. + ** Elements above, except pCache, are public. All that follow are + ** private to pcache.c and should not be accessed by other modules. + ** pCache is grouped with the public elements for efficiency. */ i16 nRef; /* Number of users of this page */ - PCache *pCache; /* Cache that owns this page */ - PgHdr *pDirtyNext; /* Next element in list of dirty pages */ PgHdr *pDirtyPrev; /* Previous element in list of dirty pages */ + /* NB: pDirtyNext and pDirtyPrev are undefined if the + ** PgHdr object is not dirty */ }; /* Bit values for PgHdr.flags */ -#define PGHDR_DIRTY 0x002 /* Page has changed */ -#define PGHDR_NEED_SYNC 0x004 /* Fsync the rollback journal before - ** writing this page to the database */ -#define PGHDR_NEED_READ 0x008 /* Content is unread */ -#define PGHDR_REUSE_UNLIKELY 0x010 /* A hint that reuse is unlikely */ -#define PGHDR_DONT_WRITE 0x020 /* Do not write content to disk */ +#define PGHDR_CLEAN 0x001 /* Page not on the PCache.pDirty list */ +#define PGHDR_DIRTY 0x002 /* Page is on the PCache.pDirty list */ +#define PGHDR_WRITEABLE 0x004 /* Journaled and ready to modify */ +#define PGHDR_NEED_SYNC 0x008 /* Fsync the rollback journal before + ** writing this page to the database */ +#define PGHDR_DONT_WRITE 0x010 /* Do not write content to disk */ +#define PGHDR_MMAP 0x020 /* This is an mmap page object */ -#define PGHDR_MMAP 0x040 /* This is an mmap page object */ +#define PGHDR_WAL_APPEND 0x040 /* Appended to wal file */ /* Initialize and shutdown the page cache subsystem */ SQLITE_PRIVATE int sqlite3PcacheInitialize(void); @@ -10222,6 +15227,7 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr*); /* Remove page from cache SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr*); /* Make sure page is marked dirty */ SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr*); /* Mark a single page as clean */ SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache*); /* Mark all dirty list pages as clean */ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache*); /* Change a page number. Used by incr-vacuum. */ SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr*, Pgno); @@ -10260,6 +15266,11 @@ SQLITE_PRIVATE int sqlite3PcachePagecount(PCache*); SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHdr *)); #endif +#if defined(SQLITE_DEBUG) +/* Check invariants on a PgHdr object */ +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr*); +#endif + /* Set and get the suggested cache-size for the specified pager-cache. ** ** If no global maximum is configured, then the system attempts to limit @@ -10271,6 +15282,13 @@ SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *, int); SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); #endif +/* Set or get the suggested spill-size for the specified pager-cache. +** +** The spill-size is the minimum number of pages in cache before the cache +** will attempt to spill dirty pages by calling xStress. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *, int); + /* Free up as much memory as possible from the page cache */ SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); @@ -10289,11 +15307,13 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefault(void); SQLITE_PRIVATE int sqlite3HeaderSizePcache(void); SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); +/* Number of dirty pages as a percentage of the configured cache size */ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache*); + #endif /* _PCACHE_H_ */ /************** End of pcache.h **********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ - /************** Include os.h in the middle of sqliteInt.h ********************/ /************** Begin file os.h **********************************************/ /* @@ -10339,8 +15359,8 @@ SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); ** This file contains pre-processor directives related to operating system ** detection and/or setup. */ -#ifndef _OS_SETUP_H_ -#define _OS_SETUP_H_ +#ifndef SQLITE_OS_SETUP_H +#define SQLITE_OS_SETUP_H /* ** Figure out if we are dealing with Unix, Windows, or some other operating @@ -10380,7 +15400,7 @@ SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void); # endif #endif -#endif /* _OS_SETUP_H_ */ +#endif /* SQLITE_OS_SETUP_H */ /************** End of os_setup.h ********************************************/ /************** Continuing where we left off in os.h *************************/ @@ -10519,7 +15539,7 @@ SQLITE_PRIVATE int sqlite3OsInit(void); /* ** Functions for accessing sqlite3_file methods */ -SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file*); +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file*); SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file*, void*, int amt, i64 offset); SQLITE_PRIVATE int sqlite3OsWrite(sqlite3_file*, const void*, int amt, i64 offset); SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file*, i64 size); @@ -10533,10 +15553,12 @@ SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*); #define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); +#ifndef SQLITE_OMIT_WAL SQLITE_PRIVATE int sqlite3OsShmMap(sqlite3_file *,int,int,int,void volatile **); SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int, int, int); SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); +#endif /* SQLITE_OMIT_WAL */ SQLITE_PRIVATE int sqlite3OsFetch(sqlite3_file *id, i64, int, void **); SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *, i64, void *); @@ -10556,6 +15578,7 @@ SQLITE_PRIVATE void sqlite3OsDlClose(sqlite3_vfs *, void *); #endif /* SQLITE_OMIT_LOAD_EXTENSION */ SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *, int, char *); SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *, int); +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs*); SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); /* @@ -10563,7 +15586,7 @@ SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *, sqlite3_int64*); ** sqlite3_malloc() to obtain space for the file-handle structure. */ SQLITE_PRIVATE int sqlite3OsOpenMalloc(sqlite3_vfs *, const char *, sqlite3_file **, int,int*); -SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *); #endif /* _SQLITE_OS_H_ */ @@ -10645,6 +15668,36 @@ SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); /************** End of mutex.h ***********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ +/* The SQLITE_EXTRA_DURABLE compile-time option used to set the default +** synchronous setting to EXTRA. It is no longer supported. +*/ +#ifdef SQLITE_EXTRA_DURABLE +# warning Use SQLITE_DEFAULT_SYNCHRONOUS=3 instead of SQLITE_EXTRA_DURABLE +# define SQLITE_DEFAULT_SYNCHRONOUS 3 +#endif + +/* +** Default synchronous levels. +** +** Note that (for historcal reasons) the PAGER_SYNCHRONOUS_* macros differ +** from the SQLITE_DEFAULT_SYNCHRONOUS value by 1. +** +** PAGER_SYNCHRONOUS DEFAULT_SYNCHRONOUS +** OFF 1 0 +** NORMAL 2 1 +** FULL 3 2 +** EXTRA 4 3 +** +** The "PRAGMA synchronous" statement also uses the zero-based numbers. +** In other words, the zero-based numbers are used for all external interfaces +** and the one-based values are used internally. +*/ +#ifndef SQLITE_DEFAULT_SYNCHRONOUS +# define SQLITE_DEFAULT_SYNCHRONOUS 2 +#endif +#ifndef SQLITE_DEFAULT_WAL_SYNCHRONOUS +# define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS +#endif /* ** Each database file to be accessed by the system is an instance @@ -10654,9 +15707,10 @@ SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *); ** databases may be attached. */ struct Db { - char *zName; /* Name of this database */ + char *zDbSName; /* Name of this database. (schema name, not filename) */ Btree *pBt; /* The B*Tree structure for this database file */ u8 safety_level; /* How aggressive at syncing data to disk */ + u8 bSyncSet; /* True if "PRAGMA synchronous=N" has been run */ Schema *pSchema; /* Pointer to database schema (possibly shared) */ }; @@ -10667,7 +15721,7 @@ struct Db { ** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. ** In shared cache mode, a single Schema object can be shared by multiple ** Btrees that refer to the same underlying BtShared object. -** +** ** Schema objects are automatically deallocated when the last Btree that ** references them is destroyed. The TEMP Schema is manually freed by ** sqlite3_close(). @@ -10692,7 +15746,7 @@ struct Schema { }; /* -** These macros can be used to test, set, or clear bits in the +** These macros can be used to test, set, or clear bits in the ** Db.pSchema->flags field. */ #define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))==(P)) @@ -10713,6 +15767,7 @@ struct Schema { #define DB_SchemaLoaded 0x0001 /* The schema has been loaded */ #define DB_UnresetViews 0x0002 /* Some views have defined column names */ #define DB_Empty 0x0004 /* The file is empty (length 0 bytes) */ +#define DB_ResetWanted 0x0008 /* Reset the schema when nSchemaLock==0 */ /* ** The number of different kinds of things that can be limited @@ -10741,12 +15796,12 @@ struct Schema { ** lookaside allocations are not used to construct the schema objects. */ struct Lookaside { + u32 bDisable; /* Only operate the lookaside when zero */ u16 sz; /* Size of each buffer in bytes */ - u8 bEnabled; /* False to disable new lookaside allocations */ u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ - int nOut; /* Number of buffers currently checked out */ - int mxOut; /* Highwater mark for nOut */ - int anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ + u32 nSlot; /* Number of lookaside slots allocated */ + u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ + LookasideSlot *pInit; /* List of buffers not previously used */ LookasideSlot *pFree; /* List of available buffers */ void *pStart; /* First byte of available memory space */ void *pEnd; /* First byte past end of available space */ @@ -10756,13 +15811,15 @@ struct LookasideSlot { }; /* -** A hash table for function definitions. +** A hash table for built-in function definitions. (Application-defined +** functions use a regular table table from hash.h.) ** ** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. -** Collisions are on the FuncDef.pHash chain. +** Collisions are on the FuncDef.u.pHash chain. */ +#define SQLITE_FUNC_HASH_SZ 23 struct FuncDefHash { - FuncDef *a[23]; /* Hash table for functions */ + FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ }; #ifdef SQLITE_USER_AUTHENTICATION @@ -10803,6 +15860,15 @@ SQLITE_PRIVATE void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); const char*); #endif +#ifndef SQLITE_OMIT_DEPRECATED +/* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing +** in the style of sqlite3_trace() +*/ +#define SQLITE_TRACE_LEGACY 0x80 +#else +#define SQLITE_TRACE_LEGACY 0 +#endif /* SQLITE_OMIT_DEPRECATED */ + /* ** Each database connection is an instance of the following structure. @@ -10814,22 +15880,29 @@ struct sqlite3 { sqlite3_mutex *mutex; /* Connection mutex */ Db *aDb; /* All backends */ int nDb; /* Number of backends currently in use */ - int flags; /* Miscellaneous flags. See below */ + u32 mDbFlags; /* flags recording internal state */ + u32 flags; /* flags settable by pragmas. See below */ i64 lastRowid; /* ROWID of most recent insert (see above) */ i64 szMmap; /* Default mmap_size setting */ + u32 nSchemaLock; /* Do not reset the schema when non-zero */ unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ int errCode; /* Most recent error code (SQLITE_*) */ int errMask; /* & result codes with this before returning */ + int iSysErrno; /* Errno value from last system error */ u16 dbOptFlags; /* Flags to enable/disable optimizations */ u8 enc; /* Text encoding */ u8 autoCommit; /* The auto-commit flag. */ u8 temp_store; /* 1: file 2: memory 0: default */ u8 mallocFailed; /* True if we have seen a malloc failure */ + u8 bBenignMalloc; /* Do not require OOMs if true */ u8 dfltLockMode; /* Default locking-mode for attached dbs */ signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ u8 suppressErr; /* Do not issue error messages if true */ u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ + u8 mTrace; /* zero or more SQLITE_TRACE flags */ + u8 noSharedCache; /* True if no shared-cache backends */ + u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ int nextPagesize; /* Pagesize after VACUUM if >0 */ u32 magic; /* Magic number for detect library misuse */ int nChange; /* Value returned by sqlite3_changes() */ @@ -10840,24 +15913,34 @@ struct sqlite3 { int newTnum; /* Rootpage of table being initialized */ u8 iDb; /* Which db file is being initialized */ u8 busy; /* TRUE if currently initializing */ - u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */ + unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ + unsigned imposterTable : 1; /* Building an imposter table */ + unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ } init; int nVdbeActive; /* Number of VDBEs currently running */ int nVdbeRead; /* Number of active VDBEs that read or write */ int nVdbeWrite; /* Number of active VDBEs that read and write */ int nVdbeExec; /* Number of nested calls to VdbeExec() */ + int nVDestroy; /* Number of active OP_VDestroy operations */ int nExtension; /* Number of loaded extensions */ void **aExtension; /* Array of shared library handles */ - void (*xTrace)(void*,const char*); /* Trace function */ + int (*xTrace)(u32,void*,void*,void*); /* Trace function */ void *pTraceArg; /* Argument to the trace function */ void (*xProfile)(void*,const char*,u64); /* Profiling function */ void *pProfileArg; /* Argument to profile function */ - void *pCommitArg; /* Argument to xCommitCallback() */ + void *pCommitArg; /* Argument to xCommitCallback() */ int (*xCommitCallback)(void*); /* Invoked at every commit. */ - void *pRollbackArg; /* Argument to xRollbackCallback() */ + void *pRollbackArg; /* Argument to xRollbackCallback() */ void (*xRollbackCallback)(void*); /* Invoked at every commit. */ void *pUpdateArg; void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ + void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64 + ); + PreUpdate *pPreUpdate; /* Context for active pre-update callback */ +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ #ifndef SQLITE_OMIT_WAL int (*xWalCallback)(void *, sqlite3 *, const char *, int); void *pWalArg; @@ -10885,9 +15968,9 @@ struct sqlite3 { Hash aModule; /* populated by sqlite3_create_module() */ VtabCtx *pVtabCtx; /* Context for active vtab connect/create */ VTable **aVTrans; /* Virtual tables with open transactions */ - VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ + VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ #endif - FuncDefHash aFunc; /* Hash table of connection functions */ + Hash aFunc; /* Hash table of connection functions */ Hash aCollSeq; /* All collating sequences */ BusyHandler busyHandler; /* Busy callback */ Db aDbStatic[2]; /* Static space for the 2 default backends */ @@ -10899,8 +15982,8 @@ struct sqlite3 { i64 nDeferredImmCons; /* Net deferred immediate constraints */ int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY - /* The following variables are all protected by the STATIC_MASTER - ** mutex, not by sqlite3.mutex. They are used by code in notify.c. + /* The following variables are all protected by the STATIC_MASTER + ** mutex, not by sqlite3.mutex. They are used by code in notify.c. ** ** When X.pUnlockConnection==Y, that means that X is waiting for Y to ** unlock so that it can proceed. @@ -10928,38 +16011,58 @@ struct sqlite3 { /* ** Possible values for the sqlite3.flags. +** +** Value constraints (enforced via assert()): +** SQLITE_FullFSync == PAGER_FULLFSYNC +** SQLITE_CkptFullFSync == PAGER_CKPT_FULLFSYNC +** SQLITE_CacheSpill == PAGER_CACHE_SPILL */ -#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ -#define SQLITE_InternChanges 0x00000002 /* Uncommitted Hash table changes */ -#define SQLITE_FullFSync 0x00000004 /* Use full fsync on the backend */ -#define SQLITE_CkptFullFSync 0x00000008 /* Use full fsync for checkpoint */ -#define SQLITE_CacheSpill 0x00000010 /* OK to spill pager cache */ -#define SQLITE_FullColNames 0x00000020 /* Show full column names on SELECT */ +#define SQLITE_WriteSchema 0x00000001 /* OK to update SQLITE_MASTER */ +#define SQLITE_LegacyFileFmt 0x00000002 /* Create new databases in format 1 */ +#define SQLITE_FullColNames 0x00000004 /* Show full column names on SELECT */ +#define SQLITE_FullFSync 0x00000008 /* Use full fsync on the backend */ +#define SQLITE_CkptFullFSync 0x00000010 /* Use full fsync for checkpoint */ +#define SQLITE_CacheSpill 0x00000020 /* OK to spill pager cache */ #define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ #define SQLITE_CountRows 0x00000080 /* Count rows changed by INSERT, */ /* DELETE, or UPDATE and return */ /* the count using a callback. */ #define SQLITE_NullCallback 0x00000100 /* Invoke the callback once if the */ /* result set is empty */ -#define SQLITE_SqlTrace 0x00000200 /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing 0x00000400 /* Debug listings of VDBE programs */ -#define SQLITE_WriteSchema 0x00000800 /* OK to update SQLITE_MASTER */ -#define SQLITE_VdbeAddopTrace 0x00001000 /* Trace sqlite3VdbeAddOp() calls */ -#define SQLITE_IgnoreChecks 0x00002000 /* Do not enforce check constraints */ -#define SQLITE_ReadUncommitted 0x0004000 /* For shared-cache mode */ -#define SQLITE_LegacyFileFmt 0x00008000 /* Create new databases in format 1 */ -#define SQLITE_RecoveryMode 0x00010000 /* Ignore schema errors */ -#define SQLITE_ReverseOrder 0x00020000 /* Reverse unordered SELECTs */ -#define SQLITE_RecTriggers 0x00040000 /* Enable recursive triggers */ -#define SQLITE_ForeignKeys 0x00080000 /* Enforce foreign key constraints */ -#define SQLITE_AutoIndex 0x00100000 /* Enable automatic indexes */ -#define SQLITE_PreferBuiltin 0x00200000 /* Preference to built-in funcs */ -#define SQLITE_LoadExtension 0x00400000 /* Enable load_extension */ -#define SQLITE_EnableTrigger 0x00800000 /* True to enable triggers */ -#define SQLITE_DeferFKs 0x01000000 /* Defer all FK constraints */ -#define SQLITE_QueryOnly 0x02000000 /* Disable database changes */ -#define SQLITE_VdbeEQP 0x04000000 /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_IgnoreChecks 0x00000200 /* Do not enforce check constraints */ +#define SQLITE_ReadUncommit 0x00000400 /* READ UNCOMMITTED in shared-cache */ +#define SQLITE_NoCkptOnClose 0x00000800 /* No checkpoint on close()/DETACH */ +#define SQLITE_ReverseOrder 0x00001000 /* Reverse unordered SELECTs */ +#define SQLITE_RecTriggers 0x00002000 /* Enable recursive triggers */ +#define SQLITE_ForeignKeys 0x00004000 /* Enforce foreign key constraints */ +#define SQLITE_AutoIndex 0x00008000 /* Enable automatic indexes */ +#define SQLITE_LoadExtension 0x00010000 /* Enable load_extension */ +#define SQLITE_LoadExtFunc 0x00020000 /* Enable load_extension() SQL func */ +#define SQLITE_EnableTrigger 0x00040000 /* True to enable triggers */ +#define SQLITE_DeferFKs 0x00080000 /* Defer all FK constraints */ +#define SQLITE_QueryOnly 0x00100000 /* Disable database changes */ +#define SQLITE_CellSizeCk 0x00200000 /* Check btree cell sizes on load */ +#define SQLITE_Fts3Tokenizer 0x00400000 /* Enable fts3_tokenizer(2) */ +#define SQLITE_EnableQPSG 0x00800000 /* Query Planner Stability Guarantee*/ +#define SQLITE_TriggerEQP 0x01000000 /* Show trigger EXPLAIN QUERY PLAN */ +#define SQLITE_ResetDatabase 0x02000000 /* Reset the database */ +/* Flags used only if debugging */ +#ifdef SQLITE_DEBUG +#define SQLITE_SqlTrace 0x08000000 /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing 0x10000000 /* Debug listings of VDBE programs */ +#define SQLITE_VdbeTrace 0x20000000 /* True to trace VDBE execution */ +#define SQLITE_VdbeAddopTrace 0x40000000 /* Trace sqlite3VdbeAddOp() calls */ +#define SQLITE_VdbeEQP 0x80000000 /* Debug EXPLAIN QUERY PLAN */ +#endif + +/* +** Allowed values for sqlite3.mDbFlags +*/ +#define DBFLAG_SchemaChange 0x0001 /* Uncommitted Hash table changes */ +#define DBFLAG_PreferBuiltin 0x0002 /* Preference to built-in funcs */ +#define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ +#define DBFLAG_SchemaKnownOk 0x0008 /* Schema is known to be valid */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the @@ -10970,26 +16073,24 @@ struct sqlite3 { #define SQLITE_ColumnCache 0x0002 /* Column cache */ #define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */ #define SQLITE_FactorOutConst 0x0008 /* Constant factoring */ -/* not used 0x0010 // Was: SQLITE_IdxRealAsInt */ -#define SQLITE_DistinctOpt 0x0020 /* DISTINCT using indexes */ -#define SQLITE_CoverIdxScan 0x0040 /* Covering index scans */ -#define SQLITE_OrderByIdxJoin 0x0080 /* ORDER BY of joins via index */ -#define SQLITE_SubqCoroutine 0x0100 /* Evaluate subqueries as coroutines */ -#define SQLITE_Transitive 0x0200 /* Transitive constraints */ -#define SQLITE_OmitNoopJoin 0x0400 /* Omit unused tables in joins */ +#define SQLITE_DistinctOpt 0x0010 /* DISTINCT using indexes */ +#define SQLITE_CoverIdxScan 0x0020 /* Covering index scans */ +#define SQLITE_OrderByIdxJoin 0x0040 /* ORDER BY of joins via index */ +#define SQLITE_Transitive 0x0080 /* Transitive constraints */ +#define SQLITE_OmitNoopJoin 0x0100 /* Omit unused tables in joins */ +#define SQLITE_CountOfView 0x0200 /* The count-of-view optimization */ +#define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */ #define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */ + /* TH3 expects the Stat34 ^^^^^^ value to be 0x0800. Don't change it */ +#define SQLITE_PushDown 0x1000 /* The push-down optimization */ +#define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */ #define SQLITE_AllOpts 0xffff /* All optimizations */ /* ** Macros for testing whether or not optimizations are enabled or disabled. */ -#ifndef SQLITE_OMIT_BUILTIN_TEST #define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0) #define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0) -#else -#define OptimizationDisabled(db, mask) 0 -#define OptimizationEnabled(db, mask) 1 -#endif /* ** Return true if it OK to factor constant expressions into the initialization @@ -11011,28 +16112,33 @@ struct sqlite3 { /* ** Each SQL function is defined by an instance of the following -** structure. A pointer to this structure is stored in the sqlite.aFunc -** hash table. When multiple functions have the same name, the hash table -** points to a linked list of these structures. +** structure. For global built-in functions (ex: substr(), max(), count()) +** a pointer to this structure is held in the sqlite3BuiltinFunctions object. +** For per-connection application-defined functions, a pointer to this +** structure is held in the db->aHash hash table. +** +** The u.pHash field is used by the global built-ins. The u.pDestructor +** field is used by per-connection app-def functions. */ struct FuncDef { - i16 nArg; /* Number of arguments. -1 means unlimited */ + i8 nArg; /* Number of arguments. -1 means unlimited */ u16 funcFlags; /* Some combination of SQLITE_FUNC_* */ void *pUserData; /* User data parameter */ FuncDef *pNext; /* Next function with same name */ - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ - void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ - void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */ - char *zName; /* SQL name of the function. */ - FuncDef *pHash; /* Next with a different name but the same hash */ - FuncDestructor *pDestructor; /* Reference counted destructor function */ + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**); /* func or agg-step */ + void (*xFinalize)(sqlite3_context*); /* Agg finalizer */ + const char *zName; /* SQL name of the function. */ + union { + FuncDef *pHash; /* Next with a different name but the same hash */ + FuncDestructor *pDestructor; /* Reference counted destructor function */ + } u; }; /* ** This structure encapsulates a user-function destructor callback (as ** configured using create_function_v2()) and a reference counter. When ** create_function_v2() is called to create a function with a destructor, -** a single object of this type is allocated. FuncDestructor.nRef is set to +** a single object of this type is allocated. FuncDestructor.nRef is set to ** the number of FuncDef objects created (either 1 or 3, depending on whether ** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor ** member of each of the new FuncDef objects is set to point to the allocated @@ -11050,36 +16156,61 @@ struct FuncDestructor { /* ** Possible values for FuncDef.flags. Note that the _LENGTH and _TYPEOF -** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. There +** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. And +** SQLITE_FUNC_CONSTANT must be the same as SQLITE_DETERMINISTIC. There ** are assert() statements in the code to verify this. +** +** Value constraints (enforced via assert()): +** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg +** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG +** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG +** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API +** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API */ -#define SQLITE_FUNC_ENCMASK 0x003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ -#define SQLITE_FUNC_LIKE 0x004 /* Candidate for the LIKE optimization */ -#define SQLITE_FUNC_CASE 0x008 /* Case-sensitive LIKE-type function */ -#define SQLITE_FUNC_EPHEM 0x010 /* Ephemeral. Delete with VDBE */ -#define SQLITE_FUNC_NEEDCOLL 0x020 /* sqlite3GetFuncCollSeq() might be called */ -#define SQLITE_FUNC_LENGTH 0x040 /* Built-in length() function */ -#define SQLITE_FUNC_TYPEOF 0x080 /* Built-in typeof() function */ -#define SQLITE_FUNC_COUNT 0x100 /* Built-in count(*) aggregate */ -#define SQLITE_FUNC_COALESCE 0x200 /* Built-in coalesce() or ifnull() */ -#define SQLITE_FUNC_UNLIKELY 0x400 /* Built-in unlikely() function */ -#define SQLITE_FUNC_CONSTANT 0x800 /* Constant inputs give a constant output */ -#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ +#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ +#define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ +#define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */ +#define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */ +#define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/ +#define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */ +#define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */ +#define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */ +#define SQLITE_FUNC_COALESCE 0x0200 /* Built-in coalesce() or ifnull() */ +#define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */ +#define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */ +#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ +#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a + ** single query - might change over time */ +#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ +#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are ** used to create the initializers for the FuncDef structures. ** ** FUNCTION(zName, nArg, iArg, bNC, xFunc) -** Used to create a scalar function definition of a function zName +** Used to create a scalar function definition of a function zName ** implemented by C function xFunc that accepts nArg arguments. The ** value passed as iArg is cast to a (void*) and made available -** as the user-data (sqlite3_user_data()) for the function. If +** as the user-data (sqlite3_user_data()) for the function. If ** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. ** ** VFUNCTION(zName, nArg, iArg, bNC, xFunc) ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag. ** +** DFUNCTION(zName, nArg, iArg, bNC, xFunc) +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and +** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions +** and functions like sqlite_version() that can change, but not during +** a single query. The iArg is ignored. The user-data is always set +** to a NULL pointer. The bNC parameter is not used. +** +** PURE_DATE(zName, nArg, iArg, bNC, xFunc) +** Used for "pure" date/time functions, this macro is like DFUNCTION +** except that it does set the SQLITE_FUNC_CONSTANT flags. iArg is +** ignored and the user-data for these functions is set to an +** arbitrary non-NULL pointer. The bNC parameter is not used. +** ** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal) ** Used to create an aggregate function definition implemented by ** the C functions xStep and xFinal. The first four parameters @@ -11087,8 +16218,8 @@ struct FuncDestructor { ** FUNCTION(). ** ** LIKEFUNC(zName, nArg, pArg, flags) -** Used to create a scalar function definition of a function zName -** that accepts nArg arguments and is implemented by a call to C +** Used to create a scalar function definition of a function zName +** that accepts nArg arguments and is implemented by a call to C ** function likeFunc. Argument pArg is cast to a (void *) and made ** available as the function user-data (sqlite3_user_data()). The ** FuncDef.flags variable is set to the value passed as the flags @@ -11096,25 +16227,31 @@ struct FuncDestructor { */ #define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } #define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } +#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ + 0, 0, xFunc, 0, #zName, {0} } +#define PURE_DATE(zName, nArg, iArg, bNC, xFunc) \ + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|SQLITE_FUNC_CONSTANT, \ + (void*)&sqlite3Config, 0, xFunc, 0, #zName, {0} } #define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ {nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ - SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} + SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } #define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ - {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ - pArg, 0, xFunc, 0, 0, #zName, 0, 0} + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ + pArg, 0, xFunc, 0, #zName, } #define LIKEFUNC(zName, nArg, arg, flags) \ {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ - (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0} + (void *)arg, 0, likeFunc, 0, #zName, {0} } #define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL), \ - SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} + SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}} #define AGGREGATE2(zName, nArg, arg, nc, xStep, xFinal, extraFlags) \ {nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|extraFlags, \ - SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} + SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}} /* ** All current savepoints are stored in a linked list starting at @@ -11148,6 +16285,7 @@ struct Module { const char *zName; /* Name passed to create_module() */ void *pAux; /* pAux passed to create_module() */ void (*xDestroy)(void *); /* Module destructor function */ + Table *pEpoTab; /* Eponymous table for this module */ }; /* @@ -11155,14 +16293,12 @@ struct Module { ** of this structure. */ struct Column { - char *zName; /* Name of this column */ + char *zName; /* Name of this column, \000, then the type */ Expr *pDflt; /* Default value of this column */ - char *zDflt; /* Original text of the default value */ - char *zType; /* Data type for this column */ char *zColl; /* Collating sequence. If NULL, use the default */ u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ char affinity; /* One of the SQLITE_AFF_... values */ - u8 szEst; /* Estimated size of this column. INT==1 */ + u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ u8 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; @@ -11170,6 +16306,9 @@ struct Column { */ #define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ #define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ +#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ +#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */ +#define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ /* ** A "Collating Sequence" is defined by an instance of the following @@ -11193,22 +16332,23 @@ struct CollSeq { */ #define SQLITE_SO_ASC 0 /* Sort in ascending order */ #define SQLITE_SO_DESC 1 /* Sort in ascending order */ +#define SQLITE_SO_UNDEFINED -1 /* No sort order specified */ /* ** Column affinity types. ** ** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and ** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve -** the speed a little by numbering the values consecutively. +** the speed a little by numbering the values consecutively. ** ** But rather than start with 0 or 1, we begin with 'A'. That way, ** when multiple affinity types are concatenated into a string and ** used as the P4 operand, they will be more readable. ** ** Note also that the numeric types are grouped together so that testing -** for a numeric type is a single comparison. And the NONE type is first. +** for a numeric type is a single comparison. And the BLOB type is first. */ -#define SQLITE_AFF_NONE 'A' +#define SQLITE_AFF_BLOB 'A' #define SQLITE_AFF_TEXT 'B' #define SQLITE_AFF_NUMERIC 'C' #define SQLITE_AFF_INTEGER 'D' @@ -11218,7 +16358,7 @@ struct CollSeq { /* ** The SQLITE_AFF_MASK values masks off the significant bits of an -** affinity value. +** affinity value. */ #define SQLITE_AFF_MASK 0x47 @@ -11231,6 +16371,7 @@ struct CollSeq { ** operator is NULL. It is added to certain comparison operators to ** prove that the operands are always NOT NULL. */ +#define SQLITE_KEEPNULL 0x08 /* Used by vector == or <> */ #define SQLITE_JUMPIFNULL 0x10 /* jumps if either operand is NULL */ #define SQLITE_STOREP2 0x20 /* Store result in reg[P2] rather than jump */ #define SQLITE_NULLEQ 0x80 /* NULL=NULL */ @@ -11238,20 +16379,20 @@ struct CollSeq { /* ** An object of this type is created for each virtual table present in -** the database schema. +** the database schema. ** ** If the database schema is shared, then there is one instance of this ** structure for each database connection (sqlite3*) that uses the shared ** schema. This is because each database connection requires its own unique -** instance of the sqlite3_vtab* handle used to access the virtual table -** implementation. sqlite3_vtab* handles can not be shared between -** database connections, even when the rest of the in-memory database +** instance of the sqlite3_vtab* handle used to access the virtual table +** implementation. sqlite3_vtab* handles can not be shared between +** database connections, even when the rest of the in-memory database ** schema is shared, as the implementation often stores the database ** connection handle passed to it via the xConnect() or xCreate() method ** during initialization internally. This database connection handle may -** then be used by the virtual table implementation to access real tables -** within the database. So that they appear as part of the callers -** transaction, these accesses need to be made via the same database +** then be used by the virtual table implementation to access real tables +** within the database. So that they appear as part of the callers +** transaction, these accesses need to be made via the same database ** connection as that used to execute SQL operations on the virtual table. ** ** All VTable objects that correspond to a single table in a shared @@ -11263,19 +16404,19 @@ struct CollSeq { ** sqlite3_vtab* handle in the compiled query. ** ** When an in-memory Table object is deleted (for example when the -** schema is being reloaded for some reason), the VTable objects are not -** deleted and the sqlite3_vtab* handles are not xDisconnect()ed +** schema is being reloaded for some reason), the VTable objects are not +** deleted and the sqlite3_vtab* handles are not xDisconnect()ed ** immediately. Instead, they are moved from the Table.pVTable list to ** another linked list headed by the sqlite3.pDisconnect member of the -** corresponding sqlite3 structure. They are then deleted/xDisconnected +** corresponding sqlite3 structure. They are then deleted/xDisconnected ** next time a statement is prepared using said sqlite3*. This is done ** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. ** Refer to comments above function sqlite3VtabUnlockList() for an ** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect ** list without holding the corresponding sqlite3.mutex mutex. ** -** The memory for objects of this type is always allocated by -** sqlite3DbMalloc(), using the connection handle stored in VTable.db as +** The memory for objects of this type is always allocated by +** sqlite3DbMalloc(), using the connection handle stored in VTable.db as ** the first argument. */ struct VTable { @@ -11289,34 +16430,8 @@ struct VTable { }; /* -** Each SQL table is represented in memory by an instance of the -** following structure. -** -** Table.zName is the name of the table. The case of the original -** CREATE TABLE statement is stored, but case is not significant for -** comparisons. -** -** Table.nCol is the number of columns in this table. Table.aCol is a -** pointer to an array of Column structures, one for each column. -** -** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of -** the column that is that key. Otherwise Table.iPKey is negative. Note -** that the datatype of the PRIMARY KEY must be INTEGER for this field to -** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of -** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid -** is generated for each row of the table. TF_HasPrimaryKey is set if -** the table has any PRIMARY KEY, INTEGER or otherwise. -** -** Table.tnum is the page number for the root BTree page of the table in the -** database file. If Table.iDb is the index of the database table backend -** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that -** holds temporary tables and indices. If TF_Ephemeral is set -** then the table is stored in a file that is automatically deleted -** when the VDBE cursor to the table is closed. In this case Table.tnum -** refers VDBE cursor number that holds the table open, not to the root -** page number. Transient tables are used to hold the results of a -** sub-query that appears instead of a real table name in the FROM clause -** of a SELECT statement. +** The schema for each SQL table and view is represented in memory +** by an instance of the following structure. */ struct Table { char *zName; /* Name of the table or view */ @@ -11325,26 +16440,25 @@ struct Table { Select *pSelect; /* NULL for tables. Points to definition if a view. */ FKey *pFKey; /* Linked list of all foreign keys in this table */ char *zColAff; /* String defining the affinity of each column */ -#ifndef SQLITE_OMIT_CHECK ExprList *pCheck; /* All CHECK constraints */ -#endif - LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ - int tnum; /* Root BTree node for this table (see note above) */ - i16 iPKey; /* If not negative, use aCol[iPKey] as the primary key */ + /* ... also used as column name list in a VIEW */ + int tnum; /* Root BTree page for this table */ + u32 nTabRef; /* Number of pointers to this Table */ + u32 tabFlags; /* Mask of TF_* values */ + i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ i16 nCol; /* Number of columns in this table */ - u16 nRef; /* Number of pointers to this Table */ + LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ LogEst szTabRow; /* Estimated size of each table row in bytes */ #ifdef SQLITE_ENABLE_COSTMULT LogEst costMult; /* Cost multiplier for using this table */ #endif - u8 tabFlags; /* Mask of TF_* values */ u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ #ifndef SQLITE_OMIT_ALTERTABLE int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ #endif #ifndef SQLITE_OMIT_VIRTUALTABLE int nModuleArg; /* Number of arguments to the module */ - char **azModuleArg; /* Text of all module args. [0] is module name */ + char **azModuleArg; /* 0: module 1: schema 2: vtab name 3...: args */ VTable *pVTable; /* List of VTable objects. */ #endif Trigger *pTrigger; /* List of triggers stored in pSchema */ @@ -11354,14 +16468,24 @@ struct Table { /* ** Allowed values for Table.tabFlags. +** +** TF_OOOHidden applies to tables or view that have hidden columns that are +** followed by non-hidden columns. Example: "CREATE VIRTUAL TABLE x USING +** vtab1(a HIDDEN, b);". Since "b" is a non-hidden column but "a" is hidden, +** the TF_OOOHidden attribute would apply in this case. Such tables require +** special handling during INSERT processing. */ -#define TF_Readonly 0x01 /* Read-only system table */ -#define TF_Ephemeral 0x02 /* An ephemeral table */ -#define TF_HasPrimaryKey 0x04 /* Table has a primary key */ -#define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */ -#define TF_Virtual 0x10 /* Is a virtual table */ -#define TF_WithoutRowid 0x20 /* No rowid used. PRIMARY KEY is the key */ - +#define TF_Readonly 0x0001 /* Read-only system table */ +#define TF_Ephemeral 0x0002 /* An ephemeral table */ +#define TF_HasPrimaryKey 0x0004 /* Table has a primary key */ +#define TF_Autoincrement 0x0008 /* Integer primary key is autoincrement */ +#define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */ +#define TF_WithoutRowid 0x0020 /* No rowid. PRIMARY KEY is the key */ +#define TF_NoVisibleRowid 0x0040 /* No user-visible "rowid" column */ +#define TF_OOOHidden 0x0080 /* Out-of-Order hidden columns */ +#define TF_StatsUsed 0x0100 /* Query planner decisions affected by + ** Index.aiRowLogEst[] values */ +#define TF_HasNotNull 0x0200 /* Contains NOT NULL constraints */ /* ** Test to see whether or not a table is a virtual table. This is @@ -11369,15 +16493,32 @@ struct Table { ** table support is omitted from the build. */ #ifndef SQLITE_OMIT_VIRTUALTABLE -# define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0) -# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsVirtual(X) ((X)->nModuleArg) #else # define IsVirtual(X) 0 -# define IsHiddenColumn(X) 0 #endif +/* +** Macros to determine if a column is hidden. IsOrdinaryHiddenColumn() +** only works for non-virtual tables (ordinary tables and views) and is +** always false unless SQLITE_ENABLE_HIDDEN_COLUMNS is defined. The +** IsHiddenColumn() macro is general purpose. +*/ +#if defined(SQLITE_ENABLE_HIDDEN_COLUMNS) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +#elif !defined(SQLITE_OMIT_VIRTUALTABLE) +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0) +# define IsOrdinaryHiddenColumn(X) 0 +#else +# define IsHiddenColumn(X) 0 +# define IsOrdinaryHiddenColumn(X) 0 +#endif + + /* Does the table have a rowid */ #define HasRowid(X) (((X)->tabFlags & TF_WithoutRowid)==0) +#define VisibleRowid(X) (((X)->tabFlags & TF_NoVisibleRowid)==0) /* ** Each foreign key constraint is an instance of the following structure. @@ -11445,7 +16586,7 @@ struct FKey { ** key is set to NULL. CASCADE means that a DELETE or UPDATE of the ** referenced table row is propagated into the row that holds the ** foreign key. -** +** ** The following symbolic values are used to record which type ** of action to take. */ @@ -11455,18 +16596,17 @@ struct FKey { #define OE_Fail 3 /* Stop the operation but leave all prior changes */ #define OE_Ignore 4 /* Ignore the error. Do not do the INSERT or UPDATE */ #define OE_Replace 5 /* Delete existing record, then do INSERT or UPDATE */ - -#define OE_Restrict 6 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ -#define OE_SetNull 7 /* Set the foreign key value to NULL */ -#define OE_SetDflt 8 /* Set the foreign key value to its default */ -#define OE_Cascade 9 /* Cascade the changes */ - -#define OE_Default 10 /* Do whatever the default action is */ +#define OE_Update 6 /* Process as a DO UPDATE in an upsert */ +#define OE_Restrict 7 /* OE_Abort for IMMEDIATE, OE_Rollback for DEFERRED */ +#define OE_SetNull 8 /* Set the foreign key value to NULL */ +#define OE_SetDflt 9 /* Set the foreign key value to its default */ +#define OE_Cascade 10 /* Cascade the changes */ +#define OE_Default 11 /* Do whatever the default action is */ /* ** An instance of the following structure is passed as the first -** argument to sqlite3VdbeKeyCompare and is used to control the +** argument to sqlite3VdbeKeyCompare and is used to control the ** comparison of the two index keys. ** ** Note that aSortOrder[] and aColl[] have nField+1 slots. There @@ -11476,17 +16616,16 @@ struct FKey { struct KeyInfo { u32 nRef; /* Number of references to this KeyInfo object */ u8 enc; /* Text encoding - one of the SQLITE_UTF* values */ - u16 nField; /* Number of key columns in the index */ - u16 nXField; /* Number of columns beyond the key columns */ + u16 nKeyField; /* Number of key columns in the index */ + u16 nAllField; /* Total columns, including key plus others */ sqlite3 *db; /* The database connection */ u8 *aSortOrder; /* Sort order for each column. */ CollSeq *aColl[1]; /* Collating sequence for each term of the key */ }; /* -** An instance of the following structure holds information about a -** single index record that has already been parsed out into individual -** values. +** This object holds a record which has been parsed out into individual +** fields, for the purposes of doing a comparison. ** ** A record is an object that contains one or more fields of data. ** Records are used to store the content of a table row and to store @@ -11494,20 +16633,40 @@ struct KeyInfo { ** the OP_MakeRecord opcode of the VDBE and is disassembled by the ** OP_Column opcode. ** -** This structure holds a record that has already been disassembled -** into its constituent fields. +** An instance of this object serves as a "key" for doing a search on +** an index b+tree. The goal of the search is to find the entry that +** is closed to the key described by this object. This object might hold +** just a prefix of the key. The number of fields is given by +** pKeyInfo->nField. ** -** The r1 and r2 member variables are only used by the optimized comparison -** functions vdbeRecordCompareInt() and vdbeRecordCompareString(). +** The r1 and r2 fields are the values to return if this key is less than +** or greater than a key in the btree, respectively. These are normally +** -1 and +1 respectively, but might be inverted to +1 and -1 if the b-tree +** is in DESC order. +** +** The key comparison functions actually return default_rc when they find +** an equals comparison. default_rc can be -1, 0, or +1. If there are +** multiple entries in the b-tree with the same key (when only looking +** at the first pKeyInfo->nFields,) then default_rc can be set to -1 to +** cause the search to find the last match, or +1 to cause the search to +** find the first match. +** +** The key comparison functions will set eqSeen to true if they ever +** get and equal results when comparing this structure to a b-tree record. +** When default_rc!=0, the search might end up on the record immediately +** before the first match or immediately after the last match. The +** eqSeen field will indicate whether or not an exact match exists in the +** b-tree. */ struct UnpackedRecord { KeyInfo *pKeyInfo; /* Collation and sort-order information */ + Mem *aMem; /* Values */ u16 nField; /* Number of entries in apMem[] */ i8 default_rc; /* Comparison result if keys are equal */ u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */ - Mem *aMem; /* Values */ - int r1; /* Value to return if (lhs > rhs) */ - int r2; /* Value to return if (rhs < lhs) */ + i8 r1; /* Value to return if (lhs < rhs) */ + i8 r2; /* Value to return if (lhs > rhs) */ + u8 eqSeen; /* True if an equality comparison has been seen */ }; @@ -11525,7 +16684,7 @@ struct UnpackedRecord { ** In the Table structure describing Ex1, nCol==3 because there are ** three columns in the table. In the Index structure describing ** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. -** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the +** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the ** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. ** The second column to be indexed (c1) has an index of 0 in ** Ex1.aCol[], hence Ex2.aiColumn[1]==0. @@ -11533,9 +16692,17 @@ struct UnpackedRecord { ** The Index.onError field determines whether or not the indexed columns ** must be unique and what to do if they are not. When Index.onError=OE_None, ** it means this is not a unique index. Otherwise it is a unique index -** and the value of Index.onError indicate the which conflict resolution +** and the value of Index.onError indicate the which conflict resolution ** algorithm to employ whenever an attempt is made to insert a non-unique ** element. +** +** While parsing a CREATE TABLE or CREATE INDEX statement in order to +** generate VDBE code (as opposed to parsing one read from an sqlite_master +** table as part of parsing an existing database schema), transient instances +** of this structure may be created. In this case the Index.tnum variable is +** used to store the address of a VDBE instruction, not a database page +** number (it cannot - the database page is not allocated until the VDBE +** program is executed). See convertToWithoutRowidTable() for details. */ struct Index { char *zName; /* Name of this index */ @@ -11546,8 +16713,9 @@ struct Index { Index *pNext; /* The next index associated with the same table */ Schema *pSchema; /* Schema containing this index */ u8 *aSortOrder; /* for each column: True==DESC, False==ASC */ - char **azColl; /* Array of collation sequence names for index */ + const char **azColl; /* Array of collation sequence names for index */ Expr *pPartIdxWhere; /* WHERE clause for partial indices */ + ExprList *aColExpr; /* Column expressions */ int tnum; /* DB Page containing root of this index */ LogEst szIdxRow; /* Estimated average row size in bytes */ u16 nKeyCol; /* Number of columns forming the key */ @@ -11559,6 +16727,8 @@ struct Index { unsigned isResized:1; /* True if resizeIndexObject() has been called */ unsigned isCovering:1; /* True if this is a covering index */ unsigned noSkipScan:1; /* Do not try to use skip-scan if true */ + unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ + unsigned bNoQuery:1; /* Do not use this index to optimize queries */ #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 int nSample; /* Number of elements in aSample[] */ int nSampleCol; /* Size of IndexSample.anEq[] and so on */ @@ -11582,8 +16752,14 @@ struct Index { /* Return true if index X is a UNIQUE index */ #define IsUniqueIndex(X) ((X)->onError!=OE_None) +/* The Index.aiColumn[] values are normally positive integer. But +** there are some negative values that have special meaning: +*/ +#define XN_ROWID (-1) /* Indexed column is the rowid */ +#define XN_EXPR (-2) /* Indexed column is an expression */ + /* -** Each sample stored in the sqlite_stat3 table is represented in memory +** Each sample stored in the sqlite_stat3 table is represented in memory ** using a structure of this type. See documentation at the top of the ** analyze.c source file for additional information. */ @@ -11678,9 +16854,9 @@ typedef int ynVar; ** to represent the greater-than-or-equal-to operator in the expression ** tree. ** -** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, +** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, ** or TK_STRING), then Expr.token contains the text of the SQL literal. If -** the expression is a variable (TK_VARIABLE), then Expr.token contains the +** the expression is a variable (TK_VARIABLE), then Expr.token contains the ** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), ** then Expr.token contains the name of the function. ** @@ -11691,7 +16867,7 @@ typedef int ynVar; ** a CASE expression or an IN expression of the form "<lhs> IN (<y>, <z>...)". ** Expr.x.pSelect is used if the expression is a sub-select or an expression of ** the form "<lhs> IN (SELECT ...)". If the EP_xIsSelect bit is set in the -** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is +** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is ** valid. ** ** An expression of the form ID or ID.ID refers to a column in a table. @@ -11702,8 +16878,8 @@ typedef int ynVar; ** value is also stored in the Expr.iAgg column in the aggregate so that ** it can be accessed after all aggregates are computed. ** -** If the expression is an unbound variable marker (a question mark -** character '?' in the original SQL) then the Expr.iTable holds the index +** If the expression is an unbound variable marker (a question mark +** character '?' in the original SQL) then the Expr.iTable holds the index ** number for that variable. ** ** If the expression is a subquery then Expr.iColumn holds an integer @@ -11742,7 +16918,7 @@ struct Expr { /* If the EP_TokenOnly flag is set in the Expr.flags mask, then no ** space is allocated for the fields below this point. An attempt to - ** access them will result in a segfault or malfunction. + ** access them will result in a segfault or malfunction. *********************************************************************/ Expr *pLeft; /* Left subnode */ @@ -11763,16 +16939,19 @@ struct Expr { int iTable; /* TK_COLUMN: cursor number of table holding column ** TK_REGISTER: register number ** TK_TRIGGER: 1 -> new, 0 -> old - ** EP_Unlikely: 134217728 times likelihood */ + ** EP_Unlikely: 134217728 times likelihood + ** TK_SELECT: 1st register of result vector */ ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. - ** TK_VARIABLE: variable number (always >= 1). */ + ** TK_VARIABLE: variable number (always >= 1). + ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ u8 op2; /* TK_REGISTER: original value of Expr.op ** TK_COLUMN: the value of p5 for OP_Column ** TK_AGG_FUNCTION: nesting depth */ AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ - Table *pTab; /* Table for TK_COLUMN expressions. */ + Table *pTab; /* Table for TK_COLUMN expressions. Can be NULL + ** for a column of an index on an expression */ }; /* @@ -11780,8 +16959,8 @@ struct Expr { */ #define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ #define EP_Agg 0x000002 /* Contains one or more aggregate functions */ -#define EP_Resolved 0x000004 /* IDs have been resolved to COLUMNs */ -#define EP_Error 0x000008 /* Expression contains one or more errors */ +#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ + /* 0x000008 // available for use */ #define EP_Distinct 0x000010 /* Aggregate function with DISTINCT keyword */ #define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ #define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ @@ -11797,11 +16976,20 @@ struct Expr { #define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ #define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ #define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ -#define EP_Constant 0x080000 /* Node is a constant */ +#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ #define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ +#define EP_Alias 0x400000 /* Is an alias for a result set column */ +#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ /* -** These macros can be used to test, set, or clear bits in the +** The EP_Propagate mask is a set of properties that automatically propagate +** upwards into parent nodes. +*/ +#define EP_Propagate (EP_Collate|EP_Subquery|EP_HasFunc) + +/* +** These macros can be used to test, set, or clear bits in the ** Expr.flags field. */ #define ExprHasProperty(E,P) (((E)->flags&(P))!=0) @@ -11820,8 +17008,8 @@ struct Expr { #endif /* -** Macros to determine the number of bytes required by a normal Expr -** struct, an Expr struct with the EP_Reduced flag set in Expr.flags +** Macros to determine the number of bytes required by a normal Expr +** struct, an Expr struct with the EP_Reduced flag set in Expr.flags ** and an Expr struct with the EP_TokenOnly flag set. */ #define EXPR_FULLSIZE sizeof(Expr) /* Full size */ @@ -11829,7 +17017,7 @@ struct Expr { #define EXPR_TOKENONLYSIZE offsetof(Expr,pLeft) /* Fewer features */ /* -** Flags passed to the sqlite3ExprDup() function. See the header comment +** Flags passed to the sqlite3ExprDup() function. See the header comment ** above sqlite3ExprDup() for details. */ #define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ @@ -11853,13 +17041,14 @@ struct Expr { struct ExprList { int nExpr; /* Number of expressions on the list */ struct ExprList_item { /* For each expression in the list */ - Expr *pExpr; /* The list of expressions */ + Expr *pExpr; /* The parse tree for this expression */ char *zName; /* Token associated with this expression */ char *zSpan; /* Original text of the expression */ u8 sortOrder; /* 1 for DESC or 0 for ASC */ unsigned done :1; /* A flag to indicate when processing is finished */ unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ unsigned reusable :1; /* Constant expression is reusable */ + unsigned bSorterRef :1; /* Defer evaluation until after sorting */ union { struct { u16 iOrderByCol; /* For ORDER BY, column number in result set */ @@ -11867,18 +17056,7 @@ struct ExprList { } x; int iConstExprReg; /* Register in which Expr value is cached */ } u; - } *a; /* Alloc a power of two greater or equal to nExpr */ -}; - -/* -** An instance of this structure is used by the parser to record both -** the parse tree for an expression and the span of input text for an -** expression. -*/ -struct ExprSpan { - Expr *pExpr; /* The expression parse tree */ - const char *zStart; /* First character of input text */ - const char *zEnd; /* One character past the end of input text */ + } a[1]; /* One slot for each expression in the list */ }; /* @@ -11911,7 +17089,11 @@ struct IdList { ** tables in a join to 32 instead of 64. But it also reduces the size ** of the library by 738 bytes on ix86. */ -typedef u64 Bitmask; +#ifdef SQLITE_BITMASK_TYPE + typedef SQLITE_BITMASK_TYPE Bitmask; +#else + typedef u64 Bitmask; +#endif /* ** The number of bits in a Bitmask. "BMS" means "BitMask Size". @@ -11923,6 +17105,7 @@ typedef u64 Bitmask; */ #define MASKBIT(n) (((Bitmask)1)<<(n)) #define MASKBIT32(n) (((unsigned int)1)<<(n)) +#define ALLBITS ((Bitmask)-1) /* ** The following structure describes the FROM clause of a SELECT statement. @@ -11956,20 +17139,24 @@ struct SrcList { int addrFillSub; /* Address of subroutine to manifest a subquery */ int regReturn; /* Register holding return address of addrFillSub */ int regResult; /* Registers holding results of a co-routine */ - u8 jointype; /* Type of join between this able and the previous */ - unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ - unsigned isCorrelated :1; /* True if sub-query is correlated */ - unsigned viaCoroutine :1; /* Implemented as a co-routine */ - unsigned isRecursive :1; /* True for recursive reference in WITH */ -#ifndef SQLITE_OMIT_EXPLAIN - u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */ -#endif + struct { + u8 jointype; /* Type of join between this table and the previous */ + unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ + unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ + unsigned isTabFunc :1; /* True if table-valued-function syntax */ + unsigned isCorrelated :1; /* True if sub-query is correlated */ + unsigned viaCoroutine :1; /* Implemented as a co-routine */ + unsigned isRecursive :1; /* True for recursive reference in WITH */ + } fg; int iCursor; /* The VDBE cursor number used to access this table */ Expr *pOn; /* The ON clause of a join */ IdList *pUsing; /* The USING clause of a join */ Bitmask colUsed; /* Bit N (1<<N) set if column N of pTab is used */ - char *zIndex; /* Identifier from "INDEXED BY <zIndex>" clause */ - Index *pIndex; /* Index structure corresponding to zIndex, if any */ + union { + char *zIndexedBy; /* Identifier from "INDEXED BY <zIndex>" clause */ + ExprList *pFuncArg; /* Arguments to table-valued-function */ + } u1; + Index *pIBIndex; /* Index structure corresponding to u1.zIndexedBy */ } a[1]; /* One entry for each identifier on the list */ }; @@ -11988,21 +17175,28 @@ struct SrcList { /* ** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin() ** and the WhereInfo.wctrlFlags member. +** +** Value constraints (enforced via assert()): +** WHERE_USE_LIMIT == SF_FixedLimit */ #define WHERE_ORDERBY_NORMAL 0x0000 /* No-op */ #define WHERE_ORDERBY_MIN 0x0001 /* ORDER BY processing for min() func */ #define WHERE_ORDERBY_MAX 0x0002 /* ORDER BY processing for max() func */ #define WHERE_ONEPASS_DESIRED 0x0004 /* Want to do one-pass UPDATE/DELETE */ -#define WHERE_DUPLICATES_OK 0x0008 /* Ok to return a row more than once */ -#define WHERE_OMIT_OPEN_CLOSE 0x0010 /* Table cursors are already open */ -#define WHERE_FORCE_TABLE 0x0020 /* Do not use an index-only search */ -#define WHERE_ONETABLE_ONLY 0x0040 /* Only code the 1st table in pTabList */ - /* 0x0080 // not currently used */ -#define WHERE_GROUPBY 0x0100 /* pOrderBy is really a GROUP BY */ -#define WHERE_DISTINCTBY 0x0200 /* pOrderby is really a DISTINCT clause */ -#define WHERE_WANT_DISTINCT 0x0400 /* All output needs to be distinct */ -#define WHERE_SORTBYGROUP 0x0800 /* Support sqlite3WhereIsSorted() */ -#define WHERE_REOPEN_IDX 0x1000 /* Try to use OP_ReopenIdx */ +#define WHERE_ONEPASS_MULTIROW 0x0008 /* ONEPASS is ok with multiple rows */ +#define WHERE_DUPLICATES_OK 0x0010 /* Ok to return a row more than once */ +#define WHERE_OR_SUBCLAUSE 0x0020 /* Processing a sub-WHERE as part of + ** the OR optimization */ +#define WHERE_GROUPBY 0x0040 /* pOrderBy is really a GROUP BY */ +#define WHERE_DISTINCTBY 0x0080 /* pOrderby is really a DISTINCT clause */ +#define WHERE_WANT_DISTINCT 0x0100 /* All output needs to be distinct */ +#define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */ +#define WHERE_SEEK_TABLE 0x0400 /* Do not defer seeks on main table */ +#define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ +#define WHERE_SEEK_UNIQ_TABLE 0x1000 /* Do not defer seeks if unique */ + /* 0x2000 not currently used */ +#define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ + /* 0x8000 not currently used */ /* Allowed return values from sqlite3WhereIsDistinct() */ @@ -12020,12 +17214,12 @@ struct SrcList { ** pEList corresponds to the result set of a SELECT and is NULL for ** other statements. ** -** NameContexts can be nested. When resolving names, the inner-most +** NameContexts can be nested. When resolving names, the inner-most ** context is searched first. If no match is found, the next outer ** context is checked. If there is still no match, the next context ** is checked. This process continues until either a match is found ** or all contexts are check. When a match is found, the nRef member of -** the context containing the match is incremented. +** the context containing the match is incremented. ** ** Each subquery gets a new NameContext. The pNext field points to the ** NameContext in the parent query. Thus the process of scanning the @@ -12035,8 +17229,11 @@ struct SrcList { struct NameContext { Parse *pParse; /* The parser */ SrcList *pSrcList; /* One or more tables used to resolve names */ - ExprList *pEList; /* Optional list of result-set columns */ - AggInfo *pAggInfo; /* Information about aggregates at this level */ + union { + ExprList *pEList; /* Optional list of result-set columns */ + AggInfo *pAggInfo; /* Information about aggregates at this level */ + Upsert *pUpsert; /* ON CONFLICT clause information from an upsert */ + } uNC; NameContext *pNext; /* Next outer name context. NULL for outermost */ int nRef; /* Number of names resolved by this context */ int nErr; /* Number of errors encountered while resolving names */ @@ -12046,26 +17243,60 @@ struct NameContext { /* ** Allowed values for the NameContext, ncFlags field. ** -** Note: NC_MinMaxAgg must have the same value as SF_MinMaxAgg and -** SQLITE_FUNC_MINMAX. -** +** Value constraints (all checked via assert()): +** NC_HasAgg == SF_HasAgg +** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX +** */ #define NC_AllowAgg 0x0001 /* Aggregate functions are allowed here */ -#define NC_HasAgg 0x0002 /* One or more aggregate functions seen */ +#define NC_PartIdx 0x0002 /* True if resolving a partial index WHERE */ #define NC_IsCheck 0x0004 /* True if resolving names in a CHECK constraint */ #define NC_InAggFunc 0x0008 /* True if analyzing arguments to an agg func */ -#define NC_PartIdx 0x0010 /* True if resolving a partial index WHERE */ +#define NC_HasAgg 0x0010 /* One or more aggregate functions seen */ +#define NC_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */ +#define NC_VarSelect 0x0040 /* A correlated subquery has been seen */ +#define NC_UEList 0x0080 /* True if uNC.pEList is used */ +#define NC_UAggInfo 0x0100 /* True if uNC.pAggInfo is used */ +#define NC_UUpsert 0x0200 /* True if uNC.pUpsert is used */ #define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */ +#define NC_Complex 0x2000 /* True if a function or subquery seen */ + +/* +** An instance of the following object describes a single ON CONFLICT +** clause in an upsert. +** +** The pUpsertTarget field is only set if the ON CONFLICT clause includes +** conflict-target clause. (In "ON CONFLICT(a,b)" the "(a,b)" is the +** conflict-target clause.) The pUpsertTargetWhere is the optional +** WHERE clause used to identify partial unique indexes. +** +** pUpsertSet is the list of column=expr terms of the UPDATE statement. +** The pUpsertSet field is NULL for a ON CONFLICT DO NOTHING. The +** pUpsertWhere is the WHERE clause for the UPDATE and is NULL if the +** WHERE clause is omitted. +*/ +struct Upsert { + ExprList *pUpsertTarget; /* Optional description of conflicting index */ + Expr *pUpsertTargetWhere; /* WHERE clause for partial index targets */ + ExprList *pUpsertSet; /* The SET clause from an ON CONFLICT UPDATE */ + Expr *pUpsertWhere; /* WHERE clause for the ON CONFLICT UPDATE */ + /* The fields above comprise the parse tree for the upsert clause. + ** The fields below are used to transfer information from the INSERT + ** processing down into the UPDATE processing while generating code. + ** Upsert owns the memory allocated above, but not the memory below. */ + Index *pUpsertIdx; /* Constraint that pUpsertTarget identifies */ + SrcList *pUpsertSrc; /* Table to be updated */ + int regData; /* First register holding array of VALUES */ + int iDataCur; /* Index of the data cursor */ + int iIdxCur; /* Index of the first index cursor */ +}; /* ** An instance of the following structure contains all information ** needed to generate code for a single SELECT statement. ** -** nLimit is set to -1 if there is no LIMIT clause. nOffset is set to 0. -** If there is a LIMIT clause, the parser sets nLimit to the value of the -** limit and nOffset to the value of the offset (or 0 if there is not -** offset). But later on, nLimit and nOffset become the memory locations -** in the VDBE that record the limit and offset counters. +** See the header comment on the computeLimitRegisters() routine for a +** detailed description of the meaning of the iLimit and iOffset fields. ** ** addrOpenEphm[] entries contain the address of OP_OpenEphemeral opcodes. ** These addresses must be stored so that we can go back and fill in @@ -12080,13 +17311,13 @@ struct NameContext { struct Select { ExprList *pEList; /* The fields of the result */ u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */ - u16 selFlags; /* Various SF_* values */ + LogEst nSelectRow; /* Estimated number of result rows */ + u32 selFlags; /* Various SF_* values */ int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */ #if SELECTTRACE_ENABLED char zSelName[12]; /* Symbolic name of this SELECT use for debugging */ #endif int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */ - u64 nSelectRow; /* Estimated number of result rows */ SrcList *pSrc; /* The FROM clause */ Expr *pWhere; /* The WHERE clause */ ExprList *pGroupBy; /* The GROUP BY clause */ @@ -12095,35 +17326,44 @@ struct Select { Select *pPrior; /* Prior select in a compound select statement */ Select *pNext; /* Next select to the left in a compound */ Expr *pLimit; /* LIMIT expression. NULL means not used. */ - Expr *pOffset; /* OFFSET expression. NULL means not used. */ With *pWith; /* WITH clause attached to this select. Or NULL. */ }; /* ** Allowed values for Select.selFlags. The "SF" prefix stands for ** "Select Flag". +** +** Value constraints (all checked via assert()) +** SF_HasAgg == NC_HasAgg +** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX +** SF_FixedLimit == WHERE_USE_LIMIT */ -#define SF_Distinct 0x0001 /* Output should be DISTINCT */ -#define SF_Resolved 0x0002 /* Identifiers have been resolved */ -#define SF_Aggregate 0x0004 /* Contains aggregate functions */ -#define SF_UsesEphemeral 0x0008 /* Uses the OpenEphemeral opcode */ -#define SF_Expanded 0x0010 /* sqlite3SelectExpand() called on this */ -#define SF_HasTypeInfo 0x0020 /* FROM subqueries have Table metadata */ -#define SF_Compound 0x0040 /* Part of a compound query */ -#define SF_Values 0x0080 /* Synthesized from VALUES clause */ -#define SF_AllValues 0x0100 /* All terms of compound are VALUES */ -#define SF_NestedFrom 0x0200 /* Part of a parenthesized FROM clause */ -#define SF_MaybeConvert 0x0400 /* Need convertCompoundSelectToSubquery() */ -#define SF_Recursive 0x0800 /* The recursive part of a recursive CTE */ -#define SF_MinMaxAgg 0x1000 /* Aggregate containing min() or max() */ - +#define SF_Distinct 0x00001 /* Output should be DISTINCT */ +#define SF_All 0x00002 /* Includes the ALL keyword */ +#define SF_Resolved 0x00004 /* Identifiers have been resolved */ +#define SF_Aggregate 0x00008 /* Contains agg functions or a GROUP BY */ +#define SF_HasAgg 0x00010 /* Contains aggregate functions */ +#define SF_UsesEphemeral 0x00020 /* Uses the OpenEphemeral opcode */ +#define SF_Expanded 0x00040 /* sqlite3SelectExpand() called on this */ +#define SF_HasTypeInfo 0x00080 /* FROM subqueries have Table metadata */ +#define SF_Compound 0x00100 /* Part of a compound query */ +#define SF_Values 0x00200 /* Synthesized from VALUES clause */ +#define SF_MultiValue 0x00400 /* Single VALUES term with multiple rows */ +#define SF_NestedFrom 0x00800 /* Part of a parenthesized FROM clause */ +#define SF_MinMaxAgg 0x01000 /* Aggregate containing min() or max() */ +#define SF_Recursive 0x02000 /* The recursive part of a recursive CTE */ +#define SF_FixedLimit 0x04000 /* nSelectRow set by a constant LIMIT */ +#define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */ +#define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */ +#define SF_IncludeHidden 0x20000 /* Include hidden columns in output */ +#define SF_ComplexResult 0x40000 /* Result contains subquery or function */ /* ** The results of a SELECT can be distributed in several ways, as defined ** by one of the following macros. The "SRT" prefix means "SELECT Result ** Type". ** -** SRT_Union Store results as a key in a temporary index +** SRT_Union Store results as a key in a temporary index ** identified by pDest->iSDParm. ** ** SRT_Except Remove results from the temporary index pDest->iSDParm. @@ -12147,7 +17387,7 @@ struct Select { ** of the query. This destination implies "LIMIT 1". ** ** SRT_Set The result must be a single column. Store each -** row of result as the key in table pDest->iSDParm. +** row of result as the key in table pDest->iSDParm. ** Apply the affinity pDest->affSdst before storing ** results. Used to implement "IN (SELECT ...)". ** @@ -12207,19 +17447,19 @@ struct Select { */ struct SelectDest { u8 eDest; /* How to dispose of the results. On of SRT_* above. */ - char affSdst; /* Affinity used when eDest==SRT_Set */ int iSDParm; /* A parameter used by the eDest disposal method */ int iSdst; /* Base register where results are written */ int nSdst; /* Number of registers allocated */ + char *zAffSdst; /* Affinity used when eDest==SRT_Set */ ExprList *pOrderBy; /* Key columns for SRT_Queue and SRT_DistQueue */ }; /* -** During code generation of statements that do inserts into AUTOINCREMENT +** During code generation of statements that do inserts into AUTOINCREMENT ** tables, the following information is attached to the Table.u.autoInc.p ** pointer of each autoincrement table to record some side information that ** the code generator needs. We have to keep per-table autoincrement -** information in case inserts are down within triggers. Triggers do not +** information in case inserts are done within triggers. Triggers do not ** normally coordinate their activities, but we do need to coordinate the ** loading and saving of autoincrement information. */ @@ -12238,7 +17478,7 @@ struct AutoincInfo { #endif /* -** At least one instance of the following structure is created for each +** At least one instance of the following structure is created for each ** trigger that may be fired while parsing an INSERT, UPDATE or DELETE ** statement. All such objects are stored in the linked list headed at ** Parse.pTriggerPrg and deleted once statement compilation has been @@ -12251,7 +17491,7 @@ struct AutoincInfo { ** values for both pTrigger and orconf. ** ** The TriggerPrg.aColmask[0] variable is set to a mask of old.* columns -** accessed (or set to 0 for triggers fired as a result of INSERT +** accessed (or set to 0 for triggers fired as a result of INSERT ** statements). Similarly, the TriggerPrg.aColmask[1] variable is set to ** a mask of new.* columns used by the program. */ @@ -12292,7 +17532,7 @@ struct TriggerPrg { ** is constant but the second part is reset at the beginning and end of ** each recursion. ** -** The nTableLock and aTableLock variables are only used if the shared-cache +** The nTableLock and aTableLock variables are only used if the shared-cache ** feature is enabled (if sqlite3Tsd()->useSharedData is true). They are ** used to store the set of table-locks required by the statement being ** compiled. Function sqlite3TableLock() is used to add entries to the @@ -12311,22 +17551,53 @@ struct Parse { u8 mayAbort; /* True if statement may throw an ABORT exception */ u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ u8 okConstFactor; /* OK to factor out constants */ - int aTempReg[8]; /* Holding area for temporary registers */ + u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 nColCache; /* Number of entries in aColCache[] */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ int nTab; /* Number of previously allocated VDBE cursors */ int nMem; /* Number of memory cells used so far */ - int nSet; /* Number of sets used so far */ - int nOnce; /* Number of OP_Once instructions so far */ int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ - int iFixedOp; /* Never back out opcodes iFixedOp-1 or earlier */ - int ckBase; /* Base register of data during check constraints */ - int iPartIdxTab; /* Table corresponding to a partial index */ + int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ + int iSelfTab; /* Table associated with an index on expr, or negative + ** of the base register during check-constraint eval */ int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ int iCacheCnt; /* Counter used to generate aColCache[].lru values */ int nLabel; /* Number of labels used */ int *aLabel; /* Space to hold the labels */ + ExprList *pConstExpr;/* Constant expressions */ + Token constraintName;/* Name of the constraint currently being parsed */ + yDbMask writeMask; /* Start a write transaction on these databases */ + yDbMask cookieMask; /* Bitmask of schema verified databases */ + int regRowid; /* Register holding rowid of CREATE TABLE entry */ + int regRoot; /* Register holding root page number for new objects */ + int nMaxArg; /* Max args passed to user function by sub-program */ +#if SELECTTRACE_ENABLED + int nSelect; /* Number of SELECT statements seen */ +#endif +#ifndef SQLITE_OMIT_SHARED_CACHE + int nTableLock; /* Number of locks in aTableLock */ + TableLock *aTableLock; /* Required table locks for shared-cache mode */ +#endif + AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ + Parse *pToplevel; /* Parse structure for main program (or NULL) */ + Table *pTriggerTab; /* Table triggers are being coded for */ + int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ + u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ + u32 oldmask; /* Mask of old.* columns referenced */ + u32 newmask; /* Mask of new.* columns referenced */ + u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ + u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ + u8 disableTriggers; /* True to disable triggers */ + + /************************************************************************** + ** Fields above must be initialized to zero. The fields that follow, + ** down to the beginning of the recursive section, do not need to be + ** initialized as they will be set before being used. The boundary is + ** determined by offsetof(Parse,aColCache). + **************************************************************************/ + struct yColCache { int iTable; /* Table cursor number */ i16 iColumn; /* Table column number */ @@ -12335,66 +17606,34 @@ struct Parse { int iReg; /* Reg with value of this column. 0 means none. */ int lru; /* Least recently used entry has the smallest value */ } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */ - ExprList *pConstExpr;/* Constant expressions */ - Token constraintName;/* Name of the constraint currently being parsed */ - yDbMask writeMask; /* Start a write transaction on these databases */ - yDbMask cookieMask; /* Bitmask of schema verified databases */ - int cookieValue[SQLITE_MAX_ATTACHED+2]; /* Values of cookies to verify */ - int regRowid; /* Register holding rowid of CREATE TABLE entry */ - int regRoot; /* Register holding root page number for new objects */ - int nMaxArg; /* Max args passed to user function by sub-program */ -#if SELECTTRACE_ENABLED - int nSelect; /* Number of SELECT statements seen */ - int nSelectIndent; /* How far to indent SELECTTRACE() output */ -#endif -#ifndef SQLITE_OMIT_SHARED_CACHE - int nTableLock; /* Number of locks in aTableLock */ - TableLock *aTableLock; /* Required table locks for shared-cache mode */ -#endif - AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ - - /* Information used while coding trigger programs. */ - Parse *pToplevel; /* Parse structure for main program (or NULL) */ - Table *pTriggerTab; /* Table triggers are being coded for */ - int addrCrTab; /* Address of OP_CreateTable opcode on CREATE TABLE */ - int addrSkipPK; /* Address of instruction to skip PRIMARY KEY index */ - u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ - u32 oldmask; /* Mask of old.* columns referenced */ - u32 newmask; /* Mask of new.* columns referenced */ - u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ - u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ - u8 disableTriggers; /* True to disable triggers */ + int aTempReg[8]; /* Holding area for temporary registers */ + Token sNameToken; /* Token with unqualified schema object name */ /************************************************************************ ** Above is constant between recursions. Below is reset before and after ** each recursion. The boundary between these two regions is determined - ** using offsetof(Parse,nVar) so the nVar field must be the first field - ** in the recursive region. + ** using offsetof(Parse,sLastToken) so the sLastToken field must be the + ** first field in the recursive region. ************************************************************************/ - int nVar; /* Number of '?' variables seen in the SQL so far */ - int nzVar; /* Number of available slots in azVar[] */ + Token sLastToken; /* The last token parsed */ + ynVar nVar; /* Number of '?' variables seen in the SQL so far */ u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */ - u8 bFreeWith; /* True if pWith should be freed with parser */ u8 explain; /* True if the EXPLAIN flag is found on the query */ #ifndef SQLITE_OMIT_VIRTUALTABLE u8 declareVtab; /* True if inside sqlite3_declare_vtab() */ int nVtabLock; /* Number of virtual tables to lock */ #endif - int nAlias; /* Number of aliased result set columns */ int nHeight; /* Expression tree height of current sub-select */ #ifndef SQLITE_OMIT_EXPLAIN - int iSelectId; /* ID of current select for EXPLAIN output */ - int iNextSelectId; /* Next available select ID for EXPLAIN output */ + int addrExplain; /* Address of current OP_Explain opcode */ #endif - char **azVar; /* Pointers to names of parameters */ + VList *pVList; /* Mapping between variable names and numbers */ Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ Table *pNewTable; /* A table being constructed by CREATE TABLE */ Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ - Token sNameToken; /* Token with unqualified schema object name */ - Token sLastToken; /* The last token parsed */ #ifndef SQLITE_OMIT_VIRTUALTABLE Token sArg; /* Complete text of a module argument */ Table **apVtabLock; /* Pointer to virtual tables needing locking */ @@ -12402,8 +17641,17 @@ struct Parse { Table *pZombieTab; /* List of Table objects to delete after code gen */ TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ With *pWith; /* Current WITH clause, or NULL */ + With *pWithToFree; /* Free this WITH object at the end of the parse */ }; +/* +** Sizes and pointers of various parts of the Parse object. +*/ +#define PARSE_HDR_SZ offsetof(Parse,aColCache) /* Recursive part w/o aColCache*/ +#define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */ +#define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */ +#define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */ + /* ** Return true if currently inside an sqlite3_declare_vtab() call. */ @@ -12424,25 +17672,41 @@ struct AuthContext { /* ** Bitfield flags for P5 value in various opcodes. +** +** Value constraints (enforced via assert()): +** OPFLAG_LENGTHARG == SQLITE_FUNC_LENGTH +** OPFLAG_TYPEOFARG == SQLITE_FUNC_TYPEOF +** OPFLAG_BULKCSR == BTREE_BULKLOAD +** OPFLAG_SEEKEQ == BTREE_SEEK_EQ +** OPFLAG_FORDELETE == BTREE_FORDELETE +** OPFLAG_SAVEPOSITION == BTREE_SAVEPOSITION +** OPFLAG_AUXDELETE == BTREE_AUXDELETE */ -#define OPFLAG_NCHANGE 0x01 /* Set to update db->nChange */ +#define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */ + /* Also used in P2 (not P5) of OP_Delete */ #define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */ -#define OPFLAG_LASTROWID 0x02 /* Set to update db->lastRowid */ +#define OPFLAG_LASTROWID 0x20 /* Set to update db->lastRowid */ #define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ #define OPFLAG_APPEND 0x08 /* This is likely to be an append */ #define OPFLAG_USESEEKRESULT 0x10 /* Try to avoid a seek in BtreeInsert() */ +#define OPFLAG_ISNOOP 0x40 /* OP_Delete does pre-update-hook only */ #define OPFLAG_LENGTHARG 0x40 /* OP_Column only used for length() */ #define OPFLAG_TYPEOFARG 0x80 /* OP_Column only used for typeof() */ #define OPFLAG_BULKCSR 0x01 /* OP_Open** used to open bulk cursor */ -#define OPFLAG_P2ISREG 0x02 /* P2 to OP_Open** is a register number */ +#define OPFLAG_SEEKEQ 0x02 /* OP_Open** cursor uses EQ seek only */ +#define OPFLAG_FORDELETE 0x08 /* OP_Open should use BTREE_FORDELETE */ +#define OPFLAG_P2ISREG 0x10 /* P2 to OP_Open** is a register number */ #define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */ +#define OPFLAG_SAVEPOSITION 0x02 /* OP_Delete/Insert: save cursor pos */ +#define OPFLAG_AUXDELETE 0x04 /* OP_Delete: index in a DELETE op */ +#define OPFLAG_NOCHNG_MAGIC 0x6d /* OP_MakeRecord: serialtype 10 is ok */ /* * Each trigger present in the database schema is stored as an instance of - * struct Trigger. + * struct Trigger. * * Pointers to instances of struct Trigger are stored in two ways. - * 1. In the "trigHash" hash table (part of the sqlite3* that represents the + * 1. In the "trigHash" hash table (part of the sqlite3* that represents the * database). This allows Trigger structures to be retrieved by name. * 2. All triggers associated with a single table form a linked list, using the * pNext member of struct Trigger. A pointer to the first element of the @@ -12468,7 +17732,7 @@ struct Trigger { /* ** A trigger is either a BEFORE or an AFTER trigger. The following constants -** determine which. +** determine which. ** ** If there are multiple triggers, you might of some BEFORE and some AFTER. ** In that cases, the constants below can be ORed together. @@ -12478,51 +17742,53 @@ struct Trigger { /* * An instance of struct TriggerStep is used to store a single SQL statement - * that is a part of a trigger-program. + * that is a part of a trigger-program. * * Instances of struct TriggerStep are stored in a singly linked list (linked - * using the "pNext" member) referenced by the "step_list" member of the + * using the "pNext" member) referenced by the "step_list" member of the * associated struct Trigger instance. The first element of the linked list is * the first step of the trigger-program. - * + * * The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or - * "SELECT" statement. The meanings of the other members is determined by the + * "SELECT" statement. The meanings of the other members is determined by the * value of "op" as follows: * * (op == TK_INSERT) * orconf -> stores the ON CONFLICT algorithm * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then * this stores a pointer to the SELECT statement. Otherwise NULL. - * target -> A token holding the quoted name of the table to insert into. + * zTarget -> Dequoted name of the table to insert into. * pExprList -> If this is an INSERT INTO ... VALUES ... statement, then * this stores values to be inserted. Otherwise NULL. - * pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ... + * pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ... * statement, then this stores the column-names to be * inserted into. * * (op == TK_DELETE) - * target -> A token holding the quoted name of the table to delete from. + * zTarget -> Dequoted name of the table to delete from. * pWhere -> The WHERE clause of the DELETE statement if one is specified. * Otherwise NULL. - * + * * (op == TK_UPDATE) - * target -> A token holding the quoted name of the table to update rows of. + * zTarget -> Dequoted name of the table to update. * pWhere -> The WHERE clause of the UPDATE statement if one is specified. * Otherwise NULL. * pExprList -> A list of the columns to update and the expressions to update * them to. See sqlite3Update() documentation of "pChanges" * argument. - * + * */ struct TriggerStep { u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */ u8 orconf; /* OE_Rollback etc. */ Trigger *pTrig; /* The trigger that this step is a part of */ - Select *pSelect; /* SELECT statment or RHS of INSERT INTO .. SELECT ... */ - Token target; /* Target table for DELETE, UPDATE, INSERT */ + Select *pSelect; /* SELECT statement or RHS of INSERT INTO SELECT ... */ + char *zTarget; /* Target table for DELETE, UPDATE, INSERT */ Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */ - ExprList *pExprList; /* SET clause for UPDATE. */ + ExprList *pExprList; /* SET clause for UPDATE */ IdList *pIdList; /* Column names for INSERT */ + Upsert *pUpsert; /* Upsert clauses on an INSERT */ + char *zSpan; /* Original SQL text of this command */ TriggerStep *pNext; /* Next in the link-list */ TriggerStep *pLast; /* Last element in link-list. Valid for 1st elem only */ }; @@ -12530,7 +17796,7 @@ struct TriggerStep { /* ** The following structure contains information used by the sqliteFix... ** routines as they walk the parse tree to make database references -** explicit. +** explicit. */ typedef struct DbFixer DbFixer; struct DbFixer { @@ -12546,18 +17812,21 @@ struct DbFixer { ** An objected used to accumulate the text of a string where we ** do not necessarily know how big the string will be in the end. */ -struct StrAccum { +struct sqlite3_str { sqlite3 *db; /* Optional database for lookaside. Can be NULL */ - char *zBase; /* A base allocation. Not from malloc. */ char *zText; /* The string collected so far */ - int nChar; /* Length of the string so far */ - int nAlloc; /* Amount of space allocated in zText */ - int mxAlloc; /* Maximum allowed string length */ - u8 useMalloc; /* 0: none, 1: sqlite3DbMalloc, 2: sqlite3_malloc */ - u8 accError; /* STRACCUM_NOMEM or STRACCUM_TOOBIG */ + u32 nAlloc; /* Amount of space allocated in zText */ + u32 mxAlloc; /* Maximum allowed allocation. 0 for no malloc usage */ + u32 nChar; /* Length of the string so far */ + u8 accError; /* SQLITE_NOMEM or SQLITE_TOOBIG */ + u8 printfFlags; /* SQLITE_PRINTF flags below */ }; -#define STRACCUM_NOMEM 1 -#define STRACCUM_TOOBIG 2 +#define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */ +#define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */ +#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */ + +#define isMalloced(X) (((X)->printfFlags & SQLITE_PRINTF_MALLOCED)!=0) + /* ** A pointer to this structure is used to communicate information @@ -12581,10 +17850,12 @@ struct Sqlite3Config { int bFullMutex; /* True to enable full mutexing */ int bOpenUri; /* True to interpret filenames as URIs */ int bUseCis; /* Use covering indices for full-scans */ + int bSmallMalloc; /* Avoid large memory allocations if true */ int mxStrlen; /* Maximum string length */ int neverCorrupt; /* Database is always well-formed */ int szLookaside; /* Default lookaside buffer size */ int nLookaside; /* Default lookaside buffer count */ + int nStmtSpill; /* Stmt-journal spill-to-disk threshold */ sqlite3_mem_methods m; /* Low-level memory allocation interface */ sqlite3_mutex_methods mutex; /* Low-level mutex interface */ sqlite3_pcache_methods2 pcache2; /* Low-level page-cache interface */ @@ -12593,9 +17864,6 @@ struct Sqlite3Config { int mnReq, mxReq; /* Min and max heap requests sizes */ sqlite3_int64 szMmap; /* mmap() space per open file */ sqlite3_int64 mxMmap; /* Maximum value for szMmap */ - void *pScratch; /* Scratch memory */ - int szScratch; /* Size of each scratch buffer */ - int nScratch; /* Number of scratch buffers */ void *pPage; /* Page cache memory */ int szPage; /* Size of each page in pPage[] */ int nPage; /* Number of pages in pPage[] */ @@ -12624,10 +17892,12 @@ struct Sqlite3Config { void (*xVdbeBranch)(void*,int iSrcLine,u8 eThis,u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ + int iOnceResetThreshold; /* When to reset OP_Once counters */ + u32 szSorterRef; /* Min size in bytes to use sorter-refs */ }; /* @@ -12652,18 +17922,24 @@ struct Sqlite3Config { ** Context pointer passed down through the tree-walk. */ struct Walker { + Parse *pParse; /* Parser context. */ int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */ int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ - Parse *pParse; /* Parser context. */ int walkerDepth; /* Number of subqueries */ u8 eCode; /* A small processing code */ union { /* Extra data for callback */ - NameContext *pNC; /* Naming context */ - int n; /* A counter */ - int iCur; /* A cursor number */ - SrcList *pSrcList; /* FROM clause */ - struct SrcCount *pSrcCount; /* Counting column references */ + NameContext *pNC; /* Naming context */ + int n; /* A counter */ + int iCur; /* A cursor number */ + SrcList *pSrcList; /* FROM clause */ + struct SrcCount *pSrcCount; /* Counting column references */ + struct CCurHint *pCCurHint; /* Used by codeCursorHint() */ + int *aiCol; /* array of column indexes */ + struct IdxCover *pIdxCover; /* Check for index coverage */ + struct IdxExprTrans *pIdxTrans; /* Convert idxed expr to column */ + ExprList *pGroupBy; /* GROUP BY clause */ + Select *pSelect; /* HAVING to WHERE clause ctx */ } u; }; @@ -12673,6 +17949,12 @@ SQLITE_PRIVATE int sqlite3WalkExprList(Walker*, ExprList*); SQLITE_PRIVATE int sqlite3WalkSelect(Walker*, Select*); SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker*, Select*); SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker*, Select*); +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker*, Expr*); +SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker*, Select*); +SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker*, Select*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker*, Select*); +#endif /* ** Return code from the parse-tree walking primitives and their @@ -12693,7 +17975,7 @@ struct With { char *zName; /* Name of this CTE */ ExprList *pCols; /* List of explicit column names, or NULL */ Select *pSelect; /* The definition of this CTE */ - const char *zErr; /* Error message for circular references */ + const char *zCteErr; /* Error message for circular references */ } a[1]; }; @@ -12725,13 +18007,33 @@ struct TreeView { ** using sqlite3_log(). The routines also provide a convenient place ** to set a debugger breakpoint. */ +SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType); SQLITE_PRIVATE int sqlite3CorruptError(int); SQLITE_PRIVATE int sqlite3MisuseError(int); SQLITE_PRIVATE int sqlite3CantopenError(int); #define SQLITE_CORRUPT_BKPT sqlite3CorruptError(__LINE__) #define SQLITE_MISUSE_BKPT sqlite3MisuseError(__LINE__) #define SQLITE_CANTOPEN_BKPT sqlite3CantopenError(__LINE__) +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NomemError(int); +SQLITE_PRIVATE int sqlite3IoerrnomemError(int); +SQLITE_PRIVATE int sqlite3CorruptPgnoError(int,Pgno); +# define SQLITE_NOMEM_BKPT sqlite3NomemError(__LINE__) +# define SQLITE_IOERR_NOMEM_BKPT sqlite3IoerrnomemError(__LINE__) +# define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptPgnoError(__LINE__,(P)) +#else +# define SQLITE_NOMEM_BKPT SQLITE_NOMEM +# define SQLITE_IOERR_NOMEM_BKPT SQLITE_IOERR_NOMEM +# define SQLITE_CORRUPT_PGNO(P) sqlite3CorruptError(__LINE__) +#endif +/* +** FTS3 and FTS4 both require virtual table support +*/ +#if defined(SQLITE_OMIT_VIRTUALTABLE) +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif /* ** FTS4 is really an extension for FTS3. It is enabled using the @@ -12764,6 +18066,7 @@ SQLITE_PRIVATE int sqlite3CantopenError(int); # define sqlite3Isdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x04) # define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08) # define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)]) +# define sqlite3Isquote(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x80) #else # define sqlite3Toupper(x) toupper((unsigned char)(x)) # define sqlite3Isspace(x) isspace((unsigned char)(x)) @@ -12772,14 +18075,18 @@ SQLITE_PRIVATE int sqlite3CantopenError(int); # define sqlite3Isdigit(x) isdigit((unsigned char)(x)) # define sqlite3Isxdigit(x) isxdigit((unsigned char)(x)) # define sqlite3Tolower(x) tolower((unsigned char)(x)) +# define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`') #endif +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS SQLITE_PRIVATE int sqlite3IsIdChar(u8); +#endif /* ** Internal function prototypes */ -#define sqlite3StrICmp sqlite3_stricmp +SQLITE_PRIVATE int sqlite3StrICmp(const char*,const char*); SQLITE_PRIVATE int sqlite3Strlen30(const char*); +SQLITE_PRIVATE char *sqlite3ColumnType(Column*,char*); #define sqlite3StrNICmp sqlite3_strnicmp SQLITE_PRIVATE int sqlite3MallocInit(void); @@ -12788,20 +18095,23 @@ SQLITE_PRIVATE void *sqlite3Malloc(u64); SQLITE_PRIVATE void *sqlite3MallocZero(u64); SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3*, u64); SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3*, u64); +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3*, u64); SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3*,const char*); SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3*,const char*, u64); +SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3*,const char*,const char*); SQLITE_PRIVATE void *sqlite3Realloc(void*, u64); SQLITE_PRIVATE void *sqlite3DbReallocOrFree(sqlite3 *, void *, u64); SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *, void *, u64); SQLITE_PRIVATE void sqlite3DbFree(sqlite3*, void*); +SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3*, void*); SQLITE_PRIVATE int sqlite3MallocSize(void*); SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3*, void*); -SQLITE_PRIVATE void *sqlite3ScratchMalloc(int); -SQLITE_PRIVATE void sqlite3ScratchFree(void*); SQLITE_PRIVATE void *sqlite3PageMalloc(int); SQLITE_PRIVATE void sqlite3PageFree(void*); SQLITE_PRIVATE void sqlite3MemSetDefault(void); +#ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE void sqlite3BenignMallocHooks(void (*)(void), void (*)(void)); +#endif SQLITE_PRIVATE int sqlite3HeapNearlyFull(void); /* @@ -12815,18 +18125,22 @@ SQLITE_PRIVATE int sqlite3HeapNearlyFull(void); #ifdef SQLITE_USE_ALLOCA # define sqlite3StackAllocRaw(D,N) alloca(N) # define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N) -# define sqlite3StackFree(D,P) +# define sqlite3StackFree(D,P) #else # define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N) # define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N) # define sqlite3StackFree(D,P) sqlite3DbFree(D,P) #endif -#ifdef SQLITE_ENABLE_MEMSYS3 -SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); -#endif +/* Do not allow both MEMSYS5 and MEMSYS3 to be defined together. If they +** are, disable MEMSYS3 +*/ #ifdef SQLITE_ENABLE_MEMSYS5 SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void); +#undef SQLITE_ENABLE_MEMSYS3 +#endif +#ifdef SQLITE_ENABLE_MEMSYS3 +SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); #endif @@ -12837,10 +18151,27 @@ SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int); SQLITE_PRIVATE int sqlite3MutexInit(void); SQLITE_PRIVATE int sqlite3MutexEnd(void); #endif +#if !defined(SQLITE_MUTEX_OMIT) && !defined(SQLITE_MUTEX_NOOP) +SQLITE_PRIVATE void sqlite3MemoryBarrier(void); +#else +# define sqlite3MemoryBarrier() +#endif -SQLITE_PRIVATE int sqlite3StatusValue(int); -SQLITE_PRIVATE void sqlite3StatusAdd(int, int); -SQLITE_PRIVATE void sqlite3StatusSet(int, int); +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int); +SQLITE_PRIVATE void sqlite3StatusUp(int, int); +SQLITE_PRIVATE void sqlite3StatusDown(int, int); +SQLITE_PRIVATE void sqlite3StatusHighwater(int, int); +SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3*,int*); + +/* Access to mutexes used by sqlite3_status() */ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void); +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void); + +#if defined(SQLITE_ENABLE_MULTITHREADED_CHECKS) && !defined(SQLITE_MUTEX_OMIT) +SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex*); +#else +# define sqlite3MutexWarnOnContention(x) +#endif #ifndef SQLITE_OMIT_FLOATING_POINT SQLITE_PRIVATE int sqlite3IsNaN(double); @@ -12858,14 +18189,9 @@ struct PrintfArguments { sqlite3_value **apArg; /* The argument values */ }; -#define SQLITE_PRINTF_INTERNAL 0x01 -#define SQLITE_PRINTF_SQLFUNC 0x02 -SQLITE_PRIVATE void sqlite3VXPrintf(StrAccum*, u32, const char*, va_list); -SQLITE_PRIVATE void sqlite3XPrintf(StrAccum*, u32, const char*, ...); SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3*,const char*, ...); SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3*,const char*, va_list); -SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3*,char*,const char*,...); -#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) SQLITE_PRIVATE void sqlite3DebugPrintf(const char*, ...); #endif #if defined(SQLITE_TEST) @@ -12873,19 +18199,18 @@ SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); #endif #if defined(SQLITE_DEBUG) -SQLITE_PRIVATE TreeView *sqlite3TreeViewPush(TreeView*,u8); -SQLITE_PRIVATE void sqlite3TreeViewPop(TreeView*); -SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView*, const char*, ...); -SQLITE_PRIVATE void sqlite3TreeViewItem(TreeView*, const char*, u8); SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); +SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); +SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); #endif -SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*, ...); +SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); -SQLITE_PRIVATE int sqlite3Dequote(char*); +SQLITE_PRIVATE void sqlite3Dequote(char*); +SQLITE_PRIVATE void sqlite3TokenInit(Token*,char*); SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char*, int); SQLITE_PRIVATE int sqlite3RunParser(Parse*, const char*, char **); SQLITE_PRIVATE void sqlite3FinishCoding(Parse*); @@ -12894,45 +18219,60 @@ SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse*,int,int); +#endif SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); -SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); +SQLITE_PRIVATE Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*); +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse*, Expr*, Select*); SQLITE_PRIVATE Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*); -SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*); +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3*, Expr*); SQLITE_PRIVATE ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList*,int); SQLITE_PRIVATE void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); -SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*); +SQLITE_PRIVATE void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3*, ExprList*); +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList*); SQLITE_PRIVATE int sqlite3Init(sqlite3*, char**); SQLITE_PRIVATE int sqlite3InitCallback(void*, int, char**, char**); SQLITE_PRIVATE void sqlite3Pragma(Parse*,Token*,Token*,Token*,int); +#ifndef SQLITE_OMIT_VIRTUALTABLE +SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName); +#endif SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3*); SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3*,int); SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3*); -SQLITE_PRIVATE void sqlite3BeginParse(Parse*,int); SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3*); +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3*,Table*); +SQLITE_PRIVATE int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*); SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse*,Select*); SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *, int); SQLITE_PRIVATE Index *sqlite3PrimaryKeyIndex(Table*); SQLITE_PRIVATE i16 sqlite3ColumnOfIndex(Index*, i16); SQLITE_PRIVATE void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); -SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*); +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table*, Column*); +#else +# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ +#endif +SQLITE_PRIVATE void sqlite3AddColumn(Parse*,Token*,Token*); SQLITE_PRIVATE void sqlite3AddNotNull(Parse*, int); SQLITE_PRIVATE void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); SQLITE_PRIVATE void sqlite3AddCheckConstraint(Parse*, Expr*); -SQLITE_PRIVATE void sqlite3AddColumnType(Parse*,Token*); -SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,ExprSpan*); +SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); SQLITE_PRIVATE void sqlite3AddCollateType(Parse*, Token*); SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3*,const char*); -SQLITE_PRIVATE int sqlite3CodeOnce(Parse *); -#ifdef SQLITE_OMIT_BUILTIN_TEST +#ifdef SQLITE_UNTESTABLE # define sqlite3FaultSim(X) SQLITE_OK #else SQLITE_PRIVATE int sqlite3FaultSim(int); @@ -12940,11 +18280,14 @@ SQLITE_PRIVATE int sqlite3FaultSim(int); SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32); SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32); +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec*, u32); SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec*, u32); SQLITE_PRIVATE void sqlite3BitvecClear(Bitvec*, u32, void*); SQLITE_PRIVATE void sqlite3BitvecDestroy(Bitvec*); SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec*); +#ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int,int*); +#endif SQLITE_PRIVATE RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int); SQLITE_PRIVATE void sqlite3RowSetClear(RowSet*); @@ -12952,7 +18295,7 @@ SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet*, i64); SQLITE_PRIVATE int sqlite3RowSetTest(RowSet*, int iBatch, i64); SQLITE_PRIVATE int sqlite3RowSetNext(RowSet*, i64*); -SQLITE_PRIVATE void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int); +SQLITE_PRIVATE void sqlite3CreateView(Parse*,Token*,Token*,Token*,ExprList*,Select*,int,int); #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse*,Table*); @@ -12973,7 +18316,7 @@ SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse); # define sqlite3AutoincrementBegin(X) # define sqlite3AutoincrementEnd(X) #endif -SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int); +SQLITE_PRIVATE void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); SQLITE_PRIVATE void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); SQLITE_PRIVATE IdList *sqlite3IdListAppend(sqlite3*, IdList*, Token*); SQLITE_PRIVATE int sqlite3IdListIndex(IdList*,const char*); @@ -12982,37 +18325,45 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*) SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, Expr*, IdList*); SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*); SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, struct SrcList_item *); SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*); SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*); SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*); SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*); SQLITE_PRIVATE Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**); -SQLITE_PRIVATE Index *sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, - Expr*, int, int); +SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, + Expr*, int, int, u8); SQLITE_PRIVATE void sqlite3DropIndex(Parse*, SrcList*, int); SQLITE_PRIVATE int sqlite3Select(Parse*, Select*, SelectDest*); SQLITE_PRIVATE Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, - Expr*,ExprList*,u16,Expr*,Expr*); + Expr*,ExprList*,u32,Expr*); SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3*, Select*); SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse*, SrcList*); SQLITE_PRIVATE int sqlite3IsReadOnly(Parse*, Table*, int); SQLITE_PRIVATE void sqlite3OpenTable(Parse*, int iCur, int iDb, Table*, int); #if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) -SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,Expr*,char*); +SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse*,SrcList*,Expr*,ExprList*,Expr*,char*); #endif -SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*); -SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int); +SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*, ExprList*, Expr*); +SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*,Expr*,int,ExprList*,Expr*, + Upsert*); SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int); SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*); -SQLITE_PRIVATE u64 sqlite3WhereOutputRowCount(WhereInfo*); +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*); SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*); SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo*); +SQLITE_PRIVATE int sqlite3WhereOrderedInnerLoop(WhereInfo*); SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo*); SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo*); SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo*); SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo*, int*); +#define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */ +#define ONEPASS_SINGLE 1 /* ONEPASS valid for a single row update */ +#define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */ +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int); SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnToReg(Parse*, Table*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int); SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse*, int, int, int); @@ -13022,59 +18373,81 @@ SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse*, int, int); SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse*); SQLITE_PRIVATE void sqlite3ExprCacheAffinityChange(Parse*, int, int); SQLITE_PRIVATE void sqlite3ExprCode(Parse*, Expr*, int); +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, Expr*, int); SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse*, Expr*, int); -SQLITE_PRIVATE void sqlite3ExprCodeAtInit(Parse*, Expr*, int, u8); +SQLITE_PRIVATE int sqlite3ExprCodeAtInit(Parse*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse*, Expr*, int*); SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse*, Expr*, int); SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse*, Expr*, int); -SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, u8); +SQLITE_PRIVATE int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); #define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ #define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ +#define SQLITE_ECEL_REF 0x04 /* Use ExprList.u.x.iOrderByCol */ +#define SQLITE_ECEL_OMITREF 0x08 /* Omit if ExprList.u.x.iOrderByCol */ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse*, Expr*, int, int); SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse*, Expr*, int, int); +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3*,const char*, const char*); -SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,int isView,const char*, const char*); -SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,int isView,struct SrcList_item *); +#define LOCATE_VIEW 0x01 +#define LOCATE_NOERR 0x02 +SQLITE_PRIVATE Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); +SQLITE_PRIVATE Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_item *); SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3*,const char*, const char*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); -SQLITE_PRIVATE void sqlite3Vacuum(Parse*); -SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*); +SQLITE_PRIVATE void sqlite3Vacuum(Parse*,Token*); +SQLITE_PRIVATE int sqlite3RunVacuum(char**, sqlite3*, int); SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3*, Token*); -SQLITE_PRIVATE int sqlite3ExprCompare(Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr*, Expr*, int); SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList*, ExprList*, int); -SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int); +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr*,int); SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); SQLITE_PRIVATE void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr*, SrcList*); SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse*); +#ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE void sqlite3PrngSaveState(void); SQLITE_PRIVATE void sqlite3PrngRestoreState(void); +#endif SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3*,int); SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse*, int); SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb); SQLITE_PRIVATE void sqlite3BeginTransaction(Parse*, int); -SQLITE_PRIVATE void sqlite3CommitTransaction(Parse*); -SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse*); +SQLITE_PRIVATE void sqlite3EndTransaction(Parse*,int); SQLITE_PRIVATE void sqlite3Savepoint(Parse*, int, Token*); SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *); SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3*); +SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr*); +SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstant(Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr*); SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr*, u8); +SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse*, Expr*, ExprList*); SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr*,int); +#ifdef SQLITE_ENABLE_CURSOR_HINTS +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr*); +#endif SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr*, int*); SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr*); SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); SQLITE_PRIVATE int sqlite3IsRowid(const char*); -SQLITE_PRIVATE void sqlite3GenerateRowDelete(Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8); -SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*); +SQLITE_PRIVATE void sqlite3GenerateRowDelete( + Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); +SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); SQLITE_PRIVATE int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse*,int); SQLITE_PRIVATE void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, - u8,u8,int,int*); + u8,u8,int,int*,int*,Upsert*); +#ifdef SQLITE_ENABLE_NULL_TRIM +SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe*,Table*); +#else +# define sqlite3SetMakeRecordP5(A,B) +#endif SQLITE_PRIVATE void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int); -SQLITE_PRIVATE int sqlite3OpenTableAndIndices(Parse*, Table*, int, int, u8*, int*, int*); +SQLITE_PRIVATE int sqlite3OpenTableAndIndices(Parse*, Table*, int, u8, int, u8*, int*, int*); SQLITE_PRIVATE void sqlite3BeginWriteOperation(Parse*, int, int); SQLITE_PRIVATE void sqlite3MultiWrite(Parse*); SQLITE_PRIVATE void sqlite3MayAbort(Parse*); @@ -13091,17 +18464,17 @@ SQLITE_PRIVATE void sqlite3SelectSetName(Select*,const char*); #else # define sqlite3SelectSetName(A,B) #endif -SQLITE_PRIVATE void sqlite3FuncDefInsert(FuncDefHash*, FuncDef*); -SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,int,u8,u8); -SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3*); +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs(FuncDef*,int); +SQLITE_PRIVATE FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void); SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void); -SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void); +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); SQLITE_PRIVATE int sqlite3SafetyCheckOk(sqlite3*); SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3*); SQLITE_PRIVATE void sqlite3ChangeCookie(Parse*, int); #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) -SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, int); +SQLITE_PRIVATE void sqlite3MaterializeView(Parse*, Table*, Expr*, ExprList*,Expr*,int); #endif #ifndef SQLITE_OMIT_TRIGGER @@ -13117,15 +18490,20 @@ SQLITE_PRIVATE void sqlite3CodeRowTrigger(Parse*, Trigger *, int, ExprList*, i SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect(Parse *, Trigger *, Table *, int, int, int); void sqliteViewTriggers(Parse*, Table*, Expr*, int, ExprList*); SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3*, TriggerStep*); -SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3*,Select*, + const char*,const char*); SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep(sqlite3*,Token*, IdList*, - Select*,u8); -SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8); -SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*); + Select*,u8,Upsert*, + const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep(sqlite3*,Token*,ExprList*, Expr*, u8, + const char*,const char*); +SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep(sqlite3*,Token*, Expr*, + const char*,const char*); SQLITE_PRIVATE void sqlite3DeleteTrigger(sqlite3*, Trigger*); SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*); SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int); # define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p)) +# define sqlite3IsToplevel(p) ((p)->pToplevel==0) #else # define sqlite3TriggersExist(B,C,D,E,F) 0 # define sqlite3DeleteTrigger(A,B) @@ -13135,6 +18513,7 @@ SQLITE_PRIVATE u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Tab # define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F) # define sqlite3TriggerList(X, Y) 0 # define sqlite3ParseToplevel(p) p +# define sqlite3IsToplevel(p) 1 # define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0 #endif @@ -13164,7 +18543,9 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep(DbFixer*, TriggerStep*); SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8); SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); SQLITE_PRIVATE int sqlite3Atoi(const char*); +#ifndef SQLITE_OMIT_UTF16 SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar); +#endif SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**); SQLITE_PRIVATE LogEst sqlite3LogEst(u64); @@ -13172,7 +18553,14 @@ SQLITE_PRIVATE LogEst sqlite3LogEstAdd(LogEst,LogEst); #ifndef SQLITE_OMIT_VIRTUALTABLE SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double); #endif +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst); +#endif +SQLITE_PRIVATE VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int); +SQLITE_PRIVATE const char *sqlite3VListNumToName(VList*,int); +SQLITE_PRIVATE int sqlite3VListNameToNum(VList*,const char*,int); /* ** Routines to read and write variable-length integers. These used to @@ -13198,29 +18586,37 @@ SQLITE_PRIVATE int sqlite3VarintLen(u64 v); #define putVarint sqlite3PutVarint -SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *, Index *); +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3*, Index*); SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe*, Table*, int); SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2); SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity); +SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table*,int); SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr); SQLITE_PRIVATE int sqlite3Atoi64(const char*, i64*, int, u8); SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char*, i64*); SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...); SQLITE_PRIVATE void sqlite3Error(sqlite3*,int); +SQLITE_PRIVATE void sqlite3SystemError(sqlite3*,int); SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3*, const char *z, int n); SQLITE_PRIVATE u8 sqlite3HexToInt(int h); SQLITE_PRIVATE int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); -#if defined(SQLITE_TEST) +#if defined(SQLITE_NEED_ERR_NAME) SQLITE_PRIVATE const char *sqlite3ErrName(int); #endif +#ifdef SQLITE_ENABLE_DESERIALIZE +SQLITE_PRIVATE int sqlite3MemdbInit(void); +#endif + SQLITE_PRIVATE const char *sqlite3ErrStr(int); SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse); SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq(sqlite3*,u8 enc, const char*,int); SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char*zName); SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr); -SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*); +SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, Expr *pExpr); +SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse*,Expr*,Expr*); +SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr*); SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *, CollSeq *); @@ -13239,25 +18635,31 @@ SQLITE_PRIVATE u8 sqlite3GetBoolean(const char *z,u8); SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value*, u8); SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value*, u8); -SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, +SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, void(*)(void*)); SQLITE_PRIVATE void sqlite3ValueSetNull(sqlite3_value*); SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*); SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *); +#ifndef SQLITE_OMIT_UTF16 SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8); +#endif SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **); SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8); #ifndef SQLITE_AMALGAMATION SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[]; +SQLITE_PRIVATE const char sqlite3StrBINARY[]; SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[]; SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[]; SQLITE_PRIVATE const Token sqlite3IntTokens[]; SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config; -SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions; +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; #ifndef SQLITE_OMIT_WSD SQLITE_PRIVATE int sqlite3PendingByte; #endif #endif +#ifdef VDBE_PROFILE +SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt; +#endif SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, int, int); SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*); SQLITE_PRIVATE void sqlite3AlterFunctions(void); @@ -13265,10 +18667,12 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *, int *); SQLITE_PRIVATE void sqlite3NestedParse(Parse*, const char*, ...); SQLITE_PRIVATE void sqlite3ExpirePreparedStatements(sqlite3*); -SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *, Expr *, int, int); +SQLITE_PRIVATE int sqlite3CodeSubselect(Parse*, Expr *, int, int); SQLITE_PRIVATE void sqlite3SelectPrep(Parse*, Select*, NameContext*); +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); SQLITE_PRIVATE int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); SQLITE_PRIVATE int sqlite3ResolveExprNames(NameContext*, Expr*); +SQLITE_PRIVATE int sqlite3ResolveExprListNames(NameContext*, ExprList*); SQLITE_PRIVATE void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); SQLITE_PRIVATE void sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); @@ -13276,9 +18680,9 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *, Table *, int, int); SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *, Token *); SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *, SrcList *); SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq(Parse*, u8, CollSeq *, const char*); -SQLITE_PRIVATE char sqlite3AffinityType(const char*, u8*); +SQLITE_PRIVATE char sqlite3AffinityType(const char*, Column*); SQLITE_PRIVATE void sqlite3Analyze(Parse*, Token*, Token*); -SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*); +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler*, sqlite3_file*); SQLITE_PRIVATE int sqlite3FindDb(sqlite3*, Token*); SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *, const char *); SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3*,int iDB); @@ -13286,7 +18690,6 @@ SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3*,Index*); SQLITE_PRIVATE void sqlite3DefaultRowEst(Index*); SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3*, int); SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*); -SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse*, int, int); SQLITE_PRIVATE void sqlite3SchemaClear(void *); SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *, Btree *); SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *); @@ -13297,40 +18700,49 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); #ifdef SQLITE_DEBUG SQLITE_PRIVATE int sqlite3KeyInfoIsWriteable(KeyInfo*); #endif -SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, +SQLITE_PRIVATE int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*), FuncDestructor *pDestructor ); +SQLITE_PRIVATE void sqlite3NoopDestructor(void*); +SQLITE_PRIVATE void sqlite3OomFault(sqlite3*); +SQLITE_PRIVATE void sqlite3OomClear(sqlite3*); SQLITE_PRIVATE int sqlite3ApiExit(sqlite3 *db, int); SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *); -SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, char*, int, int); -SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int); -SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum*,const char*); -SQLITE_PRIVATE void sqlite3AppendChar(StrAccum*,int,char); +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int); SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); -SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*); SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int); SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); SQLITE_PRIVATE void sqlite3BackupRestart(sqlite3_backup *); SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *); +#ifndef SQLITE_OMIT_SUBQUERY +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse*, Expr*); +#else +# define sqlite3ExprCheckIN(x,y) SQLITE_OK +#endif + #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void); -SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue(Parse*,Index*,UnpackedRecord**,Expr*,u8,int,int*); +SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( + Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); SQLITE_PRIVATE int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord*); SQLITE_PRIVATE int sqlite3Stat4Column(sqlite3*, const void*, int, int, sqlite3_value**); +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3*, Index*, int); #endif /* ** The interface to the LEMON-generated parser */ -SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64)); -SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*)); -SQLITE_PRIVATE void sqlite3Parser(void*, int, Token, Parse*); +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE void *sqlite3ParserAlloc(void*(*)(u64), Parse*); +SQLITE_PRIVATE void sqlite3ParserFree(void*, void(*)(void*)); +#endif +SQLITE_PRIVATE void sqlite3Parser(void*, int, Token); #ifdef YYTRACKMAXSTACKDEPTH SQLITE_PRIVATE int sqlite3ParserStackPeak(void*); #endif @@ -13358,7 +18770,7 @@ SQLITE_PRIVATE int sqlite3Utf8To8(unsigned char*); # define sqlite3VtabRollback(X) # define sqlite3VtabCommit(X) # define sqlite3VtabInSync(db) 0 -# define sqlite3VtabLock(X) +# define sqlite3VtabLock(X) # define sqlite3VtabUnlock(X) # define sqlite3VtabUnlockList(X) # define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK @@ -13375,8 +18787,17 @@ SQLITE_PRIVATE void sqlite3VtabUnlockList(sqlite3*); SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *, int, int); SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); SQLITE_PRIVATE VTable *sqlite3GetVTable(sqlite3*, Table*); +SQLITE_PRIVATE Module *sqlite3VtabCreateModule( + sqlite3*, + const char*, + const sqlite3_module*, + void*, + void(*)(void*) + ); # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) #endif +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse*,Module*); +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3*,Module*); SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse*,Table*); SQLITE_PRIVATE void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int); SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse*, Token*); @@ -13387,7 +18808,6 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*); SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *); SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); -SQLITE_PRIVATE void sqlite3InvalidFunction(sqlite3_context*,int,sqlite3_value**); SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); @@ -13409,12 +18829,24 @@ SQLITE_PRIVATE void sqlite3WithPush(Parse*, With*, u8); #define sqlite3WithPush(x,y,z) #define sqlite3WithDelete(x,y) #endif +#ifndef SQLITE_OMIT_UPSERT +SQLITE_PRIVATE Upsert *sqlite3UpsertNew(sqlite3*,ExprList*,Expr*,ExprList*,Expr*); +SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3*,Upsert*); +SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3*,Upsert*); +SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget(Parse*,SrcList*,Upsert*); +SQLITE_PRIVATE void sqlite3UpsertDoUpdate(Parse*,Upsert*,Table*,Index*,int); +#else +#define sqlite3UpsertNew(v,w,x,y,z) ((Upsert*)0) +#define sqlite3UpsertDelete(x,y) +#define sqlite3UpsertDup(x,y) ((Upsert*)0) +#endif + /* Declarations for functions in fkey.c. All of these are replaced by ** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign ** key functionality is available. If OMIT_TRIGGER is defined but ** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In -** this case foreign keys are parsed, but no other functionality is +** this case foreign keys are parsed, but no other functionality is ** provided (enforcement of FK constraints requires the triggers sub-system). */ #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) @@ -13430,6 +18862,7 @@ SQLITE_PRIVATE FKey *sqlite3FkReferences(Table *); #define sqlite3FkDropTable(a,b,c) #define sqlite3FkOldmask(a,b) 0 #define sqlite3FkRequired(a,b,c,d) 0 + #define sqlite3FkReferences(a) 0 #endif #ifndef SQLITE_OMIT_FOREIGN_KEY SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *, Table*); @@ -13448,10 +18881,10 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex(Parse*,Table*,FKey*,Index**,int**); /* ** The interface to the code in fault.c used for identifying "benign" -** malloc failures. This is only present if SQLITE_OMIT_BUILTIN_TEST +** malloc failures. This is only present if SQLITE_UNTESTABLE ** is not defined. */ -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE void sqlite3BeginBenignMalloc(void); SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); #else @@ -13473,28 +18906,23 @@ SQLITE_PRIVATE void sqlite3EndBenignMalloc(void); #define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ #define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ #define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ -SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*); +SQLITE_PRIVATE int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*); -#ifdef SQLITE_ENABLE_ATOMIC_WRITE -SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); -SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); +SQLITE_PRIVATE int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *); +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *); -SQLITE_PRIVATE int sqlite3JournalExists(sqlite3_file *p); -#else - #define sqlite3JournalSize(pVfs) ((pVfs)->szOsFile) - #define sqlite3JournalExists(p) 1 #endif +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p); SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *); -SQLITE_PRIVATE int sqlite3MemJournalSize(void); -SQLITE_PRIVATE int sqlite3IsMemJournal(sqlite3_file *); +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p); #if SQLITE_MAX_EXPR_DEPTH>0 -SQLITE_PRIVATE void sqlite3ExprSetHeight(Parse *pParse, Expr *p); SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *); SQLITE_PRIVATE int sqlite3ExprCheckHeight(Parse*, int); #else - #define sqlite3ExprSetHeight(x,y) #define sqlite3SelectExprHeight(x) 0 #define sqlite3ExprCheckHeight(x,y) #endif @@ -13515,16 +18943,19 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db); #ifdef SQLITE_DEBUG SQLITE_PRIVATE void sqlite3ParserTrace(FILE*, char *); #endif +#if defined(YYCOVERAGE) +SQLITE_PRIVATE int sqlite3ParserCoverage(FILE*); +#endif /* ** If the SQLITE_ENABLE IOTRACE exists then the global variable ** sqlite3IoTrace is a pointer to a printf-like routine used to -** print I/O tracing messages. +** print I/O tracing messages. */ #ifdef SQLITE_ENABLE_IOTRACE # define IOTRACE(A) if( sqlite3IoTrace ){ sqlite3IoTrace A; } SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe*); -void (*sqlite3IoTrace)(const char*,...); +SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...); #else # define IOTRACE(A) # define sqlite3VdbeIOTraceSql(X) @@ -13553,7 +18984,7 @@ void (*sqlite3IoTrace)(const char*,...); ** that allocations that might have been satisfied by lookaside are not ** passed back to non-lookaside free() routines. Asserts such as the ** example above are placed on the non-lookaside free() routines to verify -** this constraint. +** this constraint. ** ** All of this is no-op for a production build. It only comes into ** play when the SQLITE_MEMDEBUG compile-time option is used. @@ -13569,8 +19000,7 @@ SQLITE_PRIVATE int sqlite3MemdebugNoType(void*,u8); #endif #define MEMTYPE_HEAP 0x01 /* General heap allocations */ #define MEMTYPE_LOOKASIDE 0x02 /* Heap that might have been lookaside */ -#define MEMTYPE_SCRATCH 0x04 /* Scratch allocations */ -#define MEMTYPE_PCACHE 0x08 /* Page cache allocations */ +#define MEMTYPE_PCACHE 0x04 /* Page cache allocations */ /* ** Threading interface @@ -13580,7 +19010,24 @@ SQLITE_PRIVATE int sqlite3ThreadCreate(SQLiteThread**,void*(*)(void*),void*); SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread*, void**); #endif -#endif /* _SQLITEINT_H_ */ +#if defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST) +SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3*); +#endif +#if defined(SQLITE_ENABLE_DBSTAT_VTAB) || defined(SQLITE_TEST) +SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3*); +#endif + +SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr); +SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr); +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr*, int); +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField(Parse*,Expr*,int); +SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse*, Expr*); + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +SQLITE_PRIVATE const char **sqlite3CompileOptions(int *pnOpt); +#endif + +#endif /* SQLITEINT_H */ /************** End of sqliteInt.h *******************************************/ /************** Begin file global.c ******************************************/ @@ -13598,6 +19045,7 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread*, void**); ** ** This file contains definitions of global variables and constants. */ +/* #include "sqliteInt.h" */ /* An array to map all upper-case characters into their corresponding ** lower-case character. @@ -13631,16 +19079,16 @@ SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, /* 3x */ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, /* 4x */ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, /* 5x */ - 96, 97, 66, 67, 68, 69, 70, 71, 72, 73,106,107,108,109,110,111, /* 6x */ - 112, 81, 82, 83, 84, 85, 86, 87, 88, 89,122,123,124,125,126,127, /* 7x */ + 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111, /* 6x */ + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127, /* 7x */ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, /* 8x */ - 144,145,146,147,148,149,150,151,152,153,154,155,156,157,156,159, /* 9x */ + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, /* 9x */ 160,161,162,163,164,165,166,167,168,169,170,171,140,141,142,175, /* Ax */ 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, /* Bx */ 192,129,130,131,132,133,134,135,136,137,202,203,204,205,206,207, /* Cx */ 208,145,146,147,148,149,150,151,152,153,218,219,220,221,222,223, /* Dx */ - 224,225,162,163,164,165,166,167,168,169,232,203,204,205,206,207, /* Ex */ - 239,240,241,242,243,244,245,246,247,248,249,219,220,221,222,255, /* Fx */ + 224,225,162,163,164,165,166,167,168,169,234,235,236,237,238,239, /* Ex */ + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255, /* Fx */ #endif }; @@ -13655,6 +19103,7 @@ SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { ** isxdigit() 0x08 ** toupper() 0x20 ** SQLite identifier character 0x40 +** Quote character 0x80 ** ** Bit 0x20 is set if the mapped character requires translation to upper ** case. i.e. if the character is a lower-case ASCII character. @@ -13663,16 +19112,13 @@ SQLITE_PRIVATE const unsigned char sqlite3UpperToLower[] = { ** ** (x & ~(map[x]&0x20)) ** -** Standard function tolower() is implemented using the sqlite3UpperToLower[] +** The equivalent of tolower() is implemented using the sqlite3UpperToLower[] ** array. tolower() is used more often than toupper() by SQLite. ** -** Bit 0x40 is set if the character non-alphanumeric and can be used in an +** Bit 0x40 is set if the character is non-alphanumeric and can be used in an ** SQLite identifier. Identifiers are alphanumerics, "_", "$", and any ** non-ASCII UTF character. Hence the test for whether or not a character is ** part of an identifier is 0x46. -** -** SQLite's versions are identical to the standard versions assuming a -** locale of "C". They are implemented as macros in sqliteInt.h. */ #ifdef SQLITE_ASCII SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { @@ -13680,7 +19126,7 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, /* 08..0f ........ */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 10..17 ........ */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 18..1f ........ */ - 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, /* 20..27 !"#$%&' */ + 0x01, 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x80, /* 20..27 !"#$%&' */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 28..2f ()*+,-./ */ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, /* 30..37 01234567 */ 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 38..3f 89:;<=>? */ @@ -13688,8 +19134,8 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { 0x00, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x02, /* 40..47 @ABCDEFG */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 48..4f HIJKLMNO */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, /* 50..57 PQRSTUVW */ - 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, /* 58..5f XYZ[\]^_ */ - 0x00, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x22, /* 60..67 `abcdefg */ + 0x02, 0x02, 0x02, 0x80, 0x00, 0x00, 0x00, 0x40, /* 58..5f XYZ[\]^_ */ + 0x80, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x22, /* 60..67 `abcdefg */ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 68..6f hijklmno */ 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, /* 70..77 pqrstuvw */ 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, /* 78..7f xyz{|}~. */ @@ -13724,9 +19170,16 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { ** EVIDENCE-OF: R-43642-56306 By default, URI handling is globally ** disabled. The default value may be changed by compiling with the ** SQLITE_USE_URI symbol defined. +** +** URI filenames are enabled by default if SQLITE_HAS_CODEC is +** enabled. */ #ifndef SQLITE_USE_URI -# define SQLITE_USE_URI 0 +# ifdef SQLITE_HAS_CODEC +# define SQLITE_USE_URI 1 +# else +# define SQLITE_USE_URI 0 +# endif #endif /* EVIDENCE-OF: R-38720-18127 The default setting is determined by the @@ -13744,6 +19197,31 @@ SQLITE_PRIVATE const unsigned char sqlite3CtypeMap[256] = { # define SQLITE_SORTER_PMASZ 250 #endif +/* Statement journals spill to disk when their size exceeds the following +** threshold (in bytes). 0 means that statement journals are created and +** written to disk immediately (the default behavior for SQLite versions +** before 3.12.0). -1 means always keep the entire statement journal in +** memory. (The statement journal is also always held entirely in memory +** if journal_mode=MEMORY or if temp_store=MEMORY, regardless of this +** setting.) +*/ +#ifndef SQLITE_STMTJRNL_SPILL +# define SQLITE_STMTJRNL_SPILL (64*1024) +#endif + +/* +** The default lookaside-configuration, the format "SZ,N". SZ is the +** number of bytes in each lookaside slot (should be a multiple of 8) +** and N is the number of slots. The lookaside-configuration can be +** changed as start-time using sqlite3_config(SQLITE_CONFIG_LOOKASIDE) +** or at run-time for an individual database connection using +** sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE); +*/ +#ifndef SQLITE_DEFAULT_LOOKASIDE +# define SQLITE_DEFAULT_LOOKASIDE 1200,100 +#endif + + /* ** The following singleton contains the global configuration for ** the SQLite library. @@ -13754,10 +19232,11 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { SQLITE_THREADSAFE==1, /* bFullMutex */ SQLITE_USE_URI, /* bOpenUri */ SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ + 0, /* bSmallMalloc */ 0x7ffffffe, /* mxStrlen */ 0, /* neverCorrupt */ - 128, /* szLookaside */ - 500, /* nLookaside */ + SQLITE_DEFAULT_LOOKASIDE, /* szLookaside, nLookaside */ + SQLITE_STMTJRNL_SPILL, /* nStmtSpill */ {0,0,0,0,0,0,0,0}, /* m */ {0,0,0,0,0,0,0,0,0}, /* mutex */ {0,0,0,0,0,0,0,0,0,0,0,0,0},/* pcache2 */ @@ -13766,12 +19245,9 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, 0, /* mnHeap, mxHeap */ SQLITE_DEFAULT_MMAP_SIZE, /* szMmap */ SQLITE_MAX_MMAP_SIZE, /* mxMmap */ - (void*)0, /* pScratch */ - 0, /* szScratch */ - 0, /* nScratch */ (void*)0, /* pPage */ 0, /* szPage */ - 0, /* nPage */ + SQLITE_DEFAULT_PCACHE_INITSZ, /* nPage */ 0, /* mxParserStack */ 0, /* sharedCacheEnabled */ SQLITE_SORTER_PMASZ, /* szPma */ @@ -13793,10 +19269,12 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ #endif - 0 /* bLocaltimeFault */ + 0, /* bLocaltimeFault */ + 0x7ffffffe, /* iOnceResetThreshold */ + SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */ }; /* @@ -13804,7 +19282,7 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { ** database connections. After initialization, this table is ** read-only. */ -SQLITE_PRIVATE SQLITE_WSD FuncDefHash sqlite3GlobalFunctions; +SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions; /* ** Constant tokens for values 0 and 1. @@ -13814,12 +19292,19 @@ SQLITE_PRIVATE const Token sqlite3IntTokens[] = { { "1", 1 } }; +#ifdef VDBE_PROFILE +/* +** The following performance counter can be used in place of +** sqlite3Hwtime() for profiling. This is a no-op on standard builds. +*/ +SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt = 0; +#endif /* ** The value of the "pending" byte must be 0x40000000 (1 byte past the ** 1-gibabyte boundary) in a compatible database. SQLite never uses ** the database page that contains the pending byte. It never attempts -** to read or write that page. The pending byte page is set assign +** to read or write that page. The pending byte page is set aside ** for use by the VFS layers as space for managing file locks. ** ** During testing, it is often desirable to move the pending byte to @@ -13837,6 +19322,7 @@ SQLITE_PRIVATE const Token sqlite3IntTokens[] = { SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; #endif +/* #include "opcodes.h" */ /* ** Properties of opcodes. The OPFLG_INITIALIZER macro is ** created by mkopcodeh.awk during compilation. Data is obtained @@ -13845,436 +19331,12 @@ SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; */ SQLITE_PRIVATE const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER; +/* +** Name of the default collating sequence +*/ +SQLITE_PRIVATE const char sqlite3StrBINARY[] = "BINARY"; + /************** End of global.c **********************************************/ -/************** Begin file ctime.c *******************************************/ -/* -** 2010 February 23 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file implements routines used to report what compile-time options -** SQLite was built with. -*/ - -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS - - -/* -** An array of names of all compile-time options. This array should -** be sorted A-Z. -** -** This array looks large, but in a typical installation actually uses -** only a handful of compile-time options, so most times this array is usually -** rather short and uses little memory space. -*/ -static const char * const azCompileOpt[] = { - -/* These macros are provided to "stringify" the value of the define -** for those options in which the value is meaningful. */ -#define CTIMEOPT_VAL_(opt) #opt -#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt) - -#if SQLITE_32BIT_ROWID - "32BIT_ROWID", -#endif -#if SQLITE_4_BYTE_ALIGNED_MALLOC - "4_BYTE_ALIGNED_MALLOC", -#endif -#if SQLITE_CASE_SENSITIVE_LIKE - "CASE_SENSITIVE_LIKE", -#endif -#if SQLITE_CHECK_PAGES - "CHECK_PAGES", -#endif -#if SQLITE_COVERAGE_TEST - "COVERAGE_TEST", -#endif -#if SQLITE_DEBUG - "DEBUG", -#endif -#if SQLITE_DEFAULT_LOCKING_MODE - "DEFAULT_LOCKING_MODE=" CTIMEOPT_VAL(SQLITE_DEFAULT_LOCKING_MODE), -#endif -#if defined(SQLITE_DEFAULT_MMAP_SIZE) && !defined(SQLITE_DEFAULT_MMAP_SIZE_xc) - "DEFAULT_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_MMAP_SIZE), -#endif -#if SQLITE_DISABLE_DIRSYNC - "DISABLE_DIRSYNC", -#endif -#if SQLITE_DISABLE_LFS - "DISABLE_LFS", -#endif -#if SQLITE_ENABLE_API_ARMOR - "ENABLE_API_ARMOR", -#endif -#if SQLITE_ENABLE_ATOMIC_WRITE - "ENABLE_ATOMIC_WRITE", -#endif -#if SQLITE_ENABLE_CEROD - "ENABLE_CEROD", -#endif -#if SQLITE_ENABLE_COLUMN_METADATA - "ENABLE_COLUMN_METADATA", -#endif -#if SQLITE_ENABLE_EXPENSIVE_ASSERT - "ENABLE_EXPENSIVE_ASSERT", -#endif -#if SQLITE_ENABLE_FTS1 - "ENABLE_FTS1", -#endif -#if SQLITE_ENABLE_FTS2 - "ENABLE_FTS2", -#endif -#if SQLITE_ENABLE_FTS3 - "ENABLE_FTS3", -#endif -#if SQLITE_ENABLE_FTS3_PARENTHESIS - "ENABLE_FTS3_PARENTHESIS", -#endif -#if SQLITE_ENABLE_FTS4 - "ENABLE_FTS4", -#endif -#if SQLITE_ENABLE_ICU - "ENABLE_ICU", -#endif -#if SQLITE_ENABLE_IOTRACE - "ENABLE_IOTRACE", -#endif -#if SQLITE_ENABLE_LOAD_EXTENSION - "ENABLE_LOAD_EXTENSION", -#endif -#if SQLITE_ENABLE_LOCKING_STYLE - "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), -#endif -#if SQLITE_ENABLE_MEMORY_MANAGEMENT - "ENABLE_MEMORY_MANAGEMENT", -#endif -#if SQLITE_ENABLE_MEMSYS3 - "ENABLE_MEMSYS3", -#endif -#if SQLITE_ENABLE_MEMSYS5 - "ENABLE_MEMSYS5", -#endif -#if SQLITE_ENABLE_OVERSIZE_CELL_CHECK - "ENABLE_OVERSIZE_CELL_CHECK", -#endif -#if SQLITE_ENABLE_RTREE - "ENABLE_RTREE", -#endif -#if defined(SQLITE_ENABLE_STAT4) - "ENABLE_STAT4", -#elif defined(SQLITE_ENABLE_STAT3) - "ENABLE_STAT3", -#endif -#if SQLITE_ENABLE_UNLOCK_NOTIFY - "ENABLE_UNLOCK_NOTIFY", -#endif -#if SQLITE_ENABLE_UPDATE_DELETE_LIMIT - "ENABLE_UPDATE_DELETE_LIMIT", -#endif -#if SQLITE_HAS_CODEC - "HAS_CODEC", -#endif -#if HAVE_ISNAN || SQLITE_HAVE_ISNAN - "HAVE_ISNAN", -#endif -#if SQLITE_HOMEGROWN_RECURSIVE_MUTEX - "HOMEGROWN_RECURSIVE_MUTEX", -#endif -#if SQLITE_IGNORE_AFP_LOCK_ERRORS - "IGNORE_AFP_LOCK_ERRORS", -#endif -#if SQLITE_IGNORE_FLOCK_LOCK_ERRORS - "IGNORE_FLOCK_LOCK_ERRORS", -#endif -#ifdef SQLITE_INT64_TYPE - "INT64_TYPE", -#endif -#if SQLITE_LOCK_TRACE - "LOCK_TRACE", -#endif -#if defined(SQLITE_MAX_MMAP_SIZE) && !defined(SQLITE_MAX_MMAP_SIZE_xc) - "MAX_MMAP_SIZE=" CTIMEOPT_VAL(SQLITE_MAX_MMAP_SIZE), -#endif -#ifdef SQLITE_MAX_SCHEMA_RETRY - "MAX_SCHEMA_RETRY=" CTIMEOPT_VAL(SQLITE_MAX_SCHEMA_RETRY), -#endif -#if SQLITE_MEMDEBUG - "MEMDEBUG", -#endif -#if SQLITE_MIXED_ENDIAN_64BIT_FLOAT - "MIXED_ENDIAN_64BIT_FLOAT", -#endif -#if SQLITE_NO_SYNC - "NO_SYNC", -#endif -#if SQLITE_OMIT_ALTERTABLE - "OMIT_ALTERTABLE", -#endif -#if SQLITE_OMIT_ANALYZE - "OMIT_ANALYZE", -#endif -#if SQLITE_OMIT_ATTACH - "OMIT_ATTACH", -#endif -#if SQLITE_OMIT_AUTHORIZATION - "OMIT_AUTHORIZATION", -#endif -#if SQLITE_OMIT_AUTOINCREMENT - "OMIT_AUTOINCREMENT", -#endif -#if SQLITE_OMIT_AUTOINIT - "OMIT_AUTOINIT", -#endif -#if SQLITE_OMIT_AUTOMATIC_INDEX - "OMIT_AUTOMATIC_INDEX", -#endif -#if SQLITE_OMIT_AUTORESET - "OMIT_AUTORESET", -#endif -#if SQLITE_OMIT_AUTOVACUUM - "OMIT_AUTOVACUUM", -#endif -#if SQLITE_OMIT_BETWEEN_OPTIMIZATION - "OMIT_BETWEEN_OPTIMIZATION", -#endif -#if SQLITE_OMIT_BLOB_LITERAL - "OMIT_BLOB_LITERAL", -#endif -#if SQLITE_OMIT_BTREECOUNT - "OMIT_BTREECOUNT", -#endif -#if SQLITE_OMIT_BUILTIN_TEST - "OMIT_BUILTIN_TEST", -#endif -#if SQLITE_OMIT_CAST - "OMIT_CAST", -#endif -#if SQLITE_OMIT_CHECK - "OMIT_CHECK", -#endif -#if SQLITE_OMIT_COMPLETE - "OMIT_COMPLETE", -#endif -#if SQLITE_OMIT_COMPOUND_SELECT - "OMIT_COMPOUND_SELECT", -#endif -#if SQLITE_OMIT_CTE - "OMIT_CTE", -#endif -#if SQLITE_OMIT_DATETIME_FUNCS - "OMIT_DATETIME_FUNCS", -#endif -#if SQLITE_OMIT_DECLTYPE - "OMIT_DECLTYPE", -#endif -#if SQLITE_OMIT_DEPRECATED - "OMIT_DEPRECATED", -#endif -#if SQLITE_OMIT_DISKIO - "OMIT_DISKIO", -#endif -#if SQLITE_OMIT_EXPLAIN - "OMIT_EXPLAIN", -#endif -#if SQLITE_OMIT_FLAG_PRAGMAS - "OMIT_FLAG_PRAGMAS", -#endif -#if SQLITE_OMIT_FLOATING_POINT - "OMIT_FLOATING_POINT", -#endif -#if SQLITE_OMIT_FOREIGN_KEY - "OMIT_FOREIGN_KEY", -#endif -#if SQLITE_OMIT_GET_TABLE - "OMIT_GET_TABLE", -#endif -#if SQLITE_OMIT_INCRBLOB - "OMIT_INCRBLOB", -#endif -#if SQLITE_OMIT_INTEGRITY_CHECK - "OMIT_INTEGRITY_CHECK", -#endif -#if SQLITE_OMIT_LIKE_OPTIMIZATION - "OMIT_LIKE_OPTIMIZATION", -#endif -#if SQLITE_OMIT_LOAD_EXTENSION - "OMIT_LOAD_EXTENSION", -#endif -#if SQLITE_OMIT_LOCALTIME - "OMIT_LOCALTIME", -#endif -#if SQLITE_OMIT_LOOKASIDE - "OMIT_LOOKASIDE", -#endif -#if SQLITE_OMIT_MEMORYDB - "OMIT_MEMORYDB", -#endif -#if SQLITE_OMIT_OR_OPTIMIZATION - "OMIT_OR_OPTIMIZATION", -#endif -#if SQLITE_OMIT_PAGER_PRAGMAS - "OMIT_PAGER_PRAGMAS", -#endif -#if SQLITE_OMIT_PRAGMA - "OMIT_PRAGMA", -#endif -#if SQLITE_OMIT_PROGRESS_CALLBACK - "OMIT_PROGRESS_CALLBACK", -#endif -#if SQLITE_OMIT_QUICKBALANCE - "OMIT_QUICKBALANCE", -#endif -#if SQLITE_OMIT_REINDEX - "OMIT_REINDEX", -#endif -#if SQLITE_OMIT_SCHEMA_PRAGMAS - "OMIT_SCHEMA_PRAGMAS", -#endif -#if SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS - "OMIT_SCHEMA_VERSION_PRAGMAS", -#endif -#if SQLITE_OMIT_SHARED_CACHE - "OMIT_SHARED_CACHE", -#endif -#if SQLITE_OMIT_SUBQUERY - "OMIT_SUBQUERY", -#endif -#if SQLITE_OMIT_TCL_VARIABLE - "OMIT_TCL_VARIABLE", -#endif -#if SQLITE_OMIT_TEMPDB - "OMIT_TEMPDB", -#endif -#if SQLITE_OMIT_TRACE - "OMIT_TRACE", -#endif -#if SQLITE_OMIT_TRIGGER - "OMIT_TRIGGER", -#endif -#if SQLITE_OMIT_TRUNCATE_OPTIMIZATION - "OMIT_TRUNCATE_OPTIMIZATION", -#endif -#if SQLITE_OMIT_UTF16 - "OMIT_UTF16", -#endif -#if SQLITE_OMIT_VACUUM - "OMIT_VACUUM", -#endif -#if SQLITE_OMIT_VIEW - "OMIT_VIEW", -#endif -#if SQLITE_OMIT_VIRTUALTABLE - "OMIT_VIRTUALTABLE", -#endif -#if SQLITE_OMIT_WAL - "OMIT_WAL", -#endif -#if SQLITE_OMIT_WSD - "OMIT_WSD", -#endif -#if SQLITE_OMIT_XFER_OPT - "OMIT_XFER_OPT", -#endif -#if SQLITE_PERFORMANCE_TRACE - "PERFORMANCE_TRACE", -#endif -#if SQLITE_PROXY_DEBUG - "PROXY_DEBUG", -#endif -#if SQLITE_RTREE_INT_ONLY - "RTREE_INT_ONLY", -#endif -#if SQLITE_SECURE_DELETE - "SECURE_DELETE", -#endif -#if SQLITE_SMALL_STACK - "SMALL_STACK", -#endif -#if SQLITE_SOUNDEX - "SOUNDEX", -#endif -#if SQLITE_SYSTEM_MALLOC - "SYSTEM_MALLOC", -#endif -#if SQLITE_TCL - "TCL", -#endif -#if defined(SQLITE_TEMP_STORE) && !defined(SQLITE_TEMP_STORE_xc) - "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), -#endif -#if SQLITE_TEST - "TEST", -#endif -#if defined(SQLITE_THREADSAFE) - "THREADSAFE=" CTIMEOPT_VAL(SQLITE_THREADSAFE), -#endif -#if SQLITE_USE_ALLOCA - "USE_ALLOCA", -#endif -#if SQLITE_USER_AUTHENTICATION - "USER_AUTHENTICATION", -#endif -#if SQLITE_WIN32_MALLOC - "WIN32_MALLOC", -#endif -#if SQLITE_ZERO_MALLOC - "ZERO_MALLOC" -#endif -}; - -/* -** Given the name of a compile-time option, return true if that option -** was used and false if not. -** -** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix -** is not required for a match. -*/ -SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ - int i, n; - -#if SQLITE_ENABLE_API_ARMOR - if( zOptName==0 ){ - (void)SQLITE_MISUSE_BKPT; - return 0; - } -#endif - if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; - n = sqlite3Strlen30(zOptName); - - /* Since ArraySize(azCompileOpt) is normally in single digits, a - ** linear search is adequate. No need for a binary search. */ - for(i=0; i<ArraySize(azCompileOpt); i++){ - if( sqlite3StrNICmp(zOptName, azCompileOpt[i], n)==0 - && sqlite3IsIdChar((unsigned char)azCompileOpt[i][n])==0 - ){ - return 1; - } - } - return 0; -} - -/* -** Return the N-th compile-time option string. If N is out of range, -** return a NULL pointer. -*/ -SQLITE_API const char *sqlite3_compileoption_get(int N){ - if( N>=0 && N<ArraySize(azCompileOpt) ){ - return azCompileOpt[N]; - } - return 0; -} - -#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ - -/************** End of ctime.c ***********************************************/ /************** Begin file status.c ******************************************/ /* ** 2008 June 18 @@ -14291,6 +19353,7 @@ SQLITE_API const char *sqlite3_compileoption_get(int N){ ** This module implements the sqlite3_status() interface and related ** functionality. */ +/* #include "sqliteInt.h" */ /************** Include vdbeInt.h in the middle of status.c ******************/ /************** Begin file vdbeInt.h *****************************************/ /* @@ -14310,8 +19373,8 @@ SQLITE_API const char *sqlite3_compileoption_get(int N){ ** 6000 lines long) it was split up into several smaller files and ** this header information was factored out. */ -#ifndef _VDBEINT_H_ -#define _VDBEINT_H_ +#ifndef SQLITE_VDBEINT_H +#define SQLITE_VDBEINT_H /* ** The maximum number of times that a statement will try to reparse @@ -14321,6 +19384,17 @@ SQLITE_API const char *sqlite3_compileoption_get(int N){ # define SQLITE_MAX_SCHEMA_RETRY 50 #endif +/* +** VDBE_DISPLAY_P4 is true or false depending on whether or not the +** "explain" P4 display logic is enabled. +*/ +#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ + || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) +# define VDBE_DISPLAY_P4 1 +#else +# define VDBE_DISPLAY_P4 0 +#endif + /* ** SQL is translated into a sequence of instructions to be ** executed by a virtual machine. Each instruction is an instance @@ -14336,70 +19410,88 @@ typedef unsigned Bool; /* Opaque type used by code in vdbesort.c */ typedef struct VdbeSorter VdbeSorter; -/* Opaque type used by the explainer */ -typedef struct Explain Explain; - /* Elements of the linked list at Vdbe.pAuxData */ typedef struct AuxData AuxData; -/* -** A cursor is a pointer into a single BTree within a database file. -** The cursor can seek to a BTree entry with a particular key, or -** loop over all entries of the Btree. You can also insert new BTree -** entries or retrieve the key or data from the entry that the cursor -** is currently pointing to. -** -** Cursors can also point to virtual tables, sorters, or "pseudo-tables". -** A pseudo-table is a single-row table implemented by registers. -** -** Every cursor that the virtual machine has open is represented by an -** instance of the following structure. -*/ -struct VdbeCursor { - BtCursor *pCursor; /* The cursor structure of the backend */ - Btree *pBt; /* Separate file holding temporary table */ - KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ - int seekResult; /* Result of previous sqlite3BtreeMoveto() */ - int pseudoTableReg; /* Register holding pseudotable content. */ - i16 nField; /* Number of fields in the header */ - u16 nHdrParsed; /* Number of header fields parsed so far */ -#ifdef SQLITE_DEBUG - u8 seekOp; /* Most recent seek operation on this cursor */ -#endif - i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */ - u8 nullRow; /* True if pointing to a row with no data */ - u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ - Bool isEphemeral:1; /* True for an ephemeral table */ - Bool useRandomRowid:1;/* Generate new record numbers semi-randomly */ - Bool isTable:1; /* True if a table requiring integer keys */ - Bool isOrdered:1; /* True if the underlying table is BTREE_UNORDERED */ - Pgno pgnoRoot; /* Root page of the open btree cursor */ - sqlite3_vtab_cursor *pVtabCursor; /* The cursor for a virtual table */ - i64 seqCount; /* Sequence counter */ - i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ - VdbeSorter *pSorter; /* Sorter object for OP_SorterOpen cursors */ +/* Types of VDBE cursors */ +#define CURTYPE_BTREE 0 +#define CURTYPE_SORTER 1 +#define CURTYPE_VTAB 2 +#define CURTYPE_PSEUDO 3 - /* Cached information about the header for the data record that the - ** cursor is currently pointing to. Only valid if cacheStatus matches +/* +** A VdbeCursor is an superclass (a wrapper) for various cursor objects: +** +** * A b-tree cursor +** - In the main database or in an ephemeral database +** - On either an index or a table +** * A sorter +** * A virtual table +** * A one-row "pseudotable" stored in a single register +*/ +typedef struct VdbeCursor VdbeCursor; +struct VdbeCursor { + u8 eCurType; /* One of the CURTYPE_* values above */ + i8 iDb; /* Index of cursor database in db->aDb[] (or -1) */ + u8 nullRow; /* True if pointing to a row with no data */ + u8 deferredMoveto; /* A call to sqlite3BtreeMoveto() is needed */ + u8 isTable; /* True for rowid tables. False for indexes */ +#ifdef SQLITE_DEBUG + u8 seekOp; /* Most recent seek operation on this cursor */ + u8 wrFlag; /* The wrFlag argument to sqlite3BtreeCursor() */ +#endif + Bool isEphemeral:1; /* True for an ephemeral table */ + Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ + Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ + Btree *pBtx; /* Separate file holding temporary table */ + i64 seqCount; /* Sequence counter */ + int *aAltMap; /* Mapping from table to index column numbers */ + + /* Cached OP_Column parse information is only valid if cacheStatus matches ** Vdbe.cacheCtr. Vdbe.cacheCtr will never take on the value of - ** CACHE_STALE and so setting cacheStatus=CACHE_STALE guarantees that - ** the cache is out of date. - ** - ** aRow might point to (ephemeral) data for the current row, or it might - ** be NULL. - */ - u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */ - u32 payloadSize; /* Total number of bytes in the record */ - u32 szRow; /* Byte available in aRow */ - u32 iHdrOffset; /* Offset to next unparsed byte of the header */ - const u8 *aRow; /* Data for the current row, if all on one page */ - u32 *aOffset; /* Pointer to aType[nField] */ - u32 aType[1]; /* Type values for all entries in the record */ + ** CACHE_STALE (0) and so setting cacheStatus=CACHE_STALE guarantees that + ** the cache is out of date. */ + u32 cacheStatus; /* Cache is valid if this matches Vdbe.cacheCtr */ + int seekResult; /* Result of previous sqlite3BtreeMoveto() or 0 + ** if there have been no prior seeks on the cursor. */ + /* seekResult does not distinguish between "no seeks have ever occurred + ** on this cursor" and "the most recent seek was an exact match". + ** For CURTYPE_PSEUDO, seekResult is the register holding the record */ + + /* When a new VdbeCursor is allocated, only the fields above are zeroed. + ** The fields that follow are uninitialized, and must be individually + ** initialized prior to first use. */ + VdbeCursor *pAltCursor; /* Associated index cursor from which to read */ + union { + BtCursor *pCursor; /* CURTYPE_BTREE or _PSEUDO. Btree cursor */ + sqlite3_vtab_cursor *pVCur; /* CURTYPE_VTAB. Vtab cursor */ + VdbeSorter *pSorter; /* CURTYPE_SORTER. Sorter object */ + } uc; + KeyInfo *pKeyInfo; /* Info about index keys needed by index cursors */ + u32 iHdrOffset; /* Offset to next unparsed byte of the header */ + Pgno pgnoRoot; /* Root page of the open btree cursor */ + i16 nField; /* Number of fields in the header */ + u16 nHdrParsed; /* Number of header fields parsed so far */ + i64 movetoTarget; /* Argument to the deferred sqlite3BtreeMoveto() */ + u32 *aOffset; /* Pointer to aType[nField] */ + const u8 *aRow; /* Data for the current row, if all on one page */ + u32 payloadSize; /* Total number of bytes in the record */ + u32 szRow; /* Byte available in aRow */ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + u64 maskUsed; /* Mask of columns used by this cursor */ +#endif + /* 2*nField extra array elements allocated for aType[], beyond the one ** static element declared in the structure. nField total array slots for ** aType[] and nField+1 array slots for aOffset[] */ + u32 aType[1]; /* Type values record decode. MUST BE LAST */ }; -typedef struct VdbeCursor VdbeCursor; + + +/* +** A value for VdbeCursor.cacheStatus that means the cache is always invalid. +*/ +#define CACHE_STALE 0 /* ** When a sub-program is executed (OP_Program), a structure of this type @@ -14429,15 +19521,15 @@ struct VdbeFrame { Op *aOp; /* Program instructions for parent frame */ i64 *anExec; /* Event counters from parent frame */ Mem *aMem; /* Array of memory cells for parent frame */ - u8 *aOnceFlag; /* Array of OP_Once flags for parent frame */ VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ + u8 *aOnce; /* Bitmask used by OP_Once */ void *token; /* Copy of SubProgram.token */ i64 lastRowid; /* Last insert rowid (sqlite3.lastRowid) */ + AuxData *pAuxData; /* Linked list of auxdata allocations */ int nCursor; /* Number of entries in apCsr */ int pc; /* Program Counter in parent (calling) frame */ int nOp; /* Size of aOp array */ int nMem; /* Number of entries in aMem */ - int nOnceFlag; /* Number of entries in aOnceFlag */ int nChildMem; /* Number of memory cells for child frame */ int nChildCsr; /* Number of cursors for child frame */ int nChange; /* Statement changes (Vdbe.nChange) */ @@ -14446,27 +19538,24 @@ struct VdbeFrame { #define VdbeFrameMem(p) ((Mem *)&((u8 *)p)[ROUND8(sizeof(VdbeFrame))]) -/* -** A value for VdbeCursor.cacheValid that means the cache is always invalid. -*/ -#define CACHE_STALE 0 - /* ** Internally, the vdbe manipulates nearly all SQL values as Mem ** structures. Each Mem struct may cache multiple representations (string, ** integer etc.) of the same value. */ -struct Mem { +struct sqlite3_value { union MemValue { double r; /* Real value used when MEM_Real is set in flags */ i64 i; /* Integer value used when MEM_Int is set in flags */ - int nZero; /* Used when bit MEM_Zero is set in flags */ + int nZero; /* Extra zero bytes when MEM_Zero and MEM_Blob set */ + const char *zPType; /* Pointer type when MEM_Term|MEM_Subtype|MEM_Null */ FuncDef *pDef; /* Used only when flags==MEM_Agg */ RowSet *pRowSet; /* Used only when flags==MEM_RowSet */ VdbeFrame *pFrame; /* Used when flags==MEM_Frame */ } u; u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ + u8 eSubtype; /* Subtype for this value */ int n; /* Number of characters in string value, excluding '\0' */ char *z; /* String or BLOB value */ /* ShallowCopy only needs to copy the information above */ @@ -14481,11 +19570,18 @@ struct Mem { #endif }; +/* +** Size of struct Mem not including the Mem.zMalloc member or anything that +** follows. +*/ +#define MEMCELLSIZE offsetof(Mem,zMalloc) + /* One or more of the following flags are set to indicate the validOK ** representations of the value stored in the Mem struct. ** ** If the MEM_Null flag is set, then the value is an SQL NULL value. -** No other flags may be set in this case. +** For a pointer type created using sqlite3_bind_pointer() or +** sqlite3_result_pointer() the MEM_Term and MEM_Subtype flags are also set. ** ** If the MEM_Str flag is set then Mem.z points at a string representation. ** Usually this is encoded in the same unicode encoding as the main @@ -14493,7 +19589,7 @@ struct Mem { ** set, then the string is nul terminated. The MEM_Int and MEM_Real ** flags may coexist with the MEM_Str flag. */ -#define MEM_Null 0x0001 /* Value is NULL */ +#define MEM_Null 0x0001 /* Value is NULL (or a pointer) */ #define MEM_Str 0x0002 /* Value is a string */ #define MEM_Int 0x0004 /* Value is an integer */ #define MEM_Real 0x0008 /* Value is a real number */ @@ -14503,7 +19599,7 @@ struct Mem { #define MEM_Frame 0x0040 /* Value is a VdbeFrame object */ #define MEM_Undefined 0x0080 /* Value is undefined */ #define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ -#define MEM_TypeMask 0x01ff /* Mask of type bits */ +#define MEM_TypeMask 0xc1ff /* Mask of type bits */ /* Whenever Mem contains a valid string or blob representation, one of @@ -14511,17 +19607,24 @@ struct Mem { ** policy for Mem.z. The MEM_Term flag tells us whether or not the ** string is \000 or \u0000 terminated */ -#define MEM_Term 0x0200 /* String rep is nul terminated */ +#define MEM_Term 0x0200 /* String in Mem.z is zero terminated */ #define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */ #define MEM_Static 0x0800 /* Mem.z points to a static string */ #define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */ #define MEM_Agg 0x2000 /* Mem.z points to an agg function context */ #define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */ +#define MEM_Subtype 0x8000 /* Mem.eSubtype is valid */ #ifdef SQLITE_OMIT_INCRBLOB #undef MEM_Zero #define MEM_Zero 0x0000 #endif +/* Return TRUE if Mem X contains dynamically allocated content - anything +** that needs to be deallocated to avoid a leak. +*/ +#define VdbeMemDynamic(X) \ + (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0) + /* ** Clear any existing type flags from a Mem and replace them with f */ @@ -14544,11 +19647,11 @@ struct Mem { ** when the VM is halted (if not before). */ struct AuxData { - int iOp; /* Instruction number of OP_Function opcode */ - int iArg; /* Index of function argument. */ + int iAuxOp; /* Instruction number of OP_Function opcode */ + int iAuxArg; /* Index of function argument. */ void *pAux; /* Aux data pointer */ - void (*xDelete)(void *); /* Destructor for the aux data */ - AuxData *pNext; /* Next element in list */ + void (*xDeleteAux)(void*); /* Destructor for the aux data */ + AuxData *pNextAux; /* Next element in list */ }; /* @@ -14565,26 +19668,15 @@ struct AuxData { ** (Mem) which are only defined there. */ struct sqlite3_context { - Mem *pOut; /* The return value is stored here */ - FuncDef *pFunc; /* Pointer to function information */ - Mem *pMem; /* Memory cell used to store aggregate context */ - Vdbe *pVdbe; /* The VM that owns this context */ - int iOp; /* Instruction number of OP_Function */ - int isError; /* Error code returned by the function. */ - u8 skipFlag; /* Skip accumulator loading if true */ - u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */ -}; - -/* -** An Explain object accumulates indented output which is helpful -** in describing recursive data structures. -*/ -struct Explain { - Vdbe *pVdbe; /* Attach the explanation to this Vdbe */ - StrAccum str; /* The string being accumulated */ - int nIndent; /* Number of elements in aIndent */ - u16 aIndent[100]; /* Levels of indentation */ - char zBase[100]; /* Initial space */ + Mem *pOut; /* The return value is stored here */ + FuncDef *pFunc; /* Pointer to function information */ + Mem *pMem; /* Memory cell used to store aggregate context */ + Vdbe *pVdbe; /* The VM that owns this context */ + int iOp; /* Instruction number of OP_Function */ + int isError; /* Error code returned by the function. */ + u8 skipFlag; /* Skip accumulator loading if true */ + u8 argc; /* Number of arguments */ + sqlite3_value *argv[1]; /* Argument set */ }; /* A bitfield type for use inside of structures. Always follow with :N where @@ -14608,62 +19700,60 @@ struct ScanStatus { ** ** The "sqlite3_stmt" structure pointer that is returned by sqlite3_prepare() ** is really a pointer to an instance of this structure. -** -** The Vdbe.inVtabMethod variable is set to non-zero for the duration of -** any virtual table method invocations made by the vdbe program. It is -** set to 2 for xDestroy method calls and 1 for all other methods. This -** variable is used for two purposes: to allow xDestroy methods to execute -** "DROP TABLE" statements and to prevent some nasty side effects of -** malloc failure when SQLite is invoked recursively by a virtual table -** method function. */ struct Vdbe { sqlite3 *db; /* The database connection that owns this statement */ + Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ + Parse *pParse; /* Parsing context used to create this Vdbe */ + ynVar nVar; /* Number of entries in aVar[] */ + u32 magic; /* Magic number for sanity checking */ + int nMem; /* Number of memory locations currently allocated */ + int nCursor; /* Number of slots in apCsr[] */ + u32 cacheCtr; /* VdbeCursor row cache generation counter */ + int pc; /* The program counter */ + int rc; /* Value to return */ + int nChange; /* Number of db changes made since last reset */ + int iStatement; /* Statement number (or 0 if has not opened stmt) */ + i64 iCurrentTime; /* Value of julianday('now') for this statement */ + i64 nFkConstraint; /* Number of imm. FK constraints this VM */ + i64 nStmtDefCons; /* Number of def. constraints when stmt started */ + i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + + /* When allocating a new Vdbe object, all of the fields below should be + ** initialized to zero or NULL */ + Op *aOp; /* Space to hold the virtual machine's program */ Mem *aMem; /* The memory locations */ Mem **apArg; /* Arguments to currently executing user function */ Mem *aColName; /* Column names to return */ Mem *pResultSet; /* Pointer to an array of results */ - Parse *pParse; /* Parsing context used to create this Vdbe */ - int nMem; /* Number of memory locations currently allocated */ - int nOp; /* Number of instructions in the program */ - int nCursor; /* Number of slots in apCsr[] */ - u32 magic; /* Magic number for sanity checking */ char *zErrMsg; /* Error message written here */ - Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ VdbeCursor **apCsr; /* One element of this array for each open cursor */ Mem *aVar; /* Values for the OP_Variable opcode. */ - char **azVar; /* Name of variables */ - ynVar nVar; /* Number of entries in aVar[] */ - ynVar nzVar; /* Number of entries in azVar[] */ - u32 cacheCtr; /* VdbeCursor row cache generation counter */ - int pc; /* The program counter */ - int rc; /* Value to return */ + VList *pVList; /* Name of variables */ +#ifndef SQLITE_OMIT_TRACE + i64 startTime; /* Time when query started - used for profiling */ +#endif + int nOp; /* Number of instructions in the program */ +#ifdef SQLITE_DEBUG + int rcApp; /* errcode set by sqlite3_result_error_code() */ + u32 nWrite; /* Number of write operations that have occurred */ +#endif u16 nResColumn; /* Number of columns in one row of the result set */ u8 errorAction; /* Recovery action to do in case of an error */ u8 minWriteFileFormat; /* Minimum file format for writable database files */ - bft explain:2; /* True if EXPLAIN present on SQL command */ - bft inVtabMethod:2; /* See comments above */ - bft changeCntOn:1; /* True to update the change-counter */ + u8 prepFlags; /* SQLITE_PREPARE_* flags */ bft expired:1; /* True if the VM needs to be recompiled */ + bft doingRerun:1; /* True if rerunning after an auto-reprepare */ + bft explain:2; /* True if EXPLAIN present on SQL command */ + bft changeCntOn:1; /* True to update the change-counter */ bft runOnlyOnce:1; /* Automatically expire on reset */ bft usesStmtJournal:1; /* True if uses a statement journal */ bft readOnly:1; /* True for statements that do not write */ bft bIsReader:1; /* True for statements that read */ - bft isPrepareV2:1; /* True if prepared with prepare_v2() */ - bft doingRerun:1; /* True if rerunning after an auto-reprepare */ - int nChange; /* Number of db changes made since last reset */ yDbMask btreeMask; /* Bitmask of db->aDb[] entries referenced */ yDbMask lockMask; /* Subset of btreeMask that requires a lock */ - int iStatement; /* Statement number (or 0 if has not opened stmt) */ - u32 aCounter[5]; /* Counters used by sqlite3_stmt_status() */ -#ifndef SQLITE_OMIT_TRACE - i64 startTime; /* Time when query started - used for profiling */ -#endif - i64 iCurrentTime; /* Value of julianday('now') for this statement */ - i64 nFkConstraint; /* Number of imm. FK constraints this VM */ - i64 nStmtDefCons; /* Number of def. constraints when stmt started */ - i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + u32 aCounter[7]; /* Counters used by sqlite3_stmt_status() */ char *zSql; /* Text of the SQL statement that generated this */ void *pFree; /* Free this when deleting the vdbe */ VdbeFrame *pFrame; /* Parent frame */ @@ -14671,8 +19761,6 @@ struct Vdbe { int nFrame; /* Number of frames in pFrame list */ u32 expmask; /* Binding to these vars invalidates VM */ SubProgram *pProgram; /* Linked list of all sub-programs used by VM */ - int nOnceFlag; /* Size of array aOnceFlag[] */ - u8 *aOnceFlag; /* Flags for OP_Once */ AuxData *pAuxData; /* Linked list of auxdata allocations */ #ifdef SQLITE_ENABLE_STMT_SCANSTATUS i64 *anExec; /* Number of times each op has been executed */ @@ -14684,26 +19772,49 @@ struct Vdbe { /* ** The following are allowed values for Vdbe.magic */ -#define VDBE_MAGIC_INIT 0x26bceaa5 /* Building a VDBE program */ -#define VDBE_MAGIC_RUN 0xbdf20da3 /* VDBE is ready to execute */ -#define VDBE_MAGIC_HALT 0x519c2973 /* VDBE has completed execution */ -#define VDBE_MAGIC_DEAD 0xb606c3c8 /* The VDBE has been deallocated */ +#define VDBE_MAGIC_INIT 0x16bceaa5 /* Building a VDBE program */ +#define VDBE_MAGIC_RUN 0x2df20da3 /* VDBE is ready to execute */ +#define VDBE_MAGIC_HALT 0x319c2973 /* VDBE has completed execution */ +#define VDBE_MAGIC_RESET 0x48fa9f76 /* Reset and ready to run again */ +#define VDBE_MAGIC_DEAD 0x5606c3c8 /* The VDBE has been deallocated */ + +/* +** Structure used to store the context required by the +** sqlite3_preupdate_*() API functions. +*/ +struct PreUpdate { + Vdbe *v; + VdbeCursor *pCsr; /* Cursor to read old values from */ + int op; /* One of SQLITE_INSERT, UPDATE, DELETE */ + u8 *aRecord; /* old.* database record */ + KeyInfo keyinfo; + UnpackedRecord *pUnpacked; /* Unpacked version of aRecord[] */ + UnpackedRecord *pNewUnpacked; /* Unpacked version of new.* record */ + int iNewReg; /* Register for new.* values */ + i64 iKey1; /* First key value passed to hook */ + i64 iKey2; /* Second key value passed to hook */ + Mem *aNew; /* Array of new.* values */ + Table *pTab; /* Schema object being upated */ + Index *pPk; /* PK index if pTab is WITHOUT ROWID */ +}; /* ** Function prototypes */ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...); SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); void sqliteVdbePopStack(Vdbe*,int); -SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor*); +SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE*, int, Op*); #endif SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); -SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int); +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); +SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem*, int, u32*); SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); -SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(Vdbe*, int, int); +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); int sqlite2BtreeKeyCompare(BtCursor *, const void *, int, int, int *); SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare(sqlite3*,VdbeCursor*,UnpackedRecord*,int*); @@ -14724,6 +19835,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem*, i64); #else SQLITE_PRIVATE void sqlite3VdbeMemSetDouble(Mem*, double); #endif +SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(Mem*, void*, const char*, void(*)(void*)); SQLITE_PRIVATE void sqlite3VdbeMemInit(Mem*,sqlite3*,u16); SQLITE_PRIVATE void sqlite3VdbeMemSetNull(Mem*); SQLITE_PRIVATE void sqlite3VdbeMemSetZeroBlob(Mem*,int); @@ -14733,14 +19845,13 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem*, u8, u8); SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemIntegerify(Mem*); SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem*); +SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem*, int ifNull); SQLITE_PRIVATE void sqlite3VdbeIntegerAffinity(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem*); SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem*); SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem*,u8,u8); -SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,int,Mem*); +SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); -#define VdbeMemDynamic(X) \ - (((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))!=0) SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); SQLITE_PRIVATE const char *sqlite3OpcodeName(int); SQLITE_PRIVATE int sqlite3VdbeMemGrow(Mem *pMem, int n, int preserve); @@ -14748,22 +19859,37 @@ SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int n); SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *, int); SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame*); SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook(Vdbe*,VdbeCursor*,int,const char*,Table*,i64,int); +#endif SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p); SQLITE_PRIVATE int sqlite3VdbeSorterInit(sqlite3 *, int, VdbeCursor *); SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *, VdbeSorter *); SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *); SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *, Mem *); -SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *, const VdbeCursor *, int *); +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *, const VdbeCursor *); SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *, int *); SQLITE_PRIVATE int sqlite3VdbeSorterWrite(const VdbeCursor *, Mem *); SQLITE_PRIVATE int sqlite3VdbeSorterCompare(const VdbeCursor *, Mem *, int, int *); -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe*, VdbeCursor*); +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe*); +#else +# define sqlite3VdbeIncrWriteCounter(V,C) +# define sqlite3VdbeAssertAbortable(V) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); #else # define sqlite3VdbeEnter(X) +#endif + +#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe*); +#else # define sqlite3VdbeLeave(X) #endif @@ -14778,12 +19904,14 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *, int); # define sqlite3VdbeCheckFk(p,i) 0 #endif -SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8); #ifdef SQLITE_DEBUG SQLITE_PRIVATE void sqlite3VdbePrintSql(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf); #endif -SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem); +#ifndef SQLITE_OMIT_UTF16 +SQLITE_PRIVATE int sqlite3VdbeMemTranslate(Mem*, u8); +SQLITE_PRIVATE int sqlite3VdbeMemHandleBom(Mem *pMem); +#endif #ifndef SQLITE_OMIT_INCRBLOB SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); @@ -14793,7 +19921,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); #define ExpandBlob(P) SQLITE_OK #endif -#endif /* !defined(_VDBEINT_H_) */ +#endif /* !defined(SQLITE_VDBEINT_H) */ /************** End of vdbeInt.h *********************************************/ /************** Continuing where we left off in status.c *********************/ @@ -14801,12 +19929,34 @@ SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); /* ** Variables in which to record status information. */ +#if SQLITE_PTRSIZE>4 +typedef sqlite3_int64 sqlite3StatValueType; +#else +typedef u32 sqlite3StatValueType; +#endif typedef struct sqlite3StatType sqlite3StatType; static SQLITE_WSD struct sqlite3StatType { - int nowValue[10]; /* Current value */ - int mxValue[10]; /* Maximum value */ + sqlite3StatValueType nowValue[10]; /* Current value */ + sqlite3StatValueType mxValue[10]; /* Maximum value */ } sqlite3Stat = { {0,}, {0,} }; +/* +** Elements of sqlite3Stat[] are protected by either the memory allocator +** mutex, or by the pcache1 mutex. The following array determines which. +*/ +static const char statMutex[] = { + 0, /* SQLITE_STATUS_MEMORY_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_USED */ + 1, /* SQLITE_STATUS_PAGECACHE_OVERFLOW */ + 0, /* SQLITE_STATUS_SCRATCH_USED */ + 0, /* SQLITE_STATUS_SCRATCH_OVERFLOW */ + 0, /* SQLITE_STATUS_MALLOC_SIZE */ + 0, /* SQLITE_STATUS_PARSER_STACK */ + 1, /* SQLITE_STATUS_PAGECACHE_SIZE */ + 0, /* SQLITE_STATUS_SCRATCH_SIZE */ + 0, /* SQLITE_STATUS_MALLOC_COUNT */ +}; + /* The "wsdStat" macro will resolve to the status information ** state vector. If writable static data is unsupported on the target, @@ -14823,47 +19973,81 @@ static SQLITE_WSD struct sqlite3StatType { #endif /* -** Return the current value of a status parameter. +** Return the current value of a status parameter. The caller must +** be holding the appropriate mutex. */ -SQLITE_PRIVATE int sqlite3StatusValue(int op){ +SQLITE_PRIVATE sqlite3_int64 sqlite3StatusValue(int op){ wsdStatInit; assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); + assert( op>=0 && op<ArraySize(statMutex) ); + assert( sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() + : sqlite3MallocMutex()) ); return wsdStat.nowValue[op]; } /* -** Add N to the value of a status record. It is assumed that the -** caller holds appropriate locks. +** Add N to the value of a status record. The caller must hold the +** appropriate mutex. (Locking is checked by assert()). +** +** The StatusUp() routine can accept positive or negative values for N. +** The value of N is added to the current status value and the high-water +** mark is adjusted if necessary. +** +** The StatusDown() routine lowers the current value by N. The highwater +** mark is unchanged. N must be non-negative for StatusDown(). */ -SQLITE_PRIVATE void sqlite3StatusAdd(int op, int N){ +SQLITE_PRIVATE void sqlite3StatusUp(int op, int N){ wsdStatInit; assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); + assert( op>=0 && op<ArraySize(statMutex) ); + assert( sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() + : sqlite3MallocMutex()) ); wsdStat.nowValue[op] += N; if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ wsdStat.mxValue[op] = wsdStat.nowValue[op]; } } +SQLITE_PRIVATE void sqlite3StatusDown(int op, int N){ + wsdStatInit; + assert( N>=0 ); + assert( op>=0 && op<ArraySize(statMutex) ); + assert( sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() + : sqlite3MallocMutex()) ); + assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); + wsdStat.nowValue[op] -= N; +} /* -** Set the value of a status to X. +** Adjust the highwater mark if necessary. +** The caller must hold the appropriate mutex. */ -SQLITE_PRIVATE void sqlite3StatusSet(int op, int X){ +SQLITE_PRIVATE void sqlite3StatusHighwater(int op, int X){ + sqlite3StatValueType newValue; wsdStatInit; + assert( X>=0 ); + newValue = (sqlite3StatValueType)X; assert( op>=0 && op<ArraySize(wsdStat.nowValue) ); - wsdStat.nowValue[op] = X; - if( wsdStat.nowValue[op]>wsdStat.mxValue[op] ){ - wsdStat.mxValue[op] = wsdStat.nowValue[op]; + assert( op>=0 && op<ArraySize(statMutex) ); + assert( sqlite3_mutex_held(statMutex[op] ? sqlite3Pcache1Mutex() + : sqlite3MallocMutex()) ); + assert( op==SQLITE_STATUS_MALLOC_SIZE + || op==SQLITE_STATUS_PAGECACHE_SIZE + || op==SQLITE_STATUS_PARSER_STACK ); + if( newValue>wsdStat.mxValue[op] ){ + wsdStat.mxValue[op] = newValue; } } /* ** Query status information. -** -** This implementation assumes that reading or writing an aligned -** 32-bit integer is an atomic operation. If that assumption is not true, -** then this routine is not threadsafe. */ -SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +){ + sqlite3_mutex *pMutex; wsdStatInit; if( op<0 || op>=ArraySize(wsdStat.nowValue) ){ return SQLITE_MISUSE_BKPT; @@ -14871,13 +20055,52 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF #ifdef SQLITE_ENABLE_API_ARMOR if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; #endif + pMutex = statMutex[op] ? sqlite3Pcache1Mutex() : sqlite3MallocMutex(); + sqlite3_mutex_enter(pMutex); *pCurrent = wsdStat.nowValue[op]; *pHighwater = wsdStat.mxValue[op]; if( resetFlag ){ wsdStat.mxValue[op] = wsdStat.nowValue[op]; } + sqlite3_mutex_leave(pMutex); + (void)pMutex; /* Prevent warning when SQLITE_THREADSAFE=0 */ return SQLITE_OK; } +SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag){ + sqlite3_int64 iCur = 0, iHwtr = 0; + int rc; +#ifdef SQLITE_ENABLE_API_ARMOR + if( pCurrent==0 || pHighwater==0 ) return SQLITE_MISUSE_BKPT; +#endif + rc = sqlite3_status64(op, &iCur, &iHwtr, resetFlag); + if( rc==0 ){ + *pCurrent = (int)iCur; + *pHighwater = (int)iHwtr; + } + return rc; +} + +/* +** Return the number of LookasideSlot elements on the linked list +*/ +static u32 countLookasideSlots(LookasideSlot *p){ + u32 cnt = 0; + while( p ){ + p = p->pNext; + cnt++; + } + return cnt; +} + +/* +** Count the number of slots of lookaside memory that are outstanding +*/ +SQLITE_PRIVATE int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ + u32 nInit = countLookasideSlots(db->lookaside.pInit); + u32 nFree = countLookasideSlots(db->lookaside.pFree); + if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit; + return db->lookaside.nSlot - (nInit+nFree); +} /* ** Query status information for a single database connection @@ -14898,10 +20121,15 @@ SQLITE_API int sqlite3_db_status( sqlite3_mutex_enter(db->mutex); switch( op ){ case SQLITE_DBSTATUS_LOOKASIDE_USED: { - *pCurrent = db->lookaside.nOut; - *pHighwater = db->lookaside.mxOut; + *pCurrent = sqlite3LookasideUsed(db, pHighwater); if( resetFlag ){ - db->lookaside.mxOut = db->lookaside.nOut; + LookasideSlot *p = db->lookaside.pFree; + if( p ){ + while( p->pNext ) p = p->pNext; + p->pNext = db->lookaside.pInit; + db->lookaside.pInit = db->lookaside.pFree; + db->lookaside.pFree = 0; + } } break; } @@ -14927,6 +20155,7 @@ SQLITE_API int sqlite3_db_status( ** by all pagers associated with the given database connection. The ** highwater mark is meaningless and is returned as zero. */ + case SQLITE_DBSTATUS_CACHE_USED_SHARED: case SQLITE_DBSTATUS_CACHE_USED: { int totalUsed = 0; int i; @@ -14935,7 +20164,11 @@ SQLITE_API int sqlite3_db_status( Btree *pBt = db->aDb[i].pBt; if( pBt ){ Pager *pPager = sqlite3BtreePager(pBt); - totalUsed += sqlite3PagerMemUsed(pPager); + int nByte = sqlite3PagerMemUsed(pPager); + if( op==SQLITE_DBSTATUS_CACHE_USED_SHARED ){ + nByte = nByte / sqlite3BtreeConnectionCount(pBt); + } + totalUsed += nByte; } } sqlite3BtreeLeaveAll(db); @@ -14966,10 +20199,10 @@ SQLITE_API int sqlite3_db_status( + pSchema->idxHash.count + pSchema->fkeyHash.count ); - nByte += sqlite3MallocSize(pSchema->tblHash.ht); - nByte += sqlite3MallocSize(pSchema->trigHash.ht); - nByte += sqlite3MallocSize(pSchema->idxHash.ht); - nByte += sqlite3MallocSize(pSchema->fkeyHash.ht); + nByte += sqlite3_msize(pSchema->tblHash.ht); + nByte += sqlite3_msize(pSchema->trigHash.ht); + nByte += sqlite3_msize(pSchema->idxHash.ht); + nByte += sqlite3_msize(pSchema->fkeyHash.ht); for(p=sqliteHashFirst(&pSchema->trigHash); p; p=sqliteHashNext(p)){ sqlite3DeleteTrigger(db, (Trigger*)sqliteHashData(p)); @@ -15014,6 +20247,9 @@ SQLITE_API int sqlite3_db_status( ** pagers the database handle is connected to. *pHighwater is always set ** to zero. */ + case SQLITE_DBSTATUS_CACHE_SPILL: + op = SQLITE_DBSTATUS_CACHE_WRITE+1; + /* Fall through into the next case */ case SQLITE_DBSTATUS_CACHE_HIT: case SQLITE_DBSTATUS_CACHE_MISS: case SQLITE_DBSTATUS_CACHE_WRITE:{ @@ -15096,63 +20332,91 @@ SQLITE_API int sqlite3_db_status( ** ** Jean Meeus ** Astronomical Algorithms, 2nd Edition, 1998 -** ISBM 0-943396-61-1 +** ISBN 0-943396-61-1 ** Willmann-Bell, Inc ** Richmond, Virginia (USA) */ +/* #include "sqliteInt.h" */ /* #include <stdlib.h> */ /* #include <assert.h> */ #include <time.h> #ifndef SQLITE_OMIT_DATETIME_FUNCS +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So declare a substitute. The substitute function itself is +** defined in "os_win.c". +*/ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +struct tm *__cdecl localtime(const time_t *); +#endif /* ** A structure for holding a single date and time. */ typedef struct DateTime DateTime; struct DateTime { - sqlite3_int64 iJD; /* The julian day number times 86400000 */ - int Y, M, D; /* Year, month, and day */ - int h, m; /* Hour and minutes */ - int tz; /* Timezone offset in minutes */ - double s; /* Seconds */ - char validYMD; /* True (1) if Y,M,D are valid */ - char validHMS; /* True (1) if h,m,s are valid */ - char validJD; /* True (1) if iJD is valid */ - char validTZ; /* True (1) if tz is valid */ + sqlite3_int64 iJD; /* The julian day number times 86400000 */ + int Y, M, D; /* Year, month, and day */ + int h, m; /* Hour and minutes */ + int tz; /* Timezone offset in minutes */ + double s; /* Seconds */ + char validJD; /* True (1) if iJD is valid */ + char rawS; /* Raw numeric value stored in s */ + char validYMD; /* True (1) if Y,M,D are valid */ + char validHMS; /* True (1) if h,m,s are valid */ + char validTZ; /* True (1) if tz is valid */ + char tzSet; /* Timezone was set explicitly */ + char isError; /* An overflow has occurred */ }; /* -** Convert zDate into one or more integers. Additional arguments -** come in groups of 5 as follows: +** Convert zDate into one or more integers according to the conversion +** specifier zFormat. ** -** N number of digits in the integer -** min minimum allowed value of the integer -** max maximum allowed value of the integer -** nextC first character after the integer -** pVal where to write the integers value. +** zFormat[] contains 4 characters for each integer converted, except for +** the last integer which is specified by three characters. The meaning +** of a four-character format specifiers ABCD is: +** +** A: number of digits to convert. Always "2" or "4". +** B: minimum value. Always "0" or "1". +** C: maximum value, decoded as: +** a: 12 +** b: 14 +** c: 24 +** d: 31 +** e: 59 +** f: 9999 +** D: the separator character, or \000 to indicate this is the +** last number to convert. +** +** Example: To translate an ISO-8601 date YYYY-MM-DD, the format would +** be "40f-21a-20c". The "40f-" indicates the 4-digit year followed by "-". +** The "21a-" indicates the 2-digit month followed by "-". The "20c" indicates +** the 2-digit day which is the last integer in the set. ** -** Conversions continue until one with nextC==0 is encountered. ** The function returns the number of successful conversions. */ -static int getDigits(const char *zDate, ...){ +static int getDigits(const char *zDate, const char *zFormat, ...){ + /* The aMx[] array translates the 3rd character of each format + ** spec into a max size: a b c d e f */ + static const u16 aMx[] = { 12, 14, 24, 31, 59, 9999 }; va_list ap; - int val; - int N; - int min; - int max; - int nextC; - int *pVal; int cnt = 0; - va_start(ap, zDate); + char nextC; + va_start(ap, zFormat); do{ - N = va_arg(ap, int); - min = va_arg(ap, int); - max = va_arg(ap, int); - nextC = va_arg(ap, int); - pVal = va_arg(ap, int*); + char N = zFormat[0] - '0'; + char min = zFormat[1] - '0'; + int val = 0; + u16 max; + + assert( zFormat[2]>='a' && zFormat[2]<='f' ); + max = aMx[zFormat[2] - 'a']; + nextC = zFormat[3]; val = 0; while( N-- ){ if( !sqlite3Isdigit(*zDate) ){ @@ -15161,12 +20425,13 @@ static int getDigits(const char *zDate, ...){ val = val*10 + *zDate - '0'; zDate++; } - if( val<min || val>max || (nextC!=0 && nextC!=*zDate) ){ + if( val<(int)min || val>(int)max || (nextC!=0 && nextC!=*zDate) ){ goto end_getDigits; } - *pVal = val; + *va_arg(ap,int*) = val; zDate++; cnt++; + zFormat += 4; }while( nextC ); end_getDigits: va_end(ap); @@ -15207,13 +20472,14 @@ static int parseTimezone(const char *zDate, DateTime *p){ return c!=0; } zDate++; - if( getDigits(zDate, 2, 0, 14, ':', &nHr, 2, 0, 59, 0, &nMn)!=2 ){ + if( getDigits(zDate, "20b:20e", &nHr, &nMn)!=2 ){ return 1; } zDate += 5; p->tz = sgn*(nMn + nHr*60); zulu_time: while( sqlite3Isspace(*zDate) ){ zDate++; } + p->tzSet = 1; return *zDate!=0; } @@ -15227,13 +20493,13 @@ zulu_time: static int parseHhMmSs(const char *zDate, DateTime *p){ int h, m, s; double ms = 0.0; - if( getDigits(zDate, 2, 0, 24, ':', &h, 2, 0, 59, 0, &m)!=2 ){ + if( getDigits(zDate, "20c:20e", &h, &m)!=2 ){ return 1; } zDate += 5; if( *zDate==':' ){ zDate++; - if( getDigits(zDate, 2, 0, 59, 0, &s)!=1 ){ + if( getDigits(zDate, "20e", &s)!=1 ){ return 1; } zDate += 2; @@ -15251,6 +20517,7 @@ static int parseHhMmSs(const char *zDate, DateTime *p){ s = 0; } p->validJD = 0; + p->rawS = 0; p->validHMS = 1; p->h = h; p->m = m; @@ -15260,6 +20527,14 @@ static int parseHhMmSs(const char *zDate, DateTime *p){ return 0; } +/* +** Put the DateTime object into its error state. +*/ +static void datetimeError(DateTime *p){ + memset(p, 0, sizeof(*p)); + p->isError = 1; +} + /* ** Convert from YYYY-MM-DD HH:MM:SS to julian day. We always assume ** that the YYYY-MM-DD is according to the Gregorian calendar. @@ -15279,6 +20554,10 @@ static void computeJD(DateTime *p){ M = 1; D = 1; } + if( Y<-4713 || Y>9999 || p->rawS ){ + datetimeError(p); + return; + } if( M<=2 ){ Y--; M += 12; @@ -15321,7 +20600,7 @@ static int parseYyyyMmDd(const char *zDate, DateTime *p){ }else{ neg = 0; } - if( getDigits(zDate,4,0,9999,'-',&Y,2,1,12,'-',&M,2,1,31,0,&D)!=3 ){ + if( getDigits(zDate, "40f-21a-21d", &Y, &M, &D)!=3 ){ return 1; } zDate += 10; @@ -15359,6 +20638,21 @@ static int setDateTimeToCurrent(sqlite3_context *context, DateTime *p){ } } +/* +** Input "r" is a numeric quantity which might be a julian day number, +** or the number of seconds since 1970. If the value if r is within +** range of a julian day number, install it as such and set validJD. +** If the value is a valid unix timestamp, put it in p->s and set p->rawS. +*/ +static void setRawDateNumber(DateTime *p, double r){ + p->s = r; + p->rawS = 1; + if( r>=0.0 && r<5373484.5 ){ + p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); + p->validJD = 1; + } +} + /* ** Attempt to parse the given string into a julian day number. Return ** the number of errors. @@ -15385,16 +20679,33 @@ static int parseDateOrTime( return 0; }else if( parseHhMmSs(zDate, p)==0 ){ return 0; - }else if( sqlite3StrICmp(zDate,"now")==0){ + }else if( sqlite3StrICmp(zDate,"now")==0 && sqlite3NotPureFunc(context) ){ return setDateTimeToCurrent(context, p); }else if( sqlite3AtoF(zDate, &r, sqlite3Strlen30(zDate), SQLITE_UTF8) ){ - p->iJD = (sqlite3_int64)(r*86400000.0 + 0.5); - p->validJD = 1; + setRawDateNumber(p, r); return 0; } return 1; } +/* The julian day number for 9999-12-31 23:59:59.999 is 5373484.4999999. +** Multiplying this by 86400000 gives 464269060799999 as the maximum value +** for DateTime.iJD. +** +** But some older compilers (ex: gcc 4.2.1 on older Macs) cannot deal with +** such a large integer literal, so we have to encode it. +*/ +#define INT_464269060799999 ((((i64)0x1a640)<<32)|0x1072fdff) + +/* +** Return TRUE if the given julian day number is within range. +** +** The input is the JulianDay times 86400000. +*/ +static int validJulianDay(sqlite3_int64 iJD){ + return iJD>=0 && iJD<=INT_464269060799999; +} + /* ** Compute the Year, Month, and Day from the julian day number. */ @@ -15405,13 +20716,16 @@ static void computeYMD(DateTime *p){ p->Y = 2000; p->M = 1; p->D = 1; + }else if( !validJulianDay(p->iJD) ){ + datetimeError(p); + return; }else{ Z = (int)((p->iJD + 43200000)/86400000); A = (int)((Z - 1867216.25)/36524.25); A = Z + 1 + A - (A/4); B = A + 1524; C = (int)((B - 122.1)/365.25); - D = (36525*C)/100; + D = (36525*(C&32767))/100; E = (int)((B-D)/30.6001); X1 = (int)(30.6001*E); p->D = B - D - X1; @@ -15436,6 +20750,7 @@ static void computeHMS(DateTime *p){ s -= p->h*3600; p->m = s/60; p->s += s - p->m*60; + p->rawS = 0; p->validHMS = 1; } @@ -15456,6 +20771,7 @@ static void clearYMD_HMS_TZ(DateTime *p){ p->validTZ = 0; } +#ifndef SQLITE_OMIT_LOCALTIME /* ** On recent Windows platforms, the localtime_s() function is available ** as part of the "Secure CRT". It is essentially equivalent to @@ -15474,7 +20790,6 @@ static void clearYMD_HMS_TZ(DateTime *p){ #define HAVE_LOCALTIME_S 1 #endif -#ifndef SQLITE_OMIT_LOCALTIME /* ** The following routine implements the rough equivalent of localtime_r() ** using whatever operating-system specific localtime facility that @@ -15497,14 +20812,14 @@ static int osLocaltime(time_t *t, struct tm *pTm){ #endif sqlite3_mutex_enter(mutex); pX = localtime(t); -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0; #endif if( pX ) *pTm = *pX; sqlite3_mutex_leave(mutex); rc = pX==0; #else -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE if( sqlite3GlobalConfig.bLocaltimeFault ) return 1; #endif #if HAVE_LOCALTIME_R @@ -15575,13 +20890,38 @@ static sqlite3_int64 localtimeOffset( y.validYMD = 1; y.validHMS = 1; y.validJD = 0; + y.rawS = 0; y.validTZ = 0; + y.isError = 0; computeJD(&y); *pRc = SQLITE_OK; return y.iJD - x.iJD; } #endif /* SQLITE_OMIT_LOCALTIME */ +/* +** The following table defines various date transformations of the form +** +** 'NNN days' +** +** Where NNN is an arbitrary floating-point number and "days" can be one +** of several units of time. +*/ +static const struct { + u8 eType; /* Transformation type code */ + u8 nName; /* Length of th name */ + char *zName; /* Name of the transformation */ + double rLimit; /* Maximum NNN value for this transform */ + double rXform; /* Constant used for this transform */ +} aXformType[] = { + { 0, 6, "second", 464269060800.0, 86400000.0/(24.0*60.0*60.0) }, + { 0, 6, "minute", 7737817680.0, 86400000.0/(24.0*60.0) }, + { 0, 4, "hour", 128963628.0, 86400000.0/24.0 }, + { 0, 3, "day", 5373485.0, 86400000.0 }, + { 1, 5, "month", 176546.0, 30.0*86400000.0 }, + { 2, 4, "year", 14713.0, 365.0*86400000.0 }, +}; + /* ** Process a modifier to a date-time stamp. The modifiers are ** as follows: @@ -15606,17 +20946,15 @@ static sqlite3_int64 localtimeOffset( ** to context pCtx. If the error is an unrecognized modifier, no error is ** written to pCtx. */ -static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ +static int parseModifier( + sqlite3_context *pCtx, /* Function context */ + const char *z, /* The text of the modifier */ + int n, /* Length of zMod in bytes */ + DateTime *p /* The date/time value to be modified */ +){ int rc = 1; - int n; double r; - char *z, zBuf[30]; - z = zBuf; - for(n=0; n<ArraySize(zBuf)-1 && zMod[n]; n++){ - z[n] = (char)sqlite3UpperToLower[(u8)zMod[n]]; - } - z[n] = 0; - switch( z[0] ){ + switch(sqlite3UpperToLower[(u8)z[0]] ){ #ifndef SQLITE_OMIT_LOCALTIME case 'l': { /* localtime @@ -15624,7 +20962,7 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ ** Assuming the current time value is UTC (a.k.a. GMT), shift it to ** show local time. */ - if( strcmp(z, "localtime")==0 ){ + if( sqlite3_stricmp(z, "localtime")==0 && sqlite3NotPureFunc(pCtx) ){ computeJD(p); p->iJD += localtimeOffset(p, pCtx, &rc); clearYMD_HMS_TZ(p); @@ -15636,23 +20974,33 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ /* ** unixepoch ** - ** Treat the current value of p->iJD as the number of + ** Treat the current value of p->s as the number of ** seconds since 1970. Convert to a real julian day number. */ - if( strcmp(z, "unixepoch")==0 && p->validJD ){ - p->iJD = (p->iJD + 43200)/86400 + 21086676*(i64)10000000; - clearYMD_HMS_TZ(p); - rc = 0; + if( sqlite3_stricmp(z, "unixepoch")==0 && p->rawS ){ + r = p->s*1000.0 + 210866760000000.0; + if( r>=0.0 && r<464269060800000.0 ){ + clearYMD_HMS_TZ(p); + p->iJD = (sqlite3_int64)r; + p->validJD = 1; + p->rawS = 0; + rc = 0; + } } #ifndef SQLITE_OMIT_LOCALTIME - else if( strcmp(z, "utc")==0 ){ - sqlite3_int64 c1; - computeJD(p); - c1 = localtimeOffset(p, pCtx, &rc); - if( rc==SQLITE_OK ){ - p->iJD -= c1; - clearYMD_HMS_TZ(p); - p->iJD += c1 - localtimeOffset(p, pCtx, &rc); + else if( sqlite3_stricmp(z, "utc")==0 && sqlite3NotPureFunc(pCtx) ){ + if( p->tzSet==0 ){ + sqlite3_int64 c1; + computeJD(p); + c1 = localtimeOffset(p, pCtx, &rc); + if( rc==SQLITE_OK ){ + p->iJD -= c1; + clearYMD_HMS_TZ(p); + p->iJD += c1 - localtimeOffset(p, pCtx, &rc); + } + p->tzSet = 1; + }else{ + rc = SQLITE_OK; } } #endif @@ -15666,7 +21014,7 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ ** weekday N where 0==Sunday, 1==Monday, and so forth. If the ** date is already on the appropriate weekday, this is a no-op. */ - if( strncmp(z, "weekday ", 8)==0 + if( sqlite3_strnicmp(z, "weekday ", 8)==0 && sqlite3AtoF(&z[8], &r, sqlite3Strlen30(&z[8]), SQLITE_UTF8) && (n=(int)r)==r && n>=0 && r<7 ){ sqlite3_int64 Z; @@ -15689,23 +21037,24 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ ** Move the date backwards to the beginning of the current day, ** or month or year. */ - if( strncmp(z, "start of ", 9)!=0 ) break; + if( sqlite3_strnicmp(z, "start of ", 9)!=0 ) break; + if( !p->validJD && !p->validYMD && !p->validHMS ) break; z += 9; computeYMD(p); p->validHMS = 1; p->h = p->m = 0; p->s = 0.0; + p->rawS = 0; p->validTZ = 0; p->validJD = 0; - if( strcmp(z,"month")==0 ){ + if( sqlite3_stricmp(z,"month")==0 ){ p->D = 1; rc = 0; - }else if( strcmp(z,"year")==0 ){ - computeYMD(p); + }else if( sqlite3_stricmp(z,"year")==0 ){ p->M = 1; p->D = 1; rc = 0; - }else if( strcmp(z,"day")==0 ){ + }else if( sqlite3_stricmp(z,"day")==0 ){ rc = 0; } break; @@ -15723,6 +21072,7 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ case '8': case '9': { double rRounder; + int i; for(n=1; z[n] && z[n]!=':' && !sqlite3Isspace(z[n]); n++){} if( !sqlite3AtoF(z, &r, n, SQLITE_UTF8) ){ rc = 1; @@ -15751,46 +21101,48 @@ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){ rc = 0; break; } + + /* If control reaches this point, it means the transformation is + ** one of the forms like "+NNN days". */ z += n; while( sqlite3Isspace(*z) ) z++; n = sqlite3Strlen30(z); if( n>10 || n<3 ) break; - if( z[n-1]=='s' ){ z[n-1] = 0; n--; } + if( sqlite3UpperToLower[(u8)z[n-1]]=='s' ) n--; computeJD(p); - rc = 0; + rc = 1; rRounder = r<0 ? -0.5 : +0.5; - if( n==3 && strcmp(z,"day")==0 ){ - p->iJD += (sqlite3_int64)(r*86400000.0 + rRounder); - }else if( n==4 && strcmp(z,"hour")==0 ){ - p->iJD += (sqlite3_int64)(r*(86400000.0/24.0) + rRounder); - }else if( n==6 && strcmp(z,"minute")==0 ){ - p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0)) + rRounder); - }else if( n==6 && strcmp(z,"second")==0 ){ - p->iJD += (sqlite3_int64)(r*(86400000.0/(24.0*60.0*60.0)) + rRounder); - }else if( n==5 && strcmp(z,"month")==0 ){ - int x, y; - computeYMD_HMS(p); - p->M += (int)r; - x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; - p->Y += x; - p->M -= x*12; - p->validJD = 0; - computeJD(p); - y = (int)r; - if( y!=r ){ - p->iJD += (sqlite3_int64)((r - y)*30.0*86400000.0 + rRounder); + for(i=0; i<ArraySize(aXformType); i++){ + if( aXformType[i].nName==n + && sqlite3_strnicmp(aXformType[i].zName, z, n)==0 + && r>-aXformType[i].rLimit && r<aXformType[i].rLimit + ){ + switch( aXformType[i].eType ){ + case 1: { /* Special processing to add months */ + int x; + computeYMD_HMS(p); + p->M += (int)r; + x = p->M>0 ? (p->M-1)/12 : (p->M-12)/12; + p->Y += x; + p->M -= x*12; + p->validJD = 0; + r -= (int)r; + break; + } + case 2: { /* Special processing to add years */ + int y = (int)r; + computeYMD_HMS(p); + p->Y += y; + p->validJD = 0; + r -= (int)r; + break; + } + } + computeJD(p); + p->iJD += (sqlite3_int64)(r*aXformType[i].rXform + rRounder); + rc = 0; + break; } - }else if( n==4 && strcmp(z,"year")==0 ){ - int y = (int)r; - computeYMD_HMS(p); - p->Y += y; - p->validJD = 0; - computeJD(p); - if( y!=r ){ - p->iJD += (sqlite3_int64)((r - y)*365.0*86400000.0 + rRounder); - } - }else{ - rc = 1; } clearYMD_HMS_TZ(p); break; @@ -15817,7 +21169,7 @@ static int isDate( sqlite3_value **argv, DateTime *p ){ - int i; + int i, n; const unsigned char *z; int eType; memset(p, 0, sizeof(*p)); @@ -15826,8 +21178,7 @@ static int isDate( } if( (eType = sqlite3_value_type(argv[0]))==SQLITE_FLOAT || eType==SQLITE_INTEGER ){ - p->iJD = (sqlite3_int64)(sqlite3_value_double(argv[0])*86400000.0 + 0.5); - p->validJD = 1; + setRawDateNumber(p, sqlite3_value_double(argv[0])); }else{ z = sqlite3_value_text(argv[0]); if( !z || parseDateOrTime(context, (char*)z, p) ){ @@ -15836,8 +21187,11 @@ static int isDate( } for(i=1; i<argc; i++){ z = sqlite3_value_text(argv[i]); - if( z==0 || parseModifier(context, (char*)z, p) ) return 1; + n = sqlite3_value_bytes(argv[i]); + if( z==0 || parseModifier(context, (char*)z, n, p) ) return 1; } + computeJD(p); + if( p->isError || !validJulianDay(p->iJD) ) return 1; return 0; } @@ -16000,7 +21354,7 @@ static void strftimeFunc( sqlite3_result_error_toobig(context); return; }else{ - z = sqlite3DbMallocRaw(db, (int)n); + z = sqlite3DbMallocRawNN(db, (int)n); if( z==0 ){ sqlite3_result_error_nomem(context); return; @@ -16136,7 +21490,6 @@ static void currentTimeFunc( ){ time_t t; char *zFormat = (char *)sqlite3_user_data(context); - sqlite3 *db; sqlite3_int64 iT; struct tm *pTm; struct tm sNow; @@ -16169,29 +21522,23 @@ static void currentTimeFunc( ** external linkage. */ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ - static SQLITE_WSD FuncDef aDateTimeFuncs[] = { + static FuncDef aDateTimeFuncs[] = { #ifndef SQLITE_OMIT_DATETIME_FUNCS - FUNCTION(julianday, -1, 0, 0, juliandayFunc ), - FUNCTION(date, -1, 0, 0, dateFunc ), - FUNCTION(time, -1, 0, 0, timeFunc ), - FUNCTION(datetime, -1, 0, 0, datetimeFunc ), - FUNCTION(strftime, -1, 0, 0, strftimeFunc ), - FUNCTION(current_time, 0, 0, 0, ctimeFunc ), - FUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc), - FUNCTION(current_date, 0, 0, 0, cdateFunc ), + PURE_DATE(julianday, -1, 0, 0, juliandayFunc ), + PURE_DATE(date, -1, 0, 0, dateFunc ), + PURE_DATE(time, -1, 0, 0, timeFunc ), + PURE_DATE(datetime, -1, 0, 0, datetimeFunc ), + PURE_DATE(strftime, -1, 0, 0, strftimeFunc ), + DFUNCTION(current_time, 0, 0, 0, ctimeFunc ), + DFUNCTION(current_timestamp, 0, 0, 0, ctimestampFunc), + DFUNCTION(current_date, 0, 0, 0, cdateFunc ), #else STR_FUNCTION(current_time, 0, "%H:%M:%S", 0, currentTimeFunc), STR_FUNCTION(current_date, 0, "%Y-%m-%d", 0, currentTimeFunc), STR_FUNCTION(current_timestamp, 0, "%Y-%m-%d %H:%M:%S", 0, currentTimeFunc), #endif }; - int i; - FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); - FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aDateTimeFuncs); - - for(i=0; i<ArraySize(aDateTimeFuncs); i++){ - sqlite3FuncDefInsert(pHash, &aFunc[i]); - } + sqlite3InsertBuiltinFuncs(aDateTimeFuncs, ArraySize(aDateTimeFuncs)); } /************** End of date.c ************************************************/ @@ -16211,8 +21558,29 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ ** This file contains OS interface code that is common to all ** architectures. */ -#define _SQLITE_OS_C_ 1 -#undef _SQLITE_OS_C_ +/* #include "sqliteInt.h" */ + +/* +** If we compile with the SQLITE_TEST macro set, then the following block +** of code will give us the ability to simulate a disk I/O error. This +** is used for testing the I/O recovery logic. +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ +SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ +SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ +SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ +SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */ +SQLITE_API int sqlite3_diskfull_pending = 0; +SQLITE_API int sqlite3_diskfull = 0; +#endif /* defined(SQLITE_TEST) */ + +/* +** When testing, also keep a count of the number of open files. +*/ +#if defined(SQLITE_TEST) +SQLITE_API int sqlite3_open_file_count = 0; +#endif /* defined(SQLITE_TEST) */ /* ** The default SQLite sqlite3_vfs implementations do not allocate @@ -16221,7 +21589,7 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ ** So we test the effects of a malloc() failing and the sqlite3OsXXX() ** function returning SQLITE_IOERR_NOMEM using the DO_OS_MALLOC_TEST macro. ** -** The following functions are instrumented for malloc() failure +** The following functions are instrumented for malloc() failure ** testing: ** ** sqlite3OsRead() @@ -16241,9 +21609,9 @@ SQLITE_PRIVATE void sqlite3RegisterDateTimeFunctions(void){ #if defined(SQLITE_TEST) SQLITE_API int sqlite3_memdebug_vfs_oom_test = 1; #define DO_OS_MALLOC_TEST(x) \ - if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3IsMemJournal(x))) { \ + if (sqlite3_memdebug_vfs_oom_test && (!x || !sqlite3JournalIsInMemory(x))) { \ void *pTstAlloc = sqlite3Malloc(10); \ - if (!pTstAlloc) return SQLITE_IOERR_NOMEM; \ + if (!pTstAlloc) return SQLITE_IOERR_NOMEM_BKPT; \ sqlite3_free(pTstAlloc); \ } #else @@ -16256,13 +21624,11 @@ SQLITE_API int sqlite3_memdebug_vfs_oom_test = 1; ** of this would be completely automatic if SQLite were coded using ** C++ instead of plain old C. */ -SQLITE_PRIVATE int sqlite3OsClose(sqlite3_file *pId){ - int rc = SQLITE_OK; +SQLITE_PRIVATE void sqlite3OsClose(sqlite3_file *pId){ if( pId->pMethods ){ - rc = pId->pMethods->xClose(pId); + pId->pMethods->xClose(pId); pId->pMethods = 0; } - return rc; } SQLITE_PRIVATE int sqlite3OsRead(sqlite3_file *id, void *pBuf, int amt, i64 offset){ DO_OS_MALLOC_TEST(id); @@ -16277,7 +21643,7 @@ SQLITE_PRIVATE int sqlite3OsTruncate(sqlite3_file *id, i64 size){ } SQLITE_PRIVATE int sqlite3OsSync(sqlite3_file *id, int flags){ DO_OS_MALLOC_TEST(id); - return id->pMethods->xSync(id, flags); + return flags ? id->pMethods->xSync(id, flags) : SQLITE_OK; } SQLITE_PRIVATE int sqlite3OsFileSize(sqlite3_file *id, i64 *pSize){ DO_OS_MALLOC_TEST(id); @@ -16304,11 +21670,14 @@ SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut){ ** routine has no return value since the return value would be meaningless. */ SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ + if( id->pMethods==0 ) return SQLITE_NOTFOUND; #ifdef SQLITE_TEST - if( op!=SQLITE_FCNTL_COMMIT_PHASETWO ){ + if( op!=SQLITE_FCNTL_COMMIT_PHASETWO + && op!=SQLITE_FCNTL_LOCK_TIMEOUT + ){ /* Faults are not injected into COMMIT_PHASETWO because, assuming SQLite - ** is using a regular VFS, it is called after the corresponding - ** transaction has been committed. Injecting a fault at this point + ** is using a regular VFS, it is called after the corresponding + ** transaction has been committed. Injecting a fault at this point ** confuses the test scripts - the COMMIT comand returns SQLITE_NOMEM ** but the transaction is committed anyway. ** @@ -16322,7 +21691,7 @@ SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ return id->pMethods->xFileControl(id, op, pArg); } SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ - (void)id->pMethods->xFileControl(id, op, pArg); + if( id->pMethods ) (void)id->pMethods->xFileControl(id, op, pArg); } SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){ @@ -16332,6 +21701,7 @@ SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){ SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id){ return id->pMethods->xDeviceCharacteristics(id); } +#ifndef SQLITE_OMIT_WAL SQLITE_PRIVATE int sqlite3OsShmLock(sqlite3_file *id, int offset, int n, int flags){ return id->pMethods->xShmLock(id, offset, n, flags); } @@ -16351,6 +21721,7 @@ SQLITE_PRIVATE int sqlite3OsShmMap( DO_OS_MALLOC_TEST(id); return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); } +#endif /* SQLITE_OMIT_WAL */ #if SQLITE_MAX_MMAP_SIZE>0 /* The real implementation of xFetch and xUnfetch */ @@ -16377,10 +21748,10 @@ SQLITE_PRIVATE int sqlite3OsUnfetch(sqlite3_file *id, i64 iOff, void *p){ ** VFS methods. */ SQLITE_PRIVATE int sqlite3OsOpen( - sqlite3_vfs *pVfs, - const char *zPath, - sqlite3_file *pFile, - int flags, + sqlite3_vfs *pVfs, + const char *zPath, + sqlite3_file *pFile, + int flags, int *pFlagsOut ){ int rc; @@ -16399,18 +21770,18 @@ SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dir return pVfs->xDelete(pVfs, zPath, dirSync); } SQLITE_PRIVATE int sqlite3OsAccess( - sqlite3_vfs *pVfs, - const char *zPath, - int flags, + sqlite3_vfs *pVfs, + const char *zPath, + int flags, int *pResOut ){ DO_OS_MALLOC_TEST(0); return pVfs->xAccess(pVfs, zPath, flags, pResOut); } SQLITE_PRIVATE int sqlite3OsFullPathname( - sqlite3_vfs *pVfs, - const char *zPath, - int nPathOut, + sqlite3_vfs *pVfs, + const char *zPath, + int nPathOut, char *zPathOut ){ DO_OS_MALLOC_TEST(0); @@ -16437,6 +21808,9 @@ SQLITE_PRIVATE int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufO SQLITE_PRIVATE int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ return pVfs->xSleep(pVfs, nMicro); } +SQLITE_PRIVATE int sqlite3OsGetLastError(sqlite3_vfs *pVfs){ + return pVfs->xGetLastError ? pVfs->xGetLastError(pVfs, 0, 0) : 0; +} SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *pTimeOut){ int rc; /* IMPLEMENTATION-OF: R-49045-42493 SQLite will use the xCurrentTimeInt64() @@ -16456,13 +21830,13 @@ SQLITE_PRIVATE int sqlite3OsCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p } SQLITE_PRIVATE int sqlite3OsOpenMalloc( - sqlite3_vfs *pVfs, - const char *zFile, - sqlite3_file **ppFile, + sqlite3_vfs *pVfs, + const char *zFile, + sqlite3_file **ppFile, int flags, int *pOutFlags ){ - int rc = SQLITE_NOMEM; + int rc; sqlite3_file *pFile; pFile = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile); if( pFile ){ @@ -16472,15 +21846,15 @@ SQLITE_PRIVATE int sqlite3OsOpenMalloc( }else{ *ppFile = pFile; } + }else{ + rc = SQLITE_NOMEM_BKPT; } return rc; } -SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *pFile){ - int rc = SQLITE_OK; +SQLITE_PRIVATE void sqlite3OsCloseFree(sqlite3_file *pFile){ assert( pFile ); - rc = sqlite3OsClose(pFile); + sqlite3OsClose(pFile); sqlite3_free(pFile); - return rc; } /* @@ -16491,7 +21865,7 @@ SQLITE_PRIVATE int sqlite3OsCloseFree(sqlite3_file *pFile){ */ SQLITE_PRIVATE int sqlite3OsInit(void){ void *p = sqlite3_malloc(10); - if( p==0 ) return SQLITE_NOMEM; + if( p==0 ) return SQLITE_NOMEM_BKPT; sqlite3_free(p); return sqlite3_os_init(); } @@ -16618,8 +21992,9 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs *pVfs){ ** during a hash table resize is a benign fault. */ +/* #include "sqliteInt.h" */ -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE /* ** Global variables. @@ -16677,7 +22052,7 @@ SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ } } -#endif /* #ifndef SQLITE_OMIT_BUILTIN_TEST */ +#endif /* #ifndef SQLITE_UNTESTABLE */ /************** End of fault.c ***********************************************/ /************** Begin file mem0.c ********************************************/ @@ -16699,6 +22074,7 @@ SQLITE_PRIVATE void sqlite3EndBenignMalloc(void){ ** are merely placeholders. Real drivers must be substituted using ** sqlite3_config() before SQLite will operate. */ +/* #include "sqliteInt.h" */ /* ** This version of the memory allocator is the default. It is @@ -16785,6 +22161,7 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** be necessary when compiling for Delphi, ** for example. */ +/* #include "sqliteInt.h" */ /* ** This version of the memory allocator is the default. It is @@ -16800,7 +22177,9 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ */ #include <sys/sysctl.h> #include <malloc/malloc.h> +#ifdef SQLITE_MIGHT_BE_SINGLE_CORE #include <libkern/OSAtomic.h> +#endif /* SQLITE_MIGHT_BE_SINGLE_CORE */ static malloc_zone_t* _sqliteZone_; #define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x)) #define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x)); @@ -16868,7 +22247,9 @@ static malloc_zone_t* _sqliteZone_; */ static void *sqlite3MemMalloc(int nByte){ #ifdef SQLITE_MALLOCSIZE - void *p = SQLITE_MALLOC( nByte ); + void *p; + testcase( ROUND8(nByte)==nByte ); + p = SQLITE_MALLOC( nByte ); if( p==0 ){ testcase( sqlite3GlobalConfig.xLog!=0 ); sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); @@ -16877,7 +22258,7 @@ static void *sqlite3MemMalloc(int nByte){ #else sqlite3_int64 *p; assert( nByte>0 ); - nByte = ROUND8(nByte); + testcase( ROUND8(nByte)!=nByte ); p = SQLITE_MALLOC( nByte+8 ); if( p ){ p[0] = nByte; @@ -16915,10 +22296,11 @@ static void sqlite3MemFree(void *pPrior){ */ static int sqlite3MemSize(void *pPrior){ #ifdef SQLITE_MALLOCSIZE - return pPrior ? (int)SQLITE_MALLOCSIZE(pPrior) : 0; + assert( pPrior!=0 ); + return (int)SQLITE_MALLOCSIZE(pPrior); #else sqlite3_int64 *p; - if( pPrior==0 ) return 0; + assert( pPrior!=0 ); p = (sqlite3_int64*)pPrior; p--; return (int)p[0]; @@ -16990,19 +22372,10 @@ static int sqlite3MemInit(void *NotUsed){ }else{ /* only 1 core, use our own zone to contention over global locks, ** e.g. we have our own dedicated locks */ - bool success; - malloc_zone_t* newzone = malloc_create_zone(4096, 0); - malloc_set_zone_name(newzone, "Sqlite_Heap"); - do{ - success = OSAtomicCompareAndSwapPtrBarrier(NULL, newzone, - (void * volatile *)&_sqliteZone_); - }while(!_sqliteZone_); - if( !success ){ - /* somebody registered a zone first */ - malloc_destroy_zone(newzone); - } + _sqliteZone_ = malloc_create_zone(4096, 0); + malloc_set_zone_name(_sqliteZone_, "Sqlite_Heap"); } -#endif +#endif /* defined(__APPLE__) && !defined(SQLITE_WITHOUT_ZONEMALLOC) */ UNUSED_PARAMETER(NotUsed); return SQLITE_OK; } @@ -17060,6 +22433,7 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ ** This file contains implementations of the low-level memory allocation ** routines specified in the sqlite3_mem_methods object. */ +/* #include "sqliteInt.h" */ /* ** This version of the memory allocator is used only if the @@ -17594,6 +22968,7 @@ SQLITE_PRIVATE int sqlite3MemdebugMallocCount(){ ** This version of the memory allocation subsystem is included ** in the build only if SQLITE_ENABLE_MEMSYS3 is defined. */ +/* #include "sqliteInt.h" */ /* ** This version of the memory allocator is only built into the library @@ -18046,7 +23421,7 @@ static void memsys3FreeUnsafe(void *pOld){ */ static int memsys3Size(void *p){ Mem3Block *pBlock; - if( p==0 ) return 0; + assert( p!=0 ); pBlock = (Mem3Block*)p; assert( (pBlock[-1].u.hdr.size4x&1)!=0 ); return (pBlock[-1].u.hdr.size4x&~3)*2 - 4; @@ -18285,7 +23660,7 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){ ** ** This memory allocator uses the following algorithm: ** -** 1. All memory allocations sizes are rounded up to a power of 2. +** 1. All memory allocation sizes are rounded up to a power of 2. ** ** 2. If two adjacent free blocks are the halves of a larger block, ** then the two blocks are coalesced into the single larger block. @@ -18308,6 +23683,7 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys3(void){ ** The sqlite3_status() logic tracks the maximum values of n and M so ** that an application can, at any time, verify this constraint. */ +/* #include "sqliteInt.h" */ /* ** This version of the memory allocator is used only when @@ -18361,6 +23737,7 @@ static SQLITE_WSD struct Mem5Global { */ sqlite3_mutex *mutex; +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* ** Performance statistics */ @@ -18372,11 +23749,12 @@ static SQLITE_WSD struct Mem5Global { u32 maxOut; /* Maximum instantaneous currentOut */ u32 maxCount; /* Maximum instantaneous currentCount */ u32 maxRequest; /* Largest allocation (exclusive of internal frag) */ +#endif /* ** Lists of free blocks. aiFreelist[0] is a list of free blocks of ** size mem5.szAtom. aiFreelist[1] holds blocks of size szAtom*2. - ** and so forth. + ** aiFreelist[2] holds free blocks of size szAtom*4. And so forth. */ int aiFreelist[LOGMAX+1]; @@ -18442,9 +23820,7 @@ static void memsys5Link(int i, int iLogsize){ } /* -** If the STATIC_MEM mutex is not already held, obtain it now. The mutex -** will already be held (obtained by code in malloc.c) if -** sqlite3GlobalConfig.bMemStat is true. +** Obtain or release the mutex needed to access global data structures. */ static void memsys5Enter(void){ sqlite3_mutex_enter(mem5.mutex); @@ -18454,17 +23830,15 @@ static void memsys5Leave(void){ } /* -** Return the size of an outstanding allocation, in bytes. The -** size returned omits the 8-byte header overhead. This only -** works for chunks that are currently checked out. +** Return the size of an outstanding allocation, in bytes. +** This only works for chunks that are currently checked out. */ static int memsys5Size(void *p){ - int iSize = 0; - if( p ){ - int i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); - assert( i>=0 && i<mem5.nBlock ); - iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE)); - } + int iSize, i; + assert( p!=0 ); + i = (int)(((u8 *)p-mem5.zPool)/mem5.szAtom); + assert( i>=0 && i<mem5.nBlock ); + iSize = mem5.szAtom * (1 << (mem5.aCtrl[i]&CTRL_LOGSIZE)); return iSize; } @@ -18487,21 +23861,20 @@ static void *memsys5MallocUnsafe(int nByte){ /* nByte must be a positive */ assert( nByte>0 ); + /* No more than 1GiB per allocation */ + if( nByte > 0x40000000 ) return 0; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* Keep track of the maximum allocation request. Even unfulfilled ** requests are counted */ if( (u32)nByte>mem5.maxRequest ){ mem5.maxRequest = nByte; } +#endif - /* Abort if the requested allocation size is larger than the largest - ** power of two that we can represent using 32-bit signed integers. - */ - if( nByte > 0x40000000 ){ - return 0; - } /* Round nByte up to the next valid power of two */ - for(iFullSz=mem5.szAtom, iLogsize=0; iFullSz<nByte; iFullSz *= 2, iLogsize++){} + for(iFullSz=mem5.szAtom,iLogsize=0; iFullSz<nByte; iFullSz*=2,iLogsize++){} /* Make sure mem5.aiFreelist[iLogsize] contains at least one free ** block. If not, then split a block of the next larger power of @@ -18525,6 +23898,7 @@ static void *memsys5MallocUnsafe(int nByte){ } mem5.aCtrl[i] = iLogsize; +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) /* Update allocator performance statistics. */ mem5.nAlloc++; mem5.totalAlloc += iFullSz; @@ -18533,6 +23907,7 @@ static void *memsys5MallocUnsafe(int nByte){ mem5.currentOut += iFullSz; if( mem5.maxCount<mem5.currentCount ) mem5.maxCount = mem5.currentCount; if( mem5.maxOut<mem5.currentOut ) mem5.maxOut = mem5.currentOut; +#endif #ifdef SQLITE_DEBUG /* Make sure the allocated memory does not assume that it is set to zero @@ -18567,23 +23942,26 @@ static void memsys5FreeUnsafe(void *pOld){ mem5.aCtrl[iBlock] |= CTRL_FREE; mem5.aCtrl[iBlock+size-1] |= CTRL_FREE; + +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) assert( mem5.currentCount>0 ); assert( mem5.currentOut>=(size*mem5.szAtom) ); mem5.currentCount--; mem5.currentOut -= size*mem5.szAtom; assert( mem5.currentOut>0 || mem5.currentCount==0 ); assert( mem5.currentCount>0 || mem5.currentOut==0 ); +#endif mem5.aCtrl[iBlock] = CTRL_FREE | iLogsize; while( ALWAYS(iLogsize<LOGMAX) ){ int iBuddy; if( (iBlock>>iLogsize) & 1 ){ iBuddy = iBlock - size; + assert( iBuddy>=0 ); }else{ iBuddy = iBlock + size; + if( iBuddy>=mem5.nBlock ) break; } - assert( iBuddy>=0 ); - if( (iBuddy+(1<<iLogsize))>mem5.nBlock ) break; if( mem5.aCtrl[iBuddy]!=(CTRL_FREE | iLogsize) ) break; memsys5Unlink(iBuddy, iLogsize); iLogsize++; @@ -18658,13 +24036,11 @@ static void *memsys5Realloc(void *pPrior, int nBytes){ if( nBytes<=nOld ){ return pPrior; } - memsys5Enter(); - p = memsys5MallocUnsafe(nBytes); + p = memsys5Malloc(nBytes); if( p ){ memcpy(p, pPrior, nOld); - memsys5FreeUnsafe(pPrior); + memsys5Free(pPrior); } - memsys5Leave(); return p; } @@ -18851,6 +24227,7 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){ ** ** This file contains code that is common across all mutex implementations. */ +/* #include "sqliteInt.h" */ #if defined(SQLITE_DEBUG) && !defined(SQLITE_MUTEX_OMIT) /* @@ -18859,10 +24236,197 @@ SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetMemsys5(void){ ** allocate a mutex while the system is uninitialized. */ static SQLITE_WSD int mutexIsInit = 0; -#endif /* SQLITE_DEBUG */ +#endif /* SQLITE_DEBUG && !defined(SQLITE_MUTEX_OMIT) */ #ifndef SQLITE_MUTEX_OMIT + +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS +/* +** This block (enclosed by SQLITE_ENABLE_MULTITHREADED_CHECKS) contains +** the implementation of a wrapper around the system default mutex +** implementation (sqlite3DefaultMutex()). +** +** Most calls are passed directly through to the underlying default +** mutex implementation. Except, if a mutex is configured by calling +** sqlite3MutexWarnOnContention() on it, then if contention is ever +** encountered within xMutexEnter() a warning is emitted via sqlite3_log(). +** +** This type of mutex is used as the database handle mutex when testing +** apps that usually use SQLITE_CONFIG_MULTITHREAD mode. +*/ + +/* +** Type for all mutexes used when SQLITE_ENABLE_MULTITHREADED_CHECKS +** is defined. Variable CheckMutex.mutex is a pointer to the real mutex +** allocated by the system mutex implementation. Variable iType is usually set +** to the type of mutex requested - SQLITE_MUTEX_RECURSIVE, SQLITE_MUTEX_FAST +** or one of the static mutex identifiers. Or, if this is a recursive mutex +** that has been configured using sqlite3MutexWarnOnContention(), it is +** set to SQLITE_MUTEX_WARNONCONTENTION. +*/ +typedef struct CheckMutex CheckMutex; +struct CheckMutex { + int iType; + sqlite3_mutex *mutex; +}; + +#define SQLITE_MUTEX_WARNONCONTENTION (-1) + +/* +** Pointer to real mutex methods object used by the CheckMutex +** implementation. Set by checkMutexInit(). +*/ +static SQLITE_WSD const sqlite3_mutex_methods *pGlobalMutexMethods; + +#ifdef SQLITE_DEBUG +static int checkMutexHeld(sqlite3_mutex *p){ + return pGlobalMutexMethods->xMutexHeld(((CheckMutex*)p)->mutex); +} +static int checkMutexNotheld(sqlite3_mutex *p){ + return pGlobalMutexMethods->xMutexNotheld(((CheckMutex*)p)->mutex); +} +#endif + +/* +** Initialize and deinitialize the mutex subsystem. +*/ +static int checkMutexInit(void){ + pGlobalMutexMethods = sqlite3DefaultMutex(); + return SQLITE_OK; +} +static int checkMutexEnd(void){ + pGlobalMutexMethods = 0; + return SQLITE_OK; +} + +/* +** Allocate a mutex. +*/ +static sqlite3_mutex *checkMutexAlloc(int iType){ + static CheckMutex staticMutexes[] = { + {2, 0}, {3, 0}, {4, 0}, {5, 0}, + {6, 0}, {7, 0}, {8, 0}, {9, 0}, + {10, 0}, {11, 0}, {12, 0}, {13, 0} + }; + CheckMutex *p = 0; + + assert( SQLITE_MUTEX_RECURSIVE==1 && SQLITE_MUTEX_FAST==0 ); + if( iType<2 ){ + p = sqlite3MallocZero(sizeof(CheckMutex)); + if( p==0 ) return 0; + p->iType = iType; + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + if( iType-2>=ArraySize(staticMutexes) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + p = &staticMutexes[iType-2]; + } + + if( p->mutex==0 ){ + p->mutex = pGlobalMutexMethods->xMutexAlloc(iType); + if( p->mutex==0 ){ + if( iType<2 ){ + sqlite3_free(p); + } + p = 0; + } + } + + return (sqlite3_mutex*)p; +} + +/* +** Free a mutex. +*/ +static void checkMutexFree(sqlite3_mutex *p){ + assert( SQLITE_MUTEX_RECURSIVE<2 ); + assert( SQLITE_MUTEX_FAST<2 ); + assert( SQLITE_MUTEX_WARNONCONTENTION<2 ); + +#if SQLITE_ENABLE_API_ARMOR + if( ((CheckMutex*)p)->iType<2 ) +#endif + { + CheckMutex *pCheck = (CheckMutex*)p; + pGlobalMutexMethods->xMutexFree(pCheck->mutex); + sqlite3_free(pCheck); + } +#ifdef SQLITE_ENABLE_API_ARMOR + else{ + (void)SQLITE_MISUSE_BKPT; + } +#endif +} + +/* +** Enter the mutex. +*/ +static void checkMutexEnter(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + if( pCheck->iType==SQLITE_MUTEX_WARNONCONTENTION ){ + if( SQLITE_OK==pGlobalMutexMethods->xMutexTry(pCheck->mutex) ){ + return; + } + sqlite3_log(SQLITE_MISUSE, + "illegal multi-threaded access to database connection" + ); + } + pGlobalMutexMethods->xMutexEnter(pCheck->mutex); +} + +/* +** Enter the mutex (do not block). +*/ +static int checkMutexTry(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + return pGlobalMutexMethods->xMutexTry(pCheck->mutex); +} + +/* +** Leave the mutex. +*/ +static void checkMutexLeave(sqlite3_mutex *p){ + CheckMutex *pCheck = (CheckMutex*)p; + pGlobalMutexMethods->xMutexLeave(pCheck->mutex); +} + +sqlite3_mutex_methods const *multiThreadedCheckMutex(void){ + static const sqlite3_mutex_methods sMutex = { + checkMutexInit, + checkMutexEnd, + checkMutexAlloc, + checkMutexFree, + checkMutexEnter, + checkMutexTry, + checkMutexLeave, +#ifdef SQLITE_DEBUG + checkMutexHeld, + checkMutexNotheld +#else + 0, + 0 +#endif + }; + return &sMutex; +} + +/* +** Mark the SQLITE_MUTEX_RECURSIVE mutex passed as the only argument as +** one on which there should be no contention. +*/ +SQLITE_PRIVATE void sqlite3MutexWarnOnContention(sqlite3_mutex *p){ + if( sqlite3GlobalConfig.mutex.xMutexAlloc==checkMutexAlloc ){ + CheckMutex *pCheck = (CheckMutex*)p; + assert( pCheck->iType==SQLITE_MUTEX_RECURSIVE ); + pCheck->iType = SQLITE_MUTEX_WARNONCONTENTION; + } +} +#endif /* ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS */ + /* ** Initialize the mutex system. */ @@ -18878,15 +24442,26 @@ SQLITE_PRIVATE int sqlite3MutexInit(void){ sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex; if( sqlite3GlobalConfig.bCoreMutex ){ +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS + pFrom = multiThreadedCheckMutex(); +#else pFrom = sqlite3DefaultMutex(); +#endif }else{ pFrom = sqlite3NoopMutex(); } - memcpy(pTo, pFrom, offsetof(sqlite3_mutex_methods, xMutexAlloc)); - memcpy(&pTo->xMutexFree, &pFrom->xMutexFree, - sizeof(*pTo) - offsetof(sqlite3_mutex_methods, xMutexFree)); + pTo->xMutexInit = pFrom->xMutexInit; + pTo->xMutexEnd = pFrom->xMutexEnd; + pTo->xMutexFree = pFrom->xMutexFree; + pTo->xMutexEnter = pFrom->xMutexEnter; + pTo->xMutexTry = pFrom->xMutexTry; + pTo->xMutexLeave = pFrom->xMutexLeave; + pTo->xMutexHeld = pFrom->xMutexHeld; + pTo->xMutexNotheld = pFrom->xMutexNotheld; + sqlite3MemoryBarrier(); pTo->xMutexAlloc = pFrom->xMutexAlloc; } + assert( sqlite3GlobalConfig.mutex.xMutexInit ); rc = sqlite3GlobalConfig.mutex.xMutexInit(); #ifdef SQLITE_DEBUG @@ -18921,6 +24496,7 @@ SQLITE_API sqlite3_mutex *sqlite3_mutex_alloc(int id){ if( id<=SQLITE_MUTEX_RECURSIVE && sqlite3_initialize() ) return 0; if( id>SQLITE_MUTEX_RECURSIVE && sqlite3MutexInit() ) return 0; #endif + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); return sqlite3GlobalConfig.mutex.xMutexAlloc(id); } @@ -18929,6 +24505,7 @@ SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){ return 0; } assert( GLOBAL(int, mutexIsInit) ); + assert( sqlite3GlobalConfig.mutex.xMutexAlloc ); return sqlite3GlobalConfig.mutex.xMutexAlloc(id); } @@ -18937,6 +24514,7 @@ SQLITE_PRIVATE sqlite3_mutex *sqlite3MutexAlloc(int id){ */ SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){ if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexFree ); sqlite3GlobalConfig.mutex.xMutexFree(p); } } @@ -18947,6 +24525,7 @@ SQLITE_API void sqlite3_mutex_free(sqlite3_mutex *p){ */ SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){ if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexEnter ); sqlite3GlobalConfig.mutex.xMutexEnter(p); } } @@ -18958,6 +24537,7 @@ SQLITE_API void sqlite3_mutex_enter(sqlite3_mutex *p){ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){ int rc = SQLITE_OK; if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexTry ); return sqlite3GlobalConfig.mutex.xMutexTry(p); } return rc; @@ -18971,6 +24551,7 @@ SQLITE_API int sqlite3_mutex_try(sqlite3_mutex *p){ */ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){ if( p ){ + assert( sqlite3GlobalConfig.mutex.xMutexLeave ); sqlite3GlobalConfig.mutex.xMutexLeave(p); } } @@ -18981,9 +24562,11 @@ SQLITE_API void sqlite3_mutex_leave(sqlite3_mutex *p){ ** intended for use inside assert() statements. */ SQLITE_API int sqlite3_mutex_held(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexHeld ); return p==0 || sqlite3GlobalConfig.mutex.xMutexHeld(p); } SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ + assert( p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld ); return p==0 || sqlite3GlobalConfig.mutex.xMutexNotheld(p); } #endif @@ -19019,6 +24602,7 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex *p){ ** that does error checking on mutexes to make sure they are being ** called correctly. */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_MUTEX_OMIT @@ -19100,7 +24684,7 @@ static int debugMutexEnd(void){ return SQLITE_OK; } ** that means that a mutex could not be allocated. */ static sqlite3_mutex *debugMutexAlloc(int id){ - static sqlite3_debug_mutex aStatic[SQLITE_MUTEX_STATIC_APP3 - 1]; + static sqlite3_debug_mutex aStatic[SQLITE_MUTEX_STATIC_VFS3 - 1]; sqlite3_debug_mutex *pNew = 0; switch( id ){ case SQLITE_MUTEX_FAST: @@ -19113,8 +24697,12 @@ static sqlite3_mutex *debugMutexAlloc(int id){ break; } default: { - assert( id-2 >= 0 ); - assert( id-2 < (int)(sizeof(aStatic)/sizeof(aStatic[0])) ); +#ifdef SQLITE_ENABLE_API_ARMOR + if( id-2<0 || id-2>=ArraySize(aStatic) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif pNew = &aStatic[id-2]; pNew->id = id; break; @@ -19129,8 +24717,13 @@ static sqlite3_mutex *debugMutexAlloc(int id){ static void debugMutexFree(sqlite3_mutex *pX){ sqlite3_debug_mutex *p = (sqlite3_debug_mutex*)pX; assert( p->cnt==0 ); - assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); - sqlite3_free(p); + if( p->id==SQLITE_MUTEX_RECURSIVE || p->id==SQLITE_MUTEX_FAST ){ + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; +#endif + } } /* @@ -19213,6 +24806,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ************************************************************************* ** This file contains the C functions that implement mutexes for pthreads */ +/* #include "sqliteInt.h" */ /* ** The code in this file is only used if we are compiling threadsafe @@ -19241,17 +24835,22 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ */ struct sqlite3_mutex { pthread_mutex_t mutex; /* Mutex controlling the lock */ -#if SQLITE_MUTEX_NREF +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) int id; /* Mutex type */ +#endif +#if SQLITE_MUTEX_NREF volatile int nRef; /* Number of entrances */ volatile pthread_t owner; /* Thread that is within this mutex */ int trace; /* True to trace changes */ #endif }; #if SQLITE_MUTEX_NREF -#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0, (pthread_t)0, 0 } +# define SQLITE3_MUTEX_INITIALIZER(id) \ + {PTHREAD_MUTEX_INITIALIZER,id,0,(pthread_t)0,0} +#elif defined(SQLITE_ENABLE_API_ARMOR) +# define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER, id } #else -#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER } +#define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER } #endif /* @@ -19279,6 +24878,19 @@ static int pthreadMutexNotheld(sqlite3_mutex *p){ } #endif +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the implementation of xShmBarrier in the VFS in cases +** where SQLite is compiled without mutexes. +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) && GCC_VERSION>=4001000 + __sync_synchronize(); +#endif +} + /* ** Initialize and deinitialize the mutex subsystem. */ @@ -19304,6 +24916,9 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; } ** <li> SQLITE_MUTEX_STATIC_APP1 ** <li> SQLITE_MUTEX_STATIC_APP2 ** <li> SQLITE_MUTEX_STATIC_APP3 +** <li> SQLITE_MUTEX_STATIC_VFS1 +** <li> SQLITE_MUTEX_STATIC_VFS2 +** <li> SQLITE_MUTEX_STATIC_VFS3 ** </ul> ** ** The first two constants cause sqlite3_mutex_alloc() to create @@ -19332,15 +24947,18 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; } */ static sqlite3_mutex *pthreadMutexAlloc(int iType){ static sqlite3_mutex staticMutexes[] = { - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER + SQLITE3_MUTEX_INITIALIZER(2), + SQLITE3_MUTEX_INITIALIZER(3), + SQLITE3_MUTEX_INITIALIZER(4), + SQLITE3_MUTEX_INITIALIZER(5), + SQLITE3_MUTEX_INITIALIZER(6), + SQLITE3_MUTEX_INITIALIZER(7), + SQLITE3_MUTEX_INITIALIZER(8), + SQLITE3_MUTEX_INITIALIZER(9), + SQLITE3_MUTEX_INITIALIZER(10), + SQLITE3_MUTEX_INITIALIZER(11), + SQLITE3_MUTEX_INITIALIZER(12), + SQLITE3_MUTEX_INITIALIZER(13) }; sqlite3_mutex *p; switch( iType ){ @@ -19359,8 +24977,8 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ pthread_mutex_init(&p->mutex, &recursiveAttr); pthread_mutexattr_destroy(&recursiveAttr); #endif -#if SQLITE_MUTEX_NREF - p->id = iType; +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + p->id = SQLITE_MUTEX_RECURSIVE; #endif } break; @@ -19368,10 +24986,10 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ case SQLITE_MUTEX_FAST: { p = sqlite3MallocZero( sizeof(*p) ); if( p ){ -#if SQLITE_MUTEX_NREF - p->id = iType; -#endif pthread_mutex_init(&p->mutex, 0); +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + p->id = SQLITE_MUTEX_FAST; +#endif } break; } @@ -19383,12 +25001,12 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ } #endif p = &staticMutexes[iType-2]; -#if SQLITE_MUTEX_NREF - p->id = iType; -#endif break; } } +#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR) + assert( p==0 || p->id==iType ); +#endif return p; } @@ -19400,9 +25018,18 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){ */ static void pthreadMutexFree(sqlite3_mutex *p){ assert( p->nRef==0 ); - assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); - pthread_mutex_destroy(&p->mutex); - sqlite3_free(p); +#if SQLITE_ENABLE_API_ARMOR + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ) +#endif + { + pthread_mutex_destroy(&p->mutex); + sqlite3_free(p); + } +#ifdef SQLITE_ENABLE_API_ARMOR + else{ + (void)SQLITE_MISUSE_BKPT; + } +#endif } /* @@ -19576,6 +25203,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ************************************************************************* ** This file contains the C functions that implement mutexes for Win32. */ +/* #include "sqliteInt.h" */ #if SQLITE_OS_WIN /* @@ -19614,24 +25242,14 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." #endif -#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) -# ifndef SQLITE_DEBUG_OS_TRACE -# define SQLITE_DEBUG_OS_TRACE 0 -# endif - int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE; -# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X -#else -# define OSTRACE(X) -#endif - /* ** Macros for performance tracing. Normally turned off. Only works ** on i486 hardware. */ #ifdef SQLITE_PERFORMANCE_TRACE -/* -** hwtime.h contains inline assembler code for implementing +/* +** hwtime.h contains inline assembler code for implementing ** high-performance timing routines. */ /************** Include hwtime.h in the middle of os_common.h ****************/ @@ -19651,8 +25269,8 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. */ -#ifndef _HWTIME_H_ -#define _HWTIME_H_ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H /* ** The following routine only works on pentium-class (or newer) processors. @@ -19720,7 +25338,7 @@ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } #endif -#endif /* !defined(_HWTIME_H_) */ +#endif /* !defined(SQLITE_HWTIME_H) */ /************** End of hwtime.h **********************************************/ /************** Continuing where we left off in os_common.h ******************/ @@ -19741,14 +25359,14 @@ static sqlite_uint64 g_elapsed; ** of code will give us the ability to simulate a disk I/O error. This ** is used for testing the I/O recovery logic. */ -#ifdef SQLITE_TEST -SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ -SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ -SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ -SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ -SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */ -SQLITE_API int sqlite3_diskfull_pending = 0; -SQLITE_API int sqlite3_diskfull = 0; +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) #define SimulateIOError(CODE) \ if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ @@ -19774,17 +25392,17 @@ static void local_ioerr(){ #define SimulateIOErrorBenign(X) #define SimulateIOError(A) #define SimulateDiskfullError(A) -#endif +#endif /* defined(SQLITE_TEST) */ /* ** When testing, keep a count of the number of open files. */ -#ifdef SQLITE_TEST -SQLITE_API int sqlite3_open_file_count = 0; +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; #define OpenCounter(X) sqlite3_open_file_count+=(X) #else #define OpenCounter(X) -#endif +#endif /* defined(SQLITE_TEST) */ #endif /* !defined(_OS_COMMON_H_) */ @@ -19810,8 +25428,8 @@ SQLITE_API int sqlite3_open_file_count = 0; ** ** This file contains code that is specific to Windows. */ -#ifndef _OS_WIN_H_ -#define _OS_WIN_H_ +#ifndef SQLITE_OS_WIN_H +#define SQLITE_OS_WIN_H /* ** Include the primary Windows SDK header file. @@ -19872,7 +25490,18 @@ SQLITE_API int sqlite3_open_file_count = 0; # define SQLITE_WIN32_VOLATILE volatile #endif -#endif /* _OS_WIN_H_ */ +/* +** For some Windows sub-platforms, the _beginthreadex() / _endthreadex() +** functions are not available (e.g. those not using MSVC, Cygwin, etc). +*/ +#if SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && \ + SQLITE_THREADSAFE>0 && !defined(__CYGWIN__) +# define SQLITE_OS_WIN_THREADS 1 +#else +# define SQLITE_OS_WIN_THREADS 0 +#endif + +#endif /* SQLITE_OS_WIN_H */ /************** End of os_win.h **********************************************/ /************** Continuing where we left off in mutex_w32.c ******************/ @@ -19893,7 +25522,7 @@ struct sqlite3_mutex { #ifdef SQLITE_DEBUG volatile int nRef; /* Number of enterances */ volatile DWORD owner; /* Thread holding this mutex */ - volatile int trace; /* True to trace changes */ + volatile LONG trace; /* True to trace changes */ #endif }; @@ -19905,10 +25534,10 @@ struct sqlite3_mutex { #define SQLITE_W32_MUTEX_INITIALIZER { 0 } #ifdef SQLITE_DEBUG -#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, \ +#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id, \ 0L, (DWORD)0, 0 } #else -#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0 } +#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id } #endif #ifdef SQLITE_DEBUG @@ -19930,19 +25559,39 @@ static int winMutexNotheld(sqlite3_mutex *p){ } #endif +/* +** Try to provide a memory barrier operation, needed for initialization +** and also for the xShmBarrier method of the VFS in cases when SQLite is +** compiled without mutexes (SQLITE_THREADSAFE=0). +*/ +SQLITE_PRIVATE void sqlite3MemoryBarrier(void){ +#if defined(SQLITE_MEMORY_BARRIER) + SQLITE_MEMORY_BARRIER; +#elif defined(__GNUC__) + __sync_synchronize(); +#elif MSVC_VERSION>=1300 + _ReadWriteBarrier(); +#elif defined(MemoryBarrier) + MemoryBarrier(); +#endif +} + /* ** Initialize and deinitialize the mutex subsystem. */ static sqlite3_mutex winMutex_staticMutexes[] = { - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER, - SQLITE3_MUTEX_INITIALIZER + SQLITE3_MUTEX_INITIALIZER(2), + SQLITE3_MUTEX_INITIALIZER(3), + SQLITE3_MUTEX_INITIALIZER(4), + SQLITE3_MUTEX_INITIALIZER(5), + SQLITE3_MUTEX_INITIALIZER(6), + SQLITE3_MUTEX_INITIALIZER(7), + SQLITE3_MUTEX_INITIALIZER(8), + SQLITE3_MUTEX_INITIALIZER(9), + SQLITE3_MUTEX_INITIALIZER(10), + SQLITE3_MUTEX_INITIALIZER(11), + SQLITE3_MUTEX_INITIALIZER(12), + SQLITE3_MUTEX_INITIALIZER(13) }; static int winMutex_isInit = 0; @@ -20013,6 +25662,9 @@ static int winMutexEnd(void){ ** <li> SQLITE_MUTEX_STATIC_APP1 ** <li> SQLITE_MUTEX_STATIC_APP2 ** <li> SQLITE_MUTEX_STATIC_APP3 +** <li> SQLITE_MUTEX_STATIC_VFS1 +** <li> SQLITE_MUTEX_STATIC_VFS2 +** <li> SQLITE_MUTEX_STATIC_VFS3 ** </ul> ** ** The first two constants cause sqlite3_mutex_alloc() to create @@ -20047,8 +25699,8 @@ static sqlite3_mutex *winMutexAlloc(int iType){ case SQLITE_MUTEX_RECURSIVE: { p = sqlite3MallocZero( sizeof(*p) ); if( p ){ -#ifdef SQLITE_DEBUG p->id = iType; +#ifdef SQLITE_DEBUG #ifdef SQLITE_WIN32_MUTEX_TRACE_DYNAMIC p->trace = 1; #endif @@ -20068,19 +25720,16 @@ static sqlite3_mutex *winMutexAlloc(int iType){ return 0; } #endif - assert( iType-2 >= 0 ); - assert( iType-2 < ArraySize(winMutex_staticMutexes) ); - assert( winMutex_isInit==1 ); p = &winMutex_staticMutexes[iType-2]; #ifdef SQLITE_DEBUG - p->id = iType; #ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC - p->trace = 1; + InterlockedCompareExchange(&p->trace, 1, 0); #endif #endif break; } } + assert( p==0 || p->id==iType ); return p; } @@ -20092,13 +25741,15 @@ static sqlite3_mutex *winMutexAlloc(int iType){ */ static void winMutexFree(sqlite3_mutex *p){ assert( p ); -#ifdef SQLITE_DEBUG assert( p->nRef==0 && p->owner==0 ); - assert( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ); + if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE ){ + DeleteCriticalSection(&p->mutex); + sqlite3_free(p); + }else{ +#ifdef SQLITE_ENABLE_API_ARMOR + (void)SQLITE_MISUSE_BKPT; #endif - assert( winMutex_isInit==1 ); - DeleteCriticalSection(&p->mutex); - sqlite3_free(p); + } } /* @@ -20129,8 +25780,8 @@ static void winMutexEnter(sqlite3_mutex *p){ p->owner = tid; p->nRef++; if( p->trace ){ - OSTRACE(("ENTER-MUTEX tid=%lu, mutex=%p (%d), nRef=%d\n", - tid, p, p->trace, p->nRef)); + OSTRACE(("ENTER-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", + tid, p->id, p, p->trace, p->nRef)); } #endif } @@ -20172,8 +25823,8 @@ static int winMutexTry(sqlite3_mutex *p){ #endif #ifdef SQLITE_DEBUG if( p->trace ){ - OSTRACE(("TRY-MUTEX tid=%lu, mutex=%p (%d), owner=%lu, nRef=%d, rc=%s\n", - tid, p, p->trace, p->owner, p->nRef, sqlite3ErrName(rc))); + OSTRACE(("TRY-MUTEX tid=%lu, mutex(%d)=%p (%d), owner=%lu, nRef=%d, rc=%s\n", + tid, p->id, p, p->trace, p->owner, p->nRef, sqlite3ErrName(rc))); } #endif return rc; @@ -20201,8 +25852,8 @@ static void winMutexLeave(sqlite3_mutex *p){ LeaveCriticalSection(&p->mutex); #ifdef SQLITE_DEBUG if( p->trace ){ - OSTRACE(("LEAVE-MUTEX tid=%lu, mutex=%p (%d), nRef=%d\n", - tid, p, p->trace, p->nRef)); + OSTRACE(("LEAVE-MUTEX tid=%lu, mutex(%d)=%p (%d), nRef=%d\n", + tid, p->id, p, p->trace, p->nRef)); } #endif } @@ -20245,6 +25896,7 @@ SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ ** ** Memory allocation functions used throughout sqlite. */ +/* #include "sqliteInt.h" */ /* #include <stdarg.h> */ /* @@ -20264,93 +25916,44 @@ SQLITE_API int sqlite3_release_memory(int n){ #endif } -/* -** An instance of the following object records the location of -** each unused scratch buffer. -*/ -typedef struct ScratchFreeslot { - struct ScratchFreeslot *pNext; /* Next unused scratch buffer */ -} ScratchFreeslot; - /* ** State information local to the memory allocation subsystem. */ static SQLITE_WSD struct Mem0Global { sqlite3_mutex *mutex; /* Mutex to serialize access */ - - /* - ** The alarm callback and its arguments. The mem0.mutex lock will - ** be held while the callback is running. Recursive calls into - ** the memory subsystem are allowed, but no new callbacks will be - ** issued. - */ - sqlite3_int64 alarmThreshold; - void (*alarmCallback)(void*, sqlite3_int64,int); - void *alarmArg; - - /* - ** Pointers to the end of sqlite3GlobalConfig.pScratch memory - ** (so that a range test can be used to determine if an allocation - ** being freed came from pScratch) and a pointer to the list of - ** unused scratch allocations. - */ - void *pScratchEnd; - ScratchFreeslot *pScratchFree; - u32 nScratchFree; + sqlite3_int64 alarmThreshold; /* The soft heap limit */ /* ** True if heap is nearly "full" where "full" is defined by the ** sqlite3_soft_heap_limit() setting. */ int nearlyFull; -} mem0 = { 0, 0, 0, 0, 0, 0, 0, 0 }; +} mem0 = { 0, 0, 0 }; #define mem0 GLOBAL(struct Mem0Global, mem0) /* -** This routine runs when the memory allocator sees that the -** total memory allocation is about to exceed the soft heap -** limit. +** Return the memory allocator mutex. sqlite3_status() needs it. */ -static void softHeapLimitEnforcer( - void *NotUsed, - sqlite3_int64 NotUsed2, - int allocSize -){ - UNUSED_PARAMETER2(NotUsed, NotUsed2); - sqlite3_release_memory(allocSize); -} - -/* -** Change the alarm callback -*/ -static int sqlite3MemoryAlarm( - void(*xCallback)(void *pArg, sqlite3_int64 used,int N), - void *pArg, - sqlite3_int64 iThreshold -){ - int nUsed; - sqlite3_mutex_enter(mem0.mutex); - mem0.alarmCallback = xCallback; - mem0.alarmArg = pArg; - mem0.alarmThreshold = iThreshold; - nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); - mem0.nearlyFull = (iThreshold>0 && iThreshold<=nUsed); - sqlite3_mutex_leave(mem0.mutex); - return SQLITE_OK; +SQLITE_PRIVATE sqlite3_mutex *sqlite3MallocMutex(void){ + return mem0.mutex; } #ifndef SQLITE_OMIT_DEPRECATED /* -** Deprecated external interface. Internal/core SQLite code -** should call sqlite3MemoryAlarm. +** Deprecated external interface. It used to set an alarm callback +** that was invoked when memory usage grew too large. Now it is a +** no-op. */ SQLITE_API int sqlite3_memory_alarm( void(*xCallback)(void *pArg, sqlite3_int64 used,int N), void *pArg, sqlite3_int64 iThreshold ){ - return sqlite3MemoryAlarm(xCallback, pArg, iThreshold); + (void)xCallback; + (void)pArg; + (void)iThreshold; + return SQLITE_OK; } #endif @@ -20361,19 +25964,21 @@ SQLITE_API int sqlite3_memory_alarm( SQLITE_API sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ sqlite3_int64 priorLimit; sqlite3_int64 excess; + sqlite3_int64 nUsed; #ifndef SQLITE_OMIT_AUTOINIT int rc = sqlite3_initialize(); if( rc ) return -1; #endif sqlite3_mutex_enter(mem0.mutex); priorLimit = mem0.alarmThreshold; - sqlite3_mutex_leave(mem0.mutex); - if( n<0 ) return priorLimit; - if( n>0 ){ - sqlite3MemoryAlarm(softHeapLimitEnforcer, 0, n); - }else{ - sqlite3MemoryAlarm(0, 0, 0); + if( n<0 ){ + sqlite3_mutex_leave(mem0.mutex); + return priorLimit; } + mem0.alarmThreshold = n; + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + mem0.nearlyFull = (n>0 && n<=nUsed); + sqlite3_mutex_leave(mem0.mutex); excess = sqlite3_memory_used() - n; if( excess>0 ) sqlite3_release_memory((int)(excess & 0x7fffffff)); return priorLimit; @@ -20387,42 +25992,20 @@ SQLITE_API void sqlite3_soft_heap_limit(int n){ ** Initialize the memory allocation subsystem. */ SQLITE_PRIVATE int sqlite3MallocInit(void){ + int rc; if( sqlite3GlobalConfig.m.xMalloc==0 ){ sqlite3MemSetDefault(); } memset(&mem0, 0, sizeof(mem0)); - if( sqlite3GlobalConfig.bCoreMutex ){ - mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); - } - if( sqlite3GlobalConfig.pScratch && sqlite3GlobalConfig.szScratch>=100 - && sqlite3GlobalConfig.nScratch>0 ){ - int i, n, sz; - ScratchFreeslot *pSlot; - sz = ROUNDDOWN8(sqlite3GlobalConfig.szScratch); - sqlite3GlobalConfig.szScratch = sz; - pSlot = (ScratchFreeslot*)sqlite3GlobalConfig.pScratch; - n = sqlite3GlobalConfig.nScratch; - mem0.pScratchFree = pSlot; - mem0.nScratchFree = n; - for(i=0; i<n-1; i++){ - pSlot->pNext = (ScratchFreeslot*)(sz+(char*)pSlot); - pSlot = pSlot->pNext; - } - pSlot->pNext = 0; - mem0.pScratchEnd = (void*)&pSlot[1]; - }else{ - mem0.pScratchEnd = 0; - sqlite3GlobalConfig.pScratch = 0; - sqlite3GlobalConfig.szScratch = 0; - sqlite3GlobalConfig.nScratch = 0; - } + mem0.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); if( sqlite3GlobalConfig.pPage==0 || sqlite3GlobalConfig.szPage<512 - || sqlite3GlobalConfig.nPage<1 ){ + || sqlite3GlobalConfig.nPage<=0 ){ sqlite3GlobalConfig.pPage = 0; sqlite3GlobalConfig.szPage = 0; - sqlite3GlobalConfig.nPage = 0; } - return sqlite3GlobalConfig.m.xInit(sqlite3GlobalConfig.m.pAppData); + rc = sqlite3GlobalConfig.m.xInit(sqlite3GlobalConfig.m.pAppData); + if( rc!=SQLITE_OK ) memset(&mem0, 0, sizeof(mem0)); + return rc; } /* @@ -20448,10 +26031,8 @@ SQLITE_PRIVATE void sqlite3MallocEnd(void){ ** Return the amount of memory currently checked out. */ SQLITE_API sqlite3_int64 sqlite3_memory_used(void){ - int n, mx; - sqlite3_int64 res; - sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, 0); - res = (sqlite3_int64)n; /* Work around bug in Borland C. Ticket #3216 */ + sqlite3_int64 res, mx; + sqlite3_status64(SQLITE_STATUS_MEMORY_USED, &res, &mx, 0); return res; } @@ -20461,44 +26042,48 @@ SQLITE_API sqlite3_int64 sqlite3_memory_used(void){ ** or since the most recent reset. */ SQLITE_API sqlite3_int64 sqlite3_memory_highwater(int resetFlag){ - int n, mx; - sqlite3_int64 res; - sqlite3_status(SQLITE_STATUS_MEMORY_USED, &n, &mx, resetFlag); - res = (sqlite3_int64)mx; /* Work around bug in Borland C. Ticket #3216 */ - return res; + sqlite3_int64 res, mx; + sqlite3_status64(SQLITE_STATUS_MEMORY_USED, &res, &mx, resetFlag); + return mx; } /* ** Trigger the alarm */ static void sqlite3MallocAlarm(int nByte){ - void (*xCallback)(void*,sqlite3_int64,int); - sqlite3_int64 nowUsed; - void *pArg; - if( mem0.alarmCallback==0 ) return; - xCallback = mem0.alarmCallback; - nowUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); - pArg = mem0.alarmArg; - mem0.alarmCallback = 0; + if( mem0.alarmThreshold<=0 ) return; sqlite3_mutex_leave(mem0.mutex); - xCallback(pArg, nowUsed, nByte); + sqlite3_release_memory(nByte); sqlite3_mutex_enter(mem0.mutex); - mem0.alarmCallback = xCallback; - mem0.alarmArg = pArg; } /* ** Do a memory allocation with statistics and alarms. Assume the ** lock is already held. */ -static int mallocWithAlarm(int n, void **pp){ - int nFull; +static void mallocWithAlarm(int n, void **pp){ void *p; + int nFull; assert( sqlite3_mutex_held(mem0.mutex) ); + assert( n>0 ); + + /* In Firefox (circa 2017-02-08), xRoundup() is remapped to an internal + ** implementation of malloc_good_size(), which must be called in debug + ** mode and specifically when the DMD "Dark Matter Detector" is enabled + ** or else a crash results. Hence, do not attempt to optimize out the + ** following xRoundup() call. */ nFull = sqlite3GlobalConfig.m.xRoundup(n); - sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, n); - if( mem0.alarmCallback!=0 ){ - int nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + +#ifdef SQLITE_MAX_MEMORY + if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED)+nFull>SQLITE_MAX_MEMORY ){ + *pp = 0; + return; + } +#endif + + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, n); + if( mem0.alarmThreshold>0 ){ + sqlite3_int64 nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); if( nUsed >= mem0.alarmThreshold - nFull ){ mem0.nearlyFull = 1; sqlite3MallocAlarm(nFull); @@ -20508,18 +26093,17 @@ static int mallocWithAlarm(int n, void **pp){ } p = sqlite3GlobalConfig.m.xMalloc(nFull); #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT - if( p==0 && mem0.alarmCallback ){ + if( p==0 && mem0.alarmThreshold>0 ){ sqlite3MallocAlarm(nFull); p = sqlite3GlobalConfig.m.xMalloc(nFull); } #endif if( p ){ nFull = sqlite3MallocSize(p); - sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nFull); - sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, 1); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nFull); + sqlite3StatusUp(SQLITE_STATUS_MALLOC_COUNT, 1); } *pp = p; - return nFull; } /* @@ -20564,111 +26148,12 @@ SQLITE_API void *sqlite3_malloc64(sqlite3_uint64 n){ return sqlite3Malloc(n); } -/* -** Each thread may only have a single outstanding allocation from -** xScratchMalloc(). We verify this constraint in the single-threaded -** case by setting scratchAllocOut to 1 when an allocation -** is outstanding clearing it when the allocation is freed. -*/ -#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) -static int scratchAllocOut = 0; -#endif - - -/* -** Allocate memory that is to be used and released right away. -** This routine is similar to alloca() in that it is not intended -** for situations where the memory might be held long-term. This -** routine is intended to get memory to old large transient data -** structures that would not normally fit on the stack of an -** embedded processor. -*/ -SQLITE_PRIVATE void *sqlite3ScratchMalloc(int n){ - void *p; - assert( n>0 ); - - sqlite3_mutex_enter(mem0.mutex); - sqlite3StatusSet(SQLITE_STATUS_SCRATCH_SIZE, n); - if( mem0.nScratchFree && sqlite3GlobalConfig.szScratch>=n ){ - p = mem0.pScratchFree; - mem0.pScratchFree = mem0.pScratchFree->pNext; - mem0.nScratchFree--; - sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, 1); - sqlite3_mutex_leave(mem0.mutex); - }else{ - sqlite3_mutex_leave(mem0.mutex); - p = sqlite3Malloc(n); - if( sqlite3GlobalConfig.bMemstat && p ){ - sqlite3_mutex_enter(mem0.mutex); - sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, sqlite3MallocSize(p)); - sqlite3_mutex_leave(mem0.mutex); - } - sqlite3MemdebugSetType(p, MEMTYPE_SCRATCH); - } - assert( sqlite3_mutex_notheld(mem0.mutex) ); - - -#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) - /* EVIDENCE-OF: R-12970-05880 SQLite will not use more than one scratch - ** buffers per thread. - ** - ** This can only be checked in single-threaded mode. - */ - assert( scratchAllocOut==0 ); - if( p ) scratchAllocOut++; -#endif - - return p; -} -SQLITE_PRIVATE void sqlite3ScratchFree(void *p){ - if( p ){ - -#if SQLITE_THREADSAFE==0 && !defined(NDEBUG) - /* Verify that no more than two scratch allocation per thread - ** is outstanding at one time. (This is only checked in the - ** single-threaded case since checking in the multi-threaded case - ** would be much more complicated.) */ - assert( scratchAllocOut>=1 && scratchAllocOut<=2 ); - scratchAllocOut--; -#endif - - if( p>=sqlite3GlobalConfig.pScratch && p<mem0.pScratchEnd ){ - /* Release memory from the SQLITE_CONFIG_SCRATCH allocation */ - ScratchFreeslot *pSlot; - pSlot = (ScratchFreeslot*)p; - sqlite3_mutex_enter(mem0.mutex); - pSlot->pNext = mem0.pScratchFree; - mem0.pScratchFree = pSlot; - mem0.nScratchFree++; - assert( mem0.nScratchFree <= (u32)sqlite3GlobalConfig.nScratch ); - sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_USED, -1); - sqlite3_mutex_leave(mem0.mutex); - }else{ - /* Release memory back to the heap */ - assert( sqlite3MemdebugHasType(p, MEMTYPE_SCRATCH) ); - assert( sqlite3MemdebugNoType(p, ~MEMTYPE_SCRATCH) ); - sqlite3MemdebugSetType(p, MEMTYPE_HEAP); - if( sqlite3GlobalConfig.bMemstat ){ - int iSize = sqlite3MallocSize(p); - sqlite3_mutex_enter(mem0.mutex); - sqlite3StatusAdd(SQLITE_STATUS_SCRATCH_OVERFLOW, -iSize); - sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -iSize); - sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1); - sqlite3GlobalConfig.m.xFree(p); - sqlite3_mutex_leave(mem0.mutex); - }else{ - sqlite3GlobalConfig.m.xFree(p); - } - } - } -} - /* ** TRUE if p is a lookaside memory allocation from db */ #ifndef SQLITE_OMIT_LOOKASIDE static int isLookaside(sqlite3 *db, void *p){ - return p>=db->lookaside.pStart && p<db->lookaside.pEnd; + return SQLITE_WITHIN(p, db->lookaside.pStart, db->lookaside.pEnd); } #else #define isLookaside(A,B) 0 @@ -20683,25 +26168,27 @@ SQLITE_PRIVATE int sqlite3MallocSize(void *p){ return sqlite3GlobalConfig.m.xSize(p); } SQLITE_PRIVATE int sqlite3DbMallocSize(sqlite3 *db, void *p){ - if( db==0 ){ - assert( sqlite3MemdebugNoType(p, ~MEMTYPE_HEAP) ); - assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); - return sqlite3MallocSize(p); - }else{ - assert( sqlite3_mutex_held(db->mutex) ); - if( isLookaside(db, p) ){ - return db->lookaside.sz; + assert( p!=0 ); + if( db==0 || !isLookaside(db,p) ){ +#ifdef SQLITE_DEBUG + if( db==0 ){ + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); }else{ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); - assert( sqlite3MemdebugNoType(p, ~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); - return sqlite3GlobalConfig.m.xSize(p); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); } +#endif + return sqlite3GlobalConfig.m.xSize(p); + }else{ + assert( sqlite3_mutex_held(db->mutex) ); + return db->lookaside.sz; } } SQLITE_API sqlite3_uint64 sqlite3_msize(void *p){ - assert( sqlite3MemdebugNoType(p, ~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); - return (sqlite3_uint64)sqlite3GlobalConfig.m.xSize(p); + return p ? sqlite3GlobalConfig.m.xSize(p) : 0; } /* @@ -20710,11 +26197,11 @@ SQLITE_API sqlite3_uint64 sqlite3_msize(void *p){ SQLITE_API void sqlite3_free(void *p){ if( p==0 ) return; /* IMP: R-49053-54554 */ assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); - assert( sqlite3MemdebugNoType(p, ~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); if( sqlite3GlobalConfig.bMemstat ){ sqlite3_mutex_enter(mem0.mutex); - sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, -sqlite3MallocSize(p)); - sqlite3StatusAdd(SQLITE_STATUS_MALLOC_COUNT, -1); + sqlite3StatusDown(SQLITE_STATUS_MEMORY_USED, sqlite3MallocSize(p)); + sqlite3StatusDown(SQLITE_STATUS_MALLOC_COUNT, 1); sqlite3GlobalConfig.m.xFree(p); sqlite3_mutex_leave(mem0.mutex); }else{ @@ -20732,11 +26219,12 @@ static SQLITE_NOINLINE void measureAllocationSize(sqlite3 *db, void *p){ /* ** Free memory that might be associated with a particular database -** connection. +** connection. Calling sqlite3DbFree(D,X) for X==0 is a harmless no-op. +** The sqlite3DbFreeNN(D,X) version requires that X be non-NULL. */ -SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){ +SQLITE_PRIVATE void sqlite3DbFreeNN(sqlite3 *db, void *p){ assert( db==0 || sqlite3_mutex_held(db->mutex) ); - if( p==0 ) return; + assert( p!=0 ); if( db ){ if( db->pnBytesFreed ){ measureAllocationSize(db, p); @@ -20744,22 +26232,25 @@ SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){ } if( isLookaside(db, p) ){ LookasideSlot *pBuf = (LookasideSlot*)p; -#if SQLITE_DEBUG +#ifdef SQLITE_DEBUG /* Trash all content in the buffer being freed */ memset(p, 0xaa, db->lookaside.sz); #endif pBuf->pNext = db->lookaside.pFree; db->lookaside.pFree = pBuf; - db->lookaside.nOut--; return; } } assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); - assert( sqlite3MemdebugNoType(p, ~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); assert( db!=0 || sqlite3MemdebugNoType(p, MEMTYPE_LOOKASIDE) ); sqlite3MemdebugSetType(p, MEMTYPE_HEAP); sqlite3_free(p); } +SQLITE_PRIVATE void sqlite3DbFree(sqlite3 *db, void *p){ + assert( db==0 || sqlite3_mutex_held(db->mutex) ); + if( p ) sqlite3DbFreeNN(db, p); +} /* ** Change the size of an existing memory allocation @@ -20768,7 +26259,7 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ int nOld, nNew, nDiff; void *pNew; assert( sqlite3MemdebugHasType(pOld, MEMTYPE_HEAP) ); - assert( sqlite3MemdebugNoType(pOld, ~MEMTYPE_HEAP) ); + assert( sqlite3MemdebugNoType(pOld, (u8)~MEMTYPE_HEAP) ); if( pOld==0 ){ return sqlite3Malloc(nBytes); /* IMP: R-04300-56712 */ } @@ -20789,20 +26280,20 @@ SQLITE_PRIVATE void *sqlite3Realloc(void *pOld, u64 nBytes){ pNew = pOld; }else if( sqlite3GlobalConfig.bMemstat ){ sqlite3_mutex_enter(mem0.mutex); - sqlite3StatusSet(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); + sqlite3StatusHighwater(SQLITE_STATUS_MALLOC_SIZE, (int)nBytes); nDiff = nNew - nOld; - if( sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= + if( nDiff>0 && sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED) >= mem0.alarmThreshold-nDiff ){ sqlite3MallocAlarm(nDiff); } pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); - if( pNew==0 && mem0.alarmCallback ){ + if( pNew==0 && mem0.alarmThreshold>0 ){ sqlite3MallocAlarm((int)nBytes); pNew = sqlite3GlobalConfig.m.xRealloc(pOld, nNew); } if( pNew ){ nNew = sqlite3MallocSize(pNew); - sqlite3StatusAdd(SQLITE_STATUS_MEMORY_USED, nNew-nOld); + sqlite3StatusUp(SQLITE_STATUS_MEMORY_USED, nNew-nOld); } sqlite3_mutex_leave(mem0.mutex); }else{ @@ -20847,16 +26338,31 @@ SQLITE_PRIVATE void *sqlite3MallocZero(u64 n){ ** the mallocFailed flag in the connection pointer. */ SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, u64 n){ - void *p = sqlite3DbMallocRaw(db, n); - if( p ){ - memset(p, 0, (size_t)n); - } + void *p; + testcase( db==0 ); + p = sqlite3DbMallocRaw(db, n); + if( p ) memset(p, 0, (size_t)n); + return p; +} + + +/* Finish the work of sqlite3DbMallocRawNN for the unusual and +** slower case when the allocation cannot be fulfilled using lookaside. +*/ +static SQLITE_NOINLINE void *dbMallocRawFinish(sqlite3 *db, u64 n){ + void *p; + assert( db!=0 ); + p = sqlite3Malloc(n); + if( !p ) sqlite3OomFault(db); + sqlite3MemdebugSetType(p, + (db->lookaside.bDisable==0) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP); return p; } /* -** Allocate and zero memory. If the allocation fails, make -** the mallocFailed flag in the connection pointer. +** Allocate memory, either lookaside (if possible) or heap. +** If the allocation fails, set the mallocFailed flag in +** the connection pointer. ** ** If db!=0 and db->mallocFailed is true (indicating a prior malloc ** failure on the same database connection) then always return 0. @@ -20871,78 +26377,87 @@ SQLITE_PRIVATE void *sqlite3DbMallocZero(sqlite3 *db, u64 n){ ** ** In other words, if a subsequent malloc (ex: "b") worked, it is assumed ** that all prior mallocs (ex: "a") worked too. +** +** The sqlite3MallocRawNN() variant guarantees that the "db" parameter is +** not a NULL pointer. */ SQLITE_PRIVATE void *sqlite3DbMallocRaw(sqlite3 *db, u64 n){ void *p; - assert( db==0 || sqlite3_mutex_held(db->mutex) ); - assert( db==0 || db->pnBytesFreed==0 ); + if( db ) return sqlite3DbMallocRawNN(db, n); + p = sqlite3Malloc(n); + sqlite3MemdebugSetType(p, MEMTYPE_HEAP); + return p; +} +SQLITE_PRIVATE void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ #ifndef SQLITE_OMIT_LOOKASIDE - if( db ){ - LookasideSlot *pBuf; - if( db->mallocFailed ){ - return 0; - } - if( db->lookaside.bEnabled ){ - if( n>db->lookaside.sz ){ - db->lookaside.anStat[1]++; - }else if( (pBuf = db->lookaside.pFree)==0 ){ - db->lookaside.anStat[2]++; - }else{ - db->lookaside.pFree = pBuf->pNext; - db->lookaside.nOut++; - db->lookaside.anStat[0]++; - if( db->lookaside.nOut>db->lookaside.mxOut ){ - db->lookaside.mxOut = db->lookaside.nOut; - } - return (void*)pBuf; - } + LookasideSlot *pBuf; + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( db->lookaside.bDisable==0 ){ + assert( db->mallocFailed==0 ); + if( n>db->lookaside.sz ){ + db->lookaside.anStat[1]++; + }else if( (pBuf = db->lookaside.pFree)!=0 ){ + db->lookaside.pFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pInit)!=0 ){ + db->lookaside.pInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else{ + db->lookaside.anStat[2]++; } + }else if( db->mallocFailed ){ + return 0; } #else - if( db && db->mallocFailed ){ + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); + assert( db->pnBytesFreed==0 ); + if( db->mallocFailed ){ return 0; } #endif - p = sqlite3Malloc(n); - if( !p && db ){ - db->mallocFailed = 1; - } - sqlite3MemdebugSetType(p, - (db && db->lookaside.bEnabled) ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP); - return p; + return dbMallocRawFinish(db, n); } +/* Forward declaration */ +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n); + /* ** Resize the block of memory pointed to by p to n bytes. If the ** resize fails, set the mallocFailed flag in the connection object. */ SQLITE_PRIVATE void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){ + assert( db!=0 ); + if( p==0 ) return sqlite3DbMallocRawNN(db, n); + assert( sqlite3_mutex_held(db->mutex) ); + if( isLookaside(db,p) && n<=db->lookaside.sz ) return p; + return dbReallocFinish(db, p, n); +} +static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ void *pNew = 0; assert( db!=0 ); - assert( sqlite3_mutex_held(db->mutex) ); + assert( p!=0 ); if( db->mallocFailed==0 ){ - if( p==0 ){ - return sqlite3DbMallocRaw(db, n); - } if( isLookaside(db, p) ){ - if( n<=db->lookaside.sz ){ - return p; - } - pNew = sqlite3DbMallocRaw(db, n); + pNew = sqlite3DbMallocRawNN(db, n); if( pNew ){ memcpy(pNew, p, db->lookaside.sz); sqlite3DbFree(db, p); } }else{ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); - assert( sqlite3MemdebugNoType(p, ~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); + assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); sqlite3MemdebugSetType(p, MEMTYPE_HEAP); pNew = sqlite3_realloc64(p, n); if( !pNew ){ - db->mallocFailed = 1; + sqlite3OomFault(db); } sqlite3MemdebugSetType(pNew, - (db->lookaside.bEnabled ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); + (db->lookaside.bDisable==0 ? MEMTYPE_LOOKASIDE : MEMTYPE_HEAP)); } } return pNew; @@ -20974,9 +26489,8 @@ SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){ if( z==0 ){ return 0; } - n = sqlite3Strlen30(z) + 1; - assert( (n&0x7fffffff)==n ); - zNew = sqlite3DbMallocRaw(db, (int)n); + n = strlen(z) + 1; + zNew = sqlite3DbMallocRaw(db, n); if( zNew ){ memcpy(zNew, z, n); } @@ -20984,11 +26498,12 @@ SQLITE_PRIVATE char *sqlite3DbStrDup(sqlite3 *db, const char *z){ } SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){ char *zNew; + assert( db!=0 ); if( z==0 ){ return 0; } assert( (n&0x7fffffff)==n ); - zNew = sqlite3DbMallocRaw(db, n+1); + zNew = sqlite3DbMallocRawNN(db, n+1); if( zNew ){ memcpy(zNew, z, (size_t)n); zNew[n] = 0; @@ -20997,28 +26512,65 @@ SQLITE_PRIVATE char *sqlite3DbStrNDup(sqlite3 *db, const char *z, u64 n){ } /* -** Create a string from the zFromat argument and the va_list that follows. -** Store the string in memory obtained from sqliteMalloc() and make *pz -** point to that string. +** The text between zStart and zEnd represents a phrase within a larger +** SQL statement. Make a copy of this phrase in space obtained form +** sqlite3DbMalloc(). Omit leading and trailing whitespace. */ -SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zFormat, ...){ - va_list ap; - char *z; +SQLITE_PRIVATE char *sqlite3DbSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ + int n; + while( sqlite3Isspace(zStart[0]) ) zStart++; + n = (int)(zEnd - zStart); + while( ALWAYS(n>0) && sqlite3Isspace(zStart[n-1]) ) n--; + return sqlite3DbStrNDup(db, zStart, n); +} - va_start(ap, zFormat); - z = sqlite3VMPrintf(db, zFormat, ap); - va_end(ap); +/* +** Free any prior content in *pz and replace it with a copy of zNew. +*/ +SQLITE_PRIVATE void sqlite3SetString(char **pz, sqlite3 *db, const char *zNew){ sqlite3DbFree(db, *pz); - *pz = z; + *pz = sqlite3DbStrDup(db, zNew); +} + +/* +** Call this routine to record the fact that an OOM (out-of-memory) error +** has happened. This routine will set db->mallocFailed, and also +** temporarily disable the lookaside memory allocator and interrupt +** any running VDBEs. +*/ +SQLITE_PRIVATE void sqlite3OomFault(sqlite3 *db){ + if( db->mallocFailed==0 && db->bBenignMalloc==0 ){ + db->mallocFailed = 1; + if( db->nVdbeExec>0 ){ + db->u1.isInterrupted = 1; + } + db->lookaside.bDisable++; + } +} + +/* +** This routine reactivates the memory allocator and clears the +** db->mallocFailed flag as necessary. +** +** The memory allocator is not restarted if there are running +** VDBEs. +*/ +SQLITE_PRIVATE void sqlite3OomClear(sqlite3 *db){ + if( db->mallocFailed && db->nVdbeExec==0 ){ + db->mallocFailed = 0; + db->u1.isInterrupted = 0; + assert( db->lookaside.bDisable>0 ); + db->lookaside.bDisable--; + } } /* ** Take actions at the end of an API call to indicate an OOM error */ static SQLITE_NOINLINE int apiOomError(sqlite3 *db){ - db->mallocFailed = 0; + sqlite3OomClear(db); sqlite3Error(db, SQLITE_NOMEM); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } /* @@ -21030,17 +26582,16 @@ static SQLITE_NOINLINE int apiOomError(sqlite3 *db){ ** function. However, if a malloc() failure has occurred since the previous ** invocation SQLITE_NOMEM is returned instead. ** -** If the first argument, db, is not NULL and a malloc() error has occurred, -** then the connection error-code (the value returned by sqlite3_errcode()) -** is set to SQLITE_NOMEM. +** If an OOM as occurred, then the connection error-code (the value +** returned by sqlite3_errcode()) is set to SQLITE_NOMEM. */ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ - /* If the db handle is not NULL, then we must hold the connection handle - ** mutex here. Otherwise the read (and possible write) of db->mallocFailed + /* If the db handle must hold the connection handle mutex here. + ** Otherwise the read (and possible write) of db->mallocFailed ** is unsafe, as is the call to sqlite3Error(). */ - assert( !db || sqlite3_mutex_held(db->mutex) ); - if( db==0 ) return rc & 0xff; + assert( db!=0 ); + assert( sqlite3_mutex_held(db->mutex) ); if( db->mallocFailed || rc==SQLITE_IOERR_NOMEM ){ return apiOomError(db); } @@ -21051,43 +26602,42 @@ SQLITE_PRIVATE int sqlite3ApiExit(sqlite3* db, int rc){ /************** Begin file printf.c ******************************************/ /* ** The "printf" code that follows dates from the 1980's. It is in -** the public domain. The original comments are included here for -** completeness. They are very out-of-date but might be useful as -** an historical reference. Most of the "enhancements" have been backed -** out so that the functionality is now the same as standard printf(). +** the public domain. ** ************************************************************************** ** ** This file contains code for a set of "printf"-like routines. These ** routines format strings much like the printf() from the standard C ** library, though the implementation here has enhancements to support -** SQLlite. +** SQLite. */ +/* #include "sqliteInt.h" */ /* ** Conversion types fall into various categories as defined by the ** following enumeration. */ -#define etRADIX 1 /* Integer types. %d, %x, %o, and so forth */ -#define etFLOAT 2 /* Floating point. %f */ -#define etEXP 3 /* Exponentional notation. %e and %E */ -#define etGENERIC 4 /* Floating or exponential, depending on exponent. %g */ -#define etSIZE 5 /* Return number of characters processed so far. %n */ -#define etSTRING 6 /* Strings. %s */ -#define etDYNSTRING 7 /* Dynamically allocated strings. %z */ -#define etPERCENT 8 /* Percent symbol. %% */ -#define etCHARX 9 /* Characters. %c */ +#define etRADIX 0 /* non-decimal integer types. %x %o */ +#define etFLOAT 1 /* Floating point. %f */ +#define etEXP 2 /* Exponentional notation. %e and %E */ +#define etGENERIC 3 /* Floating or exponential, depending on exponent. %g */ +#define etSIZE 4 /* Return number of characters processed so far. %n */ +#define etSTRING 5 /* Strings. %s */ +#define etDYNSTRING 6 /* Dynamically allocated strings. %z */ +#define etPERCENT 7 /* Percent symbol. %% */ +#define etCHARX 8 /* Characters. %c */ /* The rest are extensions, not normally found in printf() */ -#define etSQLESCAPE 10 /* Strings with '\'' doubled. %q */ -#define etSQLESCAPE2 11 /* Strings with '\'' doubled and enclosed in '', +#define etSQLESCAPE 9 /* Strings with '\'' doubled. %q */ +#define etSQLESCAPE2 10 /* Strings with '\'' doubled and enclosed in '', NULL pointers replaced by SQL NULL. %Q */ -#define etTOKEN 12 /* a pointer to a Token structure */ -#define etSRCLIST 13 /* a pointer to a SrcList */ -#define etPOINTER 14 /* The %p conversion */ -#define etSQLESCAPE3 15 /* %w -> Strings with '\"' doubled */ -#define etORDINAL 16 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */ +#define etTOKEN 11 /* a pointer to a Token structure */ +#define etSRCLIST 12 /* a pointer to a SrcList */ +#define etPOINTER 13 /* The %p conversion */ +#define etSQLESCAPE3 14 /* %w -> Strings with '\"' doubled */ +#define etORDINAL 15 /* %r -> 1st, 2nd, 3rd, 4th, etc. English only */ +#define etDECIMAL 16 /* %d or %u, but not %x, %o */ -#define etINVALID 0 /* Any unrecognized conversion type */ +#define etINVALID 17 /* Any unrecognized conversion type */ /* @@ -21111,9 +26661,8 @@ typedef struct et_info { /* Information about each format field */ /* ** Allowed values for et_info.flags */ -#define FLAG_SIGNED 1 /* True if the value to convert is signed */ -#define FLAG_INTERN 2 /* True if for internal use only */ -#define FLAG_STRING 4 /* Allow infinity precision */ +#define FLAG_SIGNED 1 /* True if the value to convert is signed */ +#define FLAG_STRING 4 /* Allow infinite precision */ /* @@ -21123,7 +26672,7 @@ typedef struct et_info { /* Information about each format field */ static const char aDigits[] = "0123456789ABCDEF0123456789abcdef"; static const char aPrefix[] = "-x0\000X0"; static const et_info fmtinfo[] = { - { 'd', 10, 1, etRADIX, 0, 0 }, + { 'd', 10, 1, etDECIMAL, 0, 0 }, { 's', 0, 4, etSTRING, 0, 0 }, { 'g', 0, 1, etGENERIC, 30, 0 }, { 'z', 0, 4, etDYNSTRING, 0, 0 }, @@ -21132,7 +26681,7 @@ static const et_info fmtinfo[] = { { 'w', 0, 4, etSQLESCAPE3, 0, 0 }, { 'c', 0, 0, etCHARX, 0, 0 }, { 'o', 8, 0, etRADIX, 0, 2 }, - { 'u', 10, 0, etRADIX, 0, 0 }, + { 'u', 10, 0, etDECIMAL, 0, 0 }, { 'x', 16, 0, etRADIX, 16, 1 }, { 'X', 16, 0, etRADIX, 0, 4 }, #ifndef SQLITE_OMIT_FLOATING_POINT @@ -21141,16 +26690,15 @@ static const et_info fmtinfo[] = { { 'E', 0, 1, etEXP, 14, 0 }, { 'G', 0, 1, etGENERIC, 14, 0 }, #endif - { 'i', 10, 1, etRADIX, 0, 0 }, + { 'i', 10, 1, etDECIMAL, 0, 0 }, { 'n', 0, 0, etSIZE, 0, 0 }, { '%', 0, 0, etPERCENT, 0, 0 }, { 'p', 16, 0, etPOINTER, 0, 1 }, -/* All the rest have the FLAG_INTERN bit set and are thus for internal -** use only */ - { 'T', 0, 2, etTOKEN, 0, 0 }, - { 'S', 0, 2, etSRCLIST, 0, 0 }, - { 'r', 10, 3, etORDINAL, 0, 0 }, + /* All the rest are undocumented and are for internal use only */ + { 'T', 0, 0, etTOKEN, 0, 0 }, + { 'S', 0, 0, etSRCLIST, 0, 0 }, + { 'r', 10, 1, etORDINAL, 0, 0 }, }; /* @@ -21188,6 +26736,7 @@ static char et_getdigit(LONGDOUBLE_TYPE *val, int *cnt){ ** Set the StrAccum object to an error mode. */ static void setStrAccumError(StrAccum *p, u8 eError){ + assert( eError==SQLITE_NOMEM || eError==SQLITE_TOOBIG ); p->accError = eError; p->nAlloc = 0; } @@ -21221,9 +26770,8 @@ static char *getTextArg(PrintfArguments *p){ /* ** Render a string given by "fmt" into the StrAccum object. */ -SQLITE_PRIVATE void sqlite3VXPrintf( - StrAccum *pAccum, /* Accumulate results here */ - u32 bFlags, /* SQLITE_PRINTF_* flags */ +SQLITE_API void sqlite3_str_vappendf( + sqlite3_str *pAccum, /* Accumulate results here */ const char *fmt, /* Format string */ va_list ap /* arguments */ ){ @@ -21234,17 +26782,15 @@ SQLITE_PRIVATE void sqlite3VXPrintf( int idx; /* A general purpose loop counter */ int width; /* Width of the current field */ etByte flag_leftjustify; /* True if "-" flag is present */ - etByte flag_plussign; /* True if "+" flag is present */ - etByte flag_blanksign; /* True if " " flag is present */ + etByte flag_prefix; /* '+' or ' ' or 0 for prefix */ etByte flag_alternateform; /* True if "#" flag is present */ etByte flag_altform2; /* True if "!" flag is present */ etByte flag_zeropad; /* True if field width constant starts with zero */ - etByte flag_long; /* True if "l" flag is present */ - etByte flag_longlong; /* True if the "ll" flag is present */ + etByte flag_long; /* 1 for the "l" flag, 2 for "ll", 0 by default */ etByte done; /* Loop termination flag */ - etByte xtype = 0; /* Conversion paradigm */ + etByte cThousand; /* Thousands separator for %d and %u */ + etByte xtype = etINVALID; /* Conversion paradigm */ u8 bArgList; /* True for SQLITE_PRINTF_SQLFUNC */ - u8 useIntern; /* Ok to use internal conversions (ex: %T) */ char prefix; /* Prefix character. "+" or "-" or " " or '\0'. */ sqlite_uint64 longvalue; /* Value for integer types */ LONGDOUBLE_TYPE realvalue; /* Value for real types */ @@ -21262,21 +26808,17 @@ SQLITE_PRIVATE void sqlite3VXPrintf( PrintfArguments *pArgList = 0; /* Arguments for SQLITE_PRINTF_SQLFUNC */ char buf[etBUFSIZE]; /* Conversion buffer */ -#ifdef SQLITE_ENABLE_API_ARMOR - if( ap==0 ){ - (void)SQLITE_MISUSE_BKPT; - sqlite3StrAccumReset(pAccum); - return; - } -#endif + /* pAccum never starts out with an empty buffer that was obtained from + ** malloc(). This precondition is required by the mprintf("%z...") + ** optimization. */ + assert( pAccum->nChar>0 || (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 ); + bufpt = 0; - if( bFlags ){ - if( (bArgList = (bFlags & SQLITE_PRINTF_SQLFUNC))!=0 ){ - pArgList = va_arg(ap, PrintfArguments*); - } - useIntern = bFlags & SQLITE_PRINTF_INTERNAL; + if( (pAccum->printfFlags & SQLITE_PRINTF_SQLFUNC)!=0 ){ + pArgList = va_arg(ap, PrintfArguments*); + bArgList = 1; }else{ - bArgList = useIntern = 0; + bArgList = 0; } for(; (c=(*fmt))!=0; ++fmt){ if( c!='%' ){ @@ -21286,30 +26828,30 @@ SQLITE_PRIVATE void sqlite3VXPrintf( #else do{ fmt++; }while( *fmt && *fmt != '%' ); #endif - sqlite3StrAccumAppend(pAccum, bufpt, (int)(fmt - bufpt)); + sqlite3_str_append(pAccum, bufpt, (int)(fmt - bufpt)); if( *fmt==0 ) break; } if( (c=(*++fmt))==0 ){ - sqlite3StrAccumAppend(pAccum, "%", 1); + sqlite3_str_append(pAccum, "%", 1); break; } /* Find out what flags are present */ - flag_leftjustify = flag_plussign = flag_blanksign = + flag_leftjustify = flag_prefix = cThousand = flag_alternateform = flag_altform2 = flag_zeropad = 0; done = 0; do{ switch( c ){ case '-': flag_leftjustify = 1; break; - case '+': flag_plussign = 1; break; - case ' ': flag_blanksign = 1; break; + case '+': flag_prefix = '+'; break; + case ' ': flag_prefix = ' '; break; case '#': flag_alternateform = 1; break; case '!': flag_altform2 = 1; break; case '0': flag_zeropad = 1; break; + case ',': cThousand = ','; break; default: done = 1; break; } }while( !done && (c=(*++fmt))!=0 ); /* Get the field width */ - width = 0; if( c=='*' ){ if( bArgList ){ width = (int)getIntArg(pArgList); @@ -21318,18 +26860,27 @@ SQLITE_PRIVATE void sqlite3VXPrintf( } if( width<0 ){ flag_leftjustify = 1; - width = -width; + width = width >= -2147483647 ? -width : 0; } c = *++fmt; }else{ + unsigned wx = 0; while( c>='0' && c<='9' ){ - width = width*10 + c - '0'; + wx = wx*10 + c - '0'; c = *++fmt; } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; } + assert( width>=0 ); +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + /* Get the precision */ if( c=='.' ){ - precision = 0; c = *++fmt; if( c=='*' ){ if( bArgList ){ @@ -21337,29 +26888,40 @@ SQLITE_PRIVATE void sqlite3VXPrintf( }else{ precision = va_arg(ap,int); } - if( precision<0 ) precision = -precision; c = *++fmt; + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } }else{ + unsigned px = 0; while( c>='0' && c<='9' ){ - precision = precision*10 + c - '0'; + px = px*10 + c - '0'; c = *++fmt; } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; } }else{ precision = -1; } + assert( precision>=(-1) ); +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + + /* Get the conversion type modifier */ if( c=='l' ){ flag_long = 1; c = *++fmt; if( c=='l' ){ - flag_longlong = 1; + flag_long = 2; c = *++fmt; - }else{ - flag_longlong = 0; } }else{ - flag_long = flag_longlong = 0; + flag_long = 0; } /* Fetch the info entry for the field */ infop = &fmtinfo[0]; @@ -21367,11 +26929,7 @@ SQLITE_PRIVATE void sqlite3VXPrintf( for(idx=0; idx<ArraySize(fmtinfo); idx++){ if( c==fmtinfo[idx].fmttype ){ infop = &fmtinfo[idx]; - if( useIntern || (infop->flags & FLAG_INTERN)==0 ){ - xtype = infop->type; - }else{ - return; - } + xtype = infop->type; break; } } @@ -21381,15 +26939,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf( ** ** flag_alternateform TRUE if a '#' is present. ** flag_altform2 TRUE if a '!' is present. - ** flag_plussign TRUE if a '+' is present. + ** flag_prefix '+' or ' ' or zero ** flag_leftjustify TRUE if a '-' is present or if the ** field width was negative. ** flag_zeropad TRUE if the width began with 0. - ** flag_long TRUE if the letter 'l' (ell) prefixed - ** the conversion character. - ** flag_longlong TRUE if the letter 'll' (ell ell) prefixed - ** the conversion character. - ** flag_blanksign TRUE if a ' ' is present. + ** flag_long 1 for "l", 2 for "ll" ** width The specified field width. This is ** always non-negative. Zero is the default. ** precision The specified precision. The default @@ -21399,19 +26953,24 @@ SQLITE_PRIVATE void sqlite3VXPrintf( */ switch( xtype ){ case etPOINTER: - flag_longlong = sizeof(char*)==sizeof(i64); - flag_long = sizeof(char*)==sizeof(long int); + flag_long = sizeof(char*)==sizeof(i64) ? 2 : + sizeof(char*)==sizeof(long int) ? 1 : 0; /* Fall through into the next case */ case etORDINAL: - case etRADIX: + case etRADIX: + cThousand = 0; + /* Fall through into the next case */ + case etDECIMAL: if( infop->flags & FLAG_SIGNED ){ i64 v; if( bArgList ){ v = getIntArg(pArgList); - }else if( flag_longlong ){ - v = va_arg(ap,i64); }else if( flag_long ){ - v = va_arg(ap,long int); + if( flag_long==2 ){ + v = va_arg(ap,i64) ; + }else{ + v = va_arg(ap,long int); + } }else{ v = va_arg(ap,int); } @@ -21424,17 +26983,17 @@ SQLITE_PRIVATE void sqlite3VXPrintf( prefix = '-'; }else{ longvalue = v; - if( flag_plussign ) prefix = '+'; - else if( flag_blanksign ) prefix = ' '; - else prefix = 0; + prefix = flag_prefix; } }else{ if( bArgList ){ longvalue = (u64)getIntArg(pArgList); - }else if( flag_longlong ){ - longvalue = va_arg(ap,u64); }else if( flag_long ){ - longvalue = va_arg(ap,unsigned long int); + if( flag_long==2 ){ + longvalue = va_arg(ap,u64); + }else{ + longvalue = va_arg(ap,unsigned long int); + } }else{ longvalue = va_arg(ap,unsigned int); } @@ -21444,16 +27003,17 @@ SQLITE_PRIVATE void sqlite3VXPrintf( if( flag_zeropad && precision<width-(prefix!=0) ){ precision = width-(prefix!=0); } - if( precision<etBUFSIZE-10 ){ + if( precision<etBUFSIZE-10-etBUFSIZE/3 ){ nOut = etBUFSIZE; zOut = buf; }else{ - nOut = precision + 10; - zOut = zExtra = sqlite3Malloc( nOut ); + u64 n = (u64)precision + 10 + precision/3; + zOut = zExtra = sqlite3Malloc( n ); if( zOut==0 ){ - setStrAccumError(pAccum, STRACCUM_NOMEM); + setStrAccumError(pAccum, SQLITE_NOMEM); return; } + nOut = (int)n; } bufpt = &zOut[nOut-1]; if( xtype==etORDINAL ){ @@ -21474,8 +27034,23 @@ SQLITE_PRIVATE void sqlite3VXPrintf( }while( longvalue>0 ); } length = (int)(&zOut[nOut-1]-bufpt); - for(idx=precision-length; idx>0; idx--){ + while( precision>length ){ *(--bufpt) = '0'; /* Zero pad */ + length++; + } + if( cThousand ){ + int nn = (length - 1)/3; /* Number of "," to insert */ + int ix = (length - 1)%3 + 1; + bufpt -= nn; + for(idx=0; nn>0; idx++){ + bufpt[idx] = bufpt[idx+nn]; + ix--; + if( ix==0 ){ + bufpt[++idx] = cThousand; + nn--; + ix = 3; + } + } } if( prefix ) *(--bufpt) = prefix; /* Add sign */ if( flag_alternateform && infop->prefix ){ /* Add "0" or "0x" */ @@ -21502,12 +27077,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf( realvalue = -realvalue; prefix = '-'; }else{ - if( flag_plussign ) prefix = '+'; - else if( flag_blanksign ) prefix = ' '; - else prefix = 0; + prefix = flag_prefix; } if( xtype==etGENERIC && precision>0 ) precision--; - for(idx=precision, rounder=0.5; idx>0; idx--, rounder*=0.1){} + testcase( precision>0xfff ); + for(idx=precision&0xfff, rounder=0.5; idx>0; idx--, rounder*=0.1){} if( xtype==etFLOAT ) realvalue += rounder; /* Normalize realvalue to within 10.0 > realvalue >= 1.0 */ exp = 0; @@ -21519,21 +27093,16 @@ SQLITE_PRIVATE void sqlite3VXPrintf( if( realvalue>0.0 ){ LONGDOUBLE_TYPE scale = 1.0; while( realvalue>=1e100*scale && exp<=350 ){ scale *= 1e100;exp+=100;} - while( realvalue>=1e64*scale && exp<=350 ){ scale *= 1e64; exp+=64; } - while( realvalue>=1e8*scale && exp<=350 ){ scale *= 1e8; exp+=8; } + while( realvalue>=1e10*scale && exp<=350 ){ scale *= 1e10; exp+=10; } while( realvalue>=10.0*scale && exp<=350 ){ scale *= 10.0; exp++; } realvalue /= scale; while( realvalue<1e-8 ){ realvalue *= 1e8; exp-=8; } while( realvalue<1.0 ){ realvalue *= 10.0; exp--; } if( exp>350 ){ - if( prefix=='-' ){ - bufpt = "-Inf"; - }else if( prefix=='+' ){ - bufpt = "+Inf"; - }else{ - bufpt = "Inf"; - } - length = sqlite3Strlen30(bufpt); + bufpt = buf; + buf[0] = prefix; + memcpy(buf+(prefix!=0),"Inf",4); + length = 3+(prefix!=0); break; } } @@ -21562,10 +27131,11 @@ SQLITE_PRIVATE void sqlite3VXPrintf( }else{ e2 = exp; } - if( MAX(e2,0)+precision+width > etBUFSIZE - 15 ){ - bufpt = zExtra = sqlite3Malloc( MAX(e2,0)+precision+width+15 ); + if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){ + bufpt = zExtra + = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 ); if( bufpt==0 ){ - setStrAccumError(pAccum, STRACCUM_NOMEM); + setStrAccumError(pAccum, SQLITE_NOMEM); return; } } @@ -21661,43 +27231,102 @@ SQLITE_PRIVATE void sqlite3VXPrintf( case etCHARX: if( bArgList ){ bufpt = getTextArg(pArgList); - c = bufpt ? bufpt[0] : 0; + length = 1; + if( bufpt ){ + buf[0] = c = *(bufpt++); + if( (c&0xc0)==0xc0 ){ + while( length<4 && (bufpt[0]&0xc0)==0x80 ){ + buf[length++] = *(bufpt++); + } + } + }else{ + buf[0] = 0; + } }else{ - c = va_arg(ap,int); + unsigned int ch = va_arg(ap,unsigned int); + if( ch<0x00080 ){ + buf[0] = ch & 0xff; + length = 1; + }else if( ch<0x00800 ){ + buf[0] = 0xc0 + (u8)((ch>>6)&0x1f); + buf[1] = 0x80 + (u8)(ch & 0x3f); + length = 2; + }else if( ch<0x10000 ){ + buf[0] = 0xe0 + (u8)((ch>>12)&0x0f); + buf[1] = 0x80 + (u8)((ch>>6) & 0x3f); + buf[2] = 0x80 + (u8)(ch & 0x3f); + length = 3; + }else{ + buf[0] = 0xf0 + (u8)((ch>>18) & 0x07); + buf[1] = 0x80 + (u8)((ch>>12) & 0x3f); + buf[2] = 0x80 + (u8)((ch>>6) & 0x3f); + buf[3] = 0x80 + (u8)(ch & 0x3f); + length = 4; + } } if( precision>1 ){ width -= precision-1; if( width>1 && !flag_leftjustify ){ - sqlite3AppendChar(pAccum, width-1, ' '); + sqlite3_str_appendchar(pAccum, width-1, ' '); width = 0; } - sqlite3AppendChar(pAccum, precision-1, c); + while( precision-- > 1 ){ + sqlite3_str_append(pAccum, buf, length); + } } - length = 1; - buf[0] = c; bufpt = buf; - break; + flag_altform2 = 1; + goto adjust_width_for_utf8; case etSTRING: case etDYNSTRING: if( bArgList ){ bufpt = getTextArg(pArgList); + xtype = etSTRING; }else{ bufpt = va_arg(ap,char*); } if( bufpt==0 ){ bufpt = ""; - }else if( xtype==etDYNSTRING && !bArgList ){ + }else if( xtype==etDYNSTRING ){ + if( pAccum->nChar==0 && pAccum->mxAlloc && width==0 && precision<0 ){ + /* Special optimization for sqlite3_mprintf("%z..."): + ** Extend an existing memory allocation rather than creating + ** a new one. */ + assert( (pAccum->printfFlags&SQLITE_PRINTF_MALLOCED)==0 ); + pAccum->zText = bufpt; + pAccum->nAlloc = sqlite3DbMallocSize(pAccum->db, bufpt); + pAccum->nChar = 0x7fffffff & (int)strlen(bufpt); + pAccum->printfFlags |= SQLITE_PRINTF_MALLOCED; + length = 0; + break; + } zExtra = bufpt; } if( precision>=0 ){ - for(length=0; length<precision && bufpt[length]; length++){} + if( flag_altform2 ){ + /* Set length to the number of bytes needed in order to display + ** precision characters */ + unsigned char *z = (unsigned char*)bufpt; + while( precision-- > 0 && z[0] ){ + SQLITE_SKIP_UTF8(z); + } + length = (int)(z - (unsigned char*)bufpt); + }else{ + for(length=0; length<precision && bufpt[length]; length++){} + } }else{ - length = sqlite3Strlen30(bufpt); + length = 0x7fffffff & (int)strlen(bufpt); + } + adjust_width_for_utf8: + if( flag_altform2 && width>0 ){ + /* Adjust width to account for extra bytes in UTF-8 characters */ + int ii = length - 1; + while( ii>=0 ) if( (bufpt[ii--] & 0xc0)==0x80 ) width++; } break; - case etSQLESCAPE: - case etSQLESCAPE2: - case etSQLESCAPE3: { + case etSQLESCAPE: /* %q: Escape ' characters */ + case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */ + case etSQLESCAPE3: { /* %w: Escape " characters */ int i, j, k, n, isnull; int needQuote; char ch; @@ -21711,16 +27340,24 @@ SQLITE_PRIVATE void sqlite3VXPrintf( } isnull = escarg==0; if( isnull ) escarg = (xtype==etSQLESCAPE2 ? "NULL" : "(NULL)"); + /* For %q, %Q, and %w, the precision is the number of byte (or + ** characters if the ! flags is present) to use from the input. + ** Because of the extra quoting characters inserted, the number + ** of output characters may be larger than the precision. + */ k = precision; for(i=n=0; k!=0 && (ch=escarg[i])!=0; i++, k--){ if( ch==q ) n++; + if( flag_altform2 && (ch&0xc0)==0xc0 ){ + while( (escarg[i+1]&0xc0)==0x80 ){ i++; } + } } needQuote = !isnull && xtype==etSQLESCAPE2; - n += i + 1 + needQuote*2; + n += i + 3; if( n>etBUFSIZE ){ bufpt = zExtra = sqlite3Malloc( n ); if( bufpt==0 ){ - setStrAccumError(pAccum, STRACCUM_NOMEM); + setStrAccumError(pAccum, SQLITE_NOMEM); return; } }else{ @@ -21736,31 +27373,34 @@ SQLITE_PRIVATE void sqlite3VXPrintf( if( needQuote ) bufpt[j++] = q; bufpt[j] = 0; length = j; - /* The precision in %q and %Q means how many input characters to - ** consume, not the length of the output... - ** if( precision>=0 && precision<length ) length = precision; */ - break; + goto adjust_width_for_utf8; } case etTOKEN: { - Token *pToken = va_arg(ap, Token*); + Token *pToken; + if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; + pToken = va_arg(ap, Token*); assert( bArgList==0 ); if( pToken && pToken->n ){ - sqlite3StrAccumAppend(pAccum, (const char*)pToken->z, pToken->n); + sqlite3_str_append(pAccum, (const char*)pToken->z, pToken->n); } length = width = 0; break; } case etSRCLIST: { - SrcList *pSrc = va_arg(ap, SrcList*); - int k = va_arg(ap, int); - struct SrcList_item *pItem = &pSrc->a[k]; + SrcList *pSrc; + int k; + struct SrcList_item *pItem; + if( (pAccum->printfFlags & SQLITE_PRINTF_INTERNAL)==0 ) return; + pSrc = va_arg(ap, SrcList*); + k = va_arg(ap, int); + pItem = &pSrc->a[k]; assert( bArgList==0 ); assert( k>=0 && k<pSrc->nSrc ); if( pItem->zDatabase ){ - sqlite3StrAccumAppendAll(pAccum, pItem->zDatabase); - sqlite3StrAccumAppend(pAccum, ".", 1); + sqlite3_str_appendall(pAccum, pItem->zDatabase); + sqlite3_str_append(pAccum, ".", 1); } - sqlite3StrAccumAppendAll(pAccum, pItem->zName); + sqlite3_str_appendall(pAccum, pItem->zName); length = width = 0; break; } @@ -21772,15 +27412,22 @@ SQLITE_PRIVATE void sqlite3VXPrintf( /* ** The text of the conversion is pointed to by "bufpt" and is ** "length" characters long. The field width is "width". Do - ** the output. + ** the output. Both length and width are in bytes, not characters, + ** at this point. If the "!" flag was present on string conversions + ** indicating that width and precision should be expressed in characters, + ** then the values have been translated prior to reaching this point. */ width -= length; - if( width>0 && !flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' '); - sqlite3StrAccumAppend(pAccum, bufpt, length); - if( width>0 && flag_leftjustify ) sqlite3AppendChar(pAccum, width, ' '); + if( width>0 ){ + if( !flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' '); + sqlite3_str_append(pAccum, bufpt, length); + if( flag_leftjustify ) sqlite3_str_appendchar(pAccum, width, ' '); + }else{ + sqlite3_str_append(pAccum, bufpt, length); + } if( zExtra ){ - sqlite3_free(zExtra); + sqlite3DbFree(pAccum->db, zExtra); zExtra = 0; } }/* End for loop over the format string */ @@ -21795,18 +27442,18 @@ SQLITE_PRIVATE void sqlite3VXPrintf( */ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ char *zNew; - assert( p->nChar+N >= p->nAlloc ); /* Only called if really needed */ + assert( p->nChar+(i64)N >= p->nAlloc ); /* Only called if really needed */ if( p->accError ){ - testcase(p->accError==STRACCUM_TOOBIG); - testcase(p->accError==STRACCUM_NOMEM); + testcase(p->accError==SQLITE_TOOBIG); + testcase(p->accError==SQLITE_NOMEM); return 0; } - if( !p->useMalloc ){ + if( p->mxAlloc==0 ){ N = p->nAlloc - p->nChar - 1; - setStrAccumError(p, STRACCUM_TOOBIG); + setStrAccumError(p, SQLITE_TOOBIG); return N; }else{ - char *zOld = (p->zText==p->zBase ? 0 : p->zText); + char *zOld = isMalloced(p) ? p->zText : 0; i64 szNew = p->nChar; szNew += N + 1; if( szNew+p->nChar<=p->mxAlloc ){ @@ -21815,25 +27462,26 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ szNew += p->nChar; } if( szNew > p->mxAlloc ){ - sqlite3StrAccumReset(p); - setStrAccumError(p, STRACCUM_TOOBIG); + sqlite3_str_reset(p); + setStrAccumError(p, SQLITE_TOOBIG); return 0; }else{ p->nAlloc = (int)szNew; } - if( p->useMalloc==1 ){ + if( p->db ){ zNew = sqlite3DbRealloc(p->db, zOld, p->nAlloc); }else{ - zNew = sqlite3_realloc(zOld, p->nAlloc); + zNew = sqlite3_realloc64(zOld, p->nAlloc); } if( zNew ){ assert( p->zText!=0 || p->nChar==0 ); - if( zOld==0 && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); + if( !isMalloced(p) && p->nChar>0 ) memcpy(zNew, p->zText, p->nChar); p->zText = zNew; p->nAlloc = sqlite3DbMallocSize(p->db, zNew); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; }else{ - sqlite3StrAccumReset(p); - setStrAccumError(p, STRACCUM_NOMEM); + sqlite3_str_reset(p); + setStrAccumError(p, SQLITE_NOMEM); return 0; } } @@ -21843,8 +27491,11 @@ static int sqlite3StrAccumEnlarge(StrAccum *p, int N){ /* ** Append N copies of character c to the given string buffer. */ -SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){ - if( p->nChar+N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ) return; +SQLITE_API void sqlite3_str_appendchar(sqlite3_str *p, int N, char c){ + testcase( p->nChar + (i64)N > 0x7fffffff ); + if( p->nChar+(i64)N >= p->nAlloc && (N = sqlite3StrAccumEnlarge(p, N))<=0 ){ + return; + } while( (N--)>0 ) p->zText[p->nChar++] = c; } @@ -21852,9 +27503,9 @@ SQLITE_PRIVATE void sqlite3AppendChar(StrAccum *p, int N, char c){ ** The StrAccum "p" is not large enough to accept N new bytes of z[]. ** So enlarge if first, then do the append. ** -** This is a helper routine to sqlite3StrAccumAppend() that does special-case +** This is a helper routine to sqlite3_str_append() that does special-case ** work (enlarging the buffer) using tail recursion, so that the -** sqlite3StrAccumAppend() routine can use fast calling semantics. +** sqlite3_str_append() routine can use fast calling semantics. */ static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){ N = sqlite3StrAccumEnlarge(p, N); @@ -21868,14 +27519,14 @@ static void SQLITE_NOINLINE enlargeAndAppend(StrAccum *p, const char *z, int N){ ** Append N bytes of text from z to the StrAccum object. Increase the ** size of the memory allocation for StrAccum if necessary. */ -SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ - assert( z!=0 ); +SQLITE_API void sqlite3_str_append(sqlite3_str *p, const char *z, int N){ + assert( z!=0 || N==0 ); assert( p->zText!=0 || p->nChar==0 || p->accError ); assert( N>=0 ); assert( p->accError==0 || p->nAlloc==0 ); if( p->nChar+N >= p->nAlloc ){ enlargeAndAppend(p,z,N); - }else{ + }else if( N ){ assert( p->zText ); p->nChar += N; memcpy(&p->zText[p->nChar-N], z, N); @@ -21885,8 +27536,8 @@ SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum *p, const char *z, int N){ /* ** Append the complete text of zero-terminated string z[] to the p string. */ -SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){ - sqlite3StrAccumAppend(p, z, sqlite3Strlen30(z)); +SQLITE_API void sqlite3_str_appendall(sqlite3_str *p, const char *z){ + sqlite3_str_append(p, z, sqlite3Strlen30(z)); } @@ -21895,50 +27546,116 @@ SQLITE_PRIVATE void sqlite3StrAccumAppendAll(StrAccum *p, const char *z){ ** Return a pointer to the resulting string. Return a NULL ** pointer if any kind of error was encountered. */ +static SQLITE_NOINLINE char *strAccumFinishRealloc(StrAccum *p){ + char *zText; + assert( p->mxAlloc>0 && !isMalloced(p) ); + zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); + if( zText ){ + memcpy(zText, p->zText, p->nChar+1); + p->printfFlags |= SQLITE_PRINTF_MALLOCED; + }else{ + setStrAccumError(p, SQLITE_NOMEM); + } + p->zText = zText; + return zText; +} SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum *p){ if( p->zText ){ p->zText[p->nChar] = 0; - if( p->useMalloc && p->zText==p->zBase ){ - if( p->useMalloc==1 ){ - p->zText = sqlite3DbMallocRaw(p->db, p->nChar+1 ); - }else{ - p->zText = sqlite3_malloc(p->nChar+1); - } - if( p->zText ){ - memcpy(p->zText, p->zBase, p->nChar+1); - }else{ - setStrAccumError(p, STRACCUM_NOMEM); - } + if( p->mxAlloc>0 && !isMalloced(p) ){ + return strAccumFinishRealloc(p); } } return p->zText; } +/* +** This singleton is an sqlite3_str object that is returned if +** sqlite3_malloc() fails to provide space for a real one. This +** sqlite3_str object accepts no new text and always returns +** an SQLITE_NOMEM error. +*/ +static sqlite3_str sqlite3OomStr = { + 0, 0, 0, 0, 0, SQLITE_NOMEM, 0 +}; + +/* Finalize a string created using sqlite3_str_new(). +*/ +SQLITE_API char *sqlite3_str_finish(sqlite3_str *p){ + char *z; + if( p!=0 && p!=&sqlite3OomStr ){ + z = sqlite3StrAccumFinish(p); + sqlite3_free(p); + }else{ + z = 0; + } + return z; +} + +/* Return any error code associated with p */ +SQLITE_API int sqlite3_str_errcode(sqlite3_str *p){ + return p ? p->accError : SQLITE_NOMEM; +} + +/* Return the current length of p in bytes */ +SQLITE_API int sqlite3_str_length(sqlite3_str *p){ + return p ? p->nChar : 0; +} + +/* Return the current value for p */ +SQLITE_API char *sqlite3_str_value(sqlite3_str *p){ + if( p==0 || p->nChar==0 ) return 0; + p->zText[p->nChar] = 0; + return p->zText; +} + /* ** Reset an StrAccum string. Reclaim all malloced memory. */ -SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum *p){ - if( p->zText!=p->zBase ){ - if( p->useMalloc==1 ){ - sqlite3DbFree(p->db, p->zText); - }else{ - sqlite3_free(p->zText); - } +SQLITE_API void sqlite3_str_reset(StrAccum *p){ + if( isMalloced(p) ){ + sqlite3DbFree(p->db, p->zText); + p->printfFlags &= ~SQLITE_PRINTF_MALLOCED; } + p->nAlloc = 0; + p->nChar = 0; p->zText = 0; } /* -** Initialize a string accumulator +** Initialize a string accumulator. +** +** p: The accumulator to be initialized. +** db: Pointer to a database connection. May be NULL. Lookaside +** memory is used if not NULL. db->mallocFailed is set appropriately +** when not NULL. +** zBase: An initial buffer. May be NULL in which case the initial buffer +** is malloced. +** n: Size of zBase in bytes. If total space requirements never exceed +** n then no memory allocations ever occur. +** mx: Maximum number of bytes to accumulate. If mx==0 then no memory +** allocations will ever occur. */ -SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, char *zBase, int n, int mx){ - p->zText = p->zBase = zBase; - p->db = 0; - p->nChar = 0; +SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum *p, sqlite3 *db, char *zBase, int n, int mx){ + p->zText = zBase; + p->db = db; p->nAlloc = n; p->mxAlloc = mx; - p->useMalloc = 1; + p->nChar = 0; p->accError = 0; + p->printfFlags = 0; +} + +/* Allocate and initialize a new dynamic string object */ +SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3 *db){ + sqlite3_str *p = sqlite3_malloc64(sizeof(*p)); + if( p ){ + sqlite3StrAccumInit(p, 0, 0, 0, + db ? db->aLimit[SQLITE_LIMIT_LENGTH] : SQLITE_MAX_LENGTH); + }else{ + p = &sqlite3OomStr; + } + return p; } /* @@ -21950,13 +27667,13 @@ SQLITE_PRIVATE char *sqlite3VMPrintf(sqlite3 *db, const char *zFormat, va_list a char zBase[SQLITE_PRINT_BUF_SIZE]; StrAccum acc; assert( db!=0 ); - sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), + sqlite3StrAccumInit(&acc, db, zBase, sizeof(zBase), db->aLimit[SQLITE_LIMIT_LENGTH]); - acc.db = db; - sqlite3VXPrintf(&acc, SQLITE_PRINTF_INTERNAL, zFormat, ap); + acc.printfFlags = SQLITE_PRINTF_INTERNAL; + sqlite3_str_vappendf(&acc, zFormat, ap); z = sqlite3StrAccumFinish(&acc); - if( acc.accError==STRACCUM_NOMEM ){ - db->mallocFailed = 1; + if( acc.accError==SQLITE_NOMEM ){ + sqlite3OomFault(db); } return z; } @@ -21974,24 +27691,6 @@ SQLITE_PRIVATE char *sqlite3MPrintf(sqlite3 *db, const char *zFormat, ...){ return z; } -/* -** Like sqlite3MPrintf(), but call sqlite3DbFree() on zStr after formatting -** the string and before returning. This routine is intended to be used -** to modify an existing string. For example: -** -** x = sqlite3MPrintf(db, x, "prefix %s suffix", x); -** -*/ -SQLITE_PRIVATE char *sqlite3MAppendf(sqlite3 *db, char *zStr, const char *zFormat, ...){ - va_list ap; - char *z; - va_start(ap, zFormat); - z = sqlite3VMPrintf(db, zFormat, ap); - va_end(ap); - sqlite3DbFree(db, zStr); - return z; -} - /* ** Print into memory obtained from sqlite3_malloc(). Omit the internal ** %-conversion extensions. @@ -22010,9 +27709,8 @@ SQLITE_API char *sqlite3_vmprintf(const char *zFormat, va_list ap){ #ifndef SQLITE_OMIT_AUTOINIT if( sqlite3_initialize() ) return 0; #endif - sqlite3StrAccumInit(&acc, zBase, sizeof(zBase), SQLITE_MAX_LENGTH); - acc.useMalloc = 2; - sqlite3VXPrintf(&acc, 0, zFormat, ap); + sqlite3StrAccumInit(&acc, 0, zBase, sizeof(zBase), SQLITE_MAX_LENGTH); + sqlite3_str_vappendf(&acc, zFormat, ap); z = sqlite3StrAccumFinish(&acc); return z; } @@ -22052,14 +27750,14 @@ SQLITE_API char *sqlite3_vsnprintf(int n, char *zBuf, const char *zFormat, va_li #ifdef SQLITE_ENABLE_API_ARMOR if( zBuf==0 || zFormat==0 ) { (void)SQLITE_MISUSE_BKPT; - if( zBuf && n>0 ) zBuf[0] = 0; + if( zBuf ) zBuf[0] = 0; return zBuf; } #endif - sqlite3StrAccumInit(&acc, zBuf, n, 0); - acc.useMalloc = 0; - sqlite3VXPrintf(&acc, 0, zFormat, ap); - return sqlite3StrAccumFinish(&acc); + sqlite3StrAccumInit(&acc, 0, zBuf, n, 0); + sqlite3_str_vappendf(&acc, zFormat, ap); + zBuf[acc.nChar] = 0; + return zBuf; } SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ char *z; @@ -22078,14 +27776,18 @@ SQLITE_API char *sqlite3_snprintf(int n, char *zBuf, const char *zFormat, ...){ ** sqlite3_log() must render into a static buffer. It cannot dynamically ** allocate memory because it might be called while the memory allocator ** mutex is held. +** +** sqlite3_str_vappendf() might ask for *temporary* memory allocations for +** certain format characters (%q) or for very large precisions or widths. +** Care must be taken that any sqlite3_log() calls that occur while the +** memory mutex is held do not use these mechanisms. */ static void renderLogMsg(int iErrCode, const char *zFormat, va_list ap){ StrAccum acc; /* String accumulator */ char zMsg[SQLITE_PRINT_BUF_SIZE*3]; /* Complete log message */ - sqlite3StrAccumInit(&acc, zMsg, sizeof(zMsg), 0); - acc.useMalloc = 0; - sqlite3VXPrintf(&acc, 0, zFormat, ap); + sqlite3StrAccumInit(&acc, 0, zMsg, sizeof(zMsg), 0); + sqlite3_str_vappendf(&acc, zFormat, ap); sqlite3GlobalConfig.xLog(sqlite3GlobalConfig.pLogArg, iErrCode, sqlite3StrAccumFinish(&acc)); } @@ -22102,7 +27804,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...){ } } -#if defined(SQLITE_DEBUG) +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) /* ** A version of printf() that understands %lld. Used for debugging. ** The printf() built into some versions of windows does not understand %lld @@ -22112,35 +27814,66 @@ SQLITE_PRIVATE void sqlite3DebugPrintf(const char *zFormat, ...){ va_list ap; StrAccum acc; char zBuf[500]; - sqlite3StrAccumInit(&acc, zBuf, sizeof(zBuf), 0); - acc.useMalloc = 0; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); va_start(ap,zFormat); - sqlite3VXPrintf(&acc, 0, zFormat, ap); + sqlite3_str_vappendf(&acc, zFormat, ap); va_end(ap); sqlite3StrAccumFinish(&acc); +#ifdef SQLITE_OS_TRACE_PROC + { + extern void SQLITE_OS_TRACE_PROC(const char *zBuf, int nBuf); + SQLITE_OS_TRACE_PROC(zBuf, sizeof(zBuf)); + } +#else fprintf(stdout,"%s", zBuf); fflush(stdout); +#endif } #endif -#ifdef SQLITE_DEBUG -/************************************************************************* -** Routines for implementing the "TreeView" display of hierarchical -** data structures for debugging. -** -** The main entry points (coded elsewhere) are: -** sqlite3TreeViewExpr(0, pExpr, 0); -** sqlite3TreeViewExprList(0, pList, 0, 0); -** sqlite3TreeViewSelect(0, pSelect, 0); -** Insert calls to those routines while debugging in order to display -** a diagram of Expr, ExprList, and Select objects. -** + +/* +** variable-argument wrapper around sqlite3_str_vappendf(). The bFlags argument +** can contain the bit SQLITE_PRINTF_INTERNAL enable internal formats. */ -/* Add a new subitem to the tree. The moreToFollow flag indicates that this -** is not the last item in the tree. */ -SQLITE_PRIVATE TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ +SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ + va_list ap; + va_start(ap,zFormat); + sqlite3_str_vappendf(p, zFormat, ap); + va_end(ap); +} + +/************** End of printf.c **********************************************/ +/************** Begin file treeview.c ****************************************/ +/* +** 2015-06-08 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file contains C code to implement the TreeView debugging routines. +** These routines print a parse tree to standard output for debugging and +** analysis. +** +** The interfaces in this file is only available when compiling +** with SQLITE_DEBUG. +*/ +/* #include "sqliteInt.h" */ +#ifdef SQLITE_DEBUG + +/* +** Add a new subitem to the tree. The moreToFollow flag indicates that this +** is not the last item in the tree. +*/ +static TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ if( p==0 ){ - p = sqlite3_malloc( sizeof(*p) ); + p = sqlite3_malloc64( sizeof(*p) ); if( p==0 ) return 0; memset(p, 0, sizeof(*p)); }else{ @@ -22150,53 +27883,543 @@ SQLITE_PRIVATE TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ if( p->iLevel<sizeof(p->bLine) ) p->bLine[p->iLevel] = moreToFollow; return p; } -/* Finished with one layer of the tree */ -SQLITE_PRIVATE void sqlite3TreeViewPop(TreeView *p){ + +/* +** Finished with one layer of the tree +*/ +static void sqlite3TreeViewPop(TreeView *p){ if( p==0 ) return; p->iLevel--; if( p->iLevel<0 ) sqlite3_free(p); } -/* Generate a single line of output for the tree, with a prefix that contains -** all the appropriate tree lines */ -SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ + +/* +** Generate a single line of output for the tree, with a prefix that contains +** all the appropriate tree lines +*/ +static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ va_list ap; int i; StrAccum acc; char zBuf[500]; - sqlite3StrAccumInit(&acc, zBuf, sizeof(zBuf), 0); - acc.useMalloc = 0; + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); if( p ){ for(i=0; i<p->iLevel && i<sizeof(p->bLine)-1; i++){ - sqlite3StrAccumAppend(&acc, p->bLine[i] ? "| " : " ", 4); + sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4); } - sqlite3StrAccumAppend(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); + sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); + } + if( zFormat!=0 ){ + va_start(ap, zFormat); + sqlite3_str_vappendf(&acc, zFormat, ap); + va_end(ap); + assert( acc.nChar>0 ); + sqlite3_str_append(&acc, "\n", 1); } - va_start(ap, zFormat); - sqlite3VXPrintf(&acc, 0, zFormat, ap); - va_end(ap); - if( zBuf[acc.nChar-1]!='\n' ) sqlite3StrAccumAppend(&acc, "\n", 1); sqlite3StrAccumFinish(&acc); fprintf(stdout,"%s", zBuf); fflush(stdout); } -/* Shorthand for starting a new tree item that consists of a single label */ -SQLITE_PRIVATE void sqlite3TreeViewItem(TreeView *p, const char *zLabel, u8 moreToFollow){ - p = sqlite3TreeViewPush(p, moreToFollow); - sqlite3TreeViewLine(p, "%s", zLabel); -} -#endif /* SQLITE_DEBUG */ /* -** variable-argument wrapper around sqlite3VXPrintf(). +** Shorthand for starting a new tree item that consists of a single label */ -SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, u32 bFlags, const char *zFormat, ...){ - va_list ap; - va_start(ap,zFormat); - sqlite3VXPrintf(p, bFlags, zFormat, ap); - va_end(ap); +static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ + p = sqlite3TreeViewPush(p, moreFollows); + sqlite3TreeViewLine(p, "%s", zLabel); } -/************** End of printf.c **********************************************/ +/* +** Generate a human-readable description of a WITH clause. +*/ +SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ + int i; + if( pWith==0 ) return; + if( pWith->nCte==0 ) return; + if( pWith->pOuter ){ + sqlite3TreeViewLine(pView, "WITH (0x%p, pOuter=0x%p)",pWith,pWith->pOuter); + }else{ + sqlite3TreeViewLine(pView, "WITH (0x%p)", pWith); + } + if( pWith->nCte>0 ){ + pView = sqlite3TreeViewPush(pView, 1); + for(i=0; i<pWith->nCte; i++){ + StrAccum x; + char zLine[1000]; + const struct Cte *pCte = &pWith->a[i]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "%s", pCte->zName); + if( pCte->pCols && pCte->pCols->nExpr>0 ){ + char cSep = '('; + int j; + for(j=0; j<pCte->pCols->nExpr; j++){ + sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zName); + cSep = ','; + } + sqlite3_str_appendf(&x, ")"); + } + sqlite3_str_appendf(&x, " AS"); + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, i<pWith->nCte-1); + sqlite3TreeViewSelect(pView, pCte->pSelect, 0); + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } +} + + +/* +** Generate a human-readable description of a Select object. +*/ +SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ + int n = 0; + int cnt = 0; + if( p==0 ){ + sqlite3TreeViewLine(pView, "nil-SELECT"); + return; + } + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( p->pWith ){ + sqlite3TreeViewWith(pView, p->pWith, 1); + cnt = 1; + sqlite3TreeViewPush(pView, 1); + } + do{ +#if SELECTTRACE_ENABLED + sqlite3TreeViewLine(pView, + "SELECT%s%s (%s/%p) selFlags=0x%x nSelectRow=%d", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), + p->zSelName, p, p->selFlags, + (int)p->nSelectRow + ); +#else + sqlite3TreeViewLine(pView, "SELECT%s%s (0x%p) selFlags=0x%x nSelectRow=%d", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), p, p->selFlags, + (int)p->nSelectRow + ); +#endif + if( cnt++ ) sqlite3TreeViewPop(pView); + if( p->pPrior ){ + n = 1000; + }else{ + n = 0; + if( p->pSrc && p->pSrc->nSrc ) n++; + if( p->pWhere ) n++; + if( p->pGroupBy ) n++; + if( p->pHaving ) n++; + if( p->pOrderBy ) n++; + if( p->pLimit ) n++; + } + sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); + if( p->pSrc && p->pSrc->nSrc ){ + int i; + pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewLine(pView, "FROM"); + for(i=0; i<p->pSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + StrAccum x; + char zLine[100]; + sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); + sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor); + if( pItem->zDatabase ){ + sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); + }else if( pItem->zName ){ + sqlite3_str_appendf(&x, " %s", pItem->zName); + } + if( pItem->pTab ){ + sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); + } + if( pItem->zAlias ){ + sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); + } + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&x, " LEFT-JOIN"); + } + sqlite3StrAccumFinish(&x); + sqlite3TreeViewItem(pView, zLine, i<p->pSrc->nSrc-1); + if( pItem->pSelect ){ + sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + } + if( pItem->fg.isTabFunc ){ + sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); + } + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } + if( p->pWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, p->pWhere, 0); + sqlite3TreeViewPop(pView); + } + if( p->pGroupBy ){ + sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); + } + if( p->pHaving ){ + sqlite3TreeViewItem(pView, "HAVING", (n--)>0); + sqlite3TreeViewExpr(pView, p->pHaving, 0); + sqlite3TreeViewPop(pView); + } + if( p->pOrderBy ){ + sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY"); + } + if( p->pLimit ){ + sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit->pLeft, p->pLimit->pRight!=0); + if( p->pLimit->pRight ){ + sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); + sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0); + sqlite3TreeViewPop(pView); + } + sqlite3TreeViewPop(pView); + } + if( p->pPrior ){ + const char *zOp = "UNION"; + switch( p->op ){ + case TK_ALL: zOp = "UNION ALL"; break; + case TK_INTERSECT: zOp = "INTERSECT"; break; + case TK_EXCEPT: zOp = "EXCEPT"; break; + } + sqlite3TreeViewItem(pView, zOp, 1); + } + p = p->pPrior; + }while( p!=0 ); + sqlite3TreeViewPop(pView); +} + +/* +** Generate a human-readable explanation of an expression tree. +*/ +SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ + const char *zBinOp = 0; /* Binary operator */ + const char *zUniOp = 0; /* Unary operator */ + char zFlgs[60]; + pView = sqlite3TreeViewPush(pView, moreToFollow); + if( pExpr==0 ){ + sqlite3TreeViewLine(pView, "nil"); + sqlite3TreeViewPop(pView); + return; + } + if( pExpr->flags ){ + if( ExprHasProperty(pExpr, EP_FromJoin) ){ + sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x iRJT=%d", + pExpr->flags, pExpr->iRightJoinTable); + }else{ + sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x",pExpr->flags); + } + }else{ + zFlgs[0] = 0; + } + switch( pExpr->op ){ + case TK_AGG_COLUMN: { + sqlite3TreeViewLine(pView, "AGG{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + break; + } + case TK_COLUMN: { + if( pExpr->iTable<0 ){ + /* This only happens when coding check constraints */ + sqlite3TreeViewLine(pView, "COLUMN(%d)%s", pExpr->iColumn, zFlgs); + }else{ + sqlite3TreeViewLine(pView, "{%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + } + break; + } + case TK_INTEGER: { + if( pExpr->flags & EP_IntValue ){ + sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); + }else{ + sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); + } + break; + } +#ifndef SQLITE_OMIT_FLOATING_POINT + case TK_FLOAT: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_STRING: { + sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); + break; + } + case TK_NULL: { + sqlite3TreeViewLine(pView,"NULL"); + break; + } + case TK_TRUEFALSE: { + sqlite3TreeViewLine(pView, + sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE"); + break; + } +#ifndef SQLITE_OMIT_BLOB_LITERAL + case TK_BLOB: { + sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); + break; + } +#endif + case TK_VARIABLE: { + sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", + pExpr->u.zToken, pExpr->iColumn); + break; + } + case TK_REGISTER: { + sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); + break; + } + case TK_ID: { + sqlite3TreeViewLine(pView,"ID \"%w\"", pExpr->u.zToken); + break; + } +#ifndef SQLITE_OMIT_CAST + case TK_CAST: { + /* Expressions of the form: CAST(pLeft AS token) */ + sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } +#endif /* SQLITE_OMIT_CAST */ + case TK_LT: zBinOp = "LT"; break; + case TK_LE: zBinOp = "LE"; break; + case TK_GT: zBinOp = "GT"; break; + case TK_GE: zBinOp = "GE"; break; + case TK_NE: zBinOp = "NE"; break; + case TK_EQ: zBinOp = "EQ"; break; + case TK_IS: zBinOp = "IS"; break; + case TK_ISNOT: zBinOp = "ISNOT"; break; + case TK_AND: zBinOp = "AND"; break; + case TK_OR: zBinOp = "OR"; break; + case TK_PLUS: zBinOp = "ADD"; break; + case TK_STAR: zBinOp = "MUL"; break; + case TK_MINUS: zBinOp = "SUB"; break; + case TK_REM: zBinOp = "REM"; break; + case TK_BITAND: zBinOp = "BITAND"; break; + case TK_BITOR: zBinOp = "BITOR"; break; + case TK_SLASH: zBinOp = "DIV"; break; + case TK_LSHIFT: zBinOp = "LSHIFT"; break; + case TK_RSHIFT: zBinOp = "RSHIFT"; break; + case TK_CONCAT: zBinOp = "CONCAT"; break; + case TK_DOT: zBinOp = "DOT"; break; + + case TK_UMINUS: zUniOp = "UMINUS"; break; + case TK_UPLUS: zUniOp = "UPLUS"; break; + case TK_BITNOT: zUniOp = "BITNOT"; break; + case TK_NOT: zUniOp = "NOT"; break; + case TK_ISNULL: zUniOp = "ISNULL"; break; + case TK_NOTNULL: zUniOp = "NOTNULL"; break; + + case TK_TRUTH: { + int x; + const char *azOp[] = { + "IS-FALSE", "IS-TRUE", "IS-NOT-FALSE", "IS-NOT-TRUE" + }; + assert( pExpr->op2==TK_IS || pExpr->op2==TK_ISNOT ); + assert( pExpr->pRight ); + assert( pExpr->pRight->op==TK_TRUEFALSE ); + x = (pExpr->op2==TK_ISNOT)*2 + sqlite3ExprTruthValue(pExpr->pRight); + zUniOp = azOp[x]; + break; + } + + case TK_SPAN: { + sqlite3TreeViewLine(pView, "SPAN %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_COLLATE: { + sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + + case TK_AGG_FUNCTION: + case TK_FUNCTION: { + ExprList *pFarg; /* List of function arguments */ + if( ExprHasProperty(pExpr, EP_TokenOnly) ){ + pFarg = 0; + }else{ + pFarg = pExpr->x.pList; + } + if( pExpr->op==TK_AGG_FUNCTION ){ + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", + pExpr->op2, pExpr->u.zToken); + }else{ + sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); + } + if( pFarg ){ + sqlite3TreeViewExprList(pView, pFarg, 0, 0); + } + break; + } +#ifndef SQLITE_OMIT_SUBQUERY + case TK_EXISTS: { + sqlite3TreeViewLine(pView, "EXISTS-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_SELECT: { + sqlite3TreeViewLine(pView, "SELECT-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + break; + } + case TK_IN: { + sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); + }else{ + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + } + break; + } +#endif /* SQLITE_OMIT_SUBQUERY */ + + /* + ** x BETWEEN y AND z + ** + ** This is equivalent to + ** + ** x>=y AND x<=z + ** + ** X is stored in pExpr->pLeft. + ** Y is stored in pExpr->pList->a[0].pExpr. + ** Z is stored in pExpr->pList->a[1].pExpr. + */ + case TK_BETWEEN: { + Expr *pX = pExpr->pLeft; + Expr *pY = pExpr->x.pList->a[0].pExpr; + Expr *pZ = pExpr->x.pList->a[1].pExpr; + sqlite3TreeViewLine(pView, "BETWEEN"); + sqlite3TreeViewExpr(pView, pX, 1); + sqlite3TreeViewExpr(pView, pY, 1); + sqlite3TreeViewExpr(pView, pZ, 0); + break; + } + case TK_TRIGGER: { + /* If the opcode is TK_TRIGGER, then the expression is a reference + ** to a column in the new.* or old.* pseudo-tables available to + ** trigger programs. In this case Expr.iTable is set to 1 for the + ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn + ** is set to the column of the pseudo-table to read, or to -1 to + ** read the rowid field. + */ + sqlite3TreeViewLine(pView, "%s(%d)", + pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); + break; + } + case TK_CASE: { + sqlite3TreeViewLine(pView, "CASE"); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); + break; + } +#ifndef SQLITE_OMIT_TRIGGER + case TK_RAISE: { + const char *zType = "unk"; + switch( pExpr->affinity ){ + case OE_Rollback: zType = "rollback"; break; + case OE_Abort: zType = "abort"; break; + case OE_Fail: zType = "fail"; break; + case OE_Ignore: zType = "ignore"; break; + } + sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); + break; + } +#endif + case TK_MATCH: { + sqlite3TreeViewLine(pView, "MATCH {%d:%d}%s", + pExpr->iTable, pExpr->iColumn, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + break; + } + case TK_VECTOR: { + sqlite3TreeViewBareExprList(pView, pExpr->x.pList, "VECTOR"); + break; + } + case TK_SELECT_COLUMN: { + sqlite3TreeViewLine(pView, "SELECT-COLUMN %d", pExpr->iColumn); + sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); + break; + } + case TK_IF_NULL_ROW: { + sqlite3TreeViewLine(pView, "IF-NULL-ROW %d", pExpr->iTable); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + break; + } + default: { + sqlite3TreeViewLine(pView, "op=%d", pExpr->op); + break; + } + } + if( zBinOp ){ + sqlite3TreeViewLine(pView, "%s%s", zBinOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); + sqlite3TreeViewExpr(pView, pExpr->pRight, 0); + }else if( zUniOp ){ + sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + } + sqlite3TreeViewPop(pView); +} + + +/* +** Generate a human-readable explanation of an expression list. +*/ +SQLITE_PRIVATE void sqlite3TreeViewBareExprList( + TreeView *pView, + const ExprList *pList, + const char *zLabel +){ + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + int i; + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; i<pList->nExpr; i++){ + int j = pList->a[i].u.x.iOrderByCol; + char *zName = pList->a[i].zName; + int moreToFollow = i<pList->nExpr - 1; + if( j || zName ){ + sqlite3TreeViewPush(pView, moreToFollow); + moreToFollow = 0; + sqlite3TreeViewLine(pView, 0); + if( zName ){ + fprintf(stdout, "AS %s ", zName); + } + if( j ){ + fprintf(stdout, "iOrderByCol=%d", j); + } + fprintf(stdout, "\n"); + fflush(stdout); + } + sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow); + if( j || zName ){ + sqlite3TreeViewPop(pView); + } + } + } +} +SQLITE_PRIVATE void sqlite3TreeViewExprList( + TreeView *pView, + const ExprList *pList, + u8 moreToFollow, + const char *zLabel +){ + pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewBareExprList(pView, pList, zLabel); + sqlite3TreeViewPop(pView); +} + +#endif /* SQLITE_DEBUG */ + +/************** End of treeview.c ********************************************/ /************** Begin file random.c ******************************************/ /* ** 2001 September 15 @@ -22215,6 +28438,7 @@ SQLITE_PRIVATE void sqlite3XPrintf(StrAccum *p, u32 bFlags, const char *zFormat, ** Random numbers are used by some of the database backends in order ** to generate random integer keys for tables or random filenames. */ +/* #include "sqliteInt.h" */ /* All threads share a single random number generator. @@ -22305,7 +28529,7 @@ SQLITE_API void sqlite3_randomness(int N, void *pBuf){ sqlite3_mutex_leave(mutex); } -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE /* ** For testing purposes, we sometimes want to preserve the state of ** PRNG and restore the PRNG to its saved state at a later time, or @@ -22330,7 +28554,7 @@ SQLITE_PRIVATE void sqlite3PrngRestoreState(void){ sizeof(sqlite3Prng) ); } -#endif /* SQLITE_OMIT_BUILTIN_TEST */ +#endif /* SQLITE_UNTESTABLE */ /************** End of random.c **********************************************/ /************** Begin file threads.c *****************************************/ @@ -22361,7 +28585,9 @@ SQLITE_PRIVATE void sqlite3PrngRestoreState(void){ ** of multiple cores can do so, while also allowing applications to stay ** single-threaded if desired. */ +/* #include "sqliteInt.h" */ #if SQLITE_OS_WIN +/* # include "os_win.h" */ #endif #if SQLITE_MAX_WORKER_THREADS>0 @@ -22397,10 +28623,14 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( *ppThread = 0; p = sqlite3Malloc(sizeof(*p)); - if( p==0 ) return SQLITE_NOMEM; + if( p==0 ) return SQLITE_NOMEM_BKPT; memset(p, 0, sizeof(*p)); p->xTask = xTask; p->pIn = pIn; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** for testing purposes. */ if( sqlite3FaultSim(200) ){ rc = 1; }else{ @@ -22419,7 +28649,7 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ int rc; assert( ppOut!=0 ); - if( NEVER(p==0) ) return SQLITE_NOMEM; + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; if( p->done ){ *ppOut = p->pOut; rc = SQLITE_OK; @@ -22435,7 +28665,7 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ /********************************* Win32 Threads ****************************/ -#if SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_THREADSAFE>0 +#if SQLITE_OS_WIN_THREADS #define SQLITE_THREADS_IMPLEMENTED 1 /* Prevent the single-thread code below */ #include <process.h> @@ -22484,8 +28714,13 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( assert( xTask!=0 ); *ppThread = 0; p = sqlite3Malloc(sizeof(*p)); - if( p==0 ) return SQLITE_NOMEM; - if( sqlite3GlobalConfig.bCoreMutex==0 ){ + if( p==0 ) return SQLITE_NOMEM_BKPT; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** (via the sqlite3FaultSim() term of the conditional) for testing + ** purposes. */ + if( sqlite3GlobalConfig.bCoreMutex==0 || sqlite3FaultSim(200) ){ memset(p, 0, sizeof(*p)); }else{ p->xTask = xTask; @@ -22511,9 +28746,9 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ BOOL bRc; assert( ppOut!=0 ); - if( NEVER(p==0) ) return SQLITE_NOMEM; + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; if( p->xTask==0 ){ - assert( p->id==GetCurrentThreadId() ); + /* assert( p->id==GetCurrentThreadId() ); */ rc = WAIT_OBJECT_0; assert( p->tid==0 ); }else{ @@ -22528,7 +28763,7 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ return (rc==WAIT_OBJECT_0) ? SQLITE_OK : SQLITE_ERROR; } -#endif /* SQLITE_OS_WIN && !SQLITE_OS_WINCE && !SQLITE_OS_WINRT */ +#endif /* SQLITE_OS_WIN_THREADS */ /******************************** End Win32 Threads *************************/ @@ -22559,7 +28794,7 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( assert( xTask!=0 ); *ppThread = 0; p = sqlite3Malloc(sizeof(*p)); - if( p==0 ) return SQLITE_NOMEM; + if( p==0 ) return SQLITE_NOMEM_BKPT; if( (SQLITE_PTR_TO_INT(p)/17)&1 ){ p->xTask = xTask; p->pIn = pIn; @@ -22575,7 +28810,7 @@ SQLITE_PRIVATE int sqlite3ThreadCreate( SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ assert( ppOut!=0 ); - if( NEVER(p==0) ) return SQLITE_NOMEM; + if( NEVER(p==0) ) return SQLITE_NOMEM_BKPT; if( p->xTask ){ *ppOut = p->xTask(p->pIn); }else{ @@ -22586,7 +28821,7 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ #if defined(SQLITE_TEST) { void *pTstAlloc = sqlite3Malloc(10); - if (!pTstAlloc) return SQLITE_NOMEM; + if (!pTstAlloc) return SQLITE_NOMEM_BKPT; sqlite3_free(pTstAlloc); } #endif @@ -22635,15 +28870,17 @@ SQLITE_PRIVATE int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ ** 0xfe 0xff big-endian utf-16 follows ** */ +/* #include "sqliteInt.h" */ /* #include <assert.h> */ +/* #include "vdbeInt.h" */ -#ifndef SQLITE_AMALGAMATION +#if !defined(SQLITE_AMALGAMATION) && SQLITE_BYTEORDER==0 /* ** The following constant value is used by the SQLITE_BIGENDIAN and ** SQLITE_LITTLEENDIAN macros. */ SQLITE_PRIVATE const int sqlite3one = 1; -#endif /* SQLITE_AMALGAMATION */ +#endif /* SQLITE_AMALGAMATION && SQLITE_BYTEORDER==0 */ /* ** This lookup table is used to help decode the first byte of @@ -22831,7 +29068,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired rc = sqlite3VdbeMemMakeWriteable(pMem); if( rc!=SQLITE_OK ){ assert( rc==SQLITE_NOMEM ); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } zIn = (u8*)pMem->z; zTerm = &zIn[pMem->n&~1]; @@ -22873,7 +29110,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired zTerm = &zIn[pMem->n]; zOut = sqlite3DbMallocRaw(pMem->db, len); if( !zOut ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } z = zOut; @@ -22916,7 +29153,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desired c = pMem->flags; sqlite3VdbeMemRelease(pMem); - pMem->flags = MEM_Str|MEM_Term|(c&MEM_AffMask); + pMem->flags = MEM_Str|MEM_Term|(c&(MEM_AffMask|MEM_Subtype)); pMem->enc = desiredEnc; pMem->z = (char*)zOut; pMem->zMalloc = pMem->z; @@ -22932,7 +29169,9 @@ translate_out: #endif return SQLITE_OK; } +#endif /* SQLITE_OMIT_UTF16 */ +#ifndef SQLITE_OMIT_UTF16 /* ** This routine checks for a byte-order mark at the beginning of the ** UTF-16 string stored in *pMem. If one is present, it is removed and @@ -23148,6 +29387,7 @@ SQLITE_PRIVATE void sqlite3UtfSelfTest(void){ ** strings, and stuff like that. ** */ +/* #include "sqliteInt.h" */ /* #include <stdarg.h> */ #if HAVE_ISNAN || SQLITE_HAVE_ISNAN # include <math.h> @@ -23174,7 +29414,7 @@ SQLITE_PRIVATE void sqlite3Coverage(int x){ ** Return whatever integer value the test callback returns, or return ** SQLITE_OK if no test callback is installed. */ -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE SQLITE_PRIVATE int sqlite3FaultSim(int iTest){ int (*xCallback)(int) = sqlite3GlobalConfig.xTestCallback; return xCallback ? xCallback(iTest) : SQLITE_OK; @@ -23237,19 +29477,53 @@ SQLITE_PRIVATE int sqlite3IsNaN(double x){ ** than 1GiB) the value returned might be less than the true string length. */ SQLITE_PRIVATE int sqlite3Strlen30(const char *z){ - const char *z2 = z; if( z==0 ) return 0; - while( *z2 ){ z2++; } - return 0x3fffffff & (int)(z2 - z); + return 0x3fffffff & (int)strlen(z); +} + +/* +** Return the declared type of a column. Or return zDflt if the column +** has no declared type. +** +** The column type is an extra string stored after the zero-terminator on +** the column name if and only if the COLFLAG_HASTYPE flag is set. +*/ +SQLITE_PRIVATE char *sqlite3ColumnType(Column *pCol, char *zDflt){ + if( (pCol->colFlags & COLFLAG_HASTYPE)==0 ) return zDflt; + return pCol->zName + strlen(pCol->zName) + 1; +} + +/* +** Helper function for sqlite3Error() - called rarely. Broken out into +** a separate routine to avoid unnecessary register saves on entry to +** sqlite3Error(). +*/ +static SQLITE_NOINLINE void sqlite3ErrorFinish(sqlite3 *db, int err_code){ + if( db->pErr ) sqlite3ValueSetNull(db->pErr); + sqlite3SystemError(db, err_code); } /* ** Set the current error code to err_code and clear any prior error message. +** Also set iSysErrno (by calling sqlite3System) if the err_code indicates +** that would be appropriate. */ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ assert( db!=0 ); db->errCode = err_code; - if( db->pErr ) sqlite3ValueSetNull(db->pErr); + if( err_code || db->pErr ) sqlite3ErrorFinish(db, err_code); +} + +/* +** Load the sqlite3.iSysErrno field if that is an appropriate thing +** to do based on the SQLite error code in rc. +*/ +SQLITE_PRIVATE void sqlite3SystemError(sqlite3 *db, int rc){ + if( rc==SQLITE_IOERR_NOMEM ) return; + rc &= 0xff; + if( rc==SQLITE_CANTOPEN || rc==SQLITE_IOERR ){ + db->iSysErrno = sqlite3OsGetLastError(db->pVfs); + } } /* @@ -23276,6 +29550,7 @@ SQLITE_PRIVATE void sqlite3Error(sqlite3 *db, int err_code){ SQLITE_PRIVATE void sqlite3ErrorWithMsg(sqlite3 *db, int err_code, const char *zFormat, ...){ assert( db!=0 ); db->errCode = err_code; + sqlite3SystemError(db, err_code); if( zFormat==0 ){ sqlite3Error(db, err_code); }else if( db->pErr || (db->pErr = sqlite3ValueNew(db))!=0 ){ @@ -23339,18 +29614,13 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ ** brackets from around identifiers. For example: "[a-b-c]" becomes ** "a-b-c". */ -SQLITE_PRIVATE int sqlite3Dequote(char *z){ +SQLITE_PRIVATE void sqlite3Dequote(char *z){ char quote; int i, j; - if( z==0 ) return -1; + if( z==0 ) return; quote = z[0]; - switch( quote ){ - case '\'': break; - case '"': break; - case '`': break; /* For MySQL compatibility */ - case '[': quote = ']'; break; /* For MS SqlServer compatibility */ - default: return -1; - } + if( !sqlite3Isquote(quote) ) return; + if( quote=='[' ) quote = ']'; for(i=1, j=0;; i++){ assert( z[i] ); if( z[i]==quote ){ @@ -23365,7 +29635,14 @@ SQLITE_PRIVATE int sqlite3Dequote(char *z){ } } z[j] = 0; - return j; +} + +/* +** Generate a Token object from a string +*/ +SQLITE_PRIVATE void sqlite3TokenInit(Token *p, char *z){ + p->z = z; + p->n = sqlite3Strlen30(z); } /* Convenient short-hand */ @@ -23382,16 +29659,25 @@ SQLITE_PRIVATE int sqlite3Dequote(char *z){ ** independence" that SQLite uses internally when comparing identifiers. */ SQLITE_API int sqlite3_stricmp(const char *zLeft, const char *zRight){ - register unsigned char *a, *b; if( zLeft==0 ){ return zRight ? -1 : 0; }else if( zRight==0 ){ return 1; } + return sqlite3StrICmp(zLeft, zRight); +} +SQLITE_PRIVATE int sqlite3StrICmp(const char *zLeft, const char *zRight){ + unsigned char *a, *b; + int c; a = (unsigned char *)zLeft; b = (unsigned char *)zRight; - while( *a!=0 && UpperToLower[*a]==UpperToLower[*b]){ a++; b++; } - return UpperToLower[*a] - UpperToLower[*b]; + for(;;){ + c = (int)UpperToLower[*a] - (int)UpperToLower[*b]; + if( c || *a==0 ) break; + a++; + b++; + } + return c; } SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ register unsigned char *a, *b; @@ -23406,6 +29692,45 @@ SQLITE_API int sqlite3_strnicmp(const char *zLeft, const char *zRight, int N){ return N<0 ? 0 : UpperToLower[*a] - UpperToLower[*b]; } +/* +** Compute 10 to the E-th power. Examples: E==1 results in 10. +** E==2 results in 100. E==50 results in 1.0e50. +** +** This routine only works for values of E between 1 and 341. +*/ +static LONGDOUBLE_TYPE sqlite3Pow10(int E){ +#if defined(_MSC_VER) + static const LONGDOUBLE_TYPE x[] = { + 1.0e+001, + 1.0e+002, + 1.0e+004, + 1.0e+008, + 1.0e+016, + 1.0e+032, + 1.0e+064, + 1.0e+128, + 1.0e+256 + }; + LONGDOUBLE_TYPE r = 1.0; + int i; + assert( E>=0 && E<=307 ); + for(i=0; E!=0; i++, E >>=1){ + if( E & 1 ) r *= x[i]; + } + return r; +#else + LONGDOUBLE_TYPE x = 10.0; + LONGDOUBLE_TYPE r = 1.0; + while(1){ + if( E & 1 ) r *= x; + E >>= 1; + if( E==0 ) break; + x *= x; + } + return r; +#endif +} + /* ** The string z[] is an text representation of a real number. ** Convert this string to a double and write it into *pResult. @@ -23441,7 +29766,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en int eValid = 1; /* True exponent is either not used or is well-formed */ double result; int nDigits = 0; - int nonNum = 0; + int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); *pResult = 0.0; /* Default return value, in case of an error */ @@ -23454,7 +29779,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); for(i=3-enc; i<length && z[i]==0; i+=2){} nonNum = i<length; - zEnd = z+i+enc-3; + zEnd = &z[i^1]; z += (enc&1); } @@ -23470,18 +29795,15 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en z+=incr; } - /* skip leading zeroes */ - while( z<zEnd && z[0]=='0' ) z+=incr, nDigits++; - /* copy max significant digits to significand */ while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){ s = s*10 + (*z - '0'); - z+=incr, nDigits++; + z+=incr; nDigits++; } /* skip non-significant significand digits ** (increase exponent by d to shift decimal left) */ - while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++, d++; + while( z<zEnd && sqlite3Isdigit(*z) ){ z+=incr; nDigits++; d++; } if( z>=zEnd ) goto do_atof_calc; /* if decimal point is present */ @@ -23489,12 +29811,13 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en z+=incr; /* copy digits from after decimal to significand ** (decrease exponent by d to shift decimal right) */ - while( z<zEnd && sqlite3Isdigit(*z) && s<((LARGEST_INT64-9)/10) ){ - s = s*10 + (*z - '0'); - z+=incr, nDigits++, d--; + while( z<zEnd && sqlite3Isdigit(*z) ){ + if( s<((LARGEST_INT64-9)/10) ){ + s = s*10 + (*z - '0'); + d--; + } + z+=incr; nDigits++; } - /* skip non-significant digits */ - while( z<zEnd && sqlite3Isdigit(*z) ) z+=incr, nDigits++; } if( z>=zEnd ) goto do_atof_calc; @@ -23502,7 +29825,12 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en if( *z=='e' || *z=='E' ){ z+=incr; eValid = 0; - if( z>=zEnd ) goto do_atof_calc; + + /* This branch is needed to avoid a (harmless) buffer overread. The + ** special comment alerts the mutation tester that the correct answer + ** is obtained even if the branch is omitted */ + if( z>=zEnd ) goto do_atof_calc; /*PREVENTS-HARMLESS-OVERREAD*/ + /* get sign of exponent */ if( *z=='-' ){ esign = -1; @@ -23519,9 +29847,7 @@ SQLITE_PRIVATE int sqlite3AtoF(const char *z, double *pResult, int length, u8 en } /* skip trailing spaces */ - if( nDigits && eValid ){ - while( z<zEnd && sqlite3Isspace(*z) ) z+=incr; - } + while( z<zEnd && sqlite3Isspace(*z) ) z+=incr; do_atof_calc: /* adjust exponent by d, and update sign */ @@ -23533,55 +29859,63 @@ do_atof_calc: esign = 1; } - /* if 0 significand */ - if( !s ) { - /* In the IEEE 754 standard, zero is signed. - ** Add the sign if we've seen at least one digit */ - result = (sign<0 && nDigits) ? -(double)0 : (double)0; + if( s==0 ) { + /* In the IEEE 754 standard, zero is signed. */ + result = sign<0 ? -(double)0 : (double)0; } else { - /* attempt to reduce exponent */ - if( esign>0 ){ - while( s<(LARGEST_INT64/10) && e>0 ) e--,s*=10; - }else{ - while( !(s%10) && e>0 ) e--,s/=10; + /* Attempt to reduce exponent. + ** + ** Branches that are not required for the correct answer but which only + ** help to obtain the correct answer faster are marked with special + ** comments, as a hint to the mutation tester. + */ + while( e>0 ){ /*OPTIMIZATION-IF-TRUE*/ + if( esign>0 ){ + if( s>=(LARGEST_INT64/10) ) break; /*OPTIMIZATION-IF-FALSE*/ + s *= 10; + }else{ + if( s%10!=0 ) break; /*OPTIMIZATION-IF-FALSE*/ + s /= 10; + } + e--; } /* adjust the sign of significand */ s = sign<0 ? -s : s; - /* if exponent, scale significand as appropriate - ** and store in result. */ - if( e ){ - LONGDOUBLE_TYPE scale = 1.0; + if( e==0 ){ /*OPTIMIZATION-IF-TRUE*/ + result = (double)s; + }else{ /* attempt to handle extremely small/large numbers better */ - if( e>307 && e<342 ){ - while( e%308 ) { scale *= 1.0e+1; e -= 1; } - if( esign<0 ){ - result = s / scale; - result /= 1.0e+308; - }else{ - result = s * scale; - result *= 1.0e+308; - } - }else if( e>=342 ){ - if( esign<0 ){ - result = 0.0*s; - }else{ - result = 1e308*1e308*s; /* Infinity */ + if( e>307 ){ /*OPTIMIZATION-IF-TRUE*/ + if( e<342 ){ /*OPTIMIZATION-IF-TRUE*/ + LONGDOUBLE_TYPE scale = sqlite3Pow10(e-308); + if( esign<0 ){ + result = s / scale; + result /= 1.0e+308; + }else{ + result = s * scale; + result *= 1.0e+308; + } + }else{ assert( e>=342 ); + if( esign<0 ){ + result = 0.0*s; + }else{ +#ifdef INFINITY + result = INFINITY*s; +#else + result = 1e308*1e308*s; /* Infinity */ +#endif + } } }else{ - /* 1.0e+22 is the largest power of 10 than can be - ** represented exactly. */ - while( e%22 ) { scale *= 1.0e+1; e -= 1; } - while( e>0 ) { scale *= 1.0e+22; e -= 22; } + LONGDOUBLE_TYPE scale = sqlite3Pow10(e); if( esign<0 ){ result = s / scale; }else{ result = s * scale; } } - } else { - result = (double)s; } } @@ -23589,7 +29923,7 @@ do_atof_calc: *pResult = result; /* return true if number and no extra non-whitespace chracters after */ - return z>=zEnd && nDigits>0 && eValid && nonNum==0; + return z==zEnd && nDigits>0 && eValid && nonNum==0; #else return !sqlite3Atoi64(z, pResult, length, enc); #endif /* SQLITE_OMIT_FLOATING_POINT */ @@ -23630,16 +29964,12 @@ static int compare2pow63(const char *zNum, int incr){ ** Convert zNum to a 64-bit signed integer. zNum must be decimal. This ** routine does *not* accept hexadecimal notation. ** -** If the zNum value is representable as a 64-bit twos-complement -** integer, then write that value into *pNum and return 0. +** Returns: ** -** If zNum is exactly 9223372036854775808, return 2. This special -** case is broken out because while 9223372036854775808 cannot be a -** signed 64-bit integer, its negative -9223372036854775808 can be. -** -** If zNum is too big for a 64-bit integer and is not -** 9223372036854775808 or if zNum contains any non-numeric text, -** then return 1. +** 0 Successful transformation. Fits in a 64-bit signed integer. +** 1 Excess non-space text after the integer value +** 2 Integer too large for a 64-bit signed integer or is malformed +** 3 Special case of 9223372036854775808 ** ** length is the number of bytes in the string (bytes, not characters). ** The string is not necessarily zero-terminated. The encoding is @@ -23651,7 +29981,8 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc int neg = 0; /* assume positive */ int i; int c = 0; - int nonNum = 0; + int nonNum = 0; /* True if input contains UTF16 with high byte non-zero */ + int rc; /* Baseline return code */ const char *zStart; const char *zEnd = zNum + length; assert( enc==SQLITE_UTF8 || enc==SQLITE_UTF16LE || enc==SQLITE_UTF16BE ); @@ -23662,7 +29993,7 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); for(i=3-enc; i<length && zNum[i]==0; i+=2){} nonNum = i<length; - zEnd = zNum+i+enc-3; + zEnd = &zNum[i^1]; zNum += (enc&1); } while( zNum<zEnd && sqlite3Isspace(*zNum) ) zNum+=incr; @@ -23679,39 +30010,57 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc for(i=0; &zNum[i]<zEnd && (c=zNum[i])>='0' && c<='9'; i+=incr){ u = u*10 + c - '0'; } + testcase( i==18*incr ); + testcase( i==19*incr ); + testcase( i==20*incr ); if( u>LARGEST_INT64 ){ + /* This test and assignment is needed only to suppress UB warnings + ** from clang and -fsanitize=undefined. This test and assignment make + ** the code a little larger and slower, and no harm comes from omitting + ** them, but we must appaise the undefined-behavior pharisees. */ *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; }else if( neg ){ *pNum = -(i64)u; }else{ *pNum = (i64)u; } - testcase( i==18 ); - testcase( i==19 ); - testcase( i==20 ); - if( (c!=0 && &zNum[i]<zEnd) || (i==0 && zStart==zNum) || i>19*incr || nonNum ){ - /* zNum is empty or contains non-numeric text or is longer - ** than 19 digits (thus guaranteeing that it is too large) */ - return 1; - }else if( i<19*incr ){ + rc = 0; + if( (i==0 && zStart==zNum) /* No digits */ + || nonNum /* UTF16 with high-order bytes non-zero */ + ){ + rc = 1; + }else if( &zNum[i]<zEnd ){ /* Extra bytes at the end */ + int jj = i; + do{ + if( !sqlite3Isspace(zNum[jj]) ){ + rc = 1; /* Extra non-space text after the integer */ + break; + } + jj += incr; + }while( &zNum[jj]<zEnd ); + } + if( i<19*incr ){ /* Less than 19 digits, so we know that it fits in 64 bits */ assert( u<=LARGEST_INT64 ); - return 0; + return rc; }else{ /* zNum is a 19-digit numbers. Compare it against 9223372036854775808. */ - c = compare2pow63(zNum, incr); + c = i>19*incr ? 1 : compare2pow63(zNum, incr); if( c<0 ){ /* zNum is less than 9223372036854775808 so it fits */ assert( u<=LARGEST_INT64 ); - return 0; - }else if( c>0 ){ - /* zNum is greater than 9223372036854775808 so it overflows */ - return 1; + return rc; }else{ - /* zNum is exactly 9223372036854775808. Fits if negative. The - ** special case 2 overflow if positive */ - assert( u-1==LARGEST_INT64 ); - return neg ? 0 : 2; + *pNum = neg ? SMALLEST_INT64 : LARGEST_INT64; + if( c>0 ){ + /* zNum is greater than 9223372036854775808 so it overflows */ + return 2; + }else{ + /* zNum is exactly 9223372036854775808. Fits if negative. The + ** special case 2 overflow if positive */ + assert( u-1==LARGEST_INT64 ); + return neg ? rc : 3; + } } } } @@ -23724,14 +30073,14 @@ SQLITE_PRIVATE int sqlite3Atoi64(const char *zNum, i64 *pNum, int length, u8 enc ** Returns: ** ** 0 Successful transformation. Fits in a 64-bit signed integer. -** 1 Integer too large for a 64-bit signed integer or is malformed -** 2 Special case of 9223372036854775808 +** 1 Excess text after the integer value +** 2 Integer too large for a 64-bit signed integer or is malformed +** 3 Special case of 9223372036854775808 */ SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){ #ifndef SQLITE_OMIT_HEX_INTEGER if( z[0]=='0' && (z[1]=='x' || z[1]=='X') - && sqlite3Isxdigit(z[2]) ){ u64 u = 0; int i, k; @@ -23740,7 +30089,7 @@ SQLITE_PRIVATE int sqlite3DecOrHexToI64(const char *z, i64 *pOut){ u = u*16 + sqlite3HexToInt(z[k]); } memcpy(pOut, &u, 8); - return (z[k]==0 && k-i<=16) ? 0 : 1; + return (z[k]==0 && k-i<=16) ? 0 : 2; }else #endif /* SQLITE_OMIT_HEX_INTEGER */ { @@ -23787,6 +30136,8 @@ SQLITE_PRIVATE int sqlite3GetInt32(const char *zNum, int *pValue){ } } #endif + if( !sqlite3Isdigit(zNum[0]) ) return 0; + while( zNum[0]=='0' ) zNum++; for(i=0; i<11 && (c = zNum[i] - '0')>=0 && c<=9; i++){ v = v*10 + c; } @@ -23977,7 +30328,8 @@ SQLITE_PRIVATE u8 sqlite3GetVarint(const unsigned char *p, u64 *v){ /* a: p0<<28 | p2<<14 | p4 (unmasked) */ if (!(a&0x80)) { - /* we can skip these cause they were (effectively) done above in calc'ing s */ + /* we can skip these cause they were (effectively) done above + ** while calculating s */ /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ /* b &= (0x7f<<14)|(0x7f); */ b = b<<7; @@ -24198,11 +30550,8 @@ SQLITE_PRIVATE u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){ ** 64-bit integer. */ SQLITE_PRIVATE int sqlite3VarintLen(u64 v){ - int i = 0; - do{ - i++; - v >>= 7; - }while( v!=0 && ALWAYS(i<9) ); + int i; + for(i=1; (v >>= 7)!=0; i++){ assert( i<10 ); } return i; } @@ -24211,14 +30560,38 @@ SQLITE_PRIVATE int sqlite3VarintLen(u64 v){ ** Read or write a four-byte big-endian integer value. */ SQLITE_PRIVATE u32 sqlite3Get4byte(const u8 *p){ +#if SQLITE_BYTEORDER==4321 + u32 x; + memcpy(&x,p,4); + return x; +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u32 x; + memcpy(&x,p,4); + return __builtin_bswap32(x); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u32 x; + memcpy(&x,p,4); + return _byteswap_ulong(x); +#else testcase( p[0]&0x80 ); return ((unsigned)p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3]; +#endif } SQLITE_PRIVATE void sqlite3Put4byte(unsigned char *p, u32 v){ +#if SQLITE_BYTEORDER==4321 + memcpy(p,&v,4); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u32 x = __builtin_bswap32(v); + memcpy(p,&x,4); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u32 x = _byteswap_ulong(v); + memcpy(p,&x,4); +#else p[0] = (u8)(v>>24); p[1] = (u8)(v>>16); p[2] = (u8)(v>>8); p[3] = (u8)v; +#endif } @@ -24250,7 +30623,7 @@ SQLITE_PRIVATE void *sqlite3HexToBlob(sqlite3 *db, const char *z, int n){ char *zBlob; int i; - zBlob = (char *)sqlite3DbMallocRaw(db, n/2 + 1); + zBlob = (char *)sqlite3DbMallocRawNN(db, n/2 + 1); n--; if( zBlob ){ for(i=0; i<n; i+=2){ @@ -24326,6 +30699,9 @@ SQLITE_PRIVATE int sqlite3SafetyCheckSickOrOk(sqlite3 *db){ ** overflow, leave *pA unchanged and return 1. */ SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_add_overflow(*pA, iB, pA); +#else i64 iA = *pA; testcase( iA==0 ); testcase( iA==1 ); testcase( iB==-1 ); testcase( iB==0 ); @@ -24340,8 +30716,12 @@ SQLITE_PRIVATE int sqlite3AddInt64(i64 *pA, i64 iB){ } *pA += iB; return 0; +#endif } SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_sub_overflow(*pA, iB, pA); +#else testcase( iB==SMALLEST_INT64+1 ); if( iB==SMALLEST_INT64 ){ testcase( (*pA)==(-1) ); testcase( (*pA)==0 ); @@ -24351,38 +30731,28 @@ SQLITE_PRIVATE int sqlite3SubInt64(i64 *pA, i64 iB){ }else{ return sqlite3AddInt64(pA, -iB); } +#endif } -#define TWOPOWER32 (((i64)1)<<32) -#define TWOPOWER31 (((i64)1)<<31) SQLITE_PRIVATE int sqlite3MulInt64(i64 *pA, i64 iB){ +#if GCC_VERSION>=5004000 && !defined(__INTEL_COMPILER) + return __builtin_mul_overflow(*pA, iB, pA); +#else i64 iA = *pA; - i64 iA1, iA0, iB1, iB0, r; - - iA1 = iA/TWOPOWER32; - iA0 = iA % TWOPOWER32; - iB1 = iB/TWOPOWER32; - iB0 = iB % TWOPOWER32; - if( iA1==0 ){ - if( iB1==0 ){ - *pA *= iB; - return 0; + if( iB>0 ){ + if( iA>LARGEST_INT64/iB ) return 1; + if( iA<SMALLEST_INT64/iB ) return 1; + }else if( iB<0 ){ + if( iA>0 ){ + if( iB<SMALLEST_INT64/iA ) return 1; + }else if( iA<0 ){ + if( iB==SMALLEST_INT64 ) return 1; + if( iA==SMALLEST_INT64 ) return 1; + if( -iA>LARGEST_INT64/-iB ) return 1; } - r = iA0*iB1; - }else if( iB1==0 ){ - r = iA1*iB0; - }else{ - /* If both iA1 and iB1 are non-zero, overflow will result */ - return 1; } - testcase( r==(-TWOPOWER31)-1 ); - testcase( r==(-TWOPOWER31) ); - testcase( r==TWOPOWER31 ); - testcase( r==TWOPOWER31-1 ); - if( r<(-TWOPOWER31) || r>=TWOPOWER31 ) return 1; - r *= TWOPOWER32; - if( sqlite3AddInt64(&r, iA0*iB0) ) return 1; - *pA = r; + *pA = iA*iB; return 0; +#endif } /* @@ -24466,8 +30836,14 @@ SQLITE_PRIVATE LogEst sqlite3LogEst(u64 x){ if( x<2 ) return 0; while( x<8 ){ y -= 10; x <<= 1; } }else{ - while( x>255 ){ y += 40; x >>= 4; } +#if GCC_VERSION>=5004000 + int i = 60 - __builtin_clzll(x); + y += i*10; + x >>= i; +#else + while( x>255 ){ y += 40; x >>= 4; } /*OPTIMIZATION-IF-TRUE*/ while( x>15 ){ y += 10; x >>= 1; } +#endif } return a[x&7] + y - 10; } @@ -24489,20 +30865,134 @@ SQLITE_PRIVATE LogEst sqlite3LogEstFromDouble(double x){ } #endif /* SQLITE_OMIT_VIRTUALTABLE */ +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) /* ** Convert a LogEst into an integer. +** +** Note that this routine is only used when one or more of various +** non-standard compile-time options is enabled. */ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ u64 n; - if( x<10 ) return 1; n = x%10; x /= 10; if( n>=5 ) n -= 2; else if( n>=1 ) n -= 1; - if( x>=3 ){ - return x>60 ? (u64)LARGEST_INT64 : (n+8)<<(x-3); +#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ + defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) + if( x>60 ) return (u64)LARGEST_INT64; +#else + /* If only SQLITE_ENABLE_STAT3_OR_STAT4 is on, then the largest input + ** possible to this routine is 310, resulting in a maximum x of 31 */ + assert( x<=60 ); +#endif + return x>=3 ? (n+8)<<(x-3) : (n+8)>>(3-x); +} +#endif /* defined SCANSTAT or STAT4 or ESTIMATED_ROWS */ + +/* +** Add a new name/number pair to a VList. This might require that the +** VList object be reallocated, so return the new VList. If an OOM +** error occurs, the original VList returned and the +** db->mallocFailed flag is set. +** +** A VList is really just an array of integers. To destroy a VList, +** simply pass it to sqlite3DbFree(). +** +** The first integer is the number of integers allocated for the whole +** VList. The second integer is the number of integers actually used. +** Each name/number pair is encoded by subsequent groups of 3 or more +** integers. +** +** Each name/number pair starts with two integers which are the numeric +** value for the pair and the size of the name/number pair, respectively. +** The text name overlays one or more following integers. The text name +** is always zero-terminated. +** +** Conceptually: +** +** struct VList { +** int nAlloc; // Number of allocated slots +** int nUsed; // Number of used slots +** struct VListEntry { +** int iValue; // Value for this entry +** int nSlot; // Slots used by this entry +** // ... variable name goes here +** } a[0]; +** } +** +** During code generation, pointers to the variable names within the +** VList are taken. When that happens, nAlloc is set to zero as an +** indication that the VList may never again be enlarged, since the +** accompanying realloc() would invalidate the pointers. +*/ +SQLITE_PRIVATE VList *sqlite3VListAdd( + sqlite3 *db, /* The database connection used for malloc() */ + VList *pIn, /* The input VList. Might be NULL */ + const char *zName, /* Name of symbol to add */ + int nName, /* Bytes of text in zName */ + int iVal /* Value to associate with zName */ +){ + int nInt; /* number of sizeof(int) objects needed for zName */ + char *z; /* Pointer to where zName will be stored */ + int i; /* Index in pIn[] where zName is stored */ + + nInt = nName/4 + 3; + assert( pIn==0 || pIn[0]>=3 ); /* Verify ok to add new elements */ + if( pIn==0 || pIn[1]+nInt > pIn[0] ){ + /* Enlarge the allocation */ + int nAlloc = (pIn ? pIn[0]*2 : 10) + nInt; + VList *pOut = sqlite3DbRealloc(db, pIn, nAlloc*sizeof(int)); + if( pOut==0 ) return pIn; + if( pIn==0 ) pOut[1] = 2; + pIn = pOut; + pIn[0] = nAlloc; } - return (n+8)>>(3-x); + i = pIn[1]; + pIn[i] = iVal; + pIn[i+1] = nInt; + z = (char*)&pIn[i+2]; + pIn[1] = i+nInt; + assert( pIn[1]<=pIn[0] ); + memcpy(z, zName, nName); + z[nName] = 0; + return pIn; +} + +/* +** Return a pointer to the name of a variable in the given VList that +** has the value iVal. Or return a NULL if there is no such variable in +** the list +*/ +SQLITE_PRIVATE const char *sqlite3VListNumToName(VList *pIn, int iVal){ + int i, mx; + if( pIn==0 ) return 0; + mx = pIn[1]; + i = 2; + do{ + if( pIn[i]==iVal ) return (char*)&pIn[i+2]; + i += pIn[i+1]; + }while( i<mx ); + return 0; +} + +/* +** Return the number of the variable named zName, if it is in VList. +** or return 0 if there is no such variable. +*/ +SQLITE_PRIVATE int sqlite3VListNameToNum(VList *pIn, const char *zName, int nName){ + int i, mx; + if( pIn==0 ) return 0; + mx = pIn[1]; + i = 2; + do{ + const char *z = (const char*)&pIn[i+2]; + if( strncmp(z,zName,nName)==0 && z[nName]==0 ) return pIn[i]; + i += pIn[i+1]; + }while( i<mx ); + return 0; } /************** End of util.c ************************************************/ @@ -24521,6 +31011,7 @@ SQLITE_PRIVATE u64 sqlite3LogEstToInt(LogEst x){ ** This is the implementation of generic hash-tables ** used in SQLite. */ +/* #include "sqliteInt.h" */ /* #include <assert.h> */ /* Turn bulk memory into a hash table object by initializing the @@ -24563,8 +31054,12 @@ SQLITE_PRIVATE void sqlite3HashClear(Hash *pH){ static unsigned int strHash(const char *z){ unsigned int h = 0; unsigned char c; - while( (c = (unsigned char)*z++)!=0 ){ - h = (h<<3) ^ h ^ sqlite3UpperToLower[c]; + while( (c = (unsigned char)*z++)!=0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Knuth multiplicative hashing. (Sorting & Searching, p. 510). + ** 0x9e3779b1 is 2654435761 which is the closest prime number to + ** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2. */ + h += sqlite3UpperToLower[c]; + h *= 0x9e3779b1; } return h; } @@ -24644,8 +31139,9 @@ static int rehash(Hash *pH, unsigned int new_size){ } /* This function (for internal use only) locates an element in an -** hash table that matches the given key. The hash for this key is -** also computed and returned in the *pH parameter. +** hash table that matches the given key. If no element is found, +** a pointer to a static null element with HashElem.data==0 is returned. +** If pH is not NULL, then the hash for this key is written to *pH. */ static HashElem *findElementWithHash( const Hash *pH, /* The pH to be searched */ @@ -24655,8 +31151,9 @@ static HashElem *findElementWithHash( HashElem *elem; /* Used to loop thru the element list */ int count; /* Number of elements left to test */ unsigned int h; /* The computed hash */ + static HashElem nullElement = { 0, 0, 0, 0 }; - if( pH->ht ){ + if( pH->ht ){ /*OPTIMIZATION-IF-TRUE*/ struct _ht *pEntry; h = strHash(pKey) % pH->htsize; pEntry = &pH->ht[h]; @@ -24667,7 +31164,7 @@ static HashElem *findElementWithHash( elem = pH->first; count = pH->count; } - *pHash = h; + if( pHash ) *pHash = h; while( count-- ){ assert( elem!=0 ); if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ @@ -24675,7 +31172,7 @@ static HashElem *findElementWithHash( } elem = elem->next; } - return 0; + return &nullElement; } /* Remove a single entry from the hash table given a pointer to that @@ -24717,13 +31214,9 @@ static void removeElementGivenHash( ** found, or NULL if there is no match. */ SQLITE_PRIVATE void *sqlite3HashFind(const Hash *pH, const char *pKey){ - HashElem *elem; /* The element that matches key */ - unsigned int h; /* A hash on key */ - assert( pH!=0 ); assert( pKey!=0 ); - elem = findElementWithHash(pH, pKey, &h); - return elem ? elem->data : 0; + return findElementWithHash(pH, pKey, 0)->data; } /* Insert an element into the hash table pH. The key is pKey @@ -24748,7 +31241,7 @@ SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ assert( pH!=0 ); assert( pKey!=0 ); elem = findElementWithHash(pH,pKey,&h); - if( elem ){ + if( elem->data ){ void *old_data = elem->data; if( data==0 ){ removeElementGivenHash(pH,elem,h); @@ -24777,170 +31270,189 @@ SQLITE_PRIVATE void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ /************** End of hash.c ************************************************/ /************** Begin file opcodes.c *****************************************/ /* Automatically generated. Do not edit */ -/* See the mkopcodec.awk script for details. */ -#if !defined(SQLITE_OMIT_EXPLAIN) || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) +/* See the tool/mkopcodec.tcl script for details. */ +#if !defined(SQLITE_OMIT_EXPLAIN) \ + || defined(VDBE_PROFILE) \ + || defined(SQLITE_DEBUG) #if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) || defined(SQLITE_DEBUG) # define OpHelp(X) "\0" X #else # define OpHelp(X) #endif SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ - static const char *const azName[] = { "?", - /* 1 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"), - /* 2 */ "Savepoint" OpHelp(""), - /* 3 */ "AutoCommit" OpHelp(""), - /* 4 */ "Transaction" OpHelp(""), - /* 5 */ "SorterNext" OpHelp(""), - /* 6 */ "PrevIfOpen" OpHelp(""), - /* 7 */ "NextIfOpen" OpHelp(""), - /* 8 */ "Prev" OpHelp(""), - /* 9 */ "Next" OpHelp(""), - /* 10 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 11 */ "Checkpoint" OpHelp(""), - /* 12 */ "JournalMode" OpHelp(""), - /* 13 */ "Vacuum" OpHelp(""), - /* 14 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), - /* 15 */ "VUpdate" OpHelp("data=r[P3@P2]"), - /* 16 */ "Goto" OpHelp(""), - /* 17 */ "Gosub" OpHelp(""), - /* 18 */ "Return" OpHelp(""), - /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), - /* 20 */ "InitCoroutine" OpHelp(""), - /* 21 */ "EndCoroutine" OpHelp(""), - /* 22 */ "Yield" OpHelp(""), - /* 23 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), - /* 24 */ "Halt" OpHelp(""), - /* 25 */ "Integer" OpHelp("r[P2]=P1"), - /* 26 */ "Int64" OpHelp("r[P2]=P4"), - /* 27 */ "String" OpHelp("r[P2]='P4' (len=P1)"), - /* 28 */ "Null" OpHelp("r[P2..P3]=NULL"), - /* 29 */ "SoftNull" OpHelp("r[P1]=NULL"), - /* 30 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 31 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), - /* 32 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), - /* 33 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 34 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 35 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 36 */ "CollSeq" OpHelp(""), - /* 37 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), - /* 38 */ "MustBeInt" OpHelp(""), - /* 39 */ "RealAffinity" OpHelp(""), - /* 40 */ "Cast" OpHelp("affinity(r[P1])"), - /* 41 */ "Permutation" OpHelp(""), - /* 42 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), - /* 43 */ "Jump" OpHelp(""), - /* 44 */ "Once" OpHelp(""), - /* 45 */ "If" OpHelp(""), - /* 46 */ "IfNot" OpHelp(""), - /* 47 */ "Column" OpHelp("r[P3]=PX"), - /* 48 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 49 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 50 */ "Count" OpHelp("r[P2]=count()"), - /* 51 */ "ReadCookie" OpHelp(""), - /* 52 */ "SetCookie" OpHelp(""), - /* 53 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 54 */ "OpenRead" OpHelp("root=P2 iDb=P3"), - /* 55 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), - /* 56 */ "OpenAutoindex" OpHelp("nColumn=P2"), - /* 57 */ "OpenEphemeral" OpHelp("nColumn=P2"), - /* 58 */ "SorterOpen" OpHelp(""), - /* 59 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), - /* 60 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), - /* 61 */ "Close" OpHelp(""), - /* 62 */ "SeekLT" OpHelp("key=r[P3@P4]"), - /* 63 */ "SeekLE" OpHelp("key=r[P3@P4]"), - /* 64 */ "SeekGE" OpHelp("key=r[P3@P4]"), - /* 65 */ "SeekGT" OpHelp("key=r[P3@P4]"), - /* 66 */ "Seek" OpHelp("intkey=r[P2]"), - /* 67 */ "NoConflict" OpHelp("key=r[P3@P4]"), - /* 68 */ "NotFound" OpHelp("key=r[P3@P4]"), - /* 69 */ "Found" OpHelp("key=r[P3@P4]"), - /* 70 */ "NotExists" OpHelp("intkey=r[P3]"), - /* 71 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), - /* 72 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), - /* 73 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), - /* 74 */ "NewRowid" OpHelp("r[P2]=rowid"), - /* 75 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), - /* 76 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), - /* 77 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), - /* 78 */ "Ne" OpHelp("if r[P1]!=r[P3] goto P2"), - /* 79 */ "Eq" OpHelp("if r[P1]==r[P3] goto P2"), - /* 80 */ "Gt" OpHelp("if r[P1]>r[P3] goto P2"), - /* 81 */ "Le" OpHelp("if r[P1]<=r[P3] goto P2"), - /* 82 */ "Lt" OpHelp("if r[P1]<r[P3] goto P2"), - /* 83 */ "Ge" OpHelp("if r[P1]>=r[P3] goto P2"), - /* 84 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), - /* 85 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), - /* 86 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), - /* 87 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"), - /* 88 */ "ShiftRight" OpHelp("r[P3]=r[P2]>>r[P1]"), - /* 89 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), - /* 90 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), - /* 91 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), - /* 92 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), - /* 93 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), - /* 94 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), - /* 95 */ "Delete" OpHelp(""), - /* 96 */ "BitNot" OpHelp("r[P1]= ~r[P1]"), - /* 97 */ "String8" OpHelp("r[P2]='P4'"), - /* 98 */ "ResetCount" OpHelp(""), - /* 99 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), - /* 100 */ "SorterData" OpHelp("r[P2]=data"), - /* 101 */ "RowKey" OpHelp("r[P2]=key"), - /* 102 */ "RowData" OpHelp("r[P2]=data"), - /* 103 */ "Rowid" OpHelp("r[P2]=rowid"), - /* 104 */ "NullRow" OpHelp(""), - /* 105 */ "Last" OpHelp(""), - /* 106 */ "SorterSort" OpHelp(""), - /* 107 */ "Sort" OpHelp(""), - /* 108 */ "Rewind" OpHelp(""), - /* 109 */ "SorterInsert" OpHelp(""), - /* 110 */ "IdxInsert" OpHelp("key=r[P2]"), - /* 111 */ "IdxDelete" OpHelp("key=r[P2@P3]"), - /* 112 */ "IdxRowid" OpHelp("r[P2]=rowid"), - /* 113 */ "IdxLE" OpHelp("key=r[P3@P4]"), - /* 114 */ "IdxGT" OpHelp("key=r[P3@P4]"), - /* 115 */ "IdxLT" OpHelp("key=r[P3@P4]"), - /* 116 */ "IdxGE" OpHelp("key=r[P3@P4]"), - /* 117 */ "Destroy" OpHelp(""), - /* 118 */ "Clear" OpHelp(""), - /* 119 */ "ResetSorter" OpHelp(""), - /* 120 */ "CreateIndex" OpHelp("r[P2]=root iDb=P1"), - /* 121 */ "CreateTable" OpHelp("r[P2]=root iDb=P1"), - /* 122 */ "ParseSchema" OpHelp(""), - /* 123 */ "LoadAnalysis" OpHelp(""), - /* 124 */ "DropTable" OpHelp(""), - /* 125 */ "DropIndex" OpHelp(""), - /* 126 */ "DropTrigger" OpHelp(""), - /* 127 */ "IntegrityCk" OpHelp(""), - /* 128 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), - /* 129 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), - /* 130 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), - /* 131 */ "Program" OpHelp(""), - /* 132 */ "Param" OpHelp(""), - /* 133 */ "Real" OpHelp("r[P2]=P4"), - /* 134 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), - /* 135 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), - /* 136 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), - /* 137 */ "IfPos" OpHelp("if r[P1]>0 goto P2"), - /* 138 */ "IfNeg" OpHelp("r[P1]+=P3, if r[P1]<0 goto P2"), - /* 139 */ "IfZero" OpHelp("r[P1]+=P3, if r[P1]==0 goto P2"), - /* 140 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 141 */ "IncrVacuum" OpHelp(""), - /* 142 */ "Expire" OpHelp(""), - /* 143 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 144 */ "VBegin" OpHelp(""), - /* 145 */ "VCreate" OpHelp(""), - /* 146 */ "VDestroy" OpHelp(""), - /* 147 */ "VOpen" OpHelp(""), - /* 148 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 149 */ "VNext" OpHelp(""), - /* 150 */ "VRename" OpHelp(""), - /* 151 */ "Pagecount" OpHelp(""), - /* 152 */ "MaxPgcnt" OpHelp(""), - /* 153 */ "Init" OpHelp("Start at P2"), - /* 154 */ "Noop" OpHelp(""), - /* 155 */ "Explain" OpHelp(""), + static const char *const azName[] = { + /* 0 */ "Savepoint" OpHelp(""), + /* 1 */ "AutoCommit" OpHelp(""), + /* 2 */ "Transaction" OpHelp(""), + /* 3 */ "SorterNext" OpHelp(""), + /* 4 */ "PrevIfOpen" OpHelp(""), + /* 5 */ "NextIfOpen" OpHelp(""), + /* 6 */ "Prev" OpHelp(""), + /* 7 */ "Next" OpHelp(""), + /* 8 */ "Checkpoint" OpHelp(""), + /* 9 */ "JournalMode" OpHelp(""), + /* 10 */ "Vacuum" OpHelp(""), + /* 11 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), + /* 12 */ "VUpdate" OpHelp("data=r[P3@P2]"), + /* 13 */ "Goto" OpHelp(""), + /* 14 */ "Gosub" OpHelp(""), + /* 15 */ "InitCoroutine" OpHelp(""), + /* 16 */ "Yield" OpHelp(""), + /* 17 */ "MustBeInt" OpHelp(""), + /* 18 */ "Jump" OpHelp(""), + /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), + /* 20 */ "Once" OpHelp(""), + /* 21 */ "If" OpHelp(""), + /* 22 */ "IfNot" OpHelp(""), + /* 23 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"), + /* 24 */ "SeekLT" OpHelp("key=r[P3@P4]"), + /* 25 */ "SeekLE" OpHelp("key=r[P3@P4]"), + /* 26 */ "SeekGE" OpHelp("key=r[P3@P4]"), + /* 27 */ "SeekGT" OpHelp("key=r[P3@P4]"), + /* 28 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 29 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 30 */ "Found" OpHelp("key=r[P3@P4]"), + /* 31 */ "SeekRowid" OpHelp("intkey=r[P3]"), + /* 32 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 33 */ "Last" OpHelp(""), + /* 34 */ "IfSmaller" OpHelp(""), + /* 35 */ "SorterSort" OpHelp(""), + /* 36 */ "Sort" OpHelp(""), + /* 37 */ "Rewind" OpHelp(""), + /* 38 */ "IdxLE" OpHelp("key=r[P3@P4]"), + /* 39 */ "IdxGT" OpHelp("key=r[P3@P4]"), + /* 40 */ "IdxLT" OpHelp("key=r[P3@P4]"), + /* 41 */ "IdxGE" OpHelp("key=r[P3@P4]"), + /* 42 */ "RowSetRead" OpHelp("r[P3]=rowset(P1)"), + /* 43 */ "Or" OpHelp("r[P3]=(r[P1] || r[P2])"), + /* 44 */ "And" OpHelp("r[P3]=(r[P1] && r[P2])"), + /* 45 */ "RowSetTest" OpHelp("if r[P3] in rowset(P1) goto P2"), + /* 46 */ "Program" OpHelp(""), + /* 47 */ "FkIfZero" OpHelp("if fkctr[P1]==0 goto P2"), + /* 48 */ "IfPos" OpHelp("if r[P1]>0 then r[P1]-=P3, goto P2"), + /* 49 */ "IfNotZero" OpHelp("if r[P1]!=0 then r[P1]--, goto P2"), + /* 50 */ "IsNull" OpHelp("if r[P1]==NULL goto P2"), + /* 51 */ "NotNull" OpHelp("if r[P1]!=NULL goto P2"), + /* 52 */ "Ne" OpHelp("IF r[P3]!=r[P1]"), + /* 53 */ "Eq" OpHelp("IF r[P3]==r[P1]"), + /* 54 */ "Gt" OpHelp("IF r[P3]>r[P1]"), + /* 55 */ "Le" OpHelp("IF r[P3]<=r[P1]"), + /* 56 */ "Lt" OpHelp("IF r[P3]<r[P1]"), + /* 57 */ "Ge" OpHelp("IF r[P3]>=r[P1]"), + /* 58 */ "ElseNotEq" OpHelp(""), + /* 59 */ "DecrJumpZero" OpHelp("if (--r[P1])==0 goto P2"), + /* 60 */ "IncrVacuum" OpHelp(""), + /* 61 */ "VNext" OpHelp(""), + /* 62 */ "Init" OpHelp("Start at P2"), + /* 63 */ "Return" OpHelp(""), + /* 64 */ "EndCoroutine" OpHelp(""), + /* 65 */ "HaltIfNull" OpHelp("if r[P3]=null halt"), + /* 66 */ "Halt" OpHelp(""), + /* 67 */ "Integer" OpHelp("r[P2]=P1"), + /* 68 */ "Int64" OpHelp("r[P2]=P4"), + /* 69 */ "String" OpHelp("r[P2]='P4' (len=P1)"), + /* 70 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 71 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 72 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 73 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 74 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 75 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 76 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 77 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 78 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 79 */ "CollSeq" OpHelp(""), + /* 80 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 81 */ "RealAffinity" OpHelp(""), + /* 82 */ "Cast" OpHelp("affinity(r[P1])"), + /* 83 */ "Permutation" OpHelp(""), + /* 84 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 85 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), + /* 86 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), + /* 87 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<<r[P1]"), + /* 88 */ "ShiftRight" OpHelp("r[P3]=r[P2]>>r[P1]"), + /* 89 */ "Add" OpHelp("r[P3]=r[P1]+r[P2]"), + /* 90 */ "Subtract" OpHelp("r[P3]=r[P2]-r[P1]"), + /* 91 */ "Multiply" OpHelp("r[P3]=r[P1]*r[P2]"), + /* 92 */ "Divide" OpHelp("r[P3]=r[P2]/r[P1]"), + /* 93 */ "Remainder" OpHelp("r[P3]=r[P2]%r[P1]"), + /* 94 */ "Concat" OpHelp("r[P3]=r[P2]+r[P1]"), + /* 95 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 96 */ "BitNot" OpHelp("r[P1]= ~r[P1]"), + /* 97 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 98 */ "Column" OpHelp("r[P3]=PX"), + /* 99 */ "String8" OpHelp("r[P2]='P4'"), + /* 100 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 101 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 102 */ "Count" OpHelp("r[P2]=count()"), + /* 103 */ "ReadCookie" OpHelp(""), + /* 104 */ "SetCookie" OpHelp(""), + /* 105 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), + /* 106 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 107 */ "OpenWrite" OpHelp("root=P2 iDb=P3"), + /* 108 */ "OpenDup" OpHelp(""), + /* 109 */ "OpenAutoindex" OpHelp("nColumn=P2"), + /* 110 */ "OpenEphemeral" OpHelp("nColumn=P2"), + /* 111 */ "SorterOpen" OpHelp(""), + /* 112 */ "SequenceTest" OpHelp("if( cursor[P1].ctr++ ) pc = P2"), + /* 113 */ "OpenPseudo" OpHelp("P3 columns in r[P2]"), + /* 114 */ "Close" OpHelp(""), + /* 115 */ "ColumnsUsed" OpHelp(""), + /* 116 */ "Sequence" OpHelp("r[P2]=cursor[P1].ctr++"), + /* 117 */ "NewRowid" OpHelp("r[P2]=rowid"), + /* 118 */ "Insert" OpHelp("intkey=r[P3] data=r[P2]"), + /* 119 */ "InsertInt" OpHelp("intkey=P3 data=r[P2]"), + /* 120 */ "Delete" OpHelp(""), + /* 121 */ "ResetCount" OpHelp(""), + /* 122 */ "SorterCompare" OpHelp("if key(P1)!=trim(r[P3],P4) goto P2"), + /* 123 */ "SorterData" OpHelp("r[P2]=data"), + /* 124 */ "RowData" OpHelp("r[P2]=data"), + /* 125 */ "Rowid" OpHelp("r[P2]=rowid"), + /* 126 */ "NullRow" OpHelp(""), + /* 127 */ "SeekEnd" OpHelp(""), + /* 128 */ "SorterInsert" OpHelp("key=r[P2]"), + /* 129 */ "IdxInsert" OpHelp("key=r[P2]"), + /* 130 */ "IdxDelete" OpHelp("key=r[P2@P3]"), + /* 131 */ "DeferredSeek" OpHelp("Move P3 to P1.rowid if needed"), + /* 132 */ "IdxRowid" OpHelp("r[P2]=rowid"), + /* 133 */ "Destroy" OpHelp(""), + /* 134 */ "Real" OpHelp("r[P2]=P4"), + /* 135 */ "Clear" OpHelp(""), + /* 136 */ "ResetSorter" OpHelp(""), + /* 137 */ "CreateBtree" OpHelp("r[P2]=root iDb=P1 flags=P3"), + /* 138 */ "SqlExec" OpHelp(""), + /* 139 */ "ParseSchema" OpHelp(""), + /* 140 */ "LoadAnalysis" OpHelp(""), + /* 141 */ "DropTable" OpHelp(""), + /* 142 */ "DropIndex" OpHelp(""), + /* 143 */ "DropTrigger" OpHelp(""), + /* 144 */ "IntegrityCk" OpHelp(""), + /* 145 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 146 */ "Param" OpHelp(""), + /* 147 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 148 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 149 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 150 */ "AggStep0" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 151 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 152 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 153 */ "Expire" OpHelp(""), + /* 154 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 155 */ "VBegin" OpHelp(""), + /* 156 */ "VCreate" OpHelp(""), + /* 157 */ "VDestroy" OpHelp(""), + /* 158 */ "VOpen" OpHelp(""), + /* 159 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 160 */ "VRename" OpHelp(""), + /* 161 */ "Pagecount" OpHelp(""), + /* 162 */ "MaxPgcnt" OpHelp(""), + /* 163 */ "PureFunc0" OpHelp(""), + /* 164 */ "Function0" OpHelp("r[P3]=func(r[P2@P5])"), + /* 165 */ "PureFunc" OpHelp(""), + /* 166 */ "Function" OpHelp("r[P3]=func(r[P2@P5])"), + /* 167 */ "Trace" OpHelp(""), + /* 168 */ "CursorHint" OpHelp(""), + /* 169 */ "Noop" OpHelp(""), + /* 170 */ "Explain" OpHelp(""), + /* 171 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -24993,6 +31505,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ ** * Definitions of sqlite3_vfs objects for all locking methods ** plus implementations of sqlite3_os_init() and sqlite3_os_end(). */ +/* #include "sqliteInt.h" */ #if SQLITE_OS_UNIX /* This file is used on unix only */ /* @@ -25020,16 +31533,17 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ # endif #endif -/* -** Define the OS_VXWORKS pre-processor macro to 1 if building on -** vxworks, or 0 otherwise. -*/ -#ifndef OS_VXWORKS -# if defined(__RTP__) || defined(_WRS_KERNEL) -# define OS_VXWORKS 1 -# else -# define OS_VXWORKS 0 -# endif +/* Use pread() and pwrite() if they are available */ +#if defined(__APPLE__) +# define HAVE_PREAD 1 +# define HAVE_PWRITE 1 +#endif +#if defined(HAVE_PREAD64) && defined(HAVE_PWRITE64) +# undef USE_PREAD +# define USE_PREAD64 1 +#elif defined(HAVE_PREAD) && defined(HAVE_PWRITE) +# undef USE_PREAD64 +# define USE_PREAD 1 #endif /* @@ -25038,6 +31552,7 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> +#include <sys/ioctl.h> #include <unistd.h> /* #include <time.h> */ #include <sys/time.h> @@ -25046,18 +31561,30 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ # include <sys/mman.h> #endif -#if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS -# include <sys/ioctl.h> -# if OS_VXWORKS -# include <semaphore.h> -# include <limits.h> -# else -# include <sys/file.h> -# include <sys/param.h> -# endif +#if SQLITE_ENABLE_LOCKING_STYLE +/* # include <sys/ioctl.h> */ +# include <sys/file.h> +# include <sys/param.h> #endif /* SQLITE_ENABLE_LOCKING_STYLE */ -#if defined(__APPLE__) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) +#if defined(__APPLE__) && ((__MAC_OS_X_VERSION_MIN_REQUIRED > 1050) || \ + (__IPHONE_OS_VERSION_MIN_REQUIRED > 2000)) +# if (!defined(TARGET_OS_EMBEDDED) || (TARGET_OS_EMBEDDED==0)) \ + && (!defined(TARGET_IPHONE_SIMULATOR) || (TARGET_IPHONE_SIMULATOR==0)) +# define HAVE_GETHOSTUUID 1 +# else +# warning "gethostuuid() is disabled." +# endif +#endif + + +#if OS_VXWORKS +/* # include <sys/ioctl.h> */ +# include <semaphore.h> +# include <limits.h> +#endif /* OS_VXWORKS */ + +#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE # include <sys/mount.h> #endif @@ -25098,6 +31625,15 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ */ #define MAX_PATHNAME 512 +/* +** Maximum supported symbolic links +*/ +#define SQLITE_MAX_SYMLINKS 100 + +/* Always cast the getpid() return type for compatibility with +** kernel modules in VxWorks. */ +#define osGetpid(X) (pid_t)getpid() + /* ** Only set the lastErrno if the error code is a real error and not ** a normal expected return code of SQLITE_BUSY or SQLITE_OK @@ -25136,7 +31672,7 @@ struct unixFile { unsigned short int ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */ int lastErrno; /* The unix errno from last I/O error */ void *lockingContext; /* Locking style specific state */ - UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */ + UnixUnusedFd *pPreallocatedUnused; /* Pre-allocated UnixUnusedFd */ const char *zPath; /* Name of the file */ unixShm *pShm; /* Shared memory segment information */ int szChunk; /* Configured by FCNTL_CHUNK_SIZE */ @@ -25147,16 +31683,17 @@ struct unixFile { sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ void *pMapRegion; /* Memory mapped region */ #endif -#ifdef __QNXNTO__ int sectorSize; /* Device sector size */ int deviceCharacteristics; /* Precomputed device characteristics */ -#endif #if SQLITE_ENABLE_LOCKING_STYLE int openFlags; /* The flags specified at open() */ #endif #if SQLITE_ENABLE_LOCKING_STYLE || defined(__APPLE__) unsigned fsFlags; /* cached details from statfs() */ #endif +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + unsigned iBusyTimeout; /* Wait this many millisec on locks */ +#endif #if OS_VXWORKS struct vxworksFileId *pId; /* Unique file ID */ #endif @@ -25186,7 +31723,7 @@ struct unixFile { ** method was called. If xOpen() is called from a different process id, ** indicating that a fork() has occurred, the PRNG will be reset. */ -static int randomnessPid = 0; +static pid_t randomnessPid = 0; /* ** Allowed values for the unixFile.ctrlFlags bitmask: @@ -25203,7 +31740,6 @@ static int randomnessPid = 0; #define UNIXFILE_DELETE 0x20 /* Delete on close */ #define UNIXFILE_URI 0x40 /* Filename might have query parameters */ #define UNIXFILE_NOLOCK 0x80 /* Do no file locking */ -#define UNIXFILE_WARNED 0x0100 /* verifyDbFile() warnings have been issued */ /* ** Include code that is common to all os_*.c files @@ -25241,24 +31777,14 @@ static int randomnessPid = 0; # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." #endif -#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) -# ifndef SQLITE_DEBUG_OS_TRACE -# define SQLITE_DEBUG_OS_TRACE 0 -# endif - int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE; -# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X -#else -# define OSTRACE(X) -#endif - /* ** Macros for performance tracing. Normally turned off. Only works ** on i486 hardware. */ #ifdef SQLITE_PERFORMANCE_TRACE -/* -** hwtime.h contains inline assembler code for implementing +/* +** hwtime.h contains inline assembler code for implementing ** high-performance timing routines. */ /************** Include hwtime.h in the middle of os_common.h ****************/ @@ -25278,8 +31804,8 @@ static int randomnessPid = 0; ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. */ -#ifndef _HWTIME_H_ -#define _HWTIME_H_ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H /* ** The following routine only works on pentium-class (or newer) processors. @@ -25347,7 +31873,7 @@ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } #endif -#endif /* !defined(_HWTIME_H_) */ +#endif /* !defined(SQLITE_HWTIME_H) */ /************** End of hwtime.h **********************************************/ /************** Continuing where we left off in os_common.h ******************/ @@ -25368,14 +31894,14 @@ static sqlite_uint64 g_elapsed; ** of code will give us the ability to simulate a disk I/O error. This ** is used for testing the I/O recovery logic. */ -#ifdef SQLITE_TEST -SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ -SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ -SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ -SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ -SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */ -SQLITE_API int sqlite3_diskfull_pending = 0; -SQLITE_API int sqlite3_diskfull = 0; +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) #define SimulateIOError(CODE) \ if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ @@ -25401,17 +31927,17 @@ static void local_ioerr(){ #define SimulateIOErrorBenign(X) #define SimulateIOError(A) #define SimulateDiskfullError(A) -#endif +#endif /* defined(SQLITE_TEST) */ /* ** When testing, keep a count of the number of open files. */ -#ifdef SQLITE_TEST -SQLITE_API int sqlite3_open_file_count = 0; +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; #define OpenCounter(X) sqlite3_open_file_count+=(X) #else #define OpenCounter(X) -#endif +#endif /* defined(SQLITE_TEST) */ #endif /* !defined(_OS_COMMON_H_) */ @@ -25464,6 +31990,20 @@ SQLITE_API int sqlite3_open_file_count = 0; # define lseek lseek64 #endif +#ifdef __linux__ +/* +** Linux-specific IOCTL magic numbers used for controlling F2FS +*/ +#define F2FS_IOCTL_MAGIC 0xf5 +#define F2FS_IOC_START_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 1) +#define F2FS_IOC_COMMIT_ATOMIC_WRITE _IO(F2FS_IOCTL_MAGIC, 2) +#define F2FS_IOC_START_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 3) +#define F2FS_IOC_ABORT_VOLATILE_WRITE _IO(F2FS_IOCTL_MAGIC, 5) +#define F2FS_IOC_GET_FEATURES _IOR(F2FS_IOCTL_MAGIC, 12, u32) +#define F2FS_FEATURE_ATOMIC_WRITE 0x0004 +#endif /* __linux__ */ + + /* ** Different Unix systems declare open() in different ways. Same use ** open(const char*,int,mode_t). Others use open(const char*,int,...). @@ -25476,19 +32016,6 @@ static int posixOpen(const char *zFile, int flags, int mode){ return open(zFile, flags, mode); } -/* -** On some systems, calls to fchown() will trigger a message in a security -** log if they come from non-root processes. So avoid calling fchown() if -** we are not running as root. -*/ -static int posixFchown(int fd, uid_t uid, gid_t gid){ -#if OS_VXWORKS - return 0; -#else - return geteuid() ? 0 : fchown(fd,uid,gid); -#endif -} - /* Forward reference */ static int openDirectory(const char*, int*); static int unixGetpagesize(void); @@ -25542,7 +32069,7 @@ static struct unix_syscall { { "read", (sqlite3_syscall_ptr)read, 0 }, #define osRead ((ssize_t(*)(int,void*,size_t))aSyscall[8].pCurrent) -#if defined(USE_PREAD) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE { "pread", (sqlite3_syscall_ptr)pread, 0 }, #else { "pread", (sqlite3_syscall_ptr)0, 0 }, @@ -25554,12 +32081,12 @@ static struct unix_syscall { #else { "pread64", (sqlite3_syscall_ptr)0, 0 }, #endif -#define osPread64 ((ssize_t(*)(int,void*,size_t,off_t))aSyscall[10].pCurrent) +#define osPread64 ((ssize_t(*)(int,void*,size_t,off64_t))aSyscall[10].pCurrent) { "write", (sqlite3_syscall_ptr)write, 0 }, #define osWrite ((ssize_t(*)(int,const void*,size_t))aSyscall[11].pCurrent) -#if defined(USE_PREAD) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS) +#if defined(USE_PREAD) || SQLITE_ENABLE_LOCKING_STYLE { "pwrite", (sqlite3_syscall_ptr)pwrite, 0 }, #else { "pwrite", (sqlite3_syscall_ptr)0, 0 }, @@ -25572,10 +32099,10 @@ static struct unix_syscall { #else { "pwrite64", (sqlite3_syscall_ptr)0, 0 }, #endif -#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off_t))\ +#define osPwrite64 ((ssize_t(*)(int,const void*,size_t,off64_t))\ aSyscall[13].pCurrent) - { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, + { "fchmod", (sqlite3_syscall_ptr)fchmod, 0 }, #define osFchmod ((int(*)(int,mode_t))aSyscall[14].pCurrent) #if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE @@ -25597,29 +32124,85 @@ static struct unix_syscall { { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, #define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) - { "fchown", (sqlite3_syscall_ptr)posixFchown, 0 }, +#if defined(HAVE_FCHOWN) + { "fchown", (sqlite3_syscall_ptr)fchown, 0 }, +#else + { "fchown", (sqlite3_syscall_ptr)0, 0 }, +#endif #define osFchown ((int(*)(int,uid_t,gid_t))aSyscall[20].pCurrent) +#if defined(HAVE_FCHOWN) + { "geteuid", (sqlite3_syscall_ptr)geteuid, 0 }, +#else + { "geteuid", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osGeteuid ((uid_t(*)(void))aSyscall[21].pCurrent) + #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 - { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, -#define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[21].pCurrent) + { "mmap", (sqlite3_syscall_ptr)mmap, 0 }, +#else + { "mmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMmap ((void*(*)(void*,size_t,int,int,int,off_t))aSyscall[22].pCurrent) +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 { "munmap", (sqlite3_syscall_ptr)munmap, 0 }, -#define osMunmap ((void*(*)(void*,size_t))aSyscall[22].pCurrent) +#else + { "munmap", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osMunmap ((int(*)(void*,size_t))aSyscall[23].pCurrent) -#if HAVE_MREMAP +#if HAVE_MREMAP && (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) { "mremap", (sqlite3_syscall_ptr)mremap, 0 }, #else { "mremap", (sqlite3_syscall_ptr)0, 0 }, #endif -#define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[23].pCurrent) - { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, -#define osGetpagesize ((int(*)(void))aSyscall[24].pCurrent) +#define osMremap ((void*(*)(void*,size_t,size_t,int,...))aSyscall[24].pCurrent) +#if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 + { "getpagesize", (sqlite3_syscall_ptr)unixGetpagesize, 0 }, +#else + { "getpagesize", (sqlite3_syscall_ptr)0, 0 }, #endif +#define osGetpagesize ((int(*)(void))aSyscall[25].pCurrent) + +#if defined(HAVE_READLINK) + { "readlink", (sqlite3_syscall_ptr)readlink, 0 }, +#else + { "readlink", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osReadlink ((ssize_t(*)(const char*,char*,size_t))aSyscall[26].pCurrent) + +#if defined(HAVE_LSTAT) + { "lstat", (sqlite3_syscall_ptr)lstat, 0 }, +#else + { "lstat", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osLstat ((int(*)(const char*,struct stat*))aSyscall[27].pCurrent) + +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + { "ioctl", (sqlite3_syscall_ptr)ioctl, 0 }, +#else + { "ioctl", (sqlite3_syscall_ptr)0, 0 }, +#endif +#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) }; /* End of the overrideable system calls */ + +/* +** On some systems, calls to fchown() will trigger a message in a security +** log if they come from non-root processes. So avoid calling fchown() if +** we are not running as root. +*/ +static int robustFchown(int fd, uid_t uid, gid_t gid){ +#if defined(HAVE_FCHOWN) + return osGeteuid() ? 0 : osFchown(fd,uid,gid); +#else + return 0; +#endif +} + /* ** This is the xSetSystemCall() method of sqlite3_vfs for all of the ** "unix" VFSes. Return SQLITE_OK opon successfully updating the @@ -25780,20 +32363,21 @@ static int robust_open(const char *z, int f, mode_t m){ ** assert( unixMutexHeld() ); ** unixEnterLeave() */ +static sqlite3_mutex *unixBigLock = 0; static void unixEnterMutex(void){ - sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_enter(unixBigLock); } static void unixLeaveMutex(void){ - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_leave(unixBigLock); } #ifdef SQLITE_DEBUG static int unixMutexHeld(void) { - return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + return sqlite3_mutex_held(unixBigLock); } #endif -#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) +#ifdef SQLITE_HAVE_OS_TRACE /* ** Helper function for printing out trace information from debugging ** binaries. This returns the string representation of the supplied @@ -25874,9 +32458,9 @@ static int lockTrace(int fd, int op, struct flock *p){ /* ** Retry ftruncate() calls that fail due to EINTR ** -** All calls to ftruncate() within this file should be made through this wrapper. -** On the Android platform, bypassing the logic below could lead to a corrupt -** database. +** All calls to ftruncate() within this file should be made through +** this wrapper. On the Android platform, bypassing the logic below +** could lead to a corrupt database. */ static int robust_ftruncate(int h, sqlite3_int64 sz){ int rc; @@ -25904,23 +32488,12 @@ static int robust_ftruncate(int h, sqlite3_int64 sz){ ** should handle ENOLCK, ENOTSUP, EOPNOTSUPP separately. */ static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { + assert( (sqliteIOErr == SQLITE_IOERR_LOCK) || + (sqliteIOErr == SQLITE_IOERR_UNLOCK) || + (sqliteIOErr == SQLITE_IOERR_RDLOCK) || + (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ); switch (posixError) { -#if 0 - /* At one point this code was not commented out. In theory, this branch - ** should never be hit, as this function should only be called after - ** a locking-related function (i.e. fcntl()) has returned non-zero with - ** the value of errno as the first argument. Since a system call has failed, - ** errno should be non-zero. - ** - ** Despite this, if errno really is zero, we still don't want to return - ** SQLITE_OK. The system call failed, and *some* SQLite error should be - ** propagated back to the caller. Commenting this branch out means errno==0 - ** will be handled by the "default:" case below. - */ - case 0: - return SQLITE_OK; -#endif - + case EACCES: case EAGAIN: case ETIMEDOUT: case EBUSY: @@ -25930,41 +32503,9 @@ static int sqliteErrorFromPosixError(int posixError, int sqliteIOErr) { * introspection, in which it actually means what it says */ return SQLITE_BUSY; - case EACCES: - /* EACCES is like EAGAIN during locking operations, but not any other time*/ - if( (sqliteIOErr == SQLITE_IOERR_LOCK) || - (sqliteIOErr == SQLITE_IOERR_UNLOCK) || - (sqliteIOErr == SQLITE_IOERR_RDLOCK) || - (sqliteIOErr == SQLITE_IOERR_CHECKRESERVEDLOCK) ){ - return SQLITE_BUSY; - } - /* else fall through */ case EPERM: return SQLITE_PERM; -#if EOPNOTSUPP!=ENOTSUP - case EOPNOTSUPP: - /* something went terribly awry, unless during file system support - * introspection, in which it actually means what it says */ -#endif -#ifdef ENOTSUP - case ENOTSUP: - /* invalid fd, unless during file system support introspection, in which - * it actually means what it says */ -#endif - case EIO: - case EBADF: - case EINVAL: - case ENOTCONN: - case ENODEV: - case ENXIO: - case ENOENT: -#ifdef ESTALE /* ESTALE is not defined on Interix systems */ - case ESTALE: -#endif - case ENOSYS: - /* these should force the client to close the file and reconnect */ - default: return sqliteIOErr; } @@ -26056,7 +32597,7 @@ static struct vxworksFileId *vxworksFindFileId(const char *zAbsoluteName){ assert( zAbsoluteName[0]=='/' ); n = (int)strlen(zAbsoluteName); - pNew = sqlite3_malloc( sizeof(*pNew) + (n+1) ); + pNew = sqlite3_malloc64( sizeof(*pNew) + (n+1) ); if( pNew==0 ) return 0; pNew->zCanonicalName = (char*)&pNew[1]; memcpy(pNew->zCanonicalName, zAbsoluteName, n+1); @@ -26208,7 +32749,14 @@ struct unixFileId { #if OS_VXWORKS struct vxworksFileId *pId; /* Unique file ID for vxworks. */ #else - ino_t ino; /* Inode number */ + /* We are told that some versions of Android contain a bug that + ** sizes ino_t at only 32-bits instead of 64-bits. (See + ** https://android-review.googlesource.com/#/c/115351/3/dist/sqlite3.c) + ** To work around this, always allocate 64-bits for the inode number. + ** On small machines that only have 32-bit inodes, this wastes 4 bytes, + ** but that should not be a big deal. */ + /* WAS: ino_t ino; */ + u64 ino; /* Inode number */ #endif }; @@ -26244,11 +32792,12 @@ struct unixInodeInfo { /* ** A lists of all unixInodeInfo objects. */ -static unixInodeInfo *inodeList = 0; +static unixInodeInfo *inodeList = 0; /* All unixInodeInfo objects */ +static unsigned int nUnusedFd = 0; /* Total unused file descriptors */ /* ** -** This function - unixLogError_x(), is only ever called via the macro +** This function - unixLogErrorAtLine(), is only ever called via the macro ** unixLogError(). ** ** It is invoked after an error occurs in an OS function and errno has been @@ -26335,6 +32884,14 @@ static void robust_close(unixFile *pFile, int h, int lineno){ } } +/* +** Set the pFile->lastErrno. Do this in a subroutine as that provides +** a convenient place to set a breakpoint. +*/ +static void storeLastErrno(unixFile *pFile, int error){ + pFile->lastErrno = error; +} + /* ** Close all file descriptors accumuated in the unixInodeInfo->pUnused list. */ @@ -26346,6 +32903,7 @@ static void closePendingFds(unixFile *pFile){ pNext = p->pNext; robust_close(pFile, p->fd, __LINE__); sqlite3_free(p); + nUnusedFd--; } pInode->pUnused = 0; } @@ -26378,6 +32936,7 @@ static void releaseInodeInfo(unixFile *pFile){ sqlite3_free(pInode); } } + assert( inodeList!=0 || nUnusedFd==0 ); } /* @@ -26408,8 +32967,8 @@ static int findInodeInfo( fd = pFile->h; rc = osFstat(fd, &statbuf); if( rc!=0 ){ - pFile->lastErrno = errno; -#ifdef EOVERFLOW + storeLastErrno(pFile, errno); +#if defined(EOVERFLOW) && defined(SQLITE_DISABLE_LFS) if( pFile->lastErrno==EOVERFLOW ) return SQLITE_NOLFS; #endif return SQLITE_IOERR; @@ -26429,12 +32988,12 @@ static int findInodeInfo( if( statbuf.st_size==0 && (pFile->fsFlags & SQLITE_FSFLAGS_IS_MSDOS)!=0 ){ do{ rc = osWrite(fd, "S", 1); }while( rc<0 && errno==EINTR ); if( rc!=1 ){ - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); return SQLITE_IOERR; } rc = osFstat(fd, &statbuf); if( rc!=0 ){ - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); return SQLITE_IOERR; } } @@ -26445,16 +33004,17 @@ static int findInodeInfo( #if OS_VXWORKS fileId.pId = pFile->pId; #else - fileId.ino = statbuf.st_ino; + fileId.ino = (u64)statbuf.st_ino; #endif + assert( inodeList!=0 || nUnusedFd==0 ); pInode = inodeList; while( pInode && memcmp(&fileId, &pInode->fileId, sizeof(fileId)) ){ pInode = pInode->pNext; } if( pInode==0 ){ - pInode = sqlite3_malloc( sizeof(*pInode) ); + pInode = sqlite3_malloc64( sizeof(*pInode) ); if( pInode==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memset(pInode, 0, sizeof(*pInode)); memcpy(&pInode->fileId, &fileId, sizeof(fileId)); @@ -26479,7 +33039,8 @@ static int fileHasMoved(unixFile *pFile){ #else struct stat buf; return pFile->pInode!=0 && - (osStat(pFile->zPath, &buf)!=0 || buf.st_ino!=pFile->pInode->fileId.ino); + (osStat(pFile->zPath, &buf)!=0 + || (u64)buf.st_ino!=pFile->pInode->fileId.ino); #endif } @@ -26496,30 +33057,25 @@ static int fileHasMoved(unixFile *pFile){ static void verifyDbFile(unixFile *pFile){ struct stat buf; int rc; - if( pFile->ctrlFlags & UNIXFILE_WARNED ){ - /* One or more of the following warnings have already been issued. Do not - ** repeat them so as not to clutter the error log */ - return; - } + + /* These verifications occurs for the main database only */ + if( pFile->ctrlFlags & UNIXFILE_NOLOCK ) return; + rc = osFstat(pFile->h, &buf); if( rc!=0 ){ sqlite3_log(SQLITE_WARNING, "cannot fstat db file %s", pFile->zPath); - pFile->ctrlFlags |= UNIXFILE_WARNED; return; } - if( buf.st_nlink==0 && (pFile->ctrlFlags & UNIXFILE_DELETE)==0 ){ + if( buf.st_nlink==0 ){ sqlite3_log(SQLITE_WARNING, "file unlinked while open: %s", pFile->zPath); - pFile->ctrlFlags |= UNIXFILE_WARNED; return; } if( buf.st_nlink>1 ){ sqlite3_log(SQLITE_WARNING, "multiple links to file: %s", pFile->zPath); - pFile->ctrlFlags |= UNIXFILE_WARNED; return; } if( fileHasMoved(pFile) ){ sqlite3_log(SQLITE_WARNING, "file renamed while open: %s", pFile->zPath); - pFile->ctrlFlags |= UNIXFILE_WARNED; return; } } @@ -26539,6 +33095,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); assert( pFile ); + assert( pFile->eFileLock<=SHARED_LOCK ); unixEnterMutex(); /* Because pFile->pInode is shared across threads */ /* Check if a thread in this process holds such a lock */ @@ -26557,7 +33114,7 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ lock.l_type = F_WRLCK; if( osFcntl(pFile->h, F_GETLK, &lock) ){ rc = SQLITE_IOERR_CHECKRESERVEDLOCK; - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); } else if( lock.l_type!=F_UNLCK ){ reserved = 1; } @@ -26571,6 +33128,43 @@ static int unixCheckReservedLock(sqlite3_file *id, int *pResOut){ return rc; } +/* +** Set a posix-advisory-lock. +** +** There are two versions of this routine. If compiled with +** SQLITE_ENABLE_SETLK_TIMEOUT then the routine has an extra parameter +** which is a pointer to a unixFile. If the unixFile->iBusyTimeout +** value is set, then it is the number of milliseconds to wait before +** failing the lock. The iBusyTimeout value is always reset back to +** zero on each call. +** +** If SQLITE_ENABLE_SETLK_TIMEOUT is not defined, then do a non-blocking +** attempt to set the lock. +*/ +#ifndef SQLITE_ENABLE_SETLK_TIMEOUT +# define osSetPosixAdvisoryLock(h,x,t) osFcntl(h,F_SETLK,x) +#else +static int osSetPosixAdvisoryLock( + int h, /* The file descriptor on which to take the lock */ + struct flock *pLock, /* The description of the lock */ + unixFile *pFile /* Structure holding timeout value */ +){ + int rc = osFcntl(h,F_SETLK,pLock); + while( rc<0 && pFile->iBusyTimeout>0 ){ + /* On systems that support some kind of blocking file lock with a timeout, + ** make appropriate changes here to invoke that blocking file lock. On + ** generic posix, however, there is no such API. So we simply try the + ** lock once every millisecond until either the timeout expires, or until + ** the lock is obtained. */ + usleep(1000); + rc = osFcntl(h,F_SETLK,pLock); + pFile->iBusyTimeout--; + } + return rc; +} +#endif /* SQLITE_ENABLE_SETLK_TIMEOUT */ + + /* ** Attempt to set a system-lock on the file pFile. The lock is ** described by pLock. @@ -26595,9 +33189,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){ unixInodeInfo *pInode = pFile->pInode; assert( unixMutexHeld() ); assert( pInode!=0 ); - if( ((pFile->ctrlFlags & UNIXFILE_EXCL)!=0 || pInode->bProcessLock) - && ((pFile->ctrlFlags & UNIXFILE_RDONLY)==0) - ){ + if( (pFile->ctrlFlags & (UNIXFILE_EXCL|UNIXFILE_RDONLY))==UNIXFILE_EXCL ){ if( pInode->bProcessLock==0 ){ struct flock lock; assert( pInode->nLock==0 ); @@ -26605,7 +33197,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){ lock.l_start = SHARED_FIRST; lock.l_len = SHARED_SIZE; lock.l_type = F_WRLCK; - rc = osFcntl(pFile->h, F_SETLK, &lock); + rc = osSetPosixAdvisoryLock(pFile->h, &lock, pFile); if( rc<0 ) return rc; pInode->bProcessLock = 1; pInode->nLock++; @@ -26613,7 +33205,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){ rc = 0; } }else{ - rc = osFcntl(pFile->h, F_SETLK, pLock); + rc = osSetPosixAdvisoryLock(pFile->h, pLock, pFile); } return rc; } @@ -26647,7 +33239,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** lock transitions in terms of the POSIX advisory shared and exclusive ** lock primitives (called read-locks and write-locks below, to avoid ** confusion with SQLite lock names). The algorithms are complicated - ** slightly in order to be compatible with windows systems simultaneously + ** slightly in order to be compatible with Windows95 systems simultaneously ** accessing the same database file, in case that is ever required. ** ** Symbols defined in os.h indentify the 'pending byte' and the 'reserved @@ -26655,8 +33247,14 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** range', a range of 510 bytes at a well known offset. ** ** To obtain a SHARED lock, a read-lock is obtained on the 'pending - ** byte'. If this is successful, a random byte from the 'shared byte - ** range' is read-locked and the lock on the 'pending byte' released. + ** byte'. If this is successful, 'shared byte range' is read-locked + ** and the lock on the 'pending byte' released. (Legacy note: When + ** SQLite was first developed, Windows95 systems were still very common, + ** and Widnows95 lacks a shared-lock capability. So on Windows95, a + ** single randomly selected by from the 'shared byte range' is locked. + ** Windows95 is now pretty much extinct, but this work-around for the + ** lack of shared-locks on Windows95 lives on, for backwards + ** compatibility.) ** ** A process may only obtain a RESERVED lock after it has a SHARED lock. ** A RESERVED lock is implemented by grabbing a write-lock on the @@ -26675,11 +33273,6 @@ static int unixLock(sqlite3_file *id, int eFileLock){ ** range'. Since all other locks require a read-lock on one of the bytes ** within this range, this ensures that no other locks are held on the ** database. - ** - ** The reason a single byte cannot be used instead of the 'shared byte - ** range' is that some versions of windows do not support read-locks. By - ** locking a random byte from a range, concurrent SHARED locks may exist - ** even if the locking primitive used is always a write-lock. */ int rc = SQLITE_OK; unixFile *pFile = (unixFile*)id; @@ -26690,7 +33283,8 @@ static int unixLock(sqlite3_file *id, int eFileLock){ assert( pFile ); OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (unix)\n", pFile->h, azFileLock(eFileLock), azFileLock(pFile->eFileLock), - azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared , getpid())); + azFileLock(pFile->pInode->eFileLock), pFile->pInode->nShared, + osGetpid(0))); /* If there is already a lock of this type or more restrictive on the ** unixFile, do nothing. Don't use the end_lock: exit path, as @@ -26757,7 +33351,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); if( rc!=SQLITE_BUSY ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } goto end_lock; } @@ -26792,7 +33386,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ if( rc ){ if( rc!=SQLITE_BUSY ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } goto end_lock; }else{ @@ -26825,7 +33419,7 @@ static int unixLock(sqlite3_file *id, int eFileLock){ tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); if( rc!=SQLITE_BUSY ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } } } @@ -26869,11 +33463,12 @@ end_lock: */ static void setPendingFd(unixFile *pFile){ unixInodeInfo *pInode = pFile->pInode; - UnixUnusedFd *p = pFile->pUnused; + UnixUnusedFd *p = pFile->pPreallocatedUnused; p->pNext = pInode->pUnused; pInode->pUnused = p; pFile->h = -1; - pFile->pUnused = 0; + pFile->pPreallocatedUnused = 0; + nUnusedFd++; } /* @@ -26898,7 +33493,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ assert( pFile ); OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (unix)\n", pFile->h, eFileLock, pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, - getpid())); + osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); if( pFile->eFileLock<=eFileLock ){ @@ -26932,7 +33527,6 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ ** 4: [RRRR.] */ if( eFileLock==SHARED_LOCK ){ - #if !defined(__APPLE__) || !SQLITE_ENABLE_LOCKING_STYLE (void)handleNFSUnlock; assert( handleNFSUnlock==0 ); @@ -26949,9 +33543,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ if( unixFileLock(pFile, &lock)==(-1) ){ tErrno = errno; rc = SQLITE_IOERR_UNLOCK; - if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; - } + storeLastErrno(pFile, tErrno); goto end_unlock; } lock.l_type = F_RDLCK; @@ -26962,7 +33554,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_RDLOCK); if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } goto end_unlock; } @@ -26973,9 +33565,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ if( unixFileLock(pFile, &lock)==(-1) ){ tErrno = errno; rc = SQLITE_IOERR_UNLOCK; - if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; - } + storeLastErrno(pFile, tErrno); goto end_unlock; } }else @@ -26993,7 +33583,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ ** SQLITE_BUSY would confuse the upper layer (in practice it causes ** an assert to fail). */ rc = SQLITE_IOERR_RDLOCK; - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); goto end_unlock; } } @@ -27006,7 +33596,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ pInode->eFileLock = SHARED_LOCK; }else{ rc = SQLITE_IOERR_UNLOCK; - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); goto end_unlock; } } @@ -27024,7 +33614,7 @@ static int posixUnlock(sqlite3_file *id, int eFileLock, int handleNFSUnlock){ pInode->eFileLock = NO_LOCK; }else{ rc = SQLITE_IOERR_UNLOCK; - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); pInode->eFileLock = NO_LOCK; pFile->eFileLock = NO_LOCK; } @@ -27103,7 +33693,7 @@ static int closeUnixFile(sqlite3_file *id){ #endif OSTRACE(("CLOSE %-3d\n", pFile->h)); OpenCounter(-1); - sqlite3_free(pFile->pUnused); + sqlite3_free(pFile->pPreallocatedUnused); memset(pFile, 0, sizeof(unixFile)); return SQLITE_OK; } @@ -27226,17 +33816,7 @@ static int dotlockCheckReservedLock(sqlite3_file *id, int *pResOut) { SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); assert( pFile ); - - /* Check if a thread in this process holds such a lock */ - if( pFile->eFileLock>SHARED_LOCK ){ - /* Either this connection or some other connection in the same process - ** holds a lock on the file. No need to check further. */ - reserved = 1; - }else{ - /* The lock is held if and only if the lockfile exists */ - const char *zLockFile = (const char*)pFile->lockingContext; - reserved = osAccess(zLockFile, 0)==0; - } + reserved = osAccess((const char*)pFile->lockingContext, 0)==0; OSTRACE(("TEST WR-LOCK %d %d %d (dotlock)\n", pFile->h, rc, reserved)); *pResOut = reserved; return rc; @@ -27298,8 +33878,8 @@ static int dotlockLock(sqlite3_file *id, int eFileLock) { rc = SQLITE_BUSY; } else { rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); - if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; + if( rc!=SQLITE_BUSY ){ + storeLastErrno(pFile, tErrno); } } return rc; @@ -27326,7 +33906,7 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { assert( pFile ); OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, - pFile->eFileLock, getpid())); + pFile->eFileLock, osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); /* no-op if possible */ @@ -27345,15 +33925,13 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { /* To fully unlock the database, delete the lock file */ assert( eFileLock==NO_LOCK ); rc = osRmdir(zLockFile); - if( rc<0 && errno==ENOTDIR ) rc = osUnlink(zLockFile); if( rc<0 ){ int tErrno = errno; - rc = 0; - if( ENOENT != tErrno ){ + if( tErrno==ENOENT ){ + rc = SQLITE_OK; + }else{ rc = SQLITE_IOERR_UNLOCK; - } - if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } return rc; } @@ -27365,14 +33943,11 @@ static int dotlockUnlock(sqlite3_file *id, int eFileLock) { ** Close a file. Make sure the lock has been released before closing. */ static int dotlockClose(sqlite3_file *id) { - int rc = SQLITE_OK; - if( id ){ - unixFile *pFile = (unixFile*)id; - dotlockUnlock(id, NO_LOCK); - sqlite3_free(pFile->lockingContext); - rc = closeUnixFile(id); - } - return rc; + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + dotlockUnlock(id, NO_LOCK); + sqlite3_free(pFile->lockingContext); + return closeUnixFile(id); } /****************** End of the dot-file lock implementation ******************* ******************************************************************************/ @@ -27389,10 +33964,9 @@ static int dotlockClose(sqlite3_file *id) { ** still works when you do this, but concurrency is reduced since ** only a single process can be reading the database at a time. ** -** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off or if -** compiling for VXWORKS. +** Omit this section if SQLITE_ENABLE_LOCKING_STYLE is turned off */ -#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS +#if SQLITE_ENABLE_LOCKING_STYLE /* ** Retry flock() calls that fail with EINTR @@ -27439,10 +34013,8 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ int tErrno = errno; /* unlock failed with an error */ lrc = SQLITE_IOERR_UNLOCK; - if( IS_LOCK_ERROR(lrc) ){ - pFile->lastErrno = tErrno; - rc = lrc; - } + storeLastErrno(pFile, tErrno); + rc = lrc; } } else { int tErrno = errno; @@ -27450,7 +34022,7 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ /* someone else might have it reserved */ lrc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); if( IS_LOCK_ERROR(lrc) ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); rc = lrc; } } @@ -27458,7 +34030,7 @@ static int flockCheckReservedLock(sqlite3_file *id, int *pResOut){ OSTRACE(("TEST WR-LOCK %d %d %d (flock)\n", pFile->h, rc, reserved)); #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS - if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){ + if( (rc & 0xff) == SQLITE_IOERR ){ rc = SQLITE_OK; reserved=1; } @@ -27516,7 +34088,7 @@ static int flockLock(sqlite3_file *id, int eFileLock) { /* didn't get, must be busy */ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_LOCK); if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } } else { /* got it, set the type and return ok */ @@ -27525,7 +34097,7 @@ static int flockLock(sqlite3_file *id, int eFileLock) { OSTRACE(("LOCK %d %s %s (flock)\n", pFile->h, azFileLock(eFileLock), rc==SQLITE_OK ? "ok" : "failed")); #ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS - if( (rc & SQLITE_IOERR) == SQLITE_IOERR ){ + if( (rc & 0xff) == SQLITE_IOERR ){ rc = SQLITE_BUSY; } #endif /* SQLITE_IGNORE_FLOCK_LOCK_ERRORS */ @@ -27545,7 +34117,7 @@ static int flockUnlock(sqlite3_file *id, int eFileLock) { assert( pFile ); OSTRACE(("UNLOCK %d %d was %d pid=%d (flock)\n", pFile->h, eFileLock, - pFile->eFileLock, getpid())); + pFile->eFileLock, osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); /* no-op if possible */ @@ -27575,12 +34147,9 @@ static int flockUnlock(sqlite3_file *id, int eFileLock) { ** Close a file. */ static int flockClose(sqlite3_file *id) { - int rc = SQLITE_OK; - if( id ){ - flockUnlock(id, NO_LOCK); - rc = closeUnixFile(id); - } - return rc; + assert( id!=0 ); + flockUnlock(id, NO_LOCK); + return closeUnixFile(id); } #endif /* SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORK */ @@ -27606,7 +34175,7 @@ static int flockClose(sqlite3_file *id) { ** to a non-zero value otherwise *pResOut is set to zero. The return value ** is set to SQLITE_OK unless an I/O error occurs during lock checking. */ -static int semCheckReservedLock(sqlite3_file *id, int *pResOut) { +static int semXCheckReservedLock(sqlite3_file *id, int *pResOut) { int rc = SQLITE_OK; int reserved = 0; unixFile *pFile = (unixFile*)id; @@ -27628,7 +34197,7 @@ static int semCheckReservedLock(sqlite3_file *id, int *pResOut) { int tErrno = errno; if( EAGAIN != tErrno ){ rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_CHECKRESERVEDLOCK); - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } else { /* someone else has the lock when we are in NO_LOCK */ reserved = (pFile->eFileLock < SHARED_LOCK); @@ -27673,7 +34242,7 @@ static int semCheckReservedLock(sqlite3_file *id, int *pResOut) { ** This routine will only increase a lock. Use the sqlite3OsUnlock() ** routine to lower a locking level. */ -static int semLock(sqlite3_file *id, int eFileLock) { +static int semXLock(sqlite3_file *id, int eFileLock) { unixFile *pFile = (unixFile*)id; sem_t *pSem = pFile->pInode->pSem; int rc = SQLITE_OK; @@ -27706,14 +34275,14 @@ static int semLock(sqlite3_file *id, int eFileLock) { ** If the locking level of the file descriptor is already at or below ** the requested locking level, this routine is a no-op. */ -static int semUnlock(sqlite3_file *id, int eFileLock) { +static int semXUnlock(sqlite3_file *id, int eFileLock) { unixFile *pFile = (unixFile*)id; sem_t *pSem = pFile->pInode->pSem; assert( pFile ); assert( pSem ); OSTRACE(("UNLOCK %d %d was %d pid=%d (sem)\n", pFile->h, eFileLock, - pFile->eFileLock, getpid())); + pFile->eFileLock, osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); /* no-op if possible */ @@ -27732,7 +34301,7 @@ static int semUnlock(sqlite3_file *id, int eFileLock) { int rc, tErrno = errno; rc = sqliteErrorFromPosixError(tErrno, SQLITE_IOERR_UNLOCK); if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } return rc; } @@ -27743,10 +34312,10 @@ static int semUnlock(sqlite3_file *id, int eFileLock) { /* ** Close a file. */ -static int semClose(sqlite3_file *id) { +static int semXClose(sqlite3_file *id) { if( id ){ unixFile *pFile = (unixFile*)id; - semUnlock(id, NO_LOCK); + semXUnlock(id, NO_LOCK); assert( pFile ); unixEnterMutex(); releaseInodeInfo(pFile); @@ -27834,7 +34403,7 @@ static int afpSetLock( setLockFlag ? SQLITE_IOERR_LOCK : SQLITE_IOERR_UNLOCK); #endif /* SQLITE_IGNORE_AFP_LOCK_ERRORS */ if( IS_LOCK_ERROR(rc) ){ - pFile->lastErrno = tErrno; + storeLastErrno(pFile, tErrno); } return rc; } else { @@ -27927,7 +34496,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ assert( pFile ); OSTRACE(("LOCK %d %s was %s(%s,%d) pid=%d (afp)\n", pFile->h, azFileLock(eFileLock), azFileLock(pFile->eFileLock), - azFileLock(pInode->eFileLock), pInode->nShared , getpid())); + azFileLock(pInode->eFileLock), pInode->nShared , osGetpid(0))); /* If there is already a lock of this type or more restrictive on the ** unixFile, do nothing. Don't use the afp_end_lock: exit path, as @@ -28017,7 +34586,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ lrc2 = afpSetLock(context->dbPath, pFile, PENDING_BYTE, 1, 0); if( IS_LOCK_ERROR(lrc1) ) { - pFile->lastErrno = lrc1Errno; + storeLastErrno(pFile, lrc1Errno); rc = lrc1; goto afp_end_lock; } else if( IS_LOCK_ERROR(lrc2) ){ @@ -28065,7 +34634,7 @@ static int afpLock(sqlite3_file *id, int eFileLock){ /* Can't reestablish the shared lock. Sqlite can't deal, this is ** a critical I/O error */ - rc = ((failed & SQLITE_IOERR) == SQLITE_IOERR) ? failed2 : + rc = ((failed & 0xff) == SQLITE_IOERR) ? failed2 : SQLITE_IOERR_LOCK; goto afp_end_lock; } @@ -28113,7 +34682,7 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { assert( pFile ); OSTRACE(("UNLOCK %d %d was %d(%d,%d) pid=%d (afp)\n", pFile->h, eFileLock, pFile->eFileLock, pFile->pInode->eFileLock, pFile->pInode->nShared, - getpid())); + osGetpid(0))); assert( eFileLock<=SHARED_LOCK ); if( pFile->eFileLock<=eFileLock ){ @@ -28205,23 +34774,22 @@ static int afpUnlock(sqlite3_file *id, int eFileLock) { */ static int afpClose(sqlite3_file *id) { int rc = SQLITE_OK; - if( id ){ - unixFile *pFile = (unixFile*)id; - afpUnlock(id, NO_LOCK); - unixEnterMutex(); - if( pFile->pInode && pFile->pInode->nLock ){ - /* If there are outstanding locks, do not actually close the file just - ** yet because that would clear those locks. Instead, add the file - ** descriptor to pInode->aPending. It will be automatically closed when - ** the last lock is cleared. - */ - setPendingFd(pFile); - } - releaseInodeInfo(pFile); - sqlite3_free(pFile->lockingContext); - rc = closeUnixFile(id); - unixLeaveMutex(); + unixFile *pFile = (unixFile*)id; + assert( id!=0 ); + afpUnlock(id, NO_LOCK); + unixEnterMutex(); + if( pFile->pInode && pFile->pInode->nLock ){ + /* If there are outstanding locks, do not actually close the file just + ** yet because that would clear those locks. Instead, add the file + ** descriptor to pInode->aPending. It will be automatically closed when + ** the last lock is cleared. + */ + setPendingFd(pFile); } + releaseInodeInfo(pFile); + sqlite3_free(pFile->lockingContext); + rc = closeUnixFile(id); + unixLeaveMutex(); return rc; } @@ -28291,7 +34859,6 @@ static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ TIMER_START; assert( cnt==(cnt&0x1ffff) ); assert( id->h>2 ); - cnt &= 0x1ffff; do{ #if defined(USE_PREAD) got = osPread(id->h, pBuf, cnt, offset); @@ -28301,13 +34868,9 @@ static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ SimulateIOError( got = -1 ); #else newOffset = lseek(id->h, offset, SEEK_SET); - SimulateIOError( newOffset-- ); - if( newOffset!=offset ){ - if( newOffset == -1 ){ - ((unixFile*)id)->lastErrno = errno; - }else{ - ((unixFile*)id)->lastErrno = 0; - } + SimulateIOError( newOffset = -1 ); + if( newOffset<0 ){ + storeLastErrno((unixFile*)id, errno); return -1; } got = osRead(id->h, pBuf, cnt); @@ -28316,7 +34879,7 @@ static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ if( got<0 ){ if( errno==EINTR ){ got = 1; continue; } prior = 0; - ((unixFile*)id)->lastErrno = errno; + storeLastErrno((unixFile*)id, errno); break; }else if( got>0 ){ cnt -= got; @@ -28351,7 +34914,7 @@ static int unixRead( /* If this is a database file (not a journal, master-journal or temp ** file), the bytes in the locking range should never be read or written. */ #if 0 - assert( pFile->pUnused==0 + assert( pFile->pPreallocatedUnused==0 || offset>=PENDING_BYTE+512 || offset+amt<=PENDING_BYTE ); @@ -28381,7 +34944,7 @@ static int unixRead( /* lastErrno set by seekAndRead */ return SQLITE_IOERR_READ; }else{ - pFile->lastErrno = 0; /* not a system error */ + storeLastErrno(pFile, 0); /* not a system error */ /* Unread parts of the buffer must be zero-filled */ memset(&((char*)pBuf)[got], 0, amt-got); return SQLITE_IOERR_SHORT_READ; @@ -28406,21 +34969,21 @@ static int seekAndWriteFd( assert( nBuf==(nBuf&0x1ffff) ); assert( fd>2 ); + assert( piErrno!=0 ); nBuf &= 0x1ffff; TIMER_START; #if defined(USE_PREAD) - do{ rc = osPwrite(fd, pBuf, nBuf, iOff); }while( rc<0 && errno==EINTR ); + do{ rc = (int)osPwrite(fd, pBuf, nBuf, iOff); }while( rc<0 && errno==EINTR ); #elif defined(USE_PREAD64) - do{ rc = osPwrite64(fd, pBuf, nBuf, iOff);}while( rc<0 && errno==EINTR); + do{ rc = (int)osPwrite64(fd, pBuf, nBuf, iOff);}while( rc<0 && errno==EINTR); #else do{ i64 iSeek = lseek(fd, iOff, SEEK_SET); - SimulateIOError( iSeek-- ); - - if( iSeek!=iOff ){ - if( piErrno ) *piErrno = (iSeek==-1 ? errno : 0); - return -1; + SimulateIOError( iSeek = -1 ); + if( iSeek<0 ){ + rc = -1; + break; } rc = osWrite(fd, pBuf, nBuf); }while( rc<0 && errno==EINTR ); @@ -28429,7 +34992,7 @@ static int seekAndWriteFd( TIMER_END; OSTRACE(("WRITE %-3d %5d %7lld %llu\n", fd, rc, iOff, TIMER_ELAPSED)); - if( rc<0 && piErrno ) *piErrno = errno; + if( rc<0 ) *piErrno = errno; return rc; } @@ -28464,7 +35027,7 @@ static int unixWrite( /* If this is a database file (not a journal, master-journal or temp ** file), the bytes in the locking range should never be read or written. */ #if 0 - assert( pFile->pUnused==0 + assert( pFile->pPreallocatedUnused==0 || offset>=PENDING_BYTE+512 || offset+amt<=PENDING_BYTE ); @@ -28492,7 +35055,7 @@ static int unixWrite( } #endif -#if SQLITE_MAX_MMAP_SIZE>0 +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 /* Deal with as much of this write request as possible by transfering ** data from the memory mapping using memcpy(). */ if( offset<pFile->mmapSize ){ @@ -28508,8 +35071,8 @@ static int unixWrite( } } #endif - - while( amt>0 && (wrote = seekAndWrite(pFile, offset, pBuf, amt))>0 ){ + + while( (wrote = seekAndWrite(pFile, offset, pBuf, amt))<amt && wrote>0 ){ amt -= wrote; offset += wrote; pBuf = &((char*)pBuf)[wrote]; @@ -28517,12 +35080,12 @@ static int unixWrite( SimulateIOError(( wrote=(-1), amt=1 )); SimulateDiskfullError(( wrote=0, amt=1 )); - if( amt>0 ){ + if( amt>wrote ){ if( wrote<0 && pFile->lastErrno!=ENOSPC ){ /* lastErrno set by seekAndWrite */ return SQLITE_IOERR_WRITE; }else{ - pFile->lastErrno = 0; /* not a system error */ + storeLastErrno(pFile, 0); /* not a system error */ return SQLITE_FULL; } } @@ -28613,10 +35176,15 @@ static int full_fsync(int fd, int fullSync, int dataOnly){ #endif /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a - ** no-op + ** no-op. But go ahead and call fstat() to validate the file + ** descriptor as we need a method to provoke a failure during + ** coverate testing. */ #ifdef SQLITE_NO_SYNC - rc = SQLITE_OK; + { + struct stat buf; + rc = osFstat(fd, &buf); + } #elif HAVE_FULLFSYNC if( fullSync ){ rc = osFcntl(fd, F_FULLFSYNC, 0); @@ -28682,16 +35250,20 @@ static int openDirectory(const char *zFilename, int *pFd){ char zDirname[MAX_PATHNAME+1]; sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename); - for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--); + for(ii=(int)strlen(zDirname); ii>0 && zDirname[ii]!='/'; ii--); if( ii>0 ){ zDirname[ii] = '\0'; - fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); - if( fd>=0 ){ - OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); - } + }else{ + if( zDirname[0]!='/' ) zDirname[0] = '.'; + zDirname[1] = 0; + } + fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0); + if( fd>=0 ){ + OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname)); } *pFd = fd; - return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname)); + if( fd>=0 ) return SQLITE_OK; + return unixLogError(SQLITE_CANTOPEN_BKPT, "openDirectory", zDirname); } /* @@ -28731,7 +35303,7 @@ static int unixSync(sqlite3_file *id, int flags){ rc = full_fsync(pFile->h, isFullsync, isDataOnly); SimulateIOError( rc=1 ); if( rc ){ - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath); } @@ -28744,10 +35316,11 @@ static int unixSync(sqlite3_file *id, int flags){ OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath, HAVE_FULLFSYNC, isFullsync)); rc = osOpenDirectory(pFile->zPath, &dirfd); - if( rc==SQLITE_OK && dirfd>=0 ){ + if( rc==SQLITE_OK ){ full_fsync(dirfd, 0, 0); robust_close(pFile, dirfd, __LINE__); - }else if( rc==SQLITE_CANTOPEN ){ + }else{ + assert( rc==SQLITE_CANTOPEN ); rc = SQLITE_OK; } pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC; @@ -28775,7 +35348,7 @@ static int unixTruncate(sqlite3_file *id, i64 nByte){ rc = robust_ftruncate(pFile->h, nByte); if( rc ){ - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); }else{ #ifdef SQLITE_DEBUG @@ -28815,7 +35388,7 @@ static int unixFileSize(sqlite3_file *id, i64 *pSize){ rc = osFstat(((unixFile*)id)->h, &buf); SimulateIOError( rc=1 ); if( rc!=0 ){ - ((unixFile*)id)->lastErrno = errno; + storeLastErrno((unixFile*)id, errno); return SQLITE_IOERR_FSTAT; } *pSize = buf.st_size; @@ -28851,7 +35424,9 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ i64 nSize; /* Required file size */ struct stat buf; /* Used to hold return values of fstat() */ - if( osFstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT; + if( osFstat(pFile->h, &buf) ){ + return SQLITE_IOERR_FSTAT; + } nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk; if( nSize>(i64)buf.st_size ){ @@ -28864,7 +35439,7 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ do{ err = osFallocate(pFile->h, buf.st_size, nSize-buf.st_size); }while( err==EINTR ); - if( err ) return SQLITE_IOERR_WRITE; + if( err && err!=EINVAL ) return SQLITE_IOERR_WRITE; #else /* If the OS does not have posix_fallocate(), fake it. Write a ** single byte to the last byte in each block that falls entirely @@ -28877,18 +35452,14 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ int nWrite = 0; /* Number of bytes written by seekAndWrite */ i64 iWrite; /* Next offset to write to */ - iWrite = ((buf.st_size + 2*nBlk - 1)/nBlk)*nBlk-1; + iWrite = (buf.st_size/nBlk)*nBlk + nBlk - 1; assert( iWrite>=buf.st_size ); - assert( (iWrite/nBlk)==((buf.st_size+nBlk-1)/nBlk) ); assert( ((iWrite+1)%nBlk)==0 ); - for(/*no-op*/; iWrite<nSize; iWrite+=nBlk ){ + for(/*no-op*/; iWrite<nSize+nBlk-1; iWrite+=nBlk ){ + if( iWrite>=nSize ) iWrite = nSize - 1; nWrite = seekAndWrite(pFile, iWrite, "", 1); if( nWrite!=1 ) return SQLITE_IOERR_WRITE; } - if( nWrite==0 || (nSize%nBlk) ){ - nWrite = seekAndWrite(pFile, nSize-1, "", 1); - if( nWrite!=1 ) return SQLITE_IOERR_WRITE; - } #endif } } @@ -28898,7 +35469,7 @@ static int fcntlSizeHint(unixFile *pFile, i64 nByte){ int rc; if( pFile->szChunk<=0 ){ if( robust_ftruncate(pFile->h, nByte) ){ - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); return unixLogError(SQLITE_IOERR_TRUNCATE, "ftruncate", pFile->zPath); } } @@ -28936,11 +35507,26 @@ static int unixGetTempname(int nBuf, char *zBuf); static int unixFileControl(sqlite3_file *id, int op, void *pArg){ unixFile *pFile = (unixFile*)id; switch( op ){ +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + case SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_START_ATOMIC_WRITE); + return rc ? SQLITE_IOERR_BEGIN_ATOMIC : SQLITE_OK; + } + case SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_COMMIT_ATOMIC_WRITE); + return rc ? SQLITE_IOERR_COMMIT_ATOMIC : SQLITE_OK; + } + case SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: { + int rc = osIoctl(pFile->h, F2FS_IOC_ABORT_VOLATILE_WRITE); + return rc ? SQLITE_IOERR_ROLLBACK_ATOMIC : SQLITE_OK; + } +#endif /* __linux__ && SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + case SQLITE_FCNTL_LOCKSTATE: { *(int*)pArg = pFile->eFileLock; return SQLITE_OK; } - case SQLITE_LAST_ERRNO: { + case SQLITE_FCNTL_LAST_ERRNO: { *(int*)pArg = pFile->lastErrno; return SQLITE_OK; } @@ -28968,7 +35554,7 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ return SQLITE_OK; } case SQLITE_FCNTL_TEMPFILENAME: { - char *zTFile = sqlite3_malloc( pFile->pVfs->mxPathname ); + char *zTFile = sqlite3_malloc64( pFile->pVfs->mxPathname ); if( zTFile ){ unixGetTempname(pFile->pVfs->mxPathname, zTFile); *(char**)pArg = zTFile; @@ -28979,6 +35565,12 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ *(int*)pArg = fileHasMoved(pFile); return SQLITE_OK; } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + case SQLITE_FCNTL_LOCK_TIMEOUT: { + pFile->iBusyTimeout = *(int*)pArg; + return SQLITE_OK; + } +#endif #if SQLITE_MAX_MMAP_SIZE>0 case SQLITE_FCNTL_MMAP_SIZE: { i64 newLimit = *(i64*)pArg; @@ -28986,6 +35578,14 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ if( newLimit>sqlite3GlobalConfig.mxMmap ){ newLimit = sqlite3GlobalConfig.mxMmap; } + + /* The value of newLimit may be eventually cast to (size_t) and passed + ** to mmap(). Restrict its value to 2GB if (size_t) is not at least a + ** 64-bit type. */ + if( newLimit>0 && sizeof(size_t)<8 ){ + newLimit = (newLimit & 0x7FFFFFFF); + } + *(i64*)pArg = pFile->mmapSizeMax; if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ pFile->mmapSizeMax = newLimit; @@ -29009,8 +35609,8 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ } #endif #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) - case SQLITE_SET_LOCKPROXYFILE: - case SQLITE_GET_LOCKPROXYFILE: { + case SQLITE_FCNTL_SET_LOCKPROXYFILE: + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { return proxyFileControl(id,op,pArg); } #endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ @@ -29019,30 +35619,41 @@ static int unixFileControl(sqlite3_file *id, int op, void *pArg){ } /* -** Return the sector size in bytes of the underlying block device for -** the specified file. This is almost always 512 bytes, but may be -** larger for some devices. +** If pFd->sectorSize is non-zero when this function is called, it is a +** no-op. Otherwise, the values of pFd->sectorSize and +** pFd->deviceCharacteristics are set according to the file-system +** characteristics. ** -** SQLite code assumes this function cannot fail. It also assumes that -** if two files are created in the same file-system directory (i.e. -** a database and its journal file) that the sector size will be the -** same for both. +** There are two versions of this function. One for QNX and one for all +** other systems. */ -#ifndef __QNXNTO__ -static int unixSectorSize(sqlite3_file *NotUsed){ - UNUSED_PARAMETER(NotUsed); - return SQLITE_DEFAULT_SECTOR_SIZE; -} -#endif +#ifndef __QNXNTO__ +static void setDeviceCharacteristics(unixFile *pFd){ + assert( pFd->deviceCharacteristics==0 || pFd->sectorSize!=0 ); + if( pFd->sectorSize==0 ){ +#if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + int res; + u32 f = 0; -/* -** The following version of unixSectorSize() is optimized for QNX. -*/ -#ifdef __QNXNTO__ + /* Check for support for F2FS atomic batch writes. */ + res = osIoctl(pFd->h, F2FS_IOC_GET_FEATURES, &f); + if( res==0 && (f & F2FS_FEATURE_ATOMIC_WRITE) ){ + pFd->deviceCharacteristics = SQLITE_IOCAP_BATCH_ATOMIC; + } +#endif /* __linux__ && SQLITE_ENABLE_BATCH_ATOMIC_WRITE */ + + /* Set the POWERSAFE_OVERWRITE flag if requested. */ + if( pFd->ctrlFlags & UNIXFILE_PSOW ){ + pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; + } + + pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; + } +} +#else #include <sys/dcmd_blk.h> #include <sys/statvfs.h> -static int unixSectorSize(sqlite3_file *id){ - unixFile *pFile = (unixFile*)id; +static void setDeviceCharacteristics(unixFile *pFile){ if( pFile->sectorSize == 0 ){ struct statvfs fsInfo; @@ -29050,7 +35661,7 @@ static int unixSectorSize(sqlite3_file *id){ pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; pFile->deviceCharacteristics = 0; if( fstatvfs(pFile->h, &fsInfo) == -1 ) { - return pFile->sectorSize; + return; } if( !strcmp(fsInfo.f_basetype, "tmp") ) { @@ -29111,9 +35722,24 @@ static int unixSectorSize(sqlite3_file *id){ pFile->deviceCharacteristics = 0; pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; } - return pFile->sectorSize; } -#endif /* __QNXNTO__ */ +#endif + +/* +** Return the sector size in bytes of the underlying block device for +** the specified file. This is almost always 512 bytes, but may be +** larger for some devices. +** +** SQLite code assumes this function cannot fail. It also assumes that +** if two files are created in the same file-system directory (i.e. +** a database and its journal file) that the sector size will be the +** same for both. +*/ +static int unixSectorSize(sqlite3_file *id){ + unixFile *pFd = (unixFile*)id; + setDeviceCharacteristics(pFd); + return pFd->sectorSize; +} /* ** Return the device characteristics for the file. @@ -29129,16 +35755,9 @@ static int unixSectorSize(sqlite3_file *id){ ** available to turn it off and URI query parameter available to turn it off. */ static int unixDeviceCharacteristics(sqlite3_file *id){ - unixFile *p = (unixFile*)id; - int rc = 0; -#ifdef __QNXNTO__ - if( p->sectorSize==0 ) unixSectorSize(id); - rc = p->deviceCharacteristics; -#endif - if( p->ctrlFlags & UNIXFILE_PSOW ){ - rc |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; - } - return rc; + unixFile *pFd = (unixFile*)id; + setDeviceCharacteristics(pFd); + return pFd->deviceCharacteristics; } #if !defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0 @@ -29150,7 +35769,9 @@ static int unixDeviceCharacteristics(sqlite3_file *id){ ** Instead, it should be called via macro osGetpagesize(). */ static int unixGetpagesize(void){ -#if defined(_BSD_SOURCE) +#if OS_VXWORKS + return 1024; +#elif defined(_BSD_SOURCE) return getpagesize(); #else return (int)sysconf(_SC_PAGESIZE); @@ -29198,6 +35819,7 @@ struct unixShmNode { int szRegion; /* Size of shared-memory regions */ u16 nRegion; /* Size of array apRegion */ u8 isReadonly; /* True if read-only */ + u8 isUnlocked; /* True if no DMS lock held */ char **apRegion; /* Array of mapped shared-memory regions */ int nRef; /* Number of unixShm objects pointing to this */ unixShm *pFirst; /* All unixShm objects pointing to this */ @@ -29243,32 +35865,32 @@ struct unixShm { ** otherwise. */ static int unixShmSystemLock( - unixShmNode *pShmNode, /* Apply locks to this open shared-memory segment */ + unixFile *pFile, /* Open connection to the WAL file */ int lockType, /* F_UNLCK, F_RDLCK, or F_WRLCK */ int ofst, /* First byte of the locking range */ int n /* Number of bytes to lock */ ){ - struct flock f; /* The posix advisory locking structure */ - int rc = SQLITE_OK; /* Result code form fcntl() */ + unixShmNode *pShmNode; /* Apply locks to this open shared-memory segment */ + struct flock f; /* The posix advisory locking structure */ + int rc = SQLITE_OK; /* Result code form fcntl() */ /* Access to the unixShmNode object is serialized by the caller */ - assert( sqlite3_mutex_held(pShmNode->mutex) || pShmNode->nRef==0 ); + pShmNode = pFile->pInode->pShmNode; + assert( pShmNode->nRef==0 || sqlite3_mutex_held(pShmNode->mutex) ); /* Shared locks never span more than one byte */ assert( n==1 || lockType!=F_RDLCK ); /* Locks are within range */ - assert( n>=1 && n<SQLITE_SHM_NLOCK ); + assert( n>=1 && n<=SQLITE_SHM_NLOCK ); if( pShmNode->h>=0 ){ /* Initialize the locking parameters */ - memset(&f, 0, sizeof(f)); f.l_type = lockType; f.l_whence = SEEK_SET; f.l_start = ofst; f.l_len = n; - - rc = osFcntl(pShmNode->h, F_SETLK, &f); + rc = osSetPosixAdvisoryLock(pShmNode->h, &f, pFile); rc = (rc!=(-1)) ? SQLITE_OK : SQLITE_BUSY; } @@ -29336,7 +35958,7 @@ static int unixShmRegionPerMap(void){ static void unixShmPurge(unixFile *pFd){ unixShmNode *p = pFd->pInode->pShmNode; assert( unixMutexHeld() ); - if( p && p->nRef==0 ){ + if( p && ALWAYS(p->nRef==0) ){ int nShmPerMap = unixShmRegionPerMap(); int i; assert( p->pInode==pFd->pInode ); @@ -29358,6 +35980,64 @@ static void unixShmPurge(unixFile *pFd){ } } +/* +** The DMS lock has not yet been taken on shm file pShmNode. Attempt to +** take it now. Return SQLITE_OK if successful, or an SQLite error +** code otherwise. +** +** If the DMS cannot be locked because this is a readonly_shm=1 +** connection and no other process already holds a lock, return +** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. +*/ +static int unixLockSharedMemory(unixFile *pDbFd, unixShmNode *pShmNode){ + struct flock lock; + int rc = SQLITE_OK; + + /* Use F_GETLK to determine the locks other processes are holding + ** on the DMS byte. If it indicates that another process is holding + ** a SHARED lock, then this process may also take a SHARED lock + ** and proceed with opening the *-shm file. + ** + ** Or, if no other process is holding any lock, then this process + ** is the first to open it. In this case take an EXCLUSIVE lock on the + ** DMS byte and truncate the *-shm file to zero bytes in size. Then + ** downgrade to a SHARED lock on the DMS byte. + ** + ** If another process is holding an EXCLUSIVE lock on the DMS byte, + ** return SQLITE_BUSY to the caller (it will try again). An earlier + ** version of this code attempted the SHARED lock at this point. But + ** this introduced a subtle race condition: if the process holding + ** EXCLUSIVE failed just before truncating the *-shm file, then this + ** process might open and use the *-shm file without truncating it. + ** And if the *-shm file has been corrupted by a power failure or + ** system crash, the database itself may also become corrupt. */ + lock.l_whence = SEEK_SET; + lock.l_start = UNIX_SHM_DMS; + lock.l_len = 1; + lock.l_type = F_WRLCK; + if( osFcntl(pShmNode->h, F_GETLK, &lock)!=0 ) { + rc = SQLITE_IOERR_LOCK; + }else if( lock.l_type==F_UNLCK ){ + if( pShmNode->isReadonly ){ + pShmNode->isUnlocked = 1; + rc = SQLITE_READONLY_CANTINIT; + }else{ + rc = unixShmSystemLock(pDbFd, F_WRLCK, UNIX_SHM_DMS, 1); + if( rc==SQLITE_OK && robust_ftruncate(pShmNode->h, 0) ){ + rc = unixLogError(SQLITE_IOERR_SHMOPEN,"ftruncate",pShmNode->zFilename); + } + } + }else if( lock.l_type==F_WRLCK ){ + rc = SQLITE_BUSY; + } + + if( rc==SQLITE_OK ){ + assert( lock.l_type==F_UNLCK || lock.l_type==F_RDLCK ); + rc = unixShmSystemLock(pDbFd, F_RDLCK, UNIX_SHM_DMS, 1); + } + return rc; +} + /* ** Open a shared-memory area associated with open database file pDbFd. ** This particular implementation uses mmapped files. @@ -29396,14 +36076,14 @@ static void unixShmPurge(unixFile *pFd){ static int unixOpenSharedMemory(unixFile *pDbFd){ struct unixShm *p = 0; /* The connection to be opened */ struct unixShmNode *pShmNode; /* The underlying mmapped file */ - int rc; /* Result code */ + int rc = SQLITE_OK; /* Result code */ unixInodeInfo *pInode; /* The inode of fd */ - char *zShmFilename; /* Name of the file used for SHM */ + char *zShm; /* Name of the file used for SHM */ int nShmFilename; /* Size of the SHM filename in bytes */ /* Allocate space for the new unixShm object. */ - p = sqlite3_malloc( sizeof(*p) ); - if( p==0 ) return SQLITE_NOMEM; + p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return SQLITE_NOMEM_BKPT; memset(p, 0, sizeof(*p)); assert( pDbFd->pShm==0 ); @@ -29415,12 +36095,15 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ pShmNode = pInode->pShmNode; if( pShmNode==0 ){ struct stat sStat; /* fstat() info for database file */ +#ifndef SQLITE_SHM_DIRECTORY + const char *zBasePath = pDbFd->zPath; +#endif /* Call fstat() to figure out the permissions on the database file. If ** a new *-shm file is created, an attempt will be made to create it ** with the same permissions. */ - if( osFstat(pDbFd->h, &sStat) && pInode->bProcessLock==0 ){ + if( osFstat(pDbFd->h, &sStat) ){ rc = SQLITE_IOERR_FSTAT; goto shm_open_err; } @@ -29428,63 +36111,55 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ #ifdef SQLITE_SHM_DIRECTORY nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; #else - nShmFilename = 6 + (int)strlen(pDbFd->zPath); + nShmFilename = 6 + (int)strlen(zBasePath); #endif - pShmNode = sqlite3_malloc( sizeof(*pShmNode) + nShmFilename ); + pShmNode = sqlite3_malloc64( sizeof(*pShmNode) + nShmFilename ); if( pShmNode==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto shm_open_err; } memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); - zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1]; + zShm = pShmNode->zFilename = (char*)&pShmNode[1]; #ifdef SQLITE_SHM_DIRECTORY - sqlite3_snprintf(nShmFilename, zShmFilename, + sqlite3_snprintf(nShmFilename, zShm, SQLITE_SHM_DIRECTORY "/sqlite-shm-%x-%x", (u32)sStat.st_ino, (u32)sStat.st_dev); #else - sqlite3_snprintf(nShmFilename, zShmFilename, "%s-shm", pDbFd->zPath); - sqlite3FileSuffix3(pDbFd->zPath, zShmFilename); + sqlite3_snprintf(nShmFilename, zShm, "%s-shm", zBasePath); + sqlite3FileSuffix3(pDbFd->zPath, zShm); #endif pShmNode->h = -1; pDbFd->pInode->pShmNode = pShmNode; pShmNode->pInode = pDbFd->pInode; - pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pShmNode->mutex==0 ){ - rc = SQLITE_NOMEM; - goto shm_open_err; + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->mutex==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto shm_open_err; + } } if( pInode->bProcessLock==0 ){ - int openFlags = O_RDWR | O_CREAT; - if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ - openFlags = O_RDONLY; - pShmNode->isReadonly = 1; + if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + pShmNode->h = robust_open(zShm, O_RDWR|O_CREAT, (sStat.st_mode&0777)); } - pShmNode->h = robust_open(zShmFilename, openFlags, (sStat.st_mode&0777)); if( pShmNode->h<0 ){ - rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShmFilename); - goto shm_open_err; + pShmNode->h = robust_open(zShm, O_RDONLY, (sStat.st_mode&0777)); + if( pShmNode->h<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zShm); + goto shm_open_err; + } + pShmNode->isReadonly = 1; } /* If this process is running as root, make sure that the SHM file ** is owned by the same user that owns the original database. Otherwise, ** the original owner will not be able to connect. */ - osFchown(pShmNode->h, sStat.st_uid, sStat.st_gid); - - /* Check to see if another process is holding the dead-man switch. - ** If not, truncate the file to zero length. - */ - rc = SQLITE_OK; - if( unixShmSystemLock(pShmNode, F_WRLCK, UNIX_SHM_DMS, 1)==SQLITE_OK ){ - if( robust_ftruncate(pShmNode->h, 0) ){ - rc = unixLogError(SQLITE_IOERR_SHMOPEN, "ftruncate", zShmFilename); - } - } - if( rc==SQLITE_OK ){ - rc = unixShmSystemLock(pShmNode, F_RDLCK, UNIX_SHM_DMS, 1); - } - if( rc ) goto shm_open_err; + robustFchown(pShmNode->h, sStat.st_uid, sStat.st_gid); + + rc = unixLockSharedMemory(pDbFd, pShmNode); + if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; } } @@ -29508,7 +36183,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ p->pNext = pShmNode->pFirst; pShmNode->pFirst = p; sqlite3_mutex_leave(pShmNode->mutex); - return SQLITE_OK; + return rc; /* Jump here on any error */ shm_open_err: @@ -29560,6 +36235,11 @@ static int unixShmMap( p = pDbFd->pShm; pShmNode = p->pShmNode; sqlite3_mutex_enter(pShmNode->mutex); + if( pShmNode->isUnlocked ){ + rc = unixLockSharedMemory(pDbFd, pShmNode); + if( rc!=SQLITE_OK ) goto shmpage_out; + pShmNode->isUnlocked = 0; + } assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); assert( pShmNode->pInode==pDbFd->pInode ); assert( pShmNode->h>=0 || pDbFd->pInode->bProcessLock==1 ); @@ -29607,7 +36287,8 @@ static int unixShmMap( /* Write to the last byte of each newly allocated or extended page */ assert( (nByte % pgsz)==0 ); for(iPg=(sStat.st_size/pgsz); iPg<(nByte/pgsz); iPg++){ - if( seekAndWriteFd(pShmNode->h, iPg*pgsz + pgsz-1, "", 1, 0)!=1 ){ + int x = 0; + if( seekAndWriteFd(pShmNode->h, iPg*pgsz + pgsz-1, "", 1, &x)!=1 ){ const char *zFile = pShmNode->zFilename; rc = unixLogError(SQLITE_IOERR_SHMSIZE, "write", zFile); goto shmpage_out; @@ -29622,7 +36303,7 @@ static int unixShmMap( pShmNode->apRegion, nReqRegion*sizeof(char *) ); if( !apNew ){ - rc = SQLITE_IOERR_NOMEM; + rc = SQLITE_IOERR_NOMEM_BKPT; goto shmpage_out; } pShmNode->apRegion = apNew; @@ -29640,9 +36321,9 @@ static int unixShmMap( goto shmpage_out; } }else{ - pMem = sqlite3_malloc(szRegion); + pMem = sqlite3_malloc64(szRegion); if( pMem==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto shmpage_out; } memset(pMem, 0, szRegion); @@ -29714,7 +36395,7 @@ static int unixShmLock( /* Unlock the system-level locks */ if( (mask & allMask)==0 ){ - rc = unixShmSystemLock(pShmNode, F_UNLCK, ofst+UNIX_SHM_BASE, n); + rc = unixShmSystemLock(pDbFd, F_UNLCK, ofst+UNIX_SHM_BASE, n); }else{ rc = SQLITE_OK; } @@ -29742,7 +36423,7 @@ static int unixShmLock( /* Get shared locks at the system level, if necessary */ if( rc==SQLITE_OK ){ if( (allShared & mask)==0 ){ - rc = unixShmSystemLock(pShmNode, F_RDLCK, ofst+UNIX_SHM_BASE, n); + rc = unixShmSystemLock(pDbFd, F_RDLCK, ofst+UNIX_SHM_BASE, n); }else{ rc = SQLITE_OK; } @@ -29767,7 +36448,7 @@ static int unixShmLock( ** also mark the local connection as being locked. */ if( rc==SQLITE_OK ){ - rc = unixShmSystemLock(pShmNode, F_WRLCK, ofst+UNIX_SHM_BASE, n); + rc = unixShmSystemLock(pDbFd, F_WRLCK, ofst+UNIX_SHM_BASE, n); if( rc==SQLITE_OK ){ assert( (p->sharedMask & mask)==0 ); p->exclMask |= mask; @@ -29776,7 +36457,7 @@ static int unixShmLock( } sqlite3_mutex_leave(pShmNode->mutex); OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x\n", - p->id, getpid(), p->sharedMask, p->exclMask)); + p->id, osGetpid(0), p->sharedMask, p->exclMask)); return rc; } @@ -29790,7 +36471,8 @@ static void unixShmBarrier( sqlite3_file *fd /* Database file holding the shared memory */ ){ UNUSED_PARAMETER(fd); - unixEnterMutex(); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + unixEnterMutex(); /* Also mutex, for redundancy */ unixLeaveMutex(); } @@ -29835,7 +36517,9 @@ static int unixShmUnmap( assert( pShmNode->nRef>0 ); pShmNode->nRef--; if( pShmNode->nRef==0 ){ - if( deleteFlag && pShmNode->h>=0 ) osUnlink(pShmNode->zFilename); + if( deleteFlag && pShmNode->h>=0 ){ + osUnlink(pShmNode->zFilename); + } unixShmPurge(pDbFd); } unixLeaveMutex(); @@ -29898,7 +36582,9 @@ static void unixRemapfile( assert( pFd->mmapSizeActual>=pFd->mmapSize ); assert( MAP_FAILED!=0 ); +#ifdef SQLITE_MMAP_READWRITE if( (pFd->ctrlFlags & UNIXFILE_RDONLY)==0 ) flags |= PROT_WRITE; +#endif if( pOrig ){ #if HAVE_MREMAP @@ -29970,17 +36656,14 @@ static void unixRemapfile( ** recreated as a result of outstanding references) or an SQLite error ** code otherwise. */ -static int unixMapfile(unixFile *pFd, i64 nByte){ - i64 nMap = nByte; - int rc; - +static int unixMapfile(unixFile *pFd, i64 nMap){ assert( nMap>=0 || pFd->nFetchOut==0 ); + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); if( pFd->nFetchOut>0 ) return SQLITE_OK; if( nMap<0 ){ struct stat statbuf; /* Low-level file information */ - rc = osFstat(pFd->h, &statbuf); - if( rc!=SQLITE_OK ){ + if( osFstat(pFd->h, &statbuf) ){ return SQLITE_IOERR_FSTAT; } nMap = statbuf.st_size; @@ -29989,12 +36672,9 @@ static int unixMapfile(unixFile *pFd, i64 nByte){ nMap = pFd->mmapSizeMax; } + assert( nMap>0 || (pFd->mmapSize==0 && pFd->pMapRegion==0) ); if( nMap!=pFd->mmapSize ){ - if( nMap>0 ){ - unixRemapfile(pFd, nMap); - }else{ - unixUnmapfile(pFd); - } + unixRemapfile(pFd, nMap); } return SQLITE_OK; @@ -30112,7 +36792,7 @@ static int unixUnfetch(sqlite3_file *fd, i64 iOff, void *p){ ** * An I/O method finder function called FINDER that returns a pointer ** to the METHOD object in the previous bullet. */ -#define IOMETHODS(FINDER, METHOD, VERSION, CLOSE, LOCK, UNLOCK, CKLOCK, SHMMAP) \ +#define IOMETHODS(FINDER,METHOD,VERSION,CLOSE,LOCK,UNLOCK,CKLOCK,SHMMAP) \ static const sqlite3_io_methods METHOD = { \ VERSION, /* iVersion */ \ CLOSE, /* xClose */ \ @@ -30177,7 +36857,7 @@ IOMETHODS( 0 /* xShmMap method */ ) -#if SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS +#if SQLITE_ENABLE_LOCKING_STYLE IOMETHODS( flockIoFinder, /* Finder function name */ flockIoMethods, /* sqlite3_io_methods object name */ @@ -30195,10 +36875,10 @@ IOMETHODS( semIoFinder, /* Finder function name */ semIoMethods, /* sqlite3_io_methods object name */ 1, /* shared memory is disabled */ - semClose, /* xClose method */ - semLock, /* xLock method */ - semUnlock, /* xUnlock method */ - semCheckReservedLock, /* xCheckReservedLock method */ + semXClose, /* xClose method */ + semXLock, /* xLock method */ + semXUnlock, /* xUnlock method */ + semXCheckReservedLock, /* xCheckReservedLock method */ 0 /* xShmMap method */ ) #endif @@ -30322,15 +37002,13 @@ static const sqlite3_io_methods #endif /* defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE */ -#if OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE -/* -** This "finder" function attempts to determine the best locking strategy -** for the database file "filePath". It then returns the sqlite3_io_methods -** object that implements that strategy. -** -** This is for VXWorks only. +#if OS_VXWORKS +/* +** This "finder" function for VxWorks checks to see if posix advisory +** locking works. If it does, then that is what is used. If it does not +** work, then fallback to named semaphore locking. */ -static const sqlite3_io_methods *autolockIoFinderImpl( +static const sqlite3_io_methods *vxworksIoFinderImpl( const char *filePath, /* name of the database file */ unixFile *pNew /* the open file object */ ){ @@ -30356,9 +37034,9 @@ static const sqlite3_io_methods *autolockIoFinderImpl( } } static const sqlite3_io_methods - *(*const autolockIoFinder)(const char*,unixFile*) = autolockIoFinderImpl; + *(*const vxworksIoFinder)(const char*,unixFile*) = vxworksIoFinderImpl; -#endif /* OS_VXWORKS && SQLITE_ENABLE_LOCKING_STYLE */ +#endif /* OS_VXWORKS */ /* ** An abstract type for a pointer to an IO method finder function: @@ -30389,17 +37067,6 @@ static int fillInUnixFile( assert( pNew->pInode==NULL ); - /* Usually the path zFilename should not be a relative pathname. The - ** exception is when opening the proxy "conch" file in builds that - ** include the special Apple locking styles. - */ -#if defined(__APPLE__) && SQLITE_ENABLE_LOCKING_STYLE - assert( zFilename==0 || zFilename[0]=='/' - || pVfs->pAppData==(void*)&autolockIoFinder ); -#else - assert( zFilename==0 || zFilename[0]=='/' ); -#endif - /* No locking occurs in temporary files */ assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 ); @@ -30423,7 +37090,7 @@ static int fillInUnixFile( pNew->pId = vxworksFindFileId(zFilename); if( pNew->pId==0 ){ ctrlFlags |= UNIXFILE_NOLOCK; - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } #endif @@ -30477,9 +37144,9 @@ static int fillInUnixFile( ** the afpLockingContext. */ afpLockingContext *pCtx; - pNew->lockingContext = pCtx = sqlite3_malloc( sizeof(*pCtx) ); + pNew->lockingContext = pCtx = sqlite3_malloc64( sizeof(*pCtx) ); if( pCtx==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ /* NB: zFilename exists and remains valid until the file is closed ** according to requirement F11141. So we do not need to make a @@ -30507,9 +37174,9 @@ static int fillInUnixFile( int nFilename; assert( zFilename!=0 ); nFilename = (int)strlen(zFilename) + 6; - zLockFile = (char *)sqlite3_malloc(nFilename); + zLockFile = (char *)sqlite3_malloc64(nFilename); if( zLockFile==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ sqlite3_snprintf(nFilename, zLockFile, "%s" DOTLOCK_SUFFIX, zFilename); } @@ -30532,7 +37199,7 @@ static int fillInUnixFile( if( zSemName[n]=='/' ) zSemName[n] = '_'; pNew->pInode->pSem = sem_open(zSemName, O_CREAT, 0666, 1); if( pNew->pInode->pSem == SEM_FAILED ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; pNew->pInode->aSemName[0] = '\0'; } } @@ -30540,7 +37207,7 @@ static int fillInUnixFile( } #endif - pNew->lastErrno = 0; + storeLastErrno(pNew, 0); #if OS_VXWORKS if( rc!=SQLITE_OK ){ if( h>=0 ) robust_close(pNew, h, __LINE__); @@ -30565,29 +37232,31 @@ static int fillInUnixFile( */ static const char *unixTempFileDir(void){ static const char *azDirs[] = { - 0, 0, 0, "/var/tmp", "/usr/tmp", "/tmp", - 0 /* List terminator */ + "." }; - unsigned int i; + unsigned int i = 0; struct stat buf; - const char *zDir = 0; + const char *zDir = sqlite3_temp_directory; - azDirs[0] = sqlite3_temp_directory; - if( !azDirs[1] ) azDirs[1] = getenv("SQLITE_TMPDIR"); - if( !azDirs[2] ) azDirs[2] = getenv("TMPDIR"); - for(i=0; i<sizeof(azDirs)/sizeof(azDirs[0]); zDir=azDirs[i++]){ - if( zDir==0 ) continue; - if( osStat(zDir, &buf) ) continue; - if( !S_ISDIR(buf.st_mode) ) continue; - if( osAccess(zDir, 07) ) continue; - break; + if( !azDirs[0] ) azDirs[0] = getenv("SQLITE_TMPDIR"); + if( !azDirs[1] ) azDirs[1] = getenv("TMPDIR"); + while(1){ + if( zDir!=0 + && osStat(zDir, &buf)==0 + && S_ISDIR(buf.st_mode) + && osAccess(zDir, 03)==0 + ){ + return zDir; + } + if( i>=sizeof(azDirs)/sizeof(azDirs[0]) ) break; + zDir = azDirs[i++]; } - return zDir; + return 0; } /* @@ -30596,38 +37265,26 @@ static const char *unixTempFileDir(void){ ** pVfs->mxPathname bytes. */ static int unixGetTempname(int nBuf, char *zBuf){ - static const unsigned char zChars[] = - "abcdefghijklmnopqrstuvwxyz" - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "0123456789"; - unsigned int i, j; const char *zDir; + int iLimit = 0; /* It's odd to simulate an io-error here, but really this is just ** using the io-error infrastructure to test that SQLite handles this ** function failing. */ + zBuf[0] = 0; SimulateIOError( return SQLITE_IOERR ); zDir = unixTempFileDir(); - if( zDir==0 ) zDir = "."; - - /* Check that the output buffer is large enough for the temporary file - ** name. If it is not, return SQLITE_ERROR. - */ - if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 18) >= (size_t)nBuf ){ - return SQLITE_ERROR; - } - + if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH; do{ - sqlite3_snprintf(nBuf-18, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); - j = (int)strlen(zBuf); - sqlite3_randomness(15, &zBuf[j]); - for(i=0; i<15; i++, j++){ - zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; - } - zBuf[j] = 0; - zBuf[j+1] = 0; + u64 r; + sqlite3_randomness(sizeof(r), &r); + assert( nBuf>2 ); + zBuf[nBuf-2] = 0; + sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", + zDir, r, 0); + if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; }while( osAccess(zBuf,0)==0 ); return SQLITE_OK; } @@ -30668,6 +37325,8 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ #if !OS_VXWORKS struct stat sStat; /* Results of stat() call */ + unixEnterMutex(); + /* A stat() call may fail for various reasons. If this happens, it is ** almost certain that an open() call on the same path will also fail. ** For this reason, if an error occurs in the stat() call here, it is @@ -30676,13 +37335,12 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ ** ** Even if a subsequent open() call does succeed, the consequences of ** not searching for a reusable file descriptor are not dire. */ - if( 0==osStat(zPath, &sStat) ){ + if( nUnusedFd>0 && 0==osStat(zPath, &sStat) ){ unixInodeInfo *pInode; - unixEnterMutex(); pInode = inodeList; while( pInode && (pInode->fileId.dev!=sStat.st_dev - || pInode->fileId.ino!=sStat.st_ino) ){ + || pInode->fileId.ino!=(u64)sStat.st_ino) ){ pInode = pInode->pNext; } if( pInode ){ @@ -30690,15 +37348,37 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); pUnused = *pp; if( pUnused ){ + nUnusedFd--; *pp = pUnused->pNext; } } - unixLeaveMutex(); } + unixLeaveMutex(); #endif /* if !OS_VXWORKS */ return pUnused; } +/* +** Find the mode, uid and gid of file zFile. +*/ +static int getFileMode( + const char *zFile, /* File name */ + mode_t *pMode, /* OUT: Permissions of zFile */ + uid_t *pUid, /* OUT: uid of zFile. */ + gid_t *pGid /* OUT: gid of zFile. */ +){ + struct stat sStat; /* Output of stat() on database file */ + int rc = SQLITE_OK; + if( 0==osStat(zFile, &sStat) ){ + *pMode = sStat.st_mode & 0777; + *pUid = sStat.st_uid; + *pGid = sStat.st_gid; + }else{ + rc = SQLITE_IOERR_FSTAT; + } + return rc; +} + /* ** This function is called by unixOpen() to determine the unix permissions ** to create new files with. If no error occurs, then SQLITE_OK is returned @@ -30734,7 +37414,6 @@ static int findCreateFileMode( if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ char zDb[MAX_PATHNAME+1]; /* Database file path */ int nDb; /* Number of valid bytes in zDb */ - struct stat sStat; /* Output of stat() on database file */ /* zPath is a path to a WAL or journal file. The following block derives ** the path to the associated database file from zPath. This block handles @@ -30749,28 +37428,29 @@ static int findCreateFileMode( ** used by the test_multiplex.c module. */ nDb = sqlite3Strlen30(zPath) - 1; -#ifdef SQLITE_ENABLE_8_3_NAMES - while( nDb>0 && sqlite3Isalnum(zPath[nDb]) ) nDb--; - if( nDb==0 || zPath[nDb]!='-' ) return SQLITE_OK; -#else while( zPath[nDb]!='-' ){ - assert( nDb>0 ); - assert( zPath[nDb]!='\n' ); + /* In normal operation, the journal file name will always contain + ** a '-' character. However in 8+3 filename mode, or if a corrupt + ** rollback journal specifies a master journal with a goofy name, then + ** the '-' might be missing. */ + if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK; nDb--; } -#endif memcpy(zDb, zPath, nDb); zDb[nDb] = '\0'; - if( 0==osStat(zDb, &sStat) ){ - *pMode = sStat.st_mode & 0777; - *pUid = sStat.st_uid; - *pGid = sStat.st_gid; - }else{ - rc = SQLITE_IOERR_FSTAT; - } + rc = getFileMode(zDb, pMode, pUid, pGid); }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ *pMode = 0600; + }else if( flags & SQLITE_OPEN_URI ){ + /* If this is a main database file and the file was opened using a URI + ** filename, check for the "modeof" parameter. If present, interpret + ** its value as a filename and try to copy the mode, uid and gid from + ** that file. */ + const char *z = sqlite3_uri_parameter(zPath, "modeof"); + if( z ){ + rc = getFileMode(z, pMode, pUid, pGid); + } } return rc; } @@ -30828,7 +37508,7 @@ static int unixOpen( ** a file-descriptor on the directory too. The first time unixSync() ** is called the directory file descriptor will be fsync()ed and close()d. */ - int syncDir = (isCreate && ( + int isNewJrnl = (isCreate && ( eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_WAL @@ -30871,11 +37551,10 @@ static int unixOpen( ** the same instant might all reset the PRNG. But multiple resets ** are harmless. */ - if( randomnessPid!=getpid() ){ - randomnessPid = getpid(); + if( randomnessPid!=osGetpid(0) ){ + randomnessPid = osGetpid(0); sqlite3_randomness(0,0); } - memset(p, 0, sizeof(unixFile)); if( eType==SQLITE_OPEN_MAIN_DB ){ @@ -30884,12 +37563,12 @@ static int unixOpen( if( pUnused ){ fd = pUnused->fd; }else{ - pUnused = sqlite3_malloc(sizeof(*pUnused)); + pUnused = sqlite3_malloc64(sizeof(*pUnused)); if( !pUnused ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } } - p->pUnused = pUnused; + p->pPreallocatedUnused = pUnused; /* Database filenames are double-zero terminated if they are not ** URIs with parameters. Hence, they can always be passed into @@ -30898,8 +37577,8 @@ static int unixOpen( }else if( !zName ){ /* If zName is NULL, the upper layer is requesting a temp file. */ - assert(isDelete && !syncDir); - rc = unixGetTempname(MAX_PATHNAME+2, zTmpname); + assert(isDelete && !isNewJrnl); + rc = unixGetTempname(pVfs->mxPathname, zTmpname); if( rc!=SQLITE_OK ){ return rc; } @@ -30926,23 +37605,31 @@ static int unixOpen( gid_t gid; /* Groupid for the file */ rc = findCreateFileMode(zName, flags, &openMode, &uid, &gid); if( rc!=SQLITE_OK ){ - assert( !p->pUnused ); + assert( !p->pPreallocatedUnused ); assert( eType==SQLITE_OPEN_WAL || eType==SQLITE_OPEN_MAIN_JOURNAL ); return rc; } fd = robust_open(zName, openFlags, openMode); OSTRACE(("OPENX %-3d %s 0%o\n", fd, zName, openFlags)); - if( fd<0 && errno!=EISDIR && isReadWrite && !isExclusive ){ - /* Failed to open the file for read/write access. Try read-only. */ - flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); - openFlags &= ~(O_RDWR|O_CREAT); - flags |= SQLITE_OPEN_READONLY; - openFlags |= O_RDONLY; - isReadonly = 1; - fd = robust_open(zName, openFlags, openMode); + assert( !isExclusive || (openFlags & O_CREAT)!=0 ); + if( fd<0 ){ + if( isNewJrnl && errno==EACCES && osAccess(zName, F_OK) ){ + /* If unable to create a journal because the directory is not + ** writable, change the error code to indicate that. */ + rc = SQLITE_READONLY_DIRECTORY; + }else if( errno!=EISDIR && isReadWrite ){ + /* Failed to open the file for read/write access. Try read-only. */ + flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); + openFlags &= ~(O_RDWR|O_CREAT); + flags |= SQLITE_OPEN_READONLY; + openFlags |= O_RDONLY; + isReadonly = 1; + fd = robust_open(zName, openFlags, openMode); + } } if( fd<0 ){ - rc = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); + int rc2 = unixLogError(SQLITE_CANTOPEN_BKPT, "open", zName); + if( rc==SQLITE_OK ) rc = rc2; goto open_finished; } @@ -30951,7 +37638,7 @@ static int unixOpen( ** the same as the original database. */ if( flags & (SQLITE_OPEN_WAL|SQLITE_OPEN_MAIN_JOURNAL) ){ - osFchown(fd, uid, gid); + robustFchown(fd, uid, gid); } } assert( fd>=0 ); @@ -30959,9 +37646,9 @@ static int unixOpen( *pOutFlags = flags; } - if( p->pUnused ){ - p->pUnused->fd = fd; - p->pUnused->flags = flags; + if( p->pPreallocatedUnused ){ + p->pPreallocatedUnused->fd = fd; + p->pPreallocatedUnused->flags = flags; } if( isDelete ){ @@ -30971,7 +37658,7 @@ static int unixOpen( zPath = sqlite3_mprintf("%s", zName); if( zPath==0 ){ robust_close(p, fd, __LINE__); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } #else osUnlink(zName); @@ -30982,26 +37669,27 @@ static int unixOpen( p->openFlags = openFlags; } #endif - - noLock = eType!=SQLITE_OPEN_MAIN_DB; - #if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE if( fstatfs(fd, &fsInfo) == -1 ){ - ((unixFile*)pFile)->lastErrno = errno; + storeLastErrno(p, errno); robust_close(p, fd, __LINE__); return SQLITE_IOERR_ACCESS; } if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) { ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; } + if (0 == strncmp("exfat", fsInfo.f_fstypename, 5)) { + ((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; + } #endif /* Set up appropriate ctrlFlags */ if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; + noLock = eType!=SQLITE_OPEN_MAIN_DB; if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; - if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; + if( isNewJrnl ) ctrlFlags |= UNIXFILE_DIRSYNC; if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; #if SQLITE_ENABLE_LOCKING_STYLE @@ -31017,19 +37705,6 @@ static int unixOpen( if( envforce!=NULL ){ useProxy = atoi(envforce)>0; }else{ - if( statfs(zPath, &fsInfo) == -1 ){ - /* In theory, the close(fd) call is sub-optimal. If the file opened - ** with fd is a database file, and there are other connections open - ** on that file that are currently holding advisory locks on it, - ** then the call to close() will cancel those locks. In practice, - ** we're assuming that statfs() doesn't fail very often. At least - ** not while other file descriptors opened by the same process on - ** the same file are working. */ - p->lastErrno = errno; - robust_close(p, fd, __LINE__); - rc = SQLITE_IOERR_ACCESS; - goto open_finished; - } useProxy = !(fsInfo.f_flags&MNT_LOCAL); } if( useProxy ){ @@ -31050,11 +37725,14 @@ static int unixOpen( } #endif + assert( zPath==0 || zPath[0]=='/' + || eType==SQLITE_OPEN_MASTER_JOURNAL || eType==SQLITE_OPEN_MAIN_JOURNAL + ); rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); open_finished: if( rc!=SQLITE_OK ){ - sqlite3_free(p->pUnused); + sqlite3_free(p->pPreallocatedUnused); } return rc; } @@ -31089,16 +37767,12 @@ static int unixDelete( int fd; rc = osOpenDirectory(zPath, &fd); if( rc==SQLITE_OK ){ -#if OS_VXWORKS - if( fsync(fd)==-1 ) -#else - if( fsync(fd) ) -#endif - { + if( full_fsync(fd,0,0) ){ rc = unixLogError(SQLITE_IOERR_DIR_FSYNC, "fsync", zPath); } robust_close(0, fd, __LINE__); - }else if( rc==SQLITE_CANTOPEN ){ + }else{ + assert( rc==SQLITE_CANTOPEN ); rc = SQLITE_OK; } } @@ -31122,33 +37796,49 @@ static int unixAccess( int flags, /* What do we want to learn about the zPath file? */ int *pResOut /* Write result boolean here */ ){ - int amode = 0; UNUSED_PARAMETER(NotUsed); SimulateIOError( return SQLITE_IOERR_ACCESS; ); - switch( flags ){ - case SQLITE_ACCESS_EXISTS: - amode = F_OK; - break; - case SQLITE_ACCESS_READWRITE: - amode = W_OK|R_OK; - break; - case SQLITE_ACCESS_READ: - amode = R_OK; - break; + assert( pResOut!=0 ); - default: - assert(!"Invalid flags argument"); - } - *pResOut = (osAccess(zPath, amode)==0); - if( flags==SQLITE_ACCESS_EXISTS && *pResOut ){ + /* The spec says there are three possible values for flags. But only + ** two of them are actually used */ + assert( flags==SQLITE_ACCESS_EXISTS || flags==SQLITE_ACCESS_READWRITE ); + + if( flags==SQLITE_ACCESS_EXISTS ){ struct stat buf; - if( 0==osStat(zPath, &buf) && buf.st_size==0 ){ - *pResOut = 0; - } + *pResOut = (0==osStat(zPath, &buf) && buf.st_size>0); + }else{ + *pResOut = osAccess(zPath, W_OK|R_OK)==0; } return SQLITE_OK; } +/* +** +*/ +static int mkFullPathname( + const char *zPath, /* Input path */ + char *zOut, /* Output buffer */ + int nOut /* Allocated size of buffer zOut */ +){ + int nPath = sqlite3Strlen30(zPath); + int iOff = 0; + if( zPath[0]!='/' ){ + if( osGetcwd(zOut, nOut-2)==0 ){ + return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); + } + iOff = sqlite3Strlen30(zOut); + zOut[iOff++] = '/'; + } + if( (iOff+nPath+1)>nOut ){ + /* SQLite assumes that xFullPathname() nul-terminates the output buffer + ** even if it returns an error. */ + zOut[iOff] = '\0'; + return SQLITE_CANTOPEN_BKPT; + } + sqlite3_snprintf(nOut-iOff, &zOut[iOff], "%s", zPath); + return SQLITE_OK; +} /* ** Turn a relative pathname into a full pathname. The relative path @@ -31165,6 +37855,17 @@ static int unixFullPathname( int nOut, /* Size of output buffer in bytes */ char *zOut /* Output buffer */ ){ +#if !defined(HAVE_READLINK) || !defined(HAVE_LSTAT) + return mkFullPathname(zPath, zOut, nOut); +#else + int rc = SQLITE_OK; + int nByte; + int nLink = 1; /* Number of symbolic links followed so far */ + const char *zIn = zPath; /* Input path for each iteration of loop */ + char *zDel = 0; + + assert( pVfs->mxPathname==MAX_PATHNAME ); + UNUSED_PARAMETER(pVfs); /* It's odd to simulate an io-error here, but really this is just ** using the io-error infrastructure to test that SQLite handles this @@ -31173,21 +37874,62 @@ static int unixFullPathname( */ SimulateIOError( return SQLITE_ERROR ); - assert( pVfs->mxPathname==MAX_PATHNAME ); - UNUSED_PARAMETER(pVfs); + do { - zOut[nOut-1] = '\0'; - if( zPath[0]=='/' ){ - sqlite3_snprintf(nOut, zOut, "%s", zPath); - }else{ - int nCwd; - if( osGetcwd(zOut, nOut-1)==0 ){ - return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); + /* Call stat() on path zIn. Set bLink to true if the path is a symbolic + ** link, or false otherwise. */ + int bLink = 0; + struct stat buf; + if( osLstat(zIn, &buf)!=0 ){ + if( errno!=ENOENT ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); + } + }else{ + bLink = S_ISLNK(buf.st_mode); } - nCwd = (int)strlen(zOut); - sqlite3_snprintf(nOut-nCwd, &zOut[nCwd], "/%s", zPath); - } - return SQLITE_OK; + + if( bLink ){ + if( zDel==0 ){ + zDel = sqlite3_malloc(nOut); + if( zDel==0 ) rc = SQLITE_NOMEM_BKPT; + }else if( ++nLink>SQLITE_MAX_SYMLINKS ){ + rc = SQLITE_CANTOPEN_BKPT; + } + + if( rc==SQLITE_OK ){ + nByte = osReadlink(zIn, zDel, nOut-1); + if( nByte<0 ){ + rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); + }else{ + if( zDel[0]!='/' ){ + int n; + for(n = sqlite3Strlen30(zIn); n>0 && zIn[n-1]!='/'; n--); + if( nByte+n+1>nOut ){ + rc = SQLITE_CANTOPEN_BKPT; + }else{ + memmove(&zDel[n], zDel, nByte+1); + memcpy(zDel, zIn, n); + nByte += n; + } + } + zDel[nByte] = '\0'; + } + } + + zIn = zDel; + } + + assert( rc!=SQLITE_OK || zIn!=zOut || zIn[0]=='/' ); + if( rc==SQLITE_OK && zIn!=zOut ){ + rc = mkFullPathname(zIn, zOut, nOut); + } + if( bLink==0 ) break; + zIn = zOut; + }while( rc==SQLITE_OK ); + + sqlite3_free(zDel); + return rc; +#endif /* HAVE_READLINK && HAVE_LSTAT */ } @@ -31273,8 +38015,8 @@ static int unixRandomness(sqlite3_vfs *NotUsed, int nBuf, char *zBuf){ ** tests repeatable. */ memset(zBuf, 0, nBuf); - randomnessPid = getpid(); -#if !defined(SQLITE_TEST) + randomnessPid = osGetpid(0); +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) { int fd, got; fd = robust_open("/dev/urandom", O_RDONLY, 0); @@ -31356,11 +38098,8 @@ static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_nsec/1000000; #else struct timeval sNow; - if( gettimeofday(&sNow, 0)==0 ){ - *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000; - }else{ - rc = SQLITE_ERROR; - } + (void)gettimeofday(&sNow, 0); /* Cannot fail given valid arguments */ + *piNow = unixEpoch + 1000*(sqlite3_int64)sNow.tv_sec + sNow.tv_usec/1000; #endif #ifdef SQLITE_TEST @@ -31372,6 +38111,7 @@ static int unixCurrentTimeInt64(sqlite3_vfs *NotUsed, sqlite3_int64 *piNow){ return rc; } +#ifndef SQLITE_OMIT_DEPRECATED /* ** Find the current time (in Universal Coordinated Time). Write the ** current time and date as a Julian Day number into *prNow and @@ -31385,19 +38125,21 @@ static int unixCurrentTime(sqlite3_vfs *NotUsed, double *prNow){ *prNow = i/86400000.0; return rc; } +#else +# define unixCurrentTime 0 +#endif /* -** We added the xGetLastError() method with the intention of providing -** better low-level error messages when operating-system problems come up -** during SQLite operation. But so far, none of that has been implemented -** in the core. So this routine is never called. For now, it is merely -** a place-holder. +** The xGetLastError() method is designed to return a better +** low-level error message when operating-system problems come up +** during SQLite operation. Only the integer return code is currently +** used. */ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ UNUSED_PARAMETER(NotUsed); UNUSED_PARAMETER(NotUsed2); UNUSED_PARAMETER(NotUsed3); - return 0; + return errno; } @@ -31455,9 +38197,10 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ ** ** C APIs ** -** sqlite3_file_control(db, dbname, SQLITE_SET_LOCKPROXYFILE, +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_SET_LOCKPROXYFILE, ** <proxy_path> | ":auto:"); -** sqlite3_file_control(db, dbname, SQLITE_GET_LOCKPROXYFILE, &<proxy_path>); +** sqlite3_file_control(db, dbname, SQLITE_FCNTL_GET_LOCKPROXYFILE, +** &<proxy_path>); ** ** ** SQL pragmas @@ -31550,7 +38293,7 @@ static int unixGetLastError(sqlite3_vfs *NotUsed, int NotUsed2, char *NotUsed3){ ** setting the environment variable SQLITE_FORCE_PROXY_LOCKING to 1 will ** force proxy locking to be used for every database file opened, and 0 ** will force automatic proxy locking to be disabled for all database -** files (explicitly calling the SQLITE_SET_LOCKPROXYFILE pragma or +** files (explicitly calling the SQLITE_FCNTL_SET_LOCKPROXYFILE pragma or ** sqlite_file_control API is not affected by SQLITE_FORCE_PROXY_LOCKING). */ @@ -31571,6 +38314,7 @@ struct proxyLockingContext { char *lockProxyPath; /* Name of the proxy lock file */ char *dbPath; /* Name of the open file */ int conchHeld; /* 1 if the conch is held, -1 if lockless */ + int nFails; /* Number of conch taking failures */ void *oldLockingContext; /* Original lockingcontext to restore on close */ sqlite3_io_methods const *pOldMethod; /* Original I/O methods for close */ }; @@ -31592,7 +38336,7 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ { if( !confstr(_CS_DARWIN_USER_TEMP_DIR, lPath, maxLen) ){ OSTRACE(("GETLOCKPATH failed %s errno=%d pid=%d\n", - lPath, errno, getpid())); + lPath, errno, osGetpid(0))); return SQLITE_IOERR_LOCK; } len = strlcat(lPath, "sqliteplocks", maxLen); @@ -31614,7 +38358,7 @@ static int proxyGetLockPath(const char *dbPath, char *lPath, size_t maxLen){ } lPath[i+len]='\0'; strlcat(lPath, ":auto:", maxLen); - OSTRACE(("GETLOCKPATH proxy lock path=%s pid=%d\n", lPath, getpid())); + OSTRACE(("GETLOCKPATH proxy lock path=%s pid=%d\n", lPath, osGetpid(0))); return SQLITE_OK; } @@ -31641,7 +38385,7 @@ static int proxyCreateLockPath(const char *lockPath){ if( err!=EEXIST ) { OSTRACE(("CREATELOCKPATH FAILED creating %s, " "'%s' proxy lock path=%s pid=%d\n", - buf, strerror(err), lockPath, getpid())); + buf, strerror(err), lockPath, osGetpid(0))); return err; } } @@ -31650,7 +38394,7 @@ static int proxyCreateLockPath(const char *lockPath){ } buf[i] = lockPath[i]; } - OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n", lockPath, getpid())); + OSTRACE(("CREATELOCKPATH proxy lock path=%s pid=%d\n",lockPath,osGetpid(0))); return 0; } @@ -31684,9 +38428,9 @@ static int proxyCreateUnixFile( if( pUnused ){ fd = pUnused->fd; }else{ - pUnused = sqlite3_malloc(sizeof(*pUnused)); + pUnused = sqlite3_malloc64(sizeof(*pUnused)); if( !pUnused ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } } if( fd<0 ){ @@ -31717,9 +38461,9 @@ static int proxyCreateUnixFile( } } - pNew = (unixFile *)sqlite3_malloc(sizeof(*pNew)); + pNew = (unixFile *)sqlite3_malloc64(sizeof(*pNew)); if( pNew==NULL ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto end_create_proxy; } memset(pNew, 0, sizeof(unixFile)); @@ -31729,7 +38473,7 @@ static int proxyCreateUnixFile( dummyVfs.zName = "dummy"; pUnused->fd = fd; pUnused->flags = openFlags; - pNew->pUnused = pUnused; + pNew->pPreallocatedUnused = pUnused; rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); if( rc==SQLITE_OK ){ @@ -31750,8 +38494,10 @@ SQLITE_API int sqlite3_hostid_num = 0; #define PROXY_HOSTIDLEN 16 /* conch file host id length */ +#ifdef HAVE_GETHOSTUUID /* Not always defined in the headers as it ought to be */ extern int gethostuuid(uuid_t id, const struct timespec *wait); +#endif /* get the host ID via gethostuuid(), pHostID must point to PROXY_HOSTIDLEN ** bytes of writable memory. @@ -31759,10 +38505,9 @@ extern int gethostuuid(uuid_t id, const struct timespec *wait); static int proxyGetHostID(unsigned char *pHostID, int *pError){ assert(PROXY_HOSTIDLEN == sizeof(uuid_t)); memset(pHostID, 0, PROXY_HOSTIDLEN); -#if defined(__MAX_OS_X_VERSION_MIN_REQUIRED)\ - && __MAC_OS_X_VERSION_MIN_REQUIRED<1050 +#ifdef HAVE_GETHOSTUUID { - static const struct timespec timeout = {1, 0}; /* 1 sec timeout */ + struct timespec timeout = {1, 0}; /* 1 sec timeout */ if( gethostuuid(pHostID, &timeout) ){ int err = errno; if( pError ){ @@ -31877,7 +38622,7 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ */ struct stat buf; if( osFstat(conchFile->h, &buf) ){ - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); return SQLITE_IOERR_LOCK; } @@ -31897,7 +38642,7 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ char tBuf[PROXY_MAXCONCHLEN]; int len = osPread(conchFile->h, tBuf, PROXY_MAXCONCHLEN, 0); if( len<0 ){ - pFile->lastErrno = errno; + storeLastErrno(pFile, errno); return SQLITE_IOERR_LOCK; } if( len>PROXY_PATHINDEX && tBuf[0]==(char)PROXY_CONCHVERSION){ @@ -31917,7 +38662,7 @@ static int proxyConchLock(unixFile *pFile, uuid_t myHostID, int lockType){ if( 0==proxyBreakConchLock(pFile, myHostID) ){ rc = SQLITE_OK; if( lockType==EXCLUSIVE_LOCK ){ - rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK); + rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, SHARED_LOCK); } if( !rc ){ rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, lockType); @@ -31955,11 +38700,12 @@ static int proxyTakeConch(unixFile *pFile){ int forceNewLockPath = 0; OSTRACE(("TAKECONCH %d for %s pid=%d\n", conchFile->h, - (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), getpid())); + (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), + osGetpid(0))); rc = proxyGetHostID(myHostID, &pError); if( (rc&0xff)==SQLITE_IOERR ){ - pFile->lastErrno = pError; + storeLastErrno(pFile, pError); goto end_takeconch; } rc = proxyConchLock(pFile, myHostID, SHARED_LOCK); @@ -31970,7 +38716,7 @@ static int proxyTakeConch(unixFile *pFile){ readLen = seekAndRead((unixFile*)conchFile, 0, readBuf, PROXY_MAXCONCHLEN); if( readLen<0 ){ /* I/O error: lastErrno set by seekAndRead */ - pFile->lastErrno = conchFile->lastErrno; + storeLastErrno(pFile, conchFile->lastErrno); rc = SQLITE_IOERR_READ; goto end_takeconch; }else if( readLen<=(PROXY_HEADERLEN+PROXY_HOSTIDLEN) || @@ -32043,7 +38789,7 @@ static int proxyTakeConch(unixFile *pFile){ rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); } }else{ - rc = conchFile->pMethod->xLock((sqlite3_file*)conchFile, EXCLUSIVE_LOCK); + rc = proxyConchLock(pFile, myHostID, EXCLUSIVE_LOCK); } if( rc==SQLITE_OK ){ char writeBuffer[PROXY_MAXCONCHLEN]; @@ -32052,14 +38798,15 @@ static int proxyTakeConch(unixFile *pFile){ writeBuffer[0] = (char)PROXY_CONCHVERSION; memcpy(&writeBuffer[PROXY_HEADERLEN], myHostID, PROXY_HOSTIDLEN); if( pCtx->lockProxyPath!=NULL ){ - strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, MAXPATHLEN); + strlcpy(&writeBuffer[PROXY_PATHINDEX], pCtx->lockProxyPath, + MAXPATHLEN); }else{ strlcpy(&writeBuffer[PROXY_PATHINDEX], tempLockPath, MAXPATHLEN); } writeSize = PROXY_PATHINDEX + strlen(&writeBuffer[PROXY_PATHINDEX]); robust_ftruncate(conchFile->h, writeSize); rc = unixWrite((sqlite3_file *)conchFile, writeBuffer, writeSize, 0); - fsync(conchFile->h); + full_fsync(conchFile->h,0,0); /* If we created a new conch file (not just updated the contents of a ** valid conch file), try to match the permissions of the database */ @@ -32129,7 +38876,7 @@ static int proxyTakeConch(unixFile *pFile){ if( tempLockPath ){ pCtx->lockProxyPath = sqlite3DbStrDup(0, tempLockPath); if( !pCtx->lockProxyPath ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } } } @@ -32164,7 +38911,7 @@ static int proxyReleaseConch(unixFile *pFile){ conchFile = pCtx->conchFile; OSTRACE(("RELEASECONCH %d for %s pid=%d\n", conchFile->h, (pCtx->lockProxyPath ? pCtx->lockProxyPath : ":auto:"), - getpid())); + osGetpid(0))); if( pCtx->conchHeld>0 ){ rc = conchFile->pMethod->xUnlock((sqlite3_file*)conchFile, NO_LOCK); } @@ -32176,7 +38923,7 @@ static int proxyReleaseConch(unixFile *pFile){ /* ** Given the name of a database file, compute the name of its conch file. -** Store the conch filename in memory obtained from sqlite3_malloc(). +** Store the conch filename in memory obtained from sqlite3_malloc64(). ** Make *pConchPath point to the new name. Return SQLITE_OK on success ** or SQLITE_NOMEM if unable to obtain memory. ** @@ -32192,9 +38939,9 @@ static int proxyCreateConchPathname(char *dbPath, char **pConchPath){ /* Allocate space for the conch filename and initialize the name to ** the name of the original database file. */ - *pConchPath = conchPath = (char *)sqlite3_malloc(len + 8); + *pConchPath = conchPath = (char *)sqlite3_malloc64(len + 8); if( conchPath==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memcpy(conchPath, dbPath, len+1); @@ -32264,7 +39011,8 @@ static int proxyGetDbPathForUnixFile(unixFile *pFile, char *dbPath){ /* afp style keeps a reference to the db path in the filePath field ** of the struct */ assert( (int)strlen((char*)pFile->lockingContext)<=MAXPATHLEN ); - strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, MAXPATHLEN); + strlcpy(dbPath, ((afpLockingContext *)pFile->lockingContext)->dbPath, + MAXPATHLEN); } else #endif if( pFile->pMethod == &dotlockIoMethods ){ @@ -32305,11 +39053,11 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { } OSTRACE(("TRANSPROXY %d for %s pid=%d\n", pFile->h, - (lockPath ? lockPath : ":auto:"), getpid())); + (lockPath ? lockPath : ":auto:"), osGetpid(0))); - pCtx = sqlite3_malloc( sizeof(*pCtx) ); + pCtx = sqlite3_malloc64( sizeof(*pCtx) ); if( pCtx==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memset(pCtx, 0, sizeof(*pCtx)); @@ -32345,7 +39093,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { if( rc==SQLITE_OK ){ pCtx->dbPath = sqlite3DbStrDup(0, dbPath); if( pCtx->dbPath==NULL ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } } if( rc==SQLITE_OK ){ @@ -32377,7 +39125,7 @@ static int proxyTransformUnixFile(unixFile *pFile, const char *path) { */ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ switch( op ){ - case SQLITE_GET_LOCKPROXYFILE: { + case SQLITE_FCNTL_GET_LOCKPROXYFILE: { unixFile *pFile = (unixFile*)id; if( pFile->pMethod == &proxyIoMethods ){ proxyLockingContext *pCtx = (proxyLockingContext*)pFile->lockingContext; @@ -32392,13 +39140,16 @@ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ } return SQLITE_OK; } - case SQLITE_SET_LOCKPROXYFILE: { + case SQLITE_FCNTL_SET_LOCKPROXYFILE: { unixFile *pFile = (unixFile*)id; int rc = SQLITE_OK; int isProxyStyle = (pFile->pMethod == &proxyIoMethods); if( pArg==NULL || (const char *)pArg==0 ){ if( isProxyStyle ){ - /* turn off proxy locking - not supported */ + /* turn off proxy locking - not supported. If support is added for + ** switching proxy locking mode off then it will need to fail if + ** the journal mode is WAL mode. + */ rc = SQLITE_ERROR /*SQLITE_PROTOCOL? SQLITE_MISUSE?*/; }else{ /* turn off proxy locking - already off - NOOP */ @@ -32528,7 +39279,7 @@ static int proxyUnlock(sqlite3_file *id, int eFileLock) { ** Close a file that uses proxy locks. */ static int proxyClose(sqlite3_file *id) { - if( id ){ + if( ALWAYS(id) ){ unixFile *pFile = (unixFile*)id; proxyLockingContext *pCtx = (proxyLockingContext *)pFile->lockingContext; unixFile *lockProxy = pCtx->lockProxy; @@ -32643,8 +39394,10 @@ SQLITE_API int sqlite3_os_init(void){ ** array cannot be const. */ static sqlite3_vfs aVfs[] = { -#if SQLITE_ENABLE_LOCKING_STYLE && (OS_VXWORKS || defined(__APPLE__)) +#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) UNIXVFS("unix", autolockIoFinder ), +#elif OS_VXWORKS + UNIXVFS("unix", vxworksIoFinder ), #else UNIXVFS("unix", posixIoFinder ), #endif @@ -32654,11 +39407,11 @@ SQLITE_API int sqlite3_os_init(void){ #if OS_VXWORKS UNIXVFS("unix-namedsem", semIoFinder ), #endif -#if SQLITE_ENABLE_LOCKING_STYLE +#if SQLITE_ENABLE_LOCKING_STYLE || OS_VXWORKS UNIXVFS("unix-posix", posixIoFinder ), -#if !OS_VXWORKS - UNIXVFS("unix-flock", flockIoFinder ), #endif +#if SQLITE_ENABLE_LOCKING_STYLE + UNIXVFS("unix-flock", flockIoFinder ), #endif #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) UNIXVFS("unix-afp", afpIoFinder ), @@ -32670,12 +39423,13 @@ SQLITE_API int sqlite3_os_init(void){ /* Double-check that the aSyscall[] array has been constructed ** correctly. See ticket [bb3a86e890c8e96ab] */ - assert( ArraySize(aSyscall)==25 ); + assert( ArraySize(aSyscall)==29 ); /* Register all VFSes defined in the aVfs[] array */ for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ sqlite3_vfs_register(&aVfs[i], i==0); } + unixBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); return SQLITE_OK; } @@ -32687,6 +39441,7 @@ SQLITE_API int sqlite3_os_init(void){ ** This routine is a no-op for unix. */ SQLITE_API int sqlite3_os_end(void){ + unixBigLock = 0; return SQLITE_OK; } @@ -32708,6 +39463,7 @@ SQLITE_API int sqlite3_os_end(void){ ** ** This file contains code that is specific to Windows. */ +/* #include "sqliteInt.h" */ #if SQLITE_OS_WIN /* This file is used for Windows only */ /* @@ -32746,24 +39502,14 @@ SQLITE_API int sqlite3_os_end(void){ # error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead." #endif -#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) -# ifndef SQLITE_DEBUG_OS_TRACE -# define SQLITE_DEBUG_OS_TRACE 0 -# endif - int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE; -# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X -#else -# define OSTRACE(X) -#endif - /* ** Macros for performance tracing. Normally turned off. Only works ** on i486 hardware. */ #ifdef SQLITE_PERFORMANCE_TRACE -/* -** hwtime.h contains inline assembler code for implementing +/* +** hwtime.h contains inline assembler code for implementing ** high-performance timing routines. */ /************** Include hwtime.h in the middle of os_common.h ****************/ @@ -32783,8 +39529,8 @@ SQLITE_API int sqlite3_os_end(void){ ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. */ -#ifndef _HWTIME_H_ -#define _HWTIME_H_ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H /* ** The following routine only works on pentium-class (or newer) processors. @@ -32852,7 +39598,7 @@ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } #endif -#endif /* !defined(_HWTIME_H_) */ +#endif /* !defined(SQLITE_HWTIME_H) */ /************** End of hwtime.h **********************************************/ /************** Continuing where we left off in os_common.h ******************/ @@ -32873,14 +39619,14 @@ static sqlite_uint64 g_elapsed; ** of code will give us the ability to simulate a disk I/O error. This ** is used for testing the I/O recovery logic. */ -#ifdef SQLITE_TEST -SQLITE_API int sqlite3_io_error_hit = 0; /* Total number of I/O Errors */ -SQLITE_API int sqlite3_io_error_hardhit = 0; /* Number of non-benign errors */ -SQLITE_API int sqlite3_io_error_pending = 0; /* Count down to first I/O error */ -SQLITE_API int sqlite3_io_error_persist = 0; /* True if I/O errors persist */ -SQLITE_API int sqlite3_io_error_benign = 0; /* True if errors are benign */ -SQLITE_API int sqlite3_diskfull_pending = 0; -SQLITE_API int sqlite3_diskfull = 0; +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_io_error_hit; +SQLITE_API extern int sqlite3_io_error_hardhit; +SQLITE_API extern int sqlite3_io_error_pending; +SQLITE_API extern int sqlite3_io_error_persist; +SQLITE_API extern int sqlite3_io_error_benign; +SQLITE_API extern int sqlite3_diskfull_pending; +SQLITE_API extern int sqlite3_diskfull; #define SimulateIOErrorBenign(X) sqlite3_io_error_benign=(X) #define SimulateIOError(CODE) \ if( (sqlite3_io_error_persist && sqlite3_io_error_hit) \ @@ -32906,17 +39652,17 @@ static void local_ioerr(){ #define SimulateIOErrorBenign(X) #define SimulateIOError(A) #define SimulateDiskfullError(A) -#endif +#endif /* defined(SQLITE_TEST) */ /* ** When testing, keep a count of the number of open files. */ -#ifdef SQLITE_TEST -SQLITE_API int sqlite3_open_file_count = 0; +#if defined(SQLITE_TEST) +SQLITE_API extern int sqlite3_open_file_count; #define OpenCounter(X) sqlite3_open_file_count+=(X) #else #define OpenCounter(X) -#endif +#endif /* defined(SQLITE_TEST) */ #endif /* !defined(_OS_COMMON_H_) */ @@ -32926,6 +39672,7 @@ SQLITE_API int sqlite3_open_file_count = 0; /* ** Include the header file for the Windows VFS. */ +/* #include "os_win.h" */ /* ** Compiling and using WAL mode requires several APIs that are only @@ -32978,6 +39725,10 @@ SQLITE_API int sqlite3_open_file_count = 0; # define NTDDI_WINBLUE 0x06030000 #endif +#ifndef NTDDI_WINTHRESHOLD +# define NTDDI_WINTHRESHOLD 0x06040000 +#endif + /* ** Check to see if the GetVersionEx[AW] functions are deprecated on the ** target system. GetVersionEx was first deprecated in Win8.1. @@ -32990,6 +39741,19 @@ SQLITE_API int sqlite3_open_file_count = 0; # endif #endif +/* +** Check to see if the CreateFileMappingA function is supported on the +** target system. It is unavailable when using "mincore.lib" on Win10. +** When compiling for Windows 10, always assume "mincore.lib" is in use. +*/ +#ifndef SQLITE_WIN32_CREATEFILEMAPPINGA +# if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINTHRESHOLD +# define SQLITE_WIN32_CREATEFILEMAPPINGA 0 +# else +# define SQLITE_WIN32_CREATEFILEMAPPINGA 1 +# endif +#endif + /* ** This constant should already be defined (in the "WinDef.h" SDK file). */ @@ -33099,8 +39863,10 @@ WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE, DWORD, DWORD, DWORD, SIZE_T); #endif /* SQLITE_OS_WINRT */ /* -** This file mapping API is common to both Win32 and WinRT. +** These file mapping APIs are common to both Win32 and WinRT. */ + +WINBASEAPI BOOL WINAPI FlushViewOfFile(LPCVOID, SIZE_T); WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID); #endif /* SQLITE_WIN32_FILEMAPPING_API */ @@ -33173,6 +39939,17 @@ struct winFile { #endif }; +/* +** The winVfsAppData structure is used for the pAppData member for all of the +** Win32 VFS variants. +*/ +typedef struct winVfsAppData winVfsAppData; +struct winVfsAppData { + const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */ + void *pAppData; /* The extra pAppData, if any. */ + BOOL bNoLock; /* Non-zero if locking is disabled. */ +}; + /* ** Allowed values for winFile.ctrlFlags */ @@ -33187,22 +39964,6 @@ struct winFile { # define SQLITE_WIN32_DBG_BUF_SIZE ((int)(4096-sizeof(DWORD))) #endif -/* - * The value used with sqlite3_win32_set_directory() to specify that - * the data directory should be changed. - */ -#ifndef SQLITE_WIN32_DATA_DIRECTORY_TYPE -# define SQLITE_WIN32_DATA_DIRECTORY_TYPE (1) -#endif - -/* - * The value used with sqlite3_win32_set_directory() to specify that - * the temporary directory should be changed. - */ -#ifndef SQLITE_WIN32_TEMP_DIRECTORY_TYPE -# define SQLITE_WIN32_TEMP_DIRECTORY_TYPE (2) -#endif - /* * If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the * various Win32 API heap functions instead of our own. @@ -33224,22 +39985,72 @@ struct winFile { ****************************************************************************** */ #ifndef SQLITE_WIN32_HEAP_CREATE -# define SQLITE_WIN32_HEAP_CREATE (TRUE) +# define SQLITE_WIN32_HEAP_CREATE (TRUE) +#endif + +/* + * This is the maximum possible initial size of the Win32-specific heap, in + * bytes. + */ +#ifndef SQLITE_WIN32_HEAP_MAX_INIT_SIZE +# define SQLITE_WIN32_HEAP_MAX_INIT_SIZE (4294967295U) +#endif + +/* + * This is the extra space for the initial size of the Win32-specific heap, + * in bytes. This value may be zero. + */ +#ifndef SQLITE_WIN32_HEAP_INIT_EXTRA +# define SQLITE_WIN32_HEAP_INIT_EXTRA (4194304) +#endif + +/* + * Calculate the maximum legal cache size, in pages, based on the maximum + * possible initial heap size and the default page size, setting aside the + * needed extra space. + */ +#ifndef SQLITE_WIN32_MAX_CACHE_SIZE +# define SQLITE_WIN32_MAX_CACHE_SIZE (((SQLITE_WIN32_HEAP_MAX_INIT_SIZE) - \ + (SQLITE_WIN32_HEAP_INIT_EXTRA)) / \ + (SQLITE_DEFAULT_PAGE_SIZE)) +#endif + +/* + * This is cache size used in the calculation of the initial size of the + * Win32-specific heap. It cannot be negative. + */ +#ifndef SQLITE_WIN32_CACHE_SIZE +# if SQLITE_DEFAULT_CACHE_SIZE>=0 +# define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE) +# else +# define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE)) +# endif +#endif + +/* + * Make sure that the calculated cache size, in pages, cannot cause the + * initial size of the Win32-specific heap to exceed the maximum amount + * of memory that can be specified in the call to HeapCreate. + */ +#if SQLITE_WIN32_CACHE_SIZE>SQLITE_WIN32_MAX_CACHE_SIZE +# undef SQLITE_WIN32_CACHE_SIZE +# define SQLITE_WIN32_CACHE_SIZE (2000) #endif /* * The initial size of the Win32-specific heap. This value may be zero. */ #ifndef SQLITE_WIN32_HEAP_INIT_SIZE -# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_DEFAULT_CACHE_SIZE) * \ - (SQLITE_DEFAULT_PAGE_SIZE) + 4194304) +# define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_WIN32_CACHE_SIZE) * \ + (SQLITE_DEFAULT_PAGE_SIZE) + \ + (SQLITE_WIN32_HEAP_INIT_EXTRA)) #endif /* * The maximum size of the Win32-specific heap. This value may be zero. */ #ifndef SQLITE_WIN32_HEAP_MAX_SIZE -# define SQLITE_WIN32_HEAP_MAX_SIZE (0) +# define SQLITE_WIN32_HEAP_MAX_SIZE (0) #endif /* @@ -33247,7 +40058,7 @@ struct winFile { * zero for the default behavior. */ #ifndef SQLITE_WIN32_HEAP_FLAGS -# define SQLITE_WIN32_HEAP_FLAGS (0) +# define SQLITE_WIN32_HEAP_FLAGS (0) #endif @@ -33394,8 +40205,9 @@ static struct win_syscall { #define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) -#if (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \ - (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) +#if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \ + (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) && \ + SQLITE_WIN32_CREATEFILEMAPPINGA { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 }, #else { "CreateFileMappingA", (SYSCALL)0, 0 }, @@ -33625,8 +40437,7 @@ static struct win_syscall { #define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent) -#if defined(SQLITE_WIN32_HAS_ANSI) && defined(SQLITE_WIN32_GETVERSIONEX) && \ - SQLITE_WIN32_GETVERSIONEX +#if defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_GETVERSIONEX { "GetVersionExA", (SYSCALL)GetVersionExA, 0 }, #else { "GetVersionExA", (SYSCALL)0, 0 }, @@ -33636,7 +40447,7 @@ static struct win_syscall { LPOSVERSIONINFOA))aSyscall[34].pCurrent) #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ - defined(SQLITE_WIN32_GETVERSIONEX) && SQLITE_WIN32_GETVERSIONEX + SQLITE_WIN32_GETVERSIONEX { "GetVersionExW", (SYSCALL)GetVersionExW, 0 }, #else { "GetVersionExW", (SYSCALL)0, 0 }, @@ -33968,6 +40779,32 @@ static struct win_syscall { SQLITE_WIN32_VOLATILE*, LONG,LONG))aSyscall[76].pCurrent) #endif /* defined(InterlockedCompareExchange) */ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreate", (SYSCALL)UuidCreate, 0 }, +#else + { "UuidCreate", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreate ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[77].pCurrent) + +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { "UuidCreateSequential", (SYSCALL)UuidCreateSequential, 0 }, +#else + { "UuidCreateSequential", (SYSCALL)0, 0 }, +#endif + +#define osUuidCreateSequential \ + ((RPC_STATUS(RPC_ENTRY*)(UUID*))aSyscall[78].pCurrent) + +#if !defined(SQLITE_NO_SYNC) && SQLITE_MAX_MMAP_SIZE>0 + { "FlushViewOfFile", (SYSCALL)FlushViewOfFile, 0 }, +#else + { "FlushViewOfFile", (SYSCALL)0, 0 }, +#endif + +#define osFlushViewOfFile \ + ((BOOL(WINAPI*)(LPCVOID,SIZE_T))aSyscall[79].pCurrent) + }; /* End of the overrideable system calls */ /* @@ -34079,7 +40916,7 @@ SQLITE_API int sqlite3_win32_compact_heap(LPUINT pnLargest){ if( lastErrno==NO_ERROR ){ sqlite3_log(SQLITE_NOMEM, "failed to HeapCompact (no space), heap=%p", (void*)hHeap); - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ sqlite3_log(SQLITE_ERROR, "failed to HeapCompact (%lu), heap=%p", osGetLastError(), (void*)hHeap); @@ -34105,8 +40942,8 @@ SQLITE_API int sqlite3_win32_reset_heap(){ int rc; MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */ MUTEX_LOGIC( sqlite3_mutex *pMem; ) /* The memsys static mutex */ - MUTEX_LOGIC( pMaster = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); ) - MUTEX_LOGIC( pMem = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); ) + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + MUTEX_LOGIC( pMem = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); ) sqlite3_mutex_enter(pMaster); sqlite3_mutex_enter(pMem); winMemAssertMagic(); @@ -34151,6 +40988,12 @@ SQLITE_API void sqlite3_win32_write_debug(const char *zBuf, int nBuf){ int nMin = MIN(nBuf, (SQLITE_WIN32_DBG_BUF_SIZE - 1)); /* may be negative. */ if( nMin<-1 ) nMin = -1; /* all negative values become -1. */ assert( nMin==-1 || nMin==0 || nMin<SQLITE_WIN32_DBG_BUF_SIZE ); +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zBuf ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif #if defined(SQLITE_WIN32_HAS_ANSI) if( nMin>0 ){ memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); @@ -34221,7 +41064,7 @@ SQLITE_PRIVATE DWORD sqlite3Win32Wait(HANDLE hObject){ ** the LockFileEx() API. */ -#if !defined(SQLITE_WIN32_GETVERSIONEX) || !SQLITE_WIN32_GETVERSIONEX +#if !SQLITE_WIN32_GETVERSIONEX # define osIsNT() (1) #elif SQLITE_OS_WINCE || SQLITE_OS_WINRT || !defined(SQLITE_WIN32_HAS_ANSI) # define osIsNT() (1) @@ -34242,7 +41085,7 @@ SQLITE_API int sqlite3_win32_is_nt(void){ ** kernel. */ return 1; -#elif defined(SQLITE_WIN32_GETVERSIONEX) && SQLITE_WIN32_GETVERSIONEX +#elif SQLITE_WIN32_GETVERSIONEX if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){ #if defined(SQLITE_WIN32_HAS_ANSI) OSVERSIONINFOA sInfo; @@ -34399,7 +41242,7 @@ static int winMemInit(void *pAppData){ "failed to HeapCreate (%lu), flags=%u, initSize=%lu, maxSize=%lu", osGetLastError(), SQLITE_WIN32_HEAP_FLAGS, dwInitialSize, dwMaximumSize); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pWinMemData->bOwned = TRUE; assert( pWinMemData->bOwned ); @@ -34409,7 +41252,7 @@ static int winMemInit(void *pAppData){ if( !pWinMemData->hHeap ){ sqlite3_log(SQLITE_NOMEM, "failed to GetProcessHeap (%lu)", osGetLastError()); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pWinMemData->bOwned = FALSE; assert( !pWinMemData->bOwned ); @@ -34476,157 +41319,254 @@ SQLITE_PRIVATE void sqlite3MemSetDefault(void){ #endif /* SQLITE_WIN32_MALLOC */ /* -** Convert a UTF-8 string to Microsoft Unicode (UTF-16?). +** Convert a UTF-8 string to Microsoft Unicode. ** -** Space to hold the returned string is obtained from malloc. +** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static LPWSTR winUtf8ToUnicode(const char *zFilename){ +static LPWSTR winUtf8ToUnicode(const char *zText){ int nChar; - LPWSTR zWideFilename; + LPWSTR zWideText; - nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, NULL, 0); if( nChar==0 ){ return 0; } - zWideFilename = sqlite3MallocZero( nChar*sizeof(zWideFilename[0]) ); - if( zWideFilename==0 ){ + zWideText = sqlite3MallocZero( nChar*sizeof(WCHAR) ); + if( zWideText==0 ){ return 0; } - nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, + nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, zWideText, nChar); if( nChar==0 ){ - sqlite3_free(zWideFilename); - zWideFilename = 0; + sqlite3_free(zWideText); + zWideText = 0; } - return zWideFilename; + return zWideText; } /* -** Convert Microsoft Unicode to UTF-8. Space to hold the returned string is -** obtained from sqlite3_malloc(). +** Convert a Microsoft Unicode string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static char *winUnicodeToUtf8(LPCWSTR zWideFilename){ +static char *winUnicodeToUtf8(LPCWSTR zWideText){ int nByte; - char *zFilename; + char *zText; - nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, 0, 0, 0, 0); if( nByte == 0 ){ return 0; } - zFilename = sqlite3MallocZero( nByte ); - if( zFilename==0 ){ + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ return 0; } - nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, + nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, zText, nByte, 0, 0); if( nByte == 0 ){ - sqlite3_free(zFilename); - zFilename = 0; + sqlite3_free(zText); + zText = 0; } - return zFilename; + return zText; } /* -** Convert an ANSI string to Microsoft Unicode, based on the -** current codepage settings for file apis. +** Convert an ANSI string to Microsoft Unicode, using the ANSI or OEM +** code page. ** -** Space to hold the returned string is obtained -** from sqlite3_malloc. +** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static LPWSTR winMbcsToUnicode(const char *zFilename){ +static LPWSTR winMbcsToUnicode(const char *zText, int useAnsi){ int nByte; - LPWSTR zMbcsFilename; - int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP; + LPWSTR zMbcsText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; - nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, NULL, + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, NULL, 0)*sizeof(WCHAR); if( nByte==0 ){ return 0; } - zMbcsFilename = sqlite3MallocZero( nByte*sizeof(zMbcsFilename[0]) ); - if( zMbcsFilename==0 ){ + zMbcsText = sqlite3MallocZero( nByte*sizeof(WCHAR) ); + if( zMbcsText==0 ){ return 0; } - nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, + nByte = osMultiByteToWideChar(codepage, 0, zText, -1, zMbcsText, nByte); if( nByte==0 ){ - sqlite3_free(zMbcsFilename); - zMbcsFilename = 0; + sqlite3_free(zMbcsText); + zMbcsText = 0; } - return zMbcsFilename; + return zMbcsText; } /* -** Convert Microsoft Unicode to multi-byte character string, based on the -** user's ANSI codepage. +** Convert a Microsoft Unicode string to a multi-byte character string, +** using the ANSI or OEM code page. ** -** Space to hold the returned string is obtained from -** sqlite3_malloc(). +** Space to hold the returned string is obtained from sqlite3_malloc(). */ -static char *winUnicodeToMbcs(LPCWSTR zWideFilename){ +static char *winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi){ int nByte; - char *zFilename; - int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP; + char *zText; + int codepage = useAnsi ? CP_ACP : CP_OEMCP; - nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, 0, 0, 0, 0); if( nByte == 0 ){ return 0; } - zFilename = sqlite3MallocZero( nByte ); - if( zFilename==0 ){ + zText = sqlite3MallocZero( nByte ); + if( zText==0 ){ return 0; } - nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, + nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, zText, nByte, 0, 0); if( nByte == 0 ){ - sqlite3_free(zFilename); - zFilename = 0; + sqlite3_free(zText); + zText = 0; } - return zFilename; + return zText; } /* -** Convert multibyte character string to UTF-8. Space to hold the -** returned string is obtained from sqlite3_malloc(). +** Convert a multi-byte character string to UTF-8. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). */ -SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){ - char *zFilenameUtf8; +static char *winMbcsToUtf8(const char *zText, int useAnsi){ + char *zTextUtf8; LPWSTR zTmpWide; - zTmpWide = winMbcsToUnicode(zFilename); + zTmpWide = winMbcsToUnicode(zText, useAnsi); if( zTmpWide==0 ){ return 0; } - zFilenameUtf8 = winUnicodeToUtf8(zTmpWide); + zTextUtf8 = winUnicodeToUtf8(zTmpWide); sqlite3_free(zTmpWide); - return zFilenameUtf8; + return zTextUtf8; } /* -** Convert UTF-8 to multibyte character string. Space to hold the -** returned string is obtained from sqlite3_malloc(). +** Convert a UTF-8 string to a multi-byte character string. +** +** Space to hold the returned string is obtained from sqlite3_malloc(). */ -SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){ - char *zFilenameMbcs; +static char *winUtf8ToMbcs(const char *zText, int useAnsi){ + char *zTextMbcs; LPWSTR zTmpWide; - zTmpWide = winUtf8ToUnicode(zFilename); + zTmpWide = winUtf8ToUnicode(zText); if( zTmpWide==0 ){ return 0; } - zFilenameMbcs = winUnicodeToMbcs(zTmpWide); + zTextMbcs = winUnicodeToMbcs(zTmpWide, useAnsi); sqlite3_free(zTmpWide); - return zFilenameMbcs; + return zTextMbcs; } /* -** This function sets the data directory or the temporary directory based on -** the provided arguments. The type argument must be 1 in order to set the -** data directory or 2 in order to set the temporary directory. The zValue -** argument is the name of the directory to use. The return value will be -** SQLITE_OK if successful. +** This is a public wrapper for the winUtf8ToUnicode() function. */ -SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){ +SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToUnicode(zText); +} + +/* +** This is a public wrapper for the winUnicodeToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zWideText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUnicodeToUtf8(zWideText); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winMbcsToUtf8() function. +*/ +SQLITE_API char *sqlite3_win32_mbcs_to_utf8_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winMbcsToUtf8(zText, useAnsi); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zText){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, osAreFileApisANSI()); +} + +/* +** This is a public wrapper for the winUtf8ToMbcs() function. +*/ +SQLITE_API char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !zText ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif +#ifndef SQLITE_OMIT_AUTOINIT + if( sqlite3_initialize() ) return 0; +#endif + return winUtf8ToMbcs(zText, useAnsi); +} + +/* +** This function is the same as sqlite3_win32_set_directory (below); however, +** it accepts a UTF-8 string. +*/ +SQLITE_API int sqlite3_win32_set_directory8( + unsigned long type, /* Identifier for directory being set or reset */ + const char *zValue /* New value for directory being set or reset */ +){ char **ppDirectory = 0; #ifndef SQLITE_OMIT_AUTOINIT int rc = sqlite3_initialize(); @@ -34642,20 +41582,53 @@ SQLITE_API int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){ ); assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) ); if( ppDirectory ){ - char *zValueUtf8 = 0; + char *zCopy = 0; if( zValue && zValue[0] ){ - zValueUtf8 = winUnicodeToUtf8(zValue); - if ( zValueUtf8==0 ){ - return SQLITE_NOMEM; + zCopy = sqlite3_mprintf("%s", zValue); + if ( zCopy==0 ){ + return SQLITE_NOMEM_BKPT; } } sqlite3_free(*ppDirectory); - *ppDirectory = zValueUtf8; + *ppDirectory = zCopy; return SQLITE_OK; } return SQLITE_ERROR; } +/* +** This function is the same as sqlite3_win32_set_directory (below); however, +** it accepts a UTF-16 string. +*/ +SQLITE_API int sqlite3_win32_set_directory16( + unsigned long type, /* Identifier for directory being set or reset */ + const void *zValue /* New value for directory being set or reset */ +){ + int rc; + char *zUtf8 = 0; + if( zValue ){ + zUtf8 = sqlite3_win32_unicode_to_utf8(zValue); + if( zUtf8==0 ) return SQLITE_NOMEM_BKPT; + } + rc = sqlite3_win32_set_directory8(type, zUtf8); + if( zUtf8 ) sqlite3_free(zUtf8); + return rc; +} + +/* +** This function sets the data directory or the temporary directory based on +** the provided arguments. The type argument must be 1 in order to set the +** data directory or 2 in order to set the temporary directory. The zValue +** argument is the name of the directory to use. The return value will be +** SQLITE_OK if successful. +*/ +SQLITE_API int sqlite3_win32_set_directory( + unsigned long type, /* Identifier for directory being set or reset */ + void *zValue /* New value for directory being set or reset */ +){ + return sqlite3_win32_set_directory16(type, zValue); +} + /* ** The return value of winGetLastErrorMsg ** is zero if the error message fits in the buffer, or non-zero @@ -34718,7 +41691,7 @@ static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ if( dwLen > 0 ){ /* allocate a buffer and convert to UTF8 */ sqlite3BeginBenignMalloc(); - zOut = sqlite3_win32_mbcs_to_utf8(zTemp); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); sqlite3EndBenignMalloc(); /* free the system buffer allocated by FormatMessage */ osLocalFree(zTemp); @@ -34851,25 +41824,26 @@ static int winRetryIoerr(int *pnRetry, DWORD *pError){ /* ** Log a I/O error retry episode. */ -static void winLogIoerr(int nRetry){ +static void winLogIoerr(int nRetry, int lineno){ if( nRetry ){ - sqlite3_log(SQLITE_IOERR, - "delayed %dms for lock/sharing conflict", - winIoerrRetryDelay*nRetry*(nRetry+1)/2 + sqlite3_log(SQLITE_NOTICE, + "delayed %dms for lock/sharing conflict at line %d", + winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno ); } } -#if SQLITE_OS_WINCE -/************************************************************************* -** This section contains code for WinCE only. -*/ -#if !defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API /* -** The MSVC CRT on Windows CE may not have a localtime() function. So -** create a substitute. +** This #if does not rely on the SQLITE_OS_WINCE define because the +** corresponding section in "date.c" cannot use it. */ -/* #include <time.h> */ +#if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \ + (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API) +/* +** The MSVC CRT on Windows CE may not have a localtime() function. +** So define a substitute. +*/ +/* # include <time.h> */ struct tm *__cdecl localtime(const time_t *t) { static struct tm y; @@ -34893,6 +41867,10 @@ struct tm *__cdecl localtime(const time_t *t) } #endif +#if SQLITE_OS_WINCE +/************************************************************************* +** This section contains code for WinCE only. +*/ #define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] /* @@ -34923,7 +41901,7 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){ zName = winUtf8ToUnicode(zFilename); if( zName==0 ){ /* out of memory */ - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } /* Initialize the local lockdata */ @@ -35335,7 +42313,8 @@ static int winClose(sqlite3_file *id){ assert( pFile->pShm==0 ); #endif assert( pFile->h!=NULL && pFile->h!=INVALID_HANDLE_VALUE ); - OSTRACE(("CLOSE file=%p\n", pFile->h)); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p\n", + osGetCurrentProcessId(), pFile, pFile->h)); #if SQLITE_MAX_MMAP_SIZE>0 winUnmapfile(pFile); @@ -35347,7 +42326,12 @@ static int winClose(sqlite3_file *id){ }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) ); #if SQLITE_OS_WINCE #define WINCE_DELETION_ATTEMPTS 3 - winceDestroyLock(pFile); + { + winVfsAppData *pAppData = (winVfsAppData*)pFile->pVfs->pAppData; + if( pAppData==NULL || !pAppData->bNoLock ){ + winceDestroyLock(pFile); + } + } if( pFile->zDeleteOnClose ){ int cnt = 0; while( @@ -35364,7 +42348,8 @@ static int winClose(sqlite3_file *id){ pFile->h = NULL; } OpenCounter(-1); - OSTRACE(("CLOSE file=%p, rc=%s\n", pFile->h, rc ? "ok" : "failed")); + OSTRACE(("CLOSE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, rc ? "ok" : "failed")); return rc ? SQLITE_OK : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(), "winClose", pFile->zPath); @@ -35392,7 +42377,8 @@ static int winRead( assert( amt>0 ); assert( offset>=0 ); SimulateIOError(return SQLITE_IOERR_READ); - OSTRACE(("READ file=%p, buffer=%p, amount=%d, offset=%lld, lock=%d\n", + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, pFile->h, pBuf, amt, offset, pFile->locktype)); #if SQLITE_MAX_MMAP_SIZE>0 @@ -35401,7 +42387,8 @@ static int winRead( if( offset<pFile->mmapSize ){ if( offset+amt <= pFile->mmapSize ){ memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); - OSTRACE(("READ-MMAP file=%p, rc=SQLITE_OK\n", pFile->h)); + OSTRACE(("READ-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_OK; }else{ int nCopy = (int)(pFile->mmapSize - offset); @@ -35415,7 +42402,8 @@ static int winRead( #if SQLITE_OS_WINCE || defined(SQLITE_WIN32_NO_OVERLAPPED) if( winSeekFile(pFile, offset) ){ - OSTRACE(("READ file=%p, rc=SQLITE_FULL\n", pFile->h)); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_FULL; } while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ @@ -35429,19 +42417,22 @@ static int winRead( DWORD lastErrno; if( winRetryIoerr(&nRetry, &lastErrno) ) continue; pFile->lastErrno = lastErrno; - OSTRACE(("READ file=%p, rc=SQLITE_IOERR_READ\n", pFile->h)); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); return winLogError(SQLITE_IOERR_READ, pFile->lastErrno, "winRead", pFile->zPath); } - winLogIoerr(nRetry); + winLogIoerr(nRetry, __LINE__); if( nRead<(DWORD)amt ){ /* Unread parts of the buffer must be zero-filled */ memset(&((char*)pBuf)[nRead], 0, amt-nRead); - OSTRACE(("READ file=%p, rc=SQLITE_IOERR_SHORT_READ\n", pFile->h)); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_SHORT_READ\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_IOERR_SHORT_READ; } - OSTRACE(("READ file=%p, rc=SQLITE_OK\n", pFile->h)); + OSTRACE(("READ pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_OK; } @@ -35464,16 +42455,18 @@ static int winWrite( SimulateIOError(return SQLITE_IOERR_WRITE); SimulateDiskfullError(return SQLITE_FULL); - OSTRACE(("WRITE file=%p, buffer=%p, amount=%d, offset=%lld, lock=%d\n", + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " + "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, pFile->h, pBuf, amt, offset, pFile->locktype)); -#if SQLITE_MAX_MMAP_SIZE>0 +#if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 /* Deal with as much of this write request as possible by transfering ** data from the memory mapping using memcpy(). */ if( offset<pFile->mmapSize ){ if( offset+amt <= pFile->mmapSize ){ memcpy(&((u8 *)(pFile->pMapRegion))[offset], pBuf, amt); - OSTRACE(("WRITE-MMAP file=%p, rc=SQLITE_OK\n", pFile->h)); + OSTRACE(("WRITE-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_OK; }else{ int nCopy = (int)(pFile->mmapSize - offset); @@ -35536,17 +42529,20 @@ static int winWrite( if( rc ){ if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ) || ( pFile->lastErrno==ERROR_DISK_FULL )){ - OSTRACE(("WRITE file=%p, rc=SQLITE_FULL\n", pFile->h)); + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_FULL\n", + osGetCurrentProcessId(), pFile, pFile->h)); return winLogError(SQLITE_FULL, pFile->lastErrno, "winWrite1", pFile->zPath); } - OSTRACE(("WRITE file=%p, rc=SQLITE_IOERR_WRITE\n", pFile->h)); + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_WRITE\n", + osGetCurrentProcessId(), pFile, pFile->h)); return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno, "winWrite2", pFile->zPath); }else{ - winLogIoerr(nRetry); + winLogIoerr(nRetry, __LINE__); } - OSTRACE(("WRITE file=%p, rc=SQLITE_OK\n", pFile->h)); + OSTRACE(("WRITE pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_OK; } @@ -35560,8 +42556,8 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ assert( pFile ); SimulateIOError(return SQLITE_IOERR_TRUNCATE); - OSTRACE(("TRUNCATE file=%p, size=%lld, lock=%d\n", - pFile->h, nByte, pFile->locktype)); + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, size=%lld, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, nByte, pFile->locktype)); /* If the user has configured a chunk-size for this file, truncate the ** file so that it consists of an integer number of chunks (i.e. the @@ -35593,7 +42589,8 @@ static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ } #endif - OSTRACE(("TRUNCATE file=%p, rc=%s\n", pFile->h, sqlite3ErrName(rc))); + OSTRACE(("TRUNCATE pid=%lu, pFile=%p, file=%p, rc=%s\n", + osGetCurrentProcessId(), pFile, pFile->h, sqlite3ErrName(rc))); return rc; } @@ -35617,7 +42614,7 @@ static int winSync(sqlite3_file *id, int flags){ BOOL rc; #endif #if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || \ - (defined(SQLITE_TEST) && defined(SQLITE_DEBUG)) + defined(SQLITE_HAVE_OS_TRACE) /* ** Used when SQLITE_NO_SYNC is not defined and by the assert() and/or ** OSTRACE() macros. @@ -35638,8 +42635,9 @@ static int winSync(sqlite3_file *id, int flags){ */ SimulateDiskfullError( return SQLITE_FULL ); - OSTRACE(("SYNC file=%p, flags=%x, lock=%d\n", - pFile->h, flags, pFile->locktype)); + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, flags=%x, lock=%d\n", + osGetCurrentProcessId(), pFile, pFile->h, flags, + pFile->locktype)); #ifndef SQLITE_TEST UNUSED_PARAMETER(flags); @@ -35654,19 +42652,38 @@ static int winSync(sqlite3_file *id, int flags){ ** no-op */ #ifdef SQLITE_NO_SYNC - OSTRACE(("SYNC-NOP file=%p, rc=SQLITE_OK\n", pFile->h)); + OSTRACE(("SYNC-NOP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_OK; #else +#if SQLITE_MAX_MMAP_SIZE>0 + if( pFile->pMapRegion ){ + if( osFlushViewOfFile(pFile->pMapRegion, 0) ){ + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_OK\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + }else{ + pFile->lastErrno = osGetLastError(); + OSTRACE(("SYNC-MMAP pid=%lu, pFile=%p, pMapRegion=%p, " + "rc=SQLITE_IOERR_MMAP\n", osGetCurrentProcessId(), + pFile, pFile->pMapRegion)); + return winLogError(SQLITE_IOERR_MMAP, pFile->lastErrno, + "winSync1", pFile->zPath); + } + } +#endif rc = osFlushFileBuffers(pFile->h); SimulateIOError( rc=FALSE ); if( rc ){ - OSTRACE(("SYNC file=%p, rc=SQLITE_OK\n", pFile->h)); + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", + osGetCurrentProcessId(), pFile, pFile->h)); return SQLITE_OK; }else{ pFile->lastErrno = osGetLastError(); - OSTRACE(("SYNC file=%p, rc=SQLITE_IOERR_FSYNC\n", pFile->h)); + OSTRACE(("SYNC pid=%lu, pFile=%p, file=%p, rc=SQLITE_IOERR_FSYNC\n", + osGetCurrentProcessId(), pFile, pFile->h)); return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno, - "winSync", pFile->zPath); + "winSync2", pFile->zPath); } #endif } @@ -35855,6 +42872,12 @@ static int winLock(sqlite3_file *id, int locktype){ return SQLITE_OK; } + /* Do not allow any kind of write-lock on a read-only database + */ + if( (pFile->ctrlFlags & WINFILE_RDONLY)!=0 && locktype>=RESERVED_LOCK ){ + return SQLITE_IOERR_LOCK; + } + /* Make sure the locking sequence is correct */ assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); @@ -35866,9 +42889,8 @@ static int winLock(sqlite3_file *id, int locktype){ ** the PENDING_LOCK byte is temporary. */ newLocktype = pFile->locktype; - if( (pFile->locktype==NO_LOCK) - || ( (locktype==EXCLUSIVE_LOCK) - && (pFile->locktype==RESERVED_LOCK)) + if( pFile->locktype==NO_LOCK + || (locktype==EXCLUSIVE_LOCK && pFile->locktype<=RESERVED_LOCK) ){ int cnt = 3; while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, @@ -35984,7 +43006,7 @@ static int winCheckReservedLock(sqlite3_file *id, int *pResOut){ res = 1; OSTRACE(("TEST-WR-LOCK file=%p, result=%d (local)\n", pFile->h, res)); }else{ - res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS,RESERVED_BYTE, 0, 1, 0); + res = winLockFile(&pFile->h, SQLITE_LOCKFILEEX_FLAGS,RESERVED_BYTE,0,1,0); if( res ){ winUnlockFile(&pFile->h, RESERVED_BYTE, 0, 1, 0); } @@ -36041,6 +43063,44 @@ static int winUnlock(sqlite3_file *id, int locktype){ return rc; } +/****************************************************************************** +****************************** No-op Locking ********************************** +** +** Of the various locking implementations available, this is by far the +** simplest: locking is ignored. No attempt is made to lock the database +** file for reading or writing. +** +** This locking mode is appropriate for use on read-only databases +** (ex: databases that are burned into CD-ROM, for example.) It can +** also be used if the application employs some external mechanism to +** prevent simultaneous access of the same database by two or more +** database connections. But there is a serious risk of database +** corruption if this locking mode is used in situations where multiple +** database connections are accessing the same database file at the same +** time and one or more of those connections are writing. +*/ + +static int winNolockLock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +static int winNolockCheckReservedLock(sqlite3_file *id, int *pResOut){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(pResOut); + return SQLITE_OK; +} + +static int winNolockUnlock(sqlite3_file *id, int locktype){ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(locktype); + return SQLITE_OK; +} + +/******************* End of the no-op lock implementation ********************* +******************************************************************************/ + /* ** If *pArg is initially negative then this is a query. Set *pArg to ** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. @@ -36074,7 +43134,7 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); return SQLITE_OK; } - case SQLITE_LAST_ERRNO: { + case SQLITE_FCNTL_LAST_ERRNO: { *(int*)pArg = (int)pFile->lastErrno; OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); return SQLITE_OK; @@ -36132,6 +43192,12 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); return SQLITE_OK; } + case SQLITE_FCNTL_WIN32_GET_HANDLE: { + LPHANDLE phFile = (LPHANDLE)pArg; + *phFile = pFile->h; + OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); + return SQLITE_OK; + } #ifdef SQLITE_TEST case SQLITE_FCNTL_WIN32_SET_HANDLE: { LPHANDLE phFile = (LPHANDLE)pArg; @@ -36159,6 +43225,14 @@ static int winFileControl(sqlite3_file *id, int op, void *pArg){ if( newLimit>sqlite3GlobalConfig.mxMmap ){ newLimit = sqlite3GlobalConfig.mxMmap; } + + /* The value of newLimit may be eventually cast to (SIZE_T) and passed + ** to MapViewOfFile(). Restrict its value to 2GB if (SIZE_T) is not at + ** least a 64-bit type. */ + if( newLimit>0 && sizeof(SIZE_T)<8 ){ + newLimit = (newLimit & 0x7FFFFFFF); + } + *(i64*)pArg = pFile->mmapSizeMax; if( newLimit>=0 && newLimit!=pFile->mmapSizeMax && pFile->nFetchOut==0 ){ pFile->mmapSizeMax = newLimit; @@ -36223,15 +43297,16 @@ static SYSTEM_INFO winSysInfo; ** assert( winShmMutexHeld() ); ** winShmLeaveMutex() */ +static sqlite3_mutex *winBigLock = 0; static void winShmEnterMutex(void){ - sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_enter(winBigLock); } static void winShmLeaveMutex(void){ - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_leave(winBigLock); } #ifndef NDEBUG static int winShmMutexHeld(void) { - return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + return sqlite3_mutex_held(winBigLock); } #endif @@ -36265,6 +43340,9 @@ struct winShmNode { int szRegion; /* Size of shared-memory regions */ int nRegion; /* Size of array apRegion */ + u8 isReadonly; /* True if read-only */ + u8 isUnlocked; /* True if no DMS lock held */ + struct ShmRegion { HANDLE hMap; /* File handle from CreateFileMapping */ void *pMap; @@ -36274,7 +43352,7 @@ struct winShmNode { int nRef; /* Number of winShm objects pointing to this */ winShm *pFirst; /* All winShm objects pointing to this */ winShmNode *pNext; /* Next in list of all winShmNode objects */ -#ifdef SQLITE_DEBUG +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) u8 nextShmId; /* Next available winShm.id value */ #endif }; @@ -36305,7 +43383,7 @@ struct winShm { u8 hasMutex; /* True if holding the winShmNode mutex */ u16 sharedMask; /* Mask of shared locks held */ u16 exclMask; /* Mask of exclusive locks held */ -#ifdef SQLITE_DEBUG +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) u8 id; /* Id of this connection with its winShmNode */ #endif }; @@ -36319,30 +43397,30 @@ struct winShm { /* ** Apply advisory locks for all n bytes beginning at ofst. */ -#define _SHM_UNLCK 1 -#define _SHM_RDLCK 2 -#define _SHM_WRLCK 3 +#define WINSHM_UNLCK 1 +#define WINSHM_RDLCK 2 +#define WINSHM_WRLCK 3 static int winShmSystemLock( winShmNode *pFile, /* Apply locks to this open shared-memory segment */ - int lockType, /* _SHM_UNLCK, _SHM_RDLCK, or _SHM_WRLCK */ + int lockType, /* WINSHM_UNLCK, WINSHM_RDLCK, or WINSHM_WRLCK */ int ofst, /* Offset to first byte to be locked/unlocked */ int nByte /* Number of bytes to lock or unlock */ ){ int rc = 0; /* Result code form Lock/UnlockFileEx() */ /* Access to the winShmNode object is serialized by the caller */ - assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 ); + assert( pFile->nRef==0 || sqlite3_mutex_held(pFile->mutex) ); OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n", pFile->hFile.h, lockType, ofst, nByte)); /* Release/Acquire the system-level lock */ - if( lockType==_SHM_UNLCK ){ + if( lockType==WINSHM_UNLCK ){ rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0); }else{ /* Initialize the locking parameters */ DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY; - if( lockType == _SHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; + if( lockType == WINSHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0); } @@ -36354,7 +43432,7 @@ static int winShmSystemLock( } OSTRACE(("SHM-LOCK file=%p, func=%s, errno=%lu, rc=%s\n", - pFile->hFile.h, (lockType == _SHM_UNLCK) ? "winUnlockFile" : + pFile->hFile.h, (lockType == WINSHM_UNLCK) ? "winUnlockFile" : "winLockFile", pFile->lastErrno, sqlite3ErrName(rc))); return rc; @@ -36412,6 +43490,37 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ } } +/* +** The DMS lock has not yet been taken on shm file pShmNode. Attempt to +** take it now. Return SQLITE_OK if successful, or an SQLite error +** code otherwise. +** +** If the DMS cannot be locked because this is a readonly_shm=1 +** connection and no other process already holds a lock, return +** SQLITE_READONLY_CANTINIT and set pShmNode->isUnlocked=1. +*/ +static int winLockSharedMemory(winShmNode *pShmNode){ + int rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1); + + if( rc==SQLITE_OK ){ + if( pShmNode->isReadonly ){ + pShmNode->isUnlocked = 1; + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + return SQLITE_READONLY_CANTINIT; + }else if( winTruncate((sqlite3_file*)&pShmNode->hFile, 0) ){ + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + return winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), + "winLockSharedMemory", pShmNode->zFilename); + } + } + + if( rc==SQLITE_OK ){ + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); + } + + return winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1); +} + /* ** Open the shared-memory area associated with database file pDbFd. ** @@ -36421,9 +43530,9 @@ static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ */ static int winOpenSharedMemory(winFile *pDbFd){ struct winShm *p; /* The connection to be opened */ - struct winShmNode *pShmNode = 0; /* The underlying mmapped file */ - int rc; /* Result code */ - struct winShmNode *pNew; /* Newly allocated winShmNode */ + winShmNode *pShmNode = 0; /* The underlying mmapped file */ + int rc = SQLITE_OK; /* Result code */ + winShmNode *pNew; /* Newly allocated winShmNode */ int nName; /* Size of zName in bytes */ assert( pDbFd->pShm==0 ); /* Not previously opened */ @@ -36432,12 +43541,12 @@ static int winOpenSharedMemory(winFile *pDbFd){ ** allocate space for a new winShmNode and filename. */ p = sqlite3MallocZero( sizeof(*p) ); - if( p==0 ) return SQLITE_IOERR_NOMEM; + if( p==0 ) return SQLITE_IOERR_NOMEM_BKPT; nName = sqlite3Strlen30(pDbFd->zPath); pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 ); if( pNew==0 ){ sqlite3_free(p); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } pNew->zFilename = (char*)&pNew[1]; sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); @@ -36456,47 +43565,45 @@ static int winOpenSharedMemory(winFile *pDbFd){ if( pShmNode ){ sqlite3_free(pNew); }else{ + int inFlags = SQLITE_OPEN_WAL; + int outFlags = 0; + pShmNode = pNew; pNew = 0; ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE; pShmNode->pNext = winShmNodeList; winShmNodeList = pShmNode; - pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); - if( pShmNode->mutex==0 ){ - rc = SQLITE_IOERR_NOMEM; - goto shm_open_err; - } - - rc = winOpen(pDbFd->pVfs, - pShmNode->zFilename, /* Name of the file (UTF-8) */ - (sqlite3_file*)&pShmNode->hFile, /* File handle here */ - SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, - 0); - if( SQLITE_OK!=rc ){ - goto shm_open_err; - } - - /* Check to see if another process is holding the dead-man switch. - ** If not, truncate the file to zero length. - */ - if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){ - rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0); - if( rc!=SQLITE_OK ){ - rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), - "winOpenShm", pDbFd->zPath); + if( sqlite3GlobalConfig.bCoreMutex ){ + pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); + if( pShmNode->mutex==0 ){ + rc = SQLITE_IOERR_NOMEM_BKPT; + goto shm_open_err; } } - if( rc==SQLITE_OK ){ - winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1); - rc = winShmSystemLock(pShmNode, _SHM_RDLCK, WIN_SHM_DMS, 1); + + if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ + inFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; + }else{ + inFlags |= SQLITE_OPEN_READONLY; } - if( rc ) goto shm_open_err; + rc = winOpen(pDbFd->pVfs, pShmNode->zFilename, + (sqlite3_file*)&pShmNode->hFile, + inFlags, &outFlags); + if( rc!=SQLITE_OK ){ + rc = winLogError(rc, osGetLastError(), "winOpenShm", + pShmNode->zFilename); + goto shm_open_err; + } + if( outFlags==SQLITE_OPEN_READONLY ) pShmNode->isReadonly = 1; + + rc = winLockSharedMemory(pShmNode); + if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err; } /* Make the new connection a child of the winShmNode */ p->pShmNode = pShmNode; -#ifdef SQLITE_DEBUG +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) p->id = pShmNode->nextShmId++; #endif pShmNode->nRef++; @@ -36514,11 +43621,11 @@ static int winOpenSharedMemory(winFile *pDbFd){ p->pNext = pShmNode->pFirst; pShmNode->pFirst = p; sqlite3_mutex_leave(pShmNode->mutex); - return SQLITE_OK; + return rc; /* Jump here on any error */ shm_open_err: - winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1); + winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1); winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */ sqlite3_free(p); sqlite3_free(pNew); @@ -36607,7 +43714,7 @@ static int winShmLock( /* Unlock the system-level locks */ if( (mask & allMask)==0 ){ - rc = winShmSystemLock(pShmNode, _SHM_UNLCK, ofst+WIN_SHM_BASE, n); + rc = winShmSystemLock(pShmNode, WINSHM_UNLCK, ofst+WIN_SHM_BASE, n); }else{ rc = SQLITE_OK; } @@ -36635,7 +43742,7 @@ static int winShmLock( /* Get shared locks at the system level, if necessary */ if( rc==SQLITE_OK ){ if( (allShared & mask)==0 ){ - rc = winShmSystemLock(pShmNode, _SHM_RDLCK, ofst+WIN_SHM_BASE, n); + rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, ofst+WIN_SHM_BASE, n); }else{ rc = SQLITE_OK; } @@ -36660,7 +43767,7 @@ static int winShmLock( ** also mark the local connection as being locked. */ if( rc==SQLITE_OK ){ - rc = winShmSystemLock(pShmNode, _SHM_WRLCK, ofst+WIN_SHM_BASE, n); + rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, ofst+WIN_SHM_BASE, n); if( rc==SQLITE_OK ){ assert( (p->sharedMask & mask)==0 ); p->exclMask |= mask; @@ -36684,8 +43791,8 @@ static void winShmBarrier( sqlite3_file *fd /* Database holding the shared memory */ ){ UNUSED_PARAMETER(fd); - /* MemoryBarrier(); // does not work -- do not know why not */ - winShmEnterMutex(); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + winShmEnterMutex(); /* Also mutex, for redundancy */ winShmLeaveMutex(); } @@ -36716,18 +43823,25 @@ static int winShmMap( void volatile **pp /* OUT: Mapped memory */ ){ winFile *pDbFd = (winFile*)fd; - winShm *p = pDbFd->pShm; + winShm *pShm = pDbFd->pShm; winShmNode *pShmNode; + DWORD protect = PAGE_READWRITE; + DWORD flags = FILE_MAP_WRITE | FILE_MAP_READ; int rc = SQLITE_OK; - if( !p ){ + if( !pShm ){ rc = winOpenSharedMemory(pDbFd); if( rc!=SQLITE_OK ) return rc; - p = pDbFd->pShm; + pShm = pDbFd->pShm; } - pShmNode = p->pShmNode; + pShmNode = pShm->pShmNode; sqlite3_mutex_enter(pShmNode->mutex); + if( pShmNode->isUnlocked ){ + rc = winLockSharedMemory(pShmNode); + if( rc!=SQLITE_OK ) goto shmpage_out; + pShmNode->isUnlocked = 0; + } assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); if( pShmNode->nRegion<=iRegion ){ @@ -36765,30 +43879,35 @@ static int winShmMap( } /* Map the requested memory region into this processes address space. */ - apNew = (struct ShmRegion *)sqlite3_realloc( + apNew = (struct ShmRegion *)sqlite3_realloc64( pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0]) ); if( !apNew ){ - rc = SQLITE_IOERR_NOMEM; + rc = SQLITE_IOERR_NOMEM_BKPT; goto shmpage_out; } pShmNode->aRegion = apNew; + if( pShmNode->isReadonly ){ + protect = PAGE_READONLY; + flags = FILE_MAP_READ; + } + while( pShmNode->nRegion<=iRegion ){ HANDLE hMap = NULL; /* file-mapping handle */ void *pMap = 0; /* Mapped memory region */ #if SQLITE_OS_WINRT hMap = osCreateFileMappingFromApp(pShmNode->hFile.h, - NULL, PAGE_READWRITE, nByte, NULL + NULL, protect, nByte, NULL ); #elif defined(SQLITE_WIN32_HAS_WIDE) hMap = osCreateFileMappingW(pShmNode->hFile.h, - NULL, PAGE_READWRITE, 0, nByte, NULL + NULL, protect, 0, nByte, NULL ); -#elif defined(SQLITE_WIN32_HAS_ANSI) +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA hMap = osCreateFileMappingA(pShmNode->hFile.h, - NULL, PAGE_READWRITE, 0, nByte, NULL + NULL, protect, 0, nByte, NULL ); #endif OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n", @@ -36798,11 +43917,11 @@ static int winShmMap( int iOffset = pShmNode->nRegion*szRegion; int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; #if SQLITE_OS_WINRT - pMap = osMapViewOfFileFromApp(hMap, FILE_MAP_WRITE | FILE_MAP_READ, + pMap = osMapViewOfFileFromApp(hMap, flags, iOffset - iOffsetShift, szRegion + iOffsetShift ); #else - pMap = osMapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ, + pMap = osMapViewOfFile(hMap, flags, 0, iOffset - iOffsetShift, szRegion + iOffsetShift ); #endif @@ -36833,6 +43952,7 @@ shmpage_out: }else{ *pp = 0; } + if( pShmNode->isReadonly && rc==SQLITE_OK ) rc = SQLITE_READONLY; sqlite3_mutex_leave(pShmNode->mutex); return rc; } @@ -36930,17 +44050,19 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){ DWORD flags = FILE_MAP_READ; winUnmapfile(pFd); +#ifdef SQLITE_MMAP_READWRITE if( (pFd->ctrlFlags & WINFILE_RDONLY)==0 ){ protect = PAGE_READWRITE; flags |= FILE_MAP_WRITE; } +#endif #if SQLITE_OS_WINRT pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL); #elif defined(SQLITE_WIN32_HAS_WIDE) pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect, (DWORD)((nMap>>32) & 0xffffffff), (DWORD)(nMap & 0xffffffff), NULL); -#elif defined(SQLITE_WIN32_HAS_ANSI) +#elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA pFd->hMap = osCreateFileMappingA(pFd->h, NULL, protect, (DWORD)((nMap>>32) & 0xffffffff), (DWORD)(nMap & 0xffffffff), NULL); @@ -37101,6 +44223,44 @@ static const sqlite3_io_methods winIoMethod = { winUnfetch /* xUnfetch */ }; +/* +** This vector defines all the methods that can operate on an +** sqlite3_file for win32 without performing any locking. +*/ +static const sqlite3_io_methods winIoNolockMethod = { + 3, /* iVersion */ + winClose, /* xClose */ + winRead, /* xRead */ + winWrite, /* xWrite */ + winTruncate, /* xTruncate */ + winSync, /* xSync */ + winFileSize, /* xFileSize */ + winNolockLock, /* xLock */ + winNolockUnlock, /* xUnlock */ + winNolockCheckReservedLock, /* xCheckReservedLock */ + winFileControl, /* xFileControl */ + winSectorSize, /* xSectorSize */ + winDeviceCharacteristics, /* xDeviceCharacteristics */ + winShmMap, /* xShmMap */ + winShmLock, /* xShmLock */ + winShmBarrier, /* xShmBarrier */ + winShmUnmap, /* xShmUnmap */ + winFetch, /* xFetch */ + winUnfetch /* xUnfetch */ +}; + +static winVfsAppData winAppData = { + &winIoMethod, /* pMethod */ + 0, /* pAppData */ + 0 /* bNoLock */ +}; + +static winVfsAppData winNolockAppData = { + &winIoNolockMethod, /* pMethod */ + 0, /* pAppData */ + 1 /* bNoLock */ +}; + /**************************************************************************** **************************** sqlite3_vfs methods **************************** ** @@ -37121,7 +44281,7 @@ static char *winConvertToUtf8Filename(const void *zFilename){ } #ifdef SQLITE_WIN32_HAS_ANSI else{ - zConverted = sqlite3_win32_mbcs_to_utf8(zFilename); + zConverted = winMbcsToUtf8(zFilename, osAreFileApisANSI()); } #endif /* caller will handle out of memory */ @@ -37142,7 +44302,7 @@ static void *winConvertFromUtf8Filename(const char *zFilename){ } #ifdef SQLITE_WIN32_HAS_ANSI else{ - zConverted = sqlite3_win32_utf8_to_mbcs(zFilename); + zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI()); } #endif /* caller will handle out of memory */ @@ -37197,7 +44357,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ zBuf = sqlite3MallocZero( nBuf ); if( !zBuf ){ OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } /* Figure out the effective temporary directory. First, check if one @@ -37255,7 +44415,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ if( !zConverted ){ sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( winIsDir(zConverted) ){ sqlite3_snprintf(nMax, zBuf, "%s", zDir); @@ -37268,7 +44428,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ if( !zConverted ){ sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( cygwin_conv_path( osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A, zDir, @@ -37289,7 +44449,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ sqlite3_free(zConverted); sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } sqlite3_snprintf(nMax, zBuf, "%s", zUtf8); sqlite3_free(zUtf8); @@ -37307,7 +44467,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ if( !zWidePath ){ sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( osGetTempPathW(nMax, zWidePath)==0 ){ sqlite3_free(zWidePath); @@ -37325,7 +44485,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ sqlite3_free(zWidePath); sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } } #ifdef SQLITE_WIN32_HAS_ANSI @@ -37335,7 +44495,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ if( !zMbcsPath ){ sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( osGetTempPathA(nMax, zMbcsPath)==0 ){ sqlite3_free(zBuf); @@ -37343,14 +44503,14 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ return winLogError(SQLITE_IOERR_GETTEMPPATH, osGetLastError(), "winGetTempname3", 0); } - zUtf8 = sqlite3_win32_mbcs_to_utf8(zMbcsPath); + zUtf8 = winMbcsToUtf8(zMbcsPath, osAreFileApisANSI()); if( zUtf8 ){ sqlite3_snprintf(nMax, zBuf, "%s", zUtf8); sqlite3_free(zUtf8); }else{ sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } } #endif /* SQLITE_WIN32_HAS_ANSI */ @@ -37429,11 +44589,19 @@ static int winIsDir(const void *zConverted){ return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY); } +/* forward reference */ +static int winAccess( + sqlite3_vfs *pVfs, /* Not used on win32 */ + const char *zFilename, /* Name of file to check */ + int flags, /* Type of test to make on this file */ + int *pResOut /* OUT: Result */ +); + /* ** Open a file. */ static int winOpen( - sqlite3_vfs *pVfs, /* Used to get maximum path name length */ + sqlite3_vfs *pVfs, /* Used to get maximum path length and AppData */ const char *zName, /* Name of the file (UTF-8) */ sqlite3_file *id, /* Write the SQLite file handle here */ int flags, /* Open mode flags */ @@ -37448,6 +44616,7 @@ static int winOpen( #if SQLITE_OS_WINCE int isTemp = 0; #endif + winVfsAppData *pAppData; winFile *pFile = (winFile*)id; void *zConverted; /* Filename in OS encoding */ const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */ @@ -37542,7 +44711,7 @@ static int winOpen( if( zConverted==0 ){ sqlite3_free(zTmpname); OSTRACE(("OPEN name=%s, rc=SQLITE_IOERR_NOMEM", zUtf8Name)); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( winIsDir(zConverted) ){ @@ -37604,47 +44773,66 @@ static int winOpen( extendedParameters.dwSecurityQosFlags = SECURITY_ANONYMOUS; extendedParameters.lpSecurityAttributes = NULL; extendedParameters.hTemplateFile = NULL; - while( (h = osCreateFile2((LPCWSTR)zConverted, - dwDesiredAccess, - dwShareMode, - dwCreationDisposition, - &extendedParameters))==INVALID_HANDLE_VALUE && - winRetryIoerr(&cnt, &lastErrno) ){ - /* Noop */ - } + do{ + h = osCreateFile2((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, + dwCreationDisposition, + &extendedParameters); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); #else - while( (h = osCreateFileW((LPCWSTR)zConverted, - dwDesiredAccess, - dwShareMode, NULL, - dwCreationDisposition, - dwFlagsAndAttributes, - NULL))==INVALID_HANDLE_VALUE && - winRetryIoerr(&cnt, &lastErrno) ){ - /* Noop */ - } + do{ + h = osCreateFileW((LPCWSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); #endif } #ifdef SQLITE_WIN32_HAS_ANSI else{ - while( (h = osCreateFileA((LPCSTR)zConverted, - dwDesiredAccess, - dwShareMode, NULL, - dwCreationDisposition, - dwFlagsAndAttributes, - NULL))==INVALID_HANDLE_VALUE && - winRetryIoerr(&cnt, &lastErrno) ){ - /* Noop */ - } + do{ + h = osCreateFileA((LPCSTR)zConverted, + dwDesiredAccess, + dwShareMode, NULL, + dwCreationDisposition, + dwFlagsAndAttributes, + NULL); + if( h!=INVALID_HANDLE_VALUE ) break; + if( isReadWrite ){ + int rc2, isRO = 0; + sqlite3BeginBenignMalloc(); + rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO); + sqlite3EndBenignMalloc(); + if( rc2==SQLITE_OK && isRO ) break; + } + }while( winRetryIoerr(&cnt, &lastErrno) ); } #endif - winLogIoerr(cnt); + winLogIoerr(cnt, __LINE__); OSTRACE(("OPEN file=%p, name=%s, access=%lx, rc=%s\n", h, zUtf8Name, dwDesiredAccess, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); if( h==INVALID_HANDLE_VALUE ){ - pFile->lastErrno = lastErrno; - winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name); sqlite3_free(zConverted); sqlite3_free(zTmpname); if( isReadWrite && !isExclusive ){ @@ -37653,6 +44841,8 @@ static int winOpen( ~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)), pOutFlags); }else{ + pFile->lastErrno = lastErrno; + winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name); return SQLITE_CANTOPEN_BKPT; } } @@ -37669,15 +44859,20 @@ static int winOpen( "rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ? *pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); + pAppData = (winVfsAppData*)pVfs->pAppData; + #if SQLITE_OS_WINCE - if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB - && (rc = winceCreateLock(zName, pFile))!=SQLITE_OK - ){ - osCloseHandle(h); - sqlite3_free(zConverted); - sqlite3_free(zTmpname); - OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc))); - return rc; + { + if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB + && ((pAppData==NULL) || !pAppData->bNoLock) + && (rc = winceCreateLock(zName, pFile))!=SQLITE_OK + ){ + osCloseHandle(h); + sqlite3_free(zConverted); + sqlite3_free(zTmpname); + OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc))); + return rc; + } } if( isTemp ){ pFile->zDeleteOnClose = zConverted; @@ -37688,7 +44883,7 @@ static int winOpen( } sqlite3_free(zTmpname); - pFile->pMethod = &winIoMethod; + pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod; pFile->pVfs = pVfs; pFile->h = h; if( isReadonly ){ @@ -37742,7 +44937,7 @@ static int winDelete( zConverted = winConvertFromUtf8Filename(zFilename); if( zConverted==0 ){ OSTRACE(("DELETE name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( osIsNT() ){ do { @@ -37821,7 +45016,7 @@ static int winDelete( if( rc && rc!=SQLITE_IOERR_DELETE_NOENT ){ rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, "winDelete", zFilename); }else{ - winLogIoerr(cnt); + winLogIoerr(cnt, __LINE__); } sqlite3_free(zConverted); OSTRACE(("DELETE name=%s, rc=%s\n", zFilename, sqlite3ErrName(rc))); @@ -37850,7 +45045,7 @@ static int winAccess( zConverted = winConvertFromUtf8Filename(zFilename); if( zConverted==0 ){ OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( osIsNT() ){ int cnt = 0; @@ -37871,7 +45066,7 @@ static int winAccess( attr = sAttrData.dwFileAttributes; } }else{ - winLogIoerr(cnt); + winLogIoerr(cnt, __LINE__); if( lastErrno!=ERROR_FILE_NOT_FOUND && lastErrno!=ERROR_PATH_NOT_FOUND ){ sqlite3_free(zConverted); return winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", @@ -37963,6 +45158,18 @@ static int winFullPathname( int nFull, /* Size of output buffer in bytes */ char *zFull /* Output buffer */ ){ +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) + DWORD nByte; + void *zConverted; + char *zOut; +#endif + + /* If this path name begins with "/X:", where "X" is any alphabetic + ** character, discard the initial "/" from the pathname. + */ + if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){ + zRelative++; + } #if defined(__CYGWIN__) SimulateIOError( return SQLITE_ERROR ); @@ -37977,7 +45184,7 @@ static int winFullPathname( */ char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); if( !zOut ){ - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( cygwin_conv_path( (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) | @@ -37989,7 +45196,7 @@ static int winFullPathname( char *zUtf8 = winConvertToUtf8Filename(zOut); if( !zUtf8 ){ sqlite3_free(zOut); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", sqlite3_data_directory, winGetDirSep(), zUtf8); @@ -37999,7 +45206,7 @@ static int winFullPathname( }else{ char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); if( !zOut ){ - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( cygwin_conv_path( (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A), @@ -38011,7 +45218,7 @@ static int winFullPathname( char *zUtf8 = winConvertToUtf8Filename(zOut); if( !zUtf8 ){ sqlite3_free(zOut); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8); sqlite3_free(zUtf8); @@ -38041,17 +45248,6 @@ static int winFullPathname( #endif #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) - DWORD nByte; - void *zConverted; - char *zOut; - - /* If this path name begins with "/X:", where "X" is any alphabetic - ** character, discard the initial "/" from the pathname. - */ - if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){ - zRelative++; - } - /* It's odd to simulate an io-error here, but really this is just ** using the io-error infrastructure to test that SQLite handles this ** function failing. This function could fail if, for example, the @@ -38071,7 +45267,7 @@ static int winFullPathname( } zConverted = winConvertFromUtf8Filename(zRelative); if( zConverted==0 ){ - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } if( osIsNT() ){ LPWSTR zTemp; @@ -38085,7 +45281,7 @@ static int winFullPathname( zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); if( zTemp==0 ){ sqlite3_free(zConverted); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0); if( nByte==0 ){ @@ -38111,7 +45307,7 @@ static int winFullPathname( zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); if( zTemp==0 ){ sqlite3_free(zConverted); - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0); if( nByte==0 ){ @@ -38121,7 +45317,7 @@ static int winFullPathname( "winFullPathname4", zRelative); } sqlite3_free(zConverted); - zOut = sqlite3_win32_mbcs_to_utf8(zTemp); + zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI()); sqlite3_free(zTemp); } #endif @@ -38130,7 +45326,7 @@ static int winFullPathname( sqlite3_free(zOut); return SQLITE_OK; }else{ - return SQLITE_IOERR_NOMEM; + return SQLITE_IOERR_NOMEM_BKPT; } #endif } @@ -38205,49 +45401,82 @@ static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ #define winDlClose 0 #endif +/* State information for the randomness gatherer. */ +typedef struct EntropyGatherer EntropyGatherer; +struct EntropyGatherer { + unsigned char *a; /* Gather entropy into this buffer */ + int na; /* Size of a[] in bytes */ + int i; /* XOR next input into a[i] */ + int nXor; /* Number of XOR operations done */ +}; + +#if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) +/* Mix sz bytes of entropy into p. */ +static void xorMemory(EntropyGatherer *p, unsigned char *x, int sz){ + int j, k; + for(j=0, k=p->i; j<sz; j++){ + p->a[k++] ^= x[j]; + if( k>=p->na ) k = 0; + } + p->i = k; + p->nXor += sz; +} +#endif /* !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) */ /* ** Write up to nBuf bytes of randomness into zBuf. */ static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ - int n = 0; +#if defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) UNUSED_PARAMETER(pVfs); -#if defined(SQLITE_TEST) - n = nBuf; memset(zBuf, 0, nBuf); + return nBuf; #else - if( sizeof(SYSTEMTIME)<=nBuf-n ){ + EntropyGatherer e; + UNUSED_PARAMETER(pVfs); + memset(zBuf, 0, nBuf); + e.a = (unsigned char*)zBuf; + e.na = nBuf; + e.nXor = 0; + e.i = 0; + { SYSTEMTIME x; osGetSystemTime(&x); - memcpy(&zBuf[n], &x, sizeof(x)); - n += sizeof(x); + xorMemory(&e, (unsigned char*)&x, sizeof(SYSTEMTIME)); } - if( sizeof(DWORD)<=nBuf-n ){ + { DWORD pid = osGetCurrentProcessId(); - memcpy(&zBuf[n], &pid, sizeof(pid)); - n += sizeof(pid); + xorMemory(&e, (unsigned char*)&pid, sizeof(DWORD)); } #if SQLITE_OS_WINRT - if( sizeof(ULONGLONG)<=nBuf-n ){ + { ULONGLONG cnt = osGetTickCount64(); - memcpy(&zBuf[n], &cnt, sizeof(cnt)); - n += sizeof(cnt); + xorMemory(&e, (unsigned char*)&cnt, sizeof(ULONGLONG)); } #else - if( sizeof(DWORD)<=nBuf-n ){ + { DWORD cnt = osGetTickCount(); - memcpy(&zBuf[n], &cnt, sizeof(cnt)); - n += sizeof(cnt); + xorMemory(&e, (unsigned char*)&cnt, sizeof(DWORD)); } -#endif - if( sizeof(LARGE_INTEGER)<=nBuf-n ){ +#endif /* SQLITE_OS_WINRT */ + { LARGE_INTEGER i; osQueryPerformanceCounter(&i); - memcpy(&zBuf[n], &i, sizeof(i)); - n += sizeof(i); + xorMemory(&e, (unsigned char*)&i, sizeof(LARGE_INTEGER)); } -#endif - return n; +#if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID + { + UUID id; + memset(&id, 0, sizeof(UUID)); + osUuidCreate(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + memset(&id, 0, sizeof(UUID)); + osUuidCreateSequential(&id); + xorMemory(&e, (unsigned char*)&id, sizeof(UUID)); + } +#endif /* !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID */ + return e.nXor>nBuf ? nBuf : e.nXor; +#endif /* defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) */ } @@ -38363,8 +45592,10 @@ static int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ ** sqlite3_errmsg(), possibly making IO errors easier to debug. */ static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ + DWORD e = osGetLastError(); UNUSED_PARAMETER(pVfs); - return winGetLastErrorMsg(osGetLastError(), nBuf, zBuf); + if( nBuf>0 ) winGetLastErrorMsg(e, nBuf, zBuf); + return e; } /* @@ -38372,59 +45603,109 @@ static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ */ SQLITE_API int sqlite3_os_init(void){ static sqlite3_vfs winVfs = { - 3, /* iVersion */ - sizeof(winFile), /* szOsFile */ + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ - 0, /* pNext */ - "win32", /* zName */ - 0, /* pAppData */ - winOpen, /* xOpen */ - winDelete, /* xDelete */ - winAccess, /* xAccess */ - winFullPathname, /* xFullPathname */ - winDlOpen, /* xDlOpen */ - winDlError, /* xDlError */ - winDlSym, /* xDlSym */ - winDlClose, /* xDlClose */ - winRandomness, /* xRandomness */ - winSleep, /* xSleep */ - winCurrentTime, /* xCurrentTime */ - winGetLastError, /* xGetLastError */ - winCurrentTimeInt64, /* xCurrentTimeInt64 */ - winSetSystemCall, /* xSetSystemCall */ - winGetSystemCall, /* xGetSystemCall */ - winNextSystemCall, /* xNextSystemCall */ + 0, /* pNext */ + "win32", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ }; #if defined(SQLITE_WIN32_HAS_WIDE) static sqlite3_vfs winLongPathVfs = { - 3, /* iVersion */ - sizeof(winFile), /* szOsFile */ + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ - 0, /* pNext */ - "win32-longpath", /* zName */ - 0, /* pAppData */ - winOpen, /* xOpen */ - winDelete, /* xDelete */ - winAccess, /* xAccess */ - winFullPathname, /* xFullPathname */ - winDlOpen, /* xDlOpen */ - winDlError, /* xDlError */ - winDlSym, /* xDlSym */ - winDlClose, /* xDlClose */ - winRandomness, /* xRandomness */ - winSleep, /* xSleep */ - winCurrentTime, /* xCurrentTime */ - winGetLastError, /* xGetLastError */ - winCurrentTimeInt64, /* xCurrentTimeInt64 */ - winSetSystemCall, /* xSetSystemCall */ - winGetSystemCall, /* xGetSystemCall */ - winNextSystemCall, /* xNextSystemCall */ + 0, /* pNext */ + "win32-longpath", /* zName */ + &winAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#endif + static sqlite3_vfs winNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ + }; +#if defined(SQLITE_WIN32_HAS_WIDE) + static sqlite3_vfs winLongPathNolockVfs = { + 3, /* iVersion */ + sizeof(winFile), /* szOsFile */ + SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ + 0, /* pNext */ + "win32-longpath-none", /* zName */ + &winNolockAppData, /* pAppData */ + winOpen, /* xOpen */ + winDelete, /* xDelete */ + winAccess, /* xAccess */ + winFullPathname, /* xFullPathname */ + winDlOpen, /* xDlOpen */ + winDlError, /* xDlError */ + winDlSym, /* xDlSym */ + winDlClose, /* xDlClose */ + winRandomness, /* xRandomness */ + winSleep, /* xSleep */ + winCurrentTime, /* xCurrentTime */ + winGetLastError, /* xGetLastError */ + winCurrentTimeInt64, /* xCurrentTimeInt64 */ + winSetSystemCall, /* xSetSystemCall */ + winGetSystemCall, /* xGetSystemCall */ + winNextSystemCall, /* xNextSystemCall */ }; #endif /* Double-check that the aSyscall[] array has been constructed ** correctly. See ticket [bb3a86e890c8e96ab] */ - assert( ArraySize(aSyscall)==77 ); + assert( ArraySize(aSyscall)==80 ); /* get memory map allocation granularity */ memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); @@ -38442,6 +45723,16 @@ SQLITE_API int sqlite3_os_init(void){ sqlite3_vfs_register(&winLongPathVfs, 0); #endif + sqlite3_vfs_register(&winNolockVfs, 0); + +#if defined(SQLITE_WIN32_HAS_WIDE) + sqlite3_vfs_register(&winLongPathNolockVfs, 0); +#endif + +#ifndef SQLITE_OMIT_WAL + winBigLock = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1); +#endif + return SQLITE_OK; } @@ -38452,12 +45743,609 @@ SQLITE_API int sqlite3_os_end(void){ sleepObj = NULL; } #endif + +#ifndef SQLITE_OMIT_WAL + winBigLock = 0; +#endif + return SQLITE_OK; } #endif /* SQLITE_OS_WIN */ /************** End of os_win.c **********************************************/ +/************** Begin file memdb.c *******************************************/ +/* +** 2016-09-07 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file implements an in-memory VFS. A database is held as a contiguous +** block of memory. +** +** This file also implements interface sqlite3_serialize() and +** sqlite3_deserialize(). +*/ +#ifdef SQLITE_ENABLE_DESERIALIZE +/* #include "sqliteInt.h" */ + +/* +** Forward declaration of objects used by this utility +*/ +typedef struct sqlite3_vfs MemVfs; +typedef struct MemFile MemFile; + +/* Access to a lower-level VFS that (might) implement dynamic loading, +** access to randomness, etc. +*/ +#define ORIGVFS(p) ((sqlite3_vfs*)((p)->pAppData)) + +/* An open file */ +struct MemFile { + sqlite3_file base; /* IO methods */ + sqlite3_int64 sz; /* Size of the file */ + sqlite3_int64 szMax; /* Space allocated to aData */ + unsigned char *aData; /* content of the file */ + int nMmap; /* Number of memory mapped pages */ + unsigned mFlags; /* Flags */ + int eLock; /* Most recent lock against this file */ +}; + +/* +** Methods for MemFile +*/ +static int memdbClose(sqlite3_file*); +static int memdbRead(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst); +static int memdbWrite(sqlite3_file*,const void*,int iAmt, sqlite3_int64 iOfst); +static int memdbTruncate(sqlite3_file*, sqlite3_int64 size); +static int memdbSync(sqlite3_file*, int flags); +static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize); +static int memdbLock(sqlite3_file*, int); +/* static int memdbCheckReservedLock(sqlite3_file*, int *pResOut);// not used */ +static int memdbFileControl(sqlite3_file*, int op, void *pArg); +/* static int memdbSectorSize(sqlite3_file*); // not used */ +static int memdbDeviceCharacteristics(sqlite3_file*); +static int memdbFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); +static int memdbUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); + +/* +** Methods for MemVfs +*/ +static int memdbOpen(sqlite3_vfs*, const char *, sqlite3_file*, int , int *); +/* static int memdbDelete(sqlite3_vfs*, const char *zName, int syncDir); */ +static int memdbAccess(sqlite3_vfs*, const char *zName, int flags, int *); +static int memdbFullPathname(sqlite3_vfs*, const char *zName, int, char *zOut); +static void *memdbDlOpen(sqlite3_vfs*, const char *zFilename); +static void memdbDlError(sqlite3_vfs*, int nByte, char *zErrMsg); +static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char*zSym))(void); +static void memdbDlClose(sqlite3_vfs*, void*); +static int memdbRandomness(sqlite3_vfs*, int nByte, char *zOut); +static int memdbSleep(sqlite3_vfs*, int microseconds); +/* static int memdbCurrentTime(sqlite3_vfs*, double*); */ +static int memdbGetLastError(sqlite3_vfs*, int, char *); +static int memdbCurrentTimeInt64(sqlite3_vfs*, sqlite3_int64*); + +static sqlite3_vfs memdb_vfs = { + 2, /* iVersion */ + 0, /* szOsFile (set when registered) */ + 1024, /* mxPathname */ + 0, /* pNext */ + "memdb", /* zName */ + 0, /* pAppData (set when registered) */ + memdbOpen, /* xOpen */ + 0, /* memdbDelete, */ /* xDelete */ + memdbAccess, /* xAccess */ + memdbFullPathname, /* xFullPathname */ + memdbDlOpen, /* xDlOpen */ + memdbDlError, /* xDlError */ + memdbDlSym, /* xDlSym */ + memdbDlClose, /* xDlClose */ + memdbRandomness, /* xRandomness */ + memdbSleep, /* xSleep */ + 0, /* memdbCurrentTime, */ /* xCurrentTime */ + memdbGetLastError, /* xGetLastError */ + memdbCurrentTimeInt64 /* xCurrentTimeInt64 */ +}; + +static const sqlite3_io_methods memdb_io_methods = { + 3, /* iVersion */ + memdbClose, /* xClose */ + memdbRead, /* xRead */ + memdbWrite, /* xWrite */ + memdbTruncate, /* xTruncate */ + memdbSync, /* xSync */ + memdbFileSize, /* xFileSize */ + memdbLock, /* xLock */ + memdbLock, /* xUnlock - same as xLock in this case */ + 0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */ + memdbFileControl, /* xFileControl */ + 0, /* memdbSectorSize,*/ /* xSectorSize */ + memdbDeviceCharacteristics, /* xDeviceCharacteristics */ + 0, /* xShmMap */ + 0, /* xShmLock */ + 0, /* xShmBarrier */ + 0, /* xShmUnmap */ + memdbFetch, /* xFetch */ + memdbUnfetch /* xUnfetch */ +}; + + + +/* +** Close an memdb-file. +** +** The pData pointer is owned by the application, so there is nothing +** to free. +*/ +static int memdbClose(sqlite3_file *pFile){ + MemFile *p = (MemFile *)pFile; + if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ) sqlite3_free(p->aData); + return SQLITE_OK; +} + +/* +** Read data from an memdb-file. +*/ +static int memdbRead( + sqlite3_file *pFile, + void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + MemFile *p = (MemFile *)pFile; + if( iOfst+iAmt>p->sz ){ + memset(zBuf, 0, iAmt); + if( iOfst<p->sz ) memcpy(zBuf, p->aData+iOfst, p->sz - iOfst); + return SQLITE_IOERR_SHORT_READ; + } + memcpy(zBuf, p->aData+iOfst, iAmt); + return SQLITE_OK; +} + +/* +** Try to enlarge the memory allocation to hold at least sz bytes +*/ +static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){ + unsigned char *pNew; + if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ + return SQLITE_FULL; + } + pNew = sqlite3_realloc64(p->aData, newSz); + if( pNew==0 ) return SQLITE_NOMEM; + p->aData = pNew; + p->szMax = newSz; + return SQLITE_OK; +} + +/* +** Write data to an memdb-file. +*/ +static int memdbWrite( + sqlite3_file *pFile, + const void *z, + int iAmt, + sqlite_int64 iOfst +){ + MemFile *p = (MemFile *)pFile; + if( iOfst+iAmt>p->sz ){ + int rc; + if( iOfst+iAmt>p->szMax + && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK + ){ + return rc; + } + if( iOfst>p->sz ) memset(p->aData+p->sz, 0, iOfst-p->sz); + p->sz = iOfst+iAmt; + } + memcpy(p->aData+iOfst, z, iAmt); + return SQLITE_OK; +} + +/* +** Truncate an memdb-file. +** +** In rollback mode (which is always the case for memdb, as it does not +** support WAL mode) the truncate() method is only used to reduce +** the size of a file, never to increase the size. +*/ +static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){ + MemFile *p = (MemFile *)pFile; + if( NEVER(size>p->sz) ) return SQLITE_FULL; + p->sz = size; + return SQLITE_OK; +} + +/* +** Sync an memdb-file. +*/ +static int memdbSync(sqlite3_file *pFile, int flags){ + return SQLITE_OK; +} + +/* +** Return the current file-size of an memdb-file. +*/ +static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ + MemFile *p = (MemFile *)pFile; + *pSize = p->sz; + return SQLITE_OK; +} + +/* +** Lock an memdb-file. +*/ +static int memdbLock(sqlite3_file *pFile, int eLock){ + MemFile *p = (MemFile *)pFile; + p->eLock = eLock; + return SQLITE_OK; +} + +#if 0 /* Never used because memdbAccess() always returns false */ +/* +** Check if another file-handle holds a RESERVED lock on an memdb-file. +*/ +static int memdbCheckReservedLock(sqlite3_file *pFile, int *pResOut){ + *pResOut = 0; + return SQLITE_OK; +} +#endif + +/* +** File control method. For custom operations on an memdb-file. +*/ +static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ + MemFile *p = (MemFile *)pFile; + int rc = SQLITE_NOTFOUND; + if( op==SQLITE_FCNTL_VFSNAME ){ + *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); + rc = SQLITE_OK; + } + return rc; +} + +#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */ +/* +** Return the sector-size in bytes for an memdb-file. +*/ +static int memdbSectorSize(sqlite3_file *pFile){ + return 1024; +} +#endif + +/* +** Return the device characteristic flags supported by an memdb-file. +*/ +static int memdbDeviceCharacteristics(sqlite3_file *pFile){ + return SQLITE_IOCAP_ATOMIC | + SQLITE_IOCAP_POWERSAFE_OVERWRITE | + SQLITE_IOCAP_SAFE_APPEND | + SQLITE_IOCAP_SEQUENTIAL; +} + +/* Fetch a page of a memory-mapped file */ +static int memdbFetch( + sqlite3_file *pFile, + sqlite3_int64 iOfst, + int iAmt, + void **pp +){ + MemFile *p = (MemFile *)pFile; + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + return SQLITE_OK; +} + +/* Release a memory-mapped page */ +static int memdbUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage){ + MemFile *p = (MemFile *)pFile; + p->nMmap--; + return SQLITE_OK; +} + +/* +** Open an mem file handle. +*/ +static int memdbOpen( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_file *pFile, + int flags, + int *pOutFlags +){ + MemFile *p = (MemFile*)pFile; + if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ + return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFile, flags, pOutFlags); + } + memset(p, 0, sizeof(*p)); + p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE; + assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ + *pOutFlags = flags | SQLITE_OPEN_MEMORY; + p->base.pMethods = &memdb_io_methods; + return SQLITE_OK; +} + +#if 0 /* Only used to delete rollback journals, master journals, and WAL + ** files, none of which exist in memdb. So this routine is never used */ +/* +** Delete the file located at zPath. If the dirSync argument is true, +** ensure the file-system modifications are synced to disk before +** returning. +*/ +static int memdbDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + return SQLITE_IOERR_DELETE; +} +#endif + +/* +** Test for access permissions. Return true if the requested permission +** is available, or false otherwise. +** +** With memdb, no files ever exist on disk. So always return false. +*/ +static int memdbAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + *pResOut = 0; + return SQLITE_OK; +} + +/* +** Populate buffer zOut with the full canonical pathname corresponding +** to the pathname in zPath. zOut is guaranteed to point to a buffer +** of at least (INST_MAX_PATHNAME+1) bytes. +*/ +static int memdbFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, + char *zOut +){ + sqlite3_snprintf(nOut, zOut, "%s", zPath); + return SQLITE_OK; +} + +/* +** Open the dynamic library located at zPath and return a handle. +*/ +static void *memdbDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + return ORIGVFS(pVfs)->xDlOpen(ORIGVFS(pVfs), zPath); +} + +/* +** Populate the buffer zErrMsg (size nByte bytes) with a human readable +** utf-8 string describing the most recent error encountered associated +** with dynamic libraries. +*/ +static void memdbDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ + ORIGVFS(pVfs)->xDlError(ORIGVFS(pVfs), nByte, zErrMsg); +} + +/* +** Return a pointer to the symbol zSymbol in the dynamic library pHandle. +*/ +static void (*memdbDlSym(sqlite3_vfs *pVfs, void *p, const char *zSym))(void){ + return ORIGVFS(pVfs)->xDlSym(ORIGVFS(pVfs), p, zSym); +} + +/* +** Close the dynamic library handle pHandle. +*/ +static void memdbDlClose(sqlite3_vfs *pVfs, void *pHandle){ + ORIGVFS(pVfs)->xDlClose(ORIGVFS(pVfs), pHandle); +} + +/* +** Populate the buffer pointed to by zBufOut with nByte bytes of +** random data. +*/ +static int memdbRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + return ORIGVFS(pVfs)->xRandomness(ORIGVFS(pVfs), nByte, zBufOut); +} + +/* +** Sleep for nMicro microseconds. Return the number of microseconds +** actually slept. +*/ +static int memdbSleep(sqlite3_vfs *pVfs, int nMicro){ + return ORIGVFS(pVfs)->xSleep(ORIGVFS(pVfs), nMicro); +} + +#if 0 /* Never used. Modern cores only call xCurrentTimeInt64() */ +/* +** Return the current time as a Julian Day number in *pTimeOut. +*/ +static int memdbCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ + return ORIGVFS(pVfs)->xCurrentTime(ORIGVFS(pVfs), pTimeOut); +} +#endif + +static int memdbGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + return ORIGVFS(pVfs)->xGetLastError(ORIGVFS(pVfs), a, b); +} +static int memdbCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *p){ + return ORIGVFS(pVfs)->xCurrentTimeInt64(ORIGVFS(pVfs), p); +} + +/* +** Translate a database connection pointer and schema name into a +** MemFile pointer. +*/ +static MemFile *memdbFromDbSchema(sqlite3 *db, const char *zSchema){ + MemFile *p = 0; + int rc = sqlite3_file_control(db, zSchema, SQLITE_FCNTL_FILE_POINTER, &p); + if( rc ) return 0; + if( p->base.pMethods!=&memdb_io_methods ) return 0; + return p; +} + +/* +** Return the serialization of a database +*/ +SQLITE_API unsigned char *sqlite3_serialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which database within the connection */ + sqlite3_int64 *piSize, /* Write size here, if not NULL */ + unsigned int mFlags /* Maybe SQLITE_SERIALIZE_NOCOPY */ +){ + MemFile *p; + int iDb; + Btree *pBt; + sqlite3_int64 sz; + int szPage = 0; + sqlite3_stmt *pStmt = 0; + unsigned char *pOut; + char *zSql; + int rc; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; + p = memdbFromDbSchema(db, zSchema); + iDb = sqlite3FindDbName(db, zSchema); + if( piSize ) *piSize = -1; + if( iDb<0 ) return 0; + if( p ){ + if( piSize ) *piSize = p->sz; + if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ + pOut = p->aData; + }else{ + pOut = sqlite3_malloc64( p->sz ); + if( pOut ) memcpy(pOut, p->aData, p->sz); + } + return pOut; + } + pBt = db->aDb[iDb].pBt; + if( pBt==0 ) return 0; + szPage = sqlite3BtreeGetPageSize(pBt); + zSql = sqlite3_mprintf("PRAGMA \"%w\".page_count", zSchema); + rc = zSql ? sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0) : SQLITE_NOMEM; + sqlite3_free(zSql); + if( rc ) return 0; + rc = sqlite3_step(pStmt); + if( rc!=SQLITE_ROW ){ + pOut = 0; + }else{ + sz = sqlite3_column_int64(pStmt, 0)*szPage; + if( piSize ) *piSize = sz; + if( mFlags & SQLITE_SERIALIZE_NOCOPY ){ + pOut = 0; + }else{ + pOut = sqlite3_malloc64( sz ); + if( pOut ){ + int nPage = sqlite3_column_int(pStmt, 0); + Pager *pPager = sqlite3BtreePager(pBt); + int pgno; + for(pgno=1; pgno<=nPage; pgno++){ + DbPage *pPage = 0; + unsigned char *pTo = pOut + szPage*(sqlite3_int64)(pgno-1); + rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pPage, 0); + if( rc==SQLITE_OK ){ + memcpy(pTo, sqlite3PagerGetData(pPage), szPage); + }else{ + memset(pTo, 0, szPage); + } + sqlite3PagerUnref(pPage); + } + } + } + } + sqlite3_finalize(pStmt); + return pOut; +} + +/* Convert zSchema to a MemDB and initialize its content. +*/ +SQLITE_API int sqlite3_deserialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to reopen with the deserialization */ + unsigned char *pData, /* The serialized database content */ + sqlite3_int64 szDb, /* Number bytes in the deserialization */ + sqlite3_int64 szBuf, /* Total size of buffer pData[] */ + unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */ +){ + MemFile *p; + char *zSql; + sqlite3_stmt *pStmt = 0; + int rc; + int iDb; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } + if( szDb<0 ) return SQLITE_MISUSE_BKPT; + if( szBuf<0 ) return SQLITE_MISUSE_BKPT; +#endif + + sqlite3_mutex_enter(db->mutex); + if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; + iDb = sqlite3FindDbName(db, zSchema); + if( iDb<0 ){ + rc = SQLITE_ERROR; + goto end_deserialize; + } + zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema); + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + sqlite3_free(zSql); + if( rc ) goto end_deserialize; + db->init.iDb = (u8)iDb; + db->init.reopenMemdb = 1; + rc = sqlite3_step(pStmt); + db->init.reopenMemdb = 0; + if( rc!=SQLITE_DONE ){ + rc = SQLITE_ERROR; + goto end_deserialize; + } + p = memdbFromDbSchema(db, zSchema); + if( p==0 ){ + rc = SQLITE_ERROR; + }else{ + p->aData = pData; + p->sz = szDb; + p->szMax = szBuf; + p->mFlags = mFlags; + rc = SQLITE_OK; + } + +end_deserialize: + sqlite3_finalize(pStmt); + sqlite3_mutex_leave(db->mutex); + return rc; +} + +/* +** This routine is called when the extension is loaded. +** Register the new VFS. +*/ +SQLITE_PRIVATE int sqlite3MemdbInit(void){ + sqlite3_vfs *pLower = sqlite3_vfs_find(0); + int sz = pLower->szOsFile; + memdb_vfs.pAppData = pLower; + /* In all known configurations of SQLite, the size of a default + ** sqlite3_file is greater than the size of a memdb sqlite3_file. + ** Should that ever change, remove the following NEVER() */ + if( NEVER(sz<sizeof(MemFile)) ) sz = sizeof(MemFile); + memdb_vfs.szOsFile = sz; + return sqlite3_vfs_register(&memdb_vfs, 0); +} +#endif /* SQLITE_ENABLE_DESERIALIZE */ + +/************** End of memdb.c ***********************************************/ /************** Begin file bitvec.c ******************************************/ /* ** 2008 February 16 @@ -38495,13 +46383,15 @@ SQLITE_API int sqlite3_os_end(void){ ** start of a transaction, and is thus usually less than a few thousand, ** but can be as large as 2 billion for a really big database. */ +/* #include "sqliteInt.h" */ /* Size of the Bitvec structure in bytes. */ #define BITVEC_SZ 512 /* Round the union size down to the nearest pointer boundary, since that's how ** it will be aligned within the Bitvec struct. */ -#define BITVEC_USIZE (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(Bitvec*)) +#define BITVEC_USIZE \ + (((BITVEC_SZ-(3*sizeof(u32)))/sizeof(Bitvec*))*sizeof(Bitvec*)) /* Type of the array "element" for the bitmap representation. ** Should be a power of 2, and ideally, evenly divide into BITVEC_USIZE. @@ -38586,10 +46476,10 @@ SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32 iSize){ ** If p is NULL (if the bitmap has not been created) or if ** i is out of range, then return false. */ -SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){ - if( p==0 ) return 0; - if( i>p->iSize || i==0 ) return 0; +SQLITE_PRIVATE int sqlite3BitvecTestNotNull(Bitvec *p, u32 i){ + assert( p!=0 ); i--; + if( i>=p->iSize ) return 0; while( p->iDivisor ){ u32 bin = i/p->iDivisor; i = i%p->iDivisor; @@ -38609,6 +46499,9 @@ SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){ return 0; } } +SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec *p, u32 i){ + return p!=0 && sqlite3BitvecTestNotNull(p,i); +} /* ** Set the i-th bit. Return 0 on success and an error code if @@ -38633,7 +46526,7 @@ SQLITE_PRIVATE int sqlite3BitvecSet(Bitvec *p, u32 i){ i = i%p->iDivisor; if( p->u.apSub[bin]==0 ){ p->u.apSub[bin] = sqlite3BitvecCreate( p->iDivisor ); - if( p->u.apSub[bin]==0 ) return SQLITE_NOMEM; + if( p->u.apSub[bin]==0 ) return SQLITE_NOMEM_BKPT; } p = p->u.apSub[bin]; } @@ -38668,7 +46561,7 @@ bitvec_set_rehash: int rc; u32 *aiValues = sqlite3StackAllocRaw(0, sizeof(p->u.aHash)); if( aiValues==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; }else{ memcpy(aiValues, p->u.aHash, sizeof(p->u.aHash)); memset(p->u.apSub, 0, sizeof(p->u.apSub)); @@ -38749,7 +46642,7 @@ SQLITE_PRIVATE u32 sqlite3BitvecSize(Bitvec *p){ return p->iSize; } -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifndef SQLITE_UNTESTABLE /* ** Let V[] be an array of unsigned characters sufficient to hold ** up to N bits. Let I be an integer between 0 and N. 0<=I<N. @@ -38801,7 +46694,7 @@ SQLITE_PRIVATE int sqlite3BitvecBuiltinTest(int sz, int *aOp){ ** bits to act as the reference */ pBitvec = sqlite3BitvecCreate( sz ); pV = sqlite3MallocZero( (sz+7)/8 + 1 ); - pTmpSpace = sqlite3_malloc(BITVEC_SZ); + pTmpSpace = sqlite3_malloc64(BITVEC_SZ); if( pBitvec==0 || pV==0 || pTmpSpace==0 ) goto bitvec_end; /* NULL pBitvec tests */ @@ -38864,7 +46757,7 @@ bitvec_end: sqlite3BitvecDestroy(pBitvec); return rc; } -#endif /* SQLITE_OMIT_BUILTIN_TEST */ +#endif /* SQLITE_UNTESTABLE */ /************** End of bitvec.c **********************************************/ /************** Begin file pcache.c ******************************************/ @@ -38881,15 +46774,39 @@ bitvec_end: ************************************************************************* ** This file implements that page cache. */ +/* #include "sqliteInt.h" */ /* -** A complete page cache is an instance of this structure. +** A complete page cache is an instance of this structure. Every +** entry in the cache holds a single page of the database file. The +** btree layer only operates on the cached copy of the database pages. +** +** A page cache entry is "clean" if it exactly matches what is currently +** on disk. A page is "dirty" if it has been modified and needs to be +** persisted to disk. +** +** pDirty, pDirtyTail, pSynced: +** All dirty pages are linked into the doubly linked list using +** PgHdr.pDirtyNext and pDirtyPrev. The list is maintained in LRU order +** such that p was added to the list more recently than p->pDirtyNext. +** PCache.pDirty points to the first (newest) element in the list and +** pDirtyTail to the last (oldest). +** +** The PCache.pSynced variable is used to optimize searching for a dirty +** page to eject from the cache mid-transaction. It is better to eject +** a page that does not require a journal sync than one that does. +** Therefore, pSynced is maintained to that it *almost* always points +** to either the oldest page in the pDirty/pDirtyTail list that has a +** clear PGHDR_NEED_SYNC flag or to a page that is older than this one +** (so that the right page to eject can be found by following pDirtyPrev +** pointers). */ struct PCache { PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */ PgHdr *pSynced; /* Last synced page in dirty page list */ - int nRef; /* Number of referenced pages */ + int nRefSum; /* Sum of ref counts over all pages */ int szCache; /* Configured cache size */ + int szSpill; /* Size before spilling occurs */ int szPage; /* Size of every page in this cache */ int szExtra; /* Size of extra space for each page */ u8 bPurgeable; /* True if pages are on backing store */ @@ -38897,9 +46814,97 @@ struct PCache { int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */ void *pStress; /* Argument to xStress */ sqlite3_pcache *pCache; /* Pluggable cache module */ - PgHdr *pPage1; /* Reference to page 1 */ }; +/********************************** Test and Debug Logic **********************/ +/* +** Debug tracing macros. Enable by by changing the "0" to "1" and +** recompiling. +** +** When sqlite3PcacheTrace is 1, single line trace messages are issued. +** When sqlite3PcacheTrace is 2, a dump of the pcache showing all cache entries +** is displayed for many operations, resulting in a lot of output. +*/ +#if defined(SQLITE_DEBUG) && 0 + int sqlite3PcacheTrace = 2; /* 0: off 1: simple 2: cache dumps */ + int sqlite3PcacheMxDump = 9999; /* Max cache entries for pcacheDump() */ +# define pcacheTrace(X) if(sqlite3PcacheTrace){sqlite3DebugPrintf X;} + void pcacheDump(PCache *pCache){ + int N; + int i, j; + sqlite3_pcache_page *pLower; + PgHdr *pPg; + unsigned char *a; + + if( sqlite3PcacheTrace<2 ) return; + if( pCache->pCache==0 ) return; + N = sqlite3PcachePagecount(pCache); + if( N>sqlite3PcacheMxDump ) N = sqlite3PcacheMxDump; + for(i=1; i<=N; i++){ + pLower = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, i, 0); + if( pLower==0 ) continue; + pPg = (PgHdr*)pLower->pExtra; + printf("%3d: nRef %2d flgs %02x data ", i, pPg->nRef, pPg->flags); + a = (unsigned char *)pLower->pBuf; + for(j=0; j<12; j++) printf("%02x", a[j]); + printf("\n"); + if( pPg->pPage==0 ){ + sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, pLower, 0); + } + } + } + #else +# define pcacheTrace(X) +# define pcacheDump(X) +#endif + +/* +** Check invariants on a PgHdr entry. Return true if everything is OK. +** Return false if any invariant is violated. +** +** This routine is for use inside of assert() statements only. For +** example: +** +** assert( sqlite3PcachePageSanity(pPg) ); +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3PcachePageSanity(PgHdr *pPg){ + PCache *pCache; + assert( pPg!=0 ); + assert( pPg->pgno>0 || pPg->pPager==0 ); /* Page number is 1 or more */ + pCache = pPg->pCache; + assert( pCache!=0 ); /* Every page has an associated PCache */ + if( pPg->flags & PGHDR_CLEAN ){ + assert( (pPg->flags & PGHDR_DIRTY)==0 );/* Cannot be both CLEAN and DIRTY */ + assert( pCache->pDirty!=pPg ); /* CLEAN pages not on dirty list */ + assert( pCache->pDirtyTail!=pPg ); + } + /* WRITEABLE pages must also be DIRTY */ + if( pPg->flags & PGHDR_WRITEABLE ){ + assert( pPg->flags & PGHDR_DIRTY ); /* WRITEABLE implies DIRTY */ + } + /* NEED_SYNC can be set independently of WRITEABLE. This can happen, + ** for example, when using the sqlite3PagerDontWrite() optimization: + ** (1) Page X is journalled, and gets WRITEABLE and NEED_SEEK. + ** (2) Page X moved to freelist, WRITEABLE is cleared + ** (3) Page X reused, WRITEABLE is set again + ** If NEED_SYNC had been cleared in step 2, then it would not be reset + ** in step 3, and page might be written into the database without first + ** syncing the rollback journal, which might cause corruption on a power + ** loss. + ** + ** Another example is when the database page size is smaller than the + ** disk sector size. When any page of a sector is journalled, all pages + ** in that sector are marked NEED_SYNC even if they are still CLEAN, just + ** in case they are later modified, since all pages in the same sector + ** must be journalled and synced before any of those pages can be safely + ** written. + */ + return 1; +} +#endif /* SQLITE_DEBUG */ + + /********************************** Linked List Management ********************/ /* Allowed values for second argument to pcacheManageDirtyList() */ @@ -38916,17 +46921,16 @@ struct PCache { static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ PCache *p = pPage->pCache; + pcacheTrace(("%p.DIRTYLIST.%s %d\n", p, + addRemove==1 ? "REMOVE" : addRemove==2 ? "ADD" : "FRONT", + pPage->pgno)); if( addRemove & PCACHE_DIRTYLIST_REMOVE ){ assert( pPage->pDirtyNext || pPage==p->pDirtyTail ); assert( pPage->pDirtyPrev || pPage==p->pDirty ); /* Update the PCache1.pSynced variable if necessary. */ if( p->pSynced==pPage ){ - PgHdr *pSynced = pPage->pDirtyPrev; - while( pSynced && (pSynced->flags&PGHDR_NEED_SYNC) ){ - pSynced = pSynced->pDirtyPrev; - } - p->pSynced = pSynced; + p->pSynced = pPage->pDirtyPrev; } if( pPage->pDirtyNext ){ @@ -38938,19 +46942,21 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ if( pPage->pDirtyPrev ){ pPage->pDirtyPrev->pDirtyNext = pPage->pDirtyNext; }else{ + /* If there are now no dirty pages in the cache, set eCreate to 2. + ** This is an optimization that allows sqlite3PcacheFetch() to skip + ** searching for a dirty page to eject from the cache when it might + ** otherwise have to. */ assert( pPage==p->pDirty ); p->pDirty = pPage->pDirtyNext; - if( p->pDirty==0 && p->bPurgeable ){ - assert( p->eCreate==1 ); + assert( p->bPurgeable || p->eCreate==2 ); + if( p->pDirty==0 ){ /*OPTIMIZATION-IF-TRUE*/ + assert( p->bPurgeable==0 || p->eCreate==1 ); p->eCreate = 2; } } - pPage->pDirtyNext = 0; - pPage->pDirtyPrev = 0; } if( addRemove & PCACHE_DIRTYLIST_ADD ){ - assert( pPage->pDirtyNext==0 && pPage->pDirtyPrev==0 && p->pDirty!=pPage ); - + pPage->pDirtyPrev = 0; pPage->pDirtyNext = p->pDirty; if( pPage->pDirtyNext ){ assert( pPage->pDirtyNext->pDirtyPrev==0 ); @@ -38963,10 +46969,19 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ } } p->pDirty = pPage; - if( !p->pSynced && 0==(pPage->flags&PGHDR_NEED_SYNC) ){ + + /* If pSynced is NULL and this page has a clear NEED_SYNC flag, set + ** pSynced to point to it. Checking the NEED_SYNC flag is an + ** optimization, as if pSynced points to a page with the NEED_SYNC + ** flag set sqlite3PcacheFetchStress() searches through all newer + ** entries of the dirty-list for a page with NEED_SYNC clear anyway. */ + if( !p->pSynced + && 0==(pPage->flags&PGHDR_NEED_SYNC) /*OPTIMIZATION-IF-FALSE*/ + ){ p->pSynced = pPage; } } + pcacheDump(p); } /* @@ -38975,20 +46990,25 @@ static void pcacheManageDirtyList(PgHdr *pPage, u8 addRemove){ */ static void pcacheUnpin(PgHdr *p){ if( p->pCache->bPurgeable ){ - if( p->pgno==1 ){ - p->pCache->pPage1 = 0; - } + pcacheTrace(("%p.UNPIN %d\n", p->pCache, p->pgno)); sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 0); + pcacheDump(p->pCache); } } /* -** Compute the number of pages of cache requested. +** Compute the number of pages of cache requested. p->szCache is the +** cache size requested by the "PRAGMA cache_size" statement. */ static int numberOfCachePages(PCache *p){ if( p->szCache>=0 ){ + /* IMPLEMENTATION-OF: R-42059-47211 If the argument N is positive then the + ** suggested cache size is set to N. */ return p->szCache; }else{ + /* IMPLEMENTATION-OF: R-61436-13639 If the argument N is negative, then + ** the number of cache pages is adjusted to use approximately abs(N*1024) + ** bytes of memory. */ return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); } } @@ -39024,6 +47044,12 @@ SQLITE_PRIVATE int sqlite3PcacheSize(void){ return sizeof(PCache); } ** has already been allocated and is passed in as the p pointer. ** The caller discovers how much space needs to be allocated by ** calling sqlite3PcacheSize(). +** +** szExtra is some extra space allocated for each page. The first +** 8 bytes of the extra space will be zeroed as the page is allocated, +** but remaining content will be uninitialized. Though it is opaque +** to this module, the extra space really ends up being the MemPage +** structure in the pager. */ SQLITE_PRIVATE int sqlite3PcacheOpen( int szPage, /* Size of every page */ @@ -39036,11 +47062,14 @@ SQLITE_PRIVATE int sqlite3PcacheOpen( memset(p, 0, sizeof(PCache)); p->szPage = 1; p->szExtra = szExtra; + assert( szExtra>=8 ); /* First 8 bytes will be zeroed */ p->bPurgeable = bPurgeable; p->eCreate = 2; p->xStress = xStress; p->pStress = pStress; p->szCache = 100; + p->szSpill = 1; + pcacheTrace(("%p.OPEN szPage %d bPurgeable %d\n",p,szPage,bPurgeable)); return sqlite3PcacheSetPageSize(p, szPage); } @@ -39049,21 +47078,21 @@ SQLITE_PRIVATE int sqlite3PcacheOpen( ** are no outstanding page references when this function is called. */ SQLITE_PRIVATE int sqlite3PcacheSetPageSize(PCache *pCache, int szPage){ - assert( pCache->nRef==0 && pCache->pDirty==0 ); + assert( pCache->nRefSum==0 && pCache->pDirty==0 ); if( pCache->szPage ){ sqlite3_pcache *pNew; pNew = sqlite3GlobalConfig.pcache2.xCreate( szPage, pCache->szExtra + ROUND8(sizeof(PgHdr)), pCache->bPurgeable ); - if( pNew==0 ) return SQLITE_NOMEM; + if( pNew==0 ) return SQLITE_NOMEM_BKPT; sqlite3GlobalConfig.pcache2.xCachesize(pNew, numberOfCachePages(pCache)); if( pCache->pCache ){ sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); } pCache->pCache = pNew; - pCache->pPage1 = 0; pCache->szPage = szPage; + pcacheTrace(("%p.PAGESIZE %d\n",pCache,szPage)); } return SQLITE_OK; } @@ -39098,11 +47127,12 @@ SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( int createFlag /* If true, create page if it does not exist already */ ){ int eCreate; + sqlite3_pcache_page *pRes; assert( pCache!=0 ); assert( pCache->pCache!=0 ); assert( createFlag==3 || createFlag==0 ); - assert( pgno>0 ); + assert( pCache->eCreate==((pCache->bPurgeable && pCache->pDirty) ? 1 : 2) ); /* eCreate defines what to do if the page does not exist. ** 0 Do not allocate a new page. (createFlag==0) @@ -39115,12 +47145,15 @@ SQLITE_PRIVATE sqlite3_pcache_page *sqlite3PcacheFetch( assert( eCreate==0 || eCreate==1 || eCreate==2 ); assert( createFlag==0 || pCache->eCreate==eCreate ); assert( createFlag==0 || eCreate==1+(!pCache->bPurgeable||!pCache->pDirty) ); - return sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); + pRes = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); + pcacheTrace(("%p.FETCH %d%s (result: %p)\n",pCache,pgno, + createFlag?" create":"",pRes)); + return pRes; } /* ** If the sqlite3PcacheFetch() routine is unable to allocate a new -** page because new clean pages are available for reuse and the cache +** page because no clean pages are available for reuse and the cache ** size limit has been reached, then this routine can be invoked to ** try harder to allocate a page. This routine might invoke the stress ** callback to spill dirty pages to the journal. It will then try to @@ -39137,36 +47170,43 @@ SQLITE_PRIVATE int sqlite3PcacheFetchStress( PgHdr *pPg; if( pCache->eCreate==2 ) return 0; - - /* Find a dirty page to write-out and recycle. First try to find a - ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC - ** cleared), but if that is not possible settle for any other - ** unreferenced dirty page. - */ - for(pPg=pCache->pSynced; - pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC)); - pPg=pPg->pDirtyPrev - ); - pCache->pSynced = pPg; - if( !pPg ){ - for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev); - } - if( pPg ){ - int rc; + if( sqlite3PcachePagecount(pCache)>pCache->szSpill ){ + /* Find a dirty page to write-out and recycle. First try to find a + ** page that does not require a journal-sync (one with PGHDR_NEED_SYNC + ** cleared), but if that is not possible settle for any other + ** unreferenced dirty page. + ** + ** If the LRU page in the dirty list that has a clear PGHDR_NEED_SYNC + ** flag is currently referenced, then the following may leave pSynced + ** set incorrectly (pointing to other than the LRU page with NEED_SYNC + ** cleared). This is Ok, as pSynced is just an optimization. */ + for(pPg=pCache->pSynced; + pPg && (pPg->nRef || (pPg->flags&PGHDR_NEED_SYNC)); + pPg=pPg->pDirtyPrev + ); + pCache->pSynced = pPg; + if( !pPg ){ + for(pPg=pCache->pDirtyTail; pPg && pPg->nRef; pPg=pPg->pDirtyPrev); + } + if( pPg ){ + int rc; #ifdef SQLITE_LOG_CACHE_SPILL - sqlite3_log(SQLITE_FULL, - "spill page %d making room for %d - cache used: %d/%d", - pPg->pgno, pgno, - sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache), + sqlite3_log(SQLITE_FULL, + "spill page %d making room for %d - cache used: %d/%d", + pPg->pgno, pgno, + sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache), numberOfCachePages(pCache)); #endif - rc = pCache->xStress(pCache->pStress, pPg); - if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ - return rc; + pcacheTrace(("%p.SPILL %d\n",pCache,pPg->pgno)); + rc = pCache->xStress(pCache->pStress, pPg); + pcacheDump(pCache); + if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ + return rc; + } } } *ppPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, 2); - return *ppPage==0 ? SQLITE_NOMEM : SQLITE_OK; + return *ppPage==0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; } /* @@ -39187,13 +47227,14 @@ static SQLITE_NOINLINE PgHdr *pcacheFetchFinishWithInit( assert( pPage!=0 ); pPgHdr = (PgHdr*)pPage->pExtra; assert( pPgHdr->pPage==0 ); - memset(pPgHdr, 0, sizeof(PgHdr)); + memset(&pPgHdr->pDirty, 0, sizeof(PgHdr) - offsetof(PgHdr,pDirty)); pPgHdr->pPage = pPage; pPgHdr->pData = pPage->pBuf; pPgHdr->pExtra = (void *)&pPgHdr[1]; - memset(pPgHdr->pExtra, 0, pCache->szExtra); + memset(pPgHdr->pExtra, 0, 8); pPgHdr->pCache = pCache; pPgHdr->pgno = pgno; + pPgHdr->flags = PGHDR_CLEAN; return sqlite3PcacheFetchFinish(pCache,pgno,pPage); } @@ -39210,19 +47251,15 @@ SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish( ){ PgHdr *pPgHdr; - if( pPage==0 ) return 0; + assert( pPage!=0 ); pPgHdr = (PgHdr *)pPage->pExtra; if( !pPgHdr->pPage ){ return pcacheFetchFinishWithInit(pCache, pgno, pPage); } - if( 0==pPgHdr->nRef ){ - pCache->nRef++; - } + pCache->nRefSum++; pPgHdr->nRef++; - if( pgno==1 ){ - pCache->pPage1 = pPgHdr; - } + assert( sqlite3PcachePageSanity(pPgHdr) ); return pPgHdr; } @@ -39232,13 +47269,11 @@ SQLITE_PRIVATE PgHdr *sqlite3PcacheFetchFinish( */ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){ assert( p->nRef>0 ); - p->nRef--; - if( p->nRef==0 ){ - p->pCache->nRef--; - if( (p->flags&PGHDR_DIRTY)==0 ){ + p->pCache->nRefSum--; + if( (--p->nRef)==0 ){ + if( p->flags&PGHDR_CLEAN ){ pcacheUnpin(p); - }else if( p->pDirtyPrev!=0 ){ - /* Move the page to the head of the dirty list. */ + }else{ pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); } } @@ -39249,7 +47284,9 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3PcacheRelease(PgHdr *p){ */ SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){ assert(p->nRef>0); + assert( sqlite3PcachePageSanity(p) ); p->nRef++; + p->pCache->nRefSum++; } /* @@ -39259,13 +47296,11 @@ SQLITE_PRIVATE void sqlite3PcacheRef(PgHdr *p){ */ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ assert( p->nRef==1 ); + assert( sqlite3PcachePageSanity(p) ); if( p->flags&PGHDR_DIRTY ){ pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); } - p->pCache->nRef--; - if( p->pgno==1 ){ - p->pCache->pPage1 = 0; - } + p->pCache->nRefSum--; sqlite3GlobalConfig.pcache2.xUnpin(p->pCache->pCache, p->pPage, 1); } @@ -39274,11 +47309,17 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ ** make it so. */ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ - p->flags &= ~PGHDR_DONT_WRITE; assert( p->nRef>0 ); - if( 0==(p->flags & PGHDR_DIRTY) ){ - p->flags |= PGHDR_DIRTY; - pcacheManageDirtyList(p, PCACHE_DIRTYLIST_ADD); + assert( sqlite3PcachePageSanity(p) ); + if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ + p->flags &= ~PGHDR_DONT_WRITE; + if( p->flags & PGHDR_CLEAN ){ + p->flags ^= (PGHDR_DIRTY|PGHDR_CLEAN); + pcacheTrace(("%p.DIRTY %d\n",p->pCache,p->pgno)); + assert( (p->flags & (PGHDR_DIRTY|PGHDR_CLEAN))==PGHDR_DIRTY ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_ADD); + } + assert( sqlite3PcachePageSanity(p) ); } } @@ -39287,12 +47328,16 @@ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ ** make it so. */ SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){ - if( (p->flags & PGHDR_DIRTY) ){ - pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); - p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC); - if( p->nRef==0 ){ - pcacheUnpin(p); - } + assert( sqlite3PcachePageSanity(p) ); + assert( (p->flags & PGHDR_DIRTY)!=0 ); + assert( (p->flags & PGHDR_CLEAN)==0 ); + pcacheManageDirtyList(p, PCACHE_DIRTYLIST_REMOVE); + p->flags &= ~(PGHDR_DIRTY|PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + p->flags |= PGHDR_CLEAN; + pcacheTrace(("%p.CLEAN %d\n",p->pCache,p->pgno)); + assert( sqlite3PcachePageSanity(p) ); + if( p->nRef==0 ){ + pcacheUnpin(p); } } @@ -39301,11 +47346,24 @@ SQLITE_PRIVATE void sqlite3PcacheMakeClean(PgHdr *p){ */ SQLITE_PRIVATE void sqlite3PcacheCleanAll(PCache *pCache){ PgHdr *p; + pcacheTrace(("%p.CLEAN-ALL\n",pCache)); while( (p = pCache->pDirty)!=0 ){ sqlite3PcacheMakeClean(p); } } +/* +** Clear the PGHDR_NEED_SYNC and PGHDR_WRITEABLE flag from all dirty pages. +*/ +SQLITE_PRIVATE void sqlite3PcacheClearWritable(PCache *pCache){ + PgHdr *p; + pcacheTrace(("%p.CLEAR-WRITEABLE\n",pCache)); + for(p=pCache->pDirty; p; p=p->pDirtyNext){ + p->flags &= ~(PGHDR_NEED_SYNC|PGHDR_WRITEABLE); + } + pCache->pSynced = pCache->pDirtyTail; +} + /* ** Clear the PGHDR_NEED_SYNC flag from all dirty pages. */ @@ -39324,6 +47382,8 @@ SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ PCache *pCache = p->pCache; assert( p->nRef>0 ); assert( newPgno>0 ); + assert( sqlite3PcachePageSanity(p) ); + pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); p->pgno = newPgno; if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ @@ -39344,6 +47404,7 @@ SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){ if( pCache->pCache ){ PgHdr *p; PgHdr *pNext; + pcacheTrace(("%p.TRUNCATE %d\n",pCache,pgno)); for(p=pCache->pDirty; p; p=pNext){ pNext = p->pDirtyNext; /* This routine never gets call with a positive pgno except right @@ -39351,14 +47412,19 @@ SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){ ** it must be that pgno==0. */ assert( p->pgno>0 ); - if( ALWAYS(p->pgno>pgno) ){ + if( p->pgno>pgno ){ assert( p->flags&PGHDR_DIRTY ); sqlite3PcacheMakeClean(p); } } - if( pgno==0 && pCache->pPage1 ){ - memset(pCache->pPage1->pData, 0, pCache->szPage); - pgno = 1; + if( pgno==0 && pCache->nRefSum ){ + sqlite3_pcache_page *pPage1; + pPage1 = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache,1,0); + if( ALWAYS(pPage1) ){ /* Page 1 is always available in cache, because + ** pCache->nRefSum>0 */ + memset(pPage1->pBuf, 0, pCache->szPage); + pgno = 1; + } } sqlite3GlobalConfig.pcache2.xTruncate(pCache->pCache, pgno+1); } @@ -39369,6 +47435,7 @@ SQLITE_PRIVATE void sqlite3PcacheTruncate(PCache *pCache, Pgno pgno){ */ SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){ assert( pCache->pCache!=0 ); + pcacheTrace(("%p.CLOSE\n",pCache)); sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); } @@ -39381,29 +47448,31 @@ SQLITE_PRIVATE void sqlite3PcacheClear(PCache *pCache){ /* ** Merge two lists of pages connected by pDirty and in pgno order. -** Do not both fixing the pDirtyPrev pointers. +** Do not bother fixing the pDirtyPrev pointers. */ static PgHdr *pcacheMergeDirtyList(PgHdr *pA, PgHdr *pB){ PgHdr result, *pTail; pTail = &result; - while( pA && pB ){ + assert( pA!=0 && pB!=0 ); + for(;;){ if( pA->pgno<pB->pgno ){ pTail->pDirty = pA; pTail = pA; pA = pA->pDirty; + if( pA==0 ){ + pTail->pDirty = pB; + break; + } }else{ pTail->pDirty = pB; pTail = pB; pB = pB->pDirty; + if( pB==0 ){ + pTail->pDirty = pA; + break; + } } } - if( pA ){ - pTail->pDirty = pA; - }else if( pB ){ - pTail->pDirty = pB; - }else{ - pTail->pDirty = 0; - } return result.pDirty; } @@ -39444,7 +47513,8 @@ static PgHdr *pcacheSortDirtyList(PgHdr *pIn){ } p = a[0]; for(i=1; i<N_SORT_BUCKET; i++){ - p = pcacheMergeDirtyList(p, a[i]); + if( a[i]==0 ) continue; + p = p ? pcacheMergeDirtyList(p, a[i]) : a[i]; } return p; } @@ -39461,10 +47531,13 @@ SQLITE_PRIVATE PgHdr *sqlite3PcacheDirtyList(PCache *pCache){ } /* -** Return the total number of referenced pages held by the cache. +** Return the total number of references to all pages held by the cache. +** +** This is not the total number of pages referenced, but the sum of the +** reference count for all pages. */ SQLITE_PRIVATE int sqlite3PcacheRefCount(PCache *pCache){ - return pCache->nRef; + return pCache->nRefSum; } /* @@ -39501,6 +47574,25 @@ SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){ numberOfCachePages(pCache)); } +/* +** Set the suggested cache-spill value. Make no changes if if the +** argument is zero. Return the effective cache-spill size, which will +** be the larger of the szSpill and szCache. +*/ +SQLITE_PRIVATE int sqlite3PcacheSetSpillsize(PCache *p, int mxPage){ + int res; + assert( p->pCache!=0 ); + if( mxPage ){ + if( mxPage<0 ){ + mxPage = (int)((-1024*(i64)mxPage)/(p->szPage+p->szExtra)); + } + p->szSpill = mxPage; + } + res = numberOfCachePages(p); + if( res<p->szSpill ) res = p->szSpill; + return res; +} + /* ** Free up as much memory as possible from the page cache. */ @@ -39515,6 +47607,17 @@ SQLITE_PRIVATE void sqlite3PcacheShrink(PCache *pCache){ */ SQLITE_PRIVATE int sqlite3HeaderSizePcache(void){ return ROUND8(sizeof(PgHdr)); } +/* +** Return the number of dirty pages currently in the cache, as a percentage +** of the configured cache size. +*/ +SQLITE_PRIVATE int sqlite3PCachePercentDirty(PCache *pCache){ + PgHdr *pDirty; + int nDirty = 0; + int nCache = numberOfCachePages(pCache); + for(pDirty=pCache->pDirty; pDirty; pDirty=pDirty->pDirtyNext) nDirty++; + return nCache ? (int)(((i64)nDirty * 100) / nCache) : 0; +} #if defined(SQLITE_CHECK_PAGES) || defined(SQLITE_DEBUG) /* @@ -39549,14 +47652,101 @@ SQLITE_PRIVATE void sqlite3PcacheIterateDirty(PCache *pCache, void (*xIter)(PgHd ** of the SQLITE_CONFIG_PAGECACHE and sqlite3_release_memory() features. ** If the default page cache implementation is overridden, then neither of ** these two features are available. +** +** A Page cache line looks like this: +** +** ------------------------------------------------------------- +** | database page content | PgHdr1 | MemPage | PgHdr | +** ------------------------------------------------------------- +** +** The database page content is up front (so that buffer overreads tend to +** flow harmlessly into the PgHdr1, MemPage, and PgHdr extensions). MemPage +** is the extension added by the btree.c module containing information such +** as the database page number and how that database page is used. PgHdr +** is added by the pcache.c layer and contains information used to keep track +** of which pages are "dirty". PgHdr1 is an extension added by this +** module (pcache1.c). The PgHdr1 header is a subclass of sqlite3_pcache_page. +** PgHdr1 contains information needed to look up a page by its page number. +** The superclass sqlite3_pcache_page.pBuf points to the start of the +** database page content and sqlite3_pcache_page.pExtra points to PgHdr. +** +** The size of the extension (MemPage+PgHdr+PgHdr1) can be determined at +** runtime using sqlite3_config(SQLITE_CONFIG_PCACHE_HDRSZ, &size). The +** sizes of the extensions sum to 272 bytes on x64 for 3.8.10, but this +** size can vary according to architecture, compile-time options, and +** SQLite library version number. +** +** If SQLITE_PCACHE_SEPARATE_HEADER is defined, then the extension is obtained +** using a separate memory allocation from the database page content. This +** seeks to overcome the "clownshoe" problem (also called "internal +** fragmentation" in academic literature) of allocating a few bytes more +** than a power of two with the memory allocator rounding up to the next +** power of two, and leaving the rounded-up space unused. +** +** This module tracks pointers to PgHdr1 objects. Only pcache.c communicates +** with this module. Information is passed back and forth as PgHdr1 pointers. +** +** The pcache.c and pager.c modules deal pointers to PgHdr objects. +** The btree.c module deals with pointers to MemPage objects. +** +** SOURCE OF PAGE CACHE MEMORY: +** +** Memory for a page might come from any of three sources: +** +** (1) The general-purpose memory allocator - sqlite3Malloc() +** (2) Global page-cache memory provided using sqlite3_config() with +** SQLITE_CONFIG_PAGECACHE. +** (3) PCache-local bulk allocation. +** +** The third case is a chunk of heap memory (defaulting to 100 pages worth) +** that is allocated when the page cache is created. The size of the local +** bulk allocation can be adjusted using +** +** sqlite3_config(SQLITE_CONFIG_PAGECACHE, (void*)0, 0, N). +** +** If N is positive, then N pages worth of memory are allocated using a single +** sqlite3Malloc() call and that memory is used for the first N pages allocated. +** Or if N is negative, then -1024*N bytes of memory are allocated and used +** for as many pages as can be accomodated. +** +** Only one of (2) or (3) can be used. Once the memory available to (2) or +** (3) is exhausted, subsequent allocations fail over to the general-purpose +** memory allocator (1). +** +** Earlier versions of SQLite used only methods (1) and (2). But experiments +** show that method (3) with N==100 provides about a 5% performance boost for +** common workloads. */ - +/* #include "sqliteInt.h" */ typedef struct PCache1 PCache1; typedef struct PgHdr1 PgHdr1; typedef struct PgFreeslot PgFreeslot; typedef struct PGroup PGroup; +/* +** Each cache entry is represented by an instance of the following +** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of +** PgHdr1.pCache->szPage bytes is allocated directly before this structure +** in memory. +*/ +struct PgHdr1 { + sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ + unsigned int iKey; /* Key value (page number) */ + u8 isBulkLocal; /* This page from bulk local storage */ + u8 isAnchor; /* This is the PGroup.lru element */ + PgHdr1 *pNext; /* Next in hash table chain */ + PCache1 *pCache; /* Cache that currently owns this page */ + PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ + PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ +}; + +/* +** A page is pinned if it is no on the LRU list +*/ +#define PAGE_IS_PINNED(p) ((p)->pLruNext==0) +#define PAGE_IS_UNPINNED(p) ((p)->pLruNext!=0) + /* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set ** of one or more PCaches that are able to recycle each other's unpinned ** pages when they are under memory pressure. A PGroup is an instance of @@ -39584,8 +47774,8 @@ struct PGroup { unsigned int nMaxPage; /* Sum of nMax for purgeable caches */ unsigned int nMinPage; /* Sum of nMin for purgeable caches */ unsigned int mxPinned; /* nMaxpage + 10 - nMinPage */ - unsigned int nCurrentPage; /* Number of purgeable pages allocated */ - PgHdr1 *pLruHead, *pLruTail; /* LRU list of unpinned pages */ + unsigned int nPurgeable; /* Number of purgeable pages allocated */ + PgHdr1 lru; /* The beginning and end of the LRU list */ }; /* Each page cache is an instance of the following object. Every @@ -39598,13 +47788,16 @@ struct PGroup { */ struct PCache1 { /* Cache configuration parameters. Page size (szPage) and the purgeable - ** flag (bPurgeable) are set when the cache is created. nMax may be + ** flag (bPurgeable) and the pnPurgeable pointer are all set when the + ** cache is created and are never changed thereafter. nMax may be ** modified at any time by a call to the pcache1Cachesize() method. ** The PGroup mutex must be held when accessing nMax. */ PGroup *pGroup; /* PGroup this cache belongs to */ - int szPage; /* Size of allocated pages in bytes */ - int szExtra; /* Size of extra space in bytes */ + unsigned int *pnPurgeable; /* Pointer to pGroup->nPurgeable */ + int szPage; /* Size of database content section */ + int szExtra; /* sizeof(MemPage)+sizeof(PgHdr) */ + int szAlloc; /* Total size of one pcache line */ int bPurgeable; /* True if cache is purgeable */ unsigned int nMin; /* Minimum number of pages reserved */ unsigned int nMax; /* Configured "cache_size" value */ @@ -39618,27 +47811,13 @@ struct PCache1 { unsigned int nPage; /* Total number of pages in apHash */ unsigned int nHash; /* Number of slots in apHash[] */ PgHdr1 **apHash; /* Hash table for fast lookup by key */ + PgHdr1 *pFree; /* List of unused pcache-local pages */ + void *pBulk; /* Bulk memory used by pcache-local */ }; /* -** Each cache entry is represented by an instance of the following -** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of -** PgHdr1.pCache->szPage bytes is allocated directly before this structure -** in memory. -*/ -struct PgHdr1 { - sqlite3_pcache_page page; - unsigned int iKey; /* Key value (page number) */ - u8 isPinned; /* Page in use, not on the LRU list */ - PgHdr1 *pNext; /* Next in hash table chain */ - PCache1 *pCache; /* Cache that currently owns this page */ - PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ - PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ -}; - -/* -** Free slots in the allocator used to divide up the buffer provided using -** the SQLITE_CONFIG_PAGECACHE mechanism. +** Free slots in the allocator used to divide up the global page cache +** buffer provided using the SQLITE_CONFIG_PAGECACHE mechanism. */ struct PgFreeslot { PgFreeslot *pNext; /* Next free slot */ @@ -39656,10 +47835,12 @@ static SQLITE_WSD struct PCacheGlobal { ** The nFreeSlot and pFree values do require mutex protection. */ int isInit; /* True if initialized */ + int separateCache; /* Use a new PGroup for each PCache */ + int nInitPage; /* Initial bulk allocation size */ int szSlot; /* Size of each free slot */ int nSlot; /* The number of pcache slots */ int nReserve; /* Try to keep nFreeSlot above this */ - void *pStart, *pEnd; /* Bounds of pagecache malloc range */ + void *pStart, *pEnd; /* Bounds of global page cache memory */ /* Above requires no mutex. Use mutex below for variable that follow. */ sqlite3_mutex *mutex; /* Mutex for accessing the following: */ PgFreeslot *pFree; /* Free page blocks */ @@ -39681,12 +47862,20 @@ static SQLITE_WSD struct PCacheGlobal { /* ** Macros to enter and leave the PCache LRU mutex. */ -#define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) -#define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) +#if !defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0 +# define pcache1EnterMutex(X) assert((X)->mutex==0) +# define pcache1LeaveMutex(X) assert((X)->mutex==0) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 0 +#else +# define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) +# define pcache1LeaveMutex(X) sqlite3_mutex_leave((X)->mutex) +# define PCACHE1_MIGHT_USE_GROUP_MUTEX 1 +#endif /******************************************************************************/ /******** Page Allocation/SQLITE_CONFIG_PCACHE Related Functions **************/ + /* ** This function is called during initialization if a static buffer is ** supplied to use for the page-cache by passing the SQLITE_CONFIG_PAGECACHE @@ -39699,6 +47888,8 @@ static SQLITE_WSD struct PCacheGlobal { SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){ if( pcache1.isInit ){ PgFreeslot *p; + if( pBuf==0 ) sz = n = 0; + if( n==0 ) sz = 0; sz = ROUNDDOWN8(sz); pcache1.szSlot = sz; pcache1.nSlot = pcache1.nFreeSlot = n; @@ -39716,6 +47907,43 @@ SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){ } } +/* +** Try to initialize the pCache->pFree and pCache->pBulk fields. Return +** true if pCache->pFree ends up containing one or more free pages. +*/ +static int pcache1InitBulk(PCache1 *pCache){ + i64 szBulk; + char *zBulk; + if( pcache1.nInitPage==0 ) return 0; + /* Do not bother with a bulk allocation if the cache size very small */ + if( pCache->nMax<3 ) return 0; + sqlite3BeginBenignMalloc(); + if( pcache1.nInitPage>0 ){ + szBulk = pCache->szAlloc * (i64)pcache1.nInitPage; + }else{ + szBulk = -1024 * (i64)pcache1.nInitPage; + } + if( szBulk > pCache->szAlloc*(i64)pCache->nMax ){ + szBulk = pCache->szAlloc*(i64)pCache->nMax; + } + zBulk = pCache->pBulk = sqlite3Malloc( szBulk ); + sqlite3EndBenignMalloc(); + if( zBulk ){ + int nBulk = sqlite3MallocSize(zBulk)/pCache->szAlloc; + do{ + PgHdr1 *pX = (PgHdr1*)&zBulk[pCache->szPage]; + pX->page.pBuf = zBulk; + pX->page.pExtra = &pX[1]; + pX->isBulkLocal = 1; + pX->isAnchor = 0; + pX->pNext = pCache->pFree; + pCache->pFree = pX; + zBulk += pCache->szAlloc; + }while( --nBulk ); + } + return pCache->pFree!=0; +} + /* ** Malloc function used within this file to allocate space from the buffer ** configured using sqlite3_config(SQLITE_CONFIG_PAGECACHE) option. If no @@ -39728,7 +47956,6 @@ SQLITE_PRIVATE void sqlite3PCacheBufferSetup(void *pBuf, int sz, int n){ static void *pcache1Alloc(int nByte){ void *p = 0; assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); - sqlite3StatusSet(SQLITE_STATUS_PAGECACHE_SIZE, nByte); if( nByte<=pcache1.szSlot ){ sqlite3_mutex_enter(pcache1.mutex); p = (PgHdr1 *)pcache1.pFree; @@ -39737,7 +47964,8 @@ static void *pcache1Alloc(int nByte){ pcache1.nFreeSlot--; pcache1.bUnderPressure = pcache1.nFreeSlot<pcache1.nReserve; assert( pcache1.nFreeSlot>=0 ); - sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_USED, 1); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_USED, 1); } sqlite3_mutex_leave(pcache1.mutex); } @@ -39750,7 +47978,8 @@ static void *pcache1Alloc(int nByte){ if( p ){ int sz = sqlite3MallocSize(p); sqlite3_mutex_enter(pcache1.mutex); - sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz); + sqlite3StatusHighwater(SQLITE_STATUS_PAGECACHE_SIZE, nByte); + sqlite3StatusUp(SQLITE_STATUS_PAGECACHE_OVERFLOW, sz); sqlite3_mutex_leave(pcache1.mutex); } #endif @@ -39762,13 +47991,12 @@ static void *pcache1Alloc(int nByte){ /* ** Free an allocated buffer obtained from pcache1Alloc(). */ -static int pcache1Free(void *p){ - int nFreed = 0; - if( p==0 ) return 0; - if( p>=pcache1.pStart && p<pcache1.pEnd ){ +static void pcache1Free(void *p){ + if( p==0 ) return; + if( SQLITE_WITHIN(p, pcache1.pStart, pcache1.pEnd) ){ PgFreeslot *pSlot; sqlite3_mutex_enter(pcache1.mutex); - sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_USED, -1); + sqlite3StatusDown(SQLITE_STATUS_PAGECACHE_USED, 1); pSlot = (PgFreeslot*)p; pSlot->pNext = pcache1.pFree; pcache1.pFree = pSlot; @@ -39779,15 +48007,17 @@ static int pcache1Free(void *p){ }else{ assert( sqlite3MemdebugHasType(p, MEMTYPE_PCACHE) ); sqlite3MemdebugSetType(p, MEMTYPE_HEAP); - nFreed = sqlite3MallocSize(p); #ifndef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS - sqlite3_mutex_enter(pcache1.mutex); - sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, -nFreed); - sqlite3_mutex_leave(pcache1.mutex); + { + int nFreed = 0; + nFreed = sqlite3MallocSize(p); + sqlite3_mutex_enter(pcache1.mutex); + sqlite3StatusDown(SQLITE_STATUS_PAGECACHE_OVERFLOW, nFreed); + sqlite3_mutex_leave(pcache1.mutex); + } #endif sqlite3_free(p); } - return nFreed; } #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT @@ -39811,59 +48041,69 @@ static int pcache1MemSize(void *p){ /* ** Allocate a new page object initially associated with cache pCache. */ -static PgHdr1 *pcache1AllocPage(PCache1 *pCache){ +static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ PgHdr1 *p = 0; void *pPg; - /* The group mutex must be released before pcache1Alloc() is called. This - ** is because it may call sqlite3_release_memory(), which assumes that - ** this mutex is not held. */ assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); - pcache1LeaveMutex(pCache->pGroup); -#ifdef SQLITE_PCACHE_SEPARATE_HEADER - pPg = pcache1Alloc(pCache->szPage); - p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); - if( !pPg || !p ){ - pcache1Free(pPg); - sqlite3_free(p); - pPg = 0; - } -#else - pPg = pcache1Alloc(ROUND8(sizeof(PgHdr1)) + pCache->szPage + pCache->szExtra); - p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; + if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ + p = pCache->pFree; + pCache->pFree = p->pNext; + p->pNext = 0; + }else{ +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + /* The group mutex must be released before pcache1Alloc() is called. This + ** is because it might call sqlite3_release_memory(), which assumes that + ** this mutex is not held. */ + assert( pcache1.separateCache==0 ); + assert( pCache->pGroup==&pcache1.grp ); + pcache1LeaveMutex(pCache->pGroup); #endif - pcache1EnterMutex(pCache->pGroup); - - if( pPg ){ + if( benignMalloc ){ sqlite3BeginBenignMalloc(); } +#ifdef SQLITE_PCACHE_SEPARATE_HEADER + pPg = pcache1Alloc(pCache->szPage); + p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); + if( !pPg || !p ){ + pcache1Free(pPg); + sqlite3_free(p); + pPg = 0; + } +#else + pPg = pcache1Alloc(pCache->szAlloc); + p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; +#endif + if( benignMalloc ){ sqlite3EndBenignMalloc(); } +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT + pcache1EnterMutex(pCache->pGroup); +#endif + if( pPg==0 ) return 0; p->page.pBuf = pPg; p->page.pExtra = &p[1]; - if( pCache->bPurgeable ){ - pCache->pGroup->nCurrentPage++; - } - return p; + p->isBulkLocal = 0; + p->isAnchor = 0; } - return 0; + (*pCache->pnPurgeable)++; + return p; } /* ** Free a page object allocated by pcache1AllocPage(). -** -** The pointer is allowed to be NULL, which is prudent. But it turns out -** that the current implementation happens to never call this routine -** with a NULL pointer, so we mark the NULL test with ALWAYS(). */ static void pcache1FreePage(PgHdr1 *p){ - if( ALWAYS(p) ){ - PCache1 *pCache = p->pCache; - assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) ); + PCache1 *pCache; + assert( p!=0 ); + pCache = p->pCache; + assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) ); + if( p->isBulkLocal ){ + p->pNext = pCache->pFree; + pCache->pFree = p; + }else{ pcache1Free(p->page.pBuf); #ifdef SQLITE_PCACHE_SEPARATE_HEADER sqlite3_free(p); #endif - if( pCache->bPurgeable ){ - pCache->pGroup->nCurrentPage--; - } } + (*pCache->pnPurgeable)--; } /* @@ -39957,41 +48197,31 @@ static void pcache1ResizeHash(PCache1 *p){ ** ** The PGroup mutex must be held when this function is called. */ -static void pcache1PinPage(PgHdr1 *pPage){ - PCache1 *pCache; - PGroup *pGroup; - +static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ assert( pPage!=0 ); - assert( pPage->isPinned==0 ); - pCache = pPage->pCache; - pGroup = pCache->pGroup; - assert( pPage->pLruNext || pPage==pGroup->pLruTail ); - assert( pPage->pLruPrev || pPage==pGroup->pLruHead ); - assert( sqlite3_mutex_held(pGroup->mutex) ); - if( pPage->pLruPrev ){ - pPage->pLruPrev->pLruNext = pPage->pLruNext; - }else{ - pGroup->pLruHead = pPage->pLruNext; - } - if( pPage->pLruNext ){ - pPage->pLruNext->pLruPrev = pPage->pLruPrev; - }else{ - pGroup->pLruTail = pPage->pLruPrev; - } + assert( PAGE_IS_UNPINNED(pPage) ); + assert( pPage->pLruNext ); + assert( pPage->pLruPrev ); + assert( sqlite3_mutex_held(pPage->pCache->pGroup->mutex) ); + pPage->pLruPrev->pLruNext = pPage->pLruNext; + pPage->pLruNext->pLruPrev = pPage->pLruPrev; pPage->pLruNext = 0; pPage->pLruPrev = 0; - pPage->isPinned = 1; - pCache->nRecyclable--; + assert( pPage->isAnchor==0 ); + assert( pPage->pCache->pGroup->lru.isAnchor==1 ); + pPage->pCache->nRecyclable--; + return pPage; } /* ** Remove the page supplied as an argument from the hash table ** (PCache1.apHash structure) that it is currently stored in. +** Also free the page if freePage is true. ** ** The PGroup mutex must be held when this function is called. */ -static void pcache1RemoveFromHash(PgHdr1 *pPage){ +static void pcache1RemoveFromHash(PgHdr1 *pPage, int freeFlag){ unsigned int h; PCache1 *pCache = pPage->pCache; PgHdr1 **pp; @@ -40002,21 +48232,28 @@ static void pcache1RemoveFromHash(PgHdr1 *pPage){ *pp = (*pp)->pNext; pCache->nPage--; + if( freeFlag ) pcache1FreePage(pPage); } /* ** If there are currently more than nMaxPage pages allocated, try ** to recycle pages to reduce the number allocated to nMaxPage. */ -static void pcache1EnforceMaxPage(PGroup *pGroup){ +static void pcache1EnforceMaxPage(PCache1 *pCache){ + PGroup *pGroup = pCache->pGroup; + PgHdr1 *p; assert( sqlite3_mutex_held(pGroup->mutex) ); - while( pGroup->nCurrentPage>pGroup->nMaxPage && pGroup->pLruTail ){ - PgHdr1 *p = pGroup->pLruTail; + while( pGroup->nPurgeable>pGroup->nMaxPage + && (p=pGroup->lru.pLruPrev)->isAnchor==0 + ){ assert( p->pCache->pGroup==pGroup ); - assert( p->isPinned==0 ); + assert( PAGE_IS_UNPINNED(p) ); pcache1PinPage(p); - pcache1RemoveFromHash(p); - pcache1FreePage(p); + pcache1RemoveFromHash(p, 1); + } + if( pCache->nPage==0 && pCache->pBulk ){ + sqlite3_free(pCache->pBulk); + pCache->pBulk = pCache->pFree = 0; } } @@ -40031,25 +48268,45 @@ static void pcache1TruncateUnsafe( PCache1 *pCache, /* The cache to truncate */ unsigned int iLimit /* Drop pages with this pgno or larger */ ){ - TESTONLY( unsigned int nPage = 0; ) /* To assert pCache->nPage is correct */ - unsigned int h; + TESTONLY( int nPage = 0; ) /* To assert pCache->nPage is correct */ + unsigned int h, iStop; assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); - for(h=0; h<pCache->nHash; h++){ - PgHdr1 **pp = &pCache->apHash[h]; + assert( pCache->iMaxKey >= iLimit ); + assert( pCache->nHash > 0 ); + if( pCache->iMaxKey - iLimit < pCache->nHash ){ + /* If we are just shaving the last few pages off the end of the + ** cache, then there is no point in scanning the entire hash table. + ** Only scan those hash slots that might contain pages that need to + ** be removed. */ + h = iLimit % pCache->nHash; + iStop = pCache->iMaxKey % pCache->nHash; + TESTONLY( nPage = -10; ) /* Disable the pCache->nPage validity check */ + }else{ + /* This is the general case where many pages are being removed. + ** It is necessary to scan the entire hash table */ + h = pCache->nHash/2; + iStop = h - 1; + } + for(;;){ + PgHdr1 **pp; PgHdr1 *pPage; + assert( h<pCache->nHash ); + pp = &pCache->apHash[h]; while( (pPage = *pp)!=0 ){ if( pPage->iKey>=iLimit ){ pCache->nPage--; *pp = pPage->pNext; - if( !pPage->isPinned ) pcache1PinPage(pPage); + if( PAGE_IS_UNPINNED(pPage) ) pcache1PinPage(pPage); pcache1FreePage(pPage); }else{ pp = &pPage->pNext; - TESTONLY( nPage++; ) + TESTONLY( if( nPage>=0 ) nPage++; ) } } + if( h==iStop ) break; + h = (h+1) % pCache->nHash; } - assert( pCache->nPage==nPage ); + assert( nPage<0 || pCache->nPage==(unsigned)nPage ); } /******************************************************************************/ @@ -40062,9 +48319,44 @@ static int pcache1Init(void *NotUsed){ UNUSED_PARAMETER(NotUsed); assert( pcache1.isInit==0 ); memset(&pcache1, 0, sizeof(pcache1)); + + + /* + ** The pcache1.separateCache variable is true if each PCache has its own + ** private PGroup (mode-1). pcache1.separateCache is false if the single + ** PGroup in pcache1.grp is used for all page caches (mode-2). + ** + ** * Always use a unified cache (mode-2) if ENABLE_MEMORY_MANAGEMENT + ** + ** * Use a unified cache in single-threaded applications that have + ** configured a start-time buffer for use as page-cache memory using + ** sqlite3_config(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N) with non-NULL + ** pBuf argument. + ** + ** * Otherwise use separate caches (mode-1) + */ +#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) + pcache1.separateCache = 0; +#elif SQLITE_THREADSAFE + pcache1.separateCache = sqlite3GlobalConfig.pPage==0 + || sqlite3GlobalConfig.bCoreMutex>0; +#else + pcache1.separateCache = sqlite3GlobalConfig.pPage==0; +#endif + +#if SQLITE_THREADSAFE if( sqlite3GlobalConfig.bCoreMutex ){ - pcache1.grp.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_LRU); - pcache1.mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PMEM); + pcache1.grp.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_LRU); + pcache1.mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_PMEM); + } +#endif + if( pcache1.separateCache + && sqlite3GlobalConfig.nPage!=0 + && sqlite3GlobalConfig.pPage==0 + ){ + pcache1.nInitPage = sqlite3GlobalConfig.nPage; + }else{ + pcache1.nInitPage = 0; } pcache1.grp.mxPinned = 10; pcache1.isInit = 1; @@ -40095,39 +48387,26 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ PGroup *pGroup; /* The group the new page cache will belong to */ int sz; /* Bytes of memory required to allocate the new cache */ - /* - ** The separateCache variable is true if each PCache has its own private - ** PGroup. In other words, separateCache is true for mode (1) where no - ** mutexing is required. - ** - ** * Always use a unified cache (mode-2) if ENABLE_MEMORY_MANAGEMENT - ** - ** * Always use a unified cache in single-threaded applications - ** - ** * Otherwise (if multi-threaded and ENABLE_MEMORY_MANAGEMENT is off) - ** use separate caches (mode-1) - */ -#if defined(SQLITE_ENABLE_MEMORY_MANAGEMENT) || SQLITE_THREADSAFE==0 - const int separateCache = 0; -#else - int separateCache = sqlite3GlobalConfig.bCoreMutex>0; -#endif - assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 ); assert( szExtra < 300 ); - sz = sizeof(PCache1) + sizeof(PGroup)*separateCache; + sz = sizeof(PCache1) + sizeof(PGroup)*pcache1.separateCache; pCache = (PCache1 *)sqlite3MallocZero(sz); if( pCache ){ - if( separateCache ){ + if( pcache1.separateCache ){ pGroup = (PGroup*)&pCache[1]; pGroup->mxPinned = 10; }else{ pGroup = &pcache1.grp; } + if( pGroup->lru.isAnchor==0 ){ + pGroup->lru.isAnchor = 1; + pGroup->lru.pLruPrev = pGroup->lru.pLruNext = &pGroup->lru; + } pCache->pGroup = pGroup; pCache->szPage = szPage; pCache->szExtra = szExtra; + pCache->szAlloc = szPage + szExtra + ROUND8(sizeof(PgHdr1)); pCache->bPurgeable = (bPurgeable ? 1 : 0); pcache1EnterMutex(pGroup); pcache1ResizeHash(pCache); @@ -40135,6 +48414,10 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pCache->nMin = 10; pGroup->nMinPage += pCache->nMin; pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; + pCache->pnPurgeable = &pGroup->nPurgeable; + }else{ + static unsigned int dummyCurrentPage; + pCache->pnPurgeable = &dummyCurrentPage; } pcache1LeaveMutex(pGroup); if( pCache->nHash==0 ){ @@ -40159,7 +48442,7 @@ static void pcache1Cachesize(sqlite3_pcache *p, int nMax){ pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pCache->nMax = nMax; pCache->n90pct = pCache->nMax*9/10; - pcache1EnforceMaxPage(pGroup); + pcache1EnforceMaxPage(pCache); pcache1LeaveMutex(pGroup); } } @@ -40177,7 +48460,7 @@ static void pcache1Shrink(sqlite3_pcache *p){ pcache1EnterMutex(pGroup); savedMaxPage = pGroup->nMaxPage; pGroup->nMaxPage = 0; - pcache1EnforceMaxPage(pGroup); + pcache1EnforceMaxPage(pCache); pGroup->nMaxPage = savedMaxPage; pcache1LeaveMutex(pGroup); } @@ -40230,30 +48513,21 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( assert( pCache->nHash>0 && pCache->apHash ); /* Step 4. Try to recycle a page. */ - if( pCache->bPurgeable && pGroup->pLruTail && ( - (pCache->nPage+1>=pCache->nMax) - || pGroup->nCurrentPage>=pGroup->nMaxPage - || pcache1UnderMemoryPressure(pCache) - )){ + if( pCache->bPurgeable + && !pGroup->lru.pLruPrev->isAnchor + && ((pCache->nPage+1>=pCache->nMax) || pcache1UnderMemoryPressure(pCache)) + ){ PCache1 *pOther; - pPage = pGroup->pLruTail; - assert( pPage->isPinned==0 ); - pcache1RemoveFromHash(pPage); + pPage = pGroup->lru.pLruPrev; + assert( PAGE_IS_UNPINNED(pPage) ); + pcache1RemoveFromHash(pPage, 0); pcache1PinPage(pPage); pOther = pPage->pCache; - - /* We want to verify that szPage and szExtra are the same for pOther - ** and pCache. Assert that we can verify this by comparing sums. */ - assert( (pCache->szPage & (pCache->szPage-1))==0 && pCache->szPage>=512 ); - assert( pCache->szExtra<512 ); - assert( (pOther->szPage & (pOther->szPage-1))==0 && pOther->szPage>=512 ); - assert( pOther->szExtra<512 ); - - if( pOther->szPage+pOther->szExtra != pCache->szPage+pCache->szExtra ){ + if( pOther->szAlloc != pCache->szAlloc ){ pcache1FreePage(pPage); pPage = 0; }else{ - pGroup->nCurrentPage -= (pOther->bPurgeable - pCache->bPurgeable); + pGroup->nPurgeable -= (pOther->bPurgeable - pCache->bPurgeable); } } @@ -40261,9 +48535,7 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** attempt to allocate a new one. */ if( !pPage ){ - if( createFlag==1 ) sqlite3BeginBenignMalloc(); - pPage = pcache1AllocPage(pCache); - if( createFlag==1 ) sqlite3EndBenignMalloc(); + pPage = pcache1AllocPage(pCache, createFlag==1); } if( pPage ){ @@ -40274,7 +48546,6 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( pPage->pCache = pCache; pPage->pLruPrev = 0; pPage->pLruNext = 0; - pPage->isPinned = 1; *(void **)pPage->page.pExtra = 0; pCache->apHash[h] = pPage; if( iKey>pCache->iMaxKey ){ @@ -40337,8 +48608,13 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( ** proceed to step 5. ** ** 5. Otherwise, allocate and return a new page buffer. +** +** There are two versions of this routine. pcache1FetchWithMutex() is +** the general case. pcache1FetchNoMutex() is a faster implementation for +** the common case where pGroup->mutex is NULL. The pcache1Fetch() wrapper +** invokes the appropriate routine. */ -static sqlite3_pcache_page *pcache1Fetch( +static PgHdr1 *pcache1FetchNoMutex( sqlite3_pcache *p, unsigned int iKey, int createFlag @@ -40346,28 +48622,66 @@ static sqlite3_pcache_page *pcache1Fetch( PCache1 *pCache = (PCache1 *)p; PgHdr1 *pPage = 0; + /* Step 1: Search the hash table for an existing entry. */ + pPage = pCache->apHash[iKey % pCache->nHash]; + while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; } + + /* Step 2: If the page was found in the hash table, then return it. + ** If the page was not in the hash table and createFlag is 0, abort. + ** Otherwise (page not in hash and createFlag!=0) continue with + ** subsequent steps to try to create the page. */ + if( pPage ){ + if( PAGE_IS_UNPINNED(pPage) ){ + return pcache1PinPage(pPage); + }else{ + return pPage; + } + }else if( createFlag ){ + /* Steps 3, 4, and 5 implemented by this subroutine */ + return pcache1FetchStage2(pCache, iKey, createFlag); + }else{ + return 0; + } +} +#if PCACHE1_MIGHT_USE_GROUP_MUTEX +static PgHdr1 *pcache1FetchWithMutex( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ + PCache1 *pCache = (PCache1 *)p; + PgHdr1 *pPage; + + pcache1EnterMutex(pCache->pGroup); + pPage = pcache1FetchNoMutex(p, iKey, createFlag); + assert( pPage==0 || pCache->iMaxKey>=iKey ); + pcache1LeaveMutex(pCache->pGroup); + return pPage; +} +#endif +static sqlite3_pcache_page *pcache1Fetch( + sqlite3_pcache *p, + unsigned int iKey, + int createFlag +){ +#if PCACHE1_MIGHT_USE_GROUP_MUTEX || defined(SQLITE_DEBUG) + PCache1 *pCache = (PCache1 *)p; +#endif + assert( offsetof(PgHdr1,page)==0 ); assert( pCache->bPurgeable || createFlag!=1 ); assert( pCache->bPurgeable || pCache->nMin==0 ); assert( pCache->bPurgeable==0 || pCache->nMin==10 ); assert( pCache->nMin==0 || pCache->bPurgeable ); assert( pCache->nHash>0 ); - pcache1EnterMutex(pCache->pGroup); - - /* Step 1: Search the hash table for an existing entry. */ - pPage = pCache->apHash[iKey % pCache->nHash]; - while( pPage && pPage->iKey!=iKey ){ pPage = pPage->pNext; } - - /* Step 2: Abort if no existing page is found and createFlag is 0 */ - if( pPage ){ - if( !pPage->isPinned ) pcache1PinPage(pPage); - }else if( createFlag ){ - /* Steps 3, 4, and 5 implemented by this subroutine */ - pPage = pcache1FetchStage2(pCache, iKey, createFlag); +#if PCACHE1_MIGHT_USE_GROUP_MUTEX + if( pCache->pGroup->mutex ){ + return (sqlite3_pcache_page*)pcache1FetchWithMutex(p, iKey, createFlag); + }else +#endif + { + return (sqlite3_pcache_page*)pcache1FetchNoMutex(p, iKey, createFlag); } - assert( pPage==0 || pCache->iMaxKey>=iKey ); - pcache1LeaveMutex(pCache->pGroup); - return (sqlite3_pcache_page*)pPage; } @@ -40392,24 +48706,17 @@ static void pcache1Unpin( ** part of the PGroup LRU list. */ assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); - assert( pGroup->pLruHead!=pPage && pGroup->pLruTail!=pPage ); - assert( pPage->isPinned==1 ); + assert( PAGE_IS_PINNED(pPage) ); - if( reuseUnlikely || pGroup->nCurrentPage>pGroup->nMaxPage ){ - pcache1RemoveFromHash(pPage); - pcache1FreePage(pPage); + if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ + pcache1RemoveFromHash(pPage, 1); }else{ /* Add the page to the PGroup LRU list. */ - if( pGroup->pLruHead ){ - pGroup->pLruHead->pLruPrev = pPage; - pPage->pLruNext = pGroup->pLruHead; - pGroup->pLruHead = pPage; - }else{ - pGroup->pLruTail = pPage; - pGroup->pLruHead = pPage; - } + PgHdr1 **ppFirst = &pGroup->lru.pLruNext; + pPage->pLruPrev = &pGroup->lru; + (pPage->pLruNext = *ppFirst)->pLruPrev = pPage; + *ppFirst = pPage; pCache->nRecyclable++; - pPage->isPinned = 0; } pcache1LeaveMutex(pCache->pGroup); @@ -40478,14 +48785,15 @@ static void pcache1Destroy(sqlite3_pcache *p){ PGroup *pGroup = pCache->pGroup; assert( pCache->bPurgeable || (pCache->nMax==0 && pCache->nMin==0) ); pcache1EnterMutex(pGroup); - pcache1TruncateUnsafe(pCache, 0); + if( pCache->nPage ) pcache1TruncateUnsafe(pCache, 0); assert( pGroup->nMaxPage >= pCache->nMax ); pGroup->nMaxPage -= pCache->nMax; assert( pGroup->nMinPage >= pCache->nMin ); pGroup->nMinPage -= pCache->nMin; pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; - pcache1EnforceMaxPage(pGroup); + pcache1EnforceMaxPage(pCache); pcache1LeaveMutex(pGroup); + sqlite3_free(pCache->pBulk); sqlite3_free(pCache->apHash); sqlite3_free(pCache); } @@ -40519,6 +48827,14 @@ SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){ */ SQLITE_PRIVATE int sqlite3HeaderSizePcache1(void){ return ROUND8(sizeof(PgHdr1)); } +/* +** Return the global mutex used by this PCACHE implementation. The +** sqlite3_status() routine needs access to this mutex. +*/ +SQLITE_PRIVATE sqlite3_mutex *sqlite3Pcache1Mutex(void){ + return pcache1.mutex; +} + #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT /* ** This function is called to free superfluous dynamically allocated memory @@ -40533,18 +48849,20 @@ SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int nReq){ int nFree = 0; assert( sqlite3_mutex_notheld(pcache1.grp.mutex) ); assert( sqlite3_mutex_notheld(pcache1.mutex) ); - if( pcache1.pStart==0 ){ + if( sqlite3GlobalConfig.pPage==0 ){ PgHdr1 *p; pcache1EnterMutex(&pcache1.grp); - while( (nReq<0 || nFree<nReq) && ((p=pcache1.grp.pLruTail)!=0) ){ + while( (nReq<0 || nFree<nReq) + && (p=pcache1.grp.lru.pLruPrev)!=0 + && p->isAnchor==0 + ){ nFree += pcache1MemSize(p->page.pBuf); #ifdef SQLITE_PCACHE_SEPARATE_HEADER nFree += sqlite3MemSize(p); #endif - assert( p->isPinned==0 ); + assert( PAGE_IS_UNPINNED(p) ); pcache1PinPage(p); - pcache1RemoveFromHash(p); - pcache1FreePage(p); + pcache1RemoveFromHash(p, 1); } pcache1LeaveMutex(&pcache1.grp); } @@ -40565,11 +48883,11 @@ SQLITE_PRIVATE void sqlite3PcacheStats( ){ PgHdr1 *p; int nRecyclable = 0; - for(p=pcache1.grp.pLruHead; p; p=p->pLruNext){ - assert( p->isPinned==0 ); + for(p=pcache1.grp.lru.pLruNext; p && !p->isAnchor; p=p->pLruNext){ + assert( PAGE_IS_UNPINNED(p) ); nRecyclable++; } - *pnCurrent = pcache1.grp.nCurrentPage; + *pnCurrent = pcache1.grp.nPurgeable; *pnMax = (int)pcache1.grp.nMaxPage; *pnMin = (int)pcache1.grp.nMinPage; *pnRecyclable = nRecyclable; @@ -40637,9 +48955,11 @@ SQLITE_PRIVATE void sqlite3PcacheStats( ** of the first SMALLEST is O(NlogN). Second and subsequent SMALLEST ** primitives are constant time. The cost of DESTROY is O(N). ** -** There is an added cost of O(N) when switching between TEST and -** SMALLEST primitives. +** TEST and SMALLEST may not be used by the same RowSet. This used to +** be possible, but the feature was not used, so it was removed in order +** to simplify the code. */ +/* #include "sqliteInt.h" */ /* @@ -40758,9 +49078,11 @@ SQLITE_PRIVATE void sqlite3RowSetClear(RowSet *p){ */ static struct RowSetEntry *rowSetEntryAlloc(RowSet *p){ assert( p!=0 ); - if( p->nFresh==0 ){ + if( p->nFresh==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* We could allocate a fresh RowSetEntry each time one is needed, but it + ** is more efficient to pull a preallocated entry from the pool */ struct RowSetChunk *pNew; - pNew = sqlite3DbMallocRaw(p->db, sizeof(*pNew)); + pNew = sqlite3DbMallocRawNN(p->db, sizeof(*pNew)); if( pNew==0 ){ return 0; } @@ -40792,7 +49114,9 @@ SQLITE_PRIVATE void sqlite3RowSetInsert(RowSet *p, i64 rowid){ pEntry->pRight = 0; pLast = p->pLast; if( pLast ){ - if( (p->rsFlags & ROWSET_SORTED)!=0 && rowid<=pLast->v ){ + if( rowid<=pLast->v ){ /*OPTIMIZATION-IF-FALSE*/ + /* Avoid unnecessary sorts by preserving the ROWSET_SORTED flags + ** where possible */ p->rsFlags &= ~ROWSET_SORTED; } pLast->pRight = pEntry; @@ -40816,28 +49140,26 @@ static struct RowSetEntry *rowSetEntryMerge( struct RowSetEntry *pTail; pTail = &head; - while( pA && pB ){ + assert( pA!=0 && pB!=0 ); + for(;;){ assert( pA->pRight==0 || pA->v<=pA->pRight->v ); assert( pB->pRight==0 || pB->v<=pB->pRight->v ); - if( pA->v<pB->v ){ - pTail->pRight = pA; + if( pA->v<=pB->v ){ + if( pA->v<pB->v ) pTail = pTail->pRight = pA; pA = pA->pRight; - pTail = pTail->pRight; - }else if( pB->v<pA->v ){ - pTail->pRight = pB; - pB = pB->pRight; - pTail = pTail->pRight; + if( pA==0 ){ + pTail->pRight = pB; + break; + } }else{ - pA = pA->pRight; + pTail = pTail->pRight = pB; + pB = pB->pRight; + if( pB==0 ){ + pTail->pRight = pA; + break; + } } } - if( pA ){ - assert( pA->pRight==0 || pA->v<=pA->pRight->v ); - pTail->pRight = pA; - }else{ - assert( pB==0 || pB->pRight==0 || pB->v<=pB->pRight->v ); - pTail->pRight = pB; - } return head.pRight; } @@ -40860,9 +49182,10 @@ static struct RowSetEntry *rowSetEntrySort(struct RowSetEntry *pIn){ aBucket[i] = pIn; pIn = pNext; } - pIn = 0; - for(i=0; i<sizeof(aBucket)/sizeof(aBucket[0]); i++){ - pIn = rowSetEntryMerge(pIn, aBucket[i]); + pIn = aBucket[0]; + for(i=1; i<sizeof(aBucket)/sizeof(aBucket[0]); i++){ + if( aBucket[i]==0 ) continue; + pIn = pIn ? rowSetEntryMerge(pIn, aBucket[i]) : aBucket[i]; } return pIn; } @@ -40914,23 +49237,29 @@ static struct RowSetEntry *rowSetNDeepTree( ){ struct RowSetEntry *p; /* Root of the new tree */ struct RowSetEntry *pLeft; /* Left subtree */ - if( *ppList==0 ){ - return 0; + if( *ppList==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Prevent unnecessary deep recursion when we run out of entries */ + return 0; } - if( iDepth==1 ){ + if( iDepth>1 ){ /*OPTIMIZATION-IF-TRUE*/ + /* This branch causes a *balanced* tree to be generated. A valid tree + ** is still generated without this branch, but the tree is wildly + ** unbalanced and inefficient. */ + pLeft = rowSetNDeepTree(ppList, iDepth-1); + p = *ppList; + if( p==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* It is safe to always return here, but the resulting tree + ** would be unbalanced */ + return pLeft; + } + p->pLeft = pLeft; + *ppList = p->pRight; + p->pRight = rowSetNDeepTree(ppList, iDepth-1); + }else{ p = *ppList; *ppList = p->pRight; p->pLeft = p->pRight = 0; - return p; } - pLeft = rowSetNDeepTree(ppList, iDepth-1); - p = *ppList; - if( p==0 ){ - return pLeft; - } - p->pLeft = pLeft; - *ppList = p->pRight; - p->pRight = rowSetNDeepTree(ppList, iDepth-1); return p; } @@ -40957,59 +49286,37 @@ static struct RowSetEntry *rowSetListToTree(struct RowSetEntry *pList){ return p; } -/* -** Take all the entries on p->pEntry and on the trees in p->pForest and -** sort them all together into one big ordered list on p->pEntry. -** -** This routine should only be called once in the life of a RowSet. -*/ -static void rowSetToList(RowSet *p){ - - /* This routine is called only once */ - assert( p!=0 && (p->rsFlags & ROWSET_NEXT)==0 ); - - if( (p->rsFlags & ROWSET_SORTED)==0 ){ - p->pEntry = rowSetEntrySort(p->pEntry); - } - - /* While this module could theoretically support it, sqlite3RowSetNext() - ** is never called after sqlite3RowSetText() for the same RowSet. So - ** there is never a forest to deal with. Should this change, simply - ** remove the assert() and the #if 0. */ - assert( p->pForest==0 ); -#if 0 - while( p->pForest ){ - struct RowSetEntry *pTree = p->pForest->pLeft; - if( pTree ){ - struct RowSetEntry *pHead, *pTail; - rowSetTreeToList(pTree, &pHead, &pTail); - p->pEntry = rowSetEntryMerge(p->pEntry, pHead); - } - p->pForest = p->pForest->pRight; - } -#endif - p->rsFlags |= ROWSET_NEXT; /* Verify this routine is never called again */ -} - /* ** Extract the smallest element from the RowSet. ** Write the element into *pRowid. Return 1 on success. Return ** 0 if the RowSet is already empty. ** ** After this routine has been called, the sqlite3RowSetInsert() -** routine may not be called again. +** routine may not be called again. +** +** This routine may not be called after sqlite3RowSetTest() has +** been used. Older versions of RowSet allowed that, but as the +** capability was not used by the code generator, it was removed +** for code economy. */ SQLITE_PRIVATE int sqlite3RowSetNext(RowSet *p, i64 *pRowid){ assert( p!=0 ); + assert( p->pForest==0 ); /* Cannot be used with sqlite3RowSetText() */ /* Merge the forest into a single sorted list on first call */ - if( (p->rsFlags & ROWSET_NEXT)==0 ) rowSetToList(p); + if( (p->rsFlags & ROWSET_NEXT)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + if( (p->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + p->pEntry = rowSetEntrySort(p->pEntry); + } + p->rsFlags |= ROWSET_SORTED|ROWSET_NEXT; + } /* Return the next entry on the list */ if( p->pEntry ){ *pRowid = p->pEntry->v; p->pEntry = p->pEntry->pRight; - if( p->pEntry==0 ){ + if( p->pEntry==0 ){ /*OPTIMIZATION-IF-TRUE*/ + /* Free memory immediately, rather than waiting on sqlite3_finalize() */ sqlite3RowSetClear(p); } return 1; @@ -41032,13 +49339,15 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 /* This routine is never called after sqlite3RowSetNext() */ assert( pRowSet!=0 && (pRowSet->rsFlags & ROWSET_NEXT)==0 ); - /* Sort entries into the forest on the first test of a new batch + /* Sort entries into the forest on the first test of a new batch. + ** To save unnecessary work, only do this when the batch number changes. */ - if( iBatch!=pRowSet->iBatch ){ + if( iBatch!=pRowSet->iBatch ){ /*OPTIMIZATION-IF-FALSE*/ p = pRowSet->pEntry; if( p ){ struct RowSetEntry **ppPrevTree = &pRowSet->pForest; - if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){ + if( (pRowSet->rsFlags & ROWSET_SORTED)==0 ){ /*OPTIMIZATION-IF-FALSE*/ + /* Only sort the current set of entiries if they need it */ p = rowSetEntrySort(p); } for(pTree = pRowSet->pForest; pTree; pTree=pTree->pRight){ @@ -41109,6 +49418,7 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 ** another is writing. */ #ifndef SQLITE_OMIT_DISKIO +/* #include "sqliteInt.h" */ /************** Include wal.h in the middle of pager.c ***********************/ /************** Begin file wal.h *********************************************/ /* @@ -41127,20 +49437,21 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 ** the implementation of each function in log.c for further details. */ -#ifndef _WAL_H_ -#define _WAL_H_ +#ifndef SQLITE_WAL_H +#define SQLITE_WAL_H +/* #include "sqliteInt.h" */ -/* Additional values that can be added to the sync_flags argument of -** sqlite3WalFrames(): +/* Macros for extracting appropriate sync flags for either transaction +** commits (WAL_SYNC_FLAGS(X)) or for checkpoint ops (CKPT_SYNC_FLAGS(X)): */ -#define WAL_SYNC_TRANSACTIONS 0x20 /* Sync at the end of each transaction */ -#define SQLITE_SYNC_MASK 0x13 /* Mask off the SQLITE_SYNC_* values */ +#define WAL_SYNC_FLAGS(X) ((X)&0x03) +#define CKPT_SYNC_FLAGS(X) (((X)>>2)&0x03) #ifdef SQLITE_OMIT_WAL # define sqlite3WalOpen(x,y,z) 0 # define sqlite3WalLimit(x,y) -# define sqlite3WalClose(w,x,y,z) 0 +# define sqlite3WalClose(v,w,x,y,z) 0 # define sqlite3WalBeginReadTransaction(y,z) 0 # define sqlite3WalEndReadTransaction(z) # define sqlite3WalDbsize(y) 0 @@ -41150,12 +49461,13 @@ SQLITE_PRIVATE int sqlite3RowSetTest(RowSet *pRowSet, int iBatch, sqlite3_int64 # define sqlite3WalSavepoint(y,z) # define sqlite3WalSavepointUndo(y,z) 0 # define sqlite3WalFrames(u,v,w,x,y,z) 0 -# define sqlite3WalCheckpoint(r,s,t,u,v,w,x,y,z) 0 +# define sqlite3WalCheckpoint(q,r,s,t,u,v,w,x,y,z) 0 # define sqlite3WalCallback(z) 0 # define sqlite3WalExclusiveMode(y,z) 0 # define sqlite3WalHeapMemory(z) 0 # define sqlite3WalFramesize(z) 0 # define sqlite3WalFindFrame(x,y,z) 0 +# define sqlite3WalFile(x) 0 #else #define WAL_SAVEPOINT_NDATA 4 @@ -41167,7 +49479,7 @@ typedef struct Wal Wal; /* Open and close a connection to a write-ahead log. */ SQLITE_PRIVATE int sqlite3WalOpen(sqlite3_vfs*, sqlite3_file*, const char *, int, i64, Wal**); -SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, int sync_flags, int, u8 *); +SQLITE_PRIVATE int sqlite3WalClose(Wal *pWal, sqlite3*, int sync_flags, int, u8 *); /* Set the limiting size of a WAL file. */ SQLITE_PRIVATE void sqlite3WalLimit(Wal*, i64); @@ -41210,6 +49522,7 @@ SQLITE_PRIVATE int sqlite3WalFrames(Wal *pWal, int, PgHdr *, Pgno, int, int); /* Copy pages from the log to the database file */ SQLITE_PRIVATE int sqlite3WalCheckpoint( Wal *pWal, /* Write-ahead log connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ int eMode, /* One of PASSIVE, FULL and RESTART */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ @@ -41238,6 +49551,12 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op); */ SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal); +#ifdef SQLITE_ENABLE_SNAPSHOT +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot); +SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot); +SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal); +#endif + #ifdef SQLITE_ENABLE_ZIPVFS /* If the WAL file is not empty, return the number of bytes of content ** stored in each frame (i.e. the db page-size when the WAL was created). @@ -41245,8 +49564,11 @@ SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal); SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal); #endif +/* Return the sqlite3_file object for the WAL file */ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal); + #endif /* ifndef SQLITE_OMIT_WAL */ -#endif /* _WAL_H_ */ +#endif /* SQLITE_WAL_H */ /************** End of wal.h *************************************************/ /************** Continuing where we left off in pager.c **********************/ @@ -41357,8 +49679,8 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ ** associated file-descriptor is returned. FILEHANDLEID() takes an sqlite3_file ** struct as its argument. */ -#define PAGERID(p) ((int)(p->fd)) -#define FILEHANDLEID(fd) ((int)fd) +#define PAGERID(p) (SQLITE_PTR_TO_INT(p->fd)) +#define FILEHANDLEID(fd) (SQLITE_PTR_TO_INT(fd)) /* ** The Pager.eState variable stores the current 'state' of a pager. A @@ -41657,6 +49979,7 @@ int sqlite3PagerTrace=1; /* True to enable tracing */ */ #define MAX_SECTOR_SIZE 0x10000 + /* ** An instance of the following structure is allocated for each active ** savepoint and statement transaction in the system. All such structures @@ -41685,9 +50008,9 @@ struct PagerSavepoint { /* ** Bits of the Pager.doNotSpill flag. See further description below. */ -#define SPILLFLAG_OFF 0x01 /* Never spill cache. Set via pragma */ -#define SPILLFLAG_ROLLBACK 0x02 /* Current rolling back, so do not spill */ -#define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */ +#define SPILLFLAG_OFF 0x01 /* Never spill cache. Set via pragma */ +#define SPILLFLAG_ROLLBACK 0x02 /* Current rolling back, so do not spill */ +#define SPILLFLAG_NOSYNC 0x04 /* Spill is ok, but do not sync */ /* ** An open page cache is an instance of struct Pager. A description of @@ -41769,11 +50092,11 @@ struct PagerSavepoint { ** while it is being traversed by code in pager_playback(). The SPILLFLAG_OFF ** case is a user preference. ** -** If the SPILLFLAG_NOSYNC bit is set, writing to the database from pagerStress() -** is permitted, but syncing the journal file is not. This flag is set -** by sqlite3PagerWrite() when the file-system sector-size is larger than -** the database page-size in order to prevent a journal sync from happening -** in between the journalling of two pages on the same sector. +** If the SPILLFLAG_NOSYNC bit is set, writing to the database from +** pagerStress() is permitted, but syncing the journal file is not. +** This flag is set by sqlite3PagerWrite() when the file-system sector-size +** is larger than the database page-size in order to prevent a journal sync +** from happening in between the journalling of two pages on the same sector. ** ** subjInMemory ** @@ -41844,6 +50167,18 @@ struct PagerSavepoint { ** is set to zero in all other states. In PAGER_ERROR state, Pager.errCode ** is always set to SQLITE_FULL, SQLITE_IOERR or one of the SQLITE_IOERR_XXX ** sub-codes. +** +** syncFlags, walSyncFlags +** +** syncFlags is either SQLITE_SYNC_NORMAL (0x02) or SQLITE_SYNC_FULL (0x03). +** syncFlags is used for rollback mode. walSyncFlags is used for WAL mode +** and contains the flags used to sync the checkpoint operations in the +** lower two bits, and sync flags used for transaction commits in the WAL +** file in bits 0x04 and 0x08. In other words, to get the correct sync flags +** for checkpoint operations, use (walSyncFlags&0x03) and to get the correct +** sync flags for transaction commit, use ((walSyncFlags>>2)&0x03). Note +** that with synchronous=NORMAL in WAL mode, transaction commit is not synced +** meaning that the 0x04 and 0x08 bits are both zero. */ struct Pager { sqlite3_vfs *pVfs; /* OS functions to use for IO */ @@ -41852,9 +50187,9 @@ struct Pager { u8 useJournal; /* Use a rollback journal on this file */ u8 noSync; /* Do not sync the journal if true */ u8 fullSync; /* Do extra syncs of the journal for robustness */ - u8 ckptSyncFlags; /* SYNC_NORMAL or SYNC_FULL for checkpoint */ - u8 walSyncFlags; /* SYNC_NORMAL or SYNC_FULL for wal writes */ + u8 extraSync; /* sync directory after journal delete */ u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */ + u8 walSyncFlags; /* See description above */ u8 tempFile; /* zFilename is a temporary or immutable file */ u8 noLock; /* Do not lock (except in WAL mode) */ u8 readOnly; /* True for a read-only database */ @@ -41876,7 +50211,7 @@ struct Pager { u8 doNotSpill; /* Do not spill the cache when non-zero */ u8 subjInMemory; /* True to use in-memory sub-journals */ u8 bUseFetch; /* True to use xFetch() */ - u8 hasBeenUsed; /* True if any content previously read from this pager*/ + u8 hasHeldSharedLock; /* True if a shared lock has ever been held */ Pgno dbSize; /* Number of pages in the database */ Pgno dbOrigSize; /* dbSize before the current transaction */ Pgno dbFileSize; /* Number of pages in the database file */ @@ -41915,11 +50250,12 @@ struct Pager { char *zJournal; /* Name of the journal file */ int (*xBusyHandler)(void*); /* Function to call when busy */ void *pBusyHandlerArg; /* Context argument for xBusyHandler */ - int aStat[3]; /* Total cache hits, misses and writes */ + int aStat[4]; /* Total cache hits, misses, writes, spills */ #ifdef SQLITE_TEST int nRead; /* Database pages read */ #endif void (*xReiniter)(DbPage*); /* Call this routine when reloading pages */ + int (*xGet)(Pager*,Pgno,DbPage**,int); /* Routine to fetch a patch */ #ifdef SQLITE_HAS_CODEC void *(*xCodec)(void*,void*,Pgno,int); /* Routine for en/decoding data */ void (*xCodecSizeChng)(void*,int,int); /* Notify of page size changes */ @@ -41942,6 +50278,7 @@ struct Pager { #define PAGER_STAT_HIT 0 #define PAGER_STAT_MISS 1 #define PAGER_STAT_WRITE 2 +#define PAGER_STAT_SPILL 3 /* ** The following global variables hold counters used for @@ -42037,16 +50374,23 @@ static const unsigned char aJournalMagic[] = { ** ** if( pPager->jfd->pMethods ){ ... */ -#define isOpen(pFd) ((pFd)->pMethods) +#define isOpen(pFd) ((pFd)->pMethods!=0) /* -** Return true if this pager uses a write-ahead log instead of the usual -** rollback journal. Otherwise false. +** Return true if this pager uses a write-ahead log to read page pgno. +** Return false if the pager reads pgno directly from the database. */ -#ifndef SQLITE_OMIT_WAL -static int pagerUseWal(Pager *pPager){ - return (pPager->pWal!=0); +#if !defined(SQLITE_OMIT_WAL) && defined(SQLITE_DIRECT_OVERFLOW_READ) +SQLITE_PRIVATE int sqlite3PagerUseWal(Pager *pPager, Pgno pgno){ + u32 iRead = 0; + int rc; + if( pPager->pWal==0 ) return 0; + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); + return rc || iRead; } +#endif +#ifndef SQLITE_OMIT_WAL +# define pagerUseWal(x) ((x)->pWal!=0) #else # define pagerUseWal(x) 0 # define pagerRollbackWal(x) 0 @@ -42099,6 +50443,7 @@ static int assert_pager_state(Pager *p){ ** state. */ if( MEMDB ){ + assert( !isOpen(p->fd) ); assert( p->noSync ); assert( p->journalMode==PAGER_JOURNALMODE_OFF || p->journalMode==PAGER_JOURNALMODE_MEMORY @@ -42165,6 +50510,7 @@ static int assert_pager_state(Pager *p){ assert( isOpen(p->jfd) || p->journalMode==PAGER_JOURNALMODE_OFF || p->journalMode==PAGER_JOURNALMODE_WAL + || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) ); assert( pPager->dbOrigSize<=pPager->dbHintSize ); break; @@ -42176,6 +50522,7 @@ static int assert_pager_state(Pager *p){ assert( isOpen(p->jfd) || p->journalMode==PAGER_JOURNALMODE_OFF || p->journalMode==PAGER_JOURNALMODE_WAL + || (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC) ); break; @@ -42185,7 +50532,7 @@ static int assert_pager_state(Pager *p){ ** back to OPEN state. */ assert( pPager->errCode!=SQLITE_OK ); - assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 || pPager->tempFile ); break; } @@ -42244,6 +50591,33 @@ static char *print_pager_state(Pager *p){ } #endif +/* Forward references to the various page getters */ +static int getPageNormal(Pager*,Pgno,DbPage**,int); +static int getPageError(Pager*,Pgno,DbPage**,int); +#if SQLITE_MAX_MMAP_SIZE>0 +static int getPageMMap(Pager*,Pgno,DbPage**,int); +#endif + +/* +** Set the Pager.xGet method for the appropriate routine used to fetch +** content from the pager. +*/ +static void setGetterMethod(Pager *pPager){ + if( pPager->errCode ){ + pPager->xGet = getPageError; +#if SQLITE_MAX_MMAP_SIZE>0 + }else if( USEFETCH(pPager) +#ifdef SQLITE_HAS_CODEC + && pPager->xCodec==0 +#endif + ){ + pPager->xGet = getPageMMap; +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + }else{ + pPager->xGet = getPageNormal; + } +} + /* ** Return true if it is necessary to write page *pPg into the sub-journal. ** A page needs to be written into the sub-journal if there exists one @@ -42260,19 +50634,21 @@ static int subjRequiresPage(PgHdr *pPg){ int i; for(i=0; i<pPager->nSavepoint; i++){ p = &pPager->aSavepoint[i]; - if( p->nOrig>=pgno && 0==sqlite3BitvecTest(p->pInSavepoint, pgno) ){ + if( p->nOrig>=pgno && 0==sqlite3BitvecTestNotNull(p->pInSavepoint, pgno) ){ return 1; } } return 0; } +#ifdef SQLITE_DEBUG /* ** Return true if the page is already in the journal file. */ static int pageInJournal(Pager *pPager, PgHdr *pPg){ return sqlite3BitvecTest(pPager->pInJournal, pPg->pgno); } +#endif /* ** Read a 32-bit integer from the given file descriptor. Store the integer @@ -42357,34 +50733,47 @@ static int pagerLockDb(Pager *pPager, int eLock){ } /* -** This function determines whether or not the atomic-write optimization -** can be used with this pager. The optimization can be used if: +** This function determines whether or not the atomic-write or +** atomic-batch-write optimizations can be used with this pager. The +** atomic-write optimization can be used if: ** ** (a) the value returned by OsDeviceCharacteristics() indicates that ** a database page may be written atomically, and ** (b) the value returned by OsSectorSize() is less than or equal ** to the page size. ** -** The optimization is also always enabled for temporary files. It is -** an error to call this function if pPager is opened on an in-memory -** database. +** If it can be used, then the value returned is the size of the journal +** file when it contains rollback data for exactly one page. ** -** If the optimization cannot be used, 0 is returned. If it can be used, -** then the value returned is the size of the journal file when it -** contains rollback data for exactly one page. +** The atomic-batch-write optimization can be used if OsDeviceCharacteristics() +** returns a value with the SQLITE_IOCAP_BATCH_ATOMIC bit set. -1 is +** returned in this case. +** +** If neither optimization can be used, 0 is returned. */ -#ifdef SQLITE_ENABLE_ATOMIC_WRITE static int jrnlBufferSize(Pager *pPager){ assert( !MEMDB ); - if( !pPager->tempFile ){ - int dc; /* Device characteristics */ - int nSector; /* Sector size */ - int szPage; /* Page size */ - assert( isOpen(pPager->fd) ); - dc = sqlite3OsDeviceCharacteristics(pPager->fd); - nSector = pPager->sectorSize; - szPage = pPager->pageSize; +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + int dc; /* Device characteristics */ + + assert( isOpen(pPager->fd) ); + dc = sqlite3OsDeviceCharacteristics(pPager->fd); +#else + UNUSED_PARAMETER(pPager); +#endif + +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( pPager->dbSize>0 && (dc&SQLITE_IOCAP_BATCH_ATOMIC) ){ + return -1; + } +#endif + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + { + int nSector = pPager->sectorSize; + int szPage = pPager->pageSize; assert(SQLITE_IOCAP_ATOMIC512==(512>>8)); assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8)); @@ -42394,9 +50783,11 @@ static int jrnlBufferSize(Pager *pPager){ } return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager); -} #endif + return 0; +} + /* ** If SQLITE_CHECK_PAGES is defined then we do some sanity checking ** on the cache using a hash function. This is used for testing @@ -42478,6 +50869,7 @@ static int readMasterJournal(sqlite3_file *pJrnl, char *zMaster, u32 nMaster){ || szJ<16 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-16, &len)) || len>=nMaster + || len>szJ-16 || len==0 || SQLITE_OK!=(rc = read32bits(pJrnl, szJ-12, &cksum)) || SQLITE_OK!=(rc = sqlite3OsRead(pJrnl, aMagic, 8, szJ-8)) @@ -42555,6 +50947,7 @@ static i64 journalHdrOffset(Pager *pPager){ static int zeroJournalHdr(Pager *pPager, int doTruncate){ int rc = SQLITE_OK; /* Return code */ assert( isOpen(pPager->jfd) ); + assert( !sqlite3JournalIsInMemory(pPager->jfd) ); if( pPager->journalOff ){ const i64 iLimit = pPager->journalSizeLimit; /* Local cache of jsl */ @@ -42884,7 +51277,8 @@ static int writeMasterJournal(Pager *pPager, const char *zMaster){ || (0 != (rc = sqlite3OsWrite(pPager->jfd, zMaster, nMaster, iHdrOff+4))) || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster, nMaster))) || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nMaster+4, cksum))) - || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, iHdrOff+4+nMaster+8))) + || (0 != (rc = sqlite3OsWrite(pPager->jfd, aJournalMagic, 8, + iHdrOff+4+nMaster+8))) ){ return rc; } @@ -42935,7 +51329,7 @@ static void releaseAllSavepoints(Pager *pPager){ for(ii=0; ii<pPager->nSavepoint; ii++){ sqlite3BitvecDestroy(pPager->aSavepoint[ii].pInSavepoint); } - if( !pPager->exclusiveMode || sqlite3IsMemJournal(pPager->sjfd) ){ + if( !pPager->exclusiveMode || sqlite3JournalIsInMemory(pPager->sjfd) ){ sqlite3OsClose(pPager->sjfd); } sqlite3_free(pPager->aSavepoint); @@ -43041,13 +51435,18 @@ static void pager_unlock(Pager *pPager){ ** it can safely move back to PAGER_OPEN state. This happens in both ** normal and exclusive-locking mode. */ + assert( pPager->errCode==SQLITE_OK || !MEMDB ); if( pPager->errCode ){ - assert( !MEMDB ); - pager_reset(pPager); - pPager->changeCountDone = pPager->tempFile; - pPager->eState = PAGER_OPEN; - pPager->errCode = SQLITE_OK; + if( pPager->tempFile==0 ){ + pager_reset(pPager); + pPager->changeCountDone = 0; + pPager->eState = PAGER_OPEN; + }else{ + pPager->eState = (isOpen(pPager->jfd) ? PAGER_OPEN : PAGER_READER); + } if( USEFETCH(pPager) ) sqlite3OsUnfetch(pPager->fd, 0, 0); + pPager->errCode = SQLITE_OK; + setGetterMethod(pPager); } pPager->journalOff = 0; @@ -43085,12 +51484,36 @@ static int pager_error(Pager *pPager, int rc){ if( rc2==SQLITE_FULL || rc2==SQLITE_IOERR ){ pPager->errCode = rc; pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); } return rc; } static int pager_truncate(Pager *pPager, Pgno nPage); +/* +** The write transaction open on pPager is being committed (bCommit==1) +** or rolled back (bCommit==0). +** +** Return TRUE if and only if all dirty pages should be flushed to disk. +** +** Rules: +** +** * For non-TEMP databases, always sync to disk. This is necessary +** for transactions to be durable. +** +** * Sync TEMP database only on a COMMIT (not a ROLLBACK) when the backing +** file has been created already (via a spill on pagerStress()) and +** when the number of dirty pages in memory exceeds 25% of the total +** cache size. +*/ +static int pagerFlushOnCommit(Pager *pPager, int bCommit){ + if( pPager->tempFile==0 ) return 1; + if( !bCommit ) return 0; + if( !isOpen(pPager->fd) ) return 0; + return (sqlite3PCachePercentDirty(pPager->pPCache)>=25); +} + /* ** This routine ends a transaction. A transaction is usually ended by ** either a COMMIT or a ROLLBACK operation. This routine may be called @@ -43168,13 +51591,15 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ } releaseAllSavepoints(pPager); - assert( isOpen(pPager->jfd) || pPager->pInJournal==0 ); + assert( isOpen(pPager->jfd) || pPager->pInJournal==0 + || (sqlite3OsDeviceCharacteristics(pPager->fd)&SQLITE_IOCAP_BATCH_ATOMIC) + ); if( isOpen(pPager->jfd) ){ assert( !pagerUseWal(pPager) ); /* Finalize the journal file. */ - if( sqlite3IsMemJournal(pPager->jfd) ){ - assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); + if( sqlite3JournalIsInMemory(pPager->jfd) ){ + /* assert( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ); */ sqlite3OsClose(pPager->jfd); }else if( pPager->journalMode==PAGER_JOURNALMODE_TRUNCATE ){ if( pPager->journalOff==0 ){ @@ -43194,22 +51619,23 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ }else if( pPager->journalMode==PAGER_JOURNALMODE_PERSIST || (pPager->exclusiveMode && pPager->journalMode!=PAGER_JOURNALMODE_WAL) ){ - rc = zeroJournalHdr(pPager, hasMaster); + rc = zeroJournalHdr(pPager, hasMaster||pPager->tempFile); pPager->journalOff = 0; }else{ /* This branch may be executed with Pager.journalMode==MEMORY if ** a hot-journal was just rolled back. In this case the journal ** file should be closed and deleted. If this connection writes to - ** the database file, it will do so using an in-memory journal. + ** the database file, it will do so using an in-memory journal. */ - int bDelete = (!pPager->tempFile && sqlite3JournalExists(pPager->jfd)); + int bDelete = !pPager->tempFile; + assert( sqlite3JournalIsInMemory(pPager->jfd)==0 ); assert( pPager->journalMode==PAGER_JOURNALMODE_DELETE || pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->journalMode==PAGER_JOURNALMODE_WAL ); sqlite3OsClose(pPager->jfd); if( bDelete ){ - rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, 0); + rc = sqlite3OsDelete(pPager->pVfs, pPager->zJournal, pPager->extraSync); } } } @@ -43228,8 +51654,14 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; pPager->nRec = 0; - sqlite3PcacheCleanAll(pPager->pPCache); - sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); + if( rc==SQLITE_OK ){ + if( MEMDB || pagerFlushOnCommit(pPager, bCommit) ){ + sqlite3PcacheCleanAll(pPager->pPCache); + }else{ + sqlite3PcacheClearWritable(pPager->pPCache); + } + sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); + } if( pagerUseWal(pPager) ){ /* Drop the WAL write-lock, if any. Also, if the connection was in @@ -43249,7 +51681,7 @@ static int pager_end_transaction(Pager *pPager, int hasMaster, int bCommit){ rc = pager_truncate(pPager, pPager->dbSize); } - if( rc==SQLITE_OK && bCommit && isOpen(pPager->fd) ){ + if( rc==SQLITE_OK && bCommit ){ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_COMMIT_PHASETWO, 0); if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; } @@ -43342,6 +51774,20 @@ static void pagerReportSize(Pager *pPager){ # define pagerReportSize(X) /* No-op if we do not support a codec */ #endif +#ifdef SQLITE_HAS_CODEC +/* +** Make sure the number of reserved bits is the same in the destination +** pager as it is in the source. This comes up when a VACUUM changes the +** number of reserved bits to the "optimal" amount. +*/ +SQLITE_PRIVATE void sqlite3PagerAlignReserve(Pager *pDest, Pager *pSrc){ + if( pDest->nReserve!=pSrc->nReserve ){ + pDest->nReserve = pSrc->nReserve; + pagerReportSize(pDest); + } +} +#endif + /* ** Read a single page from either the journal file (if isMainJrnl==1) or ** from the sub-journal (if isMainJrnl==0) and playback that page. @@ -43393,6 +51839,11 @@ static int pager_playback_one_page( char *aData; /* Temporary storage for the page */ sqlite3_file *jfd; /* The file descriptor for the journal file */ int isSynced; /* True if journal page is synced */ +#ifdef SQLITE_HAS_CODEC + /* The jrnlEnc flag is true if Journal pages should be passed through + ** the codec. It is false for pure in-memory journals. */ + const int jrnlEnc = (isMainJrnl || pPager->subjInMemory==0); +#endif assert( (isMainJrnl&~1)==0 ); /* isMainJrnl is 0 or 1 */ assert( (isSavepnt&~1)==0 ); /* isSavepnt is 0 or 1 */ @@ -43444,7 +51895,7 @@ static int pager_playback_one_page( } } - /* If this page has already been played by before during the current + /* If this page has already been played back before during the current ** rollback, then don't bother to play it back again. */ if( pDone && (rc = sqlite3BitvecSet(pDone, pgno))!=SQLITE_OK ){ @@ -43499,7 +51950,7 @@ static int pager_playback_one_page( pPg = sqlite3PagerLookup(pPager, pgno); } assert( pPg || !MEMDB ); - assert( pPager->eState!=PAGER_OPEN || pPg==0 ); + assert( pPager->eState!=PAGER_OPEN || pPg==0 || pPager->tempFile ); PAGERTRACE(("PLAYBACK %d page %d hash(%08x) %s\n", PAGERID(pPager), pgno, pager_datahash(pPager->pageSize, (u8*)aData), (isMainJrnl?"main-journal":"sub-journal") @@ -43516,14 +51967,34 @@ static int pager_playback_one_page( i64 ofst = (pgno-1)*(i64)pPager->pageSize; testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 ); assert( !pagerUseWal(pPager) ); + + /* Write the data read from the journal back into the database file. + ** This is usually safe even for an encrypted database - as the data + ** was encrypted before it was written to the journal file. The exception + ** is if the data was just read from an in-memory sub-journal. In that + ** case it must be encrypted here before it is copied into the database + ** file. */ +#ifdef SQLITE_HAS_CODEC + if( !jrnlEnc ){ + CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM_BKPT, aData); + rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); + CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM_BKPT); + }else +#endif rc = sqlite3OsWrite(pPager->fd, (u8 *)aData, pPager->pageSize, ofst); + if( pgno>pPager->dbFileSize ){ pPager->dbFileSize = pgno; } if( pPager->pBackup ){ - CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM); +#ifdef SQLITE_HAS_CODEC + if( jrnlEnc ){ + CODEC1(pPager, aData, pgno, 3, rc=SQLITE_NOMEM_BKPT); + sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); + CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM_BKPT,aData); + }else +#endif sqlite3BackupUpdate(pPager->pBackup, pgno, (u8*)aData); - CODEC2(pPager, aData, pgno, 7, rc=SQLITE_NOMEM, aData); } }else if( !isMainJrnl && pPg==0 ){ /* If this is a rollback of a savepoint and data was not written to @@ -43545,11 +52016,10 @@ static int pager_playback_one_page( assert( isSavepnt ); assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)==0 ); pPager->doNotSpill |= SPILLFLAG_ROLLBACK; - rc = sqlite3PagerAcquire(pPager, pgno, &pPg, 1); + rc = sqlite3PagerGet(pPager, pgno, &pPg, 1); assert( (pPager->doNotSpill & SPILLFLAG_ROLLBACK)!=0 ); pPager->doNotSpill &= ~SPILLFLAG_ROLLBACK; if( rc!=SQLITE_OK ) return rc; - pPg->flags &= ~PGHDR_NEED_READ; sqlite3PcacheMakeDirty(pPg); } if( pPg ){ @@ -43563,29 +52033,10 @@ static int pager_playback_one_page( pData = pPg->pData; memcpy(pData, (u8*)aData, pPager->pageSize); pPager->xReiniter(pPg); - if( isMainJrnl && (!isSavepnt || *pOffset<=pPager->journalHdr) ){ - /* If the contents of this page were just restored from the main - ** journal file, then its content must be as they were when the - ** transaction was first opened. In this case we can mark the page - ** as clean, since there will be no need to write it out to the - ** database. - ** - ** There is one exception to this rule. If the page is being rolled - ** back as part of a savepoint (or statement) rollback from an - ** unsynced portion of the main journal file, then it is not safe - ** to mark the page as clean. This is because marking the page as - ** clean will clear the PGHDR_NEED_SYNC flag. Since the page is - ** already in the journal file (recorded in Pager.pInJournal) and - ** the PGHDR_NEED_SYNC flag is cleared, if the page is written to - ** again within this transaction, it will be marked as dirty but - ** the PGHDR_NEED_SYNC flag will not be set. It could then potentially - ** be written out into the database file before its journal file - ** segment is synced. If a crash occurs during or following this, - ** database corruption may ensue. - */ - assert( !pagerUseWal(pPager) ); - sqlite3PcacheMakeClean(pPg); - } + /* It used to be that sqlite3PcacheMakeClean(pPg) was called here. But + ** that call was dangerous and had no detectable benefit since the cache + ** is normally cleaned by sqlite3PcacheCleanAll() after rollback and so + ** has been removed. */ pager_set_pagehash(pPg); /* If this was page 1, then restore the value of Pager.dbFileVers. @@ -43595,7 +52046,9 @@ static int pager_playback_one_page( } /* Decode the page just read from disk */ - CODEC1(pPager, pData, pPg->pgno, 3, rc=SQLITE_NOMEM); +#if SQLITE_HAS_CODEC + if( jrnlEnc ){ CODEC1(pPager, pData, pPg->pgno, 3, rc=SQLITE_NOMEM_BKPT); } +#endif sqlite3PcacheRelease(pPg); } return rc; @@ -43661,7 +52114,7 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){ pMaster = (sqlite3_file *)sqlite3MallocZero(pVfs->szOsFile * 2); pJournal = (sqlite3_file *)(((u8 *)pMaster) + pVfs->szOsFile); if( !pMaster ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ const int flags = (SQLITE_OPEN_READONLY|SQLITE_OPEN_MASTER_JOURNAL); rc = sqlite3OsOpen(pVfs, zMaster, pMaster, flags, 0); @@ -43678,7 +52131,7 @@ static int pager_delmaster(Pager *pPager, const char *zMaster){ nMasterPtr = pVfs->mxPathname+1; zMasterJournal = sqlite3Malloc(nMasterJournal + nMasterPtr + 1); if( !zMasterJournal ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto delmaster_out; } zMasterPtr = &zMasterJournal[nMasterJournal+1]; @@ -43908,6 +52361,7 @@ static int pager_playback(Pager *pPager, int isHot){ char *zMaster = 0; /* Name of master journal file if any */ int needPagerReset; /* True to reset page prior to first page rollback */ int nPlayback = 0; /* Total number of pages restored from journal */ + u32 savedPageSize = pPager->pageSize; /* Figure out how many records are in the journal. Abort early if ** the journal is empty. @@ -43926,7 +52380,7 @@ static int pager_playback(Pager *pPager, int isHot){ ** TODO: Technically the following is an error because it assumes that ** buffer Pager.pTmpSpace is (mxPathname+1) bytes or larger. i.e. that ** (pPager->pageSize >= pPager->pVfs->mxPathname+1). Using os_unix.c, - ** mxPathname is 512, which is the same as the minimum allowable value + ** mxPathname is 512, which is the same as the minimum allowable value ** for pageSize. */ zMaster = pPager->pTmpSpace; @@ -44037,15 +52491,16 @@ static int pager_playback(Pager *pPager, int isHot){ assert( 0 ); end_playback: + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSetPagesize(pPager, &savedPageSize, -1); + } /* Following a rollback, the database file should be back in its original ** state prior to the start of the transaction, so invoke the ** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the ** assertion that the transaction counter was modified. */ #ifdef SQLITE_DEBUG - if( pPager->fd->pMethods ){ - sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); - } + sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); #endif /* If this playback is happening automatically as a result of an IO or @@ -44095,7 +52550,8 @@ end_playback: /* -** Read the content for page pPg out of the database file and into +** Read the content for page pPg out of the database file (or out of +** the WAL if that is where the most recent copy if found) into ** pPg->pData. A shared lock or greater must be held on the database ** file before this function is called. ** @@ -44105,30 +52561,33 @@ end_playback: ** If an IO error occurs, then the IO error is returned to the caller. ** Otherwise, SQLITE_OK is returned. */ -static int readDbPage(PgHdr *pPg, u32 iFrame){ +static int readDbPage(PgHdr *pPg){ Pager *pPager = pPg->pPager; /* Pager object associated with page pPg */ - Pgno pgno = pPg->pgno; /* Page number to read */ int rc = SQLITE_OK; /* Return code */ - int pgsz = pPager->pageSize; /* Number of bytes to read */ + +#ifndef SQLITE_OMIT_WAL + u32 iFrame = 0; /* Frame of WAL containing pgno */ assert( pPager->eState>=PAGER_READER && !MEMDB ); assert( isOpen(pPager->fd) ); -#ifndef SQLITE_OMIT_WAL + if( pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); + if( rc ) return rc; + } if( iFrame ){ - /* Try to pull the page from the write-ahead log. */ - rc = sqlite3WalReadFrame(pPager->pWal, iFrame, pgsz, pPg->pData); + rc = sqlite3WalReadFrame(pPager->pWal, iFrame,pPager->pageSize,pPg->pData); }else #endif { - i64 iOffset = (pgno-1)*(i64)pPager->pageSize; - rc = sqlite3OsRead(pPager->fd, pPg->pData, pgsz, iOffset); + i64 iOffset = (pPg->pgno-1)*(i64)pPager->pageSize; + rc = sqlite3OsRead(pPager->fd, pPg->pData, pPager->pageSize, iOffset); if( rc==SQLITE_IOERR_SHORT_READ ){ rc = SQLITE_OK; } } - if( pgno==1 ){ + if( pPg->pgno==1 ){ if( rc ){ /* If the read is unsuccessful, set the dbFileVers[] to something ** that will never be a valid file version. dbFileVers[] is a copy @@ -44148,13 +52607,13 @@ static int readDbPage(PgHdr *pPg, u32 iFrame){ memcpy(&pPager->dbFileVers, dbFileVers, sizeof(pPager->dbFileVers)); } } - CODEC1(pPager, pPg->pData, pgno, 3, rc = SQLITE_NOMEM); + CODEC1(pPager, pPg->pData, pPg->pgno, 3, rc = SQLITE_NOMEM_BKPT); PAGER_INCR(sqlite3_pager_readdb_count); PAGER_INCR(pPager->nRead); - IOTRACE(("PGIN %p %d\n", pPager, pgno)); + IOTRACE(("PGIN %p %d\n", pPager, pPg->pgno)); PAGERTRACE(("FETCH %d page %d hash(%08x)\n", - PAGERID(pPager), pgno, pager_pagehash(pPg))); + PAGERID(pPager), pPg->pgno, pager_pagehash(pPg))); return rc; } @@ -44205,11 +52664,7 @@ static int pagerUndoCallback(void *pCtx, Pgno iPg){ if( sqlite3PcachePageRefcount(pPg)==1 ){ sqlite3PcacheDrop(pPg); }else{ - u32 iFrame = 0; - rc = sqlite3WalFindFrame(pPager->pWal, pPg->pgno, &iFrame); - if( rc==SQLITE_OK ){ - rc = readDbPage(pPg, iFrame); - } + rc = readDbPage(pPg); if( rc==SQLITE_OK ){ pPager->xReiniter(pPg); } @@ -44273,9 +52728,7 @@ static int pagerWalFrames( ){ int rc; /* Return code */ int nList; /* Number of pages in pList */ -#if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES) PgHdr *p; /* For looping over pages */ -#endif assert( pPager->pWal ); assert( pList ); @@ -44292,7 +52745,6 @@ static int pagerWalFrames( ** any pages with page numbers greater than nTruncate into the WAL file. ** They will never be read by any client. So remove them from the pDirty ** list here. */ - PgHdr *p; PgHdr **ppNext = &pList; nList = 0; for(p=pList; (*ppNext = p)!=0; p=p->pDirty){ @@ -44312,7 +52764,6 @@ static int pagerWalFrames( pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags ); if( rc==SQLITE_OK && pPager->pBackup ){ - PgHdr *p; for(p=pList; p; p=p->pDirty){ sqlite3BackupUpdate(pPager->pBackup, p->pgno, (u8 *)p->pData); } @@ -44380,22 +52831,20 @@ static int pagerPagecount(Pager *pPager, Pgno *pnPage){ */ assert( pPager->eState==PAGER_OPEN ); assert( pPager->eLock>=SHARED_LOCK ); + assert( isOpen(pPager->fd) ); + assert( pPager->tempFile==0 ); nPage = sqlite3WalDbsize(pPager->pWal); - /* If the database size was not available from the WAL sub-system, - ** determine it based on the size of the database file. If the size - ** of the database file is not an integer multiple of the page-size, - ** round down to the nearest page. Except, any file larger than 0 - ** bytes in size is considered to contain at least one page. + /* If the number of pages in the database is not available from the + ** WAL sub-system, determine the page count based on the size of + ** the database file. If the size of the database file is not an + ** integer multiple of the page-size, round up the result. */ - if( nPage==0 ){ + if( nPage==0 && ALWAYS(isOpen(pPager->fd)) ){ i64 n = 0; /* Size of db file in bytes */ - assert( isOpen(pPager->fd) || pPager->tempFile ); - if( isOpen(pPager->fd) ){ - int rc = sqlite3OsFileSize(pPager->fd, &n); - if( rc!=SQLITE_OK ){ - return rc; - } + int rc = sqlite3OsFileSize(pPager->fd, &n); + if( rc!=SQLITE_OK ){ + return rc; } nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); } @@ -44438,23 +52887,21 @@ static int pagerOpenWalIfPresent(Pager *pPager){ if( !pPager->tempFile ){ int isWal; /* True if WAL file exists */ - Pgno nPage; /* Size of the database file */ - - rc = pagerPagecount(pPager, &nPage); - if( rc ) return rc; - if( nPage==0 ){ - rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); - if( rc==SQLITE_IOERR_DELETE_NOENT ) rc = SQLITE_OK; - isWal = 0; - }else{ - rc = sqlite3OsAccess( - pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal - ); - } + rc = sqlite3OsAccess( + pPager->pVfs, pPager->zWal, SQLITE_ACCESS_EXISTS, &isWal + ); if( rc==SQLITE_OK ){ if( isWal ){ - testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); - rc = sqlite3PagerOpenWal(pPager, 0); + Pgno nPage; /* Size of the database file */ + + rc = pagerPagecount(pPager, &nPage); + if( rc ) return rc; + if( nPage==0 ){ + rc = sqlite3OsDelete(pPager->pVfs, pPager->zWal, 0); + }else{ + testcase( sqlite3PcachePagecount(pPager->pPCache)==0 ); + rc = sqlite3PagerOpenWal(pPager, 0); + } }else if( pPager->journalMode==PAGER_JOURNALMODE_WAL ){ pPager->journalMode = PAGER_JOURNALMODE_DELETE; } @@ -44513,7 +52960,7 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ if( pSavepoint ){ pDone = sqlite3BitvecCreate(pSavepoint->nOrig); if( !pDone ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } } @@ -44609,12 +53056,21 @@ static int pagerPlaybackSavepoint(Pager *pPager, PagerSavepoint *pSavepoint){ } /* -** Change the maximum number of in-memory pages that are allowed. +** Change the maximum number of in-memory pages that are allowed +** before attempting to recycle clean and unused pages. */ SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager *pPager, int mxPage){ sqlite3PcacheSetCachesize(pPager->pPCache, mxPage); } +/* +** Change the maximum number of in-memory pages that are allowed +** before attempting to spill pages to journal. +*/ +SQLITE_PRIVATE int sqlite3PagerSetSpillsize(Pager *pPager, int mxPage){ + return sqlite3PcacheSetSpillsize(pPager->pPCache, mxPage); +} + /* ** Invoke SQLITE_FCNTL_MMAP_SIZE based on the current value of szMmap. */ @@ -44625,6 +53081,7 @@ static void pagerFixMaplimit(Pager *pPager){ sqlite3_int64 sz; sz = pPager->szMmap; pPager->bUseFetch = (sz>0); + setGetterMethod(pPager); sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_MMAP_SIZE, &sz); } #endif @@ -44651,7 +53108,7 @@ SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ ** The "level" in pgFlags & PAGER_SYNCHRONOUS_MASK sets the robustness ** of the database to damage due to OS crashes or power failures by ** changing the number of syncs()s when writing the journals. -** There are three levels: +** There are four levels: ** ** OFF sqlite3OsSync() is never called. This is the default ** for temporary and transient files. @@ -44671,6 +53128,10 @@ SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ ** assurance that the journal will not be corrupted to the ** point of causing damage to the database during rollback. ** +** EXTRA This is like FULL except that is also syncs the directory +** that contains the rollback journal after the rollback +** journal is unlinked. +** ** The above is for a rollback-journal mode. For WAL mode, OFF continues ** to mean that no syncs ever occur. NORMAL means that the WAL is synced ** prior to the start of checkpoint and that the database file is synced @@ -44678,7 +53139,8 @@ SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ ** was written back into the database. But no sync operations occur for ** an ordinary commit in NORMAL mode with WAL. FULL means that the WAL ** file is synced following each commit operation, in addition to the -** syncs associated with NORMAL. +** syncs associated with NORMAL. There is no difference between FULL +** and EXTRA for WAL mode. ** ** Do not confuse synchronous=FULL with SQLITE_SYNC_FULL. The ** SQLITE_SYNC_FULL macro means to use the MacOSX-style full-fsync @@ -44697,25 +53159,28 @@ SQLITE_PRIVATE void sqlite3PagerSetFlags( unsigned pgFlags /* Various flags */ ){ unsigned level = pgFlags & PAGER_SYNCHRONOUS_MASK; - assert( level>=1 && level<=3 ); - pPager->noSync = (level==1 || pPager->tempFile) ?1:0; - pPager->fullSync = (level==3 && !pPager->tempFile) ?1:0; + if( pPager->tempFile ){ + pPager->noSync = 1; + pPager->fullSync = 0; + pPager->extraSync = 0; + }else{ + pPager->noSync = level==PAGER_SYNCHRONOUS_OFF ?1:0; + pPager->fullSync = level>=PAGER_SYNCHRONOUS_FULL ?1:0; + pPager->extraSync = level==PAGER_SYNCHRONOUS_EXTRA ?1:0; + } if( pPager->noSync ){ pPager->syncFlags = 0; - pPager->ckptSyncFlags = 0; }else if( pgFlags & PAGER_FULLFSYNC ){ pPager->syncFlags = SQLITE_SYNC_FULL; - pPager->ckptSyncFlags = SQLITE_SYNC_FULL; - }else if( pgFlags & PAGER_CKPT_FULLFSYNC ){ - pPager->syncFlags = SQLITE_SYNC_NORMAL; - pPager->ckptSyncFlags = SQLITE_SYNC_FULL; }else{ pPager->syncFlags = SQLITE_SYNC_NORMAL; - pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; } - pPager->walSyncFlags = pPager->syncFlags; + pPager->walSyncFlags = (pPager->syncFlags<<2); if( pPager->fullSync ){ - pPager->walSyncFlags |= WAL_SYNC_TRANSACTIONS; + pPager->walSyncFlags |= pPager->syncFlags; + } + if( (pgFlags & PAGER_CKPT_FULLFSYNC) && !pPager->noSync ){ + pPager->walSyncFlags |= (SQLITE_SYNC_FULL<<2); } if( pgFlags & PAGER_CACHESPILL ){ pPager->doNotSpill &= ~SPILLFLAG_OFF; @@ -44788,20 +53253,18 @@ static int pagerOpentemp( ** retried. If it returns zero, then the SQLITE_BUSY error is ** returned to the caller of the pager API function. */ -SQLITE_PRIVATE void sqlite3PagerSetBusyhandler( +SQLITE_PRIVATE void sqlite3PagerSetBusyHandler( Pager *pPager, /* Pager object */ int (*xBusyHandler)(void *), /* Pointer to busy-handler function */ void *pBusyHandlerArg /* Argument to pass to xBusyHandler */ ){ + void **ap; pPager->xBusyHandler = xBusyHandler; pPager->pBusyHandlerArg = pBusyHandlerArg; - - if( isOpen(pPager->fd) ){ - void **ap = (void **)&pPager->xBusyHandler; - assert( ((int(*)(void *))(ap[0]))==xBusyHandler ); - assert( ap[1]==pBusyHandlerArg ); - sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap); - } + ap = (void **)&pPager->xBusyHandler; + assert( ((int(*)(void *))(ap[0]))==xBusyHandler ); + assert( ap[1]==pBusyHandlerArg ); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_BUSYHANDLER, (void *)ap); } /* @@ -44861,7 +53324,7 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR } if( rc==SQLITE_OK ){ pNew = (char *)sqlite3PageMalloc(pageSize); - if( !pNew ) rc = SQLITE_NOMEM; + if( !pNew ) rc = SQLITE_NOMEM_BKPT; } if( rc==SQLITE_OK ){ @@ -45110,6 +53573,7 @@ static int pagerSyncHotJournal(Pager *pPager){ return rc; } +#if SQLITE_MAX_MMAP_SIZE>0 /* ** Obtain a reference to a memory mapped page object for page number pgno. ** The new object will use the pointer pData, obtained from xFetch(). @@ -45132,12 +53596,13 @@ static int pagerAcquireMapPage( *ppPage = p = pPager->pMmapFreelist; pPager->pMmapFreelist = p->pDirty; p->pDirty = 0; - memset(p->pExtra, 0, pPager->nExtra); + assert( pPager->nExtra>=8 ); + memset(p->pExtra, 0, 8); }else{ *ppPage = p = (PgHdr *)sqlite3MallocZero(sizeof(PgHdr) + pPager->nExtra); if( p==0 ){ sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1) * pPager->pageSize, pData); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } p->pExtra = (void *)&p[1]; p->flags = PGHDR_MMAP; @@ -45157,6 +53622,7 @@ static int pagerAcquireMapPage( return SQLITE_OK; } +#endif /* ** Release a reference to page pPg. pPg must have been returned by an @@ -45184,6 +53650,30 @@ static void pagerFreeMapHdrs(Pager *pPager){ } } +/* Verify that the database file has not be deleted or renamed out from +** under the pager. Return SQLITE_OK if the database is still where it ought +** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error +** code from sqlite3OsAccess()) if the database has gone missing. +*/ +static int databaseIsUnmoved(Pager *pPager){ + int bHasMoved = 0; + int rc; + + if( pPager->tempFile ) return SQLITE_OK; + if( pPager->dbSize==0 ) return SQLITE_OK; + assert( pPager->zFilename && pPager->zFilename[0] ); + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); + if( rc==SQLITE_NOTFOUND ){ + /* If the HAS_MOVED file-control is unimplemented, assume that the file + ** has not been moved. That is the historical behavior of SQLite: prior to + ** version 3.8.3, it never checked */ + rc = SQLITE_OK; + }else if( rc==SQLITE_OK && bHasMoved ){ + rc = SQLITE_READONLY_DBMOVED; + } + return rc; +} + /* ** Shutdown the page cache. Free all memory and close all files. @@ -45199,9 +53689,9 @@ static void pagerFreeMapHdrs(Pager *pPager){ ** a hot journal may be left in the filesystem but no error is returned ** to the caller. */ -SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){ - u8 *pTmp = (u8 *)pPager->pTmpSpace; - +SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager, sqlite3 *db){ + u8 *pTmp = (u8*)pPager->pTmpSpace; + assert( db || pagerUseWal(pPager)==0 ); assert( assert_pager_state(pPager) ); disable_simulated_io_errors(); sqlite3BeginBenignMalloc(); @@ -45209,8 +53699,17 @@ SQLITE_PRIVATE int sqlite3PagerClose(Pager *pPager){ /* pPager->errCode = 0; */ pPager->exclusiveMode = 0; #ifndef SQLITE_OMIT_WAL - sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, pPager->pageSize, pTmp); - pPager->pWal = 0; + { + u8 *a = 0; + assert( db || pPager->pWal==0 ); + if( db && 0==(db->flags & SQLITE_NoCkptOnClose) + && SQLITE_OK==databaseIsUnmoved(pPager) + ){ + a = pTmp; + } + sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize,a); + pPager->pWal = 0; + } #endif pager_reset(pPager); if( MEMDB ){ @@ -45451,8 +53950,9 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ /* This function is only called for rollback pagers in WRITER_DBMOD state. */ assert( !pagerUseWal(pPager) ); - assert( pPager->eState==PAGER_WRITER_DBMOD ); + assert( pPager->tempFile || pPager->eState==PAGER_WRITER_DBMOD ); assert( pPager->eLock==EXCLUSIVE_LOCK ); + assert( isOpen(pPager->fd) || pList->pDirty==0 ); /* If the file is a temp-file has not yet been opened, open it now. It ** is not possible for rc to be other than SQLITE_OK if this branch @@ -45495,7 +53995,7 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ if( pList->pgno==1 ) pager_write_changecounter(pList); /* Encode the database */ - CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM, pData); + CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM_BKPT, pData); /* Write out the page data. */ rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset); @@ -45540,19 +54040,20 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){ static int openSubJournal(Pager *pPager){ int rc = SQLITE_OK; if( !isOpen(pPager->sjfd) ){ + const int flags = SQLITE_OPEN_SUBJOURNAL | SQLITE_OPEN_READWRITE + | SQLITE_OPEN_CREATE | SQLITE_OPEN_EXCLUSIVE + | SQLITE_OPEN_DELETEONCLOSE; + int nStmtSpill = sqlite3Config.nStmtSpill; if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY || pPager->subjInMemory ){ - sqlite3MemJournalOpen(pPager->sjfd); - }else{ - rc = pagerOpentemp(pPager, pPager->sjfd, SQLITE_OPEN_SUBJOURNAL); + nStmtSpill = -1; } + rc = sqlite3JournalOpen(pPager->pVfs, 0, pPager->sjfd, flags, nStmtSpill); } return rc; } /* ** Append a record of the current state of page pPg to the sub-journal. -** It is the callers responsibility to use subjRequiresPage() to check -** that it is really required before calling this function. ** ** If successful, set the bit corresponding to pPg->pgno in the bitvecs ** for all open savepoints before returning. @@ -45583,8 +54084,13 @@ static int subjournalPage(PgHdr *pPg){ void *pData = pPg->pData; i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); char *pData2; - - CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); + +#if SQLITE_HAS_CODEC + if( !pPager->subjInMemory ){ + CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM_BKPT, pData2); + }else +#endif + pData2 = pData; PAGERTRACE(("STMT-JOURNAL %d page %d\n", PAGERID(pPager), pPg->pgno)); rc = write32bits(pPager->sjfd, offset, pPg->pgno); if( rc==SQLITE_OK ){ @@ -45599,6 +54105,13 @@ static int subjournalPage(PgHdr *pPg){ } return rc; } +static int subjournalPageIfRequired(PgHdr *pPg){ + if( subjRequiresPage(pPg) ){ + return subjournalPage(pPg); + }else{ + return SQLITE_OK; + } +} /* ** This function is called by the pcache layer when it has reached some @@ -45653,16 +54166,22 @@ static int pagerStress(void *p, PgHdr *pPg){ return SQLITE_OK; } + pPager->aStat[PAGER_STAT_SPILL]++; pPg->pDirty = 0; if( pagerUseWal(pPager) ){ /* Write a single frame for this page to the log. */ - if( subjRequiresPage(pPg) ){ - rc = subjournalPage(pPg); - } + rc = subjournalPageIfRequired(pPg); if( rc==SQLITE_OK ){ rc = pagerWalFrames(pPager, pPg, 0, 0); } }else{ + +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( pPager->tempFile==0 ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ) return pager_error(pPager, rc); + } +#endif /* Sync the journal file if required. */ if( pPg->flags&PGHDR_NEED_SYNC @@ -45671,39 +54190,6 @@ static int pagerStress(void *p, PgHdr *pPg){ rc = syncJournal(pPager, 1); } - /* If the page number of this page is larger than the current size of - ** the database image, it may need to be written to the sub-journal. - ** This is because the call to pager_write_pagelist() below will not - ** actually write data to the file in this case. - ** - ** Consider the following sequence of events: - ** - ** BEGIN; - ** <journal page X> - ** <modify page X> - ** SAVEPOINT sp; - ** <shrink database file to Y pages> - ** pagerStress(page X) - ** ROLLBACK TO sp; - ** - ** If (X>Y), then when pagerStress is called page X will not be written - ** out to the database file, but will be dropped from the cache. Then, - ** following the "ROLLBACK TO sp" statement, reading page X will read - ** data from the database file. This will be the copy of page X as it - ** was when the transaction started, not as it was when "SAVEPOINT sp" - ** was executed. - ** - ** The solution is to write the current data for page X into the - ** sub-journal file now (if it is not already there), so that it will - ** be restored to its current value when the "ROLLBACK TO sp" is - ** executed. - */ - if( NEVER( - rc==SQLITE_OK && pPg->pgno>pPager->dbSize && subjRequiresPage(pPg) - ) ){ - rc = subjournalPage(pPg); - } - /* Write the contents of the page out to the database file. */ if( rc==SQLITE_OK ){ assert( (pPg->flags&PGHDR_NEED_SYNC)==0 ); @@ -45720,6 +54206,25 @@ static int pagerStress(void *p, PgHdr *pPg){ return pager_error(pPager, rc); } +/* +** Flush all unreferenced dirty pages to disk. +*/ +SQLITE_PRIVATE int sqlite3PagerFlush(Pager *pPager){ + int rc = pPager->errCode; + if( !MEMDB ){ + PgHdr *pList = sqlite3PcacheDirtyList(pPager->pPCache); + assert( assert_pager_state(pPager) ); + while( rc==SQLITE_OK && pList ){ + PgHdr *pNext = pList->pDirty; + if( pList->nRef==0 ){ + rc = pagerStress((void*)pPager, pList); + } + pList = pNext; + } + } + + return rc; +} /* ** Allocate and initialize a new Pager object and put a pointer to it @@ -45735,7 +54240,9 @@ static int pagerStress(void *p, PgHdr *pPg){ ** ** The nExtra parameter specifies the number of bytes of space allocated ** along with each page reference. This space is available to the user -** via the sqlite3PagerGetExtra() API. +** via the sqlite3PagerGetExtra() API. When a new page is allocated, the +** first 8 bytes of this space are zeroed but the remainder is uninitialized. +** (The extra space is used by btree as the MemPage object.) ** ** The flags argument is used to specify properties that affect the ** operation of the pager. It should be passed some bitwise combination @@ -45765,6 +54272,11 @@ SQLITE_PRIVATE int sqlite3PagerOpen( int rc = SQLITE_OK; /* Return code */ int tempFile = 0; /* True for temp files (incl. in-memory files) */ int memDb = 0; /* True if this is an in-memory file */ +#ifdef SQLITE_ENABLE_DESERIALIZE + int memJM = 0; /* Memory journal mode */ +#else +# define memJM 0 +#endif int readOnly = 0; /* True if this is a read-only file */ int journalFileSize; /* Bytes to allocate for each journal fd */ char *zPathname = 0; /* Full path to database file */ @@ -45776,18 +54288,8 @@ SQLITE_PRIVATE int sqlite3PagerOpen( int nUri = 0; /* Number of bytes of URI args at *zUri */ /* Figure out how much space is required for each journal file-handle - ** (there are two of them, the main journal and the sub-journal). This - ** is the maximum space required for an in-memory journal file handle - ** and a regular journal file-handle. Note that a "regular journal-handle" - ** may be a wrapper capable of caching the first portion of the journal - ** file in memory to implement the atomic-write optimization (see - ** source file journal.c). - */ - if( sqlite3JournalSize(pVfs)>sqlite3MemJournalSize() ){ - journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); - }else{ - journalFileSize = ROUND8(sqlite3MemJournalSize()); - } + ** (there are two of them, the main journal and the sub-journal). */ + journalFileSize = ROUND8(sqlite3JournalSize(pVfs)); /* Set the output variable to NULL in case an error occurs. */ *ppPager = 0; @@ -45797,7 +54299,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( memDb = 1; if( zFilename && zFilename[0] ){ zPathname = sqlite3DbStrDup(0, zFilename); - if( zPathname==0 ) return SQLITE_NOMEM; + if( zPathname==0 ) return SQLITE_NOMEM_BKPT; nPathname = sqlite3Strlen30(zPathname); zFilename = 0; } @@ -45813,7 +54315,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( nPathname = pVfs->mxPathname+1; zPathname = sqlite3DbMallocRaw(0, nPathname*2); if( zPathname==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } zPathname[0] = 0; /* Make sure initialized even if FullPathname() fails */ rc = sqlite3OsFullPathname(pVfs, zFilename, nPathname, zPathname); @@ -45866,7 +54368,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); if( !pPtr ){ sqlite3DbFree(0, zPathname); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pPager = (Pager*)(pPtr); pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager))); @@ -45902,7 +54404,10 @@ SQLITE_PRIVATE int sqlite3PagerOpen( int fout = 0; /* VFS flags returned by xOpen() */ rc = sqlite3OsOpen(pVfs, pPager->zFilename, pPager->fd, vfsFlags, &fout); assert( !memDb ); - readOnly = (fout&SQLITE_OPEN_READONLY); +#ifdef SQLITE_ENABLE_DESERIALIZE + memJM = (fout&SQLITE_OPEN_MEMORY)!=0; +#endif + readOnly = (fout&SQLITE_OPEN_READONLY)!=0; /* If the file was successfully opened for read/write access, ** choose a default page size in case we have to create the @@ -45959,7 +54464,7 @@ SQLITE_PRIVATE int sqlite3PagerOpen( act_like_temp_file: tempFile = 1; pPager->eState = PAGER_READER; /* Pretend we already have a lock */ - pPager->eLock = EXCLUSIVE_LOCK; /* Pretend we are in EXCLUSIVE locking mode */ + pPager->eLock = EXCLUSIVE_LOCK; /* Pretend we are in EXCLUSIVE mode */ pPager->noLock = 1; /* Do no locking */ readOnly = (vfsFlags&SQLITE_OPEN_READONLY); } @@ -45975,10 +54480,10 @@ act_like_temp_file: /* Initialize the PCache object. */ if( rc==SQLITE_OK ){ - assert( nExtra<1000 ); nExtra = ROUND8(nExtra); + assert( nExtra>=8 && nExtra<1000 ); rc = sqlite3PcacheOpen(szPageDflt, nExtra, !memDb, - !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); + !memDb?pagerStress:0, (void *)pPager, pPager->pPCache); } /* If an error occurred above, free the Pager structure and close the file. @@ -46015,14 +54520,14 @@ act_like_temp_file: pPager->noSync = pPager->tempFile; if( pPager->noSync ){ assert( pPager->fullSync==0 ); + assert( pPager->extraSync==0 ); assert( pPager->syncFlags==0 ); assert( pPager->walSyncFlags==0 ); - assert( pPager->ckptSyncFlags==0 ); }else{ pPager->fullSync = 1; + pPager->extraSync = 0; pPager->syncFlags = SQLITE_SYNC_NORMAL; - pPager->walSyncFlags = SQLITE_SYNC_NORMAL | WAL_SYNC_TRANSACTIONS; - pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; + pPager->walSyncFlags = SQLITE_SYNC_NORMAL | (SQLITE_SYNC_NORMAL<<2); } /* pPager->pFirst = 0; */ /* pPager->pFirstSynced = 0; */ @@ -46033,12 +54538,13 @@ act_like_temp_file: setSectorSize(pPager); if( !useJournal ){ pPager->journalMode = PAGER_JOURNALMODE_OFF; - }else if( memDb ){ + }else if( memDb || memJM ){ pPager->journalMode = PAGER_JOURNALMODE_MEMORY; } /* pPager->xBusyHandler = 0; */ /* pPager->pBusyHandlerArg = 0; */ pPager->xReiniter = xReinit; + setGetterMethod(pPager); /* memset(pPager->aHash, 0, sizeof(pPager->aHash)); */ /* pPager->szMmap = SQLITE_DEFAULT_MMAP_SIZE // will be set by btree.c */ @@ -46047,30 +54553,6 @@ act_like_temp_file: } -/* Verify that the database file has not be deleted or renamed out from -** under the pager. Return SQLITE_OK if the database is still were it ought -** to be on disk. Return non-zero (SQLITE_READONLY_DBMOVED or some other error -** code from sqlite3OsAccess()) if the database has gone missing. -*/ -static int databaseIsUnmoved(Pager *pPager){ - int bHasMoved = 0; - int rc; - - if( pPager->tempFile ) return SQLITE_OK; - if( pPager->dbSize==0 ) return SQLITE_OK; - assert( pPager->zFilename && pPager->zFilename[0] ); - rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_HAS_MOVED, &bHasMoved); - if( rc==SQLITE_NOTFOUND ){ - /* If the HAS_MOVED file-control is unimplemented, assume that the file - ** has not been moved. That is the historical behavior of SQLite: prior to - ** version 3.8.3, it never checked */ - rc = SQLITE_OK; - }else if( rc==SQLITE_OK && bHasMoved ){ - rc = SQLITE_READONLY_DBMOVED; - } - return rc; -} - /* ** This function is called after transitioning from PAGER_UNLOCK to @@ -46136,6 +54618,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){ if( rc==SQLITE_OK && !locked ){ Pgno nPage; /* Number of pages in database file */ + assert( pPager->tempFile==0 ); rc = pagerPagecount(pPager, &nPage); if( rc==SQLITE_OK ){ /* If the database is zero pages in size, that means that either (1) the @@ -46197,7 +54680,7 @@ static int hasHotJournal(Pager *pPager, int *pExists){ /* ** This function is called to obtain a shared lock on the database file. -** It is illegal to call sqlite3PagerAcquire() until after this function +** It is illegal to call sqlite3PagerGet() until after this function ** has been successfully called. If a shared-lock is already held when ** this function is called, it is a no-op. ** @@ -46228,17 +54711,17 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ /* This routine is only called from b-tree and only when there are no ** outstanding pages. This implies that the pager state should either ** be OPEN or READER. READER is only possible if the pager is or was in - ** exclusive access mode. - */ + ** exclusive access mode. */ assert( sqlite3PcacheRefCount(pPager->pPCache)==0 ); assert( assert_pager_state(pPager) ); assert( pPager->eState==PAGER_OPEN || pPager->eState==PAGER_READER ); - if( NEVER(MEMDB && pPager->errCode) ){ return pPager->errCode; } + assert( pPager->errCode==SQLITE_OK ); if( !pagerUseWal(pPager) && pPager->eState==PAGER_OPEN ){ int bHotJournal = 1; /* True if there exists a hot journal-file */ assert( !MEMDB ); + assert( pPager->tempFile==0 || pPager->eLock==EXCLUSIVE_LOCK ); rc = pager_wait_on_lock(pPager, SHARED_LOCK); if( rc!=SQLITE_OK ){ @@ -46324,7 +54807,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ assert( rc==SQLITE_OK ); rc = pagerSyncHotJournal(pPager); if( rc==SQLITE_OK ){ - rc = pager_playback(pPager, 1); + rc = pager_playback(pPager, !pPager->tempFile); pPager->eState = PAGER_OPEN; } }else if( !pPager->exclusiveMode ){ @@ -46358,14 +54841,14 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ); } - if( !pPager->tempFile && pPager->hasBeenUsed ){ + if( !pPager->tempFile && pPager->hasHeldSharedLock ){ /* The shared-lock has just been acquired then check to ** see if the database has been modified. If the database has changed, - ** flush the cache. The pPager->hasBeenUsed flag prevents this from + ** flush the cache. The hasHeldSharedLock flag prevents this from ** occurring on the very first access to a file, in order to save a ** single unnecessary sqlite3OsRead() call at the start-up. ** - ** Database changes is detected by looking at 15 bytes beginning + ** Database changes are detected by looking at 15 bytes beginning ** at offset 24 into the file. The first 4 of these 16 bytes are ** a 32-bit counter that is incremented with each change. The ** other bytes change randomly with each file change when @@ -46375,19 +54858,14 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** detected. The chance of an undetected change is so small that ** it can be neglected. */ - Pgno nPage = 0; char dbFileVers[sizeof(pPager->dbFileVers)]; - rc = pagerPagecount(pPager, &nPage); - if( rc ) goto failed; - - if( nPage>0 ){ - IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); - rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); - if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ + IOTRACE(("CKVERS %p %d\n", pPager, sizeof(dbFileVers))); + rc = sqlite3OsRead(pPager->fd, &dbFileVers, sizeof(dbFileVers), 24); + if( rc!=SQLITE_OK ){ + if( rc!=SQLITE_IOERR_SHORT_READ ){ goto failed; } - }else{ memset(dbFileVers, 0, sizeof(dbFileVers)); } @@ -46420,7 +54898,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ rc = pagerBeginReadTransaction(pPager); } - if( pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){ + if( pPager->tempFile==0 && pPager->eState==PAGER_OPEN && rc==SQLITE_OK ){ rc = pagerPagecount(pPager, &pPager->dbSize); } @@ -46431,6 +54909,7 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ assert( pPager->eState==PAGER_OPEN ); }else{ pPager->eState = PAGER_READER; + pPager->hasHeldSharedLock = 1; } return rc; } @@ -46444,16 +54923,24 @@ SQLITE_PRIVATE int sqlite3PagerSharedLock(Pager *pPager){ ** nothing to rollback, so this routine is a no-op. */ static void pagerUnlockIfUnused(Pager *pPager){ - if( pPager->nMmapOut==0 && (sqlite3PcacheRefCount(pPager->pPCache)==0) ){ + if( sqlite3PcacheRefCount(pPager->pPCache)==0 ){ + assert( pPager->nMmapOut==0 ); /* because page1 is never memory mapped */ pagerUnlockAndRollback(pPager); } } /* -** Acquire a reference to page number pgno in pager pPager (a page -** reference has type DbPage*). If the requested reference is +** The page getter methods each try to acquire a reference to a +** page with page number pgno. If the requested reference is ** successfully obtained, it is copied to *ppPage and SQLITE_OK returned. ** +** There are different implementations of the getter method depending +** on the current state of the pager. +** +** getPageNormal() -- The normal getter +** getPageError() -- Used if the pager is in an error state +** getPageMmap() -- Used if memory-mapped I/O is enabled +** ** If the requested page is already in the cache, it is returned. ** Otherwise, a new page object is allocated and populated with data ** read from the database file. In some cases, the pcache module may @@ -46465,14 +54952,14 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** already in the cache when this function is called, then the extra ** data is left as it was when the page object was last used. ** -** If the database image is smaller than the requested page or if a -** non-zero value is passed as the noContent parameter and the +** If the database image is smaller than the requested page or if +** the flags parameter contains the PAGER_GET_NOCONTENT bit and the ** requested page is not already stored in the cache, then no ** actual disk read occurs. In this case the memory image of the ** page is initialized to all zeros. ** -** If noContent is true, it means that we do not care about the contents -** of the page. This occurs in two scenarios: +** If PAGER_GET_NOCONTENT is true, it means that we do not care about +** the contents of the page. This occurs in two scenarios: ** ** a) When reading a free-list leaf page from the database, and ** @@ -46480,8 +54967,8 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** a new page into the cache to be filled with the data read ** from the savepoint journal. ** -** If noContent is true, then the data returned is zeroed instead of -** being read from the database. Additionally, the bits corresponding +** If PAGER_GET_NOCONTENT is true, then the data returned is zeroed instead +** of being read from the database. Additionally, the bits corresponding ** to pgno in Pager.pInJournal (bitvec of pages already written to the ** journal file) and the PagerSavepoint.pInSavepoint bitvecs of any open ** savepoints are set. This means if the page is made writable at any @@ -46499,97 +54986,40 @@ static void pagerUnlockIfUnused(Pager *pPager){ ** Since Lookup() never goes to disk, it never has to deal with locks ** or journal files. */ -SQLITE_PRIVATE int sqlite3PagerAcquire( +static int getPageNormal( Pager *pPager, /* The pager open on the database file */ Pgno pgno, /* Page number to fetch */ DbPage **ppPage, /* Write a pointer to the page here */ int flags /* PAGER_GET_XXX flags */ ){ int rc = SQLITE_OK; - PgHdr *pPg = 0; - u32 iFrame = 0; /* Frame to read from WAL file */ - const int noContent = (flags & PAGER_GET_NOCONTENT); - - /* It is acceptable to use a read-only (mmap) page for any page except - ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY - ** flag was specified by the caller. And so long as the db is not a - ** temporary or in-memory database. */ - const int bMmapOk = (pgno!=1 && USEFETCH(pPager) - && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) -#ifdef SQLITE_HAS_CODEC - && pPager->xCodec==0 -#endif - ); + PgHdr *pPg; + u8 noContent; /* True if PAGER_GET_NOCONTENT is set */ + sqlite3_pcache_page *pBase; + assert( pPager->errCode==SQLITE_OK ); assert( pPager->eState>=PAGER_READER ); assert( assert_pager_state(pPager) ); - assert( noContent==0 || bMmapOk==0 ); + assert( pPager->hasHeldSharedLock==1 ); - if( pgno==0 ){ - return SQLITE_CORRUPT_BKPT; - } - pPager->hasBeenUsed = 1; - - /* If the pager is in the error state, return an error immediately. - ** Otherwise, request the page from the PCache layer. */ - if( pPager->errCode!=SQLITE_OK ){ - rc = pPager->errCode; - }else{ - if( bMmapOk && pagerUseWal(pPager) ){ - rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); - if( rc!=SQLITE_OK ) goto pager_acquire_err; - } - - if( bMmapOk && iFrame==0 ){ - void *pData = 0; - - rc = sqlite3OsFetch(pPager->fd, - (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData - ); - - if( rc==SQLITE_OK && pData ){ - if( pPager->eState>PAGER_READER ){ - pPg = sqlite3PagerLookup(pPager, pgno); - } - if( pPg==0 ){ - rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); - }else{ - sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); - } - if( pPg ){ - assert( rc==SQLITE_OK ); - *ppPage = pPg; - return SQLITE_OK; - } - } - if( rc!=SQLITE_OK ){ - goto pager_acquire_err; - } - } - - { - sqlite3_pcache_page *pBase; - pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); - if( pBase==0 ){ - rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); - if( rc!=SQLITE_OK ) goto pager_acquire_err; - } - pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); - if( pPg==0 ) rc = SQLITE_NOMEM; - } - } - - if( rc!=SQLITE_OK ){ - /* Either the call to sqlite3PcacheFetch() returned an error or the - ** pager was already in the error-state when this function was called. - ** Set pPg to 0 and jump to the exception handler. */ + if( pgno==0 ) return SQLITE_CORRUPT_BKPT; + pBase = sqlite3PcacheFetch(pPager->pPCache, pgno, 3); + if( pBase==0 ){ pPg = 0; - goto pager_acquire_err; + rc = sqlite3PcacheFetchStress(pPager->pPCache, pgno, &pBase); + if( rc!=SQLITE_OK ) goto pager_acquire_err; + if( pBase==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto pager_acquire_err; + } } - assert( (*ppPage)->pgno==pgno ); - assert( (*ppPage)->pPager==pPager || (*ppPage)->pPager==0 ); + pPg = *ppPage = sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pBase); + assert( pPg==(*ppPage) ); + assert( pPg->pgno==pgno ); + assert( pPg->pPager==pPager || pPg->pPager==0 ); - if( (*ppPage)->pPager && !noContent ){ + noContent = (flags & PAGER_GET_NOCONTENT)!=0; + if( pPg->pPager && !noContent ){ /* In this case the pcache already contains an initialized copy of ** the page. Return without further ado. */ assert( pgno<=PAGER_MAX_PGNO && pgno!=PAGER_MJ_PGNO(pPager) ); @@ -46598,19 +55028,20 @@ SQLITE_PRIVATE int sqlite3PagerAcquire( }else{ /* The pager cache has created a new page. Its content needs to - ** be initialized. */ - - pPg = *ppPage; - pPg->pPager = pPager; - - /* The maximum page number is 2^31. Return SQLITE_CORRUPT if a page - ** number greater than this, or the unused locking-page, is requested. */ + ** be initialized. But first some error checks: + ** + ** (1) The maximum page number is 2^31 + ** (2) Never try to fetch the locking page + */ if( pgno>PAGER_MAX_PGNO || pgno==PAGER_MJ_PGNO(pPager) ){ rc = SQLITE_CORRUPT_BKPT; goto pager_acquire_err; } - if( MEMDB || pPager->dbSize<pgno || noContent || !isOpen(pPager->fd) ){ + pPg->pPager = pPager; + + assert( !isOpen(pPager->fd) || !MEMDB ); + if( !isOpen(pPager->fd) || pPager->dbSize<pgno || noContent ){ if( pgno>pPager->mxPgno ){ rc = SQLITE_FULL; goto pager_acquire_err; @@ -46634,20 +55065,15 @@ SQLITE_PRIVATE int sqlite3PagerAcquire( memset(pPg->pData, 0, pPager->pageSize); IOTRACE(("ZERO %p %d\n", pPager, pgno)); }else{ - if( pagerUseWal(pPager) && bMmapOk==0 ){ - rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); - if( rc!=SQLITE_OK ) goto pager_acquire_err; - } assert( pPg->pPager==pPager ); pPager->aStat[PAGER_STAT_MISS]++; - rc = readDbPage(pPg, iFrame); + rc = readDbPage(pPg); if( rc!=SQLITE_OK ){ goto pager_acquire_err; } } pager_set_pagehash(pPg); } - return SQLITE_OK; pager_acquire_err: @@ -46656,11 +55082,109 @@ pager_acquire_err: sqlite3PcacheDrop(pPg); } pagerUnlockIfUnused(pPager); - *ppPage = 0; return rc; } +#if SQLITE_MAX_MMAP_SIZE>0 +/* The page getter for when memory-mapped I/O is enabled */ +static int getPageMMap( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + int rc = SQLITE_OK; + PgHdr *pPg = 0; + u32 iFrame = 0; /* Frame to read from WAL file */ + + /* It is acceptable to use a read-only (mmap) page for any page except + ** page 1 if there is no write-transaction open or the ACQUIRE_READONLY + ** flag was specified by the caller. And so long as the db is not a + ** temporary or in-memory database. */ + const int bMmapOk = (pgno>1 + && (pPager->eState==PAGER_READER || (flags & PAGER_GET_READONLY)) + ); + + assert( USEFETCH(pPager) ); +#ifdef SQLITE_HAS_CODEC + assert( pPager->xCodec==0 ); +#endif + + /* Optimization note: Adding the "pgno<=1" term before "pgno==0" here + ** allows the compiler optimizer to reuse the results of the "pgno>1" + ** test in the previous statement, and avoid testing pgno==0 in the + ** common case where pgno is large. */ + if( pgno<=1 && pgno==0 ){ + return SQLITE_CORRUPT_BKPT; + } + assert( pPager->eState>=PAGER_READER ); + assert( assert_pager_state(pPager) ); + assert( pPager->hasHeldSharedLock==1 ); + assert( pPager->errCode==SQLITE_OK ); + + if( bMmapOk && pagerUseWal(pPager) ){ + rc = sqlite3WalFindFrame(pPager->pWal, pgno, &iFrame); + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + if( bMmapOk && iFrame==0 ){ + void *pData = 0; + rc = sqlite3OsFetch(pPager->fd, + (i64)(pgno-1) * pPager->pageSize, pPager->pageSize, &pData + ); + if( rc==SQLITE_OK && pData ){ + if( pPager->eState>PAGER_READER || pPager->tempFile ){ + pPg = sqlite3PagerLookup(pPager, pgno); + } + if( pPg==0 ){ + rc = pagerAcquireMapPage(pPager, pgno, pData, &pPg); + }else{ + sqlite3OsUnfetch(pPager->fd, (i64)(pgno-1)*pPager->pageSize, pData); + } + if( pPg ){ + assert( rc==SQLITE_OK ); + *ppPage = pPg; + return SQLITE_OK; + } + } + if( rc!=SQLITE_OK ){ + *ppPage = 0; + return rc; + } + } + return getPageNormal(pPager, pgno, ppPage, flags); +} +#endif /* SQLITE_MAX_MMAP_SIZE>0 */ + +/* The page getter method for when the pager is an error state */ +static int getPageError( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + UNUSED_PARAMETER(pgno); + UNUSED_PARAMETER(flags); + assert( pPager->errCode!=SQLITE_OK ); + *ppPage = 0; + return pPager->errCode; +} + + +/* Dispatch all page fetch requests to the appropriate getter method. +*/ +SQLITE_PRIVATE int sqlite3PagerGet( + Pager *pPager, /* The pager open on the database file */ + Pgno pgno, /* Page number to fetch */ + DbPage **ppPage, /* Write a pointer to the page here */ + int flags /* PAGER_GET_XXX flags */ +){ + return pPager->xGet(pPager, pgno, ppPage, flags); +} + /* ** Acquire a page if it is already in the in-memory cache. Do ** not read the page from disk. Return a pointer to the page, @@ -46678,32 +55202,48 @@ SQLITE_PRIVATE DbPage *sqlite3PagerLookup(Pager *pPager, Pgno pgno){ assert( pgno!=0 ); assert( pPager->pPCache!=0 ); pPage = sqlite3PcacheFetch(pPager->pPCache, pgno, 0); - assert( pPage==0 || pPager->hasBeenUsed ); + assert( pPage==0 || pPager->hasHeldSharedLock ); + if( pPage==0 ) return 0; return sqlite3PcacheFetchFinish(pPager->pPCache, pgno, pPage); } /* ** Release a page reference. ** -** If the number of references to the page drop to zero, then the -** page is added to the LRU list. When all references to all pages -** are released, a rollback occurs and the lock on the database is -** removed. +** The sqlite3PagerUnref() and sqlite3PagerUnrefNotNull() may only be +** used if we know that the page being released is not the last page. +** The btree layer always holds page1 open until the end, so these first +** to routines can be used to release any page other than BtShared.pPage1. +** +** Use sqlite3PagerUnrefPageOne() to release page1. This latter routine +** checks the total number of outstanding pages and if the number of +** pages reaches zero it drops the database lock. */ SQLITE_PRIVATE void sqlite3PagerUnrefNotNull(DbPage *pPg){ - Pager *pPager; + TESTONLY( Pager *pPager = pPg->pPager; ) assert( pPg!=0 ); - pPager = pPg->pPager; if( pPg->flags & PGHDR_MMAP ){ + assert( pPg->pgno!=1 ); /* Page1 is never memory mapped */ pagerReleaseMapPage(pPg); }else{ sqlite3PcacheRelease(pPg); } - pagerUnlockIfUnused(pPager); + /* Do not use this routine to release the last reference to page1 */ + assert( sqlite3PcacheRefCount(pPager->pPCache)>0 ); } SQLITE_PRIVATE void sqlite3PagerUnref(DbPage *pPg){ if( pPg ) sqlite3PagerUnrefNotNull(pPg); } +SQLITE_PRIVATE void sqlite3PagerUnrefPageOne(DbPage *pPg){ + Pager *pPager; + assert( pPg!=0 ); + assert( pPg->pgno==1 ); + assert( (pPg->flags & PGHDR_MMAP)==0 ); /* Page1 is never memory mapped */ + pPager = pPg->pPager; + sqlite3PagerResetLockTimeout(pPager); + sqlite3PcacheRelease(pPg); + pagerUnlockIfUnused(pPager); +} /* ** This function is called at the start of every write transaction. @@ -46743,7 +55283,7 @@ static int pager_open_journal(Pager *pPager){ if( !pagerUseWal(pPager) && pPager->journalMode!=PAGER_JOURNALMODE_OFF ){ pPager->pInJournal = sqlite3BitvecCreate(pPager->dbSize); if( pPager->pInJournal==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } /* Open the journal file if it is not already open. */ @@ -46751,24 +55291,24 @@ static int pager_open_journal(Pager *pPager){ if( pPager->journalMode==PAGER_JOURNALMODE_MEMORY ){ sqlite3MemJournalOpen(pPager->jfd); }else{ - const int flags = /* VFS flags to open journal file */ - SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE| - (pPager->tempFile ? - (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL): - (SQLITE_OPEN_MAIN_JOURNAL) - ); + int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + int nSpill; + if( pPager->tempFile ){ + flags |= (SQLITE_OPEN_DELETEONCLOSE|SQLITE_OPEN_TEMP_JOURNAL); + nSpill = sqlite3Config.nStmtSpill; + }else{ + flags |= SQLITE_OPEN_MAIN_JOURNAL; + nSpill = jrnlBufferSize(pPager); + } + /* Verify that the database still has the same name as it did when ** it was originally opened. */ rc = databaseIsUnmoved(pPager); if( rc==SQLITE_OK ){ -#ifdef SQLITE_ENABLE_ATOMIC_WRITE - rc = sqlite3JournalOpen( - pVfs, pPager->zJournal, pPager->jfd, flags, jrnlBufferSize(pPager) + rc = sqlite3JournalOpen ( + pVfs, pPager->zJournal, pPager->jfd, flags, nSpill ); -#else - rc = sqlite3OsOpen(pVfs, pPager->zJournal, pPager->jfd, flags, 0); -#endif } } assert( rc!=SQLITE_OK || isOpen(pPager->jfd) ); @@ -46835,7 +55375,7 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory if( rc!=SQLITE_OK ){ return rc; } - sqlite3WalExclusiveMode(pPager->pWal, 1); + (void)sqlite3WalExclusiveMode(pPager->pWal, 1); } /* Grab the write lock on the log file. If successful, upgrade to @@ -46882,6 +55422,59 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory return rc; } +/* +** Write page pPg onto the end of the rollback journal. +*/ +static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ + Pager *pPager = pPg->pPager; + int rc; + u32 cksum; + char *pData2; + i64 iOff = pPager->journalOff; + + /* We should never write to the journal file the page that + ** contains the database locks. The following assert verifies + ** that we do not. */ + assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); + + assert( pPager->journalHdr<=pPager->journalOff ); + CODEC2(pPager, pPg->pData, pPg->pgno, 7, return SQLITE_NOMEM_BKPT, pData2); + cksum = pager_cksum(pPager, (u8*)pData2); + + /* Even if an IO or diskfull error occurs while journalling the + ** page in the block above, set the need-sync flag for the page. + ** Otherwise, when the transaction is rolled back, the logic in + ** playback_one_page() will think that the page needs to be restored + ** in the database file. And if an IO error occurs while doing so, + ** then corruption may follow. + */ + pPg->flags |= PGHDR_NEED_SYNC; + + rc = write32bits(pPager->jfd, iOff, pPg->pgno); + if( rc!=SQLITE_OK ) return rc; + rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4); + if( rc!=SQLITE_OK ) return rc; + rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum); + if( rc!=SQLITE_OK ) return rc; + + IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, + pPager->journalOff, pPager->pageSize)); + PAGER_INCR(sqlite3_pager_writej_count); + PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg))); + + pPager->journalOff += 8 + pPager->pageSize; + pPager->nRec++; + assert( pPager->pInJournal!=0 ); + rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno); + testcase( rc==SQLITE_NOMEM ); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + rc |= addToSavepointBitvecs(pPager, pPg->pgno); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + return rc; +} + /* ** Mark a single data page as writeable. The page is written into the ** main journal or sub-journal as required. If the page is written into @@ -46892,7 +55485,6 @@ SQLITE_PRIVATE int sqlite3PagerBegin(Pager *pPager, int exFlag, int subjInMemory static int pager_write(PgHdr *pPg){ Pager *pPager = pPg->pPager; int rc = SQLITE_OK; - int inJournal; /* This routine is not called unless a write-transaction has already ** been started. The journal file may or may not be open at this point. @@ -46905,7 +55497,6 @@ static int pager_write(PgHdr *pPg){ assert( assert_pager_state(pPager) ); assert( pPager->errCode==0 ); assert( pPager->readOnly==0 ); - CHECK_PAGE(pPg); /* The journal file needs to be opened. Higher level routines have already @@ -46924,91 +55515,48 @@ static int pager_write(PgHdr *pPg){ assert( pPager->eState>=PAGER_WRITER_CACHEMOD ); assert( assert_pager_state(pPager) ); - /* Mark the page as dirty. If the page has already been written - ** to the journal then we can return right away. - */ + /* Mark the page that is about to be modified as dirty. */ sqlite3PcacheMakeDirty(pPg); - inJournal = pageInJournal(pPager, pPg); - if( inJournal && (pPager->nSavepoint==0 || !subjRequiresPage(pPg)) ){ - assert( !pagerUseWal(pPager) ); - }else{ - - /* The transaction journal now exists and we have a RESERVED or an - ** EXCLUSIVE lock on the main database file. Write the current page to - ** the transaction journal if it is not there already. - */ - if( !inJournal && !pagerUseWal(pPager) ){ - assert( pagerUseWal(pPager)==0 ); - if( pPg->pgno<=pPager->dbOrigSize && isOpen(pPager->jfd) ){ - u32 cksum; - char *pData2; - i64 iOff = pPager->journalOff; - /* We should never write to the journal file the page that - ** contains the database locks. The following assert verifies - ** that we do not. */ - assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); - - assert( pPager->journalHdr<=pPager->journalOff ); - CODEC2(pPager, pPg->pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); - cksum = pager_cksum(pPager, (u8*)pData2); - - /* Even if an IO or diskfull error occurs while journalling the - ** page in the block above, set the need-sync flag for the page. - ** Otherwise, when the transaction is rolled back, the logic in - ** playback_one_page() will think that the page needs to be restored - ** in the database file. And if an IO error occurs while doing so, - ** then corruption may follow. - */ - pPg->flags |= PGHDR_NEED_SYNC; - - rc = write32bits(pPager->jfd, iOff, pPg->pgno); - if( rc!=SQLITE_OK ) return rc; - rc = sqlite3OsWrite(pPager->jfd, pData2, pPager->pageSize, iOff+4); - if( rc!=SQLITE_OK ) return rc; - rc = write32bits(pPager->jfd, iOff+pPager->pageSize+4, cksum); - if( rc!=SQLITE_OK ) return rc; - - IOTRACE(("JOUT %p %d %lld %d\n", pPager, pPg->pgno, - pPager->journalOff, pPager->pageSize)); - PAGER_INCR(sqlite3_pager_writej_count); - PAGERTRACE(("JOURNAL %d page %d needSync=%d hash(%08x)\n", - PAGERID(pPager), pPg->pgno, - ((pPg->flags&PGHDR_NEED_SYNC)?1:0), pager_pagehash(pPg))); - - pPager->journalOff += 8 + pPager->pageSize; - pPager->nRec++; - assert( pPager->pInJournal!=0 ); - rc = sqlite3BitvecSet(pPager->pInJournal, pPg->pgno); - testcase( rc==SQLITE_NOMEM ); - assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); - rc |= addToSavepointBitvecs(pPager, pPg->pgno); - if( rc!=SQLITE_OK ){ - assert( rc==SQLITE_NOMEM ); - return rc; - } - }else{ - if( pPager->eState!=PAGER_WRITER_DBMOD ){ - pPg->flags |= PGHDR_NEED_SYNC; - } - PAGERTRACE(("APPEND %d page %d needSync=%d\n", - PAGERID(pPager), pPg->pgno, - ((pPg->flags&PGHDR_NEED_SYNC)?1:0))); + /* If a rollback journal is in use, them make sure the page that is about + ** to change is in the rollback journal, or if the page is a new page off + ** then end of the file, make sure it is marked as PGHDR_NEED_SYNC. + */ + assert( (pPager->pInJournal!=0) == isOpen(pPager->jfd) ); + if( pPager->pInJournal!=0 + && sqlite3BitvecTestNotNull(pPager->pInJournal, pPg->pgno)==0 + ){ + assert( pagerUseWal(pPager)==0 ); + if( pPg->pgno<=pPager->dbOrigSize ){ + rc = pagerAddPageToRollbackJournal(pPg); + if( rc!=SQLITE_OK ){ + return rc; } - } - - /* If the statement journal is open and the page is not in it, - ** then write the current page to the statement journal. Note that - ** the statement journal format differs from the standard journal format - ** in that it omits the checksums and the header. - */ - if( pPager->nSavepoint>0 && subjRequiresPage(pPg) ){ - rc = subjournalPage(pPg); + }else{ + if( pPager->eState!=PAGER_WRITER_DBMOD ){ + pPg->flags |= PGHDR_NEED_SYNC; + } + PAGERTRACE(("APPEND %d page %d needSync=%d\n", + PAGERID(pPager), pPg->pgno, + ((pPg->flags&PGHDR_NEED_SYNC)?1:0))); } } - /* Update the database size and return. + /* The PGHDR_DIRTY bit is set above when the page was added to the dirty-list + ** and before writing the page into the rollback journal. Wait until now, + ** after the page has been successfully journalled, before setting the + ** PGHDR_WRITEABLE bit that indicates that the page can be safely modified. */ + pPg->flags |= PGHDR_WRITEABLE; + + /* If the statement journal is open and the page is not in it, + ** then write the page into the statement journal. + */ + if( pPager->nSavepoint>0 ){ + rc = subjournalPageIfRequired(pPg); + } + + /* Update the database size and return. */ if( pPager->dbSize<pPg->pgno ){ pPager->dbSize = pPg->pgno; } @@ -47023,17 +55571,17 @@ static int pager_write(PgHdr *pPg){ ** a write. ** ** Usually, the sector size is less than or equal to the page size, in which -** case pages can be individually written. This routine only runs in the exceptional -** case where the page size is smaller than the sector size. +** case pages can be individually written. This routine only runs in the +** exceptional case where the page size is smaller than the sector size. */ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ - int rc = SQLITE_OK; /* Return code */ - Pgno nPageCount; /* Total number of pages in database file */ - Pgno pg1; /* First page of the sector pPg is located on. */ - int nPage = 0; /* Number of pages starting at pg1 to journal */ - int ii; /* Loop counter */ - int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ - Pager *pPager = pPg->pPager; /* The pager that owns pPg */ + int rc = SQLITE_OK; /* Return code */ + Pgno nPageCount; /* Total number of pages in database file */ + Pgno pg1; /* First page of the sector pPg is located on. */ + int nPage = 0; /* Number of pages starting at pg1 to journal */ + int ii; /* Loop counter */ + int needSync = 0; /* True if any page has PGHDR_NEED_SYNC */ + Pager *pPager = pPg->pPager; /* The pager that owns pPg */ Pgno nPagePerSector = (pPager->sectorSize/pPager->pageSize); /* Set the doNotSpill NOSYNC bit to 1. This is because we cannot allow @@ -47067,7 +55615,7 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ PgHdr *pPage; if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ if( pg!=PAGER_MJ_PGNO(pPager) ){ - rc = sqlite3PagerGet(pPager, pg, &pPage); + rc = sqlite3PagerGet(pPager, pg, &pPage, 0); if( rc==SQLITE_OK ){ rc = pager_write(pPage); if( pPage->flags&PGHDR_NEED_SYNC ){ @@ -47121,11 +55669,17 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ ** as appropriate. Otherwise, SQLITE_OK. */ SQLITE_PRIVATE int sqlite3PagerWrite(PgHdr *pPg){ + Pager *pPager = pPg->pPager; assert( (pPg->flags & PGHDR_MMAP)==0 ); - assert( pPg->pPager->eState>=PAGER_WRITER_LOCKED ); - assert( pPg->pPager->eState!=PAGER_ERROR ); - assert( assert_pager_state(pPg->pPager) ); - if( pPg->pPager->sectorSize > (u32)pPg->pPager->pageSize ){ + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + if( (pPg->flags & PGHDR_WRITEABLE)!=0 && pPager->dbSize>=pPg->pgno ){ + if( pPager->nSavepoint ) return subjournalPageIfRequired(pPg); + return SQLITE_OK; + }else if( pPager->errCode ){ + return pPager->errCode; + }else if( pPager->sectorSize > (u32)pPager->pageSize ){ + assert( pPager->tempFile==0 ); return pagerWriteLargeSector(pPg); }else{ return pager_write(pPg); @@ -47139,7 +55693,7 @@ SQLITE_PRIVATE int sqlite3PagerWrite(PgHdr *pPg){ */ #ifndef NDEBUG SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ - return pPg->flags&PGHDR_DIRTY; + return pPg->flags & PGHDR_WRITEABLE; } #endif @@ -47156,13 +55710,21 @@ SQLITE_PRIVATE int sqlite3PagerIswriteable(DbPage *pPg){ ** ** Tests show that this optimization can quadruple the speed of large ** DELETE operations. +** +** This optimization cannot be used with a temp-file, as the page may +** have been dirty at the start of the transaction. In that case, if +** memory pressure forces page pPg out of the cache, the data does need +** to be written out to disk so that it may be read back in if the +** current transaction is rolled back. */ SQLITE_PRIVATE void sqlite3PagerDontWrite(PgHdr *pPg){ Pager *pPager = pPg->pPager; - if( (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){ + if( !pPager->tempFile && (pPg->flags&PGHDR_DIRTY) && pPager->nSavepoint==0 ){ PAGERTRACE(("DONT_WRITE page %d of %d\n", pPg->pgno, PAGERID(pPager))); IOTRACE(("CLEAN %p %d\n", pPager, pPg->pgno)) pPg->flags |= PGHDR_DONT_WRITE; + pPg->flags &= ~PGHDR_WRITEABLE; + testcase( pPg->flags & PGHDR_NEED_SYNC ); pager_set_pagehash(pPg); } } @@ -47221,7 +55783,7 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ assert( !pPager->tempFile && isOpen(pPager->fd) ); /* Open page 1 of the file for writing. */ - rc = sqlite3PagerGet(pPager, 1, &pPgHdr); + rc = sqlite3PagerGet(pPager, 1, &pPgHdr, 0); assert( pPgHdr==0 || rc==SQLITE_OK ); /* If page one was fetched successfully, and this function is not @@ -47241,7 +55803,7 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ if( DIRECT_MODE ){ const void *zBuf; assert( pPager->dbFileSize>0 ); - CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM, zBuf); + CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM_BKPT, zBuf); if( rc==SQLITE_OK ){ rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); pPager->aStat[PAGER_STAT_WRITE]++; @@ -47274,12 +55836,9 @@ static int pager_incr_changecounter(Pager *pPager, int isDirectMode){ */ SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){ int rc = SQLITE_OK; - - if( isOpen(pPager->fd) ){ - void *pArg = (void*)zMaster; - rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); - if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; - } + void *pArg = (void*)zMaster; + rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC, pArg); + if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; if( rc==SQLITE_OK && !pPager->noSync ){ assert( !MEMDB ); rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); @@ -47299,14 +55858,17 @@ SQLITE_PRIVATE int sqlite3PagerSync(Pager *pPager, const char *zMaster){ ** returned. */ SQLITE_PRIVATE int sqlite3PagerExclusiveLock(Pager *pPager){ - int rc = SQLITE_OK; - assert( pPager->eState==PAGER_WRITER_CACHEMOD - || pPager->eState==PAGER_WRITER_DBMOD - || pPager->eState==PAGER_WRITER_LOCKED - ); + int rc = pPager->errCode; assert( assert_pager_state(pPager) ); - if( 0==pagerUseWal(pPager) ){ - rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + if( rc==SQLITE_OK ){ + assert( pPager->eState==PAGER_WRITER_CACHEMOD + || pPager->eState==PAGER_WRITER_DBMOD + || pPager->eState==PAGER_WRITER_LOCKED + ); + assert( assert_pager_state(pPager) ); + if( 0==pagerUseWal(pPager) ){ + rc = pager_wait_on_lock(pPager, EXCLUSIVE_LOCK); + } } return rc; } @@ -47354,17 +55916,21 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( /* If a prior error occurred, report that error again. */ if( NEVER(pPager->errCode) ) return pPager->errCode; + /* Provide the ability to easily simulate an I/O error during testing */ + if( sqlite3FaultSim(400) ) return SQLITE_IOERR; + PAGERTRACE(("DATABASE SYNC: File=%s zMaster=%s nSize=%d\n", pPager->zFilename, zMaster, pPager->dbSize)); /* If no database changes have been made, return early. */ if( pPager->eState<PAGER_WRITER_CACHEMOD ) return SQLITE_OK; - if( MEMDB ){ + assert( MEMDB==0 || pPager->tempFile ); + assert( isOpen(pPager->fd) || pPager->tempFile ); + if( 0==pagerFlushOnCommit(pPager, 1) ){ /* If this is an in-memory db, or no pages have been written to, or this ** function has already been called, it is mostly a no-op. However, any - ** backup in progress needs to be restarted. - */ + ** backup in progress needs to be restarted. */ sqlite3BackupRestart(pPager->pBackup); }else{ if( pagerUseWal(pPager) ){ @@ -47373,7 +55939,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( if( pList==0 ){ /* Must have at least one page for the WAL commit flag. ** Ticket [2d1a5c67dfc2363e44f29d9bbd57f] 2011-05-18 */ - rc = sqlite3PagerGet(pPager, 1, &pPageOne); + rc = sqlite3PagerGet(pPager, 1, &pPageOne, 0); pList = pPageOne; pList->pDirty = 0; } @@ -47386,6 +55952,21 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( sqlite3PcacheCleanAll(pPager->pPCache); } }else{ + /* The bBatch boolean is true if the batch-atomic-write commit method + ** should be used. No rollback journal is created if batch-atomic-write + ** is enabled. + */ + sqlite3_file *fd = pPager->fd; +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + const int bBatch = zMaster==0 /* An SQLITE_IOCAP_BATCH_ATOMIC commit */ + && (sqlite3OsDeviceCharacteristics(fd) & SQLITE_IOCAP_BATCH_ATOMIC) + && !pPager->noSync + && sqlite3JournalIsInMemory(pPager->jfd); +#else +# define bBatch 0 +#endif + +#ifdef SQLITE_ENABLE_ATOMIC_WRITE /* The following block updates the change-counter. Exactly how it ** does this depends on whether or not the atomic-update optimization ** was enabled at compile time, and if this transaction meets the @@ -47409,33 +55990,40 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** in 'direct' mode. In this case the journal file will never be ** created for this transaction. */ - #ifdef SQLITE_ENABLE_ATOMIC_WRITE - PgHdr *pPg; - assert( isOpen(pPager->jfd) - || pPager->journalMode==PAGER_JOURNALMODE_OFF - || pPager->journalMode==PAGER_JOURNALMODE_WAL - ); - if( !zMaster && isOpen(pPager->jfd) - && pPager->journalOff==jrnlBufferSize(pPager) - && pPager->dbSize>=pPager->dbOrigSize - && (0==(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty) - ){ - /* Update the db file change counter via the direct-write method. The - ** following call will modify the in-memory representation of page 1 - ** to include the updated change counter and then write page 1 - ** directly to the database file. Because of the atomic-write - ** property of the host file-system, this is safe. - */ - rc = pager_incr_changecounter(pPager, 1); - }else{ - rc = sqlite3JournalCreate(pPager->jfd); - if( rc==SQLITE_OK ){ - rc = pager_incr_changecounter(pPager, 0); + if( bBatch==0 ){ + PgHdr *pPg; + assert( isOpen(pPager->jfd) + || pPager->journalMode==PAGER_JOURNALMODE_OFF + || pPager->journalMode==PAGER_JOURNALMODE_WAL + ); + if( !zMaster && isOpen(pPager->jfd) + && pPager->journalOff==jrnlBufferSize(pPager) + && pPager->dbSize>=pPager->dbOrigSize + && (!(pPg = sqlite3PcacheDirtyList(pPager->pPCache)) || 0==pPg->pDirty) + ){ + /* Update the db file change counter via the direct-write method. The + ** following call will modify the in-memory representation of page 1 + ** to include the updated change counter and then write page 1 + ** directly to the database file. Because of the atomic-write + ** property of the host file-system, this is safe. + */ + rc = pager_incr_changecounter(pPager, 1); + }else{ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc==SQLITE_OK ){ + rc = pager_incr_changecounter(pPager, 0); + } } } - #else +#else +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + if( zMaster ){ + rc = sqlite3JournalCreate(pPager->jfd); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + } +#endif rc = pager_incr_changecounter(pPager, 0); - #endif +#endif if( rc!=SQLITE_OK ) goto commit_phase_one_exit; /* Write the master journal name into the journal file. If a master @@ -47458,8 +56046,25 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( */ rc = syncJournal(pPager, 0); if( rc!=SQLITE_OK ) goto commit_phase_one_exit; - + + if( bBatch ){ + /* The pager is now in DBMOD state. But regardless of what happens + ** next, attempting to play the journal back into the database would + ** be unsafe. Close it now to make sure that does not happen. */ + sqlite3OsClose(pPager->jfd); + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_BEGIN_ATOMIC_WRITE, 0); + if( rc!=SQLITE_OK ) goto commit_phase_one_exit; + } rc = pager_write_pagelist(pPager,sqlite3PcacheDirtyList(pPager->pPCache)); + if( bBatch ){ + if( rc==SQLITE_OK ){ + rc = sqlite3OsFileControl(fd, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, 0); + } + if( rc!=SQLITE_OK ){ + sqlite3OsFileControlHint(fd, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, 0); + } + } + if( rc!=SQLITE_OK ){ assert( rc!=SQLITE_IOERR_BLOCKED ); goto commit_phase_one_exit; @@ -47603,6 +56208,7 @@ SQLITE_PRIVATE int sqlite3PagerRollback(Pager *pPager){ */ pPager->errCode = SQLITE_ABORT; pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); return rc; } }else{ @@ -47629,12 +56235,14 @@ SQLITE_PRIVATE u8 sqlite3PagerIsreadonly(Pager *pPager){ return pPager->readOnly; } +#ifdef SQLITE_DEBUG /* -** Return the number of references to the pager. +** Return the sum of the reference counts for all pages held by pPager. */ SQLITE_PRIVATE int sqlite3PagerRefcount(Pager *pPager){ return sqlite3PcacheRefCount(pPager->pPCache); } +#endif /* ** Return the approximate number of bytes of memory currently @@ -47677,8 +56285,12 @@ SQLITE_PRIVATE int *sqlite3PagerStats(Pager *pPager){ #endif /* -** Parameter eStat must be either SQLITE_DBSTATUS_CACHE_HIT or -** SQLITE_DBSTATUS_CACHE_MISS. Before returning, *pnVal is incremented by the +** Parameter eStat must be one of SQLITE_DBSTATUS_CACHE_HIT, _MISS, _WRITE, +** or _WRITE+1. The SQLITE_DBSTATUS_CACHE_WRITE+1 case is a translation +** of SQLITE_DBSTATUS_CACHE_SPILL. The _SPILL case is not contiguous because +** it was added later. +** +** Before returning, *pnVal is incremented by the ** current cache hit or miss count, according to the value of eStat. If the ** reset parameter is non-zero, the cache hit or miss count is zeroed before ** returning. @@ -47688,23 +56300,26 @@ SQLITE_PRIVATE void sqlite3PagerCacheStat(Pager *pPager, int eStat, int reset, i assert( eStat==SQLITE_DBSTATUS_CACHE_HIT || eStat==SQLITE_DBSTATUS_CACHE_MISS || eStat==SQLITE_DBSTATUS_CACHE_WRITE + || eStat==SQLITE_DBSTATUS_CACHE_WRITE+1 ); assert( SQLITE_DBSTATUS_CACHE_HIT+1==SQLITE_DBSTATUS_CACHE_MISS ); assert( SQLITE_DBSTATUS_CACHE_HIT+2==SQLITE_DBSTATUS_CACHE_WRITE ); - assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 && PAGER_STAT_WRITE==2 ); + assert( PAGER_STAT_HIT==0 && PAGER_STAT_MISS==1 + && PAGER_STAT_WRITE==2 && PAGER_STAT_SPILL==3 ); - *pnVal += pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT]; + eStat -= SQLITE_DBSTATUS_CACHE_HIT; + *pnVal += pPager->aStat[eStat]; if( reset ){ - pPager->aStat[eStat - SQLITE_DBSTATUS_CACHE_HIT] = 0; + pPager->aStat[eStat] = 0; } } /* -** Return true if this is an in-memory pager. +** Return true if this is an in-memory or temp-file backed pager. */ SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ - return MEMDB; + return pPager->tempFile; } /* @@ -47717,54 +56332,62 @@ SQLITE_PRIVATE int sqlite3PagerIsMemdb(Pager *pPager){ ** occurs while opening the sub-journal file, then an IO error code is ** returned. Otherwise, SQLITE_OK. */ -SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ +static SQLITE_NOINLINE int pagerOpenSavepoint(Pager *pPager, int nSavepoint){ int rc = SQLITE_OK; /* Return code */ int nCurrent = pPager->nSavepoint; /* Current number of savepoints */ + int ii; /* Iterator variable */ + PagerSavepoint *aNew; /* New Pager.aSavepoint array */ assert( pPager->eState>=PAGER_WRITER_LOCKED ); assert( assert_pager_state(pPager) ); + assert( nSavepoint>nCurrent && pPager->useJournal ); - if( nSavepoint>nCurrent && pPager->useJournal ){ - int ii; /* Iterator variable */ - PagerSavepoint *aNew; /* New Pager.aSavepoint array */ - - /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM - ** if the allocation fails. Otherwise, zero the new portion in case a - ** malloc failure occurs while populating it in the for(...) loop below. - */ - aNew = (PagerSavepoint *)sqlite3Realloc( - pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint - ); - if( !aNew ){ - return SQLITE_NOMEM; - } - memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint)); - pPager->aSavepoint = aNew; - - /* Populate the PagerSavepoint structures just allocated. */ - for(ii=nCurrent; ii<nSavepoint; ii++){ - aNew[ii].nOrig = pPager->dbSize; - if( isOpen(pPager->jfd) && pPager->journalOff>0 ){ - aNew[ii].iOffset = pPager->journalOff; - }else{ - aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager); - } - aNew[ii].iSubRec = pPager->nSubRec; - aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize); - if( !aNew[ii].pInSavepoint ){ - return SQLITE_NOMEM; - } - if( pagerUseWal(pPager) ){ - sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData); - } - pPager->nSavepoint = ii+1; - } - assert( pPager->nSavepoint==nSavepoint ); - assertTruncateConstraint(pPager); + /* Grow the Pager.aSavepoint array using realloc(). Return SQLITE_NOMEM + ** if the allocation fails. Otherwise, zero the new portion in case a + ** malloc failure occurs while populating it in the for(...) loop below. + */ + aNew = (PagerSavepoint *)sqlite3Realloc( + pPager->aSavepoint, sizeof(PagerSavepoint)*nSavepoint + ); + if( !aNew ){ + return SQLITE_NOMEM_BKPT; } + memset(&aNew[nCurrent], 0, (nSavepoint-nCurrent) * sizeof(PagerSavepoint)); + pPager->aSavepoint = aNew; + /* Populate the PagerSavepoint structures just allocated. */ + for(ii=nCurrent; ii<nSavepoint; ii++){ + aNew[ii].nOrig = pPager->dbSize; + if( isOpen(pPager->jfd) && pPager->journalOff>0 ){ + aNew[ii].iOffset = pPager->journalOff; + }else{ + aNew[ii].iOffset = JOURNAL_HDR_SZ(pPager); + } + aNew[ii].iSubRec = pPager->nSubRec; + aNew[ii].pInSavepoint = sqlite3BitvecCreate(pPager->dbSize); + if( !aNew[ii].pInSavepoint ){ + return SQLITE_NOMEM_BKPT; + } + if( pagerUseWal(pPager) ){ + sqlite3WalSavepoint(pPager->pWal, aNew[ii].aWalData); + } + pPager->nSavepoint = ii+1; + } + assert( pPager->nSavepoint==nSavepoint ); + assertTruncateConstraint(pPager); return rc; } +SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ + assert( pPager->eState>=PAGER_WRITER_LOCKED ); + assert( assert_pager_state(pPager) ); + + if( nSavepoint>pPager->nSavepoint && pPager->useJournal ){ + return pagerOpenSavepoint(pPager, nSavepoint); + }else{ + return SQLITE_OK; + } +} + /* ** This function is called to rollback or release (commit) a savepoint. @@ -47797,7 +56420,11 @@ SQLITE_PRIVATE int sqlite3PagerOpenSavepoint(Pager *pPager, int nSavepoint){ ** savepoint. If no errors occur, SQLITE_OK is returned. */ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ - int rc = pPager->errCode; /* Return code */ + int rc = pPager->errCode; + +#ifdef SQLITE_ENABLE_ZIPVFS + if( op==SAVEPOINT_RELEASE ) rc = SQLITE_OK; +#endif assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); assert( iSavepoint>=0 || op==SAVEPOINT_ROLLBACK ); @@ -47821,7 +56448,7 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ if( op==SAVEPOINT_RELEASE ){ if( nNew==0 && isOpen(pPager->sjfd) ){ /* Only truncate if it is an in-memory sub-journal. */ - if( sqlite3IsMemJournal(pPager->sjfd) ){ + if( sqlite3JournalIsInMemory(pPager->sjfd) ){ rc = sqlite3OsTruncate(pPager->sjfd, 0); assert( rc==SQLITE_OK ); } @@ -47838,6 +56465,21 @@ SQLITE_PRIVATE int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ rc = pagerPlaybackSavepoint(pPager, pSavepoint); assert(rc!=SQLITE_DONE); } + +#ifdef SQLITE_ENABLE_ZIPVFS + /* If the cache has been modified but the savepoint cannot be rolled + ** back journal_mode=off, put the pager in the error state. This way, + ** if the VFS used by this pager includes ZipVFS, the entire transaction + ** can be rolled back at the ZipVFS level. */ + else if( + pPager->journalMode==PAGER_JOURNALMODE_OFF + && pPager->eState>=PAGER_WRITER_CACHEMOD + ){ + pPager->errCode = SQLITE_ABORT; + pPager->eState = PAGER_ERROR; + setGetterMethod(pPager); + } +#endif } return rc; @@ -47860,7 +56502,7 @@ SQLITE_PRIVATE const char *sqlite3PagerFilename(Pager *pPager, int nullIfMemDb){ /* ** Return the VFS structure for the pager. */ -SQLITE_PRIVATE const sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ +SQLITE_PRIVATE sqlite3_vfs *sqlite3PagerVfs(Pager *pPager){ return pPager->pVfs; } @@ -47873,6 +56515,28 @@ SQLITE_PRIVATE sqlite3_file *sqlite3PagerFile(Pager *pPager){ return pPager->fd; } +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT +/* +** Reset the lock timeout for pager. +*/ +SQLITE_PRIVATE void sqlite3PagerResetLockTimeout(Pager *pPager){ + int x = 0; + sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_LOCK_TIMEOUT, &x); +} +#endif + +/* +** Return the file handle for the journal file (if it exists). +** This will be either the rollback journal or the WAL file. +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3PagerJrnlFile(Pager *pPager){ +#if SQLITE_OMIT_WAL + return pPager->jfd; +#else + return pPager->pWal ? sqlite3WalFile(pPager->pWal) : pPager->jfd; +#endif +} + /* ** Return the full pathname of the journal file. */ @@ -47880,14 +56544,6 @@ SQLITE_PRIVATE const char *sqlite3PagerJournalname(Pager *pPager){ return pPager->zJournal; } -/* -** Return true if fsync() calls are disabled for this pager. Return FALSE -** if fsync()s are executed normally. -*/ -SQLITE_PRIVATE int sqlite3PagerNosync(Pager *pPager){ - return pPager->noSync; -} - #ifdef SQLITE_HAS_CODEC /* ** Set or retrieve the codec for this pager @@ -47904,6 +56560,7 @@ SQLITE_PRIVATE void sqlite3PagerSetCodec( pPager->xCodecSizeChng = xCodecSizeChng; pPager->xCodecFree = xCodecFree; pPager->pCodec = pCodec; + setGetterMethod(pPager); pagerReportSize(pPager); } SQLITE_PRIVATE void *sqlite3PagerGetCodec(Pager *pPager){ @@ -47972,7 +56629,8 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i /* In order to be able to rollback, an in-memory database must journal ** the page we are moving from. */ - if( MEMDB ){ + assert( pPager->tempFile || !MEMDB ); + if( pPager->tempFile ){ rc = sqlite3PagerWrite(pPg); if( rc ) return rc; } @@ -47995,9 +56653,8 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** one or more savepoint bitvecs. This is the reason this function ** may return SQLITE_NOMEM. */ - if( pPg->flags&PGHDR_DIRTY - && subjRequiresPage(pPg) - && SQLITE_OK!=(rc = subjournalPage(pPg)) + if( (pPg->flags & PGHDR_DIRTY)!=0 + && SQLITE_OK!=(rc = subjournalPageIfRequired(pPg)) ){ return rc; } @@ -48030,7 +56687,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i assert( !pPgOld || pPgOld->nRef==1 ); if( pPgOld ){ pPg->flags |= (pPgOld->flags&PGHDR_NEED_SYNC); - if( MEMDB ){ + if( pPager->tempFile ){ /* Do not discard pages from an in-memory database since we might ** need to rollback later. Just move the page out of the way. */ sqlite3PcacheMove(pPgOld, pPager->dbSize+1); @@ -48047,8 +56704,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** to exist, in case the transaction needs to roll back. Use pPgOld ** as the original page since it has already been allocated. */ - if( MEMDB ){ - assert( pPgOld ); + if( pPager->tempFile && pPgOld ){ sqlite3PcacheMove(pPgOld, origPgno); sqlite3PagerUnrefNotNull(pPgOld); } @@ -48069,7 +56725,7 @@ SQLITE_PRIVATE int sqlite3PagerMovepage(Pager *pPager, DbPage *pPg, Pgno pgno, i ** the journal file twice, but that is not a problem. */ PgHdr *pPgHdr; - rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr); + rc = sqlite3PagerGet(pPager, needSyncPgno, &pPgHdr, 0); if( rc!=SQLITE_OK ){ if( needSyncPgno<=pPager->dbOrigSize ){ assert( pPager->pTmpSpace!=0 ); @@ -48243,6 +56899,8 @@ SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *pPager, int eMode){ } assert( state==pPager->eState ); } + }else if( eMode==PAGER_JOURNALMODE_OFF ){ + sqlite3OsClose(pPager->jfd); } } @@ -48298,10 +56956,12 @@ SQLITE_PRIVATE sqlite3_backup **sqlite3PagerBackupPtr(Pager *pPager){ ** Unless this is an in-memory or temporary database, clear the pager cache. */ SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ - if( !MEMDB && pPager->tempFile==0 ) pager_reset(pPager); + assert( MEMDB==0 || pPager->tempFile ); + if( pPager->tempFile==0 ) pager_reset(pPager); } #endif + #ifndef SQLITE_OMIT_WAL /* ** This function is called when the user invokes "PRAGMA wal_checkpoint", @@ -48310,15 +56970,22 @@ SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ ** ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. */ -SQLITE_PRIVATE int sqlite3PagerCheckpoint(Pager *pPager, int eMode, int *pnLog, int *pnCkpt){ +SQLITE_PRIVATE int sqlite3PagerCheckpoint( + Pager *pPager, /* Checkpoint on this pager */ + sqlite3 *db, /* Db handle used to check for interrupts */ + int eMode, /* Type of checkpoint */ + int *pnLog, /* OUT: Final number of frames in log */ + int *pnCkpt /* OUT: Final number of checkpointed frames */ +){ int rc = SQLITE_OK; if( pPager->pWal ){ - rc = sqlite3WalCheckpoint(pPager->pWal, eMode, + rc = sqlite3WalCheckpoint(pPager->pWal, db, eMode, (eMode==SQLITE_CHECKPOINT_PASSIVE ? 0 : pPager->xBusyHandler), pPager->pBusyHandlerArg, - pPager->ckptSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, + pPager->walSyncFlags, pPager->pageSize, (u8 *)pPager->pTmpSpace, pnLog, pnCkpt ); + sqlite3PagerResetLockTimeout(pPager); } return rc; } @@ -48333,6 +57000,7 @@ SQLITE_PRIVATE int sqlite3PagerWalCallback(Pager *pPager){ */ SQLITE_PRIVATE int sqlite3PagerWalSupported(Pager *pPager){ const sqlite3_io_methods *pMethods = pPager->fd->pMethods; + if( pPager->noLock ) return 0; return pPager->exclusiveMode || (pMethods->iVersion>=2 && pMethods->xShmMap); } @@ -48444,7 +57112,7 @@ SQLITE_PRIVATE int sqlite3PagerOpenWal( ** error (SQLITE_BUSY) is returned and the log connection is not closed. ** If successful, the EXCLUSIVE lock is not released before returning. */ -SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){ +SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ int rc = SQLITE_OK; assert( pPager->journalMode==PAGER_JOURNALMODE_WAL ); @@ -48472,15 +57140,58 @@ SQLITE_PRIVATE int sqlite3PagerCloseWal(Pager *pPager){ if( rc==SQLITE_OK && pPager->pWal ){ rc = pagerExclusiveLock(pPager); if( rc==SQLITE_OK ){ - rc = sqlite3WalClose(pPager->pWal, pPager->ckptSyncFlags, + rc = sqlite3WalClose(pPager->pWal, db, pPager->walSyncFlags, pPager->pageSize, (u8*)pPager->pTmpSpace); pPager->pWal = 0; pagerFixMaplimit(pPager); + if( rc && !pPager->exclusiveMode ) pagerUnlockDb(pPager, SHARED_LOCK); } } return rc; } +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** If this is a WAL database, obtain a snapshot handle for the snapshot +** currently open. Otherwise, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotGet(Pager *pPager, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_ERROR; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotGet(pPager->pWal, ppSnapshot); + } + return rc; +} + +/* +** If this is a WAL database, store a pointer to pSnapshot. Next time a +** read transaction is opened, attempt to read from the snapshot it +** identifies. If this is not a WAL database, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotOpen(Pager *pPager, sqlite3_snapshot *pSnapshot){ + int rc = SQLITE_OK; + if( pPager->pWal ){ + sqlite3WalSnapshotOpen(pPager->pWal, pSnapshot); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} + +/* +** If this is a WAL database, call sqlite3WalSnapshotRecover(). If this +** is not a WAL database, return an error. +*/ +SQLITE_PRIVATE int sqlite3PagerSnapshotRecover(Pager *pPager){ + int rc; + if( pPager->pWal ){ + rc = sqlite3WalSnapshotRecover(pPager->pWal); + }else{ + rc = SQLITE_ERROR; + } + return rc; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ #endif /* !SQLITE_OMIT_WAL */ #ifdef SQLITE_ENABLE_ZIPVFS @@ -48497,7 +57208,6 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ } #endif - #endif /* SQLITE_OMIT_DISKIO */ /************** End of pager.c ***********************************************/ @@ -48636,6 +57346,10 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ ** on a network filesystem. All users of the database must be able to ** share memory. ** +** In the default unix and windows implementation, the wal-index is a mmapped +** file whose name is the database name with a "-shm" suffix added. For that +** reason, the wal-index is sometimes called the "shm" file. +** ** The wal-index is transient. After a crash, the wal-index can (and should ** be) reconstructed from the original WAL file. In fact, the VFS is required ** to either truncate or zero the header of the wal-index when the last @@ -48746,6 +57460,7 @@ SQLITE_PRIVATE int sqlite3PagerWalFramesize(Pager *pPager){ */ #ifndef SQLITE_OMIT_WAL +/* #include "wal.h" */ /* ** Trace output macros @@ -48774,8 +57489,18 @@ SQLITE_PRIVATE int sqlite3WalTrace = 0; #define WALINDEX_MAX_VERSION 3007000 /* -** Indices of various locking bytes. WAL_NREADER is the number -** of available reader locks and should be at least 3. +** Index numbers for various locking bytes. WAL_NREADER is the number +** of available reader locks and should be at least 3. The default +** is SQLITE_SHM_NLOCK==8 and WAL_NREADER==5. +** +** Technically, the various VFSes are free to implement these locks however +** they see fit. However, compatibility is encouraged so that VFSes can +** interoperate. The standard implemention used on both unix and windows +** is for the index number to indicate a byte offset into the +** WalCkptInfo.aLock[] array in the wal-index header. In other words, all +** locks are on the shm file. The WALINDEX_LOCK_OFFSET constant (which +** should be 120) is the location in the shm file for the first locking +** byte. */ #define WAL_WRITE_LOCK 0 #define WAL_ALL_BUT_WRITE 1 @@ -48795,7 +57520,10 @@ typedef struct WalCkptInfo WalCkptInfo; ** The following object holds a copy of the wal-index header content. ** ** The actual header in the wal-index consists of two copies of this -** object. +** object followed by one instance of the WalCkptInfo object. +** For all versions of SQLite through 3.10.0 and probably beyond, +** the locking bytes (WalCkptInfo.aLock) start at offset 120 and +** the total header size is 136 bytes. ** ** The szPage value can be any power of 2 between 512 and 32768, inclusive. ** Or it can be 1 to represent a 65536-byte page. The latter case was @@ -48828,6 +57556,16 @@ struct WalIndexHdr { ** However, a WAL_WRITE_LOCK thread can move the value of nBackfill from ** mxFrame back to zero when the WAL is reset. ** +** nBackfillAttempted is the largest value of nBackfill that a checkpoint +** has attempted to achieve. Normally nBackfill==nBackfillAtempted, however +** the nBackfillAttempted is set before any backfilling is done and the +** nBackfill is only set after all backfilling completes. So if a checkpoint +** crashes, nBackfillAttempted might be larger than nBackfill. The +** WalIndexHdr.mxFrame must never be less than nBackfillAttempted. +** +** The aLock[] field is a set of bytes used for locking. These bytes should +** never be read or written. +** ** There is one entry in aReadMark[] for each reader lock. If a reader ** holds read-lock K, then the value in aReadMark[K] is no greater than ** the mxFrame for that reader. The value READMARK_NOT_USED (0xffffffff) @@ -48867,6 +57605,9 @@ struct WalIndexHdr { struct WalCkptInfo { u32 nBackfill; /* Number of WAL frames backfilled into DB */ u32 aReadMark[WAL_NREADER]; /* Reader marks */ + u8 aLock[SQLITE_SHM_NLOCK]; /* Reserved space for locks */ + u32 nBackfillAttempted; /* WAL frames perhaps written, or maybe not */ + u32 notUsed0; /* Available for future enhancements */ }; #define READMARK_NOT_USED 0xffffffff @@ -48876,15 +57617,13 @@ struct WalCkptInfo { ** only support mandatory file-locks, we do not read or write data ** from the region of the file on which locks are applied. */ -#define WALINDEX_LOCK_OFFSET (sizeof(WalIndexHdr)*2 + sizeof(WalCkptInfo)) -#define WALINDEX_LOCK_RESERVED 16 -#define WALINDEX_HDR_SIZE (WALINDEX_LOCK_OFFSET+WALINDEX_LOCK_RESERVED) +#define WALINDEX_LOCK_OFFSET (sizeof(WalIndexHdr)*2+offsetof(WalCkptInfo,aLock)) +#define WALINDEX_HDR_SIZE (sizeof(WalIndexHdr)*2+sizeof(WalCkptInfo)) /* Size of header before each frame in wal */ #define WAL_FRAME_HDRSIZE 24 /* Size of write ahead log header, including checksum. */ -/* #define WAL_HDRSIZE 24 */ #define WAL_HDRSIZE 32 /* WAL magic value. Either this value, or the same value with the least @@ -48930,12 +57669,18 @@ struct Wal { u8 truncateOnCommit; /* True to truncate WAL file on commit */ u8 syncHeader; /* Fsync the WAL header if true */ u8 padToSectorBoundary; /* Pad transactions out to the next sector */ + u8 bShmUnreliable; /* SHM content is read-only and unreliable */ WalIndexHdr hdr; /* Wal-index header for current transaction */ + u32 minFrame; /* Ignore wal frames before this one */ + u32 iReCksum; /* On commit, recalculate checksums from here */ const char *zWalName; /* Name of WAL file */ u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ #ifdef SQLITE_DEBUG u8 lockError; /* True if a locking error has occurred */ #endif +#ifdef SQLITE_ENABLE_SNAPSHOT + WalIndexHdr *pSnapshot; /* Start transaction here if not NULL */ +#endif }; /* @@ -49014,21 +57759,30 @@ struct WalIterator { ** is broken into pages of WALINDEX_PGSZ bytes. Wal-index pages are ** numbered from zero. ** +** If the wal-index is currently smaller the iPage pages then the size +** of the wal-index might be increased, but only if it is safe to do +** so. It is safe to enlarge the wal-index if pWal->writeLock is true +** or pWal->exclusiveMode==WAL_HEAPMEMORY_MODE. +** ** If this call is successful, *ppPage is set to point to the wal-index ** page and SQLITE_OK is returned. If an error (an OOM or VFS error) occurs, ** then an SQLite error code is returned and *ppPage is set to 0. */ -static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){ +static SQLITE_NOINLINE int walIndexPageRealloc( + Wal *pWal, /* The WAL context */ + int iPage, /* The page we seek */ + volatile u32 **ppPage /* Write the page pointer here */ +){ int rc = SQLITE_OK; /* Enlarge the pWal->apWiData[] array if required */ if( pWal->nWiData<=iPage ){ int nByte = sizeof(u32*)*(iPage+1); volatile u32 **apNew; - apNew = (volatile u32 **)sqlite3_realloc((void *)pWal->apWiData, nByte); + apNew = (volatile u32 **)sqlite3_realloc64((void *)pWal->apWiData, nByte); if( !apNew ){ *ppPage = 0; - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memset((void*)&apNew[pWal->nWiData], 0, sizeof(u32*)*(iPage+1-pWal->nWiData)); @@ -49037,16 +57791,19 @@ static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){ } /* Request a pointer to the required page from the VFS */ - if( pWal->apWiData[iPage]==0 ){ - if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ - pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ); - if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM; - }else{ - rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, - pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] - ); + assert( pWal->apWiData[iPage]==0 ); + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ + pWal->apWiData[iPage] = (u32 volatile *)sqlite3MallocZero(WALINDEX_PGSZ); + if( !pWal->apWiData[iPage] ) rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3OsShmMap(pWal->pDbFd, iPage, WALINDEX_PGSZ, + pWal->writeLock, (void volatile **)&pWal->apWiData[iPage] + ); + assert( pWal->apWiData[iPage]!=0 || rc!=SQLITE_OK || pWal->writeLock==0 ); + testcase( pWal->apWiData[iPage]==0 && rc==SQLITE_OK ); + if( (rc&0xff)==SQLITE_READONLY ){ + pWal->readOnly |= WAL_SHM_RDONLY; if( rc==SQLITE_READONLY ){ - pWal->readOnly |= WAL_SHM_RDONLY; rc = SQLITE_OK; } } @@ -49056,6 +57813,16 @@ static int walIndexPage(Wal *pWal, int iPage, volatile u32 **ppPage){ assert( iPage==0 || *ppPage || rc!=SQLITE_OK ); return rc; } +static int walIndexPage( + Wal *pWal, /* The WAL context */ + int iPage, /* The page we seek */ + volatile u32 **ppPage /* Write the page pointer here */ +){ + if( pWal->nWiData<=iPage || (*ppPage = pWal->apWiData[iPage])==0 ){ + return walIndexPageRealloc(pWal, iPage, ppPage); + } + return SQLITE_OK; +} /* ** Return a pointer to the WalCkptInfo structure in the wal-index. @@ -49151,9 +57918,9 @@ static void walIndexWriteHdr(Wal *pWal){ pWal->hdr.isInit = 1; pWal->hdr.iVersion = WALINDEX_MAX_VERSION; walChecksumBytes(1, (u8*)&pWal->hdr, nCksum, 0, pWal->hdr.aCksum); - memcpy((void *)&aHdr[1], (void *)&pWal->hdr, sizeof(WalIndexHdr)); + memcpy((void*)&aHdr[1], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); walShmBarrier(pWal); - memcpy((void *)&aHdr[0], (void *)&pWal->hdr, sizeof(WalIndexHdr)); + memcpy((void*)&aHdr[0], (const void*)&pWal->hdr, sizeof(WalIndexHdr)); } /* @@ -49181,14 +57948,18 @@ static void walEncodeFrame( assert( WAL_FRAME_HDRSIZE==24 ); sqlite3Put4byte(&aFrame[0], iPage); sqlite3Put4byte(&aFrame[4], nTruncate); - memcpy(&aFrame[8], pWal->hdr.aSalt, 8); + if( pWal->iReCksum==0 ){ + memcpy(&aFrame[8], pWal->hdr.aSalt, 8); - nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); - walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); - walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); + nativeCksum = (pWal->hdr.bigEndCksum==SQLITE_BIGENDIAN); + walChecksumBytes(nativeCksum, aFrame, 8, aCksum, aCksum); + walChecksumBytes(nativeCksum, aData, pWal->szPage, aCksum, aCksum); - sqlite3Put4byte(&aFrame[16], aCksum[0]); - sqlite3Put4byte(&aFrame[20], aCksum[1]); + sqlite3Put4byte(&aFrame[16], aCksum[0]); + sqlite3Put4byte(&aFrame[20], aCksum[1]); + }else{ + memset(&aFrame[8], 0, 16); + } } /* @@ -49454,13 +58225,13 @@ static void walCleanupHash(Wal *pWal){ ** via the hash table even after the cleanup. */ if( iLimit ){ - int i; /* Loop counter */ + int j; /* Loop counter */ int iKey; /* Hash key */ - for(i=1; i<=iLimit; i++){ - for(iKey=walHash(aPgno[i]); aHash[iKey]; iKey=walNextHash(iKey)){ - if( aHash[iKey]==i ) break; + for(j=1; j<=iLimit; j++){ + for(iKey=walHash(aPgno[j]); aHash[iKey]; iKey=walNextHash(iKey)){ + if( aHash[iKey]==j ) break; } - assert( aHash[iKey]==i ); + assert( aHash[iKey]==j ); } } #endif /* SQLITE_ENABLE_EXPENSIVE_ASSERT */ @@ -49565,7 +58336,6 @@ static int walIndexRecover(Wal *pWal){ i64 nSize; /* Size of log file */ u32 aFrameCksum[2] = {0, 0}; int iLock; /* Lock offset to lock for checkpoint */ - int nLock; /* Number of locks to hold */ /* Obtain an exclusive lock on all byte in the locking range not already ** locked by the caller. The caller is guaranteed to have locked the @@ -49578,11 +58348,17 @@ static int walIndexRecover(Wal *pWal){ assert( WAL_CKPT_LOCK==WAL_ALL_BUT_WRITE ); assert( pWal->writeLock ); iLock = WAL_ALL_BUT_WRITE + pWal->ckptLock; - nLock = SQLITE_SHM_NLOCK - iLock; - rc = walLockExclusive(pWal, iLock, nLock); + rc = walLockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + if( rc==SQLITE_OK ){ + rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); + if( rc!=SQLITE_OK ){ + walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + } + } if( rc ){ return rc; } + WALTRACE(("WAL%p: recovery begin...\n", pWal)); memset(&pWal->hdr, 0, sizeof(WalIndexHdr)); @@ -49649,9 +58425,9 @@ static int walIndexRecover(Wal *pWal){ /* Malloc a buffer to read frames into. */ szFrame = szPage + WAL_FRAME_HDRSIZE; - aFrame = (u8 *)sqlite3_malloc(szFrame); + aFrame = (u8 *)sqlite3_malloc64(szFrame); if( !aFrame ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto recovery_error; } aData = &aFrame[WAL_FRAME_HDRSIZE]; @@ -49700,6 +58476,7 @@ finished: */ pInfo = walCkptInfo(pWal); pInfo->nBackfill = 0; + pInfo->nBackfillAttempted = pWal->hdr.mxFrame; pInfo->aReadMark[0] = 0; for(i=1; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED; if( pWal->hdr.mxFrame ) pInfo->aReadMark[1] = pWal->hdr.mxFrame; @@ -49719,7 +58496,8 @@ finished: recovery_error: WALTRACE(("WAL%p: recovery %s\n", pWal, rc ? "failed" : "ok")); - walUnlockExclusive(pWal, iLock, nLock); + walUnlockExclusive(pWal, iLock, WAL_READ_LOCK(0)-iLock); + walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); return rc; } @@ -49727,13 +58505,14 @@ recovery_error: ** Close an open wal-index. */ static void walIndexClose(Wal *pWal, int isDelete){ - if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ){ + if( pWal->exclusiveMode==WAL_HEAPMEMORY_MODE || pWal->bShmUnreliable ){ int i; for(i=0; i<pWal->nWiData; i++){ sqlite3_free((void *)pWal->apWiData[i]); pWal->apWiData[i] = 0; } - }else{ + } + if( pWal->exclusiveMode!=WAL_HEAPMEMORY_MODE ){ sqlite3OsShmUnmap(pWal->pDbFd, isDelete); } } @@ -49771,7 +58550,11 @@ SQLITE_PRIVATE int sqlite3WalOpen( /* In the amalgamation, the os_unix.c and os_win.c source files come before ** this source file. Verify that the #defines of the locking byte offsets ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value. + ** For that matter, if the lock offset ever changes from its initial design + ** value of 120, we need to know that so there is an assert() to check it. */ + assert( 120==WALINDEX_LOCK_OFFSET ); + assert( 136==WALINDEX_HDR_SIZE ); #ifdef WIN_SHM_BASE assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET ); #endif @@ -49784,7 +58567,7 @@ SQLITE_PRIVATE int sqlite3WalOpen( *ppWal = 0; pRet = (Wal*)sqlite3MallocZero(sizeof(Wal) + pVfs->szOsFile); if( !pRet ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pRet->pVfs = pVfs; @@ -49962,7 +58745,7 @@ static void walMergesort( int nMerge = 0; /* Number of elements in list aMerge */ ht_slot *aMerge = 0; /* List to be merged */ int iList; /* Index into input list */ - int iSub = 0; /* Index into aSub array */ + u32 iSub = 0; /* Index into aSub array */ struct Sublist aSub[13]; /* Array of sub-lists */ memset(aSub, 0, sizeof(aSub)); @@ -49973,7 +58756,9 @@ static void walMergesort( nMerge = 1; aMerge = &aList[iList]; for(iSub=0; iList & (1<<iSub); iSub++){ - struct Sublist *p = &aSub[iSub]; + struct Sublist *p; + assert( iSub<ArraySize(aSub) ); + p = &aSub[iSub]; assert( p->aList && p->nList<=(1<<iSub) ); assert( p->aList==&aList[iList&~((2<<iSub)-1)] ); walMerge(aContent, p->aList, p->nList, &aMerge, &nMerge, aBuffer); @@ -49984,7 +58769,9 @@ static void walMergesort( for(iSub++; iSub<ArraySize(aSub); iSub++){ if( nList & (1<<iSub) ){ - struct Sublist *p = &aSub[iSub]; + struct Sublist *p; + assert( iSub<ArraySize(aSub) ); + p = &aSub[iSub]; assert( p->nList<=(1<<iSub) ); assert( p->aList==&aList[nList&~((2<<iSub)-1)] ); walMerge(aContent, p->aList, p->nList, &aMerge, &nMerge, aBuffer); @@ -50012,8 +58799,9 @@ static void walIteratorFree(WalIterator *p){ /* ** Construct a WalInterator object that can be used to loop over all -** pages in the WAL in ascending order. The caller must hold the checkpoint -** lock. +** pages in the WAL following frame nBackfill in ascending order. Frames +** nBackfill or earlier may be included - excluding them is an optimization +** only. The caller must hold the checkpoint lock. ** ** On success, make *pp point to the newly allocated WalInterator object ** return SQLITE_OK. Otherwise, return an error code. If this routine @@ -50022,7 +58810,7 @@ static void walIteratorFree(WalIterator *p){ ** The calling routine should invoke walIteratorFree() to destroy the ** WalIterator object when it has finished with it. */ -static int walIteratorInit(Wal *pWal, WalIterator **pp){ +static int walIteratorInit(Wal *pWal, u32 nBackfill, WalIterator **pp){ WalIterator *p; /* Return value */ int nSegment; /* Number of segments to merge */ u32 iLast; /* Last frame in log */ @@ -50042,9 +58830,9 @@ static int walIteratorInit(Wal *pWal, WalIterator **pp){ nByte = sizeof(WalIterator) + (nSegment-1)*sizeof(struct WalSegment) + iLast*sizeof(ht_slot); - p = (WalIterator *)sqlite3_malloc(nByte); + p = (WalIterator *)sqlite3_malloc64(nByte); if( !p ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memset(p, 0, nByte); p->nSegment = nSegment; @@ -50052,14 +58840,14 @@ static int walIteratorInit(Wal *pWal, WalIterator **pp){ /* Allocate temporary space used by the merge-sort routine. This block ** of memory will be freed before this function returns. */ - aTmp = (ht_slot *)sqlite3_malloc( + aTmp = (ht_slot *)sqlite3_malloc64( sizeof(ht_slot) * (iLast>HASHTABLE_NPAGE?HASHTABLE_NPAGE:iLast) ); if( !aTmp ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } - for(i=0; rc==SQLITE_OK && i<nSegment; i++){ + for(i=walFramePage(nBackfill+1); rc==SQLITE_OK && i<nSegment; i++){ volatile ht_slot *aHash; u32 iZero; volatile u32 *aPgno; @@ -50093,6 +58881,7 @@ static int walIteratorInit(Wal *pWal, WalIterator **pp){ if( rc!=SQLITE_OK ){ walIteratorFree(p); + p = 0; } *pp = p; return rc; @@ -50153,6 +58942,7 @@ static void walRestartHdr(Wal *pWal, u32 salt1){ memcpy(&pWal->hdr.aSalt[1], &salt1, 4); walIndexWriteHdr(pWal); pInfo->nBackfill = 0; + pInfo->nBackfillAttempted = 0; pInfo->aReadMark[1] = 0; for(i=2; i<WAL_NREADER; i++) pInfo->aReadMark[i] = READMARK_NOT_USED; assert( pInfo->aReadMark[0]==0 ); @@ -50191,6 +58981,7 @@ static void walRestartHdr(Wal *pWal, u32 salt1){ */ static int walCheckpoint( Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check for interrupts on this handle */ int eMode, /* One of PASSIVE, FULL or RESTART */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ @@ -50213,13 +59004,6 @@ static int walCheckpoint( pInfo = walCkptInfo(pWal); if( pInfo->nBackfill<pWal->hdr.mxFrame ){ - /* Allocate the iterator */ - rc = walIteratorInit(pWal, &pIter); - if( rc!=SQLITE_OK ){ - return rc; - } - assert( pIter ); - /* EVIDENCE-OF: R-62920-47450 The busy-handler callback is never invoked ** in the SQLITE_CHECKPOINT_PASSIVE mode. */ assert( eMode!=SQLITE_CHECKPOINT_PASSIVE || xBusy==0 ); @@ -50232,6 +59016,14 @@ static int walCheckpoint( mxSafeFrame = pWal->hdr.mxFrame; mxPage = pWal->hdr.nPage; for(i=1; i<WAL_NREADER; i++){ + /* Thread-sanitizer reports that the following is an unsafe read, + ** as some other thread may be in the process of updating the value + ** of the aReadMark[] slot. The assumption here is that if that is + ** happening, the other client may only be increasing the value, + ** not decreasing it. So assuming either that either the "old" or + ** "new" version of the value is read, and not some arbitrary value + ** that would never be written by a real client, things are still + ** safe. */ u32 y = pInfo->aReadMark[i]; if( mxSafeFrame>y ){ assert( y<=pWal->hdr.mxFrame ); @@ -50248,16 +59040,22 @@ static int walCheckpoint( } } - if( pInfo->nBackfill<mxSafeFrame + /* Allocate the iterator */ + if( pInfo->nBackfill<mxSafeFrame ){ + rc = walIteratorInit(pWal, pInfo->nBackfill, &pIter); + assert( rc==SQLITE_OK || pIter==0 ); + } + + if( pIter && (rc = walBusyLock(pWal, xBusy, pBusyArg, WAL_READ_LOCK(0),1))==SQLITE_OK ){ i64 nSize; /* Current size of database file */ u32 nBackfill = pInfo->nBackfill; + pInfo->nBackfillAttempted = mxSafeFrame; + /* Sync the WAL to disk */ - if( sync_flags ){ - rc = sqlite3OsSync(pWal->pWalFd, sync_flags); - } + rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); /* If the database may grow as a result of this checkpoint, hint ** about the eventual size of the db file to the VFS layer. @@ -50275,6 +59073,10 @@ static int walCheckpoint( while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){ i64 iOffset; assert( walFramePgno(pWal, iFrame)==iDbpage ); + if( db->u1.isInterrupted ){ + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; + break; + } if( iFrame<=nBackfill || iFrame>mxSafeFrame || iDbpage>mxPage ){ continue; } @@ -50294,8 +59096,8 @@ static int walCheckpoint( i64 szDb = pWal->hdr.nPage*(i64)szPage; testcase( IS_BIG_INT(szDb) ); rc = sqlite3OsTruncate(pWal->pDbFd, szDb); - if( rc==SQLITE_OK && sync_flags ){ - rc = sqlite3OsSync(pWal->pDbFd, sync_flags); + if( rc==SQLITE_OK ){ + rc = sqlite3OsSync(pWal->pDbFd, CKPT_SYNC_FLAGS(sync_flags)); } } if( rc==SQLITE_OK ){ @@ -50379,6 +59181,7 @@ static void walLimitSize(Wal *pWal, i64 nMax){ */ SQLITE_PRIVATE int sqlite3WalClose( Wal *pWal, /* Wal to close */ + sqlite3 *db, /* For interrupt flag */ int sync_flags, /* Flags to pass to OsSync() (or 0) */ int nBuf, u8 *zBuf /* Buffer of at least nBuf bytes */ @@ -50395,13 +59198,14 @@ SQLITE_PRIVATE int sqlite3WalClose( ** ** The EXCLUSIVE lock is not released before returning. */ - rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE); - if( rc==SQLITE_OK ){ + if( zBuf!=0 + && SQLITE_OK==(rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE)) + ){ if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; } - rc = sqlite3WalCheckpoint( - pWal, SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 + rc = sqlite3WalCheckpoint(pWal, db, + SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 ); if( rc==SQLITE_OK ){ int bPersist = -1; @@ -50502,6 +59306,12 @@ static int walIndexTryHdr(Wal *pWal, int *pChanged){ return 0; } +/* +** This is the value that walTryBeginRead returns when it needs to +** be retried. +*/ +#define WAL_RETRY (-1) + /* ** Read the wal-index header from the wal-index and into pWal->hdr. ** If the wal-header appears to be corrupt, try to reconstruct the @@ -50525,9 +59335,29 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ assert( pChanged ); rc = walIndexPage(pWal, 0, &page0); if( rc!=SQLITE_OK ){ - return rc; - }; - assert( page0 || pWal->writeLock==0 ); + assert( rc!=SQLITE_READONLY ); /* READONLY changed to OK in walIndexPage */ + if( rc==SQLITE_READONLY_CANTINIT ){ + /* The SQLITE_READONLY_CANTINIT return means that the shared-memory + ** was openable but is not writable, and this thread is unable to + ** confirm that another write-capable connection has the shared-memory + ** open, and hence the content of the shared-memory is unreliable, + ** since the shared-memory might be inconsistent with the WAL file + ** and there is no writer on hand to fix it. */ + assert( page0==0 ); + assert( pWal->writeLock==0 ); + assert( pWal->readOnly & WAL_SHM_RDONLY ); + pWal->bShmUnreliable = 1; + pWal->exclusiveMode = WAL_HEAPMEMORY_MODE; + *pChanged = 1; + }else{ + return rc; /* Any other non-OK return is just an error */ + } + }else{ + /* page0 can be NULL if the SHM is zero bytes in size and pWal->writeLock + ** is zero, which prevents the SHM from growing */ + testcase( page0!=0 ); + } + assert( page0!=0 || pWal->writeLock==0 ); /* If the first page of the wal-index has been mapped, try to read the ** wal-index header immediately, without holding any lock. This usually @@ -50541,7 +59371,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ */ assert( badHdr==0 || pWal->writeLock==0 ); if( badHdr ){ - if( pWal->readOnly & WAL_SHM_RDONLY ){ + if( pWal->bShmUnreliable==0 && (pWal->readOnly & WAL_SHM_RDONLY) ){ if( SQLITE_OK==(rc = walLockShared(pWal, WAL_WRITE_LOCK)) ){ walUnlockShared(pWal, WAL_WRITE_LOCK); rc = SQLITE_READONLY_RECOVERY; @@ -50571,15 +59401,193 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ if( badHdr==0 && pWal->hdr.iVersion!=WALINDEX_MAX_VERSION ){ rc = SQLITE_CANTOPEN_BKPT; } + if( pWal->bShmUnreliable ){ + if( rc!=SQLITE_OK ){ + walIndexClose(pWal, 0); + pWal->bShmUnreliable = 0; + assert( pWal->nWiData>0 && pWal->apWiData[0]==0 ); + /* walIndexRecover() might have returned SHORT_READ if a concurrent + ** writer truncated the WAL out from under it. If that happens, it + ** indicates that a writer has fixed the SHM file for us, so retry */ + if( rc==SQLITE_IOERR_SHORT_READ ) rc = WAL_RETRY; + } + pWal->exclusiveMode = WAL_NORMAL_MODE; + } return rc; } /* -** This is the value that walTryBeginRead returns when it needs to -** be retried. +** Open a transaction in a connection where the shared-memory is read-only +** and where we cannot verify that there is a separate write-capable connection +** on hand to keep the shared-memory up-to-date with the WAL file. +** +** This can happen, for example, when the shared-memory is implemented by +** memory-mapping a *-shm file, where a prior writer has shut down and +** left the *-shm file on disk, and now the present connection is trying +** to use that database but lacks write permission on the *-shm file. +** Other scenarios are also possible, depending on the VFS implementation. +** +** Precondition: +** +** The *-wal file has been read and an appropriate wal-index has been +** constructed in pWal->apWiData[] using heap memory instead of shared +** memory. +** +** If this function returns SQLITE_OK, then the read transaction has +** been successfully opened. In this case output variable (*pChanged) +** is set to true before returning if the caller should discard the +** contents of the page cache before proceeding. Or, if it returns +** WAL_RETRY, then the heap memory wal-index has been discarded and +** the caller should retry opening the read transaction from the +** beginning (including attempting to map the *-shm file). +** +** If an error occurs, an SQLite error code is returned. */ -#define WAL_RETRY (-1) +static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ + i64 szWal; /* Size of wal file on disk in bytes */ + i64 iOffset; /* Current offset when reading wal file */ + u8 aBuf[WAL_HDRSIZE]; /* Buffer to load WAL header into */ + u8 *aFrame = 0; /* Malloc'd buffer to load entire frame */ + int szFrame; /* Number of bytes in buffer aFrame[] */ + u8 *aData; /* Pointer to data part of aFrame buffer */ + volatile void *pDummy; /* Dummy argument for xShmMap */ + int rc; /* Return code */ + u32 aSaveCksum[2]; /* Saved copy of pWal->hdr.aFrameCksum */ + + assert( pWal->bShmUnreliable ); + assert( pWal->readOnly & WAL_SHM_RDONLY ); + assert( pWal->nWiData>0 && pWal->apWiData[0] ); + + /* Take WAL_READ_LOCK(0). This has the effect of preventing any + ** writers from running a checkpoint, but does not stop them + ** from running recovery. */ + rc = walLockShared(pWal, WAL_READ_LOCK(0)); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_BUSY ) rc = WAL_RETRY; + goto begin_unreliable_shm_out; + } + pWal->readLock = 0; + + /* Check to see if a separate writer has attached to the shared-memory area, + ** thus making the shared-memory "reliable" again. Do this by invoking + ** the xShmMap() routine of the VFS and looking to see if the return + ** is SQLITE_READONLY instead of SQLITE_READONLY_CANTINIT. + ** + ** If the shared-memory is now "reliable" return WAL_RETRY, which will + ** cause the heap-memory WAL-index to be discarded and the actual + ** shared memory to be used in its place. + ** + ** This step is important because, even though this connection is holding + ** the WAL_READ_LOCK(0) which prevents a checkpoint, a writer might + ** have already checkpointed the WAL file and, while the current + ** is active, wrap the WAL and start overwriting frames that this + ** process wants to use. + ** + ** Once sqlite3OsShmMap() has been called for an sqlite3_file and has + ** returned any SQLITE_READONLY value, it must return only SQLITE_READONLY + ** or SQLITE_READONLY_CANTINIT or some error for all subsequent invocations, + ** even if some external agent does a "chmod" to make the shared-memory + ** writable by us, until sqlite3OsShmUnmap() has been called. + ** This is a requirement on the VFS implementation. + */ + rc = sqlite3OsShmMap(pWal->pDbFd, 0, WALINDEX_PGSZ, 0, &pDummy); + assert( rc!=SQLITE_OK ); /* SQLITE_OK not possible for read-only connection */ + if( rc!=SQLITE_READONLY_CANTINIT ){ + rc = (rc==SQLITE_READONLY ? WAL_RETRY : rc); + goto begin_unreliable_shm_out; + } + + /* We reach this point only if the real shared-memory is still unreliable. + ** Assume the in-memory WAL-index substitute is correct and load it + ** into pWal->hdr. + */ + memcpy(&pWal->hdr, (void*)walIndexHdr(pWal), sizeof(WalIndexHdr)); + + /* Make sure some writer hasn't come in and changed the WAL file out + ** from under us, then disconnected, while we were not looking. + */ + rc = sqlite3OsFileSize(pWal->pWalFd, &szWal); + if( rc!=SQLITE_OK ){ + goto begin_unreliable_shm_out; + } + if( szWal<WAL_HDRSIZE ){ + /* If the wal file is too small to contain a wal-header and the + ** wal-index header has mxFrame==0, then it must be safe to proceed + ** reading the database file only. However, the page cache cannot + ** be trusted, as a read/write connection may have connected, written + ** the db, run a checkpoint, truncated the wal file and disconnected + ** since this client's last read transaction. */ + *pChanged = 1; + rc = (pWal->hdr.mxFrame==0 ? SQLITE_OK : WAL_RETRY); + goto begin_unreliable_shm_out; + } + + /* Check the salt keys at the start of the wal file still match. */ + rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); + if( rc!=SQLITE_OK ){ + goto begin_unreliable_shm_out; + } + if( memcmp(&pWal->hdr.aSalt, &aBuf[16], 8) ){ + /* Some writer has wrapped the WAL file while we were not looking. + ** Return WAL_RETRY which will cause the in-memory WAL-index to be + ** rebuilt. */ + rc = WAL_RETRY; + goto begin_unreliable_shm_out; + } + + /* Allocate a buffer to read frames into */ + szFrame = pWal->hdr.szPage + WAL_FRAME_HDRSIZE; + aFrame = (u8 *)sqlite3_malloc64(szFrame); + if( aFrame==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto begin_unreliable_shm_out; + } + aData = &aFrame[WAL_FRAME_HDRSIZE]; + + /* Check to see if a complete transaction has been appended to the + ** wal file since the heap-memory wal-index was created. If so, the + ** heap-memory wal-index is discarded and WAL_RETRY returned to + ** the caller. */ + aSaveCksum[0] = pWal->hdr.aFrameCksum[0]; + aSaveCksum[1] = pWal->hdr.aFrameCksum[1]; + for(iOffset=walFrameOffset(pWal->hdr.mxFrame+1, pWal->hdr.szPage); + iOffset+szFrame<=szWal; + iOffset+=szFrame + ){ + u32 pgno; /* Database page number for frame */ + u32 nTruncate; /* dbsize field from frame header */ + + /* Read and decode the next log frame. */ + rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); + if( rc!=SQLITE_OK ) break; + if( !walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame) ) break; + + /* If nTruncate is non-zero, then a complete transaction has been + ** appended to this wal file. Set rc to WAL_RETRY and break out of + ** the loop. */ + if( nTruncate ){ + rc = WAL_RETRY; + break; + } + } + pWal->hdr.aFrameCksum[0] = aSaveCksum[0]; + pWal->hdr.aFrameCksum[1] = aSaveCksum[1]; + + begin_unreliable_shm_out: + sqlite3_free(aFrame); + if( rc!=SQLITE_OK ){ + int i; + for(i=0; i<pWal->nWiData; i++){ + sqlite3_free((void*)pWal->apWiData[i]); + pWal->apWiData[i] = 0; + } + pWal->bShmUnreliable = 0; + sqlite3WalEndReadTransaction(pWal); + *pChanged = 1; + } + return rc; +} /* ** Attempt to start a read transaction. This might fail due to a race or @@ -50595,7 +59603,7 @@ static int walIndexReadHdr(Wal *pWal, int *pChanged){ ** checkpointed. If useWal==0 then this routine calls walIndexReadHdr() ** to make a copy of the wal-index header into pWal->hdr. If the ** wal-index header has changed, *pChanged is set to 1 (as an indication -** to the caller that the local paget cache is obsolete and needs to be +** to the caller that the local page cache is obsolete and needs to be ** flushed.) When useWal==1, the wal-index header is assumed to already ** be loaded and the pChanged parameter is unused. ** @@ -50637,9 +59645,13 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ int mxI; /* Index of largest aReadMark[] value */ int i; /* Loop counter */ int rc = SQLITE_OK; /* Return code */ + u32 mxFrame; /* Wal frame to lock to */ assert( pWal->readLock<0 ); /* Not currently locked */ + /* useWal may only be set for read/write connections */ + assert( (pWal->readOnly & WAL_SHM_RDONLY)==0 || useWal==0 ); + /* Take steps to avoid spinning forever if there is a protocol error. ** ** Circumstances that cause a RETRY should only last for the briefest @@ -50668,7 +59680,10 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ } if( !useWal ){ - rc = walIndexReadHdr(pWal, pChanged); + assert( rc==SQLITE_OK ); + if( pWal->bShmUnreliable==0 ){ + rc = walIndexReadHdr(pWal, pChanged); + } if( rc==SQLITE_BUSY ){ /* If there is not a recovery running in another thread or process ** then convert BUSY errors to WAL_RETRY. If recovery is known to @@ -50697,10 +59712,19 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ if( rc!=SQLITE_OK ){ return rc; } + else if( pWal->bShmUnreliable ){ + return walBeginShmUnreliable(pWal, pChanged); + } } + assert( pWal->nWiData>0 ); + assert( pWal->apWiData[0]!=0 ); pInfo = walCkptInfo(pWal); - if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame ){ + if( !useWal && pInfo->nBackfill==pWal->hdr.mxFrame +#ifdef SQLITE_ENABLE_SNAPSHOT + && (pWal->pSnapshot==0 || pWal->hdr.mxFrame==0) +#endif + ){ /* The WAL has been completely backfilled (or it is empty). ** and can be safely ignored. */ @@ -50738,74 +59762,170 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ */ mxReadMark = 0; mxI = 0; + mxFrame = pWal->hdr.mxFrame; +#ifdef SQLITE_ENABLE_SNAPSHOT + if( pWal->pSnapshot && pWal->pSnapshot->mxFrame<mxFrame ){ + mxFrame = pWal->pSnapshot->mxFrame; + } +#endif for(i=1; i<WAL_NREADER; i++){ u32 thisMark = pInfo->aReadMark[i]; - if( mxReadMark<=thisMark && thisMark<=pWal->hdr.mxFrame ){ + if( mxReadMark<=thisMark && thisMark<=mxFrame ){ assert( thisMark!=READMARK_NOT_USED ); mxReadMark = thisMark; mxI = i; } } - /* There was once an "if" here. The extra "{" is to preserve indentation. */ - { - if( (pWal->readOnly & WAL_SHM_RDONLY)==0 - && (mxReadMark<pWal->hdr.mxFrame || mxI==0) - ){ - for(i=1; i<WAL_NREADER; i++){ - rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); - if( rc==SQLITE_OK ){ - mxReadMark = pInfo->aReadMark[i] = pWal->hdr.mxFrame; - mxI = i; - walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); - break; - }else if( rc!=SQLITE_BUSY ){ - return rc; - } + if( (pWal->readOnly & WAL_SHM_RDONLY)==0 + && (mxReadMark<mxFrame || mxI==0) + ){ + for(i=1; i<WAL_NREADER; i++){ + rc = walLockExclusive(pWal, WAL_READ_LOCK(i), 1); + if( rc==SQLITE_OK ){ + mxReadMark = pInfo->aReadMark[i] = mxFrame; + mxI = i; + walUnlockExclusive(pWal, WAL_READ_LOCK(i), 1); + break; + }else if( rc!=SQLITE_BUSY ){ + return rc; } } - if( mxI==0 ){ - assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 ); - return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTLOCK; - } + } + if( mxI==0 ){ + assert( rc==SQLITE_BUSY || (pWal->readOnly & WAL_SHM_RDONLY)!=0 ); + return rc==SQLITE_BUSY ? WAL_RETRY : SQLITE_READONLY_CANTINIT; + } - rc = walLockShared(pWal, WAL_READ_LOCK(mxI)); - if( rc ){ - return rc==SQLITE_BUSY ? WAL_RETRY : rc; - } - /* Now that the read-lock has been obtained, check that neither the - ** value in the aReadMark[] array or the contents of the wal-index - ** header have changed. - ** - ** It is necessary to check that the wal-index header did not change - ** between the time it was read and when the shared-lock was obtained - ** on WAL_READ_LOCK(mxI) was obtained to account for the possibility - ** that the log file may have been wrapped by a writer, or that frames - ** that occur later in the log than pWal->hdr.mxFrame may have been - ** copied into the database by a checkpointer. If either of these things - ** happened, then reading the database with the current value of - ** pWal->hdr.mxFrame risks reading a corrupted snapshot. So, retry - ** instead. - ** - ** This does not guarantee that the copy of the wal-index header is up to - ** date before proceeding. That would not be possible without somehow - ** blocking writers. It only guarantees that a dangerous checkpoint or - ** log-wrap (either of which would require an exclusive lock on - ** WAL_READ_LOCK(mxI)) has not occurred since the snapshot was valid. - */ - walShmBarrier(pWal); - if( pInfo->aReadMark[mxI]!=mxReadMark - || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) - ){ - walUnlockShared(pWal, WAL_READ_LOCK(mxI)); - return WAL_RETRY; - }else{ - assert( mxReadMark<=pWal->hdr.mxFrame ); - pWal->readLock = (i16)mxI; - } + rc = walLockShared(pWal, WAL_READ_LOCK(mxI)); + if( rc ){ + return rc==SQLITE_BUSY ? WAL_RETRY : rc; + } + /* Now that the read-lock has been obtained, check that neither the + ** value in the aReadMark[] array or the contents of the wal-index + ** header have changed. + ** + ** It is necessary to check that the wal-index header did not change + ** between the time it was read and when the shared-lock was obtained + ** on WAL_READ_LOCK(mxI) was obtained to account for the possibility + ** that the log file may have been wrapped by a writer, or that frames + ** that occur later in the log than pWal->hdr.mxFrame may have been + ** copied into the database by a checkpointer. If either of these things + ** happened, then reading the database with the current value of + ** pWal->hdr.mxFrame risks reading a corrupted snapshot. So, retry + ** instead. + ** + ** Before checking that the live wal-index header has not changed + ** since it was read, set Wal.minFrame to the first frame in the wal + ** file that has not yet been checkpointed. This client will not need + ** to read any frames earlier than minFrame from the wal file - they + ** can be safely read directly from the database file. + ** + ** Because a ShmBarrier() call is made between taking the copy of + ** nBackfill and checking that the wal-header in shared-memory still + ** matches the one cached in pWal->hdr, it is guaranteed that the + ** checkpointer that set nBackfill was not working with a wal-index + ** header newer than that cached in pWal->hdr. If it were, that could + ** cause a problem. The checkpointer could omit to checkpoint + ** a version of page X that lies before pWal->minFrame (call that version + ** A) on the basis that there is a newer version (version B) of the same + ** page later in the wal file. But if version B happens to like past + ** frame pWal->hdr.mxFrame - then the client would incorrectly assume + ** that it can read version A from the database file. However, since + ** we can guarantee that the checkpointer that set nBackfill could not + ** see any pages past pWal->hdr.mxFrame, this problem does not come up. + */ + pWal->minFrame = pInfo->nBackfill+1; + walShmBarrier(pWal); + if( pInfo->aReadMark[mxI]!=mxReadMark + || memcmp((void *)walIndexHdr(pWal), &pWal->hdr, sizeof(WalIndexHdr)) + ){ + walUnlockShared(pWal, WAL_READ_LOCK(mxI)); + return WAL_RETRY; + }else{ + assert( mxReadMark<=pWal->hdr.mxFrame ); + pWal->readLock = (i16)mxI; } return rc; } +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Attempt to reduce the value of the WalCkptInfo.nBackfillAttempted +** variable so that older snapshots can be accessed. To do this, loop +** through all wal frames from nBackfillAttempted to (nBackfill+1), +** comparing their content to the corresponding page with the database +** file, if any. Set nBackfillAttempted to the frame number of the +** first frame for which the wal file content matches the db file. +** +** This is only really safe if the file-system is such that any page +** writes made by earlier checkpointers were atomic operations, which +** is not always true. It is also possible that nBackfillAttempted +** may be left set to a value larger than expected, if a wal frame +** contains content that duplicate of an earlier version of the same +** page. +** +** SQLITE_OK is returned if successful, or an SQLite error code if an +** error occurs. It is not an error if nBackfillAttempted cannot be +** decreased at all. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotRecover(Wal *pWal){ + int rc; + + assert( pWal->readLock>=0 ); + rc = walLockExclusive(pWal, WAL_CKPT_LOCK, 1); + if( rc==SQLITE_OK ){ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + int szPage = (int)pWal->szPage; + i64 szDb; /* Size of db file in bytes */ + + rc = sqlite3OsFileSize(pWal->pDbFd, &szDb); + if( rc==SQLITE_OK ){ + void *pBuf1 = sqlite3_malloc(szPage); + void *pBuf2 = sqlite3_malloc(szPage); + if( pBuf1==0 || pBuf2==0 ){ + rc = SQLITE_NOMEM; + }else{ + u32 i = pInfo->nBackfillAttempted; + for(i=pInfo->nBackfillAttempted; i>pInfo->nBackfill; i--){ + volatile ht_slot *dummy; + volatile u32 *aPgno; /* Array of page numbers */ + u32 iZero; /* Frame corresponding to aPgno[0] */ + u32 pgno; /* Page number in db file */ + i64 iDbOff; /* Offset of db file entry */ + i64 iWalOff; /* Offset of wal file entry */ + + rc = walHashGet(pWal, walFramePage(i), &dummy, &aPgno, &iZero); + if( rc!=SQLITE_OK ) break; + pgno = aPgno[i-iZero]; + iDbOff = (i64)(pgno-1) * szPage; + + if( iDbOff+szPage<=szDb ){ + iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE; + rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff); + + if( rc==SQLITE_OK ){ + rc = sqlite3OsRead(pWal->pDbFd, pBuf2, szPage, iDbOff); + } + + if( rc!=SQLITE_OK || 0==memcmp(pBuf1, pBuf2, szPage) ){ + break; + } + } + + pInfo->nBackfillAttempted = i-1; + } + } + + sqlite3_free(pBuf1); + sqlite3_free(pBuf2); + } + walUnlockExclusive(pWal, WAL_CKPT_LOCK, 1); + } + + return rc; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + /* ** Begin a read transaction on the database. ** @@ -50824,6 +59944,14 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ int rc; /* Return code */ int cnt = 0; /* Number of TryBeginRead attempts */ +#ifdef SQLITE_ENABLE_SNAPSHOT + int bChanged = 0; + WalIndexHdr *pSnapshot = pWal->pSnapshot; + if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + bChanged = 1; + } +#endif + do{ rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); }while( rc==WAL_RETRY ); @@ -50831,6 +59959,70 @@ SQLITE_PRIVATE int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ testcase( (rc&0xff)==SQLITE_IOERR ); testcase( rc==SQLITE_PROTOCOL ); testcase( rc==SQLITE_OK ); + +#ifdef SQLITE_ENABLE_SNAPSHOT + if( rc==SQLITE_OK ){ + if( pSnapshot && memcmp(pSnapshot, &pWal->hdr, sizeof(WalIndexHdr))!=0 ){ + /* At this point the client has a lock on an aReadMark[] slot holding + ** a value equal to or smaller than pSnapshot->mxFrame, but pWal->hdr + ** is populated with the wal-index header corresponding to the head + ** of the wal file. Verify that pSnapshot is still valid before + ** continuing. Reasons why pSnapshot might no longer be valid: + ** + ** (1) The WAL file has been reset since the snapshot was taken. + ** In this case, the salt will have changed. + ** + ** (2) A checkpoint as been attempted that wrote frames past + ** pSnapshot->mxFrame into the database file. Note that the + ** checkpoint need not have completed for this to cause problems. + */ + volatile WalCkptInfo *pInfo = walCkptInfo(pWal); + + assert( pWal->readLock>0 || pWal->hdr.mxFrame==0 ); + assert( pInfo->aReadMark[pWal->readLock]<=pSnapshot->mxFrame ); + + /* It is possible that there is a checkpointer thread running + ** concurrent with this code. If this is the case, it may be that the + ** checkpointer has already determined that it will checkpoint + ** snapshot X, where X is later in the wal file than pSnapshot, but + ** has not yet set the pInfo->nBackfillAttempted variable to indicate + ** its intent. To avoid the race condition this leads to, ensure that + ** there is no checkpointer process by taking a shared CKPT lock + ** before checking pInfo->nBackfillAttempted. + ** + ** TODO: Does the aReadMark[] lock prevent a checkpointer from doing + ** this already? + */ + rc = walLockShared(pWal, WAL_CKPT_LOCK); + + if( rc==SQLITE_OK ){ + /* Check that the wal file has not been wrapped. Assuming that it has + ** not, also check that no checkpointer has attempted to checkpoint any + ** frames beyond pSnapshot->mxFrame. If either of these conditions are + ** true, return SQLITE_BUSY_SNAPSHOT. Otherwise, overwrite pWal->hdr + ** with *pSnapshot and set *pChanged as appropriate for opening the + ** snapshot. */ + if( !memcmp(pSnapshot->aSalt, pWal->hdr.aSalt, sizeof(pWal->hdr.aSalt)) + && pSnapshot->mxFrame>=pInfo->nBackfillAttempted + ){ + assert( pWal->readLock>0 ); + memcpy(&pWal->hdr, pSnapshot, sizeof(WalIndexHdr)); + *pChanged = bChanged; + }else{ + rc = SQLITE_BUSY_SNAPSHOT; + } + + /* Release the shared CKPT lock obtained above. */ + walUnlockShared(pWal, WAL_CKPT_LOCK); + } + + + if( rc!=SQLITE_OK ){ + sqlite3WalEndReadTransaction(pWal); + } + } + } +#endif return rc; } @@ -50862,6 +60054,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( u32 iRead = 0; /* If !=0, WAL frame to return data from */ u32 iLast = pWal->hdr.mxFrame; /* Last page in WAL for this reader */ int iHash; /* Used to loop through N hash tables */ + int iMinHash; /* This routine is only be called from within a read transaction. */ assert( pWal->readLock>=0 || pWal->lockError ); @@ -50872,7 +60065,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( ** then the WAL is ignored by the reader so return early, as if the ** WAL were empty. */ - if( iLast==0 || pWal->readLock==0 ){ + if( iLast==0 || (pWal->readLock==0 && pWal->bShmUnreliable==0) ){ *piRead = 0; return SQLITE_OK; } @@ -50902,7 +60095,8 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( ** This condition filters out entries that were added to the hash ** table after the current read-transaction had started. */ - for(iHash=walFramePage(iLast); iHash>=0 && iRead==0; iHash--){ + iMinHash = walFramePage(pWal->minFrame); + for(iHash=walFramePage(iLast); iHash>=iMinHash; iHash--){ volatile ht_slot *aHash; /* Pointer to hash table */ volatile u32 *aPgno; /* Pointer to array of page numbers */ u32 iZero; /* Frame number corresponding to aPgno[0] */ @@ -50917,7 +60111,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( nCollide = HASHTABLE_NSLOT; for(iKey=walHash(pgno); aHash[iKey]; iKey=walNextHash(iKey)){ u32 iFrame = aHash[iKey] + iZero; - if( iFrame<=iLast && aPgno[aHash[iKey]]==pgno ){ + if( iFrame<=iLast && iFrame>=pWal->minFrame && aPgno[aHash[iKey]]==pgno ){ assert( iFrame>iRead || CORRUPT_DB ); iRead = iFrame; } @@ -50925,6 +60119,7 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( return SQLITE_CORRUPT_BKPT; } } + if( iRead ) break; } #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT @@ -50934,7 +60129,8 @@ SQLITE_PRIVATE int sqlite3WalFindFrame( { u32 iRead2 = 0; u32 iTest; - for(iTest=iLast; iTest>0; iTest--){ + assert( pWal->bShmUnreliable || pWal->minFrame>0 ); + for(iTest=iLast; iTest>=pWal->minFrame && iTest>0; iTest--){ if( walFramePgno(pWal, iTest)==pgno ){ iRead2 = iTest; break; @@ -51000,6 +60196,7 @@ SQLITE_PRIVATE int sqlite3WalBeginWriteTransaction(Wal *pWal){ /* Cannot start a write transaction without first holding a read ** transaction. */ assert( pWal->readLock>=0 ); + assert( pWal->writeLock==0 && pWal->iReCksum==0 ); if( pWal->readOnly ){ return SQLITE_READONLY; @@ -51035,6 +60232,7 @@ SQLITE_PRIVATE int sqlite3WalEndWriteTransaction(Wal *pWal){ if( pWal->writeLock ){ walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); pWal->writeLock = 0; + pWal->iReCksum = 0; pWal->truncateOnCommit = 0; } return SQLITE_OK; @@ -51220,8 +60418,8 @@ static int walWriteToLog( iOffset += iFirstAmt; iAmt -= iFirstAmt; pContent = (void*)(iFirstAmt + (char*)pContent); - assert( p->syncFlags & (SQLITE_SYNC_NORMAL|SQLITE_SYNC_FULL) ); - rc = sqlite3OsSync(p->pFd, p->syncFlags & SQLITE_SYNC_MASK); + assert( WAL_SYNC_FLAGS(p->syncFlags)!=0 ); + rc = sqlite3OsSync(p->pFd, WAL_SYNC_FLAGS(p->syncFlags)); if( iAmt==0 || rc ) return rc; } rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset); @@ -51241,7 +60439,7 @@ static int walWriteOneFrame( void *pData; /* Data actually written */ u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ #if defined(SQLITE_HAS_CODEC) - if( (pData = sqlite3PagerCodec(pPage))==0 ) return SQLITE_NOMEM; + if( (pData = sqlite3PagerCodec(pPage))==0 ) return SQLITE_NOMEM_BKPT; #else pData = pPage->pData; #endif @@ -51253,6 +60451,59 @@ static int walWriteOneFrame( return rc; } +/* +** This function is called as part of committing a transaction within which +** one or more frames have been overwritten. It updates the checksums for +** all frames written to the wal file by the current transaction starting +** with the earliest to have been overwritten. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +static int walRewriteChecksums(Wal *pWal, u32 iLast){ + const int szPage = pWal->szPage;/* Database page size */ + int rc = SQLITE_OK; /* Return code */ + u8 *aBuf; /* Buffer to load data from wal file into */ + u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-headers in */ + u32 iRead; /* Next frame to read from wal file */ + i64 iCksumOff; + + aBuf = sqlite3_malloc(szPage + WAL_FRAME_HDRSIZE); + if( aBuf==0 ) return SQLITE_NOMEM_BKPT; + + /* Find the checksum values to use as input for the recalculating the + ** first checksum. If the first frame is frame 1 (implying that the current + ** transaction restarted the wal file), these values must be read from the + ** wal-file header. Otherwise, read them from the frame header of the + ** previous frame. */ + assert( pWal->iReCksum>0 ); + if( pWal->iReCksum==1 ){ + iCksumOff = 24; + }else{ + iCksumOff = walFrameOffset(pWal->iReCksum-1, szPage) + 16; + } + rc = sqlite3OsRead(pWal->pWalFd, aBuf, sizeof(u32)*2, iCksumOff); + pWal->hdr.aFrameCksum[0] = sqlite3Get4byte(aBuf); + pWal->hdr.aFrameCksum[1] = sqlite3Get4byte(&aBuf[sizeof(u32)]); + + iRead = pWal->iReCksum; + pWal->iReCksum = 0; + for(; rc==SQLITE_OK && iRead<=iLast; iRead++){ + i64 iOff = walFrameOffset(iRead, szPage); + rc = sqlite3OsRead(pWal->pWalFd, aBuf, szPage+WAL_FRAME_HDRSIZE, iOff); + if( rc==SQLITE_OK ){ + u32 iPgno, nDbSize; + iPgno = sqlite3Get4byte(aBuf); + nDbSize = sqlite3Get4byte(&aBuf[4]); + + walEncodeFrame(pWal, iPgno, nDbSize, &aBuf[WAL_FRAME_HDRSIZE], aFrame); + rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOff); + } + } + + sqlite3_free(aBuf); + return rc; +} + /* ** Write a set of frames to the log. The caller must hold the write-lock ** on the log file (obtained using sqlite3WalBeginWriteTransaction()). @@ -51273,6 +60524,8 @@ SQLITE_PRIVATE int sqlite3WalFrames( int szFrame; /* The size of a single frame */ i64 iOffset; /* Next byte to write in WAL file */ WalWriter w; /* The writer */ + u32 iFirst = 0; /* First frame that may be overwritten */ + WalIndexHdr *pLive; /* Pointer to shared header */ assert( pList ); assert( pWal->writeLock ); @@ -51288,6 +60541,11 @@ SQLITE_PRIVATE int sqlite3WalFrames( } #endif + pLive = (WalIndexHdr*)walIndexHdr(pWal); + if( memcmp(&pWal->hdr, (void *)pLive, sizeof(WalIndexHdr))!=0 ){ + iFirst = pLive->mxFrame+1; + } + /* See if it is possible to write these frames into the start of the ** log file, instead of appending to it at pWal->hdr.mxFrame. */ @@ -51331,10 +60589,10 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** an out-of-order write following a WAL restart could result in ** database corruption. See the ticket: ** - ** http://localhost:591/sqlite/info/ff5be73dee + ** https://sqlite.org/src/info/ff5be73dee */ - if( pWal->syncHeader && sync_flags ){ - rc = sqlite3OsSync(pWal->pWalFd, sync_flags & SQLITE_SYNC_MASK); + if( pWal->syncHeader ){ + rc = sqlite3OsSync(pWal->pWalFd, CKPT_SYNC_FLAGS(sync_flags)); if( rc ) return rc; } } @@ -51352,6 +60610,33 @@ SQLITE_PRIVATE int sqlite3WalFrames( /* Write all frames into the log file exactly once */ for(p=pList; p; p=p->pDirty){ int nDbSize; /* 0 normally. Positive == commit flag */ + + /* Check if this page has already been written into the wal file by + ** the current transaction. If so, overwrite the existing frame and + ** set Wal.writeLock to WAL_WRITELOCK_RECKSUM - indicating that + ** checksums must be recomputed when the transaction is committed. */ + if( iFirst && (p->pDirty || isCommit==0) ){ + u32 iWrite = 0; + VVA_ONLY(rc =) sqlite3WalFindFrame(pWal, p->pgno, &iWrite); + assert( rc==SQLITE_OK || iWrite==0 ); + if( iWrite>=iFirst ){ + i64 iOff = walFrameOffset(iWrite, szPage) + WAL_FRAME_HDRSIZE; + void *pData; + if( pWal->iReCksum==0 || iWrite<pWal->iReCksum ){ + pWal->iReCksum = iWrite; + } +#if defined(SQLITE_HAS_CODEC) + if( (pData = sqlite3PagerCodec(p))==0 ) return SQLITE_NOMEM; +#else + pData = p->pData; +#endif + rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOff); + if( rc ) return rc; + p->flags &= ~PGHDR_WAL_APPEND; + continue; + } + } + iFrame++; assert( iOffset==walFrameOffset(iFrame, szPage) ); nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0; @@ -51359,6 +60644,13 @@ SQLITE_PRIVATE int sqlite3WalFrames( if( rc ) return rc; pLast = p; iOffset += szFrame; + p->flags |= PGHDR_WAL_APPEND; + } + + /* Recalculate checksums within the wal file if required. */ + if( isCommit && pWal->iReCksum ){ + rc = walRewriteChecksums(pWal, iFrame); + if( rc ) return rc; } /* If this is the end of a transaction, then we might need to pad @@ -51375,18 +60667,23 @@ SQLITE_PRIVATE int sqlite3WalFrames( ** sector boundary is synced; the part of the last frame that extends ** past the sector boundary is written after the sync. */ - if( isCommit && (sync_flags & WAL_SYNC_TRANSACTIONS)!=0 ){ + if( isCommit && WAL_SYNC_FLAGS(sync_flags)!=0 ){ + int bSync = 1; if( pWal->padToSectorBoundary ){ int sectorSize = sqlite3SectorSize(pWal->pWalFd); w.iSyncPoint = ((iOffset+sectorSize-1)/sectorSize)*sectorSize; + bSync = (w.iSyncPoint==iOffset); + testcase( bSync ); while( iOffset<w.iSyncPoint ){ rc = walWriteOneFrame(&w, pLast, nTruncate, iOffset); if( rc ) return rc; iOffset += szFrame; nExtra++; } - }else{ - rc = sqlite3OsSync(w.pFd, sync_flags & SQLITE_SYNC_MASK); + } + if( bSync ){ + assert( rc==SQLITE_OK ); + rc = sqlite3OsSync(w.pFd, WAL_SYNC_FLAGS(sync_flags)); } } @@ -51410,6 +60707,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( */ iFrame = pWal->hdr.mxFrame; for(p=pList; p && rc==SQLITE_OK; p=p->pDirty){ + if( (p->flags & PGHDR_WAL_APPEND)==0 ) continue; iFrame++; rc = walIndexAppend(pWal, iFrame, p->pgno); } @@ -51452,6 +60750,7 @@ SQLITE_PRIVATE int sqlite3WalFrames( */ SQLITE_PRIVATE int sqlite3WalCheckpoint( Wal *pWal, /* Wal connection */ + sqlite3 *db, /* Check this handle's interrupt flag */ int eMode, /* PASSIVE, FULL, RESTART, or TRUNCATE */ int (*xBusy)(void*), /* Function to call when busy */ void *pBusyArg, /* Context argument for xBusyHandler */ @@ -51522,10 +60821,11 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( /* Copy data from the log to the database file. */ if( rc==SQLITE_OK ){ + if( pWal->hdr.mxFrame && walPagesize(pWal)!=nBuf ){ rc = SQLITE_CORRUPT_BKPT; }else{ - rc = walCheckpoint(pWal, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); + rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); } /* If no error occurred, set the output variables. */ @@ -51606,24 +60906,24 @@ SQLITE_PRIVATE int sqlite3WalExclusiveMode(Wal *pWal, int op){ assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) ); if( op==0 ){ - if( pWal->exclusiveMode ){ - pWal->exclusiveMode = 0; + if( pWal->exclusiveMode!=WAL_NORMAL_MODE ){ + pWal->exclusiveMode = WAL_NORMAL_MODE; if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){ - pWal->exclusiveMode = 1; + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; } - rc = pWal->exclusiveMode==0; + rc = pWal->exclusiveMode==WAL_NORMAL_MODE; }else{ /* Already in locking_mode=NORMAL */ rc = 0; } }else if( op>0 ){ - assert( pWal->exclusiveMode==0 ); + assert( pWal->exclusiveMode==WAL_NORMAL_MODE ); assert( pWal->readLock>=0 ); walUnlockShared(pWal, WAL_READ_LOCK(pWal->readLock)); - pWal->exclusiveMode = 1; + pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; rc = 1; }else{ - rc = pWal->exclusiveMode==0; + rc = pWal->exclusiveMode==WAL_NORMAL_MODE; } return rc; } @@ -51637,6 +60937,57 @@ SQLITE_PRIVATE int sqlite3WalHeapMemory(Wal *pWal){ return (pWal && pWal->exclusiveMode==WAL_HEAPMEMORY_MODE ); } +#ifdef SQLITE_ENABLE_SNAPSHOT +/* Create a snapshot object. The content of a snapshot is opaque to +** every other subsystem, so the WAL module can put whatever it needs +** in the object. +*/ +SQLITE_PRIVATE int sqlite3WalSnapshotGet(Wal *pWal, sqlite3_snapshot **ppSnapshot){ + int rc = SQLITE_OK; + WalIndexHdr *pRet; + static const u32 aZero[4] = { 0, 0, 0, 0 }; + + assert( pWal->readLock>=0 && pWal->writeLock==0 ); + + if( memcmp(&pWal->hdr.aFrameCksum[0],aZero,16)==0 ){ + *ppSnapshot = 0; + return SQLITE_ERROR; + } + pRet = (WalIndexHdr*)sqlite3_malloc(sizeof(WalIndexHdr)); + if( pRet==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + memcpy(pRet, &pWal->hdr, sizeof(WalIndexHdr)); + *ppSnapshot = (sqlite3_snapshot*)pRet; + } + + return rc; +} + +/* Try to open on pSnapshot when the next read-transaction starts +*/ +SQLITE_PRIVATE void sqlite3WalSnapshotOpen(Wal *pWal, sqlite3_snapshot *pSnapshot){ + pWal->pSnapshot = (WalIndexHdr*)pSnapshot; +} + +/* +** Return a +ve value if snapshot p1 is newer than p2. A -ve value if +** p1 is older than p2 and zero if p1 and p2 are the same snapshot. +*/ +SQLITE_API int sqlite3_snapshot_cmp(sqlite3_snapshot *p1, sqlite3_snapshot *p2){ + WalIndexHdr *pHdr1 = (WalIndexHdr*)p1; + WalIndexHdr *pHdr2 = (WalIndexHdr*)p2; + + /* aSalt[0] is a copy of the value stored in the wal file header. It + ** is incremented each time the wal file is restarted. */ + if( pHdr1->aSalt[0]<pHdr2->aSalt[0] ) return -1; + if( pHdr1->aSalt[0]>pHdr2->aSalt[0] ) return +1; + if( pHdr1->mxFrame<pHdr2->mxFrame ) return -1; + if( pHdr1->mxFrame>pHdr2->mxFrame ) return +1; + return 0; +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + #ifdef SQLITE_ENABLE_ZIPVFS /* ** If the argument is not NULL, it points to a Wal object that holds a @@ -51649,6 +61000,12 @@ SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal){ } #endif +/* Return the sqlite3_file object for the WAL file +*/ +SQLITE_PRIVATE sqlite3_file *sqlite3WalFile(Wal *pWal){ + return pWal->pWalFd; +} + #endif /* #ifndef SQLITE_OMIT_WAL */ /************** End of wal.c *************************************************/ @@ -51887,6 +61244,7 @@ SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal){ ** 4 Number of leaf pointers on this page ** * zero or more pages numbers of leaves */ +/* #include "sqliteInt.h" */ /* The following value is the maximum cell size assuming a maximum page @@ -51904,6 +61262,7 @@ SQLITE_PRIVATE int sqlite3WalFramesize(Wal *pWal){ /* Forward declarations */ typedef struct MemPage MemPage; typedef struct BtLock BtLock; +typedef struct CellInfo CellInfo; /* ** This is a magic string that appears at the beginning of every @@ -51931,52 +61290,49 @@ typedef struct BtLock BtLock; #define PTF_LEAF 0x08 /* -** As each page of the file is loaded into memory, an instance of the following -** structure is appended and initialized to zero. This structure stores -** information about the page that is decoded from the raw file page. +** An instance of this object stores information about each a single database +** page that has been loaded into memory. The information in this object +** is derived from the raw on-disk page content. ** -** The pParent field points back to the parent page. This allows us to -** walk up the BTree from any leaf to the root. Care must be taken to -** unref() the parent page pointer when this page is no longer referenced. -** The pageDestructor() routine handles that chore. +** As each database page is loaded into memory, the pager allocats an +** instance of this object and zeros the first 8 bytes. (This is the +** "extra" information associated with each page of the pager.) ** ** Access to all fields of this structure is controlled by the mutex ** stored in MemPage.pBt->mutex. */ struct MemPage { u8 isInit; /* True if previously initialized. MUST BE FIRST! */ - u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ + u8 bBusy; /* Prevent endless loops on corrupt database files */ u8 intKey; /* True if table b-trees. False for index b-trees */ u8 intKeyLeaf; /* True if the leaf of an intKey table */ - u8 noPayload; /* True if internal intKey page (thus w/o data) */ + Pgno pgno; /* Page number for this page */ + /* Only the first 8 bytes (above) are zeroed by pager.c when a new page + ** is allocated. All fields that follow must be initialized before use */ u8 leaf; /* True if a leaf page */ u8 hdrOffset; /* 100 for page 1. 0 otherwise */ u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ u8 max1bytePayload; /* min(maxLocal,127) */ + u8 nOverflow; /* Number of overflow cell bodies in aCell[] */ u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ u16 cellOffset; /* Index in aData of first cell pointer */ u16 nFree; /* Number of free bytes on the page */ u16 nCell; /* Number of cells on this page, local and ovfl */ u16 maskPage; /* Mask for page offset */ - u16 aiOvfl[5]; /* Insert the i-th overflow cell before the aiOvfl-th + u16 aiOvfl[4]; /* Insert the i-th overflow cell before the aiOvfl-th ** non-overflow cell */ - u8 *apOvfl[5]; /* Pointers to the body of overflow cells */ + u8 *apOvfl[4]; /* Pointers to the body of overflow cells */ BtShared *pBt; /* Pointer to BtShared that this page is part of */ u8 *aData; /* Pointer to disk image of the page data */ u8 *aDataEnd; /* One byte past the end of usable data */ u8 *aCellIdx; /* The cell index area */ + u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ DbPage *pDbPage; /* Pager page handle */ - Pgno pgno; /* Page number for this page */ + u16 (*xCellSize)(MemPage*,u8*); /* cellSizePtr method */ + void (*xParseCell)(MemPage*,u8*,CellInfo*); /* btreeParseCell method */ }; -/* -** The in-memory image of a disk page has the auxiliary information appended -** to the end. EXTRA_SIZE is the number of bytes of space needed to hold -** that extra information. -*/ -#define EXTRA_SIZE sizeof(MemPage) - /* ** A linked list of the following structures is stored at BtShared.pLock. ** Locks are added (or upgraded from READ_LOCK to WRITE_LOCK) when a cursor @@ -52022,6 +61378,7 @@ struct Btree { u8 inTrans; /* TRANS_NONE, TRANS_READ or TRANS_WRITE */ u8 sharable; /* True if we can share pBt with another db */ u8 locked; /* True if db currently has pBt locked */ + u8 hasIncrblobCur; /* True if there are one or more Incrblob cursors */ int wantToLock; /* Number of nested calls to sqlite3BtreeEnter() */ int nBackup; /* Number of backup operations reading this btree */ u32 iDataVersion; /* Combines with pBt->pPager->iDataVersion */ @@ -52091,6 +61448,9 @@ struct BtShared { #endif u8 inTransaction; /* Transaction state */ u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ +#ifdef SQLITE_HAS_CODEC + u8 optimalReserve; /* Desired amount of reserved space per page */ +#endif u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ @@ -52119,23 +61479,23 @@ struct BtShared { #define BTS_READ_ONLY 0x0001 /* Underlying file is readonly */ #define BTS_PAGESIZE_FIXED 0x0002 /* Page size can no longer be changed */ #define BTS_SECURE_DELETE 0x0004 /* PRAGMA secure_delete is enabled */ -#define BTS_INITIALLY_EMPTY 0x0008 /* Database was empty at trans start */ -#define BTS_NO_WAL 0x0010 /* Do not open write-ahead-log files */ -#define BTS_EXCLUSIVE 0x0020 /* pWriter has an exclusive lock */ -#define BTS_PENDING 0x0040 /* Waiting for read-locks to clear */ +#define BTS_OVERWRITE 0x0008 /* Overwrite deleted content with zeros */ +#define BTS_FAST_SECURE 0x000c /* Combination of the previous two */ +#define BTS_INITIALLY_EMPTY 0x0010 /* Database was empty at trans start */ +#define BTS_NO_WAL 0x0020 /* Do not open write-ahead-log files */ +#define BTS_EXCLUSIVE 0x0040 /* pWriter has an exclusive lock */ +#define BTS_PENDING 0x0080 /* Waiting for read-locks to clear */ /* ** An instance of the following structure is used to hold information ** about a cell. The parseCellPtr() function fills in this structure ** based on information extract from the raw disk page. */ -typedef struct CellInfo CellInfo; struct CellInfo { i64 nKey; /* The key for INTKEY tables, or nPayload otherwise */ u8 *pPayload; /* Pointer to the start of payload */ u32 nPayload; /* Bytes of payload */ u16 nLocal; /* Amount of payload held locally, not on overflow */ - u16 iOverflow; /* Offset to overflow page number. Zero if no overflow */ u16 nSize; /* Size of the cell content on the main b-tree page */ }; @@ -52170,24 +61530,31 @@ struct CellInfo { ** eState==FAULT: Cursor fault with skipNext as error code. */ struct BtCursor { - Btree *pBtree; /* The Btree to which this cursor belongs */ - BtShared *pBt; /* The BtShared this cursor points to */ - BtCursor *pNext, *pPrev; /* Forms a linked list of all cursors */ - struct KeyInfo *pKeyInfo; /* Argument passed to comparison function */ - Pgno *aOverflow; /* Cache of overflow page locations */ - CellInfo info; /* A parse of the cell we are pointing at */ - i64 nKey; /* Size of pKey, or last integer key */ - void *pKey; /* Saved key that was cursor last known position */ - Pgno pgnoRoot; /* The root page of this tree */ - int nOvflAlloc; /* Allocated size of aOverflow[] array */ + u8 eState; /* One of the CURSOR_XXX constants (see below) */ + u8 curFlags; /* zero or more BTCF_* flags defined below */ + u8 curPagerFlags; /* Flags to send to sqlite3PagerGet() */ + u8 hints; /* As configured by CursorSetHints() */ int skipNext; /* Prev() is noop if negative. Next() is noop if positive. ** Error code if eState==CURSOR_FAULT */ - u8 curFlags; /* zero or more BTCF_* flags defined below */ - u8 eState; /* One of the CURSOR_XXX constants (see below) */ - u8 hints; /* As configured by CursorSetHints() */ - i16 iPage; /* Index of current page in apPage */ - u16 aiIdx[BTCURSOR_MAX_DEPTH]; /* Current index in apPage[i] */ - MemPage *apPage[BTCURSOR_MAX_DEPTH]; /* Pages from root to current page */ + Btree *pBtree; /* The Btree to which this cursor belongs */ + Pgno *aOverflow; /* Cache of overflow page locations */ + void *pKey; /* Saved key that was cursor last known position */ + /* All fields above are zeroed when the cursor is allocated. See + ** sqlite3BtreeCursorZero(). Fields that follow must be manually + ** initialized. */ +#define BTCURSOR_FIRST_UNINIT pBt /* Name of first uninitialized field */ + BtShared *pBt; /* The BtShared this cursor points to */ + BtCursor *pNext; /* Forms a linked list of all cursors */ + CellInfo info; /* A parse of the cell we are pointing at */ + i64 nKey; /* Size of pKey, or last integer key */ + Pgno pgnoRoot; /* The root page of this tree */ + i8 iPage; /* Index of current page in apPage */ + u8 curIntKey; /* Value of apPage[0]->intKey */ + u16 ix; /* Current index for apPage[iPage] */ + u16 aiIdx[BTCURSOR_MAX_DEPTH-1]; /* Current index in apPage[i] */ + struct KeyInfo *pKeyInfo; /* Arg passed to comparison function */ + MemPage *pPage; /* Current page */ + MemPage *apPage[BTCURSOR_MAX_DEPTH-1]; /* Stack of parents of current page */ }; /* @@ -52198,6 +61565,7 @@ struct BtCursor { #define BTCF_ValidOvfl 0x04 /* True if aOverflow is valid */ #define BTCF_AtLast 0x08 /* Cursor is pointing ot the last entry */ #define BTCF_Incrblob 0x10 /* True if an incremental I/O handle */ +#define BTCF_Multiple 0x20 /* Maybe another cursor on the same btree */ /* ** Potential values for BtCursor.eState. @@ -52229,8 +61597,8 @@ struct BtCursor { ** Do nothing else with this cursor. Any attempt to use the cursor ** should return the error code stored in BtCursor.skipNext */ -#define CURSOR_INVALID 0 -#define CURSOR_VALID 1 +#define CURSOR_VALID 0 +#define CURSOR_INVALID 1 #define CURSOR_SKIPNEXT 2 #define CURSOR_REQUIRESEEK 3 #define CURSOR_FAULT 4 @@ -52340,6 +61708,7 @@ struct IntegrityCk { const char *zPfx; /* Error message prefix */ int v1, v2; /* Values for up to two %d fields in zPfx */ StrAccum errMsg; /* Accumulate the error message text here */ + u32 *heap; /* Min-heap used for analyzing cell coverage */ }; /* @@ -52350,6 +61719,21 @@ struct IntegrityCk { #define get4byte sqlite3Get4byte #define put4byte sqlite3Put4byte +/* +** get2byteAligned(), unlike get2byte(), requires that its argument point to a +** two-byte aligned address. get2bytea() is only used for accessing the +** cell addresses in a btree header. +*/ +#if SQLITE_BYTEORDER==4321 +# define get2byteAligned(x) (*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4008000 +# define get2byteAligned(x) __builtin_bswap16(*(u16*)(x)) +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 +# define get2byteAligned(x) _byteswap_ushort(*(u16*)(x)) +#else +# define get2byteAligned(x) ((x)[0]<<8 | (x)[1]) +#endif + /************** End of btreeInt.h ********************************************/ /************** Continuing where we left off in btmutex.c ********************/ #ifndef SQLITE_OMIT_SHARED_CACHE @@ -52477,6 +61861,7 @@ static void SQLITE_NOINLINE btreeLockCarefully(Btree *p){ ** Exit the recursive mutex on a Btree. */ SQLITE_PRIVATE void sqlite3BtreeLeave(Btree *p){ + assert( sqlite3_mutex_held(p->db->mutex) ); if( p->sharable ){ assert( p->wantToLock>0 ); p->wantToLock--; @@ -52504,21 +61889,6 @@ SQLITE_PRIVATE int sqlite3BtreeHoldsMutex(Btree *p){ #endif -#ifndef SQLITE_OMIT_INCRBLOB -/* -** Enter and leave a mutex on a Btree given a cursor owned by that -** Btree. These entry points are used by incremental I/O and can be -** omitted if that module is not used. -*/ -SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor *pCur){ - sqlite3BtreeEnter(pCur->pBtree); -} -SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){ - sqlite3BtreeLeave(pCur->pBtree); -} -#endif /* SQLITE_OMIT_INCRBLOB */ - - /* ** Enter the mutex on every Btree associated with a database ** connection. This is needed (for example) prior to parsing @@ -52533,16 +61903,24 @@ SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){ ** two or more btrees in common both try to lock all their btrees ** at the same instant. */ -SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ +static void SQLITE_NOINLINE btreeEnterAll(sqlite3 *db){ int i; + int skipOk = 1; Btree *p; assert( sqlite3_mutex_held(db->mutex) ); for(i=0; i<db->nDb; i++){ p = db->aDb[i].pBt; - if( p ) sqlite3BtreeEnter(p); + if( p && p->sharable ){ + sqlite3BtreeEnter(p); + skipOk = 0; + } } + db->noSharedCache = skipOk; } -SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ +SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ + if( db->noSharedCache==0 ) btreeEnterAll(db); +} +static void SQLITE_NOINLINE btreeLeaveAll(sqlite3 *db){ int i; Btree *p; assert( sqlite3_mutex_held(db->mutex) ); @@ -52551,13 +61929,8 @@ SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ if( p ) sqlite3BtreeLeave(p); } } - -/* -** Return true if a particular Btree requires a lock. Return FALSE if -** no lock is ever required since it is not sharable. -*/ -SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){ - return p->sharable; +SQLITE_PRIVATE void sqlite3BtreeLeaveAll(sqlite3 *db){ + if( db->noSharedCache==0 ) btreeLeaveAll(db); } #ifndef NDEBUG @@ -52633,6 +62006,25 @@ SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ } } #endif /* if SQLITE_THREADSAFE */ + +#ifndef SQLITE_OMIT_INCRBLOB +/* +** Enter a mutex on a Btree given a cursor owned by that Btree. +** +** These entry points are used by incremental I/O only. Enter() is required +** any time OMIT_SHARED_CACHE is not defined, regardless of whether or not +** the build is threadsafe. Leave() is only required by threadsafe builds. +*/ +SQLITE_PRIVATE void sqlite3BtreeEnterCursor(BtCursor *pCur){ + sqlite3BtreeEnter(pCur->pBtree); +} +# if SQLITE_THREADSAFE +SQLITE_PRIVATE void sqlite3BtreeLeaveCursor(BtCursor *pCur){ + sqlite3BtreeLeave(pCur->pBtree); +} +# endif +#endif /* ifndef SQLITE_OMIT_INCRBLOB */ + #endif /* ifndef SQLITE_OMIT_SHARED_CACHE */ /************** End of btmutex.c *********************************************/ @@ -52652,6 +62044,7 @@ SQLITE_PRIVATE void sqlite3BtreeEnterAll(sqlite3 *db){ ** See the header comment on "btreeInt.h" for additional information. ** Including a description of file format and an overview of operation. */ +/* #include "btreeInt.h" */ /* ** The header string that appears at the beginning of every @@ -52750,6 +62143,34 @@ SQLITE_API int sqlite3_enable_shared_cache(int enable){ #define hasReadConflicts(a, b) 0 #endif +/* +** Implementation of the SQLITE_CORRUPT_PAGE() macro. Takes a single +** (MemPage*) as an argument. The (MemPage*) must not be NULL. +** +** If SQLITE_DEBUG is not defined, then this macro is equivalent to +** SQLITE_CORRUPT_BKPT. Or, if SQLITE_DEBUG is set, then the log message +** normally produced as a side-effect of SQLITE_CORRUPT_BKPT is augmented +** with the page number and filename associated with the (MemPage*). +*/ +#ifdef SQLITE_DEBUG +int corruptPageError(int lineno, MemPage *p){ + char *zMsg; + sqlite3BeginBenignMalloc(); + zMsg = sqlite3_mprintf("database corruption page %d of %s", + (int)p->pgno, sqlite3PagerFilename(p->pBt->pPager, 0) + ); + sqlite3EndBenignMalloc(); + if( zMsg ){ + sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); + } + sqlite3_free(zMsg); + return SQLITE_CORRUPT_BKPT; +} +# define SQLITE_CORRUPT_PAGE(pMemPage) corruptPageError(__LINE__, pMemPage) +#else +# define SQLITE_CORRUPT_PAGE(pMemPage) SQLITE_CORRUPT_PGNO(pMemPage->pgno) +#endif + #ifndef SQLITE_OMIT_SHARED_CACHE #ifdef SQLITE_DEBUG @@ -52790,7 +62211,7 @@ static int hasSharedCacheTableLock( ** Return true immediately. */ if( (pBtree->sharable==0) - || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommitted)) + || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommit)) ){ return 1; } @@ -52813,6 +62234,12 @@ static int hasSharedCacheTableLock( for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ Index *pIdx = (Index *)sqliteHashData(p); if( pIdx->tnum==(int)iRoot ){ + if( iTab ){ + /* Two or more indexes share the same root page. There must + ** be imposter tables. So just return true. The assert is not + ** useful in that case. */ + return 1; + } iTab = pIdx->pTable->tnum; } } @@ -52861,7 +62288,7 @@ static int hasReadConflicts(Btree *pBtree, Pgno iRoot){ for(p=pBtree->pBt->pCursor; p; p=p->pNext){ if( p->pgnoRoot==iRoot && p->pBtree!=pBtree - && 0==(p->pBtree->db->flags & SQLITE_ReadUncommitted) + && 0==(p->pBtree->db->flags & SQLITE_ReadUncommit) ){ return 1; } @@ -52883,7 +62310,7 @@ static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){ assert( sqlite3BtreeHoldsMutex(p) ); assert( eLock==READ_LOCK || eLock==WRITE_LOCK ); assert( p->db!=0 ); - assert( !(p->db->flags&SQLITE_ReadUncommitted)||eLock==WRITE_LOCK||iTab==1 ); + assert( !(p->db->flags&SQLITE_ReadUncommit)||eLock==WRITE_LOCK||iTab==1 ); /* If requesting a write-lock, then the Btree must have an open write ** transaction on this file. And, obviously, for this to be so there @@ -52961,7 +62388,7 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ ** obtain a read-lock using this function. The only read-lock obtained ** by a connection in read-uncommitted mode is on the sqlite_master ** table, and that lock is obtained in BtreeBeginTrans(). */ - assert( 0==(p->db->flags&SQLITE_ReadUncommitted) || eLock==WRITE_LOCK ); + assert( 0==(p->db->flags&SQLITE_ReadUncommit) || eLock==WRITE_LOCK ); /* This function should only be called on a sharable b-tree after it ** has been determined that no other b-tree holds a conflicting lock. */ @@ -52982,7 +62409,7 @@ static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){ if( !pLock ){ pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock)); if( !pLock ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pLock->iTable = iTable; pLock->pBtree = p; @@ -53071,7 +62498,9 @@ static void downgradeAllSharedCacheTableLocks(Btree *p){ #endif /* SQLITE_OMIT_SHARED_CACHE */ -static void releasePage(MemPage *pPage); /* Forward reference */ +static void releasePage(MemPage *pPage); /* Forward reference */ +static void releasePageOne(MemPage *pPage); /* Forward reference */ +static void releasePageNotNull(MemPage *pPage); /* Forward reference */ /* ***** This routine is used inside of assert() only **** @@ -53082,6 +62511,19 @@ static void releasePage(MemPage *pPage); /* Forward reference */ static int cursorHoldsMutex(BtCursor *p){ return sqlite3_mutex_held(p->pBt->mutex); } + +/* Verify that the cursor and the BtShared agree about what is the current +** database connetion. This is important in shared-cache mode. If the database +** connection pointers get out-of-sync, it is possible for routines like +** btreeInitPage() to reference an stale connection pointer that references a +** a connection that has already closed. This routine is used inside assert() +** statements only and for the purpose of double-checking that the btree code +** does keep the database connection pointers up-to-date. +*/ +static int cursorOwnsBtShared(BtCursor *p){ + assert( cursorHoldsMutex(p) ); + return (p->pBtree->db==p->pBt->db); +} #endif /* @@ -53118,24 +62560,27 @@ static void invalidateAllOverflowCache(BtShared *pBt){ */ static void invalidateIncrblobCursors( Btree *pBtree, /* The database file to check */ + Pgno pgnoRoot, /* The table that might be changing */ i64 iRow, /* The rowid that might be changing */ int isClearTable /* True if all rows are being deleted */ ){ BtCursor *p; - BtShared *pBt = pBtree->pBt; + if( pBtree->hasIncrblobCur==0 ) return; assert( sqlite3BtreeHoldsMutex(pBtree) ); - for(p=pBt->pCursor; p; p=p->pNext){ - if( (p->curFlags & BTCF_Incrblob)!=0 - && (isClearTable || p->info.nKey==iRow) - ){ - p->eState = CURSOR_INVALID; + pBtree->hasIncrblobCur = 0; + for(p=pBtree->pBt->pCursor; p; p=p->pNext){ + if( (p->curFlags & BTCF_Incrblob)!=0 ){ + pBtree->hasIncrblobCur = 1; + if( p->pgnoRoot==pgnoRoot && (isClearTable || p->info.nKey==iRow) ){ + p->eState = CURSOR_INVALID; + } } } } #else /* Stub function when INCRBLOB is omitted */ - #define invalidateIncrblobCursors(x,y,z) + #define invalidateIncrblobCursors(w,x,y,z) #endif /* SQLITE_OMIT_INCRBLOB */ /* @@ -53179,7 +62624,7 @@ static int btreeSetHasContent(BtShared *pBt, Pgno pgno){ assert( pgno<=pBt->nPage ); pBt->pHasContent = sqlite3BitvecCreate(pBt->nPage); if( !pBt->pHasContent ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } } if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){ @@ -53214,13 +62659,56 @@ static void btreeClearHasContent(BtShared *pBt){ */ static void btreeReleaseAllCursorPages(BtCursor *pCur){ int i; - for(i=0; i<=pCur->iPage; i++){ - releasePage(pCur->apPage[i]); - pCur->apPage[i] = 0; + if( pCur->iPage>=0 ){ + for(i=0; i<pCur->iPage; i++){ + releasePageNotNull(pCur->apPage[i]); + } + releasePageNotNull(pCur->pPage); + pCur->iPage = -1; } - pCur->iPage = -1; } +/* +** The cursor passed as the only argument must point to a valid entry +** when this function is called (i.e. have eState==CURSOR_VALID). This +** function saves the current cursor key in variables pCur->nKey and +** pCur->pKey. SQLITE_OK is returned if successful or an SQLite error +** code otherwise. +** +** If the cursor is open on an intkey table, then the integer key +** (the rowid) is stored in pCur->nKey and pCur->pKey is left set to +** NULL. If the cursor is open on a non-intkey table, then pCur->pKey is +** set to point to a malloced buffer pCur->nKey bytes in size containing +** the key. +*/ +static int saveCursorKey(BtCursor *pCur){ + int rc = SQLITE_OK; + assert( CURSOR_VALID==pCur->eState ); + assert( 0==pCur->pKey ); + assert( cursorHoldsMutex(pCur) ); + + if( pCur->curIntKey ){ + /* Only the rowid is required for a table btree */ + pCur->nKey = sqlite3BtreeIntegerKey(pCur); + }else{ + /* For an index btree, save the complete key content */ + void *pKey; + pCur->nKey = sqlite3BtreePayloadSize(pCur); + pKey = sqlite3Malloc( pCur->nKey ); + if( pKey ){ + rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); + if( rc==SQLITE_OK ){ + pCur->pKey = pKey; + }else{ + sqlite3_free(pKey); + } + }else{ + rc = SQLITE_NOMEM_BKPT; + } + } + assert( !pCur->curIntKey || !pCur->pKey ); + return rc; +} /* ** Save the current cursor position in the variables BtCursor.nKey @@ -53232,40 +62720,23 @@ static void btreeReleaseAllCursorPages(BtCursor *pCur){ static int saveCursorPosition(BtCursor *pCur){ int rc; - assert( CURSOR_VALID==pCur->eState ); + assert( CURSOR_VALID==pCur->eState || CURSOR_SKIPNEXT==pCur->eState ); assert( 0==pCur->pKey ); assert( cursorHoldsMutex(pCur) ); - rc = sqlite3BtreeKeySize(pCur, &pCur->nKey); - assert( rc==SQLITE_OK ); /* KeySize() cannot fail */ - - /* If this is an intKey table, then the above call to BtreeKeySize() - ** stores the integer key in pCur->nKey. In this case this value is - ** all that is required. Otherwise, if pCur is not open on an intKey - ** table, then malloc space for and store the pCur->nKey bytes of key - ** data. - */ - if( 0==pCur->apPage[0]->intKey ){ - void *pKey = sqlite3Malloc( pCur->nKey ); - if( pKey ){ - rc = sqlite3BtreeKey(pCur, 0, (int)pCur->nKey, pKey); - if( rc==SQLITE_OK ){ - pCur->pKey = pKey; - }else{ - sqlite3_free(pKey); - } - }else{ - rc = SQLITE_NOMEM; - } + if( pCur->eState==CURSOR_SKIPNEXT ){ + pCur->eState = CURSOR_VALID; + }else{ + pCur->skipNext = 0; } - assert( !pCur->apPage[0]->intKey || !pCur->pKey ); + rc = saveCursorKey(pCur); if( rc==SQLITE_OK ){ btreeReleaseAllCursorPages(pCur); pCur->eState = CURSOR_REQUIRESEEK; } - invalidateOverflowCache(pCur); + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl|BTCF_AtLast); return rc; } @@ -53280,6 +62751,15 @@ static int SQLITE_NOINLINE saveCursorsOnList(BtCursor*,Pgno,BtCursor*); ** routine is called just before cursor pExcept is used to modify the ** table, for example in BtreeDelete() or BtreeInsert(). ** +** If there are two or more cursors on the same btree, then all such +** cursors should have their BTCF_Multiple flag set. The btreeCursor() +** routine enforces that rule. This routine only needs to be called in +** the uncommon case when pExpect has the BTCF_Multiple flag set. +** +** If pExpect!=NULL and if no other cursors are found on the same root-page, +** then the BTCF_Multiple flag on pExpect is cleared, to avoid another +** pointless call to this routine. +** ** Implementation note: This routine merely checks to see if any cursors ** need to be saved. It calls out to saveCursorsOnList() in the (unusual) ** event that cursors are in need to being saved. @@ -53291,7 +62771,9 @@ static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){ for(p=pBt->pCursor; p; p=p->pNext){ if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ) break; } - return p ? saveCursorsOnList(p, iRoot, pExcept) : SQLITE_OK; + if( p ) return saveCursorsOnList(p, iRoot, pExcept); + if( pExcept ) pExcept->curFlags &= ~BTCF_Multiple; + return SQLITE_OK; } /* This helper routine to saveAllCursors does the actual work of saving @@ -53306,13 +62788,13 @@ static int SQLITE_NOINLINE saveCursorsOnList( ){ do{ if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) ){ - if( p->eState==CURSOR_VALID ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ int rc = saveCursorPosition(p); if( SQLITE_OK!=rc ){ return rc; } }else{ - testcase( p->iPage>0 ); + testcase( p->iPage>=0 ); btreeReleaseAllCursorPages(p); } } @@ -53345,26 +62827,23 @@ static int btreeMoveto( ){ int rc; /* Status code */ UnpackedRecord *pIdxKey; /* Unpacked index key */ - char aSpace[200]; /* Temp space for pIdxKey - to avoid a malloc */ - char *pFree = 0; if( pKey ){ assert( nKey==(i64)(int)nKey ); - pIdxKey = sqlite3VdbeAllocUnpackedRecord( - pCur->pKeyInfo, aSpace, sizeof(aSpace), &pFree - ); - if( pIdxKey==0 ) return SQLITE_NOMEM; + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pCur->pKeyInfo); + if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); if( pIdxKey->nField==0 ){ - sqlite3DbFree(pCur->pKeyInfo->db, pFree); - return SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_BKPT; + goto moveto_done; } }else{ pIdxKey = 0; } rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes); - if( pFree ){ - sqlite3DbFree(pCur->pKeyInfo->db, pFree); +moveto_done: + if( pIdxKey ){ + sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey); } return rc; } @@ -53378,17 +62857,19 @@ static int btreeMoveto( */ static int btreeRestoreCursorPosition(BtCursor *pCur){ int rc; - assert( cursorHoldsMutex(pCur) ); + int skipNext; + assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState>=CURSOR_REQUIRESEEK ); if( pCur->eState==CURSOR_FAULT ){ return pCur->skipNext; } pCur->eState = CURSOR_INVALID; - rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &pCur->skipNext); + rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &skipNext); if( rc==SQLITE_OK ){ sqlite3_free(pCur->pKey); pCur->pKey = 0; assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); + pCur->skipNext |= skipNext; if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ pCur->eState = CURSOR_SKIPNEXT; } @@ -53414,7 +62895,22 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){ ** back to where it ought to be if this routine returns true. */ SQLITE_PRIVATE int sqlite3BtreeCursorHasMoved(BtCursor *pCur){ - return pCur->eState!=CURSOR_VALID; + assert( EIGHT_BYTE_ALIGNMENT(pCur) + || pCur==sqlite3BtreeFakeValidCursor() ); + assert( offsetof(BtCursor, eState)==0 ); + assert( sizeof(pCur->eState)==1 ); + return CURSOR_VALID != *(u8*)pCur; +} + +/* +** Return a pointer to a fake BtCursor object that will always answer +** false to the sqlite3BtreeCursorHasMoved() routine above. The fake +** cursor returned must not be used with any other Btree interface. +*/ +SQLITE_PRIVATE BtCursor *sqlite3BtreeFakeValidCursor(void){ + static u8 fakeCursor = CURSOR_VALID; + assert( offsetof(BtCursor, eState)==0 ); + return (BtCursor*)&fakeCursor; } /* @@ -53440,14 +62936,35 @@ SQLITE_PRIVATE int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow) *pDifferentRow = 1; return rc; } - if( pCur->eState!=CURSOR_VALID || NEVER(pCur->skipNext!=0) ){ + if( pCur->eState!=CURSOR_VALID ){ *pDifferentRow = 1; }else{ + assert( pCur->skipNext==0 ); *pDifferentRow = 0; } return SQLITE_OK; } +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Provide hints to the cursor. The particular hint given (and the type +** and number of the varargs parameters) is determined by the eHintType +** parameter. See the definitions of the BTREE_HINT_* macros for details. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHint(BtCursor *pCur, int eHintType, ...){ + /* Used only by system that substitute their own storage engine */ +} +#endif + +/* +** Provide flag hints to the cursor. +*/ +SQLITE_PRIVATE void sqlite3BtreeCursorHintFlags(BtCursor *pCur, unsigned x){ + assert( x==BTREE_SEEK_EQ || x==BTREE_BULKLOAD || x==0 ); + pCur->hints = x; +} + + #ifndef SQLITE_OMIT_AUTOVACUUM /* ** Given a page number of a regular database page, return the page @@ -53501,7 +63018,7 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ return; } iPtrmap = PTRMAP_PAGENO(pBt, key); - rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); if( rc!=SQLITE_OK ){ *pRC = rc; return; @@ -53544,7 +63061,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ assert( sqlite3_mutex_held(pBt->mutex) ); iPtrmap = PTRMAP_PAGENO(pBt, key); - rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage); + rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage, 0); if( rc!=0 ){ return rc; } @@ -53561,7 +63078,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]); sqlite3PagerUnref(pDbPage); - if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_BKPT; + if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_PGNO(iPtrmap); return SQLITE_OK; } @@ -53576,39 +63093,85 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ ** the page, 1 means the second cell, and so forth) return a pointer ** to the cell content. ** +** findCellPastPtr() does the same except it skips past the initial +** 4-byte child pointer found on interior pages, if there is one. +** ** This routine works only for pages that do not contain overflow cells. */ #define findCell(P,I) \ - ((P)->aData + ((P)->maskPage & get2byte(&(P)->aCellIdx[2*(I)]))) -#define findCellv2(D,M,O,I) (D+(M&get2byte(D+(O+2*(I))))) + ((P)->aData + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) +#define findCellPastPtr(P,I) \ + ((P)->aDataOfst + ((P)->maskPage & get2byteAligned(&(P)->aCellIdx[2*(I)]))) /* -** This a more complex version of findCell() that works for -** pages that do contain overflow cells. +** This is common tail processing for btreeParseCellPtr() and +** btreeParseCellPtrIndex() for the case when the cell does not fit entirely +** on a single B-tree page. Make necessary adjustments to the CellInfo +** structure. */ -static u8 *findOverflowCell(MemPage *pPage, int iCell){ - int i; - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - for(i=pPage->nOverflow-1; i>=0; i--){ - int k; - k = pPage->aiOvfl[i]; - if( k<=iCell ){ - if( k==iCell ){ - return pPage->apOvfl[i]; - } - iCell--; - } +static SQLITE_NOINLINE void btreeParseCellAdjustSizeForOverflow( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + /* If the payload will not fit completely on the local page, we have + ** to decide how much to store locally and how much to spill onto + ** overflow pages. The strategy is to minimize the amount of unused + ** space on overflow pages while keeping the amount of local storage + ** in between minLocal and maxLocal. + ** + ** Warning: changing the way overflow payload is distributed in any + ** way will result in an incompatible file format. + */ + int minLocal; /* Minimum amount of payload held locally */ + int maxLocal; /* Maximum amount of payload held locally */ + int surplus; /* Overflow payload available for local storage */ + + minLocal = pPage->minLocal; + maxLocal = pPage->maxLocal; + surplus = minLocal + (pInfo->nPayload - minLocal)%(pPage->pBt->usableSize-4); + testcase( surplus==maxLocal ); + testcase( surplus==maxLocal+1 ); + if( surplus <= maxLocal ){ + pInfo->nLocal = (u16)surplus; + }else{ + pInfo->nLocal = (u16)minLocal; } - return findCell(pPage, iCell); + pInfo->nSize = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell) + 4; } /* -** Parse a cell content block and fill in the CellInfo structure. There -** are two versions of this function. btreeParseCell() takes a -** cell index as the second argument and btreeParseCellPtr() -** takes a pointer to the body of the cell as its second argument. +** The following routines are implementations of the MemPage.xParseCell() +** method. +** +** Parse a cell content block and fill in the CellInfo structure. +** +** btreeParseCellPtr() => table btree leaf nodes +** btreeParseCellNoPayload() => table btree internal nodes +** btreeParseCellPtrIndex() => index btree nodes +** +** There is also a wrapper function btreeParseCell() that works for +** all MemPage types and that references the cell by index rather than +** by pointer. */ +static void btreeParseCellPtrNoPayload( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 ); + assert( pPage->childPtrSize==4 ); +#ifndef SQLITE_DEBUG + UNUSED_PARAMETER(pPage); +#endif + pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); + pInfo->nPayload = 0; + pInfo->nLocal = 0; + pInfo->pPayload = 0; + return; +} static void btreeParseCellPtr( MemPage *pPage, /* Page containing the cell */ u8 *pCell, /* Pointer to the cell text. */ @@ -53616,26 +63179,52 @@ static void btreeParseCellPtr( ){ u8 *pIter; /* For scanning through pCell */ u32 nPayload; /* Number of bytes of cell payload */ + u64 iKey; /* Extracted Key value */ assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( pPage->leaf==0 || pPage->leaf==1 ); - if( pPage->intKeyLeaf ){ - assert( pPage->childPtrSize==0 ); - pIter = pCell + getVarint32(pCell, nPayload); - pIter += getVarint(pIter, (u64*)&pInfo->nKey); - }else if( pPage->noPayload ){ - assert( pPage->childPtrSize==4 ); - pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey); - pInfo->nPayload = 0; - pInfo->nLocal = 0; - pInfo->iOverflow = 0; - pInfo->pPayload = 0; - return; - }else{ - pIter = pCell + pPage->childPtrSize; - pIter += getVarint32(pIter, nPayload); - pInfo->nKey = nPayload; + assert( pPage->intKeyLeaf ); + assert( pPage->childPtrSize==0 ); + pIter = pCell; + + /* The next block of code is equivalent to: + ** + ** pIter += getVarint32(pIter, nPayload); + ** + ** The code is inlined to avoid a function call. + */ + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( (*pIter)>=0x80 && pIter<pEnd ); } + pIter++; + + /* The next block of code is equivalent to: + ** + ** pIter += getVarint(pIter, (u64*)&pInfo->nKey); + ** + ** The code is inlined to avoid a function call. + */ + iKey = *pIter; + if( iKey>=0x80 ){ + u8 *pEnd = &pIter[7]; + iKey &= 0x7f; + while(1){ + iKey = (iKey<<7) | (*++pIter & 0x7f); + if( (*pIter)<0x80 ) break; + if( pIter>=pEnd ){ + iKey = (iKey<<8) | *++pIter; + break; + } + } + } + pIter++; + + pInfo->nKey = *(i64*)&iKey; pInfo->nPayload = nPayload; pInfo->pPayload = pIter; testcase( nPayload==pPage->maxLocal ); @@ -53647,33 +63236,45 @@ static void btreeParseCellPtr( pInfo->nSize = nPayload + (u16)(pIter - pCell); if( pInfo->nSize<4 ) pInfo->nSize = 4; pInfo->nLocal = (u16)nPayload; - pInfo->iOverflow = 0; }else{ - /* If the payload will not fit completely on the local page, we have - ** to decide how much to store locally and how much to spill onto - ** overflow pages. The strategy is to minimize the amount of unused - ** space on overflow pages while keeping the amount of local storage - ** in between minLocal and maxLocal. - ** - ** Warning: changing the way overflow payload is distributed in any - ** way will result in an incompatible file format. - */ - int minLocal; /* Minimum amount of payload held locally */ - int maxLocal; /* Maximum amount of payload held locally */ - int surplus; /* Overflow payload available for local storage */ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); + } +} +static void btreeParseCellPtrIndex( + MemPage *pPage, /* Page containing the cell */ + u8 *pCell, /* Pointer to the cell text. */ + CellInfo *pInfo /* Fill in this structure */ +){ + u8 *pIter; /* For scanning through pCell */ + u32 nPayload; /* Number of bytes of cell payload */ - minLocal = pPage->minLocal; - maxLocal = pPage->maxLocal; - surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize - 4); - testcase( surplus==maxLocal ); - testcase( surplus==maxLocal+1 ); - if( surplus <= maxLocal ){ - pInfo->nLocal = (u16)surplus; - }else{ - pInfo->nLocal = (u16)minLocal; - } - pInfo->iOverflow = (u16)(&pInfo->pPayload[pInfo->nLocal] - pCell); - pInfo->nSize = pInfo->iOverflow + 4; + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + assert( pPage->leaf==0 || pPage->leaf==1 ); + assert( pPage->intKeyLeaf==0 ); + pIter = pCell + pPage->childPtrSize; + nPayload = *pIter; + if( nPayload>=0x80 ){ + u8 *pEnd = &pIter[8]; + nPayload &= 0x7f; + do{ + nPayload = (nPayload<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pIter<pEnd ); + } + pIter++; + pInfo->nKey = nPayload; + pInfo->nPayload = nPayload; + pInfo->pPayload = pIter; + testcase( nPayload==pPage->maxLocal ); + testcase( nPayload==pPage->maxLocal+1 ); + if( nPayload<=pPage->maxLocal ){ + /* This is the (easy) common case where the entire payload fits + ** on the local page. No overflow is required. + */ + pInfo->nSize = nPayload + (u16)(pIter - pCell); + if( pInfo->nSize<4 ) pInfo->nSize = 4; + pInfo->nLocal = (u16)nPayload; + }else{ + btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); } } static void btreeParseCell( @@ -53681,14 +63282,20 @@ static void btreeParseCell( int iCell, /* The cell index. First cell is 0 */ CellInfo *pInfo /* Fill in this structure */ ){ - btreeParseCellPtr(pPage, findCell(pPage, iCell), pInfo); + pPage->xParseCell(pPage, findCell(pPage, iCell), pInfo); } /* +** The following routines are implementations of the MemPage.xCellSize +** method. +** ** Compute the total number of bytes that a Cell needs in the cell ** data area of the btree-page. The return number includes the cell ** data header and the local payload, but not any overflow page or ** the space used by the cell pointer. +** +** cellSizePtrNoPayload() => table internal nodes +** cellSizePtr() => all index nodes & table leaf nodes */ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ @@ -53701,18 +63308,12 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of ** this function verifies that this invariant is not violated. */ CellInfo debuginfo; - btreeParseCellPtr(pPage, pCell, &debuginfo); + pPage->xParseCell(pPage, pCell, &debuginfo); #endif - if( pPage->noPayload ){ - pEnd = &pIter[9]; - while( (*pIter++)&0x80 && pIter<pEnd ); - assert( pPage->childPtrSize==4 ); - return (u16)(pIter - pCell); - } nSize = *pIter; if( nSize>=0x80 ){ - pEnd = &pIter[9]; + pEnd = &pIter[8]; nSize &= 0x7f; do{ nSize = (nSize<<7) | (*++pIter & 0x7f); @@ -53744,12 +63345,34 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ assert( nSize==debuginfo.nSize || CORRUPT_DB ); return (u16)nSize; } +static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell + 4; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#else + UNUSED_PARAMETER(pPage); +#endif + + assert( pPage->childPtrSize==4 ); + pEnd = pIter + 9; + while( (*pIter++)&0x80 && pIter<pEnd ); + assert( debuginfo.nSize==(u16)(pIter - pCell) || CORRUPT_DB ); + return (u16)(pIter - pCell); +} + #ifdef SQLITE_DEBUG /* This variation on cellSizePtr() is used inside of assert() statements ** only. */ static u16 cellSize(MemPage *pPage, int iCell){ - return cellSizePtr(pPage, findCell(pPage, iCell)); + return pPage->xCellSize(pPage, findCell(pPage, iCell)); } #endif @@ -53763,9 +63386,9 @@ static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ CellInfo info; if( *pRC ) return; assert( pCell!=0 ); - btreeParseCellPtr(pPage, pCell, &info); - if( info.iOverflow ){ - Pgno ovfl = get4byte(&pCell[info.iOverflow]); + pPage->xParseCell(pPage, pCell, &info); + if( info.nLocal<info.nPayload ){ + Pgno ovfl = get4byte(&pCell[info.nSize-4]); ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); } } @@ -53773,17 +63396,18 @@ static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ /* -** Defragment the page given. All Cells are moved to the -** end of the page and all free space is collected into one -** big FreeBlk that occurs in between the header and cell -** pointer array and the cell content area. +** Defragment the page given. This routine reorganizes cells within the +** page so that there are no free-blocks on the free-block list. +** +** Parameter nMaxFrag is the maximum amount of fragmented space that may be +** present in the page after this routine returns. ** ** EVIDENCE-OF: R-44582-60138 SQLite may from time to time reorganize a ** b-tree page so that there are no freeblocks or fragment bytes, all ** unused bytes are contained in the unallocated space region, and all ** cells are packed tightly at the end of the page. */ -static int defragmentPage(MemPage *pPage){ +static int defragmentPage(MemPage *pPage, int nMaxFrag){ int i; /* Loop counter */ int pc; /* Address of the i-th cell */ int hdr; /* Offset to the page header */ @@ -53798,7 +63422,6 @@ static int defragmentPage(MemPage *pPage){ int iCellFirst; /* First allowable cell index */ int iCellLast; /* Last possible cell index */ - assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( pPage->pBt!=0 ); assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); @@ -53810,9 +63433,59 @@ static int defragmentPage(MemPage *pPage){ cellOffset = pPage->cellOffset; nCell = pPage->nCell; assert( nCell==get2byte(&data[hdr+3]) ); - usableSize = pPage->pBt->usableSize; - cbrk = usableSize; iCellFirst = cellOffset + 2*nCell; + usableSize = pPage->pBt->usableSize; + + /* This block handles pages with two or fewer free blocks and nMaxFrag + ** or fewer fragmented bytes. In this case it is faster to move the + ** two (or one) blocks of cells using memmove() and add the required + ** offsets to each pointer in the cell-pointer array than it is to + ** reconstruct the entire page. */ + if( (int)data[hdr+7]<=nMaxFrag ){ + int iFree = get2byte(&data[hdr+1]); + if( iFree ){ + int iFree2 = get2byte(&data[iFree]); + + /* pageFindSlot() has already verified that free blocks are sorted + ** in order of offset within the page, and that no block extends + ** past the end of the page. Provided the two free slots do not + ** overlap, this guarantees that the memmove() calls below will not + ** overwrite the usableSize byte buffer, even if the database page + ** is corrupt. */ + assert( iFree2==0 || iFree2>iFree ); + assert( iFree+get2byte(&data[iFree+2]) <= usableSize ); + assert( iFree2==0 || iFree2+get2byte(&data[iFree2+2]) <= usableSize ); + + if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ + u8 *pEnd = &data[cellOffset + nCell*2]; + u8 *pAddr; + int sz2 = 0; + int sz = get2byte(&data[iFree+2]); + int top = get2byte(&data[hdr+5]); + if( top>=iFree ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( iFree2 ){ + assert( iFree+sz<=iFree2 ); /* Verified by pageFindSlot() */ + sz2 = get2byte(&data[iFree2+2]); + assert( iFree+sz+sz2+iFree2-(iFree+sz) <= usableSize ); + memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); + sz += sz2; + } + cbrk = top+sz; + assert( cbrk+(iFree-top) <= usableSize ); + memmove(&data[cbrk], &data[top], iFree-top); + for(pAddr=&data[cellOffset]; pAddr<pEnd; pAddr+=2){ + pc = get2byte(pAddr); + if( pc<iFree ){ put2byte(pAddr, pc+sz); } + else if( pc<iFree2 ){ put2byte(pAddr, pc+sz2); } + } + goto defragment_out; + } + } + } + + cbrk = usableSize; iCellLast = usableSize - 4; for(i=0; i<nCell; i++){ u8 *pAddr; /* The i-th cell pointer */ @@ -53820,26 +63493,18 @@ static int defragmentPage(MemPage *pPage){ pc = get2byte(pAddr); testcase( pc==iCellFirst ); testcase( pc==iCellLast ); -#if !defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) /* These conditions have already been verified in btreeInitPage() - ** if SQLITE_ENABLE_OVERSIZE_CELL_CHECK is defined + ** if PRAGMA cell_size_check=ON. */ if( pc<iCellFirst || pc>iCellLast ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } -#endif assert( pc>=iCellFirst && pc<=iCellLast ); - size = cellSizePtr(pPage, &src[pc]); + size = pPage->xCellSize(pPage, &src[pc]); cbrk -= size; -#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) - if( cbrk<iCellFirst ){ - return SQLITE_CORRUPT_BKPT; - } -#else if( cbrk<iCellFirst || pc+size>usableSize ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } -#endif assert( cbrk+size<=usableSize && cbrk>=iCellFirst ); testcase( cbrk+size==usableSize ); testcase( pc+size==usableSize ); @@ -53854,16 +63519,18 @@ static int defragmentPage(MemPage *pPage){ } memcpy(&data[cbrk], &src[pc], size); } + data[hdr+7] = 0; + + defragment_out: + if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ + return SQLITE_CORRUPT_PAGE(pPage); + } assert( cbrk>=iCellFirst ); put2byte(&data[hdr+5], cbrk); data[hdr+1] = 0; data[hdr+2] = 0; - data[hdr+7] = 0; memset(&data[iCellFirst], 0, cbrk-iCellFirst); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - if( cbrk-iCellFirst!=pPage->nFree ){ - return SQLITE_CORRUPT_BKPT; - } return SQLITE_OK; } @@ -53877,47 +63544,40 @@ static int defragmentPage(MemPage *pPage){ ** This function may detect corruption within pPg. If corruption is ** detected then *pRc is set to SQLITE_CORRUPT and NULL is returned. ** -** If a slot of at least nByte bytes is found but cannot be used because -** there are already at least 60 fragmented bytes on the page, return NULL. -** In this case, if pbDefrag parameter is not NULL, set *pbDefrag to true. +** Slots on the free list that are between 1 and 3 bytes larger than nByte +** will be ignored if adding the extra space to the fragmentation count +** causes the fragmentation count to exceed 60. */ -static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc, int *pbDefrag){ +static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ const int hdr = pPg->hdrOffset; u8 * const aData = pPg->aData; - int iAddr; - int pc; + int iAddr = hdr + 1; + int pc = get2byte(&aData[iAddr]); + int x; int usableSize = pPg->pBt->usableSize; + int size; /* Size of the free slot */ - for(iAddr=hdr+1; (pc = get2byte(&aData[iAddr]))>0; iAddr=pc){ - int size; /* Size of the free slot */ - /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of - ** increasing offset. */ - if( pc>usableSize-4 || pc<iAddr+4 ){ - *pRc = SQLITE_CORRUPT_BKPT; - return 0; - } + assert( pc>0 ); + while( pc<=usableSize-4 ){ /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each ** freeblock form a big-endian integer which is the size of the freeblock ** in bytes, including the 4-byte header. */ size = get2byte(&aData[pc+2]); - if( size>=nByte ){ - int x = size - nByte; + if( (x = size - nByte)>=0 ){ testcase( x==4 ); testcase( x==3 ); - if( x<4 ){ + if( size+pc > usableSize ){ + *pRc = SQLITE_CORRUPT_PAGE(pPg); + return 0; + }else if( x<4 ){ /* EVIDENCE-OF: R-11498-58022 In a well-formed b-tree page, the total ** number of bytes in fragments may not exceed 60. */ - if( aData[hdr+7]>=60 ){ - if( pbDefrag ) *pbDefrag = 1; - return 0; - } + if( aData[hdr+7]>57 ) return 0; + /* Remove the slot from the free-list. Update the number of ** fragmented bytes within the page. */ memcpy(&aData[iAddr], &aData[pc], 2); aData[hdr+7] += (u8)x; - }else if( size+pc > usableSize ){ - *pRc = SQLITE_CORRUPT_BKPT; - return 0; }else{ /* The slot remains on the free-list. Reduce its size to account ** for the portion used by the new allocation. */ @@ -53925,6 +63585,12 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc, int *pbDefrag){ } return &aData[pc + x]; } + iAddr = pc; + pc = get2byte(&aData[pc]); + if( pc<iAddr+size ) break; + } + if( pc ){ + *pRc = SQLITE_CORRUPT_PAGE(pPg); } return 0; @@ -53966,8 +63632,15 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** then the cell content offset of an empty page wants to be 65536. ** However, that integer is too large to be stored in a 2-byte unsigned ** integer, so a value of 0 is used in its place. */ - top = get2byteNotZero(&data[hdr+5]); - if( gap>top ) return SQLITE_CORRUPT_BKPT; + top = get2byte(&data[hdr+5]); + assert( top<=(int)pPage->pBt->usableSize ); /* Prevent by getAndInitPage() */ + if( gap>top ){ + if( top==0 && pPage->pBt->usableSize==65536 ){ + top = 65536; + }else{ + return SQLITE_CORRUPT_PAGE(pPage); + } + } /* If there is enough space between gap and top for one more cell pointer ** array entry offset, and if the freelist is not empty, then search the @@ -53976,15 +63649,14 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ testcase( gap+2==top ); testcase( gap+1==top ); testcase( gap==top ); - if( gap+2<=top && (data[hdr+1] || data[hdr+2]) ){ - int bDefrag = 0; - u8 *pSpace = pageFindSlot(pPage, nByte, &rc, &bDefrag); - if( rc ) return rc; - if( bDefrag ) goto defragment_page; + if( (data[hdr+2] || data[hdr+1]) && gap+2<=top ){ + u8 *pSpace = pageFindSlot(pPage, nByte, &rc); if( pSpace ){ assert( pSpace>=data && (pSpace - data)<65536 ); *pIdx = (int)(pSpace - data); return SQLITE_OK; + }else if( rc ){ + return rc; } } @@ -53993,12 +63665,11 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ */ testcase( gap+2+nByte==top ); if( gap+2+nByte>top ){ - defragment_page: assert( pPage->nCell>0 || CORRUPT_DB ); - rc = defragmentPage(pPage); + rc = defragmentPage(pPage, MIN(4, pPage->nFree - (2+nByte))); if( rc ) return rc; top = get2byteNotZero(&data[hdr+5]); - assert( gap+nByte<=top ); + assert( gap+2+nByte<=top ); } @@ -54034,23 +63705,17 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ u8 hdr; /* Page header size. 0 or 100 */ u8 nFrag = 0; /* Reduction in fragmentation */ u16 iOrigSize = iSize; /* Original value of iSize */ - u32 iLast = pPage->pBt->usableSize-4; /* Largest possible freeblock offset */ + u16 x; /* Offset to cell content area */ u32 iEnd = iStart + iSize; /* First byte past the iStart buffer */ unsigned char *data = pPage->aData; /* Page content */ assert( pPage->pBt!=0 ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); - assert( iStart>=pPage->hdrOffset+6+pPage->childPtrSize ); + assert( CORRUPT_DB || iStart>=pPage->hdrOffset+6+pPage->childPtrSize ); assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( iSize>=4 ); /* Minimum cell size is 4 */ - assert( iStart<=iLast ); - - /* Overwrite deleted information with zeros when the secure_delete - ** option is enabled */ - if( pPage->pBt->btsFlags & BTS_SECURE_DELETE ){ - memset(&data[iStart], 0, iSize); - } + assert( iStart<=pPage->pBt->usableSize-4 ); /* The list of freeblocks must be in ascending order. Find the ** spot on the list where iStart should be inserted. @@ -54060,23 +63725,31 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ if( data[iPtr+1]==0 && data[iPtr]==0 ){ iFreeBlk = 0; /* Shortcut for the case when the freelist is empty */ }else{ - while( (iFreeBlk = get2byte(&data[iPtr]))>0 && iFreeBlk<iStart ){ - if( iFreeBlk<iPtr+4 ) return SQLITE_CORRUPT_BKPT; + while( (iFreeBlk = get2byte(&data[iPtr]))<iStart ){ + if( iFreeBlk<iPtr+4 ){ + if( iFreeBlk==0 ) break; + return SQLITE_CORRUPT_PAGE(pPage); + } iPtr = iFreeBlk; } - if( iFreeBlk>iLast ) return SQLITE_CORRUPT_BKPT; + if( iFreeBlk>pPage->pBt->usableSize-4 ){ + return SQLITE_CORRUPT_PAGE(pPage); + } assert( iFreeBlk>iPtr || iFreeBlk==0 ); /* At this point: ** iFreeBlk: First freeblock after iStart, or zero if none - ** iPtr: The address of a pointer iFreeBlk + ** iPtr: The address of a pointer to iFreeBlk ** ** Check to see if iFreeBlk should be coalesced onto the end of iStart. */ if( iFreeBlk && iEnd+3>=iFreeBlk ){ nFrag = iFreeBlk - iEnd; - if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_BKPT; + if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage); iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); + if( iEnd > pPage->pBt->usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } iSize = iEnd - iStart; iFreeBlk = get2byte(&data[iFreeBlk]); } @@ -54088,28 +63761,34 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ if( iPtr>hdr+1 ){ int iPtrEnd = iPtr + get2byte(&data[iPtr+2]); if( iPtrEnd+3>=iStart ){ - if( iPtrEnd>iStart ) return SQLITE_CORRUPT_BKPT; + if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PAGE(pPage); nFrag += iStart - iPtrEnd; iSize = iEnd - iPtr; iStart = iPtr; } } - if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_BKPT; + if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage); data[hdr+7] -= nFrag; } - if( iStart==get2byte(&data[hdr+5]) ){ + x = get2byte(&data[hdr+5]); + if( iStart<=x ){ /* The new freeblock is at the beginning of the cell content area, ** so just extend the cell content area rather than create another ** freelist entry */ - if( iPtr!=hdr+1 ) return SQLITE_CORRUPT_BKPT; + if( iStart<x || iPtr!=hdr+1 ) return SQLITE_CORRUPT_PAGE(pPage); put2byte(&data[hdr+1], iFreeBlk); put2byte(&data[hdr+5], iEnd); }else{ /* Insert the new freeblock into the freelist */ put2byte(&data[iPtr], iStart); - put2byte(&data[iStart], iFreeBlk); - put2byte(&data[iStart+2], iSize); } + if( pPage->pBt->btsFlags & BTS_FAST_SECURE ){ + /* Overwrite deleted information with zeros when the secure_delete + ** option is enabled */ + memset(&data[iStart], 0, iSize); + } + put2byte(&data[iStart], iFreeBlk); + put2byte(&data[iStart+2], iSize); pPage->nFree += iOrigSize; return SQLITE_OK; } @@ -54134,35 +63813,42 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); flagByte &= ~PTF_LEAF; pPage->childPtrSize = 4-4*pPage->leaf; + pPage->xCellSize = cellSizePtr; pBt = pPage->pBt; if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ - /* EVIDENCE-OF: R-03640-13415 A value of 5 means the page is an interior - ** table b-tree page. */ + /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an + ** interior table b-tree page. */ assert( (PTF_LEAFDATA|PTF_INTKEY)==5 ); - /* EVIDENCE-OF: R-20501-61796 A value of 13 means the page is a leaf - ** table b-tree page. */ + /* EVIDENCE-OF: R-26900-09176 A value of 13 (0x0d) means the page is a + ** leaf table b-tree page. */ assert( (PTF_LEAFDATA|PTF_INTKEY|PTF_LEAF)==13 ); pPage->intKey = 1; - pPage->intKeyLeaf = pPage->leaf; - pPage->noPayload = !pPage->leaf; + if( pPage->leaf ){ + pPage->intKeyLeaf = 1; + pPage->xParseCell = btreeParseCellPtr; + }else{ + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtrNoPayload; + pPage->xParseCell = btreeParseCellPtrNoPayload; + } pPage->maxLocal = pBt->maxLeaf; pPage->minLocal = pBt->minLeaf; }else if( flagByte==PTF_ZERODATA ){ - /* EVIDENCE-OF: R-27225-53936 A value of 2 means the page is an interior - ** index b-tree page. */ + /* EVIDENCE-OF: R-43316-37308 A value of 2 (0x02) means the page is an + ** interior index b-tree page. */ assert( (PTF_ZERODATA)==2 ); - /* EVIDENCE-OF: R-16571-11615 A value of 10 means the page is a leaf - ** index b-tree page. */ + /* EVIDENCE-OF: R-59615-42828 A value of 10 (0x0a) means the page is a + ** leaf index b-tree page. */ assert( (PTF_ZERODATA|PTF_LEAF)==10 ); pPage->intKey = 0; pPage->intKeyLeaf = 0; - pPage->noPayload = 0; + pPage->xParseCell = btreeParseCellPtrIndex; pPage->maxLocal = pBt->maxLocal; pPage->minLocal = pBt->minLocal; }else{ /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is ** an error. */ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } pPage->max1bytePayload = pBt->max1bytePayload; return SQLITE_OK; @@ -54178,129 +63864,136 @@ static int decodeFlags(MemPage *pPage, int flagByte){ ** we failed to detect any corruption. */ static int btreeInitPage(MemPage *pPage){ + int pc; /* Address of a freeblock within pPage->aData[] */ + u8 hdr; /* Offset to beginning of page header */ + u8 *data; /* Equal to pPage->aData */ + BtShared *pBt; /* The main btree structure */ + int usableSize; /* Amount of usable space on each page */ + u16 cellOffset; /* Offset from start of page to first cell pointer */ + int nFree; /* Number of unused bytes on the page */ + int top; /* First byte of the cell content area */ + int iCellFirst; /* First allowable cell or freeblock offset */ + int iCellLast; /* Last possible cell or freeblock offset */ assert( pPage->pBt!=0 ); + assert( pPage->pBt->db!=0 ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); + assert( pPage->isInit==0 ); - if( !pPage->isInit ){ - u16 pc; /* Address of a freeblock within pPage->aData[] */ - u8 hdr; /* Offset to beginning of page header */ - u8 *data; /* Equal to pPage->aData */ - BtShared *pBt; /* The main btree structure */ - int usableSize; /* Amount of usable space on each page */ - u16 cellOffset; /* Offset from start of page to first cell pointer */ - int nFree; /* Number of unused bytes on the page */ - int top; /* First byte of the cell content area */ - int iCellFirst; /* First allowable cell or freeblock offset */ - int iCellLast; /* Last possible cell or freeblock offset */ + pBt = pPage->pBt; + hdr = pPage->hdrOffset; + data = pPage->aData; + /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating + ** the b-tree page type. */ + if( decodeFlags(pPage, data[hdr]) ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); + pPage->maskPage = (u16)(pBt->pageSize - 1); + pPage->nOverflow = 0; + usableSize = pBt->usableSize; + pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; + pPage->aDataEnd = &data[usableSize]; + pPage->aCellIdx = &data[cellOffset]; + pPage->aDataOfst = &data[pPage->childPtrSize]; + /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates + ** the start of the cell content area. A zero value for this integer is + ** interpreted as 65536. */ + top = get2byteNotZero(&data[hdr+5]); + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + pPage->nCell = get2byte(&data[hdr+3]); + if( pPage->nCell>MX_CELL(pBt) ){ + /* To many cells for a single page. The page must be corrupt */ + return SQLITE_CORRUPT_PAGE(pPage); + } + testcase( pPage->nCell==MX_CELL(pBt) ); + /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only + ** possible for a root page of a table that contains no rows) then the + ** offset to the cell content area will equal the page size minus the + ** bytes of reserved space. */ + assert( pPage->nCell>0 || top==usableSize || CORRUPT_DB ); - pBt = pPage->pBt; + /* A malformed database page might cause us to read past the end + ** of page when parsing a cell. + ** + ** The following block of code checks early to see if a cell extends + ** past the end of a page boundary and causes SQLITE_CORRUPT to be + ** returned if it does. + */ + iCellFirst = cellOffset + 2*pPage->nCell; + iCellLast = usableSize - 4; + if( pBt->db->flags & SQLITE_CellSizeCk ){ + int i; /* Index into the cell pointer array */ + int sz; /* Size of a cell */ - hdr = pPage->hdrOffset; - data = pPage->aData; - /* EVIDENCE-OF: R-28594-02890 The one-byte flag at offset 0 indicating - ** the b-tree page type. */ - if( decodeFlags(pPage, data[hdr]) ) return SQLITE_CORRUPT_BKPT; - assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); - pPage->maskPage = (u16)(pBt->pageSize - 1); - pPage->nOverflow = 0; - usableSize = pBt->usableSize; - pPage->cellOffset = cellOffset = hdr + 8 + pPage->childPtrSize; - pPage->aDataEnd = &data[usableSize]; - pPage->aCellIdx = &data[cellOffset]; - /* EVIDENCE-OF: R-58015-48175 The two-byte integer at offset 5 designates - ** the start of the cell content area. A zero value for this integer is - ** interpreted as 65536. */ - top = get2byteNotZero(&data[hdr+5]); - /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the - ** number of cells on the page. */ - pPage->nCell = get2byte(&data[hdr+3]); - if( pPage->nCell>MX_CELL(pBt) ){ - /* To many cells for a single page. The page must be corrupt */ - return SQLITE_CORRUPT_BKPT; - } - testcase( pPage->nCell==MX_CELL(pBt) ); - /* EVIDENCE-OF: R-24089-57979 If a page contains no cells (which is only - ** possible for a root page of a table that contains no rows) then the - ** offset to the cell content area will equal the page size minus the - ** bytes of reserved space. */ - assert( pPage->nCell>0 || top==usableSize || CORRUPT_DB ); - - /* A malformed database page might cause us to read past the end - ** of page when parsing a cell. - ** - ** The following block of code checks early to see if a cell extends - ** past the end of a page boundary and causes SQLITE_CORRUPT to be - ** returned if it does. - */ - iCellFirst = cellOffset + 2*pPage->nCell; - iCellLast = usableSize - 4; -#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) - { - int i; /* Index into the cell pointer array */ - int sz; /* Size of a cell */ - - if( !pPage->leaf ) iCellLast--; - for(i=0; i<pPage->nCell; i++){ - pc = get2byte(&data[cellOffset+i*2]); - testcase( pc==iCellFirst ); - testcase( pc==iCellLast ); - if( pc<iCellFirst || pc>iCellLast ){ - return SQLITE_CORRUPT_BKPT; - } - sz = cellSizePtr(pPage, &data[pc]); - testcase( pc+sz==usableSize ); - if( pc+sz>usableSize ){ - return SQLITE_CORRUPT_BKPT; - } - } - if( !pPage->leaf ) iCellLast++; - } -#endif - - /* Compute the total free space on the page - ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the - ** start of the first freeblock on the page, or is zero if there are no - ** freeblocks. */ - pc = get2byte(&data[hdr+1]); - nFree = data[hdr+7] + top; /* Init nFree to non-freeblock free space */ - while( pc>0 ){ - u16 next, size; + if( !pPage->leaf ) iCellLast--; + for(i=0; i<pPage->nCell; i++){ + pc = get2byteAligned(&data[cellOffset+i*2]); + testcase( pc==iCellFirst ); + testcase( pc==iCellLast ); if( pc<iCellFirst || pc>iCellLast ){ - /* EVIDENCE-OF: R-55530-52930 In a well-formed b-tree page, there will - ** always be at least one cell before the first freeblock. - ** - ** Or, the freeblock is off the end of the page - */ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); + } + sz = pPage->xCellSize(pPage, &data[pc]); + testcase( pc+sz==usableSize ); + if( pc+sz>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + if( !pPage->leaf ) iCellLast++; + } + + /* Compute the total free space on the page + ** EVIDENCE-OF: R-23588-34450 The two-byte integer at offset 1 gives the + ** start of the first freeblock on the page, or is zero if there are no + ** freeblocks. */ + pc = get2byte(&data[hdr+1]); + nFree = data[hdr+7] + top; /* Init nFree to non-freeblock free space */ + if( pc>0 ){ + u32 next, size; + if( pc<iCellFirst ){ + /* EVIDENCE-OF: R-55530-52930 In a well-formed b-tree page, there will + ** always be at least one cell before the first freeblock. + */ + return SQLITE_CORRUPT_PAGE(pPage); + } + while( 1 ){ + if( pc>iCellLast ){ + /* Freeblock off the end of the page */ + return SQLITE_CORRUPT_PAGE(pPage); } next = get2byte(&data[pc]); size = get2byte(&data[pc+2]); - if( (next>0 && next<=pc+size+3) || pc+size>usableSize ){ - /* Free blocks must be in ascending order. And the last byte of - ** the free-block must lie on the database page. */ - return SQLITE_CORRUPT_BKPT; - } nFree = nFree + size; + if( next<=pc+size+3 ) break; pc = next; } - - /* At this point, nFree contains the sum of the offset to the start - ** of the cell-content area plus the number of free bytes within - ** the cell-content area. If this is greater than the usable-size - ** of the page, then the page must be corrupted. This check also - ** serves to verify that the offset to the start of the cell-content - ** area, according to the page header, lies within the page. - */ - if( nFree>usableSize ){ - return SQLITE_CORRUPT_BKPT; + if( next>0 ){ + /* Freeblock not in ascending order */ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( pc+size>(unsigned int)usableSize ){ + /* Last freeblock extends past page end */ + return SQLITE_CORRUPT_PAGE(pPage); } - pPage->nFree = (u16)(nFree - iCellFirst); - pPage->isInit = 1; } + + /* At this point, nFree contains the sum of the offset to the start + ** of the cell-content area plus the number of free bytes within + ** the cell-content area. If this is greater than the usable-size + ** of the page, then the page must be corrupted. This check also + ** serves to verify that the offset to the start of the cell-content + ** area, according to the page header, lies within the page. + */ + if( nFree>usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + pPage->nFree = (u16)(nFree - iCellFirst); + pPage->isInit = 1; return SQLITE_OK; } @@ -54319,7 +64012,7 @@ static void zeroPage(MemPage *pPage, int flags){ assert( sqlite3PagerGetData(pPage->pDbPage) == data ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( sqlite3_mutex_held(pBt->mutex) ); - if( pBt->btsFlags & BTS_SECURE_DELETE ){ + if( pBt->btsFlags & BTS_FAST_SECURE ){ memset(&data[hdr], 0, pBt->usableSize - hdr); } data[hdr] = (char)flags; @@ -54332,6 +64025,7 @@ static void zeroPage(MemPage *pPage, int flags){ pPage->cellOffset = first; pPage->aDataEnd = &data[pBt->usableSize]; pPage->aCellIdx = &data[first]; + pPage->aDataOfst = &data[pPage->childPtrSize]; pPage->nOverflow = 0; assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); pPage->maskPage = (u16)(pBt->pageSize - 1); @@ -54346,20 +64040,23 @@ static void zeroPage(MemPage *pPage, int flags){ */ static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){ MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); - pPage->aData = sqlite3PagerGetData(pDbPage); - pPage->pDbPage = pDbPage; - pPage->pBt = pBt; - pPage->pgno = pgno; - pPage->hdrOffset = pPage->pgno==1 ? 100 : 0; + if( pgno!=pPage->pgno ){ + pPage->aData = sqlite3PagerGetData(pDbPage); + pPage->pDbPage = pDbPage; + pPage->pBt = pBt; + pPage->pgno = pgno; + pPage->hdrOffset = pgno==1 ? 100 : 0; + } + assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); return pPage; } /* ** Get a page from the pager. Initialize the MemPage.pBt and -** MemPage.aData elements if needed. +** MemPage.aData elements if needed. See also: btreeGetUnusedPage(). ** -** If the noContent flag is set, it means that we do not care about -** the content of the page at this time. So do not go to the disk +** If the PAGER_GET_NOCONTENT flag is set, it means that we do not care +** about the content of the page at this time. So do not go to the disk ** to fetch the content. Just fill in the content with zeros for now. ** If in the future we call sqlite3PagerWrite() on this page, that ** means we have started to be concerned about content and the disk @@ -54376,7 +64073,7 @@ static int btreeGetPage( assert( flags==0 || flags==PAGER_GET_NOCONTENT || flags==PAGER_GET_READONLY ); assert( sqlite3_mutex_held(pBt->mutex) ); - rc = sqlite3PagerAcquire(pBt->pPager, pgno, (DbPage**)&pDbPage, flags); + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, flags); if( rc ) return rc; *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt); return SQLITE_OK; @@ -54406,40 +64103,71 @@ static Pgno btreePagecount(BtShared *pBt){ } SQLITE_PRIVATE u32 sqlite3BtreeLastPage(Btree *p){ assert( sqlite3BtreeHoldsMutex(p) ); - assert( ((p->pBt->nPage)&0x8000000)==0 ); + assert( ((p->pBt->nPage)&0x80000000)==0 ); return btreePagecount(p->pBt); } /* -** Get a page from the pager and initialize it. This routine is just a -** convenience wrapper around separate calls to btreeGetPage() and -** btreeInitPage(). +** Get a page from the pager and initialize it. ** -** If an error occurs, then the value *ppPage is set to is undefined. It +** If pCur!=0 then the page is being fetched as part of a moveToChild() +** call. Do additional sanity checking on the page in this case. +** And if the fetch fails, this routine must decrement pCur->iPage. +** +** The page is fetched as read-write unless pCur is not NULL and is +** a read-only cursor. +** +** If an error occurs, then *ppPage is undefined. It ** may remain unchanged, or it may be set to an invalid value. */ static int getAndInitPage( BtShared *pBt, /* The database file */ Pgno pgno, /* Number of the page to get */ MemPage **ppPage, /* Write the page pointer here */ - int bReadonly /* PAGER_GET_READONLY or 0 */ + BtCursor *pCur, /* Cursor to receive the page, or NULL */ + int bReadOnly /* True for a read-only page */ ){ int rc; + DbPage *pDbPage; assert( sqlite3_mutex_held(pBt->mutex) ); - assert( bReadonly==PAGER_GET_READONLY || bReadonly==0 ); + assert( pCur==0 || ppPage==&pCur->pPage ); + assert( pCur==0 || bReadOnly==pCur->curPagerFlags ); + assert( pCur==0 || pCur->iPage>0 ); if( pgno>btreePagecount(pBt) ){ rc = SQLITE_CORRUPT_BKPT; - }else{ - rc = btreeGetPage(pBt, pgno, ppPage, bReadonly); - if( rc==SQLITE_OK && (*ppPage)->isInit==0 ){ - rc = btreeInitPage(*ppPage); - if( rc!=SQLITE_OK ){ - releasePage(*ppPage); - } + goto getAndInitPage_error; + } + rc = sqlite3PagerGet(pBt->pPager, pgno, (DbPage**)&pDbPage, bReadOnly); + if( rc ){ + goto getAndInitPage_error; + } + *ppPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); + if( (*ppPage)->isInit==0 ){ + btreePageFromDbPage(pDbPage, pgno, pBt); + rc = btreeInitPage(*ppPage); + if( rc!=SQLITE_OK ){ + releasePage(*ppPage); + goto getAndInitPage_error; } } + assert( (*ppPage)->pgno==pgno ); + assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) ); + /* If obtaining a child page for a cursor, we must verify that the page is + ** compatible with the root page. */ + if( pCur && ((*ppPage)->nCell<1 || (*ppPage)->intKey!=pCur->curIntKey) ){ + rc = SQLITE_CORRUPT_PGNO(pgno); + releasePage(*ppPage); + goto getAndInitPage_error; + } + return SQLITE_OK; + +getAndInitPage_error: + if( pCur ){ + pCur->iPage--; + pCur->pPage = pCur->apPage[pCur->iPage]; + } testcase( pgno==0 ); assert( pgno!=0 || rc==SQLITE_CORRUPT ); return rc; @@ -54448,18 +64176,61 @@ static int getAndInitPage( /* ** Release a MemPage. This should be called once for each prior ** call to btreeGetPage. +** +** Page1 is a special case and must be released using releasePageOne(). */ -static void releasePage(MemPage *pPage){ - if( pPage ){ - assert( pPage->aData ); - assert( pPage->pBt ); - assert( pPage->pDbPage!=0 ); - assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); - assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); - assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - sqlite3PagerUnrefNotNull(pPage->pDbPage); - } +static void releasePageNotNull(MemPage *pPage){ + assert( pPage->aData ); + assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnrefNotNull(pPage->pDbPage); } +static void releasePage(MemPage *pPage){ + if( pPage ) releasePageNotNull(pPage); +} +static void releasePageOne(MemPage *pPage){ + assert( pPage!=0 ); + assert( pPage->aData ); + assert( pPage->pBt ); + assert( pPage->pDbPage!=0 ); + assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); + assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); + assert( sqlite3_mutex_held(pPage->pBt->mutex) ); + sqlite3PagerUnrefPageOne(pPage->pDbPage); +} + +/* +** Get an unused page. +** +** This works just like btreeGetPage() with the addition: +** +** * If the page is already in use for some other purpose, immediately +** release it and return an SQLITE_CURRUPT error. +** * Make sure the isInit flag is clear +*/ +static int btreeGetUnusedPage( + BtShared *pBt, /* The btree */ + Pgno pgno, /* Number of the page to fetch */ + MemPage **ppPage, /* Return the page in this parameter */ + int flags /* PAGER_GET_NOCONTENT or PAGER_GET_READONLY */ +){ + int rc = btreeGetPage(pBt, pgno, ppPage, flags); + if( rc==SQLITE_OK ){ + if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){ + releasePage(*ppPage); + *ppPage = 0; + return SQLITE_CORRUPT_BKPT; + } + (*ppPage)->isInit = 0; + }else{ + *ppPage = 0; + } + return rc; +} + /* ** During a rollback, when the pager reloads information into the cache @@ -54495,7 +64266,8 @@ static int btreeInvokeBusyHandler(void *pArg){ BtShared *pBt = (BtShared*)pArg; assert( pBt->db ); assert( sqlite3_mutex_held(pBt->db->mutex) ); - return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); + return sqlite3InvokeBusyHandler(&pBt->db->busyHandler, + sqlite3PagerFile(pBt->pPager)); } /* @@ -54567,7 +64339,7 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( } p = sqlite3MallocZero(sizeof(Btree)); if( !p ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } p->inTrans = TRANS_NONE; p->db = db; @@ -54583,16 +64355,18 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( */ if( isTempDb==0 && (isMemdb==0 || (vfsFlags&SQLITE_OPEN_URI)!=0) ){ if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){ + int nFilename = sqlite3Strlen30(zFilename)+1; int nFullPathname = pVfs->mxPathname+1; - char *zFullPathname = sqlite3Malloc(nFullPathname); + char *zFullPathname = sqlite3Malloc(MAX(nFullPathname,nFilename)); MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) + p->sharable = 1; if( !zFullPathname ){ sqlite3_free(p); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } if( isMemdb ){ - memcpy(zFullPathname, zFilename, sqlite3Strlen30(zFilename)+1); + memcpy(zFullPathname, zFilename, nFilename); }else{ rc = sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); @@ -54649,19 +64423,19 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( ** the right size. This is to guard against size changes that result ** when compiling on a different architecture. */ - assert( sizeof(i64)==8 || sizeof(i64)==4 ); - assert( sizeof(u64)==8 || sizeof(u64)==4 ); + assert( sizeof(i64)==8 ); + assert( sizeof(u64)==8 ); assert( sizeof(u32)==4 ); assert( sizeof(u16)==2 ); assert( sizeof(Pgno)==4 ); pBt = sqlite3MallocZero( sizeof(*pBt) ); if( pBt==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto btree_open_out; } rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename, - EXTRA_SIZE, flags, vfsFlags, pageReinit); + sizeof(MemPage), flags, vfsFlags, pageReinit); if( rc==SQLITE_OK ){ sqlite3PagerSetMmapLimit(pBt->pPager, db->szMmap); rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); @@ -54671,14 +64445,16 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( } pBt->openFlags = (u8)flags; pBt->db = db; - sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt); + sqlite3PagerSetBusyHandler(pBt->pPager, btreeInvokeBusyHandler, pBt); p->pBt = pBt; pBt->pCursor = 0; pBt->pPage1 = 0; if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; -#ifdef SQLITE_SECURE_DELETE +#if defined(SQLITE_SECURE_DELETE) pBt->btsFlags |= BTS_SECURE_DELETE; +#elif defined(SQLITE_FAST_SECURE_DELETE) + pBt->btsFlags |= BTS_OVERWRITE; #endif /* EVIDENCE-OF: R-51873-39618 The page size for a database file is ** determined by the 2-byte integer located at an offset of 16 bytes from @@ -54719,15 +64495,14 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO) /* Add the new BtShared object to the linked list sharable BtShareds. */ + pBt->nRef = 1; if( p->sharable ){ MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) - pBt->nRef = 1; MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);) if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){ pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST); if( pBt->mutex==0 ){ - rc = SQLITE_NOMEM; - db->mallocFailed = 0; + rc = SQLITE_NOMEM_BKPT; goto btree_open_out; } } @@ -54750,12 +64525,12 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( for(i=0; i<db->nDb; i++){ if( (pSib = db->aDb[i].pBt)!=0 && pSib->sharable ){ while( pSib->pPrev ){ pSib = pSib->pPrev; } - if( p->pBt<pSib->pBt ){ + if( (uptr)p->pBt<(uptr)pSib->pBt ){ p->pNext = pSib; p->pPrev = 0; pSib->pPrev = p; }else{ - while( pSib->pNext && pSib->pNext->pBt<p->pBt ){ + while( pSib->pNext && (uptr)pSib->pNext->pBt<(uptr)p->pBt ){ pSib = pSib->pNext; } p->pNext = pSib->pNext; @@ -54775,12 +64550,14 @@ SQLITE_PRIVATE int sqlite3BtreeOpen( btree_open_out: if( rc!=SQLITE_OK ){ if( pBt && pBt->pPager ){ - sqlite3PagerClose(pBt->pPager); + sqlite3PagerClose(pBt->pPager, 0); } sqlite3_free(pBt); sqlite3_free(p); *ppBtree = 0; }else{ + sqlite3_file *pFile; + /* If the B-Tree was successfully opened, set the pager-cache size to the ** default value. Except, when opening on an existing shared pager-cache, ** do not change the pager-cache size. @@ -54788,11 +64565,17 @@ btree_open_out: if( sqlite3BtreeSchema(p, 0, 0)==0 ){ sqlite3PagerSetCachesize(p->pBt->pPager, SQLITE_DEFAULT_CACHE_SIZE); } + + pFile = sqlite3PagerFile(pBt->pPager); + if( pFile->pMethods ){ + sqlite3OsFileControlHint(pFile, SQLITE_FCNTL_PDB, (void*)&pBt->db); + } } if( mutexOpen ){ assert( sqlite3_mutex_held(mutexOpen) ); sqlite3_mutex_leave(mutexOpen); } + assert( rc!=SQLITE_OK || sqlite3BtreeConnectionCount(*ppBtree)>0 ); return rc; } @@ -54916,7 +64699,7 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ ** Clean out and delete the BtShared object. */ assert( !pBt->pCursor ); - sqlite3PagerClose(pBt->pPager); + sqlite3PagerClose(pBt->pPager, p->db); if( pBt->xFreeSchema && pBt->pSchema ){ pBt->xFreeSchema(pBt->pSchema); } @@ -54937,19 +64720,11 @@ SQLITE_PRIVATE int sqlite3BtreeClose(Btree *p){ } /* -** Change the limit on the number of pages allowed in the cache. -** -** The maximum number of cache pages is set to the absolute -** value of mxPage. If mxPage is negative, the pager will -** operate asynchronously - it will not stop to do fsync()s -** to insure data is written to the disk surface before -** continuing. Transactions still work if synchronous is off, -** and the database cannot be corrupted if this program -** crashes. But if the operating system crashes or there is -** an abrupt power failure when synchronous is off, the database -** could be left in an inconsistent and unrecoverable state. -** Synchronous is on by default so database corruption is not -** normally a worry. +** Change the "soft" limit on the number of pages in the cache. +** Unused and unmodified pages will be recycled when the number of +** pages in the cache exceeds this soft limit. But the size of the +** cache is allowed to grow larger than this limit if it contains +** dirty pages or pages still in active use. */ SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ BtShared *pBt = p->pBt; @@ -54960,6 +64735,26 @@ SQLITE_PRIVATE int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){ return SQLITE_OK; } +/* +** Change the "spill" limit on the number of pages in the cache. +** If the number of pages exceeds this limit during a write transaction, +** the pager might attempt to "spill" pages to the journal early in +** order to free up memory. +** +** The value returned is the current spill size. If zero is passed +** as an argument, no changes are made to the spill size setting, so +** using mxPage of 0 is a way to query the current spill size. +*/ +SQLITE_PRIVATE int sqlite3BtreeSetSpillSize(Btree *p, int mxPage){ + BtShared *pBt = p->pBt; + int res; + assert( sqlite3_mutex_held(p->db->mutex) ); + sqlite3BtreeEnter(p); + res = sqlite3PagerSetSpillsize(pBt->pPager, mxPage); + sqlite3BtreeLeave(p); + return res; +} + #if SQLITE_MAX_MMAP_SIZE>0 /* ** Change the limit on the amount of the database file that may be @@ -54997,21 +64792,6 @@ SQLITE_PRIVATE int sqlite3BtreeSetPagerFlags( } #endif -/* -** Return TRUE if the given btree is set to safety level 1. In other -** words, return TRUE if no sync() occurs on the disk files. -*/ -SQLITE_PRIVATE int sqlite3BtreeSyncDisabled(Btree *p){ - BtShared *pBt = p->pBt; - int rc; - assert( sqlite3_mutex_held(p->db->mutex) ); - sqlite3BtreeEnter(p); - assert( pBt && pBt->pPager ); - rc = sqlite3PagerNosync(pBt->pPager); - sqlite3BtreeLeave(p); - return rc; -} - /* ** Change the default pages size and the number of reserved bytes per page. ** Or, if the page size has already been fixed, return SQLITE_READONLY @@ -55037,6 +64817,9 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, BtShared *pBt = p->pBt; assert( nReserve>=-1 && nReserve<=255 ); sqlite3BtreeEnter(p); +#if SQLITE_HAS_CODEC + if( nReserve>pBt->optimalReserve ) pBt->optimalReserve = (u8)nReserve; +#endif if( pBt->btsFlags & BTS_PAGESIZE_FIXED ){ sqlite3BtreeLeave(p); return SQLITE_READONLY; @@ -55048,7 +64831,7 @@ SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE && ((pageSize-1)&pageSize)==0 ){ assert( (pageSize & 7)==0 ); - assert( !pBt->pPage1 && !pBt->pCursor ); + assert( !pBt->pCursor ); pBt->pageSize = (u32)pageSize; freeTempSpace(pBt); } @@ -55066,7 +64849,6 @@ SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ return p->pBt->pageSize; } -#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_DEBUG) /* ** This function is similar to sqlite3BtreeGetReserve(), except that it ** may only be called if it is guaranteed that the b-tree mutex is already @@ -55079,25 +64861,33 @@ SQLITE_PRIVATE int sqlite3BtreeGetPageSize(Btree *p){ ** database handle that owns *p, causing undefined behavior. */ SQLITE_PRIVATE int sqlite3BtreeGetReserveNoMutex(Btree *p){ + int n; assert( sqlite3_mutex_held(p->pBt->mutex) ); - return p->pBt->pageSize - p->pBt->usableSize; + n = p->pBt->pageSize - p->pBt->usableSize; + return n; } -#endif /* SQLITE_HAS_CODEC || SQLITE_DEBUG */ -#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) /* ** Return the number of bytes of space at the end of every page that ** are intentually left unused. This is the "reserved" space that is ** sometimes used by extensions. +** +** If SQLITE_HAS_MUTEX is defined then the number returned is the +** greater of the current reserved space and the maximum requested +** reserve space. */ -SQLITE_PRIVATE int sqlite3BtreeGetReserve(Btree *p){ +SQLITE_PRIVATE int sqlite3BtreeGetOptimalReserve(Btree *p){ int n; sqlite3BtreeEnter(p); - n = p->pBt->pageSize - p->pBt->usableSize; + n = sqlite3BtreeGetReserveNoMutex(p); +#ifdef SQLITE_HAS_CODEC + if( n<p->pBt->optimalReserve ) n = p->pBt->optimalReserve; +#endif sqlite3BtreeLeave(p); return n; } + /* ** Set the maximum page count for a database if mxPage is positive. ** No changes are made if mxPage is 0 or negative. @@ -55112,23 +64902,37 @@ SQLITE_PRIVATE int sqlite3BtreeMaxPageCount(Btree *p, int mxPage){ } /* -** Set the BTS_SECURE_DELETE flag if newFlag is 0 or 1. If newFlag is -1, -** then make no changes. Always return the value of the BTS_SECURE_DELETE -** setting after the change. +** Change the values for the BTS_SECURE_DELETE and BTS_OVERWRITE flags: +** +** newFlag==0 Both BTS_SECURE_DELETE and BTS_OVERWRITE are cleared +** newFlag==1 BTS_SECURE_DELETE set and BTS_OVERWRITE is cleared +** newFlag==2 BTS_SECURE_DELETE cleared and BTS_OVERWRITE is set +** newFlag==(-1) No changes +** +** This routine acts as a query if newFlag is less than zero +** +** With BTS_OVERWRITE set, deleted content is overwritten by zeros, but +** freelist leaf pages are not written back to the database. Thus in-page +** deleted content is cleared, but freelist deleted content is not. +** +** With BTS_SECURE_DELETE, operation is like BTS_OVERWRITE with the addition +** that freelist leaf pages are written back into the database, increasing +** the amount of disk I/O. */ SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ int b; if( p==0 ) return 0; sqlite3BtreeEnter(p); + assert( BTS_OVERWRITE==BTS_SECURE_DELETE*2 ); + assert( BTS_FAST_SECURE==(BTS_OVERWRITE|BTS_SECURE_DELETE) ); if( newFlag>=0 ){ - p->pBt->btsFlags &= ~BTS_SECURE_DELETE; - if( newFlag ) p->pBt->btsFlags |= BTS_SECURE_DELETE; - } - b = (p->pBt->btsFlags & BTS_SECURE_DELETE)!=0; + p->pBt->btsFlags &= ~BTS_FAST_SECURE; + p->pBt->btsFlags |= BTS_SECURE_DELETE*newFlag; + } + b = (p->pBt->btsFlags & BTS_FAST_SECURE)/BTS_SECURE_DELETE; sqlite3BtreeLeave(p); return b; } -#endif /* !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) */ /* ** Change the 'auto-vacuum' property of the database. If the 'autoVacuum' @@ -55176,6 +64980,36 @@ SQLITE_PRIVATE int sqlite3BtreeGetAutoVacuum(Btree *p){ #endif } +/* +** If the user has not set the safety-level for this database connection +** using "PRAGMA synchronous", and if the safety-level is not already +** set to the value passed to this function as the second parameter, +** set it so. +*/ +#if SQLITE_DEFAULT_SYNCHRONOUS!=SQLITE_DEFAULT_WAL_SYNCHRONOUS \ + && !defined(SQLITE_OMIT_WAL) +static void setDefaultSyncFlag(BtShared *pBt, u8 safety_level){ + sqlite3 *db; + Db *pDb; + if( (db=pBt->db)!=0 && (pDb=db->aDb)!=0 ){ + while( pDb->pBt==0 || pDb->pBt->pBt!=pBt ){ pDb++; } + if( pDb->bSyncSet==0 + && pDb->safety_level!=safety_level + && pDb!=&db->aDb[1] + ){ + pDb->safety_level = safety_level; + sqlite3PagerSetFlags(pBt->pPager, + pDb->safety_level | (db->flags & PAGER_FLAGS_MASK)); + } + } +} +#else +# define setDefaultSyncFlag(pBt,safety_level) +#endif + +/* Forward declaration */ +static int newDatabase(BtShared*); + /* ** Get a reference to pPage1 of the database file. This will @@ -55208,6 +65042,9 @@ static int lockBtree(BtShared *pBt){ if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; } + if( (pBt->db->flags & SQLITE_ResetDatabase)!=0 ){ + nPage = 0; + } if( nPage>0 ){ u32 pageSize; u32 usableSize; @@ -55248,11 +65085,16 @@ static int lockBtree(BtShared *pBt){ rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen); if( rc!=SQLITE_OK ){ goto page1_init_failed; - }else if( isOpen==0 ){ - releasePage(pPage1); - return SQLITE_OK; + }else{ + setDefaultSyncFlag(pBt, SQLITE_DEFAULT_WAL_SYNCHRONOUS+1); + if( isOpen==0 ){ + releasePageOne(pPage1); + return SQLITE_OK; + } } rc = SQLITE_NOTADB; + }else{ + setDefaultSyncFlag(pBt, SQLITE_DEFAULT_SYNCHRONOUS+1); } #endif @@ -55293,7 +65135,7 @@ static int lockBtree(BtShared *pBt){ ** zero and return SQLITE_OK. The caller will call this function ** again with the correct page-size. */ - releasePage(pPage1); + releasePageOne(pPage1); pBt->usableSize = usableSize; pBt->pageSize = pageSize; freeTempSpace(pBt); @@ -55301,7 +65143,7 @@ static int lockBtree(BtShared *pBt){ pageSize-usableSize); return rc; } - if( (pBt->db->flags & SQLITE_RecoveryMode)==0 && nPage>nPageFile ){ + if( (pBt->db->flags & SQLITE_WriteSchema)==0 && nPage>nPageFile ){ rc = SQLITE_CORRUPT_BKPT; goto page1_init_failed; } @@ -55347,7 +65189,7 @@ static int lockBtree(BtShared *pBt){ return SQLITE_OK; page1_init_failed: - releasePage(pPage1); + releasePageOne(pPage1); pBt->pPage1 = 0; return rc; } @@ -55392,7 +65234,7 @@ static void unlockBtreeIfUnused(BtShared *pBt){ assert( pPage1->aData ); assert( sqlite3PagerRefcount(pBt->pPager)==1 ); pBt->pPage1 = 0; - releasePage(pPage1); + releasePageOne(pPage1); } } @@ -55490,7 +65332,6 @@ SQLITE_PRIVATE int sqlite3BtreeNewDb(Btree *p){ ** proceed. */ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ - sqlite3 *pBlock = 0; BtShared *pBt = p->pBt; int rc = SQLITE_OK; @@ -55513,27 +65354,30 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ } #ifndef SQLITE_OMIT_SHARED_CACHE - /* If another database handle has already opened a write transaction - ** on this shared-btree structure and a second write transaction is - ** requested, return SQLITE_LOCKED. - */ - if( (wrflag && pBt->inTransaction==TRANS_WRITE) - || (pBt->btsFlags & BTS_PENDING)!=0 - ){ - pBlock = pBt->pWriter->db; - }else if( wrflag>1 ){ - BtLock *pIter; - for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ - if( pIter->pBtree!=p ){ - pBlock = pIter->pBtree->db; - break; + { + sqlite3 *pBlock = 0; + /* If another database handle has already opened a write transaction + ** on this shared-btree structure and a second write transaction is + ** requested, return SQLITE_LOCKED. + */ + if( (wrflag && pBt->inTransaction==TRANS_WRITE) + || (pBt->btsFlags & BTS_PENDING)!=0 + ){ + pBlock = pBt->pWriter->db; + }else if( wrflag>1 ){ + BtLock *pIter; + for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){ + if( pIter->pBtree!=p ){ + pBlock = pIter->pBtree->db; + break; + } } } - } - if( pBlock ){ - sqlite3ConnectionBlocked(p->db, pBlock); - rc = SQLITE_LOCKED_SHAREDCACHE; - goto trans_begun; + if( pBlock ){ + sqlite3ConnectionBlocked(p->db, pBlock); + rc = SQLITE_LOCKED_SHAREDCACHE; + goto trans_begun; + } } #endif @@ -55571,6 +65415,7 @@ SQLITE_PRIVATE int sqlite3BtreeBeginTrans(Btree *p, int wrflag){ } }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE && btreeInvokeBusyHandler(pBt) ); + sqlite3PagerResetLockTimeout(pBt->pPager); if( rc==SQLITE_OK ){ if( p->inTrans==TRANS_NONE ){ @@ -55639,14 +65484,11 @@ static int setChildPtrmaps(MemPage *pPage){ int nCell; /* Number of cells in page pPage */ int rc; /* Return code */ BtShared *pBt = pPage->pBt; - u8 isInitOrig = pPage->isInit; Pgno pgno = pPage->pgno; assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - rc = btreeInitPage(pPage); - if( rc!=SQLITE_OK ){ - goto set_child_ptrmaps_out; - } + rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); + if( rc!=SQLITE_OK ) return rc; nCell = pPage->nCell; for(i=0; i<nCell; i++){ @@ -55665,8 +65507,6 @@ static int setChildPtrmaps(MemPage *pPage){ ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc); } -set_child_ptrmaps_out: - pPage->isInit = isInitOrig; return rc; } @@ -55690,28 +65530,31 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ if( eType==PTRMAP_OVERFLOW2 ){ /* The pointer is always the first 4 bytes of the page in this case. */ if( get4byte(pPage->aData)!=iFrom ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } put4byte(pPage->aData, iTo); }else{ - u8 isInitOrig = pPage->isInit; int i; int nCell; + int rc; - btreeInitPage(pPage); + rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); + if( rc ) return rc; nCell = pPage->nCell; for(i=0; i<nCell; i++){ u8 *pCell = findCell(pPage, i); if( eType==PTRMAP_OVERFLOW1 ){ CellInfo info; - btreeParseCellPtr(pPage, pCell, &info); - if( info.iOverflow - && pCell+info.iOverflow+3<=pPage->aData+pPage->maskPage - && iFrom==get4byte(&pCell[info.iOverflow]) - ){ - put4byte(&pCell[info.iOverflow], iTo); - break; + pPage->xParseCell(pPage, pCell, &info); + if( info.nLocal<info.nPayload ){ + if( pCell+info.nSize > pPage->aData+pPage->pBt->usableSize ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + if( iFrom==get4byte(pCell+info.nSize-4) ){ + put4byte(pCell+info.nSize-4, iTo); + break; + } } }else{ if( get4byte(pCell)==iFrom ){ @@ -55724,12 +65567,10 @@ static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ if( i==nCell ){ if( eType!=PTRMAP_BTREE || get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pPage); } put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); } - - pPage->isInit = isInitOrig; } return SQLITE_OK; } @@ -56004,7 +65845,7 @@ SQLITE_PRIVATE int sqlite3BtreeIncrVacuum(Btree *p){ static int autoVacuumCommit(BtShared *pBt){ int rc = SQLITE_OK; Pager *pPager = pBt->pPager; - VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager) ); + VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager); ) assert( sqlite3_mutex_held(pBt->mutex) ); invalidateAllOverflowCache(pBt); @@ -56246,9 +66087,8 @@ SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode, int wr if( pBtree ){ sqlite3BtreeEnter(pBtree); for(p=pBtree->pBt->pCursor; p; p=p->pNext){ - int i; if( writeOnly && (p->curFlags & BTCF_WriteFlag)==0 ){ - if( p->eState==CURSOR_VALID ){ + if( p->eState==CURSOR_VALID || p->eState==CURSOR_SKIPNEXT ){ rc = saveCursorPosition(p); if( rc!=SQLITE_OK ){ (void)sqlite3BtreeTripAllCursors(pBtree, rc, 0); @@ -56260,10 +66100,7 @@ SQLITE_PRIVATE int sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode, int wr p->eState = CURSOR_FAULT; p->skipNext = errCode; } - for(i=0; i<=p->iPage; i++){ - releasePage(p->apPage[i]); - p->apPage[i] = 0; - } + btreeReleaseAllCursorPages(p); } sqlite3BtreeLeave(pBtree); } @@ -56320,7 +66157,7 @@ SQLITE_PRIVATE int sqlite3BtreeRollback(Btree *p, int tripCode, int writeOnly){ if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage); testcase( pBt->nPage!=nPage ); pBt->nPage = nPage; - releasePage(pPage1); + releasePageOne(pPage1); } assert( countValidCursors(pBt, 1)==0 ); pBt->inTransaction = TRANS_READ; @@ -56388,7 +66225,12 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK ); assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) ); sqlite3BtreeEnter(p); - rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); + if( op==SAVEPOINT_ROLLBACK ){ + rc = saveAllCursors(pBt, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); + } if( rc==SQLITE_OK ){ if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ pBt->nPage = 0; @@ -56413,13 +66255,13 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ ** on the database already. If a write-cursor is requested, then ** the caller is assumed to have an open write transaction. ** -** If wrFlag==0, then the cursor can only be used for reading. -** If wrFlag==1, then the cursor can be used for reading or for -** writing if other conditions for writing are also met. These -** are the conditions that must be met in order for writing to -** be allowed: +** If the BTREE_WRCSR bit of wrFlag is clear, then the cursor can only +** be used for reading. If the BTREE_WRCSR bit is set, then the cursor +** can be used for reading or for writing if other conditions for writing +** are also met. These are the conditions that must be met in order +** for writing to be allowed: ** -** 1: The cursor must have been opened with wrFlag==1 +** 1: The cursor must have been opened with wrFlag containing BTREE_WRCSR ** ** 2: Other database connections that share the same pager cache ** but which are not in the READ_UNCOMMITTED state may not have @@ -56431,6 +66273,16 @@ SQLITE_PRIVATE int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){ ** ** 4: There must be an active transaction. ** +** The BTREE_FORDELETE bit of wrFlag may optionally be set if BTREE_WRCSR +** is set. If FORDELETE is set, that is a hint to the implementation that +** this cursor will only be used to seek to and delete entries of an index +** as part of a larger DELETE statement. The FORDELETE hint is not used by +** this implementation. But in a hypothetical alternative storage engine +** in which index entries are automatically deleted when corresponding table +** rows are deleted, the FORDELETE flag is a hint that all SEEK and DELETE +** operations on this cursor can be no-ops and all READ operations can +** return a null row (2-bytes: 0x01 0x00). +** ** No checking is done to make sure that page iTable really is the ** root page of a b-tree. If it is not, then the cursor acquired ** will not work correctly. @@ -56446,28 +66298,30 @@ static int btreeCursor( BtCursor *pCur /* Space for new cursor */ ){ BtShared *pBt = p->pBt; /* Shared b-tree handle */ + BtCursor *pX; /* Looping over other all cursors */ assert( sqlite3BtreeHoldsMutex(p) ); - assert( wrFlag==0 || wrFlag==1 ); + assert( wrFlag==0 + || wrFlag==BTREE_WRCSR + || wrFlag==(BTREE_WRCSR|BTREE_FORDELETE) + ); /* The following assert statements verify that if this is a sharable ** b-tree database, the connection is holding the required table locks, ** and that no other connection has any open cursor that conflicts with ** this lock. */ - assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, wrFlag+1) ); + assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, (wrFlag?2:1)) ); assert( wrFlag==0 || !hasReadConflicts(p, iTable) ); /* Assert that the caller has opened the required transaction. */ assert( p->inTrans>TRANS_NONE ); assert( wrFlag==0 || p->inTrans==TRANS_WRITE ); assert( pBt->pPage1 && pBt->pPage1->aData ); + assert( wrFlag==0 || (pBt->btsFlags & BTS_READ_ONLY)==0 ); - if( NEVER(wrFlag && (pBt->btsFlags & BTS_READ_ONLY)!=0) ){ - return SQLITE_READONLY; - } if( wrFlag ){ allocateTempSpace(pBt); - if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM; + if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT; } if( iTable==1 && btreePagecount(pBt)==0 ){ assert( wrFlag==0 ); @@ -56481,12 +66335,17 @@ static int btreeCursor( pCur->pKeyInfo = pKeyInfo; pCur->pBtree = p; pCur->pBt = pBt; - assert( wrFlag==0 || wrFlag==BTCF_WriteFlag ); - pCur->curFlags = wrFlag; - pCur->pNext = pBt->pCursor; - if( pCur->pNext ){ - pCur->pNext->pPrev = pCur; + pCur->curFlags = wrFlag ? BTCF_WriteFlag : 0; + pCur->curPagerFlags = wrFlag ? 0 : PAGER_GET_READONLY; + /* If there are two or more cursors on the same btree, then all such + ** cursors *must* have the BTCF_Multiple flag set. */ + for(pX=pBt->pCursor; pX; pX=pX->pNext){ + if( pX->pgnoRoot==(Pgno)iTable ){ + pX->curFlags |= BTCF_Multiple; + pCur->curFlags |= BTCF_Multiple; + } } + pCur->pNext = pBt->pCursor; pBt->pCursor = pCur; pCur->eState = CURSOR_INVALID; return SQLITE_OK; @@ -56499,9 +66358,13 @@ SQLITE_PRIVATE int sqlite3BtreeCursor( BtCursor *pCur /* Write new cursor here */ ){ int rc; - sqlite3BtreeEnter(p); - rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); - sqlite3BtreeLeave(p); + if( iTable<1 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + sqlite3BtreeEnter(p); + rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + sqlite3BtreeLeave(p); + } return rc; } @@ -56526,7 +66389,7 @@ SQLITE_PRIVATE int sqlite3BtreeCursorSize(void){ ** of run-time by skipping the initialization of those elements. */ SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){ - memset(p, 0, offsetof(BtCursor, iPage)); + memset(p, 0, offsetof(BtCursor, BTCURSOR_FIRST_UNINIT)); } /* @@ -56536,24 +66399,25 @@ SQLITE_PRIVATE void sqlite3BtreeCursorZero(BtCursor *p){ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ Btree *pBtree = pCur->pBtree; if( pBtree ){ - int i; BtShared *pBt = pCur->pBt; sqlite3BtreeEnter(pBtree); - sqlite3BtreeClearCursor(pCur); - if( pCur->pPrev ){ - pCur->pPrev->pNext = pCur->pNext; - }else{ + assert( pBt->pCursor!=0 ); + if( pBt->pCursor==pCur ){ pBt->pCursor = pCur->pNext; + }else{ + BtCursor *pPrev = pBt->pCursor; + do{ + if( pPrev->pNext==pCur ){ + pPrev->pNext = pCur->pNext; + break; + } + pPrev = pPrev->pNext; + }while( ALWAYS(pPrev) ); } - if( pCur->pNext ){ - pCur->pNext->pPrev = pCur->pPrev; - } - for(i=0; i<=pCur->iPage; i++){ - releasePage(pCur->apPage[i]); - } + btreeReleaseAllCursorPages(pCur); unlockBtreeIfUnused(pBt); sqlite3_free(pCur->aOverflow); - /* sqlite3_free(pCur); */ + sqlite3_free(pCur->pKey); sqlite3BtreeLeave(pBtree); } return SQLITE_OK; @@ -56566,47 +66430,33 @@ SQLITE_PRIVATE int sqlite3BtreeCloseCursor(BtCursor *pCur){ ** ** BtCursor.info is a cache of the information in the current cell. ** Using this cache reduces the number of calls to btreeParseCell(). -** -** 2007-06-25: There is a bug in some versions of MSVC that cause the -** compiler to crash when getCellInfo() is implemented as a macro. -** But there is a measureable speed advantage to using the macro on gcc -** (when less compiler optimizations like -Os or -O0 are used and the -** compiler is not doing aggressive inlining.) So we use a real function -** for MSVC and a macro for everything else. Ticket #2457. */ #ifndef NDEBUG + static int cellInfoEqual(CellInfo *a, CellInfo *b){ + if( a->nKey!=b->nKey ) return 0; + if( a->pPayload!=b->pPayload ) return 0; + if( a->nPayload!=b->nPayload ) return 0; + if( a->nLocal!=b->nLocal ) return 0; + if( a->nSize!=b->nSize ) return 0; + return 1; + } static void assertCellInfo(BtCursor *pCur){ CellInfo info; - int iPage = pCur->iPage; memset(&info, 0, sizeof(info)); - btreeParseCell(pCur->apPage[iPage], pCur->aiIdx[iPage], &info); - assert( CORRUPT_DB || memcmp(&info, &pCur->info, sizeof(info))==0 ); + btreeParseCell(pCur->pPage, pCur->ix, &info); + assert( CORRUPT_DB || cellInfoEqual(&info, &pCur->info) ); } #else #define assertCellInfo(x) #endif -#ifdef _MSC_VER - /* Use a real function in MSVC to work around bugs in that compiler. */ - static void getCellInfo(BtCursor *pCur){ - if( pCur->info.nSize==0 ){ - int iPage = pCur->iPage; - btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); - pCur->curFlags |= BTCF_ValidNKey; - }else{ - assertCellInfo(pCur); - } +static SQLITE_NOINLINE void getCellInfo(BtCursor *pCur){ + if( pCur->info.nSize==0 ){ + pCur->curFlags |= BTCF_ValidNKey; + btreeParseCell(pCur->pPage,pCur->ix,&pCur->info); + }else{ + assertCellInfo(pCur); } -#else /* if not _MSC_VER */ - /* Use a macro in all other compilers so that the function is inlined */ -#define getCellInfo(pCur) \ - if( pCur->info.nSize==0 ){ \ - int iPage = pCur->iPage; \ - btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); \ - pCur->curFlags |= BTCF_ValidNKey; \ - }else{ \ - assertCellInfo(pCur); \ - } -#endif /* _MSC_VER */ +} #ifndef NDEBUG /* The next routine used only within assert() statements */ /* @@ -56618,46 +66468,53 @@ SQLITE_PRIVATE int sqlite3BtreeCursorIsValid(BtCursor *pCur){ return pCur && pCur->eState==CURSOR_VALID; } #endif /* NDEBUG */ - -/* -** Set *pSize to the size of the buffer needed to hold the value of -** the key for the current entry. If the cursor is not pointing -** to a valid entry, *pSize is set to 0. -** -** For a table with the INTKEY flag set, this routine returns the key -** itself, not the number of bytes in the key. -** -** The caller must position the cursor prior to invoking this routine. -** -** This routine cannot fail. It always returns SQLITE_OK. -*/ -SQLITE_PRIVATE int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){ - assert( cursorHoldsMutex(pCur) ); - assert( pCur->eState==CURSOR_VALID ); - getCellInfo(pCur); - *pSize = pCur->info.nKey; - return SQLITE_OK; +SQLITE_PRIVATE int sqlite3BtreeCursorIsValidNN(BtCursor *pCur){ + assert( pCur!=0 ); + return pCur->eState==CURSOR_VALID; } /* -** Set *pSize to the number of bytes of data in the entry the -** cursor currently points to. +** Return the value of the integer key or "rowid" for a table btree. +** This routine is only valid for a cursor that is pointing into a +** ordinary table btree. If the cursor points to an index btree or +** is invalid, the result of this routine is undefined. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeIntegerKey(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->curIntKey ); + getCellInfo(pCur); + return pCur->info.nKey; +} + +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +/* +** Return the offset into the database file for the start of the +** payload to which the cursor is pointing. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeOffset(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + getCellInfo(pCur); + return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) + + (i64)(pCur->info.pPayload - pCur->pPage->aData); +} +#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ + +/* +** Return the number of bytes of payload for the entry that pCur is +** currently pointing to. For table btrees, this will be the amount +** of data. For index btrees, this will be the size of the key. ** ** The caller must guarantee that the cursor is pointing to a non-NULL ** valid entry. In other words, the calling procedure must guarantee ** that the cursor has Cursor.eState==CURSOR_VALID. -** -** Failure is not possible. This function always returns SQLITE_OK. -** It might just as well be a procedure (returning void) but we continue -** to return an integer result code for historical reasons. */ -SQLITE_PRIVATE int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){ +SQLITE_PRIVATE u32 sqlite3BtreePayloadSize(BtCursor *pCur){ assert( cursorHoldsMutex(pCur) ); assert( pCur->eState==CURSOR_VALID ); - assert( pCur->apPage[pCur->iPage]->intKeyLeaf==1 ); getCellInfo(pCur); - *pSize = pCur->info.nPayload; - return SQLITE_OK; + return pCur->info.nPayload; } /* @@ -56775,7 +66632,6 @@ static int copyPayload( ** ** 0: The operation is a read. Populate the overflow cache. ** 1: The operation is a write. Populate the overflow cache. -** 2: The operation is a read. Do not populate the overflow cache. ** ** A total of "amt" bytes are read or written beginning at "offset". ** Data is read to or from the buffer pBuf. @@ -56783,13 +66639,13 @@ static int copyPayload( ** The content being read or written might appear on the main page ** or be scattered out on multiple overflow pages. ** -** If the current cursor entry uses one or more overflow pages and the -** eOp argument is not 2, this function may allocate space for and lazily -** populates the overflow page-list cache array (BtCursor.aOverflow). +** If the current cursor entry uses one or more overflow pages +** this function may allocate space for and lazily populate +** the overflow page-list cache array (BtCursor.aOverflow). ** Subsequent calls use this cache to make seeking to the supplied offset ** more efficient. ** -** Once an overflow page-list cache has been allocated, it may be +** Once an overflow page-list cache has been allocated, it must be ** invalidated if some other cursor writes to the same table, or if ** the cursor is moved to a different row. Additionally, in auto-vacuum ** mode, the following events may invalidate an overflow page-list cache. @@ -56808,29 +66664,30 @@ static int accessPayload( unsigned char *aPayload; int rc = SQLITE_OK; int iIdx = 0; - MemPage *pPage = pCur->apPage[pCur->iPage]; /* Btree page of current entry */ + MemPage *pPage = pCur->pPage; /* Btree page of current entry */ BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */ #ifdef SQLITE_DIRECT_OVERFLOW_READ - unsigned char * const pBufStart = pBuf; - int bEnd; /* True if reading to end of data */ + unsigned char * const pBufStart = pBuf; /* Start of original out buffer */ #endif assert( pPage ); + assert( eOp==0 || eOp==1 ); assert( pCur->eState==CURSOR_VALID ); - assert( pCur->aiIdx[pCur->iPage]<pPage->nCell ); + assert( pCur->ix<pPage->nCell ); assert( cursorHoldsMutex(pCur) ); - assert( eOp!=2 || offset==0 ); /* Always start from beginning for eOp==2 */ getCellInfo(pCur); aPayload = pCur->info.pPayload; -#ifdef SQLITE_DIRECT_OVERFLOW_READ - bEnd = offset+amt==pCur->info.nPayload; -#endif assert( offset+amt <= pCur->info.nPayload ); - if( &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] ){ - /* Trying to read or write past the end of the data is an error */ - return SQLITE_CORRUPT_BKPT; + assert( aPayload > pPage->aData ); + if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ + /* Trying to read or write past the end of the data is an error. The + ** conditional above is really: + ** &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize] + ** but is recast into its current form to avoid integer overflow problems + */ + return SQLITE_CORRUPT_PAGE(pPage); } /* Check if data must be read/written to/from the btree page itself. */ @@ -56839,7 +66696,7 @@ static int accessPayload( if( a+offset>pCur->info.nLocal ){ a = pCur->info.nLocal - offset; } - rc = copyPayload(&aPayload[offset], pBuf, a, (eOp & 0x01), pPage->pDbPage); + rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage); offset = 0; pBuf += a; amt -= a; @@ -56855,51 +66712,47 @@ static int accessPayload( nextPage = get4byte(&aPayload[pCur->info.nLocal]); /* If the BtCursor.aOverflow[] has not been allocated, allocate it now. - ** Except, do not allocate aOverflow[] for eOp==2. ** ** The aOverflow[] array is sized at one entry for each overflow page ** in the overflow chain. The page number of the first overflow page is ** stored in aOverflow[0], etc. A value of 0 in the aOverflow[] array ** means "not yet known" (the cache is lazily populated). */ - if( eOp!=2 && (pCur->curFlags & BTCF_ValidOvfl)==0 ){ + if( (pCur->curFlags & BTCF_ValidOvfl)==0 ){ int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize; - if( nOvfl>pCur->nOvflAlloc ){ + if( pCur->aOverflow==0 + || nOvfl*(int)sizeof(Pgno) > sqlite3MallocSize(pCur->aOverflow) + ){ Pgno *aNew = (Pgno*)sqlite3Realloc( pCur->aOverflow, nOvfl*2*sizeof(Pgno) ); if( aNew==0 ){ - rc = SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; }else{ - pCur->nOvflAlloc = nOvfl*2; pCur->aOverflow = aNew; } } - if( rc==SQLITE_OK ){ - memset(pCur->aOverflow, 0, nOvfl*sizeof(Pgno)); - pCur->curFlags |= BTCF_ValidOvfl; + memset(pCur->aOverflow, 0, nOvfl*sizeof(Pgno)); + pCur->curFlags |= BTCF_ValidOvfl; + }else{ + /* If the overflow page-list cache has been allocated and the + ** entry for the first required overflow page is valid, skip + ** directly to it. + */ + if( pCur->aOverflow[offset/ovflSize] ){ + iIdx = (offset/ovflSize); + nextPage = pCur->aOverflow[iIdx]; + offset = (offset%ovflSize); } } - /* If the overflow page-list cache has been allocated and the - ** entry for the first required overflow page is valid, skip - ** directly to it. - */ - if( (pCur->curFlags & BTCF_ValidOvfl)!=0 - && pCur->aOverflow[offset/ovflSize] - ){ - iIdx = (offset/ovflSize); - nextPage = pCur->aOverflow[iIdx]; - offset = (offset%ovflSize); - } - - for( ; rc==SQLITE_OK && amt>0 && nextPage; iIdx++){ - + assert( rc==SQLITE_OK && amt>0 ); + while( nextPage ){ /* If required, populate the overflow page-list cache. */ - if( (pCur->curFlags & BTCF_ValidOvfl)!=0 ){ - assert(!pCur->aOverflow[iIdx] || pCur->aOverflow[iIdx]==nextPage); - pCur->aOverflow[iIdx] = nextPage; - } + assert( pCur->aOverflow[iIdx]==0 + || pCur->aOverflow[iIdx]==nextPage + || CORRUPT_DB ); + pCur->aOverflow[iIdx] = nextPage; if( offset>=ovflSize ){ /* The only reason to read this page is to obtain the page @@ -56907,11 +66760,7 @@ static int accessPayload( ** data is not required. So first try to lookup the overflow ** page-list cache, if any, then fall back to the getOverflowPage() ** function. - ** - ** Note that the aOverflow[] array must be allocated because eOp!=2 - ** here. If eOp==2, then offset==0 and this branch is never taken. */ - assert( eOp!=2 ); assert( pCur->curFlags & BTCF_ValidOvfl ); assert( pCur->pBtree->db==pBt->db ); if( pCur->aOverflow[iIdx+1] ){ @@ -56925,7 +66774,7 @@ static int accessPayload( ** range of data that is being read (eOp==0) or written (eOp!=0). */ #ifdef SQLITE_DIRECT_OVERFLOW_READ - sqlite3_file *fd; + sqlite3_file *fd; /* File from which to do direct overflow read */ #endif int a = amt; if( a + offset > ovflSize ){ @@ -56937,27 +66786,25 @@ static int accessPayload( ** ** 1) this is a read operation, and ** 2) data is required from the start of this overflow page, and - ** 3) the database is file-backed, and - ** 4) there is no open write-transaction, and - ** 5) the database is not a WAL database, - ** 6) all data from the page is being read. - ** 7) at least 4 bytes have already been read into the output buffer + ** 3) there is no open write-transaction, and + ** 4) the database is file-backed, and + ** 5) the page is not in the WAL file + ** 6) at least 4 bytes have already been read into the output buffer ** ** then data can be read directly from the database file into the ** output buffer, bypassing the page-cache altogether. This speeds ** up loading large records that span many overflow pages. */ - if( (eOp&0x01)==0 /* (1) */ + if( eOp==0 /* (1) */ && offset==0 /* (2) */ - && (bEnd || a==ovflSize) /* (6) */ - && pBt->inTransaction==TRANS_READ /* (4) */ - && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (3) */ - && pBt->pPage1->aData[19]==0x01 /* (5) */ - && &pBuf[-4]>=pBufStart /* (7) */ + && pBt->inTransaction==TRANS_READ /* (3) */ + && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (4) */ + && 0==sqlite3PagerUseWal(pBt->pPager, nextPage) /* (5) */ + && &pBuf[-4]>=pBufStart /* (6) */ ){ u8 aSave[4]; u8 *aWrite = &pBuf[-4]; - assert( aWrite>=pBufStart ); /* hence (7) */ + assert( aWrite>=pBufStart ); /* due to (6) */ memcpy(aSave, aWrite, 4); rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); nextPage = get4byte(aWrite); @@ -56967,77 +66814,87 @@ static int accessPayload( { DbPage *pDbPage; - rc = sqlite3PagerAcquire(pBt->pPager, nextPage, &pDbPage, - ((eOp&0x01)==0 ? PAGER_GET_READONLY : 0) + rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage, + (eOp==0 ? PAGER_GET_READONLY : 0) ); if( rc==SQLITE_OK ){ aPayload = sqlite3PagerGetData(pDbPage); nextPage = get4byte(aPayload); - rc = copyPayload(&aPayload[offset+4], pBuf, a, (eOp&0x01), pDbPage); + rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage); sqlite3PagerUnref(pDbPage); offset = 0; } } amt -= a; + if( amt==0 ) return rc; pBuf += a; } + if( rc ) break; + iIdx++; } } if( rc==SQLITE_OK && amt>0 ){ - return SQLITE_CORRUPT_BKPT; + /* Overflow chain ends prematurely */ + return SQLITE_CORRUPT_PAGE(pPage); } return rc; } /* -** Read part of the key associated with cursor pCur. Exactly -** "amt" bytes will be transferred into pBuf[]. The transfer +** Read part of the payload for the row at which that cursor pCur is currently +** pointing. "amt" bytes will be transferred into pBuf[]. The transfer ** begins at "offset". ** -** The caller must ensure that pCur is pointing to a valid row -** in the table. +** pCur can be pointing to either a table or an index b-tree. +** If pointing to a table btree, then the content section is read. If +** pCur is pointing to an index b-tree then the key section is read. +** +** For sqlite3BtreePayload(), the caller must ensure that pCur is pointing +** to a valid row in the table. For sqlite3BtreePayloadChecked(), the +** cursor might be invalid or might need to be restored before being read. ** ** Return SQLITE_OK on success or an error code if anything goes ** wrong. An error is returned if "offset+amt" is larger than ** the available payload. */ -SQLITE_PRIVATE int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ +SQLITE_PRIVATE int sqlite3BtreePayload(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ assert( cursorHoldsMutex(pCur) ); assert( pCur->eState==CURSOR_VALID ); - assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] ); - assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell ); + assert( pCur->iPage>=0 && pCur->pPage ); + assert( pCur->ix<pCur->pPage->nCell ); return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0); } /* -** Read part of the data associated with cursor pCur. Exactly -** "amt" bytes will be transfered into pBuf[]. The transfer -** begins at "offset". -** -** Return SQLITE_OK on success or an error code if anything goes -** wrong. An error is returned if "offset+amt" is larger than -** the available payload. +** This variant of sqlite3BtreePayload() works even if the cursor has not +** in the CURSOR_VALID state. It is only used by the sqlite3_blob_read() +** interface. */ -SQLITE_PRIVATE int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ - int rc; - #ifndef SQLITE_OMIT_INCRBLOB +static SQLITE_NOINLINE int accessPayloadChecked( + BtCursor *pCur, + u32 offset, + u32 amt, + void *pBuf +){ + int rc; if ( pCur->eState==CURSOR_INVALID ){ return SQLITE_ABORT; } -#endif - - assert( cursorHoldsMutex(pCur) ); - rc = restoreCursorPosition(pCur); - if( rc==SQLITE_OK ){ - assert( pCur->eState==CURSOR_VALID ); - assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] ); - assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell ); - rc = accessPayload(pCur, offset, amt, pBuf, 0); - } - return rc; + assert( cursorOwnsBtShared(pCur) ); + rc = btreeRestoreCursorPosition(pCur); + return rc ? rc : accessPayload(pCur, offset, amt, pBuf, 0); } +SQLITE_PRIVATE int sqlite3BtreePayloadChecked(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){ + if( pCur->eState==CURSOR_VALID ){ + assert( cursorOwnsBtShared(pCur) ); + return accessPayload(pCur, offset, amt, pBuf, 0); + }else{ + return accessPayloadChecked(pCur, offset, amt, pBuf); + } +} +#endif /* SQLITE_OMIT_INCRBLOB */ /* ** Return a pointer to payload information from the entry that the @@ -57062,13 +66919,23 @@ static const void *fetchPayload( BtCursor *pCur, /* Cursor pointing to entry to read from */ u32 *pAmt /* Write the number of available bytes here */ ){ - assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]); + int amt; + assert( pCur!=0 && pCur->iPage>=0 && pCur->pPage); assert( pCur->eState==CURSOR_VALID ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); - assert( cursorHoldsMutex(pCur) ); - assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell ); + assert( cursorOwnsBtShared(pCur) ); + assert( pCur->ix<pCur->pPage->nCell ); assert( pCur->info.nSize>0 ); - *pAmt = pCur->info.nLocal; + assert( pCur->info.pPayload>pCur->pPage->aData || CORRUPT_DB ); + assert( pCur->info.pPayload<pCur->pPage->aDataEnd ||CORRUPT_DB); + amt = pCur->info.nLocal; + if( amt>(int)(pCur->pPage->aDataEnd - pCur->info.pPayload) ){ + /* There is too little space on the page for the expected amount + ** of local content. Database must be corrupt. */ + assert( CORRUPT_DB ); + amt = MAX(0, (int)(pCur->pPage->aDataEnd - pCur->info.pPayload)); + } + *pAmt = (u32)amt; return (void*)pCur->info.pPayload; } @@ -57087,10 +66954,7 @@ static const void *fetchPayload( ** These routines is used to get quick access to key and data ** in the common case where no overflow pages are used. */ -SQLITE_PRIVATE const void *sqlite3BtreeKeyFetch(BtCursor *pCur, u32 *pAmt){ - return fetchPayload(pCur, pAmt); -} -SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor *pCur, u32 *pAmt){ +SQLITE_PRIVATE const void *sqlite3BtreePayloadFetch(BtCursor *pCur, u32 *pAmt){ return fetchPayload(pCur, pAmt); } @@ -57105,34 +66969,25 @@ SQLITE_PRIVATE const void *sqlite3BtreeDataFetch(BtCursor *pCur, u32 *pAmt){ ** vice-versa). */ static int moveToChild(BtCursor *pCur, u32 newPgno){ - int rc; - int i = pCur->iPage; - MemPage *pNewPage; BtShared *pBt = pCur->pBt; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState==CURSOR_VALID ); assert( pCur->iPage<BTCURSOR_MAX_DEPTH ); assert( pCur->iPage>=0 ); if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){ return SQLITE_CORRUPT_BKPT; } - rc = getAndInitPage(pBt, newPgno, &pNewPage, - (pCur->curFlags & BTCF_WriteFlag)==0 ? PAGER_GET_READONLY : 0); - if( rc ) return rc; - pCur->apPage[i+1] = pNewPage; - pCur->aiIdx[i+1] = 0; - pCur->iPage++; - pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); - if( pNewPage->nCell<1 || pNewPage->intKey!=pCur->apPage[i]->intKey ){ - return SQLITE_CORRUPT_BKPT; - } - return SQLITE_OK; + pCur->aiIdx[pCur->iPage] = pCur->ix; + pCur->apPage[pCur->iPage] = pCur->pPage; + pCur->ix = 0; + pCur->iPage++; + return getAndInitPage(pBt, newPgno, &pCur->pPage, pCur, pCur->curPagerFlags); } -#if 0 +#ifdef SQLITE_DEBUG /* ** Page pParent is an internal (non-leaf) tree page. This function ** asserts that page number iChild is the left-child if the iIdx'th @@ -57141,6 +66996,8 @@ static int moveToChild(BtCursor *pCur, u32 newPgno){ ** the page. */ static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){ + if( CORRUPT_DB ) return; /* The conditions tested below might not be true + ** in a corrupt database */ assert( iIdx<=pParent->nCell ); if( iIdx==pParent->nCell ){ assert( get4byte(&pParent->aData[pParent->hdrOffset+8])==iChild ); @@ -57161,29 +67018,23 @@ static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){ ** the largest cell index. */ static void moveToParent(BtCursor *pCur){ - assert( cursorHoldsMutex(pCur) ); + MemPage *pLeaf; + assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState==CURSOR_VALID ); assert( pCur->iPage>0 ); - assert( pCur->apPage[pCur->iPage] ); - - /* UPDATE: It is actually possible for the condition tested by the assert - ** below to be untrue if the database file is corrupt. This can occur if - ** one cursor has modified page pParent while a reference to it is held - ** by a second cursor. Which can only happen if a single page is linked - ** into more than one b-tree structure in a corrupt database. */ -#if 0 + assert( pCur->pPage ); assertParentIndex( pCur->apPage[pCur->iPage-1], pCur->aiIdx[pCur->iPage-1], - pCur->apPage[pCur->iPage]->pgno + pCur->pPage->pgno ); -#endif testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell ); - - releasePage(pCur->apPage[pCur->iPage]); - pCur->iPage--; pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + pCur->ix = pCur->aiIdx[pCur->iPage-1]; + pLeaf = pCur->pPage; + pCur->pPage = pCur->apPage[--pCur->iPage]; + releasePageNotNull(pLeaf); } /* @@ -57195,9 +67046,9 @@ static void moveToParent(BtCursor *pCur){ ** single child page. This can only happen with the table rooted at page 1. ** ** If the b-tree structure is empty, the cursor state is set to -** CURSOR_INVALID. Otherwise, the cursor is set to point to the first -** cell located on the root (or virtual root) page and the cursor state -** is set to CURSOR_VALID. +** CURSOR_INVALID and this routine returns SQLITE_EMPTY. Otherwise, +** the cursor is set to point to the first cell located on the root +** (or virtual root) page and the cursor state is set to CURSOR_VALID. ** ** If this function returns successfully, it may be assumed that the ** page-header flags indicate that the [virtual] root-page is the expected @@ -57211,33 +67062,44 @@ static int moveToRoot(BtCursor *pCur){ MemPage *pRoot; int rc = SQLITE_OK; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( CURSOR_INVALID < CURSOR_REQUIRESEEK ); assert( CURSOR_VALID < CURSOR_REQUIRESEEK ); assert( CURSOR_FAULT > CURSOR_REQUIRESEEK ); - if( pCur->eState>=CURSOR_REQUIRESEEK ){ - if( pCur->eState==CURSOR_FAULT ){ - assert( pCur->skipNext!=SQLITE_OK ); - return pCur->skipNext; - } - sqlite3BtreeClearCursor(pCur); - } + assert( pCur->eState < CURSOR_REQUIRESEEK || pCur->iPage<0 ); + assert( pCur->pgnoRoot>0 || pCur->iPage<0 ); if( pCur->iPage>=0 ){ - while( pCur->iPage ) releasePage(pCur->apPage[pCur->iPage--]); + if( pCur->iPage ){ + releasePageNotNull(pCur->pPage); + while( --pCur->iPage ){ + releasePageNotNull(pCur->apPage[pCur->iPage]); + } + pCur->pPage = pCur->apPage[0]; + goto skip_init; + } }else if( pCur->pgnoRoot==0 ){ pCur->eState = CURSOR_INVALID; - return SQLITE_OK; + return SQLITE_EMPTY; }else{ - rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->apPage[0], - (pCur->curFlags & BTCF_WriteFlag)==0 ? PAGER_GET_READONLY : 0); + assert( pCur->iPage==(-1) ); + if( pCur->eState>=CURSOR_REQUIRESEEK ){ + if( pCur->eState==CURSOR_FAULT ){ + assert( pCur->skipNext!=SQLITE_OK ); + return pCur->skipNext; + } + sqlite3BtreeClearCursor(pCur); + } + rc = getAndInitPage(pCur->pBtree->pBt, pCur->pgnoRoot, &pCur->pPage, + 0, pCur->curPagerFlags); if( rc!=SQLITE_OK ){ pCur->eState = CURSOR_INVALID; return rc; } pCur->iPage = 0; + pCur->curIntKey = pCur->pPage->intKey; } - pRoot = pCur->apPage[0]; + pRoot = pCur->pPage; assert( pRoot->pgno==pCur->pgnoRoot ); /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor @@ -57252,13 +67114,15 @@ static int moveToRoot(BtCursor *pCur){ ** (or the freelist). */ assert( pRoot->intKey==1 || pRoot->intKey==0 ); if( pRoot->isInit==0 || (pCur->pKeyInfo==0)!=pRoot->intKey ){ - return SQLITE_CORRUPT_BKPT; + return SQLITE_CORRUPT_PAGE(pCur->pPage); } - pCur->aiIdx[0] = 0; +skip_init: + pCur->ix = 0; pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidNKey|BTCF_ValidOvfl); + pRoot = pCur->pPage; if( pRoot->nCell>0 ){ pCur->eState = CURSOR_VALID; }else if( !pRoot->leaf ){ @@ -57269,6 +67133,7 @@ static int moveToRoot(BtCursor *pCur){ rc = moveToChild(pCur, subpage); }else{ pCur->eState = CURSOR_INVALID; + rc = SQLITE_EMPTY; } return rc; } @@ -57285,11 +67150,11 @@ static int moveToLeftmost(BtCursor *pCur){ int rc = SQLITE_OK; MemPage *pPage; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState==CURSOR_VALID ); - while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){ - assert( pCur->aiIdx[pCur->iPage]<pPage->nCell ); - pgno = get4byte(findCell(pPage, pCur->aiIdx[pCur->iPage])); + while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ + assert( pCur->ix<pPage->nCell ); + pgno = get4byte(findCell(pPage, pCur->ix)); rc = moveToChild(pCur, pgno); } return rc; @@ -57310,15 +67175,15 @@ static int moveToRightmost(BtCursor *pCur){ int rc = SQLITE_OK; MemPage *pPage = 0; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( pCur->eState==CURSOR_VALID ); - while( !(pPage = pCur->apPage[pCur->iPage])->leaf ){ + while( !(pPage = pCur->pPage)->leaf ){ pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); - pCur->aiIdx[pCur->iPage] = pPage->nCell; + pCur->ix = pPage->nCell; rc = moveToChild(pCur, pgno); if( rc ) return rc; } - pCur->aiIdx[pCur->iPage] = pPage->nCell-1; + pCur->ix = pPage->nCell-1; assert( pCur->info.nSize==0 ); assert( (pCur->curFlags & BTCF_ValidNKey)==0 ); return SQLITE_OK; @@ -57331,18 +67196,17 @@ static int moveToRightmost(BtCursor *pCur){ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ int rc; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); rc = moveToRoot(pCur); if( rc==SQLITE_OK ){ - if( pCur->eState==CURSOR_INVALID ){ - assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 ); - *pRes = 1; - }else{ - assert( pCur->apPage[pCur->iPage]->nCell>0 ); - *pRes = 0; - rc = moveToLeftmost(pCur); - } + assert( pCur->pPage->nCell>0 ); + *pRes = 0; + rc = moveToLeftmost(pCur); + }else if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = 1; + rc = SQLITE_OK; } return rc; } @@ -57354,7 +67218,7 @@ SQLITE_PRIVATE int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ int rc; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); /* If the cursor already points to the last entry, this is a no-op. */ @@ -57366,28 +67230,26 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ for(ii=0; ii<pCur->iPage; ii++){ assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell ); } - assert( pCur->aiIdx[pCur->iPage]==pCur->apPage[pCur->iPage]->nCell-1 ); - assert( pCur->apPage[pCur->iPage]->leaf ); + assert( pCur->ix==pCur->pPage->nCell-1 ); + assert( pCur->pPage->leaf ); #endif return SQLITE_OK; } rc = moveToRoot(pCur); if( rc==SQLITE_OK ){ - if( CURSOR_INVALID==pCur->eState ){ - assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 ); - *pRes = 1; + assert( pCur->eState==CURSOR_VALID ); + *pRes = 0; + rc = moveToRightmost(pCur); + if( rc==SQLITE_OK ){ + pCur->curFlags |= BTCF_AtLast; }else{ - assert( pCur->eState==CURSOR_VALID ); - *pRes = 0; - rc = moveToRightmost(pCur); - if( rc==SQLITE_OK ){ - pCur->curFlags |= BTCF_AtLast; - }else{ - pCur->curFlags &= ~BTCF_AtLast; - } - + pCur->curFlags &= ~BTCF_AtLast; } + }else if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = 1; + rc = SQLITE_OK; } return rc; } @@ -57419,6 +67281,8 @@ SQLITE_PRIVATE int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ ** *pRes>0 The cursor is left pointing at an entry that ** is larger than intKey/pIdxKey. ** +** For index tables, the pIdxKey->eqSeen field is set to 1 if there +** exists an entry in the table that exactly matches pIdxKey. */ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( BtCursor *pCur, /* The cursor to be moved */ @@ -57430,23 +67294,44 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( int rc; RecordCompare xRecordCompare; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); assert( pRes ); assert( (pIdxKey==0)==(pCur->pKeyInfo==0) ); + assert( pCur->eState!=CURSOR_VALID || (pIdxKey==0)==(pCur->curIntKey!=0) ); /* If the cursor is already positioned at the point we are trying ** to move to, then just return without doing any work */ - if( pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 - && pCur->apPage[0]->intKey + if( pIdxKey==0 + && pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 ){ if( pCur->info.nKey==intKey ){ *pRes = 0; return SQLITE_OK; } - if( (pCur->curFlags & BTCF_AtLast)!=0 && pCur->info.nKey<intKey ){ - *pRes = -1; - return SQLITE_OK; + if( pCur->info.nKey<intKey ){ + if( (pCur->curFlags & BTCF_AtLast)!=0 ){ + *pRes = -1; + return SQLITE_OK; + } + /* If the requested key is one more than the previous key, then + ** try to get there using sqlite3BtreeNext() rather than a full + ** binary search. This is an optimization only. The correct answer + ** is still obtained without this case, only a little more slowely */ + if( pCur->info.nKey+1==intKey && !pCur->skipNext ){ + *pRes = 0; + rc = sqlite3BtreeNext(pCur, 0); + if( rc==SQLITE_OK ){ + getCellInfo(pCur); + if( pCur->info.nKey==intKey ){ + return SQLITE_OK; + } + }else if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + }else{ + return rc; + } + } } } @@ -57463,21 +67348,23 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( rc = moveToRoot(pCur); if( rc ){ + if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = -1; + return SQLITE_OK; + } return rc; } - assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage] ); - assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->isInit ); - assert( pCur->eState==CURSOR_INVALID || pCur->apPage[pCur->iPage]->nCell>0 ); - if( pCur->eState==CURSOR_INVALID ){ - *pRes = -1; - assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 ); - return SQLITE_OK; - } - assert( pCur->apPage[0]->intKey || pIdxKey ); + assert( pCur->pPage ); + assert( pCur->pPage->isInit ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->pPage->nCell > 0 ); + assert( pCur->iPage==0 || pCur->apPage[0]->intKey==pCur->curIntKey ); + assert( pCur->curIntKey || pIdxKey ); for(;;){ int lwr, upr, idx, c; Pgno chldPg; - MemPage *pPage = pCur->apPage[pCur->iPage]; + MemPage *pPage = pCur->pPage; u8 *pCell; /* Pointer to current cell in pPage */ /* pPage->nCell must be greater than zero. If this is the root-page @@ -57492,14 +67379,16 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( upr = pPage->nCell-1; assert( biasRight==0 || biasRight==1 ); idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ - pCur->aiIdx[pCur->iPage] = (u16)idx; + pCur->ix = (u16)idx; if( xRecordCompare==0 ){ for(;;){ i64 nCellKey; - pCell = findCell(pPage, idx) + pPage->childPtrSize; + pCell = findCellPastPtr(pPage, idx); if( pPage->intKeyLeaf ){ while( 0x80 <= *(pCell++) ){ - if( pCell>=pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; + if( pCell>=pPage->aDataEnd ){ + return SQLITE_CORRUPT_PAGE(pPage); + } } } getVarint(pCell, (u64*)&nCellKey); @@ -57511,16 +67400,16 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( if( lwr>upr ){ c = +1; break; } }else{ assert( nCellKey==intKey ); - pCur->curFlags |= BTCF_ValidNKey; - pCur->info.nKey = nCellKey; - pCur->aiIdx[pCur->iPage] = (u16)idx; + pCur->ix = (u16)idx; if( !pPage->leaf ){ lwr = idx; goto moveto_next_layer; }else{ + pCur->curFlags |= BTCF_ValidNKey; + pCur->info.nKey = nCellKey; + pCur->info.nSize = 0; *pRes = 0; - rc = SQLITE_OK; - goto moveto_finish; + return SQLITE_OK; } } assert( lwr+upr>=0 ); @@ -57528,8 +67417,8 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( } }else{ for(;;){ - int nCell; - pCell = findCell(pPage, idx) + pPage->childPtrSize; + int nCell; /* Size of the pCell cell in bytes */ + pCell = findCellPastPtr(pPage, idx); /* The maximum supported page-size is 65536 bytes. This means that ** the maximum number of record bytes stored on an index B-Tree @@ -57557,18 +67446,32 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( /* The record flows over onto one or more overflow pages. In ** this case the whole cell needs to be parsed, a buffer allocated ** and accessPayload() used to retrieve the record into the - ** buffer before VdbeRecordCompare() can be called. */ + ** buffer before VdbeRecordCompare() can be called. + ** + ** If the record is corrupt, the xRecordCompare routine may read + ** up to two varints past the end of the buffer. An extra 18 + ** bytes of padding is allocated at the end of the buffer in + ** case this happens. */ void *pCellKey; u8 * const pCellBody = pCell - pPage->childPtrSize; - btreeParseCellPtr(pPage, pCellBody, &pCur->info); + pPage->xParseCell(pPage, pCellBody, &pCur->info); nCell = (int)pCur->info.nKey; - pCellKey = sqlite3Malloc( nCell ); - if( pCellKey==0 ){ - rc = SQLITE_NOMEM; + testcase( nCell<0 ); /* True if key size is 2^32 or more */ + testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ + testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ + testcase( nCell==2 ); /* Minimum legal index key size */ + if( nCell<2 ){ + rc = SQLITE_CORRUPT_PAGE(pPage); goto moveto_finish; } - pCur->aiIdx[pCur->iPage] = (u16)idx; - rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 2); + pCellKey = sqlite3Malloc( nCell+18 ); + if( pCellKey==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto moveto_finish; + } + pCur->ix = (u16)idx; + rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0); + pCur->curFlags &= ~BTCF_ValidOvfl; if( rc ){ sqlite3_free(pCellKey); goto moveto_finish; @@ -57588,8 +67491,8 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( assert( c==0 ); *pRes = 0; rc = SQLITE_OK; - pCur->aiIdx[pCur->iPage] = (u16)idx; - if( pIdxKey->errCode ) rc = SQLITE_CORRUPT; + pCur->ix = (u16)idx; + if( pIdxKey->errCode ) rc = SQLITE_CORRUPT_BKPT; goto moveto_finish; } if( lwr>upr ) break; @@ -57600,8 +67503,8 @@ SQLITE_PRIVATE int sqlite3BtreeMovetoUnpacked( assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) ); assert( pPage->isInit ); if( pPage->leaf ){ - assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell ); - pCur->aiIdx[pCur->iPage] = (u16)idx; + assert( pCur->ix<pCur->pPage->nCell ); + pCur->ix = (u16)idx; *pRes = c; rc = SQLITE_OK; goto moveto_finish; @@ -57612,13 +67515,13 @@ moveto_next_layer: }else{ chldPg = get4byte(findCell(pPage, lwr)); } - pCur->aiIdx[pCur->iPage] = (u16)lwr; + pCur->ix = (u16)lwr; rc = moveToChild(pCur, chldPg); if( rc ) break; } moveto_finish: pCur->info.nSize = 0; - pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); return rc; } @@ -57639,10 +67542,37 @@ SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ } /* -** Advance the cursor to the next entry in the database. If -** successful then set *pRes=0. If the cursor -** was already pointing to the last entry in the database before -** this routine was called, then set *pRes=1. +** Return an estimate for the number of rows in the table that pCur is +** pointing to. Return a negative number if no estimate is currently +** available. +*/ +SQLITE_PRIVATE i64 sqlite3BtreeRowCountEst(BtCursor *pCur){ + i64 n; + u8 i; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + + /* Currently this interface is only called by the OP_IfSmaller + ** opcode, and it that case the cursor will always be valid and + ** will always point to a leaf node. */ + if( NEVER(pCur->eState!=CURSOR_VALID) ) return -1; + if( NEVER(pCur->pPage->leaf==0) ) return -1; + + n = pCur->pPage->nCell; + for(i=0; i<pCur->iPage; i++){ + n *= pCur->apPage[i]->nCell; + } + return n; +} + +/* +** Advance the cursor to the next entry in the database. +** Return value: +** +** SQLITE_OK success +** SQLITE_DONE cursor is already pointing at the last element +** otherwise some kind of error occurred ** ** The main entry point is sqlite3BtreeNext(). That routine is optimized ** for the common case of merely incrementing the cell counter BtCursor.aiIdx @@ -57650,23 +67580,19 @@ SQLITE_PRIVATE int sqlite3BtreeEof(BtCursor *pCur){ ** routine is called when it is necessary to move to a different page or ** to restore the cursor. ** -** The calling function will set *pRes to 0 or 1. The initial *pRes value -** will be 1 if the cursor being stepped corresponds to an SQL index and -** if this routine could have been skipped if that SQL index had been -** a unique index. Otherwise the caller will have set *pRes to zero. -** Zero is the common case. The btree implementation is free to use the -** initial *pRes value as a hint to improve performance, but the current -** SQLite btree implementation does not. (Note that the comdb2 btree -** implementation does use this hint, however.) +** If bit 0x01 of the F argument in sqlite3BtreeNext(C,F) is 1, then the +** cursor corresponds to an SQL index and this routine could have been +** skipped if the SQL index had been a unique index. The F argument +** is a hint to the implement. SQLite btree implementation does not use +** this hint, but COMDB2 does. */ -static SQLITE_NOINLINE int btreeNext(BtCursor *pCur, int *pRes){ +static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ int rc; int idx; MemPage *pPage; - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); - assert( *pRes==0 ); if( pCur->eState!=CURSOR_VALID ){ assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); rc = restoreCursorPosition(pCur); @@ -57674,8 +67600,7 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur, int *pRes){ return rc; } if( CURSOR_INVALID==pCur->eState ){ - *pRes = 1; - return SQLITE_OK; + return SQLITE_DONE; } if( pCur->skipNext ){ assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); @@ -57688,8 +67613,8 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur, int *pRes){ } } - pPage = pCur->apPage[pCur->iPage]; - idx = ++pCur->aiIdx[pCur->iPage]; + pPage = pCur->pPage; + idx = ++pCur->ix; assert( pPage->isInit ); /* If the database file is corrupt, it is possible for the value of idx @@ -57707,15 +67632,14 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur, int *pRes){ } do{ if( pCur->iPage==0 ){ - *pRes = 1; pCur->eState = CURSOR_INVALID; - return SQLITE_OK; + return SQLITE_DONE; } moveToParent(pCur); - pPage = pCur->apPage[pCur->iPage]; - }while( pCur->aiIdx[pCur->iPage]>=pPage->nCell ); + pPage = pCur->pPage; + }while( pCur->ix>=pPage->nCell ); if( pPage->intKey ){ - return sqlite3BtreeNext(pCur, pRes); + return sqlite3BtreeNext(pCur, 0); }else{ return SQLITE_OK; } @@ -57726,20 +67650,19 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur, int *pRes){ return moveToLeftmost(pCur); } } -SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ +SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int flags){ MemPage *pPage; - assert( cursorHoldsMutex(pCur) ); - assert( pRes!=0 ); - assert( *pRes==0 || *pRes==1 ); + UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ + assert( cursorOwnsBtShared(pCur) ); + assert( flags==0 || flags==1 ); assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); - *pRes = 0; - if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur, pRes); - pPage = pCur->apPage[pCur->iPage]; - if( (++pCur->aiIdx[pCur->iPage])>=pPage->nCell ){ - pCur->aiIdx[pCur->iPage]--; - return btreeNext(pCur, pRes); + if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); + pPage = pCur->pPage; + if( (++pCur->ix)>=pPage->nCell ){ + pCur->ix--; + return btreeNext(pCur); } if( pPage->leaf ){ return SQLITE_OK; @@ -57749,10 +67672,12 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ } /* -** Step the cursor to the back to the previous entry in the database. If -** successful then set *pRes=0. If the cursor -** was already pointing to the first entry in the database before -** this routine was called, then set *pRes=1. +** Step the cursor to the back to the previous entry in the database. +** Return values: +** +** SQLITE_OK success +** SQLITE_DONE the cursor is already on the first element of the table +** otherwise some kind of error occurred ** ** The main entry point is sqlite3BtreePrevious(). That routine is optimized ** for the common case of merely decrementing the cell counter BtCursor.aiIdx @@ -57760,22 +67685,17 @@ SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){ ** helper routine is called when it is necessary to move to a different page ** or to restore the cursor. ** -** The calling function will set *pRes to 0 or 1. The initial *pRes value -** will be 1 if the cursor being stepped corresponds to an SQL index and -** if this routine could have been skipped if that SQL index had been -** a unique index. Otherwise the caller will have set *pRes to zero. -** Zero is the common case. The btree implementation is free to use the -** initial *pRes value as a hint to improve performance, but the current -** SQLite btree implementation does not. (Note that the comdb2 btree -** implementation does use this hint, however.) +** If bit 0x01 of the F argument to sqlite3BtreePrevious(C,F) is 1, then +** the cursor corresponds to an SQL index and this routine could have been +** skipped if the SQL index had been a unique index. The F argument is a +** hint to the implement. The native SQLite btree implementation does not +** use this hint, but COMDB2 does. */ -static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur, int *pRes){ +static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ int rc; MemPage *pPage; - assert( cursorHoldsMutex(pCur) ); - assert( pRes!=0 ); - assert( *pRes==0 ); + assert( cursorOwnsBtShared(pCur) ); assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); assert( pCur->info.nSize==0 ); @@ -57785,8 +67705,7 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur, int *pRes){ return rc; } if( CURSOR_INVALID==pCur->eState ){ - *pRes = 1; - return SQLITE_OK; + return SQLITE_DONE; } if( pCur->skipNext ){ assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); @@ -57799,50 +67718,48 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur, int *pRes){ } } - pPage = pCur->apPage[pCur->iPage]; + pPage = pCur->pPage; assert( pPage->isInit ); if( !pPage->leaf ){ - int idx = pCur->aiIdx[pCur->iPage]; + int idx = pCur->ix; rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); if( rc ) return rc; rc = moveToRightmost(pCur); }else{ - while( pCur->aiIdx[pCur->iPage]==0 ){ + while( pCur->ix==0 ){ if( pCur->iPage==0 ){ pCur->eState = CURSOR_INVALID; - *pRes = 1; - return SQLITE_OK; + return SQLITE_DONE; } moveToParent(pCur); } assert( pCur->info.nSize==0 ); - assert( (pCur->curFlags & (BTCF_ValidNKey|BTCF_ValidOvfl))==0 ); + assert( (pCur->curFlags & (BTCF_ValidOvfl))==0 ); - pCur->aiIdx[pCur->iPage]--; - pPage = pCur->apPage[pCur->iPage]; + pCur->ix--; + pPage = pCur->pPage; if( pPage->intKey && !pPage->leaf ){ - rc = sqlite3BtreePrevious(pCur, pRes); + rc = sqlite3BtreePrevious(pCur, 0); }else{ rc = SQLITE_OK; } } return rc; } -SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ - assert( cursorHoldsMutex(pCur) ); - assert( pRes!=0 ); - assert( *pRes==0 || *pRes==1 ); +SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int flags){ + assert( cursorOwnsBtShared(pCur) ); + assert( flags==0 || flags==1 ); assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); - *pRes = 0; + UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); pCur->info.nSize = 0; if( pCur->eState!=CURSOR_VALID - || pCur->aiIdx[pCur->iPage]==0 - || pCur->apPage[pCur->iPage]->leaf==0 + || pCur->ix==0 + || pCur->pPage->leaf==0 ){ - return btreePrevious(pCur, pRes); + return btreePrevious(pCur); } - pCur->aiIdx[pCur->iPage]--; + pCur->ix--; return SQLITE_OK; } @@ -57855,8 +67772,7 @@ SQLITE_PRIVATE int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){ ** sqlite3PagerUnref() on the new page when it is done. ** ** SQLITE_OK is returned on success. Any other return value indicates -** an error. *ppPage and *pPgno are undefined in the event of an error. -** Do not invoke sqlite3PagerUnref() on *ppPage if an error is returned. +** an error. *ppPage is set to NULL in the event of an error. ** ** If the "nearby" parameter is not 0, then an effort is made to ** locate a page close to the page number "nearby". This can be used in an @@ -57899,6 +67815,7 @@ static int allocateBtreePage( /* There are pages on the freelist. Reuse one of those pages. */ Pgno iTrunk; u8 searchList = 0; /* If the free-list must be searched for 'nearby' */ + u32 nSearch = 0; /* Count of the number of search attempts */ /* If eMode==BTALLOC_EXACT and a query of the pointer-map ** shows that the page 'nearby' is somewhere on the free-list, then @@ -57947,10 +67864,10 @@ static int allocateBtreePage( iTrunk = get4byte(&pPage1->aData[32]); } testcase( iTrunk==mxPage ); - if( iTrunk>mxPage ){ - rc = SQLITE_CORRUPT_BKPT; + if( iTrunk>mxPage || nSearch++ > n ){ + rc = SQLITE_CORRUPT_PGNO(pPrevTrunk ? pPrevTrunk->pgno : 1); }else{ - rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0); + rc = btreeGetUnusedPage(pBt, iTrunk, &pTrunk, 0); } if( rc ){ pTrunk = 0; @@ -57977,7 +67894,7 @@ static int allocateBtreePage( TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1)); }else if( k>(u32)(pBt->usableSize/4 - 2) ){ /* Value of k is out of range. Database corruption */ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PGNO(iTrunk); goto end_allocate_page; #ifndef SQLITE_OMIT_AUTOVACUUM }else if( searchList @@ -58011,11 +67928,11 @@ static int allocateBtreePage( MemPage *pNewTrunk; Pgno iNewTrunk = get4byte(&pTrunk->aData[8]); if( iNewTrunk>mxPage ){ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PGNO(iTrunk); goto end_allocate_page; } testcase( iNewTrunk==mxPage ); - rc = btreeGetPage(pBt, iNewTrunk, &pNewTrunk, 0); + rc = btreeGetUnusedPage(pBt, iNewTrunk, &pNewTrunk, 0); if( rc!=SQLITE_OK ){ goto end_allocate_page; } @@ -58076,7 +67993,7 @@ static int allocateBtreePage( iPage = get4byte(&aData[8+closest*4]); testcase( iPage==mxPage ); if( iPage>mxPage ){ - rc = SQLITE_CORRUPT_BKPT; + rc = SQLITE_CORRUPT_PGNO(iTrunk); goto end_allocate_page; } testcase( iPage==mxPage ); @@ -58095,11 +68012,12 @@ static int allocateBtreePage( } put4byte(&aData[4], k-1); noContent = !btreeGetHasContent(pBt, *pPgno)? PAGER_GET_NOCONTENT : 0; - rc = btreeGetPage(pBt, *pPgno, ppPage, noContent); + rc = btreeGetUnusedPage(pBt, *pPgno, ppPage, noContent); if( rc==SQLITE_OK ){ rc = sqlite3PagerWrite((*ppPage)->pDbPage); if( rc!=SQLITE_OK ){ releasePage(*ppPage); + *ppPage = 0; } } searchList = 0; @@ -58143,7 +68061,7 @@ static int allocateBtreePage( MemPage *pPg = 0; TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage)); assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) ); - rc = btreeGetPage(pBt, pBt->nPage, &pPg, bNoContent); + rc = btreeGetUnusedPage(pBt, pBt->nPage, &pPg, bNoContent); if( rc==SQLITE_OK ){ rc = sqlite3PagerWrite(pPg->pDbPage); releasePage(pPg); @@ -58157,11 +68075,12 @@ static int allocateBtreePage( *pPgno = pBt->nPage; assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); - rc = btreeGetPage(pBt, *pPgno, ppPage, bNoContent); + rc = btreeGetUnusedPage(pBt, *pPgno, ppPage, bNoContent); if( rc ) return rc; rc = sqlite3PagerWrite((*ppPage)->pDbPage); if( rc!=SQLITE_OK ){ releasePage(*ppPage); + *ppPage = 0; } TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); } @@ -58171,17 +68090,8 @@ static int allocateBtreePage( end_allocate_page: releasePage(pTrunk); releasePage(pPrevTrunk); - if( rc==SQLITE_OK ){ - if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){ - releasePage(*ppPage); - *ppPage = 0; - return SQLITE_CORRUPT_BKPT; - } - (*ppPage)->isInit = 0; - }else{ - *ppPage = 0; - } - assert( rc!=SQLITE_OK || sqlite3PagerIswriteable((*ppPage)->pDbPage) ); + assert( rc!=SQLITE_OK || sqlite3PagerPageRefcount((*ppPage)->pDbPage)<=1 ); + assert( rc!=SQLITE_OK || (*ppPage)->isInit==0 ); return rc; } @@ -58206,9 +68116,10 @@ static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){ int nFree; /* Initial number of pages on free-list */ assert( sqlite3_mutex_held(pBt->mutex) ); - assert( iPage>1 ); + assert( CORRUPT_DB || iPage>1 ); assert( !pMemPage || pMemPage->pgno==iPage ); + if( iPage<2 ) return SQLITE_CORRUPT_BKPT; if( pMemPage ){ pPage = pMemPage; sqlite3PagerRef(pPage->pDbPage); @@ -58331,36 +68242,39 @@ static void freePage(MemPage *pPage, int *pRC){ } /* -** Free any overflow pages associated with the given Cell. Write the -** local Cell size (the number of bytes on the original page, omitting -** overflow) into *pnSize. +** Free any overflow pages associated with the given Cell. Store +** size information about the cell in pInfo. */ static int clearCell( MemPage *pPage, /* The page that contains the Cell */ unsigned char *pCell, /* First byte of the Cell */ - u16 *pnSize /* Write the size of the Cell here */ + CellInfo *pInfo /* Size information about the cell */ ){ - BtShared *pBt = pPage->pBt; - CellInfo info; + BtShared *pBt; Pgno ovflPgno; int rc; int nOvfl; u32 ovflPageSize; assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - btreeParseCellPtr(pPage, pCell, &info); - *pnSize = info.nSize; - if( info.iOverflow==0 ){ + pPage->xParseCell(pPage, pCell, pInfo); + if( pInfo->nLocal==pInfo->nPayload ){ return SQLITE_OK; /* No overflow pages. Return without doing anything */ } - if( pCell+info.iOverflow+3 > pPage->aData+pPage->maskPage ){ - return SQLITE_CORRUPT_BKPT; /* Cell extends past end of page */ + testcase( pCell + pInfo->nSize == pPage->aDataEnd ); + testcase( pCell + (pInfo->nSize-1) == pPage->aDataEnd ); + if( pCell + pInfo->nSize > pPage->aDataEnd ){ + /* Cell extends past end of page */ + return SQLITE_CORRUPT_PAGE(pPage); } - ovflPgno = get4byte(&pCell[info.iOverflow]); + ovflPgno = get4byte(pCell + pInfo->nSize - 4); + pBt = pPage->pBt; assert( pBt->usableSize > 4 ); ovflPageSize = pBt->usableSize - 4; - nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize; - assert( ovflPgno==0 || nOvfl>0 ); + nOvfl = (pInfo->nPayload - pInfo->nLocal + ovflPageSize - 1)/ovflPageSize; + assert( nOvfl>0 || + (CORRUPT_DB && (pInfo->nPayload + ovflPageSize)<ovflPageSize) + ); while( nOvfl-- ){ Pgno iNext = 0; MemPage *pOvfl = 0; @@ -58417,73 +68331,74 @@ static int clearCell( static int fillInCell( MemPage *pPage, /* The page that contains the cell */ unsigned char *pCell, /* Complete text of the cell */ - const void *pKey, i64 nKey, /* The key */ - const void *pData,int nData, /* The data */ - int nZero, /* Extra zero bytes to append to pData */ + const BtreePayload *pX, /* Payload with which to construct the cell */ int *pnSize /* Write cell size here */ ){ int nPayload; const u8 *pSrc; - int nSrc, n, rc; + int nSrc, n, rc, mn; int spaceLeft; - MemPage *pOvfl = 0; - MemPage *pToRelease = 0; + MemPage *pToRelease; unsigned char *pPrior; unsigned char *pPayload; - BtShared *pBt = pPage->pBt; - Pgno pgnoOvfl = 0; + BtShared *pBt; + Pgno pgnoOvfl; int nHeader; assert( sqlite3_mutex_held(pPage->pBt->mutex) ); /* pPage is not necessarily writeable since pCell might be auxiliary ** buffer space that is separate from the pPage buffer area */ - assert( pCell<pPage->aData || pCell>=&pPage->aData[pBt->pageSize] + assert( pCell<pPage->aData || pCell>=&pPage->aData[pPage->pBt->pageSize] || sqlite3PagerIswriteable(pPage->pDbPage) ); /* Fill in the header. */ nHeader = pPage->childPtrSize; - nPayload = nData + nZero; - if( pPage->intKeyLeaf ){ - nHeader += putVarint32(&pCell[nHeader], nPayload); - }else{ - assert( nData==0 ); - assert( nZero==0 ); - } - nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey); - - /* Fill in the payload size */ if( pPage->intKey ){ - pSrc = pData; - nSrc = nData; - nData = 0; - }else{ - if( NEVER(nKey>0x7fffffff || pKey==0) ){ - return SQLITE_CORRUPT_BKPT; - } - nPayload = (int)nKey; - pSrc = pKey; - nSrc = (int)nKey; + nPayload = pX->nData + pX->nZero; + pSrc = pX->pData; + nSrc = pX->nData; + assert( pPage->intKeyLeaf ); /* fillInCell() only called for leaves */ + nHeader += putVarint32(&pCell[nHeader], nPayload); + nHeader += putVarint(&pCell[nHeader], *(u64*)&pX->nKey); + }else{ + assert( pX->nKey<=0x7fffffff && pX->pKey!=0 ); + nSrc = nPayload = (int)pX->nKey; + pSrc = pX->pKey; + nHeader += putVarint32(&pCell[nHeader], nPayload); } + + /* Fill in the payload */ + pPayload = &pCell[nHeader]; if( nPayload<=pPage->maxLocal ){ + /* This is the common case where everything fits on the btree page + ** and no overflow pages are required. */ n = nHeader + nPayload; testcase( n==3 ); testcase( n==4 ); if( n<4 ) n = 4; *pnSize = n; - spaceLeft = nPayload; - pPrior = pCell; - }else{ - int mn = pPage->minLocal; - n = mn + (nPayload - mn) % (pPage->pBt->usableSize - 4); - testcase( n==pPage->maxLocal ); - testcase( n==pPage->maxLocal+1 ); - if( n > pPage->maxLocal ) n = mn; - spaceLeft = n; - *pnSize = n + nHeader + 4; - pPrior = &pCell[nHeader+n]; + assert( nSrc<=nPayload ); + testcase( nSrc<nPayload ); + memcpy(pPayload, pSrc, nSrc); + memset(pPayload+nSrc, 0, nPayload-nSrc); + return SQLITE_OK; } - pPayload = &pCell[nHeader]; + + /* If we reach this point, it means that some of the content will need + ** to spill onto overflow pages. + */ + mn = pPage->minLocal; + n = mn + (nPayload - mn) % (pPage->pBt->usableSize - 4); + testcase( n==pPage->maxLocal ); + testcase( n==pPage->maxLocal+1 ); + if( n > pPage->maxLocal ) n = mn; + spaceLeft = n; + *pnSize = n + nHeader + 4; + pPrior = &pCell[nHeader+n]; + pToRelease = 0; + pgnoOvfl = 0; + pBt = pPage->pBt; /* At this point variables should be set as follows: ** @@ -58497,21 +68412,47 @@ static int fillInCell( ** Use a call to btreeParseCellPtr() to verify that the values above ** were computed correctly. */ -#if SQLITE_DEBUG +#ifdef SQLITE_DEBUG { CellInfo info; - btreeParseCellPtr(pPage, pCell, &info); - assert( nHeader=(int)(info.pPayload - pCell) ); - assert( info.nKey==nKey ); + pPage->xParseCell(pPage, pCell, &info); + assert( nHeader==(int)(info.pPayload - pCell) ); + assert( info.nKey==pX->nKey ); assert( *pnSize == info.nSize ); assert( spaceLeft == info.nLocal ); - assert( pPrior == &pCell[info.iOverflow] ); } #endif /* Write the payload into the local Cell and any extra into overflow pages */ - while( nPayload>0 ){ + while( 1 ){ + n = nPayload; + if( n>spaceLeft ) n = spaceLeft; + + /* If pToRelease is not zero than pPayload points into the data area + ** of pToRelease. Make sure pToRelease is still writeable. */ + assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); + + /* If pPayload is part of the data area of pPage, then make sure pPage + ** is still writeable */ + assert( pPayload<pPage->aData || pPayload>=&pPage->aData[pBt->pageSize] + || sqlite3PagerIswriteable(pPage->pDbPage) ); + + if( nSrc>=n ){ + memcpy(pPayload, pSrc, n); + }else if( nSrc>0 ){ + n = nSrc; + memcpy(pPayload, pSrc, n); + }else{ + memset(pPayload, 0, n); + } + nPayload -= n; + if( nPayload<=0 ) break; + pPayload += n; + pSrc += n; + nSrc -= n; + spaceLeft -= n; if( spaceLeft==0 ){ + MemPage *pOvfl = 0; #ifndef SQLITE_OMIT_AUTOVACUUM Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */ if( pBt->autoVacuum ){ @@ -58564,34 +68505,6 @@ static int fillInCell( pPayload = &pOvfl->aData[4]; spaceLeft = pBt->usableSize - 4; } - n = nPayload; - if( n>spaceLeft ) n = spaceLeft; - - /* If pToRelease is not zero than pPayload points into the data area - ** of pToRelease. Make sure pToRelease is still writeable. */ - assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) ); - - /* If pPayload is part of the data area of pPage, then make sure pPage - ** is still writeable */ - assert( pPayload<pPage->aData || pPayload>=&pPage->aData[pBt->pageSize] - || sqlite3PagerIswriteable(pPage->pDbPage) ); - - if( nSrc>0 ){ - if( n>nSrc ) n = nSrc; - assert( pSrc ); - memcpy(pPayload, pSrc, n); - }else{ - memset(pPayload, 0, n); - } - nPayload -= n; - pPayload += n; - pSrc += n; - nSrc -= n; - spaceLeft -= n; - if( nSrc==0 ){ - nSrc = nData; - pSrc = pData; - } } releasePage(pToRelease); return SQLITE_OK; @@ -58613,9 +68526,8 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */ if( *pRC ) return; - assert( idx>=0 && idx<pPage->nCell ); - assert( sz==cellSize(pPage, idx) ); + assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); data = pPage->aData; @@ -58624,7 +68536,7 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ hdr = pPage->hdrOffset; testcase( pc==get2byte(&data[hdr+5]) ); testcase( pc+sz==pPage->pBt->usableSize ); - if( pc < (u32)get2byte(&data[hdr+5]) || pc+sz > pPage->pBt->usableSize ){ + if( pc+sz > pPage->pBt->usableSize ){ *pRC = SQLITE_CORRUPT_BKPT; return; } @@ -58658,6 +68570,8 @@ static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ ** in pTemp or the original pCell) and also record its index. ** Allocating a new entry in pPage->aCell[] implies that ** pPage->nOverflow is incremented. +** +** *pRC must be SQLITE_OK when this routine is called. */ static void insertCell( MemPage *pPage, /* Page into which we are copying */ @@ -58670,13 +68584,10 @@ static void insertCell( ){ int idx = 0; /* Where to write new cell content in data[] */ int j; /* Loop counter */ - int end; /* First byte past the last cell pointer in data[] */ - int ins; /* Index in data[] where new cell pointer is inserted */ - int cellOffset; /* Address of first cell pointer in data[] */ u8 *data; /* The content of the whole page */ + u8 *pIns; /* The point in pPage->aCellIdx[] where no cell inserted */ - if( *pRC ) return; - + assert( *pRC==SQLITE_OK ); assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); assert( MX_CELL(pPage->pBt)<=10921 ); assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB ); @@ -58688,7 +68599,7 @@ static void insertCell( ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size ** might be less than 8 (leaf-size + pointer) on the interior node. Hence ** the term after the || in the following assert(). */ - assert( sz==cellSizePtr(pPage, pCell) || (sz==8 && iChild>0) ); + assert( sz==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ memcpy(pTemp, pCell, sz); @@ -58698,9 +68609,20 @@ static void insertCell( put4byte(pCell, iChild); } j = pPage->nOverflow++; - assert( j<(int)(sizeof(pPage->apOvfl)/sizeof(pPage->apOvfl[0])) ); + /* Comparison against ArraySize-1 since we hold back one extra slot + ** as a contingency. In other words, never need more than 3 overflow + ** slots but 4 are allocated, just to be safe. */ + assert( j < ArraySize(pPage->apOvfl)-1 ); pPage->apOvfl[j] = pCell; pPage->aiOvfl[j] = (u16)i; + + /* When multiple overflows occur, they are always sequential and in + ** sorted order. This invariants arise because multiple overflows can + ** only occur when inserting divider cells into the parent page during + ** balancing, and the dividers are adjacent and sorted. + */ + assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */ + assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */ }else{ int rc = sqlite3PagerWrite(pPage->pDbPage); if( rc!=SQLITE_OK ){ @@ -58709,24 +68631,26 @@ static void insertCell( } assert( sqlite3PagerIswriteable(pPage->pDbPage) ); data = pPage->aData; - cellOffset = pPage->cellOffset; - end = cellOffset + 2*pPage->nCell; - ins = cellOffset + 2*i; + assert( &data[pPage->cellOffset]==pPage->aCellIdx ); rc = allocateSpace(pPage, sz, &idx); if( rc ){ *pRC = rc; return; } - /* The allocateSpace() routine guarantees the following two properties - ** if it returns success */ - assert( idx >= end+2 ); + /* The allocateSpace() routine guarantees the following properties + ** if it returns successfully */ + assert( idx >= 0 ); + assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); assert( idx+sz <= (int)pPage->pBt->usableSize ); - pPage->nCell++; pPage->nFree -= (u16)(2 + sz); memcpy(&data[idx], pCell, sz); if( iChild ){ put4byte(&data[idx], iChild); } - memmove(&data[ins+2], &data[ins], end-ins); - put2byte(&data[ins], idx); - put2byte(&data[pPage->hdrOffset+3], pPage->nCell); + pIns = pPage->aCellIdx + i*2; + memmove(pIns+2, pIns, 2*(pPage->nCell - i)); + put2byte(pIns, idx); + pPage->nCell++; + /* increment the cell count */ + if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; + assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell ); #ifndef SQLITE_OMIT_AUTOVACUUM if( pPage->pBt->autoVacuum ){ /* The cell may contain a pointer to an overflow page. If so, write @@ -58738,6 +68662,52 @@ static void insertCell( } } +/* +** A CellArray object contains a cache of pointers and sizes for a +** consecutive sequence of cells that might be held on multiple pages. +*/ +typedef struct CellArray CellArray; +struct CellArray { + int nCell; /* Number of cells in apCell[] */ + MemPage *pRef; /* Reference page */ + u8 **apCell; /* All cells begin balanced */ + u16 *szCell; /* Local size of all cells in apCell[] */ +}; + +/* +** Make sure the cell sizes at idx, idx+1, ..., idx+N-1 have been +** computed. +*/ +static void populateCellCache(CellArray *p, int idx, int N){ + assert( idx>=0 && idx+N<=p->nCell ); + while( N>0 ){ + assert( p->apCell[idx]!=0 ); + if( p->szCell[idx]==0 ){ + p->szCell[idx] = p->pRef->xCellSize(p->pRef, p->apCell[idx]); + }else{ + assert( CORRUPT_DB || + p->szCell[idx]==p->pRef->xCellSize(p->pRef, p->apCell[idx]) ); + } + idx++; + N--; + } +} + +/* +** Return the size of the Nth element of the cell array +*/ +static SQLITE_NOINLINE u16 computeCellSize(CellArray *p, int N){ + assert( N>=0 && N<p->nCell ); + assert( p->szCell[N]==0 ); + p->szCell[N] = p->pRef->xCellSize(p->pRef, p->apCell[N]); + return p->szCell[N]; +} +static u16 cachedCellSize(CellArray *p, int N){ + assert( N>=0 && N<p->nCell ); + if( p->szCell[N] ) return p->szCell[N]; + return computeCellSize(p, N); +} + /* ** Array apCell[] contains pointers to nCell b-tree page cells. The ** szCell[] array contains the size in bytes of each cell. This function @@ -58751,7 +68721,7 @@ static void insertCell( ** The MemPage.nFree field is invalidated by this function. It is the ** responsibility of the caller to set it correctly. */ -static void rebuildPage( +static int rebuildPage( MemPage *pPg, /* Edit this page */ int nCell, /* Final number of cells on page */ u8 **apCell, /* Array of cells */ @@ -58772,14 +68742,16 @@ static void rebuildPage( pData = pEnd; for(i=0; i<nCell; i++){ u8 *pCell = apCell[i]; - if( pCell>aData && pCell<pEnd ){ + if( SQLITE_WITHIN(pCell,aData,pEnd) ){ pCell = &pTmp[pCell - aData]; } pData -= szCell[i]; - memcpy(pData, pCell, szCell[i]); put2byte(pCellptr, (pData - aData)); pCellptr += 2; - assert( szCell[i]==cellSizePtr(pPg, pCell) ); + if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; + memcpy(pData, pCell, szCell[i]); + assert( szCell[i]==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( szCell[i]!=pPg->xCellSize(pPg,pCell) ); } /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ @@ -58790,6 +68762,7 @@ static void rebuildPage( put2byte(&aData[hdr+3], pPg->nCell); put2byte(&aData[hdr+5], pData - aData); aData[hdr+7] = 0x00; + return SQLITE_OK; } /* @@ -58822,25 +68795,31 @@ static int pageInsertArray( u8 *pBegin, /* End of cell-pointer array */ u8 **ppData, /* IN/OUT: Page content -area pointer */ u8 *pCellptr, /* Pointer to cell-pointer area */ + int iFirst, /* Index of first cell to add */ int nCell, /* Number of cells to add to pPg */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + CellArray *pCArray /* Array of cells */ ){ int i; u8 *aData = pPg->aData; u8 *pData = *ppData; - const int bFreelist = aData[1] || aData[2]; + int iEnd = iFirst + nCell; assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ - for(i=0; i<nCell; i++){ - int sz = szCell[i]; - int rc; + for(i=iFirst; i<iEnd; i++){ + int sz, rc; u8 *pSlot; - if( bFreelist==0 || (pSlot = pageFindSlot(pPg, sz, &rc, 0))==0 ){ + sz = cachedCellSize(pCArray, i); + if( (aData[1]==0 && aData[2]==0) || (pSlot = pageFindSlot(pPg,sz,&rc))==0 ){ + if( (pData - pBegin)<sz ) return 1; pData -= sz; - if( pData<pBegin ) return 1; pSlot = pData; } - memcpy(pSlot, apCell[i], sz); + /* pSlot and pCArray->apCell[i] will never overlap on a well-formed + ** database. But they might for a corrupt database. Hence use memmove() + ** since memcpy() sends SIGABORT with overlapping buffers on OpenBSD */ + assert( (pSlot+sz)<=pCArray->apCell[i] + || pSlot>=(pCArray->apCell[i]+sz) + || CORRUPT_DB ); + memmove(pSlot, pCArray->apCell[i], sz); put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; } @@ -58859,22 +68838,27 @@ static int pageInsertArray( */ static int pageFreeArray( MemPage *pPg, /* Page to edit */ + int iFirst, /* First cell to delete */ int nCell, /* Cells to delete */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + CellArray *pCArray /* Array of cells */ ){ u8 * const aData = pPg->aData; u8 * const pEnd = &aData[pPg->pBt->usableSize]; u8 * const pStart = &aData[pPg->hdrOffset + 8 + pPg->childPtrSize]; int nRet = 0; int i; + int iEnd = iFirst + nCell; u8 *pFree = 0; int szFree = 0; - for(i=0; i<nCell; i++){ - u8 *pCell = apCell[i]; - if( pCell>=pStart && pCell<pEnd ){ - int sz = szCell[i]; + for(i=iFirst; i<iEnd; i++){ + u8 *pCell = pCArray->apCell[i]; + if( SQLITE_WITHIN(pCell, pStart, pEnd) ){ + int sz; + /* No need to use cachedCellSize() here. The sizes of all cells that + ** are to be freed have already been computing while deciding which + ** cells need freeing */ + sz = pCArray->szCell[i]; assert( sz>0 ); if( pFree!=(pCell + sz) ){ if( pFree ){ assert( pFree>aData && (pFree - aData)<65536 ); @@ -58909,13 +68893,12 @@ static int pageFreeArray( ** The pPg->nFree field is invalid when this function returns. It is the ** responsibility of the caller to set it correctly. */ -static void editPage( +static int editPage( MemPage *pPg, /* Edit this page */ int iOld, /* Index of first cell currently on page */ int iNew, /* Index of new first cell on page */ int nNew, /* Final number of cells on page */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + CellArray *pCArray /* Array of cells and sizes */ ){ u8 * const aData = pPg->aData; const int hdr = pPg->hdrOffset; @@ -58934,16 +68917,12 @@ static void editPage( /* Remove cells from the start and end of the page */ if( iOld<iNew ){ - int nShift = pageFreeArray( - pPg, iNew-iOld, &apCell[iOld], &szCell[iOld] - ); + int nShift = pageFreeArray(pPg, iOld, iNew-iOld, pCArray); memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } if( iNewEnd < iOldEnd ){ - nCell -= pageFreeArray( - pPg, iOldEnd-iNewEnd, &apCell[iNewEnd], &szCell[iNewEnd] - ); + nCell -= pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); } pData = &aData[get2byteNotZero(&aData[hdr+5])]; @@ -58957,7 +68936,7 @@ static void editPage( memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); if( pageInsertArray( pPg, pBegin, &pData, pCellptr, - nAdd, &apCell[iNew], &szCell[iNew] + iNew, nAdd, pCArray ) ) goto editpage_fail; nCell += nAdd; } @@ -58971,7 +68950,7 @@ static void editPage( nCell++; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, - 1, &apCell[iCell + iNew], &szCell[iCell + iNew] + iCell+iNew, 1, pCArray ) ) goto editpage_fail; } } @@ -58980,7 +68959,7 @@ static void editPage( pCellptr = &pPg->aCellIdx[nCell*2]; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, - nNew-nCell, &apCell[iNew+nCell], &szCell[iNew+nCell] + iNew+nCell, nNew-nCell, pCArray ) ) goto editpage_fail; pPg->nCell = nNew; @@ -58991,19 +68970,21 @@ static void editPage( #ifdef SQLITE_DEBUG for(i=0; i<nNew && !CORRUPT_DB; i++){ - u8 *pCell = apCell[i+iNew]; - int iOff = get2byte(&pPg->aCellIdx[i*2]); - if( pCell>=aData && pCell<&aData[pPg->pBt->usableSize] ){ + u8 *pCell = pCArray->apCell[i+iNew]; + int iOff = get2byteAligned(&pPg->aCellIdx[i*2]); + if( SQLITE_WITHIN(pCell, aData, &aData[pPg->pBt->usableSize]) ){ pCell = &pTmp[pCell - aData]; } - assert( 0==memcmp(pCell, &aData[iOff], szCell[i+iNew]) ); + assert( 0==memcmp(pCell, &aData[iOff], + pCArray->pRef->xCellSize(pCArray->pRef, pCArray->apCell[i+iNew])) ); } #endif - return; + return SQLITE_OK; editpage_fail: /* Unable to edit this page. Rebuild it from scratch instead. */ - rebuildPage(pPg, nNew, &apCell[iNew], &szCell[iNew]); + populateCellCache(pCArray, iNew, nNew); + return rebuildPage(pPg, nNew, &pCArray->apCell[iNew], &pCArray->szCell[iNew]); } /* @@ -59069,13 +69050,14 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ u8 *pOut = &pSpace[4]; u8 *pCell = pPage->apOvfl[0]; - u16 szCell = cellSizePtr(pPage, pCell); + u16 szCell = pPage->xCellSize(pPage, pCell); u8 *pStop; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); - rebuildPage(pNew, 1, &pCell, &szCell); + rc = rebuildPage(pNew, 1, &pCell, &szCell); + if( NEVER(rc) ) return rc; pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; /* If this is an auto-vacuum database, update the pointer map @@ -59114,8 +69096,10 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ while( ((*(pOut++) = *(pCell++))&0x80) && pCell<pStop ); /* Insert the new divider cell into pParent. */ - insertCell(pParent, pParent->nCell, pSpace, (int)(pOut-pSpace), - 0, pPage->pgno, &rc); + if( rc==SQLITE_OK ){ + insertCell(pParent, pParent->nCell, pSpace, (int)(pOut-pSpace), + 0, pPage->pgno, &rc); + } /* Set the right-child pointer of pParent to point to the new page. */ put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew); @@ -59148,9 +69132,9 @@ static int ptrmapCheckPages(MemPage **apPage, int nPage){ u8 *z; z = findCell(pPage, j); - btreeParseCellPtr(pPage, z, &info); - if( info.iOverflow ){ - Pgno ovfl = get4byte(&z[info.iOverflow]); + pPage->xParseCell(pPage, z, &info); + if( info.nLocal<info.nPayload ){ + Pgno ovfl = get4byte(&z[info.nSize-4]); ptrmapGet(pBt, ovfl, &e, &n); assert( n==pPage->pgno && e==PTRMAP_OVERFLOW1 ); } @@ -59268,9 +69252,6 @@ static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){ ** If aOvflSpace is set to a null pointer, this function returns ** SQLITE_NOMEM. */ -#if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM) -#pragma optimize("", off) -#endif static int balance_nonroot( MemPage *pParent, /* Parent page of siblings being balanced */ int iParentIdx, /* Index of "the page" in pParent */ @@ -59279,7 +69260,6 @@ static int balance_nonroot( int bBulk /* True if this call is part of a bulk load */ ){ BtShared *pBt; /* The whole database */ - int nCell = 0; /* Number of cells in apCell[] */ int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */ int nNew = 0; /* Number of pages in apNew[] */ int nOld; /* Number of pages in apOld[] */ @@ -59290,7 +69270,6 @@ static int balance_nonroot( int leafData; /* True if pPage is a leaf of a LEAFDATA tree */ int usableSpace; /* Bytes in pPage beyond the header */ int pageFlags; /* Value of pPage->aData[0] */ - int subtotal; /* Subtotal of bytes in cells on one page */ int iSpace1 = 0; /* First unused byte of aSpace1[] */ int iOvflSpace = 0; /* First unused byte of aOvflSpace[] */ int szScratch; /* Size of scratch memory requested */ @@ -59298,19 +69277,20 @@ static int balance_nonroot( MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */ u8 *pRight; /* Location in parent of right-sibling pointer */ u8 *apDiv[NB-1]; /* Divider cells in pParent */ - int cntNew[NB+2]; /* Index in aCell[] of cell after i-th page */ - int cntOld[NB+2]; /* Old index in aCell[] after i-th page */ + int cntNew[NB+2]; /* Index in b.paCell[] of cell after i-th page */ + int cntOld[NB+2]; /* Old index in b.apCell[] */ int szNew[NB+2]; /* Combined size of cells placed on i-th page */ - u8 **apCell = 0; /* All cells begin balanced */ - u16 *szCell; /* Local size of all cells in apCell[] */ u8 *aSpace1; /* Space for copies of dividers cells */ Pgno pgno; /* Temp var to store a page number in */ u8 abDone[NB+2]; /* True after i'th new page is populated */ Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */ Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */ u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */ + CellArray b; /* Parsed information on cells being balanced */ memset(abDone, 0, sizeof(abDone)); + b.nCell = 0; + b.apCell = 0; pBt = pParent->pBt; assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); @@ -59328,7 +69308,7 @@ static int balance_nonroot( assert( pParent->nOverflow==0 || pParent->aiOvfl[0]==iParentIdx ); if( !aOvflSpace ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } /* Find the sibling pages to balance. Also locate the cells in pParent @@ -59352,7 +69332,6 @@ static int balance_nonroot( }else if( iParentIdx==i ){ nxDiv = i-2+bBulk; }else{ - assert( bBulk==0 ); nxDiv = iParentIdx-1; } i = 2-bBulk; @@ -59365,7 +69344,7 @@ static int balance_nonroot( } pgno = get4byte(pRight); while( 1 ){ - rc = getAndInitPage(pBt, pgno, &apOld[i], 0); + rc = getAndInitPage(pBt, pgno, &apOld[i], 0, 0); if( rc ){ memset(apOld, 0, (i+1)*sizeof(MemPage*)); goto balance_cleanup; @@ -59373,15 +69352,15 @@ static int balance_nonroot( nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow; if( (i--)==0 ) break; - if( i+nxDiv==pParent->aiOvfl[0] && pParent->nOverflow ){ + if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ apDiv[i] = pParent->apOvfl[0]; pgno = get4byte(apDiv[i]); - szNew[i] = cellSizePtr(pParent, apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); pParent->nOverflow = 0; }else{ apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow); pgno = get4byte(apDiv[i]); - szNew[i] = cellSizePtr(pParent, apDiv[i]); + szNew[i] = pParent->xCellSize(pParent, apDiv[i]); /* Drop the cell from the parent page. apDiv[i] still points to ** the cell within the parent, even though it has been dropped. @@ -59395,7 +69374,7 @@ static int balance_nonroot( ** In this case, temporarily copy the cell into the aOvflSpace[] ** buffer. It will be copied out again as soon as the aSpace[] buffer ** is allocated. */ - if( pBt->btsFlags & BTS_SECURE_DELETE ){ + if( pBt->btsFlags & BTS_FAST_SECURE ){ int iOff; iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData); @@ -59420,130 +69399,197 @@ static int balance_nonroot( ** Allocate space for memory structures */ szScratch = - nMaxCells*sizeof(u8*) /* apCell */ - + nMaxCells*sizeof(u16) /* szCell */ + nMaxCells*sizeof(u8*) /* b.apCell */ + + nMaxCells*sizeof(u16) /* b.szCell */ + pBt->pageSize; /* aSpace1 */ - /* EVIDENCE-OF: R-28375-38319 SQLite will never request a scratch buffer - ** that is more than 6 times the database page size. */ assert( szScratch<=6*(int)pBt->pageSize ); - apCell = sqlite3ScratchMalloc( szScratch ); - if( apCell==0 ){ - rc = SQLITE_NOMEM; + b.apCell = sqlite3StackAllocRaw(0, szScratch ); + if( b.apCell==0 ){ + rc = SQLITE_NOMEM_BKPT; goto balance_cleanup; } - szCell = (u16*)&apCell[nMaxCells]; - aSpace1 = (u8*)&szCell[nMaxCells]; + b.szCell = (u16*)&b.apCell[nMaxCells]; + aSpace1 = (u8*)&b.szCell[nMaxCells]; assert( EIGHT_BYTE_ALIGNMENT(aSpace1) ); /* ** Load pointers to all cells on sibling pages and the divider cells - ** into the local apCell[] array. Make copies of the divider cells + ** into the local b.apCell[] array. Make copies of the divider cells ** into space obtained from aSpace1[]. The divider cells have already ** been removed from pParent. ** ** If the siblings are on leaf pages, then the child pointers of the ** divider cells are stripped from the cells before they are copied - ** into aSpace1[]. In this way, all cells in apCell[] are without + ** into aSpace1[]. In this way, all cells in b.apCell[] are without ** child pointers. If siblings are not leaves, then all cell in - ** apCell[] include child pointers. Either way, all cells in apCell[] + ** b.apCell[] include child pointers. Either way, all cells in b.apCell[] ** are alike. ** ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf. ** leafData: 1 if pPage holds key+data and pParent holds only keys. */ - leafCorrection = apOld[0]->leaf*4; - leafData = apOld[0]->intKeyLeaf; + b.pRef = apOld[0]; + leafCorrection = b.pRef->leaf*4; + leafData = b.pRef->intKeyLeaf; for(i=0; i<nOld; i++){ - int limit; MemPage *pOld = apOld[i]; + int limit = pOld->nCell; + u8 *aData = pOld->aData; + u16 maskPage = pOld->maskPage; + u8 *piCell = aData + pOld->cellOffset; + u8 *piEnd; - limit = pOld->nCell+pOld->nOverflow; + /* Verify that all sibling pages are of the same "type" (table-leaf, + ** table-interior, index-leaf, or index-interior). + */ + if( pOld->aData[0]!=apOld[0]->aData[0] ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } + + /* Load b.apCell[] with pointers to all cells in pOld. If pOld + ** contains overflow cells, include them in the b.apCell[] array + ** in the correct spot. + ** + ** Note that when there are multiple overflow cells, it is always the + ** case that they are sequential and adjacent. This invariant arises + ** because multiple overflows can only occurs when inserting divider + ** cells into a parent on a prior balance, and divider cells are always + ** adjacent and are inserted in order. There is an assert() tagged + ** with "NOTE 1" in the overflow cell insertion loop to prove this + ** invariant. + ** + ** This must be done in advance. Once the balance starts, the cell + ** offset section of the btree page will be overwritten and we will no + ** long be able to find the cells if a pointer to each cell is not saved + ** first. + */ + memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); if( pOld->nOverflow>0 ){ + limit = pOld->aiOvfl[0]; for(j=0; j<limit; j++){ - assert( nCell<nMaxCells ); - apCell[nCell] = findOverflowCell(pOld, j); - szCell[nCell] = cellSizePtr(pOld, apCell[nCell]); - nCell++; + b.apCell[b.nCell] = aData + (maskPage & get2byteAligned(piCell)); + piCell += 2; + b.nCell++; } - }else{ - u8 *aData = pOld->aData; - u16 maskPage = pOld->maskPage; - u16 cellOffset = pOld->cellOffset; - for(j=0; j<limit; j++){ - assert( nCell<nMaxCells ); - apCell[nCell] = findCellv2(aData, maskPage, cellOffset, j); - szCell[nCell] = cellSizePtr(pOld, apCell[nCell]); - nCell++; + for(k=0; k<pOld->nOverflow; k++){ + assert( k==0 || pOld->aiOvfl[k-1]+1==pOld->aiOvfl[k] );/* NOTE 1 */ + b.apCell[b.nCell] = pOld->apOvfl[k]; + b.nCell++; } - } - cntOld[i] = nCell; + } + piEnd = aData + pOld->cellOffset + 2*pOld->nCell; + while( piCell<piEnd ){ + assert( b.nCell<nMaxCells ); + b.apCell[b.nCell] = aData + (maskPage & get2byteAligned(piCell)); + piCell += 2; + b.nCell++; + } + + cntOld[i] = b.nCell; if( i<nOld-1 && !leafData){ u16 sz = (u16)szNew[i]; u8 *pTemp; - assert( nCell<nMaxCells ); - szCell[nCell] = sz; + assert( b.nCell<nMaxCells ); + b.szCell[b.nCell] = sz; pTemp = &aSpace1[iSpace1]; iSpace1 += sz; assert( sz<=pBt->maxLocal+23 ); assert( iSpace1 <= (int)pBt->pageSize ); memcpy(pTemp, apDiv[i], sz); - apCell[nCell] = pTemp+leafCorrection; + b.apCell[b.nCell] = pTemp+leafCorrection; assert( leafCorrection==0 || leafCorrection==4 ); - szCell[nCell] = szCell[nCell] - leafCorrection; + b.szCell[b.nCell] = b.szCell[b.nCell] - leafCorrection; if( !pOld->leaf ){ assert( leafCorrection==0 ); assert( pOld->hdrOffset==0 ); /* The right pointer of the child page pOld becomes the left ** pointer of the divider cell */ - memcpy(apCell[nCell], &pOld->aData[8], 4); + memcpy(b.apCell[b.nCell], &pOld->aData[8], 4); }else{ assert( leafCorrection==4 ); - if( szCell[nCell]<4 ){ + while( b.szCell[b.nCell]<4 ){ /* Do not allow any cells smaller than 4 bytes. If a smaller cell ** does exist, pad it with 0x00 bytes. */ - assert( szCell[nCell]==3 ); - assert( apCell[nCell]==&aSpace1[iSpace1-3] ); + assert( b.szCell[b.nCell]==3 || CORRUPT_DB ); + assert( b.apCell[b.nCell]==&aSpace1[iSpace1-3] || CORRUPT_DB ); aSpace1[iSpace1++] = 0x00; - szCell[nCell] = 4; + b.szCell[b.nCell]++; } } - nCell++; + b.nCell++; } } /* - ** Figure out the number of pages needed to hold all nCell cells. + ** Figure out the number of pages needed to hold all b.nCell cells. ** Store this number in "k". Also compute szNew[] which is the total ** size of all cells on the i-th page and cntNew[] which is the index - ** in apCell[] of the cell that divides page i from page i+1. - ** cntNew[k] should equal nCell. + ** in b.apCell[] of the cell that divides page i from page i+1. + ** cntNew[k] should equal b.nCell. ** ** Values computed by this block: ** ** k: The total number of sibling pages ** szNew[i]: Spaced used on the i-th sibling page. - ** cntNew[i]: Index in apCell[] and szCell[] for the first cell to + ** cntNew[i]: Index in b.apCell[] and b.szCell[] for the first cell to ** the right of the i-th sibling page. ** usableSpace: Number of bytes of space available on each sibling. ** */ usableSpace = pBt->usableSize - 12 + leafCorrection; - for(subtotal=k=i=0; i<nCell; i++){ - assert( i<nMaxCells ); - subtotal += szCell[i] + 2; - if( subtotal > usableSpace ){ - szNew[k] = subtotal - szCell[i] - 2; - cntNew[k] = i; - if( leafData ){ i--; } - subtotal = 0; - k++; - if( k>NB+1 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } + for(i=0; i<nOld; i++){ + MemPage *p = apOld[i]; + szNew[i] = usableSpace - p->nFree; + for(j=0; j<p->nOverflow; j++){ + szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); + } + cntNew[i] = cntOld[i]; + } + k = nOld; + for(i=0; i<k; i++){ + int sz; + while( szNew[i]>usableSpace ){ + if( i+1>=k ){ + k = i+2; + if( k>NB+2 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } + szNew[k-1] = 0; + cntNew[k-1] = b.nCell; + } + sz = 2 + cachedCellSize(&b, cntNew[i]-1); + szNew[i] -= sz; + if( !leafData ){ + if( cntNew[i]<b.nCell ){ + sz = 2 + cachedCellSize(&b, cntNew[i]); + }else{ + sz = 0; + } + } + szNew[i+1] += sz; + cntNew[i]--; + } + while( cntNew[i]<b.nCell ){ + sz = 2 + cachedCellSize(&b, cntNew[i]); + if( szNew[i]+sz>usableSpace ) break; + szNew[i] += sz; + cntNew[i]++; + if( !leafData ){ + if( cntNew[i]<b.nCell ){ + sz = 2 + cachedCellSize(&b, cntNew[i]); + }else{ + sz = 0; + } + } + szNew[i+1] -= sz; + } + if( cntNew[i]>=b.nCell ){ + k = i+1; + }else if( cntNew[i] <= (i>0 ? cntNew[i-1] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; } } - szNew[k] = subtotal; - cntNew[k] = nCell; - k++; /* ** The packing computed by the previous block is biased toward the siblings @@ -59564,19 +69610,27 @@ static int balance_nonroot( r = cntNew[i-1] - 1; d = r + 1 - leafData; - assert( d<nMaxCells ); - assert( r<nMaxCells ); - while( szRight==0 - || (!bBulk && szRight+szCell[d]+2<=szLeft-(szCell[r]+2)) - ){ - szRight += szCell[d] + 2; - szLeft -= szCell[r] + 2; - cntNew[i-1]--; - r = cntNew[i-1] - 1; - d = r + 1 - leafData; - } + (void)cachedCellSize(&b, d); + do{ + assert( d<nMaxCells ); + assert( r<nMaxCells ); + (void)cachedCellSize(&b, r); + if( szRight!=0 + && (bBulk || szRight+b.szCell[d]+2 > szLeft-(b.szCell[r]+(i==k-1?0:2)))){ + break; + } + szRight += b.szCell[d] + 2; + szLeft -= b.szCell[r] + 2; + cntNew[i-1] = r; + r--; + d--; + }while( r>=0 ); szNew[i] = szRight; szNew[i-1] = szLeft; + if( cntNew[i-1] <= (i>1 ? cntNew[i-2] : 0) ){ + rc = SQLITE_CORRUPT_BKPT; + goto balance_cleanup; + } } /* Sanity check: For a non-corrupt database file one of the follwing @@ -59596,10 +69650,6 @@ static int balance_nonroot( /* ** Allocate k new pages. Reuse old pages where possible. */ - if( apOld[0]->pgno<=1 ){ - rc = SQLITE_CORRUPT_BKPT; - goto balance_cleanup; - } pageFlags = apOld[0]->aData[0]; for(i=0; i<k; i++){ MemPage *pNew; @@ -59616,7 +69666,7 @@ static int balance_nonroot( zeroPage(pNew, pageFlags); apNew[i] = pNew; nNew++; - cntOld[i] = nCell; + cntOld[i] = b.nCell; /* Set the pointer-map entry for the new sibling page. */ if( ISAUTOVACUUM ){ @@ -59721,8 +69771,8 @@ static int balance_nonroot( int iNew = 0; int iOld = 0; - for(i=0; i<nCell; i++){ - u8 *pCell = apCell[i]; + for(i=0; i<b.nCell; i++){ + u8 *pCell = b.apCell[i]; if( i==cntOldNext ){ MemPage *pOld = (++iOld)<nNew ? apNew[iOld] : apOld[iOld]; cntOldNext += pOld->nCell + pOld->nOverflow + !leafData; @@ -59741,15 +69791,15 @@ static int balance_nonroot( ** overflow cell), we can skip updating the pointer map entries. */ if( iOld>=nNew || pNew->pgno!=aPgno[iOld] - || pCell<aOld - || pCell>=&aOld[usableSize] + || !SQLITE_WITHIN(pCell,aOld,&aOld[usableSize]) ){ if( !leafCorrection ){ ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); } - if( szCell[i]>pNew->minLocal ){ + if( cachedCellSize(&b,i)>pNew->minLocal ){ ptrmapPutOvflPtr(pNew, pCell, &rc); } + if( rc ) goto balance_cleanup; } } } @@ -59763,20 +69813,21 @@ static int balance_nonroot( j = cntNew[i]; assert( j<nMaxCells ); - pCell = apCell[j]; - sz = szCell[j] + leafCorrection; + assert( b.apCell[j]!=0 ); + pCell = b.apCell[j]; + sz = b.szCell[j] + leafCorrection; pTemp = &aOvflSpace[iOvflSpace]; if( !pNew->leaf ){ memcpy(&pNew->aData[8], pCell, 4); }else if( leafData ){ /* If the tree is a leaf-data tree, and the siblings are leaves, - ** then there is no divider cell in apCell[]. Instead, the divider + ** then there is no divider cell in b.apCell[]. Instead, the divider ** cell consists of the integer key for the right-most cell of ** the sibling-page assembled above only. */ CellInfo info; j--; - btreeParseCellPtr(pNew, apCell[j], &info); + pNew->xParseCell(pNew, b.apCell[j], &info); pCell = pTemp; sz = 4 + putVarint(&pCell[4], info.nKey); pTemp = 0; @@ -59789,13 +69840,13 @@ static int balance_nonroot( ** any cell). But it is important to pass the correct size to ** insertCell(), so reparse the cell now. ** - ** Note that this can never happen in an SQLite data file, as all - ** cells are at least 4 bytes. It only happens in b-trees used - ** to evaluate "IN (SELECT ...)" and similar clauses. + ** This can only happen for b-trees used to evaluate "IN (SELECT ...)" + ** and WITHOUT ROWID tables with exactly one column which is the + ** primary key. */ - if( szCell[j]==4 ){ + if( b.szCell[j]==4 ){ assert(leafCorrection==4); - sz = cellSizePtr(pParent, pCell); + sz = pParent->xCellSize(pParent, pCell); } } iOvflSpace += sz; @@ -59851,12 +69902,13 @@ static int balance_nonroot( iNew = iOld = 0; nNewCell = cntNew[0]; }else{ - iOld = iPg<nOld ? (cntOld[iPg-1] + !leafData) : nCell; + iOld = iPg<nOld ? (cntOld[iPg-1] + !leafData) : b.nCell; iNew = cntNew[iPg-1] + !leafData; nNewCell = cntNew[iPg] - iNew; } - editPage(apNew[iPg], iOld, iNew, nNewCell, apCell, szCell); + rc = editPage(apNew[iPg], iOld, iNew, nNewCell, &b); + if( rc ) goto balance_cleanup; abDone[iPg]++; apNew[iPg]->nFree = usableSpace-szNew[iPg]; assert( apNew[iPg]->nOverflow==0 ); @@ -59886,8 +69938,8 @@ static int balance_nonroot( ** by smaller than the child due to the database header, and so all the ** free space needs to be up front. */ - assert( nNew==1 ); - rc = defragmentPage(apNew[0]); + assert( nNew==1 || CORRUPT_DB ); + rc = defragmentPage(apNew[0], -1); testcase( rc!=SQLITE_OK ); assert( apNew[0]->nFree == (get2byte(&apNew[0]->aData[5])-apNew[0]->cellOffset-apNew[0]->nCell*2) @@ -59907,7 +69959,7 @@ static int balance_nonroot( assert( pParent->isInit ); TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n", - nOld, nNew, nCell)); + nOld, nNew, b.nCell)); /* Free any old pages that were not reused as new pages. */ @@ -59930,7 +69982,7 @@ static int balance_nonroot( ** Cleanup before returning. */ balance_cleanup: - sqlite3ScratchFree(apCell); + sqlite3StackFree(0, b.apCell); for(i=0; i<nOld; i++){ releasePage(apOld[i]); } @@ -59940,9 +69992,6 @@ balance_cleanup: return rc; } -#if defined(_MSC_VER) && _MSC_VER >= 1700 && defined(_M_ARM) -#pragma optimize("", on) -#endif /* @@ -60027,12 +70076,12 @@ static int balance(BtCursor *pCur){ u8 aBalanceQuickSpace[13]; u8 *pFree = 0; - TESTONLY( int balance_quick_called = 0 ); - TESTONLY( int balance_deeper_called = 0 ); + VVA_ONLY( int balance_quick_called = 0 ); + VVA_ONLY( int balance_deeper_called = 0 ); do { int iPage = pCur->iPage; - MemPage *pPage = pCur->apPage[iPage]; + MemPage *pPage = pCur->pPage; if( iPage==0 ){ if( pPage->nOverflow ){ @@ -60041,13 +70090,16 @@ static int balance(BtCursor *pCur){ ** and copy the current contents of the root-page to it. The ** next iteration of the do-loop will balance the child page. */ - assert( (balance_deeper_called++)==0 ); + assert( balance_deeper_called==0 ); + VVA_ONLY( balance_deeper_called++ ); rc = balance_deeper(pPage, &pCur->apPage[1]); if( rc==SQLITE_OK ){ pCur->iPage = 1; + pCur->ix = 0; pCur->aiIdx[0] = 0; - pCur->aiIdx[1] = 0; - assert( pCur->apPage[1]->nOverflow ); + pCur->apPage[0] = pPage; + pCur->pPage = pCur->apPage[1]; + assert( pCur->pPage->nOverflow ); } }else{ break; @@ -60080,7 +70132,8 @@ static int balance(BtCursor *pCur){ ** function. If this were not verified, a subtle bug involving reuse ** of the aBalanceQuickSpace[] might sneak in. */ - assert( (balance_quick_called++)==0 ); + assert( balance_quick_called==0 ); + VVA_ONLY( balance_quick_called++ ); rc = balance_quick(pParent, pPage, aBalanceQuickSpace); }else #endif @@ -60103,7 +70156,8 @@ static int balance(BtCursor *pCur){ ** pSpace buffer passed to the latter call to balance_nonroot(). */ u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize); - rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, pCur->hints); + rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1, + pCur->hints&BTREE_BULKLOAD); if( pFree ){ /* If pFree is not NULL, it points to the pSpace buffer used ** by a previous call to balance_nonroot(). Its contents are @@ -60124,6 +70178,8 @@ static int balance(BtCursor *pCur){ /* The next iteration of the do-loop balances the parent page. */ releasePage(pPage); pCur->iPage--; + assert( pCur->iPage>=0 ); + pCur->pPage = pCur->apPage[pCur->iPage]; } }while( rc==SQLITE_OK ); @@ -60133,35 +70189,129 @@ static int balance(BtCursor *pCur){ return rc; } +/* Overwrite content from pX into pDest. Only do the write if the +** content is different from what is already there. +*/ +static int btreeOverwriteContent( + MemPage *pPage, /* MemPage on which writing will occur */ + u8 *pDest, /* Pointer to the place to start writing */ + const BtreePayload *pX, /* Source of data to write */ + int iOffset, /* Offset of first byte to write */ + int iAmt /* Number of bytes to be written */ +){ + int nData = pX->nData - iOffset; + if( nData<=0 ){ + /* Overwritting with zeros */ + int i; + for(i=0; i<iAmt && pDest[i]==0; i++){} + if( i<iAmt ){ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + memset(pDest + i, 0, iAmt - i); + } + }else{ + if( nData<iAmt ){ + /* Mixed read data and zeros at the end. Make a recursive call + ** to write the zeros then fall through to write the real data */ + int rc = btreeOverwriteContent(pPage, pDest+nData, pX, iOffset+nData, + iAmt-nData); + if( rc ) return rc; + iAmt = nData; + } + if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){ + int rc = sqlite3PagerWrite(pPage->pDbPage); + if( rc ) return rc; + memcpy(pDest, ((u8*)pX->pData) + iOffset, iAmt); + } + } + return SQLITE_OK; +} /* -** Insert a new record into the BTree. The key is given by (pKey,nKey) -** and the data is given by (pData,nData). The cursor is used only to -** define what table the record should be inserted into. The cursor -** is left pointing at a random location. +** Overwrite the cell that cursor pCur is pointing to with fresh content +** contained in pX. +*/ +static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ + int iOffset; /* Next byte of pX->pData to write */ + int nTotal = pX->nData + pX->nZero; /* Total bytes of to write */ + int rc; /* Return code */ + MemPage *pPage = pCur->pPage; /* Page being written */ + BtShared *pBt; /* Btree */ + Pgno ovflPgno; /* Next overflow page to write */ + u32 ovflPageSize; /* Size to write on overflow page */ + + if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd ){ + return SQLITE_CORRUPT_BKPT; + } + /* Overwrite the local portion first */ + rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX, + 0, pCur->info.nLocal); + if( rc ) return rc; + if( pCur->info.nLocal==nTotal ) return SQLITE_OK; + + /* Now overwrite the overflow pages */ + iOffset = pCur->info.nLocal; + assert( nTotal>=0 ); + assert( iOffset>=0 ); + ovflPgno = get4byte(pCur->info.pPayload + iOffset); + pBt = pPage->pBt; + ovflPageSize = pBt->usableSize - 4; + do{ + rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); + if( rc ) return rc; + if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + if( iOffset+ovflPageSize<(u32)nTotal ){ + ovflPgno = get4byte(pPage->aData); + }else{ + ovflPageSize = nTotal - iOffset; + } + rc = btreeOverwriteContent(pPage, pPage->aData+4, pX, + iOffset, ovflPageSize); + } + sqlite3PagerUnref(pPage->pDbPage); + if( rc ) return rc; + iOffset += ovflPageSize; + }while( iOffset<nTotal ); + return SQLITE_OK; +} + + +/* +** Insert a new record into the BTree. The content of the new record +** is described by the pX object. The pCur cursor is used only to +** define what table the record should be inserted into, and is left +** pointing at a random location. ** -** For an INTKEY table, only the nKey value of the key is used. pKey is -** ignored. For a ZERODATA table, the pData and nData are both ignored. +** For a table btree (used for rowid tables), only the pX.nKey value of +** the key is used. The pX.pKey value must be NULL. The pX.nKey is the +** rowid or INTEGER PRIMARY KEY of the row. The pX.nData,pData,nZero fields +** hold the content of the row. +** +** For an index btree (used for indexes and WITHOUT ROWID tables), the +** key is an arbitrary byte sequence stored in pX.pKey,nKey. The +** pX.pData,nData,nZero fields must be zero. ** ** If the seekResult parameter is non-zero, then a successful call to -** MovetoUnpacked() to seek cursor pCur to (pKey, nKey) has already -** been performed. seekResult is the search result returned (a negative -** number if pCur points at an entry that is smaller than (pKey, nKey), or -** a positive value if pCur points at an entry that is larger than -** (pKey, nKey)). +** MovetoUnpacked() to seek cursor pCur to (pKey,nKey) has already +** been performed. In other words, if seekResult!=0 then the cursor +** is currently pointing to a cell that will be adjacent to the cell +** to be inserted. If seekResult<0 then pCur points to a cell that is +** smaller then (pKey,nKey). If seekResult>0 then pCur points to a cell +** that is larger than (pKey,nKey). ** -** If the seekResult parameter is non-zero, then the caller guarantees that -** cursor pCur is pointing at the existing copy of a row that is to be -** overwritten. If the seekResult parameter is 0, then cursor pCur may -** point to any entry or to no entry at all and so this function has to seek -** the cursor before the new key can be inserted. +** If seekResult==0, that means pCur is pointing at some unknown location. +** In that case, this routine must seek the cursor to the correct insertion +** point for (pKey,nKey) before doing the insertion. For index btrees, +** if pX->nMem is non-zero, then pX->aMem contains pointers to the unpacked +** key values and pX->aMem can be used instead of pX->pKey to avoid having +** to decode the key. */ SQLITE_PRIVATE int sqlite3BtreeInsert( BtCursor *pCur, /* Insert data into the table of this cursor */ - const void *pKey, i64 nKey, /* The key of the new record */ - const void *pData, int nData, /* The data of the new record */ - int nZero, /* Number of extra 0 bytes to append to data */ - int appendBias, /* True if this is likely an append */ + const BtreePayload *pX, /* Content of the row to be inserted */ + int flags, /* True if this is likely an append */ int seekResult /* Result of prior MovetoUnpacked() call */ ){ int rc; @@ -60174,12 +70324,14 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( unsigned char *oldCell; unsigned char *newCell = 0; + assert( (flags & (BTREE_SAVEPOSITION|BTREE_APPEND))==flags ); + if( pCur->eState==CURSOR_FAULT ){ assert( pCur->skipNext!=SQLITE_OK ); return pCur->skipNext; } - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( (pCur->curFlags & BTCF_WriteFlag)!=0 && pBt->inTransaction==TRANS_WRITE && (pBt->btsFlags & BTS_READ_ONLY)==0 ); @@ -60190,7 +70342,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** keys with no associated data. If the cursor was opened expecting an ** intkey table, the caller should be inserting integer keys with a ** blob of associated data. */ - assert( (pKey==0)==(pCur->pKeyInfo==0) ); + assert( (pX->pKey==0)==(pCur->pKeyInfo==0) ); /* Save the positions of any other cursors open on this table. ** @@ -60203,46 +70355,118 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** doing any work. To avoid thwarting these optimizations, it is important ** not to clear the cursor here. */ - rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); - if( rc ) return rc; - - if( pCur->pKeyInfo==0 ){ - /* If this is an insert into a table b-tree, invalidate any incrblob - ** cursors open on the row being replaced */ - invalidateIncrblobCursors(p, nKey, 0); - - /* If the cursor is currently on the last row and we are appending a - ** new row onto the end, set the "loc" to avoid an unnecessary btreeMoveto() - ** call */ - if( (pCur->curFlags&BTCF_ValidNKey)!=0 && nKey>0 - && pCur->info.nKey==nKey-1 ){ - loc = -1; - } + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; } - if( !loc ){ - rc = btreeMoveto(pCur, pKey, nKey, appendBias, &loc); - if( rc ) return rc; + if( pCur->pKeyInfo==0 ){ + assert( pX->pKey==0 ); + /* If this is an insert into a table b-tree, invalidate any incrblob + ** cursors open on the row being replaced */ + invalidateIncrblobCursors(p, pCur->pgnoRoot, pX->nKey, 0); + + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + ** to a row with the same key as the new entry being inserted. + */ +#ifdef SQLITE_DEBUG + if( flags & BTREE_SAVEPOSITION ){ + assert( pCur->curFlags & BTCF_ValidNKey ); + assert( pX->nKey==pCur->info.nKey ); + assert( pCur->info.nSize!=0 ); + assert( loc==0 ); + } +#endif + + /* On the other hand, BTREE_SAVEPOSITION==0 does not imply + ** that the cursor is not pointing to a row to be overwritten. + ** So do a complete check. + */ + if( (pCur->curFlags&BTCF_ValidNKey)!=0 && pX->nKey==pCur->info.nKey ){ + /* The cursor is pointing to the entry that is to be + ** overwritten */ + assert( pX->nData>=0 && pX->nZero>=0 ); + if( pCur->info.nSize!=0 + && pCur->info.nPayload==(u32)pX->nData+pX->nZero + ){ + /* New entry is the same size as the old. Do an overwrite */ + return btreeOverwriteCell(pCur, pX); + } + assert( loc==0 ); + }else if( loc==0 ){ + /* The cursor is *not* pointing to the cell to be overwritten, nor + ** to an adjacent cell. Move the cursor so that it is pointing either + ** to the cell to be overwritten or an adjacent cell. + */ + rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, flags!=0, &loc); + if( rc ) return rc; + } + }else{ + /* This is an index or a WITHOUT ROWID table */ + + /* If BTREE_SAVEPOSITION is set, the cursor must already be pointing + ** to a row with the same key as the new entry being inserted. + */ + assert( (flags & BTREE_SAVEPOSITION)==0 || loc==0 ); + + /* If the cursor is not already pointing either to the cell to be + ** overwritten, or if a new cell is being inserted, if the cursor is + ** not pointing to an immediately adjacent cell, then move the cursor + ** so that it does. + */ + if( loc==0 && (flags & BTREE_SAVEPOSITION)==0 ){ + if( pX->nMem ){ + UnpackedRecord r; + r.pKeyInfo = pCur->pKeyInfo; + r.aMem = pX->aMem; + r.nField = pX->nMem; + r.default_rc = 0; + r.errCode = 0; + r.r1 = 0; + r.r2 = 0; + r.eqSeen = 0; + rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc); + }else{ + rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc); + } + if( rc ) return rc; + } + + /* If the cursor is currently pointing to an entry to be overwritten + ** and the new content is the same as as the old, then use the + ** overwrite optimization. + */ + if( loc==0 ){ + getCellInfo(pCur); + if( pCur->info.nKey==pX->nKey ){ + BtreePayload x2; + x2.pData = pX->pKey; + x2.nData = pX->nKey; + x2.nZero = 0; + return btreeOverwriteCell(pCur, &x2); + } + } + } assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) ); - pPage = pCur->apPage[pCur->iPage]; - assert( pPage->intKey || nKey>=0 ); + pPage = pCur->pPage; + assert( pPage->intKey || pX->nKey>=0 ); assert( pPage->leaf || !pPage->intKey ); TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", - pCur->pgnoRoot, nKey, nData, pPage->pgno, + pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, loc==0 ? "overwrite" : "new entry")); assert( pPage->isInit ); newCell = pBt->pTmpSpace; assert( newCell!=0 ); - rc = fillInCell(pPage, newCell, pKey, nKey, pData, nData, nZero, &szNew); + rc = fillInCell(pPage, newCell, pX, &szNew); if( rc ) goto end_insert; - assert( szNew==cellSizePtr(pPage, newCell) ); + assert( szNew==pPage->xCellSize(pPage, newCell) ); assert( szNew <= MX_CELL_SIZE(pBt) ); - idx = pCur->aiIdx[pCur->iPage]; + idx = pCur->ix; if( loc==0 ){ - u16 szOld; + CellInfo info; assert( idx<pPage->nCell ); rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ){ @@ -60252,16 +70476,35 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( if( !pPage->leaf ){ memcpy(newCell, oldCell, 4); } - rc = clearCell(pPage, oldCell, &szOld); - dropCell(pPage, idx, szOld, &rc); + rc = clearCell(pPage, oldCell, &info); + if( info.nSize==szNew && info.nLocal==info.nPayload + && (!ISAUTOVACUUM || szNew<pPage->minLocal) + ){ + /* Overwrite the old cell with the new if they are the same size. + ** We could also try to do this if the old cell is smaller, then add + ** the leftover space to the free list. But experiments show that + ** doing that is no faster then skipping this optimization and just + ** calling dropCell() and insertCell(). + ** + ** This optimization cannot be used on an autovacuum database if the + ** new entry uses overflow pages, as the insertCell() call below is + ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ + assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ + if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; + memcpy(oldCell, newCell, szNew); + return SQLITE_OK; + } + dropCell(pPage, idx, info.nSize, &rc); if( rc ) goto end_insert; }else if( loc<0 && pPage->nCell>0 ){ assert( pPage->leaf ); - idx = ++pCur->aiIdx[pCur->iPage]; + idx = ++pCur->ix; + pCur->curFlags &= ~BTCF_ValidNKey; }else{ assert( pPage->leaf ); } insertCell(pPage, idx, newCell, szNew, 0, 0, &rc); + assert( pPage->nOverflow==0 || rc==SQLITE_OK ); assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 ); /* If no error has occurred and pPage has an overflow cell, call balance() @@ -60285,7 +70528,8 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** row without seeking the cursor. This can be a big performance boost. */ pCur->info.nSize = 0; - if( rc==SQLITE_OK && pPage->nOverflow ){ + if( pPage->nOverflow ){ + assert( rc==SQLITE_OK ); pCur->curFlags &= ~(BTCF_ValidNKey); rc = balance(pCur); @@ -60293,20 +70537,47 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( ** fails. Internal data structure corruption will result otherwise. ** Also, set the cursor state to invalid. This stops saveCursorPosition() ** from trying to save the current position of the cursor. */ - pCur->apPage[pCur->iPage]->nOverflow = 0; + pCur->pPage->nOverflow = 0; pCur->eState = CURSOR_INVALID; + if( (flags & BTREE_SAVEPOSITION) && rc==SQLITE_OK ){ + btreeReleaseAllCursorPages(pCur); + if( pCur->pKeyInfo ){ + assert( pCur->pKey==0 ); + pCur->pKey = sqlite3Malloc( pX->nKey ); + if( pCur->pKey==0 ){ + rc = SQLITE_NOMEM; + }else{ + memcpy(pCur->pKey, pX->pKey, pX->nKey); + } + } + pCur->eState = CURSOR_REQUIRESEEK; + pCur->nKey = pX->nKey; + } } - assert( pCur->apPage[pCur->iPage]->nOverflow==0 ); + assert( pCur->iPage<0 || pCur->pPage->nOverflow==0 ); end_insert: return rc; } /* -** Delete the entry that the cursor is pointing to. The cursor -** is left pointing at an arbitrary location. +** Delete the entry that the cursor is pointing to. +** +** If the BTREE_SAVEPOSITION bit of the flags parameter is zero, then +** the cursor is left pointing at an arbitrary location after the delete. +** But if that bit is set, then the cursor is left in a state such that +** the next call to BtreeNext() or BtreePrev() moves it to the same row +** as it would have been on if the call to BtreeDelete() had been omitted. +** +** The BTREE_AUXDELETE bit of flags indicates that is one of several deletes +** associated with a single table entry and its indexes. Only one of those +** deletes is considered the "primary" delete. The primary delete occurs +** on a cursor that is not a BTREE_FORDELETE cursor. All but one delete +** operation on non-FORDELETE cursors is tagged with the AUXDELETE flag. +** The BTREE_AUXDELETE bit is a hint that is not used by this implementation, +** but which might be used by alternative storage engines. */ -SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){ +SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ Btree *p = pCur->pBtree; BtShared *pBt = p->pBt; int rc; /* Return code */ @@ -60314,26 +70585,47 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){ unsigned char *pCell; /* Pointer to cell to delete */ int iCellIdx; /* Index of cell to delete */ int iCellDepth; /* Depth of node containing pCell */ - u16 szCell; /* Size of the cell being deleted */ + CellInfo info; /* Size of the cell being deleted */ + int bSkipnext = 0; /* Leaf cursor in SKIPNEXT state */ + u8 bPreserve = flags & BTREE_SAVEPOSITION; /* Keep cursor valid */ - assert( cursorHoldsMutex(pCur) ); + assert( cursorOwnsBtShared(pCur) ); assert( pBt->inTransaction==TRANS_WRITE ); assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); assert( pCur->curFlags & BTCF_WriteFlag ); assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); assert( !hasReadConflicts(p, pCur->pgnoRoot) ); - - if( NEVER(pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell) - || NEVER(pCur->eState!=CURSOR_VALID) - ){ - return SQLITE_ERROR; /* Something has gone awry. */ - } + assert( pCur->ix<pCur->pPage->nCell ); + assert( pCur->eState==CURSOR_VALID ); + assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 ); iCellDepth = pCur->iPage; - iCellIdx = pCur->aiIdx[iCellDepth]; - pPage = pCur->apPage[iCellDepth]; + iCellIdx = pCur->ix; + pPage = pCur->pPage; pCell = findCell(pPage, iCellIdx); + /* If the bPreserve flag is set to true, then the cursor position must + ** be preserved following this delete operation. If the current delete + ** will cause a b-tree rebalance, then this is done by saving the cursor + ** key and leaving the cursor in CURSOR_REQUIRESEEK state before + ** returning. + ** + ** Or, if the current delete will not cause a rebalance, then the cursor + ** will be left in CURSOR_SKIPNEXT state pointing to the entry immediately + ** before or after the deleted entry. In this case set bSkipnext to true. */ + if( bPreserve ){ + if( !pPage->leaf + || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + ){ + /* A b-tree rebalance will be required after deleting this entry. + ** Save the cursor key. */ + rc = saveCursorKey(pCur); + if( rc ) return rc; + }else{ + bSkipnext = 1; + } + } + /* If the page containing the entry to delete is not a leaf page, move ** the cursor to the largest entry in the tree that is smaller than ** the entry being deleted. This cell will replace the cell being deleted @@ -60342,29 +70634,31 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){ ** sub-tree headed by the child page of the cell being deleted. This makes ** balancing the tree following the delete operation easier. */ if( !pPage->leaf ){ - int notUsed = 0; - rc = sqlite3BtreePrevious(pCur, ¬Used); + rc = sqlite3BtreePrevious(pCur, 0); + assert( rc!=SQLITE_DONE ); if( rc ) return rc; } /* Save the positions of any other cursors open on this table before - ** making any modifications. Make the page containing the entry to be - ** deleted writable. Then free any overflow pages associated with the - ** entry and finally remove the cell itself from within the page. - */ - rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); - if( rc ) return rc; + ** making any modifications. */ + if( pCur->curFlags & BTCF_Multiple ){ + rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur); + if( rc ) return rc; + } /* If this is a delete operation to remove a row from a table b-tree, ** invalidate any incrblob cursors open on the row being deleted. */ if( pCur->pKeyInfo==0 ){ - invalidateIncrblobCursors(p, pCur->info.nKey, 0); + invalidateIncrblobCursors(p, pCur->pgnoRoot, pCur->info.nKey, 0); } + /* Make the page containing the entry to be deleted writable. Then free any + ** overflow pages associated with the entry and finally remove the cell + ** itself from within the page. */ rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ) return rc; - rc = clearCell(pPage, pCell, &szCell); - dropCell(pPage, iCellIdx, szCell, &rc); + rc = clearCell(pPage, pCell, &info); + dropCell(pPage, iCellIdx, info.nSize, &rc); if( rc ) return rc; /* If the cell deleted was not located on a leaf page, then the cursor @@ -60373,18 +70667,26 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){ ** node. The cell from the leaf node needs to be moved to the internal ** node to replace the deleted cell. */ if( !pPage->leaf ){ - MemPage *pLeaf = pCur->apPage[pCur->iPage]; + MemPage *pLeaf = pCur->pPage; int nCell; - Pgno n = pCur->apPage[iCellDepth+1]->pgno; + Pgno n; unsigned char *pTmp; + if( iCellDepth<pCur->iPage-1 ){ + n = pCur->apPage[iCellDepth+1]->pgno; + }else{ + n = pCur->pPage->pgno; + } pCell = findCell(pLeaf, pLeaf->nCell-1); - nCell = cellSizePtr(pLeaf, pCell); + if( pCell<&pLeaf->aData[4] ) return SQLITE_CORRUPT_BKPT; + nCell = pLeaf->xCellSize(pLeaf, pCell); assert( MX_CELL_SIZE(pBt) >= nCell ); pTmp = pBt->pTmpSpace; assert( pTmp!=0 ); rc = sqlite3PagerWrite(pLeaf->pDbPage); - insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc); + if( rc==SQLITE_OK ){ + insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc); + } dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc); if( rc ) return rc; } @@ -60406,14 +70708,35 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur){ ** well. */ rc = balance(pCur); if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ + releasePageNotNull(pCur->pPage); + pCur->iPage--; while( pCur->iPage>iCellDepth ){ releasePage(pCur->apPage[pCur->iPage--]); } + pCur->pPage = pCur->apPage[pCur->iPage]; rc = balance(pCur); } if( rc==SQLITE_OK ){ - moveToRoot(pCur); + if( bSkipnext ){ + assert( bPreserve && (pCur->iPage==iCellDepth || CORRUPT_DB) ); + assert( pPage==pCur->pPage || CORRUPT_DB ); + assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell ); + pCur->eState = CURSOR_SKIPNEXT; + if( iCellIdx>=pPage->nCell ){ + pCur->skipNext = -1; + pCur->ix = pPage->nCell-1; + }else{ + pCur->skipNext = 1; + } + }else{ + rc = moveToRoot(pCur); + if( bPreserve ){ + btreeReleaseAllCursorPages(pCur); + pCur->eState = CURSOR_REQUIRESEEK; + } + if( rc==SQLITE_EMPTY ) rc = SQLITE_OK; + } } return rc; } @@ -60471,7 +70794,8 @@ static int btreeCreateTable(Btree *p, int *piTable, int createTabFlags){ pgnoRoot==PENDING_BYTE_PAGE(pBt) ){ pgnoRoot++; } - assert( pgnoRoot>=3 ); + assert( pgnoRoot>=3 || CORRUPT_DB ); + testcase( pgnoRoot<3 ); /* Allocate a page. The page that currently resides at pgnoRoot will ** be moved to the allocated page (unless the allocated page happens @@ -60594,15 +70918,19 @@ static int clearDatabasePage( unsigned char *pCell; int i; int hdr; - u16 szCell; + CellInfo info; assert( sqlite3_mutex_held(pBt->mutex) ); if( pgno>btreePagecount(pBt) ){ return SQLITE_CORRUPT_BKPT; } - - rc = getAndInitPage(pBt, pgno, &pPage, 0); + rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); if( rc ) return rc; + if( pPage->bBusy ){ + rc = SQLITE_CORRUPT_BKPT; + goto cleardatabasepage_out; + } + pPage->bBusy = 1; hdr = pPage->hdrOffset; for(i=0; i<pPage->nCell; i++){ pCell = findCell(pPage, i); @@ -60610,14 +70938,15 @@ static int clearDatabasePage( rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange); if( rc ) goto cleardatabasepage_out; } - rc = clearCell(pPage, pCell, &szCell); + rc = clearCell(pPage, pCell, &info); if( rc ) goto cleardatabasepage_out; } if( !pPage->leaf ){ rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); if( rc ) goto cleardatabasepage_out; }else if( pnChange ){ - assert( pPage->intKey ); + assert( pPage->intKey || CORRUPT_DB ); + testcase( !pPage->intKey ); *pnChange += pPage->nCell; } if( freePageFlag ){ @@ -60627,6 +70956,7 @@ static int clearDatabasePage( } cleardatabasepage_out: + pPage->bBusy = 0; releasePage(pPage); return rc; } @@ -60656,7 +70986,7 @@ SQLITE_PRIVATE int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){ /* Invalidate all incrblob cursors open on table iTable (assuming iTable ** is the root of a table b-tree - if it is not, the following call is ** a no-op). */ - invalidateIncrblobCursors(p, 0, 1); + invalidateIncrblobCursors(p, (Pgno)iTable, 0, 1); rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange); } sqlite3BtreeLeave(p); @@ -60699,19 +71029,7 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ assert( sqlite3BtreeHoldsMutex(p) ); assert( p->inTrans==TRANS_WRITE ); - - /* It is illegal to drop a table if any cursors are open on the - ** database. This is because in auto-vacuum mode the backend may - ** need to move another root-page to fill a gap left by the deleted - ** root page. If an open cursor was using this page a problem would - ** occur. - ** - ** This error is caught long before control reaches this point. - */ - if( NEVER(pBt->pCursor) ){ - sqlite3ConnectionBlocked(p->db, pBt->pCursor->pBtree->db); - return SQLITE_LOCKED_SHAREDCACHE; - } + assert( iTable>=2 ); rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); if( rc ) return rc; @@ -60723,76 +71041,67 @@ static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){ *piMoved = 0; - if( iTable>1 ){ #ifdef SQLITE_OMIT_AUTOVACUUM - freePage(pPage, &rc); - releasePage(pPage); + freePage(pPage, &rc); + releasePage(pPage); #else - if( pBt->autoVacuum ){ - Pgno maxRootPgno; - sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno); + if( pBt->autoVacuum ){ + Pgno maxRootPgno; + sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno); - if( iTable==maxRootPgno ){ - /* If the table being dropped is the table with the largest root-page - ** number in the database, put the root page on the free list. - */ - freePage(pPage, &rc); - releasePage(pPage); - if( rc!=SQLITE_OK ){ - return rc; - } - }else{ - /* The table being dropped does not have the largest root-page - ** number in the database. So move the page that does into the - ** gap left by the deleted root-page. - */ - MemPage *pMove; - releasePage(pPage); - rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0); - releasePage(pMove); - if( rc!=SQLITE_OK ){ - return rc; - } - pMove = 0; - rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); - freePage(pMove, &rc); - releasePage(pMove); - if( rc!=SQLITE_OK ){ - return rc; - } - *piMoved = maxRootPgno; - } - - /* Set the new 'max-root-page' value in the database header. This - ** is the old value less one, less one more if that happens to - ** be a root-page number, less one again if that is the - ** PENDING_BYTE_PAGE. + if( iTable==maxRootPgno ){ + /* If the table being dropped is the table with the largest root-page + ** number in the database, put the root page on the free list. */ - maxRootPgno--; - while( maxRootPgno==PENDING_BYTE_PAGE(pBt) - || PTRMAP_ISPAGE(pBt, maxRootPgno) ){ - maxRootPgno--; - } - assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); - - rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); - }else{ freePage(pPage, &rc); releasePage(pPage); + if( rc!=SQLITE_OK ){ + return rc; + } + }else{ + /* The table being dropped does not have the largest root-page + ** number in the database. So move the page that does into the + ** gap left by the deleted root-page. + */ + MemPage *pMove; + releasePage(pPage); + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + if( rc!=SQLITE_OK ){ + return rc; + } + rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + pMove = 0; + rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0); + freePage(pMove, &rc); + releasePage(pMove); + if( rc!=SQLITE_OK ){ + return rc; + } + *piMoved = maxRootPgno; } -#endif - }else{ - /* If sqlite3BtreeDropTable was called on page 1. - ** This really never should happen except in a corrupt - ** database. + + /* Set the new 'max-root-page' value in the database header. This + ** is the old value less one, less one more if that happens to + ** be a root-page number, less one again if that is the + ** PENDING_BYTE_PAGE. */ - zeroPage(pPage, PTF_INTKEY|PTF_LEAF ); + maxRootPgno--; + while( maxRootPgno==PENDING_BYTE_PAGE(pBt) + || PTRMAP_ISPAGE(pBt, maxRootPgno) ){ + maxRootPgno--; + } + assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) ); + + rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno); + }else{ + freePage(pPage, &rc); releasePage(pPage); } +#endif return rc; } SQLITE_PRIVATE int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){ @@ -60891,11 +71200,11 @@ SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ i64 nEntry = 0; /* Value to return in *pnEntry */ int rc; /* Return code */ - if( pCur->pgnoRoot==0 ){ + rc = moveToRoot(pCur); + if( rc==SQLITE_EMPTY ){ *pnEntry = 0; return SQLITE_OK; } - rc = moveToRoot(pCur); /* Unless an error occurs, the following loop runs one iteration for each ** page in the B-Tree structure (not including overflow pages). @@ -60908,7 +71217,7 @@ SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ ** this page contains countable entries. Increment the entry counter ** accordingly. */ - pPage = pCur->apPage[pCur->iPage]; + pPage = pCur->pPage; if( pPage->leaf || !pPage->intKey ){ nEntry += pPage->nCell; } @@ -60931,16 +71240,16 @@ SQLITE_PRIVATE int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ return moveToRoot(pCur); } moveToParent(pCur); - }while ( pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell ); + }while ( pCur->ix>=pCur->pPage->nCell ); - pCur->aiIdx[pCur->iPage]++; - pPage = pCur->apPage[pCur->iPage]; + pCur->ix++; + pPage = pCur->pPage; } /* Descend to the child node of the cell that the cursor currently ** points at. This is the right-child if (iIdx==pPage->nCell). */ - iIdx = pCur->aiIdx[pCur->iPage]; + iIdx = pCur->ix; if( iIdx==pPage->nCell ){ rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); }else{ @@ -60971,21 +71280,19 @@ static void checkAppendMsg( ... ){ va_list ap; - char zBuf[200]; if( !pCheck->mxErr ) return; pCheck->mxErr--; pCheck->nErr++; va_start(ap, zFormat); if( pCheck->errMsg.nChar ){ - sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1); + sqlite3_str_append(&pCheck->errMsg, "\n", 1); } if( pCheck->zPfx ){ - sqlite3_snprintf(sizeof(zBuf), zBuf, pCheck->zPfx, pCheck->v1, pCheck->v2); - sqlite3StrAccumAppendAll(&pCheck->errMsg, zBuf); + sqlite3_str_appendf(&pCheck->errMsg, pCheck->zPfx, pCheck->v1, pCheck->v2); } - sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap); + sqlite3_str_vappendf(&pCheck->errMsg, zFormat, ap); va_end(ap); - if( pCheck->errMsg.accError==STRACCUM_NOMEM ){ + if( pCheck->errMsg.accError==SQLITE_NOMEM ){ pCheck->mallocFailed = 1; } } @@ -61087,7 +71394,7 @@ static void checkList( break; } if( checkRef(pCheck, iPage) ) break; - if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage) ){ + if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage, 0) ){ checkAppendMsg(pCheck, "failed to get page %d", iPage); break; } @@ -61130,10 +71437,65 @@ static void checkList( #endif iPage = get4byte(pOvflData); sqlite3PagerUnref(pOvflPage); + + if( isFreeList && N<(iPage!=0) ){ + checkAppendMsg(pCheck, "free-page count in header is too small"); + } } } #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ +/* +** An implementation of a min-heap. +** +** aHeap[0] is the number of elements on the heap. aHeap[1] is the +** root element. The daughter nodes of aHeap[N] are aHeap[N*2] +** and aHeap[N*2+1]. +** +** The heap property is this: Every node is less than or equal to both +** of its daughter nodes. A consequence of the heap property is that the +** root node aHeap[1] is always the minimum value currently in the heap. +** +** The btreeHeapInsert() routine inserts an unsigned 32-bit number onto +** the heap, preserving the heap property. The btreeHeapPull() routine +** removes the root element from the heap (the minimum value in the heap) +** and then moves other nodes around as necessary to preserve the heap +** property. +** +** This heap is used for cell overlap and coverage testing. Each u32 +** entry represents the span of a cell or freeblock on a btree page. +** The upper 16 bits are the index of the first byte of a range and the +** lower 16 bits are the index of the last byte of that range. +*/ +static void btreeHeapInsert(u32 *aHeap, u32 x){ + u32 j, i = ++aHeap[0]; + aHeap[i] = x; + while( (j = i/2)>0 && aHeap[j]>aHeap[i] ){ + x = aHeap[j]; + aHeap[j] = aHeap[i]; + aHeap[i] = x; + i = j; + } +} +static int btreeHeapPull(u32 *aHeap, u32 *pOut){ + u32 j, i, x; + if( (x = aHeap[0])==0 ) return 0; + *pOut = aHeap[1]; + aHeap[1] = aHeap[x]; + aHeap[x] = 0xffffffff; + aHeap[0]--; + i = 1; + while( (j = i*2)<=aHeap[0] ){ + if( aHeap[j]>aHeap[j+1] ) j++; + if( aHeap[i]<aHeap[j] ) break; + x = aHeap[i]; + aHeap[i] = aHeap[j]; + aHeap[j] = x; + i = j; + } + return 1; +} + #ifndef SQLITE_OMIT_INTEGRITY_CHECK /* ** Do various sanity checks on a single page of a tree. Return @@ -61144,34 +71506,42 @@ static void checkList( ** ** 1. Make sure that cells and freeblocks do not overlap ** but combine to completely cover the page. -** NO 2. Make sure cell keys are in order. -** NO 3. Make sure no key is less than or equal to zLowerBound. -** NO 4. Make sure no key is greater than or equal to zUpperBound. -** 5. Check the integrity of overflow pages. -** 6. Recursively call checkTreePage on all children. -** 7. Verify that the depth of all children is the same. -** 8. Make sure this page is at least 33% full or else it is -** the root of the tree. +** 2. Make sure integer cell keys are in order. +** 3. Check the integrity of overflow pages. +** 4. Recursively call checkTreePage on all children. +** 5. Verify that the depth of all children is the same. */ static int checkTreePage( IntegrityCk *pCheck, /* Context for the sanity check */ int iPage, /* Page number of the page to check */ - i64 *pnParentMinKey, - i64 *pnParentMaxKey + i64 *piMinKey, /* Write minimum integer primary key here */ + i64 maxKey /* Error if integer primary key greater than this */ ){ - MemPage *pPage; - int i, rc, depth, d2, pgno, cnt; - int hdr, cellStart; - int nCell; - u8 *data; - BtShared *pBt; - int usableSize; - char *hit = 0; - i64 nMinKey = 0; - i64 nMaxKey = 0; + MemPage *pPage = 0; /* The page being analyzed */ + int i; /* Loop counter */ + int rc; /* Result code from subroutine call */ + int depth = -1, d2; /* Depth of a subtree */ + int pgno; /* Page number */ + int nFrag; /* Number of fragmented bytes on the page */ + int hdr; /* Offset to the page header */ + int cellStart; /* Offset to the start of the cell pointer array */ + int nCell; /* Number of cells */ + int doCoverageCheck = 1; /* True if cell coverage checking should be done */ + int keyCanBeEqual = 1; /* True if IPK can be equal to maxKey + ** False if IPK must be strictly less than maxKey */ + u8 *data; /* Page content */ + u8 *pCell; /* Cell content */ + u8 *pCellIdx; /* Next element of the cell pointer array */ + BtShared *pBt; /* The BtShared object that owns pPage */ + u32 pc; /* Address of a cell */ + u32 usableSize; /* Usable size of the page */ + u32 contentOffset; /* Offset to the start of the cell content area */ + u32 *heap = 0; /* Min-heap used for checking cell coverage */ + u32 x, prev = 0; /* Next and previous entry on the min-heap */ const char *saved_zPfx = pCheck->zPfx; int saved_v1 = pCheck->v1; int saved_v2 = pCheck->v2; + u8 savedIsInit = 0; /* Check that the page exists */ @@ -61184,54 +71554,96 @@ static int checkTreePage( if( (rc = btreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){ checkAppendMsg(pCheck, "unable to get the page. error code=%d", rc); - depth = -1; goto end_of_check; } /* Clear MemPage.isInit to make sure the corruption detection code in ** btreeInitPage() is executed. */ + savedIsInit = pPage->isInit; pPage->isInit = 0; if( (rc = btreeInitPage(pPage))!=0 ){ assert( rc==SQLITE_CORRUPT ); /* The only possible error from InitPage */ checkAppendMsg(pCheck, "btreeInitPage() returns error code %d", rc); - releasePage(pPage); - depth = -1; goto end_of_check; } + data = pPage->aData; + hdr = pPage->hdrOffset; - /* Check out all the cells. - */ - depth = 0; - for(i=0; i<pPage->nCell && pCheck->mxErr; i++){ - u8 *pCell; - u32 sz; + /* Set up for cell analysis */ + pCheck->zPfx = "On tree page %d cell %d: "; + contentOffset = get2byteNotZero(&data[hdr+5]); + assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */ + + /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the + ** number of cells on the page. */ + nCell = get2byte(&data[hdr+3]); + assert( pPage->nCell==nCell ); + + /* EVIDENCE-OF: R-23882-45353 The cell pointer array of a b-tree page + ** immediately follows the b-tree page header. */ + cellStart = hdr + 12 - 4*pPage->leaf; + assert( pPage->aCellIdx==&data[cellStart] ); + pCellIdx = &data[cellStart + 2*(nCell-1)]; + + if( !pPage->leaf ){ + /* Analyze the right-child page of internal pages */ + pgno = get4byte(&data[hdr+8]); +#ifndef SQLITE_OMIT_AUTOVACUUM + if( pBt->autoVacuum ){ + pCheck->zPfx = "On page %d at right child: "; + checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); + } +#endif + depth = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + }else{ + /* For leaf pages, the coverage check will occur in the same loop + ** as the other cell checks, so initialize the heap. */ + heap = pCheck->heap; + heap[0] = 0; + } + + /* EVIDENCE-OF: R-02776-14802 The cell pointer array consists of K 2-byte + ** integer offsets to the cell contents. */ + for(i=nCell-1; i>=0 && pCheck->mxErr; i--){ CellInfo info; - /* Check payload overflow pages - */ - pCheck->zPfx = "On tree page %d cell %d: "; - pCheck->v1 = iPage; + /* Check cell size */ pCheck->v2 = i; - pCell = findCell(pPage,i); - btreeParseCellPtr(pPage, pCell, &info); - sz = info.nPayload; - /* For intKey pages, check that the keys are in order. - */ - if( pPage->intKey ){ - if( i==0 ){ - nMinKey = nMaxKey = info.nKey; - }else if( info.nKey <= nMaxKey ){ - checkAppendMsg(pCheck, - "Rowid %lld out of order (previous was %lld)", info.nKey, nMaxKey); - } - nMaxKey = info.nKey; + assert( pCellIdx==&data[cellStart + i*2] ); + pc = get2byteAligned(pCellIdx); + pCellIdx -= 2; + if( pc<contentOffset || pc>usableSize-4 ){ + checkAppendMsg(pCheck, "Offset %d out of range %d..%d", + pc, contentOffset, usableSize-4); + doCoverageCheck = 0; + continue; } - if( (sz>info.nLocal) - && (&pCell[info.iOverflow]<=&pPage->aData[pBt->usableSize]) - ){ - int nPage = (sz - info.nLocal + usableSize - 5)/(usableSize - 4); - Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]); + pCell = &data[pc]; + pPage->xParseCell(pPage, pCell, &info); + if( pc+info.nSize>usableSize ){ + checkAppendMsg(pCheck, "Extends off end of page"); + doCoverageCheck = 0; + continue; + } + + /* Check for integer primary key out of range */ + if( pPage->intKey ){ + if( keyCanBeEqual ? (info.nKey > maxKey) : (info.nKey >= maxKey) ){ + checkAppendMsg(pCheck, "Rowid %lld out of order", info.nKey); + } + maxKey = info.nKey; + keyCanBeEqual = 0; /* Only the first key on the page may ==maxKey */ + } + + /* Check the content overflow list */ + if( info.nPayload>info.nLocal ){ + int nPage; /* Number of pages on the overflow chain */ + Pgno pgnoOvfl; /* First page of the overflow chain */ + assert( pc + info.nSize - 4 <= usableSize ); + nPage = (info.nPayload - info.nLocal + usableSize - 5)/(usableSize - 4); + pgnoOvfl = get4byte(&pCell[info.nSize - 4]); #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum ){ checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage); @@ -61240,119 +71652,57 @@ static int checkTreePage( checkList(pCheck, 0, pgnoOvfl, nPage); } - /* Check sanity of left child page. - */ if( !pPage->leaf ){ + /* Check sanity of left child page for internal pages */ pgno = get4byte(pCell); #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum ){ checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); } #endif - d2 = checkTreePage(pCheck, pgno, &nMinKey, i==0?NULL:&nMaxKey); - if( i>0 && d2!=depth ){ + d2 = checkTreePage(pCheck, pgno, &maxKey, maxKey); + keyCanBeEqual = 0; + if( d2!=depth ){ checkAppendMsg(pCheck, "Child page depth differs"); + depth = d2; } - depth = d2; - } - } - - if( !pPage->leaf ){ - pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); - pCheck->zPfx = "On page %d at right child: "; - pCheck->v1 = iPage; -#ifndef SQLITE_OMIT_AUTOVACUUM - if( pBt->autoVacuum ){ - checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage); - } -#endif - checkTreePage(pCheck, pgno, NULL, !pPage->nCell?NULL:&nMaxKey); - } - - /* For intKey leaf pages, check that the min/max keys are in order - ** with any left/parent/right pages. - */ - pCheck->zPfx = "Page %d: "; - pCheck->v1 = iPage; - if( pPage->leaf && pPage->intKey ){ - /* if we are a left child page */ - if( pnParentMinKey ){ - /* if we are the left most child page */ - if( !pnParentMaxKey ){ - if( nMaxKey > *pnParentMinKey ){ - checkAppendMsg(pCheck, - "Rowid %lld out of order (max larger than parent min of %lld)", - nMaxKey, *pnParentMinKey); - } - }else{ - if( nMinKey <= *pnParentMinKey ){ - checkAppendMsg(pCheck, - "Rowid %lld out of order (min less than parent min of %lld)", - nMinKey, *pnParentMinKey); - } - if( nMaxKey > *pnParentMaxKey ){ - checkAppendMsg(pCheck, - "Rowid %lld out of order (max larger than parent max of %lld)", - nMaxKey, *pnParentMaxKey); - } - *pnParentMinKey = nMaxKey; - } - /* else if we're a right child page */ - } else if( pnParentMaxKey ){ - if( nMinKey <= *pnParentMaxKey ){ - checkAppendMsg(pCheck, - "Rowid %lld out of order (min less than parent max of %lld)", - nMinKey, *pnParentMaxKey); - } + }else{ + /* Populate the coverage-checking heap for leaf pages */ + btreeHeapInsert(heap, (pc<<16)|(pc+info.nSize-1)); } } + *piMinKey = maxKey; /* Check for complete coverage of the page */ - data = pPage->aData; - hdr = pPage->hdrOffset; - hit = sqlite3PageMalloc( pBt->pageSize ); pCheck->zPfx = 0; - if( hit==0 ){ - pCheck->mallocFailed = 1; - }else{ - int contentOffset = get2byteNotZero(&data[hdr+5]); - assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */ - memset(hit+contentOffset, 0, usableSize-contentOffset); - memset(hit, 1, contentOffset); - /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the - ** number of cells on the page. */ - nCell = get2byte(&data[hdr+3]); - /* EVIDENCE-OF: R-23882-45353 The cell pointer array of a b-tree page - ** immediately follows the b-tree page header. */ - cellStart = hdr + 12 - 4*pPage->leaf; - /* EVIDENCE-OF: R-02776-14802 The cell pointer array consists of K 2-byte - ** integer offsets to the cell contents. */ - for(i=0; i<nCell; i++){ - int pc = get2byte(&data[cellStart+i*2]); - u32 size = 65536; - int j; - if( pc<=usableSize-4 ){ - size = cellSizePtr(pPage, &data[pc]); - } - if( (int)(pc+size-1)>=usableSize ){ - pCheck->zPfx = 0; - checkAppendMsg(pCheck, - "Corruption detected in cell %d on page %d",i,iPage); - }else{ - for(j=pc+size-1; j>=pc; j--) hit[j]++; + if( doCoverageCheck && pCheck->mxErr>0 ){ + /* For leaf pages, the min-heap has already been initialized and the + ** cells have already been inserted. But for internal pages, that has + ** not yet been done, so do it now */ + if( !pPage->leaf ){ + heap = pCheck->heap; + heap[0] = 0; + for(i=nCell-1; i>=0; i--){ + u32 size; + pc = get2byteAligned(&data[cellStart+i*2]); + size = pPage->xCellSize(pPage, &data[pc]); + btreeHeapInsert(heap, (pc<<16)|(pc+size-1)); } } - /* EVIDENCE-OF: R-20690-50594 The second field of the b-tree page header + /* Add the freeblocks to the min-heap + ** + ** EVIDENCE-OF: R-20690-50594 The second field of the b-tree page header ** is the offset of the first freeblock, or zero if there are no - ** freeblocks on the page. */ + ** freeblocks on the page. + */ i = get2byte(&data[hdr+1]); while( i>0 ){ int size, j; - assert( i<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( (u32)i<=usableSize-4 ); /* Enforced by btreeInitPage() */ size = get2byte(&data[i+2]); - assert( i+size<=usableSize ); /* Enforced by btreeInitPage() */ - for(j=i+size-1; j>=i; j--) hit[j]++; + assert( (u32)(i+size)<=usableSize ); /* Enforced by btreeInitPage() */ + btreeHeapInsert(heap, (((u32)i)<<16)|(i+size-1)); /* EVIDENCE-OF: R-58208-19414 The first 2 bytes of a freeblock are a ** big-endian integer which is the offset in the b-tree page of the next ** freeblock in the chain, or zero if the freeblock is the last on the @@ -61361,33 +71711,50 @@ static int checkTreePage( /* EVIDENCE-OF: R-06866-39125 Freeblocks are always connected in order of ** increasing offset. */ assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */ - assert( j<=usableSize-4 ); /* Enforced by btreeInitPage() */ + assert( (u32)j<=usableSize-4 ); /* Enforced by btreeInitPage() */ i = j; } - for(i=cnt=0; i<usableSize; i++){ - if( hit[i]==0 ){ - cnt++; - }else if( hit[i]>1 ){ + /* Analyze the min-heap looking for overlap between cells and/or + ** freeblocks, and counting the number of untracked bytes in nFrag. + ** + ** Each min-heap entry is of the form: (start_address<<16)|end_address. + ** There is an implied first entry the covers the page header, the cell + ** pointer index, and the gap between the cell pointer index and the start + ** of cell content. + ** + ** The loop below pulls entries from the min-heap in order and compares + ** the start_address against the previous end_address. If there is an + ** overlap, that means bytes are used multiple times. If there is a gap, + ** that gap is added to the fragmentation count. + */ + nFrag = 0; + prev = contentOffset - 1; /* Implied first min-heap entry */ + while( btreeHeapPull(heap,&x) ){ + if( (prev&0xffff)>=(x>>16) ){ checkAppendMsg(pCheck, - "Multiple uses for byte %d of page %d", i, iPage); + "Multiple uses for byte %u of page %d", x>>16, iPage); break; + }else{ + nFrag += (x>>16) - (prev&0xffff) - 1; + prev = x; } } + nFrag += usableSize - (prev&0xffff) - 1; /* EVIDENCE-OF: R-43263-13491 The total number of bytes in all fragments ** is stored in the fifth field of the b-tree page header. ** EVIDENCE-OF: R-07161-27322 The one-byte integer at offset 7 gives the ** number of fragmented free bytes within the cell content area. */ - if( cnt!=data[hdr+7] ){ + if( heap[0]==0 && nFrag!=data[hdr+7] ){ checkAppendMsg(pCheck, "Fragmentation of %d bytes reported as %d on page %d", - cnt, data[hdr+7], iPage); + nFrag, data[hdr+7], iPage); } } - sqlite3PageFree(hit); - releasePage(pPage); end_of_check: + if( !doCoverageCheck ) pPage->isInit = savedIsInit; + releasePage(pPage); pCheck->zPfx = saved_zPfx; pCheck->v1 = saved_v1; pCheck->v2 = saved_v2; @@ -61417,14 +71784,16 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( int *pnErr /* Write number of errors seen to this variable */ ){ Pgno i; - int nRef; IntegrityCk sCheck; BtShared *pBt = p->pBt; + int savedDbFlags = pBt->db->flags; char zErr[100]; + VVA_ONLY( int nRef ); sqlite3BtreeEnter(p); assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE ); - nRef = sqlite3PagerRefcount(pBt->pPager); + VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) ); + assert( nRef>=0 ); sCheck.pBt = pBt; sCheck.pPager = pBt->pPager; sCheck.nPage = btreePagecount(sCheck.pBt); @@ -61434,22 +71803,27 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( sCheck.zPfx = 0; sCheck.v1 = 0; sCheck.v2 = 0; - *pnErr = 0; + sCheck.aPgRef = 0; + sCheck.heap = 0; + sqlite3StrAccumInit(&sCheck.errMsg, 0, zErr, sizeof(zErr), SQLITE_MAX_LENGTH); + sCheck.errMsg.printfFlags = SQLITE_PRINTF_INTERNAL; if( sCheck.nPage==0 ){ - sqlite3BtreeLeave(p); - return 0; + goto integrity_ck_cleanup; } sCheck.aPgRef = sqlite3MallocZero((sCheck.nPage / 8)+ 1); if( !sCheck.aPgRef ){ - *pnErr = 1; - sqlite3BtreeLeave(p); - return 0; + sCheck.mallocFailed = 1; + goto integrity_ck_cleanup; } + sCheck.heap = (u32*)sqlite3PageMalloc( pBt->pageSize ); + if( sCheck.heap==0 ){ + sCheck.mallocFailed = 1; + goto integrity_ck_cleanup; + } + i = PENDING_BYTE_PAGE(pBt); if( i<=sCheck.nPage ) setPageReferenced(&sCheck, i); - sqlite3StrAccumInit(&sCheck.errMsg, zErr, sizeof(zErr), SQLITE_MAX_LENGTH); - sCheck.errMsg.useMalloc = 2; /* Check the integrity of the freelist */ @@ -61460,17 +71834,19 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( /* Check all the tables. */ + testcase( pBt->db->flags & SQLITE_CellSizeCk ); + pBt->db->flags &= ~SQLITE_CellSizeCk; for(i=0; (int)i<nRoot && sCheck.mxErr; i++){ + i64 notUsed; if( aRoot[i]==0 ) continue; #ifndef SQLITE_OMIT_AUTOVACUUM if( pBt->autoVacuum && aRoot[i]>1 ){ checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0); } #endif - sCheck.zPfx = "List of tree roots: "; - checkTreePage(&sCheck, aRoot[i], NULL, NULL); - sCheck.zPfx = 0; + checkTreePage(&sCheck, aRoot[i], ¬Used, LARGEST_INT64); } + pBt->db->flags = savedDbFlags; /* Make sure every page in the file is referenced */ @@ -61494,28 +71870,20 @@ SQLITE_PRIVATE char *sqlite3BtreeIntegrityCheck( #endif } - /* Make sure this analysis did not leave any unref() pages. - ** This is an internal consistency check; an integrity check - ** of the integrity check. - */ - if( NEVER(nRef != sqlite3PagerRefcount(pBt->pPager)) ){ - checkAppendMsg(&sCheck, - "Outstanding page count goes from %d to %d during this analysis", - nRef, sqlite3PagerRefcount(pBt->pPager) - ); - } - /* Clean up and report errors. */ - sqlite3BtreeLeave(p); +integrity_ck_cleanup: + sqlite3PageFree(sCheck.heap); sqlite3_free(sCheck.aPgRef); if( sCheck.mallocFailed ){ - sqlite3StrAccumReset(&sCheck.errMsg); - *pnErr = sCheck.nErr+1; - return 0; + sqlite3_str_reset(&sCheck.errMsg); + sCheck.nErr++; } *pnErr = sCheck.nErr; - if( sCheck.nErr==0 ) sqlite3StrAccumReset(&sCheck.errMsg); + if( sCheck.nErr==0 ) sqlite3_str_reset(&sCheck.errMsg); + /* Make sure this analysis did not leave any unref() pages. */ + assert( nRef==sqlite3PagerRefcount(pBt->pPager) ); + sqlite3BtreeLeave(p); return sqlite3StrAccumFinish(&sCheck.errMsg); } #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ @@ -61570,7 +71938,7 @@ SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int * if( pBt->inTransaction!=TRANS_NONE ){ rc = SQLITE_LOCKED; }else{ - rc = sqlite3PagerCheckpoint(pBt->pPager, eMode, pnLog, pnCkpt); + rc = sqlite3PagerCheckpoint(pBt->pPager, p->db, eMode, pnLog, pnCkpt); } sqlite3BtreeLeave(p); } @@ -61678,7 +72046,7 @@ SQLITE_PRIVATE int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){ */ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){ int rc; - assert( cursorHoldsMutex(pCsr) ); + assert( cursorOwnsBtShared(pCsr) ); assert( sqlite3_mutex_held(pCsr->pBtree->db->mutex) ); assert( pCsr->curFlags & BTCF_Incrblob ); @@ -61716,7 +72084,7 @@ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void && pCsr->pBt->inTransaction==TRANS_WRITE ); assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) ); assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) ); - assert( pCsr->apPage[pCsr->iPage]->intKey ); + assert( pCsr->pPage->intKey ); return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1); } @@ -61726,6 +72094,7 @@ SQLITE_PRIVATE int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void */ SQLITE_PRIVATE void sqlite3BtreeIncrblobCursor(BtCursor *pCur){ pCur->curFlags |= BTCF_Incrblob; + pCur->pBtree->hasIncrblobCur = 1; } #endif @@ -61766,12 +72135,11 @@ SQLITE_PRIVATE int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){ } /* -** set the mask of hint flags for cursor pCsr. Currently the only valid -** values are 0 and BTREE_BULKLOAD. +** Return true if the cursor has a hint specified. This routine is +** only used from within assert() statements */ -SQLITE_PRIVATE void sqlite3BtreeCursorHints(BtCursor *pCsr, unsigned int mask){ - assert( mask==BTREE_BULKLOAD || mask==0 ); - pCsr->hints = mask; +SQLITE_PRIVATE int sqlite3BtreeCursorHasHint(BtCursor *pCsr, unsigned int mask){ + return (pCsr->hints & mask)!=0; } /* @@ -61786,6 +72154,25 @@ SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *p){ */ SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); } +#if !defined(SQLITE_OMIT_SHARED_CACHE) +/* +** Return true if the Btree passed as the only argument is sharable. +*/ +SQLITE_PRIVATE int sqlite3BtreeSharable(Btree *p){ + return p->sharable; +} + +/* +** Return the number of connections to the BtShared object accessed by +** the Btree handle passed as the only argument. For private caches +** this is always 1. For shared caches it may be 1 or greater. +*/ +SQLITE_PRIVATE int sqlite3BtreeConnectionCount(Btree *p){ + testcase( p->sharable ); + return p->pBt->nRef; +} +#endif + /************** End of btree.c ***********************************************/ /************** Begin file backup.c ******************************************/ /* @@ -61802,6 +72189,8 @@ SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); ** This file contains the implementation of the sqlite3_backup_XXX() ** API functions and the related features. */ +/* #include "sqliteInt.h" */ +/* #include "btreeInt.h" */ /* ** Structure allocated for each backup operation. @@ -61871,22 +72260,16 @@ static Btree *findBtree(sqlite3 *pErrorDb, sqlite3 *pDb, const char *zDb){ int i = sqlite3FindDbName(pDb, zDb); if( i==1 ){ - Parse *pParse; + Parse sParse; int rc = 0; - pParse = sqlite3StackAllocZero(pErrorDb, sizeof(*pParse)); - if( pParse==0 ){ - sqlite3ErrorWithMsg(pErrorDb, SQLITE_NOMEM, "out of memory"); - rc = SQLITE_NOMEM; - }else{ - pParse->db = pDb; - if( sqlite3OpenTempDatabase(pParse) ){ - sqlite3ErrorWithMsg(pErrorDb, pParse->rc, "%s", pParse->zErrMsg); - rc = SQLITE_ERROR; - } - sqlite3DbFree(pErrorDb, pParse->zErrMsg); - sqlite3ParserReset(pParse); - sqlite3StackFree(pErrorDb, pParse); + memset(&sParse, 0, sizeof(sParse)); + sParse.db = pDb; + if( sqlite3OpenTempDatabase(&sParse) ){ + sqlite3ErrorWithMsg(pErrorDb, sParse.rc, "%s", sParse.zErrMsg); + rc = SQLITE_ERROR; } + sqlite3DbFree(pErrorDb, sParse.zErrMsg); + sqlite3ParserReset(&sParse); if( rc ){ return 0; } @@ -61970,7 +72353,7 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( ** sqlite3_backup_finish(). */ p = (sqlite3_backup *)sqlite3MallocZero(sizeof(sqlite3_backup)); if( !p ){ - sqlite3Error(pDestDb, SQLITE_NOMEM); + sqlite3Error(pDestDb, SQLITE_NOMEM_BKPT); } } @@ -61984,7 +72367,6 @@ SQLITE_API sqlite3_backup *sqlite3_backup_init( p->isAttached = 0; if( 0==p->pSrc || 0==p->pDest - || setDestPgsz(p)==SQLITE_NOMEM || checkReadTransaction(pDestDb, p->pDest)!=SQLITE_OK ){ /* One (or both) of the named databases did not exist or an OOM @@ -62035,7 +72417,7 @@ static int backupOnePage( ** guaranteed that the shared-mutex is held by this thread, handle ** p->pSrc may not actually be the owner. */ int nSrcReserve = sqlite3BtreeGetReserveNoMutex(p->pSrc); - int nDestReserve = sqlite3BtreeGetReserve(p->pDest); + int nDestReserve = sqlite3BtreeGetOptimalReserve(p->pDest); #endif int rc = SQLITE_OK; i64 iOff; @@ -62081,7 +72463,7 @@ static int backupOnePage( DbPage *pDestPg = 0; Pgno iDest = (Pgno)(iOff/nDestPgsz)+1; if( iDest==PENDING_BYTE_PAGE(p->pDest->pBt) ) continue; - if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg)) + if( SQLITE_OK==(rc = sqlite3PagerGet(pDestPager, iDest, &pDestPg, 0)) && SQLITE_OK==(rc = sqlite3PagerWrite(pDestPg)) ){ const u8 *zIn = &zSrcData[iOff%nSrcPgsz]; @@ -62172,14 +72554,6 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ rc = SQLITE_OK; } - /* Lock the destination database, if it is not locked already. */ - if( SQLITE_OK==rc && p->bDestLocked==0 - && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2)) - ){ - p->bDestLocked = 1; - sqlite3BtreeGetMeta(p->pDest, BTREE_SCHEMA_VERSION, &p->iDestSchema); - } - /* If there is no open read-transaction on the source database, open ** one now. If a transaction is opened here, then it will be closed ** before this function exits. @@ -62189,6 +72563,24 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ bCloseTrans = 1; } + /* If the destination database has not yet been locked (i.e. if this + ** is the first call to backup_step() for the current backup operation), + ** try to set its page size to the same as the source database. This + ** is especially important on ZipVFS systems, as in that case it is + ** not possible to create a database file that uses one page size by + ** writing to it with another. */ + if( p->bDestLocked==0 && rc==SQLITE_OK && setDestPgsz(p)==SQLITE_NOMEM ){ + rc = SQLITE_NOMEM; + } + + /* Lock the destination database, if it is not locked already. */ + if( SQLITE_OK==rc && p->bDestLocked==0 + && SQLITE_OK==(rc = sqlite3BtreeBeginTrans(p->pDest, 2)) + ){ + p->bDestLocked = 1; + sqlite3BtreeGetMeta(p->pDest, BTREE_SCHEMA_VERSION, &p->iDestSchema); + } + /* Do not allow backup if the destination database is in WAL mode ** and the page sizes are different between source and destination */ pgszSrc = sqlite3BtreeGetPageSize(p->pSrc); @@ -62207,8 +72599,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ const Pgno iSrcPg = p->iNext; /* Source page number */ if( iSrcPg!=PENDING_BYTE_PAGE(p->pSrc->pBt) ){ DbPage *pSrcPg; /* Source page object */ - rc = sqlite3PagerAcquire(pSrcPager, iSrcPg, &pSrcPg, - PAGER_GET_READONLY); + rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg,PAGER_GET_READONLY); if( rc==SQLITE_OK ){ rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg), 0); sqlite3PagerUnref(pSrcPg); @@ -62308,7 +72699,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ for(iPg=nDestTruncate; rc==SQLITE_OK && iPg<=(Pgno)nDstPage; iPg++){ if( iPg!=PENDING_BYTE_PAGE(p->pDest->pBt) ){ DbPage *pPg; - rc = sqlite3PagerGet(pDestPager, iPg, &pPg); + rc = sqlite3PagerGet(pDestPager, iPg, &pPg, 0); if( rc==SQLITE_OK ){ rc = sqlite3PagerWrite(pPg); sqlite3PagerUnref(pPg); @@ -62328,7 +72719,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ ){ PgHdr *pSrcPg = 0; const Pgno iSrcPg = (Pgno)((iOff/pgszSrc)+1); - rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg); + rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg, 0); if( rc==SQLITE_OK ){ u8 *zData = sqlite3PagerGetData(pSrcPg); rc = sqlite3OsWrite(pFile, zData, pgszSrc, iOff); @@ -62370,7 +72761,7 @@ SQLITE_API int sqlite3_backup_step(sqlite3_backup *p, int nPage){ } if( rc==SQLITE_IOERR_NOMEM ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } p->rc = rc; } @@ -62473,9 +72864,13 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p){ ** corresponding to the source database is held when this function is ** called. */ -SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){ - sqlite3_backup *p; /* Iterator variable */ - for(p=pBackup; p; p=p->pNext){ +static SQLITE_NOINLINE void backupUpdate( + sqlite3_backup *p, + Pgno iPage, + const u8 *aData +){ + assert( p!=0 ); + do{ assert( sqlite3_mutex_held(p->pSrc->pBt->mutex) ); if( !isFatalError(p->rc) && iPage<p->iNext ){ /* The backup process p has already copied page iPage. But now it @@ -62492,7 +72887,10 @@ SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, con p->rc = rc; } } - } + }while( (p = p->pNext)!=0 ); +} +SQLITE_PRIVATE void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){ + if( pBackup ) backupUpdate(pBackup, iPage, aData); } /* @@ -62550,15 +72948,19 @@ SQLITE_PRIVATE int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ b.pDest = pTo; b.iNext = 1; +#ifdef SQLITE_HAS_CODEC + sqlite3PagerAlignReserve(sqlite3BtreePager(pTo), sqlite3BtreePager(pFrom)); +#endif + /* 0x7FFFFFFF is the hard limit for the number of pages in a database ** file. By passing this as the number of pages to copy to ** sqlite3_backup_step(), we can guarantee that the copy finishes ** within a single call (unless an error occurs). The assert() statement ** checks this assumption - (p->rc) should be set to either SQLITE_DONE - ** or an error code. - */ + ** or an error code. */ sqlite3_backup_step(&b, 0x7FFFFFFF); assert( b.rc!=SQLITE_OK ); + rc = sqlite3_backup_finish(&b); if( rc==SQLITE_OK ){ pTo->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; @@ -62593,6 +72995,8 @@ copy_finished: ** only within the VDBE. Interface routines refer to a Mem using the ** name sqlite_value */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ #ifdef SQLITE_DEBUG /* @@ -62603,7 +73007,7 @@ copy_finished: */ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ /* If MEM_Dyn is set then Mem.xDel!=0. - ** Mem.xDel is might not be initialized if MEM_Dyn is clear. + ** Mem.xDel might not be initialized if MEM_Dyn is clear. */ assert( (p->flags & MEM_Dyn)==0 || p->xDel!=0 ); @@ -62616,6 +73020,35 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ /* Cannot be both MEM_Int and MEM_Real at the same time */ assert( (p->flags & (MEM_Int|MEM_Real))!=(MEM_Int|MEM_Real) ); + if( p->flags & MEM_Null ){ + /* Cannot be both MEM_Null and some other type */ + assert( (p->flags & (MEM_Int|MEM_Real|MEM_Str|MEM_Blob + |MEM_RowSet|MEM_Frame|MEM_Agg))==0 ); + + /* If MEM_Null is set, then either the value is a pure NULL (the usual + ** case) or it is a pointer set using sqlite3_bind_pointer() or + ** sqlite3_result_pointer(). If a pointer, then MEM_Term must also be + ** set. + */ + if( (p->flags & (MEM_Term|MEM_Subtype))==(MEM_Term|MEM_Subtype) ){ + /* This is a pointer type. There may be a flag to indicate what to + ** do with the pointer. */ + assert( ((p->flags&MEM_Dyn)!=0 ? 1 : 0) + + ((p->flags&MEM_Ephem)!=0 ? 1 : 0) + + ((p->flags&MEM_Static)!=0 ? 1 : 0) <= 1 ); + + /* No other bits set */ + assert( (p->flags & ~(MEM_Null|MEM_Term|MEM_Subtype + |MEM_Dyn|MEM_Ephem|MEM_Static))==0 ); + }else{ + /* A pure NULL might have other flags, such as MEM_Static, MEM_Dyn, + ** MEM_Ephem, MEM_Cleared, or MEM_Subtype */ + } + }else{ + /* The MEM_Cleared bit is only allowed on NULLs */ + assert( (p->flags & MEM_Cleared)==0 ); + } + /* The szMalloc field holds the correct memory allocation size */ assert( p->szMalloc==0 || p->szMalloc==sqlite3DbMallocSize(p->db,p->zMalloc) ); @@ -62640,6 +73073,51 @@ SQLITE_PRIVATE int sqlite3VdbeCheckMemInvariants(Mem *p){ } #endif +#ifdef SQLITE_DEBUG +/* +** Check that string value of pMem agrees with its integer or real value. +** +** A single int or real value always converts to the same strings. But +** many different strings can be converted into the same int or real. +** If a table contains a numeric value and an index is based on the +** corresponding string value, then it is important that the string be +** derived from the numeric value, not the other way around, to ensure +** that the index and table are consistent. See ticket +** https://www.sqlite.org/src/info/343634942dd54ab (2018-01-31) for +** an example. +** +** This routine looks at pMem to verify that if it has both a numeric +** representation and a string representation then the string rep has +** been derived from the numeric and not the other way around. It returns +** true if everything is ok and false if there is a problem. +** +** This routine is for use inside of assert() statements only. +*/ +SQLITE_PRIVATE int sqlite3VdbeMemConsistentDualRep(Mem *p){ + char zBuf[100]; + char *z; + int i, j, incr; + if( (p->flags & MEM_Str)==0 ) return 1; + if( (p->flags & (MEM_Int|MEM_Real))==0 ) return 1; + if( p->flags & MEM_Int ){ + sqlite3_snprintf(sizeof(zBuf),zBuf,"%lld",p->u.i); + }else{ + sqlite3_snprintf(sizeof(zBuf),zBuf,"%!.15g",p->u.r); + } + z = p->z; + i = j = 0; + incr = 1; + if( p->enc!=SQLITE_UTF8 ){ + incr = 2; + if( p->enc==SQLITE_UTF16BE ) z++; + } + while( zBuf[j] ){ + if( zBuf[j++]!=z[i] ) return 0; + i += incr; + } + return 1; +} +#endif /* SQLITE_DEBUG */ /* ** If pMem is an object with a valid string representation, this routine @@ -62692,6 +73170,7 @@ SQLITE_PRIVATE int sqlite3VdbeChangeEncoding(Mem *pMem, int desiredEnc){ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ assert( sqlite3VdbeCheckMemInvariants(pMem) ); assert( (pMem->flags&MEM_RowSet)==0 ); + testcase( pMem->db==0 ); /* If the bPreserve flag is set to true, then the memory cell must already ** contain a valid string or blob value. */ @@ -62700,26 +73179,25 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPre assert( pMem->szMalloc==0 || pMem->szMalloc==sqlite3DbMallocSize(pMem->db, pMem->zMalloc) ); - if( pMem->szMalloc<n ){ - if( n<32 ) n = 32; - if( bPreserve && pMem->szMalloc>0 && pMem->z==pMem->zMalloc ){ - pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); - bPreserve = 0; - }else{ - if( pMem->szMalloc>0 ) sqlite3DbFree(pMem->db, pMem->zMalloc); - pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); - } - if( pMem->zMalloc==0 ){ - sqlite3VdbeMemSetNull(pMem); - pMem->z = 0; - pMem->szMalloc = 0; - return SQLITE_NOMEM; - }else{ - pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); - } + if( n<32 ) n = 32; + if( pMem->szMalloc>0 && bPreserve && pMem->z==pMem->zMalloc ){ + pMem->z = pMem->zMalloc = sqlite3DbReallocOrFree(pMem->db, pMem->z, n); + bPreserve = 0; + }else{ + if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + pMem->zMalloc = sqlite3DbMallocRaw(pMem->db, n); + } + if( pMem->zMalloc==0 ){ + sqlite3VdbeMemSetNull(pMem); + pMem->z = 0; + pMem->szMalloc = 0; + return SQLITE_NOMEM_BKPT; + }else{ + pMem->szMalloc = sqlite3DbMallocSize(pMem->db, pMem->zMalloc); } - if( bPreserve && pMem->z && pMem->z!=pMem->zMalloc ){ + if( bPreserve && pMem->z ){ + assert( pMem->z!=pMem->zMalloc ); memcpy(pMem->zMalloc, pMem->z, pMem->n); } if( (pMem->flags&MEM_Dyn)!=0 ){ @@ -62757,6 +73235,20 @@ SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ return SQLITE_OK; } +/* +** It is already known that pMem contains an unterminated string. +** Add the zero terminator. +*/ +static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ + if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){ + return SQLITE_NOMEM_BKPT; + } + pMem->z[pMem->n] = 0; + pMem->z[pMem->n+1] = 0; + pMem->flags |= MEM_Term; + return SQLITE_OK; +} + /* ** Change pMem so that its MEM_Str or MEM_Blob value is stored in ** MEM.zMalloc, where it can be safely written. @@ -62764,22 +73256,19 @@ SQLITE_PRIVATE int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ ** Return SQLITE_OK on success or SQLITE_NOMEM if malloc fails. */ SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){ - int f; assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( (pMem->flags&MEM_RowSet)==0 ); - ExpandBlob(pMem); - f = pMem->flags; - if( (f&(MEM_Str|MEM_Blob)) && (pMem->szMalloc==0 || pMem->z!=pMem->zMalloc) ){ - if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){ - return SQLITE_NOMEM; + if( (pMem->flags & (MEM_Str|MEM_Blob))!=0 ){ + if( ExpandBlob(pMem) ) return SQLITE_NOMEM; + if( pMem->szMalloc==0 || pMem->z!=pMem->zMalloc ){ + int rc = vdbeMemAddTerminator(pMem); + if( rc ) return rc; } - pMem->z[pMem->n] = 0; - pMem->z[pMem->n+1] = 0; - pMem->flags |= MEM_Term; -#ifdef SQLITE_DEBUG - pMem->pScopyFrom = 0; -#endif } + pMem->flags &= ~MEM_Ephem; +#ifdef SQLITE_DEBUG + pMem->pScopyFrom = 0; +#endif return SQLITE_OK; } @@ -62790,43 +73279,28 @@ SQLITE_PRIVATE int sqlite3VdbeMemMakeWriteable(Mem *pMem){ */ #ifndef SQLITE_OMIT_INCRBLOB SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *pMem){ - if( pMem->flags & MEM_Zero ){ - int nByte; - assert( pMem->flags&MEM_Blob ); - assert( (pMem->flags&MEM_RowSet)==0 ); - assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + int nByte; + assert( pMem->flags & MEM_Zero ); + assert( pMem->flags&MEM_Blob ); + assert( (pMem->flags&MEM_RowSet)==0 ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); - /* Set nByte to the number of bytes required to store the expanded blob. */ - nByte = pMem->n + pMem->u.nZero; - if( nByte<=0 ){ - nByte = 1; - } - if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ - return SQLITE_NOMEM; - } - - memset(&pMem->z[pMem->n], 0, pMem->u.nZero); - pMem->n += pMem->u.nZero; - pMem->flags &= ~(MEM_Zero|MEM_Term); + /* Set nByte to the number of bytes required to store the expanded blob. */ + nByte = pMem->n + pMem->u.nZero; + if( nByte<=0 ){ + nByte = 1; } + if( sqlite3VdbeMemGrow(pMem, nByte, 1) ){ + return SQLITE_NOMEM_BKPT; + } + + memset(&pMem->z[pMem->n], 0, pMem->u.nZero); + pMem->n += pMem->u.nZero; + pMem->flags &= ~(MEM_Zero|MEM_Term); return SQLITE_OK; } #endif -/* -** It is already known that pMem contains an unterminated string. -** Add the zero terminator. -*/ -static SQLITE_NOINLINE int vdbeMemAddTerminator(Mem *pMem){ - if( sqlite3VdbeMemGrow(pMem, pMem->n+2, 1) ){ - return SQLITE_NOMEM; - } - pMem->z[pMem->n] = 0; - pMem->z[pMem->n+1] = 0; - pMem->flags |= MEM_Term; - return SQLITE_OK; -} - /* ** Make sure the given Mem is \u0000 terminated. */ @@ -62868,7 +73342,8 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ if( sqlite3VdbeMemClearAndResize(pMem, nByte) ){ - return SQLITE_NOMEM; + pMem->enc = 0; + return SQLITE_NOMEM_BKPT; } /* For a Real or Integer, use sqlite3_snprintf() to produce the UTF-8 @@ -62900,26 +73375,24 @@ SQLITE_PRIVATE int sqlite3VdbeMemStringify(Mem *pMem, u8 enc, u8 bForce){ ** otherwise. */ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ - int rc = SQLITE_OK; - if( ALWAYS(pFunc && pFunc->xFinalize) ){ - sqlite3_context ctx; - Mem t; - assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); - assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); - memset(&ctx, 0, sizeof(ctx)); - memset(&t, 0, sizeof(t)); - t.flags = MEM_Null; - t.db = pMem->db; - ctx.pOut = &t; - ctx.pMem = pMem; - ctx.pFunc = pFunc; - pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */ - assert( (pMem->flags & MEM_Dyn)==0 ); - if( pMem->szMalloc>0 ) sqlite3DbFree(pMem->db, pMem->zMalloc); - memcpy(pMem, &t, sizeof(t)); - rc = ctx.isError; - } - return rc; + sqlite3_context ctx; + Mem t; + assert( pFunc!=0 ); + assert( pFunc->xFinalize!=0 ); + assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); + assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + memset(&ctx, 0, sizeof(ctx)); + memset(&t, 0, sizeof(t)); + t.flags = MEM_Null; + t.db = pMem->db; + ctx.pOut = &t; + ctx.pMem = pMem; + ctx.pFunc = pFunc; + pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */ + assert( (pMem->flags & MEM_Dyn)==0 ); + if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); + memcpy(pMem, &t, sizeof(t)); + return ctx.isError; } /* @@ -62966,7 +73439,7 @@ static SQLITE_NOINLINE void vdbeMemClear(Mem *p){ vdbeMemClearExternAndSetNull(p); } if( p->szMalloc ){ - sqlite3DbFree(p->db, p->zMalloc); + sqlite3DbFreeNN(p->db, p->zMalloc); p->szMalloc = 0; } p->z = 0; @@ -62994,7 +73467,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ ** If the double is out of range of a 64-bit signed integer then ** return the closest available 64-bit signed integer. */ -static i64 doubleToInt64(double r){ +static SQLITE_NOINLINE i64 doubleToInt64(double r){ #ifdef SQLITE_OMIT_FLOATING_POINT /* When floating-point is omitted, double and int64 are the same thing */ return r; @@ -63030,6 +73503,11 @@ static i64 doubleToInt64(double r){ ** ** If pMem represents a string value, its encoding might be changed. */ +static SQLITE_NOINLINE i64 memIntValue(Mem *pMem){ + i64 value = 0; + sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc); + return value; +} SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ int flags; assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); @@ -63040,10 +73518,8 @@ SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ }else if( flags & MEM_Real ){ return doubleToInt64(pMem->u.r); }else if( flags & (MEM_Str|MEM_Blob) ){ - i64 value = 0; assert( pMem->z || pMem->n==0 ); - sqlite3Atoi64(pMem->z, &value, pMem->n, pMem->enc); - return value; + return memIntValue(pMem); }else{ return 0; } @@ -63055,6 +73531,12 @@ SQLITE_PRIVATE i64 sqlite3VdbeIntValue(Mem *pMem){ ** value. If it is a string or blob, try to convert it to a double. ** If it is a NULL, return 0.0. */ +static SQLITE_NOINLINE double memRealValue(Mem *pMem){ + /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ + double val = (double)0; + sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc); + return val; +} SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( EIGHT_BYTE_ALIGNMENT(pMem) ); @@ -63063,16 +73545,23 @@ SQLITE_PRIVATE double sqlite3VdbeRealValue(Mem *pMem){ }else if( pMem->flags & MEM_Int ){ return (double)pMem->u.i; }else if( pMem->flags & (MEM_Str|MEM_Blob) ){ - /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ - double val = (double)0; - sqlite3AtoF(pMem->z, &val, pMem->n, pMem->enc); - return val; + return memRealValue(pMem); }else{ /* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ return (double)0; } } +/* +** Return 1 if pMem represents true, and return 0 if pMem represents false. +** Return the value ifNull if pMem is NULL. +*/ +SQLITE_PRIVATE int sqlite3VdbeBooleanValue(Mem *pMem, int ifNull){ + if( pMem->flags & MEM_Int ) return pMem->u.i!=0; + if( pMem->flags & MEM_Null ) return ifNull; + return sqlite3VdbeRealValue(pMem)!=0.0; +} + /* ** The MEM structure is already a MEM_Real. Try to also make it a ** MEM_Int if we can. @@ -63128,6 +73617,18 @@ SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ return SQLITE_OK; } +/* Compare a floating point value to an integer. Return true if the two +** values are the same within the precision of the floating point value. +** +** For some versions of GCC on 32-bit machines, if you do the more obvious +** comparison of "r1==(double)i" you sometimes get an answer of false even +** though the r1 and (double)i values are bit-for-bit the same. +*/ +static int sqlite3RealSameAsInt(double r1, sqlite3_int64 i){ + double r2 = (double)i; + return memcmp(&r1, &r2, sizeof(r1))==0; +} + /* ** Convert pMem so that it has types MEM_Real or MEM_Int or both. ** Invalidate any prior representations. @@ -63138,18 +73639,25 @@ SQLITE_PRIVATE int sqlite3VdbeMemRealify(Mem *pMem){ */ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ if( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))==0 ){ + int rc; assert( (pMem->flags & (MEM_Blob|MEM_Str))!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); - if( 0==sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc) ){ + rc = sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc); + if( rc==0 ){ MemSetTypeFlag(pMem, MEM_Int); }else{ - pMem->u.r = sqlite3VdbeRealValue(pMem); - MemSetTypeFlag(pMem, MEM_Real); - sqlite3VdbeIntegerAffinity(pMem); + i64 i = pMem->u.i; + sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc); + if( rc==1 && sqlite3RealSameAsInt(pMem->u.r, i) ){ + pMem->u.i = i; + MemSetTypeFlag(pMem, MEM_Int); + }else{ + MemSetTypeFlag(pMem, MEM_Real); + } } } assert( (pMem->flags & (MEM_Int|MEM_Real|MEM_Null))!=0 ); - pMem->flags &= ~(MEM_Str|MEM_Blob); + pMem->flags &= ~(MEM_Str|MEM_Blob|MEM_Zero); return SQLITE_OK; } @@ -63163,11 +73671,11 @@ SQLITE_PRIVATE int sqlite3VdbeMemNumerify(Mem *pMem){ SQLITE_PRIVATE void sqlite3VdbeMemCast(Mem *pMem, u8 aff, u8 encoding){ if( pMem->flags & MEM_Null ) return; switch( aff ){ - case SQLITE_AFF_NONE: { /* Really a cast to BLOB */ + case SQLITE_AFF_BLOB: { /* Really a cast to BLOB */ if( (pMem->flags & MEM_Blob)==0 ){ sqlite3ValueApplyAffinity(pMem, SQLITE_AFF_TEXT, encoding); assert( pMem->flags & MEM_Str || pMem->db->mallocFailed ); - MemSetTypeFlag(pMem, MEM_Blob); + if( pMem->flags & MEM_Str ) MemSetTypeFlag(pMem, MEM_Blob); }else{ pMem->flags &= ~(MEM_TypeMask&~MEM_Blob); } @@ -63271,6 +73779,27 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetInt64(Mem *pMem, i64 val){ } } +/* A no-op destructor */ +SQLITE_PRIVATE void sqlite3NoopDestructor(void *p){ UNUSED_PARAMETER(p); } + +/* +** Set the value stored in *pMem should already be a NULL. +** Also store a pointer to go with it. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemSetPointer( + Mem *pMem, + void *pPtr, + const char *zPType, + void (*xDestructor)(void*) +){ + assert( pMem->flags==MEM_Null ); + pMem->u.zPType = zPType ? zPType : ""; + pMem->z = pPtr; + pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term; + pMem->eSubtype = 'p'; + pMem->xDel = xDestructor ? xDestructor : sqlite3NoopDestructor; +} + #ifndef SQLITE_OMIT_FLOATING_POINT /* ** Delete any previous value and set the value stored in *pMem to val, @@ -63294,7 +73823,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetRowSet(Mem *pMem){ assert( db!=0 ); assert( (pMem->flags & MEM_RowSet)==0 ); sqlite3VdbeMemRelease(pMem); - pMem->zMalloc = sqlite3DbMallocRaw(db, 64); + pMem->zMalloc = sqlite3DbMallocRawNN(db, 64); if( db->mallocFailed ){ pMem->flags = MEM_Null; pMem->szMalloc = 0; @@ -63335,7 +73864,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemTooBig(Mem *p){ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ int i; Mem *pX; - for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){ + for(i=0, pX=pVdbe->aMem; i<pVdbe->nMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ pX->flags |= MEM_Undefined; pX->pScopyFrom = 0; @@ -63345,10 +73874,6 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ } #endif /* SQLITE_DEBUG */ -/* -** Size of struct Mem not including the Mem.zMalloc member. -*/ -#define MEMCELLSIZE offsetof(Mem,zMalloc) /* ** Make an shallow copy of pFrom into pTo. Prior contents of @@ -63356,10 +73881,15 @@ SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ ** pFrom->z is used, then pTo->z points to the same thing as pFrom->z ** and flags gets srcType (either MEM_Ephem or MEM_Static). */ +static SQLITE_NOINLINE void vdbeClrCopy(Mem *pTo, const Mem *pFrom, int eType){ + vdbeMemClearExternAndSetNull(pTo); + assert( !VdbeMemDynamic(pTo) ); + sqlite3VdbeMemShallowCopy(pTo, pFrom, eType); +} SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ assert( (pFrom->flags & MEM_RowSet)==0 ); assert( pTo->db==pFrom->db ); - if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); + if( VdbeMemDynamic(pTo) ){ vdbeClrCopy(pTo,pFrom,srcType); return; } memcpy(pTo, pFrom, MEMCELLSIZE); if( (pFrom->flags&MEM_Static)==0 ){ pTo->flags &= ~(MEM_Dyn|MEM_Static|MEM_Ephem); @@ -63375,7 +73905,6 @@ SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int sr SQLITE_PRIVATE int sqlite3VdbeMemCopy(Mem *pTo, const Mem *pFrom){ int rc = SQLITE_OK; - assert( pTo->db==pFrom->db ); assert( (pFrom->flags & MEM_RowSet)==0 ); if( VdbeMemDynamic(pTo) ) vdbeMemClearExternAndSetNull(pTo); memcpy(pTo, pFrom, MEMCELLSIZE); @@ -63451,7 +73980,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( if( nByte<0 ){ assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ - nByte = sqlite3Strlen30(z); + nByte = 0x7fffffff & (int)strlen(z); if( nByte>iLimit ) nByte = iLimit+1; }else{ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} @@ -63475,7 +74004,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( testcase( nAlloc==31 ); testcase( nAlloc==32 ); if( sqlite3VdbeMemClearAndResize(pMem, MAX(nAlloc,32)) ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memcpy(pMem->z, z, nAlloc); }else if( xDel==SQLITE_DYNAMIC ){ @@ -63495,7 +74024,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( #ifndef SQLITE_OMIT_UTF16 if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } #endif @@ -63508,10 +74037,9 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( /* ** Move data out of a btree key or data field and into a Mem structure. -** The data or key is taken from the entry that pCur is currently pointing +** The data is payload from the entry that pCur is currently pointing ** to. offset and amt determine what portion of the data or key to retrieve. -** key is true to get the key or false to get data. The result is written -** into the pMem element. +** The result is written into the pMem element. ** ** The pMem object must have been initialized. This routine will use ** pMem->zMalloc to hold the content from the btree, if possible. New @@ -63522,11 +74050,30 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( ** If this routine fails for any reason (malloc returns NULL or unable ** to read from the disk) then the pMem is left in an inconsistent state. */ +static SQLITE_NOINLINE int vdbeMemFromBtreeResize( + BtCursor *pCur, /* Cursor pointing at record to retrieve. */ + u32 offset, /* Offset from the start of data to return bytes from. */ + u32 amt, /* Number of bytes to return. */ + Mem *pMem /* OUT: Return data in this Mem structure. */ +){ + int rc; + pMem->flags = MEM_Null; + if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+1)) ){ + rc = sqlite3BtreePayload(pCur, offset, amt, pMem->z); + if( rc==SQLITE_OK ){ + pMem->z[amt] = 0; /* Overrun area used when reading malformed records */ + pMem->flags = MEM_Blob; + pMem->n = (int)amt; + }else{ + sqlite3VdbeMemRelease(pMem); + } + } + return rc; +} SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( BtCursor *pCur, /* Cursor pointing at record to retrieve. */ u32 offset, /* Offset from the start of data to return bytes from. */ u32 amt, /* Number of bytes to return. */ - int key, /* If true, retrieve from the btree key, not data. */ Mem *pMem /* OUT: Return data in this Mem structure. */ ){ char *zData; /* Data from the btree layer */ @@ -63539,11 +74086,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( /* Note: the calls to BtreeKeyFetch() and DataFetch() below assert() ** that both the BtShared and database handle mutexes are held. */ assert( (pMem->flags & MEM_RowSet)==0 ); - if( key ){ - zData = (char *)sqlite3BtreeKeyFetch(pCur, &available); - }else{ - zData = (char *)sqlite3BtreeDataFetch(pCur, &available); - } + zData = (char *)sqlite3BtreePayloadFetch(pCur, &available); assert( zData!=0 ); if( offset+amt<=available ){ @@ -63551,22 +74094,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFromBtree( pMem->flags = MEM_Blob|MEM_Ephem; pMem->n = (int)amt; }else{ - pMem->flags = MEM_Null; - if( SQLITE_OK==(rc = sqlite3VdbeMemClearAndResize(pMem, amt+2)) ){ - if( key ){ - rc = sqlite3BtreeKey(pCur, offset, amt, pMem->z); - }else{ - rc = sqlite3BtreeData(pCur, offset, amt, pMem->z); - } - if( rc==SQLITE_OK ){ - pMem->z[amt] = 0; - pMem->z[amt+1] = 0; - pMem->flags = MEM_Blob|MEM_Term; - pMem->n = (int)amt; - }else{ - sqlite3VdbeMemRelease(pMem); - } - } + rc = vdbeMemFromBtreeResize(pCur, offset, amt, pMem); } return rc; @@ -63584,10 +74112,8 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ assert( (pVal->flags & MEM_RowSet)==0 ); assert( (pVal->flags & (MEM_Null))==0 ); if( pVal->flags & (MEM_Blob|MEM_Str) ){ + if( ExpandBlob(pVal) ) return 0; pVal->flags |= MEM_Str; - if( pVal->flags & MEM_Zero ){ - sqlite3VdbeMemExpandBlob(pVal); - } if( pVal->enc != (enc & ~SQLITE_UTF16_ALIGNED) ){ sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED); } @@ -63605,6 +74131,7 @@ static SQLITE_NOINLINE const void *valueToText(sqlite3_value* pVal, u8 enc){ assert(pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) || pVal->db==0 || pVal->db->mallocFailed ); if( pVal->enc==(enc & ~SQLITE_UTF16_ALIGNED) ){ + assert( sqlite3VdbeMemConsistentDualRep(pVal) ); return pVal->z; }else{ return 0; @@ -63627,6 +74154,7 @@ SQLITE_PRIVATE const void *sqlite3ValueText(sqlite3_value* pVal, u8 enc){ assert( (enc&3)==(enc&~SQLITE_UTF16_ALIGNED) ); assert( (pVal->flags & MEM_RowSet)==0 ); if( (pVal->flags&(MEM_Str|MEM_Term))==(MEM_Str|MEM_Term) && pVal->enc==enc ){ + assert( sqlite3VdbeMemConsistentDualRep(pVal) ); return pVal->z; } if( pVal->flags&MEM_Null ){ @@ -63666,7 +74194,7 @@ struct ValueNewStat4Ctx { ** Otherwise, if the second argument is non-zero, then this function is ** being called indirectly by sqlite3Stat4ProbeSetValue(). If it has not ** already been allocated, allocate the UnpackedRecord structure that -** that function will return to its caller here. Then return a pointer +** that function will return to its caller here. Then return a pointer to ** an sqlite3_value within the UnpackedRecord.a[] array. */ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ @@ -63685,7 +74213,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ if( pRec ){ pRec->pKeyInfo = sqlite3KeyInfoOfIndex(p->pParse, pIdx); if( pRec->pKeyInfo ){ - assert( pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField==nCol ); + assert( pRec->pKeyInfo->nAllField==nCol ); assert( pRec->pKeyInfo->enc==ENC(db) ); pRec->aMem = (Mem *)((u8*)pRec + ROUND8(sizeof(UnpackedRecord))); for(i=0; i<nCol; i++){ @@ -63693,7 +74221,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ pRec->aMem[i].db = db; } }else{ - sqlite3DbFree(db, pRec); + sqlite3DbFreeNN(db, pRec); pRec = 0; } } @@ -63710,6 +74238,111 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ return sqlite3ValueNew(db); } +/* +** The expression object indicated by the second argument is guaranteed +** to be a scalar SQL function. If +** +** * all function arguments are SQL literals, +** * one of the SQLITE_FUNC_CONSTANT or _SLOCHNG function flags is set, and +** * the SQLITE_FUNC_NEEDCOLL function flag is not set, +** +** then this routine attempts to invoke the SQL function. Assuming no +** error occurs, output parameter (*ppVal) is set to point to a value +** object containing the result before returning SQLITE_OK. +** +** Affinity aff is applied to the result of the function before returning. +** If the result is a text value, the sqlite3_value object uses encoding +** enc. +** +** If the conditions above are not met, this function returns SQLITE_OK +** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to +** NULL and an SQLite error code returned. +*/ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +static int valueFromFunction( + sqlite3 *db, /* The database connection */ + Expr *p, /* The expression to evaluate */ + u8 enc, /* Encoding to use */ + u8 aff, /* Affinity to use */ + sqlite3_value **ppVal, /* Write the new value here */ + struct ValueNewStat4Ctx *pCtx /* Second argument for valueNew() */ +){ + sqlite3_context ctx; /* Context object for function invocation */ + sqlite3_value **apVal = 0; /* Function arguments */ + int nVal = 0; /* Size of apVal[] array */ + FuncDef *pFunc = 0; /* Function definition */ + sqlite3_value *pVal = 0; /* New value */ + int rc = SQLITE_OK; /* Return code */ + ExprList *pList = 0; /* Function arguments */ + int i; /* Iterator variable */ + + assert( pCtx!=0 ); + assert( (p->flags & EP_TokenOnly)==0 ); + pList = p->x.pList; + if( pList ) nVal = pList->nExpr; + pFunc = sqlite3FindFunction(db, p->u.zToken, nVal, enc, 0); + assert( pFunc ); + if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0 + || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) + ){ + return SQLITE_OK; + } + + if( pList ){ + apVal = (sqlite3_value**)sqlite3DbMallocZero(db, sizeof(apVal[0]) * nVal); + if( apVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + for(i=0; i<nVal; i++){ + rc = sqlite3ValueFromExpr(db, pList->a[i].pExpr, enc, aff, &apVal[i]); + if( apVal[i]==0 || rc!=SQLITE_OK ) goto value_from_function_out; + } + } + + pVal = valueNew(db, pCtx); + if( pVal==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto value_from_function_out; + } + + assert( pCtx->pParse->rc==SQLITE_OK ); + memset(&ctx, 0, sizeof(ctx)); + ctx.pOut = pVal; + ctx.pFunc = pFunc; + pFunc->xSFunc(&ctx, nVal, apVal); + if( ctx.isError ){ + rc = ctx.isError; + sqlite3ErrorMsg(pCtx->pParse, "%s", sqlite3_value_text(pVal)); + }else{ + sqlite3ValueApplyAffinity(pVal, aff, SQLITE_UTF8); + assert( rc==SQLITE_OK ); + rc = sqlite3VdbeChangeEncoding(pVal, enc); + if( rc==SQLITE_OK && sqlite3VdbeMemTooBig(pVal) ){ + rc = SQLITE_TOOBIG; + pCtx->pParse->nErr++; + } + } + pCtx->pParse->rc = rc; + + value_from_function_out: + if( rc!=SQLITE_OK ){ + pVal = 0; + } + if( apVal ){ + for(i=0; i<nVal; i++){ + sqlite3ValueFree(apVal[i]); + } + sqlite3DbFreeNN(db, apVal); + } + + *ppVal = pVal; + return rc; +} +#else +# define valueFromFunction(a,b,c,d,e,f) SQLITE_OK +#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ + /* ** Extract a value from the supplied expression in the manner described ** above sqlite3ValueFromExpr(). Allocate the sqlite3_value object @@ -63735,12 +74368,19 @@ static int valueFromExpr( const char *zNeg = ""; int rc = SQLITE_OK; - if( !pExpr ){ - *ppVal = 0; - return SQLITE_OK; - } - while( (op = pExpr->op)==TK_UPLUS ) pExpr = pExpr->pLeft; + assert( pExpr!=0 ); + while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; +#if defined(SQLITE_ENABLE_STAT3_OR_STAT4) + if( op==TK_REGISTER ) op = pExpr->op2; +#else if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; +#endif + + /* Compressed expressions only appear when parsing the DEFAULT clause + ** on a table column definition, and hence only when pCtx==0. This + ** check ensures that an EP_TokenOnly expression is never passed down + ** into valueFromFunction(). */ + assert( (pExpr->flags & EP_TokenOnly)==0 || pCtx==0 ); if( op==TK_CAST ){ u8 aff = sqlite3AffinityType(pExpr->u.zToken,0); @@ -63774,7 +74414,7 @@ static int valueFromExpr( if( zVal==0 ) goto no_mem; sqlite3ValueSetStr(pVal, -1, zVal, SQLITE_UTF8, SQLITE_DYNAMIC); } - if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_NONE ){ + if( (op==TK_INTEGER || op==TK_FLOAT ) && affinity==SQLITE_AFF_BLOB ){ sqlite3ValueApplyAffinity(pVal, SQLITE_AFF_NUMERIC, SQLITE_UTF8); }else{ sqlite3ValueApplyAffinity(pVal, affinity, SQLITE_UTF8); @@ -63785,7 +74425,7 @@ static int valueFromExpr( } }else if( op==TK_UMINUS ) { /* This branch happens for multiple negative signs. Ex: -(-5) */ - if( SQLITE_OK==sqlite3ValueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal) + if( SQLITE_OK==valueFromExpr(db,pExpr->pLeft,enc,affinity,&pVal,pCtx) && pVal!=0 ){ sqlite3VdbeMemNumerify(pVal); @@ -63802,6 +74442,7 @@ static int valueFromExpr( }else if( op==TK_NULL ){ pVal = valueNew(db, pCtx); if( pVal==0 ) goto no_mem; + sqlite3VdbeMemNumerify(pVal); } #ifndef SQLITE_OMIT_BLOB_LITERAL else if( op==TK_BLOB ){ @@ -63817,12 +74458,25 @@ static int valueFromExpr( 0, SQLITE_DYNAMIC); } #endif +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + else if( op==TK_FUNCTION && pCtx!=0 ){ + rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); + } +#endif + else if( op==TK_TRUEFALSE ){ + pVal = valueNew(db, pCtx); + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } *ppVal = pVal; return rc; no_mem: - db->mallocFailed = 1; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( pCtx==0 || pCtx->pParse->nErr==0 ) +#endif + sqlite3OomFault(db); sqlite3DbFree(db, zVal); assert( *ppVal==0 ); #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 @@ -63830,7 +74484,7 @@ no_mem: #else assert( pCtx==0 ); sqlite3ValueFree(pVal); #endif - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } /* @@ -63850,7 +74504,7 @@ SQLITE_PRIVATE int sqlite3ValueFromExpr( u8 affinity, /* Affinity to use */ sqlite3_value **ppVal /* Write the new value here */ ){ - return valueFromExpr(db, pExpr, enc, affinity, ppVal, 0); + return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0; } #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 @@ -63868,21 +74522,20 @@ static void recordFunc( sqlite3_value **argv ){ const int file_format = 1; - int iSerial; /* Serial type */ + u32 iSerial; /* Serial type */ int nSerial; /* Bytes of space for iSerial as varint */ - int nVal; /* Bytes of space required for argv[0] */ + u32 nVal; /* Bytes of space required for argv[0] */ int nRet; sqlite3 *db; u8 *aRet; UNUSED_PARAMETER( argc ); - iSerial = sqlite3VdbeSerialType(argv[0], file_format); + iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal); nSerial = sqlite3VarintLen(iSerial); - nVal = sqlite3VdbeSerialTypeLen(iSerial); db = sqlite3_context_db_handle(context); nRet = 1 + nSerial + nVal; - aRet = sqlite3DbMallocRaw(db, nRet); + aRet = sqlite3DbMallocRawNN(db, nRet); if( aRet==0 ){ sqlite3_result_error_nomem(context); }else{ @@ -63890,7 +74543,7 @@ static void recordFunc( putVarint32(&aRet[1], iSerial); sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); - sqlite3DbFree(db, aRet); + sqlite3DbFreeNN(db, aRet); } } @@ -63898,15 +74551,10 @@ static void recordFunc( ** Register built-in functions used to help read ANALYZE data. */ SQLITE_PRIVATE void sqlite3AnalyzeFunctions(void){ - static SQLITE_WSD FuncDef aAnalyzeTableFuncs[] = { + static FuncDef aAnalyzeTableFuncs[] = { FUNCTION(sqlite_record, 1, 0, 0, recordFunc), }; - int i; - FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); - FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aAnalyzeTableFuncs); - for(i=0; i<ArraySize(aAnalyzeTableFuncs); i++){ - sqlite3FuncDefInsert(pHash, &aFunc[i]); - } + sqlite3InsertBuiltinFuncs(aAnalyzeTableFuncs, ArraySize(aAnalyzeTableFuncs)); } /* @@ -63941,14 +74589,13 @@ static int stat4ValueFromExpr( /* Skip over any TK_COLLATE nodes */ pExpr = sqlite3ExprSkipCollate(pExpr); + assert( pExpr==0 || pExpr->op!=TK_REGISTER || pExpr->op2!=TK_VARIABLE ); if( !pExpr ){ pVal = valueNew(db, pAlloc); if( pVal ){ sqlite3VdbeMemSetNull((Mem*)pVal); } - }else if( pExpr->op==TK_VARIABLE - || NEVER(pExpr->op==TK_REGISTER && pExpr->op2==TK_VARIABLE) - ){ + }else if( pExpr->op==TK_VARIABLE && (db->flags & SQLITE_EnableQPSG)==0 ){ Vdbe *v; int iBindVar = pExpr->iColumn; sqlite3VdbeSetVarmask(pParse->pVdbe, iBindVar); @@ -63956,9 +74603,7 @@ static int stat4ValueFromExpr( pVal = valueNew(db, pAlloc); if( pVal ){ rc = sqlite3VdbeMemCopy((Mem*)pVal, &v->aVar[iBindVar-1]); - if( rc==SQLITE_OK ){ - sqlite3ValueApplyAffinity(pVal, affinity, ENC(db)); - } + sqlite3ValueApplyAffinity(pVal, affinity, ENC(db)); pVal->db = pParse->db; } } @@ -63976,9 +74621,9 @@ static int stat4ValueFromExpr( ** structures intended to be compared against sample index keys stored ** in the sqlite_stat4 table. ** -** A single call to this function attempts to populates field iVal (leftmost -** is 0 etc.) of the unpacked record with a value extracted from expression -** pExpr. Extraction of values is possible if: +** A single call to this function populates zero or more fields of the +** record starting with field iVal (fields are numbered from left to +** right starting with 0). A single field is populated if: ** ** * (pExpr==0). In this case the value is assumed to be an SQL NULL, ** @@ -63987,10 +74632,14 @@ static int stat4ValueFromExpr( ** * The sqlite3ValueFromExpr() function is able to extract a value ** from the expression (i.e. the expression is a literal value). ** -** If a value can be extracted, the affinity passed as the 5th argument -** is applied to it before it is copied into the UnpackedRecord. Output -** parameter *pbOk is set to true if a value is extracted, or false -** otherwise. +** Or, if pExpr is a TK_VECTOR, one field is populated for each of the +** vector components that match either of the two latter criteria listed +** above. +** +** Before any value is appended to the record, the affinity of the +** corresponding column within index pIdx is applied to it. Before +** this function returns, output parameter *pnExtract is set to the +** number of values appended to the record. ** ** When this function is called, *ppRec must either point to an object ** allocated by an earlier call to this function, or must be NULL. If it @@ -64006,22 +74655,33 @@ SQLITE_PRIVATE int sqlite3Stat4ProbeSetValue( Index *pIdx, /* Index being probed */ UnpackedRecord **ppRec, /* IN/OUT: Probe record */ Expr *pExpr, /* The expression to extract a value from */ - u8 affinity, /* Affinity to use */ + int nElem, /* Maximum number of values to append */ int iVal, /* Array element to populate */ - int *pbOk /* OUT: True if value was extracted */ + int *pnExtract /* OUT: Values appended to the record */ ){ - int rc; - sqlite3_value *pVal = 0; - struct ValueNewStat4Ctx alloc; + int rc = SQLITE_OK; + int nExtract = 0; - alloc.pParse = pParse; - alloc.pIdx = pIdx; - alloc.ppRec = ppRec; - alloc.iVal = iVal; + if( pExpr==0 || pExpr->op!=TK_SELECT ){ + int i; + struct ValueNewStat4Ctx alloc; - rc = stat4ValueFromExpr(pParse, pExpr, affinity, &alloc, &pVal); - assert( pVal==0 || pVal->db==pParse->db ); - *pbOk = (pVal!=0); + alloc.pParse = pParse; + alloc.pIdx = pIdx; + alloc.ppRec = ppRec; + + for(i=0; i<nElem; i++){ + sqlite3_value *pVal = 0; + Expr *pElem = (pExpr ? sqlite3VectorFieldSubexpr(pExpr, i) : 0); + u8 aff = sqlite3IndexColumnAffinity(pParse->db, pIdx, iVal+i); + alloc.iVal = iVal+i; + rc = stat4ValueFromExpr(pParse, pElem, aff, &alloc, &pVal); + if( !pVal ) break; + nExtract++; + } + } + + *pnExtract = nExtract; return rc; } @@ -64085,7 +74745,7 @@ SQLITE_PRIVATE int sqlite3Stat4Column( if( iField>nRec ) return SQLITE_CORRUPT_BKPT; if( pMem==0 ){ pMem = *ppVal = sqlite3ValueNew(db); - if( pMem==0 ) return SQLITE_NOMEM; + if( pMem==0 ) return SQLITE_NOMEM_BKPT; } sqlite3VdbeSerialGet(&a[iField-szField], t, pMem); pMem->enc = ENC(db); @@ -64100,14 +74760,14 @@ SQLITE_PRIVATE int sqlite3Stat4Column( SQLITE_PRIVATE void sqlite3Stat4ProbeFree(UnpackedRecord *pRec){ if( pRec ){ int i; - int nCol = pRec->pKeyInfo->nField+pRec->pKeyInfo->nXField; + int nCol = pRec->pKeyInfo->nAllField; Mem *aMem = pRec->aMem; sqlite3 *db = aMem[0].db; for(i=0; i<nCol; i++){ - if( aMem[i].szMalloc ) sqlite3DbFree(db, aMem[i].zMalloc); + sqlite3VdbeMemRelease(&aMem[i]); } sqlite3KeyInfoUnref(pRec->pKeyInfo); - sqlite3DbFree(db, pRec); + sqlite3DbFreeNN(db, pRec); } } #endif /* ifdef SQLITE_ENABLE_STAT4 */ @@ -64131,23 +74791,32 @@ SQLITE_PRIVATE void sqlite3ValueSetStr( SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value *v){ if( !v ) return; sqlite3VdbeMemRelease((Mem *)v); - sqlite3DbFree(((Mem*)v)->db, v); + sqlite3DbFreeNN(((Mem*)v)->db, v); } /* -** Return the number of bytes in the sqlite3_value object assuming -** that it uses the encoding "enc" +** The sqlite3ValueBytes() routine returns the number of bytes in the +** sqlite3_value object assuming that it uses the encoding "enc". +** The valueBytes() routine is a helper function. */ +static SQLITE_NOINLINE int valueBytes(sqlite3_value *pVal, u8 enc){ + return valueToText(pVal, enc)!=0 ? pVal->n : 0; +} SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ Mem *p = (Mem*)pVal; - if( (p->flags & MEM_Blob)!=0 || sqlite3ValueText(pVal, enc) ){ + assert( (p->flags & MEM_Null)==0 || (p->flags & (MEM_Str|MEM_Blob))==0 ); + if( (p->flags & MEM_Str)!=0 && pVal->enc==enc ){ + return p->n; + } + if( (p->flags & MEM_Blob)!=0 ){ if( p->flags & MEM_Zero ){ return p->n + p->u.nZero; }else{ return p->n; } } - return 0; + if( p->flags & MEM_Null ) return 0; + return valueBytes(pVal, enc); } /************** End of vdbemem.c *********************************************/ @@ -64166,6 +74835,8 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ ** This file contains code used for creating, destroying, and populating ** a VDBE (or an "sqlite3_stmt" as it is known to the outside world.) */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ /* ** Create a new virtual database engine. @@ -64173,8 +74844,9 @@ SQLITE_PRIVATE int sqlite3ValueBytes(sqlite3_value *pVal, u8 enc){ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ sqlite3 *db = pParse->db; Vdbe *p; - p = sqlite3DbMallocZero(db, sizeof(Vdbe) ); + p = sqlite3DbMallocRawNN(db, sizeof(Vdbe) ); if( p==0 ) return 0; + memset(&p->aOp, 0, sizeof(Vdbe)-offsetof(Vdbe,aOp)); p->db = db; if( db->pVdbe ){ db->pVdbe->pPrev = p; @@ -64184,32 +74856,37 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ db->pVdbe = p; p->magic = VDBE_MAGIC_INIT; p->pParse = pParse; + pParse->pVdbe = p; assert( pParse->aLabel==0 ); assert( pParse->nLabel==0 ); assert( pParse->nOpAlloc==0 ); + assert( pParse->szOpAlloc==0 ); + sqlite3VdbeAddOp2(p, OP_Init, 0, 1); return p; } +/* +** Change the error string stored in Vdbe.zErrMsg +*/ +SQLITE_PRIVATE void sqlite3VdbeError(Vdbe *p, const char *zFormat, ...){ + va_list ap; + sqlite3DbFree(p->db, p->zErrMsg); + va_start(ap, zFormat); + p->zErrMsg = sqlite3VMPrintf(p->db, zFormat, ap); + va_end(ap); +} + /* ** Remember the SQL string for a prepared statement. */ -SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, int isPrepareV2){ - assert( isPrepareV2==1 || isPrepareV2==0 ); +SQLITE_PRIVATE void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlags){ if( p==0 ) return; -#if defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_ENABLE_SQLLOG) - if( !isPrepareV2 ) return; -#endif + p->prepFlags = prepFlags; + if( (prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){ + p->expmask = 0; + } assert( p->zSql==0 ); p->zSql = sqlite3DbStrNDup(p->db, z, n); - p->isPrepareV2 = (u8)isPrepareV2; -} - -/* -** Return the SQL associated with a prepared statement -*/ -SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ - Vdbe *p = (Vdbe *)pStmt; - return (p && p->isPrepareV2) ? p->zSql : 0; } /* @@ -64218,6 +74895,7 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ Vdbe tmp, *pTmp; char *zTmp; + assert( pA->db==pB->db ); tmp = *pA; *pA = *pB; *pB = tmp; @@ -64230,7 +74908,10 @@ SQLITE_PRIVATE void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ zTmp = pA->zSql; pA->zSql = pB->zSql; pB->zSql = zTmp; - pB->isPrepareV2 = pA->isPrepareV2; + pB->expmask = pA->expmask; + pB->prepFlags = pA->prepFlags; + memcpy(pB->aCounter, pA->aCounter, sizeof(pB->aCounter)); + pB->aCounter[SQLITE_STMTSTATUS_REPREPARE]++; } /* @@ -64261,14 +74942,21 @@ static int growOpArray(Vdbe *v, int nOp){ UNUSED_PARAMETER(nOp); #endif + /* Ensure that the size of a VDBE does not grow too large */ + if( nNew > p->db->aLimit[SQLITE_LIMIT_VDBE_OP] ){ + sqlite3OomFault(p->db); + return SQLITE_NOMEM; + } + assert( nOp<=(1024/sizeof(Op)) ); assert( nNew>=(p->nOpAlloc+nOp) ); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ - p->nOpAlloc = sqlite3DbMallocSize(p->db, pNew)/sizeof(Op); + p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); + p->nOpAlloc = p->szOpAlloc/sizeof(Op); v->aOp = pNew; } - return (pNew ? SQLITE_OK : SQLITE_NOMEM); + return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); } #ifdef SQLITE_DEBUG @@ -64298,17 +74986,21 @@ static void test_addop_breakpoint(void){ ** the sqlite3VdbeChangeP4() function to change the value of the P4 ** operand. */ +static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ + assert( p->pParse->nOpAlloc<=p->nOp ); + if( growOpArray(p, 1) ) return 1; + assert( p->pParse->nOpAlloc>p->nOp ); + return sqlite3VdbeAddOp3(p, op, p1, p2, p3); +} SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ int i; VdbeOp *pOp; i = p->nOp; assert( p->magic==VDBE_MAGIC_INIT ); - assert( op>0 && op<0xff ); + assert( op>=0 && op<0xff ); if( p->pParse->nOpAlloc<=i ){ - if( growOpArray(p, 1) ){ - return 1; - } + return growOp3(p, op, p1, p2, p3); } p->nOp++; pOp = &p->aOp[i]; @@ -64326,9 +75018,8 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ if( p->db->flags & SQLITE_VdbeAddopTrace ){ int jj, kk; Parse *pParse = p->pParse; - for(jj=kk=0; jj<SQLITE_N_COLCACHE; jj++){ + for(jj=kk=0; jj<pParse->nColCache; jj++){ struct yColCache *x = pParse->aColCache + jj; - if( x->iLevel>pParse->iCacheLevel || x->iReg==0 ) continue; printf(" r[%d]={%d:%d}", x->iReg, x->iTable, x->iColumn); kk++; } @@ -64356,6 +75047,49 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe *p, int op, int p1, int p2){ return sqlite3VdbeAddOp3(p, op, p1, p2, 0); } +/* Generate code for an unconditional jump to instruction iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeGoto(Vdbe *p, int iDest){ + return sqlite3VdbeAddOp3(p, OP_Goto, 0, iDest, 0); +} + +/* Generate code to cause the string zStr to be loaded into +** register iDest +*/ +SQLITE_PRIVATE int sqlite3VdbeLoadString(Vdbe *p, int iDest, const char *zStr){ + return sqlite3VdbeAddOp4(p, OP_String8, 0, iDest, 0, zStr, 0); +} + +/* +** Generate code that initializes multiple registers to string or integer +** constants. The registers begin with iDest and increase consecutively. +** One register is initialized for each characgter in zTypes[]. For each +** "s" character in zTypes[], the register is a string if the argument is +** not NULL, or OP_Null if the value is a null pointer. For each "i" character +** in zTypes[], the register is initialized to an integer. +** +** If the input string does not end with "X" then an OP_ResultRow instruction +** is generated for the values inserted. +*/ +SQLITE_PRIVATE void sqlite3VdbeMultiLoad(Vdbe *p, int iDest, const char *zTypes, ...){ + va_list ap; + int i; + char c; + va_start(ap, zTypes); + for(i=0; (c = zTypes[i])!=0; i++){ + if( c=='s' ){ + const char *z = va_arg(ap, const char*); + sqlite3VdbeAddOp4(p, z==0 ? OP_Null : OP_String8, 0, iDest+i, 0, z, 0); + }else if( c=='i' ){ + sqlite3VdbeAddOp2(p, OP_Integer, va_arg(ap, int), iDest+i); + }else{ + goto skip_op_resultrow; + } + } + sqlite3VdbeAddOp2(p, OP_ResultRow, iDest, i); +skip_op_resultrow: + va_end(ap); +} /* ** Add an opcode that includes the p4 value as a pointer. @@ -64374,6 +75108,67 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4( return addr; } +/* +** Add an opcode that includes the p4 value with a P4_INT64 or +** P4_REAL type. +*/ +SQLITE_PRIVATE int sqlite3VdbeAddOp4Dup8( + Vdbe *p, /* Add the opcode to this VM */ + int op, /* The new opcode */ + int p1, /* The P1 operand */ + int p2, /* The P2 operand */ + int p3, /* The P3 operand */ + const u8 *zP4, /* The P4 operand */ + int p4type /* P4 operand type */ +){ + char *p4copy = sqlite3DbMallocRawNN(sqlite3VdbeDb(p), 8); + if( p4copy ) memcpy(p4copy, zP4, 8); + return sqlite3VdbeAddOp4(p, op, p1, p2, p3, p4copy, p4type); +} + +#ifndef SQLITE_OMIT_EXPLAIN +/* +** Return the address of the current EXPLAIN QUERY PLAN baseline. +** 0 means "none". +*/ +SQLITE_PRIVATE int sqlite3VdbeExplainParent(Parse *pParse){ + VdbeOp *pOp; + if( pParse->addrExplain==0 ) return 0; + pOp = sqlite3VdbeGetOp(pParse->pVdbe, pParse->addrExplain); + return pOp->p2; +} + +/* +** Add a new OP_Explain opcode. +** +** If the bPush flag is true, then make this opcode the parent for +** subsequent Explains until sqlite3VdbeExplainPop() is called. +*/ +SQLITE_PRIVATE void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ + if( pParse->explain==2 ){ + char *zMsg; + Vdbe *v = pParse->pVdbe; + va_list ap; + int iThis; + va_start(ap, zFmt); + zMsg = sqlite3VMPrintf(pParse->db, zFmt, ap); + va_end(ap); + v = pParse->pVdbe; + iThis = v->nOp; + sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, + zMsg, P4_DYNAMIC); + if( bPush) pParse->addrExplain = iThis; + } +} + +/* +** Pop the EXPLAIN QUERY PLAN stack one level. +*/ +SQLITE_PRIVATE void sqlite3VdbeExplainPop(Parse *pParse){ + pParse->addrExplain = sqlite3VdbeExplainParent(pParse); +} +#endif /* SQLITE_OMIT_EXPLAIN */ + /* ** Add an OP_ParseSchema opcode. This routine is broken out from ** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees @@ -64384,8 +75179,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4( */ SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe *p, int iDb, char *zWhere){ int j; - int addr = sqlite3VdbeAddOp3(p, OP_ParseSchema, iDb, 0, 0); - sqlite3VdbeChangeP4(p, addr, zWhere, P4_DYNAMIC); + sqlite3VdbeAddOp4(p, OP_ParseSchema, iDb, 0, 0, zWhere, P4_DYNAMIC); for(j=0; j<p->db->nDb; j++) sqlite3VdbeUsesBtree(p, j); } @@ -64401,10 +75195,29 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp4Int( int p4 /* The P4 operand as an integer */ ){ int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3); - sqlite3VdbeChangeP4(p, addr, SQLITE_INT_TO_PTR(p4), P4_INT32); + if( p->db->mallocFailed==0 ){ + VdbeOp *pOp = &p->aOp[addr]; + pOp->p4type = P4_INT32; + pOp->p4.i = p4; + } return addr; } +/* Insert the end of a co-routine +*/ +SQLITE_PRIVATE void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ + sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); + + /* Clear the temporary register cache, thereby ensuring that each + ** co-routine has its own independent set of registers, because co-routines + ** might expect their registers to be preserved across an OP_Yield, and + ** that could cause problems if two or more co-routines are using the same + ** temporary register. + */ + v->pParse->nTempReg = 0; + v->pParse->nRangeReg = 0; +} + /* ** Create a new symbolic label for an instruction that has yet to be ** coded. The symbolic label is really just a negative number. The @@ -64430,7 +75243,7 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ if( p->aLabel ){ p->aLabel[i] = -1; } - return -1-i; + return ADDR(i); } /* @@ -64440,15 +75253,34 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Vdbe *v){ */ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ Parse *p = v->pParse; - int j = -1-x; + int j = ADDR(x); assert( v->magic==VDBE_MAGIC_INIT ); assert( j<p->nLabel ); - if( ALWAYS(j>=0) && p->aLabel ){ + assert( j>=0 ); + if( p->aLabel ){ +#ifdef SQLITE_DEBUG + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + printf("RESOLVE LABEL %d to %d\n", x, v->nOp); + } +#endif + assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */ p->aLabel[j] = v->nOp; } - p->iFixedOp = v->nOp - 1; } +#ifdef SQLITE_COVERAGE_TEST +/* +** Return TRUE if and only if the label x has already been resolved. +** Return FALSE (zero) if label x is still unresolved. +** +** This routine is only used inside of testcase() macros, and so it +** only exists when measuring test coverage. +*/ +SQLITE_PRIVATE int sqlite3VdbeLabelHasBeenResolved(Vdbe *v, int x){ + return v->pParse->aLabel && v->pParse->aLabel[ADDR(x)]>=0; +} +#endif /* SQLITE_COVERAGE_TEST */ + /* ** Mark the VDBE as one that can only be run one time. */ @@ -64456,6 +75288,13 @@ SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){ p->runOnlyOnce = 1; } +/* +** Mark the VDBE as one that can only be run multiple times. +*/ +SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ + p->runOnlyOnce = 0; +} + #ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */ /* @@ -64538,6 +75377,8 @@ static Op *opIterNext(VdbeOpIter *p){ ** * OP_VUpdate ** * OP_VRename ** * OP_FkCounter with P2==0 (immediate foreign key constraint) +** * OP_CreateBtree/BTREE_INTKEY and OP_InitCoroutine +** (for CREATE TABLE AS SELECT ...) ** ** Then check that the value of Parse.mayAbort is true if an ** ABORT may be thrown, or false otherwise. Return true if it does @@ -64549,6 +75390,8 @@ static Op *opIterNext(VdbeOpIter *p){ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ int hasAbort = 0; int hasFkCounter = 0; + int hasCreateTable = 0; + int hasInitCoroutine = 0; Op *pOp; VdbeOpIter sIter; memset(&sIter, 0, sizeof(sIter)); @@ -64563,6 +75406,8 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ hasAbort = 1; break; } + if( opcode==OP_CreateBtree && pOp->p3==BTREE_INTKEY ) hasCreateTable = 1; + if( opcode==OP_InitCoroutine ) hasInitCoroutine = 1; #ifndef SQLITE_OMIT_FOREIGN_KEY if( opcode==OP_FkCounter && pOp->p1==0 && pOp->p2==1 ){ hasFkCounter = 1; @@ -64576,94 +75421,150 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ ** through all opcodes and hasAbort may be set incorrectly. Return ** true for this case to prevent the assert() in the callers frame ** from failing. */ - return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter ); + return ( v->db->mallocFailed || hasAbort==mayAbort || hasFkCounter + || (hasCreateTable && hasInitCoroutine) ); } #endif /* SQLITE_DEBUG - the sqlite3AssertMayAbort() function */ +#ifdef SQLITE_DEBUG /* -** Loop through the program looking for P2 values that are negative -** on jump instructions. Each such value is a label. Resolve the -** label by setting the P2 value to its correct non-zero value. +** Increment the nWrite counter in the VDBE if the cursor is not an +** ephemeral cursor, or if the cursor argument is NULL. +*/ +SQLITE_PRIVATE void sqlite3VdbeIncrWriteCounter(Vdbe *p, VdbeCursor *pC){ + if( pC==0 + || (pC->eCurType!=CURTYPE_SORTER + && pC->eCurType!=CURTYPE_PSEUDO + && !pC->isEphemeral) + ){ + p->nWrite++; + } +} +#endif + +#ifdef SQLITE_DEBUG +/* +** Assert if an Abort at this point in time might result in a corrupt +** database. +*/ +SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){ + assert( p->nWrite==0 || p->usesStmtJournal ); +} +#endif + +/* +** This routine is called after all opcodes have been inserted. It loops +** through all the opcodes and fixes up some details. ** -** This routine is called once after all opcodes have been inserted. +** (1) For each jump instruction with a negative P2 value (a label) +** resolve the P2 value to an actual address. ** -** Variable *pMaxFuncArgs is set to the maximum value of any P2 argument -** to an OP_Function, OP_AggStep or OP_VFilter opcode. This is used by -** sqlite3VdbeMakeReady() to size the Vdbe.apArg[] array. +** (2) Compute the maximum number of arguments used by any SQL function +** and store that value in *pMaxFuncArgs. ** -** The Op.opflags field is set on all opcodes. +** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately +** indicate what the prepared statement actually does. +** +** (4) Initialize the p4.xAdvance pointer on opcodes that use it. +** +** (5) Reclaim the memory allocated for storing labels. +** +** This routine will only function correctly if the mkopcodeh.tcl generator +** script numbers the opcodes correctly. Changes to this routine must be +** coordinated with changes to mkopcodeh.tcl. */ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ - int i; int nMaxArgs = *pMaxFuncArgs; Op *pOp; Parse *pParse = p->pParse; int *aLabel = pParse->aLabel; p->readOnly = 1; p->bIsReader = 0; - for(pOp=p->aOp, i=p->nOp-1; i>=0; i--, pOp++){ - u8 opcode = pOp->opcode; + pOp = &p->aOp[p->nOp-1]; + while(1){ - /* NOTE: Be sure to update mkopcodeh.awk when adding or removing - ** cases from this switch! */ - switch( opcode ){ - case OP_Function: - case OP_AggStep: { - if( pOp->p5>nMaxArgs ) nMaxArgs = pOp->p5; - break; - } - case OP_Transaction: { - if( pOp->p2!=0 ) p->readOnly = 0; - /* fall thru */ - } - case OP_AutoCommit: - case OP_Savepoint: { - p->bIsReader = 1; - break; - } + /* Only JUMP opcodes and the short list of special opcodes in the switch + ** below need to be considered. The mkopcodeh.tcl generator script groups + ** all these opcodes together near the front of the opcode list. Skip + ** any opcode that does not need processing by virtual of the fact that + ** it is larger than SQLITE_MX_JUMP_OPCODE, as a performance optimization. + */ + if( pOp->opcode<=SQLITE_MX_JUMP_OPCODE ){ + /* NOTE: Be sure to update mkopcodeh.tcl when adding or removing + ** cases from this switch! */ + switch( pOp->opcode ){ + case OP_Transaction: { + if( pOp->p2!=0 ) p->readOnly = 0; + /* fall thru */ + } + case OP_AutoCommit: + case OP_Savepoint: { + p->bIsReader = 1; + break; + } #ifndef SQLITE_OMIT_WAL - case OP_Checkpoint: + case OP_Checkpoint: #endif - case OP_Vacuum: - case OP_JournalMode: { - p->readOnly = 0; - p->bIsReader = 1; - break; - } + case OP_Vacuum: + case OP_JournalMode: { + p->readOnly = 0; + p->bIsReader = 1; + break; + } + case OP_Next: + case OP_NextIfOpen: + case OP_SorterNext: { + pOp->p4.xAdvance = sqlite3BtreeNext; + pOp->p4type = P4_ADVANCE; + /* The code generator never codes any of these opcodes as a jump + ** to a label. They are always coded as a jump backwards to a + ** known address */ + assert( pOp->p2>=0 ); + break; + } + case OP_Prev: + case OP_PrevIfOpen: { + pOp->p4.xAdvance = sqlite3BtreePrevious; + pOp->p4type = P4_ADVANCE; + /* The code generator never codes any of these opcodes as a jump + ** to a label. They are always coded as a jump backwards to a + ** known address */ + assert( pOp->p2>=0 ); + break; + } #ifndef SQLITE_OMIT_VIRTUALTABLE - case OP_VUpdate: { - if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; - break; - } - case OP_VFilter: { - int n; - assert( p->nOp - i >= 3 ); - assert( pOp[-1].opcode==OP_Integer ); - n = pOp[-1].p1; - if( n>nMaxArgs ) nMaxArgs = n; - break; - } + case OP_VUpdate: { + if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; + break; + } + case OP_VFilter: { + int n; + assert( (pOp - p->aOp) >= 3 ); + assert( pOp[-1].opcode==OP_Integer ); + n = pOp[-1].p1; + if( n>nMaxArgs ) nMaxArgs = n; + /* Fall through into the default case */ + } #endif - case OP_Next: - case OP_NextIfOpen: - case OP_SorterNext: { - pOp->p4.xAdvance = sqlite3BtreeNext; - pOp->p4type = P4_ADVANCE; - break; - } - case OP_Prev: - case OP_PrevIfOpen: { - pOp->p4.xAdvance = sqlite3BtreePrevious; - pOp->p4type = P4_ADVANCE; - break; + default: { + if( pOp->p2<0 ){ + /* The mkopcodeh.tcl script has so arranged things that the only + ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to + ** have non-negative values for P2. */ + assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); + assert( ADDR(pOp->p2)<pParse->nLabel ); + pOp->p2 = aLabel[ADDR(pOp->p2)]; + } + break; + } } + /* The mkopcodeh.tcl script has so arranged things that the only + ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to + ** have non-negative values for P2. */ + assert( (sqlite3OpcodeProperty[pOp->opcode]&OPFLG_JUMP)==0 || pOp->p2>=0); } - - pOp->opflags = sqlite3OpcodeProperty[opcode]; - if( (pOp->opflags & OPFLG_JUMP)!=0 && pOp->p2<0 ){ - assert( -1-pOp->p2<pParse->nLabel ); - pOp->p2 = aLabel[-1-pOp->p2]; - } + if( pOp==p->aOp ) break; + pOp--; } sqlite3DbFree(p->db, pParse->aLabel); pParse->aLabel = 0; @@ -64680,6 +75581,47 @@ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ return p->nOp; } +/* +** Verify that at least N opcode slots are available in p without +** having to malloc for more space (except when compiled using +** SQLITE_TEST_REALLOC_STRESS). This interface is used during testing +** to verify that certain calls to sqlite3VdbeAddOpList() can never +** fail due to a OOM fault and hence that the return value from +** sqlite3VdbeAddOpList() will always be non-NULL. +*/ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ + assert( p->nOp + N <= p->pParse->nOpAlloc ); +} +#endif + +/* +** Verify that the VM passed as the only argument does not contain +** an OP_ResultRow opcode. Fail an assert() if it does. This is used +** by code in pragma.c to ensure that the implementation of certain +** pragmas comports with the flags specified in the mkpragmatab.tcl +** script. +*/ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) +SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p){ + int i; + for(i=0; i<p->nOp; i++){ + assert( p->aOp[i].opcode!=OP_ResultRow ); + } +} +#endif + +/* +** Generate code (a single OP_Abortable opcode) that will +** verify that the VDBE program can safely call Abort in the current +** context. +*/ +#if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int onError){ + if( onError==OE_Abort ) sqlite3VdbeAddOp0(p, OP_Abortable); +} +#endif + /* ** This function returns a pointer to the array of opcodes associated with ** the Vdbe passed as the first argument. It is the callers responsibility @@ -64705,51 +75647,54 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeTakeOpArray(Vdbe *p, int *pnOp, int *pnMaxArg) } /* -** Add a whole list of operations to the operation stack. Return the -** address of the first operation added. +** Add a whole list of operations to the operation stack. Return a +** pointer to the first operation inserted. +** +** Non-zero P2 arguments to jump instructions are automatically adjusted +** so that the jump target is relative to the first operation inserted. */ -SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe *p, int nOp, VdbeOpList const *aOp, int iLineno){ - int addr; +SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( + Vdbe *p, /* Add opcodes to the prepared statement */ + int nOp, /* Number of opcodes to add */ + VdbeOpList const *aOp, /* The opcodes to be added */ + int iLineno /* Source-file line number of first opcode */ +){ + int i; + VdbeOp *pOut, *pFirst; + assert( nOp>0 ); assert( p->magic==VDBE_MAGIC_INIT ); if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p, nOp) ){ return 0; } - addr = p->nOp; - if( ALWAYS(nOp>0) ){ - int i; - VdbeOpList const *pIn = aOp; - for(i=0; i<nOp; i++, pIn++){ - int p2 = pIn->p2; - VdbeOp *pOut = &p->aOp[i+addr]; - pOut->opcode = pIn->opcode; - pOut->p1 = pIn->p1; - if( p2<0 ){ - assert( sqlite3OpcodeProperty[pOut->opcode] & OPFLG_JUMP ); - pOut->p2 = addr + ADDR(p2); - }else{ - pOut->p2 = p2; - } - pOut->p3 = pIn->p3; - pOut->p4type = P4_NOTUSED; - pOut->p4.p = 0; - pOut->p5 = 0; + pFirst = pOut = &p->aOp[p->nOp]; + for(i=0; i<nOp; i++, aOp++, pOut++){ + pOut->opcode = aOp->opcode; + pOut->p1 = aOp->p1; + pOut->p2 = aOp->p2; + assert( aOp->p2>=0 ); + if( (sqlite3OpcodeProperty[aOp->opcode] & OPFLG_JUMP)!=0 && aOp->p2>0 ){ + pOut->p2 += p->nOp; + } + pOut->p3 = aOp->p3; + pOut->p4type = P4_NOTUSED; + pOut->p4.p = 0; + pOut->p5 = 0; #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - pOut->zComment = 0; + pOut->zComment = 0; #endif #ifdef SQLITE_VDBE_COVERAGE - pOut->iSrcLine = iLineno+i; + pOut->iSrcLine = iLineno+i; #else - (void)iLineno; + (void)iLineno; #endif #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ - sqlite3VdbePrintOp(0, i+addr, &p->aOp[i+addr]); - } -#endif + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + sqlite3VdbePrintOp(0, i+p->nOp, &p->aOp[i+p->nOp]); } - p->nOp += nOp; +#endif } - return addr; + p->nOp += nOp; + return pFirst; } #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) @@ -64781,49 +75726,24 @@ SQLITE_PRIVATE void sqlite3VdbeScanStatus( /* -** Change the value of the P1 operand for a specific instruction. -** This routine is useful when a large program is loaded from a -** static array using sqlite3VdbeAddOpList but we want to make a -** few minor changes to the program. +** Change the value of the opcode, or P1, P2, P3, or P5 operands +** for a specific instruction. */ +SQLITE_PRIVATE void sqlite3VdbeChangeOpcode(Vdbe *p, u32 addr, u8 iNewOpcode){ + sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; +} SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe *p, u32 addr, int val){ - assert( p!=0 ); - if( ((u32)p->nOp)>addr ){ - p->aOp[addr].p1 = val; - } + sqlite3VdbeGetOp(p,addr)->p1 = val; } - -/* -** Change the value of the P2 operand for a specific instruction. -** This routine is useful for setting a jump destination. -*/ SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe *p, u32 addr, int val){ - assert( p!=0 ); - if( ((u32)p->nOp)>addr ){ - p->aOp[addr].p2 = val; - } + sqlite3VdbeGetOp(p,addr)->p2 = val; } - -/* -** Change the value of the P3 operand for a specific instruction. -*/ SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe *p, u32 addr, int val){ - assert( p!=0 ); - if( ((u32)p->nOp)>addr ){ - p->aOp[addr].p3 = val; - } + sqlite3VdbeGetOp(p,addr)->p3 = val; } - -/* -** Change the value of the P5 operand for the most recently -** added operation. -*/ -SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u8 val){ - assert( p!=0 ); - if( p->aOp ){ - assert( p->nOp>0 ); - p->aOp[p->nOp-1].p5 = val; - } +SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){ + assert( p->nOp>0 || p->db->mallocFailed ); + if( p->nOp>0 ) p->aOp[p->nOp-1].p5 = p5; } /* @@ -64832,7 +75752,6 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe *p, u8 val){ */ SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ sqlite3VdbeChangeP2(p, addr, p->nOp); - p->pParse->iFixedOp = p->nOp - 1; } @@ -64841,8 +75760,8 @@ SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){ ** the FuncDef is not ephermal, then do nothing. */ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ - if( ALWAYS(pDef) && (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ - sqlite3DbFree(db, pDef); + if( (pDef->funcFlags & SQLITE_FUNC_EPHEM)!=0 ){ + sqlite3DbFreeNN(db, pDef); } } @@ -64851,43 +75770,54 @@ static void vdbeFreeOpArray(sqlite3 *, Op *, int); /* ** Delete a P4 value if necessary. */ +static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ + if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); + sqlite3DbFreeNN(db, p); +} +static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){ + freeEphemeralFunction(db, p->pFunc); + sqlite3DbFreeNN(db, p); +} static void freeP4(sqlite3 *db, int p4type, void *p4){ - if( p4 ){ - assert( db ); - switch( p4type ){ - case P4_REAL: - case P4_INT64: - case P4_DYNAMIC: - case P4_INTARRAY: { - sqlite3DbFree(db, p4); - break; - } - case P4_KEYINFO: { - if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4); - break; - } - case P4_MPRINTF: { - if( db->pnBytesFreed==0 ) sqlite3_free(p4); - break; - } - case P4_FUNCDEF: { - freeEphemeralFunction(db, (FuncDef*)p4); - break; - } - case P4_MEM: { - if( db->pnBytesFreed==0 ){ - sqlite3ValueFree((sqlite3_value*)p4); - }else{ - Mem *p = (Mem*)p4; - if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); - sqlite3DbFree(db, p); - } - break; - } - case P4_VTAB : { - if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4); - break; + assert( db ); + switch( p4type ){ + case P4_FUNCCTX: { + freeP4FuncCtx(db, (sqlite3_context*)p4); + break; + } + case P4_REAL: + case P4_INT64: + case P4_DYNAMIC: + case P4_DYNBLOB: + case P4_INTARRAY: { + sqlite3DbFree(db, p4); + break; + } + case P4_KEYINFO: { + if( db->pnBytesFreed==0 ) sqlite3KeyInfoUnref((KeyInfo*)p4); + break; + } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + sqlite3ExprDelete(db, (Expr*)p4); + break; + } +#endif + case P4_FUNCDEF: { + freeEphemeralFunction(db, (FuncDef*)p4); + break; + } + case P4_MEM: { + if( db->pnBytesFreed==0 ){ + sqlite3ValueFree((sqlite3_value*)p4); + }else{ + freeP4Mem(db, (Mem*)p4); } + break; + } + case P4_VTAB : { + if( db->pnBytesFreed==0 ) sqlite3VtabUnlock((VTable *)p4); + break; } } } @@ -64900,14 +75830,14 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ if( aOp ){ Op *pOp; - for(pOp=aOp; pOp<&aOp[nOp]; pOp++){ - freeP4(db, pOp->p4type, pOp->p4.p); + for(pOp=&aOp[nOp-1]; pOp>=aOp; pOp--){ + if( pOp->p4type <= P4_FREE_IF_LE ) freeP4(db, pOp->p4type, pOp->p4.p); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS sqlite3DbFree(db, pOp->zComment); #endif } + sqlite3DbFreeNN(db, aOp); } - sqlite3DbFree(db, aOp); } /* @@ -64923,15 +75853,16 @@ SQLITE_PRIVATE void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ /* ** Change the opcode at addr into OP_Noop */ -SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe *p, int addr){ - if( addr<p->nOp ){ - VdbeOp *pOp = &p->aOp[addr]; - sqlite3 *db = p->db; - freeP4(db, pOp->p4type, pOp->p4.p); - memset(pOp, 0, sizeof(pOp[0])); - pOp->opcode = OP_Noop; - if( addr==p->nOp-1 ) p->nOp--; - } +SQLITE_PRIVATE int sqlite3VdbeChangeToNoop(Vdbe *p, int addr){ + VdbeOp *pOp; + if( p->db->mallocFailed ) return 0; + assert( addr>=0 && addr<p->nOp ); + pOp = &p->aOp[addr]; + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = P4_NOTUSED; + pOp->p4.z = 0; + pOp->opcode = OP_Noop; + return 1; } /* @@ -64939,9 +75870,8 @@ SQLITE_PRIVATE void sqlite3VdbeChangeToNoop(Vdbe *p, int addr){ ** then remove it. Return true if and only if an opcode was removed. */ SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ - if( (p->nOp-1)>(p->pParse->iFixedOp) && p->aOp[p->nOp-1].opcode==op ){ - sqlite3VdbeChangeToNoop(p, p->nOp-1); - return 1; + if( p->nOp>0 && p->aOp[p->nOp-1].opcode==op ){ + return sqlite3VdbeChangeToNoop(p, p->nOp-1); }else{ return 0; } @@ -64964,16 +75894,34 @@ SQLITE_PRIVATE int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ ** ** If addr<0 then change P4 on the most recently inserted instruction. */ +static void SQLITE_NOINLINE vdbeChangeP4Full( + Vdbe *p, + Op *pOp, + const char *zP4, + int n +){ + if( pOp->p4type ){ + freeP4(p->db, pOp->p4type, pOp->p4.p); + pOp->p4type = 0; + pOp->p4.p = 0; + } + if( n<0 ){ + sqlite3VdbeChangeP4(p, (int)(pOp - p->aOp), zP4, n); + }else{ + if( n==0 ) n = sqlite3Strlen30(zP4); + pOp->p4.z = sqlite3DbStrNDup(p->db, zP4, n); + pOp->p4type = P4_DYNAMIC; + } +} SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int n){ Op *pOp; sqlite3 *db; assert( p!=0 ); db = p->db; assert( p->magic==VDBE_MAGIC_INIT ); - if( p->aOp==0 || db->mallocFailed ){ - if( n!=P4_VTAB ){ - freeP4(db, n, (void*)*(char**)&zP4); - } + assert( p->aOp!=0 || db->mallocFailed ); + if( db->mallocFailed ){ + if( n!=P4_VTAB ) freeP4(db, n, (void*)*(char**)&zP4); return; } assert( p->nOp>0 ); @@ -64982,34 +75930,45 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int addr = p->nOp - 1; } pOp = &p->aOp[addr]; - assert( pOp->p4type==P4_NOTUSED - || pOp->p4type==P4_INT32 - || pOp->p4type==P4_KEYINFO ); - freeP4(db, pOp->p4type, pOp->p4.p); - pOp->p4.p = 0; + if( n>=0 || pOp->p4type ){ + vdbeChangeP4Full(p, pOp, zP4, n); + return; + } if( n==P4_INT32 ){ /* Note: this cast is safe, because the origin data point was an int ** that was cast to a (const char *). */ pOp->p4.i = SQLITE_PTR_TO_INT(zP4); pOp->p4type = P4_INT32; - }else if( zP4==0 ){ - pOp->p4.p = 0; - pOp->p4type = P4_NOTUSED; - }else if( n==P4_KEYINFO ){ - pOp->p4.p = (void*)zP4; - pOp->p4type = P4_KEYINFO; - }else if( n==P4_VTAB ){ - pOp->p4.p = (void*)zP4; - pOp->p4type = P4_VTAB; - sqlite3VtabLock((VTable *)zP4); - assert( ((VTable *)zP4)->db==p->db ); - }else if( n<0 ){ + }else if( zP4!=0 ){ + assert( n<0 ); pOp->p4.p = (void*)zP4; pOp->p4type = (signed char)n; + if( n==P4_VTAB ) sqlite3VtabLock((VTable*)zP4); + } +} + +/* +** Change the P4 operand of the most recently coded instruction +** to the value defined by the arguments. This is a high-speed +** version of sqlite3VdbeChangeP4(). +** +** The P4 operand must not have been previously defined. And the new +** P4 must not be P4_INT32. Use sqlite3VdbeChangeP4() in either of +** those cases. +*/ +SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe *p, void *pP4, int n){ + VdbeOp *pOp; + assert( n!=P4_INT32 && n!=P4_VTAB ); + assert( n<=0 ); + if( p->db->mallocFailed ){ + freeP4(p->db, n, pP4); }else{ - if( n==0 ) n = sqlite3Strlen30(zP4); - pOp->p4.z = sqlite3DbStrNDup(p->db, zP4, n); - pOp->p4type = P4_DYNAMIC; + assert( pP4!=0 ); + assert( p->nOp>0 ); + pOp = &p->aOp[p->nOp-1]; + assert( pOp->p4type==P4_NOTUSED ); + pOp->p4type = n; + pOp->p4.p = pP4; } } @@ -65019,10 +75978,11 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int */ SQLITE_PRIVATE void sqlite3VdbeSetP4KeyInfo(Parse *pParse, Index *pIdx){ Vdbe *v = pParse->pVdbe; + KeyInfo *pKeyInfo; assert( v!=0 ); assert( pIdx!=0 ); - sqlite3VdbeChangeP4(v, -1, (char*)sqlite3KeyInfoOfIndex(pParse, pIdx), - P4_KEYINFO); + pKeyInfo = sqlite3KeyInfoOfIndex(pParse, pIdx); + if( pKeyInfo ) sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); } #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS @@ -65134,12 +76094,21 @@ static int displayComment( const char *zSynopsis; int nOpName; int ii, jj; + char zAlt[50]; zOpName = sqlite3OpcodeName(pOp->opcode); nOpName = sqlite3Strlen30(zOpName); if( zOpName[nOpName+1] ){ int seenCom = 0; char c; zSynopsis = zOpName += nOpName + 1; + if( strncmp(zSynopsis,"IF ",3)==0 ){ + if( pOp->p5 & SQLITE_STOREP2 ){ + sqlite3_snprintf(sizeof(zAlt), zAlt, "r[P2] = (%s)", zSynopsis+3); + }else{ + sqlite3_snprintf(sizeof(zAlt), zAlt, "if %s goto P2", zSynopsis+3); + } + zSynopsis = zAlt; + } for(ii=jj=0; jj<nTemp-1 && (c = zSynopsis[ii])!=0; ii++){ if( c=='P' ){ c = zSynopsis[++ii]; @@ -65188,67 +76157,139 @@ static int displayComment( } #endif /* SQLITE_DEBUG */ +#if VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) +/* +** Translate the P4.pExpr value for an OP_CursorHint opcode into text +** that can be displayed in the P4 column of EXPLAIN output. +*/ +static void displayP4Expr(StrAccum *p, Expr *pExpr){ + const char *zOp = 0; + switch( pExpr->op ){ + case TK_STRING: + sqlite3_str_appendf(p, "%Q", pExpr->u.zToken); + break; + case TK_INTEGER: + sqlite3_str_appendf(p, "%d", pExpr->u.iValue); + break; + case TK_NULL: + sqlite3_str_appendf(p, "NULL"); + break; + case TK_REGISTER: { + sqlite3_str_appendf(p, "r[%d]", pExpr->iTable); + break; + } + case TK_COLUMN: { + if( pExpr->iColumn<0 ){ + sqlite3_str_appendf(p, "rowid"); + }else{ + sqlite3_str_appendf(p, "c%d", (int)pExpr->iColumn); + } + break; + } + case TK_LT: zOp = "LT"; break; + case TK_LE: zOp = "LE"; break; + case TK_GT: zOp = "GT"; break; + case TK_GE: zOp = "GE"; break; + case TK_NE: zOp = "NE"; break; + case TK_EQ: zOp = "EQ"; break; + case TK_IS: zOp = "IS"; break; + case TK_ISNOT: zOp = "ISNOT"; break; + case TK_AND: zOp = "AND"; break; + case TK_OR: zOp = "OR"; break; + case TK_PLUS: zOp = "ADD"; break; + case TK_STAR: zOp = "MUL"; break; + case TK_MINUS: zOp = "SUB"; break; + case TK_REM: zOp = "REM"; break; + case TK_BITAND: zOp = "BITAND"; break; + case TK_BITOR: zOp = "BITOR"; break; + case TK_SLASH: zOp = "DIV"; break; + case TK_LSHIFT: zOp = "LSHIFT"; break; + case TK_RSHIFT: zOp = "RSHIFT"; break; + case TK_CONCAT: zOp = "CONCAT"; break; + case TK_UMINUS: zOp = "MINUS"; break; + case TK_UPLUS: zOp = "PLUS"; break; + case TK_BITNOT: zOp = "BITNOT"; break; + case TK_NOT: zOp = "NOT"; break; + case TK_ISNULL: zOp = "ISNULL"; break; + case TK_NOTNULL: zOp = "NOTNULL"; break; -#if !defined(SQLITE_OMIT_EXPLAIN) || !defined(NDEBUG) \ - || defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) + default: + sqlite3_str_appendf(p, "%s", "expr"); + break; + } + + if( zOp ){ + sqlite3_str_appendf(p, "%s(", zOp); + displayP4Expr(p, pExpr->pLeft); + if( pExpr->pRight ){ + sqlite3_str_append(p, ",", 1); + displayP4Expr(p, pExpr->pRight); + } + sqlite3_str_append(p, ")", 1); + } +} +#endif /* VDBE_DISPLAY_P4 && defined(SQLITE_ENABLE_CURSOR_HINTS) */ + + +#if VDBE_DISPLAY_P4 /* ** Compute a string that describes the P4 parameter for an opcode. ** Use zTemp for any required temporary buffer space. */ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ char *zP4 = zTemp; + StrAccum x; assert( nTemp>=20 ); + sqlite3StrAccumInit(&x, 0, zTemp, nTemp, 0); switch( pOp->p4type ){ case P4_KEYINFO: { - int i, j; + int j; KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; assert( pKeyInfo->aSortOrder!=0 ); - sqlite3_snprintf(nTemp, zTemp, "k(%d", pKeyInfo->nField); - i = sqlite3Strlen30(zTemp); - for(j=0; j<pKeyInfo->nField; j++){ + sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField); + for(j=0; j<pKeyInfo->nKeyField; j++){ CollSeq *pColl = pKeyInfo->aColl[j]; - const char *zColl = pColl ? pColl->zName : "nil"; - int n = sqlite3Strlen30(zColl); - if( n==6 && memcmp(zColl,"BINARY",6)==0 ){ - zColl = "B"; - n = 1; - } - if( i+n>nTemp-6 ){ - memcpy(&zTemp[i],",...",4); - break; - } - zTemp[i++] = ','; - if( pKeyInfo->aSortOrder[j] ){ - zTemp[i++] = '-'; - } - memcpy(&zTemp[i], zColl, n+1); - i += n; + const char *zColl = pColl ? pColl->zName : ""; + if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; + sqlite3_str_appendf(&x, ",%s%s", + pKeyInfo->aSortOrder[j] ? "-" : "", zColl); } - zTemp[i++] = ')'; - zTemp[i] = 0; - assert( i<nTemp ); + sqlite3_str_append(&x, ")", 1); break; } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + case P4_EXPR: { + displayP4Expr(&x, pOp->p4.pExpr); + break; + } +#endif case P4_COLLSEQ: { CollSeq *pColl = pOp->p4.pColl; - sqlite3_snprintf(nTemp, zTemp, "(%.20s)", pColl->zName); + sqlite3_str_appendf(&x, "(%.20s)", pColl->zName); break; } case P4_FUNCDEF: { FuncDef *pDef = pOp->p4.pFunc; - sqlite3_snprintf(nTemp, zTemp, "%s(%d)", pDef->zName, pDef->nArg); + sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + case P4_FUNCCTX: { + FuncDef *pDef = pOp->p4.pCtx->pFunc; + sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); + break; + } +#endif case P4_INT64: { - sqlite3_snprintf(nTemp, zTemp, "%lld", *pOp->p4.pI64); + sqlite3_str_appendf(&x, "%lld", *pOp->p4.pI64); break; } case P4_INT32: { - sqlite3_snprintf(nTemp, zTemp, "%d", pOp->p4.i); + sqlite3_str_appendf(&x, "%d", pOp->p4.i); break; } case P4_REAL: { - sqlite3_snprintf(nTemp, zTemp, "%.16g", *pOp->p4.pReal); + sqlite3_str_appendf(&x, "%.16g", *pOp->p4.pReal); break; } case P4_MEM: { @@ -65256,11 +76297,11 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ if( pMem->flags & MEM_Str ){ zP4 = pMem->z; }else if( pMem->flags & MEM_Int ){ - sqlite3_snprintf(nTemp, zTemp, "%lld", pMem->u.i); + sqlite3_str_appendf(&x, "%lld", pMem->u.i); }else if( pMem->flags & MEM_Real ){ - sqlite3_snprintf(nTemp, zTemp, "%.16g", pMem->u.r); + sqlite3_str_appendf(&x, "%.16g", pMem->u.r); }else if( pMem->flags & MEM_Null ){ - sqlite3_snprintf(nTemp, zTemp, "NULL"); + zP4 = "NULL"; }else{ assert( pMem->flags & MEM_Blob ); zP4 = "(blob)"; @@ -65270,22 +76311,35 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ #ifndef SQLITE_OMIT_VIRTUALTABLE case P4_VTAB: { sqlite3_vtab *pVtab = pOp->p4.pVtab->pVtab; - sqlite3_snprintf(nTemp, zTemp, "vtab:%p:%p", pVtab, pVtab->pModule); + sqlite3_str_appendf(&x, "vtab:%p", pVtab); break; } #endif case P4_INTARRAY: { - sqlite3_snprintf(nTemp, zTemp, "intarray"); + int i; + int *ai = pOp->p4.ai; + int n = ai[0]; /* The first element of an INTARRAY is always the + ** count of the number of elements to follow */ + for(i=1; i<=n; i++){ + sqlite3_str_appendf(&x, ",%d", ai[i]); + } + zTemp[0] = '['; + sqlite3_str_append(&x, "]", 1); break; } case P4_SUBPROGRAM: { - sqlite3_snprintf(nTemp, zTemp, "program"); + sqlite3_str_appendf(&x, "program"); break; } + case P4_DYNBLOB: case P4_ADVANCE: { zTemp[0] = 0; break; } + case P4_TABLE: { + sqlite3_str_appendf(&x, "%s", pOp->p4.pTab->zName); + break; + } default: { zP4 = pOp->p4.z; if( zP4==0 ){ @@ -65294,10 +76348,11 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ } } } + sqlite3StrAccumFinish(&x); assert( zP4!=0 ); return zP4; } -#endif +#endif /* VDBE_DISPLAY_P4 */ /* ** Declare to the Vdbe that the BTree object at db->aDb[i] is used. @@ -65316,7 +76371,7 @@ SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){ } } -#if !defined(SQLITE_OMIT_SHARED_CACHE) && SQLITE_THREADSAFE>0 +#if !defined(SQLITE_OMIT_SHARED_CACHE) /* ** If SQLite is compiled to support shared-cache mode and to be threadsafe, ** this routine obtains the mutex associated with each BtShared structure @@ -65359,12 +76414,11 @@ SQLITE_PRIVATE void sqlite3VdbeEnter(Vdbe *p){ /* ** Unlock all of the btrees previously locked by a call to sqlite3VdbeEnter(). */ -SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ +static SQLITE_NOINLINE void vdbeLeave(Vdbe *p){ int i; sqlite3 *db; Db *aDb; int nDb; - if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ db = p->db; aDb = db->aDb; nDb = db->nDb; @@ -65374,6 +76428,10 @@ SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ } } } +SQLITE_PRIVATE void sqlite3VdbeLeave(Vdbe *p){ + if( DbMaskAllZero(p->lockMask) ) return; /* The common case */ + vdbeLeave(p); +} #endif #if defined(VDBE_PROFILE) || defined(SQLITE_DEBUG) @@ -65403,6 +76461,21 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, Op *pOp){ } #endif +/* +** Initialize an array of N Mem element. +*/ +static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ + while( (N--)>0 ){ + p->db = db; + p->flags = flags; + p->szMalloc = 0; +#ifdef SQLITE_DEBUG + p->pScopyFrom = 0; +#endif + p++; + } +} + /* ** Release an array of N Mem elements */ @@ -65410,7 +76483,6 @@ static void releaseMemArray(Mem *p, int N){ if( p && N ){ Mem *pEnd = &p[N]; sqlite3 *db = p->db; - u8 malloc_failed = db->mallocFailed; if( db->pnBytesFreed ){ do{ if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); @@ -65440,13 +76512,12 @@ static void releaseMemArray(Mem *p, int N){ if( p->flags&(MEM_Agg|MEM_Dyn|MEM_Frame|MEM_RowSet) ){ sqlite3VdbeMemRelease(p); }else if( p->szMalloc ){ - sqlite3DbFree(db, p->zMalloc); + sqlite3DbFreeNN(db, p->zMalloc); p->szMalloc = 0; } p->flags = MEM_Undefined; }while( (++p)<pEnd ); - db->mallocFailed = malloc_failed; } } @@ -65462,6 +76533,7 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ sqlite3VdbeFreeCursor(p->v, apCsr[i]); } releaseMemArray(aMem, p->nChildMem); + sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0); sqlite3DbFree(p->v->db, p); } @@ -65477,6 +76549,9 @@ SQLITE_PRIVATE void sqlite3VdbeFrameDelete(VdbeFrame *p){ ** p->explain==2, only OP_Explain instructions are listed and these ** are shown in a different format. p->explain==2 is used to implement ** EXPLAIN QUERY PLAN. +** 2018-04-24: In p->explain==2 mode, the OP_Init opcodes of triggers +** are also shown, so that the boundaries between the main program and +** each trigger are clear. ** ** When p->explain==1, first the main program is listed, then each of ** the trigger subprograms are listed one by one. @@ -65492,6 +76567,8 @@ SQLITE_PRIVATE int sqlite3VdbeList( int i; /* Loop counter */ int rc = SQLITE_OK; /* Return code */ Mem *pMem = &p->aMem[1]; /* First Mem of result set */ + int bListSubprogs = (p->explain==1 || (db->flags & SQLITE_TriggerEQP)!=0); + Op *pOp = 0; assert( p->explain ); assert( p->magic==VDBE_MAGIC_RUN ); @@ -65507,7 +76584,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( if( p->rc==SQLITE_NOMEM ){ /* This happens if a malloc() inside a call to sqlite3_column_text() or ** sqlite3_column_text16() failed. */ - db->mallocFailed = 1; + sqlite3OomFault(db); return SQLITE_ERROR; } @@ -65519,7 +76596,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( ** encountered, but p->pc will eventually catch up to nRow. */ nRow = p->nOp; - if( p->explain==1 ){ + if( bListSubprogs ){ /* The first 8 memory cells are used for the result set. So we will ** commandeer the 9th cell to use as storage for an array of pointers ** to trigger subprograms. The VDBE is guaranteed to have at least 9 @@ -65537,19 +76614,13 @@ SQLITE_PRIVATE int sqlite3VdbeList( } } - do{ + while(1){ /* Loop exits via break */ i = p->pc++; - }while( i<nRow && p->explain==2 && p->aOp[i].opcode!=OP_Explain ); - if( i>=nRow ){ - p->rc = SQLITE_OK; - rc = SQLITE_DONE; - }else if( db->u1.isInterrupted ){ - p->rc = SQLITE_INTERRUPT; - rc = SQLITE_ERROR; - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(p->rc)); - }else{ - char *zP4; - Op *pOp; + if( i>=nRow ){ + p->rc = SQLITE_OK; + rc = SQLITE_DONE; + break; + } if( i<p->nOp ){ /* The output line number is small enough that we are still in the ** main program. */ @@ -65564,93 +76635,113 @@ SQLITE_PRIVATE int sqlite3VdbeList( } pOp = &apSub[j]->aOp[i]; } - if( p->explain==1 ){ - pMem->flags = MEM_Int; - pMem->u.i = i; /* Program counter */ - pMem++; - - pMem->flags = MEM_Static|MEM_Str|MEM_Term; - pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ - assert( pMem->z!=0 ); - pMem->n = sqlite3Strlen30(pMem->z); - pMem->enc = SQLITE_UTF8; - pMem++; - /* When an OP_Program opcode is encounter (the only opcode that has - ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms - ** kept in p->aMem[9].z to hold the new program - assuming this subprogram - ** has not already been seen. - */ - if( pOp->p4type==P4_SUBPROGRAM ){ - int nByte = (nSub+1)*sizeof(SubProgram*); - int j; - for(j=0; j<nSub; j++){ - if( apSub[j]==pOp->p4.pProgram ) break; - } - if( j==nSub && SQLITE_OK==sqlite3VdbeMemGrow(pSub, nByte, nSub!=0) ){ - apSub = (SubProgram **)pSub->z; - apSub[nSub++] = pOp->p4.pProgram; - pSub->flags |= MEM_Blob; - pSub->n = nSub*sizeof(SubProgram*); + /* When an OP_Program opcode is encounter (the only opcode that has + ** a P4_SUBPROGRAM argument), expand the size of the array of subprograms + ** kept in p->aMem[9].z to hold the new program - assuming this subprogram + ** has not already been seen. + */ + if( bListSubprogs && pOp->p4type==P4_SUBPROGRAM ){ + int nByte = (nSub+1)*sizeof(SubProgram*); + int j; + for(j=0; j<nSub; j++){ + if( apSub[j]==pOp->p4.pProgram ) break; + } + if( j==nSub ){ + p->rc = sqlite3VdbeMemGrow(pSub, nByte, nSub!=0); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + break; } + apSub = (SubProgram **)pSub->z; + apSub[nSub++] = pOp->p4.pProgram; + pSub->flags |= MEM_Blob; + pSub->n = nSub*sizeof(SubProgram*); + nRow += pOp->p4.pProgram->nOp; } } + if( p->explain<2 ) break; + if( pOp->opcode==OP_Explain ) break; + if( pOp->opcode==OP_Init && p->pc>1 ) break; + } - pMem->flags = MEM_Int; - pMem->u.i = pOp->p1; /* P1 */ - pMem++; - - pMem->flags = MEM_Int; - pMem->u.i = pOp->p2; /* P2 */ - pMem++; - - pMem->flags = MEM_Int; - pMem->u.i = pOp->p3; /* P3 */ - pMem++; - - if( sqlite3VdbeMemClearAndResize(pMem, 32) ){ /* P4 */ - assert( p->db->mallocFailed ); - return SQLITE_ERROR; - } - pMem->flags = MEM_Str|MEM_Term; - zP4 = displayP4(pOp, pMem->z, 32); - if( zP4!=pMem->z ){ - sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0); + if( rc==SQLITE_OK ){ + if( db->u1.isInterrupted ){ + p->rc = SQLITE_INTERRUPT; + rc = SQLITE_ERROR; + sqlite3VdbeError(p, sqlite3ErrStr(p->rc)); }else{ - assert( pMem->z!=0 ); - pMem->n = sqlite3Strlen30(pMem->z); - pMem->enc = SQLITE_UTF8; - } - pMem++; - - if( p->explain==1 ){ - if( sqlite3VdbeMemClearAndResize(pMem, 4) ){ - assert( p->db->mallocFailed ); - return SQLITE_ERROR; + char *zP4; + if( p->explain==1 ){ + pMem->flags = MEM_Int; + pMem->u.i = i; /* Program counter */ + pMem++; + + pMem->flags = MEM_Static|MEM_Str|MEM_Term; + pMem->z = (char*)sqlite3OpcodeName(pOp->opcode); /* Opcode */ + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30(pMem->z); + pMem->enc = SQLITE_UTF8; + pMem++; } - pMem->flags = MEM_Str|MEM_Term; - pMem->n = 2; - sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */ - pMem->enc = SQLITE_UTF8; + + pMem->flags = MEM_Int; + pMem->u.i = pOp->p1; /* P1 */ pMem++; - -#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS - if( sqlite3VdbeMemClearAndResize(pMem, 500) ){ + + pMem->flags = MEM_Int; + pMem->u.i = pOp->p2; /* P2 */ + pMem++; + + pMem->flags = MEM_Int; + pMem->u.i = pOp->p3; /* P3 */ + pMem++; + + if( sqlite3VdbeMemClearAndResize(pMem, 100) ){ /* P4 */ assert( p->db->mallocFailed ); return SQLITE_ERROR; } pMem->flags = MEM_Str|MEM_Term; - pMem->n = displayComment(pOp, zP4, pMem->z, 500); - pMem->enc = SQLITE_UTF8; -#else - pMem->flags = MEM_Null; /* Comment */ -#endif - } + zP4 = displayP4(pOp, pMem->z, pMem->szMalloc); + if( zP4!=pMem->z ){ + pMem->n = 0; + sqlite3VdbeMemSetStr(pMem, zP4, -1, SQLITE_UTF8, 0); + }else{ + assert( pMem->z!=0 ); + pMem->n = sqlite3Strlen30(pMem->z); + pMem->enc = SQLITE_UTF8; + } + pMem++; - p->nResColumn = 8 - 4*(p->explain-1); - p->pResultSet = &p->aMem[1]; - p->rc = SQLITE_OK; - rc = SQLITE_ROW; + if( p->explain==1 ){ + if( sqlite3VdbeMemClearAndResize(pMem, 4) ){ + assert( p->db->mallocFailed ); + return SQLITE_ERROR; + } + pMem->flags = MEM_Str|MEM_Term; + pMem->n = 2; + sqlite3_snprintf(3, pMem->z, "%.2x", pOp->p5); /* P5 */ + pMem->enc = SQLITE_UTF8; + pMem++; + +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( sqlite3VdbeMemClearAndResize(pMem, 500) ){ + assert( p->db->mallocFailed ); + return SQLITE_ERROR; + } + pMem->flags = MEM_Str|MEM_Term; + pMem->n = displayComment(pOp, zP4, pMem->z, 500); + pMem->enc = SQLITE_UTF8; +#else + pMem->flags = MEM_Null; /* Comment */ +#endif + } + + p->nResColumn = 8 - 4*(p->explain-1); + p->pResultSet = &p->aMem[1]; + p->rc = SQLITE_OK; + rc = SQLITE_ROW; + } } return rc; } @@ -65705,43 +76796,46 @@ SQLITE_PRIVATE void sqlite3VdbeIOTraceSql(Vdbe *p){ } #endif /* !SQLITE_OMIT_TRACE && SQLITE_ENABLE_IOTRACE */ -/* -** Allocate space from a fixed size buffer and return a pointer to -** that space. If insufficient space is available, return NULL. +/* An instance of this object describes bulk memory available for use +** by subcomponents of a prepared statement. Space is allocated out +** of a ReusableSpace object by the allocSpace() routine below. +*/ +struct ReusableSpace { + u8 *pSpace; /* Available memory */ + int nFree; /* Bytes of available memory */ + int nNeeded; /* Total bytes that could not be allocated */ +}; + +/* Try to allocate nByte bytes of 8-byte aligned bulk memory for pBuf +** from the ReusableSpace object. Return a pointer to the allocated +** memory on success. If insufficient memory is available in the +** ReusableSpace object, increase the ReusableSpace.nNeeded +** value by the amount needed and return NULL. ** -** The pBuf parameter is the initial value of a pointer which will -** receive the new memory. pBuf is normally NULL. If pBuf is not -** NULL, it means that memory space has already been allocated and that -** this routine should not allocate any new memory. When pBuf is not -** NULL simply return pBuf. Only allocate new memory space when pBuf -** is NULL. +** If pBuf is not initially NULL, that means that the memory has already +** been allocated by a prior call to this routine, so just return a copy +** of pBuf and leave ReusableSpace unchanged. ** -** nByte is the number of bytes of space needed. -** -** *ppFrom points to available space and pEnd points to the end of the -** available space. When space is allocated, *ppFrom is advanced past -** the end of the allocated space. -** -** *pnByte is a counter of the number of bytes of space that have failed -** to allocate. If there is insufficient space in *ppFrom to satisfy the -** request, then increment *pnByte by the amount of the request. +** This allocator is employed to repurpose unused slots at the end of the +** opcode array of prepared state for other memory needs of the prepared +** statement. */ static void *allocSpace( - void *pBuf, /* Where return pointer will be stored */ - int nByte, /* Number of bytes to allocate */ - u8 **ppFrom, /* IN/OUT: Allocate from *ppFrom */ - u8 *pEnd, /* Pointer to 1 byte past the end of *ppFrom buffer */ - int *pnByte /* If allocation cannot be made, increment *pnByte */ + struct ReusableSpace *p, /* Bulk memory available for allocation */ + void *pBuf, /* Pointer to a prior allocation */ + int nByte /* Bytes of memory needed */ ){ - assert( EIGHT_BYTE_ALIGNMENT(*ppFrom) ); - if( pBuf ) return pBuf; - nByte = ROUND8(nByte); - if( &(*ppFrom)[nByte] <= pEnd ){ - pBuf = (void*)*ppFrom; - *ppFrom += nByte; - }else{ - *pnByte += nByte; + assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); + if( pBuf==0 ){ + nByte = ROUND8(nByte); + if( nByte <= p->nFree ){ + p->nFree -= nByte; + pBuf = &p->pSpace[p->nFree]; + }else{ + p->nNeeded += nByte; + } } + assert( EIGHT_BYTE_ALIGNMENT(pBuf) ); return pBuf; } @@ -65754,7 +76848,7 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ int i; #endif assert( p!=0 ); - assert( p->magic==VDBE_MAGIC_INIT ); + assert( p->magic==VDBE_MAGIC_INIT || p->magic==VDBE_MAGIC_RESET ); /* There should be at least one opcode. */ @@ -65764,14 +76858,13 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ p->magic = VDBE_MAGIC_RUN; #ifdef SQLITE_DEBUG - for(i=1; i<p->nMem; i++){ + for(i=0; i<p->nMem; i++){ assert( p->aMem[i].db==p->db ); } #endif p->pc = -1; p->rc = SQLITE_OK; p->errorAction = OE_Abort; - p->magic = VDBE_MAGIC_RUN; p->nChange = 0; p->cacheCtr = 1; p->minWriteFileFormat = 255; @@ -65812,11 +76905,8 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( int nMem; /* Number of VM memory registers */ int nCursor; /* Number of cursors required */ int nArg; /* Number of arguments in subprograms */ - int nOnce; /* Number of OP_Once instructions */ int n; /* Loop counter */ - u8 *zCsr; /* Memory available for allocation */ - u8 *zEnd; /* First byte past allocated memory */ - int nByte; /* How much extra memory is needed */ + struct ReusableSpace x; /* Reusable bulk memory */ assert( p!=0 ); assert( p->nOp>0 ); @@ -65829,88 +76919,75 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( nMem = pParse->nMem; nCursor = pParse->nTab; nArg = pParse->nMaxArg; - nOnce = pParse->nOnce; - if( nOnce==0 ) nOnce = 1; /* Ensure at least one byte in p->aOnceFlag[] */ - /* For each cursor required, also allocate a memory cell. Memory - ** cells (nMem+1-nCursor)..nMem, inclusive, will never be used by - ** the vdbe program. Instead they are used to allocate space for - ** VdbeCursor/BtCursor structures. The blob of memory associated with - ** cursor 0 is stored in memory cell nMem. Memory cell (nMem-1) - ** stores the blob of memory associated with cursor 1, etc. - ** + /* Each cursor uses a memory cell. The first cursor (cursor 0) can + ** use aMem[0] which is not otherwise used by the VDBE program. Allocate + ** space at the end of aMem[] for cursors 1 and greater. ** See also: allocateCursor(). */ nMem += nCursor; + if( nCursor==0 && nMem>0 ) nMem++; /* Space for aMem[0] even if not used */ - /* Allocate space for memory registers, SQL variables, VDBE cursors and - ** an array to marshal SQL function arguments in. + /* Figure out how much reusable memory is available at the end of the + ** opcode array. This extra memory will be reallocated for other elements + ** of the prepared statement. */ - zCsr = (u8*)&p->aOp[p->nOp]; /* Memory avaliable for allocation */ - zEnd = (u8*)&p->aOp[pParse->nOpAlloc]; /* First byte past end of zCsr[] */ + n = ROUND8(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ + x.pSpace = &((u8*)p->aOp)[n]; /* Unused opcode memory */ + assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) ); + x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */ + assert( x.nFree>=0 ); + assert( EIGHT_BYTE_ALIGNMENT(&x.pSpace[x.nFree]) ); resolveP2Values(p, &nArg); p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); if( pParse->explain && nMem<10 ){ nMem = 10; } - memset(zCsr, 0, zEnd-zCsr); - zCsr += (zCsr - (u8*)0)&7; - assert( EIGHT_BYTE_ALIGNMENT(zCsr) ); p->expired = 0; - /* Memory for registers, parameters, cursor, etc, is allocated in two - ** passes. On the first pass, we try to reuse unused space at the + /* Memory for registers, parameters, cursor, etc, is allocated in one or two + ** passes. On the first pass, we try to reuse unused memory at the ** end of the opcode array. If we are unable to satisfy all memory ** requirements by reusing the opcode array tail, then the second - ** pass will fill in the rest using a fresh allocation. + ** pass will fill in the remainder using a fresh memory allocation. ** ** This two-pass approach that reuses as much memory as possible from - ** the leftover space at the end of the opcode array can significantly + ** the leftover memory at the end of the opcode array. This can significantly ** reduce the amount of memory held by a prepared statement. */ do { - nByte = 0; - p->aMem = allocSpace(p->aMem, nMem*sizeof(Mem), &zCsr, zEnd, &nByte); - p->aVar = allocSpace(p->aVar, nVar*sizeof(Mem), &zCsr, zEnd, &nByte); - p->apArg = allocSpace(p->apArg, nArg*sizeof(Mem*), &zCsr, zEnd, &nByte); - p->azVar = allocSpace(p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte); - p->apCsr = allocSpace(p->apCsr, nCursor*sizeof(VdbeCursor*), - &zCsr, zEnd, &nByte); - p->aOnceFlag = allocSpace(p->aOnceFlag, nOnce, &zCsr, zEnd, &nByte); + x.nNeeded = 0; + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - p->anExec = allocSpace(p->anExec, p->nOp*sizeof(i64), &zCsr, zEnd, &nByte); + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); #endif - if( nByte ){ - p->pFree = sqlite3DbMallocZero(db, nByte); - } - zCsr = p->pFree; - zEnd = &zCsr[nByte]; - }while( nByte && !db->mallocFailed ); + if( x.nNeeded==0 ) break; + x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); + x.nFree = x.nNeeded; + }while( !db->mallocFailed ); - p->nCursor = nCursor; - p->nOnceFlag = nOnce; - if( p->aVar ){ - p->nVar = (ynVar)nVar; - for(n=0; n<nVar; n++){ - p->aVar[n].flags = MEM_Null; - p->aVar[n].db = db; - } - } - if( p->azVar && pParse->nzVar>0 ){ - p->nzVar = pParse->nzVar; - memcpy(p->azVar, pParse->azVar, p->nzVar*sizeof(p->azVar[0])); - memset(pParse->azVar, 0, pParse->nzVar*sizeof(pParse->azVar[0])); - } - if( p->aMem ){ - p->aMem--; /* aMem[] goes from 1..nMem */ - p->nMem = nMem; /* not from 0..nMem-1 */ - for(n=1; n<=nMem; n++){ - p->aMem[n].flags = MEM_Undefined; - p->aMem[n].db = db; - } - } + p->pVList = pParse->pVList; + pParse->pVList = 0; p->explain = pParse->explain; + if( db->mallocFailed ){ + p->nVar = 0; + p->nCursor = 0; + p->nMem = 0; + }else{ + p->nCursor = nCursor; + p->nVar = (ynVar)nVar; + initMemArray(p->aVar, nVar, db, MEM_Null); + p->nMem = nMem; + initMemArray(p->aMem, nMem, db, MEM_Undefined); + memset(p->apCsr, 0, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + memset(p->anExec, 0, p->nOp*sizeof(i64)); +#endif + } sqlite3VdbeRewind(p); } @@ -65922,23 +76999,50 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ if( pCx==0 ){ return; } - sqlite3VdbeSorterClose(p->db, pCx); - if( pCx->pBt ){ - sqlite3BtreeClose(pCx->pBt); - /* The pCx->pCursor will be close automatically, if it exists, by - ** the call above. */ - }else if( pCx->pCursor ){ - sqlite3BtreeCloseCursor(pCx->pCursor); - } + assert( pCx->pBtx==0 || pCx->eCurType==CURTYPE_BTREE ); + switch( pCx->eCurType ){ + case CURTYPE_SORTER: { + sqlite3VdbeSorterClose(p->db, pCx); + break; + } + case CURTYPE_BTREE: { + if( pCx->isEphemeral ){ + if( pCx->pBtx ) sqlite3BtreeClose(pCx->pBtx); + /* The pCx->pCursor will be close automatically, if it exists, by + ** the call above. */ + }else{ + assert( pCx->uc.pCursor!=0 ); + sqlite3BtreeCloseCursor(pCx->uc.pCursor); + } + break; + } #ifndef SQLITE_OMIT_VIRTUALTABLE - else if( pCx->pVtabCursor ){ - sqlite3_vtab_cursor *pVtabCursor = pCx->pVtabCursor; - const sqlite3_module *pModule = pVtabCursor->pVtab->pModule; - p->inVtabMethod = 1; - pModule->xClose(pVtabCursor); - p->inVtabMethod = 0; - } + case CURTYPE_VTAB: { + sqlite3_vtab_cursor *pVCur = pCx->uc.pVCur; + const sqlite3_module *pModule = pVCur->pVtab->pModule; + assert( pVCur->pVtab->nRef>0 ); + pVCur->pVtab->nRef--; + pModule->xClose(pVCur); + break; + } #endif + } +} + +/* +** Close all cursors in the current frame. +*/ +static void closeCursorsInFrame(Vdbe *p){ + if( p->apCsr ){ + int i; + for(i=0; i<p->nCursor; i++){ + VdbeCursor *pC = p->apCsr[i]; + if( pC ){ + sqlite3VdbeFreeCursor(p, pC); + p->apCsr[i] = 0; + } + } + } } /* @@ -65948,11 +77052,10 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ */ SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ Vdbe *v = pFrame->v; + closeCursorsInFrame(v); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS v->anExec = pFrame->anExec; #endif - v->aOnceFlag = pFrame->aOnceFlag; - v->nOnceFlag = pFrame->nOnceFlag; v->aOp = pFrame->aOp; v->nOp = pFrame->nOp; v->aMem = pFrame->aMem; @@ -65962,6 +77065,9 @@ SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ v->db->lastRowid = pFrame->lastRowid; v->nChange = pFrame->nChange; v->db->nChange = pFrame->nDbChange; + sqlite3VdbeDeleteAuxData(v->db, &v->pAuxData, -1, 0); + v->pAuxData = pFrame->pAuxData; + pFrame->pAuxData = 0; return pFrame->pc; } @@ -65982,19 +77088,9 @@ static void closeAllCursors(Vdbe *p){ p->nFrame = 0; } assert( p->nFrame==0 ); - - if( p->apCsr ){ - int i; - for(i=0; i<p->nCursor; i++){ - VdbeCursor *pC = p->apCsr[i]; - if( pC ){ - sqlite3VdbeFreeCursor(p, pC); - p->apCsr[i] = 0; - } - } - } + closeCursorsInFrame(p); if( p->aMem ){ - releaseMemArray(&p->aMem[1], p->nMem); + releaseMemArray(p->aMem, p->nMem); } while( p->pDelFrame ){ VdbeFrame *pDel = p->pDelFrame; @@ -66003,31 +77099,10 @@ static void closeAllCursors(Vdbe *p){ } /* Delete any auxdata allocations made by the VM */ - if( p->pAuxData ) sqlite3VdbeDeleteAuxData(p, -1, 0); + if( p->pAuxData ) sqlite3VdbeDeleteAuxData(p->db, &p->pAuxData, -1, 0); assert( p->pAuxData==0 ); } -/* -** Clean up the VM after a single run. -*/ -static void Cleanup(Vdbe *p){ - sqlite3 *db = p->db; - -#ifdef SQLITE_DEBUG - /* Execute assert() statements to ensure that the Vdbe.apCsr[] and - ** Vdbe.aMem[] arrays have already been cleaned up. */ - int i; - if( p->apCsr ) for(i=0; i<p->nCursor; i++) assert( p->apCsr[i]==0 ); - if( p->aMem ){ - for(i=1; i<=p->nMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); - } -#endif - - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = 0; - p->pResultSet = 0; -} - /* ** Set the number of result columns that will be returned by this SQL ** statement. This is now set at compile time, rather than during @@ -66035,21 +77110,18 @@ static void Cleanup(Vdbe *p){ ** be called on an SQL statement before sqlite3_step(). */ SQLITE_PRIVATE void sqlite3VdbeSetNumCols(Vdbe *p, int nResColumn){ - Mem *pColName; int n; sqlite3 *db = p->db; - releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); - sqlite3DbFree(db, p->aColName); + if( p->nResColumn ){ + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + sqlite3DbFree(db, p->aColName); + } n = nResColumn*COLNAME_N; p->nResColumn = (u16)nResColumn; - p->aColName = pColName = (Mem*)sqlite3DbMallocZero(db, sizeof(Mem)*n ); + p->aColName = (Mem*)sqlite3DbMallocRawNN(db, sizeof(Mem)*n ); if( p->aColName==0 ) return; - while( n-- > 0 ){ - pColName->flags = MEM_Null; - pColName->db = p->db; - pColName++; - } + initMemArray(p->aColName, n, db, MEM_Null); } /* @@ -66075,7 +77147,7 @@ SQLITE_PRIVATE int sqlite3VdbeSetColName( assert( var<COLNAME_N ); if( p->db->mallocFailed ){ assert( !zName || xDel!=SQLITE_DYNAMIC ); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } assert( p->aColName!=0 ); pColName = &(p->aColName[idx+var*p->nResColumn]); @@ -66092,7 +77164,9 @@ SQLITE_PRIVATE int sqlite3VdbeSetColName( */ static int vdbeCommit(sqlite3 *db, Vdbe *p){ int i; - int nTrans = 0; /* Number of databases with an active write-transaction */ + int nTrans = 0; /* Number of databases with an active write-transaction + ** that are candidates for a two-phase commit using a + ** master-journal */ int rc = SQLITE_OK; int needXcommit = 0; @@ -66120,10 +77194,29 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ Btree *pBt = db->aDb[i].pBt; if( sqlite3BtreeIsInTrans(pBt) ){ + /* Whether or not a database might need a master journal depends upon + ** its journal mode (among other things). This matrix determines which + ** journal modes use a master journal and which do not */ + static const u8 aMJNeeded[] = { + /* DELETE */ 1, + /* PERSIST */ 1, + /* OFF */ 0, + /* TRUNCATE */ 1, + /* MEMORY */ 0, + /* WAL */ 0 + }; + Pager *pPager; /* Pager associated with pBt */ needXcommit = 1; - if( i!=1 ) nTrans++; sqlite3BtreeEnter(pBt); - rc = sqlite3PagerExclusiveLock(sqlite3BtreePager(pBt)); + pPager = sqlite3BtreePager(pBt); + if( db->aDb[i].safety_level!=PAGER_SYNCHRONOUS_OFF + && aMJNeeded[sqlite3PagerGetJournalMode(pPager)] + && sqlite3PagerIsMemdb(pPager)==0 + ){ + assert( i!=1 ); + nTrans++; + } + rc = sqlite3PagerExclusiveLock(pPager); sqlite3BtreeLeave(pBt); } } @@ -66181,7 +77274,6 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ #ifndef SQLITE_OMIT_DISKIO else{ sqlite3_vfs *pVfs = db->pVfs; - int needSync = 0; char *zMaster = 0; /* File-name for the master journal */ char const *zMainFile = sqlite3BtreeGetFilename(db->aDb[0].pBt); sqlite3_file *pMaster = 0; @@ -66193,7 +77285,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ /* Select a master journal file name */ nMainFile = sqlite3Strlen30(zMainFile); zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XXz", zMainFile); - if( zMaster==0 ) return SQLITE_NOMEM; + if( zMaster==0 ) return SQLITE_NOMEM_BKPT; do { u32 iRandom; if( retryCount ){ @@ -66241,9 +77333,6 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ continue; /* Ignore TEMP and :memory: databases */ } assert( zFile[0]!=0 ); - if( !needSync && !sqlite3BtreeSyncDisabled(pBt) ){ - needSync = 1; - } rc = sqlite3OsWrite(pMaster, zFile, sqlite3Strlen30(zFile)+1, offset); offset += sqlite3Strlen30(zFile)+1; if( rc!=SQLITE_OK ){ @@ -66258,8 +77347,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ /* Sync the master journal file. If the IOCAP_SEQUENTIAL device ** flag is set this is not required. */ - if( needSync - && 0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL) + if( 0==(sqlite3OsDeviceCharacteristics(pMaster)&SQLITE_IOCAP_SEQUENTIAL) && SQLITE_OK!=(rc = sqlite3OsSync(pMaster, SQLITE_SYNC_NORMAL)) ){ sqlite3OsCloseFree(pMaster); @@ -66369,60 +77457,59 @@ static void checkActiveVdbeCnt(sqlite3 *db){ ** If an IO error occurs, an SQLITE_IOERR_XXX error code is returned. ** Otherwise SQLITE_OK. */ -SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ +static SQLITE_NOINLINE int vdbeCloseStatement(Vdbe *p, int eOp){ sqlite3 *const db = p->db; int rc = SQLITE_OK; + int i; + const int iSavepoint = p->iStatement-1; - /* If p->iStatement is greater than zero, then this Vdbe opened a - ** statement transaction that should be closed here. The only exception - ** is that an IO error may have occurred, causing an emergency rollback. - ** In this case (db->nStatement==0), and there is nothing to do. - */ - if( db->nStatement && p->iStatement ){ - int i; - const int iSavepoint = p->iStatement-1; + assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE); + assert( db->nStatement>0 ); + assert( p->iStatement==(db->nStatement+db->nSavepoint) ); - assert( eOp==SAVEPOINT_ROLLBACK || eOp==SAVEPOINT_RELEASE); - assert( db->nStatement>0 ); - assert( p->iStatement==(db->nStatement+db->nSavepoint) ); - - for(i=0; i<db->nDb; i++){ - int rc2 = SQLITE_OK; - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ - if( eOp==SAVEPOINT_ROLLBACK ){ - rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint); - } - if( rc2==SQLITE_OK ){ - rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint); - } - if( rc==SQLITE_OK ){ - rc = rc2; - } - } - } - db->nStatement--; - p->iStatement = 0; - - if( rc==SQLITE_OK ){ + for(i=0; i<db->nDb; i++){ + int rc2 = SQLITE_OK; + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ if( eOp==SAVEPOINT_ROLLBACK ){ - rc = sqlite3VtabSavepoint(db, SAVEPOINT_ROLLBACK, iSavepoint); + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_ROLLBACK, iSavepoint); + } + if( rc2==SQLITE_OK ){ + rc2 = sqlite3BtreeSavepoint(pBt, SAVEPOINT_RELEASE, iSavepoint); } if( rc==SQLITE_OK ){ - rc = sqlite3VtabSavepoint(db, SAVEPOINT_RELEASE, iSavepoint); + rc = rc2; } } + } + db->nStatement--; + p->iStatement = 0; - /* If the statement transaction is being rolled back, also restore the - ** database handles deferred constraint counter to the value it had when - ** the statement transaction was opened. */ + if( rc==SQLITE_OK ){ if( eOp==SAVEPOINT_ROLLBACK ){ - db->nDeferredCons = p->nStmtDefCons; - db->nDeferredImmCons = p->nStmtDefImmCons; + rc = sqlite3VtabSavepoint(db, SAVEPOINT_ROLLBACK, iSavepoint); } + if( rc==SQLITE_OK ){ + rc = sqlite3VtabSavepoint(db, SAVEPOINT_RELEASE, iSavepoint); + } + } + + /* If the statement transaction is being rolled back, also restore the + ** database handles deferred constraint counter to the value it had when + ** the statement transaction was opened. */ + if( eOp==SAVEPOINT_ROLLBACK ){ + db->nDeferredCons = p->nStmtDefCons; + db->nDeferredImmCons = p->nStmtDefImmCons; } return rc; } +SQLITE_PRIVATE int sqlite3VdbeCloseStatement(Vdbe *p, int eOp){ + if( p->db->nStatement && p->iStatement ){ + return vdbeCloseStatement(p, eOp); + } + return SQLITE_OK; +} + /* ** This function is called when a transaction opened by the database @@ -66442,7 +77529,7 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ ){ p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; p->errorAction = OE_Abort; - sqlite3SetString(&p->zErrMsg, db, "FOREIGN KEY constraint failed"); + sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); return SQLITE_ERROR; } return SQLITE_OK; @@ -66482,14 +77569,13 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** one, or the complete transaction if there is no statement transaction. */ - if( p->db->mallocFailed ){ - p->rc = SQLITE_NOMEM; - } - if( p->aOnceFlag ) memset(p->aOnceFlag, 0, p->nOnceFlag); - closeAllCursors(p); if( p->magic!=VDBE_MAGIC_RUN ){ return SQLITE_OK; } + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; + } + closeAllCursors(p); checkActiveVdbeCnt(db); /* No commit or rollback needed if the program never started or if the @@ -66643,8 +77729,8 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ } p->magic = VDBE_MAGIC_HALT; checkActiveVdbeCnt(db); - if( p->db->mallocFailed ){ - p->rc = SQLITE_NOMEM; + if( db->mallocFailed ){ + p->rc = SQLITE_NOMEM_BKPT; } /* If the auto-commit flag is set to true, then any locks that were held @@ -66680,16 +77766,16 @@ SQLITE_PRIVATE int sqlite3VdbeTransferError(Vdbe *p){ sqlite3 *db = p->db; int rc = p->rc; if( p->zErrMsg ){ - u8 mallocFailed = db->mallocFailed; + db->bBenignMalloc++; sqlite3BeginBenignMalloc(); if( db->pErr==0 ) db->pErr = sqlite3ValueNew(db); sqlite3ValueSetStr(db->pErr, -1, p->zErrMsg, SQLITE_UTF8, SQLITE_TRANSIENT); sqlite3EndBenignMalloc(); - db->mallocFailed = mallocFailed; - db->errCode = rc; - }else{ - sqlite3Error(db, rc); + db->bBenignMalloc--; + }else if( db->pErr ){ + sqlite3ValueSetNull(db->pErr); } + db->errCode = rc; return rc; } @@ -66726,6 +77812,10 @@ static void vdbeInvokeSqllog(Vdbe *v){ ** VDBE_MAGIC_INIT. */ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + int i; +#endif + sqlite3 *db; db = p->db; @@ -66743,8 +77833,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ if( p->pc>=0 ){ vdbeInvokeSqllog(p); sqlite3VdbeTransferError(p); - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = 0; if( p->runOnlyOnce ) p->expired = 1; }else if( p->rc && p->expired ){ /* The expired flag was set on the VDBE before the first call @@ -66752,13 +77840,24 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ ** called), set the database error in this case as well. */ sqlite3ErrorWithMsg(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg); - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = 0; } - /* Reclaim all memory used by the VDBE + /* Reset register contents and reclaim error message memory. */ - Cleanup(p); +#ifdef SQLITE_DEBUG + /* Execute assert() statements to ensure that the Vdbe.apCsr[] and + ** Vdbe.aMem[] arrays have already been cleaned up. */ + if( p->apCsr ) for(i=0; i<p->nCursor; i++) assert( p->apCsr[i]==0 ); + if( p->aMem ){ + for(i=0; i<p->nMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); + } +#endif + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + p->pResultSet = 0; +#ifdef SQLITE_DEBUG + p->nWrite = 0; +#endif /* Save profiling information from this VDBE run. */ @@ -66766,7 +77865,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ { FILE *out = fopen("vdbe_profile.out", "a"); if( out ){ - int i; fprintf(out, "---- "); for(i=0; i<p->nOp; i++){ fprintf(out, "%02x", p->aOp[i].opcode); @@ -66796,8 +77894,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ } } #endif - p->iCurrentTime = 0; - p->magic = VDBE_MAGIC_INIT; + p->magic = VDBE_MAGIC_RESET; return p->rc & db->errMask; } @@ -66831,21 +77928,22 @@ SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ ** * the corresponding bit in argument mask is clear (where the first ** function parameter corresponds to bit 0 etc.). */ -SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(Vdbe *pVdbe, int iOp, int mask){ - AuxData **pp = &pVdbe->pAuxData; +SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, int mask){ while( *pp ){ AuxData *pAux = *pp; if( (iOp<0) - || (pAux->iOp==iOp && (pAux->iArg>31 || !(mask & MASKBIT32(pAux->iArg)))) + || (pAux->iAuxOp==iOp + && pAux->iAuxArg>=0 + && (pAux->iAuxArg>31 || !(mask & MASKBIT32(pAux->iAuxArg)))) ){ - testcase( pAux->iArg==31 ); - if( pAux->xDelete ){ - pAux->xDelete(pAux->pAux); + testcase( pAux->iAuxArg==31 ); + if( pAux->xDeleteAux ){ + pAux->xDeleteAux(pAux->pAux); } - *pp = pAux->pNext; - sqlite3DbFree(pVdbe->db, pAux); + *pp = pAux->pNextAux; + sqlite3DbFree(db, pAux); }else{ - pp= &pAux->pNext; + pp= &pAux->pNextAux; } } } @@ -66860,25 +77958,29 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(Vdbe *pVdbe, int iOp, int mask){ */ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ SubProgram *pSub, *pNext; - int i; assert( p->db==0 || p->db==db ); - releaseMemArray(p->aVar, p->nVar); releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); for(pSub=p->pProgram; pSub; pSub=pNext){ pNext = pSub->pNext; vdbeFreeOpArray(db, pSub->aOp, pSub->nOp); sqlite3DbFree(db, pSub); } - for(i=p->nzVar-1; i>=0; i--) sqlite3DbFree(db, p->azVar[i]); + if( p->magic!=VDBE_MAGIC_INIT ){ + releaseMemArray(p->aVar, p->nVar); + sqlite3DbFree(db, p->pVList); + sqlite3DbFree(db, p->pFree); + } vdbeFreeOpArray(db, p->aOp, p->nOp); sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); - sqlite3DbFree(db, p->pFree); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - for(i=0; i<p->nScan; i++){ - sqlite3DbFree(db, p->aScan[i].zName); + { + int i; + for(i=0; i<p->nScan; i++){ + sqlite3DbFree(db, p->aScan[i].zName); + } + sqlite3DbFree(db, p->aScan); } - sqlite3DbFree(db, p->aScan); #endif } @@ -66888,7 +77990,7 @@ SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ sqlite3 *db; - if( NEVER(p==0) ) return; + assert( p!=0 ); db = p->db; assert( sqlite3_mutex_held(db->mutex) ); sqlite3VdbeClearObject(db, p); @@ -66903,7 +78005,7 @@ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ } p->magic = VDBE_MAGIC_DEAD; p->db = 0; - sqlite3DbFree(db, p); + sqlite3DbFreeNN(db, p); } /* @@ -66918,7 +78020,8 @@ static int SQLITE_NOINLINE handleDeferredMoveto(VdbeCursor *p){ #endif assert( p->deferredMoveto ); assert( p->isTable ); - rc = sqlite3BtreeMovetoUnpacked(p->pCursor, 0, p->movetoTarget, 0, &res); + assert( p->eCurType==CURTYPE_BTREE ); + rc = sqlite3BtreeMovetoUnpacked(p->uc.pCursor, 0, p->movetoTarget, 0, &res); if( rc ) return rc; if( res!=0 ) return SQLITE_CORRUPT_BKPT; #ifdef SQLITE_TEST @@ -66938,9 +78041,10 @@ static int SQLITE_NOINLINE handleDeferredMoveto(VdbeCursor *p){ */ static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ int isDifferentRow, rc; - assert( p->pCursor!=0 ); - assert( sqlite3BtreeCursorHasMoved(p->pCursor) ); - rc = sqlite3BtreeCursorRestore(p->pCursor, &isDifferentRow); + assert( p->eCurType==CURTYPE_BTREE ); + assert( p->uc.pCursor!=0 ); + assert( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ); + rc = sqlite3BtreeCursorRestore(p->uc.pCursor, &isDifferentRow); p->cacheStatus = CACHE_STALE; if( isDifferentRow ) p->nullRow = 1; return rc; @@ -66951,7 +78055,8 @@ static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ ** if need be. Return any I/O error from the restore operation. */ SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){ - if( sqlite3BtreeCursorHasMoved(p->pCursor) ){ + assert( p->eCurType==CURTYPE_BTREE ); + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ return handleMovedCursor(p); } return SQLITE_OK; @@ -66970,11 +78075,19 @@ SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){ ** If the cursor is already pointing to the correct row and that row has ** not been deleted out from under the cursor, then this routine is a no-op. */ -SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor *p){ +SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ + VdbeCursor *p = *pp; + assert( p->eCurType==CURTYPE_BTREE || p->eCurType==CURTYPE_PSEUDO ); if( p->deferredMoveto ){ + int iMap; + if( p->aAltMap && (iMap = p->aAltMap[1+*piCol])>0 ){ + *pp = p->pAltCursor; + *piCol = iMap - 1; + return SQLITE_OK; + } return handleDeferredMoveto(p); } - if( p->pCursor && sqlite3BtreeCursorHasMoved(p->pCursor) ){ + if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ return handleMovedCursor(p); } return SQLITE_OK; @@ -67025,11 +78138,13 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor *p){ /* ** Return the serial-type for the value stored in pMem. */ -SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){ +SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ int flags = pMem->flags; u32 n; + assert( pLen!=0 ); if( flags&MEM_Null ){ + *pLen = 0; return 0; } if( flags&MEM_Int ){ @@ -67043,15 +78158,23 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){ u = i; } if( u<=127 ){ - return ((i&1)==i && file_format>=4) ? 8+(u32)u : 1; + if( (i&1)==i && file_format>=4 ){ + *pLen = 0; + return 8+(u32)u; + }else{ + *pLen = 1; + return 1; + } } - if( u<=32767 ) return 2; - if( u<=8388607 ) return 3; - if( u<=2147483647 ) return 4; - if( u<=MAX_6BYTE ) return 5; + if( u<=32767 ){ *pLen = 2; return 2; } + if( u<=8388607 ){ *pLen = 3; return 3; } + if( u<=2147483647 ){ *pLen = 4; return 4; } + if( u<=MAX_6BYTE ){ *pLen = 6; return 5; } + *pLen = 8; return 6; } if( flags&MEM_Real ){ + *pLen = 8; return 7; } assert( pMem->db->mallocFailed || flags&(MEM_Str|MEM_Blob) ); @@ -67060,20 +78183,46 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format){ if( flags & MEM_Zero ){ n += pMem->u.nZero; } + *pLen = n; return ((n*2) + 12 + ((flags&MEM_Str)!=0)); } +/* +** The sizes for serial types less than 128 +*/ +static const u8 sqlite3SmallTypeSizes[] = { + /* 0 1 2 3 4 5 6 7 8 9 */ +/* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, +/* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, +/* 20 */ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, +/* 30 */ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, +/* 40 */ 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, +/* 50 */ 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, +/* 60 */ 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, +/* 70 */ 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, +/* 80 */ 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, +/* 90 */ 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, +/* 100 */ 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, +/* 110 */ 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, +/* 120 */ 54, 54, 55, 55, 56, 56, 57, 57 +}; + /* ** Return the length of the data corresponding to the supplied serial-type. */ SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32 serial_type){ - if( serial_type>=12 ){ + if( serial_type>=128 ){ return (serial_type-12)/2; }else{ - static const u8 aSize[] = { 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, 0, 0 }; - return aSize[serial_type]; + assert( serial_type<12 + || sqlite3SmallTypeSizes[serial_type]==(serial_type - 12)/2 ); + return sqlite3SmallTypeSizes[serial_type]; } } +SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ + assert( serial_type<128 ); + return sqlite3SmallTypeSizes[serial_type]; +} /* ** If we are on an architecture with mixed-endian floating @@ -67155,7 +78304,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ }else{ v = pMem->u.i; } - len = i = sqlite3VdbeSerialTypeLen(serial_type); + len = i = sqlite3SmallTypeSizes[serial_type]; assert( i>0 ); do{ buf[--i] = (u8)(v&0xFF); @@ -67169,7 +78318,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0) == (int)sqlite3VdbeSerialTypeLen(serial_type) ); len = pMem->n; - memcpy(buf, pMem->z, len); + if( len>0 ) memcpy(buf, pMem->z, len); return len; } @@ -67237,7 +78386,13 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( Mem *pMem /* Memory cell to write value into */ ){ switch( serial_type ){ - case 10: /* Reserved for future use */ + case 10: { /* Internal use only: NULL with virtual table + ** UPDATE no-change flag set */ + pMem->flags = MEM_Null|MEM_Zero; + pMem->n = 0; + pMem->u.nZero = 0; + break; + } case 11: /* Reserved for future use */ case 0: { /* Null */ /* EVIDENCE-OF: R-24078-09375 Value is a NULL. */ @@ -67272,6 +78427,10 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( /* EVIDENCE-OF: R-01849-26079 Value is a big-endian 32-bit ** twos-complement integer. */ pMem->u.i = FOUR_BYTE_INT(buf); +#ifdef __HP_cc + /* Work around a sign-extension bug in the HP compiler for HP/UX */ + if( buf[0]&0x80 ) pMem->u.i |= 0xffffffff80000000LL; +#endif pMem->flags = MEM_Int; testcase( pMem->u.i<0 ); return 4; @@ -67327,34 +78486,17 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet( ** If an OOM error occurs, NULL is returned. */ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( - KeyInfo *pKeyInfo, /* Description of the record */ - char *pSpace, /* Unaligned space available */ - int szSpace, /* Size of pSpace[] in bytes */ - char **ppFree /* OUT: Caller should free this pointer */ + KeyInfo *pKeyInfo /* Description of the record */ ){ UnpackedRecord *p; /* Unpacked record to return */ - int nOff; /* Increment pSpace by nOff to align it */ int nByte; /* Number of bytes required for *p */ - - /* We want to shift the pointer pSpace up such that it is 8-byte aligned. - ** Thus, we need to calculate a value, nOff, between 0 and 7, to shift - ** it by. If pSpace is already 8-byte aligned, nOff should be zero. - */ - nOff = (8 - (SQLITE_PTR_TO_INT(pSpace) & 7)) & 7; - nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1); - if( nByte>szSpace+nOff ){ - p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); - *ppFree = (char *)p; - if( !p ) return 0; - }else{ - p = (UnpackedRecord*)&pSpace[nOff]; - *ppFree = 0; - } - + nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); + p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); + if( !p ) return 0; p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; assert( pKeyInfo->aSortOrder!=0 ); p->pKeyInfo = pKeyInfo; - p->nField = pKeyInfo->nField + 1; + p->nField = pKeyInfo->nKeyField + 1; return p; } @@ -67389,15 +78531,16 @@ SQLITE_PRIVATE void sqlite3VdbeRecordUnpack( pMem->db = pKeyInfo->db; /* pMem->flags = 0; // sqlite3VdbeSerialGet() will set this for us */ pMem->szMalloc = 0; + pMem->z = 0; d += sqlite3VdbeSerialGet(&aKey[d], serial_type, pMem); pMem++; if( (++u)>=p->nField ) break; } - assert( u<=pKeyInfo->nField + 1 ); + assert( u<=pKeyInfo->nKeyField + 1 ); p->nField = u; } -#if SQLITE_DEBUG +#ifdef SQLITE_DEBUG /* ** This function compares two index or table record keys in the same way ** as the sqlite3VdbeRecordCompare() routine. Unlike VdbeRecordCompare(), @@ -67440,10 +78583,11 @@ static int vdbeRecordCompareDebug( /* mem1.u.i = 0; // not needed, here to silence compiler warning */ idx1 = getVarint32(aKey1, szHdr1); + if( szHdr1>98307 ) return SQLITE_CORRUPT; d1 = szHdr1; - assert( pKeyInfo->nField+pKeyInfo->nXField>=pPKey2->nField || CORRUPT_DB ); + assert( pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); assert( pKeyInfo->aSortOrder!=0 ); - assert( pKeyInfo->nField>0 ); + assert( pKeyInfo->nKeyField>0 ); assert( idx1<=szHdr1 || CORRUPT_DB ); do{ u32 serial_type1; @@ -67501,16 +78645,16 @@ debugCompareEnd: } #endif -#if SQLITE_DEBUG +#ifdef SQLITE_DEBUG /* ** Count the number of fields (a.k.a. columns) in the record given by ** pKey,nKey. The verify that this count is less than or equal to the -** limit given by pKeyInfo->nField + pKeyInfo->nXField. +** limit given by pKeyInfo->nAllField. ** ** If this constraint is not satisfied, it means that the high-speed ** vdbeRecordCompareInt() and vdbeRecordCompareString() routines will ** not work correctly. If this assert() ever fires, it probably means -** that the KeyInfo.nField or KeyInfo.nXField values were computed +** that the KeyInfo.nKeyField or KeyInfo.nAllField values were computed ** incorrectly. */ static void vdbeAssertFieldCountWithinLimits( @@ -67525,12 +78669,13 @@ static void vdbeAssertFieldCountWithinLimits( if( CORRUPT_DB ) return; idx = getVarint32(aKey, szHdr); - assert( szHdr<=nKey ); + assert( nKey>=0 ); + assert( szHdr<=(u32)nKey ); while( idx<szHdr ){ idx += getVarint32(aKey+idx, notUsed); nField++; } - assert( nField <= pKeyInfo->nField+pKeyInfo->nXField ); + assert( nField <= pKeyInfo->nAllField ); } #else # define vdbeAssertFieldCountWithinLimits(A,B,C) @@ -67555,7 +78700,6 @@ static int vdbeCompareMemString( }else{ int rc; const void *v1, *v2; - int n1, n2; Mem c1; Mem c2; sqlite3VdbeMemInit(&c1, pMem1->db, MEM_Null); @@ -67563,28 +78707,89 @@ static int vdbeCompareMemString( sqlite3VdbeMemShallowCopy(&c1, pMem1, MEM_Ephem); sqlite3VdbeMemShallowCopy(&c2, pMem2, MEM_Ephem); v1 = sqlite3ValueText((sqlite3_value*)&c1, pColl->enc); - n1 = v1==0 ? 0 : c1.n; v2 = sqlite3ValueText((sqlite3_value*)&c2, pColl->enc); - n2 = v2==0 ? 0 : c2.n; - rc = pColl->xCmp(pColl->pUser, n1, v1, n2, v2); + if( (v1==0 || v2==0) ){ + if( prcErr ) *prcErr = SQLITE_NOMEM_BKPT; + rc = 0; + }else{ + rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); + } sqlite3VdbeMemRelease(&c1); sqlite3VdbeMemRelease(&c2); - if( (v1==0 || v2==0) && prcErr ) *prcErr = SQLITE_NOMEM; return rc; } } +/* +** The input pBlob is guaranteed to be a Blob that is not marked +** with MEM_Zero. Return true if it could be a zero-blob. +*/ +static int isAllZero(const char *z, int n){ + int i; + for(i=0; i<n; i++){ + if( z[i] ) return 0; + } + return 1; +} + /* ** Compare two blobs. Return negative, zero, or positive if the first ** is less than, equal to, or greater than the second, respectively. ** If one blob is a prefix of the other, then the shorter is the lessor. */ static SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem *pB2){ - int c = memcmp(pB1->z, pB2->z, pB1->n>pB2->n ? pB2->n : pB1->n); + int c; + int n1 = pB1->n; + int n2 = pB2->n; + + /* It is possible to have a Blob value that has some non-zero content + ** followed by zero content. But that only comes up for Blobs formed + ** by the OP_MakeRecord opcode, and such Blobs never get passed into + ** sqlite3MemCompare(). */ + assert( (pB1->flags & MEM_Zero)==0 || n1==0 ); + assert( (pB2->flags & MEM_Zero)==0 || n2==0 ); + + if( (pB1->flags|pB2->flags) & MEM_Zero ){ + if( pB1->flags & pB2->flags & MEM_Zero ){ + return pB1->u.nZero - pB2->u.nZero; + }else if( pB1->flags & MEM_Zero ){ + if( !isAllZero(pB2->z, pB2->n) ) return -1; + return pB1->u.nZero - n2; + }else{ + if( !isAllZero(pB1->z, pB1->n) ) return +1; + return n1 - pB2->u.nZero; + } + } + c = memcmp(pB1->z, pB2->z, n1>n2 ? n2 : n1); if( c ) return c; - return pB1->n - pB2->n; + return n1 - n2; } +/* +** Do a comparison between a 64-bit signed integer and a 64-bit floating-point +** number. Return negative, zero, or positive if the first (i64) is less than, +** equal to, or greater than the second (double). +*/ +static int sqlite3IntFloatCompare(i64 i, double r){ + if( sizeof(LONGDOUBLE_TYPE)>8 ){ + LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i; + if( x<r ) return -1; + if( x>r ) return +1; + return 0; + }else{ + i64 y; + double s; + if( r<-9223372036854775808.0 ) return +1; + if( r>=9223372036854775808.0 ) return -1; + y = (i64)r; + if( i<y ) return -1; + if( i>y ) return +1; + s = (double)i; + if( s<r ) return -1; + if( s>r ) return +1; + return 0; + } +} /* ** Compare the values contained by the two memory cells, returning @@ -67611,34 +78816,34 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C return (f2&MEM_Null) - (f1&MEM_Null); } - /* If one value is a number and the other is not, the number is less. - ** If both are numbers, compare as reals if one is a real, or as integers - ** if both values are integers. + /* At least one of the two values is a number */ if( combined_flags&(MEM_Int|MEM_Real) ){ - double r1, r2; if( (f1 & f2 & MEM_Int)!=0 ){ if( pMem1->u.i < pMem2->u.i ) return -1; - if( pMem1->u.i > pMem2->u.i ) return 1; + if( pMem1->u.i > pMem2->u.i ) return +1; return 0; } + if( (f1 & f2 & MEM_Real)!=0 ){ + if( pMem1->u.r < pMem2->u.r ) return -1; + if( pMem1->u.r > pMem2->u.r ) return +1; + return 0; + } + if( (f1&MEM_Int)!=0 ){ + if( (f2&MEM_Real)!=0 ){ + return sqlite3IntFloatCompare(pMem1->u.i, pMem2->u.r); + }else{ + return -1; + } + } if( (f1&MEM_Real)!=0 ){ - r1 = pMem1->u.r; - }else if( (f1&MEM_Int)!=0 ){ - r1 = (double)pMem1->u.i; - }else{ - return 1; + if( (f2&MEM_Int)!=0 ){ + return -sqlite3IntFloatCompare(pMem2->u.i, pMem1->u.r); + }else{ + return -1; + } } - if( (f2&MEM_Real)!=0 ){ - r2 = pMem2->u.r; - }else if( (f2&MEM_Int)!=0 ){ - r2 = (double)pMem2->u.i; - }else{ - return -1; - } - if( r1<r2 ) return -1; - if( r1>r2 ) return 1; - return 0; + return +1; } /* If one value is a string and the other is a blob, the string is less. @@ -67652,7 +78857,7 @@ SQLITE_PRIVATE int sqlite3MemCompare(const Mem *pMem1, const Mem *pMem2, const C return -1; } - assert( pMem1->enc==pMem2->enc ); + assert( pMem1->enc==pMem2->enc || pMem1->db->mallocFailed ); assert( pMem1->enc==SQLITE_UTF8 || pMem1->enc==SQLITE_UTF16LE || pMem1->enc==SQLITE_UTF16BE ); @@ -67736,7 +78941,7 @@ static i64 vdbeRecordDecodeInt(u32 serial_type, const u8 *aKey){ ** pPKey2->errCode is set to SQLITE_NOMEM and, if it is not NULL, the ** malloc-failed flag set on database handle (pPKey2->pKeyInfo->db). */ -static int vdbeRecordCompareWithSkip( +SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( int nKey1, const void *pKey1, /* Left key */ UnpackedRecord *pPKey2, /* Right key */ int bSkip /* If true, skip the first field */ @@ -67772,10 +78977,10 @@ static int vdbeRecordCompareWithSkip( } VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ - assert( pPKey2->pKeyInfo->nField+pPKey2->pKeyInfo->nXField>=pPKey2->nField + assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); assert( pPKey2->pKeyInfo->aSortOrder!=0 ); - assert( pPKey2->pKeyInfo->nField>0 ); + assert( pPKey2->pKeyInfo->nKeyField>0 ); assert( idx1<=szHdr1 || CORRUPT_DB ); do{ u32 serial_type; @@ -67784,18 +78989,13 @@ static int vdbeRecordCompareWithSkip( if( pRhs->flags & MEM_Int ){ serial_type = aKey1[idx1]; testcase( serial_type==12 ); - if( serial_type>=12 ){ + if( serial_type>=10 ){ rc = +1; }else if( serial_type==0 ){ rc = -1; }else if( serial_type==7 ){ - double rhs = (double)pRhs->u.i; sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); - if( mem1.u.r<rhs ){ - rc = -1; - }else if( mem1.u.r>rhs ){ - rc = +1; - } + rc = -sqlite3IntFloatCompare(pRhs->u.i, mem1.u.r); }else{ i64 lhs = vdbeRecordDecodeInt(serial_type, &aKey1[d1]); i64 rhs = pRhs->u.i; @@ -67810,23 +79010,24 @@ static int vdbeRecordCompareWithSkip( /* RHS is real */ else if( pRhs->flags & MEM_Real ){ serial_type = aKey1[idx1]; - if( serial_type>=12 ){ + if( serial_type>=10 ){ + /* Serial types 12 or greater are strings and blobs (greater than + ** numbers). Types 10 and 11 are currently "reserved for future + ** use", so it doesn't really matter what the results of comparing + ** them to numberic values are. */ rc = +1; }else if( serial_type==0 ){ rc = -1; }else{ - double rhs = pRhs->u.r; - double lhs; sqlite3VdbeSerialGet(&aKey1[d1], serial_type, &mem1); if( serial_type==7 ){ - lhs = mem1.u.r; + if( mem1.u.r<pRhs->u.r ){ + rc = -1; + }else if( mem1.u.r>pRhs->u.r ){ + rc = +1; + } }else{ - lhs = (double)mem1.u.i; - } - if( lhs<rhs ){ - rc = -1; - }else if( lhs>rhs ){ - rc = +1; + rc = sqlite3IntFloatCompare(mem1.u.i, pRhs->u.r); } } } @@ -67864,6 +79065,7 @@ static int vdbeRecordCompareWithSkip( /* RHS is a blob */ else if( pRhs->flags & MEM_Blob ){ + assert( (pRhs->flags & MEM_Zero)==0 || pRhs->n==0 ); getVarint32(&aKey1[idx1], serial_type); testcase( serial_type==12 ); if( serial_type<12 || (serial_type & 0x01) ){ @@ -67875,6 +79077,12 @@ static int vdbeRecordCompareWithSkip( if( (d1+nStr) > (unsigned)nKey1 ){ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ + }else if( pRhs->flags & MEM_Zero ){ + if( !isAllZero((const char*)&aKey1[d1],nStr) ){ + rc = 1; + }else{ + rc = nStr - pRhs->u.nZero; + } }else{ int nCmp = MIN(nStr, pRhs->n); rc = memcmp(&aKey1[d1], pRhs->z, nCmp); @@ -67916,13 +79124,14 @@ static int vdbeRecordCompareWithSkip( || vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, pPKey2->default_rc) || pKeyInfo->db->mallocFailed ); + pPKey2->eqSeen = 1; return pPKey2->default_rc; } SQLITE_PRIVATE int sqlite3VdbeRecordCompare( int nKey1, const void *pKey1, /* Left key */ UnpackedRecord *pPKey2 /* Right key */ ){ - return vdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 0); + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 0); } @@ -67944,7 +79153,7 @@ static int vdbeRecordCompareInt( int res; u32 y; u64 x; - i64 v = pPKey2->aMem[0].u.i; + i64 v; i64 lhs; vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); @@ -68003,6 +79212,7 @@ static int vdbeRecordCompareInt( return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); } + v = pPKey2->aMem[0].u.i; if( v>lhs ){ res = pPKey2->r1; }else if( v<lhs ){ @@ -68010,11 +79220,12 @@ static int vdbeRecordCompareInt( }else if( pPKey2->nField>1 ){ /* The first fields of the two keys are equal. Compare the trailing ** fields. */ - res = vdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); }else{ /* The first fields of the two keys are equal and there are no trailing ** fields. Return pPKey2->default_rc in this case. */ res = pPKey2->default_rc; + pPKey2->eqSeen = 1; } assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, res) ); @@ -68035,6 +79246,7 @@ static int vdbeRecordCompareString( int serial_type; int res; + assert( pPKey2->aMem[0].flags & MEM_Str ); vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); getVarint32(&aKey1[1], serial_type); if( serial_type<12 ){ @@ -68058,9 +79270,10 @@ static int vdbeRecordCompareString( res = nStr - pPKey2->aMem[0].n; if( res==0 ){ if( pPKey2->nField>1 ){ - res = vdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); + res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); }else{ res = pPKey2->default_rc; + pPKey2->eqSeen = 1; } }else if( res>0 ){ res = pPKey2->r2; @@ -68100,7 +79313,7 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ ** The easiest way to enforce this limit is to consider only records with ** 13 fields or less. If the first field is an integer, the maximum legal ** header size is (12*5 + 1 + 1) bytes. */ - if( (p->pKeyInfo->nField + p->pKeyInfo->nXField)<=13 ){ + if( p->pKeyInfo->nAllField<=13 ){ int flags = p->aMem[0].flags; if( p->pKeyInfo->aSortOrder[0] ){ p->r1 = 1; @@ -68146,13 +79359,12 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ ** this code can safely assume that nCellKey is 32-bits */ assert( sqlite3BtreeCursorIsValid(pCur) ); - VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey); - assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */ + nCellKey = sqlite3BtreePayloadSize(pCur); assert( (nCellKey & SQLITE_MAX_U32)==(u64)nCellKey ); /* Read in the complete content of the index entry */ sqlite3VdbeMemInit(&m, db, 0); - rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, 1, &m); + rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, &m); if( rc ){ return rc; } @@ -68179,7 +79391,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ if( unlikely(typeRowid<1 || typeRowid>9 || typeRowid==7) ){ goto idx_rowid_corruption; } - lenRowid = sqlite3VdbeSerialTypeLen(typeRowid); + lenRowid = sqlite3SmallTypeSizes[typeRowid]; testcase( (u32)m.n==szHdr+lenRowid ); if( unlikely((u32)m.n<szHdr+lenRowid) ){ goto idx_rowid_corruption; @@ -68218,12 +79430,13 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( ){ i64 nCellKey = 0; int rc; - BtCursor *pCur = pC->pCursor; + BtCursor *pCur; Mem m; + assert( pC->eCurType==CURTYPE_BTREE ); + pCur = pC->uc.pCursor; assert( sqlite3BtreeCursorIsValid(pCur) ); - VVA_ONLY(rc =) sqlite3BtreeKeySize(pCur, &nCellKey); - assert( rc==SQLITE_OK ); /* pCur is always valid so KeySize cannot fail */ + nCellKey = sqlite3BtreePayloadSize(pCur); /* nCellKey will always be between 0 and 0xffffffff because of the way ** that btreeParseCellPtr() and sqlite3GetVarint32() are implemented */ if( nCellKey<=0 || nCellKey>0x7fffffff ){ @@ -68231,7 +79444,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( return SQLITE_CORRUPT_BKPT; } sqlite3VdbeMemInit(&m, db, 0); - rc = sqlite3VdbeMemFromBtree(pC->pCursor, 0, (u32)nCellKey, 1, &m); + rc = sqlite3VdbeMemFromBtree(pCur, 0, (u32)nCellKey, &m); if( rc ){ return rc; } @@ -68282,6 +79495,13 @@ SQLITE_PRIVATE sqlite3 *sqlite3VdbeDb(Vdbe *v){ return v->db; } +/* +** Return the SQLITE_PREPARE flags for a Vdbe. +*/ +SQLITE_PRIVATE u8 sqlite3VdbePrepareFlags(Vdbe *v){ + return v->prepFlags; +} + /* ** Return a pointer to an sqlite3_value structure containing the value bound ** parameter iVar of VM v. Except, if the value is an SQL NULL, return @@ -68294,6 +79514,7 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff assert( iVar>0 ); if( v ){ Mem *pMem = &v->aVar[iVar-1]; + assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); if( 0==(pMem->flags & MEM_Null) ){ sqlite3_value *pRet = sqlite3ValueNew(v->db); if( pRet ){ @@ -68313,13 +79534,36 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff */ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ assert( iVar>0 ); - if( iVar>32 ){ - v->expmask = 0xffffffff; + assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); + if( iVar>=32 ){ + v->expmask |= 0x80000000; }else{ v->expmask |= ((u32)1 << (iVar-1)); } } +/* +** Cause a function to throw an error if it was call from OP_PureFunc +** rather than OP_Function. +** +** OP_PureFunc means that the function must be deterministic, and should +** throw an error if it is given inputs that would make it non-deterministic. +** This routine is invoked by date/time functions that use non-deterministic +** features such as 'now'. +*/ +SQLITE_PRIVATE int sqlite3NotPureFunc(sqlite3_context *pCtx){ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( pCtx->pVdbe==0 ) return 1; +#endif + if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){ + sqlite3_result_error(pCtx, + "non-deterministic function in index expression or CHECK constraint", + -1); + return 0; + } + return 1; +} + #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored @@ -68327,14 +79571,105 @@ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ ** in memory obtained from sqlite3DbMalloc). */ SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){ - sqlite3 *db = p->db; - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg); - sqlite3_free(pVtab->zErrMsg); - pVtab->zErrMsg = 0; + if( pVtab->zErrMsg ){ + sqlite3 *db = p->db; + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = sqlite3DbStrDup(db, pVtab->zErrMsg); + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = 0; + } } #endif /* SQLITE_OMIT_VIRTUALTABLE */ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + +/* +** If the second argument is not NULL, release any allocations associated +** with the memory cells in the p->aMem[] array. Also free the UnpackedRecord +** structure itself, using sqlite3DbFree(). +** +** This function is used to free UnpackedRecord structures allocated by +** the vdbeUnpackRecord() function found in vdbeapi.c. +*/ +static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){ + if( p ){ + int i; + for(i=0; i<nField; i++){ + Mem *pMem = &p->aMem[i]; + if( pMem->zMalloc ) sqlite3VdbeMemRelease(pMem); + } + sqlite3DbFreeNN(db, p); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Invoke the pre-update hook. If this is an UPDATE or DELETE pre-update call, +** then cursor passed as the second argument should point to the row about +** to be update or deleted. If the application calls sqlite3_preupdate_old(), +** the required value will be read from the row the cursor points to. +*/ +SQLITE_PRIVATE void sqlite3VdbePreUpdateHook( + Vdbe *v, /* Vdbe pre-update hook is invoked by */ + VdbeCursor *pCsr, /* Cursor to grab old.* values from */ + int op, /* SQLITE_INSERT, UPDATE or DELETE */ + const char *zDb, /* Database name */ + Table *pTab, /* Modified table */ + i64 iKey1, /* Initial key value */ + int iReg /* Register for new.* record */ +){ + sqlite3 *db = v->db; + i64 iKey2; + PreUpdate preupdate; + const char *zTbl = pTab->zName; + static const u8 fakeSortOrder = 0; + + assert( db->pPreUpdate==0 ); + memset(&preupdate, 0, sizeof(PreUpdate)); + if( HasRowid(pTab)==0 ){ + iKey1 = iKey2 = 0; + preupdate.pPk = sqlite3PrimaryKeyIndex(pTab); + }else{ + if( op==SQLITE_UPDATE ){ + iKey2 = v->aMem[iReg].u.i; + }else{ + iKey2 = iKey1; + } + } + + assert( pCsr->nField==pTab->nCol + || (pCsr->nField==pTab->nCol+1 && op==SQLITE_DELETE && iReg==-1) + ); + + preupdate.v = v; + preupdate.pCsr = pCsr; + preupdate.op = op; + preupdate.iNewReg = iReg; + preupdate.keyinfo.db = db; + preupdate.keyinfo.enc = ENC(db); + preupdate.keyinfo.nKeyField = pTab->nCol; + preupdate.keyinfo.aSortOrder = (u8*)&fakeSortOrder; + preupdate.iKey1 = iKey1; + preupdate.iKey2 = iKey2; + preupdate.pTab = pTab; + + db->pPreUpdate = &preupdate; + db->xPreUpdateCallback(db->pPreUpdateArg, db, op, zDb, zTbl, iKey1, iKey2); + db->pPreUpdate = 0; + sqlite3DbFree(db, preupdate.aRecord); + vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pUnpacked); + vdbeFreeUnpacked(db, preupdate.keyinfo.nKeyField+1, preupdate.pNewUnpacked); + if( preupdate.aNew ){ + int i; + for(i=0; i<pCsr->nField; i++){ + sqlite3VdbeMemRelease(&preupdate.aNew[i]); + } + sqlite3DbFreeNN(db, preupdate.aNew); + } +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + /************** End of vdbeaux.c *********************************************/ /************** Begin file vdbeapi.c *****************************************/ /* @@ -68352,6 +79687,8 @@ SQLITE_PRIVATE void sqlite3VtabImportErrmsg(Vdbe *p, sqlite3_vtab *pVtab){ ** This file contains code use to implement APIs that are part of the ** VDBE. */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ #ifndef SQLITE_OMIT_DEPRECATED /* @@ -68390,6 +79727,38 @@ static int vdbeSafetyNotNull(Vdbe *p){ } } +#ifndef SQLITE_OMIT_TRACE +/* +** Invoke the profile callback. This routine is only called if we already +** know that the profile callback is defined and needs to be invoked. +*/ +static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ + sqlite3_int64 iNow; + sqlite3_int64 iElapse; + assert( p->startTime>0 ); + assert( db->xProfile!=0 || (db->mTrace & SQLITE_TRACE_PROFILE)!=0 ); + assert( db->init.busy==0 ); + assert( p->zSql!=0 ); + sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); + iElapse = (iNow - p->startTime)*1000000; + if( db->xProfile ){ + db->xProfile(db->pProfileArg, p->zSql, iElapse); + } + if( db->mTrace & SQLITE_TRACE_PROFILE ){ + db->xTrace(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); + } + p->startTime = 0; +} +/* +** The checkProfileCallback(DB,P) macro checks to see if a profile callback +** is needed, and it invokes the callback if it is needed. +*/ +# define checkProfileCallback(DB,P) \ + if( ((P)->startTime)>0 ){ invokeProfileCallback(DB,P); } +#else +# define checkProfileCallback(DB,P) /*no-op*/ +#endif + /* ** The following routine destroys a virtual machine that is created by ** the sqlite3_compile() routine. The integer returned is an SQLITE_ @@ -68410,6 +79779,7 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt){ sqlite3 *db = v->db; if( vdbeSafety(v) ) return SQLITE_MISUSE_BKPT; sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); rc = sqlite3VdbeFinalize(v); rc = sqlite3ApiExit(db, rc); sqlite3LeaveMutexAndCloseZombie(db); @@ -68431,12 +79801,14 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt){ rc = SQLITE_OK; }else{ Vdbe *v = (Vdbe*)pStmt; - sqlite3_mutex_enter(v->db->mutex); + sqlite3 *db = v->db; + sqlite3_mutex_enter(db->mutex); + checkProfileCallback(db, v); rc = sqlite3VdbeReset(v); sqlite3VdbeRewind(v); - assert( (rc & (v->db->errMask))==rc ); - rc = sqlite3ApiExit(v->db, rc); - sqlite3_mutex_leave(v->db->mutex); + assert( (rc & (db->errMask))==rc ); + rc = sqlite3ApiExit(db, rc); + sqlite3_mutex_leave(db->mutex); } return rc; } @@ -68456,7 +79828,8 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ sqlite3VdbeMemRelease(&p->aVar[i]); p->aVar[i].flags = MEM_Null; } - if( p->isPrepareV2 && p->expmask ){ + assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); + if( p->expmask ){ p->expired = 1; } sqlite3_mutex_leave(mutex); @@ -68471,7 +79844,10 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt *pStmt){ SQLITE_API const void *sqlite3_value_blob(sqlite3_value *pVal){ Mem *p = (Mem*)pVal; if( p->flags & (MEM_Blob|MEM_Str) ){ - sqlite3VdbeMemExpandBlob(p); + if( ExpandBlob(p)!=SQLITE_OK ){ + assert( p->flags==MEM_Null && p->z==0 ); + return 0; + } p->flags |= MEM_Blob; return p->n ? p->z : 0; }else{ @@ -68493,6 +79869,23 @@ SQLITE_API int sqlite3_value_int(sqlite3_value *pVal){ SQLITE_API sqlite_int64 sqlite3_value_int64(sqlite3_value *pVal){ return sqlite3VdbeIntValue((Mem*)pVal); } +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value *pVal){ + Mem *pMem = (Mem*)pVal; + return ((pMem->flags & MEM_Subtype) ? pMem->eSubtype : 0); +} +SQLITE_API void *sqlite3_value_pointer(sqlite3_value *pVal, const char *zPType){ + Mem *p = (Mem*)pVal; + if( (p->flags&(MEM_TypeMask|MEM_Term|MEM_Subtype)) == + (MEM_Null|MEM_Term|MEM_Subtype) + && zPType!=0 + && p->eSubtype=='p' + && strcmp(p->u.zPType, zPType)==0 + ){ + return (void*)p->z; + }else{ + return 0; + } +} SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value *pVal){ return (const unsigned char *)sqlite3ValueText(pVal, SQLITE_UTF8); } @@ -68507,6 +79900,10 @@ SQLITE_API const void *sqlite3_value_text16le(sqlite3_value *pVal){ return sqlite3ValueText(pVal, SQLITE_UTF16LE); } #endif /* SQLITE_OMIT_UTF16 */ +/* EVIDENCE-OF: R-12793-43283 Every value in SQLite has one of five +** fundamental datatypes: 64-bit signed integer 64-bit IEEE floating +** point number string BLOB NULL +*/ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ static const u8 aType[] = { SQLITE_BLOB, /* 0x00 */ @@ -68545,6 +79942,41 @@ SQLITE_API int sqlite3_value_type(sqlite3_value* pVal){ return aType[pVal->flags&MEM_AffMask]; } +/* Return true if a parameter to xUpdate represents an unchanged column */ +SQLITE_API int sqlite3_value_nochange(sqlite3_value *pVal){ + return (pVal->flags&(MEM_Null|MEM_Zero))==(MEM_Null|MEM_Zero); +} + +/* Make a copy of an sqlite3_value object +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ + sqlite3_value *pNew; + if( pOrig==0 ) return 0; + pNew = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return 0; + memset(pNew, 0, sizeof(*pNew)); + memcpy(pNew, pOrig, MEMCELLSIZE); + pNew->flags &= ~MEM_Dyn; + pNew->db = 0; + if( pNew->flags&(MEM_Str|MEM_Blob) ){ + pNew->flags &= ~(MEM_Static|MEM_Dyn); + pNew->flags |= MEM_Ephem; + if( sqlite3VdbeMemMakeWriteable(pNew)!=SQLITE_OK ){ + sqlite3ValueFree(pNew); + pNew = 0; + } + } + return pNew; +} + +/* Destroy an sqlite3_value object previously obtained from +** sqlite3_value_dup(). +*/ +SQLITE_API void sqlite3_value_free(sqlite3_value *pOld){ + sqlite3ValueFree(pOld); +} + + /**************************** sqlite3_result_ ******************************* ** The following routines are used by user-defined functions to specify ** the function result. @@ -68614,14 +80046,12 @@ SQLITE_API void sqlite3_result_double(sqlite3_context *pCtx, double rVal){ SQLITE_API void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); pCtx->isError = SQLITE_ERROR; - pCtx->fErrorOrAux = 1; sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT); } #ifndef SQLITE_OMIT_UTF16 SQLITE_API void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); pCtx->isError = SQLITE_ERROR; - pCtx->fErrorOrAux = 1; sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT); } #endif @@ -68637,6 +80067,24 @@ SQLITE_API void sqlite3_result_null(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetNull(pCtx->pOut); } +SQLITE_API void sqlite3_result_pointer( + sqlite3_context *pCtx, + void *pPtr, + const char *zPType, + void (*xDestructor)(void*) +){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + sqlite3VdbeMemRelease(pOut); + pOut->flags = MEM_Null; + sqlite3VdbeMemSetPointer(pOut, pPtr, zPType, xDestructor); +} +SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + pOut->eSubtype = eSubtype & 0xff; + pOut->flags |= MEM_Subtype; +} SQLITE_API void sqlite3_result_text( sqlite3_context *pCtx, const char *z, @@ -68699,9 +80147,20 @@ SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetZeroBlob(pCtx->pOut, n); } +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ + Mem *pOut = pCtx->pOut; + assert( sqlite3_mutex_held(pOut->db->mutex) ); + if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + return SQLITE_TOOBIG; + } + sqlite3VdbeMemSetZeroBlob(pCtx->pOut, (int)n); + return SQLITE_OK; +} SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ - pCtx->isError = errCode; - pCtx->fErrorOrAux = 1; + pCtx->isError = errCode ? errCode : -1; +#ifdef SQLITE_DEBUG + if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; +#endif if( pCtx->pOut->flags & MEM_Null ){ sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1, SQLITE_UTF8, SQLITE_STATIC); @@ -68712,7 +80171,6 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); pCtx->isError = SQLITE_TOOBIG; - pCtx->fErrorOrAux = 1; sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1, SQLITE_UTF8, SQLITE_STATIC); } @@ -68721,9 +80179,8 @@ SQLITE_API void sqlite3_result_error_toobig(sqlite3_context *pCtx){ SQLITE_API void sqlite3_result_error_nomem(sqlite3_context *pCtx){ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); sqlite3VdbeMemSetNull(pCtx->pOut); - pCtx->isError = SQLITE_NOMEM; - pCtx->fErrorOrAux = 1; - pCtx->pOut->db->mallocFailed = 1; + pCtx->isError = SQLITE_NOMEM_BKPT; + sqlite3OomFault(pCtx->pOut->db); } /* @@ -68741,8 +80198,8 @@ static int doWalCallbacks(sqlite3 *db){ sqlite3BtreeEnter(pBt); nEntry = sqlite3PagerWalCallback(sqlite3BtreePager(pBt)); sqlite3BtreeLeave(pBt); - if( db->xWalCallback && nEntry>0 && rc==SQLITE_OK ){ - rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zName, nEntry); + if( nEntry>0 && db->xWalCallback && rc==SQLITE_OK ){ + rc = db->xWalCallback(db->pWalArg, db, db->aDb[i].zDbSName, nEntry); } } } @@ -68750,6 +80207,7 @@ static int doWalCallbacks(sqlite3 *db){ return rc; } + /* ** Execute the statement pStmt, either until a row of data is ready, the ** statement is completely executed or an error occurs. @@ -68782,7 +80240,7 @@ static int sqlite3Step(Vdbe *p){ ** or SQLITE_BUSY error. */ #ifdef SQLITE_OMIT_AUTORESET - if( p->rc==SQLITE_BUSY || p->rc==SQLITE_LOCKED ){ + if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ sqlite3_reset((sqlite3_stmt*)p); }else{ return SQLITE_MISUSE_BKPT; @@ -68796,7 +80254,7 @@ static int sqlite3Step(Vdbe *p){ db = p->db; if( db->mallocFailed ){ p->rc = SQLITE_NOMEM; - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } if( p->pc<=0 && p->expired ){ @@ -68818,8 +80276,11 @@ static int sqlite3Step(Vdbe *p){ ); #ifndef SQLITE_OMIT_TRACE - if( db->xProfile && !db->init.busy ){ + if( (db->xProfile || (db->mTrace & SQLITE_TRACE_PROFILE)!=0) + && !db->init.busy && p->zSql ){ sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); + }else{ + assert( p->startTime==0 ); } #endif @@ -68828,6 +80289,9 @@ static int sqlite3Step(Vdbe *p){ if( p->bIsReader ) db->nVdbeRead++; p->pc = 0; } +#ifdef SQLITE_DEBUG + p->rcApp = SQLITE_OK; +#endif #ifndef SQLITE_OMIT_EXPLAIN if( p->explain ){ rc = sqlite3VdbeList(p); @@ -68840,16 +80304,11 @@ static int sqlite3Step(Vdbe *p){ } #ifndef SQLITE_OMIT_TRACE - /* Invoke the profile callback if there is one - */ - if( rc!=SQLITE_ROW && db->xProfile && !db->init.busy && p->zSql ){ - sqlite3_int64 iNow; - sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); - db->xProfile(db->pProfileArg, p->zSql, (iNow - p->startTime)*1000000); - } + /* If the statement completed successfully, invoke the profile callback */ + if( rc!=SQLITE_ROW ) checkProfileCallback(db, p); #endif - if( rc==SQLITE_DONE ){ + if( rc==SQLITE_DONE && db->autoCommit ){ assert( p->rc==SQLITE_OK ); p->rc = doWalCallbacks(db); if( p->rc!=SQLITE_OK ){ @@ -68859,7 +80318,7 @@ static int sqlite3Step(Vdbe *p){ db->errCode = rc; if( SQLITE_NOMEM==sqlite3ApiExit(p->db, p->rc) ){ - p->rc = SQLITE_NOMEM; + p->rc = SQLITE_NOMEM_BKPT; } end_of_step: /* At this point local variable rc holds the value that should be @@ -68870,11 +80329,14 @@ end_of_step: ** were called on statement p. */ assert( rc==SQLITE_ROW || rc==SQLITE_DONE || rc==SQLITE_ERROR - || rc==SQLITE_BUSY || rc==SQLITE_MISUSE + || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE ); - assert( p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE ); - if( p->isPrepareV2 && rc!=SQLITE_ROW && rc!=SQLITE_DONE ){ - /* If this statement was prepared using sqlite3_prepare_v2(), and an + assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 + && rc!=SQLITE_ROW + && rc!=SQLITE_DONE + ){ + /* If this statement was prepared using saved SQL and an ** error has occurred, then return the error code in p->rc to the ** caller. Set the error code in the database handle to the same value. */ @@ -68890,7 +80352,6 @@ end_of_step: */ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ int rc = SQLITE_OK; /* Result from sqlite3Step() */ - int rc2 = SQLITE_OK; /* Result from sqlite3Reprepare() */ Vdbe *v = (Vdbe*)pStmt; /* the prepared statement */ int cnt = 0; /* Counter to prevent infinite loop of reprepares */ sqlite3 *db; /* The database connection */ @@ -68904,32 +80365,31 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ while( (rc = sqlite3Step(v))==SQLITE_SCHEMA && cnt++ < SQLITE_MAX_SCHEMA_RETRY ){ int savedPc = v->pc; - rc2 = rc = sqlite3Reprepare(v); - if( rc!=SQLITE_OK) break; + rc = sqlite3Reprepare(v); + if( rc!=SQLITE_OK ){ + /* This case occurs after failing to recompile an sql statement. + ** The error message from the SQL compiler has already been loaded + ** into the database handle. This block copies the error message + ** from the database handle into the statement and sets the statement + ** program counter to 0 to ensure that when the statement is + ** finalized or reset the parser error message is available via + ** sqlite3_errmsg() and sqlite3_errcode(). + */ + const char *zErr = (const char *)sqlite3_value_text(db->pErr); + sqlite3DbFree(db, v->zErrMsg); + if( !db->mallocFailed ){ + v->zErrMsg = sqlite3DbStrDup(db, zErr); + v->rc = rc = sqlite3ApiExit(db, rc); + } else { + v->zErrMsg = 0; + v->rc = rc = SQLITE_NOMEM_BKPT; + } + break; + } sqlite3_reset(pStmt); if( savedPc>=0 ) v->doingRerun = 1; assert( v->expired==0 ); } - if( rc2!=SQLITE_OK ){ - /* This case occurs after failing to recompile an sql statement. - ** The error message from the SQL compiler has already been loaded - ** into the database handle. This block copies the error message - ** from the database handle into the statement and sets the statement - ** program counter to 0 to ensure that when the statement is - ** finalized or reset the parser error message is available via - ** sqlite3_errmsg() and sqlite3_errcode(). - */ - const char *zErr = (const char *)sqlite3_value_text(db->pErr); - sqlite3DbFree(db, v->zErrMsg); - if( !db->mallocFailed ){ - v->zErrMsg = sqlite3DbStrDup(db, zErr); - v->rc = rc2; - } else { - v->zErrMsg = 0; - v->rc = rc = SQLITE_NOMEM; - } - } - rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); return rc; } @@ -68955,43 +80415,50 @@ SQLITE_API void *sqlite3_user_data(sqlite3_context *p){ ** application defined function. */ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){ - assert( p && p->pFunc ); + assert( p && p->pOut ); return p->pOut->db; } /* -** Return the current time for a statement +** If this routine is invoked from within an xColumn method of a virtual +** table, then it returns true if and only if the the call is during an +** UPDATE operation and the value of the column will not be modified +** by the UPDATE. +** +** If this routine is called from any context other than within the +** xColumn method of a virtual table, then the return value is meaningless +** and arbitrary. +** +** Virtual table implements might use this routine to optimize their +** performance by substituting a NULL result, or some other light-weight +** value, as a signal to the xUpdate routine that the column is unchanged. */ -SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ - Vdbe *v = p->pVdbe; - int rc; - if( v->iCurrentTime==0 ){ - rc = sqlite3OsCurrentTimeInt64(p->pOut->db->pVfs, &v->iCurrentTime); - if( rc ) v->iCurrentTime = 0; - } - return v->iCurrentTime; +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context *p){ + assert( p ); + return sqlite3_value_nochange(p->pOut); } /* -** The following is the implementation of an SQL function that always -** fails with an error message stating that the function is used in the -** wrong context. The sqlite3_overload_function() API might construct -** SQL function that use this routine so that the functions will exist -** for name resolution but are actually overloaded by the xFindFunction -** method of virtual tables. +** Return the current time for a statement. If the current time +** is requested more than once within the same run of a single prepared +** statement, the exact same time is returned for each invocation regardless +** of the amount of time that elapses between invocations. In other words, +** the time returned is always the time of the first call. */ -SQLITE_PRIVATE void sqlite3InvalidFunction( - sqlite3_context *context, /* The function calling context */ - int NotUsed, /* Number of arguments to the function */ - sqlite3_value **NotUsed2 /* Value of each argument */ -){ - const char *zName = context->pFunc->zName; - char *zErr; - UNUSED_PARAMETER2(NotUsed, NotUsed2); - zErr = sqlite3_mprintf( - "unable to use function %s in the requested context", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); +SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ + int rc; +#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 + sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; + assert( p->pVdbe!=0 ); +#else + sqlite3_int64 iTime = 0; + sqlite3_int64 *piTime = p->pVdbe!=0 ? &p->pVdbe->iCurrentTime : &iTime; +#endif + if( *piTime==0 ){ + rc = sqlite3OsCurrentTimeInt64(p->pOut->db->pVfs, piTime); + if( rc ) *piTime = 0; + } + return *piTime; } /* @@ -69021,7 +80488,7 @@ static SQLITE_NOINLINE void *createAggContext(sqlite3_context *p, int nByte){ ** same context that was returned on prior calls. */ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ - assert( p && p->pFunc && p->pFunc->xStep ); + assert( p && p->pFunc && p->pFunc->xFinalize ); assert( sqlite3_mutex_held(p->pOut->db->mutex) ); testcase( nByte<0 ); if( (p->pMem->flags & MEM_Agg)==0 ){ @@ -69034,22 +80501,40 @@ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){ /* ** Return the auxiliary data pointer, if any, for the iArg'th argument to ** the user-function defined by pCtx. +** +** The left-most argument is 0. +** +** Undocumented behavior: If iArg is negative then access a cache of +** auxiliary data pointers that is available to all functions within a +** single prepared statement. The iArg values must match. */ SQLITE_API void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ AuxData *pAuxData; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); - for(pAuxData=pCtx->pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNext){ - if( pAuxData->iOp==pCtx->iOp && pAuxData->iArg==iArg ) break; +#if SQLITE_ENABLE_STAT3_OR_STAT4 + if( pCtx->pVdbe==0 ) return 0; +#else + assert( pCtx->pVdbe!=0 ); +#endif + for(pAuxData=pCtx->pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ + if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + return pAuxData->pAux; + } } - - return (pAuxData ? pAuxData->pAux : 0); + return 0; } /* ** Set the auxiliary data pointer and delete function, for the iArg'th ** argument to the user-function defined by pCtx. Any previous value is ** deleted by calling the delete function specified when it was set. +** +** The left-most argument is 0. +** +** Undocumented behavior: If iArg is negative then make the data available +** to all functions within the current prepared statement using iArg as an +** access code. */ SQLITE_API void sqlite3_set_auxdata( sqlite3_context *pCtx, @@ -69061,28 +80546,31 @@ SQLITE_API void sqlite3_set_auxdata( Vdbe *pVdbe = pCtx->pVdbe; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); - if( iArg<0 ) goto failed; +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + if( pVdbe==0 ) goto failed; +#else + assert( pVdbe!=0 ); +#endif - for(pAuxData=pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNext){ - if( pAuxData->iOp==pCtx->iOp && pAuxData->iArg==iArg ) break; + for(pAuxData=pVdbe->pAuxData; pAuxData; pAuxData=pAuxData->pNextAux){ + if( pAuxData->iAuxArg==iArg && (pAuxData->iAuxOp==pCtx->iOp || iArg<0) ){ + break; + } } if( pAuxData==0 ){ pAuxData = sqlite3DbMallocZero(pVdbe->db, sizeof(AuxData)); if( !pAuxData ) goto failed; - pAuxData->iOp = pCtx->iOp; - pAuxData->iArg = iArg; - pAuxData->pNext = pVdbe->pAuxData; + pAuxData->iAuxOp = pCtx->iOp; + pAuxData->iAuxArg = iArg; + pAuxData->pNextAux = pVdbe->pAuxData; pVdbe->pAuxData = pAuxData; - if( pCtx->fErrorOrAux==0 ){ - pCtx->isError = 0; - pCtx->fErrorOrAux = 1; - } - }else if( pAuxData->xDelete ){ - pAuxData->xDelete(pAuxData->pAux); + if( pCtx->isError==0 ) pCtx->isError = -1; + }else if( pAuxData->xDeleteAux ){ + pAuxData->xDeleteAux(pAuxData->pAux); } pAuxData->pAux = pAux; - pAuxData->xDelete = xDelete; + pAuxData->xDeleteAux = xDelete; return; failed: @@ -69102,7 +80590,7 @@ failed: ** context. */ SQLITE_API int sqlite3_aggregate_count(sqlite3_context *p){ - assert( p && p->pMem && p->pFunc && p->pFunc->xStep ); + assert( p && p->pMem && p->pFunc && p->pFunc->xFinalize ); return p->pMem->n; } #endif @@ -69144,18 +80632,19 @@ static const Mem *columnNullValue(void){ #endif = { /* .u = */ {0}, - /* .flags = */ MEM_Null, - /* .enc = */ 0, - /* .n = */ 0, - /* .z = */ 0, - /* .zMalloc = */ 0, - /* .szMalloc = */ 0, - /* .iPadding1 = */ 0, - /* .db = */ 0, - /* .xDel = */ 0, + /* .flags = */ (u16)MEM_Null, + /* .enc = */ (u8)0, + /* .eSubtype = */ (u8)0, + /* .n = */ (int)0, + /* .z = */ (char*)0, + /* .zMalloc = */ (char*)0, + /* .szMalloc = */ (int)0, + /* .uTemp = */ (u32)0, + /* .db = */ (sqlite3*)0, + /* .xDel = */ (void(*)(void*))0, #ifdef SQLITE_DEBUG - /* .pScopyFrom = */ 0, - /* .pFiller = */ 0, + /* .pScopyFrom = */ (Mem*)0, + /* .pFiller = */ (void*)0, #endif }; return &nullMem; @@ -69172,14 +80661,13 @@ static Mem *columnMem(sqlite3_stmt *pStmt, int i){ Mem *pOut; pVm = (Vdbe *)pStmt; - if( pVm && pVm->pResultSet!=0 && i<pVm->nResColumn && i>=0 ){ - sqlite3_mutex_enter(pVm->db->mutex); + if( pVm==0 ) return (Mem*)columnNullValue(); + assert( pVm->db ); + sqlite3_mutex_enter(pVm->db->mutex); + if( pVm->pResultSet!=0 && i<pVm->nResColumn && i>=0 ){ pOut = &pVm->pResultSet[i]; }else{ - if( pVm && ALWAYS(pVm->db) ){ - sqlite3_mutex_enter(pVm->db->mutex); - sqlite3Error(pVm->db, SQLITE_RANGE); - } + sqlite3Error(pVm->db, SQLITE_RANGE); pOut = (Mem*)columnNullValue(); } return pOut; @@ -69212,6 +80700,8 @@ static void columnMallocFailure(sqlite3_stmt *pStmt) */ Vdbe *p = (Vdbe *)pStmt; if( p ){ + assert( p->db!=0 ); + assert( sqlite3_mutex_held(p->db->mutex) ); p->rc = sqlite3ApiExit(p->db, p->rc); sqlite3_mutex_leave(p->db->mutex); } @@ -69329,7 +80819,7 @@ static const void *columnName( ** is the case, clear the mallocFailed flag and return NULL. */ if( db->mallocFailed ){ - db->mallocFailed = 0; + sqlite3OomClear(db); ret = 0; } sqlite3_mutex_leave(db->mutex); @@ -69477,9 +80967,8 @@ static int vdbeUnbind(Vdbe *p, int i){ ** as if there had been a schema change, on the first sqlite3_step() call ** following any change to the bindings of that parameter. */ - if( p->isPrepareV2 && - ((i<32 && p->expmask & ((u32)1 << i)) || p->expmask==0xffffffff) - ){ + assert( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || p->expmask==0 ); + if( p->expmask!=0 && (p->expmask & (i>=31 ? 0x80000000 : (u32)1<<i))!=0 ){ p->expired = 1; } return SQLITE_OK; @@ -69508,8 +80997,10 @@ static int bindText( if( rc==SQLITE_OK && encoding!=0 ){ rc = sqlite3VdbeChangeEncoding(pVar, ENC(p->db)); } - sqlite3Error(p->db, rc); - rc = sqlite3ApiExit(p->db, rc); + if( rc ){ + sqlite3Error(p->db, rc); + rc = sqlite3ApiExit(p->db, rc); + } } sqlite3_mutex_leave(p->db->mutex); }else if( xDel!=SQLITE_STATIC && xDel!=SQLITE_TRANSIENT ){ @@ -69529,6 +81020,9 @@ SQLITE_API int sqlite3_bind_blob( int nData, void (*xDel)(void*) ){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( nData<0 ) return SQLITE_MISUSE_BKPT; +#endif return bindText(pStmt, i, zData, nData, xDel, 0); } SQLITE_API int sqlite3_bind_blob64( @@ -69577,6 +81071,24 @@ SQLITE_API int sqlite3_bind_null(sqlite3_stmt *pStmt, int i){ } return rc; } +SQLITE_API int sqlite3_bind_pointer( + sqlite3_stmt *pStmt, + int i, + void *pPtr, + const char *zPTtype, + void (*xDestructor)(void*) +){ + int rc; + Vdbe *p = (Vdbe*)pStmt; + rc = vdbeUnbind(p, i); + if( rc==SQLITE_OK ){ + sqlite3VdbeMemSetPointer(&p->aVar[i-1], pPtr, zPTtype, xDestructor); + sqlite3_mutex_leave(p->db->mutex); + }else if( xDestructor ){ + xDestructor(pPtr); + } + return rc; +} SQLITE_API int sqlite3_bind_text( sqlite3_stmt *pStmt, int i, @@ -69654,6 +81166,20 @@ SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){ } return rc; } +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint64 n){ + int rc; + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + if( n>(u64)p->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + rc = SQLITE_TOOBIG; + }else{ + assert( (n & 0x7FFFFFFF)==n ); + rc = sqlite3_bind_zeroblob(pStmt, i, n); + } + rc = sqlite3ApiExit(p->db, rc); + sqlite3_mutex_leave(p->db->mutex); + return rc; +} /* ** Return the number of wildcards that can be potentially bound to. @@ -69672,10 +81198,8 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt *pStmt){ */ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ Vdbe *p = (Vdbe*)pStmt; - if( p==0 || i<1 || i>p->nzVar ){ - return 0; - } - return p->azVar[i-1]; + if( p==0 ) return 0; + return sqlite3VListNumToName(p->pVList, i); } /* @@ -69684,19 +81208,8 @@ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt *pStmt, int i){ ** return 0. */ SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe *p, const char *zName, int nName){ - int i; - if( p==0 ){ - return 0; - } - if( zName ){ - for(i=0; i<p->nzVar; i++){ - const char *z = p->azVar[i]; - if( z && strncmp(z,zName,nName)==0 && z[nName]==0 ){ - return i+1; - } - } - } - return 0; + if( p==0 || zName==0 ) return 0; + return sqlite3VListNameToNum(p->pVList, zName, nName); } SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt *pStmt, const char *zName){ return sqlite3VdbeParameterIndex((Vdbe*)pStmt, zName, sqlite3Strlen30(zName)); @@ -69738,10 +81251,12 @@ SQLITE_API int sqlite3_transfer_bindings(sqlite3_stmt *pFromStmt, sqlite3_stmt * if( pFrom->nVar!=pTo->nVar ){ return SQLITE_ERROR; } - if( pTo->isPrepareV2 && pTo->expmask ){ + assert( (pTo->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || pTo->expmask==0 ); + if( pTo->expmask ){ pTo->expired = 1; } - if( pFrom->isPrepareV2 && pFrom->expmask ){ + assert( (pFrom->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 || pFrom->expmask==0 ); + if( pFrom->expmask ){ pFrom->expired = 1; } return sqlite3TransferBindings(pFromStmt, pToStmt); @@ -69771,7 +81286,7 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt){ */ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ Vdbe *v = (Vdbe*)pStmt; - return v!=0 && v->pc>=0 && v->magic==VDBE_MAGIC_RUN; + return v!=0 && v->magic==VDBE_MAGIC_RUN && v->pc>=0; } /* @@ -69805,16 +81320,248 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ Vdbe *pVdbe = (Vdbe*)pStmt; u32 v; #ifdef SQLITE_ENABLE_API_ARMOR - if( !pStmt ){ + if( !pStmt + || (op!=SQLITE_STMTSTATUS_MEMUSED && (op<0||op>=ArraySize(pVdbe->aCounter))) + ){ (void)SQLITE_MISUSE_BKPT; return 0; } #endif - v = pVdbe->aCounter[op]; - if( resetFlag ) pVdbe->aCounter[op] = 0; + if( op==SQLITE_STMTSTATUS_MEMUSED ){ + sqlite3 *db = pVdbe->db; + sqlite3_mutex_enter(db->mutex); + v = 0; + db->pnBytesFreed = (int*)&v; + sqlite3VdbeClearObject(db, pVdbe); + sqlite3DbFree(db, pVdbe); + db->pnBytesFreed = 0; + sqlite3_mutex_leave(db->mutex); + }else{ + v = pVdbe->aCounter[op]; + if( resetFlag ) pVdbe->aCounter[op] = 0; + } return (int)v; } +/* +** Return the SQL associated with a prepared statement +*/ +SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt){ + Vdbe *p = (Vdbe *)pStmt; + return p ? p->zSql : 0; +} + +/* +** Return the SQL associated with a prepared statement with +** bound parameters expanded. Space to hold the returned string is +** obtained from sqlite3_malloc(). The caller is responsible for +** freeing the returned string by passing it to sqlite3_free(). +** +** The SQLITE_TRACE_SIZE_LIMIT puts an upper bound on the size of +** expanded bound parameters. +*/ +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ +#ifdef SQLITE_OMIT_TRACE + return 0; +#else + char *z = 0; + const char *zSql = sqlite3_sql(pStmt); + if( zSql ){ + Vdbe *p = (Vdbe *)pStmt; + sqlite3_mutex_enter(p->db->mutex); + z = sqlite3VdbeExpandSql(p, zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return z; +#endif +} + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Allocate and populate an UnpackedRecord structure based on the serialized +** record in nKey/pKey. Return a pointer to the new UnpackedRecord structure +** if successful, or a NULL pointer if an OOM error is encountered. +*/ +static UnpackedRecord *vdbeUnpackRecord( + KeyInfo *pKeyInfo, + int nKey, + const void *pKey +){ + UnpackedRecord *pRet; /* Return value */ + + pRet = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( pRet ){ + memset(pRet->aMem, 0, sizeof(Mem)*(pKeyInfo->nKeyField+1)); + sqlite3VdbeRecordUnpack(pKeyInfo, nKey, pKey, pRet); + } + return pRet; +} + +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or deleted. +*/ +SQLITE_API int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + Mem *pMem; + int rc = SQLITE_OK; + + /* Test that this call is being made from within an SQLITE_DELETE or + ** SQLITE_UPDATE pre-update callback, and that iIdx is within range. */ + if( !p || p->op==SQLITE_INSERT ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_old_out; + } + if( p->pPk ){ + iIdx = sqlite3ColumnOfIndex(p->pPk, iIdx); + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_old_out; + } + + /* If the old.* record has not yet been loaded into memory, do so now. */ + if( p->pUnpacked==0 ){ + u32 nRec; + u8 *aRec; + + nRec = sqlite3BtreePayloadSize(p->pCsr->uc.pCursor); + aRec = sqlite3DbMallocRaw(db, nRec); + if( !aRec ) goto preupdate_old_out; + rc = sqlite3BtreePayload(p->pCsr->uc.pCursor, 0, nRec, aRec); + if( rc==SQLITE_OK ){ + p->pUnpacked = vdbeUnpackRecord(&p->keyinfo, nRec, aRec); + if( !p->pUnpacked ) rc = SQLITE_NOMEM; + } + if( rc!=SQLITE_OK ){ + sqlite3DbFree(db, aRec); + goto preupdate_old_out; + } + p->aRecord = aRec; + } + + pMem = *ppValue = &p->pUnpacked->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey1); + }else if( iIdx>=p->pUnpacked->nField ){ + *ppValue = (sqlite3_value *)columnNullValue(); + }else if( p->pTab->aCol[iIdx].affinity==SQLITE_AFF_REAL ){ + if( pMem->flags & MEM_Int ){ + sqlite3VdbeMemRealify(pMem); + } + } + + preupdate_old_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** the number of columns in the row being updated, deleted or inserted. +*/ +SQLITE_API int sqlite3_preupdate_count(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->keyinfo.nKeyField : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is designed to be called from within a pre-update callback +** only. It returns zero if the change that caused the callback was made +** immediately by a user SQL statement. Or, if the change was made by a +** trigger program, it returns the number of trigger programs currently +** on the stack (1 for a top-level trigger, 2 for a trigger fired by a +** top-level trigger etc.). +** +** For the purposes of the previous paragraph, a foreign key CASCADE, SET NULL +** or SET DEFAULT action is considered a trigger. +*/ +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *db){ + PreUpdate *p = db->pPreUpdate; + return (p ? p->v->nFrame : 0); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** This function is called from within a pre-update callback to retrieve +** a field of the row currently being updated or inserted. +*/ +SQLITE_API int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ + PreUpdate *p = db->pPreUpdate; + int rc = SQLITE_OK; + Mem *pMem; + + if( !p || p->op==SQLITE_DELETE ){ + rc = SQLITE_MISUSE_BKPT; + goto preupdate_new_out; + } + if( p->pPk && p->op!=SQLITE_UPDATE ){ + iIdx = sqlite3ColumnOfIndex(p->pPk, iIdx); + } + if( iIdx>=p->pCsr->nField || iIdx<0 ){ + rc = SQLITE_RANGE; + goto preupdate_new_out; + } + + if( p->op==SQLITE_INSERT ){ + /* For an INSERT, memory cell p->iNewReg contains the serialized record + ** that is being inserted. Deserialize it. */ + UnpackedRecord *pUnpack = p->pNewUnpacked; + if( !pUnpack ){ + Mem *pData = &p->v->aMem[p->iNewReg]; + rc = ExpandBlob(pData); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + pUnpack = vdbeUnpackRecord(&p->keyinfo, pData->n, pData->z); + if( !pUnpack ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + p->pNewUnpacked = pUnpack; + } + pMem = &pUnpack->aMem[iIdx]; + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + }else if( iIdx>=pUnpack->nField ){ + pMem = (sqlite3_value *)columnNullValue(); + } + }else{ + /* For an UPDATE, memory cell (p->iNewReg+1+iIdx) contains the required + ** value. Make a copy of the cell contents and return a pointer to it. + ** It is not safe to return a pointer to the memory cell itself as the + ** caller may modify the value text encoding. + */ + assert( p->op==SQLITE_UPDATE ); + if( !p->aNew ){ + p->aNew = (Mem *)sqlite3DbMallocZero(db, sizeof(Mem) * p->pCsr->nField); + if( !p->aNew ){ + rc = SQLITE_NOMEM; + goto preupdate_new_out; + } + } + assert( iIdx>=0 && iIdx<p->pCsr->nField ); + pMem = &p->aNew[iIdx]; + if( pMem->flags==0 ){ + if( iIdx==p->pTab->iPKey ){ + sqlite3VdbeMemSetInt64(pMem, p->iKey2); + }else{ + rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg+1+iIdx]); + if( rc!=SQLITE_OK ) goto preupdate_new_out; + } + } + } + *ppValue = pMem; + + preupdate_new_out: + sqlite3Error(db, rc); + return sqlite3ApiExit(db, rc); +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + #ifdef SQLITE_ENABLE_STMT_SCANSTATUS /* ** Return status data for a single loop within query pStmt. @@ -69903,6 +81650,8 @@ SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){ ** ** The Vdbe parse-tree explainer is also found here. */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ #ifndef SQLITE_OMIT_TRACE @@ -69967,25 +81716,29 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( int i; /* Loop counter */ Mem *pVar; /* Value of a host parameter */ StrAccum out; /* Accumulate the output here */ +#ifndef SQLITE_OMIT_UTF16 + Mem utf8; /* Used to convert UTF16 into UTF8 for display */ +#endif char zBase[100]; /* Initial working space */ db = p->db; - sqlite3StrAccumInit(&out, zBase, sizeof(zBase), + sqlite3StrAccumInit(&out, 0, zBase, sizeof(zBase), db->aLimit[SQLITE_LIMIT_LENGTH]); - out.db = db; if( db->nVdbeExec>1 ){ while( *zRawSql ){ const char *zStart = zRawSql; while( *(zRawSql++)!='\n' && *zRawSql ); - sqlite3StrAccumAppend(&out, "-- ", 3); + sqlite3_str_append(&out, "-- ", 3); assert( (zRawSql - zStart) > 0 ); - sqlite3StrAccumAppend(&out, zStart, (int)(zRawSql-zStart)); + sqlite3_str_append(&out, zStart, (int)(zRawSql-zStart)); } + }else if( p->nVar==0 ){ + sqlite3_str_append(&out, zRawSql, sqlite3Strlen30(zRawSql)); }else{ while( zRawSql[0] ){ n = findNextHostParameter(zRawSql, &nToken); assert( n>0 ); - sqlite3StrAccumAppend(&out, zRawSql, n); + sqlite3_str_append(&out, zRawSql, n); zRawSql += n; assert( zRawSql[0] || nToken==0 ); if( nToken==0 ) break; @@ -69997,10 +81750,12 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( idx = nextIndex; } }else{ - assert( zRawSql[0]==':' || zRawSql[0]=='$' || zRawSql[0]=='@' ); + assert( zRawSql[0]==':' || zRawSql[0]=='$' || + zRawSql[0]=='@' || zRawSql[0]=='#' ); testcase( zRawSql[0]==':' ); testcase( zRawSql[0]=='$' ); testcase( zRawSql[0]=='@' ); + testcase( zRawSql[0]=='#' ); idx = sqlite3VdbeParameterIndex(p, zRawSql, nToken); assert( idx>0 ); } @@ -70009,21 +81764,23 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( assert( idx>0 && idx<=p->nVar ); pVar = &p->aVar[idx-1]; if( pVar->flags & MEM_Null ){ - sqlite3StrAccumAppend(&out, "NULL", 4); + sqlite3_str_append(&out, "NULL", 4); }else if( pVar->flags & MEM_Int ){ - sqlite3XPrintf(&out, 0, "%lld", pVar->u.i); + sqlite3_str_appendf(&out, "%lld", pVar->u.i); }else if( pVar->flags & MEM_Real ){ - sqlite3XPrintf(&out, 0, "%!.15g", pVar->u.r); + sqlite3_str_appendf(&out, "%!.15g", pVar->u.r); }else if( pVar->flags & MEM_Str ){ int nOut; /* Number of bytes of the string text to include in output */ #ifndef SQLITE_OMIT_UTF16 u8 enc = ENC(db); - Mem utf8; if( enc!=SQLITE_UTF8 ){ memset(&utf8, 0, sizeof(utf8)); utf8.db = db; sqlite3VdbeMemSetStr(&utf8, pVar->z, pVar->n, enc, SQLITE_STATIC); - sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8); + if( SQLITE_NOMEM==sqlite3VdbeChangeEncoding(&utf8, SQLITE_UTF8) ){ + out.accError = SQLITE_NOMEM; + out.nAlloc = 0; + } pVar = &utf8; } #endif @@ -70034,37 +81791,38 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( while( nOut<pVar->n && (pVar->z[nOut]&0xc0)==0x80 ){ nOut++; } } #endif - sqlite3XPrintf(&out, 0, "'%.*q'", nOut, pVar->z); + sqlite3_str_appendf(&out, "'%.*q'", nOut, pVar->z); #ifdef SQLITE_TRACE_SIZE_LIMIT if( nOut<pVar->n ){ - sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut); + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut); } #endif #ifndef SQLITE_OMIT_UTF16 if( enc!=SQLITE_UTF8 ) sqlite3VdbeMemRelease(&utf8); #endif }else if( pVar->flags & MEM_Zero ){ - sqlite3XPrintf(&out, 0, "zeroblob(%d)", pVar->u.nZero); + sqlite3_str_appendf(&out, "zeroblob(%d)", pVar->u.nZero); }else{ int nOut; /* Number of bytes of the blob to include in output */ assert( pVar->flags & MEM_Blob ); - sqlite3StrAccumAppend(&out, "x'", 2); + sqlite3_str_append(&out, "x'", 2); nOut = pVar->n; #ifdef SQLITE_TRACE_SIZE_LIMIT if( nOut>SQLITE_TRACE_SIZE_LIMIT ) nOut = SQLITE_TRACE_SIZE_LIMIT; #endif for(i=0; i<nOut; i++){ - sqlite3XPrintf(&out, 0, "%02x", pVar->z[i]&0xff); + sqlite3_str_appendf(&out, "%02x", pVar->z[i]&0xff); } - sqlite3StrAccumAppend(&out, "'", 1); + sqlite3_str_append(&out, "'", 1); #ifdef SQLITE_TRACE_SIZE_LIMIT if( nOut<pVar->n ){ - sqlite3XPrintf(&out, 0, "/*+%d bytes*/", pVar->n-nOut); + sqlite3_str_appendf(&out, "/*+%d bytes*/", pVar->n-nOut); } #endif } } } + if( out.accError ) sqlite3_str_reset(&out); return sqlite3StrAccumFinish(&out); } @@ -70092,6 +81850,8 @@ SQLITE_PRIVATE char *sqlite3VdbeExpandSql( ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ /* ** Invoke this macro on memory cells just prior to changing the @@ -70158,6 +81918,16 @@ static void updateMaxBlobsize(Mem *p){ } #endif +/* +** This macro evaluates to true if either the update hook or the preupdate +** hook are enabled for database connect DB. +*/ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +# define HAS_UPDATE_HOOK(DB) ((DB)->xPreUpdateCallback||(DB)->xUpdateCallback) +#else +# define HAS_UPDATE_HOOK(DB) ((DB)->xUpdateCallback) +#endif + /* ** The next global variable is incremented each time the OP_Found opcode ** is executed. This is used to test whether or not the foreign key @@ -70173,7 +81943,7 @@ SQLITE_API int sqlite3_found_count = 0; ** Test a register to see if it exceeds the current maximum blob size. ** If it does, record the new maximum blob size. */ -#if defined(SQLITE_TEST) && !defined(SQLITE_OMIT_BUILTIN_TEST) +#if defined(SQLITE_TEST) && !defined(SQLITE_UNTESTABLE) # define UPDATE_MAX_BLOBSIZE(P) updateMaxBlobsize(P) #else # define UPDATE_MAX_BLOBSIZE(P) @@ -70237,7 +82007,7 @@ SQLITE_API int sqlite3_found_count = 0; && sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;} /* Return true if the cursor was opened using the OP_OpenSorter opcode. */ -#define isSorter(x) ((x)->pSorter!=0) +#define isSorter(x) ((x)->eCurType==CURTYPE_SORTER) /* ** Allocate VdbeCursor number iCur. Return a pointer to it. Return NULL @@ -70248,7 +82018,7 @@ static VdbeCursor *allocateCursor( int iCur, /* Index of the new VdbeCursor */ int nField, /* Number of fields in the table or index */ int iDb, /* Database the cursor belongs to, or -1 */ - int isBtreeCursor /* True for B-Tree. False for pseudo-table or vtab */ + u8 eCurType /* Type of the new cursor */ ){ /* Find the memory cell that will be used to store the blob of memory ** required for this VdbeCursor structure. It is convenient to use a @@ -70264,33 +82034,34 @@ static VdbeCursor *allocateCursor( ** be freed lazily via the sqlite3_release_memory() API. This ** minimizes the number of malloc calls made by the system. ** - ** Memory cells for cursors are allocated at the top of the address - ** space. Memory cell (p->nMem) corresponds to cursor 0. Space for - ** cursor 1 is managed by memory cell (p->nMem-1), etc. + ** The memory cell for cursor 0 is aMem[0]. The rest are allocated from + ** the top of the register space. Cursor 1 is at Mem[p->nMem-1]. + ** Cursor 2 is at Mem[p->nMem-2]. And so forth. */ - Mem *pMem = &p->aMem[p->nMem-iCur]; + Mem *pMem = iCur>0 ? &p->aMem[p->nMem-iCur] : p->aMem; int nByte; VdbeCursor *pCx = 0; nByte = ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + - (isBtreeCursor?sqlite3BtreeCursorSize():0); + (eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); - assert( iCur<p->nCursor ); - if( p->apCsr[iCur] ){ + assert( iCur>=0 && iCur<p->nCursor ); + if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } if( SQLITE_OK==sqlite3VdbeMemClearAndResize(pMem, nByte) ){ p->apCsr[iCur] = pCx = (VdbeCursor*)pMem->z; - memset(pCx, 0, sizeof(VdbeCursor)); + memset(pCx, 0, offsetof(VdbeCursor,pAltCursor)); + pCx->eCurType = eCurType; pCx->iDb = iDb; pCx->nField = nField; pCx->aOffset = &pCx->aType[nField]; - if( isBtreeCursor ){ - pCx->pCursor = (BtCursor*) + if( eCurType==CURTYPE_BTREE ){ + pCx->uc.pCursor = (BtCursor*) &pMem->z[ROUND8(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; - sqlite3BtreeCursorZero(pCx->pCursor); + sqlite3BtreeCursorZero(pCx->uc.pCursor); } } return pCx; @@ -70325,6 +82096,11 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ pRec->flags |= MEM_Real; if( bTryForInt ) sqlite3VdbeIntegerAffinity(pRec); } + /* TEXT->NUMERIC is many->one. Hence, it is important to invalidate the + ** string representation after computing a numeric equivalent, because the + ** string representation might not be the canonical representation for the + ** numeric value. Ticket [343634942dd54ab57b7024] 2018-01-31. */ + pRec->flags &= ~MEM_Str; } /* @@ -70342,7 +82118,7 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ ** SQLITE_AFF_TEXT: ** Convert pRec to a text representation. ** -** SQLITE_AFF_NONE: +** SQLITE_AFF_BLOB: ** No-op. pRec is unchanged. */ static void applyAffinity( @@ -70353,7 +82129,7 @@ static void applyAffinity( if( affinity>=SQLITE_AFF_NUMERIC ){ assert( affinity==SQLITE_AFF_INTEGER || affinity==SQLITE_AFF_REAL || affinity==SQLITE_AFF_NUMERIC ); - if( (pRec->flags & MEM_Int)==0 ){ + if( (pRec->flags & MEM_Int)==0 ){ /*OPTIMIZATION-IF-FALSE*/ if( (pRec->flags & MEM_Real)==0 ){ if( pRec->flags & MEM_Str ) applyNumericAffinity(pRec,1); }else{ @@ -70363,11 +82139,15 @@ static void applyAffinity( }else if( affinity==SQLITE_AFF_TEXT ){ /* Only attempt the conversion to TEXT if there is an integer or real ** representation (blob and NULL do not get converted) but no string - ** representation. - */ - if( 0==(pRec->flags&MEM_Str) && (pRec->flags&(MEM_Real|MEM_Int)) ){ - sqlite3VdbeMemStringify(pRec, enc, 1); + ** representation. It would be harmless to repeat the conversion if + ** there is already a string rep, but it is pointless to waste those + ** CPU cycles. */ + if( 0==(pRec->flags&MEM_Str) ){ /*OPTIMIZATION-IF-FALSE*/ + if( (pRec->flags&(MEM_Real|MEM_Int)) ){ + sqlite3VdbeMemStringify(pRec, enc, 1); + } } + pRec->flags &= ~(MEM_Real|MEM_Int); } } @@ -70411,7 +82191,7 @@ static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){ if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){ return 0; } - if( sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc)==SQLITE_OK ){ + if( sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc)==0 ){ return MEM_Int; } return MEM_Real; @@ -70460,9 +82240,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ }else{ c = 's'; } - - sqlite3_snprintf(100, zCsr, "%c", c); - zCsr += sqlite3Strlen30(zCsr); + *(zCsr++) = c; sqlite3_snprintf(100, zCsr, "%d[", pMem->n); zCsr += sqlite3Strlen30(zCsr); for(i=0; i<16 && i<pMem->n; i++){ @@ -70474,9 +82252,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ if( z<32 || z>126 ) *zCsr++ = '.'; else *zCsr++ = z; } - - sqlite3_snprintf(100, zCsr, "]%s", encnames[pMem->enc]); - zCsr += sqlite3Strlen30(zCsr); + *(zCsr++) = ']'; if( f & MEM_Zero ){ sqlite3_snprintf(100, zCsr,"+%dz",pMem->u.nZero); zCsr += sqlite3Strlen30(zCsr); @@ -70525,7 +82301,7 @@ static void memTracePrint(Mem *p){ if( p->flags & MEM_Undefined ){ printf(" undefined"); }else if( p->flags & MEM_Null ){ - printf(" NULL"); + printf(p->flags & MEM_Zero ? " NULL-nochng" : " NULL"); }else if( (p->flags & (MEM_Int|MEM_Str))==(MEM_Int|MEM_Str) ){ printf(" si:%lld", p->u.i); }else if( p->flags & MEM_Int ){ @@ -70541,11 +82317,13 @@ static void memTracePrint(Mem *p){ sqlite3VdbeMemPrettyPrint(p, zBuf); printf(" %s", zBuf); } + if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype); } static void registerTrace(int iReg, Mem *p){ printf("REG[%d] = ", iReg); memTracePrint(p); printf("\n"); + sqlite3VdbeCheckMemInvariants(p); } #endif @@ -70579,8 +82357,8 @@ static void registerTrace(int iReg, Mem *p){ ** This file contains inline asm code for retrieving "high-performance" ** counters for x86 class CPUs. */ -#ifndef _HWTIME_H_ -#define _HWTIME_H_ +#ifndef SQLITE_HWTIME_H +#define SQLITE_HWTIME_H /* ** The following routine only works on pentium-class (or newer) processors. @@ -70648,7 +82426,7 @@ SQLITE_PRIVATE sqlite_uint64 sqlite3Hwtime(void){ return ((sqlite_uint64)0); } #endif -#endif /* !defined(_HWTIME_H_) */ +#endif /* !defined(SQLITE_HWTIME_H) */ /************** End of hwtime.h **********************************************/ /************** Continuing where we left off in vdbe.c ***********************/ @@ -70675,6 +82453,29 @@ static int checkSavepointCount(sqlite3 *db){ } #endif +/* +** Return the register of pOp->p2 after first preparing it to be +** overwritten with an integer value. +*/ +static SQLITE_NOINLINE Mem *out2PrereleaseWithClear(Mem *pOut){ + sqlite3VdbeMemSetNull(pOut); + pOut->flags = MEM_Int; + return pOut; +} +static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){ + Mem *pOut; + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + pOut = &p->aMem[pOp->p2]; + memAboutToChange(p, pOut); + if( VdbeMemDynamic(pOut) ){ /*OPTIMIZATION-IF-FALSE*/ + return out2PrereleaseWithClear(pOut); + }else{ + pOut->flags = MEM_Int; + return pOut; + } +} + /* ** Execute as much of a VDBE program as we can. @@ -70683,25 +82484,28 @@ static int checkSavepointCount(sqlite3 *db){ SQLITE_PRIVATE int sqlite3VdbeExec( Vdbe *p /* The VDBE */ ){ - int pc=0; /* The program counter */ Op *aOp = p->aOp; /* Copy of p->aOp */ - Op *pOp; /* Current operation */ + Op *pOp = aOp; /* Current operation */ +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + Op *pOrigOp; /* Value of pOp at the top of the loop */ +#endif +#ifdef SQLITE_DEBUG + int nExtraDelete = 0; /* Verifies FORDELETE and AUXDELETE flags */ +#endif int rc = SQLITE_OK; /* Value to return */ sqlite3 *db = p->db; /* The database */ u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */ u8 encoding = ENC(db); /* The database encoding */ - int iCompare = 0; /* Result of last OP_Compare operation */ + int iCompare = 0; /* Result of last comparison */ unsigned nVmStep = 0; /* Number of virtual machine steps */ #ifndef SQLITE_OMIT_PROGRESS_CALLBACK - unsigned nProgressLimit = 0;/* Invoke xProgress() when nVmStep reaches this */ + unsigned nProgressLimit; /* Invoke xProgress() when nVmStep reaches this */ #endif Mem *aMem = p->aMem; /* Copy of p->aMem */ Mem *pIn1 = 0; /* 1st input operand */ Mem *pIn2 = 0; /* 2nd input operand */ Mem *pIn3 = 0; /* 3rd input operand */ Mem *pOut = 0; /* Output operand */ - int *aPermute = 0; /* Permutation of columns for OP_Compare */ - i64 lastRowid = db->lastRowid; /* Saved value of the last insert ROWID */ #ifdef VDBE_PROFILE u64 start; /* CPU clock count at start of opcode */ #endif @@ -70714,9 +82518,8 @@ SQLITE_PRIVATE int sqlite3VdbeExec( ** sqlite3_column_text16() failed. */ goto no_mem; } - assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY ); + assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); assert( p->bIsReader || p->readOnly!=0 ); - p->rc = SQLITE_OK; p->iCurrentTime = 0; assert( p->explain==0 ); p->pResultSet = 0; @@ -70725,13 +82528,11 @@ SQLITE_PRIVATE int sqlite3VdbeExec( sqlite3VdbeIOTraceSql(p); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK if( db->xProgress ){ + u32 iPrior = p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; assert( 0 < db->nProgressOps ); - nProgressLimit = (unsigned)p->aCounter[SQLITE_STMTSTATUS_VM_STEP]; - if( nProgressLimit==0 ){ - nProgressLimit = db->nProgressOps; - }else{ - nProgressLimit %= (unsigned)db->nProgressOps; - } + nProgressLimit = db->nProgressOps - (iPrior % db->nProgressOps); + }else{ + nProgressLimit = 0xffffffff; } #endif #ifdef SQLITE_DEBUG @@ -70761,23 +82562,25 @@ SQLITE_PRIVATE int sqlite3VdbeExec( } sqlite3EndBenignMalloc(); #endif - for(pc=p->pc; rc==SQLITE_OK; pc++){ - assert( pc>=0 && pc<p->nOp ); - if( db->mallocFailed ) goto no_mem; + for(pOp=&aOp[p->pc]; 1; pOp++){ + /* Errors are detected by individual opcodes, with an immediate + ** jumps to abort_due_to_error. */ + assert( rc==SQLITE_OK ); + + assert( pOp>=aOp && pOp<&aOp[p->nOp]); #ifdef VDBE_PROFILE - start = sqlite3Hwtime(); + start = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime(); #endif nVmStep++; - pOp = &aOp[pc]; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - if( p->anExec ) p->anExec[pc]++; + if( p->anExec ) p->anExec[(int)(pOp-aOp)]++; #endif /* Only allow tracing if SQLITE_DEBUG is defined. */ #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ - sqlite3VdbePrintOp(stdout, pc, pOp); + sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); } #endif @@ -70794,55 +82597,46 @@ SQLITE_PRIVATE int sqlite3VdbeExec( } #endif - /* On any opcode with the "out2-prerelease" tag, free any - ** external allocations out of mem[p2] and set mem[p2] to be - ** an undefined integer. Opcodes will either fill in the integer - ** value or convert mem[p2] to a different type. - */ - assert( pOp->opflags==sqlite3OpcodeProperty[pOp->opcode] ); - if( pOp->opflags & OPFLG_OUT2_PRERELEASE ){ - assert( pOp->p2>0 ); - assert( pOp->p2<=(p->nMem-p->nCursor) ); - pOut = &aMem[pOp->p2]; - memAboutToChange(p, pOut); - if( VdbeMemDynamic(pOut) ) sqlite3VdbeMemSetNull(pOut); - pOut->flags = MEM_Int; - } - /* Sanity checking on other operands */ #ifdef SQLITE_DEBUG - if( (pOp->opflags & OPFLG_IN1)!=0 ){ - assert( pOp->p1>0 ); - assert( pOp->p1<=(p->nMem-p->nCursor) ); - assert( memIsValid(&aMem[pOp->p1]) ); - assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p1]) ); - REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]); - } - if( (pOp->opflags & OPFLG_IN2)!=0 ){ - assert( pOp->p2>0 ); - assert( pOp->p2<=(p->nMem-p->nCursor) ); - assert( memIsValid(&aMem[pOp->p2]) ); - assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p2]) ); - REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]); - } - if( (pOp->opflags & OPFLG_IN3)!=0 ){ - assert( pOp->p3>0 ); - assert( pOp->p3<=(p->nMem-p->nCursor) ); - assert( memIsValid(&aMem[pOp->p3]) ); - assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p3]) ); - REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]); - } - if( (pOp->opflags & OPFLG_OUT2)!=0 ){ - assert( pOp->p2>0 ); - assert( pOp->p2<=(p->nMem-p->nCursor) ); - memAboutToChange(p, &aMem[pOp->p2]); - } - if( (pOp->opflags & OPFLG_OUT3)!=0 ){ - assert( pOp->p3>0 ); - assert( pOp->p3<=(p->nMem-p->nCursor) ); - memAboutToChange(p, &aMem[pOp->p3]); + { + u8 opProperty = sqlite3OpcodeProperty[pOp->opcode]; + if( (opProperty & OPFLG_IN1)!=0 ){ + assert( pOp->p1>0 ); + assert( pOp->p1<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p1]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p1]) ); + REGISTER_TRACE(pOp->p1, &aMem[pOp->p1]); + } + if( (opProperty & OPFLG_IN2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p2]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p2]) ); + REGISTER_TRACE(pOp->p2, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_IN3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( memIsValid(&aMem[pOp->p3]) ); + assert( sqlite3VdbeCheckMemInvariants(&aMem[pOp->p3]) ); + REGISTER_TRACE(pOp->p3, &aMem[pOp->p3]); + } + if( (opProperty & OPFLG_OUT2)!=0 ){ + assert( pOp->p2>0 ); + assert( pOp->p2<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p2]); + } + if( (opProperty & OPFLG_OUT3)!=0 ){ + assert( pOp->p3>0 ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + memAboutToChange(p, &aMem[pOp->p3]); + } } #endif +#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) + pOrigOp = pOp; +#endif switch( pOp->opcode ){ @@ -70866,7 +82660,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( ** ** Other keywords in the comment that follows each case are used to ** construct the OPFLG_INITIALIZER value that initializes opcodeProperty[]. -** Keywords include: in1, in2, in3, out2_prerelease, out2, out3. See +** Keywords include: in1, in2, in3, out2, out3. See ** the mkopcodeh.awk script for additional information. ** ** Documentation about VDBE opcodes is generated by scanning this file @@ -70894,10 +82688,11 @@ SQLITE_PRIVATE int sqlite3VdbeExec( ** to the current line should be indented for EXPLAIN output. */ case OP_Goto: { /* jump */ - pc = pOp->p2 - 1; +jump_to_p2_and_check_for_interrupt: + pOp = &aOp[pOp->p2 - 1]; /* Opcodes that are used as the bottom of a loop (OP_Next, OP_Prev, - ** OP_VNext, OP_RowSetNext, or OP_SorterNext) all jump here upon + ** OP_VNext, or OP_SorterNext) all jump here upon ** completion. Check to see if sqlite3_interrupt() has been called ** or if the progress callback needs to be invoked. ** @@ -70915,12 +82710,12 @@ check_for_interrupt: ** If the progress callback returns non-zero, exit the virtual machine with ** a return code SQLITE_ABORT. */ - if( db->xProgress!=0 && nVmStep>=nProgressLimit ){ + if( nVmStep>=nProgressLimit && db->xProgress!=0 ){ assert( db->nProgressOps!=0 ); nProgressLimit = nVmStep + db->nProgressOps - (nVmStep%db->nProgressOps); if( db->xProgress(db->pProgressArg) ){ rc = SQLITE_INTERRUPT; - goto vdbe_error_halt; + goto abort_due_to_error; } } #endif @@ -70934,14 +82729,18 @@ check_for_interrupt: ** and then jump to address P2. */ case OP_Gosub: { /* jump */ - assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); pIn1 = &aMem[pOp->p1]; assert( VdbeMemDynamic(pIn1)==0 ); memAboutToChange(p, pIn1); pIn1->flags = MEM_Int; - pIn1->u.i = pc; + pIn1->u.i = (int)(pOp-aOp); REGISTER_TRACE(pOp->p1, pIn1); - pc = pOp->p2 - 1; + + /* Most jump operations do a goto to this spot in order to update + ** the pOp pointer. */ +jump_to_p2: + pOp = &aOp[pOp->p2 - 1]; break; } @@ -70953,7 +82752,7 @@ case OP_Gosub: { /* jump */ case OP_Return: { /* in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags==MEM_Int ); - pc = (int)pIn1->u.i; + pOp = &aOp[pIn1->u.i]; pIn1->flags = MEM_Undefined; break; } @@ -70970,14 +82769,14 @@ case OP_Return: { /* in1 */ ** See also: EndCoroutine */ case OP_InitCoroutine: { /* jump */ - assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); assert( pOp->p2>=0 && pOp->p2<p->nOp ); assert( pOp->p3>=0 && pOp->p3<p->nOp ); pOut = &aMem[pOp->p1]; assert( !VdbeMemDynamic(pOut) ); pOut->u.i = pOp->p3 - 1; pOut->flags = MEM_Int; - if( pOp->p2 ) pc = pOp->p2 - 1; + if( pOp->p2 ) goto jump_to_p2; break; } @@ -70997,7 +82796,7 @@ case OP_EndCoroutine: { /* in1 */ pCaller = &aOp[pIn1->u.i]; assert( pCaller->opcode==OP_Yield ); assert( pCaller->p2>=0 && pCaller->p2<p->nOp ); - pc = pCaller->p2 - 1; + pOp = &aOp[pCaller->p2 - 1]; pIn1->flags = MEM_Undefined; break; } @@ -71021,14 +82820,14 @@ case OP_Yield: { /* in1, jump */ assert( VdbeMemDynamic(pIn1)==0 ); pIn1->flags = MEM_Int; pcDest = (int)pIn1->u.i; - pIn1->u.i = pc; + pIn1->u.i = (int)(pOp - aOp); REGISTER_TRACE(pOp->p1, pIn1); - pc = pcDest; + pOp = &aOp[pcDest]; break; } /* Opcode: HaltIfNull P1 P2 P3 P4 P5 -** Synopsis: if r[P3]=null halt +** Synopsis: if r[P3]=null halt ** ** Check the value in register P3. If it is NULL then Halt using ** parameter P1, P2, and P4 as if this were a Halt instruction. If the @@ -71037,6 +82836,9 @@ case OP_Yield: { /* in1, jump */ */ case OP_HaltIfNull: { /* in3 */ pIn3 = &aMem[pOp->p3]; +#ifdef SQLITE_DEBUG + if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } +#endif if( (pIn3->flags & MEM_Null)==0 ) break; /* Fall through into OP_Halt */ } @@ -71072,61 +82874,58 @@ case OP_HaltIfNull: { /* in3 */ ** is the same as executing Halt. */ case OP_Halt: { - const char *zType; - const char *zLogFmt; + VdbeFrame *pFrame; + int pcx; + pcx = (int)(pOp - aOp); +#ifdef SQLITE_DEBUG + if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } +#endif if( pOp->p1==SQLITE_OK && p->pFrame ){ /* Halt the sub-program. Return control to the parent frame. */ - VdbeFrame *pFrame = p->pFrame; + pFrame = p->pFrame; p->pFrame = pFrame->pParent; p->nFrame--; sqlite3VdbeSetChanges(db, p->nChange); - pc = sqlite3VdbeFrameRestore(pFrame); - lastRowid = db->lastRowid; + pcx = sqlite3VdbeFrameRestore(pFrame); if( pOp->p2==OE_Ignore ){ - /* Instruction pc is the OP_Program that invoked the sub-program + /* Instruction pcx is the OP_Program that invoked the sub-program ** currently being halted. If the p2 instruction of this OP_Halt ** instruction is set to OE_Ignore, then the sub-program is throwing ** an IGNORE exception. In this case jump to the address specified ** as the p2 of the calling OP_Program. */ - pc = p->aOp[pc].p2-1; + pcx = p->aOp[pcx].p2-1; } aOp = p->aOp; aMem = p->aMem; + pOp = &aOp[pcx]; break; } p->rc = pOp->p1; p->errorAction = (u8)pOp->p2; - p->pc = pc; + p->pc = pcx; + assert( pOp->p5<=4 ); if( p->rc ){ if( pOp->p5 ){ static const char * const azType[] = { "NOT NULL", "UNIQUE", "CHECK", "FOREIGN KEY" }; - assert( pOp->p5>=1 && pOp->p5<=4 ); testcase( pOp->p5==1 ); testcase( pOp->p5==2 ); testcase( pOp->p5==3 ); testcase( pOp->p5==4 ); - zType = azType[pOp->p5-1]; + sqlite3VdbeError(p, "%s constraint failed", azType[pOp->p5-1]); + if( pOp->p4.z ){ + p->zErrMsg = sqlite3MPrintf(db, "%z: %s", p->zErrMsg, pOp->p4.z); + } }else{ - zType = 0; + sqlite3VdbeError(p, "%s", pOp->p4.z); } - assert( zType!=0 || pOp->p4.z!=0 ); - zLogFmt = "abort at %d in [%s]: %s"; - if( zType && pOp->p4.z ){ - sqlite3SetString(&p->zErrMsg, db, "%s constraint failed: %s", - zType, pOp->p4.z); - }else if( pOp->p4.z ){ - sqlite3SetString(&p->zErrMsg, db, "%s", pOp->p4.z); - }else{ - sqlite3SetString(&p->zErrMsg, db, "%s constraint failed", zType); - } - sqlite3_log(pOp->p1, zLogFmt, pc, p->zSql, p->zErrMsg); + sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pcx, p->zSql, p->zErrMsg); } rc = sqlite3VdbeHalt(p); assert( rc==SQLITE_BUSY || rc==SQLITE_OK || rc==SQLITE_ERROR ); if( rc==SQLITE_BUSY ){ - p->rc = rc = SQLITE_BUSY; + p->rc = SQLITE_BUSY; }else{ assert( rc==SQLITE_OK || (p->rc&0xff)==SQLITE_CONSTRAINT ); assert( rc==SQLITE_OK || db->nDeferredCons>0 || db->nDeferredImmCons>0 ); @@ -71140,7 +82939,8 @@ case OP_Halt: { ** ** The 32-bit integer value P1 is written into register P2. */ -case OP_Integer: { /* out2-prerelease */ +case OP_Integer: { /* out2 */ + pOut = out2Prerelease(p, pOp); pOut->u.i = pOp->p1; break; } @@ -71151,7 +82951,8 @@ case OP_Integer: { /* out2-prerelease */ ** P4 is a pointer to a 64-bit integer value. ** Write that value into register P2. */ -case OP_Int64: { /* out2-prerelease */ +case OP_Int64: { /* out2 */ + pOut = out2Prerelease(p, pOp); assert( pOp->p4.pI64!=0 ); pOut->u.i = *pOp->p4.pI64; break; @@ -71164,7 +82965,8 @@ case OP_Int64: { /* out2-prerelease */ ** P4 is a pointer to a 64-bit floating point value. ** Write that value into register P2. */ -case OP_Real: { /* same as TK_FLOAT, out2-prerelease */ +case OP_Real: { /* same as TK_FLOAT, out2 */ + pOut = out2Prerelease(p, pOp); pOut->flags = MEM_Real; assert( !sqlite3IsNaN(*pOp->p4.pReal) ); pOut->u.r = *pOp->p4.pReal; @@ -71176,19 +82978,20 @@ case OP_Real: { /* same as TK_FLOAT, out2-prerelease */ ** Synopsis: r[P2]='P4' ** ** P4 points to a nul terminated UTF-8 string. This opcode is transformed -** into a String before it is executed for the first time. During +** into a String opcode before it is executed for the first time. During ** this transformation, the length of string P4 is computed and stored ** as the P1 parameter. */ -case OP_String8: { /* same as TK_STRING, out2-prerelease */ +case OP_String8: { /* same as TK_STRING, out2 */ assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); pOp->opcode = OP_String; pOp->p1 = sqlite3Strlen30(pOp->p4.z); #ifndef SQLITE_OMIT_UTF16 if( encoding!=SQLITE_UTF8 ){ rc = sqlite3VdbeMemSetStr(pOut, pOp->p4.z, -1, SQLITE_UTF8, SQLITE_STATIC); - if( rc==SQLITE_TOOBIG ) goto too_big; + assert( rc==SQLITE_OK || rc==SQLITE_TOOBIG ); if( SQLITE_OK!=sqlite3VdbeChangeEncoding(pOut, encoding) ) goto no_mem; assert( pOut->szMalloc>0 && pOut->zMalloc==pOut->z ); assert( VdbeMemDynamic(pOut)==0 ); @@ -71201,30 +83004,48 @@ case OP_String8: { /* same as TK_STRING, out2-prerelease */ pOp->p4.z = pOut->z; pOp->p1 = pOut->n; } + testcase( rc==SQLITE_TOOBIG ); #endif if( pOp->p1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } + assert( rc==SQLITE_OK ); /* Fall through to the next case, OP_String */ } -/* Opcode: String P1 P2 * P4 * +/* Opcode: String P1 P2 P3 P4 P5 ** Synopsis: r[P2]='P4' (len=P1) ** ** The string value P4 of length P1 (bytes) is stored in register P2. +** +** If P3 is not zero and the content of register P3 is equal to P5, then +** the datatype of the register P2 is converted to BLOB. The content is +** the same sequence of bytes, it is merely interpreted as a BLOB instead +** of a string, as if it had been CAST. In other words: +** +** if( P3!=0 and reg[P3]==P5 ) reg[P2] := CAST(reg[P2] as BLOB) */ -case OP_String: { /* out2-prerelease */ +case OP_String: { /* out2 */ assert( pOp->p4.z!=0 ); + pOut = out2Prerelease(p, pOp); pOut->flags = MEM_Str|MEM_Static|MEM_Term; pOut->z = pOp->p4.z; pOut->n = pOp->p1; pOut->enc = encoding; UPDATE_MAX_BLOBSIZE(pOut); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pOp->p3>0 ){ + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); + pIn3 = &aMem[pOp->p3]; + assert( pIn3->flags & MEM_Int ); + if( pIn3->u.i==pOp->p5 ) pOut->flags = MEM_Blob|MEM_Static|MEM_Term; + } +#endif break; } /* Opcode: Null P1 P2 P3 * * -** Synopsis: r[P2..P3]=NULL +** Synopsis: r[P2..P3]=NULL ** ** Write a NULL into registers P2. If P3 greater than P2, then also write ** NULL into register P3 and every register in between P2 and P3. If P3 @@ -71235,24 +83056,27 @@ case OP_String: { /* out2-prerelease */ ** NULL values will not compare equal even if SQLITE_NULLEQ is set on ** OP_Ne or OP_Eq. */ -case OP_Null: { /* out2-prerelease */ +case OP_Null: { /* out2 */ int cnt; u16 nullFlag; + pOut = out2Prerelease(p, pOp); cnt = pOp->p3-pOp->p2; - assert( pOp->p3<=(p->nMem-p->nCursor) ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); pOut->flags = nullFlag = pOp->p1 ? (MEM_Null|MEM_Cleared) : MEM_Null; + pOut->n = 0; while( cnt>0 ){ pOut++; memAboutToChange(p, pOut); sqlite3VdbeMemSetNull(pOut); pOut->flags = nullFlag; + pOut->n = 0; cnt--; } break; } /* Opcode: SoftNull P1 * * * * -** Synopsis: r[P1]=NULL +** Synopsis: r[P1]=NULL ** ** Set register P1 to have the value NULL as seen by the OP_MakeRecord ** instruction, but do not free any string or blob memory associated with @@ -71260,9 +83084,9 @@ case OP_Null: { /* out2-prerelease */ ** previously copied using OP_SCopy, the copies will continue to be valid. */ case OP_SoftNull: { - assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); pOut = &aMem[pOp->p1]; - pOut->flags = (pOut->flags|MEM_Null)&~MEM_Undefined; + pOut->flags = (pOut->flags&~(MEM_Undefined|MEM_AffMask))|MEM_Null; break; } @@ -71272,8 +83096,9 @@ case OP_SoftNull: { ** P4 points to a blob of data P1 bytes long. Store this ** blob in register P2. */ -case OP_Blob: { /* out2-prerelease */ +case OP_Blob: { /* out2 */ assert( pOp->p1 <= SQLITE_MAX_LENGTH ); + pOut = out2Prerelease(p, pOp); sqlite3VdbeMemSetStr(pOut, pOp->p4.z, pOp->p1, 0, 0); pOut->enc = encoding; UPDATE_MAX_BLOBSIZE(pOut); @@ -71288,22 +83113,23 @@ case OP_Blob: { /* out2-prerelease */ ** If the parameter is named, then its name appears in P4. ** The P4 value is used by sqlite3_bind_parameter_name(). */ -case OP_Variable: { /* out2-prerelease */ +case OP_Variable: { /* out2 */ Mem *pVar; /* Value being transferred */ assert( pOp->p1>0 && pOp->p1<=p->nVar ); - assert( pOp->p4.z==0 || pOp->p4.z==p->azVar[pOp->p1-1] ); + assert( pOp->p4.z==0 || pOp->p4.z==sqlite3VListNumToName(p->pVList,pOp->p1) ); pVar = &p->aVar[pOp->p1 - 1]; if( sqlite3VdbeMemTooBig(pVar) ){ goto too_big; } + pOut = &aMem[pOp->p2]; sqlite3VdbeMemShallowCopy(pOut, pVar, MEM_Static); UPDATE_MAX_BLOBSIZE(pOut); break; } /* Opcode: Move P1 P2 P3 * * -** Synopsis: r[P2@P3]=r[P1@P3] +** Synopsis: r[P2@P3]=r[P1@P3] ** ** Move the P3 values in register P1..P1+P3-1 over into ** registers P2..P2+P3-1. Registers P1..P1+P3-1 are @@ -71325,16 +83151,17 @@ case OP_Move: { pIn1 = &aMem[p1]; pOut = &aMem[p2]; do{ - assert( pOut<=&aMem[(p->nMem-p->nCursor)] ); - assert( pIn1<=&aMem[(p->nMem-p->nCursor)] ); + assert( pOut<=&aMem[(p->nMem+1 - p->nCursor)] ); + assert( pIn1<=&aMem[(p->nMem+1 - p->nCursor)] ); assert( memIsValid(pIn1) ); memAboutToChange(p, pOut); sqlite3VdbeMemMove(pOut, pIn1); #ifdef SQLITE_DEBUG - if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrom<&aMem[p1+pOp->p3] ){ - pOut->pScopyFrom += p1 - pOp->p2; + if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrom<pOut ){ + pOut->pScopyFrom += pOp->p2 - p1; } #endif + Deephemeralize(pOut); REGISTER_TRACE(p2++, pOut); pIn1++; pOut++; @@ -71395,8 +83222,24 @@ case OP_SCopy: { /* out2 */ break; } +/* Opcode: IntCopy P1 P2 * * * +** Synopsis: r[P2]=r[P1] +** +** Transfer the integer value held in register P1 into register P2. +** +** This is an optimized version of SCopy that works only for integer +** values. +*/ +case OP_IntCopy: { /* out2 */ + pIn1 = &aMem[pOp->p1]; + assert( (pIn1->flags & MEM_Int)!=0 ); + pOut = &aMem[pOp->p2]; + sqlite3VdbeMemSetInt64(pOut, pIn1->u.i); + break; +} + /* Opcode: ResultRow P1 P2 * * * -** Synopsis: output=r[P1@P2] +** Synopsis: output=r[P1@P2] ** ** The registers P1 through P1+P2-1 contain a single row of ** results. This opcode causes the sqlite3_step() call to terminate @@ -71409,17 +83252,17 @@ case OP_ResultRow: { int i; assert( p->nResColumn==pOp->p2 ); assert( pOp->p1>0 ); - assert( pOp->p1+pOp->p2<=(p->nMem-p->nCursor)+1 ); + assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK /* Run the progress counter just before returning. */ if( db->xProgress!=0 - && nVmStep>=nProgressLimit + && nVmStep>=nProgressLimit && db->xProgress(db->pProgressArg)!=0 ){ rc = SQLITE_INTERRUPT; - goto vdbe_error_halt; + goto abort_due_to_error; } #endif @@ -71429,7 +83272,7 @@ case OP_ResultRow: { if( SQLITE_OK!=(rc = sqlite3VdbeCheckFk(p, 0)) ){ assert( db->flags&SQLITE_CountRows ); assert( p->usesStmtJournal ); - break; + goto abort_due_to_error; } /* If the SQLITE_CountRows flag is set in sqlite3.flags mask, then @@ -71449,9 +83292,7 @@ case OP_ResultRow: { */ assert( p->iStatement==0 || db->flags&SQLITE_CountRows ); rc = sqlite3VdbeCloseStatement(p, SAVEPOINT_RELEASE); - if( NEVER(rc!=SQLITE_OK) ){ - break; - } + assert( rc==SQLITE_OK ); /* Invalidate all ephemeral cursor row caches */ p->cacheCtr = (p->cacheCtr + 2)|1; @@ -71471,9 +83312,13 @@ case OP_ResultRow: { } if( db->mallocFailed ) goto no_mem; + if( db->mTrace & SQLITE_TRACE_ROW ){ + db->xTrace(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); + } + /* Return SQLITE_ROW */ - p->pc = pc + 1; + p->pc = (int)(pOp - aOp) + 1; rc = SQLITE_ROW; goto vdbe_return; } @@ -71527,14 +83372,14 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ } /* Opcode: Add P1 P2 P3 * * -** Synopsis: r[P3]=r[P1]+r[P2] +** Synopsis: r[P3]=r[P1]+r[P2] ** ** Add the value in register P1 to the value in register P2 ** and store the result in register P3. ** If either input is NULL, the result is NULL. */ /* Opcode: Multiply P1 P2 P3 * * -** Synopsis: r[P3]=r[P1]*r[P2] +** Synopsis: r[P3]=r[P1]*r[P2] ** ** ** Multiply the value in register P1 by the value in register P2 @@ -71542,14 +83387,14 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ ** If either input is NULL, the result is NULL. */ /* Opcode: Subtract P1 P2 P3 * * -** Synopsis: r[P3]=r[P2]-r[P1] +** Synopsis: r[P3]=r[P2]-r[P1] ** ** Subtract the value in register P1 from the value in register P2 ** and store the result in register P3. ** If either input is NULL, the result is NULL. */ /* Opcode: Divide P1 P2 P3 * * -** Synopsis: r[P3]=r[P2]/r[P1] +** Synopsis: r[P3]=r[P2]/r[P1] ** ** Divide the value in register P1 by the value in register P2 ** and store the result in register P3 (P3=P2/P1). If the value in @@ -71557,7 +83402,7 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ ** NULL, the result is NULL. */ /* Opcode: Remainder P1 P2 P3 * * -** Synopsis: r[P3]=r[P2]%r[P1] +** Synopsis: r[P3]=r[P2]%r[P1] ** ** Compute the remainder after integer register P2 is divided by ** register P1 and store the result in register P3. @@ -71584,7 +83429,6 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ type2 = numericType(pIn2); pOut = &aMem[pOp->p3]; flags = pIn1->flags | pIn2->flags; - if( (flags & MEM_Null)!=0 ) goto arithmetic_result_is_null; if( (type1 & type2 & MEM_Int)!=0 ){ iA = pIn1->u.i; iB = pIn2->u.i; @@ -71608,6 +83452,8 @@ case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ } pOut->u.i = iB; MemSetTypeFlag(pOut, MEM_Int); + }else if( (flags & MEM_Null)!=0 ){ + goto arithmetic_result_is_null; }else{ bIntint = 0; fp_math: @@ -71655,7 +83501,7 @@ arithmetic_result_is_null: /* Opcode: CollSeq P1 * * P4 ** -** P4 is a pointer to a CollSeq struct. If the next call to a user function +** P4 is a pointer to a CollSeq object. If the next call to a user function ** or aggregate calls sqlite3GetFuncCollSeq(), this collation sequence will ** be returned. This is used by the built-in min(), max() and nullif() ** functions. @@ -71666,7 +83512,7 @@ arithmetic_result_is_null: ** ** The interface used by the implementation of the aforementioned functions ** to retrieve the collation sequence set by this opcode is not available -** publicly, only to user functions defined in func.c. +** publicly. Only built-in functions have access to this feature. */ case OP_CollSeq: { assert( pOp->p4type==P4_COLLSEQ ); @@ -71676,93 +83522,22 @@ case OP_CollSeq: { break; } -/* Opcode: Function P1 P2 P3 P4 P5 -** Synopsis: r[P3]=func(r[P2@P5]) -** -** Invoke a user function (P4 is a pointer to a Function structure that -** defines the function) with P5 arguments taken from register P2 and -** successors. The result of the function is stored in register P3. -** Register P3 must not be one of the function inputs. -** -** P1 is a 32-bit bitmask indicating whether or not each argument to the -** function was determined to be constant at compile time. If the first -** argument was constant then bit 0 of P1 is set. This is used to determine -** whether meta data associated with a user function argument using the -** sqlite3_set_auxdata() API may be safely retained until the next -** invocation of this opcode. -** -** See also: AggStep and AggFinal -*/ -case OP_Function: { - int i; - Mem *pArg; - sqlite3_context ctx; - sqlite3_value **apVal; - int n; - - n = pOp->p5; - apVal = p->apArg; - assert( apVal || n==0 ); - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); - ctx.pOut = &aMem[pOp->p3]; - memAboutToChange(p, ctx.pOut); - - assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem-p->nCursor)+1) ); - assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n ); - pArg = &aMem[pOp->p2]; - for(i=0; i<n; i++, pArg++){ - assert( memIsValid(pArg) ); - apVal[i] = pArg; - Deephemeralize(pArg); - REGISTER_TRACE(pOp->p2+i, pArg); - } - - assert( pOp->p4type==P4_FUNCDEF ); - ctx.pFunc = pOp->p4.pFunc; - ctx.iOp = pc; - ctx.pVdbe = p; - MemSetTypeFlag(ctx.pOut, MEM_Null); - ctx.fErrorOrAux = 0; - db->lastRowid = lastRowid; - (*ctx.pFunc->xFunc)(&ctx, n, apVal); /* IMP: R-24505-23230 */ - lastRowid = db->lastRowid; /* Remember rowid changes made by xFunc */ - - /* If the function returned an error, throw an exception */ - if( ctx.fErrorOrAux ){ - if( ctx.isError ){ - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(ctx.pOut)); - rc = ctx.isError; - } - sqlite3VdbeDeleteAuxData(p, pc, pOp->p1); - } - - /* Copy the result of the function into register P3 */ - sqlite3VdbeChangeEncoding(ctx.pOut, encoding); - if( sqlite3VdbeMemTooBig(ctx.pOut) ){ - goto too_big; - } - - REGISTER_TRACE(pOp->p3, ctx.pOut); - UPDATE_MAX_BLOBSIZE(ctx.pOut); - break; -} - /* Opcode: BitAnd P1 P2 P3 * * -** Synopsis: r[P3]=r[P1]&r[P2] +** Synopsis: r[P3]=r[P1]&r[P2] ** ** Take the bit-wise AND of the values in register P1 and P2 and ** store the result in register P3. ** If either input is NULL, the result is NULL. */ /* Opcode: BitOr P1 P2 P3 * * -** Synopsis: r[P3]=r[P1]|r[P2] +** Synopsis: r[P3]=r[P1]|r[P2] ** ** Take the bit-wise OR of the values in register P1 and P2 and ** store the result in register P3. ** If either input is NULL, the result is NULL. */ /* Opcode: ShiftLeft P1 P2 P3 * * -** Synopsis: r[P3]=r[P2]<<r[P1] +** Synopsis: r[P3]=r[P2]<<r[P1] ** ** Shift the integer value in register P2 to the left by the ** number of bits specified by the integer in register P1. @@ -71770,7 +83545,7 @@ case OP_Function: { ** If either input is NULL, the result is NULL. */ /* Opcode: ShiftRight P1 P2 P3 * * -** Synopsis: r[P3]=r[P2]>>r[P1] +** Synopsis: r[P3]=r[P2]>>r[P1] ** ** Shift the integer value in register P2 to the right by the ** number of bits specified by the integer in register P1. @@ -71830,7 +83605,7 @@ case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ } /* Opcode: AddImm P1 P2 * * * -** Synopsis: r[P1]=r[P1]+P2 +** Synopsis: r[P1]=r[P1]+P2 ** ** Add the constant P2 to the value in register P1. ** The result is always an integer. @@ -71862,8 +83637,7 @@ case OP_MustBeInt: { /* jump, in1 */ rc = SQLITE_MISMATCH; goto abort_due_to_error; }else{ - pc = pOp->p2 - 1; - break; + goto jump_to_p2; } } } @@ -71897,19 +83671,19 @@ case OP_RealAffinity: { /* in1 */ ** Force the value in register P1 to be the type defined by P2. ** ** <ul> -** <li value="97"> TEXT -** <li value="98"> BLOB -** <li value="99"> NUMERIC -** <li value="100"> INTEGER -** <li value="101"> REAL +** <li> P2=='A' → BLOB +** <li> P2=='B' → TEXT +** <li> P2=='C' → NUMERIC +** <li> P2=='D' → INTEGER +** <li> P2=='E' → REAL ** </ul> ** ** A NULL value is not changed by this routine. It remains NULL. */ case OP_Cast: { /* in1 */ - assert( pOp->p2>=SQLITE_AFF_NONE && pOp->p2<=SQLITE_AFF_REAL ); + assert( pOp->p2>=SQLITE_AFF_BLOB && pOp->p2<=SQLITE_AFF_REAL ); testcase( pOp->p2==SQLITE_AFF_TEXT ); - testcase( pOp->p2==SQLITE_AFF_NONE ); + testcase( pOp->p2==SQLITE_AFF_BLOB ); testcase( pOp->p2==SQLITE_AFF_NUMERIC ); testcase( pOp->p2==SQLITE_AFF_INTEGER ); testcase( pOp->p2==SQLITE_AFF_REAL ); @@ -71918,18 +83692,66 @@ case OP_Cast: { /* in1 */ rc = ExpandBlob(pIn1); sqlite3VdbeMemCast(pIn1, pOp->p2, encoding); UPDATE_MAX_BLOBSIZE(pIn1); + if( rc ) goto abort_due_to_error; break; } #endif /* SQLITE_OMIT_CAST */ +/* Opcode: Eq P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]==r[P1] +** +** Compare the values in register P1 and P3. If reg(P3)==reg(P1) then +** jump to address P2. Or if the SQLITE_STOREP2 flag is set in P5, then +** store the result of comparison in register P2. +** +** The SQLITE_AFF_MASK portion of P5 must be an affinity character - +** SQLITE_AFF_TEXT, SQLITE_AFF_INTEGER, and so forth. An attempt is made +** to coerce both inputs according to this affinity before the +** comparison is made. If the SQLITE_AFF_MASK is 0x00, then numeric +** affinity is used. Note that the affinity conversions are stored +** back into the input registers P1 and P3. So this opcode can cause +** persistent changes to registers P1 and P3. +** +** Once any conversions have taken place, and neither value is NULL, +** the values are compared. If both values are blobs then memcmp() is +** used to determine the results of the comparison. If both values +** are text, then the appropriate collating function specified in +** P4 is used to do the comparison. If P4 is not specified then +** memcmp() is used to compare text string. If both values are +** numeric, then a numeric comparison is used. If the two values +** are of different types, then numbers are considered less than +** strings and strings are considered less than blobs. +** +** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either +** true or false and is never NULL. If both operands are NULL then the result +** of comparison is true. If either operand is NULL then the result is false. +** If neither operand is NULL the result is the same as it would be if +** the SQLITE_NULLEQ flag were omitted from P5. +** +** If both SQLITE_STOREP2 and SQLITE_KEEPNULL flags are set then the +** content of r[P2] is only changed if the new value is NULL or 0 (false). +** In other words, a prior r[P2] value will not be overwritten by 1 (true). +*/ +/* Opcode: Ne P1 P2 P3 P4 P5 +** Synopsis: IF r[P3]!=r[P1] +** +** This works just like the Eq opcode except that the jump is taken if +** the operands in registers P1 and P3 are not equal. See the Eq opcode for +** additional information. +** +** If both SQLITE_STOREP2 and SQLITE_KEEPNULL flags are set then the +** content of r[P2] is only changed if the new value is NULL or 1 (true). +** In other words, a prior r[P2] value will not be overwritten by 0 (false). +*/ /* Opcode: Lt P1 P2 P3 P4 P5 -** Synopsis: if r[P1]<r[P3] goto P2 +** Synopsis: IF r[P3]<r[P1] ** ** Compare the values in register P1 and P3. If reg(P3)<reg(P1) then -** jump to address P2. +** jump to address P2. Or if the SQLITE_STOREP2 flag is set in P5 store +** the result of comparison (0 or 1 or NULL) into register P2. ** ** If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or -** reg(P3) is NULL then take the jump. If the SQLITE_JUMPIFNULL +** reg(P3) is NULL then the take the jump. If the SQLITE_JUMPIFNULL ** bit is clear then fall through if either operand is NULL. ** ** The SQLITE_AFF_MASK portion of P5 must be an affinity character - @@ -71949,56 +83771,23 @@ case OP_Cast: { /* in1 */ ** numeric, then a numeric comparison is used. If the two values ** are of different types, then numbers are considered less than ** strings and strings are considered less than blobs. -** -** If the SQLITE_STOREP2 bit of P5 is set, then do not jump. Instead, -** store a boolean result (either 0, or 1, or NULL) in register P2. -** -** If the SQLITE_NULLEQ bit is set in P5, then NULL values are considered -** equal to one another, provided that they do not have their MEM_Cleared -** bit set. -*/ -/* Opcode: Ne P1 P2 P3 P4 P5 -** Synopsis: if r[P1]!=r[P3] goto P2 -** -** This works just like the Lt opcode except that the jump is taken if -** the operands in registers P1 and P3 are not equal. See the Lt opcode for -** additional information. -** -** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either -** true or false and is never NULL. If both operands are NULL then the result -** of comparison is false. If either operand is NULL then the result is true. -** If neither operand is NULL the result is the same as it would be if -** the SQLITE_NULLEQ flag were omitted from P5. -*/ -/* Opcode: Eq P1 P2 P3 P4 P5 -** Synopsis: if r[P1]==r[P3] goto P2 -** -** This works just like the Lt opcode except that the jump is taken if -** the operands in registers P1 and P3 are equal. -** See the Lt opcode for additional information. -** -** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either -** true or false and is never NULL. If both operands are NULL then the result -** of comparison is true. If either operand is NULL then the result is false. -** If neither operand is NULL the result is the same as it would be if -** the SQLITE_NULLEQ flag were omitted from P5. */ /* Opcode: Le P1 P2 P3 P4 P5 -** Synopsis: if r[P1]<=r[P3] goto P2 +** Synopsis: IF r[P3]<=r[P1] ** ** This works just like the Lt opcode except that the jump is taken if ** the content of register P3 is less than or equal to the content of ** register P1. See the Lt opcode for additional information. */ /* Opcode: Gt P1 P2 P3 P4 P5 -** Synopsis: if r[P1]>r[P3] goto P2 +** Synopsis: IF r[P3]>r[P1] ** ** This works just like the Lt opcode except that the jump is taken if ** the content of register P3 is greater than the content of ** register P1. See the Lt opcode for additional information. */ /* Opcode: Ge P1 P2 P3 P4 P5 -** Synopsis: if r[P1]>=r[P3] goto P2 +** Synopsis: IF r[P3]>=r[P1] ** ** This works just like the Lt opcode except that the jump is taken if ** the content of register P3 is greater than or equal to the content of @@ -72010,7 +83799,7 @@ case OP_Lt: /* same as TK_LT, jump, in1, in3 */ case OP_Le: /* same as TK_LE, jump, in1, in3 */ case OP_Gt: /* same as TK_GT, jump, in1, in3 */ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ - int res; /* Result of the comparison of pIn1 against pIn3 */ + int res, res2; /* Result of the comparison of pIn1 against pIn3 */ char affinity; /* Affinity to use for comparison */ u16 flags1; /* Copy of initial value of pIn1->flags */ u16 flags3; /* Copy of initial value of pIn3->flags */ @@ -72029,13 +83818,12 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); assert( (flags1 & MEM_Cleared)==0 ); assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 ); - if( (flags1&MEM_Null)!=0 - && (flags3&MEM_Null)!=0 + if( (flags1&flags3&MEM_Null)!=0 && (flags3&MEM_Cleared)==0 ){ - res = 0; /* Results are equal */ + res = 0; /* Operands are equal */ }else{ - res = 1; /* Results are not equal */ + res = 1; /* Operands are not equal */ } }else{ /* SQLITE_NULLEQ is clear and at least one operand is NULL, @@ -72044,12 +83832,14 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ */ if( pOp->p5 & SQLITE_STOREP2 ){ pOut = &aMem[pOp->p2]; + iCompare = 1; /* Operands are not equal */ + memAboutToChange(p, pOut); MemSetTypeFlag(pOut, MEM_Null); REGISTER_TRACE(pOp->p2, pOut); }else{ VdbeBranchTaken(2,3); if( pOp->p5 & SQLITE_JUMPIFNULL ){ - pc = pOp->p2-1; + goto jump_to_p2; } } break; @@ -72058,76 +83848,137 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ /* Neither operand is NULL. Do a comparison. */ affinity = pOp->p5 & SQLITE_AFF_MASK; if( affinity>=SQLITE_AFF_NUMERIC ){ - if( (pIn1->flags & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ - applyNumericAffinity(pIn1,0); + if( (flags1 | flags3)&MEM_Str ){ + if( (flags1 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn1,0); + testcase( flags3!=pIn3->flags ); /* Possible if pIn1==pIn3 */ + flags3 = pIn3->flags; + } + if( (flags3 & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ + applyNumericAffinity(pIn3,0); + } } - if( (pIn3->flags & (MEM_Int|MEM_Real|MEM_Str))==MEM_Str ){ - applyNumericAffinity(pIn3,0); + /* Handle the common case of integer comparison here, as an + ** optimization, to avoid a call to sqlite3MemCompare() */ + if( (pIn1->flags & pIn3->flags & MEM_Int)!=0 ){ + if( pIn3->u.i > pIn1->u.i ){ res = +1; goto compare_op; } + if( pIn3->u.i < pIn1->u.i ){ res = -1; goto compare_op; } + res = 0; + goto compare_op; } }else if( affinity==SQLITE_AFF_TEXT ){ - if( (pIn1->flags & MEM_Str)==0 && (pIn1->flags & (MEM_Int|MEM_Real))!=0 ){ + if( (flags1 & MEM_Str)==0 && (flags1 & (MEM_Int|MEM_Real))!=0 ){ testcase( pIn1->flags & MEM_Int ); testcase( pIn1->flags & MEM_Real ); sqlite3VdbeMemStringify(pIn1, encoding, 1); + testcase( (flags1&MEM_Dyn) != (pIn1->flags&MEM_Dyn) ); + flags1 = (pIn1->flags & ~MEM_TypeMask) | (flags1 & MEM_TypeMask); + assert( pIn1!=pIn3 ); } - if( (pIn3->flags & MEM_Str)==0 && (pIn3->flags & (MEM_Int|MEM_Real))!=0 ){ + if( (flags3 & MEM_Str)==0 && (flags3 & (MEM_Int|MEM_Real))!=0 ){ testcase( pIn3->flags & MEM_Int ); testcase( pIn3->flags & MEM_Real ); sqlite3VdbeMemStringify(pIn3, encoding, 1); + testcase( (flags3&MEM_Dyn) != (pIn3->flags&MEM_Dyn) ); + flags3 = (pIn3->flags & ~MEM_TypeMask) | (flags3 & MEM_TypeMask); } } assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 ); - if( pIn1->flags & MEM_Zero ){ - sqlite3VdbeMemExpandBlob(pIn1); - flags1 &= ~MEM_Zero; - } - if( pIn3->flags & MEM_Zero ){ - sqlite3VdbeMemExpandBlob(pIn3); - flags3 &= ~MEM_Zero; - } - if( db->mallocFailed ) goto no_mem; res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); } - switch( pOp->opcode ){ - case OP_Eq: res = res==0; break; - case OP_Ne: res = res!=0; break; - case OP_Lt: res = res<0; break; - case OP_Le: res = res<=0; break; - case OP_Gt: res = res>0; break; - default: res = res>=0; break; +compare_op: + /* At this point, res is negative, zero, or positive if reg[P1] is + ** less than, equal to, or greater than reg[P3], respectively. Compute + ** the answer to this operator in res2, depending on what the comparison + ** operator actually is. The next block of code depends on the fact + ** that the 6 comparison operators are consecutive integers in this + ** order: NE, EQ, GT, LE, LT, GE */ + assert( OP_Eq==OP_Ne+1 ); assert( OP_Gt==OP_Ne+2 ); assert( OP_Le==OP_Ne+3 ); + assert( OP_Lt==OP_Ne+4 ); assert( OP_Ge==OP_Ne+5 ); + if( res<0 ){ /* ne, eq, gt, le, lt, ge */ + static const unsigned char aLTb[] = { 1, 0, 0, 1, 1, 0 }; + res2 = aLTb[pOp->opcode - OP_Ne]; + }else if( res==0 ){ + static const unsigned char aEQb[] = { 0, 1, 0, 1, 0, 1 }; + res2 = aEQb[pOp->opcode - OP_Ne]; + }else{ + static const unsigned char aGTb[] = { 1, 0, 1, 0, 0, 1 }; + res2 = aGTb[pOp->opcode - OP_Ne]; } + /* Undo any changes made by applyAffinity() to the input registers. */ + assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); + pIn1->flags = flags1; + assert( (pIn3->flags & MEM_Dyn) == (flags3 & MEM_Dyn) ); + pIn3->flags = flags3; + if( pOp->p5 & SQLITE_STOREP2 ){ pOut = &aMem[pOp->p2]; + iCompare = res; + if( (pOp->p5 & SQLITE_KEEPNULL)!=0 ){ + /* The KEEPNULL flag prevents OP_Eq from overwriting a NULL with 1 + ** and prevents OP_Ne from overwriting NULL with 0. This flag + ** is only used in contexts where either: + ** (1) op==OP_Eq && (r[P2]==NULL || r[P2]==0) + ** (2) op==OP_Ne && (r[P2]==NULL || r[P2]==1) + ** Therefore it is not necessary to check the content of r[P2] for + ** NULL. */ + assert( pOp->opcode==OP_Ne || pOp->opcode==OP_Eq ); + assert( res2==0 || res2==1 ); + testcase( res2==0 && pOp->opcode==OP_Eq ); + testcase( res2==1 && pOp->opcode==OP_Eq ); + testcase( res2==0 && pOp->opcode==OP_Ne ); + testcase( res2==1 && pOp->opcode==OP_Ne ); + if( (pOp->opcode==OP_Eq)==res2 ) break; + } memAboutToChange(p, pOut); MemSetTypeFlag(pOut, MEM_Int); - pOut->u.i = res; + pOut->u.i = res2; REGISTER_TRACE(pOp->p2, pOut); }else{ VdbeBranchTaken(res!=0, (pOp->p5 & SQLITE_NULLEQ)?2:3); - if( res ){ - pc = pOp->p2-1; + if( res2 ){ + goto jump_to_p2; } } - /* Undo any changes made by applyAffinity() to the input registers. */ - pIn1->flags = flags1; - pIn3->flags = flags3; break; } +/* Opcode: ElseNotEq * P2 * * * +** +** This opcode must immediately follow an OP_Lt or OP_Gt comparison operator. +** If result of an OP_Eq comparison on the same two operands +** would have be NULL or false (0), then then jump to P2. +** If the result of an OP_Eq comparison on the two previous operands +** would have been true (1), then fall through. +*/ +case OP_ElseNotEq: { /* same as TK_ESCAPE, jump */ + assert( pOp>aOp ); + assert( pOp[-1].opcode==OP_Lt || pOp[-1].opcode==OP_Gt ); + assert( pOp[-1].p5 & SQLITE_STOREP2 ); + VdbeBranchTaken(iCompare!=0, 2); + if( iCompare!=0 ) goto jump_to_p2; + break; +} + + /* Opcode: Permutation * * * P4 * ** -** Set the permutation used by the OP_Compare operator to be the array -** of integers in P4. +** Set the permutation used by the OP_Compare operator in the next +** instruction. The permutation is stored in the P4 operand. ** ** The permutation is only valid until the next OP_Compare that has ** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should ** occur immediately prior to the OP_Compare. +** +** The first integer in the P4 integer array is the length of the array +** and does not become part of the permutation. */ case OP_Permutation: { assert( pOp->p4type==P4_INTARRAY ); assert( pOp->p4.ai ); - aPermute = pOp->p4.ai; + assert( pOp[1].opcode==OP_Compare ); + assert( pOp[1].p5 & OPFLAG_PERMUTE ); break; } @@ -72160,23 +84011,32 @@ case OP_Compare: { int idx; CollSeq *pColl; /* Collating sequence to use on this term */ int bRev; /* True for DESCENDING sort order */ + int *aPermute; /* The permutation */ - if( (pOp->p5 & OPFLAG_PERMUTE)==0 ) aPermute = 0; + if( (pOp->p5 & OPFLAG_PERMUTE)==0 ){ + aPermute = 0; + }else{ + assert( pOp>aOp ); + assert( pOp[-1].opcode==OP_Permutation ); + assert( pOp[-1].p4type==P4_INTARRAY ); + aPermute = pOp[-1].p4.ai + 1; + assert( aPermute!=0 ); + } n = pOp->p3; pKeyInfo = pOp->p4.pKeyInfo; assert( n>0 ); assert( pKeyInfo!=0 ); p1 = pOp->p1; p2 = pOp->p2; -#if SQLITE_DEBUG +#ifdef SQLITE_DEBUG if( aPermute ){ int k, mx = 0; for(k=0; k<n; k++) if( aPermute[k]>mx ) mx = aPermute[k]; - assert( p1>0 && p1+mx<=(p->nMem-p->nCursor)+1 ); - assert( p2>0 && p2+mx<=(p->nMem-p->nCursor)+1 ); + assert( p1>0 && p1+mx<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+mx<=(p->nMem+1 - p->nCursor)+1 ); }else{ - assert( p1>0 && p1+n<=(p->nMem-p->nCursor)+1 ); - assert( p2>0 && p2+n<=(p->nMem-p->nCursor)+1 ); + assert( p1>0 && p1+n<=(p->nMem+1 - p->nCursor)+1 ); + assert( p2>0 && p2+n<=(p->nMem+1 - p->nCursor)+1 ); } #endif /* SQLITE_DEBUG */ for(i=0; i<n; i++){ @@ -72185,7 +84045,7 @@ case OP_Compare: { assert( memIsValid(&aMem[p2+idx]) ); REGISTER_TRACE(p1+idx, &aMem[p1+idx]); REGISTER_TRACE(p2+idx, &aMem[p2+idx]); - assert( i<pKeyInfo->nField ); + assert( i<pKeyInfo->nKeyField ); pColl = pKeyInfo->aColl[i]; bRev = pKeyInfo->aSortOrder[i]; iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); @@ -72194,7 +84054,6 @@ case OP_Compare: { break; } } - aPermute = 0; break; } @@ -72206,11 +84065,11 @@ case OP_Compare: { */ case OP_Jump: { /* jump */ if( iCompare<0 ){ - pc = pOp->p1 - 1; VdbeBranchTaken(0,3); + VdbeBranchTaken(0,3); pOp = &aOp[pOp->p1 - 1]; }else if( iCompare==0 ){ - pc = pOp->p2 - 1; VdbeBranchTaken(1,3); + VdbeBranchTaken(1,3); pOp = &aOp[pOp->p2 - 1]; }else{ - pc = pOp->p3 - 1; VdbeBranchTaken(2,3); + VdbeBranchTaken(2,3); pOp = &aOp[pOp->p3 - 1]; } break; } @@ -72240,18 +84099,8 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */ int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ - pIn1 = &aMem[pOp->p1]; - if( pIn1->flags & MEM_Null ){ - v1 = 2; - }else{ - v1 = sqlite3VdbeIntValue(pIn1)!=0; - } - pIn2 = &aMem[pOp->p2]; - if( pIn2->flags & MEM_Null ){ - v2 = 2; - }else{ - v2 = sqlite3VdbeIntValue(pIn2)!=0; - } + v1 = sqlite3VdbeBooleanValue(&aMem[pOp->p1], 2); + v2 = sqlite3VdbeBooleanValue(&aMem[pOp->p2], 2); if( pOp->opcode==OP_And ){ static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 }; v1 = and_logic[v1*3+v2]; @@ -72269,6 +84118,35 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */ break; } +/* Opcode: IsTrue P1 P2 P3 P4 * +** Synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 +** +** This opcode implements the IS TRUE, IS FALSE, IS NOT TRUE, and +** IS NOT FALSE operators. +** +** Interpret the value in register P1 as a boolean value. Store that +** boolean (a 0 or 1) in register P2. Or if the value in register P1 is +** NULL, then the P3 is stored in register P2. Invert the answer if P4 +** is 1. +** +** The logic is summarized like this: +** +** <ul> +** <li> If P3==0 and P4==0 then r[P2] := r[P1] IS TRUE +** <li> If P3==1 and P4==1 then r[P2] := r[P1] IS FALSE +** <li> If P3==0 and P4==1 then r[P2] := r[P1] IS NOT TRUE +** <li> If P3==1 and P4==0 then r[P2] := r[P1] IS NOT FALSE +** </ul> +*/ +case OP_IsTrue: { /* in1, out2 */ + assert( pOp->p4type==P4_INT32 ); + assert( pOp->p4.i==0 || pOp->p4.i==1 ); + assert( pOp->p3==0 || pOp->p3==1 ); + sqlite3VdbeMemSetInt64(&aMem[pOp->p2], + sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3) ^ pOp->p4.i); + break; +} + /* Opcode: Not P1 P2 * * * ** Synopsis: r[P2]= !r[P1] ** @@ -72279,10 +84157,10 @@ case OP_Or: { /* same as TK_OR, in1, in2, out3 */ case OP_Not: { /* same as TK_NOT, in1, out2 */ pIn1 = &aMem[pOp->p1]; pOut = &aMem[pOp->p2]; - sqlite3VdbeMemSetNull(pOut); if( (pIn1->flags & MEM_Null)==0 ){ - pOut->flags = MEM_Int; - pOut->u.i = !sqlite3VdbeIntValue(pIn1); + sqlite3VdbeMemSetInt64(pOut, !sqlite3VdbeBooleanValue(pIn1,0)); + }else{ + sqlite3VdbeMemSetNull(pOut); } break; } @@ -72307,23 +84185,39 @@ case OP_BitNot: { /* same as TK_BITNOT, in1, out2 */ /* Opcode: Once P1 P2 * * * ** -** Check the "once" flag number P1. If it is set, jump to instruction P2. -** Otherwise, set the flag and fall through to the next instruction. -** In other words, this opcode causes all following opcodes up through P2 -** (but not including P2) to run just once and to be skipped on subsequent -** times through the loop. +** Fall through to the next instruction the first time this opcode is +** encountered on each invocation of the byte-code program. Jump to P2 +** on the second and all subsequent encounters during the same invocation. ** -** All "once" flags are initially cleared whenever a prepared statement -** first begins to run. +** Top-level programs determine first invocation by comparing the P1 +** operand against the P1 operand on the OP_Init opcode at the beginning +** of the program. If the P1 values differ, then fall through and make +** the P1 of this opcode equal to the P1 of OP_Init. If P1 values are +** the same then take the jump. +** +** For subprograms, there is a bitmask in the VdbeFrame that determines +** whether or not the jump should be taken. The bitmask is necessary +** because the self-altering code trick does not work for recursive +** triggers. */ case OP_Once: { /* jump */ - assert( pOp->p1<p->nOnceFlag ); - VdbeBranchTaken(p->aOnceFlag[pOp->p1]!=0, 2); - if( p->aOnceFlag[pOp->p1] ){ - pc = pOp->p2-1; + u32 iAddr; /* Address of this instruction */ + assert( p->aOp[0].opcode==OP_Init ); + if( p->pFrame ){ + iAddr = (int)(pOp - p->aOp); + if( (p->pFrame->aOnce[iAddr/8] & (1<<(iAddr & 7)))!=0 ){ + VdbeBranchTaken(1, 2); + goto jump_to_p2; + } + p->pFrame->aOnce[iAddr/8] |= 1<<(iAddr & 7); }else{ - p->aOnceFlag[pOp->p1] = 1; + if( p->aOp[0].p1==pOp->p1 ){ + VdbeBranchTaken(1, 2); + goto jump_to_p2; + } } + VdbeBranchTaken(0, 2); + pOp->p1 = p->aOp[0].p1; break; } @@ -72333,35 +84227,30 @@ case OP_Once: { /* jump */ ** is considered true if it is numeric and non-zero. If the value ** in P1 is NULL then take the jump if and only if P3 is non-zero. */ +case OP_If: { /* jump, in1 */ + int c; + c = sqlite3VdbeBooleanValue(&aMem[pOp->p1], pOp->p3); + VdbeBranchTaken(c!=0, 2); + if( c ) goto jump_to_p2; + break; +} + /* Opcode: IfNot P1 P2 P3 * * ** ** Jump to P2 if the value in register P1 is False. The value ** is considered false if it has a numeric value of zero. If the value ** in P1 is NULL then take the jump if and only if P3 is non-zero. */ -case OP_If: /* jump, in1 */ case OP_IfNot: { /* jump, in1 */ int c; - pIn1 = &aMem[pOp->p1]; - if( pIn1->flags & MEM_Null ){ - c = pOp->p3; - }else{ -#ifdef SQLITE_OMIT_FLOATING_POINT - c = sqlite3VdbeIntValue(pIn1)!=0; -#else - c = sqlite3VdbeRealValue(pIn1)!=0.0; -#endif - if( pOp->opcode==OP_IfNot ) c = !c; - } + c = !sqlite3VdbeBooleanValue(&aMem[pOp->p1], !pOp->p3); VdbeBranchTaken(c!=0, 2); - if( c ){ - pc = pOp->p2-1; - } + if( c ) goto jump_to_p2; break; } /* Opcode: IsNull P1 P2 * * * -** Synopsis: if r[P1]==NULL goto P2 +** Synopsis: if r[P1]==NULL goto P2 ** ** Jump to P2 if the value in register P1 is NULL. */ @@ -72369,7 +84258,7 @@ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ pIn1 = &aMem[pOp->p1]; VdbeBranchTaken( (pIn1->flags & MEM_Null)!=0, 2); if( (pIn1->flags & MEM_Null)!=0 ){ - pc = pOp->p2 - 1; + goto jump_to_p2; } break; } @@ -72383,13 +84272,61 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ pIn1 = &aMem[pOp->p1]; VdbeBranchTaken( (pIn1->flags & MEM_Null)==0, 2); if( (pIn1->flags & MEM_Null)==0 ){ - pc = pOp->p2 - 1; + goto jump_to_p2; } break; } +/* Opcode: IfNullRow P1 P2 P3 * * +** Synopsis: if P1.nullRow then r[P3]=NULL, goto P2 +** +** Check the cursor P1 to see if it is currently pointing at a NULL row. +** If it is, then set register P3 to NULL and jump immediately to P2. +** If P1 is not on a NULL row, then fall through without making any +** changes. +*/ +case OP_IfNullRow: { /* jump */ + assert( pOp->p1>=0 && pOp->p1<p->nCursor ); + assert( p->apCsr[pOp->p1]!=0 ); + if( p->apCsr[pOp->p1]->nullRow ){ + sqlite3VdbeMemSetNull(aMem + pOp->p3); + goto jump_to_p2; + } + break; +} + +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC +/* Opcode: Offset P1 P2 P3 * * +** Synopsis: r[P3] = sqlite_offset(P1) +** +** Store in register r[P3] the byte offset into the database file that is the +** start of the payload for the record at which that cursor P1 is currently +** pointing. +** +** P2 is the column number for the argument to the sqlite_offset() function. +** This opcode does not use P2 itself, but the P2 value is used by the +** code generator. The P1, P2, and P3 operands to this opcode are the +** same as for OP_Column. +** +** This opcode is only available if SQLite is compiled with the +** -DSQLITE_ENABLE_OFFSET_SQL_FUNC option. +*/ +case OP_Offset: { /* out3 */ + VdbeCursor *pC; /* The VDBE cursor */ + assert( pOp->p1>=0 && pOp->p1<p->nCursor ); + pC = p->apCsr[pOp->p1]; + pOut = &p->aMem[pOp->p3]; + if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){ + sqlite3VdbeMemSetNull(pOut); + }else{ + sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor)); + } + break; +} +#endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ + /* Opcode: Column P1 P2 P3 P4 P5 -** Synopsis: r[P3]=PX +** Synopsis: r[P3]=PX ** ** Interpret the data that cursor P1 points to as a structure built using ** the MakeRecord instruction. (See the MakeRecord opcode for additional @@ -72399,7 +84336,7 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ ** ** The value extracted is stored in register P3. ** -** If the column contains fewer than P2 fields, then extract a NULL. Or, +** If the record contains fewer than P2 fields, then extract a NULL. Or, ** if the P4 argument is a P4_MEM use the value of the P4 argument as ** the result. ** @@ -72408,13 +84345,12 @@ case OP_NotNull: { /* same as TK_NOTNULL, jump, in1 */ ** The first OP_Column against a pseudo-table after the value of the content ** register has changed should have this bit set. ** -** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 when +** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 then ** the result is guaranteed to only be used as the argument of a length() ** or typeof() function, respectively. The loading of large blobs can be ** skipped for length() and all content loading can be skipped for typeof(). */ case OP_Column: { - i64 payloadSize64; /* Number of bytes in the record */ int p2; /* column number to retrieve */ VdbeCursor *pC; /* The VDBE cursor */ BtCursor *pCrsr; /* The BTree cursor */ @@ -72426,107 +84362,102 @@ case OP_Column: { const u8 *zData; /* Part of the record being decoded */ const u8 *zHdr; /* Next unparsed byte of the header */ const u8 *zEndHdr; /* Pointer to first byte after the header */ - u32 offset; /* Offset into the data */ - u32 szField; /* Number of bytes in the content of a field */ - u32 avail; /* Number of bytes of available data */ + u64 offset64; /* 64-bit offset */ u32 t; /* A type code from the record header */ - u16 fx; /* pDest->flags value */ Mem *pReg; /* PseudoTable input register */ + pC = p->apCsr[pOp->p1]; p2 = pOp->p2; - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); + + /* If the cursor cache is stale (meaning it is not currently point at + ** the correct row) then bring it up-to-date by doing the necessary + ** B-Tree seek. */ + rc = sqlite3VdbeCursorMoveto(&pC, &p2); + if( rc ) goto abort_due_to_error; + + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pDest = &aMem[pOp->p3]; memAboutToChange(p, pDest); assert( pOp->p1>=0 && pOp->p1<p->nCursor ); - pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( p2<pC->nField ); aOffset = pC->aOffset; -#ifndef SQLITE_OMIT_VIRTUALTABLE - assert( pC->pVtabCursor==0 ); /* OP_Column never called on virtual table */ -#endif - pCrsr = pC->pCursor; - assert( pCrsr!=0 || pC->pseudoTableReg>0 ); /* pCrsr NULL on PseudoTables */ - assert( pCrsr!=0 || pC->nullRow ); /* pC->nullRow on PseudoTables */ + assert( pC->eCurType!=CURTYPE_VTAB ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); + assert( pC->eCurType!=CURTYPE_SORTER ); - /* If the cursor cache is stale, bring it up-to-date */ - rc = sqlite3VdbeCursorMoveto(pC); - if( rc ) goto abort_due_to_error; - if( pC->cacheStatus!=p->cacheCtr ){ + if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/ if( pC->nullRow ){ - if( pCrsr==0 ){ - assert( pC->pseudoTableReg>0 ); - pReg = &aMem[pC->pseudoTableReg]; + if( pC->eCurType==CURTYPE_PSEUDO ){ + /* For the special case of as pseudo-cursor, the seekResult field + ** identifies the register that holds the record */ + assert( pC->seekResult>0 ); + pReg = &aMem[pC->seekResult]; assert( pReg->flags & MEM_Blob ); assert( memIsValid(pReg) ); - pC->payloadSize = pC->szRow = avail = pReg->n; + pC->payloadSize = pC->szRow = pReg->n; pC->aRow = (u8*)pReg->z; }else{ sqlite3VdbeMemSetNull(pDest); goto op_column_out; } }else{ + pCrsr = pC->uc.pCursor; + assert( pC->eCurType==CURTYPE_BTREE ); assert( pCrsr ); - if( pC->isTable==0 ){ - assert( sqlite3BtreeCursorIsValid(pCrsr) ); - VVA_ONLY(rc =) sqlite3BtreeKeySize(pCrsr, &payloadSize64); - assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */ - /* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the - ** payload size, so it is impossible for payloadSize64 to be - ** larger than 32 bits. */ - assert( (payloadSize64 & SQLITE_MAX_U32)==(u64)payloadSize64 ); - pC->aRow = sqlite3BtreeKeyFetch(pCrsr, &avail); - pC->payloadSize = (u32)payloadSize64; - }else{ - assert( sqlite3BtreeCursorIsValid(pCrsr) ); - VVA_ONLY(rc =) sqlite3BtreeDataSize(pCrsr, &pC->payloadSize); - assert( rc==SQLITE_OK ); /* DataSize() cannot fail */ - pC->aRow = sqlite3BtreeDataFetch(pCrsr, &avail); - } - assert( avail<=65536 ); /* Maximum page size is 64KiB */ - if( pC->payloadSize <= (u32)avail ){ - pC->szRow = pC->payloadSize; - }else{ - pC->szRow = avail; - } + assert( sqlite3BtreeCursorIsValid(pCrsr) ); + pC->payloadSize = sqlite3BtreePayloadSize(pCrsr); + pC->aRow = sqlite3BtreePayloadFetch(pCrsr, &pC->szRow); + assert( pC->szRow<=pC->payloadSize ); + assert( pC->szRow<=65536 ); /* Maximum page size is 64KiB */ if( pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } } pC->cacheStatus = p->cacheCtr; - pC->iHdrOffset = getVarint32(pC->aRow, offset); + pC->iHdrOffset = getVarint32(pC->aRow, aOffset[0]); pC->nHdrParsed = 0; - aOffset[0] = offset; - /* Make sure a corrupt database has not given us an oversize header. - ** Do this now to avoid an oversize memory allocation. - ** - ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte - ** types use so much data space that there can only be 4096 and 32 of - ** them, respectively. So the maximum header length results from a - ** 3-byte type for each of the maximum of 32768 columns plus three - ** extra bytes for the header length itself. 32768*3 + 3 = 98307. - */ - if( offset > 98307 || offset > pC->payloadSize ){ - rc = SQLITE_CORRUPT_BKPT; - goto op_column_error; - } - if( avail<offset ){ + if( pC->szRow<aOffset[0] ){ /*OPTIMIZATION-IF-FALSE*/ /* pC->aRow does not have to hold the entire row, but it does at least ** need to cover the header of the record. If pC->aRow does not contain ** the complete header, then set it to zero, forcing the header to be ** dynamically allocated. */ pC->aRow = 0; pC->szRow = 0; - } - /* The following goto is an optimization. It can be omitted and - ** everything will still work. But OP_Column is measurably faster - ** by skipping the subsequent conditional, which is always true. - */ - assert( pC->nHdrParsed<=p2 ); /* Conditional skipped */ - goto op_column_read_header; + /* Make sure a corrupt database has not given us an oversize header. + ** Do this now to avoid an oversize memory allocation. + ** + ** Type entries can be between 1 and 5 bytes each. But 4 and 5 byte + ** types use so much data space that there can only be 4096 and 32 of + ** them, respectively. So the maximum header length results from a + ** 3-byte type for each of the maximum of 32768 columns plus three + ** extra bytes for the header length itself. 32768*3 + 3 = 98307. + */ + if( aOffset[0] > 98307 || aOffset[0] > pC->payloadSize ){ + goto op_column_corrupt; + } + }else{ + /* This is an optimization. By skipping over the first few tests + ** (ex: pC->nHdrParsed<=p2) in the next section, we achieve a + ** measurable performance gain. + ** + ** This branch is taken even if aOffset[0]==0. Such a record is never + ** generated by SQLite, and could be considered corruption, but we + ** accept it for historical reasons. When aOffset[0]==0, the code this + ** branch jumps to reads past the end of the record, but never more + ** than a few bytes. Even if the record occurs at the end of the page + ** content area, the "page header" comes after the page content and so + ** this overread is harmless. Similar overreads can occur for a corrupt + ** database file. + */ + zData = pC->aRow; + assert( pC->nHdrParsed<=p2 ); /* Conditional skipped */ + testcase( aOffset[0]==0 ); + goto op_column_read_header; + } } /* Make sure at least the first p2+1 entries of the header have been @@ -72536,68 +84467,61 @@ case OP_Column: { /* If there is more header available for parsing in the record, try ** to extract additional fields up through the p2+1-th field */ - op_column_read_header: if( pC->iHdrOffset<aOffset[0] ){ /* Make sure zData points to enough of the record to cover the header. */ if( pC->aRow==0 ){ memset(&sMem, 0, sizeof(sMem)); - rc = sqlite3VdbeMemFromBtree(pCrsr, 0, aOffset[0], - !pC->isTable, &sMem); - if( rc!=SQLITE_OK ){ - goto op_column_error; - } + rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, 0, aOffset[0], &sMem); + if( rc!=SQLITE_OK ) goto abort_due_to_error; zData = (u8*)sMem.z; }else{ zData = pC->aRow; } /* Fill in pC->aType[i] and aOffset[i] values through the p2-th field. */ + op_column_read_header: i = pC->nHdrParsed; - offset = aOffset[i]; + offset64 = aOffset[i]; zHdr = zData + pC->iHdrOffset; zEndHdr = zData + aOffset[0]; - assert( i<=p2 && zHdr<zEndHdr ); + testcase( zHdr>=zEndHdr ); do{ - if( zHdr[0]<0x80 ){ - t = zHdr[0]; + if( (t = zHdr[0])<0x80 ){ zHdr++; + offset64 += sqlite3VdbeOneByteSerialTypeLen(t); }else{ zHdr += sqlite3GetVarint32(zHdr, &t); + offset64 += sqlite3VdbeSerialTypeLen(t); } - pC->aType[i] = t; - szField = sqlite3VdbeSerialTypeLen(t); - offset += szField; - if( offset<szField ){ /* True if offset overflows */ - zHdr = &zEndHdr[1]; /* Forces SQLITE_CORRUPT return below */ - break; - } - i++; - aOffset[i] = offset; + pC->aType[i++] = t; + aOffset[i] = (u32)(offset64 & 0xffffffff); }while( i<=p2 && zHdr<zEndHdr ); - pC->nHdrParsed = i; - pC->iHdrOffset = (u32)(zHdr - zData); - if( pC->aRow==0 ){ - sqlite3VdbeMemRelease(&sMem); - sMem.flags = MEM_Null; - } - + /* The record is corrupt if any of the following are true: ** (1) the bytes of the header extend past the declared header size - ** (zHdr>zEndHdr) ** (2) the entire header was used but not all data was used - ** (zHdr==zEndHdr && offset!=pC->payloadSize) ** (3) the end of the data extends beyond the end of the record. - ** (offset > pC->payloadSize) */ - if( (zHdr>=zEndHdr && (zHdr>zEndHdr || offset!=pC->payloadSize)) - || (offset > pC->payloadSize) + if( (zHdr>=zEndHdr && (zHdr>zEndHdr || offset64!=pC->payloadSize)) + || (offset64 > pC->payloadSize) ){ - rc = SQLITE_CORRUPT_BKPT; - goto op_column_error; + if( aOffset[0]==0 ){ + i = 0; + zHdr = zEndHdr; + }else{ + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + goto op_column_corrupt; + } } + + pC->nHdrParsed = i; + pC->iHdrOffset = (u32)(zHdr - zData); + if( pC->aRow==0 ) sqlite3VdbeMemRelease(&sMem); + }else{ + t = 0; } - /* If after trying to extra new entries from the header, nHdrParsed is + /* If after trying to extract new entries from the header, nHdrParsed is ** still not up to p2, that means that the record has fewer than p2 ** columns. So the result will be either the default value or a NULL. */ @@ -72609,6 +84533,8 @@ case OP_Column: { } goto op_column_out; } + }else{ + t = pC->aType[p2]; } /* Extract the content for the p2+1-th column. Control can only @@ -72618,13 +84544,37 @@ case OP_Column: { assert( p2<pC->nHdrParsed ); assert( rc==SQLITE_OK ); assert( sqlite3VdbeCheckMemInvariants(pDest) ); - if( VdbeMemDynamic(pDest) ) sqlite3VdbeMemSetNull(pDest); - t = pC->aType[p2]; + if( VdbeMemDynamic(pDest) ){ + sqlite3VdbeMemSetNull(pDest); + } + assert( t==pC->aType[p2] ); if( pC->szRow>=aOffset[p2+1] ){ /* This is the common case where the desired content fits on the original ** page - where the content is not on an overflow page */ - sqlite3VdbeSerialGet(pC->aRow+aOffset[p2], t, pDest); + zData = pC->aRow + aOffset[p2]; + if( t<12 ){ + sqlite3VdbeSerialGet(zData, t, pDest); + }else{ + /* If the column value is a string, we need a persistent value, not + ** a MEM_Ephem value. This branch is a fast short-cut that is equivalent + ** to calling sqlite3VdbeSerialGet() and sqlite3VdbeDeephemeralize(). + */ + static const u16 aFlag[] = { MEM_Blob, MEM_Str|MEM_Term }; + pDest->n = len = (t-12)/2; + pDest->enc = encoding; + if( pDest->szMalloc < len+2 ){ + pDest->flags = MEM_Null; + if( sqlite3VdbeMemGrow(pDest, len+2, 0) ) goto no_mem; + }else{ + pDest->z = pDest->zMalloc; + } + memcpy(pDest->z, zData, len); + pDest->z[len] = 0; + pDest->z[len+1] = 0; + pDest->flags = aFlag[t&1]; + } }else{ + pDest->enc = encoding; /* This branch happens only when content is on overflow pages */ if( ((pOp->p5 & (OPFLAG_LENGTHARG|OPFLAG_TYPEOFARG))!=0 && ((t>=12 && (t&1)==0) || (pOp->p5 & OPFLAG_TYPEOFARG)!=0)) @@ -72635,42 +84585,35 @@ case OP_Column: { ** 2. the length(X) function if X is a blob, and ** 3. if the content length is zero. ** So we might as well use bogus content rather than reading - ** content from disk. NULL will work for the value for strings - ** and blobs and whatever is in the payloadSize64 variable - ** will work for everything else. */ - sqlite3VdbeSerialGet(t<=13 ? (u8*)&payloadSize64 : 0, t, pDest); + ** content from disk. + ** + ** Although sqlite3VdbeSerialGet() may read at most 8 bytes from the + ** buffer passed to it, debugging function VdbeMemPrettyPrint() may + ** read up to 16. So 16 bytes of bogus content is supplied. + */ + static u8 aZero[16]; /* This is the bogus content */ + sqlite3VdbeSerialGet(aZero, t, pDest); }else{ - rc = sqlite3VdbeMemFromBtree(pCrsr, aOffset[p2], len, !pC->isTable, - pDest); - if( rc!=SQLITE_OK ){ - goto op_column_error; - } + rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest); + if( rc!=SQLITE_OK ) goto abort_due_to_error; sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); pDest->flags &= ~MEM_Ephem; } } - pDest->enc = encoding; op_column_out: - /* If the column value is an ephemeral string, go ahead and persist - ** that string in case the cursor moves before the column value is - ** used. The following code does the equivalent of Deephemeralize() - ** but does it faster. */ - if( (pDest->flags & MEM_Ephem)!=0 && pDest->z ){ - fx = pDest->flags & (MEM_Str|MEM_Blob); - assert( fx!=0 ); - zData = (const u8*)pDest->z; - len = pDest->n; - if( sqlite3VdbeMemClearAndResize(pDest, len+2) ) goto no_mem; - memcpy(pDest->z, zData, len); - pDest->z[len] = 0; - pDest->z[len+1] = 0; - pDest->flags = fx|MEM_Term; - } -op_column_error: UPDATE_MAX_BLOBSIZE(pDest); REGISTER_TRACE(pOp->p3, pDest); break; + +op_column_corrupt: + if( aOp[0].p3>0 ){ + pOp = &aOp[aOp[0].p3-1]; + break; + }else{ + rc = SQLITE_CORRUPT_BKPT; + goto abort_due_to_error; + } } /* Opcode: Affinity P1 P2 * P4 * @@ -72678,24 +84621,24 @@ op_column_error: ** ** Apply affinities to a range of P2 registers starting with P1. ** -** P4 is a string that is P2 characters long. The nth character of the -** string indicates the column affinity that should be used for the nth +** P4 is a string that is P2 characters long. The N-th character of the +** string indicates the column affinity that should be used for the N-th ** memory cell in the range. */ case OP_Affinity: { const char *zAffinity; /* The affinity to be applied */ - char cAff; /* A single character of affinity */ zAffinity = pOp->p4.z; assert( zAffinity!=0 ); + assert( pOp->p2>0 ); assert( zAffinity[pOp->p2]==0 ); pIn1 = &aMem[pOp->p1]; - while( (cAff = *(zAffinity++))!=0 ){ - assert( pIn1 <= &p->aMem[(p->nMem-p->nCursor)] ); + do{ + assert( pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)] ); assert( memIsValid(pIn1) ); - applyAffinity(pIn1, cAff, encoding); + applyAffinity(pIn1, *(zAffinity++), encoding); pIn1++; - } + }while( zAffinity[0] ); break; } @@ -72706,14 +84649,14 @@ case OP_Affinity: { ** use as a data record in a database table or as a key ** in an index. The OP_Column opcode can decode the record later. ** -** P4 may be a string that is P2 characters long. The nth character of the -** string indicates the column affinity that should be used for the nth +** P4 may be a string that is P2 characters long. The N-th character of the +** string indicates the column affinity that should be used for the N-th ** field of the index key. ** ** The mapping from character to affinity is given by the SQLITE_AFF_ ** macros defined in sqliteInt.h. ** -** If P4 is NULL then all index fields have the affinity NONE. +** If P4 is NULL then all index fields have the affinity BLOB. */ case OP_MakeRecord: { u8 *zNewRecord; /* A buffer to hold the data for the new record */ @@ -72721,7 +84664,7 @@ case OP_MakeRecord: { u64 nData; /* Number of bytes of data space */ int nHdr; /* Number of bytes of header space */ i64 nByte; /* Data space required for this record */ - int nZero; /* Number of zero bytes at the end of the record */ + i64 nZero; /* Number of zero bytes at the end of the record */ int nVarint; /* Number of bytes in a varint */ u32 serial_type; /* Type field */ Mem *pData0; /* First field to be combined into the record */ @@ -72731,7 +84674,7 @@ case OP_MakeRecord: { int file_format; /* File format to use for encoding */ int i; /* Space used in zNewRecord[] header */ int j; /* Space used in zNewRecord[] content */ - int len; /* Length of a field */ + u32 len; /* Length of a field */ /* Assuming the record contains N fields, the record format looks ** like this: @@ -72753,7 +84696,7 @@ case OP_MakeRecord: { nZero = 0; /* Number of zero bytes at the end of the record */ nField = pOp->p1; zAffinity = pOp->p4.z; - assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=(p->nMem-p->nCursor)+1 ); + assert( nField>0 && pOp->p2>0 && pOp->p2+nField<=(p->nMem+1 - p->nCursor)+1 ); pData0 = &aMem[nField]; nField = pOp->p2; pLast = &pData0[nField-1]; @@ -72775,17 +84718,39 @@ case OP_MakeRecord: { }while( zAffinity[0] ); } +#ifdef SQLITE_ENABLE_NULL_TRIM + /* NULLs can be safely trimmed from the end of the record, as long as + ** as the schema format is 2 or more and none of the omitted columns + ** have a non-NULL default value. Also, the record must be left with + ** at least one field. If P5>0 then it will be one more than the + ** index of the right-most column with a non-NULL default value */ + if( pOp->p5 ){ + while( (pLast->flags & MEM_Null)!=0 && nField>pOp->p5 ){ + pLast--; + nField--; + } + } +#endif + /* Loop through the elements that will make up the record to figure ** out how much space is required for the new record. */ pRec = pLast; do{ assert( memIsValid(pRec) ); - pRec->uTemp = serial_type = sqlite3VdbeSerialType(pRec, file_format); - len = sqlite3VdbeSerialTypeLen(serial_type); + serial_type = sqlite3VdbeSerialType(pRec, file_format, &len); if( pRec->flags & MEM_Zero ){ - if( nData ){ - sqlite3VdbeMemExpandBlob(pRec); + if( serial_type==0 ){ + /* Values with MEM_Null and MEM_Zero are created by xColumn virtual + ** table methods that never invoke sqlite3_result_xxxxx() while + ** computing an unchanging column value in an UPDATE statement. + ** Give such values a special internal-use-only serial-type of 10 + ** so that they can be passed through to xUpdate and have + ** a true sqlite3_value_nochange(). */ + assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB ); + serial_type = 10; + }else if( nData ){ + if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; }else{ nZero += pRec->u.nZero; len -= pRec->u.nZero; @@ -72795,7 +84760,10 @@ case OP_MakeRecord: { testcase( serial_type==127 ); testcase( serial_type==128 ); nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); - }while( (--pRec)>=pData0 ); + pRec->uTemp = serial_type; + if( pRec==pData0 ) break; + pRec--; + }while(1); /* EVIDENCE-OF: R-22564-11647 The header begins with a single varint ** which determines the total number of bytes in the header. The varint @@ -72813,7 +84781,7 @@ case OP_MakeRecord: { if( nVarint<sqlite3VarintLen(nHdr) ) nHdr++; } nByte = nHdr+nData; - if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + if( nByte+nZero>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } @@ -72844,14 +84812,13 @@ case OP_MakeRecord: { assert( i==nHdr ); assert( j==nByte ); - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pOut->n = (int)nByte; pOut->flags = MEM_Blob; if( nZero ){ pOut->u.nZero = nZero; pOut->flags |= MEM_Zero; } - pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */ REGISTER_TRACE(pOp->p3, pOut); UPDATE_MAX_BLOBSIZE(pOut); break; @@ -72864,14 +84831,17 @@ case OP_MakeRecord: { ** opened by cursor P1 in register P2 */ #ifndef SQLITE_OMIT_BTREECOUNT -case OP_Count: { /* out2-prerelease */ +case OP_Count: { /* out2 */ i64 nEntry; BtCursor *pCrsr; - pCrsr = p->apCsr[pOp->p1]->pCursor; + assert( p->apCsr[pOp->p1]->eCurType==CURTYPE_BTREE ); + pCrsr = p->apCsr[pOp->p1]->uc.pCursor; assert( pCrsr ); nEntry = 0; /* Not needed. Only used to silence a warning. */ rc = sqlite3BtreeCount(pCrsr, &nEntry); + if( rc ) goto abort_due_to_error; + pOut = out2Prerelease(p, pOp); pOut->u.i = nEntry; break; } @@ -72910,8 +84880,7 @@ case OP_Savepoint: { /* A new savepoint cannot be created if there are active write ** statements (i.e. open read/write incremental blob handles). */ - sqlite3SetString(&p->zErrMsg, db, "cannot open savepoint - " - "SQL statements in progress"); + sqlite3VdbeError(p, "cannot open savepoint - SQL statements in progress"); rc = SQLITE_BUSY; }else{ nName = sqlite3Strlen30(zName); @@ -72928,7 +84897,7 @@ case OP_Savepoint: { #endif /* Create a new savepoint structure. */ - pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+nName+1); + pNew = sqlite3DbMallocRawNN(db, sizeof(Savepoint)+nName+1); if( pNew ){ pNew->zName = (char *)&pNew[1]; memcpy(pNew->zName, zName, nName+1); @@ -72941,7 +84910,7 @@ case OP_Savepoint: { }else{ db->nSavepoint++; } - + /* Link the new savepoint into the database handle's list. */ pNew->pNext = db->pSavepoint; db->pSavepoint = pNew; @@ -72962,15 +84931,14 @@ case OP_Savepoint: { iSavepoint++; } if( !pSavepoint ){ - sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", zName); + sqlite3VdbeError(p, "no such savepoint: %s", zName); rc = SQLITE_ERROR; }else if( db->nVdbeWrite>0 && p1==SAVEPOINT_RELEASE ){ /* It is not possible to release (commit) a savepoint if there are ** active write statements. */ - sqlite3SetString(&p->zErrMsg, db, - "cannot release savepoint - SQL statements in progress" - ); + sqlite3VdbeError(p, "cannot release savepoint - " + "SQL statements in progress"); rc = SQLITE_BUSY; }else{ @@ -72985,7 +84953,7 @@ case OP_Savepoint: { } db->autoCommit = 1; if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ - p->pc = pc; + p->pc = (int)(pOp - aOp); db->autoCommit = 0; p->rc = rc = SQLITE_BUSY; goto vdbe_return; @@ -72996,7 +84964,7 @@ case OP_Savepoint: { int isSchemaChange; iSavepoint = db->nSavepoint - iSavepoint - 1; if( p1==SAVEPOINT_ROLLBACK ){ - isSchemaChange = (db->flags & SQLITE_InternChanges)!=0; + isSchemaChange = (db->mDbFlags & DBFLAG_SchemaChange)!=0; for(ii=0; ii<db->nDb; ii++){ rc = sqlite3BtreeTripAllCursors(db->aDb[ii].pBt, SQLITE_ABORT_ROLLBACK, @@ -73015,7 +84983,7 @@ case OP_Savepoint: { if( isSchemaChange ){ sqlite3ExpirePreparedStatements(db); sqlite3ResetAllSchemasOfConnection(db); - db->flags = (db->flags | SQLITE_InternChanges); + db->mDbFlags |= DBFLAG_SchemaChange; } } @@ -73044,12 +85012,13 @@ case OP_Savepoint: { db->nDeferredImmCons = pSavepoint->nDeferredImmCons; } - if( !isTransaction ){ + if( !isTransaction || p1==SAVEPOINT_ROLLBACK ){ rc = sqlite3VtabSavepoint(db, p1, iSavepoint); if( rc!=SQLITE_OK ) goto abort_due_to_error; } } } + if( rc ) goto abort_due_to_error; break; } @@ -73066,49 +85035,37 @@ case OP_Savepoint: { case OP_AutoCommit: { int desiredAutoCommit; int iRollback; - int turnOnAC; desiredAutoCommit = pOp->p1; iRollback = pOp->p2; - turnOnAC = desiredAutoCommit && !db->autoCommit; assert( desiredAutoCommit==1 || desiredAutoCommit==0 ); assert( desiredAutoCommit==1 || iRollback==0 ); assert( db->nVdbeActive>0 ); /* At least this one VM is active */ assert( p->bIsReader ); -#if 0 - if( turnOnAC && iRollback && db->nVdbeActive>1 ){ - /* If this instruction implements a ROLLBACK and other VMs are - ** still running, and a transaction is active, return an error indicating - ** that the other VMs must complete first. - */ - sqlite3SetString(&p->zErrMsg, db, "cannot rollback transaction - " - "SQL statements in progress"); - rc = SQLITE_BUSY; - }else -#endif - if( turnOnAC && !iRollback && db->nVdbeWrite>0 ){ - /* If this instruction implements a COMMIT and other VMs are writing - ** return an error indicating that the other VMs must complete first. - */ - sqlite3SetString(&p->zErrMsg, db, "cannot commit transaction - " - "SQL statements in progress"); - rc = SQLITE_BUSY; - }else if( desiredAutoCommit!=db->autoCommit ){ + if( desiredAutoCommit!=db->autoCommit ){ if( iRollback ){ assert( desiredAutoCommit==1 ); sqlite3RollbackAll(db, SQLITE_ABORT_ROLLBACK); db->autoCommit = 1; + }else if( desiredAutoCommit && db->nVdbeWrite>0 ){ + /* If this instruction implements a COMMIT and other VMs are writing + ** return an error indicating that the other VMs must complete first. + */ + sqlite3VdbeError(p, "cannot commit transaction - " + "SQL statements in progress"); + rc = SQLITE_BUSY; + goto abort_due_to_error; }else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ goto vdbe_return; }else{ db->autoCommit = (u8)desiredAutoCommit; - if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ - p->pc = pc; - db->autoCommit = (u8)(1-desiredAutoCommit); - p->rc = rc = SQLITE_BUSY; - goto vdbe_return; - } + } + if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + db->autoCommit = (u8)(1-desiredAutoCommit); + p->rc = rc = SQLITE_BUSY; + goto vdbe_return; } assert( db->nStatement==0 ); sqlite3CloseSavepoints(db); @@ -73119,12 +85076,13 @@ case OP_AutoCommit: { } goto vdbe_return; }else{ - sqlite3SetString(&p->zErrMsg, db, + sqlite3VdbeError(p, (!desiredAutoCommit)?"cannot start a transaction within a transaction":( (iRollback)?"cannot rollback - no transaction is active": "cannot commit - no transaction is active")); rc = SQLITE_ERROR; + goto abort_due_to_error; } break; } @@ -73180,12 +85138,14 @@ case OP_Transaction: { if( pBt ){ rc = sqlite3BtreeBeginTrans(pBt, pOp->p2); - if( rc==SQLITE_BUSY ){ - p->pc = pc; - p->rc = rc = SQLITE_BUSY; - goto vdbe_return; - } + testcase( rc==SQLITE_BUSY_SNAPSHOT ); + testcase( rc==SQLITE_BUSY_RECOVERY ); if( rc!=SQLITE_OK ){ + if( (rc&0xff)==SQLITE_BUSY ){ + p->pc = (int)(pOp - aOp); + p->rc = rc; + goto vdbe_return; + } goto abort_due_to_error; } @@ -73211,7 +85171,11 @@ case OP_Transaction: { p->nStmtDefImmCons = db->nDeferredImmCons; } - /* Gather the schema version number for checking */ + /* Gather the schema version number for checking: + ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema + ** version is checked to ensure that the schema has not changed since the + ** SQL statement was prepared. + */ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&iMeta); iGen = db->aDb[pOp->p1].pSchema->iGeneration; }else{ @@ -73240,6 +85204,7 @@ case OP_Transaction: { p->expired = 1; rc = SQLITE_SCHEMA; } + if( rc ) goto abort_due_to_error; break; } @@ -73255,7 +85220,7 @@ case OP_Transaction: { ** must be started or there must be an open cursor) before ** executing this instruction. */ -case OP_ReadCookie: { /* out2-prerelease */ +case OP_ReadCookie: { /* out2 */ int iMeta; int iDb; int iCookie; @@ -73269,22 +85234,25 @@ case OP_ReadCookie: { /* out2-prerelease */ assert( DbMaskTest(p->btreeMask, iDb) ); sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta); + pOut = out2Prerelease(p, pOp); pOut->u.i = iMeta; break; } /* Opcode: SetCookie P1 P2 P3 * * ** -** Write the content of register P3 (interpreted as an integer) -** into cookie number P2 of database P1. P2==1 is the schema version. -** P2==2 is the database format. P2==3 is the recommended pager cache +** Write the integer value P3 into cookie number P2 of database P1. +** P2==1 is the schema version. P2==2 is the database format. +** P2==3 is the recommended pager cache ** size, and so forth. P1==0 is the main database file and P1==1 is the ** database file used to store temporary tables. ** ** A transaction must be started before executing this opcode. */ -case OP_SetCookie: { /* in3 */ +case OP_SetCookie: { Db *pDb; + + sqlite3VdbeIncrWriteCounter(p, 0); assert( pOp->p2<SQLITE_N_BTREE_META ); assert( pOp->p1>=0 && pOp->p1<db->nDb ); assert( DbMaskTest(p->btreeMask, pOp->p1) ); @@ -73292,17 +85260,15 @@ case OP_SetCookie: { /* in3 */ pDb = &db->aDb[pOp->p1]; assert( pDb->pBt!=0 ); assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); - pIn3 = &aMem[pOp->p3]; - sqlite3VdbeMemIntegerify(pIn3); /* See note about index shifting on OP_ReadCookie */ - rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, (int)pIn3->u.i); + rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - pDb->pSchema->schema_cookie = (int)pIn3->u.i; - db->flags |= SQLITE_InternChanges; + pDb->pSchema->schema_cookie = pOp->p3; + db->mDbFlags |= DBFLAG_SchemaChange; }else if( pOp->p2==BTREE_FILE_FORMAT ){ /* Record changes in the file format */ - pDb->pSchema->file_format = (u8)pIn3->u.i; + pDb->pSchema->file_format = pOp->p3; } if( pOp->p1==1 ){ /* Invalidate all prepared statements whenever the TEMP database @@ -73310,6 +85276,7 @@ case OP_SetCookie: { /* in3 */ sqlite3ExpirePreparedStatements(db); p->expired = 0; } + if( rc ) goto abort_due_to_error; break; } @@ -73379,20 +85346,6 @@ case OP_SetCookie: { /* in3 */ ** See also OpenRead. */ case OP_ReopenIdx: { - VdbeCursor *pCur; - - assert( pOp->p5==0 ); - assert( pOp->p4type==P4_KEYINFO ); - pCur = p->apCsr[pOp->p1]; - if( pCur && pCur->pgnoRoot==(u32)pOp->p2 ){ - assert( pCur->iDb==pOp->p3 ); /* Guaranteed by the code generator */ - break; - } - /* If the cursor is not currently open or is open on a different - ** index, then fall through into OP_OpenRead to force a reopen */ -} -case OP_OpenRead: -case OP_OpenWrite: { int nField; KeyInfo *pKeyInfo; int p2; @@ -73402,15 +85355,26 @@ case OP_OpenWrite: { VdbeCursor *pCur; Db *pDb; - assert( (pOp->p5&(OPFLAG_P2ISREG|OPFLAG_BULKCSR))==pOp->p5 ); - assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 ); + assert( pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); + assert( pOp->p4type==P4_KEYINFO ); + pCur = p->apCsr[pOp->p1]; + if( pCur && pCur->pgnoRoot==(u32)pOp->p2 ){ + assert( pCur->iDb==pOp->p3 ); /* Guaranteed by the code generator */ + goto open_cursor_set_hints; + } + /* If the cursor is not currently open or is open on a different + ** index, then fall through into OP_OpenRead to force a reopen */ +case OP_OpenRead: +case OP_OpenWrite: + + assert( pOp->opcode==OP_OpenWrite || pOp->p5==0 || pOp->p5==OPFLAG_SEEKEQ ); assert( p->bIsReader ); assert( pOp->opcode==OP_OpenRead || pOp->opcode==OP_ReopenIdx || p->readOnly==0 ); if( p->expired ){ rc = SQLITE_ABORT_ROLLBACK; - break; + goto abort_due_to_error; } nField = 0; @@ -73423,7 +85387,8 @@ case OP_OpenWrite: { pX = pDb->pBt; assert( pX!=0 ); if( pOp->opcode==OP_OpenWrite ){ - wrFlag = 1; + assert( OPFLAG_FORDELETE==BTREE_FORDELETE ); + wrFlag = BTREE_WRCSR | (pOp->p5 & OPFLAG_FORDELETE); assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( pDb->pSchema->file_format < p->minWriteFileFormat ){ p->minWriteFileFormat = pDb->pSchema->file_format; @@ -73433,50 +85398,89 @@ case OP_OpenWrite: { } if( pOp->p5 & OPFLAG_P2ISREG ){ assert( p2>0 ); - assert( p2<=(p->nMem-p->nCursor) ); + assert( p2<=(p->nMem+1 - p->nCursor) ); pIn2 = &aMem[p2]; assert( memIsValid(pIn2) ); assert( (pIn2->flags & MEM_Int)!=0 ); sqlite3VdbeMemIntegerify(pIn2); p2 = (int)pIn2->u.i; - /* The p2 value always comes from a prior OP_CreateTable opcode and + /* The p2 value always comes from a prior OP_CreateBtree opcode and ** that opcode will always set the p2 value to 2 or more or else fail. ** If there were a failure, the prepared statement would have halted ** before reaching this instruction. */ - if( NEVER(p2<2) ) { - rc = SQLITE_CORRUPT_BKPT; - goto abort_due_to_error; - } + assert( p2>=2 ); } if( pOp->p4type==P4_KEYINFO ){ pKeyInfo = pOp->p4.pKeyInfo; assert( pKeyInfo->enc==ENC(db) ); assert( pKeyInfo->db==db ); - nField = pKeyInfo->nField+pKeyInfo->nXField; + nField = pKeyInfo->nAllField; }else if( pOp->p4type==P4_INT32 ){ nField = pOp->p4.i; } assert( pOp->p1>=0 ); assert( nField>=0 ); testcase( nField==0 ); /* Table with INTEGER PRIMARY KEY and nothing else */ - pCur = allocateCursor(p, pOp->p1, nField, iDb, 1); + pCur = allocateCursor(p, pOp->p1, nField, iDb, CURTYPE_BTREE); if( pCur==0 ) goto no_mem; pCur->nullRow = 1; pCur->isOrdered = 1; pCur->pgnoRoot = p2; - rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->pCursor); +#ifdef SQLITE_DEBUG + pCur->wrFlag = wrFlag; +#endif + rc = sqlite3BtreeCursor(pX, p2, wrFlag, pKeyInfo, pCur->uc.pCursor); pCur->pKeyInfo = pKeyInfo; - assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); - sqlite3BtreeCursorHints(pCur->pCursor, (pOp->p5 & OPFLAG_BULKCSR)); - /* Set the VdbeCursor.isTable variable. Previous versions of ** SQLite used to check if the root-page flags were sane at this point ** and report database corruption if they were not, but this check has ** since moved into the btree layer. */ pCur->isTable = pOp->p4type!=P4_KEYINFO; + +open_cursor_set_hints: + assert( OPFLAG_BULKCSR==BTREE_BULKLOAD ); + assert( OPFLAG_SEEKEQ==BTREE_SEEK_EQ ); + testcase( pOp->p5 & OPFLAG_BULKCSR ); +#ifdef SQLITE_ENABLE_CURSOR_HINTS + testcase( pOp->p2 & OPFLAG_SEEKEQ ); +#endif + sqlite3BtreeCursorHintFlags(pCur->uc.pCursor, + (pOp->p5 & (OPFLAG_BULKCSR|OPFLAG_SEEKEQ))); + if( rc ) goto abort_due_to_error; break; } +/* Opcode: OpenDup P1 P2 * * * +** +** Open a new cursor P1 that points to the same ephemeral table as +** cursor P2. The P2 cursor must have been opened by a prior OP_OpenEphemeral +** opcode. Only ephemeral cursors may be duplicated. +** +** Duplicate ephemeral cursors are used for self-joins of materialized views. +*/ +case OP_OpenDup: { + VdbeCursor *pOrig; /* The original cursor to be duplicated */ + VdbeCursor *pCx; /* The new cursor */ + + pOrig = p->apCsr[pOp->p2]; + assert( pOrig->pBtx!=0 ); /* Only ephemeral cursors can be duplicated */ + + pCx = allocateCursor(p, pOp->p1, pOrig->nField, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->isEphemeral = 1; + pCx->pKeyInfo = pOrig->pKeyInfo; + pCx->isTable = pOrig->isTable; + rc = sqlite3BtreeCursor(pOrig->pBtx, MASTER_ROOT, BTREE_WRCSR, + pCx->pKeyInfo, pCx->uc.pCursor); + /* The sqlite3BtreeCursor() routine can only fail for the first cursor + ** opened for a database. Since there is already an open cursor when this + ** opcode is run, the sqlite3BtreeCursor() cannot fail */ + assert( rc==SQLITE_OK ); + break; +} + + /* Opcode: OpenEphemeral P1 P2 * P4 P5 ** Synopsis: nColumn=P2 ** @@ -73516,14 +85520,14 @@ case OP_OpenEphemeral: { SQLITE_OPEN_TRANSIENT_DB; assert( pOp->p1>=0 ); assert( pOp->p2>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); if( pCx==0 ) goto no_mem; pCx->nullRow = 1; pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBt, + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginTrans(pCx->pBt, 1); + rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1); } if( rc==SQLITE_OK ){ /* If a transient index is required, create it by calling @@ -73531,23 +85535,25 @@ case OP_OpenEphemeral: { ** opening it. If a transient table is required, just use the ** automatically created table with root-page 1 (an BLOB_INTKEY table). */ - if( (pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ int pgno; assert( pOp->p4type==P4_KEYINFO ); - rc = sqlite3BtreeCreateTable(pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5); + rc = sqlite3BtreeCreateTable(pCx->pBtx, &pgno, BTREE_BLOBKEY | pOp->p5); if( rc==SQLITE_OK ){ assert( pgno==MASTER_ROOT+1 ); assert( pKeyInfo->db==db ); assert( pKeyInfo->enc==ENC(db) ); - pCx->pKeyInfo = pKeyInfo; - rc = sqlite3BtreeCursor(pCx->pBt, pgno, 1, pKeyInfo, pCx->pCursor); + rc = sqlite3BtreeCursor(pCx->pBtx, pgno, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); } pCx->isTable = 0; }else{ - rc = sqlite3BtreeCursor(pCx->pBt, MASTER_ROOT, 1, 0, pCx->pCursor); + rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); pCx->isTable = 1; } } + if( rc ) goto abort_due_to_error; pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); break; } @@ -73567,12 +85573,13 @@ case OP_SorterOpen: { assert( pOp->p1>=0 ); assert( pOp->p2>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_SORTER); if( pCx==0 ) goto no_mem; pCx->pKeyInfo = pOp->p4.pKeyInfo; assert( pCx->pKeyInfo->db==db ); assert( pCx->pKeyInfo->enc==ENC(db) ); rc = sqlite3VdbeSorterInit(db, pOp->p3, pCx); + if( rc ) goto abort_due_to_error; break; } @@ -73587,9 +85594,9 @@ case OP_SequenceTest: { VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; - assert( pC->pSorter ); + assert( isSorter(pC) ); if( (pC->seqCount++)==0 ){ - pc = pOp->p2 - 1; + goto jump_to_p2; } break; } @@ -73615,11 +85622,16 @@ case OP_OpenPseudo: { assert( pOp->p1>=0 ); assert( pOp->p3>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0); + pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, CURTYPE_PSEUDO); if( pCx==0 ) goto no_mem; pCx->nullRow = 1; - pCx->pseudoTableReg = pOp->p2; + pCx->seekResult = pOp->p2; pCx->isTable = 1; + /* Give this pseudo-cursor a fake BtCursor pointer so that pCx + ** can be safely passed to sqlite3VdbeCursorMoveto(). This avoids a test + ** for pCx->eCurType==CURTYPE_BTREE inside of sqlite3VdbeCursorMoveto() + ** which is a performance optimization */ + pCx->uc.pCursor = sqlite3BtreeFakeValidCursor(); assert( pOp->p5==0 ); break; } @@ -73636,6 +85648,26 @@ case OP_Close: { break; } +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK +/* Opcode: ColumnsUsed P1 * * P4 * +** +** This opcode (which only exists if SQLite was compiled with +** SQLITE_ENABLE_COLUMN_USED_MASK) identifies which columns of the +** table or index for cursor P1 are used. P4 is a 64-bit integer +** (P4_INT64) in which the first 63 bits are one for each of the +** first 63 columns of the table or index that are actually used +** by the cursor. The high-order bit is set if any column after +** the 64th is used. +*/ +case OP_ColumnsUsed: { + VdbeCursor *pC; + pC = p->apCsr[pOp->p1]; + assert( pC->eCurType==CURTYPE_BTREE ); + pC->maskUsed = *(u64*)pOp->p4.pI64; + break; +} +#endif + /* Opcode: SeekGE P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** @@ -73648,6 +85680,13 @@ case OP_Close: { ** is greater than or equal to the key value. If there are no records ** greater than or equal to the key and P2 is not zero, then jump to P2. ** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will always land on a record that equally equals the key, or +** else jump immediately to P2. When the cursor is OPFLAG_SEEKEQ, this +** opcode must be followed by an IdxLE opcode with the same arguments. +** The IdxLE opcode will be skipped if this opcode succeeds, but the +** IdxLE opcode will be used on subsequent loop iterations. +** ** This opcode leaves the cursor configured to move in forward order, ** from the beginning toward the end. In other words, the cursor is ** configured to use Next, not Prev. @@ -73706,35 +85745,49 @@ case OP_Close: { ** from the end toward the beginning. In other words, the cursor is ** configured to use Prev, not Next. ** +** If the cursor P1 was opened using the OPFLAG_SEEKEQ flag, then this +** opcode will always land on a record that equally equals the key, or +** else jump immediately to P2. When the cursor is OPFLAG_SEEKEQ, this +** opcode must be followed by an IdxGE opcode with the same arguments. +** The IdxGE opcode will be skipped if this opcode succeeds, but the +** IdxGE opcode will be used on subsequent loop iterations. +** ** See also: Found, NotFound, SeekGt, SeekGe, SeekLt */ case OP_SeekLT: /* jump, in3 */ case OP_SeekLE: /* jump, in3 */ case OP_SeekGE: /* jump, in3 */ case OP_SeekGT: { /* jump, in3 */ - int res; - int oc; - VdbeCursor *pC; - UnpackedRecord r; - int nField; - i64 iKey; /* The rowid we are to seek to */ + int res; /* Comparison result */ + int oc; /* Opcode */ + VdbeCursor *pC; /* The cursor to seek */ + UnpackedRecord r; /* The key to seek for */ + int nField; /* Number of columns or fields in the key */ + i64 iKey; /* The rowid we are to seek to */ + int eqOnly; /* Only interested in == results */ assert( pOp->p1>=0 && pOp->p1<p->nCursor ); assert( pOp->p2!=0 ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - assert( pC->pseudoTableReg==0 ); + assert( pC->eCurType==CURTYPE_BTREE ); assert( OP_SeekLE == OP_SeekLT+1 ); assert( OP_SeekGE == OP_SeekLT+2 ); assert( OP_SeekGT == OP_SeekLT+3 ); assert( pC->isOrdered ); - assert( pC->pCursor!=0 ); + assert( pC->uc.pCursor!=0 ); oc = pOp->opcode; + eqOnly = 0; pC->nullRow = 0; #ifdef SQLITE_DEBUG pC->seekOp = pOp->opcode; #endif + if( pC->isTable ){ + /* The BTREE_SEEK_EQ flag is only set on index cursors */ + assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 + || CORRUPT_DB ); + /* The input value in P3 might be of any type: integer, real, string, ** blob, or NULL. But it needs to be an integer before we can do ** the seek, so convert it. */ @@ -73750,7 +85803,7 @@ case OP_SeekGT: { /* jump, in3 */ if( (pIn3->flags & MEM_Real)==0 ){ /* If the P3 value cannot be converted into any kind of a number, ** then the seek is not possible, so jump to P2 */ - pc = pOp->p2 - 1; VdbeBranchTaken(1,2); + VdbeBranchTaken(1,2); goto jump_to_p2; break; } @@ -73777,12 +85830,26 @@ case OP_SeekGT: { /* jump, in3 */ if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++; } } - rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)iKey, 0, &res); + rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res); pC->movetoTarget = iKey; /* Used by OP_Delete */ if( rc!=SQLITE_OK ){ goto abort_due_to_error; } }else{ + /* For a cursor with the BTREE_SEEK_EQ hint, only the OP_SeekGE and + ** OP_SeekLE opcodes are allowed, and these must be immediately followed + ** by an OP_IdxGT or OP_IdxLT opcode, respectively, with the same key. + */ + if( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ) ){ + eqOnly = 1; + assert( pOp->opcode==OP_SeekGE || pOp->opcode==OP_SeekLE ); + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + assert( pOp[1].p1==pOp[0].p1 ); + assert( pOp[1].p2==pOp[0].p2 ); + assert( pOp[1].p3==pOp[0].p3 ); + assert( pOp[1].p4.i==pOp[0].p4.i ); + } + nField = pOp->p4.i; assert( pOp->p4type==P4_INT32 ); assert( nField>0 ); @@ -73806,11 +85873,15 @@ case OP_SeekGT: { /* jump, in3 */ #ifdef SQLITE_DEBUG { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); } #endif - ExpandBlob(r.aMem); - rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, &r, 0, 0, &res); + r.eqSeen = 0; + rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, &r, 0, 0, &res); if( rc!=SQLITE_OK ){ goto abort_due_to_error; } + if( eqOnly && r.eqSeen==0 ){ + assert( res!=0 ); + goto seek_not_found; + } } pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; @@ -73820,8 +85891,15 @@ case OP_SeekGT: { /* jump, in3 */ if( oc>=OP_SeekGE ){ assert( oc==OP_SeekGE || oc==OP_SeekGT ); if( res<0 || (res==0 && oc==OP_SeekGT) ){ res = 0; - rc = sqlite3BtreeNext(pC->pCursor, &res); - if( rc!=SQLITE_OK ) goto abort_due_to_error; + rc = sqlite3BtreeNext(pC->uc.pCursor, 0); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + res = 1; + }else{ + goto abort_due_to_error; + } + } }else{ res = 0; } @@ -73829,49 +85907,34 @@ case OP_SeekGT: { /* jump, in3 */ assert( oc==OP_SeekLT || oc==OP_SeekLE ); if( res>0 || (res==0 && oc==OP_SeekLT) ){ res = 0; - rc = sqlite3BtreePrevious(pC->pCursor, &res); - if( rc!=SQLITE_OK ) goto abort_due_to_error; + rc = sqlite3BtreePrevious(pC->uc.pCursor, 0); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + res = 1; + }else{ + goto abort_due_to_error; + } + } }else{ /* res might be negative because the table is empty. Check to ** see if this is the case. */ - res = sqlite3BtreeEof(pC->pCursor); + res = sqlite3BtreeEof(pC->uc.pCursor); } } +seek_not_found: assert( pOp->p2>0 ); VdbeBranchTaken(res!=0,2); if( res ){ - pc = pOp->p2 - 1; + goto jump_to_p2; + }else if( eqOnly ){ + assert( pOp[1].opcode==OP_IdxLT || pOp[1].opcode==OP_IdxGT ); + pOp++; /* Skip the OP_IdxLt or OP_IdxGT that follows */ } break; } -/* Opcode: Seek P1 P2 * * * -** Synopsis: intkey=r[P2] -** -** P1 is an open table cursor and P2 is a rowid integer. Arrange -** for P1 to move so that it points to the rowid given by P2. -** -** This is actually a deferred seek. Nothing actually happens until -** the cursor is used to read a record. That way, if no reads -** occur, no unnecessary I/O happens. -*/ -case OP_Seek: { /* in2 */ - VdbeCursor *pC; - - assert( pOp->p1>=0 && pOp->p1<p->nCursor ); - pC = p->apCsr[pOp->p1]; - assert( pC!=0 ); - assert( pC->pCursor!=0 ); - assert( pC->isTable ); - pC->nullRow = 0; - pIn2 = &aMem[pOp->p2]; - pC->movetoTarget = sqlite3VdbeIntValue(pIn2); - pC->deferredMoveto = 1; - break; -} - - /* Opcode: Found P1 P2 P3 P4 * ** Synopsis: key=r[P3@P4] ** @@ -73935,13 +85998,13 @@ case OP_NoConflict: /* jump, in3 */ case OP_NotFound: /* jump, in3 */ case OP_Found: { /* jump, in3 */ int alreadyExists; + int takeJump; int ii; VdbeCursor *pC; int res; - char *pFree; + UnpackedRecord *pFree; UnpackedRecord *pIdxKey; UnpackedRecord r; - char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*4 + 7]; #ifdef SQLITE_TEST if( pOp->opcode!=OP_NoConflict ) sqlite3_found_count++; @@ -73955,48 +86018,48 @@ case OP_Found: { /* jump, in3 */ pC->seekOp = pOp->opcode; #endif pIn3 = &aMem[pOp->p3]; - assert( pC->pCursor!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); assert( pC->isTable==0 ); - pFree = 0; /* Not needed. Only used to suppress a compiler warning. */ if( pOp->p4.i>0 ){ r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p4.i; r.aMem = pIn3; +#ifdef SQLITE_DEBUG for(ii=0; ii<r.nField; ii++){ assert( memIsValid(&r.aMem[ii]) ); - ExpandBlob(&r.aMem[ii]); -#ifdef SQLITE_DEBUG + assert( (r.aMem[ii].flags & MEM_Zero)==0 || r.aMem[ii].n==0 ); if( ii ) REGISTER_TRACE(pOp->p3+ii, &r.aMem[ii]); -#endif } +#endif pIdxKey = &r; + pFree = 0; }else{ - pIdxKey = sqlite3VdbeAllocUnpackedRecord( - pC->pKeyInfo, aTempRec, sizeof(aTempRec), &pFree - ); - if( pIdxKey==0 ) goto no_mem; assert( pIn3->flags & MEM_Blob ); - ExpandBlob(pIn3); + rc = ExpandBlob(pIn3); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc ) goto no_mem; + pFree = pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); + if( pIdxKey==0 ) goto no_mem; sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey); } pIdxKey->default_rc = 0; + takeJump = 0; if( pOp->opcode==OP_NoConflict ){ /* For the OP_NoConflict opcode, take the jump if any of the ** input fields are NULL, since any key with a NULL will not ** conflict */ for(ii=0; ii<pIdxKey->nField; ii++){ if( pIdxKey->aMem[ii].flags & MEM_Null ){ - pc = pOp->p2 - 1; VdbeBranchTaken(1,2); + takeJump = 1; break; } } } - rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, pIdxKey, 0, 0, &res); - if( pOp->p4.i==0 ){ - sqlite3DbFree(db, pFree); - } + rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, pIdxKey, 0, 0, &res); + if( pFree ) sqlite3DbFreeNN(db, pFree); if( rc!=SQLITE_OK ){ - break; + goto abort_due_to_error; } pC->seekResult = res; alreadyExists = (res==0); @@ -74005,22 +86068,28 @@ case OP_Found: { /* jump, in3 */ pC->cacheStatus = CACHE_STALE; if( pOp->opcode==OP_Found ){ VdbeBranchTaken(alreadyExists!=0,2); - if( alreadyExists ) pc = pOp->p2 - 1; + if( alreadyExists ) goto jump_to_p2; }else{ - VdbeBranchTaken(alreadyExists==0,2); - if( !alreadyExists ) pc = pOp->p2 - 1; + VdbeBranchTaken(takeJump||alreadyExists==0,2); + if( takeJump || !alreadyExists ) goto jump_to_p2; } break; } -/* Opcode: NotExists P1 P2 P3 * * +/* Opcode: SeekRowid P1 P2 P3 * * ** Synopsis: intkey=r[P3] ** ** P1 is the index of a cursor open on an SQL table btree (with integer -** keys). P3 is an integer rowid. If P1 does not contain a record with -** rowid P3 then jump immediately to P2. If P1 does contain a record -** with rowid P3 then leave the cursor pointing at that record and fall -** through to the next instruction. +** keys). If register P3 does not contain an integer or if P1 does not +** contain a record with rowid P3 then jump immediately to P2. +** Or, if P2 is 0, raise an SQLITE_CORRUPT error. If P1 does contain +** a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_NotExists opcode performs the same operation, but with OP_NotExists +** the P3 register must be guaranteed to contain an integer value. With this +** opcode, register P3 might not contain an integer. ** ** The OP_NotFound opcode performs the same operation on index btrees ** (with arbitrary multi-value keys). @@ -74029,14 +86098,44 @@ case OP_Found: { /* jump, in3 */ ** in either direction. In other words, the Next and Prev opcodes will ** not work following this opcode. ** -** See also: Found, NotFound, NoConflict +** See also: Found, NotFound, NoConflict, SeekRowid */ -case OP_NotExists: { /* jump, in3 */ +/* Opcode: NotExists P1 P2 P3 * * +** Synopsis: intkey=r[P3] +** +** P1 is the index of a cursor open on an SQL table btree (with integer +** keys). P3 is an integer rowid. If P1 does not contain a record with +** rowid P3 then jump immediately to P2. Or, if P2 is 0, raise an +** SQLITE_CORRUPT error. If P1 does contain a record with rowid P3 then +** leave the cursor pointing at that record and fall through to the next +** instruction. +** +** The OP_SeekRowid opcode performs the same operation but also allows the +** P3 register to contain a non-integer value, in which case the jump is +** always taken. This opcode requires that P3 always contain an integer. +** +** The OP_NotFound opcode performs the same operation on index btrees +** (with arbitrary multi-value keys). +** +** This opcode leaves the cursor in a state where it cannot be advanced +** in either direction. In other words, the Next and Prev opcodes will +** not work following this opcode. +** +** See also: Found, NotFound, NoConflict, SeekRowid +*/ +case OP_SeekRowid: { /* jump, in3 */ VdbeCursor *pC; BtCursor *pCrsr; int res; u64 iKey; + pIn3 = &aMem[pOp->p3]; + if( (pIn3->flags & MEM_Int)==0 ){ + applyAffinity(pIn3, SQLITE_AFF_NUMERIC, encoding); + if( (pIn3->flags & MEM_Int)==0 ) goto jump_to_p2; + } + /* Fall through into OP_NotExists */ +case OP_NotExists: /* jump, in3 */ pIn3 = &aMem[pOp->p3]; assert( pIn3->flags & MEM_Int ); assert( pOp->p1>=0 && pOp->p1<p->nCursor ); @@ -74046,21 +86145,28 @@ case OP_NotExists: { /* jump, in3 */ pC->seekOp = 0; #endif assert( pC->isTable ); - assert( pC->pseudoTableReg==0 ); - pCrsr = pC->pCursor; + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; assert( pCrsr!=0 ); res = 0; iKey = pIn3->u.i; rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res); + assert( rc==SQLITE_OK || res==0 ); pC->movetoTarget = iKey; /* Used by OP_Delete */ pC->nullRow = 0; pC->cacheStatus = CACHE_STALE; pC->deferredMoveto = 0; VdbeBranchTaken(res!=0,2); - if( res!=0 ){ - pc = pOp->p2 - 1; - } pC->seekResult = res; + if( res!=0 ){ + assert( rc==SQLITE_OK ); + if( pOp->p2==0 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + goto jump_to_p2; + } + } + if( rc ) goto abort_due_to_error; break; } @@ -74072,9 +86178,11 @@ case OP_NotExists: { /* jump, in3 */ ** The sequence number on the cursor is incremented after this ** instruction. */ -case OP_Sequence: { /* out2-prerelease */ +case OP_Sequence: { /* out2 */ assert( pOp->p1>=0 && pOp->p1<p->nCursor ); assert( p->apCsr[pOp->p1]!=0 ); + assert( p->apCsr[pOp->p1]->eCurType!=CURTYPE_VTAB ); + pOut = out2Prerelease(p, pOp); pOut->u.i = p->apCsr[pOp->p1]->seqCount++; break; } @@ -74095,7 +86203,7 @@ case OP_Sequence: { /* out2-prerelease */ ** generated record number. This P3 mechanism is used to help implement the ** AUTOINCREMENT feature. */ -case OP_NewRowid: { /* out2-prerelease */ +case OP_NewRowid: { /* out2 */ i64 v; /* The new rowid */ VdbeCursor *pC; /* Cursor of table to get the new rowid */ int res; /* Result of an sqlite3BtreeLast() */ @@ -74105,12 +86213,14 @@ case OP_NewRowid: { /* out2-prerelease */ v = 0; res = 0; + pOut = out2Prerelease(p, pOp); assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - if( NEVER(pC->pCursor==0) ){ - /* The zero initialization above is all that is needed */ - }else{ + assert( pC->isTable ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + { /* The next rowid or record number (different terms for the same ** thing) is obtained in a two-step algorithm. ** @@ -74137,16 +86247,15 @@ case OP_NewRowid: { /* out2-prerelease */ #endif if( !pC->useRandomRowid ){ - rc = sqlite3BtreeLast(pC->pCursor, &res); + rc = sqlite3BtreeLast(pC->uc.pCursor, &res); if( rc!=SQLITE_OK ){ goto abort_due_to_error; } if( res ){ v = 1; /* IMP: R-61914-48074 */ }else{ - assert( sqlite3BtreeCursorIsValid(pC->pCursor) ); - rc = sqlite3BtreeKeySize(pC->pCursor, &v); - assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */ + assert( sqlite3BtreeCursorIsValid(pC->uc.pCursor) ); + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); if( v>=MAX_ROWID ){ pC->useRandomRowid = 1; }else{ @@ -74166,7 +86275,7 @@ case OP_NewRowid: { /* out2-prerelease */ pMem = &pFrame->aMem[pOp->p3]; }else{ /* Assert that P3 is a valid memory cell. */ - assert( pOp->p3<=(p->nMem-p->nCursor) ); + assert( pOp->p3<=(p->nMem+1 - p->nCursor) ); pMem = &aMem[pOp->p3]; memAboutToChange(p, pMem); } @@ -74176,7 +86285,7 @@ case OP_NewRowid: { /* out2-prerelease */ sqlite3VdbeMemIntegerify(pMem); assert( (pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ if( pMem->u.i==MAX_ROWID || pC->useRandomRowid ){ - rc = SQLITE_FULL; /* IMP: R-12275-61338 */ + rc = SQLITE_FULL; /* IMP: R-17817-00630 */ goto abort_due_to_error; } if( v<pMem->u.i+1 ){ @@ -74196,11 +86305,12 @@ case OP_NewRowid: { /* out2-prerelease */ do{ sqlite3_randomness(sizeof(v), &v); v &= (MAX_ROWID>>1); v++; /* Ensure that v is greater than zero */ - }while( ((rc = sqlite3BtreeMovetoUnpacked(pC->pCursor, 0, (u64)v, + }while( ((rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)v, 0, &res))==SQLITE_OK) && (res==0) && (++cnt<100)); - if( rc==SQLITE_OK && res==0 ){ + if( rc ) goto abort_due_to_error; + if( res==0 ){ rc = SQLITE_FULL; /* IMP: R-38219-53002 */ goto abort_due_to_error; } @@ -74227,22 +86337,19 @@ case OP_NewRowid: { /* out2-prerelease */ ** then rowid is stored for subsequent return by the ** sqlite3_last_insert_rowid() function (otherwise it is unmodified). ** -** If the OPFLAG_USESEEKRESULT flag of P5 is set and if the result of -** the last seek operation (OP_NotExists) was a success, then this -** operation will not attempt to find the appropriate row before doing -** the insert but will instead overwrite the row that the cursor is -** currently pointing to. Presumably, the prior OP_NotExists opcode -** has already positioned the cursor correctly. This is an optimization -** that boosts performance by avoiding redundant seeks. +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equal to P3. ** ** If the OPFLAG_ISUPDATE flag is set, then this opcode is part of an ** UPDATE operation. Otherwise (if the flag is clear) then this opcode ** is part of an INSERT operation. The difference is only important to ** the update hook. ** -** Parameter P4 may point to a string containing the table-name, or -** may be NULL. If it is not NULL, then the update-hook -** (sqlite3.xUpdateCallback) is invoked following a successful insert. +** Parameter P4 may point to a Table structure, or may be NULL. If it is +** not NULL, then the update-hook (sqlite3.xUpdateCallback) is invoked +** following a successful insert. ** ** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically ** allocated, then ownership of P2 is transferred to the pseudo-cursor @@ -74254,7 +86361,7 @@ case OP_NewRowid: { /* out2-prerelease */ ** for indices is OP_IdxInsert. */ /* Opcode: InsertInt P1 P2 P3 P4 P5 -** Synopsis: intkey=P3 data=r[P2] +** Synopsis: intkey=P3 data=r[P2] ** ** This works exactly like OP_Insert except that the key is the ** integer value P3, not the value of the integer stored in register P3. @@ -74263,118 +86370,217 @@ case OP_Insert: case OP_InsertInt: { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ - i64 iKey; /* The integer ROWID or key for the record to be inserted */ VdbeCursor *pC; /* Cursor to table into which insert is written */ - int nZero; /* Number of zero-bytes to append */ int seekResult; /* Result of prior seek or 0 if no USESEEKRESULT flag */ const char *zDb; /* database name - used by the update hook */ - const char *zTbl; /* Table name - used by the opdate hook */ - int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */ + Table *pTab; /* Table structure - used by update and pre-update hooks */ + BtreePayload x; /* Payload to be inserted */ pData = &aMem[pOp->p2]; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); assert( memIsValid(pData) ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - assert( pC->pCursor!=0 ); - assert( pC->pseudoTableReg==0 ); - assert( pC->isTable ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); + assert( (pOp->p5 & OPFLAG_ISNOOP) || pC->isTable ); + assert( pOp->p4type==P4_TABLE || pOp->p4type>=P4_STATIC ); REGISTER_TRACE(pOp->p2, pData); + sqlite3VdbeIncrWriteCounter(p, pC); if( pOp->opcode==OP_Insert ){ pKey = &aMem[pOp->p3]; assert( pKey->flags & MEM_Int ); assert( memIsValid(pKey) ); REGISTER_TRACE(pOp->p3, pKey); - iKey = pKey->u.i; + x.nKey = pKey->u.i; }else{ assert( pOp->opcode==OP_InsertInt ); - iKey = pOp->p3; + x.nKey = pOp->p3; } - if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; - if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = iKey; - if( pData->flags & MEM_Null ){ - pData->z = 0; - pData->n = 0; + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->iDb>=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + assert( (pOp->p5 & OPFLAG_ISNOOP) || HasRowid(pTab) ); }else{ - assert( pData->flags & (MEM_Blob|MEM_Str) ); + pTab = 0; + zDb = 0; /* Not needed. Silence a compiler warning. */ } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update hook, if any */ + if( pTab ){ + if( db->xPreUpdateCallback && !(pOp->p5 & OPFLAG_ISUPDATE) ){ + sqlite3VdbePreUpdateHook(p, pC, SQLITE_INSERT, zDb, pTab, x.nKey,pOp->p2); + } + if( db->xUpdateCallback==0 || pTab->aCol==0 ){ + /* Prevent post-update hook from running in cases when it should not */ + pTab = 0; + } + } + if( pOp->p5 & OPFLAG_ISNOOP ) break; +#endif + + if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; + if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = x.nKey; + assert( pData->flags & (MEM_Blob|MEM_Str) ); + x.pData = pData->z; + x.nData = pData->n; seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0); if( pData->flags & MEM_Zero ){ - nZero = pData->u.nZero; + x.nZero = pData->u.nZero; }else{ - nZero = 0; + x.nZero = 0; } - rc = sqlite3BtreeInsert(pC->pCursor, 0, iKey, - pData->z, pData->n, nZero, - (pOp->p5 & OPFLAG_APPEND)!=0, seekResult + x.pKey = 0; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION)), seekResult ); pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; /* Invoke the update-hook if required. */ - if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){ - zDb = db->aDb[pC->iDb].zName; - zTbl = pOp->p4.z; - op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT); - assert( pC->isTable ); - db->xUpdateCallback(db->pUpdateArg, op, zDb, zTbl, iKey); - assert( pC->iDb>=0 ); + if( rc ) goto abort_due_to_error; + if( pTab ){ + assert( db->xUpdateCallback!=0 ); + assert( pTab->aCol!=0 ); + db->xUpdateCallback(db->pUpdateArg, + (pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT, + zDb, pTab->zName, x.nKey); } break; } -/* Opcode: Delete P1 P2 * P4 * +/* Opcode: Delete P1 P2 P3 P4 P5 ** ** Delete the record at which the P1 cursor is currently pointing. ** -** The cursor will be left pointing at either the next or the previous +** If the OPFLAG_SAVEPOSITION bit of the P5 parameter is set, then +** the cursor will be left pointing at either the next or the previous ** record in the table. If it is left pointing at the next record, then -** the next Next instruction will be a no-op. Hence it is OK to delete -** a record from within a Next loop. +** the next Next instruction will be a no-op. As a result, in this case +** it is ok to delete a record from within a Next loop. If +** OPFLAG_SAVEPOSITION bit of P5 is clear, then the cursor will be +** left in an undefined state. ** -** If the OPFLAG_NCHANGE flag of P2 is set, then the row change count is -** incremented (otherwise not). +** If the OPFLAG_AUXDELETE bit is set on P5, that indicates that this +** delete one of several associated with deleting a table row and all its +** associated index entries. Exactly one of those deletes is the "primary" +** delete. The others are all on OPFLAG_FORDELETE cursors or else are +** marked with the AUXDELETE flag. +** +** If the OPFLAG_NCHANGE flag of P2 (NB: P2 not P5) is set, then the row +** change count is incremented (otherwise not). ** ** P1 must not be pseudo-table. It has to be a real table with ** multiple rows. ** -** If P4 is not NULL, then it is the name of the table that P1 is -** pointing to. The update hook will be invoked, if it exists. -** If P4 is not NULL then the P1 cursor must have been positioned -** using OP_NotFound prior to invoking this opcode. +** If P4 is not NULL then it points to a Table object. In this case either +** the update or pre-update hook, or both, may be invoked. The P1 cursor must +** have been positioned using OP_NotFound prior to invoking this opcode in +** this case. Specifically, if one is configured, the pre-update hook is +** invoked if P4 is not NULL. The update-hook is invoked if one is configured, +** P4 is not NULL, and the OPFLAG_NCHANGE flag is set in P2. +** +** If the OPFLAG_ISUPDATE flag is set in P2, then P3 contains the address +** of the memory cell that contains the value that the rowid of the row will +** be set to by the update. */ case OP_Delete: { VdbeCursor *pC; + const char *zDb; + Table *pTab; + int opflags; + opflags = pOp->p2; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - assert( pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */ + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); assert( pC->deferredMoveto==0 ); + sqlite3VdbeIncrWriteCounter(p, pC); #ifdef SQLITE_DEBUG - /* The seek operation that positioned the cursor prior to OP_Delete will - ** have also set the pC->movetoTarget field to the rowid of the row that - ** is being deleted */ - if( pOp->p4.z && pC->isTable ){ - i64 iKey = 0; - sqlite3BtreeKeySize(pC->pCursor, &iKey); - assert( pC->movetoTarget==iKey ); + if( pOp->p4type==P4_TABLE && HasRowid(pOp->p4.pTab) && pOp->p5==0 ){ + /* If p5 is zero, the seek operation that positioned the cursor prior to + ** OP_Delete will have also set the pC->movetoTarget field to the rowid of + ** the row that is being deleted */ + i64 iKey = sqlite3BtreeIntegerKey(pC->uc.pCursor); + assert( pC->movetoTarget==iKey ); } #endif + + /* If the update-hook or pre-update-hook will be invoked, set zDb to + ** the name of the db to pass as to it. Also set local pTab to a copy + ** of p4.pTab. Finally, if p5 is true, indicating that this cursor was + ** last moved with OP_Next or OP_Prev, not Seek or NotFound, set + ** VdbeCursor.movetoTarget to the current rowid. */ + if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ + assert( pC->iDb>=0 ); + assert( pOp->p4.pTab!=0 ); + zDb = db->aDb[pC->iDb].zDbSName; + pTab = pOp->p4.pTab; + if( (pOp->p5 & OPFLAG_SAVEPOSITION)!=0 && pC->isTable ){ + pC->movetoTarget = sqlite3BtreeIntegerKey(pC->uc.pCursor); + } + }else{ + zDb = 0; /* Not needed. Silence a compiler warning. */ + pTab = 0; /* Not needed. Silence a compiler warning. */ + } + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + /* Invoke the pre-update-hook if required. */ + if( db->xPreUpdateCallback && pOp->p4.pTab ){ + assert( !(opflags & OPFLAG_ISUPDATE) + || HasRowid(pTab)==0 + || (aMem[pOp->p3].flags & MEM_Int) + ); + sqlite3VdbePreUpdateHook(p, pC, + (opflags & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_DELETE, + zDb, pTab, pC->movetoTarget, + pOp->p3 + ); + } + if( opflags & OPFLAG_ISNOOP ) break; +#endif - rc = sqlite3BtreeDelete(pC->pCursor); + /* Only flags that can be set are SAVEPOISTION and AUXDELETE */ + assert( (pOp->p5 & ~(OPFLAG_SAVEPOSITION|OPFLAG_AUXDELETE))==0 ); + assert( OPFLAG_SAVEPOSITION==BTREE_SAVEPOSITION ); + assert( OPFLAG_AUXDELETE==BTREE_AUXDELETE ); + +#ifdef SQLITE_DEBUG + if( p->pFrame==0 ){ + if( pC->isEphemeral==0 + && (pOp->p5 & OPFLAG_AUXDELETE)==0 + && (pC->wrFlag & OPFLAG_FORDELETE)==0 + ){ + nExtraDelete++; + } + if( pOp->p2 & OPFLAG_NCHANGE ){ + nExtraDelete--; + } + } +#endif + + rc = sqlite3BtreeDelete(pC->uc.pCursor, pOp->p5); pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; + if( rc ) goto abort_due_to_error; /* Invoke the update-hook if required. */ - if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z && pC->isTable ){ - db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, - db->aDb[pC->iDb].zName, pOp->p4.z, pC->movetoTarget); - assert( pC->iDb>=0 ); + if( opflags & OPFLAG_NCHANGE ){ + p->nChange++; + if( db->xUpdateCallback && HasRowid(pTab) ){ + db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, pTab->zName, + pC->movetoTarget); + assert( pC->iDb>=0 ); + } } - if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++; + break; } /* Opcode: ResetCount * * * * * @@ -74391,7 +86597,7 @@ case OP_ResetCount: { } /* Opcode: SorterCompare P1 P2 P3 P4 -** Synopsis: if key(P1)!=trim(r[P3],P4) goto P2 +** Synopsis: if key(P1)!=trim(r[P3],P4) goto P2 ** ** P1 is a sorter cursor. This instruction compares a prefix of the ** record blob in register P3 against a prefix of the entry that @@ -74418,9 +86624,8 @@ case OP_SorterCompare: { res = 0; rc = sqlite3VdbeSorterCompare(pC, pIn3, nKeyCol, &res); VdbeBranchTaken(res!=0,2); - if( res ){ - pc = pOp->p2-1; - } + if( rc ) goto abort_due_to_error; + if( res ) goto jump_to_p2; break; }; @@ -74445,57 +86650,59 @@ case OP_SorterData: { rc = sqlite3VdbeSorterRowkey(pC, pOut); assert( rc!=SQLITE_OK || (pOut->flags & MEM_Blob) ); assert( pOp->p1>=0 && pOp->p1<p->nCursor ); + if( rc ) goto abort_due_to_error; p->apCsr[pOp->p3]->cacheStatus = CACHE_STALE; break; } -/* Opcode: RowData P1 P2 * * * +/* Opcode: RowData P1 P2 P3 * * ** Synopsis: r[P2]=data ** -** Write into register P2 the complete row data for cursor P1. +** Write into register P2 the complete row content for the row at +** which cursor P1 is currently pointing. ** There is no interpretation of the data. ** It is just copied onto the P2 register exactly as ** it is found in the database file. ** -** If the P1 cursor must be pointing to a valid row (not a NULL row) -** of a real table, not a pseudo-table. -*/ -/* Opcode: RowKey P1 P2 * * * -** Synopsis: r[P2]=key -** -** Write into register P2 the complete row key for cursor P1. -** There is no interpretation of the data. -** The key is copied onto the P2 register exactly as -** it is found in the database file. +** If cursor P1 is an index, then the content is the key of the row. +** If cursor P2 is a table, then the content extracted is the data. ** ** If the P1 cursor must be pointing to a valid row (not a NULL row) ** of a real table, not a pseudo-table. +** +** If P3!=0 then this opcode is allowed to make an ephemeral pointer +** into the database page. That means that the content of the output +** register will be invalidated as soon as the cursor moves - including +** moves caused by other cursors that "save" the current cursors +** position in order that they can write to the same table. If P3==0 +** then a copy of the data is made into memory. P3!=0 is faster, but +** P3==0 is safer. +** +** If P3!=0 then the content of the P2 register is unsuitable for use +** in OP_Result and any OP_Result will invalidate the P2 register content. +** The P2 register content is invalidated by opcodes like OP_Function or +** by any use of another cursor pointing to the same table. */ -case OP_RowKey: case OP_RowData: { VdbeCursor *pC; BtCursor *pCrsr; u32 n; - i64 n64; - pOut = &aMem[pOp->p2]; - memAboutToChange(p, pOut); + pOut = out2Prerelease(p, pOp); - /* Note that RowKey and RowData are really exactly the same instruction */ assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; - assert( isSorter(pC)==0 ); - assert( pC->isTable || pOp->opcode!=OP_RowData ); - assert( pC->isTable==0 || pOp->opcode==OP_RowData ); assert( pC!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( isSorter(pC)==0 ); assert( pC->nullRow==0 ); - assert( pC->pseudoTableReg==0 ); - assert( pC->pCursor!=0 ); - pCrsr = pC->pCursor; + assert( pC->uc.pCursor!=0 ); + pCrsr = pC->uc.pCursor; - /* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or - ** OP_Rewind/Op_Next with no intervening instructions that might invalidate - ** the cursor. If this where not the case, on of the following assert()s + /* The OP_RowData opcodes always follow OP_NotExists or + ** OP_SeekRowid or OP_Rewind/Op_Next with no intervening instructions + ** that might invalidate the cursor. + ** If this where not the case, on of the following assert()s ** would fail. Should this ever change (because of changes in the code ** generator) then the fix would be to insert a call to ** sqlite3VdbeCursorMoveto(). @@ -74507,33 +86714,14 @@ case OP_RowData: { if( rc!=SQLITE_OK ) goto abort_due_to_error; #endif - if( pC->isTable==0 ){ - assert( !pC->isTable ); - VVA_ONLY(rc =) sqlite3BtreeKeySize(pCrsr, &n64); - assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */ - if( n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } - n = (u32)n64; - }else{ - VVA_ONLY(rc =) sqlite3BtreeDataSize(pCrsr, &n); - assert( rc==SQLITE_OK ); /* DataSize() cannot fail */ - if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } + n = sqlite3BtreePayloadSize(pCrsr); + if( n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ + goto too_big; } testcase( n==0 ); - if( sqlite3VdbeMemClearAndResize(pOut, MAX(n,32)) ){ - goto no_mem; - } - pOut->n = n; - MemSetTypeFlag(pOut, MEM_Blob); - if( pC->isTable==0 ){ - rc = sqlite3BtreeKey(pCrsr, 0, n, pOut->z); - }else{ - rc = sqlite3BtreeData(pCrsr, 0, n, pOut->z); - } - pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */ + rc = sqlite3VdbeMemFromBtree(pCrsr, 0, n, pOut); + if( rc ) goto abort_due_to_error; + if( !pOp->p3 ) Deephemeralize(pOut); UPDATE_MAX_BLOBSIZE(pOut); REGISTER_TRACE(pOp->p2, pOut); break; @@ -74549,39 +86737,42 @@ case OP_RowData: { ** be a separate OP_VRowid opcode for use with virtual tables, but this ** one opcode now works for both table types. */ -case OP_Rowid: { /* out2-prerelease */ +case OP_Rowid: { /* out2 */ VdbeCursor *pC; i64 v; sqlite3_vtab *pVtab; const sqlite3_module *pModule; + pOut = out2Prerelease(p, pOp); assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - assert( pC->pseudoTableReg==0 || pC->nullRow ); + assert( pC->eCurType!=CURTYPE_PSEUDO || pC->nullRow ); if( pC->nullRow ){ pOut->flags = MEM_Null; break; }else if( pC->deferredMoveto ){ v = pC->movetoTarget; #ifndef SQLITE_OMIT_VIRTUALTABLE - }else if( pC->pVtabCursor ){ - pVtab = pC->pVtabCursor->pVtab; + }else if( pC->eCurType==CURTYPE_VTAB ){ + assert( pC->uc.pVCur!=0 ); + pVtab = pC->uc.pVCur->pVtab; pModule = pVtab->pModule; assert( pModule->xRowid ); - rc = pModule->xRowid(pC->pVtabCursor, &v); + rc = pModule->xRowid(pC->uc.pVCur, &v); sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; #endif /* SQLITE_OMIT_VIRTUALTABLE */ }else{ - assert( pC->pCursor!=0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); rc = sqlite3VdbeCursorRestore(pC); if( rc ) goto abort_due_to_error; if( pC->nullRow ){ pOut->flags = MEM_Null; break; } - rc = sqlite3BtreeKeySize(pC->pCursor, &v); - assert( rc==SQLITE_OK ); /* Always so because of CursorRestore() above */ + v = sqlite3BtreeIntegerKey(pC->uc.pCursor); } pOut->u.i = v; break; @@ -74601,12 +86792,23 @@ case OP_NullRow: { assert( pC!=0 ); pC->nullRow = 1; pC->cacheStatus = CACHE_STALE; - if( pC->pCursor ){ - sqlite3BtreeClearCursor(pC->pCursor); + if( pC->eCurType==CURTYPE_BTREE ){ + assert( pC->uc.pCursor!=0 ); + sqlite3BtreeClearCursor(pC->uc.pCursor); } break; } +/* Opcode: SeekEnd P1 * * * * +** +** Position cursor P1 at the end of the btree for the purpose of +** appending a new entry onto the btree. +** +** It is assumed that the cursor is used only for appending and so +** if the cursor is valid, then the cursor must already be pointing +** at the end of the btree and so no changes are made to +** the cursor. +*/ /* Opcode: Last P1 P2 * * * ** ** The next use of the Rowid or Column or Prev instruction for P1 @@ -74619,6 +86821,7 @@ case OP_NullRow: { ** from the end toward the beginning. In other words, the cursor is ** configured to use Prev, not Next. */ +case OP_SeekEnd: case OP_Last: { /* jump */ VdbeCursor *pC; BtCursor *pCrsr; @@ -74627,24 +86830,69 @@ case OP_Last: { /* jump */ assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - pCrsr = pC->pCursor; + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; res = 0; assert( pCrsr!=0 ); +#ifdef SQLITE_DEBUG + pC->seekOp = pOp->opcode; +#endif + if( pOp->opcode==OP_SeekEnd ){ + assert( pOp->p2==0 ); + pC->seekResult = -1; + if( sqlite3BtreeCursorIsValidNN(pCrsr) ){ + break; + } + } rc = sqlite3BtreeLast(pCrsr, &res); pC->nullRow = (u8)res; pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; -#ifdef SQLITE_DEBUG - pC->seekOp = OP_Last; -#endif + if( rc ) goto abort_due_to_error; if( pOp->p2>0 ){ VdbeBranchTaken(res!=0,2); - if( res ) pc = pOp->p2 - 1; + if( res ) goto jump_to_p2; } break; } +/* Opcode: IfSmaller P1 P2 P3 * * +** +** Estimate the number of rows in the table P1. Jump to P2 if that +** estimate is less than approximately 2**(0.1*P3). +*/ +case OP_IfSmaller: { /* jump */ + VdbeCursor *pC; + BtCursor *pCrsr; + int res; + i64 sz; + assert( pOp->p1>=0 && pOp->p1<p->nCursor ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + pCrsr = pC->uc.pCursor; + assert( pCrsr ); + rc = sqlite3BtreeFirst(pCrsr, &res); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + sz = sqlite3BtreeRowCountEst(pCrsr); + if( ALWAYS(sz>=0) && sqlite3LogEst((u64)sz)<pOp->p3 ) res = 1; + } + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; + break; +} + + +/* Opcode: SorterSort P1 P2 * * * +** +** After all records have been inserted into the Sorter object +** identified by P1, invoke this opcode to actually do the sorting. +** Jump to P2 if there are no records to be sorted. +** +** This opcode is an alias for OP_Sort and OP_Rewind that is used +** for Sorter objects. +*/ /* Opcode: Sort P1 P2 * * * ** ** This opcode does exactly the same thing as OP_Rewind except that @@ -74694,18 +86942,18 @@ case OP_Rewind: { /* jump */ if( isSorter(pC) ){ rc = sqlite3VdbeSorterRewind(pC, &res); }else{ - pCrsr = pC->pCursor; + assert( pC->eCurType==CURTYPE_BTREE ); + pCrsr = pC->uc.pCursor; assert( pCrsr ); rc = sqlite3BtreeFirst(pCrsr, &res); pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; } + if( rc ) goto abort_due_to_error; pC->nullRow = (u8)res; assert( pOp->p2>0 && pOp->p2<p->nOp ); VdbeBranchTaken(res!=0,2); - if( res ){ - pc = pOp->p2 - 1; - } + if( res ) goto jump_to_p2; break; } @@ -74772,14 +87020,19 @@ case OP_Rewind: { /* jump */ ** This opcode works just like Prev except that if cursor P1 is not ** open it behaves a no-op. */ +/* Opcode: SorterNext P1 P2 * * P5 +** +** This opcode works just like OP_Next except that P1 must be a +** sorter object for which the OP_SorterSort opcode has been +** invoked. This opcode advances the cursor to the next sorted +** record, or jumps to P2 if there are no more sorted records. +*/ case OP_SorterNext: { /* jump */ VdbeCursor *pC; - int res; pC = p->apCsr[pOp->p1]; assert( isSorter(pC) ); - res = 0; - rc = sqlite3VdbeSorterNext(db, pC, &res); + rc = sqlite3VdbeSorterNext(db, pC); goto next_tail; case OP_PrevIfOpen: /* jump */ case OP_NextIfOpen: /* jump */ @@ -74790,12 +87043,9 @@ case OP_Next: /* jump */ assert( pOp->p1>=0 && pOp->p1<p->nCursor ); assert( pOp->p5<ArraySize(p->aCounter) ); pC = p->apCsr[pOp->p1]; - res = pOp->p3; assert( pC!=0 ); assert( pC->deferredMoveto==0 ); - assert( pC->pCursor ); - assert( res==0 || (res==1 && pC->isTable==0) ); - testcase( res==1 ); + assert( pC->eCurType==CURTYPE_BTREE ); assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); assert( pOp->opcode!=OP_NextIfOpen || pOp->p4.xAdvance==sqlite3BtreeNext ); @@ -74810,75 +87060,91 @@ case OP_Next: /* jump */ || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE || pC->seekOp==OP_Last ); - rc = pOp->p4.xAdvance(pC->pCursor, &res); + rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); next_tail: pC->cacheStatus = CACHE_STALE; - VdbeBranchTaken(res==0,2); - if( res==0 ){ + VdbeBranchTaken(rc==SQLITE_OK,2); + if( rc==SQLITE_OK ){ pC->nullRow = 0; - pc = pOp->p2 - 1; p->aCounter[pOp->p5]++; #ifdef SQLITE_TEST sqlite3_search_count++; #endif - }else{ - pC->nullRow = 1; + goto jump_to_p2_and_check_for_interrupt; } + if( rc!=SQLITE_DONE ) goto abort_due_to_error; + rc = SQLITE_OK; + pC->nullRow = 1; goto check_for_interrupt; } -/* Opcode: IdxInsert P1 P2 P3 * P5 +/* Opcode: IdxInsert P1 P2 P3 P4 P5 ** Synopsis: key=r[P2] ** ** Register P2 holds an SQL index key made using the ** MakeRecord instructions. This opcode writes that key ** into the index P1. Data for the entry is nil. ** -** P3 is a flag that provides a hint to the b-tree layer that this -** insert is likely to be an append. +** If P4 is not zero, then it is the number of values in the unpacked +** key of reg(P2). In that case, P3 is the index of the first register +** for the unpacked key. The availability of the unpacked key can sometimes +** be an optimization. +** +** If P5 has the OPFLAG_APPEND bit set, that is a hint to the b-tree layer +** that this insert is likely to be an append. ** ** If P5 has the OPFLAG_NCHANGE bit set, then the change counter is ** incremented by this instruction. If the OPFLAG_NCHANGE bit is clear, ** then the change counter is unchanged. ** -** If P5 has the OPFLAG_USESEEKRESULT bit set, then the cursor must have -** just done a seek to the spot where the new entry is to be inserted. -** This flag avoids doing an extra seek. +** If the OPFLAG_USESEEKRESULT flag of P5 is set, the implementation might +** run faster by avoiding an unnecessary seek on cursor P1. However, +** the OPFLAG_USESEEKRESULT flag must only be set if there have been no prior +** seeks on the cursor or if the most recent seek used a key equivalent +** to P2. ** ** This instruction only works for indices. The equivalent instruction ** for tables is OP_Insert. */ +/* Opcode: SorterInsert P1 P2 * * * +** Synopsis: key=r[P2] +** +** Register P2 holds an SQL index key made using the +** MakeRecord instructions. This opcode writes that key +** into the sorter P1. Data for the entry is nil. +*/ case OP_SorterInsert: /* in2 */ case OP_IdxInsert: { /* in2 */ VdbeCursor *pC; - BtCursor *pCrsr; - int nKey; - const char *zKey; + BtreePayload x; assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; + sqlite3VdbeIncrWriteCounter(p, pC); assert( pC!=0 ); assert( isSorter(pC)==(pOp->opcode==OP_SorterInsert) ); pIn2 = &aMem[pOp->p2]; assert( pIn2->flags & MEM_Blob ); - pCrsr = pC->pCursor; if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; - assert( pCrsr!=0 ); + assert( pC->eCurType==CURTYPE_BTREE || pOp->opcode==OP_SorterInsert ); assert( pC->isTable==0 ); rc = ExpandBlob(pIn2); - if( rc==SQLITE_OK ){ - if( isSorter(pC) ){ - rc = sqlite3VdbeSorterWrite(pC, pIn2); - }else{ - nKey = pIn2->n; - zKey = pIn2->z; - rc = sqlite3BtreeInsert(pCrsr, zKey, nKey, "", 0, 0, pOp->p3, - ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) - ); - assert( pC->deferredMoveto==0 ); - pC->cacheStatus = CACHE_STALE; - } + if( rc ) goto abort_due_to_error; + if( pOp->opcode==OP_SorterInsert ){ + rc = sqlite3VdbeSorterWrite(pC, pIn2); + }else{ + x.nKey = pIn2->n; + x.pKey = pIn2->z; + x.aMem = aMem + pOp->p3; + x.nMem = (u16)pOp->p4.i; + rc = sqlite3BtreeInsert(pC->uc.pCursor, &x, + (pOp->p5 & (OPFLAG_APPEND|OPFLAG_SAVEPOSITION)), + ((pOp->p5 & OPFLAG_USESEEKRESULT) ? pC->seekResult : 0) + ); + assert( pC->deferredMoveto==0 ); + pC->cacheStatus = CACHE_STALE; } + if( rc) goto abort_due_to_error; break; } @@ -74896,29 +87162,50 @@ case OP_IdxDelete: { UnpackedRecord r; assert( pOp->p3>0 ); - assert( pOp->p2>0 && pOp->p2+pOp->p3<=(p->nMem-p->nCursor)+1 ); + assert( pOp->p2>0 && pOp->p2+pOp->p3<=(p->nMem+1 - p->nCursor)+1 ); assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - pCrsr = pC->pCursor; + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3VdbeIncrWriteCounter(p, pC); + pCrsr = pC->uc.pCursor; assert( pCrsr!=0 ); assert( pOp->p5==0 ); r.pKeyInfo = pC->pKeyInfo; r.nField = (u16)pOp->p3; r.default_rc = 0; r.aMem = &aMem[pOp->p2]; -#ifdef SQLITE_DEBUG - { int i; for(i=0; i<r.nField; i++) assert( memIsValid(&r.aMem[i]) ); } -#endif rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res); - if( rc==SQLITE_OK && res==0 ){ - rc = sqlite3BtreeDelete(pCrsr); + if( rc ) goto abort_due_to_error; + if( res==0 ){ + rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); + if( rc ) goto abort_due_to_error; } assert( pC->deferredMoveto==0 ); pC->cacheStatus = CACHE_STALE; + pC->seekResult = 0; break; } +/* Opcode: DeferredSeek P1 * P3 P4 * +** Synopsis: Move P3 to P1.rowid if needed +** +** P1 is an open index cursor and P3 is a cursor on the corresponding +** table. This opcode does a deferred seek of the P3 table cursor +** to the row that corresponds to the current row of P1. +** +** This is a deferred seek. Nothing actually happens until +** the cursor is used to read a record. That way, if no reads +** occur, no unnecessary I/O happens. +** +** P4 may be an array of integers (type P4_INTARRAY) containing +** one entry for each column in the P3 table. If array entry a(i) +** is non-zero, then reading column a(i)-1 from cursor P3 is +** equivalent to performing the deferred seek and then reading column i +** from P1. This information is stored in P3 and used to redirect +** reads against P3 over to P1, thus possibly avoiding the need to +** seek and read cursor P3. +*/ /* Opcode: IdxRowid P1 P2 * * * ** Synopsis: r[P2]=rowid ** @@ -74928,35 +87215,56 @@ case OP_IdxDelete: { ** ** See also: Rowid, MakeRecord. */ -case OP_IdxRowid: { /* out2-prerelease */ - BtCursor *pCrsr; - VdbeCursor *pC; - i64 rowid; +case OP_DeferredSeek: +case OP_IdxRowid: { /* out2 */ + VdbeCursor *pC; /* The P1 index cursor */ + VdbeCursor *pTabCur; /* The P2 table cursor (OP_DeferredSeek only) */ + i64 rowid; /* Rowid that P1 current points to */ assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - pCrsr = pC->pCursor; - assert( pCrsr!=0 ); - pOut->flags = MEM_Null; + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0 ); assert( pC->isTable==0 ); assert( pC->deferredMoveto==0 ); + assert( !pC->nullRow || pOp->opcode==OP_IdxRowid ); + + /* The IdxRowid and Seek opcodes are combined because of the commonality + ** of sqlite3VdbeCursorRestore() and sqlite3VdbeIdxRowid(). */ + rc = sqlite3VdbeCursorRestore(pC); /* sqlite3VbeCursorRestore() can only fail if the record has been deleted - ** out from under the cursor. That will never happend for an IdxRowid - ** opcode, hence the NEVER() arround the check of the return value. - */ - rc = sqlite3VdbeCursorRestore(pC); + ** out from under the cursor. That will never happens for an IdxRowid + ** or Seek opcode */ if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; if( !pC->nullRow ){ rowid = 0; /* Not needed. Only used to silence a warning. */ - rc = sqlite3VdbeIdxRowid(db, pCrsr, &rowid); + rc = sqlite3VdbeIdxRowid(db, pC->uc.pCursor, &rowid); if( rc!=SQLITE_OK ){ goto abort_due_to_error; } - pOut->u.i = rowid; - pOut->flags = MEM_Int; + if( pOp->opcode==OP_DeferredSeek ){ + assert( pOp->p3>=0 && pOp->p3<p->nCursor ); + pTabCur = p->apCsr[pOp->p3]; + assert( pTabCur!=0 ); + assert( pTabCur->eCurType==CURTYPE_BTREE ); + assert( pTabCur->uc.pCursor!=0 ); + assert( pTabCur->isTable ); + pTabCur->nullRow = 0; + pTabCur->movetoTarget = rowid; + pTabCur->deferredMoveto = 1; + assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 ); + pTabCur->aAltMap = pOp->p4.ai; + pTabCur->pAltCursor = pC; + }else{ + pOut = out2Prerelease(p, pOp); + pOut->u.i = rowid; + } + }else{ + assert( pOp->opcode==OP_IdxRowid ); + sqlite3VdbeMemSetNull(&aMem[pOp->p2]); } break; } @@ -75017,7 +87325,8 @@ case OP_IdxGE: { /* jump */ pC = p->apCsr[pOp->p1]; assert( pC!=0 ); assert( pC->isOrdered ); - assert( pC->pCursor!=0); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->uc.pCursor!=0); assert( pC->deferredMoveto==0 ); assert( pOp->p5==0 || pOp->p5==1 ); assert( pOp->p4type==P4_INT32 ); @@ -75045,9 +87354,8 @@ case OP_IdxGE: { /* jump */ res++; } VdbeBranchTaken(res>0,2); - if( res>0 ){ - pc = pOp->p2 - 1 ; - } + if( rc ) goto abort_due_to_error; + if( res>0 ) goto jump_to_p2; break; } @@ -75064,46 +87372,43 @@ case OP_IdxGE: { /* jump */ ** might be moved into the newly deleted root page in order to keep all ** root pages contiguous at the beginning of the database. The former ** value of the root page that moved - its value before the move occurred - -** is stored in register P2. If no page -** movement was required (because the table being dropped was already -** the last one in the database) then a zero is stored in register P2. -** If AUTOVACUUM is disabled then a zero is stored in register P2. +** is stored in register P2. If no page movement was required (because the +** table being dropped was already the last one in the database) then a +** zero is stored in register P2. If AUTOVACUUM is disabled then a zero +** is stored in register P2. +** +** This opcode throws an error if there are any active reader VMs when +** it is invoked. This is done to avoid the difficulty associated with +** updating existing cursors when a root page is moved in an AUTOVACUUM +** database. This error is thrown even if the database is not an AUTOVACUUM +** db in order to avoid introducing an incompatibility between autovacuum +** and non-autovacuum modes. ** ** See also: Clear */ -case OP_Destroy: { /* out2-prerelease */ +case OP_Destroy: { /* out2 */ int iMoved; - int iCnt; - Vdbe *pVdbe; int iDb; + sqlite3VdbeIncrWriteCounter(p, 0); assert( p->readOnly==0 ); -#ifndef SQLITE_OMIT_VIRTUALTABLE - iCnt = 0; - for(pVdbe=db->pVdbe; pVdbe; pVdbe = pVdbe->pNext){ - if( pVdbe->magic==VDBE_MAGIC_RUN && pVdbe->bIsReader - && pVdbe->inVtabMethod<2 && pVdbe->pc>=0 - ){ - iCnt++; - } - } -#else - iCnt = db->nVdbeRead; -#endif + assert( pOp->p1>1 ); + pOut = out2Prerelease(p, pOp); pOut->flags = MEM_Null; - if( iCnt>1 ){ + if( db->nVdbeRead > db->nVDestroy+1 ){ rc = SQLITE_LOCKED; p->errorAction = OE_Abort; + goto abort_due_to_error; }else{ iDb = pOp->p3; - assert( iCnt==1 ); assert( DbMaskTest(p->btreeMask, iDb) ); iMoved = 0; /* Not needed. Only to silence a warning. */ rc = sqlite3BtreeDropTable(db->aDb[iDb].pBt, pOp->p1, &iMoved); pOut->flags = MEM_Int; pOut->u.i = iMoved; + if( rc ) goto abort_due_to_error; #ifndef SQLITE_OMIT_AUTOVACUUM - if( rc==SQLITE_OK && iMoved!=0 ){ + if( iMoved!=0 ){ sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1); /* All OP_Destroy operations occur on the same btree */ assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 ); @@ -75135,6 +87440,7 @@ case OP_Destroy: { /* out2-prerelease */ case OP_Clear: { int nChange; + sqlite3VdbeIncrWriteCounter(p, 0); nChange = 0; assert( p->readOnly==0 ); assert( DbMaskTest(p->btreeMask, pOp->p2) ); @@ -75149,6 +87455,7 @@ case OP_Clear: { aMem[pOp->p3].u.i += nChange; } } + if( rc ) goto abort_due_to_error; break; } @@ -75166,62 +87473,58 @@ case OP_ResetSorter: { assert( pOp->p1>=0 && pOp->p1<p->nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - if( pC->pSorter ){ - sqlite3VdbeSorterReset(db, pC->pSorter); + if( isSorter(pC) ){ + sqlite3VdbeSorterReset(db, pC->uc.pSorter); }else{ + assert( pC->eCurType==CURTYPE_BTREE ); assert( pC->isEphemeral ); - rc = sqlite3BtreeClearTableOfCursor(pC->pCursor); + rc = sqlite3BtreeClearTableOfCursor(pC->uc.pCursor); + if( rc ) goto abort_due_to_error; } break; } -/* Opcode: CreateTable P1 P2 * * * -** Synopsis: r[P2]=root iDb=P1 +/* Opcode: CreateBtree P1 P2 P3 * * +** Synopsis: r[P2]=root iDb=P1 flags=P3 ** -** Allocate a new table in the main database file if P1==0 or in the -** auxiliary database file if P1==1 or in an attached database if -** P1>1. Write the root page number of the new table into -** register P2 -** -** The difference between a table and an index is this: A table must -** have a 4-byte integer key and can have arbitrary data. An index -** has an arbitrary key but no data. -** -** See also: CreateIndex +** Allocate a new b-tree in the main database file if P1==0 or in the +** TEMP database file if P1==1 or in an attached database if +** P1>1. The P3 argument must be 1 (BTREE_INTKEY) for a rowid table +** it must be 2 (BTREE_BLOBKEY) for an index or WITHOUT ROWID table. +** The root page number of the new b-tree is stored in register P2. */ -/* Opcode: CreateIndex P1 P2 * * * -** Synopsis: r[P2]=root iDb=P1 -** -** Allocate a new index in the main database file if P1==0 or in the -** auxiliary database file if P1==1 or in an attached database if -** P1>1. Write the root page number of the new table into -** register P2. -** -** See documentation on OP_CreateTable for additional information. -*/ -case OP_CreateIndex: /* out2-prerelease */ -case OP_CreateTable: { /* out2-prerelease */ +case OP_CreateBtree: { /* out2 */ int pgno; - int flags; Db *pDb; + sqlite3VdbeIncrWriteCounter(p, 0); + pOut = out2Prerelease(p, pOp); pgno = 0; + assert( pOp->p3==BTREE_INTKEY || pOp->p3==BTREE_BLOBKEY ); assert( pOp->p1>=0 && pOp->p1<db->nDb ); assert( DbMaskTest(p->btreeMask, pOp->p1) ); assert( p->readOnly==0 ); pDb = &db->aDb[pOp->p1]; assert( pDb->pBt!=0 ); - if( pOp->opcode==OP_CreateTable ){ - /* flags = BTREE_INTKEY; */ - flags = BTREE_INTKEY; - }else{ - flags = BTREE_BLOBKEY; - } - rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, flags); + rc = sqlite3BtreeCreateTable(pDb->pBt, &pgno, pOp->p3); + if( rc ) goto abort_due_to_error; pOut->u.i = pgno; break; } +/* Opcode: SqlExec * * * P4 * +** +** Run the SQL statement or statements specified in the P4 string. +*/ +case OP_SqlExec: { + sqlite3VdbeIncrWriteCounter(p, 0); + db->nSqlExec++; + rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0); + db->nSqlExec--; + if( rc ) goto abort_due_to_error; + break; +} + /* Opcode: ParseSchema P1 * * P4 * ** ** Read and parse all entries from the SQLITE_MASTER table of database P1 @@ -75250,15 +87553,15 @@ case OP_ParseSchema: { assert( iDb>=0 && iDb<db->nDb ); assert( DbHasProperty(db, iDb, DB_SchemaLoaded) ); /* Used to be a conditional */ { - zMaster = SCHEMA_TABLE(iDb); + zMaster = MASTER_NAME; initData.db = db; initData.iDb = pOp->p1; initData.pzErrMsg = &p->zErrMsg; zSql = sqlite3MPrintf(db, "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", - db->aDb[iDb].zName, zMaster, pOp->p4.z); + db->aDb[iDb].zDbSName, zMaster, pOp->p4.z); if( zSql==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ assert( db->init.busy==0 ); db->init.busy = 1; @@ -75266,13 +87569,16 @@ case OP_ParseSchema: { assert( !db->mallocFailed ); rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); if( rc==SQLITE_OK ) rc = initData.rc; - sqlite3DbFree(db, zSql); + sqlite3DbFreeNN(db, zSql); db->init.busy = 0; } } - if( rc ) sqlite3ResetAllSchemasOfConnection(db); - if( rc==SQLITE_NOMEM ){ - goto no_mem; + if( rc ){ + sqlite3ResetAllSchemasOfConnection(db); + if( rc==SQLITE_NOMEM ){ + goto no_mem; + } + goto abort_due_to_error; } break; } @@ -75287,6 +87593,7 @@ case OP_ParseSchema: { case OP_LoadAnalysis: { assert( pOp->p1>=0 && pOp->p1<db->nDb ); rc = sqlite3AnalysisLoad(db, pOp->p1); + if( rc ) goto abort_due_to_error; break; } #endif /* !defined(SQLITE_OMIT_ANALYZE) */ @@ -75300,6 +87607,7 @@ case OP_LoadAnalysis: { ** schema consistent with what is on disk. */ case OP_DropTable: { + sqlite3VdbeIncrWriteCounter(p, 0); sqlite3UnlinkAndDeleteTable(db, pOp->p1, pOp->p4.z); break; } @@ -75313,6 +87621,7 @@ case OP_DropTable: { ** schema consistent with what is on disk. */ case OP_DropIndex: { + sqlite3VdbeIncrWriteCounter(p, 0); sqlite3UnlinkAndDeleteIndex(db, pOp->p1, pOp->p4.z); break; } @@ -75326,26 +87635,26 @@ case OP_DropIndex: { ** schema consistent with what is on disk. */ case OP_DropTrigger: { + sqlite3VdbeIncrWriteCounter(p, 0); sqlite3UnlinkAndDeleteTrigger(db, pOp->p1, pOp->p4.z); break; } #ifndef SQLITE_OMIT_INTEGRITY_CHECK -/* Opcode: IntegrityCk P1 P2 P3 * P5 +/* Opcode: IntegrityCk P1 P2 P3 P4 P5 ** ** Do an analysis of the currently open database. Store in ** register P1 the text of an error message describing any problems. ** If no problems are found, store a NULL in register P1. ** -** The register P3 contains the maximum number of allowed errors. +** The register P3 contains one less than the maximum number of allowed errors. ** At most reg(P3) errors will be reported. ** In other words, the analysis stops as soon as reg(P1) errors are ** seen. Reg(P1) is updated with the number of errors remaining. ** -** The root page numbers of all tables in the database are integer -** stored in reg(P1), reg(P1+1), reg(P1+2), .... There are P2 tables -** total. +** The root page numbers of all tables in the database are integers +** stored in P4_INTARRAY argument. ** ** If P5 is not zero, the check is done on the auxiliary database ** file, not the main database file. @@ -75355,37 +87664,31 @@ case OP_DropTrigger: { case OP_IntegrityCk: { int nRoot; /* Number of tables to check. (Number of root pages.) */ int *aRoot; /* Array of rootpage numbers for tables to be checked */ - int j; /* Loop counter */ int nErr; /* Number of errors reported */ char *z; /* Text of the error report */ Mem *pnErr; /* Register keeping track of errors remaining */ assert( p->bIsReader ); nRoot = pOp->p2; + aRoot = pOp->p4.ai; assert( nRoot>0 ); - aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(nRoot+1) ); - if( aRoot==0 ) goto no_mem; - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); + assert( aRoot[0]==nRoot ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pnErr = &aMem[pOp->p3]; assert( (pnErr->flags & MEM_Int)!=0 ); assert( (pnErr->flags & (MEM_Str|MEM_Blob))==0 ); pIn1 = &aMem[pOp->p1]; - for(j=0; j<nRoot; j++){ - aRoot[j] = (int)sqlite3VdbeIntValue(&pIn1[j]); - } - aRoot[j] = 0; assert( pOp->p5<db->nDb ); assert( DbMaskTest(p->btreeMask, pOp->p5) ); - z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, aRoot, nRoot, - (int)pnErr->u.i, &nErr); - sqlite3DbFree(db, aRoot); - pnErr->u.i -= nErr; + z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, + (int)pnErr->u.i+1, &nErr); sqlite3VdbeMemSetNull(pIn1); if( nErr==0 ){ assert( z==0 ); }else if( z==0 ){ goto no_mem; }else{ + pnErr->u.i -= nErr-1; sqlite3VdbeMemSetStr(pIn1, z, -1, SQLITE_UTF8, sqlite3_free); } UPDATE_MAX_BLOBSIZE(pIn1); @@ -75395,9 +87698,9 @@ case OP_IntegrityCk: { #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ /* Opcode: RowSetAdd P1 P2 * * * -** Synopsis: rowset(P1)=r[P2] +** Synopsis: rowset(P1)=r[P2] ** -** Insert the integer value held by register P2 into a boolean index +** Insert the integer value held by register P2 into a RowSet object ** held in register P1. ** ** An assertion fails if P2 is not an integer. @@ -75415,10 +87718,11 @@ case OP_RowSetAdd: { /* in1, in2 */ } /* Opcode: RowSetRead P1 P2 P3 * * -** Synopsis: r[P3]=rowset(P1) +** Synopsis: r[P3]=rowset(P1) ** -** Extract the smallest value from boolean index P1 and put that value into -** register P3. Or, if boolean index P1 is initially empty, leave P3 +** Extract the smallest value from the RowSet object in P1 +** and put that value into register P3. +** Or, if RowSet object P1 is initially empty, leave P3 ** unchanged and jump to instruction P2. */ case OP_RowSetRead: { /* jump, in1, out3 */ @@ -75430,12 +87734,12 @@ case OP_RowSetRead: { /* jump, in1, out3 */ ){ /* The boolean index is empty */ sqlite3VdbeMemSetNull(pIn1); - pc = pOp->p2 - 1; VdbeBranchTaken(1,2); + goto jump_to_p2_and_check_for_interrupt; }else{ /* A value was pulled from the index */ - sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val); VdbeBranchTaken(0,2); + sqlite3VdbeMemSetInt64(&aMem[pOp->p3], val); } goto check_for_interrupt; } @@ -75449,15 +87753,14 @@ case OP_RowSetRead: { /* jump, in1, out3 */ ** integer in P3 into the RowSet and continue on to the ** next opcode. ** -** The RowSet object is optimized for the case where successive sets -** of integers, where each set contains no duplicates. Each set -** of values is identified by a unique P4 value. The first set -** must have P4==0, the final set P4=-1. P4 must be either -1 or -** non-negative. For non-negative values of P4 only the lower 4 -** bits are significant. +** The RowSet object is optimized for the case where sets of integers +** are inserted in distinct phases, which each set contains no duplicates. +** Each set is identified by a unique P4 value. The first set +** must have P4==0, the final set must have P4==-1, and for all other sets +** must have P4>0. ** ** This allows optimizations: (a) when P4==0 there is no need to test -** the rowset object for P3, as it is guaranteed not to contain it, +** the RowSet object for P3, as it is guaranteed not to contain it, ** (b) when P4==-1 there is no need to insert the value, as it will ** never be tested for, and (c) when a value that is part of set X is ** inserted, there is no need to search to see if the same value was @@ -75486,10 +87789,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */ if( iSet ){ exists = sqlite3RowSetTest(pIn1->u.pRowSet, iSet, pIn3->u.i); VdbeBranchTaken(exists!=0,2); - if( exists ){ - pc = pOp->p2 - 1; - break; - } + if( exists ) goto jump_to_p2; } if( iSet>=0 ){ sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i); @@ -75548,8 +87848,8 @@ case OP_Program: { /* jump */ if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){ rc = SQLITE_ERROR; - sqlite3SetString(&p->zErrMsg, db, "too many levels of trigger recursion"); - break; + sqlite3VdbeError(p, "too many levels of trigger recursion"); + goto abort_due_to_error; } /* Register pRt is used to store the memory required to save the state @@ -75563,10 +87863,12 @@ case OP_Program: { /* jump */ ** variable nMem (and later, VdbeFrame.nChildMem) to this value. */ nMem = pProgram->nMem + pProgram->nCsr; + assert( nMem>0 ); + if( pProgram->nCsr==0 ) nMem++; nByte = ROUND8(sizeof(VdbeFrame)) + nMem * sizeof(Mem) - + pProgram->nCsr * sizeof(VdbeCursor *) - + pProgram->nOnce * sizeof(u8); + + pProgram->nCsr * sizeof(VdbeCursor*) + + (pProgram->nOp + 7)/8; pFrame = sqlite3DbMallocZero(db, nByte); if( !pFrame ){ goto no_mem; @@ -75578,7 +87880,7 @@ case OP_Program: { /* jump */ pFrame->v = p; pFrame->nChildMem = nMem; pFrame->nChildCsr = pProgram->nCsr; - pFrame->pc = pc; + pFrame->pc = (int)(pOp - aOp); pFrame->aMem = p->aMem; pFrame->nMem = p->nMem; pFrame->apCsr = p->apCsr; @@ -75586,8 +87888,6 @@ case OP_Program: { /* jump */ pFrame->aOp = p->aOp; pFrame->nOp = p->nOp; pFrame->token = pProgram->token; - pFrame->aOnceFlag = p->aOnceFlag; - pFrame->nOnceFlag = p->nOnceFlag; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS pFrame->anExec = p->anExec; #endif @@ -75599,31 +87899,34 @@ case OP_Program: { /* jump */ } }else{ pFrame = pRt->u.pFrame; - assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem ); + assert( pProgram->nMem+pProgram->nCsr==pFrame->nChildMem + || (pProgram->nCsr==0 && pProgram->nMem+1==pFrame->nChildMem) ); assert( pProgram->nCsr==pFrame->nChildCsr ); - assert( pc==pFrame->pc ); + assert( (int)(pOp - aOp)==pFrame->pc ); } p->nFrame++; pFrame->pParent = p->pFrame; - pFrame->lastRowid = lastRowid; + pFrame->lastRowid = db->lastRowid; pFrame->nChange = p->nChange; pFrame->nDbChange = p->db->nChange; + assert( pFrame->pAuxData==0 ); + pFrame->pAuxData = p->pAuxData; + p->pAuxData = 0; p->nChange = 0; p->pFrame = pFrame; - p->aMem = aMem = &VdbeFrameMem(pFrame)[-1]; + p->aMem = aMem = VdbeFrameMem(pFrame); p->nMem = pFrame->nChildMem; p->nCursor = (u16)pFrame->nChildCsr; - p->apCsr = (VdbeCursor **)&aMem[p->nMem+1]; + p->apCsr = (VdbeCursor **)&aMem[p->nMem]; + pFrame->aOnce = (u8*)&p->apCsr[pProgram->nCsr]; + memset(pFrame->aOnce, 0, (pProgram->nOp + 7)/8); p->aOp = aOp = pProgram->aOp; p->nOp = pProgram->nOp; - p->aOnceFlag = (u8 *)&p->apCsr[p->nCursor]; - p->nOnceFlag = pProgram->nOnce; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS p->anExec = 0; #endif - pc = -1; - memset(p->aOnceFlag, 0, p->nOnceFlag); + pOp = &aOp[-1]; break; } @@ -75640,9 +87943,10 @@ case OP_Program: { /* jump */ ** the value of the P1 argument to the value of the P1 argument to the ** calling OP_Program instruction. */ -case OP_Param: { /* out2-prerelease */ +case OP_Param: { /* out2 */ VdbeFrame *pFrame; Mem *pIn; + pOut = out2Prerelease(p, pOp); pFrame = p->pFrame; pIn = &pFrame->aMem[pOp->p1 + pFrame->aOp[pFrame->pc].p1]; sqlite3VdbeMemShallowCopy(pOut, pIn, MEM_Ephem); @@ -75686,10 +87990,10 @@ case OP_FkCounter: { case OP_FkIfZero: { /* jump */ if( pOp->p1 ){ VdbeBranchTaken(db->nDeferredCons==0 && db->nDeferredImmCons==0, 2); - if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) pc = pOp->p2-1; + if( db->nDeferredCons==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; }else{ VdbeBranchTaken(p->nFkConstraint==0 && db->nDeferredImmCons==0, 2); - if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) pc = pOp->p2-1; + if( p->nFkConstraint==0 && db->nDeferredImmCons==0 ) goto jump_to_p2; } break; } @@ -75726,109 +88030,205 @@ case OP_MemMax: { /* in2 */ } #endif /* SQLITE_OMIT_AUTOINCREMENT */ -/* Opcode: IfPos P1 P2 * * * -** Synopsis: if r[P1]>0 goto P2 +/* Opcode: IfPos P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 ** -** If the value of register P1 is 1 or greater, jump to P2. +** Register P1 must contain an integer. +** If the value of register P1 is 1 or greater, subtract P3 from the +** value in P1 and jump to P2. ** -** It is illegal to use this instruction on a register that does -** not contain an integer. An assertion fault will result if you try. +** If the initial value of register P1 is less than 1, then the +** value is unchanged and control passes through to the next instruction. */ case OP_IfPos: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); VdbeBranchTaken( pIn1->u.i>0, 2); if( pIn1->u.i>0 ){ - pc = pOp->p2 - 1; + pIn1->u.i -= pOp->p3; + goto jump_to_p2; } break; } -/* Opcode: IfNeg P1 P2 P3 * * -** Synopsis: r[P1]+=P3, if r[P1]<0 goto P2 +/* Opcode: OffsetLimit P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) ** -** Register P1 must contain an integer. Add literal P3 to the value in -** register P1 then if the value of register P1 is less than zero, jump to P2. +** This opcode performs a commonly used computation associated with +** LIMIT and OFFSET process. r[P1] holds the limit counter. r[P3] +** holds the offset counter. The opcode computes the combined value +** of the LIMIT and OFFSET and stores that value in r[P2]. The r[P2] +** value computed is the total number of rows that will need to be +** visited in order to complete the query. +** +** If r[P3] is zero or negative, that means there is no OFFSET +** and r[P2] is set to be the value of the LIMIT, r[P1]. +** +** if r[P1] is zero or negative, that means there is no LIMIT +** and r[P2] is set to -1. +** +** Otherwise, r[P2] is set to the sum of r[P1] and r[P3]. */ -case OP_IfNeg: { /* jump, in1 */ +case OP_OffsetLimit: { /* in1, out2, in3 */ + i64 x; + pIn1 = &aMem[pOp->p1]; + pIn3 = &aMem[pOp->p3]; + pOut = out2Prerelease(p, pOp); + assert( pIn1->flags & MEM_Int ); + assert( pIn3->flags & MEM_Int ); + x = pIn1->u.i; + if( x<=0 || sqlite3AddInt64(&x, pIn3->u.i>0?pIn3->u.i:0) ){ + /* If the LIMIT is less than or equal to zero, loop forever. This + ** is documented. But also, if the LIMIT+OFFSET exceeds 2^63 then + ** also loop forever. This is undocumented. In fact, one could argue + ** that the loop should terminate. But assuming 1 billion iterations + ** per second (far exceeding the capabilities of any current hardware) + ** it would take nearly 300 years to actually reach the limit. So + ** looping forever is a reasonable approximation. */ + pOut->u.i = -1; + }else{ + pOut->u.i = x; + } + break; +} + +/* Opcode: IfNotZero P1 P2 * * * +** Synopsis: if r[P1]!=0 then r[P1]--, goto P2 +** +** Register P1 must contain an integer. If the content of register P1 is +** initially greater than zero, then decrement the value in register P1. +** If it is non-zero (negative or positive) and then also jump to P2. +** If register P1 is initially zero, leave it unchanged and fall through. +*/ +case OP_IfNotZero: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); - pIn1->u.i += pOp->p3; VdbeBranchTaken(pIn1->u.i<0, 2); - if( pIn1->u.i<0 ){ - pc = pOp->p2 - 1; + if( pIn1->u.i ){ + if( pIn1->u.i>0 ) pIn1->u.i--; + goto jump_to_p2; } break; } -/* Opcode: IfZero P1 P2 P3 * * -** Synopsis: r[P1]+=P3, if r[P1]==0 goto P2 +/* Opcode: DecrJumpZero P1 P2 * * * +** Synopsis: if (--r[P1])==0 goto P2 ** -** The register P1 must contain an integer. Add literal P3 to the -** value in register P1. If the result is exactly 0, jump to P2. +** Register P1 must hold an integer. Decrement the value in P1 +** and jump to P2 if the new value is exactly zero. */ -case OP_IfZero: { /* jump, in1 */ +case OP_DecrJumpZero: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); - pIn1->u.i += pOp->p3; + if( pIn1->u.i>SMALLEST_INT64 ) pIn1->u.i--; VdbeBranchTaken(pIn1->u.i==0, 2); - if( pIn1->u.i==0 ){ - pc = pOp->p2 - 1; - } + if( pIn1->u.i==0 ) goto jump_to_p2; break; } -/* Opcode: AggStep * P2 P3 P4 P5 + +/* Opcode: AggStep0 * P2 P3 P4 P5 ** Synopsis: accum=r[P3] step(r[P2@P5]) ** ** Execute the step function for an aggregate. The ** function has P5 arguments. P4 is a pointer to the FuncDef -** structure that specifies the function. Use register -** P3 as the accumulator. +** structure that specifies the function. Register P3 is the +** accumulator. ** ** The P5 arguments are taken from register P2 and its ** successors. */ -case OP_AggStep: { +/* Opcode: AggStep * P2 P3 P4 P5 +** Synopsis: accum=r[P3] step(r[P2@P5]) +** +** Execute the step function for an aggregate. The +** function has P5 arguments. P4 is a pointer to an sqlite3_context +** object that is used to run the function. Register P3 is +** as the accumulator. +** +** The P5 arguments are taken from register P2 and its +** successors. +** +** This opcode is initially coded as OP_AggStep0. On first evaluation, +** the FuncDef stored in P4 is converted into an sqlite3_context and +** the opcode is changed. In this way, the initialization of the +** sqlite3_context only happens once, instead of on each call to the +** step function. +*/ +case OP_AggStep0: { int n; - int i; - Mem *pMem; - Mem *pRec; - Mem t; - sqlite3_context ctx; - sqlite3_value **apVal; + sqlite3_context *pCtx; + assert( pOp->p4type==P4_FUNCDEF ); n = pOp->p5; - assert( n>=0 ); - pRec = &aMem[pOp->p2]; - apVal = p->apArg; - assert( apVal || n==0 ); - for(i=0; i<n; i++, pRec++){ - assert( memIsValid(pRec) ); - apVal[i] = pRec; - memAboutToChange(p, pRec); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); + assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n ); + pCtx = sqlite3DbMallocRawNN(db, n*sizeof(sqlite3_value*) + + (sizeof(pCtx[0]) + sizeof(Mem) - sizeof(sqlite3_value*))); + if( pCtx==0 ) goto no_mem; + pCtx->pMem = 0; + pCtx->pOut = (Mem*)&(pCtx->argv[n]); + sqlite3VdbeMemInit(pCtx->pOut, db, MEM_Null); + pCtx->pFunc = pOp->p4.pFunc; + pCtx->iOp = (int)(pOp - aOp); + pCtx->pVdbe = p; + pCtx->skipFlag = 0; + pCtx->isError = 0; + pCtx->argc = n; + pOp->p4type = P4_FUNCCTX; + pOp->p4.pCtx = pCtx; + pOp->opcode = OP_AggStep; + /* Fall through into OP_AggStep */ +} +case OP_AggStep: { + int i; + sqlite3_context *pCtx; + Mem *pMem; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + pMem = &aMem[pOp->p3]; + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + if( pCtx->pMem != pMem ){ + pCtx->pMem = pMem; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; } - ctx.pFunc = pOp->p4.pFunc; - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); - ctx.pMem = pMem = &aMem[pOp->p3]; + +#ifdef SQLITE_DEBUG + for(i=0; i<pCtx->argc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + pMem->n++; - sqlite3VdbeMemInit(&t, db, MEM_Null); - ctx.pOut = &t; - ctx.isError = 0; - ctx.pVdbe = p; - ctx.iOp = pc; - ctx.skipFlag = 0; - (ctx.pFunc->xStep)(&ctx, n, apVal); /* IMP: R-24505-23230 */ - if( ctx.isError ){ - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&t)); - rc = ctx.isError; + assert( pCtx->pOut->flags==MEM_Null ); + assert( pCtx->isError==0 ); + assert( pCtx->skipFlag==0 ); + (pCtx->pFunc->xSFunc)(pCtx,pCtx->argc,pCtx->argv); /* IMP: R-24505-23230 */ + if( pCtx->isError ){ + if( pCtx->isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pCtx->pOut)); + rc = pCtx->isError; + } + if( pCtx->skipFlag ){ + assert( pOp[-1].opcode==OP_CollSeq ); + i = pOp[-1].p1; + if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1); + pCtx->skipFlag = 0; + } + sqlite3VdbeMemRelease(pCtx->pOut); + pCtx->pOut->flags = MEM_Null; + pCtx->isError = 0; + if( rc ) goto abort_due_to_error; } - if( ctx.skipFlag ){ - assert( pOp[-1].opcode==OP_CollSeq ); - i = pOp[-1].p1; - if( i ) sqlite3VdbeMemSetInt64(&aMem[i], 1); - } - sqlite3VdbeMemRelease(&t); + assert( pCtx->pOut->flags==MEM_Null ); + assert( pCtx->skipFlag==0 ); break; } @@ -75847,12 +88247,13 @@ case OP_AggStep: { */ case OP_AggFinal: { Mem *pMem; - assert( pOp->p1>0 && pOp->p1<=(p->nMem-p->nCursor) ); + assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); pMem = &aMem[pOp->p1]; assert( (pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); rc = sqlite3VdbeMemFinalize(pMem, pOp->p4.pFunc); if( rc ){ - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(pMem)); + sqlite3VdbeError(p, "%s", sqlite3_value_text(pMem)); + goto abort_due_to_error; } sqlite3VdbeChangeEncoding(pMem, encoding); UPDATE_MAX_BLOBSIZE(pMem); @@ -75888,7 +88289,8 @@ case OP_Checkpoint: { || pOp->p2==SQLITE_CHECKPOINT_TRUNCATE ); rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &aRes[1], &aRes[2]); - if( rc==SQLITE_BUSY ){ + if( rc ){ + if( rc!=SQLITE_BUSY ) goto abort_due_to_error; rc = SQLITE_OK; aRes[0] = 1; } @@ -75911,7 +88313,7 @@ case OP_Checkpoint: { ** ** Write a string containing the final journal-mode to register P2. */ -case OP_JournalMode: { /* out2-prerelease */ +case OP_JournalMode: { /* out2 */ Btree *pBt; /* Btree to change journal mode of */ Pager *pPager; /* Pager associated with pBt */ int eNew; /* New journal mode */ @@ -75920,6 +88322,7 @@ case OP_JournalMode: { /* out2-prerelease */ const char *zFilename; /* Name of database file for pPager */ #endif + pOut = out2Prerelease(p, pOp); eNew = pOp->p3; assert( eNew==PAGER_JOURNALMODE_DELETE || eNew==PAGER_JOURNALMODE_TRUNCATE @@ -75956,11 +88359,11 @@ case OP_JournalMode: { /* out2-prerelease */ ){ if( !db->autoCommit || db->nVdbeRead>1 ){ rc = SQLITE_ERROR; - sqlite3SetString(&p->zErrMsg, db, + sqlite3VdbeError(p, "cannot change %s wal mode from within a transaction", (eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") ); - break; + goto abort_due_to_error; }else{ if( eOld==PAGER_JOURNALMODE_WAL ){ @@ -75969,7 +88372,7 @@ case OP_JournalMode: { /* out2-prerelease */ ** file. An EXCLUSIVE lock may still be held on the database file ** after a successful return. */ - rc = sqlite3PagerCloseWal(pPager); + rc = sqlite3PagerCloseWal(pPager, db); if( rc==SQLITE_OK ){ sqlite3PagerSetJournalMode(pPager, eNew); } @@ -75990,31 +88393,29 @@ case OP_JournalMode: { /* out2-prerelease */ } #endif /* ifndef SQLITE_OMIT_WAL */ - if( rc ){ - eNew = eOld; - } + if( rc ) eNew = eOld; eNew = sqlite3PagerSetJournalMode(pPager, eNew); - pOut = &aMem[pOp->p2]; pOut->flags = MEM_Str|MEM_Static|MEM_Term; pOut->z = (char *)sqlite3JournalModename(eNew); pOut->n = sqlite3Strlen30(pOut->z); pOut->enc = SQLITE_UTF8; sqlite3VdbeChangeEncoding(pOut, encoding); + if( rc ) goto abort_due_to_error; break; }; #endif /* SQLITE_OMIT_PRAGMA */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) -/* Opcode: Vacuum * * * * * +/* Opcode: Vacuum P1 * * * * ** -** Vacuum the entire database. This opcode will cause other virtual -** machines to be created and run. It may not be called from within -** a transaction. +** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more +** for an attached database. The "temp" database may not be vacuumed. */ case OP_Vacuum: { assert( p->readOnly==0 ); - rc = sqlite3RunVacuum(&p->zErrMsg, db); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1); + if( rc ) goto abort_due_to_error; break; } #endif @@ -76035,9 +88436,10 @@ case OP_IncrVacuum: { /* jump */ pBt = db->aDb[pOp->p1].pBt; rc = sqlite3BtreeIncrVacuum(pBt); VdbeBranchTaken(rc==SQLITE_DONE,2); - if( rc==SQLITE_DONE ){ - pc = pOp->p2 - 1; + if( rc ){ + if( rc!=SQLITE_DONE ) goto abort_due_to_error; rc = SQLITE_OK; + goto jump_to_p2; } break; } @@ -76080,15 +88482,18 @@ case OP_Expire: { */ case OP_TableLock: { u8 isWriteLock = (u8)pOp->p3; - if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommitted) ){ + if( isWriteLock || 0==(db->flags&SQLITE_ReadUncommit) ){ int p1 = pOp->p1; assert( p1>=0 && p1<db->nDb ); assert( DbMaskTest(p->btreeMask, p1) ); assert( isWriteLock==0 || isWriteLock==1 ); rc = sqlite3BtreeLockTable(db->aDb[p1].pBt, pOp->p2, isWriteLock); - if( (rc&0xFF)==SQLITE_LOCKED ){ - const char *z = pOp->p4.z; - sqlite3SetString(&p->zErrMsg, db, "database table is locked: %s", z); + if( rc ){ + if( (rc&0xFF)==SQLITE_LOCKED ){ + const char *z = pOp->p4.z; + sqlite3VdbeError(p, "database table is locked: %s", z); + } + goto abort_due_to_error; } } break; @@ -76110,18 +88515,36 @@ case OP_VBegin: { pVTab = pOp->p4.pVtab; rc = sqlite3VtabBegin(db, pVTab); if( pVTab ) sqlite3VtabImportErrmsg(p, pVTab->pVtab); + if( rc ) goto abort_due_to_error; break; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ #ifndef SQLITE_OMIT_VIRTUALTABLE -/* Opcode: VCreate P1 * * P4 * +/* Opcode: VCreate P1 P2 * * * ** -** P4 is the name of a virtual table in database P1. Call the xCreate method -** for that table. +** P2 is a register that holds the name of a virtual table in database +** P1. Call the xCreate method for that table. */ case OP_VCreate: { - rc = sqlite3VtabCallCreate(db, pOp->p1, pOp->p4.z, &p->zErrMsg); + Mem sMem; /* For storing the record being decoded */ + const char *zTab; /* Name of the virtual table */ + + memset(&sMem, 0, sizeof(sMem)); + sMem.db = db; + /* Because P2 is always a static string, it is impossible for the + ** sqlite3VdbeMemCopy() to fail */ + assert( (aMem[pOp->p2].flags & MEM_Str)!=0 ); + assert( (aMem[pOp->p2].flags & MEM_Static)!=0 ); + rc = sqlite3VdbeMemCopy(&sMem, &aMem[pOp->p2]); + assert( rc==SQLITE_OK ); + zTab = (const char*)sqlite3_value_text(&sMem); + assert( zTab || db->mallocFailed ); + if( zTab ){ + rc = sqlite3VtabCallCreate(db, pOp->p1, zTab, &p->zErrMsg); + } + sqlite3VdbeMemRelease(&sMem); + if( rc ) goto abort_due_to_error; break; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -76133,9 +88556,10 @@ case OP_VCreate: { ** of that table. */ case OP_VDestroy: { - p->inVtabMethod = 2; + db->nVDestroy++; rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); - p->inVtabMethod = 0; + db->nVDestroy--; + if( rc ) goto abort_due_to_error; break; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -76149,30 +88573,35 @@ case OP_VDestroy: { */ case OP_VOpen: { VdbeCursor *pCur; - sqlite3_vtab_cursor *pVtabCursor; + sqlite3_vtab_cursor *pVCur; sqlite3_vtab *pVtab; - sqlite3_module *pModule; + const sqlite3_module *pModule; assert( p->bIsReader ); pCur = 0; - pVtabCursor = 0; + pVCur = 0; pVtab = pOp->p4.pVtab->pVtab; - pModule = (sqlite3_module *)pVtab->pModule; - assert(pVtab && pModule); - rc = pModule->xOpen(pVtab, &pVtabCursor); + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; + rc = pModule->xOpen(pVtab, &pVCur); sqlite3VtabImportErrmsg(p, pVtab); - if( SQLITE_OK==rc ){ - /* Initialize sqlite3_vtab_cursor base class */ - pVtabCursor->pVtab = pVtab; + if( rc ) goto abort_due_to_error; - /* Initialize vdbe cursor object */ - pCur = allocateCursor(p, pOp->p1, 0, -1, 0); - if( pCur ){ - pCur->pVtabCursor = pVtabCursor; - }else{ - db->mallocFailed = 1; - pModule->xClose(pVtabCursor); - } + /* Initialize sqlite3_vtab_cursor base class */ + pVCur->pVtab = pVtab; + + /* Initialize vdbe cursor object */ + pCur = allocateCursor(p, pOp->p1, 0, -1, CURTYPE_VTAB); + if( pCur ){ + pCur->uc.pVCur = pVCur; + pVtab->nRef++; + }else{ + assert( db->mallocFailed ); + pModule->xClose(pVCur); + goto no_mem; } break; } @@ -76204,7 +88633,7 @@ case OP_VFilter: { /* jump */ const sqlite3_module *pModule; Mem *pQuery; Mem *pArgc; - sqlite3_vtab_cursor *pVtabCursor; + sqlite3_vtab_cursor *pVCur; sqlite3_vtab *pVtab; VdbeCursor *pCur; int res; @@ -76216,9 +88645,9 @@ case OP_VFilter: { /* jump */ pCur = p->apCsr[pOp->p1]; assert( memIsValid(pQuery) ); REGISTER_TRACE(pOp->p3, pQuery); - assert( pCur->pVtabCursor ); - pVtabCursor = pCur->pVtabCursor; - pVtab = pVtabCursor->pVtab; + assert( pCur->eCurType==CURTYPE_VTAB ); + pVCur = pCur->uc.pVCur; + pVtab = pVCur->pVtab; pModule = pVtab->pModule; /* Grab the index number and argc parameters */ @@ -76227,38 +88656,35 @@ case OP_VFilter: { /* jump */ iQuery = (int)pQuery->u.i; /* Invoke the xFilter method */ - { - res = 0; - apArg = p->apArg; - for(i = 0; i<nArg; i++){ - apArg[i] = &pArgc[i+1]; - } - - p->inVtabMethod = 1; - rc = pModule->xFilter(pVtabCursor, iQuery, pOp->p4.z, nArg, apArg); - p->inVtabMethod = 0; - sqlite3VtabImportErrmsg(p, pVtab); - if( rc==SQLITE_OK ){ - res = pModule->xEof(pVtabCursor); - } - VdbeBranchTaken(res!=0,2); - if( res ){ - pc = pOp->p2 - 1; - } + res = 0; + apArg = p->apArg; + for(i = 0; i<nArg; i++){ + apArg[i] = &pArgc[i+1]; } + rc = pModule->xFilter(pVCur, iQuery, pOp->p4.z, nArg, apArg); + sqlite3VtabImportErrmsg(p, pVtab); + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pVCur); pCur->nullRow = 0; - + VdbeBranchTaken(res!=0,2); + if( res ) goto jump_to_p2; break; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ #ifndef SQLITE_OMIT_VIRTUALTABLE -/* Opcode: VColumn P1 P2 P3 * * +/* Opcode: VColumn P1 P2 P3 * P5 ** Synopsis: r[P3]=vcolumn(P2) ** -** Store the value of the P2-th column of -** the row of the virtual-table that the -** P1 cursor is pointing to into register P3. +** Store in register P3 the value of the P2-th column of +** the current row of the virtual-table of cursor P1. +** +** If the VColumn opcode is being used to fetch the value of +** an unchanging column during an UPDATE operation, then the P5 +** value is 1. Otherwise, P5 is 0. The P5 value is returned +** by sqlite3_vtab_nochange() routine and can be used +** by virtual table implementations to return special "no-change" +** marks which can be more efficient, depending on the virtual table. */ case OP_VColumn: { sqlite3_vtab *pVtab; @@ -76267,23 +88693,30 @@ case OP_VColumn: { sqlite3_context sContext; VdbeCursor *pCur = p->apCsr[pOp->p1]; - assert( pCur->pVtabCursor ); - assert( pOp->p3>0 && pOp->p3<=(p->nMem-p->nCursor) ); + assert( pCur->eCurType==CURTYPE_VTAB ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pDest = &aMem[pOp->p3]; memAboutToChange(p, pDest); if( pCur->nullRow ){ sqlite3VdbeMemSetNull(pDest); break; } - pVtab = pCur->pVtabCursor->pVtab; + pVtab = pCur->uc.pVCur->pVtab; pModule = pVtab->pModule; assert( pModule->xColumn ); memset(&sContext, 0, sizeof(sContext)); sContext.pOut = pDest; - MemSetTypeFlag(pDest, MEM_Null); - rc = pModule->xColumn(pCur->pVtabCursor, &sContext, pOp->p2); + if( pOp->p5 ){ + sqlite3VdbeMemSetNull(pDest); + pDest->flags = MEM_Null|MEM_Zero; + pDest->u.nZero = 0; + }else{ + MemSetTypeFlag(pDest, MEM_Null); + } + rc = pModule->xColumn(pCur->uc.pVCur, &sContext, pOp->p2); sqlite3VtabImportErrmsg(p, pVtab); - if( sContext.isError ){ + if( sContext.isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pDest)); rc = sContext.isError; } sqlite3VdbeChangeEncoding(pDest, encoding); @@ -76293,6 +88726,7 @@ case OP_VColumn: { if( sqlite3VdbeMemTooBig(pDest) ){ goto too_big; } + if( rc ) goto abort_due_to_error; break; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -76312,11 +88746,11 @@ case OP_VNext: { /* jump */ res = 0; pCur = p->apCsr[pOp->p1]; - assert( pCur->pVtabCursor ); + assert( pCur->eCurType==CURTYPE_VTAB ); if( pCur->nullRow ){ break; } - pVtab = pCur->pVtabCursor->pVtab; + pVtab = pCur->uc.pVCur->pVtab; pModule = pVtab->pModule; assert( pModule->xNext ); @@ -76326,17 +88760,14 @@ case OP_VNext: { /* jump */ ** data is available) and the error code returned when xColumn or ** some other method is next invoked on the save virtual table cursor. */ - p->inVtabMethod = 1; - rc = pModule->xNext(pCur->pVtabCursor); - p->inVtabMethod = 0; + rc = pModule->xNext(pCur->uc.pVCur); sqlite3VtabImportErrmsg(p, pVtab); - if( rc==SQLITE_OK ){ - res = pModule->xEof(pCur->pVtabCursor); - } + if( rc ) goto abort_due_to_error; + res = pModule->xEof(pCur->uc.pVCur); VdbeBranchTaken(!res,2); if( !res ){ /* If there is data, jump to P2 */ - pc = pOp->p2 - 1; + goto jump_to_p2_and_check_for_interrupt; } goto check_for_interrupt; } @@ -76364,11 +88795,11 @@ case OP_VRename: { testcase( pName->enc==SQLITE_UTF16BE ); testcase( pName->enc==SQLITE_UTF16LE ); rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); - if( rc==SQLITE_OK ){ - rc = pVtab->pModule->xRename(pVtab, pName->z); - sqlite3VtabImportErrmsg(p, pVtab); - p->expired = 0; - } + if( rc ) goto abort_due_to_error; + rc = pVtab->pModule->xRename(pVtab, pName->z); + sqlite3VtabImportErrmsg(p, pVtab); + p->expired = 0; + if( rc ) goto abort_due_to_error; break; } #endif @@ -76403,7 +88834,7 @@ case OP_VRename: { */ case OP_VUpdate: { sqlite3_vtab *pVtab; - sqlite3_module *pModule; + const sqlite3_module *pModule; int nArg; int i; sqlite_int64 rowid; @@ -76414,8 +88845,13 @@ case OP_VUpdate: { || pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace ); assert( p->readOnly==0 ); + sqlite3VdbeIncrWriteCounter(p, 0); pVtab = pOp->p4.pVtab->pVtab; - pModule = (sqlite3_module *)pVtab->pModule; + if( pVtab==0 || NEVER(pVtab->pModule==0) ){ + rc = SQLITE_LOCKED; + goto abort_due_to_error; + } + pModule = pVtab->pModule; nArg = pOp->p2; assert( pOp->p4type==P4_VTAB ); if( ALWAYS(pModule->xUpdate) ){ @@ -76434,7 +88870,7 @@ case OP_VUpdate: { sqlite3VtabImportErrmsg(p, pVtab); if( rc==SQLITE_OK && pOp->p1 ){ assert( nArg>1 && apArg[0] && (apArg[0]->flags&MEM_Null) ); - db->lastRowid = lastRowid = rowid; + db->lastRowid = rowid; } if( (rc&0xff)==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ if( pOp->p5==OE_Ignore ){ @@ -76445,6 +88881,7 @@ case OP_VUpdate: { }else{ p->nChange++; } + if( rc ) goto abort_due_to_error; } break; } @@ -76455,7 +88892,8 @@ case OP_VUpdate: { ** ** Write the current number of pages in database P1 to memory cell P2. */ -case OP_Pagecount: { /* out2-prerelease */ +case OP_Pagecount: { /* out2 */ + pOut = out2Prerelease(p, pOp); pOut->u.i = sqlite3BtreeLastPage(db->aDb[pOp->p1].pBt); break; } @@ -76471,10 +88909,11 @@ case OP_Pagecount: { /* out2-prerelease */ ** ** Store the maximum page count after the change in register P2. */ -case OP_MaxPgcnt: { /* out2-prerelease */ +case OP_MaxPgcnt: { /* out2 */ unsigned int newMax; Btree *pBt; + pOut = out2Prerelease(p, pOp); pBt = db->aDb[pOp->p1].pBt; newMax = 0; if( pOp->p3 ){ @@ -76486,9 +88925,132 @@ case OP_MaxPgcnt: { /* out2-prerelease */ } #endif +/* Opcode: Function0 P1 P2 P3 P4 P5 +** Synopsis: r[P3]=func(r[P2@P5]) +** +** Invoke a user function (P4 is a pointer to a FuncDef object that +** defines the function) with P5 arguments taken from register P2 and +** successors. The result of the function is stored in register P3. +** Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** See also: Function, AggStep, AggFinal +*/ +/* Opcode: Function P1 P2 P3 P4 P5 +** Synopsis: r[P3]=func(r[P2@P5]) +** +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with P5 arguments taken +** from register P2 and successors. The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** SQL functions are initially coded as OP_Function0 with P4 pointing +** to a FuncDef object. But on first evaluation, the P4 operand is +** automatically converted into an sqlite3_context object and the operation +** changed to this OP_Function opcode. In this way, the initialization of +** the sqlite3_context object occurs only once, rather than once for each +** evaluation of the function. +** +** See also: Function0, AggStep, AggFinal +*/ +case OP_PureFunc0: +case OP_Function0: { + int n; + sqlite3_context *pCtx; -/* Opcode: Init * P2 * P4 * -** Synopsis: Start at P2 + assert( pOp->p4type==P4_FUNCDEF ); + n = pOp->p5; + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); + assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); + assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+n ); + pCtx = sqlite3DbMallocRawNN(db, sizeof(*pCtx) + (n-1)*sizeof(sqlite3_value*)); + if( pCtx==0 ) goto no_mem; + pCtx->pOut = 0; + pCtx->pFunc = pOp->p4.pFunc; + pCtx->iOp = (int)(pOp - aOp); + pCtx->pVdbe = p; + pCtx->isError = 0; + pCtx->argc = n; + pOp->p4type = P4_FUNCCTX; + pOp->p4.pCtx = pCtx; + assert( OP_PureFunc == OP_PureFunc0+2 ); + assert( OP_Function == OP_Function0+2 ); + pOp->opcode += 2; + /* Fall through into OP_Function */ +} +case OP_PureFunc: +case OP_Function: { + int i; + sqlite3_context *pCtx; + + assert( pOp->p4type==P4_FUNCCTX ); + pCtx = pOp->p4.pCtx; + + /* If this function is inside of a trigger, the register array in aMem[] + ** might change from one evaluation to the next. The next block of code + ** checks to see if the register array has changed, and if so it + ** reinitializes the relavant parts of the sqlite3_context object */ + pOut = &aMem[pOp->p3]; + if( pCtx->pOut != pOut ){ + pCtx->pOut = pOut; + for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; + } + + memAboutToChange(p, pOut); +#ifdef SQLITE_DEBUG + for(i=0; i<pCtx->argc; i++){ + assert( memIsValid(pCtx->argv[i]) ); + REGISTER_TRACE(pOp->p2+i, pCtx->argv[i]); + } +#endif + MemSetTypeFlag(pOut, MEM_Null); + assert( pCtx->isError==0 ); + (*pCtx->pFunc->xSFunc)(pCtx, pCtx->argc, pCtx->argv);/* IMP: R-24505-23230 */ + + /* If the function returned an error, throw an exception */ + if( pCtx->isError ){ + if( pCtx->isError>0 ){ + sqlite3VdbeError(p, "%s", sqlite3_value_text(pOut)); + rc = pCtx->isError; + } + sqlite3VdbeDeleteAuxData(db, &p->pAuxData, pCtx->iOp, pOp->p1); + pCtx->isError = 0; + if( rc ) goto abort_due_to_error; + } + + /* Copy the result of the function into register P3 */ + if( pOut->flags & (MEM_Str|MEM_Blob) ){ + sqlite3VdbeChangeEncoding(pOut, encoding); + if( sqlite3VdbeMemTooBig(pOut) ) goto too_big; + } + + REGISTER_TRACE(pOp->p3, pOut); + UPDATE_MAX_BLOBSIZE(pOut); + break; +} + +/* Opcode: Trace P1 P2 * P4 * +** +** Write P4 on the statement trace output if statement tracing is +** enabled. +** +** Operand P1 must be 0x7fffffff and P2 must positive. +*/ +/* Opcode: Init P1 P2 P3 P4 * +** Synopsis: Start at P2 ** ** Programs contain a single instance of this opcode as the very first ** opcode. @@ -76498,30 +89060,62 @@ case OP_MaxPgcnt: { /* out2-prerelease */ ** Or if P4 is blank, use the string returned by sqlite3_sql(). ** ** If P2 is not zero, jump to instruction P2. +** +** Increment the value of P1 so that OP_Once opcodes will jump the +** first time they are evaluated for this run. +** +** If P3 is not zero, then it is an address to jump to if an SQLITE_CORRUPT +** error is encountered. */ +case OP_Trace: case OP_Init: { /* jump */ - char *zTrace; - char *z; - - if( pOp->p2 ){ - pc = pOp->p2 - 1; - } + int i; #ifndef SQLITE_OMIT_TRACE - if( db->xTrace + char *zTrace; +#endif + + /* If the P4 argument is not NULL, then it must be an SQL comment string. + ** The "--" string is broken up to prevent false-positives with srcck1.c. + ** + ** This assert() provides evidence for: + ** EVIDENCE-OF: R-50676-09860 The callback can compute the same text that + ** would have been returned by the legacy sqlite3_trace() interface by + ** using the X argument when X begins with "--" and invoking + ** sqlite3_expanded_sql(P) otherwise. + */ + assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 ); + + /* OP_Init is always instruction 0 */ + assert( pOp==p->aOp || pOp->opcode==OP_Trace ); + +#ifndef SQLITE_OMIT_TRACE + if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0 && !p->doingRerun && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 ){ - z = sqlite3VdbeExpandSql(p, zTrace); - db->xTrace(db->pTraceArg, z); - sqlite3DbFree(db, z); +#ifndef SQLITE_OMIT_DEPRECATED + if( db->mTrace & SQLITE_TRACE_LEGACY ){ + void (*x)(void*,const char*) = (void(*)(void*,const char*))db->xTrace; + char *z = sqlite3VdbeExpandSql(p, zTrace); + x(db->pTraceArg, z); + sqlite3_free(z); + }else +#endif + if( db->nVdbeExec>1 ){ + char *z = sqlite3MPrintf(db, "-- %s", zTrace); + (void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, p, z); + sqlite3DbFree(db, z); + }else{ + (void)db->xTrace(SQLITE_TRACE_STMT, db->pTraceArg, p, zTrace); + } } #ifdef SQLITE_USE_FCNTL_TRACE zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); if( zTrace ){ - int i; - for(i=0; i<db->nDb; i++){ - if( DbMaskTest(p->btreeMask, i)==0 ) continue; - sqlite3_file_control(db, db->aDb[i].zName, SQLITE_FCNTL_TRACE, zTrace); + int j; + for(j=0; j<db->nDb; j++){ + if( DbMaskTest(p->btreeMask, j)==0 ) continue; + sqlite3_file_control(db, db->aDb[j].zDbSName, SQLITE_FCNTL_TRACE, zTrace); } } #endif /* SQLITE_USE_FCNTL_TRACE */ @@ -76533,9 +89127,57 @@ case OP_Init: { /* jump */ } #endif /* SQLITE_DEBUG */ #endif /* SQLITE_OMIT_TRACE */ - break; + assert( pOp->p2>0 ); + if( pOp->p1>=sqlite3GlobalConfig.iOnceResetThreshold ){ + if( pOp->opcode==OP_Trace ) break; + for(i=1; i<p->nOp; i++){ + if( p->aOp[i].opcode==OP_Once ) p->aOp[i].p1 = 0; + } + pOp->p1 = 0; + } + pOp->p1++; + p->aCounter[SQLITE_STMTSTATUS_RUN]++; + goto jump_to_p2; } +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* Opcode: CursorHint P1 * * P4 * +** +** Provide a hint to cursor P1 that it only needs to return rows that +** satisfy the Expr in P4. TK_REGISTER terms in the P4 expression refer +** to values currently held in registers. TK_COLUMN terms in the P4 +** expression refer to columns in the b-tree to which cursor P1 is pointing. +*/ +case OP_CursorHint: { + VdbeCursor *pC; + + assert( pOp->p1>=0 && pOp->p1<p->nCursor ); + assert( pOp->p4type==P4_EXPR ); + pC = p->apCsr[pOp->p1]; + if( pC ){ + assert( pC->eCurType==CURTYPE_BTREE ); + sqlite3BtreeCursorHint(pC->uc.pCursor, BTREE_HINT_RANGE, + pOp->p4.pExpr, aMem); + } + break; +} +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +#ifdef SQLITE_DEBUG +/* Opcode: Abortable * * * * * +** +** Verify that an Abort can happen. Assert if an Abort at this point +** might cause database corruption. This opcode only appears in debugging +** builds. +** +** An Abort is safe if either there have been no writes, or if there is +** an active statement journal. +*/ +case OP_Abortable: { + sqlite3VdbeAssertAbortable(p); + break; +} +#endif /* Opcode: Noop * * * * * ** @@ -76548,8 +89190,9 @@ case OP_Init: { /* jump */ ** This opcode records information from the optimizer. It is the ** the same as a no-op. This opcodesnever appears in a real VM program. */ -default: { /* This is really OP_Noop and OP_Explain */ +default: { /* This is really OP_Noop, OP_Explain */ assert( pOp->opcode==OP_Noop || pOp->opcode==OP_Explain ); + break; } @@ -76563,9 +89206,9 @@ default: { /* This is really OP_Noop and OP_Explain */ #ifdef VDBE_PROFILE { - u64 endTime = sqlite3Hwtime(); - if( endTime>start ) pOp->cycles += endTime - start; - pOp->cnt++; + u64 endTime = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime(); + if( endTime>start ) pOrigOp->cycles += endTime - start; + pOrigOp->cnt++; } #endif @@ -76575,16 +89218,17 @@ default: { /* This is really OP_Noop and OP_Explain */ ** the evaluator loop. So we can leave it out when NDEBUG is defined. */ #ifndef NDEBUG - assert( pc>=-1 && pc<p->nOp ); + assert( pOp>=&aOp[-1] && pOp<&aOp[p->nOp-1] ); #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ + u8 opProperty = sqlite3OpcodeProperty[pOrigOp->opcode]; if( rc!=0 ) printf("rc=%d\n",rc); - if( pOp->opflags & (OPFLG_OUT2_PRERELEASE|OPFLG_OUT2) ){ - registerTrace(pOp->p2, &aMem[pOp->p2]); + if( opProperty & (OPFLG_OUT2) ){ + registerTrace(pOrigOp->p2, &aMem[pOrigOp->p2]); } - if( pOp->opflags & OPFLG_OUT3 ){ - registerTrace(pOp->p3, &aMem[pOp->p3]); + if( opProperty & OPFLG_OUT3 ){ + registerTrace(pOrigOp->p3, &aMem[pOrigOp->p3]); } } #endif /* SQLITE_DEBUG */ @@ -76594,14 +89238,19 @@ default: { /* This is really OP_Noop and OP_Explain */ /* If we reach this point, it means that execution is finished with ** an error of some kind. */ -vdbe_error_halt: +abort_due_to_error: + if( db->mallocFailed ) rc = SQLITE_NOMEM_BKPT; assert( rc ); + if( p->zErrMsg==0 && rc!=SQLITE_IOERR_NOMEM ){ + sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + } p->rc = rc; + sqlite3SystemError(db, rc); testcase( sqlite3GlobalConfig.xLog!=0 ); sqlite3_log(rc, "statement aborts at %d: [%s] %s", - pc, p->zSql, p->zErrMsg); + (int)(pOp - aOp), p->zSql, p->zErrMsg); sqlite3VdbeHalt(p); - if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1; + if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); rc = SQLITE_ERROR; if( resetSchemaOnFault>0 ){ sqlite3ResetOneSchema(db, resetSchemaOnFault-1); @@ -76611,48 +89260,39 @@ vdbe_error_halt: ** release the mutexes on btrees that were acquired at the ** top. */ vdbe_return: - db->lastRowid = lastRowid; testcase( nVmStep>0 ); p->aCounter[SQLITE_STMTSTATUS_VM_STEP] += (int)nVmStep; sqlite3VdbeLeave(p); + assert( rc!=SQLITE_OK || nExtraDelete==0 + || sqlite3_strlike("DELETE%",p->zSql,0)!=0 + ); return rc; /* Jump to here if a string or blob larger than SQLITE_MAX_LENGTH ** is encountered. */ too_big: - sqlite3SetString(&p->zErrMsg, db, "string or blob too big"); + sqlite3VdbeError(p, "string or blob too big"); rc = SQLITE_TOOBIG; - goto vdbe_error_halt; + goto abort_due_to_error; /* Jump to here if a malloc() fails. */ no_mem: - db->mallocFailed = 1; - sqlite3SetString(&p->zErrMsg, db, "out of memory"); - rc = SQLITE_NOMEM; - goto vdbe_error_halt; - - /* Jump to here for any other kind of fatal error. The "rc" variable - ** should hold the error number. - */ -abort_due_to_error: - assert( p->zErrMsg==0 ); - if( db->mallocFailed ) rc = SQLITE_NOMEM; - if( rc!=SQLITE_IOERR_NOMEM ){ - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc)); - } - goto vdbe_error_halt; + sqlite3OomFault(db); + sqlite3VdbeError(p, "out of memory"); + rc = SQLITE_NOMEM_BKPT; + goto abort_due_to_error; /* Jump to here if the sqlite3_interrupt() API sets the interrupt ** flag. */ abort_due_to_interrupt: assert( db->u1.isInterrupted ); - rc = SQLITE_INTERRUPT; + rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; p->rc = rc; - sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3ErrStr(rc)); - goto vdbe_error_halt; + sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + goto abort_due_to_error; } @@ -76673,6 +89313,8 @@ abort_due_to_interrupt: ** This file contains code used to implement incremental BLOB I/O. */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ #ifndef SQLITE_OMIT_INCRBLOB @@ -76681,13 +89323,14 @@ abort_due_to_interrupt: */ typedef struct Incrblob Incrblob; struct Incrblob { - int flags; /* Copy of "flags" passed to sqlite3_blob_open() */ int nByte; /* Size of open blob, in bytes */ int iOffset; /* Byte offset of blob in cursor data */ - int iCol; /* Table column this handle is open on */ + u16 iCol; /* Table column this handle is open on */ BtCursor *pCsr; /* Cursor pointing at blob row */ sqlite3_stmt *pStmt; /* Statement holding cursor open */ sqlite3 *db; /* The associated database */ + char *zDb; /* Database name */ + Table *pTab; /* Table object */ }; @@ -76713,17 +89356,28 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ char *zErr = 0; /* Error message */ Vdbe *v = (Vdbe *)p->pStmt; - /* Set the value of the SQL statements only variable to integer iRow. - ** This is done directly instead of using sqlite3_bind_int64() to avoid - ** triggering asserts related to mutexes. + /* Set the value of register r[1] in the SQL statement to integer iRow. + ** This is done directly as a performance optimization */ - assert( v->aVar[0].flags&MEM_Int ); - v->aVar[0].u.i = iRow; + v->aMem[1].flags = MEM_Int; + v->aMem[1].u.i = iRow; - rc = sqlite3_step(p->pStmt); + /* If the statement has been run before (and is paused at the OP_ResultRow) + ** then back it up to the point where it does the OP_NotExists. This could + ** have been down with an extra OP_Goto, but simply setting the program + ** counter is faster. */ + if( v->pc>4 ){ + v->pc = 4; + assert( v->aOp[v->pc].opcode==OP_NotExists ); + rc = sqlite3VdbeExec(v); + }else{ + rc = sqlite3_step(p->pStmt); + } if( rc==SQLITE_ROW ){ VdbeCursor *pC = v->apCsr[0]; - u32 type = pC->aType[p->iCol]; + u32 type = pC->nHdrParsed>p->iCol ? pC->aType[p->iCol] : 0; + testcase( pC->nHdrParsed==p->iCol ); + testcase( pC->nHdrParsed==p->iCol+1 ); if( type<12 ){ zErr = sqlite3MPrintf(p->db, "cannot open value of type %s", type==0?"null": type==7?"real": "integer" @@ -76734,7 +89388,7 @@ static int blobSeekToRow(Incrblob *p, sqlite3_int64 iRow, char **pzErr){ }else{ p->iOffset = pC->aType[p->iCol + pC->nField]; p->nByte = sqlite3VdbeSerialTypeLen(type); - p->pCsr = pC->pCursor; + p->pCsr = pC->uc.pCursor; sqlite3BtreeIncrblobCursor(p->pCsr); } } @@ -76768,96 +89422,68 @@ SQLITE_API int sqlite3_blob_open( const char *zTable, /* The table containing the blob */ const char *zColumn, /* The column containing the blob */ sqlite_int64 iRow, /* The row containing the glob */ - int flags, /* True -> read/write access, false -> read-only */ + int wrFlag, /* True -> read/write access, false -> read-only */ sqlite3_blob **ppBlob /* Handle for accessing the blob returned here */ ){ int nAttempt = 0; int iCol; /* Index of zColumn in row-record */ - - /* This VDBE program seeks a btree cursor to the identified - ** db/table/row entry. The reason for using a vdbe program instead - ** of writing code to use the b-tree layer directly is that the - ** vdbe program will take advantage of the various transaction, - ** locking and error handling infrastructure built into the vdbe. - ** - ** After seeking the cursor, the vdbe executes an OP_ResultRow. - ** Code external to the Vdbe then "borrows" the b-tree cursor and - ** uses it to implement the blob_read(), blob_write() and - ** blob_bytes() functions. - ** - ** The sqlite3_blob_close() function finalizes the vdbe program, - ** which closes the b-tree cursor and (possibly) commits the - ** transaction. - */ - static const int iLn = VDBE_OFFSET_LINENO(4); - static const VdbeOpList openBlob[] = { - /* {OP_Transaction, 0, 0, 0}, // 0: Inserted separately */ - {OP_TableLock, 0, 0, 0}, /* 1: Acquire a read or write lock */ - /* One of the following two instructions is replaced by an OP_Noop. */ - {OP_OpenRead, 0, 0, 0}, /* 2: Open cursor 0 for reading */ - {OP_OpenWrite, 0, 0, 0}, /* 3: Open cursor 0 for read/write */ - {OP_Variable, 1, 1, 1}, /* 4: Push the rowid to the stack */ - {OP_NotExists, 0, 10, 1}, /* 5: Seek the cursor */ - {OP_Column, 0, 0, 1}, /* 6 */ - {OP_ResultRow, 1, 0, 0}, /* 7 */ - {OP_Goto, 0, 4, 0}, /* 8 */ - {OP_Close, 0, 0, 0}, /* 9 */ - {OP_Halt, 0, 0, 0}, /* 10 */ - }; - int rc = SQLITE_OK; char *zErr = 0; Table *pTab; - Parse *pParse = 0; Incrblob *pBlob = 0; + Parse sParse; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || ppBlob==0 || zTable==0 ){ + if( ppBlob==0 ){ return SQLITE_MISUSE_BKPT; } #endif - flags = !!flags; /* flags = (flags ? 1 : 0); */ *ppBlob = 0; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTable==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + wrFlag = !!wrFlag; /* wrFlag = (wrFlag ? 1 : 0); */ sqlite3_mutex_enter(db->mutex); pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); - if( !pBlob ) goto blob_open_out; - pParse = sqlite3StackAllocRaw(db, sizeof(*pParse)); - if( !pParse ) goto blob_open_out; - do { - memset(pParse, 0, sizeof(Parse)); - pParse->db = db; + memset(&sParse, 0, sizeof(Parse)); + if( !pBlob ) goto blob_open_out; + sParse.db = db; sqlite3DbFree(db, zErr); zErr = 0; sqlite3BtreeEnterAll(db); - pTab = sqlite3LocateTable(pParse, 0, zTable, zDb); + pTab = sqlite3LocateTable(&sParse, 0, zTable, zDb); if( pTab && IsVirtual(pTab) ){ pTab = 0; - sqlite3ErrorMsg(pParse, "cannot open virtual table: %s", zTable); + sqlite3ErrorMsg(&sParse, "cannot open virtual table: %s", zTable); } if( pTab && !HasRowid(pTab) ){ pTab = 0; - sqlite3ErrorMsg(pParse, "cannot open table without rowid: %s", zTable); + sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable); } #ifndef SQLITE_OMIT_VIEW if( pTab && pTab->pSelect ){ pTab = 0; - sqlite3ErrorMsg(pParse, "cannot open view: %s", zTable); + sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable); } #endif if( !pTab ){ - if( pParse->zErrMsg ){ + if( sParse.zErrMsg ){ sqlite3DbFree(db, zErr); - zErr = pParse->zErrMsg; - pParse->zErrMsg = 0; + zErr = sParse.zErrMsg; + sParse.zErrMsg = 0; } rc = SQLITE_ERROR; sqlite3BtreeLeaveAll(db); goto blob_open_out; } + pBlob->pTab = pTab; + pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName; /* Now search pTab for the exact column. */ for(iCol=0; iCol<pTab->nCol; iCol++) { @@ -76875,9 +89501,8 @@ SQLITE_API int sqlite3_blob_open( /* If the value is being opened for writing, check that the ** column is not indexed, and that it is not part of a foreign key. - ** It is against the rules to open a column to which either of these - ** descriptions applies for writing. */ - if( flags ){ + */ + if( wrFlag ){ const char *zFault = 0; Index *pIdx; #ifndef SQLITE_OMIT_FOREIGN_KEY @@ -76900,7 +89525,8 @@ SQLITE_API int sqlite3_blob_open( for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ int j; for(j=0; j<pIdx->nKeyCol; j++){ - if( pIdx->aiColumn[j]==iCol ){ + /* FIXME: Be smarter about indexes that use expressions */ + if( pIdx->aiColumn[j]==iCol || pIdx->aiColumn[j]==XN_EXPR ){ zFault = "indexed"; } } @@ -76914,63 +89540,93 @@ SQLITE_API int sqlite3_blob_open( } } - pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(pParse); + pBlob->pStmt = (sqlite3_stmt *)sqlite3VdbeCreate(&sParse); assert( pBlob->pStmt || db->mallocFailed ); if( pBlob->pStmt ){ + + /* This VDBE program seeks a btree cursor to the identified + ** db/table/row entry. The reason for using a vdbe program instead + ** of writing code to use the b-tree layer directly is that the + ** vdbe program will take advantage of the various transaction, + ** locking and error handling infrastructure built into the vdbe. + ** + ** After seeking the cursor, the vdbe executes an OP_ResultRow. + ** Code external to the Vdbe then "borrows" the b-tree cursor and + ** uses it to implement the blob_read(), blob_write() and + ** blob_bytes() functions. + ** + ** The sqlite3_blob_close() function finalizes the vdbe program, + ** which closes the b-tree cursor and (possibly) commits the + ** transaction. + */ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList openBlob[] = { + {OP_TableLock, 0, 0, 0}, /* 0: Acquire a read or write lock */ + {OP_OpenRead, 0, 0, 0}, /* 1: Open a cursor */ + /* blobSeekToRow() will initialize r[1] to the desired rowid */ + {OP_NotExists, 0, 5, 1}, /* 2: Seek the cursor to rowid=r[1] */ + {OP_Column, 0, 0, 1}, /* 3 */ + {OP_ResultRow, 1, 0, 0}, /* 4 */ + {OP_Halt, 0, 0, 0}, /* 5 */ + }; Vdbe *v = (Vdbe *)pBlob->pStmt; int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + VdbeOp *aOp; - - sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, flags, + sqlite3VdbeAddOp4Int(v, OP_Transaction, iDb, wrFlag, pTab->pSchema->schema_cookie, pTab->pSchema->iGeneration); - sqlite3VdbeChangeP5(v, 1); - sqlite3VdbeAddOpList(v, ArraySize(openBlob), openBlob, iLn); + sqlite3VdbeChangeP5(v, 1); + assert( sqlite3VdbeCurrentAddr(v)==2 || db->mallocFailed ); + aOp = sqlite3VdbeAddOpList(v, ArraySize(openBlob), openBlob, iLn); /* Make sure a mutex is held on the table to be accessed */ sqlite3VdbeUsesBtree(v, iDb); - /* Configure the OP_TableLock instruction */ + if( db->mallocFailed==0 ){ + assert( aOp!=0 ); + /* Configure the OP_TableLock instruction */ #ifdef SQLITE_OMIT_SHARED_CACHE - sqlite3VdbeChangeToNoop(v, 1); + aOp[0].opcode = OP_Noop; #else - sqlite3VdbeChangeP1(v, 1, iDb); - sqlite3VdbeChangeP2(v, 1, pTab->tnum); - sqlite3VdbeChangeP3(v, 1, flags); - sqlite3VdbeChangeP4(v, 1, pTab->zName, P4_TRANSIENT); + aOp[0].p1 = iDb; + aOp[0].p2 = pTab->tnum; + aOp[0].p3 = wrFlag; + sqlite3VdbeChangeP4(v, 2, pTab->zName, P4_TRANSIENT); + } + if( db->mallocFailed==0 ){ #endif - /* Remove either the OP_OpenWrite or OpenRead. Set the P2 - ** parameter of the other to pTab->tnum. */ - sqlite3VdbeChangeToNoop(v, 3 - flags); - sqlite3VdbeChangeP2(v, 2 + flags, pTab->tnum); - sqlite3VdbeChangeP3(v, 2 + flags, iDb); + /* Remove either the OP_OpenWrite or OpenRead. Set the P2 + ** parameter of the other to pTab->tnum. */ + if( wrFlag ) aOp[1].opcode = OP_OpenWrite; + aOp[1].p2 = pTab->tnum; + aOp[1].p3 = iDb; - /* Configure the number of columns. Configure the cursor to - ** think that the table has one more column than it really - ** does. An OP_Column to retrieve this imaginary column will - ** always return an SQL NULL. This is useful because it means - ** we can invoke OP_Column to fill in the vdbe cursors type - ** and offset cache without causing any IO. - */ - sqlite3VdbeChangeP4(v, 2+flags, SQLITE_INT_TO_PTR(pTab->nCol+1),P4_INT32); - sqlite3VdbeChangeP2(v, 6, pTab->nCol); - if( !db->mallocFailed ){ - pParse->nVar = 1; - pParse->nMem = 1; - pParse->nTab = 1; - sqlite3VdbeMakeReady(v, pParse); + /* Configure the number of columns. Configure the cursor to + ** think that the table has one more column than it really + ** does. An OP_Column to retrieve this imaginary column will + ** always return an SQL NULL. This is useful because it means + ** we can invoke OP_Column to fill in the vdbe cursors type + ** and offset cache without causing any IO. + */ + aOp[1].p4type = P4_INT32; + aOp[1].p4.i = pTab->nCol+1; + aOp[3].p2 = pTab->nCol; + + sParse.nVar = 0; + sParse.nMem = 1; + sParse.nTab = 1; + sqlite3VdbeMakeReady(v, &sParse); } } - pBlob->flags = flags; pBlob->iCol = iCol; pBlob->db = db; sqlite3BtreeLeaveAll(db); if( db->mallocFailed ){ goto blob_open_out; } - sqlite3_bind_int64(pBlob->pStmt, 1, iRow); rc = blobSeekToRow(pBlob, iRow, &zErr); } while( (++nAttempt)<SQLITE_MAX_SCHEMA_RETRY && rc==SQLITE_SCHEMA ); @@ -76983,8 +89639,7 @@ blob_open_out: } sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); sqlite3DbFree(db, zErr); - sqlite3ParserReset(pParse); - sqlite3StackFree(db, pParse); + sqlite3ParserReset(&sParse); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); return rc; @@ -77031,7 +89686,7 @@ static int blobReadWrite( sqlite3_mutex_enter(db->mutex); v = (Vdbe*)p->pStmt; - if( n<0 || iOffset<0 || (iOffset+n)>p->nByte ){ + if( n<0 || iOffset<0 || ((sqlite3_int64)iOffset+n)>p->nByte ){ /* Request is out of range. Return a transient error. */ rc = SQLITE_ERROR; }else if( v==0 ){ @@ -77045,6 +89700,30 @@ static int blobReadWrite( */ assert( db == v->db ); sqlite3BtreeEnterCursor(p->pCsr); + +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( xCall==sqlite3BtreePutData && db->xPreUpdateCallback ){ + /* If a pre-update hook is registered and this is a write cursor, + ** invoke it here. + ** + ** TODO: The preupdate-hook is passed SQLITE_DELETE, even though this + ** operation should really be an SQLITE_UPDATE. This is probably + ** incorrect, but is convenient because at this point the new.* values + ** are not easily obtainable. And for the sessions module, an + ** SQLITE_UPDATE where the PK columns do not change is handled in the + ** same way as an SQLITE_DELETE (the SQLITE_DELETE code is actually + ** slightly more efficient). Since you cannot write to a PK column + ** using the incremental-blob API, this works. For the sessions module + ** anyhow. + */ + sqlite3_int64 iKey; + iKey = sqlite3BtreeIntegerKey(p->pCsr); + sqlite3VdbePreUpdateHook( + v, v->apCsr[0], SQLITE_DELETE, p->zDb, p->pTab, iKey, -1 + ); + } +#endif + rc = xCall(p->pCsr, iOffset+p->iOffset, n, z); sqlite3BtreeLeaveCursor(p->pCsr); if( rc==SQLITE_ABORT ){ @@ -77064,7 +89743,7 @@ static int blobReadWrite( ** Read data from a blob handle. */ SQLITE_API int sqlite3_blob_read(sqlite3_blob *pBlob, void *z, int n, int iOffset){ - return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreeData); + return blobReadWrite(pBlob, z, n, iOffset, sqlite3BtreePayloadChecked); } /* @@ -77266,6 +89945,8 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *pBlob, sqlite3_int64 iRow){ ** thread to merge the output of each of the others to a single PMA for ** the main thread to read from. */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ /* ** If SQLITE_DEBUG_SORTER_THREADS is defined, this module outputs various @@ -77420,6 +90101,7 @@ struct MergeEngine { ** after the thread has finished are not dire. So we don't worry about ** memory barriers and such here. */ +typedef int (*SorterCompare)(SortSubtask*,int*,const void*,int,const void*,int); struct SortSubtask { SQLiteThread *pThread; /* Background thread, if any */ int bDone; /* Set if thread is finished but not joined */ @@ -77427,10 +90109,12 @@ struct SortSubtask { UnpackedRecord *pUnpacked; /* Space to unpack a record */ SorterList list; /* List for thread to write to a PMA */ int nPMA; /* Number of PMAs currently in file */ + SorterCompare xCompare; /* Compare function to use */ SorterFile file; /* Temp file for level-0 PMAs */ SorterFile file2; /* Space for other PMAs */ }; + /* ** Main sorter structure. A single instance of this is allocated for each ** sorter cursor created by the VDBE. @@ -77457,9 +90141,13 @@ struct VdbeSorter { u8 bUseThreads; /* True to use background threads */ u8 iPrev; /* Previous thread used to flush PMA */ u8 nTask; /* Size of aTask[] array */ + u8 typeMask; SortSubtask aTask[1]; /* One or more subtasks */ }; +#define SORTER_TYPE_INTEGER 0x01 +#define SORTER_TYPE_TEXT 0x02 + /* ** An instance of the following object is used to read records out of a ** PMA, in sorted order. The next key to be read is cached in nKey/aKey. @@ -77662,7 +90350,7 @@ static int vdbePmaReadBlob( int nNew = MAX(128, p->nAlloc*2); while( nByte>nNew ) nNew = nNew*2; aNew = sqlite3Realloc(p->aAlloc, nNew); - if( !aNew ) return SQLITE_NOMEM; + if( !aNew ) return SQLITE_NOMEM_BKPT; p->nAlloc = nNew; p->aAlloc = aNew; } @@ -77774,7 +90462,7 @@ static int vdbePmaReaderSeek( int iBuf = pReadr->iReadOff % pgsz; if( pReadr->aBuffer==0 ){ pReadr->aBuffer = (u8*)sqlite3Malloc(pgsz); - if( pReadr->aBuffer==0 ) rc = SQLITE_NOMEM; + if( pReadr->aBuffer==0 ) rc = SQLITE_NOMEM_BKPT; pReadr->nBuffer = pgsz; } if( rc==SQLITE_OK && iBuf ){ @@ -77859,7 +90547,7 @@ static int vdbePmaReaderInit( rc = vdbePmaReaderSeek(pTask, pReadr, pFile, iStart); if( rc==SQLITE_OK ){ - u64 nByte; /* Size of PMA in bytes */ + u64 nByte = 0; /* Size of PMA in bytes */ rc = vdbePmaReadVarint(pReadr, &nByte); pReadr->iEof = pReadr->iReadOff + nByte; *pnByte += nByte; @@ -77871,36 +90559,165 @@ static int vdbePmaReaderInit( return rc; } +/* +** A version of vdbeSorterCompare() that assumes that it has already been +** determined that the first field of key1 is equal to the first field of +** key2. +*/ +static int vdbeSorterCompareTail( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + UnpackedRecord *r2 = pTask->pUnpacked; + if( *pbKey2Cached==0 ){ + sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; + } + return sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, r2, 1); +} /* ** Compare key1 (buffer pKey1, size nKey1 bytes) with key2 (buffer pKey2, ** size nKey2 bytes). Use (pTask->pKeyInfo) for the collation sequences ** used by the comparison. Return the result of the comparison. ** -** Before returning, object (pTask->pUnpacked) is populated with the -** unpacked version of key2. Or, if pKey2 is passed a NULL pointer, then it -** is assumed that the (pTask->pUnpacked) structure already contains the -** unpacked key to use as key2. +** If IN/OUT parameter *pbKey2Cached is true when this function is called, +** it is assumed that (pTask->pUnpacked) contains the unpacked version +** of key2. If it is false, (pTask->pUnpacked) is populated with the unpacked +** version of key2 and *pbKey2Cached set to true before returning. ** ** If an OOM error is encountered, (pTask->pUnpacked->error_rc) is set ** to SQLITE_NOMEM. */ static int vdbeSorterCompare( SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ const void *pKey1, int nKey1, /* Left side of comparison */ const void *pKey2, int nKey2 /* Right side of comparison */ ){ UnpackedRecord *r2 = pTask->pUnpacked; - if( pKey2 ){ + if( !*pbKey2Cached ){ sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); + *pbKey2Cached = 1; } return sqlite3VdbeRecordCompare(nKey1, pKey1, r2); } +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is a TEXT value and that the collation +** sequence to compare them with is BINARY. +*/ +static int vdbeSorterCompareText( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + + int n1; + int n2; + int res; + + getVarint32(&p1[1], n1); + getVarint32(&p2[1], n2); + res = memcmp(v1, v2, (MIN(n1, n2) - 13)/2); + if( res==0 ){ + res = n1 - n2; + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else{ + if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + res = res * -1; + } + } + + return res; +} + +/* +** A specially optimized version of vdbeSorterCompare() that assumes that +** the first field of each key is an INTEGER value. +*/ +static int vdbeSorterCompareInt( + SortSubtask *pTask, /* Subtask context (for pKeyInfo) */ + int *pbKey2Cached, /* True if pTask->pUnpacked is pKey2 */ + const void *pKey1, int nKey1, /* Left side of comparison */ + const void *pKey2, int nKey2 /* Right side of comparison */ +){ + const u8 * const p1 = (const u8 * const)pKey1; + const u8 * const p2 = (const u8 * const)pKey2; + const int s1 = p1[1]; /* Left hand serial type */ + const int s2 = p2[1]; /* Right hand serial type */ + const u8 * const v1 = &p1[ p1[0] ]; /* Pointer to value 1 */ + const u8 * const v2 = &p2[ p2[0] ]; /* Pointer to value 2 */ + int res; /* Return value */ + + assert( (s1>0 && s1<7) || s1==8 || s1==9 ); + assert( (s2>0 && s2<7) || s2==8 || s2==9 ); + + if( s1==s2 ){ + /* The two values have the same sign. Compare using memcmp(). */ + static const u8 aLen[] = {0, 1, 2, 3, 4, 6, 8, 0, 0, 0 }; + const u8 n = aLen[s1]; + int i; + res = 0; + for(i=0; i<n; i++){ + if( (res = v1[i] - v2[i])!=0 ){ + if( ((v1[0] ^ v2[0]) & 0x80)!=0 ){ + res = v1[0] & 0x80 ? -1 : +1; + } + break; + } + } + }else if( s1>7 && s2>7 ){ + res = s1 - s2; + }else{ + if( s2>7 ){ + res = +1; + }else if( s1>7 ){ + res = -1; + }else{ + res = s1 - s2; + } + assert( res!=0 ); + + if( res>0 ){ + if( *v1 & 0x80 ) res = -1; + }else{ + if( *v2 & 0x80 ) res = +1; + } + } + + if( res==0 ){ + if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ + res = vdbeSorterCompareTail( + pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 + ); + } + }else if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + res = res * -1; + } + + return res; +} + /* ** Initialize the temporary index cursor just opened as a sorter cursor. ** -** Usually, the sorter module uses the value of (pCsr->pKeyInfo->nField) +** Usually, the sorter module uses the value of (pCsr->pKeyInfo->nKeyField) ** to determine the number of fields that should be compared from the ** records being sorted. However, if the value passed as argument nField ** is non-zero and the sorter is able to guarantee a stable sort, nField @@ -77923,7 +90740,6 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( ){ int pgsz; /* Page size of main database */ int i; /* Used to iterate through aTask[] */ - int mxCache; /* Cache size */ VdbeSorter *pSorter; /* The new sorter */ KeyInfo *pKeyInfo; /* Copy of pCsr->pKeyInfo with db==0 */ int szKeyInfo; /* Size of pCsr->pKeyInfo in bytes */ @@ -77952,21 +90768,25 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( } #endif - assert( pCsr->pKeyInfo && pCsr->pBt==0 ); - szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nField-1)*sizeof(CollSeq*); + assert( pCsr->pKeyInfo && pCsr->pBtx==0 ); + assert( pCsr->eCurType==CURTYPE_SORTER ); + szKeyInfo = sizeof(KeyInfo) + (pCsr->pKeyInfo->nKeyField-1)*sizeof(CollSeq*); sz = sizeof(VdbeSorter) + nWorker * sizeof(SortSubtask); pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); - pCsr->pSorter = pSorter; + pCsr->uc.pSorter = pSorter; if( pSorter==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ pSorter->pKeyInfo = pKeyInfo = (KeyInfo*)((u8*)pSorter + sz); memcpy(pKeyInfo, pCsr->pKeyInfo, szKeyInfo); pKeyInfo->db = 0; - if( nField && nWorker==0 ) pKeyInfo->nField = nField; + if( nField && nWorker==0 ){ + pKeyInfo->nKeyField = nField; + } pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt); pSorter->nTask = nWorker + 1; + pSorter->iPrev = (u8)(nWorker - 1); pSorter->bUseThreads = (pSorter->nTask>1); pSorter->db = db; for(i=0; i<pSorter->nTask; i++){ @@ -77975,23 +90795,36 @@ SQLITE_PRIVATE int sqlite3VdbeSorterInit( } if( !sqlite3TempInMemory(db) ){ + i64 mxCache; /* Cache size in bytes*/ u32 szPma = sqlite3GlobalConfig.szPma; pSorter->mnPmaSize = szPma * pgsz; - mxCache = db->aDb[0].pSchema->cache_size; - if( mxCache<(int)szPma ) mxCache = (int)szPma; - pSorter->mxPmaSize = MIN((i64)mxCache*pgsz, SQLITE_MAX_PMASZ); - /* EVIDENCE-OF: R-26747-61719 When the application provides any amount of - ** scratch memory using SQLITE_CONFIG_SCRATCH, SQLite avoids unnecessary - ** large heap allocations. - */ - if( sqlite3GlobalConfig.pScratch==0 ){ + mxCache = db->aDb[0].pSchema->cache_size; + if( mxCache<0 ){ + /* A negative cache-size value C indicates that the cache is abs(C) + ** KiB in size. */ + mxCache = mxCache * -1024; + }else{ + mxCache = mxCache * pgsz; + } + mxCache = MIN(mxCache, SQLITE_MAX_PMASZ); + pSorter->mxPmaSize = MAX(pSorter->mnPmaSize, (int)mxCache); + + /* Avoid large memory allocations if the application has requested + ** SQLITE_CONFIG_SMALL_MALLOC. */ + if( sqlite3GlobalConfig.bSmallMalloc==0 ){ assert( pSorter->iMemory==0 ); pSorter->nMemory = pgsz; pSorter->list.aMemory = (u8*)sqlite3Malloc(pgsz); - if( !pSorter->list.aMemory ) rc = SQLITE_NOMEM; + if( !pSorter->list.aMemory ) rc = SQLITE_NOMEM_BKPT; } } + + if( pKeyInfo->nAllField<13 + && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) + ){ + pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; + } } return rc; @@ -78016,30 +90849,24 @@ static void vdbeSorterRecordFree(sqlite3 *db, SorterRecord *pRecord){ */ static void vdbeSortSubtaskCleanup(sqlite3 *db, SortSubtask *pTask){ sqlite3DbFree(db, pTask->pUnpacked); - pTask->pUnpacked = 0; #if SQLITE_MAX_WORKER_THREADS>0 /* pTask->list.aMemory can only be non-zero if it was handed memory ** from the main thread. That only occurs SQLITE_MAX_WORKER_THREADS>0 */ if( pTask->list.aMemory ){ sqlite3_free(pTask->list.aMemory); - pTask->list.aMemory = 0; }else #endif { assert( pTask->list.aMemory==0 ); vdbeSorterRecordFree(0, pTask->list.pList); } - pTask->list.pList = 0; if( pTask->file.pFd ){ sqlite3OsCloseFree(pTask->file.pFd); - pTask->file.pFd = 0; - pTask->file.iEof = 0; } if( pTask->file2.pFd ){ sqlite3OsCloseFree(pTask->file2.pFd); - pTask->file2.pFd = 0; - pTask->file2.iEof = 0; } + memset(pTask, 0, sizeof(SortSubtask)); } #ifdef SQLITE_DEBUG_SORTER_THREADS @@ -78219,6 +91046,7 @@ SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ for(i=0; i<pSorter->nTask; i++){ SortSubtask *pTask = &pSorter->aTask[i]; vdbeSortSubtaskCleanup(db, pTask); + pTask->pSorter = pSorter; } if( pSorter->list.aMemory==0 ){ vdbeSorterRecordFree(0, pSorter->list.pList); @@ -78236,12 +91064,14 @@ SQLITE_PRIVATE void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ ** Free any cursor components allocated by sqlite3VdbeSorterXXX routines. */ SQLITE_PRIVATE void sqlite3VdbeSorterClose(sqlite3 *db, VdbeCursor *pCsr){ - VdbeSorter *pSorter = pCsr->pSorter; + VdbeSorter *pSorter; + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; if( pSorter ){ sqlite3VdbeSorterReset(db, pSorter); sqlite3_free(pSorter->list.aMemory); sqlite3DbFree(db, pSorter); - pCsr->pSorter = 0; + pCsr->uc.pSorter = 0; } } @@ -78280,6 +91110,7 @@ static int vdbeSorterOpenTempFile( sqlite3_file **ppFd ){ int rc; + if( sqlite3FaultSim(202) ) return SQLITE_IOERR_ACCESS; rc = sqlite3OsOpenMalloc(db->pVfs, 0, ppFd, SQLITE_OPEN_TEMP_JOURNAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | @@ -78302,13 +91133,9 @@ static int vdbeSorterOpenTempFile( */ static int vdbeSortAllocUnpacked(SortSubtask *pTask){ if( pTask->pUnpacked==0 ){ - char *pFree; - pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord( - pTask->pSorter->pKeyInfo, 0, 0, &pFree - ); - assert( pTask->pUnpacked==(UnpackedRecord*)pFree ); - if( pFree==0 ) return SQLITE_NOMEM; - pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nField; + pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo); + if( pTask->pUnpacked==0 ) return SQLITE_NOMEM_BKPT; + pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nKeyField; pTask->pUnpacked->errCode = 0; } return SQLITE_OK; @@ -78317,36 +91144,56 @@ static int vdbeSortAllocUnpacked(SortSubtask *pTask){ /* ** Merge the two sorted lists p1 and p2 into a single list. -** Set *ppOut to the head of the new list. */ -static void vdbeSorterMerge( +static SorterRecord *vdbeSorterMerge( SortSubtask *pTask, /* Calling thread context */ SorterRecord *p1, /* First list to merge */ - SorterRecord *p2, /* Second list to merge */ - SorterRecord **ppOut /* OUT: Head of merged list */ + SorterRecord *p2 /* Second list to merge */ ){ SorterRecord *pFinal = 0; SorterRecord **pp = &pFinal; - void *pVal2 = p2 ? SRVAL(p2) : 0; + int bCached = 0; - while( p1 && p2 ){ + assert( p1!=0 && p2!=0 ); + for(;;){ int res; - res = vdbeSorterCompare(pTask, SRVAL(p1), p1->nVal, pVal2, p2->nVal); + res = pTask->xCompare( + pTask, &bCached, SRVAL(p1), p1->nVal, SRVAL(p2), p2->nVal + ); + if( res<=0 ){ *pp = p1; pp = &p1->u.pNext; p1 = p1->u.pNext; - pVal2 = 0; + if( p1==0 ){ + *pp = p2; + break; + } }else{ *pp = p2; - pp = &p2->u.pNext; + pp = &p2->u.pNext; p2 = p2->u.pNext; - if( p2==0 ) break; - pVal2 = SRVAL(p2); + bCached = 0; + if( p2==0 ){ + *pp = p1; + break; + } } } - *pp = p1 ? p1 : p2; - *ppOut = pFinal; + return pFinal; +} + +/* +** Return the SorterCompare function to compare values collected by the +** sorter object passed as the only argument. +*/ +static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ + if( p->typeMask==SORTER_TYPE_INTEGER ){ + return vdbeSorterCompareInt; + }else if( p->typeMask==SORTER_TYPE_TEXT ){ + return vdbeSorterCompareText; + } + return vdbeSorterCompare; } /* @@ -78363,12 +91210,14 @@ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ rc = vdbeSortAllocUnpacked(pTask); if( rc!=SQLITE_OK ) return rc; + p = pList->pList; + pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter); + aSlot = (SorterRecord **)sqlite3MallocZero(64 * sizeof(SorterRecord *)); if( !aSlot ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } - p = pList->pList; while( p ){ SorterRecord *pNext; if( pList->aMemory ){ @@ -78384,7 +91233,7 @@ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ p->u.pNext = 0; for(i=0; aSlot[i]; i++){ - vdbeSorterMerge(pTask, p, aSlot[i], &p); + p = vdbeSorterMerge(pTask, p, aSlot[i]); aSlot[i] = 0; } aSlot[i] = p; @@ -78393,7 +91242,8 @@ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ p = 0; for(i=0; i<64; i++){ - vdbeSorterMerge(pTask, p, aSlot[i], &p); + if( aSlot[i]==0 ) continue; + p = p ? vdbeSorterMerge(pTask, p, aSlot[i]) : aSlot[i]; } pList->pList = p; @@ -78416,7 +91266,7 @@ static void vdbePmaWriterInit( memset(p, 0, sizeof(PmaWriter)); p->aBuffer = (u8*)sqlite3Malloc(nBuf); if( !p->aBuffer ){ - p->eFWErr = SQLITE_NOMEM; + p->eFWErr = SQLITE_NOMEM_BKPT; }else{ p->iBufEnd = p->iBufStart = (iStart % nBuf); p->iWriteOff = iStart - p->iBufStart; @@ -78582,13 +91432,12 @@ static int vdbeMergeEngineStep( int i; /* Index of aTree[] to recalculate */ PmaReader *pReadr1; /* First PmaReader to compare */ PmaReader *pReadr2; /* Second PmaReader to compare */ - u8 *pKey2; /* To pReadr2->aKey, or 0 if record cached */ + int bCached = 0; /* Find the first two PmaReaders to compare. The one that was just ** advanced (iPrev) and the one next to it in the array. */ pReadr1 = &pMerger->aReadr[(iPrev & 0xFFFE)]; pReadr2 = &pMerger->aReadr[(iPrev | 0x0001)]; - pKey2 = pReadr2->aKey; for(i=(pMerger->nTree+iPrev)/2; i>0; i=i/2){ /* Compare pReadr1 and pReadr2. Store the result in variable iRes. */ @@ -78598,8 +91447,8 @@ static int vdbeMergeEngineStep( }else if( pReadr2->pFd==0 ){ iRes = -1; }else{ - iRes = vdbeSorterCompare(pTask, - pReadr1->aKey, pReadr1->nKey, pKey2, pReadr2->nKey + iRes = pTask->xCompare(pTask, &bCached, + pReadr1->aKey, pReadr1->nKey, pReadr2->aKey, pReadr2->nKey ); } @@ -78621,9 +91470,9 @@ static int vdbeMergeEngineStep( if( iRes<0 || (iRes==0 && pReadr1<pReadr2) ){ pMerger->aTree[i] = (int)(pReadr1 - pMerger->aReadr); pReadr2 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; - pKey2 = pReadr2->aKey; + bCached = 0; }else{ - if( pReadr1->pFd ) pKey2 = 0; + if( pReadr1->pFd ) bCached = 0; pMerger->aTree[i] = (int)(pReadr2 - pMerger->aReadr); pReadr1 = &pMerger->aReadr[ pMerger->aTree[i ^ 0x0001] ]; } @@ -78705,7 +91554,7 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ pSorter->nMemory = sqlite3MallocSize(aMem); }else if( pSorter->list.aMemory ){ pSorter->list.aMemory = sqlite3Malloc(pSorter->nMemory); - if( !pSorter->list.aMemory ) return SQLITE_NOMEM; + if( !pSorter->list.aMemory ) return SQLITE_NOMEM_BKPT; } rc = vdbeSorterCreateThread(pTask, vdbeSorterFlushThread, pCtx); @@ -78723,13 +91572,24 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( const VdbeCursor *pCsr, /* Sorter cursor */ Mem *pVal /* Memory cell containing record */ ){ - VdbeSorter *pSorter = pCsr->pSorter; + VdbeSorter *pSorter; int rc = SQLITE_OK; /* Return Code */ SorterRecord *pNew; /* New list element */ - int bFlush; /* True to flush contents of memory to PMA */ int nReq; /* Bytes of memory required */ int nPMA; /* Bytes of PMA space required */ + int t; /* serial type of first record field */ + + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + getVarint32((const u8*)&pVal->z[1], t); + if( t>0 && t<10 && t!=7 ){ + pSorter->typeMask &= SORTER_TYPE_INTEGER; + }else if( t>10 && (t & 0x01) ){ + pSorter->typeMask &= SORTER_TYPE_TEXT; + }else{ + pSorter->typeMask = 0; + } assert( pSorter ); @@ -78778,27 +91638,28 @@ SQLITE_PRIVATE int sqlite3VdbeSorterWrite( if( nMin>pSorter->nMemory ){ u8 *aNew; + int iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; int nNew = pSorter->nMemory * 2; while( nNew < nMin ) nNew = nNew*2; if( nNew > pSorter->mxPmaSize ) nNew = pSorter->mxPmaSize; if( nNew < nMin ) nNew = nMin; aNew = sqlite3Realloc(pSorter->list.aMemory, nNew); - if( !aNew ) return SQLITE_NOMEM; - pSorter->list.pList = (SorterRecord*)( - aNew + ((u8*)pSorter->list.pList - pSorter->list.aMemory) - ); + if( !aNew ) return SQLITE_NOMEM_BKPT; + pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; pSorter->list.aMemory = aNew; pSorter->nMemory = nNew; } pNew = (SorterRecord*)&pSorter->list.aMemory[pSorter->iMemory]; pSorter->iMemory += ROUND8(nReq); - pNew->u.iNext = (int)((u8*)(pSorter->list.pList) - pSorter->list.aMemory); + if( pSorter->list.pList ){ + pNew->u.iNext = (int)((u8*)(pSorter->list.pList) - pSorter->list.aMemory); + } }else{ pNew = (SorterRecord *)sqlite3Malloc(nReq); if( pNew==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pNew->u.pNext = pSorter->list.pList; } @@ -78945,7 +91806,7 @@ static int vdbeIncrMergerNew( pTask->file2.iEof += pIncr->mxSz; }else{ vdbeMergeEngineFree(pMerger); - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } return rc; } @@ -78995,10 +91856,12 @@ static void vdbeMergeEngineCompare( }else if( p2->pFd==0 ){ iRes = i1; }else{ + SortSubtask *pTask = pMerger->pTask; + int bCached = 0; int res; - assert( pMerger->pTask->pUnpacked!=0 ); /* from vdbeSortSubtaskMain() */ - res = vdbeSorterCompare( - pMerger->pTask, p1->aKey, p1->nKey, p2->aKey, p2->nKey + assert( pTask->pUnpacked!=0 ); /* from vdbeSortSubtaskMain() */ + res = pTask->xCompare( + pTask, &bCached, p1->aKey, p1->nKey, p2->aKey, p2->nKey ); if( res<=0 ){ iRes = i1; @@ -79022,11 +91885,12 @@ static void vdbeMergeEngineCompare( #define INCRINIT_TASK 1 #define INCRINIT_ROOT 2 -/* Forward reference. -** The vdbeIncrMergeInit() and vdbePmaReaderIncrMergeInit() routines call each -** other (when building a merge tree). +/* +** Forward reference required as the vdbeIncrMergeInit() and +** vdbePmaReaderIncrInit() routines are called mutually recursively when +** building a merge tree. */ -static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode); +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode); /* ** Initialize the MergeEngine object passed as the second argument. Once this @@ -79073,7 +91937,7 @@ static int vdbeMergeEngineInit( ** better advantage of multi-processor hardware. */ rc = vdbePmaReaderNext(&pMerger->aReadr[nTree-i-1]); }else{ - rc = vdbePmaReaderIncrMergeInit(&pMerger->aReadr[i], INCRINIT_NORMAL); + rc = vdbePmaReaderIncrInit(&pMerger->aReadr[i], INCRINIT_NORMAL); } if( rc!=SQLITE_OK ) return rc; } @@ -79085,17 +91949,15 @@ static int vdbeMergeEngineInit( } /* -** Initialize the IncrMerge field of a PmaReader. -** -** If the PmaReader passed as the first argument is not an incremental-reader -** (if pReadr->pIncr==0), then this function is a no-op. Otherwise, it serves -** to open and/or initialize the temp file related fields of the IncrMerge +** The PmaReader passed as the first argument is guaranteed to be an +** incremental-reader (pReadr->pIncr!=0). This function serves to open +** and/or initialize the temp file related fields of the IncrMerge ** object at (pReadr->pIncr). ** ** If argument eMode is set to INCRINIT_NORMAL, then all PmaReaders -** in the sub-tree headed by pReadr are also initialized. Data is then loaded -** into the buffers belonging to pReadr and it is set to -** point to the first key in its range. +** in the sub-tree headed by pReadr are also initialized. Data is then +** loaded into the buffers belonging to pReadr and it is set to point to +** the first key in its range. ** ** If argument eMode is set to INCRINIT_TASK, then pReadr is guaranteed ** to be a multi-threaded PmaReader and this function is being called in a @@ -79122,59 +91984,62 @@ static int vdbeMergeEngineInit( static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ int rc = SQLITE_OK; IncrMerger *pIncr = pReadr->pIncr; + SortSubtask *pTask = pIncr->pTask; + sqlite3 *db = pTask->pSorter->db; /* eMode is always INCRINIT_NORMAL in single-threaded mode */ assert( SQLITE_MAX_WORKER_THREADS>0 || eMode==INCRINIT_NORMAL ); - if( pIncr ){ - SortSubtask *pTask = pIncr->pTask; - sqlite3 *db = pTask->pSorter->db; + rc = vdbeMergeEngineInit(pTask, pIncr->pMerger, eMode); - rc = vdbeMergeEngineInit(pTask, pIncr->pMerger, eMode); - - /* Set up the required files for pIncr. A multi-theaded IncrMerge object - ** requires two temp files to itself, whereas a single-threaded object - ** only requires a region of pTask->file2. */ - if( rc==SQLITE_OK ){ - int mxSz = pIncr->mxSz; + /* Set up the required files for pIncr. A multi-theaded IncrMerge object + ** requires two temp files to itself, whereas a single-threaded object + ** only requires a region of pTask->file2. */ + if( rc==SQLITE_OK ){ + int mxSz = pIncr->mxSz; #if SQLITE_MAX_WORKER_THREADS>0 - if( pIncr->bUseThread ){ - rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[0].pFd); - if( rc==SQLITE_OK ){ - rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[1].pFd); - } - }else + if( pIncr->bUseThread ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[0].pFd); + if( rc==SQLITE_OK ){ + rc = vdbeSorterOpenTempFile(db, mxSz, &pIncr->aFile[1].pFd); + } + }else #endif - /*if( !pIncr->bUseThread )*/{ - if( pTask->file2.pFd==0 ){ - assert( pTask->file2.iEof>0 ); - rc = vdbeSorterOpenTempFile(db, pTask->file2.iEof, &pTask->file2.pFd); - pTask->file2.iEof = 0; - } - if( rc==SQLITE_OK ){ - pIncr->aFile[1].pFd = pTask->file2.pFd; - pIncr->iStartOff = pTask->file2.iEof; - pTask->file2.iEof += mxSz; - } + /*if( !pIncr->bUseThread )*/{ + if( pTask->file2.pFd==0 ){ + assert( pTask->file2.iEof>0 ); + rc = vdbeSorterOpenTempFile(db, pTask->file2.iEof, &pTask->file2.pFd); + pTask->file2.iEof = 0; + } + if( rc==SQLITE_OK ){ + pIncr->aFile[1].pFd = pTask->file2.pFd; + pIncr->iStartOff = pTask->file2.iEof; + pTask->file2.iEof += mxSz; } } + } #if SQLITE_MAX_WORKER_THREADS>0 - if( rc==SQLITE_OK && pIncr->bUseThread ){ - /* Use the current thread to populate aFile[1], even though this - ** PmaReader is multi-threaded. The reason being that this function - ** is already running in background thread pIncr->pTask->thread. */ - assert( eMode==INCRINIT_ROOT || eMode==INCRINIT_TASK ); - rc = vdbeIncrPopulate(pIncr); - } + if( rc==SQLITE_OK && pIncr->bUseThread ){ + /* Use the current thread to populate aFile[1], even though this + ** PmaReader is multi-threaded. If this is an INCRINIT_TASK object, + ** then this function is already running in background thread + ** pIncr->pTask->thread. + ** + ** If this is the INCRINIT_ROOT object, then it is running in the + ** main VDBE thread. But that is Ok, as that thread cannot return + ** control to the VDBE or proceed with anything useful until the + ** first results are ready from this merger object anyway. + */ + assert( eMode==INCRINIT_ROOT || eMode==INCRINIT_TASK ); + rc = vdbeIncrPopulate(pIncr); + } #endif - if( rc==SQLITE_OK - && (SQLITE_MAX_WORKER_THREADS==0 || eMode!=INCRINIT_TASK) - ){ - rc = vdbePmaReaderNext(pReadr); - } + if( rc==SQLITE_OK && (SQLITE_MAX_WORKER_THREADS==0 || eMode!=INCRINIT_TASK) ){ + rc = vdbePmaReaderNext(pReadr); } + return rc; } @@ -79183,7 +92048,7 @@ static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){ ** The main routine for vdbePmaReaderIncrMergeInit() operations run in ** background threads. */ -static void *vdbePmaReaderBgInit(void *pCtx){ +static void *vdbePmaReaderBgIncrInit(void *pCtx){ PmaReader *pReader = (PmaReader*)pCtx; void *pRet = SQLITE_INT_TO_PTR( vdbePmaReaderIncrMergeInit(pReader,INCRINIT_TASK) @@ -79191,20 +92056,36 @@ static void *vdbePmaReaderBgInit(void *pCtx){ pReader->pIncr->pTask->bDone = 1; return pRet; } +#endif /* -** Use a background thread to invoke vdbePmaReaderIncrMergeInit(INCRINIT_TASK) -** on the PmaReader object passed as the first argument. -** -** This call will initialize the various fields of the pReadr->pIncr -** structure and, if it is a multi-threaded IncrMerger, launch a -** background thread to populate aFile[1]. +** If the PmaReader passed as the first argument is not an incremental-reader +** (if pReadr->pIncr==0), then this function is a no-op. Otherwise, it invokes +** the vdbePmaReaderIncrMergeInit() function with the parameters passed to +** this routine to initialize the incremental merge. +** +** If the IncrMerger object is multi-threaded (IncrMerger.bUseThread==1), +** then a background thread is launched to call vdbePmaReaderIncrMergeInit(). +** Or, if the IncrMerger is single threaded, the same function is called +** using the current thread. */ -static int vdbePmaReaderBgIncrInit(PmaReader *pReadr){ - void *pCtx = (void*)pReadr; - return vdbeSorterCreateThread(pReadr->pIncr->pTask, vdbePmaReaderBgInit, pCtx); -} +static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){ + IncrMerger *pIncr = pReadr->pIncr; /* Incremental merger */ + int rc = SQLITE_OK; /* Return code */ + if( pIncr ){ +#if SQLITE_MAX_WORKER_THREADS>0 + assert( pIncr->bUseThread==0 || eMode==INCRINIT_TASK ); + if( pIncr->bUseThread ){ + void *pCtx = (void*)pReadr; + rc = vdbeSorterCreateThread(pIncr->pTask, vdbePmaReaderBgIncrInit, pCtx); + }else #endif + { + rc = vdbePmaReaderIncrMergeInit(pReadr, eMode); + } + } + return rc; +} /* ** Allocate a new MergeEngine object to merge the contents of nPMA level-0 @@ -79230,10 +92111,10 @@ static int vdbeMergeEngineLevel0( int rc = SQLITE_OK; *ppOut = pNew = vdbeMergeEngineNew(nPMA); - if( pNew==0 ) rc = SQLITE_NOMEM; + if( pNew==0 ) rc = SQLITE_NOMEM_BKPT; for(i=0; i<nPMA && rc==SQLITE_OK; i++){ - i64 nDummy; + i64 nDummy = 0; PmaReader *pReadr = &pNew->aReadr[i]; rc = vdbePmaReaderInit(pTask, &pTask->file, iOff, pReadr, &nDummy); iOff = pReadr->iEof; @@ -79301,7 +92182,7 @@ static int vdbeSorterAddToTree( if( pReadr->pIncr==0 ){ MergeEngine *pNew = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); if( pNew==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ rc = vdbeIncrMergerNew(pTask, pNew, &pReadr->pIncr); } @@ -79346,7 +92227,7 @@ static int vdbeSorterMergeTreeBuild( assert( pSorter->bUseThreads || pSorter->nTask==1 ); if( pSorter->nTask>1 ){ pMain = vdbeMergeEngineNew(pSorter->nTask); - if( pMain==0 ) rc = SQLITE_NOMEM; + if( pMain==0 ) rc = SQLITE_NOMEM_BKPT; } #endif @@ -79364,7 +92245,7 @@ static int vdbeSorterMergeTreeBuild( int i; int iSeq = 0; pRoot = vdbeMergeEngineNew(SORTER_MAX_MERGE_COUNT); - if( pRoot==0 ) rc = SQLITE_NOMEM; + if( pRoot==0 ) rc = SQLITE_NOMEM_BKPT; for(i=0; i<pTask->nPMA && rc==SQLITE_OK; i += SORTER_MAX_MERGE_COUNT){ MergeEngine *pMerger = 0; /* New level-0 PMA merger */ int nReader; /* Number of level-0 PMAs to merge */ @@ -79416,6 +92297,11 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ MergeEngine *pMain = 0; #if SQLITE_MAX_WORKER_THREADS sqlite3 *db = pTask0->pSorter->db; + int i; + SorterCompare xCompare = vdbeSorterGetCompare(pSorter); + for(i=0; i<pSorter->nTask; i++){ + pSorter->aTask[i].xCompare = xCompare; + } #endif rc = vdbeSorterMergeTreeBuild(pSorter, &pMain); @@ -79430,7 +92316,7 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ if( rc==SQLITE_OK ){ pReadr = (PmaReader*)sqlite3DbMallocZero(db, sizeof(PmaReader)); pSorter->pReader = pReadr; - if( pReadr==0 ) rc = SQLITE_NOMEM; + if( pReadr==0 ) rc = SQLITE_NOMEM_BKPT; } if( rc==SQLITE_OK ){ rc = vdbeIncrMergerNew(pLast, pMain, &pReadr->pIncr); @@ -79444,15 +92330,21 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ } } for(iTask=0; rc==SQLITE_OK && iTask<pSorter->nTask; iTask++){ + /* Check that: + ** + ** a) The incremental merge object is configured to use the + ** right task, and + ** b) If it is using task (nTask-1), it is configured to run + ** in single-threaded mode. This is important, as the + ** root merge (INCRINIT_ROOT) will be using the same task + ** object. + */ PmaReader *p = &pMain->aReadr[iTask]; - assert( p->pIncr==0 || p->pIncr->pTask==&pSorter->aTask[iTask] ); - if( p->pIncr ){ - if( iTask==pSorter->nTask-1 ){ - rc = vdbePmaReaderIncrMergeInit(p, INCRINIT_TASK); - }else{ - rc = vdbePmaReaderBgIncrInit(p); - } - } + assert( p->pIncr==0 || ( + (p->pIncr->pTask==&pSorter->aTask[iTask]) /* a */ + && (iTask!=pSorter->nTask-1 || p->pIncr->bUseThread==0) /* b */ + )); + rc = vdbePmaReaderIncrInit(p, INCRINIT_TASK); } } pMain = 0; @@ -79482,9 +92374,11 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ ** in sorted order. */ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ - VdbeSorter *pSorter = pCsr->pSorter; + VdbeSorter *pSorter; int rc = SQLITE_OK; /* Return code */ + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; assert( pSorter ); /* If no data has been written to disk, then do not do so now. Instead, @@ -79525,12 +92419,18 @@ SQLITE_PRIVATE int sqlite3VdbeSorterRewind(const VdbeCursor *pCsr, int *pbEof){ } /* -** Advance to the next element in the sorter. +** Advance to the next element in the sorter. Return value: +** +** SQLITE_OK success +** SQLITE_DONE end of data +** otherwise some kind of error. */ -SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr, int *pbEof){ - VdbeSorter *pSorter = pCsr->pSorter; +SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr){ + VdbeSorter *pSorter; int rc; /* Return code */ + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; assert( pSorter->bUsePMA || (pSorter->pReader==0 && pSorter->pMerger==0) ); if( pSorter->bUsePMA ){ assert( pSorter->pReader==0 || pSorter->pMerger==0 ); @@ -79539,21 +92439,22 @@ SQLITE_PRIVATE int sqlite3VdbeSorterNext(sqlite3 *db, const VdbeCursor *pCsr, in #if SQLITE_MAX_WORKER_THREADS>0 if( pSorter->bUseThreads ){ rc = vdbePmaReaderNext(pSorter->pReader); - *pbEof = (pSorter->pReader->pFd==0); + if( rc==SQLITE_OK && pSorter->pReader->pFd==0 ) rc = SQLITE_DONE; }else #endif /*if( !pSorter->bUseThreads )*/ { + int res = 0; assert( pSorter->pMerger!=0 ); assert( pSorter->pMerger->pTask==(&pSorter->aTask[0]) ); - rc = vdbeMergeEngineStep(pSorter->pMerger, pbEof); + rc = vdbeMergeEngineStep(pSorter->pMerger, &res); + if( rc==SQLITE_OK && res ) rc = SQLITE_DONE; } }else{ SorterRecord *pFree = pSorter->list.pList; pSorter->list.pList = pFree->u.pNext; pFree->u.pNext = 0; if( pSorter->list.aMemory==0 ) vdbeSorterRecordFree(db, pFree); - *pbEof = !pSorter->list.pList; - rc = SQLITE_OK; + rc = pSorter->list.pList ? SQLITE_OK : SQLITE_DONE; } return rc; } @@ -79590,12 +92491,14 @@ static void *vdbeSorterRowkey( ** Copy the current sorter key into the memory cell pOut. */ SQLITE_PRIVATE int sqlite3VdbeSorterRowkey(const VdbeCursor *pCsr, Mem *pOut){ - VdbeSorter *pSorter = pCsr->pSorter; + VdbeSorter *pSorter; void *pKey; int nKey; /* Sorter key to copy into pOut */ + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; pKey = vdbeSorterRowkey(pSorter, &nKey); if( sqlite3VdbeMemClearAndResize(pOut, nKey) ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pOut->n = nKey; MemSetTypeFlag(pOut, MEM_Blob); @@ -79626,17 +92529,19 @@ SQLITE_PRIVATE int sqlite3VdbeSorterCompare( int nKeyCol, /* Compare this many columns */ int *pRes /* OUT: Result of comparison */ ){ - VdbeSorter *pSorter = pCsr->pSorter; - UnpackedRecord *r2 = pSorter->pUnpacked; - KeyInfo *pKeyInfo = pCsr->pKeyInfo; + VdbeSorter *pSorter; + UnpackedRecord *r2; + KeyInfo *pKeyInfo; int i; void *pKey; int nKey; /* Sorter key to compare pVal with */ + assert( pCsr->eCurType==CURTYPE_SORTER ); + pSorter = pCsr->uc.pSorter; + r2 = pSorter->pUnpacked; + pKeyInfo = pCsr->pKeyInfo; if( r2==0 ){ - char *p; - r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo,0,0,&p); - assert( pSorter->pUnpacked==(UnpackedRecord*)p ); - if( r2==0 ) return SQLITE_NOMEM; + r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); + if( r2==0 ) return SQLITE_NOMEM_BKPT; r2->nField = nKeyCol; } assert( r2->nField==nKeyCol ); @@ -79655,264 +92560,6 @@ SQLITE_PRIVATE int sqlite3VdbeSorterCompare( } /************** End of vdbesort.c ********************************************/ -/************** Begin file journal.c *****************************************/ -/* -** 2007 August 22 -** -** The author disclaims copyright to this source code. In place of -** a legal notice, here is a blessing: -** -** May you do good and not evil. -** May you find forgiveness for yourself and forgive others. -** May you share freely, never taking more than you give. -** -************************************************************************* -** -** This file implements a special kind of sqlite3_file object used -** by SQLite to create journal files if the atomic-write optimization -** is enabled. -** -** The distinctive characteristic of this sqlite3_file is that the -** actual on disk file is created lazily. When the file is created, -** the caller specifies a buffer size for an in-memory buffer to -** be used to service read() and write() requests. The actual file -** on disk is not created or populated until either: -** -** 1) The in-memory representation grows too large for the allocated -** buffer, or -** 2) The sqlite3JournalCreate() function is called. -*/ -#ifdef SQLITE_ENABLE_ATOMIC_WRITE - - -/* -** A JournalFile object is a subclass of sqlite3_file used by -** as an open file handle for journal files. -*/ -struct JournalFile { - sqlite3_io_methods *pMethod; /* I/O methods on journal files */ - int nBuf; /* Size of zBuf[] in bytes */ - char *zBuf; /* Space to buffer journal writes */ - int iSize; /* Amount of zBuf[] currently used */ - int flags; /* xOpen flags */ - sqlite3_vfs *pVfs; /* The "real" underlying VFS */ - sqlite3_file *pReal; /* The "real" underlying file descriptor */ - const char *zJournal; /* Name of the journal file */ -}; -typedef struct JournalFile JournalFile; - -/* -** If it does not already exists, create and populate the on-disk file -** for JournalFile p. -*/ -static int createFile(JournalFile *p){ - int rc = SQLITE_OK; - if( !p->pReal ){ - sqlite3_file *pReal = (sqlite3_file *)&p[1]; - rc = sqlite3OsOpen(p->pVfs, p->zJournal, pReal, p->flags, 0); - if( rc==SQLITE_OK ){ - p->pReal = pReal; - if( p->iSize>0 ){ - assert(p->iSize<=p->nBuf); - rc = sqlite3OsWrite(p->pReal, p->zBuf, p->iSize, 0); - } - if( rc!=SQLITE_OK ){ - /* If an error occurred while writing to the file, close it before - ** returning. This way, SQLite uses the in-memory journal data to - ** roll back changes made to the internal page-cache before this - ** function was called. */ - sqlite3OsClose(pReal); - p->pReal = 0; - } - } - } - return rc; -} - -/* -** Close the file. -*/ -static int jrnlClose(sqlite3_file *pJfd){ - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - sqlite3OsClose(p->pReal); - } - sqlite3_free(p->zBuf); - return SQLITE_OK; -} - -/* -** Read data from the file. -*/ -static int jrnlRead( - sqlite3_file *pJfd, /* The journal file from which to read */ - void *zBuf, /* Put the results here */ - int iAmt, /* Number of bytes to read */ - sqlite_int64 iOfst /* Begin reading at this offset */ -){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - rc = sqlite3OsRead(p->pReal, zBuf, iAmt, iOfst); - }else if( (iAmt+iOfst)>p->iSize ){ - rc = SQLITE_IOERR_SHORT_READ; - }else{ - memcpy(zBuf, &p->zBuf[iOfst], iAmt); - } - return rc; -} - -/* -** Write data to the file. -*/ -static int jrnlWrite( - sqlite3_file *pJfd, /* The journal file into which to write */ - const void *zBuf, /* Take data to be written from here */ - int iAmt, /* Number of bytes to write */ - sqlite_int64 iOfst /* Begin writing at this offset into the file */ -){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( !p->pReal && (iOfst+iAmt)>p->nBuf ){ - rc = createFile(p); - } - if( rc==SQLITE_OK ){ - if( p->pReal ){ - rc = sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst); - }else{ - memcpy(&p->zBuf[iOfst], zBuf, iAmt); - if( p->iSize<(iOfst+iAmt) ){ - p->iSize = (iOfst+iAmt); - } - } - } - return rc; -} - -/* -** Truncate the file. -*/ -static int jrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - rc = sqlite3OsTruncate(p->pReal, size); - }else if( size<p->iSize ){ - p->iSize = size; - } - return rc; -} - -/* -** Sync the file. -*/ -static int jrnlSync(sqlite3_file *pJfd, int flags){ - int rc; - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - rc = sqlite3OsSync(p->pReal, flags); - }else{ - rc = SQLITE_OK; - } - return rc; -} - -/* -** Query the size of the file in bytes. -*/ -static int jrnlFileSize(sqlite3_file *pJfd, sqlite_int64 *pSize){ - int rc = SQLITE_OK; - JournalFile *p = (JournalFile *)pJfd; - if( p->pReal ){ - rc = sqlite3OsFileSize(p->pReal, pSize); - }else{ - *pSize = (sqlite_int64) p->iSize; - } - return rc; -} - -/* -** Table of methods for JournalFile sqlite3_file object. -*/ -static struct sqlite3_io_methods JournalFileMethods = { - 1, /* iVersion */ - jrnlClose, /* xClose */ - jrnlRead, /* xRead */ - jrnlWrite, /* xWrite */ - jrnlTruncate, /* xTruncate */ - jrnlSync, /* xSync */ - jrnlFileSize, /* xFileSize */ - 0, /* xLock */ - 0, /* xUnlock */ - 0, /* xCheckReservedLock */ - 0, /* xFileControl */ - 0, /* xSectorSize */ - 0, /* xDeviceCharacteristics */ - 0, /* xShmMap */ - 0, /* xShmLock */ - 0, /* xShmBarrier */ - 0 /* xShmUnmap */ -}; - -/* -** Open a journal file. -*/ -SQLITE_PRIVATE int sqlite3JournalOpen( - sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */ - const char *zName, /* Name of the journal file */ - sqlite3_file *pJfd, /* Preallocated, blank file handle */ - int flags, /* Opening flags */ - int nBuf /* Bytes buffered before opening the file */ -){ - JournalFile *p = (JournalFile *)pJfd; - memset(p, 0, sqlite3JournalSize(pVfs)); - if( nBuf>0 ){ - p->zBuf = sqlite3MallocZero(nBuf); - if( !p->zBuf ){ - return SQLITE_NOMEM; - } - }else{ - return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); - } - p->pMethod = &JournalFileMethods; - p->nBuf = nBuf; - p->flags = flags; - p->zJournal = zName; - p->pVfs = pVfs; - return SQLITE_OK; -} - -/* -** If the argument p points to a JournalFile structure, and the underlying -** file has not yet been created, create it now. -*/ -SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *p){ - if( p->pMethods!=&JournalFileMethods ){ - return SQLITE_OK; - } - return createFile((JournalFile *)p); -} - -/* -** The file-handle passed as the only argument is guaranteed to be an open -** file. It may or may not be of class JournalFile. If the file is a -** JournalFile, and the underlying file on disk has not yet been opened, -** return 0. Otherwise, return 1. -*/ -SQLITE_PRIVATE int sqlite3JournalExists(sqlite3_file *p){ - return (p->pMethods!=&JournalFileMethods || ((JournalFile *)p)->pReal!=0); -} - -/* -** Return the number of bytes required to store a JournalFile that uses vfs -** pVfs to create the underlying on-disk files. -*/ -SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ - return (pVfs->szOsFile+sizeof(JournalFile)); -} -#endif - -/************** End of journal.c *********************************************/ /************** Begin file memjournal.c **************************************/ /* ** 2008 October 7 @@ -79929,31 +92576,45 @@ SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ ** This file contains code use to implement an in-memory rollback journal. ** The in-memory rollback journal is used to journal transactions for ** ":memory:" databases and when the journal_mode=MEMORY pragma is used. +** +** Update: The in-memory journal is also used to temporarily cache +** smaller journals that are not critical for power-loss recovery. +** For example, statement journals that are not too big will be held +** entirely in memory, thus reducing the number of file I/O calls, and +** more importantly, reducing temporary file creation events. If these +** journals become too large for memory, they are spilled to disk. But +** in the common case, they are usually small and no file I/O needs to +** occur. */ +/* #include "sqliteInt.h" */ /* Forward references to internal structures */ typedef struct MemJournal MemJournal; typedef struct FilePoint FilePoint; typedef struct FileChunk FileChunk; -/* Space to hold the rollback journal is allocated in increments of -** this many bytes. -** -** The size chosen is a little less than a power of two. That way, -** the FileChunk object will have a size that almost exactly fills -** a power-of-two allocation. This minimizes wasted space in power-of-two -** memory allocators. -*/ -#define JOURNAL_CHUNKSIZE ((int)(1024-sizeof(FileChunk*))) - /* ** The rollback journal is composed of a linked list of these structures. +** +** The zChunk array is always at least 8 bytes in size - usually much more. +** Its actual size is stored in the MemJournal.nChunkSize variable. */ struct FileChunk { FileChunk *pNext; /* Next chunk in the journal */ - u8 zChunk[JOURNAL_CHUNKSIZE]; /* Content of this chunk */ + u8 zChunk[8]; /* Content of this chunk */ }; +/* +** By default, allocate this many bytes of memory for each FileChunk object. +*/ +#define MEMJOURNAL_DFLT_FILECHUNKSIZE 1024 + +/* +** For chunk size nChunkSize, return the number of bytes that should +** be allocated for each FileChunk structure. +*/ +#define fileChunkSize(nChunkSize) (sizeof(FileChunk) + ((nChunkSize)-8)) + /* ** An instance of this object serves as a cursor into the rollback journal. ** The cursor can be either for reading or writing. @@ -79964,14 +92625,22 @@ struct FilePoint { }; /* -** This subclass is a subclass of sqlite3_file. Each open memory-journal +** This structure is a subclass of sqlite3_file. Each open memory-journal ** is an instance of this class. */ struct MemJournal { - sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */ + const sqlite3_io_methods *pMethod; /* Parent class. MUST BE FIRST */ + int nChunkSize; /* In-memory chunk-size */ + + int nSpill; /* Bytes of data before flushing */ + int nSize; /* Bytes of data currently in memory */ FileChunk *pFirst; /* Head of in-memory chunk-list */ FilePoint endpoint; /* Pointer to the end of the file */ FilePoint readpoint; /* Pointer to the end of the last xRead() */ + + int flags; /* xOpen flags */ + sqlite3_vfs *pVfs; /* The "real" underlying VFS */ + const char *zJournal; /* Name of the journal file */ }; /* @@ -79990,36 +92659,95 @@ static int memjrnlRead( int iChunkOffset; FileChunk *pChunk; - /* SQLite never tries to read past the end of a rollback journal file */ - assert( iOfst+iAmt<=p->endpoint.iOffset ); +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + if( (iAmt+iOfst)>p->endpoint.iOffset ){ + return SQLITE_IOERR_SHORT_READ; + } +#endif + assert( (iAmt+iOfst)<=p->endpoint.iOffset ); + assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ sqlite3_int64 iOff = 0; for(pChunk=p->pFirst; - ALWAYS(pChunk) && (iOff+JOURNAL_CHUNKSIZE)<=iOfst; + ALWAYS(pChunk) && (iOff+p->nChunkSize)<=iOfst; pChunk=pChunk->pNext ){ - iOff += JOURNAL_CHUNKSIZE; + iOff += p->nChunkSize; } }else{ pChunk = p->readpoint.pChunk; + assert( pChunk!=0 ); } - iChunkOffset = (int)(iOfst%JOURNAL_CHUNKSIZE); + iChunkOffset = (int)(iOfst%p->nChunkSize); do { - int iSpace = JOURNAL_CHUNKSIZE - iChunkOffset; - int nCopy = MIN(nRead, (JOURNAL_CHUNKSIZE - iChunkOffset)); - memcpy(zOut, &pChunk->zChunk[iChunkOffset], nCopy); + int iSpace = p->nChunkSize - iChunkOffset; + int nCopy = MIN(nRead, (p->nChunkSize - iChunkOffset)); + memcpy(zOut, (u8*)pChunk->zChunk + iChunkOffset, nCopy); zOut += nCopy; nRead -= iSpace; iChunkOffset = 0; } while( nRead>=0 && (pChunk=pChunk->pNext)!=0 && nRead>0 ); - p->readpoint.iOffset = iOfst+iAmt; + p->readpoint.iOffset = pChunk ? iOfst+iAmt : 0; p->readpoint.pChunk = pChunk; return SQLITE_OK; } +/* +** Free the list of FileChunk structures headed at MemJournal.pFirst. +*/ +static void memjrnlFreeChunks(MemJournal *p){ + FileChunk *pIter; + FileChunk *pNext; + for(pIter=p->pFirst; pIter; pIter=pNext){ + pNext = pIter->pNext; + sqlite3_free(pIter); + } + p->pFirst = 0; +} + +/* +** Flush the contents of memory to a real file on disk. +*/ +static int memjrnlCreateFile(MemJournal *p){ + int rc; + sqlite3_file *pReal = (sqlite3_file*)p; + MemJournal copy = *p; + + memset(p, 0, sizeof(MemJournal)); + rc = sqlite3OsOpen(copy.pVfs, copy.zJournal, pReal, copy.flags, 0); + if( rc==SQLITE_OK ){ + int nChunk = copy.nChunkSize; + i64 iOff = 0; + FileChunk *pIter; + for(pIter=copy.pFirst; pIter; pIter=pIter->pNext){ + if( iOff + nChunk > copy.endpoint.iOffset ){ + nChunk = copy.endpoint.iOffset - iOff; + } + rc = sqlite3OsWrite(pReal, (u8*)pIter->zChunk, nChunk, iOff); + if( rc ) break; + iOff += nChunk; + } + if( rc==SQLITE_OK ){ + /* No error has occurred. Free the in-memory buffers. */ + memjrnlFreeChunks(©); + } + } + if( rc!=SQLITE_OK ){ + /* If an error occurred while creating or writing to the file, restore + ** the original before returning. This way, SQLite uses the in-memory + ** journal data to roll back changes made to the internal page-cache + ** before this function was called. */ + sqlite3OsClose(pReal); + *p = copy; + } + return rc; +} + + /* ** Write data to the file. */ @@ -80033,38 +92761,63 @@ static int memjrnlWrite( int nWrite = iAmt; u8 *zWrite = (u8 *)zBuf; - /* An in-memory journal file should only ever be appended to. Random - ** access writes are not required by sqlite. - */ - assert( iOfst==p->endpoint.iOffset ); - UNUSED_PARAMETER(iOfst); - - while( nWrite>0 ){ - FileChunk *pChunk = p->endpoint.pChunk; - int iChunkOffset = (int)(p->endpoint.iOffset%JOURNAL_CHUNKSIZE); - int iSpace = MIN(nWrite, JOURNAL_CHUNKSIZE - iChunkOffset); - - if( iChunkOffset==0 ){ - /* New chunk is required to extend the file. */ - FileChunk *pNew = sqlite3_malloc(sizeof(FileChunk)); - if( !pNew ){ - return SQLITE_IOERR_NOMEM; - } - pNew->pNext = 0; - if( pChunk ){ - assert( p->pFirst ); - pChunk->pNext = pNew; - }else{ - assert( !p->pFirst ); - p->pFirst = pNew; - } - p->endpoint.pChunk = pNew; + /* If the file should be created now, create it and write the new data + ** into the file on disk. */ + if( p->nSpill>0 && (iAmt+iOfst)>p->nSpill ){ + int rc = memjrnlCreateFile(p); + if( rc==SQLITE_OK ){ + rc = sqlite3OsWrite(pJfd, zBuf, iAmt, iOfst); } + return rc; + } - memcpy(&p->endpoint.pChunk->zChunk[iChunkOffset], zWrite, iSpace); - zWrite += iSpace; - nWrite -= iSpace; - p->endpoint.iOffset += iSpace; + /* If the contents of this write should be stored in memory */ + else{ + /* An in-memory journal file should only ever be appended to. Random + ** access writes are not required. The only exception to this is when + ** the in-memory journal is being used by a connection using the + ** atomic-write optimization. In this case the first 28 bytes of the + ** journal file may be written as part of committing the transaction. */ + assert( iOfst==p->endpoint.iOffset || iOfst==0 ); +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) + if( iOfst==0 && p->pFirst ){ + assert( p->nChunkSize>iAmt ); + memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt); + }else +#else + assert( iOfst>0 || p->pFirst==0 ); +#endif + { + while( nWrite>0 ){ + FileChunk *pChunk = p->endpoint.pChunk; + int iChunkOffset = (int)(p->endpoint.iOffset%p->nChunkSize); + int iSpace = MIN(nWrite, p->nChunkSize - iChunkOffset); + + if( iChunkOffset==0 ){ + /* New chunk is required to extend the file. */ + FileChunk *pNew = sqlite3_malloc(fileChunkSize(p->nChunkSize)); + if( !pNew ){ + return SQLITE_IOERR_NOMEM_BKPT; + } + pNew->pNext = 0; + if( pChunk ){ + assert( p->pFirst ); + pChunk->pNext = pNew; + }else{ + assert( !p->pFirst ); + p->pFirst = pNew; + } + p->endpoint.pChunk = pNew; + } + + memcpy((u8*)p->endpoint.pChunk->zChunk + iChunkOffset, zWrite, iSpace); + zWrite += iSpace; + nWrite -= iSpace; + p->endpoint.iOffset += iSpace; + } + p->nSize = iAmt + iOfst; + } } return SQLITE_OK; @@ -80072,19 +92825,21 @@ static int memjrnlWrite( /* ** Truncate the file. +** +** If the journal file is already on disk, truncate it there. Or, if it +** is still in main memory but is being truncated to zero bytes in size, +** ignore */ static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ MemJournal *p = (MemJournal *)pJfd; - FileChunk *pChunk; - assert(size==0); - UNUSED_PARAMETER(size); - pChunk = p->pFirst; - while( pChunk ){ - FileChunk *pTmp = pChunk; - pChunk = pChunk->pNext; - sqlite3_free(pTmp); + if( ALWAYS(size==0) ){ + memjrnlFreeChunks(p); + p->nSize = 0; + p->endpoint.pChunk = 0; + p->endpoint.iOffset = 0; + p->readpoint.pChunk = 0; + p->readpoint.iOffset = 0; } - sqlite3MemJournalOpen(pJfd); return SQLITE_OK; } @@ -80092,21 +92847,19 @@ static int memjrnlTruncate(sqlite3_file *pJfd, sqlite_int64 size){ ** Close the file. */ static int memjrnlClose(sqlite3_file *pJfd){ - memjrnlTruncate(pJfd, 0); + MemJournal *p = (MemJournal *)pJfd; + memjrnlFreeChunks(p); return SQLITE_OK; } - /* ** Sync the file. ** -** Syncing an in-memory journal is a no-op. And, in fact, this routine -** is never called in a working implementation. This implementation -** exists purely as a contingency, in case some malfunction in some other -** part of SQLite causes Sync to be called by mistake. +** If the real file has been created, call its xSync method. Otherwise, +** syncing an in-memory journal is a no-op. */ -static int memjrnlSync(sqlite3_file *NotUsed, int NotUsed2){ - UNUSED_PARAMETER2(NotUsed, NotUsed2); +static int memjrnlSync(sqlite3_file *pJfd, int flags){ + UNUSED_PARAMETER2(pJfd, flags); return SQLITE_OK; } @@ -80145,28 +92898,102 @@ static const struct sqlite3_io_methods MemJournalMethods = { }; /* -** Open a journal file. +** Open a journal file. +** +** The behaviour of the journal file depends on the value of parameter +** nSpill. If nSpill is 0, then the journal file is always create and +** accessed using the underlying VFS. If nSpill is less than zero, then +** all content is always stored in main-memory. Finally, if nSpill is a +** positive value, then the journal file is initially created in-memory +** but may be flushed to disk later on. In this case the journal file is +** flushed to disk either when it grows larger than nSpill bytes in size, +** or when sqlite3JournalCreate() is called. */ -SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ - MemJournal *p = (MemJournal *)pJfd; - assert( EIGHT_BYTE_ALIGNMENT(p) ); - memset(p, 0, sqlite3MemJournalSize()); - p->pMethod = (sqlite3_io_methods*)&MemJournalMethods; +SQLITE_PRIVATE int sqlite3JournalOpen( + sqlite3_vfs *pVfs, /* The VFS to use for actual file I/O */ + const char *zName, /* Name of the journal file */ + sqlite3_file *pJfd, /* Preallocated, blank file handle */ + int flags, /* Opening flags */ + int nSpill /* Bytes buffered before opening the file */ +){ + MemJournal *p = (MemJournal*)pJfd; + + /* Zero the file-handle object. If nSpill was passed zero, initialize + ** it using the sqlite3OsOpen() function of the underlying VFS. In this + ** case none of the code in this module is executed as a result of calls + ** made on the journal file-handle. */ + memset(p, 0, sizeof(MemJournal)); + if( nSpill==0 ){ + return sqlite3OsOpen(pVfs, zName, pJfd, flags, 0); + } + + if( nSpill>0 ){ + p->nChunkSize = nSpill; + }else{ + p->nChunkSize = 8 + MEMJOURNAL_DFLT_FILECHUNKSIZE - sizeof(FileChunk); + assert( MEMJOURNAL_DFLT_FILECHUNKSIZE==fileChunkSize(p->nChunkSize) ); + } + + p->pMethod = (const sqlite3_io_methods*)&MemJournalMethods; + p->nSpill = nSpill; + p->flags = flags; + p->zJournal = zName; + p->pVfs = pVfs; + return SQLITE_OK; } /* -** Return true if the file-handle passed as an argument is -** an in-memory journal +** Open an in-memory journal file. */ -SQLITE_PRIVATE int sqlite3IsMemJournal(sqlite3_file *pJfd){ - return pJfd->pMethods==&MemJournalMethods; +SQLITE_PRIVATE void sqlite3MemJournalOpen(sqlite3_file *pJfd){ + sqlite3JournalOpen(0, 0, pJfd, 0, -1); +} + +#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ + || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) +/* +** If the argument p points to a MemJournal structure that is not an +** in-memory-only journal file (i.e. is one that was opened with a +ve +** nSpill parameter or as SQLITE_OPEN_MAIN_JOURNAL), and the underlying +** file has not yet been created, create it now. +*/ +SQLITE_PRIVATE int sqlite3JournalCreate(sqlite3_file *pJfd){ + int rc = SQLITE_OK; + MemJournal *p = (MemJournal*)pJfd; + if( p->pMethod==&MemJournalMethods && ( +#ifdef SQLITE_ENABLE_ATOMIC_WRITE + p->nSpill>0 +#else + /* While this appears to not be possible without ATOMIC_WRITE, the + ** paths are complex, so it seems prudent to leave the test in as + ** a NEVER(), in case our analysis is subtly flawed. */ + NEVER(p->nSpill>0) +#endif +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE + || (p->flags & SQLITE_OPEN_MAIN_JOURNAL) +#endif + )){ + rc = memjrnlCreateFile(p); + } + return rc; +} +#endif + +/* +** The file-handle passed as the only argument is open on a journal file. +** Return true if this "journal file" is currently stored in heap memory, +** or false otherwise. +*/ +SQLITE_PRIVATE int sqlite3JournalIsInMemory(sqlite3_file *p){ + return p->pMethods==&MemJournalMethods; } /* -** Return the number of bytes required to store a MemJournal file descriptor. +** Return the number of bytes required to store a JournalFile that uses vfs +** pVfs to create the underlying on-disk files. */ -SQLITE_PRIVATE int sqlite3MemJournalSize(void){ - return sizeof(MemJournal); +SQLITE_PRIVATE int sqlite3JournalSize(sqlite3_vfs *pVfs){ + return MAX(pVfs->szOsFile, (int)sizeof(MemJournal)); } /************** End of memjournal.c ******************************************/ @@ -80185,6 +93012,7 @@ SQLITE_PRIVATE int sqlite3MemJournalSize(void){ ** This file contains routines used for walking the parser tree for ** an SQL statement. */ +/* #include "sqliteInt.h" */ /* #include <stdlib.h> */ /* #include <string.h> */ @@ -80199,32 +93027,40 @@ SQLITE_PRIVATE int sqlite3MemJournalSize(void){ ** ** WRC_Continue Continue descending down the tree. ** -** WRC_Prune Do not descend into child nodes. But allow +** WRC_Prune Do not descend into child nodes, but allow ** the walk to continue with sibling nodes. ** ** WRC_Abort Do no more callbacks. Unwind the stack and -** return the top-level walk call. +** return from the top-level walk call. ** ** The return value from this routine is WRC_Abort to abandon the tree walk ** and WRC_Continue to continue. */ -SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ +static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ int rc; - if( pExpr==0 ) return WRC_Continue; testcase( ExprHasProperty(pExpr, EP_TokenOnly) ); testcase( ExprHasProperty(pExpr, EP_Reduced) ); - rc = pWalker->xExprCallback(pWalker, pExpr); - if( rc==WRC_Continue - && !ExprHasProperty(pExpr,EP_TokenOnly) ){ - if( sqlite3WalkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pExpr->pRight) ) return WRC_Abort; - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; - }else{ - if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + while(1){ + rc = pWalker->xExprCallback(pWalker, pExpr); + if( rc ) return rc & WRC_Abort; + if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; + assert( pExpr->x.pList==0 || pExpr->pRight==0 ); + if( pExpr->pRight ){ + pExpr = pExpr->pRight; + continue; + }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; + }else if( pExpr->x.pList ){ + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + } } + break; } - return rc & WRC_Abort; + return WRC_Continue; +} +SQLITE_PRIVATE int sqlite3WalkExpr(Walker *pWalker, Expr *pExpr){ + return pExpr ? walkExpr(pWalker,pExpr) : WRC_Continue; } /* @@ -80255,7 +93091,6 @@ SQLITE_PRIVATE int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, p->pOffset) ) return WRC_Abort; return WRC_Continue; } @@ -80272,11 +93107,15 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ struct SrcList_item *pItem; pSrc = p->pSrc; - if( ALWAYS(pSrc) ){ - for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ - if( sqlite3WalkSelect(pWalker, pItem->pSelect) ){ - return WRC_Abort; - } + assert( pSrc!=0 ); + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + if( pItem->pSelect && sqlite3WalkSelect(pWalker, pItem->pSelect) ){ + return WRC_Abort; + } + if( pItem->fg.isTabFunc + && sqlite3WalkExprList(pWalker, pItem->u1.pFuncArg) + ){ + return WRC_Abort; } } return WRC_Continue; @@ -80289,8 +93128,9 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ ** ** If it is not NULL, the xSelectCallback() callback is invoked before ** the walk of the expressions and FROM clause. The xSelectCallback2() -** method, if it is not NULL, is invoked following the walk of the -** expressions and FROM clause. +** method is invoked following the walk of the expressions and FROM clause, +** but only if both xSelectCallback and xSelectCallback2 are both non-NULL +** and if the expressions and FROM clause both return WRC_Continue; ** ** Return WRC_Continue under normal conditions. Return WRC_Abort if ** there is an abort request. @@ -80300,29 +93140,22 @@ SQLITE_PRIVATE int sqlite3WalkSelectFrom(Walker *pWalker, Select *p){ */ SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ int rc; - if( p==0 || (pWalker->xSelectCallback==0 && pWalker->xSelectCallback2==0) ){ - return WRC_Continue; - } - rc = WRC_Continue; - pWalker->walkerDepth++; - while( p ){ - if( pWalker->xSelectCallback ){ - rc = pWalker->xSelectCallback(pWalker, p); - if( rc ) break; - } + if( p==0 ) return WRC_Continue; + if( pWalker->xSelectCallback==0 ) return WRC_Continue; + do{ + rc = pWalker->xSelectCallback(pWalker, p); + if( rc ) return rc & WRC_Abort; if( sqlite3WalkSelectExpr(pWalker, p) || sqlite3WalkSelectFrom(pWalker, p) ){ - pWalker->walkerDepth--; return WRC_Abort; } if( pWalker->xSelectCallback2 ){ pWalker->xSelectCallback2(pWalker, p); } p = p->pPrior; - } - pWalker->walkerDepth--; - return rc & WRC_Abort; + }while( p!=0 ); + return WRC_Continue; } /************** End of walker.c **********************************************/ @@ -80343,8 +93176,7 @@ SQLITE_PRIVATE int sqlite3WalkSelect(Walker *pWalker, Select *p){ ** resolve all identifiers by associating them with a particular ** table and column. */ -/* #include <stdlib.h> */ -/* #include <string.h> */ +/* #include "sqliteInt.h" */ /* ** Walk the expression tree pExpr and increase the aggregate function @@ -80373,30 +93205,6 @@ static void incrAggFunctionDepth(Expr *pExpr, int N){ ** Turn the pExpr expression into an alias for the iCol-th column of the ** result set in pEList. ** -** If the result set column is a simple column reference, then this routine -** makes an exact copy. But for any other kind of expression, this -** routine make a copy of the result set column as the argument to the -** TK_AS operator. The TK_AS operator causes the expression to be -** evaluated just once and then reused for each alias. -** -** The reason for suppressing the TK_AS term when the expression is a simple -** column reference is so that the column reference will be recognized as -** usable by indices within the WHERE clause processing logic. -** -** The TK_AS operator is inhibited if zType[0]=='G'. This means -** that in a GROUP BY clause, the expression is evaluated twice. Hence: -** -** SELECT random()%5 AS x, count(*) FROM tab GROUP BY x -** -** Is equivalent to: -** -** SELECT random()%5 AS x, count(*) FROM tab GROUP BY random()%5 -** -** The result of random()%5 in the GROUP BY clause is probably different -** from the result in the result-set. On the other hand Standard SQL does -** not allow the GROUP BY clause to contain references to result-set columns. -** So this should never come up in well-formed queries. -** ** If the reference is followed by a COLLATE operator, then make sure ** the COLLATE operator is preserved. For example: ** @@ -80407,7 +93215,7 @@ static void incrAggFunctionDepth(Expr *pExpr, int N){ ** SELECT a+b, c+d FROM t1 ORDER BY (a+b) COLLATE nocase; ** ** The nSubquery parameter specifies how many levels of subquery the -** alias is removed from the original expression. The usually value is +** alias is removed from the original expression. The usual value is ** zero but it might be more if the alias is contained within a subquery ** of the original expression. The Expr.op2 field of TK_AGG_FUNCTION ** structures must be increased by the nSubquery amount. @@ -80427,40 +93235,33 @@ static void resolveAlias( assert( iCol>=0 && iCol<pEList->nExpr ); pOrig = pEList->a[iCol].pExpr; assert( pOrig!=0 ); - assert( pOrig->flags & EP_Resolved ); db = pParse->db; pDup = sqlite3ExprDup(db, pOrig, 0); - if( pDup==0 ) return; - if( pOrig->op!=TK_COLUMN && zType[0]!='G' ){ - incrAggFunctionDepth(pDup, nSubquery); - pDup = sqlite3PExpr(pParse, TK_AS, pDup, 0, 0); - if( pDup==0 ) return; - ExprSetProperty(pDup, EP_Skip); - if( pEList->a[iCol].u.x.iAlias==0 ){ - pEList->a[iCol].u.x.iAlias = (u16)(++pParse->nAlias); + if( pDup!=0 ){ + if( zType[0]!='G' ) incrAggFunctionDepth(pDup, nSubquery); + if( pExpr->op==TK_COLLATE ){ + pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - pDup->iTable = pEList->a[iCol].u.x.iAlias; - } - if( pExpr->op==TK_COLLATE ){ - pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); - } + ExprSetProperty(pDup, EP_Alias); - /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This - ** prevents ExprDelete() from deleting the Expr structure itself, - ** allowing it to be repopulated by the memcpy() on the following line. - ** The pExpr->u.zToken might point into memory that will be freed by the - ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to - ** make a copy of the token before doing the sqlite3DbFree(). - */ - ExprSetProperty(pExpr, EP_Static); - sqlite3ExprDelete(db, pExpr); - memcpy(pExpr, pDup, sizeof(*pExpr)); - if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ - assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); - pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); - pExpr->flags |= EP_MemToken; + /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This + ** prevents ExprDelete() from deleting the Expr structure itself, + ** allowing it to be repopulated by the memcpy() on the following line. + ** The pExpr->u.zToken might point into memory that will be freed by the + ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to + ** make a copy of the token before doing the sqlite3DbFree(). + */ + ExprSetProperty(pExpr, EP_Static); + sqlite3ExprDelete(db, pExpr); + memcpy(pExpr, pDup, sizeof(*pExpr)); + if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ + assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); + pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); + pExpr->flags |= EP_MemToken; + } + sqlite3DbFree(db, pDup); } - sqlite3DbFree(db, pDup); + ExprSetProperty(pExpr, EP_Alias); } @@ -80554,7 +93355,7 @@ static int lookupName( struct SrcList_item *pMatch = 0; /* The matching pSrcList item */ NameContext *pTopNC = pNC; /* First namecontext in the list */ Schema *pSchema = 0; /* Schema of the expression */ - int isTrigger = 0; /* True if resolved to a trigger column */ + int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */ Table *pTab = 0; /* Table hold the row */ Column *pCol; /* A column of pTab */ @@ -80575,14 +93376,15 @@ static int lookupName( testcase( pNC->ncFlags & NC_PartIdx ); testcase( pNC->ncFlags & NC_IsCheck ); if( (pNC->ncFlags & (NC_PartIdx|NC_IsCheck))!=0 ){ - /* Silently ignore database qualifiers inside CHECK constraints and partial - ** indices. Do not raise errors because that might break legacy and - ** because it does not hurt anything to just ignore the database name. */ + /* Silently ignore database qualifiers inside CHECK constraints and + ** partial indices. Do not raise errors because that might break + ** legacy and because it does not hurt anything to just ignore the + ** database name. */ zDb = 0; }else{ for(i=0; i<db->nDb; i++){ - assert( db->aDb[i].zName ); - if( sqlite3StrICmp(db->aDb[i].zName,zDb)==0 ){ + assert( db->aDb[i].zDbSName ); + if( sqlite3StrICmp(db->aDb[i].zDbSName,zDb)==0 ){ pSchema = db->aDb[i].pSchema; break; } @@ -80591,7 +93393,8 @@ static int lookupName( } /* Start at the inner-most context and move outward until a match is found */ - while( pNC && cnt==0 ){ + assert( pNC && cnt==0 ); + do{ ExprList *pEList; SrcList *pSrcList = pNC->pSrcList; @@ -80634,7 +93437,7 @@ static int lookupName( ** USING clause, then skip this match. */ if( cnt==1 ){ - if( pItem->jointype & JT_NATURAL ) continue; + if( pItem->fg.jointype & JT_NATURAL ) continue; if( nameInUsingClause(pItem->pUsing, zCol) ) continue; } cnt++; @@ -80648,30 +93451,44 @@ static int lookupName( if( pMatch ){ pExpr->iTable = pMatch->iCursor; pExpr->pTab = pMatch->pTab; - assert( (pMatch->jointype & JT_RIGHT)==0 ); /* RIGHT JOIN not (yet) supported */ - if( (pMatch->jointype & JT_LEFT)!=0 ){ + /* RIGHT JOIN not (yet) supported */ + assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); + if( (pMatch->fg.jointype & JT_LEFT)!=0 ){ ExprSetProperty(pExpr, EP_CanBeNull); } pSchema = pExpr->pTab->pSchema; } } /* if( pSrcList ) */ -#ifndef SQLITE_OMIT_TRIGGER +#if !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) /* If we have not already resolved the name, then maybe - ** it is a new.* or old.* trigger argument reference + ** it is a new.* or old.* trigger argument reference. Or + ** maybe it is an excluded.* from an upsert. */ - if( zDb==0 && zTab!=0 && cntTab==0 && pParse->pTriggerTab!=0 ){ - int op = pParse->eTriggerOp; - assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); - if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){ - pExpr->iTable = 1; - pTab = pParse->pTriggerTab; - }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ - pExpr->iTable = 0; - pTab = pParse->pTriggerTab; - }else{ - pTab = 0; + if( zDb==0 && zTab!=0 && cntTab==0 ){ + pTab = 0; +#ifndef SQLITE_OMIT_TRIGGER + if( pParse->pTriggerTab!=0 ){ + int op = pParse->eTriggerOp; + assert( op==TK_DELETE || op==TK_UPDATE || op==TK_INSERT ); + if( op!=TK_DELETE && sqlite3StrICmp("new",zTab) == 0 ){ + pExpr->iTable = 1; + pTab = pParse->pTriggerTab; + }else if( op!=TK_INSERT && sqlite3StrICmp("old",zTab)==0 ){ + pExpr->iTable = 0; + pTab = pParse->pTriggerTab; + } } +#endif /* SQLITE_OMIT_TRIGGER */ +#ifndef SQLITE_OMIT_UPSERT + if( (pNC->ncFlags & NC_UUpsert)!=0 ){ + Upsert *pUpsert = pNC->uNC.pUpsert; + if( pUpsert && sqlite3StrICmp("excluded",zTab)==0 ){ + pTab = pUpsert->pUpsertSrc->a[0].pTab; + pExpr->iTable = 2; + } + } +#endif /* SQLITE_OMIT_UPSERT */ if( pTab ){ int iCol; @@ -80685,39 +93502,55 @@ static int lookupName( break; } } - if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && HasRowid(pTab) ){ + if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){ /* IMP: R-51414-32910 */ - /* IMP: R-44911-55124 */ iCol = -1; } if( iCol<pTab->nCol ){ cnt++; - if( iCol<0 ){ - pExpr->affinity = SQLITE_AFF_INTEGER; - }else if( pExpr->iTable==0 ){ - testcase( iCol==31 ); - testcase( iCol==32 ); - pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); - }else{ - testcase( iCol==31 ); - testcase( iCol==32 ); - pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); +#ifndef SQLITE_OMIT_UPSERT + if( pExpr->iTable==2 ){ + testcase( iCol==(-1) ); + pExpr->iTable = pNC->uNC.pUpsert->regData + iCol; + eNewExprOp = TK_REGISTER; + ExprSetProperty(pExpr, EP_Alias); + }else +#endif /* SQLITE_OMIT_UPSERT */ + { +#ifndef SQLITE_OMIT_TRIGGER + if( iCol<0 ){ + pExpr->affinity = SQLITE_AFF_INTEGER; + }else if( pExpr->iTable==0 ){ + testcase( iCol==31 ); + testcase( iCol==32 ); + pParse->oldmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); + }else{ + testcase( iCol==31 ); + testcase( iCol==32 ); + pParse->newmask |= (iCol>=32 ? 0xffffffff : (((u32)1)<<iCol)); + } + pExpr->pTab = pTab; + pExpr->iColumn = (i16)iCol; + eNewExprOp = TK_TRIGGER; +#endif /* SQLITE_OMIT_TRIGGER */ } - pExpr->iColumn = (i16)iCol; - pExpr->pTab = pTab; - isTrigger = 1; } } } -#endif /* !defined(SQLITE_OMIT_TRIGGER) */ +#endif /* !defined(SQLITE_OMIT_TRIGGER) || !defined(SQLITE_OMIT_UPSERT) */ /* ** Perhaps the name is a reference to the ROWID */ - if( cnt==0 && cntTab==1 && pMatch && sqlite3IsRowid(zCol) - && HasRowid(pMatch->pTab) ){ + if( cnt==0 + && cntTab==1 + && pMatch + && (pNC->ncFlags & NC_IdxExpr)==0 + && sqlite3IsRowid(zCol) + && VisibleRowid(pMatch->pTab) + ){ cnt = 1; - pExpr->iColumn = -1; /* IMP: R-44911-55124 */ + pExpr->iColumn = -1; pExpr->affinity = SQLITE_AFF_INTEGER; } @@ -80734,15 +93567,17 @@ static int lookupName( ** resolved by the time the WHERE clause is resolved. ** ** The ability to use an output result-set column in the WHERE, GROUP BY, - ** or HAVING clauses, or as part of a larger expression in the ORDRE BY + ** or HAVING clauses, or as part of a larger expression in the ORDER BY ** clause is not standard SQL. This is a (goofy) SQLite extension, that - ** is supported for backwards compatibility only. TO DO: Issue a warning + ** is supported for backwards compatibility only. Hence, we issue a warning ** on sqlite3_log() whenever the capability is used. */ - if( (pEList = pNC->pEList)!=0 - && zTab==0 + if( (pNC->ncFlags & NC_UEList)!=0 && cnt==0 + && zTab==0 ){ + pEList = pNC->uNC.pEList; + assert( pEList!=0 ); for(j=0; j<pEList->nExpr; j++){ char *zAs = pEList->a[j].zName; if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ @@ -80755,6 +93590,10 @@ static int lookupName( sqlite3ErrorMsg(pParse, "misuse of aliased aggregate %s", zAs); return WRC_Abort; } + if( sqlite3ExprVectorSize(pOrig)!=1 ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return WRC_Abort; + } resolveAlias(pParse, pEList, j, pExpr, "", nSubquery); cnt = 1; pMatch = 0; @@ -80767,11 +93606,11 @@ static int lookupName( /* Advance to the next name context. The loop will exit when either ** we have a match (cnt>0) or when we run out of name contexts. */ - if( cnt==0 ){ - pNC = pNC->pNext; - nSubquery++; - } - } + if( cnt ) break; + pNC = pNC->pNext; + nSubquery++; + }while( pNC ); + /* ** If X and Y are NULL (in other words if only the column name Z is @@ -80783,10 +93622,16 @@ static int lookupName( ** Because no reference was made to outer contexts, the pNC->nRef ** fields are not changed in any context. */ - if( cnt==0 && zTab==0 && ExprHasProperty(pExpr,EP_DblQuoted) ){ - pExpr->op = TK_STRING; - pExpr->pTab = 0; - return WRC_Prune; + if( cnt==0 && zTab==0 ){ + assert( pExpr->op==TK_ID ); + if( ExprHasProperty(pExpr,EP_DblQuoted) ){ + pExpr->op = TK_STRING; + pExpr->pTab = 0; + return WRC_Prune; + } + if( sqlite3ExprIdToTrueFalse(pExpr) ){ + return WRC_Prune; + } } /* @@ -80829,11 +93674,12 @@ static int lookupName( pExpr->pLeft = 0; sqlite3ExprDelete(db, pExpr->pRight); pExpr->pRight = 0; - pExpr->op = (isTrigger ? TK_TRIGGER : TK_COLUMN); + pExpr->op = eNewExprOp; + ExprSetProperty(pExpr, EP_Leaf); lookupname_end: if( cnt==1 ){ assert( pNC!=0 ); - if( pExpr->op!=TK_AS ){ + if( !ExprHasProperty(pExpr, EP_Alias) ){ sqlite3AuthRead(pParse, pExpr, pSchema, pNC->pSrcList); } /* Increment the nRef value on all name contexts from TopNC up to @@ -80868,42 +93714,30 @@ SQLITE_PRIVATE Expr *sqlite3CreateColumnExpr(sqlite3 *db, SrcList *pSrc, int iSr testcase( iCol==BMS-1 ); pItem->colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); } - ExprSetProperty(p, EP_Resolved); } return p; } /* -** Report an error that an expression is not valid for a partial index WHERE -** clause. +** Report an error that an expression is not valid for some set of +** pNC->ncFlags values determined by validMask. */ -static void notValidPartIdxWhere( +static void notValid( Parse *pParse, /* Leave error message here */ NameContext *pNC, /* The name context */ - const char *zMsg /* Type of error */ + const char *zMsg, /* Type of error */ + int validMask /* Set of contexts for which prohibited */ ){ - if( (pNC->ncFlags & NC_PartIdx)!=0 ){ - sqlite3ErrorMsg(pParse, "%s prohibited in partial index WHERE clauses", - zMsg); - } -} - + assert( (validMask&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr))==0 ); + if( (pNC->ncFlags & validMask)!=0 ){ + const char *zIn = "partial index WHERE clauses"; + if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; #ifndef SQLITE_OMIT_CHECK -/* -** Report an error that an expression is not valid for a CHECK constraint. -*/ -static void notValidCheckConstraint( - Parse *pParse, /* Leave error message here */ - NameContext *pNC, /* The name context */ - const char *zMsg /* Type of error */ -){ - if( (pNC->ncFlags & NC_IsCheck)!=0 ){ - sqlite3ErrorMsg(pParse,"%s prohibited in CHECK constraints", zMsg); + else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; +#endif + sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); } } -#else -# define notValidCheckConstraint(P,N,M) -#endif /* ** Expression p should encode a floating point value between 1.0 and 0.0. @@ -80939,8 +93773,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pParse = pNC->pParse; assert( pParse==pWalker->pParse ); - if( ExprHasProperty(pExpr, EP_Resolved) ) return WRC_Prune; - ExprSetProperty(pExpr, EP_Resolved); #ifndef NDEBUG if( pNC->pSrcList && pNC->pSrcList->nAlloc>0 ){ SrcList *pSrcList = pNC->pSrcList; @@ -80961,7 +93793,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ SrcList *pSrcList = pNC->pSrcList; struct SrcList_item *pItem; assert( pSrcList && pSrcList->nSrc==1 ); - pItem = pSrcList->a; + pItem = pSrcList->a; + assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 ); pExpr->op = TK_COLUMN; pExpr->pTab = pItem->pTab; pExpr->iTable = pItem->iCursor; @@ -80969,34 +93802,41 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pExpr->affinity = SQLITE_AFF_INTEGER; break; } -#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY) */ +#endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + && !defined(SQLITE_OMIT_SUBQUERY) */ - /* A lone identifier is the name of a column. - */ - case TK_ID: { - return lookupName(pParse, 0, 0, pExpr->u.zToken, pNC, pExpr); - } - - /* A table name and column name: ID.ID + /* A column name: ID + ** Or table name and column name: ID.ID ** Or a database, table and column: ID.ID.ID + ** + ** The TK_ID and TK_OUT cases are combined so that there will only + ** be one call to lookupName(). Then the compiler will in-line + ** lookupName() for a size reduction and performance increase. */ + case TK_ID: case TK_DOT: { const char *zColumn; const char *zTable; const char *zDb; Expr *pRight; - /* if( pSrcList==0 ) break; */ - pRight = pExpr->pRight; - if( pRight->op==TK_ID ){ + if( pExpr->op==TK_ID ){ zDb = 0; - zTable = pExpr->pLeft->u.zToken; - zColumn = pRight->u.zToken; + zTable = 0; + zColumn = pExpr->u.zToken; }else{ - assert( pRight->op==TK_DOT ); - zDb = pExpr->pLeft->u.zToken; - zTable = pRight->pLeft->u.zToken; - zColumn = pRight->pRight->u.zToken; + notValid(pParse, pNC, "the \".\" operator", NC_IdxExpr); + pRight = pExpr->pRight; + if( pRight->op==TK_ID ){ + zDb = 0; + zTable = pExpr->pLeft->u.zToken; + zColumn = pRight->u.zToken; + }else{ + assert( pRight->op==TK_DOT ); + zDb = pExpr->pLeft->u.zToken; + zTable = pRight->pLeft->u.zToken; + zColumn = pRight->pRight->u.zToken; + } } return lookupName(pParse, zDb, zTable, zColumn, pNC, pExpr); } @@ -81009,67 +93849,84 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ int no_such_func = 0; /* True if no such function exists */ int wrong_num_args = 0; /* True if wrong number of arguments */ int is_agg = 0; /* True if is an aggregate function */ - int auth; /* Authorization to use the function */ int nId; /* Number of characters in function name */ const char *zId; /* The function name. */ FuncDef *pDef; /* Information about the function */ u8 enc = ENC(pParse->db); /* The database encoding */ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - notValidPartIdxWhere(pParse, pNC, "functions"); zId = pExpr->u.zToken; nId = sqlite3Strlen30(zId); - pDef = sqlite3FindFunction(pParse->db, zId, nId, n, enc, 0); + pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); if( pDef==0 ){ - pDef = sqlite3FindFunction(pParse->db, zId, nId, -2, enc, 0); + pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); if( pDef==0 ){ no_such_func = 1; }else{ wrong_num_args = 1; } }else{ - is_agg = pDef->xFunc==0; + is_agg = pDef->xFinalize!=0; if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ ExprSetProperty(pExpr, EP_Unlikely|EP_Skip); if( n==2 ){ pExpr->iTable = exprProbability(pList->a[1].pExpr); if( pExpr->iTable<0 ){ - sqlite3ErrorMsg(pParse, "second argument to likelihood() must be a " - "constant between 0.0 and 1.0"); + sqlite3ErrorMsg(pParse, + "second argument to likelihood() must be a " + "constant between 0.0 and 1.0"); pNC->nErr++; } }else{ - /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is equivalent to - ** likelihood(X, 0.0625). - ** EVIDENCE-OF: R-01283-11636 The unlikely(X) function is short-hand for - ** likelihood(X,0.0625). - ** EVIDENCE-OF: R-36850-34127 The likely(X) function is short-hand for - ** likelihood(X,0.9375). - ** EVIDENCE-OF: R-53436-40973 The likely(X) function is equivalent to - ** likelihood(X,0.9375). */ + /* EVIDENCE-OF: R-61304-29449 The unlikely(X) function is + ** equivalent to likelihood(X, 0.0625). + ** EVIDENCE-OF: R-01283-11636 The unlikely(X) function is + ** short-hand for likelihood(X,0.0625). + ** EVIDENCE-OF: R-36850-34127 The likely(X) function is short-hand + ** for likelihood(X,0.9375). + ** EVIDENCE-OF: R-53436-40973 The likely(X) function is equivalent + ** to likelihood(X,0.9375). */ /* TUNING: unlikely() probability is 0.0625. likely() is 0.9375 */ pExpr->iTable = pDef->zName[0]=='u' ? 8388608 : 125829120; } } #ifndef SQLITE_OMIT_AUTHORIZATION - auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0, pDef->zName, 0); - if( auth!=SQLITE_OK ){ - if( auth==SQLITE_DENY ){ - sqlite3ErrorMsg(pParse, "not authorized to use function: %s", - pDef->zName); - pNC->nErr++; + { + int auth = sqlite3AuthCheck(pParse, SQLITE_FUNCTION, 0,pDef->zName,0); + if( auth!=SQLITE_OK ){ + if( auth==SQLITE_DENY ){ + sqlite3ErrorMsg(pParse, "not authorized to use function: %s", + pDef->zName); + pNC->nErr++; + } + pExpr->op = TK_NULL; + return WRC_Prune; } - pExpr->op = TK_NULL; - return WRC_Prune; } #endif - if( pDef->funcFlags & SQLITE_FUNC_CONSTANT ) ExprSetProperty(pExpr,EP_Constant); + if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ + /* For the purposes of the EP_ConstFunc flag, date and time + ** functions and other functions that change slowly are considered + ** constant because they are constant for the duration of one query */ + ExprSetProperty(pExpr,EP_ConstFunc); + } + if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){ + /* Date/time functions that use 'now', and other functions like + ** sqlite_version() that might change over time cannot be used + ** in an index. */ + notValid(pParse, pNC, "non-deterministic functions", + NC_IdxExpr|NC_PartIdx); + } } if( is_agg && (pNC->ncFlags & NC_AllowAgg)==0 ){ sqlite3ErrorMsg(pParse, "misuse of aggregate function %.*s()", nId,zId); pNC->nErr++; is_agg = 0; - }else if( no_such_func && pParse->db->init.busy==0 ){ + }else if( no_such_func && pParse->db->init.busy==0 +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + && pParse->explain==0 +#endif + ){ sqlite3ErrorMsg(pParse, "no such function: %.*s", nId, zId); pNC->nErr++; }else if( wrong_num_args ){ @@ -81109,21 +93966,71 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_IN ); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ int nRef = pNC->nRef; - notValidCheckConstraint(pParse, pNC, "subqueries"); - notValidPartIdxWhere(pParse, pNC, "subqueries"); + notValid(pParse, pNC, "subqueries", NC_IsCheck|NC_PartIdx|NC_IdxExpr); sqlite3WalkSelect(pWalker, pExpr->x.pSelect); assert( pNC->nRef>=nRef ); if( nRef!=pNC->nRef ){ ExprSetProperty(pExpr, EP_VarSelect); + pNC->ncFlags |= NC_VarSelect; } } break; } case TK_VARIABLE: { - notValidCheckConstraint(pParse, pNC, "parameters"); - notValidPartIdxWhere(pParse, pNC, "parameters"); + notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); break; } + case TK_IS: + case TK_ISNOT: { + Expr *pRight; + assert( !ExprHasProperty(pExpr, EP_Reduced) ); + /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", + ** and "x IS NOT FALSE". */ + if( (pRight = pExpr->pRight)->op==TK_ID ){ + int rc = resolveExprStep(pWalker, pRight); + if( rc==WRC_Abort ) return WRC_Abort; + if( pRight->op==TK_TRUEFALSE ){ + pExpr->op2 = pExpr->op; + pExpr->op = TK_TRUTH; + return WRC_Continue; + } + } + /* Fall thru */ + } + case TK_BETWEEN: + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: { + int nLeft, nRight; + if( pParse->db->mallocFailed ) break; + assert( pExpr->pLeft!=0 ); + nLeft = sqlite3ExprVectorSize(pExpr->pLeft); + if( pExpr->op==TK_BETWEEN ){ + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[0].pExpr); + if( nRight==nLeft ){ + nRight = sqlite3ExprVectorSize(pExpr->x.pList->a[1].pExpr); + } + }else{ + assert( pExpr->pRight!=0 ); + nRight = sqlite3ExprVectorSize(pExpr->pRight); + } + if( nLeft!=nRight ){ + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + testcase( pExpr->op==TK_BETWEEN ); + sqlite3ErrorMsg(pParse, "row value misused"); + } + break; + } } return (pParse->nErr || pParse->db->mallocFailed) ? WRC_Abort : WRC_Continue; } @@ -81199,8 +94106,8 @@ static int resolveOrderByTermToExprList( memset(&nc, 0, sizeof(nc)); nc.pParse = pParse; nc.pSrcList = pSelect->pSrc; - nc.pEList = pEList; - nc.ncFlags = NC_AllowAgg; + nc.uNC.pEList = pEList; + nc.ncFlags = NC_AllowAgg|NC_UEList; nc.nErr = 0; db = pParse->db; savedSuppErr = db->suppressErr; @@ -81214,7 +94121,7 @@ static int resolveOrderByTermToExprList( ** result-set entry. */ for(i=0; i<pEList->nExpr; i++){ - if( sqlite3ExprCompare(pEList->a[i].pExpr, pE, -1)<2 ){ + if( sqlite3ExprCompare(0, pEList->a[i].pExpr, pE, -1)<2 ){ return i+1; } } @@ -81265,12 +94172,10 @@ static int resolveCompoundOrderBy( pOrderBy = pSelect->pOrderBy; if( pOrderBy==0 ) return 0; db = pParse->db; -#if SQLITE_MAX_COLUMN if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ sqlite3ErrorMsg(pParse, "too many terms in ORDER BY clause"); return 1; } -#endif for(i=0; i<pOrderBy->nExpr; i++){ pOrderBy->a[i].done = 0; } @@ -81315,9 +94220,11 @@ static int resolveCompoundOrderBy( if( pItem->pExpr==pE ){ pItem->pExpr = pNew; }else{ - assert( pItem->pExpr->op==TK_COLLATE ); - assert( pItem->pExpr->pLeft==pE ); - pItem->pExpr->pLeft = pNew; + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; } sqlite3ExprDelete(db, pE); pItem->u.x.iOrderByCol = (u16)iCol; @@ -81360,12 +94267,10 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( struct ExprList_item *pItem; if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; -#if SQLITE_MAX_COLUMN if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); return 1; } -#endif pEList = pSelect->pEList; assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ @@ -81374,7 +94279,8 @@ SQLITE_PRIVATE int sqlite3ResolveOrderGroupBy( resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); return 1; } - resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr, zType,0); + resolveAlias(pParse, pEList, pItem->u.x.iOrderByCol-1, pItem->pExpr, + zType,0); } } return 0; @@ -81445,7 +94351,7 @@ static int resolveOrderGroupBy( return 1; } for(j=0; j<pSelect->pEList->nExpr; j++){ - if( sqlite3ExprCompare(pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ + if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ pItem->u.x.iOrderByCol = j+1; } } @@ -81462,7 +94368,6 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ int isCompound; /* True if p is a compound select */ int nCompound; /* Number of compound terms processed so far */ Parse *pParse; /* Parsing context */ - ExprList *pEList; /* Result set expression list */ int i; /* Loop counter */ ExprList *pGroupBy; /* The GROUP BY clause */ Select *pLeftmost; /* Left-most of SELECT of a compound */ @@ -81503,10 +94408,23 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ */ memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; - if( sqlite3ResolveExprNames(&sNC, p->pLimit) || - sqlite3ResolveExprNames(&sNC, p->pOffset) ){ + if( sqlite3ResolveExprNames(&sNC, p->pLimit) ){ return WRC_Abort; } + + /* If the SF_Converted flags is set, then this Select object was + ** was created by the convertCompoundSelectToSubquery() function. + ** In this case the ORDER BY clause (p->pOrderBy) should be resolved + ** as if it were part of the sub-query, not the parent. This block + ** moves the pOrderBy down to the sub-query. It will be moved back + ** after the names have been resolved. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + assert( p->pSrc->nSrc==1 && p->pOrderBy ); + assert( pSub->pPrior && pSub->pOrderBy==0 ); + pSub->pOrderBy = p->pOrderBy; + p->pOrderBy = 0; + } /* Recursively resolve names in all subqueries */ @@ -81521,7 +94439,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** parent contexts. After resolving references to expressions in ** pItem->pSelect, check if this value has changed. If so, then ** SELECT statement pItem->pSelect must be correlated. Set the - ** pItem->isCorrelated flag if this is the case. */ + ** pItem->fg.isCorrelated flag if this is the case. */ for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef += pNC->nRef; if( pItem->zName ) pParse->zAuthContext = pItem->zName; @@ -81530,8 +94448,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ if( pParse->nErr || db->mallocFailed ) return WRC_Abort; for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef -= pNC->nRef; - assert( pItem->isCorrelated==0 && nRef<=0 ); - pItem->isCorrelated = (nRef!=0); + assert( pItem->fg.isCorrelated==0 && nRef<=0 ); + pItem->fg.isCorrelated = (nRef!=0); } } @@ -81543,14 +94461,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ sNC.pNext = pOuterNC; /* Resolve names in the result set. */ - pEList = p->pEList; - assert( pEList!=0 ); - for(i=0; i<pEList->nExpr; i++){ - Expr *pX = pEList->a[i].pExpr; - if( sqlite3ResolveExprNames(&sNC, pX) ){ - return WRC_Abort; - } - } + if( sqlite3ResolveExprListNames(&sNC, p->pEList) ) return WRC_Abort; /* If there are no aggregate functions in the result-set, and no GROUP BY ** expression, do not allow aggregates in any of the other expressions. @@ -81579,22 +94490,52 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ ** Minor point: If this is the case, then the expression will be ** re-evaluated for each reference to it. */ - sNC.pEList = p->pEList; + assert( (sNC.ncFlags & (NC_UAggInfo|NC_UUpsert))==0 ); + sNC.uNC.pEList = p->pEList; + sNC.ncFlags |= NC_UEList; if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; if( sqlite3ResolveExprNames(&sNC, p->pWhere) ) return WRC_Abort; + /* Resolve names in table-valued-function arguments */ + for(i=0; i<p->pSrc->nSrc; i++){ + struct SrcList_item *pItem = &p->pSrc->a[i]; + if( pItem->fg.isTabFunc + && sqlite3ResolveExprListNames(&sNC, pItem->u1.pFuncArg) + ){ + return WRC_Abort; + } + } + /* The ORDER BY and GROUP BY clauses may not refer to terms in ** outer queries */ sNC.pNext = 0; sNC.ncFlags |= NC_AllowAgg; + /* If this is a converted compound query, move the ORDER BY clause from + ** the sub-query back to the parent query. At this point each term + ** within the ORDER BY clause has been transformed to an integer value. + ** These integers will be replaced by copies of the corresponding result + ** set expressions by the call to resolveOrderGroupBy() below. */ + if( p->selFlags & SF_Converted ){ + Select *pSub = p->pSrc->a[0].pSelect; + p->pOrderBy = pSub->pOrderBy; + pSub->pOrderBy = 0; + } + /* Process the ORDER BY clause for singleton SELECT statements. ** The ORDER BY clause for compounds SELECT statements is handled ** below, after all of the result-sets for all of the elements of ** the compound have been resolved. + ** + ** If there is an ORDER BY clause on a term of a compound-select other + ** than the right-most term, then that is a syntax error. But the error + ** is not detected until much later, and so we need to go ahead and + ** resolve those symbols on the incorrect ORDER BY for consistency. */ - if( !isCompound && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") ){ + if( isCompound<=nCompound /* Defer right-most ORDER BY of a compound */ + && resolveOrderGroupBy(&sNC, p, p->pOrderBy, "ORDER") + ){ return WRC_Abort; } if( db->mallocFailed ){ @@ -81619,6 +94560,13 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } + /* If this is part of a compound SELECT, check that it has the right + ** number of expressions in the select list. */ + if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ + sqlite3SelectWrongNumTermsError(pParse, p->pNext); + return WRC_Abort; + } + /* Advance to the next term of the compound */ p = p->pPrior; @@ -81690,37 +94638,48 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames( u16 savedHasAgg; Walker w; - if( pExpr==0 ) return 0; -#if SQLITE_MAX_EXPR_DEPTH>0 - { - Parse *pParse = pNC->pParse; - if( sqlite3ExprCheckHeight(pParse, pExpr->nHeight+pNC->pParse->nHeight) ){ - return 1; - } - pParse->nHeight += pExpr->nHeight; - } -#endif + if( pExpr==0 ) return SQLITE_OK; savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg); pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg); - memset(&w, 0, sizeof(w)); + w.pParse = pNC->pParse; w.xExprCallback = resolveExprStep; w.xSelectCallback = resolveSelectStep; - w.pParse = pNC->pParse; + w.xSelectCallback2 = 0; w.u.pNC = pNC; +#if SQLITE_MAX_EXPR_DEPTH>0 + w.pParse->nHeight += pExpr->nHeight; + if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ + return SQLITE_ERROR; + } +#endif sqlite3WalkExpr(&w, pExpr); #if SQLITE_MAX_EXPR_DEPTH>0 - pNC->pParse->nHeight -= pExpr->nHeight; + w.pParse->nHeight -= pExpr->nHeight; #endif - if( pNC->nErr>0 || w.pParse->nErr>0 ){ - ExprSetProperty(pExpr, EP_Error); - } if( pNC->ncFlags & NC_HasAgg ){ ExprSetProperty(pExpr, EP_Agg); } pNC->ncFlags |= savedHasAgg; - return ExprHasProperty(pExpr, EP_Error); + return pNC->nErr>0 || w.pParse->nErr>0; } +/* +** Resolve all names for all expression in an expression list. This is +** just like sqlite3ResolveExprNames() except that it works for an expression +** list rather than a single expression. +*/ +SQLITE_PRIVATE int sqlite3ResolveExprListNames( + NameContext *pNC, /* Namespace to resolve expressions in. */ + ExprList *pList /* The expression list to be analyzed. */ +){ + int i; + if( pList ){ + for(i=0; i<pList->nExpr; i++){ + if( sqlite3ResolveExprNames(pNC, pList->a[i].pExpr) ) return WRC_Abort; + } + } + return WRC_Continue; +} /* ** Resolve all names in all expressions of a SELECT and in all @@ -81742,9 +94701,9 @@ SQLITE_PRIVATE void sqlite3ResolveSelectNames( Walker w; assert( p!=0 ); - memset(&w, 0, sizeof(w)); w.xExprCallback = resolveExprStep; w.xSelectCallback = resolveSelectStep; + w.xSelectCallback2 = 0; w.pParse = pParse; w.u.pNC = pOuterNC; sqlite3WalkSelect(&w, p); @@ -81764,15 +94723,14 @@ SQLITE_PRIVATE void sqlite3ResolveSelectNames( SQLITE_PRIVATE void sqlite3ResolveSelfReference( Parse *pParse, /* Parsing context */ Table *pTab, /* The table being referenced */ - int type, /* NC_IsCheck or NC_PartIdx */ + int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */ Expr *pExpr, /* Expression to resolve. May be NULL. */ - ExprList *pList /* Expression list to resolve. May be NUL. */ + ExprList *pList /* Expression list to resolve. May be NULL. */ ){ SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */ - int i; /* Loop counter */ - assert( type==NC_IsCheck || type==NC_PartIdx ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr ); memset(&sNC, 0, sizeof(sNC)); memset(&sSrc, 0, sizeof(sSrc)); sSrc.nSrc = 1; @@ -81783,13 +94741,7 @@ SQLITE_PRIVATE void sqlite3ResolveSelfReference( sNC.pSrcList = &sSrc; sNC.ncFlags = type; if( sqlite3ResolveExprNames(&sNC, pExpr) ) return; - if( pList ){ - for(i=0; i<pList->nExpr; i++){ - if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){ - return; - } - } - } + if( pList ) sqlite3ResolveExprListNames(&sNC, pList); } /************** End of resolve.c *********************************************/ @@ -81808,6 +94760,19 @@ SQLITE_PRIVATE void sqlite3ResolveSelfReference( ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. */ +/* #include "sqliteInt.h" */ + +/* Forward declarations */ +static void exprCodeBetween(Parse*,Expr*,int,void(*)(Parse*,Expr*,int,int),int); +static int exprCodeVector(Parse *pParse, Expr *p, int *piToFree); + +/* +** Return the affinity character for a single column of a table. +*/ +SQLITE_PRIVATE char sqlite3TableColumnAffinity(Table *pTab, int iCol){ + assert( iCol<pTab->nCol ); + return iCol>=0 ? pTab->aCol[iCol].affinity : SQLITE_AFF_INTEGER; +} /* ** Return the 'affinity' of the expression pExpr if any. @@ -81834,21 +94799,21 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){ assert( pExpr->flags&EP_xIsSelect ); return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); } + if( op==TK_REGISTER ) op = pExpr->op2; #ifndef SQLITE_OMIT_CAST if( op==TK_CAST ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); return sqlite3AffinityType(pExpr->u.zToken, 0); } #endif - if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER) - && pExpr->pTab!=0 - ){ - /* op==TK_REGISTER && pExpr->pTab!=0 happens when pExpr was originally - ** a TK_COLUMN but was previously evaluated and cached in a register */ - int j = pExpr->iColumn; - if( j<0 ) return SQLITE_AFF_INTEGER; - assert( pExpr->pTab && j<pExpr->pTab->nCol ); - return pExpr->pTab->aCol[j].affinity; + if( (op==TK_AGG_COLUMN || op==TK_COLUMN) && pExpr->pTab ){ + return sqlite3TableColumnAffinity(pExpr->pTab, pExpr->iColumn); + } + if( op==TK_SELECT_COLUMN ){ + assert( pExpr->pLeft->flags&EP_xIsSelect ); + return sqlite3ExprAffinity( + pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr + ); } return pExpr->affinity; } @@ -81864,10 +94829,11 @@ SQLITE_PRIVATE char sqlite3ExprAffinity(Expr *pExpr){ SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken( Parse *pParse, /* Parsing context */ Expr *pExpr, /* Add the "COLLATE" clause to this expression */ - const Token *pCollName /* Name of collating sequence */ + const Token *pCollName, /* Name of collating sequence */ + int dequote /* True to dequote pCollName */ ){ if( pCollName->n>0 ){ - Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLLATE, pCollName, 1); + Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLLATE, pCollName, dequote); if( pNew ){ pNew->pLeft = pExpr; pNew->flags |= EP_Collate|EP_Skip; @@ -81879,13 +94845,12 @@ SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken( SQLITE_PRIVATE Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ Token s; assert( zC!=0 ); - s.z = zC; - s.n = sqlite3Strlen30(s.z); - return sqlite3ExprAddCollateToken(pParse, pExpr, &s); + sqlite3TokenInit(&s, (char*)zC); + return sqlite3ExprAddCollateToken(pParse, pExpr, &s, 0); } /* -** Skip over any TK_COLLATE or TK_AS operators and any unlikely() +** Skip over any TK_COLLATE operators and any unlikely() ** or likelihood() function at the root of an expression. */ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ @@ -81896,7 +94861,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ assert( pExpr->op==TK_FUNCTION ); pExpr = pExpr->x.pList->a[0].pExpr; }else{ - assert( pExpr->op==TK_COLLATE || pExpr->op==TK_AS ); + assert( pExpr->op==TK_COLLATE ); pExpr = pExpr->pLeft; } } @@ -81907,6 +94872,11 @@ SQLITE_PRIVATE Expr *sqlite3ExprSkipCollate(Expr *pExpr){ ** Return the collation sequence for the expression pExpr. If ** there is no defined collating sequence, return NULL. ** +** See also: sqlite3ExprNNCollSeq() +** +** The sqlite3ExprNNCollSeq() works the same exact that it returns the +** default collation if pExpr has no defined collation. +** ** The collating sequence might be determined by a COLLATE operator ** or by the presence of a column with a defined collating sequence. ** COLLATE operators take first precedence. Left operands take @@ -81927,9 +94897,9 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); break; } - if( p->pTab!=0 - && (op==TK_AGG_COLUMN || op==TK_COLUMN + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_REGISTER || op==TK_TRIGGER) + && p->pTab!=0 ){ /* op==TK_REGISTER && p->pTab!=0 happens when pExpr was originally ** a TK_COLUMN but was previously evaluated and cached in a register */ @@ -81941,10 +94911,25 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ break; } if( p->flags & EP_Collate ){ - if( ALWAYS(p->pLeft) && (p->pLeft->flags & EP_Collate)!=0 ){ + if( p->pLeft && (p->pLeft->flags & EP_Collate)!=0 ){ p = p->pLeft; }else{ - p = p->pRight; + Expr *pNext = p->pRight; + /* The Expr.x union is never used at the same time as Expr.pRight */ + assert( p->x.pList==0 || p->pRight==0 ); + /* p->flags holds EP_Collate and p->pLeft->flags does not. And + ** p->x.pSelect cannot. So if p->x.pLeft exists, it must hold at + ** least one EP_Collate. Thus the following two ALWAYS. */ + if( p->x.pList!=0 && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) ){ + int i; + for(i=0; ALWAYS(i<p->x.pList->nExpr); i++){ + if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ + pNext = p->x.pList->a[i].pExpr; + break; + } + } + } + p = pNext; } }else{ break; @@ -81956,6 +94941,32 @@ SQLITE_PRIVATE CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ return pColl; } +/* +** Return the collation sequence for the expression pExpr. If +** there is no defined collating sequence, return a pointer to the +** defautl collation sequence. +** +** See also: sqlite3ExprCollSeq() +** +** The sqlite3ExprCollSeq() routine works the same except that it +** returns NULL if there is no defined collation. +*/ +SQLITE_PRIVATE CollSeq *sqlite3ExprNNCollSeq(Parse *pParse, Expr *pExpr){ + CollSeq *p = sqlite3ExprCollSeq(pParse, pExpr); + if( p==0 ) p = pParse->db->pDfltColl; + assert( p!=0 ); + return p; +} + +/* +** Return TRUE if the two expressions have equivalent collating sequences. +*/ +SQLITE_PRIVATE int sqlite3ExprCollSeqMatch(Parse *pParse, Expr *pE1, Expr *pE2){ + CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pE1); + CollSeq *pColl2 = sqlite3ExprNNCollSeq(pParse, pE2); + return sqlite3StrICmp(pColl1->zName, pColl2->zName)==0; +} + /* ** pExpr is an operand of a comparison operator. aff2 is the ** type affinity of the other operand. This routine returns the @@ -81970,13 +94981,13 @@ SQLITE_PRIVATE char sqlite3CompareAffinity(Expr *pExpr, char aff2){ if( sqlite3IsNumericAffinity(aff1) || sqlite3IsNumericAffinity(aff2) ){ return SQLITE_AFF_NUMERIC; }else{ - return SQLITE_AFF_NONE; + return SQLITE_AFF_BLOB; } }else if( !aff1 && !aff2 ){ /* Neither side of the comparison is a column. Compare the ** results directly. */ - return SQLITE_AFF_NONE; + return SQLITE_AFF_BLOB; }else{ /* One side is a column, the other is not. Use the columns affinity. */ assert( aff1==0 || aff2==0 ); @@ -81999,8 +95010,8 @@ static char comparisonAffinity(Expr *pExpr){ aff = sqlite3CompareAffinity(pExpr->pRight, aff); }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); - }else if( !aff ){ - aff = SQLITE_AFF_NONE; + }else if( aff==0 ){ + aff = SQLITE_AFF_BLOB; } return aff; } @@ -82014,7 +95025,7 @@ static char comparisonAffinity(Expr *pExpr){ SQLITE_PRIVATE int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ char aff = comparisonAffinity(pExpr); switch( aff ){ - case SQLITE_AFF_NONE: + case SQLITE_AFF_BLOB: return 1; case SQLITE_AFF_TEXT: return idx_affinity==SQLITE_AFF_TEXT; @@ -82089,6 +95100,270 @@ static int codeCompare( return addr; } +/* +** Return true if expression pExpr is a vector, or false otherwise. +** +** A vector is defined as any expression that results in two or more +** columns of result. Every TK_VECTOR node is an vector because the +** parser will not generate a TK_VECTOR with fewer than two entries. +** But a TK_SELECT might be either a vector or a scalar. It is only +** considered a vector if it has two or more result columns. +*/ +SQLITE_PRIVATE int sqlite3ExprIsVector(Expr *pExpr){ + return sqlite3ExprVectorSize(pExpr)>1; +} + +/* +** If the expression passed as the only argument is of type TK_VECTOR +** return the number of expressions in the vector. Or, if the expression +** is a sub-select, return the number of columns in the sub-select. For +** any other type of expression, return 1. +*/ +SQLITE_PRIVATE int sqlite3ExprVectorSize(Expr *pExpr){ + u8 op = pExpr->op; + if( op==TK_REGISTER ) op = pExpr->op2; + if( op==TK_VECTOR ){ + return pExpr->x.pList->nExpr; + }else if( op==TK_SELECT ){ + return pExpr->x.pSelect->pEList->nExpr; + }else{ + return 1; + } +} + +/* +** Return a pointer to a subexpression of pVector that is the i-th +** column of the vector (numbered starting with 0). The caller must +** ensure that i is within range. +** +** If pVector is really a scalar (and "scalar" here includes subqueries +** that return a single column!) then return pVector unmodified. +** +** pVector retains ownership of the returned subexpression. +** +** If the vector is a (SELECT ...) then the expression returned is +** just the expression for the i-th term of the result set, and may +** not be ready for evaluation because the table cursor has not yet +** been positioned. +*/ +SQLITE_PRIVATE Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ + assert( i<sqlite3ExprVectorSize(pVector) ); + if( sqlite3ExprIsVector(pVector) ){ + assert( pVector->op2==0 || pVector->op==TK_REGISTER ); + if( pVector->op==TK_SELECT || pVector->op2==TK_SELECT ){ + return pVector->x.pSelect->pEList->a[i].pExpr; + }else{ + return pVector->x.pList->a[i].pExpr; + } + } + return pVector; +} + +/* +** Compute and return a new Expr object which when passed to +** sqlite3ExprCode() will generate all necessary code to compute +** the iField-th column of the vector expression pVector. +** +** It is ok for pVector to be a scalar (as long as iField==0). +** In that case, this routine works like sqlite3ExprDup(). +** +** The caller owns the returned Expr object and is responsible for +** ensuring that the returned value eventually gets freed. +** +** The caller retains ownership of pVector. If pVector is a TK_SELECT, +** then the returned object will reference pVector and so pVector must remain +** valid for the life of the returned object. If pVector is a TK_VECTOR +** or a scalar expression, then it can be deleted as soon as this routine +** returns. +** +** A trick to cause a TK_SELECT pVector to be deleted together with +** the returned Expr object is to attach the pVector to the pRight field +** of the returned TK_SELECT_COLUMN Expr object. +*/ +SQLITE_PRIVATE Expr *sqlite3ExprForVectorField( + Parse *pParse, /* Parsing context */ + Expr *pVector, /* The vector. List of expressions or a sub-SELECT */ + int iField /* Which column of the vector to return */ +){ + Expr *pRet; + if( pVector->op==TK_SELECT ){ + assert( pVector->flags & EP_xIsSelect ); + /* The TK_SELECT_COLUMN Expr node: + ** + ** pLeft: pVector containing TK_SELECT. Not deleted. + ** pRight: not used. But recursively deleted. + ** iColumn: Index of a column in pVector + ** iTable: 0 or the number of columns on the LHS of an assignment + ** pLeft->iTable: First in an array of register holding result, or 0 + ** if the result is not yet computed. + ** + ** sqlite3ExprDelete() specifically skips the recursive delete of + ** pLeft on TK_SELECT_COLUMN nodes. But pRight is followed, so pVector + ** can be attached to pRight to cause this node to take ownership of + ** pVector. Typically there will be multiple TK_SELECT_COLUMN nodes + ** with the same pLeft pointer to the pVector, but only one of them + ** will own the pVector. + */ + pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0); + if( pRet ){ + pRet->iColumn = iField; + pRet->pLeft = pVector; + } + assert( pRet==0 || pRet->iTable==0 ); + }else{ + if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; + pRet = sqlite3ExprDup(pParse->db, pVector, 0); + } + return pRet; +} + +/* +** If expression pExpr is of type TK_SELECT, generate code to evaluate +** it. Return the register in which the result is stored (or, if the +** sub-select returns more than one column, the first in an array +** of registers in which the result is stored). +** +** If pExpr is not a TK_SELECT expression, return 0. +*/ +static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ + int reg = 0; +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->op==TK_SELECT ){ + reg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); + } +#endif + return reg; +} + +/* +** Argument pVector points to a vector expression - either a TK_VECTOR +** or TK_SELECT that returns more than one column. This function returns +** the register number of a register that contains the value of +** element iField of the vector. +** +** If pVector is a TK_SELECT expression, then code for it must have +** already been generated using the exprCodeSubselect() routine. In this +** case parameter regSelect should be the first in an array of registers +** containing the results of the sub-select. +** +** If pVector is of type TK_VECTOR, then code for the requested field +** is generated. In this case (*pRegFree) may be set to the number of +** a temporary register to be freed by the caller before returning. +** +** Before returning, output parameter (*ppExpr) is set to point to the +** Expr object corresponding to element iElem of the vector. +*/ +static int exprVectorRegister( + Parse *pParse, /* Parse context */ + Expr *pVector, /* Vector to extract element from */ + int iField, /* Field to extract from pVector */ + int regSelect, /* First in array of registers */ + Expr **ppExpr, /* OUT: Expression element */ + int *pRegFree /* OUT: Temp register to free */ +){ + u8 op = pVector->op; + assert( op==TK_VECTOR || op==TK_REGISTER || op==TK_SELECT ); + if( op==TK_REGISTER ){ + *ppExpr = sqlite3VectorFieldSubexpr(pVector, iField); + return pVector->iTable+iField; + } + if( op==TK_SELECT ){ + *ppExpr = pVector->x.pSelect->pEList->a[iField].pExpr; + return regSelect+iField; + } + *ppExpr = pVector->x.pList->a[iField].pExpr; + return sqlite3ExprCodeTemp(pParse, *ppExpr, pRegFree); +} + +/* +** Expression pExpr is a comparison between two vector values. Compute +** the result of the comparison (1, 0, or NULL) and write that +** result into register dest. +** +** The caller must satisfy the following preconditions: +** +** if pExpr->op==TK_IS: op==TK_EQ and p5==SQLITE_NULLEQ +** if pExpr->op==TK_ISNOT: op==TK_NE and p5==SQLITE_NULLEQ +** otherwise: op==pExpr->op and p5==0 +*/ +static void codeVectorCompare( + Parse *pParse, /* Code generator context */ + Expr *pExpr, /* The comparison operation */ + int dest, /* Write results into this register */ + u8 op, /* Comparison operator */ + u8 p5 /* SQLITE_NULLEQ or zero */ +){ + Vdbe *v = pParse->pVdbe; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + int nLeft = sqlite3ExprVectorSize(pLeft); + int i; + int regLeft = 0; + int regRight = 0; + u8 opx = op; + int addrDone = sqlite3VdbeMakeLabel(v); + + if( nLeft!=sqlite3ExprVectorSize(pRight) ){ + sqlite3ErrorMsg(pParse, "row value misused"); + return; + } + assert( pExpr->op==TK_EQ || pExpr->op==TK_NE + || pExpr->op==TK_IS || pExpr->op==TK_ISNOT + || pExpr->op==TK_LT || pExpr->op==TK_GT + || pExpr->op==TK_LE || pExpr->op==TK_GE + ); + assert( pExpr->op==op || (pExpr->op==TK_IS && op==TK_EQ) + || (pExpr->op==TK_ISNOT && op==TK_NE) ); + assert( p5==0 || pExpr->op!=op ); + assert( p5==SQLITE_NULLEQ || pExpr->op==op ); + + p5 |= SQLITE_STOREP2; + if( opx==TK_LE ) opx = TK_LT; + if( opx==TK_GE ) opx = TK_GT; + + regLeft = exprCodeSubselect(pParse, pLeft); + regRight = exprCodeSubselect(pParse, pRight); + + for(i=0; 1 /*Loop exits by "break"*/; i++){ + int regFree1 = 0, regFree2 = 0; + Expr *pL, *pR; + int r1, r2; + assert( i>=0 && i<nLeft ); + if( i>0 ) sqlite3ExprCachePush(pParse); + r1 = exprVectorRegister(pParse, pLeft, i, regLeft, &pL, ®Free1); + r2 = exprVectorRegister(pParse, pRight, i, regRight, &pR, ®Free2); + codeCompare(pParse, pL, pR, opx, r1, r2, dest, p5); + testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); + sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ReleaseTempReg(pParse, regFree2); + if( i>0 ) sqlite3ExprCachePop(pParse); + if( i==nLeft-1 ){ + break; + } + if( opx==TK_EQ ){ + sqlite3VdbeAddOp2(v, OP_IfNot, dest, addrDone); VdbeCoverage(v); + p5 |= SQLITE_KEEPNULL; + }else if( opx==TK_NE ){ + sqlite3VdbeAddOp2(v, OP_If, dest, addrDone); VdbeCoverage(v); + p5 |= SQLITE_KEEPNULL; + }else{ + assert( op==TK_LT || op==TK_GT || op==TK_LE || op==TK_GE ); + sqlite3VdbeAddOp2(v, OP_ElseNotEq, 0, addrDone); + VdbeCoverageIf(v, op==TK_LT); + VdbeCoverageIf(v, op==TK_GT); + VdbeCoverageIf(v, op==TK_LE); + VdbeCoverageIf(v, op==TK_GE); + if( i==nLeft-2 ) opx = op; + } + } + sqlite3VdbeResolveLabel(v, addrDone); +} + #if SQLITE_MAX_EXPR_DEPTH>0 /* ** Check that argument nHeight is less than or equal to the maximum @@ -82131,16 +95406,15 @@ static void heightOfExprList(ExprList *p, int *pnHeight){ } } } -static void heightOfSelect(Select *p, int *pnHeight){ - if( p ){ +static void heightOfSelect(Select *pSelect, int *pnHeight){ + Select *p; + for(p=pSelect; p; p=p->pPrior){ heightOfExpr(p->pWhere, pnHeight); heightOfExpr(p->pHaving, pnHeight); heightOfExpr(p->pLimit, pnHeight); - heightOfExpr(p->pOffset, pnHeight); heightOfExprList(p->pEList, pnHeight); heightOfExprList(p->pGroupBy, pnHeight); heightOfExprList(p->pOrderBy, pnHeight); - heightOfSelect(p->pPrior, pnHeight); } } @@ -82150,6 +95424,9 @@ static void heightOfSelect(Select *p, int *pnHeight){ ** Expr.pSelect member has a height of 1. Any other expression ** has a height equal to the maximum height of any other ** referenced Expr plus one. +** +** Also propagate EP_Propagate flags up from Expr.x.pList to Expr.flags, +** if appropriate. */ static void exprSetHeight(Expr *p){ int nHeight = 0; @@ -82157,8 +95434,9 @@ static void exprSetHeight(Expr *p){ heightOfExpr(p->pRight, &nHeight); if( ExprHasProperty(p, EP_xIsSelect) ){ heightOfSelect(p->x.pSelect, &nHeight); - }else{ + }else if( p->x.pList ){ heightOfExprList(p->x.pList, &nHeight); + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); } p->nHeight = nHeight + 1; } @@ -82167,8 +95445,12 @@ static void exprSetHeight(Expr *p){ ** Set the Expr.nHeight variable using the exprSetHeight() function. If ** the height is greater than the maximum allowed expression depth, ** leave an error in pParse. +** +** Also propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. */ -SQLITE_PRIVATE void sqlite3ExprSetHeight(Parse *pParse, Expr *p){ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( pParse->nErr ) return; exprSetHeight(p); sqlite3ExprCheckHeight(pParse, p->nHeight); } @@ -82182,8 +95464,17 @@ SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){ heightOfSelect(p, &nHeight); return nHeight; } -#else - #define exprSetHeight(y) +#else /* ABOVE: Height enforcement enabled. BELOW: Height enforcement off */ +/* +** Propagate all EP_Propagate flags from the Expr.x.pList into +** Expr.flags. +*/ +SQLITE_PRIVATE void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p){ + if( p && p->x.pList && !ExprHasProperty(p, EP_xIsSelect) ){ + p->flags |= EP_Propagate & sqlite3ExprListFlags(p->x.pList); + } +} +#define exprSetHeight(y) #endif /* SQLITE_MAX_EXPR_DEPTH>0 */ /* @@ -82195,7 +95486,7 @@ SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){ ** is responsible for making sure the node eventually gets freed. ** ** If dequote is true, then the token (if it exists) is dequoted. -** If dequote is false, no dequoting is performance. The deQuote +** If dequote is false, no dequoting is performed. The deQuote ** parameter is ignored if pToken is NULL or if the token does not ** appear to be quoted. If the quotes were of the form "..." (double-quotes) ** then the EP_DblQuoted flag is set on the expression node. @@ -82207,7 +95498,7 @@ SQLITE_PRIVATE int sqlite3SelectExprHeight(Select *p){ ** is allocated to hold the integer text and the dequote flag is ignored. */ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( - sqlite3 *db, /* Handle for sqlite3DbMallocZero() (may be null) */ + sqlite3 *db, /* Handle for sqlite3DbMallocRawNN() */ int op, /* Expression opcode */ const Token *pToken, /* Token argument. Might be NULL */ int dequote /* True to dequote */ @@ -82216,6 +95507,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( int nExtra = 0; int iValue = 0; + assert( db!=0 ); if( pToken ){ if( op!=TK_INTEGER || pToken->z==0 || sqlite3GetInt32(pToken->z, &iValue)==0 ){ @@ -82223,24 +95515,23 @@ SQLITE_PRIVATE Expr *sqlite3ExprAlloc( assert( iValue>=0 ); } } - pNew = sqlite3DbMallocZero(db, sizeof(Expr)+nExtra); + pNew = sqlite3DbMallocRawNN(db, sizeof(Expr)+nExtra); if( pNew ){ + memset(pNew, 0, sizeof(Expr)); pNew->op = (u8)op; pNew->iAgg = -1; if( pToken ){ if( nExtra==0 ){ - pNew->flags |= EP_IntValue; + pNew->flags |= EP_IntValue|EP_Leaf; pNew->u.iValue = iValue; }else{ - int c; pNew->u.zToken = (char*)&pNew[1]; assert( pToken->z!=0 || pToken->n==0 ); if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); pNew->u.zToken[pToken->n] = 0; - if( dequote && nExtra>=3 - && ((c = pToken->z[0])=='\'' || c=='"' || c=='[' || c=='`') ){ + if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ + if( pNew->u.zToken[0]=='"' ) pNew->flags |= EP_DblQuoted; sqlite3Dequote(pNew->u.zToken); - if( c=='"' ) pNew->flags |= EP_DblQuoted; } } } @@ -82262,7 +95553,7 @@ SQLITE_PRIVATE Expr *sqlite3Expr( ){ Token x; x.z = zToken; - x.n = zToken ? sqlite3Strlen30(zToken) : 0; + x.n = sqlite3Strlen30(zToken); return sqlite3ExprAlloc(db, op, &x, 0); } @@ -82285,11 +95576,11 @@ SQLITE_PRIVATE void sqlite3ExprAttachSubtrees( }else{ if( pRight ){ pRoot->pRight = pRight; - pRoot->flags |= EP_Collate & pRight->flags; + pRoot->flags |= EP_Propagate & pRight->flags; } if( pLeft ){ pRoot->pLeft = pLeft; - pRoot->flags |= EP_Collate & pLeft->flags; + pRoot->flags |= EP_Propagate & pLeft->flags; } exprSetHeight(pRoot); } @@ -82306,15 +95597,19 @@ SQLITE_PRIVATE Expr *sqlite3PExpr( Parse *pParse, /* Parsing context */ int op, /* Expression opcode */ Expr *pLeft, /* Left operand */ - Expr *pRight, /* Right operand */ - const Token *pToken /* Argument token */ + Expr *pRight /* Right operand */ ){ Expr *p; - if( op==TK_AND && pLeft && pRight && pParse->nErr==0 ){ + if( op==TK_AND && pParse->nErr==0 ){ /* Take advantage of short-circuit false optimization for AND */ p = sqlite3ExprAnd(pParse->db, pLeft, pRight); }else{ - p = sqlite3ExprAlloc(pParse->db, op, pToken, 1); + p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = op & TKFLG_MASK; + p->iAgg = -1; + } sqlite3ExprAttachSubtrees(pParse->db, p, pLeft, pRight); } if( p ) { @@ -82323,6 +95618,22 @@ SQLITE_PRIVATE Expr *sqlite3PExpr( return p; } +/* +** Add pSelect to the Expr.x.pSelect field. Or, if pExpr is NULL (due +** do a memory allocation failure) then delete the pSelect object. +*/ +SQLITE_PRIVATE void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pSelect){ + if( pExpr ){ + pExpr->x.pSelect = pSelect; + ExprSetProperty(pExpr, EP_xIsSelect|EP_Subquery); + sqlite3ExprSetHeightAndFlags(pParse, pExpr); + }else{ + assert( pParse->db->mallocFailed ); + sqlite3SelectDelete(pParse->db, pSelect); + } +} + + /* ** If the expression is always either TRUE or FALSE (respectively), ** then return 1. If one cannot determine the truth value of the @@ -82388,8 +95699,9 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token * return 0; } pNew->x.pList = pList; + ExprSetProperty(pNew, EP_HasFunc); assert( !ExprHasProperty(pNew, EP_xIsSelect) ); - sqlite3ExprSetHeight(pParse, pNew); + sqlite3ExprSetHeightAndFlags(pParse, pNew); return pNew; } @@ -82401,7 +95713,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token * ** variable number. ** ** Wildcards of the form "?nnn" are assigned the number "nnn". We make -** sure "nnn" is not too be to avoid a denial of service attack when +** sure "nnn" is not too big to avoid a denial of service attack when ** the SQL statement comes from an external source. ** ** Wildcards of the form ":aaa", "@aaa", or "$aaa" are assigned the same number @@ -82409,28 +95721,34 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction(Parse *pParse, ExprList *pList, Token * ** instance of the wildcard, the next sequential variable number is ** assigned. */ -SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ +SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr, u32 n){ sqlite3 *db = pParse->db; const char *z; + ynVar x; if( pExpr==0 ) return; assert( !ExprHasProperty(pExpr, EP_IntValue|EP_Reduced|EP_TokenOnly) ); z = pExpr->u.zToken; assert( z!=0 ); assert( z[0]!=0 ); + assert( n==(u32)sqlite3Strlen30(z) ); if( z[1]==0 ){ /* Wildcard of the form "?". Assign the next variable number */ assert( z[0]=='?' ); - pExpr->iColumn = (ynVar)(++pParse->nVar); + x = (ynVar)(++pParse->nVar); }else{ - ynVar x = 0; - u32 n = sqlite3Strlen30(z); + int doAdd = 0; if( z[0]=='?' ){ /* Wildcard of the form "?nnn". Convert "nnn" to an integer and ** use it as the variable number */ i64 i; - int bOk = 0==sqlite3Atoi64(&z[1], &i, n-1, SQLITE_UTF8); - pExpr->iColumn = x = (ynVar)i; + int bOk; + if( n==2 ){ /*OPTIMIZATION-IF-TRUE*/ + i = z[1]-'0'; /* The common case of ?N for a single digit N */ + bOk = 1; + }else{ + bOk = 0==sqlite3Atoi64(&z[1], &i, n-1, SQLITE_UTF8); + } testcase( i==0 ); testcase( i==1 ); testcase( i==db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]-1 ); @@ -82438,41 +95756,32 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ if( bOk==0 || i<1 || i>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "variable number must be between ?1 and ?%d", db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER]); - x = 0; + return; } - if( i>pParse->nVar ){ - pParse->nVar = (int)i; + x = (ynVar)i; + if( x>pParse->nVar ){ + pParse->nVar = (int)x; + doAdd = 1; + }else if( sqlite3VListNumToName(pParse->pVList, x)==0 ){ + doAdd = 1; } }else{ /* Wildcards like ":aaa", "$aaa" or "@aaa". Reuse the same variable ** number as the prior appearance of the same name, or if the name ** has never appeared before, reuse the same variable number */ - ynVar i; - for(i=0; i<pParse->nzVar; i++){ - if( pParse->azVar[i] && strcmp(pParse->azVar[i],z)==0 ){ - pExpr->iColumn = x = (ynVar)i+1; - break; - } - } - if( x==0 ) x = pExpr->iColumn = (ynVar)(++pParse->nVar); - } - if( x>0 ){ - if( x>pParse->nzVar ){ - char **a; - a = sqlite3DbRealloc(db, pParse->azVar, x*sizeof(a[0])); - if( a==0 ) return; /* Error reported through db->mallocFailed */ - pParse->azVar = a; - memset(&a[pParse->nzVar], 0, (x-pParse->nzVar)*sizeof(a[0])); - pParse->nzVar = x; - } - if( z[0]!='?' || pParse->azVar[x-1]==0 ){ - sqlite3DbFree(db, pParse->azVar[x-1]); - pParse->azVar[x-1] = sqlite3DbStrNDup(db, z, n); + x = (ynVar)sqlite3VListNameToNum(pParse->pVList, z, n); + if( x==0 ){ + x = (ynVar)(++pParse->nVar); + doAdd = 1; } } - } - if( !pParse->nErr && pParse->nVar>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ + if( doAdd ){ + pParse->pVList = sqlite3VListAdd(db, pParse->pVList, z, n, x); + } + } + pExpr->iColumn = x; + if( x>db->aLimit[SQLITE_LIMIT_VARIABLE_NUMBER] ){ sqlite3ErrorMsg(pParse, "too many SQL variables"); } } @@ -82480,26 +95789,37 @@ SQLITE_PRIVATE void sqlite3ExprAssignVarNumber(Parse *pParse, Expr *pExpr){ /* ** Recursively delete an expression tree. */ -SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ - if( p==0 ) return; +static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ + assert( p!=0 ); /* Sanity check: Assert that the IntValue is non-negative if it exists */ assert( !ExprHasProperty(p, EP_IntValue) || p->u.iValue>=0 ); - if( !ExprHasProperty(p, EP_TokenOnly) ){ +#ifdef SQLITE_DEBUG + if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ + assert( p->pLeft==0 ); + assert( p->pRight==0 ); + assert( p->x.pSelect==0 ); + } +#endif + if( !ExprHasProperty(p, (EP_TokenOnly|EP_Leaf)) ){ /* The Expr.x union is never used at the same time as Expr.pRight */ assert( p->x.pList==0 || p->pRight==0 ); - sqlite3ExprDelete(db, p->pLeft); - sqlite3ExprDelete(db, p->pRight); - if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); - if( ExprHasProperty(p, EP_xIsSelect) ){ + if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); + if( p->pRight ){ + sqlite3ExprDeleteNN(db, p->pRight); + }else if( ExprHasProperty(p, EP_xIsSelect) ){ sqlite3SelectDelete(db, p->x.pSelect); }else{ sqlite3ExprListDelete(db, p->x.pList); } } + if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); if( !ExprHasProperty(p, EP_Static) ){ - sqlite3DbFree(db, p); + sqlite3DbFreeNN(db, p); } } +SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ + if( p ) sqlite3ExprDeleteNN(db, p); +} /* ** Return the number of bytes allocated for the expression structure @@ -82551,7 +95871,7 @@ static int dupedExprStructSize(Expr *p, int flags){ assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */ assert( EXPR_FULLSIZE<=0xfff ); assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 ); - if( 0==(flags&EXPRDUP_REDUCE) ){ + if( 0==flags || p->op==TK_SELECT_COLUMN ){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); @@ -82613,84 +95933,94 @@ static int dupedExprSize(Expr *p, int flags){ ** if any. Before returning, *pzBuffer is set to the first byte past the ** portion of the buffer copied into by this function. */ -static Expr *exprDup(sqlite3 *db, Expr *p, int flags, u8 **pzBuffer){ - Expr *pNew = 0; /* Value to return */ - if( p ){ - const int isReduced = (flags&EXPRDUP_REDUCE); - u8 *zAlloc; - u32 staticFlag = 0; +static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ + Expr *pNew; /* Value to return */ + u8 *zAlloc; /* Memory space from which to build Expr object */ + u32 staticFlag; /* EP_Static if space not obtained from malloc */ - assert( pzBuffer==0 || isReduced ); + assert( db!=0 ); + assert( p ); + assert( dupFlags==0 || dupFlags==EXPRDUP_REDUCE ); + assert( pzBuffer==0 || dupFlags==EXPRDUP_REDUCE ); - /* Figure out where to write the new Expr structure. */ - if( pzBuffer ){ - zAlloc = *pzBuffer; - staticFlag = EP_Static; + /* Figure out where to write the new Expr structure. */ + if( pzBuffer ){ + zAlloc = *pzBuffer; + staticFlag = EP_Static; + }else{ + zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags)); + staticFlag = 0; + } + pNew = (Expr *)zAlloc; + + if( pNew ){ + /* Set nNewSize to the size allocated for the structure pointed to + ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or + ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed + ** by the copy of the p->u.zToken string (if any). + */ + const unsigned nStructSize = dupedExprStructSize(p, dupFlags); + const int nNewSize = nStructSize & 0xfff; + int nToken; + if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ + nToken = sqlite3Strlen30(p->u.zToken) + 1; }else{ - zAlloc = sqlite3DbMallocRaw(db, dupedExprSize(p, flags)); + nToken = 0; } - pNew = (Expr *)zAlloc; - - if( pNew ){ - /* Set nNewSize to the size allocated for the structure pointed to - ** by pNew. This is either EXPR_FULLSIZE, EXPR_REDUCEDSIZE or - ** EXPR_TOKENONLYSIZE. nToken is set to the number of bytes consumed - ** by the copy of the p->u.zToken string (if any). - */ - const unsigned nStructSize = dupedExprStructSize(p, flags); - const int nNewSize = nStructSize & 0xfff; - int nToken; - if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ - nToken = sqlite3Strlen30(p->u.zToken) + 1; - }else{ - nToken = 0; - } - if( isReduced ){ - assert( ExprHasProperty(p, EP_Reduced)==0 ); - memcpy(zAlloc, p, nNewSize); - }else{ - int nSize = exprStructSize(p); - memcpy(zAlloc, p, nSize); + if( dupFlags ){ + assert( ExprHasProperty(p, EP_Reduced)==0 ); + memcpy(zAlloc, p, nNewSize); + }else{ + u32 nSize = (u32)exprStructSize(p); + memcpy(zAlloc, p, nSize); + if( nSize<EXPR_FULLSIZE ){ memset(&zAlloc[nSize], 0, EXPR_FULLSIZE-nSize); } + } - /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ - pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); - pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); - pNew->flags |= staticFlag; + /* Set the EP_Reduced, EP_TokenOnly, and EP_Static flags appropriately. */ + pNew->flags &= ~(EP_Reduced|EP_TokenOnly|EP_Static|EP_MemToken); + pNew->flags |= nStructSize & (EP_Reduced|EP_TokenOnly); + pNew->flags |= staticFlag; - /* Copy the p->u.zToken string, if any. */ - if( nToken ){ - char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; - memcpy(zToken, p->u.zToken, nToken); - } + /* Copy the p->u.zToken string, if any. */ + if( nToken ){ + char *zToken = pNew->u.zToken = (char*)&zAlloc[nNewSize]; + memcpy(zToken, p->u.zToken, nToken); + } - if( 0==((p->flags|pNew->flags) & EP_TokenOnly) ){ - /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ - if( ExprHasProperty(p, EP_xIsSelect) ){ - pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, isReduced); - }else{ - pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, isReduced); - } - } - - /* Fill in pNew->pLeft and pNew->pRight. */ - if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly) ){ - zAlloc += dupedExprNodeSize(p, flags); - if( ExprHasProperty(pNew, EP_Reduced) ){ - pNew->pLeft = exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc); - pNew->pRight = exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc); - } - if( pzBuffer ){ - *pzBuffer = zAlloc; - } + if( 0==((p->flags|pNew->flags) & (EP_TokenOnly|EP_Leaf)) ){ + /* Fill in the pNew->x.pSelect or pNew->x.pList member. */ + if( ExprHasProperty(p, EP_xIsSelect) ){ + pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags); }else{ - if( !ExprHasProperty(p, EP_TokenOnly) ){ - pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); - pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); - } + pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags); } + } + /* Fill in pNew->pLeft and pNew->pRight. */ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly) ){ + zAlloc += dupedExprNodeSize(p, dupFlags); + if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ + pNew->pLeft = p->pLeft ? + exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0; + pNew->pRight = p->pRight ? + exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0; + } + if( pzBuffer ){ + *pzBuffer = zAlloc; + } + }else{ + if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ + if( pNew->op==TK_SELECT_COLUMN ){ + pNew->pLeft = p->pLeft; + assert( p->iColumn==0 || p->pRight==0 ); + assert( p->pRight==0 || p->pRight==p->pLeft ); + }else{ + pNew->pLeft = sqlite3ExprDup(db, p->pLeft, 0); + } + pNew->pRight = sqlite3ExprDup(db, p->pRight, 0); + } } } return pNew; @@ -82741,31 +96071,47 @@ static With *withDup(sqlite3 *db, With *p){ ** part of the in-memory representation of the database schema. */ SQLITE_PRIVATE Expr *sqlite3ExprDup(sqlite3 *db, Expr *p, int flags){ - return exprDup(db, p, flags, 0); + assert( flags==0 || flags==EXPRDUP_REDUCE ); + return p ? exprDup(db, p, flags, 0) : 0; } SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ ExprList *pNew; struct ExprList_item *pItem, *pOldItem; int i; + Expr *pPriorSelectCol = 0; + assert( db!=0 ); if( p==0 ) return 0; - pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); + pNew = sqlite3DbMallocRawNN(db, sqlite3DbMallocSize(db, p)); if( pNew==0 ) return 0; - pNew->nExpr = i = p->nExpr; - if( (flags & EXPRDUP_REDUCE)==0 ) for(i=1; i<p->nExpr; i+=i){} - pNew->a = pItem = sqlite3DbMallocRaw(db, i*sizeof(p->a[0]) ); - if( pItem==0 ){ - sqlite3DbFree(db, pNew); - return 0; - } + pNew->nExpr = p->nExpr; + pItem = pNew->a; pOldItem = p->a; for(i=0; i<p->nExpr; i++, pItem++, pOldItem++){ Expr *pOldExpr = pOldItem->pExpr; + Expr *pNewExpr; pItem->pExpr = sqlite3ExprDup(db, pOldExpr, flags); + if( pOldExpr + && pOldExpr->op==TK_SELECT_COLUMN + && (pNewExpr = pItem->pExpr)!=0 + ){ + assert( pNewExpr->iColumn==0 || i>0 ); + if( pNewExpr->iColumn==0 ){ + assert( pOldExpr->pLeft==pOldExpr->pRight ); + pPriorSelectCol = pNewExpr->pLeft = pNewExpr->pRight; + }else{ + assert( i>0 ); + assert( pItem[-1].pExpr!=0 ); + assert( pNewExpr->iColumn==pItem[-1].pExpr->iColumn+1 ); + assert( pPriorSelectCol==pItem[-1].pExpr->pLeft ); + pNewExpr->pLeft = pPriorSelectCol; + } + } pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); pItem->sortOrder = pOldItem->sortOrder; pItem->done = 0; pItem->bSpanIsTab = pOldItem->bSpanIsTab; + pItem->bSorterRef = pOldItem->bSorterRef; pItem->u = pOldItem->u; } return pNew; @@ -82783,9 +96129,10 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ SrcList *pNew; int i; int nByte; + assert( db!=0 ); if( p==0 ) return 0; nByte = sizeof(*p) + (p->nSrc>0 ? sizeof(p->a[0]) * (p->nSrc-1) : 0); - pNew = sqlite3DbMallocRaw(db, nByte ); + pNew = sqlite3DbMallocRawNN(db, nByte ); if( pNew==0 ) return 0; pNew->nSrc = pNew->nAlloc = p->nSrc; for(i=0; i<p->nSrc; i++){ @@ -82796,19 +96143,21 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ pNewItem->zDatabase = sqlite3DbStrDup(db, pOldItem->zDatabase); pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias); - pNewItem->jointype = pOldItem->jointype; + pNewItem->fg = pOldItem->fg; pNewItem->iCursor = pOldItem->iCursor; pNewItem->addrFillSub = pOldItem->addrFillSub; pNewItem->regReturn = pOldItem->regReturn; - pNewItem->isCorrelated = pOldItem->isCorrelated; - pNewItem->viaCoroutine = pOldItem->viaCoroutine; - pNewItem->isRecursive = pOldItem->isRecursive; - pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex); - pNewItem->notIndexed = pOldItem->notIndexed; - pNewItem->pIndex = pOldItem->pIndex; + if( pNewItem->fg.isIndexedBy ){ + pNewItem->u1.zIndexedBy = sqlite3DbStrDup(db, pOldItem->u1.zIndexedBy); + } + pNewItem->pIBIndex = pOldItem->pIBIndex; + if( pNewItem->fg.isTabFunc ){ + pNewItem->u1.pFuncArg = + sqlite3ExprListDup(db, pOldItem->u1.pFuncArg, flags); + } pTab = pNewItem->pTab = pOldItem->pTab; if( pTab ){ - pTab->nRef++; + pTab->nTabRef++; } pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); @@ -82820,13 +96169,14 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, SrcList *p, int flags){ SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ IdList *pNew; int i; + assert( db!=0 ); if( p==0 ) return 0; - pNew = sqlite3DbMallocRaw(db, sizeof(*pNew) ); + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); if( pNew==0 ) return 0; pNew->nId = p->nId; - pNew->a = sqlite3DbMallocRaw(db, p->nId*sizeof(p->a[0]) ); + pNew->a = sqlite3DbMallocRawNN(db, p->nId*sizeof(p->a[0]) ); if( pNew->a==0 ){ - sqlite3DbFree(db, pNew); + sqlite3DbFreeNN(db, pNew); return 0; } /* Note that because the size of the allocation for p->a[] is not @@ -82840,32 +96190,40 @@ SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, IdList *p){ } return pNew; } -SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ - Select *pNew, *pPrior; - if( p==0 ) return 0; - pNew = sqlite3DbMallocRaw(db, sizeof(*p) ); - if( pNew==0 ) return 0; - pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags); - pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags); - pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags); - pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags); - pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); - pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); - pNew->op = p->op; - pNew->pPrior = pPrior = sqlite3SelectDup(db, p->pPrior, flags); - if( pPrior ) pPrior->pNext = pNew; - pNew->pNext = 0; - pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); - pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags); - pNew->iLimit = 0; - pNew->iOffset = 0; - pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; - pNew->addrOpenEphm[0] = -1; - pNew->addrOpenEphm[1] = -1; - pNew->nSelectRow = p->nSelectRow; - pNew->pWith = withDup(db, p->pWith); - sqlite3SelectSetName(pNew, p->zSelName); - return pNew; +SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ + Select *pRet = 0; + Select *pNext = 0; + Select **pp = &pRet; + Select *p; + + assert( db!=0 ); + for(p=pDup; p; p=p->pPrior){ + Select *pNew = sqlite3DbMallocRawNN(db, sizeof(*p) ); + if( pNew==0 ) break; + pNew->pEList = sqlite3ExprListDup(db, p->pEList, flags); + pNew->pSrc = sqlite3SrcListDup(db, p->pSrc, flags); + pNew->pWhere = sqlite3ExprDup(db, p->pWhere, flags); + pNew->pGroupBy = sqlite3ExprListDup(db, p->pGroupBy, flags); + pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); + pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); + pNew->op = p->op; + pNew->pNext = pNext; + pNew->pPrior = 0; + pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); + pNew->iLimit = 0; + pNew->iOffset = 0; + pNew->selFlags = p->selFlags & ~SF_UsesEphemeral; + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = p->nSelectRow; + pNew->pWith = withDup(db, p->pWith); + sqlite3SelectSetName(pNew, p->zSelName); + *pp = pNew; + pp = &pNew->pPrior; + pNext = pNew; + } + + return pRet; } #else SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ @@ -82879,6 +96237,13 @@ SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ ** Add a new element to the end of an expression list. If pList is ** initially NULL, then create a new expression list. ** +** The pList argument must be either NULL or a pointer to an ExprList +** obtained from a prior call to sqlite3ExprListAppend(). This routine +** may not be used with an ExprList obtained from sqlite3ExprListDup(). +** Reason: This routine assumes that the number of slots in pList->a[] +** is a power of two. That is true for sqlite3ExprListAppend() returns +** but is not necessarily true from the return value of sqlite3ExprListDup(). +** ** If a memory allocation error occurs, the entire list is freed and ** NULL is returned. If non-NULL is returned, then it is guaranteed ** that the new entry was successfully appended. @@ -82888,29 +96253,29 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListAppend( ExprList *pList, /* List to which to append. Might be NULL */ Expr *pExpr /* Expression to be appended. Might be NULL */ ){ + struct ExprList_item *pItem; sqlite3 *db = pParse->db; + assert( db!=0 ); if( pList==0 ){ - pList = sqlite3DbMallocZero(db, sizeof(ExprList) ); + pList = sqlite3DbMallocRawNN(db, sizeof(ExprList) ); if( pList==0 ){ goto no_mem; } - pList->a = sqlite3DbMallocRaw(db, sizeof(pList->a[0])); - if( pList->a==0 ) goto no_mem; + pList->nExpr = 0; }else if( (pList->nExpr & (pList->nExpr-1))==0 ){ - struct ExprList_item *a; - assert( pList->nExpr>0 ); - a = sqlite3DbRealloc(db, pList->a, pList->nExpr*2*sizeof(pList->a[0])); - if( a==0 ){ + ExprList *pNew; + pNew = sqlite3DbRealloc(db, pList, + sizeof(*pList)+(2*pList->nExpr - 1)*sizeof(pList->a[0])); + if( pNew==0 ){ goto no_mem; } - pList->a = a; - } - assert( pList->a!=0 ); - if( 1 ){ - struct ExprList_item *pItem = &pList->a[pList->nExpr++]; - memset(pItem, 0, sizeof(*pItem)); - pItem->pExpr = pExpr; + pList = pNew; } + pItem = &pList->a[pList->nExpr++]; + assert( offsetof(struct ExprList_item,zName)==sizeof(pItem->pExpr) ); + assert( offsetof(struct ExprList_item,pExpr)==0 ); + memset(&pItem->zName,0,sizeof(*pItem)-offsetof(struct ExprList_item,zName)); + pItem->pExpr = pExpr; return pList; no_mem: @@ -82920,6 +96285,88 @@ no_mem: return 0; } +/* +** pColumns and pExpr form a vector assignment which is part of the SET +** clause of an UPDATE statement. Like this: +** +** (a,b,c) = (expr1,expr2,expr3) +** Or: (a,b,c) = (SELECT x,y,z FROM ....) +** +** For each term of the vector assignment, append new entries to the +** expression list pList. In the case of a subquery on the RHS, append +** TK_SELECT_COLUMN expressions. +*/ +SQLITE_PRIVATE ExprList *sqlite3ExprListAppendVector( + Parse *pParse, /* Parsing context */ + ExprList *pList, /* List to which to append. Might be NULL */ + IdList *pColumns, /* List of names of LHS of the assignment */ + Expr *pExpr /* Vector expression to be appended. Might be NULL */ +){ + sqlite3 *db = pParse->db; + int n; + int i; + int iFirst = pList ? pList->nExpr : 0; + /* pColumns can only be NULL due to an OOM but an OOM will cause an + ** exit prior to this routine being invoked */ + if( NEVER(pColumns==0) ) goto vector_append_error; + if( pExpr==0 ) goto vector_append_error; + + /* If the RHS is a vector, then we can immediately check to see that + ** the size of the RHS and LHS match. But if the RHS is a SELECT, + ** wildcards ("*") in the result set of the SELECT must be expanded before + ** we can do the size check, so defer the size check until code generation. + */ + if( pExpr->op!=TK_SELECT && pColumns->nId!=(n=sqlite3ExprVectorSize(pExpr)) ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pColumns->nId, n); + goto vector_append_error; + } + + for(i=0; i<pColumns->nId; i++){ + Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); + pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); + if( pList ){ + assert( pList->nExpr==iFirst+i+1 ); + pList->a[pList->nExpr-1].zName = pColumns->a[i].zName; + pColumns->a[i].zName = 0; + } + } + + if( !db->mallocFailed && pExpr->op==TK_SELECT && ALWAYS(pList!=0) ){ + Expr *pFirst = pList->a[iFirst].pExpr; + assert( pFirst!=0 ); + assert( pFirst->op==TK_SELECT_COLUMN ); + + /* Store the SELECT statement in pRight so it will be deleted when + ** sqlite3ExprListDelete() is called */ + pFirst->pRight = pExpr; + pExpr = 0; + + /* Remember the size of the LHS in iTable so that we can check that + ** the RHS and LHS sizes match during code generation. */ + pFirst->iTable = pColumns->nId; + } + +vector_append_error: + sqlite3ExprDelete(db, pExpr); + sqlite3IdListDelete(db, pColumns); + return pList; +} + +/* +** Set the sort order for the last element on the given ExprList. +*/ +SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder){ + if( p==0 ) return; + assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC>=0 && SQLITE_SO_DESC>0 ); + assert( p->nExpr>0 ); + if( iSortOrder<0 ){ + assert( p->a[p->nExpr-1].sortOrder==SQLITE_SO_ASC ); + return; + } + p->a[p->nExpr-1].sortOrder = (u8)iSortOrder; +} + /* ** Set the ExprList.a[].zName element of the most recently added item ** on the expression list. @@ -82941,7 +96388,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetName( pItem = &pList->a[pList->nExpr-1]; assert( pItem->zName==0 ); pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); - if( dequote && pItem->zName ) sqlite3Dequote(pItem->zName); + if( dequote ) sqlite3Dequote(pItem->zName); } } @@ -82956,17 +96403,16 @@ SQLITE_PRIVATE void sqlite3ExprListSetName( SQLITE_PRIVATE void sqlite3ExprListSetSpan( Parse *pParse, /* Parsing context */ ExprList *pList, /* List to which to add the span. */ - ExprSpan *pSpan /* The span to be added */ + const char *zStart, /* Start of the span */ + const char *zEnd /* End of the span */ ){ sqlite3 *db = pParse->db; assert( pList!=0 || db->mallocFailed!=0 ); if( pList ){ struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; assert( pList->nExpr>0 ); - assert( db->mallocFailed || pItem->pExpr==pSpan->pExpr ); sqlite3DbFree(db, pItem->zSpan); - pItem->zSpan = sqlite3DbStrNDup(db, (char*)pSpan->zStart, - (int)(pSpan->zEnd - pSpan->zStart)); + pItem->zSpan = sqlite3DbSpanDup(db, zStart, zEnd); } } @@ -82990,19 +96436,78 @@ SQLITE_PRIVATE void sqlite3ExprListCheckLength( /* ** Delete an entire expression list. */ -SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ - int i; - struct ExprList_item *pItem; - if( pList==0 ) return; - assert( pList->a!=0 || pList->nExpr==0 ); - for(pItem=pList->a, i=0; i<pList->nExpr; i++, pItem++){ +static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ + int i = pList->nExpr; + struct ExprList_item *pItem = pList->a; + assert( pList->nExpr>0 ); + do{ sqlite3ExprDelete(db, pItem->pExpr); sqlite3DbFree(db, pItem->zName); sqlite3DbFree(db, pItem->zSpan); - } - sqlite3DbFree(db, pList->a); - sqlite3DbFree(db, pList); + pItem++; + }while( --i>0 ); + sqlite3DbFreeNN(db, pList); } +SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ + if( pList ) exprListDeleteNN(db, pList); +} + +/* +** Return the bitwise-OR of all Expr.flags fields in the given +** ExprList. +*/ +SQLITE_PRIVATE u32 sqlite3ExprListFlags(const ExprList *pList){ + int i; + u32 m = 0; + assert( pList!=0 ); + for(i=0; i<pList->nExpr; i++){ + Expr *pExpr = pList->a[i].pExpr; + assert( pExpr!=0 ); + m |= pExpr->flags; + } + return m; +} + +/* +** This is a SELECT-node callback for the expression walker that +** always "fails". By "fail" in this case, we mean set +** pWalker->eCode to zero and abort. +** +** This callback is used by multiple expression walkers. +*/ +SQLITE_PRIVATE int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ + UNUSED_PARAMETER(NotUsed); + pWalker->eCode = 0; + return WRC_Abort; +} + +/* +** If the input expression is an ID with the name "true" or "false" +** then convert it into an TK_TRUEFALSE term. Return non-zero if +** the conversion happened, and zero if the expression is unaltered. +*/ +SQLITE_PRIVATE int sqlite3ExprIdToTrueFalse(Expr *pExpr){ + assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); + if( sqlite3StrICmp(pExpr->u.zToken, "true")==0 + || sqlite3StrICmp(pExpr->u.zToken, "false")==0 + ){ + pExpr->op = TK_TRUEFALSE; + return 1; + } + return 0; +} + +/* +** The argument must be a TK_TRUEFALSE Expr node. Return 1 if it is TRUE +** and 0 if it is FALSE. +*/ +SQLITE_PRIVATE int sqlite3ExprTruthValue(const Expr *pExpr){ + assert( pExpr->op==TK_TRUEFALSE ); + assert( sqlite3StrICmp(pExpr->u.zToken,"true")==0 + || sqlite3StrICmp(pExpr->u.zToken,"false")==0 ); + return pExpr->u.zToken[4]==0; +} + /* ** These routines are Walker callbacks used to check expressions to @@ -83014,7 +96519,7 @@ SQLITE_PRIVATE void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){ ** ** sqlite3ExprIsConstant() pWalker->eCode==1 ** sqlite3ExprIsConstantNotJoin() pWalker->eCode==2 -** sqlite3ExprRefOneTableOnly() pWalker->eCode==3 +** sqlite3ExprIsTableConstant() pWalker->eCode==3 ** sqlite3ExprIsConstantOrFunction() pWalker->eCode==4 or 5 ** ** In all cases, the callbacks set Walker.eCode=0 and abort if the expression @@ -83044,13 +96549,19 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ ** and either pWalker->eCode==4 or 5 or the function has the ** SQLITE_FUNC_CONST flag. */ case TK_FUNCTION: - if( pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_Constant) ){ + if( pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc) ){ return WRC_Continue; }else{ pWalker->eCode = 0; return WRC_Abort; } case TK_ID: + /* Convert "true" or "false" in a DEFAULT clause into the + ** appropriate TK_TRUEFALSE operator */ + if( sqlite3ExprIdToTrueFalse(pExpr) ){ + return WRC_Prune; + } + /* Fall thru */ case TK_COLUMN: case TK_AGG_FUNCTION: case TK_AGG_COLUMN: @@ -83060,10 +96571,14 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_AGG_COLUMN ); if( pWalker->eCode==3 && pExpr->iTable==pWalker->u.iCur ){ return WRC_Continue; - }else{ - pWalker->eCode = 0; - return WRC_Abort; } + /* Fall through */ + case TK_IF_NULL_ROW: + case TK_REGISTER: + testcase( pExpr->op==TK_REGISTER ); + testcase( pExpr->op==TK_IF_NULL_ROW ); + pWalker->eCode = 0; + return WRC_Abort; case TK_VARIABLE: if( pWalker->eCode==5 ){ /* Silently convert bound parameters that appear inside of CREATE @@ -83078,22 +96593,19 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ } /* Fall through */ default: - testcase( pExpr->op==TK_SELECT ); /* selectNodeIsConstant will disallow */ - testcase( pExpr->op==TK_EXISTS ); /* selectNodeIsConstant will disallow */ + testcase( pExpr->op==TK_SELECT ); /* sqlite3SelectWalkFail() disallows */ + testcase( pExpr->op==TK_EXISTS ); /* sqlite3SelectWalkFail() disallows */ return WRC_Continue; } } -static int selectNodeIsConstant(Walker *pWalker, Select *NotUsed){ - UNUSED_PARAMETER(NotUsed); - pWalker->eCode = 0; - return WRC_Abort; -} static int exprIsConst(Expr *p, int initFlag, int iCur){ Walker w; - memset(&w, 0, sizeof(w)); w.eCode = initFlag; w.xExprCallback = exprNodeIsConstant; - w.xSelectCallback = selectNodeIsConstant; + w.xSelectCallback = sqlite3SelectWalkFail; +#ifdef SQLITE_DEBUG + w.xSelectCallback2 = sqlite3SelectWalkAssert2; +#endif w.u.iCur = iCur; sqlite3WalkExpr(&w, p); return w.eCode; @@ -83122,7 +96634,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantNotJoin(Expr *p){ } /* -** Walk an expression tree. Return non-zero if the expression constant +** Walk an expression tree. Return non-zero if the expression is constant ** for any single row of the table with cursor iCur. In other words, the ** expression must not refer to any non-deterministic function nor any ** table other than iCur. @@ -83131,6 +96643,65 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ return exprIsConst(p, 3, iCur); } + +/* +** sqlite3WalkExpr() callback used by sqlite3ExprIsConstantOrGroupBy(). +*/ +static int exprNodeIsConstantOrGroupBy(Walker *pWalker, Expr *pExpr){ + ExprList *pGroupBy = pWalker->u.pGroupBy; + int i; + + /* Check if pExpr is identical to any GROUP BY term. If so, consider + ** it constant. */ + for(i=0; i<pGroupBy->nExpr; i++){ + Expr *p = pGroupBy->a[i].pExpr; + if( sqlite3ExprCompare(0, pExpr, p, -1)<2 ){ + CollSeq *pColl = sqlite3ExprNNCollSeq(pWalker->pParse, p); + if( sqlite3_stricmp("BINARY", pColl->zName)==0 ){ + return WRC_Prune; + } + } + } + + /* Check if pExpr is a sub-select. If so, consider it variable. */ + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + pWalker->eCode = 0; + return WRC_Abort; + } + + return exprNodeIsConstant(pWalker, pExpr); +} + +/* +** Walk the expression tree passed as the first argument. Return non-zero +** if the expression consists entirely of constants or copies of terms +** in pGroupBy that sort with the BINARY collation sequence. +** +** This routine is used to determine if a term of the HAVING clause can +** be promoted into the WHERE clause. In order for such a promotion to work, +** the value of the HAVING clause term must be the same for all members of +** a "group". The requirement that the GROUP BY term must be BINARY +** assumes that no other collating sequence will have a finer-grained +** grouping than binary. In other words (A=B COLLATE binary) implies +** A=B in every other collating sequence. The requirement that the +** GROUP BY be BINARY is stricter than necessary. It would also work +** to promote HAVING clauses that use the same alternative collating +** sequence as the GROUP BY term, but that is much harder to check, +** alternative collating sequences are uncommon, and this is only an +** optimization, so we take the easy way out and simply require the +** GROUP BY to use the BINARY collating sequence. +*/ +SQLITE_PRIVATE int sqlite3ExprIsConstantOrGroupBy(Parse *pParse, Expr *p, ExprList *pGroupBy){ + Walker w; + w.eCode = 1; + w.xExprCallback = exprNodeIsConstantOrGroupBy; + w.xSelectCallback = 0; + w.u.pGroupBy = pGroupBy; + w.pParse = pParse; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + /* ** Walk an expression tree. Return non-zero if the expression is constant ** or a function call with constant arguments. Return and 0 if there @@ -83145,6 +96716,24 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ return exprIsConst(p, 4+isInit, 0); } +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Walk an expression tree. Return 1 if the expression contains a +** subquery of some kind. Return 0 if there are no subqueries. +*/ +SQLITE_PRIVATE int sqlite3ExprContainsSubquery(Expr *p){ + Walker w; + w.eCode = 1; + w.xExprCallback = sqlite3ExprWalkNoop; + w.xSelectCallback = sqlite3SelectWalkFail; +#ifdef SQLITE_DEBUG + w.xSelectCallback2 = sqlite3SelectWalkAssert2; +#endif + sqlite3WalkExpr(&w, p); + return w.eCode==0; +} +#endif + /* ** If the expression p codes a constant integer that is small enough ** to fit in a 32-bit integer, return 1 and put the value of the integer @@ -83153,6 +96742,7 @@ SQLITE_PRIVATE int sqlite3ExprIsConstantOrFunction(Expr *p, u8 isInit){ */ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){ int rc = 0; + if( p==0 ) return 0; /* Can only happen following on OOM */ /* If an expression is an integer literal that fits in a signed 32-bit ** integer, then the EP_IntValue flag will have already been set */ @@ -83208,8 +96798,8 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ case TK_BLOB: return 0; case TK_COLUMN: - assert( p->pTab!=0 ); return ExprHasProperty(p, EP_CanBeNull) || + p->pTab==0 || /* Reference to column of index on expression */ (p->iColumn>=0 && p->pTab->aCol[p->iColumn].notNull==0); default: return 1; @@ -83228,7 +96818,7 @@ SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){ */ SQLITE_PRIVATE int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ u8 op; - if( aff==SQLITE_AFF_NONE ) return 1; + if( aff==SQLITE_AFF_BLOB ) return 1; while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } op = p->op; if( op==TK_REGISTER ) op = p->op2; @@ -83267,23 +96857,22 @@ SQLITE_PRIVATE int sqlite3IsRowid(const char *z){ } /* -** Return true if we are able to the IN operator optimization on a -** query of the form -** -** x IN (SELECT ...) -** -** Where the SELECT... clause is as specified by the parameter to this -** routine. -** -** The Select object passed in has already been preprocessed and no -** errors have been found. +** pX is the RHS of an IN operator. If pX is a SELECT statement +** that can be simplified to a direct table access, then return +** a pointer to the SELECT statement. If pX is not a SELECT statement, +** or if the SELECT statement needs to be manifested into a transient +** table, then return NULL. */ #ifndef SQLITE_OMIT_SUBQUERY -static int isCandidateForInOpt(Select *p){ +static Select *isCandidateForInOpt(Expr *pX){ + Select *p; SrcList *pSrc; ExprList *pEList; Table *pTab; - if( p==0 ) return 0; /* right-hand side of IN is SELECT */ + int i; + if( !ExprHasProperty(pX, EP_xIsSelect) ) return 0; /* Not a subquery */ + if( ExprHasProperty(pX, EP_VarSelect) ) return 0; /* Correlated subq */ + p = pX->x.pSelect; if( p->pPrior ) return 0; /* Not a compound SELECT */ if( p->selFlags & (SF_Distinct|SF_Aggregate) ){ testcase( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); @@ -83292,32 +96881,28 @@ static int isCandidateForInOpt(Select *p){ } assert( p->pGroupBy==0 ); /* Has no GROUP BY clause */ if( p->pLimit ) return 0; /* Has no LIMIT clause */ - assert( p->pOffset==0 ); /* No LIMIT means no OFFSET */ if( p->pWhere ) return 0; /* Has no WHERE clause */ pSrc = p->pSrc; assert( pSrc!=0 ); if( pSrc->nSrc!=1 ) return 0; /* Single term in FROM clause */ if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */ pTab = pSrc->a[0].pTab; - if( NEVER(pTab==0) ) return 0; + assert( pTab!=0 ); assert( pTab->pSelect==0 ); /* FROM clause is not a view */ if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */ pEList = p->pEList; - if( pEList->nExpr!=1 ) return 0; /* One column in the result set */ - if( pEList->a[0].pExpr->op!=TK_COLUMN ) return 0; /* Result is a column */ - return 1; + assert( pEList!=0 ); + /* All SELECT results must be columns. */ + for(i=0; i<pEList->nExpr; i++){ + Expr *pRes = pEList->a[i].pExpr; + if( pRes->op!=TK_COLUMN ) return 0; + assert( pRes->iTable==pSrc->a[0].iCursor ); /* Not a correlated subquery */ + } + return p; } #endif /* SQLITE_OMIT_SUBQUERY */ -/* -** Code an OP_Once instruction and allocate space for its flag. Return the -** address of the new instruction. -*/ -SQLITE_PRIVATE int sqlite3CodeOnce(Parse *pParse){ - Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ - return sqlite3VdbeAddOp1(v, OP_Once, pParse->nOnce++); -} - +#ifndef SQLITE_OMIT_SUBQUERY /* ** Generate code that checks the left-most column of index table iCur to see if ** it contains any NULL entries. Cause the register at regHasNull to be set @@ -83325,14 +96910,15 @@ SQLITE_PRIVATE int sqlite3CodeOnce(Parse *pParse){ ** to be set to NULL if iCur contains one or more NULL values. */ static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ - int j1; + int addr1; sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); - j1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); VdbeComment((v, "first_entry_in(%d)", iCur)); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); } +#endif #ifndef SQLITE_OMIT_SUBQUERY @@ -83377,30 +96963,29 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** An existing b-tree might be used if the RHS expression pX is a simple ** subquery such as: ** -** SELECT <column> FROM <table> +** SELECT <column1>, <column2>... FROM <table> ** ** If the RHS of the IN operator is a list or a more complex subquery, then ** an ephemeral table might need to be generated from the RHS and then ** pX->iTable made to point to the ephemeral table instead of an ** existing table. ** -** The inFlags parameter must contain exactly one of the bits -** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP. If inFlags contains -** IN_INDEX_MEMBERSHIP, then the generated table will be used for a -** fast membership test. When the IN_INDEX_LOOP bit is set, the -** IN index will be used to loop over all values of the RHS of the -** IN operator. +** The inFlags parameter must contain, at a minimum, one of the bits +** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains +** IN_INDEX_MEMBERSHIP, then the generated table will be used for a fast +** membership test. When the IN_INDEX_LOOP bit is set, the IN index will +** be used to loop over all values of the RHS of the IN operator. ** ** When IN_INDEX_LOOP is used (and the b-tree will be used to iterate ** through the set members) then the b-tree must not contain duplicates. -** An epheremal table must be used unless the selected <column> is guaranteed -** to be unique - either because it is an INTEGER PRIMARY KEY or it -** has a UNIQUE constraint or UNIQUE index. +** An epheremal table will be created unless the selected columns are guaranteed +** to be unique - either because it is an INTEGER PRIMARY KEY or due to +** a UNIQUE constraint or index. ** ** When IN_INDEX_MEMBERSHIP is used (and the b-tree will be used ** for fast set membership tests) then an epheremal table must -** be used unless <column> is an INTEGER PRIMARY KEY or an index can -** be found with <column> as its left-most column. +** be used unless <columns> is a single INTEGER PRIMARY KEY column or an +** index can be found with the specified <columns> as its left-most. ** ** If the IN_INDEX_NOOP_OK and IN_INDEX_MEMBERSHIP are both set and ** if the RHS of the IN operator is a list (not a subquery) then this @@ -83421,9 +97006,26 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** the value in that register will be NULL if the b-tree contains one or more ** NULL values, and it will be some non-NULL value if the b-tree contains no ** NULL values. +** +** If the aiMap parameter is not NULL, it must point to an array containing +** one element for each column returned by the SELECT statement on the RHS +** of the IN(...) operator. The i'th entry of the array is populated with the +** offset of the index column that matches the i'th column returned by the +** SELECT. For example, if the expression and selected index are: +** +** (?,?,?) IN (SELECT a, b, c FROM t1) +** CREATE INDEX i1 ON t1(b, c, a); +** +** then aiMap[] is populated with {2, 0, 1}. */ #ifndef SQLITE_OMIT_SUBQUERY -SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int *prRhsHasNull){ +SQLITE_PRIVATE int sqlite3FindInIndex( + Parse *pParse, /* Parsing context */ + Expr *pX, /* The right-hand side (RHS) of the IN operator */ + u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ + int *prRhsHasNull, /* Register holding NULL status. See notes */ + int *aiMap /* Mapping from Index fields to RHS fields */ +){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ int iTab = pParse->nTab++; /* Cursor of the RHS table */ @@ -83433,38 +97035,46 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int assert( pX->op==TK_IN ); mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; + /* If the RHS of this IN(...) operator is a SELECT, and if it matters + ** whether or not the SELECT result contains NULL values, check whether + ** or not NULL is actually possible (it may not be, for example, due + ** to NOT NULL constraints in the schema). If no NULL values are possible, + ** set prRhsHasNull to 0 before continuing. */ + if( prRhsHasNull && (pX->flags & EP_xIsSelect) ){ + int i; + ExprList *pEList = pX->x.pSelect->pEList; + for(i=0; i<pEList->nExpr; i++){ + if( sqlite3ExprCanBeNull(pEList->a[i].pExpr) ) break; + } + if( i==pEList->nExpr ){ + prRhsHasNull = 0; + } + } + /* Check to see if an existing table or index can be used to ** satisfy the query. This is preferable to generating a new - ** ephemeral table. - */ - p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0); - if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){ + ** ephemeral table. */ + if( pParse->nErr==0 && (p = isCandidateForInOpt(pX))!=0 ){ sqlite3 *db = pParse->db; /* Database connection */ Table *pTab; /* Table <table>. */ - Expr *pExpr; /* Expression <column> */ - i16 iCol; /* Index of column <column> */ i16 iDb; /* Database idx for pTab */ + ExprList *pEList = p->pEList; + int nExpr = pEList->nExpr; - assert( p ); /* Because of isCandidateForInOpt(p) */ assert( p->pEList!=0 ); /* Because of isCandidateForInOpt(p) */ assert( p->pEList->a[0].pExpr!=0 ); /* Because of isCandidateForInOpt(p) */ assert( p->pSrc!=0 ); /* Because of isCandidateForInOpt(p) */ pTab = p->pSrc->a[0].pTab; - pExpr = p->pEList->a[0].pExpr; - iCol = (i16)pExpr->iColumn; - + /* Code an OP_Transaction and OP_TableLock for <table>. */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); sqlite3CodeVerifySchema(pParse, iDb); sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); - /* This function is only called from two places. In both cases the vdbe - ** has already been allocated. So assume sqlite3GetVdbe() is always - ** successful here. - */ - assert(v); - if( iCol<0 ){ - int iAddr = sqlite3CodeOnce(pParse); + assert(v); /* sqlite3GetVdbe() has always been previously called */ + if( nExpr==1 && pEList->a[0].pExpr->iColumn<0 ){ + /* The "x IN (SELECT rowid FROM table)" case */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); @@ -83473,44 +97083,111 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int sqlite3VdbeJumpHere(v, iAddr); }else{ Index *pIdx; /* Iterator variable */ + int affinity_ok = 1; + int i; - /* The collation sequence used by the comparison. If an index is to - ** be used in place of a temp-table, it must be ordered according - ** to this collation sequence. */ - CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pExpr); - - /* Check that the affinity that will be used to perform the - ** comparison is the same as the affinity of the column. If - ** it is not, it is not possible to use any index. - */ - int affinity_ok = sqlite3IndexAffinityOk(pX, pTab->aCol[iCol].affinity); - - for(pIdx=pTab->pIndex; pIdx && eType==0 && affinity_ok; pIdx=pIdx->pNext){ - if( (pIdx->aiColumn[0]==iCol) - && sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], 0)==pReq - && (!mustBeUnique || (pIdx->nKeyCol==1 && IsUniqueIndex(pIdx))) - ){ - int iAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb); - sqlite3VdbeSetP4KeyInfo(pParse, pIdx); - VdbeComment((v, "%s", pIdx->zName)); - assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 ); - eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; - - if( prRhsHasNull && !pTab->aCol[iCol].notNull ){ - *prRhsHasNull = ++pParse->nMem; - sqlite3SetHasNullFlag(v, iTab, *prRhsHasNull); - } - sqlite3VdbeJumpHere(v, iAddr); + /* Check that the affinity that will be used to perform each + ** comparison is the same as the affinity of each column in table + ** on the RHS of the IN operator. If it not, it is not possible to + ** use any index of the RHS table. */ + for(i=0; i<nExpr && affinity_ok; i++){ + Expr *pLhs = sqlite3VectorFieldSubexpr(pX->pLeft, i); + int iCol = pEList->a[i].pExpr->iColumn; + char idxaff = sqlite3TableColumnAffinity(pTab,iCol); /* RHS table */ + char cmpaff = sqlite3CompareAffinity(pLhs, idxaff); + testcase( cmpaff==SQLITE_AFF_BLOB ); + testcase( cmpaff==SQLITE_AFF_TEXT ); + switch( cmpaff ){ + case SQLITE_AFF_BLOB: + break; + case SQLITE_AFF_TEXT: + /* sqlite3CompareAffinity() only returns TEXT if one side or the + ** other has no affinity and the other side is TEXT. Hence, + ** the only way for cmpaff to be TEXT is for idxaff to be TEXT + ** and for the term on the LHS of the IN to have no affinity. */ + assert( idxaff==SQLITE_AFF_TEXT ); + break; + default: + affinity_ok = sqlite3IsNumericAffinity(idxaff); } } - } - } + + if( affinity_ok ){ + /* Search for an existing index that will work for this IN operator */ + for(pIdx=pTab->pIndex; pIdx && eType==0; pIdx=pIdx->pNext){ + Bitmask colUsed; /* Columns of the index used */ + Bitmask mCol; /* Mask for the current column */ + if( pIdx->nColumn<nExpr ) continue; + /* Maximum nColumn is BMS-2, not BMS-1, so that we can compute + ** BITMASK(nExpr) without overflowing */ + testcase( pIdx->nColumn==BMS-2 ); + testcase( pIdx->nColumn==BMS-1 ); + if( pIdx->nColumn>=BMS-1 ) continue; + if( mustBeUnique ){ + if( pIdx->nKeyCol>nExpr + ||(pIdx->nColumn>nExpr && !IsUniqueIndex(pIdx)) + ){ + continue; /* This index is not unique over the IN RHS columns */ + } + } + + colUsed = 0; /* Columns of index used so far */ + for(i=0; i<nExpr; i++){ + Expr *pLhs = sqlite3VectorFieldSubexpr(pX->pLeft, i); + Expr *pRhs = pEList->a[i].pExpr; + CollSeq *pReq = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + int j; + + assert( pReq!=0 || pRhs->iColumn==XN_ROWID || pParse->nErr ); + for(j=0; j<nExpr; j++){ + if( pIdx->aiColumn[j]!=pRhs->iColumn ) continue; + assert( pIdx->azColl[j] ); + if( pReq!=0 && sqlite3StrICmp(pReq->zName, pIdx->azColl[j])!=0 ){ + continue; + } + break; + } + if( j==nExpr ) break; + mCol = MASKBIT(j); + if( mCol & colUsed ) break; /* Each column used only once */ + colUsed |= mCol; + if( aiMap ) aiMap[i] = j; + } + + assert( i==nExpr || colUsed!=(MASKBIT(nExpr)-1) ); + if( colUsed==(MASKBIT(nExpr)-1) ){ + /* If we reach this point, that means the index pIdx is usable */ + int iAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + ExplainQueryPlan((pParse, 0, + "USING INDEX %s FOR IN-OPERATOR",pIdx->zName)); + sqlite3VdbeAddOp3(v, OP_OpenRead, iTab, pIdx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + VdbeComment((v, "%s", pIdx->zName)); + assert( IN_INDEX_INDEX_DESC == IN_INDEX_INDEX_ASC+1 ); + eType = IN_INDEX_INDEX_ASC + pIdx->aSortOrder[0]; + + if( prRhsHasNull ){ +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + i64 mask = (1<<nExpr)-1; + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, + iTab, 0, 0, (u8*)&mask, P4_INT64); +#endif + *prRhsHasNull = ++pParse->nMem; + if( nExpr==1 ){ + sqlite3SetHasNullFlag(v, iTab, *prRhsHasNull); + } + } + sqlite3VdbeJumpHere(v, iAddr); + } + } /* End loop over indexes */ + } /* End if( affinity_ok ) */ + } /* End if not an rowid index */ + } /* End attempt to optimize using an index */ /* If no preexisting index is available for the IN clause ** and IN_INDEX_NOOP is an allowed reply ** and the RHS of the IN operator is a list, not a subquery - ** and the RHS is not contant or has two or fewer terms, + ** and the RHS is not constant or has two or fewer terms, ** then it is not worth creating an ephemeral table to evaluate ** the IN operator so return IN_INDEX_NOOP. */ @@ -83521,7 +97198,6 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int ){ eType = IN_INDEX_NOOP; } - if( eType==0 ){ /* Could not find an existing table or index to use as the RHS b-tree. @@ -83543,10 +97219,85 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int }else{ pX->iTable = iTab; } + + if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ + int i, n; + n = sqlite3ExprVectorSize(pX->pLeft); + for(i=0; i<n; i++) aiMap[i] = i; + } return eType; } #endif +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Argument pExpr is an (?, ?...) IN(...) expression. This +** function allocates and returns a nul-terminated string containing +** the affinities to be used for each column of the comparison. +** +** It is the responsibility of the caller to ensure that the returned +** string is eventually freed using sqlite3DbFree(). +*/ +static char *exprINAffinity(Parse *pParse, Expr *pExpr){ + Expr *pLeft = pExpr->pLeft; + int nVal = sqlite3ExprVectorSize(pLeft); + Select *pSelect = (pExpr->flags & EP_xIsSelect) ? pExpr->x.pSelect : 0; + char *zRet; + + assert( pExpr->op==TK_IN ); + zRet = sqlite3DbMallocRaw(pParse->db, nVal+1); + if( zRet ){ + int i; + for(i=0; i<nVal; i++){ + Expr *pA = sqlite3VectorFieldSubexpr(pLeft, i); + char a = sqlite3ExprAffinity(pA); + if( pSelect ){ + zRet[i] = sqlite3CompareAffinity(pSelect->pEList->a[i].pExpr, a); + }else{ + zRet[i] = a; + } + } + zRet[nVal] = '\0'; + } + return zRet; +} +#endif + +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Load the Parse object passed as the first argument with an error +** message of the form: +** +** "sub-select returns N columns - expected M" +*/ +SQLITE_PRIVATE void sqlite3SubselectError(Parse *pParse, int nActual, int nExpect){ + const char *zFmt = "sub-select returns %d columns - expected %d"; + sqlite3ErrorMsg(pParse, zFmt, nActual, nExpect); +} +#endif + +/* +** Expression pExpr is a vector that has been used in a context where +** it is not permitted. If pExpr is a sub-select vector, this routine +** loads the Parse object with a message of the form: +** +** "sub-select returns N columns - expected 1" +** +** Or, if it is a regular scalar vector: +** +** "row value misused" +*/ +SQLITE_PRIVATE void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ +#ifndef SQLITE_OMIT_SUBQUERY + if( pExpr->flags & EP_xIsSelect ){ + sqlite3SubselectError(pParse, pExpr->x.pSelect->pEList->nExpr, 1); + }else +#endif + { + sqlite3ErrorMsg(pParse, "row value misused"); + } +} + /* ** Generate code for scalar subqueries used as a subquery expression, EXISTS, ** or IN operators. Examples: @@ -83572,7 +97323,9 @@ SQLITE_PRIVATE int sqlite3FindInIndex(Parse *pParse, Expr *pX, u32 inFlags, int ** value to non-NULL if the RHS is NULL-free. ** ** For a SELECT or EXISTS operator, return the register that holds the -** result. For IN operators or if an error occurs, the return value is 0. +** result. For a multi-column SELECT, the result is stored in a contiguous +** array of registers and the return value is the register of the left-most +** result column. Return 0 for IN operators or if an error occurs. */ #ifndef SQLITE_OMIT_SUBQUERY SQLITE_PRIVATE int sqlite3CodeSubselect( @@ -83587,8 +97340,8 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( if( NEVER(v==0) ) return 0; sqlite3ExprCachePush(pParse); - /* This code must be run in its entirety every time it is encountered - ** if any of the following is true: + /* The evaluation of the IN/EXISTS/SELECT must be repeated every time it + ** is encountered if any of the following is true: ** ** * The right-hand side is a correlated subquery ** * The right-hand side is an expression list containing variables @@ -83598,32 +97351,23 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( ** save the results, and reuse the same result on subsequent invocations. */ if( !ExprHasProperty(pExpr, EP_VarSelect) ){ - jmpIfDynamic = sqlite3CodeOnce(pParse); VdbeCoverage(v); + jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } -#ifndef SQLITE_OMIT_EXPLAIN - if( pParse->explain==2 ){ - char *zMsg = sqlite3MPrintf( - pParse->db, "EXECUTE %s%s SUBQUERY %d", jmpIfDynamic>=0?"":"CORRELATED ", - pExpr->op==TK_IN?"LIST":"SCALAR", pParse->iNextSelectId - ); - sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); - } -#endif - switch( pExpr->op ){ case TK_IN: { - char affinity; /* Affinity of the LHS of the IN */ int addr; /* Address of OP_OpenEphemeral instruction */ Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ KeyInfo *pKeyInfo = 0; /* Key information */ - - affinity = sqlite3ExprAffinity(pLeft); + int nVal; /* Size of vector pLeft */ + + nVal = sqlite3ExprVectorSize(pLeft); + assert( !isRowid || nVal==1 ); /* Whether this is an 'x IN(SELECT...)' or an 'x IN(<exprlist>)' ** expression it is handled the same way. An ephemeral table is - ** filled with single-field index keys representing the results - ** from the SELECT or the <exprlist>. + ** filled with index keys representing the results from the + ** SELECT or the <exprlist>. ** ** If the 'x' expression is a column value, or the SELECT... ** statement returns a column value, then the affinity of that @@ -83634,8 +97378,9 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( ** is used. */ pExpr->iTable = pParse->nTab++; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, !isRowid); - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, 1, 1); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, + pExpr->iTable, (isRowid?0:nVal)); + pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ /* Case 1: expr IN (SELECT ...) @@ -83644,27 +97389,39 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( ** table allocated and opened above. */ Select *pSelect = pExpr->x.pSelect; - SelectDest dest; - ExprList *pEList; + ExprList *pEList = pSelect->pEList; + ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY", + jmpIfDynamic>=0?"":"CORRELATED " + )); assert( !isRowid ); - sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); - dest.affSdst = (u8)affinity; - assert( (pExpr->iTable&0x0000FFFF)==pExpr->iTable ); - pSelect->iLimit = 0; - testcase( pSelect->selFlags & SF_Distinct ); - testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ - if( sqlite3Select(pParse, pSelect, &dest) ){ - sqlite3KeyInfoUnref(pKeyInfo); - return 0; + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + SelectDest dest; + int i; + sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + if( sqlite3Select(pParse, pSelect, &dest) ){ + sqlite3DbFree(pParse->db, dest.zAffSdst); + sqlite3KeyInfoUnref(pKeyInfo); + return 0; + } + sqlite3DbFree(pParse->db, dest.zAffSdst); + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; i<nVal; i++){ + Expr *p = sqlite3VectorFieldSubexpr(pLeft, i); + pKeyInfo->aColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); + } } - pEList = pSelect->pEList; - assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ - assert( pEList!=0 ); - assert( pEList->nExpr>0 ); - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - pKeyInfo->aColl[0] = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, - pEList->a[0].pExpr); }else if( ALWAYS(pExpr->x.pList!=0) ){ /* Case 2: expr IN (exprlist) ** @@ -83673,13 +97430,14 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( ** that columns affinity when building index keys. If <expr> is not ** a column, use numeric affinity. */ + char affinity; /* Affinity of the LHS of the IN */ int i; ExprList *pList = pExpr->x.pList; struct ExprList_item *pItem; int r1, r2, r3; - + affinity = sqlite3ExprAffinity(pLeft); if( !affinity ){ - affinity = SQLITE_AFF_NONE; + affinity = SQLITE_AFF_BLOB; } if( pKeyInfo ){ assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); @@ -83689,7 +97447,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( /* Loop through each expression in <exprlist>. */ r1 = sqlite3GetTempReg(pParse); r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp2(v, OP_Null, 0, r2); + if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ Expr *pE2 = pItem->pExpr; int iValToIns; @@ -83717,7 +97475,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( }else{ sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); sqlite3ExprCacheAffinityChange(pParse, r3, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pExpr->iTable, r2); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1); } } } @@ -83733,35 +97491,53 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( case TK_EXISTS: case TK_SELECT: default: { - /* If this has to be a scalar SELECT. Generate code to put the - ** value of this select in a memory cell and record the number - ** of the memory cell in iColumn. If this is an EXISTS, write - ** an integer 0 (not exists) or 1 (exists) into a memory cell - ** and record that memory cell in iColumn. + /* Case 3: (SELECT ... FROM ...) + ** or: EXISTS(SELECT ... FROM ...) + ** + ** For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. */ Select *pSel; /* SELECT statement to encode */ - SelectDest dest; /* How to deal with SELECt result */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + Expr *pLimit; /* New limit expression */ testcase( pExpr->op==TK_EXISTS ); testcase( pExpr->op==TK_SELECT ); assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); - assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + pSel = pExpr->x.pSelect; - sqlite3SelectDestInit(&dest, 0, ++pParse->nMem); + ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY", + jmpIfDynamic>=0?"":"CORRELATED ")); + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; if( pExpr->op==TK_SELECT ){ dest.eDest = SRT_Mem; dest.iSdst = dest.iSDParm; - sqlite3VdbeAddOp2(v, OP_Null, 0, dest.iSDParm); + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); VdbeComment((v, "Init subquery result")); }else{ dest.eDest = SRT_Exists; sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); VdbeComment((v, "Init EXISTS result")); } - sqlite3ExprDelete(pParse->db, pSel->pLimit); - pSel->pLimit = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, - &sqlite3IntTokens[1]); + pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); + if( pSel->pLimit ){ + sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); + pSel->pLimit->pLeft = pLimit; + }else{ + pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); + } pSel->iLimit = 0; if( sqlite3Select(pParse, pSel, &dest) ){ return 0; @@ -83785,6 +97561,28 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( } #endif /* SQLITE_OMIT_SUBQUERY */ +#ifndef SQLITE_OMIT_SUBQUERY +/* +** Expr pIn is an IN(...) expression. This function checks that the +** sub-select on the RHS of the IN() operator has the same number of +** columns as the vector on the LHS. Or, if the RHS of the IN() is not +** a sub-query, that the LHS is a vector of size 1. +*/ +SQLITE_PRIVATE int sqlite3ExprCheckIN(Parse *pParse, Expr *pIn){ + int nVector = sqlite3ExprVectorSize(pIn->pLeft); + if( (pIn->flags & EP_xIsSelect) ){ + if( nVector!=pIn->x.pSelect->pEList->nExpr ){ + sqlite3SubselectError(pParse, pIn->x.pSelect->pEList->nExpr, nVector); + return 1; + } + }else if( nVector!=1 ){ + sqlite3VectorErrorMsg(pParse, pIn->pLeft); + return 1; + } + return 0; +} +#endif + #ifndef SQLITE_OMIT_SUBQUERY /* ** Generate code for an IN expression. @@ -83792,16 +97590,24 @@ SQLITE_PRIVATE int sqlite3CodeSubselect( ** x IN (SELECT ...) ** x IN (value, value, ...) ** -** The left-hand side (LHS) is a scalar expression. The right-hand side (RHS) -** is an array of zero or more values. The expression is true if the LHS is -** contained within the RHS. The value of the expression is unknown (NULL) -** if the LHS is NULL or if the LHS is not contained within the RHS and the -** RHS contains one or more NULL values. +** The left-hand side (LHS) is a scalar or vector expression. The +** right-hand side (RHS) is an array of zero or more scalar values, or a +** subquery. If the RHS is a subquery, the number of result columns must +** match the number of columns in the vector on the LHS. If the RHS is +** a list of values, the LHS must be a scalar. +** +** The IN operator is true if the LHS value is contained within the RHS. +** The result is false if the LHS is definitely not in the RHS. The +** result is NULL if the presence of the LHS in the RHS cannot be +** determined due to NULLs. ** ** This routine generates code that jumps to destIfFalse if the LHS is not ** contained within the RHS. If due to NULLs we cannot determine if the LHS ** is contained in the RHS then jump to destIfNull. If the LHS is contained ** within the RHS then fall through. +** +** See the separate in-operator.md documentation file in the canonical +** SQLite source tree for additional information. */ static void sqlite3ExprCodeIN( Parse *pParse, /* Parsing and code generating context */ @@ -83810,36 +97616,83 @@ static void sqlite3ExprCodeIN( int destIfNull /* Jump here if the results are unknown due to NULLs */ ){ int rRhsHasNull = 0; /* Register that is true if RHS contains NULL values */ - char affinity; /* Comparison affinity to use */ int eType; /* Type of the RHS */ - int r1; /* Temporary use register */ + int rLhs; /* Register(s) holding the LHS values */ + int rLhsOrig; /* LHS values prior to reordering by aiMap[] */ Vdbe *v; /* Statement under construction */ + int *aiMap = 0; /* Map from vector field to index column */ + char *zAff = 0; /* Affinity string for comparisons */ + int nVector; /* Size of vectors for this IN operator */ + int iDummy; /* Dummy parameter to exprCodeVector() */ + Expr *pLeft; /* The LHS of the IN operator */ + int i; /* loop counter */ + int destStep2; /* Where to jump when NULLs seen in step 2 */ + int destStep6 = 0; /* Start of code for Step 6 */ + int addrTruthOp; /* Address of opcode that determines the IN is true */ + int destNotNull; /* Jump here if a comparison is not true in step 6 */ + int addrTop; /* Top of the step-6 loop */ - /* Compute the RHS. After this step, the table with cursor - ** pExpr->iTable will contains the values that make up the RHS. - */ + pLeft = pExpr->pLeft; + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; + zAff = exprINAffinity(pParse, pExpr); + nVector = sqlite3ExprVectorSize(pExpr->pLeft); + aiMap = (int*)sqlite3DbMallocZero( + pParse->db, nVector*(sizeof(int) + sizeof(char)) + 1 + ); + if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; + + /* Attempt to compute the RHS. After this step, if anything other than + ** IN_INDEX_NOOP is returned, the table opened ith cursor pExpr->iTable + ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, + ** the RHS has not yet been coded. */ v = pParse->pVdbe; assert( v!=0 ); /* OOM detected prior to this routine */ VdbeNoopComment((v, "begin IN expr")); eType = sqlite3FindInIndex(pParse, pExpr, IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, - destIfFalse==destIfNull ? 0 : &rRhsHasNull); + destIfFalse==destIfNull ? 0 : &rRhsHasNull, aiMap); - /* Figure out the affinity to use to create a key from the results - ** of the expression. affinityStr stores a static string suitable for - ** P4 of OP_MakeRecord. - */ - affinity = comparisonAffinity(pExpr); + assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH + || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC + ); +#ifdef SQLITE_DEBUG + /* Confirm that aiMap[] contains nVector integer values between 0 and + ** nVector-1. */ + for(i=0; i<nVector; i++){ + int j, cnt; + for(cnt=j=0; j<nVector; j++) if( aiMap[j]==i ) cnt++; + assert( cnt==1 ); + } +#endif - /* Code the LHS, the <expr> from "<expr> IN (...)". + /* Code the LHS, the <expr> from "<expr> IN (...)". If the LHS is a + ** vector, then it is stored in an array of nVector registers starting + ** at r1. + ** + ** sqlite3FindInIndex() might have reordered the fields of the LHS vector + ** so that the fields are in the same order as an existing index. The + ** aiMap[] array contains a mapping from the original LHS field order to + ** the field order that matches the RHS index. */ sqlite3ExprCachePush(pParse); - r1 = sqlite3GetTempReg(pParse); - sqlite3ExprCode(pParse, pExpr->pLeft, r1); + rLhsOrig = exprCodeVector(pParse, pLeft, &iDummy); + for(i=0; i<nVector && aiMap[i]==i; i++){} /* Are LHS fields reordered? */ + if( i==nVector ){ + /* LHS fields are not reordered */ + rLhs = rLhsOrig; + }else{ + /* Need to reorder the LHS fields according to aiMap */ + rLhs = sqlite3GetTempRange(pParse, nVector); + for(i=0; i<nVector; i++){ + sqlite3VdbeAddOp3(v, OP_Copy, rLhsOrig+i, rLhs+aiMap[i], 0); + } + } /* If sqlite3FindInIndex() did not find or create an index that is ** suitable for evaluating the IN operator, then evaluate using a ** sequence of comparisons. + ** + ** This is step (1) in the in-operator.md optimized algorithm. */ if( eType==IN_INDEX_NOOP ){ ExprList *pList = pExpr->x.pList; @@ -83851,7 +97704,7 @@ static void sqlite3ExprCodeIN( assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); if( destIfNull!=destIfFalse ){ regCkNull = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_BitAnd, r1, r1, regCkNull); + sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); } for(ii=0; ii<pList->nExpr; ii++){ r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); @@ -83859,111 +97712,135 @@ static void sqlite3ExprCodeIN( sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); } if( ii<pList->nExpr-1 || destIfNull!=destIfFalse ){ - sqlite3VdbeAddOp4(v, OP_Eq, r1, labelOk, r2, + sqlite3VdbeAddOp4(v, OP_Eq, rLhs, labelOk, r2, (void*)pColl, P4_COLLSEQ); VdbeCoverageIf(v, ii<pList->nExpr-1); VdbeCoverageIf(v, ii==pList->nExpr-1); - sqlite3VdbeChangeP5(v, affinity); + sqlite3VdbeChangeP5(v, zAff[0]); }else{ assert( destIfNull==destIfFalse ); - sqlite3VdbeAddOp4(v, OP_Ne, r1, destIfFalse, r2, + sqlite3VdbeAddOp4(v, OP_Ne, rLhs, destIfFalse, r2, (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); - sqlite3VdbeChangeP5(v, affinity | SQLITE_JUMPIFNULL); + sqlite3VdbeChangeP5(v, zAff[0] | SQLITE_JUMPIFNULL); } sqlite3ReleaseTempReg(pParse, regToFree); } if( regCkNull ){ sqlite3VdbeAddOp2(v, OP_IsNull, regCkNull, destIfNull); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); + sqlite3VdbeGoto(v, destIfFalse); } sqlite3VdbeResolveLabel(v, labelOk); sqlite3ReleaseTempReg(pParse, regCkNull); + goto sqlite3ExprCodeIN_finished; + } + + /* Step 2: Check to see if the LHS contains any NULL columns. If the + ** LHS does contain NULLs then the result must be either FALSE or NULL. + ** We will then skip the binary search of the RHS. + */ + if( destIfNull==destIfFalse ){ + destStep2 = destIfFalse; }else{ - - /* If the LHS is NULL, then the result is either false or NULL depending - ** on whether the RHS is empty or not, respectively. - */ - if( sqlite3ExprCanBeNull(pExpr->pLeft) ){ - if( destIfNull==destIfFalse ){ - /* Shortcut for the common case where the false and NULL outcomes are - ** the same. */ - sqlite3VdbeAddOp2(v, OP_IsNull, r1, destIfNull); VdbeCoverage(v); - }else{ - int addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, r1); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); - sqlite3VdbeJumpHere(v, addr1); - } - } - - if( eType==IN_INDEX_ROWID ){ - /* In this case, the RHS is the ROWID of table b-tree - */ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r1, destIfFalse); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_NotExists, pExpr->iTable, destIfFalse, r1); + destStep2 = destStep6 = sqlite3VdbeMakeLabel(v); + } + for(i=0; i<nVector; i++){ + Expr *p = sqlite3VectorFieldSubexpr(pExpr->pLeft, i); + if( sqlite3ExprCanBeNull(p) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+i, destStep2); VdbeCoverage(v); - }else{ - /* In this case, the RHS is an index b-tree. - */ - sqlite3VdbeAddOp4(v, OP_Affinity, r1, 1, 0, &affinity, 1); - - /* If the set membership test fails, then the result of the - ** "x IN (...)" expression must be either 0 or NULL. If the set - ** contains no NULL values, then the result is 0. If the set - ** contains one or more NULL values, then the result of the - ** expression is also NULL. - */ - assert( destIfFalse!=destIfNull || rRhsHasNull==0 ); - if( rRhsHasNull==0 ){ - /* This branch runs if it is known at compile time that the RHS - ** cannot contain NULL values. This happens as the result - ** of a "NOT NULL" constraint in the database schema. - ** - ** Also run this branch if NULL is equivalent to FALSE - ** for this particular IN operator. - */ - sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, r1, 1); - VdbeCoverage(v); - }else{ - /* In this branch, the RHS of the IN might contain a NULL and - ** the presence of a NULL on the RHS makes a difference in the - ** outcome. - */ - int j1; - - /* First check to see if the LHS is contained in the RHS. If so, - ** then the answer is TRUE the presence of NULLs in the RHS does - ** not matter. If the LHS is not contained in the RHS, then the - ** answer is NULL if the RHS contains NULLs and the answer is - ** FALSE if the RHS is NULL-free. - */ - j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_IsNull, rRhsHasNull, destIfNull); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); - sqlite3VdbeJumpHere(v, j1); - } } } - sqlite3ReleaseTempReg(pParse, r1); + + /* Step 3. The LHS is now known to be non-NULL. Do the binary search + ** of the RHS using the LHS as a probe. If found, the result is + ** true. + */ + if( eType==IN_INDEX_ROWID ){ + /* In this case, the RHS is the ROWID of table b-tree and so we also + ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 + ** into a single opcode. */ + sqlite3VdbeAddOp3(v, OP_SeekRowid, pExpr->iTable, destIfFalse, rLhs); + VdbeCoverage(v); + addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ + }else{ + sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); + if( destIfFalse==destIfNull ){ + /* Combine Step 3 and Step 5 into a single opcode */ + sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, + rLhs, nVector); VdbeCoverage(v); + goto sqlite3ExprCodeIN_finished; + } + /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, + rLhs, nVector); VdbeCoverage(v); + } + + /* Step 4. If the RHS is known to be non-NULL and we did not find + ** an match on the search above, then the result must be FALSE. + */ + if( rRhsHasNull && nVector==1 ){ + sqlite3VdbeAddOp2(v, OP_NotNull, rRhsHasNull, destIfFalse); + VdbeCoverage(v); + } + + /* Step 5. If we do not care about the difference between NULL and + ** FALSE, then just return false. + */ + if( destIfFalse==destIfNull ) sqlite3VdbeGoto(v, destIfFalse); + + /* Step 6: Loop through rows of the RHS. Compare each row to the LHS. + ** If any comparison is NULL, then the result is NULL. If all + ** comparisons are FALSE then the final result is FALSE. + ** + ** For a scalar LHS, it is sufficient to check just the first row + ** of the RHS. + */ + if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); + VdbeCoverage(v); + if( nVector>1 ){ + destNotNull = sqlite3VdbeMakeLabel(v); + }else{ + /* For nVector==1, combine steps 6 and 7 by immediately returning + ** FALSE if the first comparison is not NULL */ + destNotNull = destIfFalse; + } + for(i=0; i<nVector; i++){ + Expr *p; + CollSeq *pColl; + int r3 = sqlite3GetTempReg(pParse); + p = sqlite3VectorFieldSubexpr(pLeft, i); + pColl = sqlite3ExprCollSeq(pParse, p); + sqlite3VdbeAddOp3(v, OP_Column, pExpr->iTable, i, r3); + sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3, + (void*)pColl, P4_COLLSEQ); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, r3); + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); + if( nVector>1 ){ + sqlite3VdbeResolveLabel(v, destNotNull); + sqlite3VdbeAddOp2(v, OP_Next, pExpr->iTable, addrTop+1); + VdbeCoverage(v); + + /* Step 7: If we reach this point, we know that the result must + ** be false. */ + sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfFalse); + } + + /* Jumps here in order to return true. */ + sqlite3VdbeJumpHere(v, addrTruthOp); + +sqlite3ExprCodeIN_finished: + if( rLhs!=rLhsOrig ) sqlite3ReleaseTempReg(pParse, rLhs); sqlite3ExprCachePop(pParse); VdbeComment((v, "end IN expr")); +sqlite3ExprCodeIN_oom_error: + sqlite3DbFree(pParse->db, aiMap); + sqlite3DbFree(pParse->db, zAff); } #endif /* SQLITE_OMIT_SUBQUERY */ -/* -** Duplicate an 8-byte value -*/ -static char *dup8bytes(Vdbe *v, const char *in){ - char *out = sqlite3DbMallocRaw(sqlite3VdbeDb(v), 8); - if( out ){ - memcpy(out, in, 8); - } - return out; -} - #ifndef SQLITE_OMIT_FLOATING_POINT /* ** Generate an instruction that will put the floating point @@ -83976,12 +97853,10 @@ static char *dup8bytes(Vdbe *v, const char *in){ static void codeReal(Vdbe *v, const char *z, int negateFlag, int iMem){ if( ALWAYS(z!=0) ){ double value; - char *zV; sqlite3AtoF(z, &value, sqlite3Strlen30(z), SQLITE_UTF8); assert( !sqlite3IsNaN(value) ); /* The new AtoF never returns NaN */ if( negateFlag ) value = -value; - zV = dup8bytes(v, (char*)&value); - sqlite3VdbeAddOp4(v, OP_Real, 0, iMem, 0, zV, P4_REAL); + sqlite3VdbeAddOp4Dup8(v, OP_Real, 0, iMem, 0, (u8*)&value, P4_REAL); } } #endif @@ -84006,37 +97881,38 @@ static void codeInteger(Parse *pParse, Expr *pExpr, int negFlag, int iMem){ const char *z = pExpr->u.zToken; assert( z!=0 ); c = sqlite3DecOrHexToI64(z, &value); - if( c==0 || (c==2 && negFlag) ){ - char *zV; - if( negFlag ){ value = c==2 ? SMALLEST_INT64 : -value; } - zV = dup8bytes(v, (char*)&value); - sqlite3VdbeAddOp4(v, OP_Int64, 0, iMem, 0, zV, P4_INT64); - }else{ + if( (c==3 && !negFlag) || (c==2) || (negFlag && value==SMALLEST_INT64)){ #ifdef SQLITE_OMIT_FLOATING_POINT sqlite3ErrorMsg(pParse, "oversized integer: %s%s", negFlag ? "-" : "", z); #else #ifndef SQLITE_OMIT_HEX_INTEGER if( sqlite3_strnicmp(z,"0x",2)==0 ){ - sqlite3ErrorMsg(pParse, "hex literal too big: %s", z); + sqlite3ErrorMsg(pParse, "hex literal too big: %s%s", negFlag?"-":"",z); }else #endif { codeReal(v, z, negFlag, iMem); } #endif + }else{ + if( negFlag ){ value = c==3 ? SMALLEST_INT64 : -value; } + sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, iMem, 0, (u8*)&value, P4_INT64); } } } /* -** Clear a cache entry. +** Erase column-cache entry number i */ -static void cacheEntryClear(Parse *pParse, struct yColCache *p){ - if( p->tempReg ){ +static void cacheEntryClear(Parse *pParse, int i){ + if( pParse->aColCache[i].tempReg ){ if( pParse->nTempReg<ArraySize(pParse->aTempReg) ){ - pParse->aTempReg[pParse->nTempReg++] = p->iReg; + pParse->aTempReg[pParse->nTempReg++] = pParse->aColCache[i].iReg; } - p->tempReg = 0; + } + pParse->nColCache--; + if( i<pParse->nColCache ){ + pParse->aColCache[i] = pParse->aColCache[pParse->nColCache]; } } @@ -84051,7 +97927,8 @@ SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int int idxLru; struct yColCache *p; - assert( iReg>0 ); /* Register numbers are always positive */ + /* Unless an error has occurred, register numbers are always positive. */ + assert( iReg>0 || pParse->nErr || pParse->db->mallocFailed ); assert( iCol>=-1 && iCol<32768 ); /* Finite column numbers */ /* The SQLITE_ColumnCache flag disables the column cache. This is used @@ -84066,43 +97943,33 @@ SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int ** that the object will never already be in cache. Verify this guarantee. */ #ifndef NDEBUG - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ - assert( p->iReg==0 || p->iTable!=iTab || p->iColumn!=iCol ); + for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){ + assert( p->iTable!=iTab || p->iColumn!=iCol ); } #endif - /* Find an empty slot and replace it */ - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ - if( p->iReg==0 ){ - p->iLevel = pParse->iCacheLevel; - p->iTable = iTab; - p->iColumn = iCol; - p->iReg = iReg; - p->tempReg = 0; - p->lru = pParse->iCacheCnt++; - return; + /* If the cache is already full, delete the least recently used entry */ + if( pParse->nColCache>=SQLITE_N_COLCACHE ){ + minLru = 0x7fffffff; + idxLru = -1; + for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ + if( p->lru<minLru ){ + idxLru = i; + minLru = p->lru; + } } + p = &pParse->aColCache[idxLru]; + }else{ + p = &pParse->aColCache[pParse->nColCache++]; } - /* Replace the last recently used */ - minLru = 0x7fffffff; - idxLru = -1; - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ - if( p->lru<minLru ){ - idxLru = i; - minLru = p->lru; - } - } - if( ALWAYS(idxLru>=0) ){ - p = &pParse->aColCache[idxLru]; - p->iLevel = pParse->iCacheLevel; - p->iTable = iTab; - p->iColumn = iCol; - p->iReg = iReg; - p->tempReg = 0; - p->lru = pParse->iCacheCnt++; - return; - } + /* Add the new entry to the end of the cache */ + p->iLevel = pParse->iCacheLevel; + p->iTable = iTab; + p->iColumn = iCol; + p->iReg = iReg; + p->tempReg = 0; + p->lru = pParse->iCacheCnt++; } /* @@ -84110,14 +97977,13 @@ SQLITE_PRIVATE void sqlite3ExprCacheStore(Parse *pParse, int iTab, int iCol, int ** Purge the range of registers from the column cache. */ SQLITE_PRIVATE void sqlite3ExprCacheRemove(Parse *pParse, int iReg, int nReg){ - int i; - int iLast = iReg + nReg - 1; - struct yColCache *p; - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ - int r = p->iReg; - if( r>=iReg && r<=iLast ){ - cacheEntryClear(pParse, p); - p->iReg = 0; + int i = 0; + while( i<pParse->nColCache ){ + struct yColCache *p = &pParse->aColCache[i]; + if( p->iReg >= iReg && p->iReg < iReg+nReg ){ + cacheEntryClear(pParse, i); + }else{ + i++; } } } @@ -84142,8 +98008,7 @@ SQLITE_PRIVATE void sqlite3ExprCachePush(Parse *pParse){ ** the cache to the state it was in prior the most recent Push. */ SQLITE_PRIVATE void sqlite3ExprCachePop(Parse *pParse){ - int i; - struct yColCache *p; + int i = 0; assert( pParse->iCacheLevel>=1 ); pParse->iCacheLevel--; #ifdef SQLITE_DEBUG @@ -84151,10 +98016,11 @@ SQLITE_PRIVATE void sqlite3ExprCachePop(Parse *pParse){ printf("POP to %d\n", pParse->iCacheLevel); } #endif - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ - if( p->iReg && p->iLevel>pParse->iCacheLevel ){ - cacheEntryClear(pParse, p); - p->iReg = 0; + while( i<pParse->nColCache ){ + if( pParse->aColCache[i].iLevel>pParse->iCacheLevel ){ + cacheEntryClear(pParse, i); + }else{ + i++; } } } @@ -84168,13 +98034,36 @@ SQLITE_PRIVATE void sqlite3ExprCachePop(Parse *pParse){ static void sqlite3ExprCachePinRegister(Parse *pParse, int iReg){ int i; struct yColCache *p; - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ + for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){ if( p->iReg==iReg ){ p->tempReg = 0; } } } +/* Generate code that will load into register regOut a value that is +** appropriate for the iIdxCol-th column of index pIdx. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeLoadIndexColumn( + Parse *pParse, /* The parsing context */ + Index *pIdx, /* The index whose column is to be loaded */ + int iTabCur, /* Cursor pointing to a table row */ + int iIdxCol, /* The column of the index to be loaded */ + int regOut /* Store the index column value in this register */ +){ + i16 iTabCol = pIdx->aiColumn[iIdxCol]; + if( iTabCol==XN_EXPR ){ + assert( pIdx->aColExpr ); + assert( pIdx->aColExpr->nExpr>iIdxCol ); + pParse->iSelfTab = iTabCur + 1; + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); + pParse->iSelfTab = 0; + }else{ + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, + iTabCol, regOut); + } +} + /* ** Generate code to extract the value of the iCol-th column of a table. */ @@ -84185,12 +98074,16 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( int iCol, /* Index of the column to extract */ int regOut /* Extract the value into this register */ ){ + if( pTab==0 ){ + sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut); + return; + } if( iCol<0 || iCol==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); }else{ int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; int x = iCol; - if( !HasRowid(pTab) ){ + if( !HasRowid(pTab) && !IsVirtual(pTab) ){ x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol); } sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); @@ -84202,9 +98095,12 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( /* ** Generate code that will extract the iColumn-th column from -** table pTab and store the column value in a register. An effort -** is made to store the column value in register iReg, but this is -** not guaranteed. The location of the column value is returned. +** table pTab and store the column value in a register. +** +** An effort is made to store the column value in register iReg. This +** is not garanteeed for GetColumn() - the result can be stored in +** any register. But the result is guaranteed to land in register iReg +** for GetColumnToReg(). ** ** There must be an open cursor to pTab in iTable when this routine ** is called. If iColumn<0 then code is generated that extracts the rowid. @@ -84215,14 +98111,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( int iColumn, /* Index of the table column */ int iTable, /* The cursor pointing to the table */ int iReg, /* Store results here */ - u8 p5 /* P5 value for OP_Column */ + u8 p5 /* P5 value for OP_Column + FLAGS */ ){ Vdbe *v = pParse->pVdbe; int i; struct yColCache *p; - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ - if( p->iReg>0 && p->iTable==iTable && p->iColumn==iColumn ){ + for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){ + if( p->iTable==iTable && p->iColumn==iColumn ){ p->lru = pParse->iCacheCnt++; sqlite3ExprCachePinRegister(pParse, p->iReg); return p->iReg; @@ -84237,25 +98133,37 @@ SQLITE_PRIVATE int sqlite3ExprCodeGetColumn( } return iReg; } +SQLITE_PRIVATE void sqlite3ExprCodeGetColumnToReg( + Parse *pParse, /* Parsing and code generating context */ + Table *pTab, /* Description of the table we are reading from */ + int iColumn, /* Index of the table column */ + int iTable, /* The cursor pointing to the table */ + int iReg /* Store results here */ +){ + int r1 = sqlite3ExprCodeGetColumn(pParse, pTab, iColumn, iTable, iReg, 0); + if( r1!=iReg ) sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, r1, iReg); +} + /* ** Clear all column cache entries. */ SQLITE_PRIVATE void sqlite3ExprCacheClear(Parse *pParse){ int i; - struct yColCache *p; -#if SQLITE_DEBUG +#ifdef SQLITE_DEBUG if( pParse->db->flags & SQLITE_VdbeAddopTrace ){ printf("CLEAR\n"); } #endif - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ - if( p->iReg ){ - cacheEntryClear(pParse, p); - p->iReg = 0; + for(i=0; i<pParse->nColCache; i++){ + if( pParse->aColCache[i].tempReg + && pParse->nTempReg<ArraySize(pParse->aTempReg) + ){ + pParse->aTempReg[pParse->nTempReg++] = pParse->aColCache[i].iReg; } } + pParse->nColCache = 0; } /* @@ -84287,7 +98195,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int n static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){ int i; struct yColCache *p; - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ + for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){ int r = p->iReg; if( r>=iFrom && r<=iTo ) return 1; /*NO_TEST*/ } @@ -84295,8 +98203,11 @@ static int usedAsColumnCache(Parse *pParse, int iFrom, int iTo){ } #endif /* SQLITE_DEBUG || SQLITE_COVERAGE_TEST */ + /* -** Convert an expression node to a TK_REGISTER +** Convert a scalar expression node to a TK_REGISTER referencing +** register iReg. The caller must ensure that iReg already contains +** the correct value for the expression. */ static void exprToRegister(Expr *p, int iReg){ p->op2 = p->op; @@ -84305,6 +98216,42 @@ static void exprToRegister(Expr *p, int iReg){ ExprClearProperty(p, EP_Skip); } +/* +** Evaluate an expression (either a vector or a scalar expression) and store +** the result in continguous temporary registers. Return the index of +** the first register used to store the result. +** +** If the returned result register is a temporary scalar, then also write +** that register number into *piFreeable. If the returned result register +** is not a temporary or if the expression is a vector set *piFreeable +** to 0. +*/ +static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ + int iResult; + int nResult = sqlite3ExprVectorSize(p); + if( nResult==1 ){ + iResult = sqlite3ExprCodeTemp(pParse, p, piFreeable); + }else{ + *piFreeable = 0; + if( p->op==TK_SELECT ){ +#if SQLITE_OMIT_SUBQUERY + iResult = 0; +#else + iResult = sqlite3CodeSubselect(pParse, p, 0, 0); +#endif + }else{ + int i; + iResult = pParse->nMem+1; + pParse->nMem += nResult; + for(i=0; i<nResult; i++){ + sqlite3ExprCodeFactorable(pParse, p->x.pList->a[i].pExpr, i+iResult); + } + } + } + return iResult; +} + + /* ** Generate code into the current Vdbe to evaluate the given ** expression. Attempt to store the results in register "target". @@ -84322,9 +98269,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) int inReg = target; /* Results stored in register inReg */ int regFree1 = 0; /* If non-zero free this temporary register */ int regFree2 = 0; /* If non-zero free this temporary register */ - int r1, r2, r3, r4; /* Various register numbers */ - sqlite3 *db = pParse->db; /* The database connection */ + int r1, r2; /* Various register numbers */ Expr tempX; /* Temporary expression node */ + int p5 = 0; assert( target>0 && target<=pParse->nMem ); if( v==0 ){ @@ -84332,6 +98279,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) return 0; } +expr_code_doover: if( pExpr==0 ){ op = TK_NULL; }else{ @@ -84343,51 +98291,53 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) struct AggInfo_col *pCol = &pAggInfo->aCol[pExpr->iAgg]; if( !pAggInfo->directMode ){ assert( pCol->iMem>0 ); - inReg = pCol->iMem; - break; + return pCol->iMem; }else if( pAggInfo->useSortingIdx ){ sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab, pCol->iSorterColumn, target); - break; + return target; } /* Otherwise, fall thru into the TK_COLUMN case */ } case TK_COLUMN: { int iTab = pExpr->iTable; if( iTab<0 ){ - if( pParse->ckBase>0 ){ + if( pParse->iSelfTab<0 ){ /* Generating CHECK constraints or inserting into partial index */ - inReg = pExpr->iColumn + pParse->ckBase; - break; + return pExpr->iColumn - pParse->iSelfTab; }else{ - /* Deleting from a partial index */ - iTab = pParse->iPartIdxTab; + /* Coding an expression that is part of an index where column names + ** in the index refer to the table to which the index belongs */ + iTab = pParse->iSelfTab - 1; } } - inReg = sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, + return sqlite3ExprCodeGetColumn(pParse, pExpr->pTab, pExpr->iColumn, iTab, target, pExpr->op2); - break; } case TK_INTEGER: { codeInteger(pParse, pExpr, 0, target); - break; + return target; + } + case TK_TRUEFALSE: { + sqlite3VdbeAddOp2(v, OP_Integer, sqlite3ExprTruthValue(pExpr), target); + return target; } #ifndef SQLITE_OMIT_FLOATING_POINT case TK_FLOAT: { assert( !ExprHasProperty(pExpr, EP_IntValue) ); codeReal(v, pExpr->u.zToken, 0, target); - break; + return target; } #endif case TK_STRING: { assert( !ExprHasProperty(pExpr, EP_IntValue) ); - sqlite3VdbeAddOp4(v, OP_String8, 0, target, 0, pExpr->u.zToken, 0); - break; + sqlite3VdbeLoadString(v, target, pExpr->u.zToken); + return target; } case TK_NULL: { sqlite3VdbeAddOp2(v, OP_Null, 0, target); - break; + return target; } #ifndef SQLITE_OMIT_BLOB_LITERAL case TK_BLOB: { @@ -84402,7 +98352,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( z[n]=='\'' ); zBlob = sqlite3HexToBlob(sqlite3VdbeDb(v), z, n); sqlite3VdbeAddOp4(v, OP_Blob, n/2, target, 0, zBlob, P4_DYNAMIC); - break; + return target; } #endif case TK_VARIABLE: { @@ -84411,19 +98361,15 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( pExpr->u.zToken[0]!=0 ); sqlite3VdbeAddOp2(v, OP_Variable, pExpr->iColumn, target); if( pExpr->u.zToken[1]!=0 ){ - assert( pExpr->u.zToken[0]=='?' - || strcmp(pExpr->u.zToken, pParse->azVar[pExpr->iColumn-1])==0 ); - sqlite3VdbeChangeP4(v, -1, pParse->azVar[pExpr->iColumn-1], P4_STATIC); + const char *z = sqlite3VListNumToName(pParse->pVList, pExpr->iColumn); + assert( pExpr->u.zToken[0]=='?' || strcmp(pExpr->u.zToken, z)==0 ); + pParse->pVList[0] = 0; /* Indicate VList may no longer be enlarged */ + sqlite3VdbeAppendP4(v, (char*)z, P4_STATIC); } - break; + return target; } case TK_REGISTER: { - inReg = pExpr->iTable; - break; - } - case TK_AS: { - inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); - break; + return pExpr->iTable; } #ifndef SQLITE_OMIT_CAST case TK_CAST: { @@ -84437,42 +98383,37 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3AffinityType(pExpr->u.zToken, 0)); testcase( usedAsColumnCache(pParse, inReg, inReg) ); sqlite3ExprCacheAffinityChange(pParse, inReg, 1); - break; + return inReg; } #endif /* SQLITE_OMIT_CAST */ + case TK_IS: + case TK_ISNOT: + op = (op==TK_IS) ? TK_EQ : TK_NE; + p5 = SQLITE_NULLEQ; + /* fall-through */ case TK_LT: case TK_LE: case TK_GT: case TK_GE: case TK_NE: case TK_EQ: { - r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); - codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, inReg, SQLITE_STOREP2); - assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); - assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); - assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); - assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); - assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); - assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); - testcase( regFree1==0 ); - testcase( regFree2==0 ); - break; - } - case TK_IS: - case TK_ISNOT: { - testcase( op==TK_IS ); - testcase( op==TK_ISNOT ); - r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); - op = (op==TK_IS) ? TK_EQ : TK_NE; - codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, inReg, SQLITE_STOREP2 | SQLITE_NULLEQ); - VdbeCoverageIf(v, op==TK_EQ); - VdbeCoverageIf(v, op==TK_NE); - testcase( regFree1==0 ); - testcase( regFree2==0 ); + Expr *pLeft = pExpr->pLeft; + if( sqlite3ExprIsVector(pLeft) ){ + codeVectorCompare(pParse, pExpr, target, op, p5); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); + r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); + codeCompare(pParse, pLeft, pExpr->pRight, op, + r1, r2, inReg, SQLITE_STOREP2 | p5); + assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); + assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); + assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); + assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); + testcase( regFree1==0 ); + testcase( regFree2==0 ); + } break; } case TK_AND: @@ -84510,10 +98451,12 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( pLeft ); if( pLeft->op==TK_INTEGER ){ codeInteger(pParse, pLeft, 1, target); + return target; #ifndef SQLITE_OMIT_FLOATING_POINT }else if( pLeft->op==TK_FLOAT ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); codeReal(v, pLeft->u.zToken, 1, target); + return target; #endif }else{ tempX.op = TK_INTEGER; @@ -84524,7 +98467,6 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3VdbeAddOp3(v, OP_Subtract, r2, r1, target); testcase( regFree2==0 ); } - inReg = target; break; } case TK_BITNOT: @@ -84533,10 +98475,21 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( TK_NOT==OP_Not ); testcase( op==TK_NOT ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); testcase( regFree1==0 ); - inReg = target; sqlite3VdbeAddOp2(v, op, r1, inReg); break; } + case TK_TRUTH: { + int isTrue; /* IS TRUE or IS NOT TRUE */ + int bNormal; /* IS TRUE or IS FALSE */ + r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); + testcase( regFree1==0 ); + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + bNormal = pExpr->op2==TK_IS; + testcase( isTrue && bNormal); + testcase( !isTrue && bNormal); + sqlite3VdbeAddOp4Int(v, OP_IsTrue, r1, inReg, !isTrue, isTrue ^ bNormal); + break; + } case TK_ISNULL: case TK_NOTNULL: { int addr; @@ -84558,7 +98511,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( !ExprHasProperty(pExpr, EP_IntValue) ); sqlite3ErrorMsg(pParse, "misuse of aggregate: %s()", pExpr->u.zToken); }else{ - inReg = pInfo->aFunc[pExpr->iAgg].iMem; + return pInfo->aFunc[pExpr->iAgg].iMem; } break; } @@ -84566,13 +98519,18 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ExprList *pFarg; /* List of function arguments */ int nFarg; /* Number of function arguments */ FuncDef *pDef; /* The function definition object */ - int nId; /* Length of the function name in bytes */ const char *zId; /* The function name */ u32 constMask = 0; /* Mask of function arguments that are constant */ int i; /* Loop counter */ + sqlite3 *db = pParse->db; /* The database connection */ u8 enc = ENC(db); /* The text encoding used by this database */ CollSeq *pColl = 0; /* A collating sequence */ + if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){ + /* SQL functions can be expensive. So try to move constant functions + ** out of the inner loop, even if that means an extra OP_Copy. */ + return sqlite3ExprCodeAtInit(pParse, pExpr, -1); + } assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); if( ExprHasProperty(pExpr, EP_TokenOnly) ){ pFarg = 0; @@ -84582,10 +98540,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) nFarg = pFarg ? pFarg->nExpr : 0; assert( !ExprHasProperty(pExpr, EP_IntValue) ); zId = pExpr->u.zToken; - nId = sqlite3Strlen30(zId); - pDef = sqlite3FindFunction(db, zId, nId, nFarg, enc, 0); - if( pDef==0 || pDef->xFunc==0 ){ - sqlite3ErrorMsg(pParse, "unknown function: %.*s()", nId, zId); + pDef = sqlite3FindFunction(db, zId, nFarg, enc, 0); +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + if( pDef==0 && pParse->explain ){ + pDef = sqlite3FindFunction(db, "unknown", nFarg, enc, 0); + } +#endif + if( pDef==0 || pDef->xFinalize!=0 ){ + sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); break; } @@ -84614,10 +98576,25 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) */ if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ assert( nFarg>=1 ); - sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); - break; + return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); } +#ifdef SQLITE_DEBUG + /* The AFFINITY() function evaluates to a string that describes + ** the type affinity of the argument. This is used for testing of + ** the SQLite type logic. + */ + if( pDef->funcFlags & SQLITE_FUNC_AFFINITY ){ + const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + char aff; + assert( nFarg==1 ); + aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); + sqlite3VdbeLoadString(v, target, + aff ? azAff[aff-SQLITE_AFF_BLOB] : "none"); + return target; + } +#endif + for(i=0; i<nFarg; i++){ if( i<32 && sqlite3ExprIsConstant(pFarg->a[i].pExpr) ){ testcase( i==31 ); @@ -84655,7 +98632,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) } sqlite3ExprCachePush(pParse); /* Ticket 2ea2425d34be */ - sqlite3ExprCodeExprList(pParse, pFarg, r1, + sqlite3ExprCodeExprList(pParse, pFarg, r1, 0, SQLITE_ECEL_DUP|SQLITE_ECEL_FACTOR); sqlite3ExprCachePop(pParse); /* Ticket 2ea2425d34be */ }else{ @@ -84684,22 +98661,53 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( !pColl ) pColl = db->pDfltColl; sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); } - sqlite3VdbeAddOp4(v, OP_Function, constMask, r1, target, - (char*)pDef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, (u8)nFarg); +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + if( pDef->funcFlags & SQLITE_FUNC_OFFSET ){ + Expr *pArg = pFarg->a[0].pExpr; + if( pArg->op==TK_COLUMN ){ + sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + }else +#endif + { + sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0, + constMask, r1, target, (char*)pDef, P4_FUNCDEF); + sqlite3VdbeChangeP5(v, (u8)nFarg); + } if( nFarg && constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); } - break; + return target; } #ifndef SQLITE_OMIT_SUBQUERY case TK_EXISTS: case TK_SELECT: { + int nCol; testcase( op==TK_EXISTS ); testcase( op==TK_SELECT ); - inReg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); + if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){ + sqlite3SubselectError(pParse, nCol, 1); + }else{ + return sqlite3CodeSubselect(pParse, pExpr, 0, 0); + } break; } + case TK_SELECT_COLUMN: { + int n; + if( pExpr->pLeft->iTable==0 ){ + pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0); + } + assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); + if( pExpr->iTable + && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) + ){ + sqlite3ErrorMsg(pParse, "%d columns assigned %d values", + pExpr->iTable, n); + } + return pExpr->pLeft->iTable + pExpr->iColumn; + } case TK_IN: { int destIfFalse = sqlite3VdbeMakeLabel(v); int destIfNull = sqlite3VdbeMakeLabel(v); @@ -84709,7 +98717,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3VdbeResolveLabel(v, destIfFalse); sqlite3VdbeAddOp2(v, OP_AddImm, target, 0); sqlite3VdbeResolveLabel(v, destIfNull); - break; + return target; } #endif /* SQLITE_OMIT_SUBQUERY */ @@ -84726,34 +98734,14 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) ** Z is stored in pExpr->pList->a[1].pExpr. */ case TK_BETWEEN: { - Expr *pLeft = pExpr->pLeft; - struct ExprList_item *pLItem = pExpr->x.pList->a; - Expr *pRight = pLItem->pExpr; - - r1 = sqlite3ExprCodeTemp(pParse, pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2); - testcase( regFree1==0 ); - testcase( regFree2==0 ); - r3 = sqlite3GetTempReg(pParse); - r4 = sqlite3GetTempReg(pParse); - codeCompare(pParse, pLeft, pRight, OP_Ge, - r1, r2, r3, SQLITE_STOREP2); VdbeCoverage(v); - pLItem++; - pRight = pLItem->pExpr; - sqlite3ReleaseTempReg(pParse, regFree2); - r2 = sqlite3ExprCodeTemp(pParse, pRight, ®Free2); - testcase( regFree2==0 ); - codeCompare(pParse, pLeft, pRight, OP_Le, r1, r2, r4, SQLITE_STOREP2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_And, r3, r4, target); - sqlite3ReleaseTempReg(pParse, r3); - sqlite3ReleaseTempReg(pParse, r4); - break; + exprCodeBetween(pParse, pExpr, target, 0, 0); + return target; } + case TK_SPAN: case TK_COLLATE: case TK_UPLUS: { - inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); - break; + pExpr = pExpr->pLeft; + goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */ } case TK_TRIGGER: { @@ -84791,10 +98779,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) assert( p1>=0 && p1<(pTab->nCol*2+2) ); sqlite3VdbeAddOp2(v, OP_Param, p1, target); - VdbeComment((v, "%s.%s -> $%d", + VdbeComment((v, "r[%d]=%s.%s", target, (pExpr->iTable ? "new" : "old"), - (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName), - target + (pExpr->iColumn<0 ? "rowid" : pExpr->pTab->aCol[pExpr->iColumn].zName) )); #ifndef SQLITE_OMIT_FLOATING_POINT @@ -84812,6 +98799,21 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) break; } + case TK_VECTOR: { + sqlite3ErrorMsg(pParse, "row value misused"); + break; + } + + case TK_IF_NULL_ROW: { + int addrINR; + addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); + sqlite3ExprCachePush(pParse); + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + sqlite3ExprCachePop(pParse); + sqlite3VdbeJumpHere(v, addrINR); + sqlite3VdbeChangeP3(v, addrINR, inReg); + break; + } /* ** Form A: @@ -84855,8 +98857,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) if( (pX = pExpr->pLeft)!=0 ){ tempX = *pX; testcase( pX->op==TK_COLUMN ); - exprToRegister(&tempX, sqlite3ExprCodeTemp(pParse, pX, ®Free1)); + exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); testcase( regFree1==0 ); + memset(&opCompare, 0, sizeof(opCompare)); opCompare.op = TK_EQ; opCompare.pLeft = &tempX; pTest = &opCompare; @@ -84879,7 +98882,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); sqlite3ExprCode(pParse, aListelem[i+1].pExpr, target); - sqlite3VdbeAddOp2(v, OP_Goto, 0, endLabel); + sqlite3VdbeGoto(v, endLabel); sqlite3ExprCachePop(pParse); sqlite3VdbeResolveLabel(v, nextCase); } @@ -84890,7 +98893,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, target); } - assert( db->mallocFailed || pParse->nErr>0 + assert( pParse->db->mallocFailed || pParse->nErr>0 || pParse->iCacheLevel==iCacheLevel ); sqlite3VdbeResolveLabel(v, endLabel); break; @@ -84931,24 +98934,40 @@ SQLITE_PRIVATE int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target) /* ** Factor out the code of the given expression to initialization time. +** +** If regDest>=0 then the result is always stored in that register and the +** result is not reusable. If regDest<0 then this routine is free to +** store the value whereever it wants. The register where the expression +** is stored is returned. When regDest<0, two identical expressions will +** code to the same register. */ -SQLITE_PRIVATE void sqlite3ExprCodeAtInit( +SQLITE_PRIVATE int sqlite3ExprCodeAtInit( Parse *pParse, /* Parsing context */ Expr *pExpr, /* The expression to code when the VDBE initializes */ - int regDest, /* Store the value in this register */ - u8 reusable /* True if this expression is reusable */ + int regDest /* Store the value in this register */ ){ ExprList *p; assert( ConstFactorOk(pParse) ); p = pParse->pConstExpr; + if( regDest<0 && p ){ + struct ExprList_item *pItem; + int i; + for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ + if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){ + return pItem->u.iConstExprReg; + } + } + } pExpr = sqlite3ExprDup(pParse->db, pExpr, 0); p = sqlite3ExprListAppend(pParse, p, pExpr); if( p ){ struct ExprList_item *pItem = &p->a[p->nExpr-1]; + pItem->reusable = regDest<0; + if( regDest<0 ) regDest = ++pParse->nMem; pItem->u.iConstExprReg = regDest; - pItem->reusable = reusable; } pParse->pConstExpr = p; + return regDest; } /* @@ -84971,19 +98990,8 @@ SQLITE_PRIVATE int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ && pExpr->op!=TK_REGISTER && sqlite3ExprIsConstantNotJoin(pExpr) ){ - ExprList *p = pParse->pConstExpr; - int i; *pReg = 0; - if( p ){ - struct ExprList_item *pItem; - for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ - if( pItem->reusable && sqlite3ExprCompare(pItem->pExpr,pExpr,-1)==0 ){ - return pItem->u.iConstExprReg; - } - } - } - r2 = ++pParse->nMem; - sqlite3ExprCodeAtInit(pParse, pExpr, r2, 1); + r2 = sqlite3ExprCodeAtInit(pParse, pExpr, -1); }else{ int r1 = sqlite3GetTempReg(pParse); r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1); @@ -85010,13 +99018,25 @@ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target); }else{ inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); - assert( pParse->pVdbe || pParse->db->mallocFailed ); + assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); if( inReg!=target && pParse->pVdbe ){ sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); } } } +/* +** Make a transient copy of expression pExpr and then code it using +** sqlite3ExprCode(). This routine works just like sqlite3ExprCode() +** except that the input expression is guaranteed to be unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){ + sqlite3 *db = pParse->db; + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( !db->mallocFailed ) sqlite3ExprCode(pParse, pExpr, target); + sqlite3ExprDelete(db, pExpr); +} + /* ** Generate code that will evaluate expression pExpr and store the ** results in register target. The results are guaranteed to appear @@ -85025,7 +99045,7 @@ SQLITE_PRIVATE void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ */ SQLITE_PRIVATE void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ if( pParse->okConstFactor && sqlite3ExprIsConstant(pExpr) ){ - sqlite3ExprCodeAtInit(pParse, pExpr, target, 0); + sqlite3ExprCodeAtInit(pParse, pExpr, target); }else{ sqlite3ExprCode(pParse, pExpr, target); } @@ -85055,289 +99075,37 @@ SQLITE_PRIVATE void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int targ exprToRegister(pExpr, iMem); } -#ifdef SQLITE_DEBUG -/* -** Generate a human-readable explanation of an expression tree. -*/ -SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ - const char *zBinOp = 0; /* Binary operator */ - const char *zUniOp = 0; /* Unary operator */ - pView = sqlite3TreeViewPush(pView, moreToFollow); - if( pExpr==0 ){ - sqlite3TreeViewLine(pView, "nil"); - sqlite3TreeViewPop(pView); - return; - } - switch( pExpr->op ){ - case TK_AGG_COLUMN: { - sqlite3TreeViewLine(pView, "AGG{%d:%d}", - pExpr->iTable, pExpr->iColumn); - break; - } - case TK_COLUMN: { - if( pExpr->iTable<0 ){ - /* This only happens when coding check constraints */ - sqlite3TreeViewLine(pView, "COLUMN(%d)", pExpr->iColumn); - }else{ - sqlite3TreeViewLine(pView, "{%d:%d}", - pExpr->iTable, pExpr->iColumn); - } - break; - } - case TK_INTEGER: { - if( pExpr->flags & EP_IntValue ){ - sqlite3TreeViewLine(pView, "%d", pExpr->u.iValue); - }else{ - sqlite3TreeViewLine(pView, "%s", pExpr->u.zToken); - } - break; - } -#ifndef SQLITE_OMIT_FLOATING_POINT - case TK_FLOAT: { - sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); - break; - } -#endif - case TK_STRING: { - sqlite3TreeViewLine(pView,"%Q", pExpr->u.zToken); - break; - } - case TK_NULL: { - sqlite3TreeViewLine(pView,"NULL"); - break; - } -#ifndef SQLITE_OMIT_BLOB_LITERAL - case TK_BLOB: { - sqlite3TreeViewLine(pView,"%s", pExpr->u.zToken); - break; - } -#endif - case TK_VARIABLE: { - sqlite3TreeViewLine(pView,"VARIABLE(%s,%d)", - pExpr->u.zToken, pExpr->iColumn); - break; - } - case TK_REGISTER: { - sqlite3TreeViewLine(pView,"REGISTER(%d)", pExpr->iTable); - break; - } - case TK_AS: { - sqlite3TreeViewLine(pView,"AS %Q", pExpr->u.zToken); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - break; - } - case TK_ID: { - sqlite3TreeViewLine(pView,"ID %Q", pExpr->u.zToken); - break; - } -#ifndef SQLITE_OMIT_CAST - case TK_CAST: { - /* Expressions of the form: CAST(pLeft AS token) */ - sqlite3TreeViewLine(pView,"CAST %Q", pExpr->u.zToken); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - break; - } -#endif /* SQLITE_OMIT_CAST */ - case TK_LT: zBinOp = "LT"; break; - case TK_LE: zBinOp = "LE"; break; - case TK_GT: zBinOp = "GT"; break; - case TK_GE: zBinOp = "GE"; break; - case TK_NE: zBinOp = "NE"; break; - case TK_EQ: zBinOp = "EQ"; break; - case TK_IS: zBinOp = "IS"; break; - case TK_ISNOT: zBinOp = "ISNOT"; break; - case TK_AND: zBinOp = "AND"; break; - case TK_OR: zBinOp = "OR"; break; - case TK_PLUS: zBinOp = "ADD"; break; - case TK_STAR: zBinOp = "MUL"; break; - case TK_MINUS: zBinOp = "SUB"; break; - case TK_REM: zBinOp = "REM"; break; - case TK_BITAND: zBinOp = "BITAND"; break; - case TK_BITOR: zBinOp = "BITOR"; break; - case TK_SLASH: zBinOp = "DIV"; break; - case TK_LSHIFT: zBinOp = "LSHIFT"; break; - case TK_RSHIFT: zBinOp = "RSHIFT"; break; - case TK_CONCAT: zBinOp = "CONCAT"; break; - case TK_DOT: zBinOp = "DOT"; break; - - case TK_UMINUS: zUniOp = "UMINUS"; break; - case TK_UPLUS: zUniOp = "UPLUS"; break; - case TK_BITNOT: zUniOp = "BITNOT"; break; - case TK_NOT: zUniOp = "NOT"; break; - case TK_ISNULL: zUniOp = "ISNULL"; break; - case TK_NOTNULL: zUniOp = "NOTNULL"; break; - - case TK_COLLATE: { - sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - break; - } - - case TK_AGG_FUNCTION: - case TK_FUNCTION: { - ExprList *pFarg; /* List of function arguments */ - if( ExprHasProperty(pExpr, EP_TokenOnly) ){ - pFarg = 0; - }else{ - pFarg = pExpr->x.pList; - } - if( pExpr->op==TK_AGG_FUNCTION ){ - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", - pExpr->op2, pExpr->u.zToken); - }else{ - sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); - } - if( pFarg ){ - sqlite3TreeViewExprList(pView, pFarg, 0, 0); - } - break; - } -#ifndef SQLITE_OMIT_SUBQUERY - case TK_EXISTS: { - sqlite3TreeViewLine(pView, "EXISTS-expr"); - sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); - break; - } - case TK_SELECT: { - sqlite3TreeViewLine(pView, "SELECT-expr"); - sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); - break; - } - case TK_IN: { - sqlite3TreeViewLine(pView, "IN"); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); - }else{ - sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); - } - break; - } -#endif /* SQLITE_OMIT_SUBQUERY */ - - /* - ** x BETWEEN y AND z - ** - ** This is equivalent to - ** - ** x>=y AND x<=z - ** - ** X is stored in pExpr->pLeft. - ** Y is stored in pExpr->pList->a[0].pExpr. - ** Z is stored in pExpr->pList->a[1].pExpr. - */ - case TK_BETWEEN: { - Expr *pX = pExpr->pLeft; - Expr *pY = pExpr->x.pList->a[0].pExpr; - Expr *pZ = pExpr->x.pList->a[1].pExpr; - sqlite3TreeViewLine(pView, "BETWEEN"); - sqlite3TreeViewExpr(pView, pX, 1); - sqlite3TreeViewExpr(pView, pY, 1); - sqlite3TreeViewExpr(pView, pZ, 0); - break; - } - case TK_TRIGGER: { - /* If the opcode is TK_TRIGGER, then the expression is a reference - ** to a column in the new.* or old.* pseudo-tables available to - ** trigger programs. In this case Expr.iTable is set to 1 for the - ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn - ** is set to the column of the pseudo-table to read, or to -1 to - ** read the rowid field. - */ - sqlite3TreeViewLine(pView, "%s(%d)", - pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); - break; - } - case TK_CASE: { - sqlite3TreeViewLine(pView, "CASE"); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); - sqlite3TreeViewExprList(pView, pExpr->x.pList, 0, 0); - break; - } -#ifndef SQLITE_OMIT_TRIGGER - case TK_RAISE: { - const char *zType = "unk"; - switch( pExpr->affinity ){ - case OE_Rollback: zType = "rollback"; break; - case OE_Abort: zType = "abort"; break; - case OE_Fail: zType = "fail"; break; - case OE_Ignore: zType = "ignore"; break; - } - sqlite3TreeViewLine(pView, "RAISE %s(%Q)", zType, pExpr->u.zToken); - break; - } -#endif - default: { - sqlite3TreeViewLine(pView, "op=%d", pExpr->op); - break; - } - } - if( zBinOp ){ - sqlite3TreeViewLine(pView, "%s", zBinOp); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); - sqlite3TreeViewExpr(pView, pExpr->pRight, 0); - }else if( zUniOp ){ - sqlite3TreeViewLine(pView, "%s", zUniOp); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); - } - sqlite3TreeViewPop(pView); -} -#endif /* SQLITE_DEBUG */ - -#ifdef SQLITE_DEBUG -/* -** Generate a human-readable explanation of an expression list. -*/ -SQLITE_PRIVATE void sqlite3TreeViewExprList( - TreeView *pView, - const ExprList *pList, - u8 moreToFollow, - const char *zLabel -){ - int i; - pView = sqlite3TreeViewPush(pView, moreToFollow); - if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; - if( pList==0 ){ - sqlite3TreeViewLine(pView, "%s (empty)", zLabel); - }else{ - sqlite3TreeViewLine(pView, "%s", zLabel); - for(i=0; i<pList->nExpr; i++){ - sqlite3TreeViewExpr(pView, pList->a[i].pExpr, i<pList->nExpr-1); -#if 0 - if( pList->a[i].zName ){ - sqlite3ExplainPrintf(pOut, " AS %s", pList->a[i].zName); - } - if( pList->a[i].bSpanIsTab ){ - sqlite3ExplainPrintf(pOut, " (%s)", pList->a[i].zSpan); - } -#endif - } - } - sqlite3TreeViewPop(pView); -} -#endif /* SQLITE_DEBUG */ - /* ** Generate code that pushes the value of every element of the given ** expression list into a sequence of registers beginning at target. ** -** Return the number of elements evaluated. +** Return the number of elements evaluated. The number returned will +** usually be pList->nExpr but might be reduced if SQLITE_ECEL_OMITREF +** is defined. ** ** The SQLITE_ECEL_DUP flag prevents the arguments from being ** filled using OP_SCopy. OP_Copy must be used instead. ** ** The SQLITE_ECEL_FACTOR argument allows constant arguments to be ** factored out into initialization code. +** +** The SQLITE_ECEL_REF flag means that expressions in the list with +** ExprList.a[].u.x.iOrderByCol>0 have already been evaluated and stored +** in registers at srcReg, and so the value can be copied from there. +** If SQLITE_ECEL_OMITREF is also set, then the values with u.x.iOrderByCol>0 +** are simply omitted rather than being copied from srcReg. */ SQLITE_PRIVATE int sqlite3ExprCodeExprList( Parse *pParse, /* Parsing context */ ExprList *pList, /* The expression list to be coded */ int target, /* Where to write results */ + int srcReg, /* Source registers if SQLITE_ECEL_REF */ u8 flags /* SQLITE_ECEL_* flags */ ){ struct ExprList_item *pItem; - int i, n; + int i, j, n; u8 copyOp = (flags & SQLITE_ECEL_DUP) ? OP_Copy : OP_SCopy; + Vdbe *v = pParse->pVdbe; assert( pList!=0 ); assert( target>0 ); assert( pParse->pVdbe!=0 ); /* Never gets this far otherwise */ @@ -85345,13 +99113,25 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( if( !ConstFactorOk(pParse) ) flags &= ~SQLITE_ECEL_FACTOR; for(pItem=pList->a, i=0; i<n; i++, pItem++){ Expr *pExpr = pItem->pExpr; - if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstant(pExpr) ){ - sqlite3ExprCodeAtInit(pParse, pExpr, target+i, 0); +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( pItem->bSorterRef ){ + i--; + n--; + }else +#endif + if( (flags & SQLITE_ECEL_REF)!=0 && (j = pItem->u.x.iOrderByCol)>0 ){ + if( flags & SQLITE_ECEL_OMITREF ){ + i--; + n--; + }else{ + sqlite3VdbeAddOp2(v, copyOp, j+srcReg-1, target+i); + } + }else if( (flags & SQLITE_ECEL_FACTOR)!=0 && sqlite3ExprIsConstant(pExpr) ){ + sqlite3ExprCodeAtInit(pParse, pExpr, target+i); }else{ int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i); if( inReg!=target+i ){ VdbeOp *pOp; - Vdbe *v = pParse->pVdbe; if( copyOp==OP_Copy && (pOp=sqlite3VdbeGetOp(v, -1))->opcode==OP_Copy && pOp->p1+pOp->p3+1==inReg @@ -85378,20 +99158,33 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( ** ** Code it as such, taking care to do the common subexpression ** elimination of x. +** +** The xJumpIf parameter determines details: +** +** NULL: Store the boolean result in reg[dest] +** sqlite3ExprIfTrue: Jump to dest if true +** sqlite3ExprIfFalse: Jump to dest if false +** +** The jumpIfNull parameter is ignored if xJumpIf is NULL. */ static void exprCodeBetween( Parse *pParse, /* Parsing and code generating context */ Expr *pExpr, /* The BETWEEN expression */ - int dest, /* Jump here if the jump is taken */ - int jumpIfTrue, /* Take the jump if the BETWEEN is true */ + int dest, /* Jump destination or storage location */ + void (*xJump)(Parse*,Expr*,int,int), /* Action to take */ int jumpIfNull /* Take the jump if the BETWEEN is NULL */ ){ - Expr exprAnd; /* The AND operator in x>=y AND x<=z */ + Expr exprAnd; /* The AND operator in x>=y AND x<=z */ Expr compLeft; /* The x>=y term */ Expr compRight; /* The x<=z term */ Expr exprX; /* The x subexpression */ int regFree1 = 0; /* Temporary use register */ + + memset(&compLeft, 0, sizeof(Expr)); + memset(&compRight, 0, sizeof(Expr)); + memset(&exprAnd, 0, sizeof(Expr)); + assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); exprX = *pExpr->pLeft; exprAnd.op = TK_AND; @@ -85403,23 +99196,30 @@ static void exprCodeBetween( compRight.op = TK_LE; compRight.pLeft = &exprX; compRight.pRight = pExpr->x.pList->a[1].pExpr; - exprToRegister(&exprX, sqlite3ExprCodeTemp(pParse, &exprX, ®Free1)); - if( jumpIfTrue ){ - sqlite3ExprIfTrue(pParse, &exprAnd, dest, jumpIfNull); + exprToRegister(&exprX, exprCodeVector(pParse, &exprX, ®Free1)); + if( xJump ){ + xJump(pParse, &exprAnd, dest, jumpIfNull); }else{ - sqlite3ExprIfFalse(pParse, &exprAnd, dest, jumpIfNull); + /* Mark the expression is being from the ON or USING clause of a join + ** so that the sqlite3ExprCodeTarget() routine will not attempt to move + ** it into the Parse.pConstExpr list. We should use a new bit for this, + ** for clarity, but we are out of bits in the Expr.flags field so we + ** have to reuse the EP_FromJoin bit. Bummer. */ + exprX.flags |= EP_FromJoin; + sqlite3ExprCodeTarget(pParse, &exprAnd, dest); } sqlite3ReleaseTempReg(pParse, regFree1); /* Ensure adequate test coverage */ - testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1==0 ); - testcase( jumpIfTrue==0 && jumpIfNull==0 && regFree1!=0 ); - testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1==0 ); - testcase( jumpIfTrue==0 && jumpIfNull!=0 && regFree1!=0 ); - testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1==0 ); - testcase( jumpIfTrue!=0 && jumpIfNull==0 && regFree1!=0 ); - testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1==0 ); - testcase( jumpIfTrue!=0 && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfTrue && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull==0 && regFree1!=0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1==0 ); + testcase( xJump==sqlite3ExprIfFalse && jumpIfNull!=0 && regFree1!=0 ); + testcase( xJump==0 ); } /* @@ -85471,12 +99271,37 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, jumpIfNull); break; } + case TK_TRUTH: { + int isNot; /* IS NOT TRUE or IS NOT FALSE */ + int isTrue; /* IS TRUE or IS NOT TRUE */ + testcase( jumpIfNull==0 ); + isNot = pExpr->op2==TK_ISNOT; + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + testcase( isTrue && isNot ); + testcase( !isTrue && isNot ); + if( isTrue ^ isNot ){ + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, + isNot ? SQLITE_JUMPIFNULL : 0); + }else{ + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, + isNot ? SQLITE_JUMPIFNULL : 0); + } + break; + } + case TK_IS: + case TK_ISNOT: + testcase( op==TK_IS ); + testcase( op==TK_ISNOT ); + op = (op==TK_IS) ? TK_EQ : TK_NE; + jumpIfNull = SQLITE_NULLEQ; + /* Fall thru */ case TK_LT: case TK_LE: case TK_GT: case TK_GE: case TK_NE: case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; testcase( jumpIfNull==0 ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); @@ -85486,23 +99311,12 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); - assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); - assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); - testcase( regFree1==0 ); - testcase( regFree2==0 ); - break; - } - case TK_IS: - case TK_ISNOT: { - testcase( op==TK_IS ); - testcase( op==TK_ISNOT ); - r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); - op = (op==TK_IS) ? TK_EQ : TK_NE; - codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, dest, SQLITE_NULLEQ); - VdbeCoverageIf(v, op==TK_EQ); - VdbeCoverageIf(v, op==TK_NE); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); testcase( regFree1==0 ); testcase( regFree2==0 ); break; @@ -85520,7 +99334,7 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int } case TK_BETWEEN: { testcase( jumpIfNull==0 ); - exprCodeBetween(pParse, pExpr, dest, 1, jumpIfNull); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfTrue, jumpIfNull); break; } #ifndef SQLITE_OMIT_SUBQUERY @@ -85528,14 +99342,15 @@ SQLITE_PRIVATE void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int int destIfFalse = sqlite3VdbeMakeLabel(v); int destIfNull = jumpIfNull ? dest : destIfFalse; sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); - sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); + sqlite3VdbeGoto(v, dest); sqlite3VdbeResolveLabel(v, destIfFalse); break; } #endif default: { + default_expr: if( exprAlwaysTrue(pExpr) ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); + sqlite3VdbeGoto(v, dest); }else if( exprAlwaysFalse(pExpr) ){ /* No-op */ }else{ @@ -85627,12 +99442,40 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, jumpIfNull); break; } + case TK_TRUTH: { + int isNot; /* IS NOT TRUE or IS NOT FALSE */ + int isTrue; /* IS TRUE or IS NOT TRUE */ + testcase( jumpIfNull==0 ); + isNot = pExpr->op2==TK_ISNOT; + isTrue = sqlite3ExprTruthValue(pExpr->pRight); + testcase( isTrue && isNot ); + testcase( !isTrue && isNot ); + if( isTrue ^ isNot ){ + /* IS TRUE and IS NOT FALSE */ + sqlite3ExprIfFalse(pParse, pExpr->pLeft, dest, + isNot ? 0 : SQLITE_JUMPIFNULL); + + }else{ + /* IS FALSE and IS NOT TRUE */ + sqlite3ExprIfTrue(pParse, pExpr->pLeft, dest, + isNot ? 0 : SQLITE_JUMPIFNULL); + } + break; + } + case TK_IS: + case TK_ISNOT: + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_ISNOT ); + op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; + jumpIfNull = SQLITE_NULLEQ; + /* Fall thru */ case TK_LT: case TK_LE: case TK_GT: case TK_GE: case TK_NE: case TK_EQ: { + if( sqlite3ExprIsVector(pExpr->pLeft) ) goto default_expr; testcase( jumpIfNull==0 ); r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); @@ -85642,23 +99485,12 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); assert(TK_GE==OP_Ge); testcase(op==OP_Ge); VdbeCoverageIf(v,op==OP_Ge); - assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); VdbeCoverageIf(v,op==OP_Eq); - assert(TK_NE==OP_Ne); testcase(op==OP_Ne); VdbeCoverageIf(v,op==OP_Ne); - testcase( regFree1==0 ); - testcase( regFree2==0 ); - break; - } - case TK_IS: - case TK_ISNOT: { - testcase( pExpr->op==TK_IS ); - testcase( pExpr->op==TK_ISNOT ); - r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); - r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); - op = (pExpr->op==TK_IS) ? TK_NE : TK_EQ; - codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, dest, SQLITE_NULLEQ); - VdbeCoverageIf(v, op==TK_EQ); - VdbeCoverageIf(v, op==TK_NE); + assert(TK_EQ==OP_Eq); testcase(op==OP_Eq); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Eq && jumpIfNull==SQLITE_NULLEQ); + assert(TK_NE==OP_Ne); testcase(op==OP_Ne); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull!=SQLITE_NULLEQ); + VdbeCoverageIf(v, op==OP_Ne && jumpIfNull==SQLITE_NULLEQ); testcase( regFree1==0 ); testcase( regFree2==0 ); break; @@ -85674,7 +99506,7 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int } case TK_BETWEEN: { testcase( jumpIfNull==0 ); - exprCodeBetween(pParse, pExpr, dest, 0, jumpIfNull); + exprCodeBetween(pParse, pExpr, dest, sqlite3ExprIfFalse, jumpIfNull); break; } #ifndef SQLITE_OMIT_SUBQUERY @@ -85690,8 +99522,9 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int } #endif default: { + default_expr: if( exprAlwaysFalse(pExpr) ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, dest); + sqlite3VdbeGoto(v, dest); }else if( exprAlwaysTrue(pExpr) ){ /* no-op */ }else{ @@ -85708,6 +99541,56 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int sqlite3ReleaseTempReg(pParse, regFree2); } +/* +** Like sqlite3ExprIfFalse() except that a copy is made of pExpr before +** code generation, and that copy is deleted after code generation. This +** ensures that the original pExpr is unchanged. +*/ +SQLITE_PRIVATE void sqlite3ExprIfFalseDup(Parse *pParse, Expr *pExpr, int dest,int jumpIfNull){ + sqlite3 *db = pParse->db; + Expr *pCopy = sqlite3ExprDup(db, pExpr, 0); + if( db->mallocFailed==0 ){ + sqlite3ExprIfFalse(pParse, pCopy, dest, jumpIfNull); + } + sqlite3ExprDelete(db, pCopy); +} + +/* +** Expression pVar is guaranteed to be an SQL variable. pExpr may be any +** type of expression. +** +** If pExpr is a simple SQL value - an integer, real, string, blob +** or NULL value - then the VDBE currently being prepared is configured +** to re-prepare each time a new value is bound to variable pVar. +** +** Additionally, if pExpr is a simple SQL value and the value is the +** same as that currently bound to variable pVar, non-zero is returned. +** Otherwise, if the values are not the same or if pExpr is not a simple +** SQL value, zero is returned. +*/ +static int exprCompareVariable(Parse *pParse, Expr *pVar, Expr *pExpr){ + int res = 0; + int iVar; + sqlite3_value *pL, *pR = 0; + + sqlite3ValueFromExpr(pParse->db, pExpr, SQLITE_UTF8, SQLITE_AFF_BLOB, &pR); + if( pR ){ + iVar = pVar->iColumn; + sqlite3VdbeSetVarmask(pParse->pVdbe, iVar); + pL = sqlite3VdbeGetBoundValue(pParse->pReprepare, iVar, SQLITE_AFF_BLOB); + if( pL ){ + if( sqlite3_value_type(pL)==SQLITE_TEXT ){ + sqlite3_value_text(pL); /* Make sure the encoding is UTF-8 */ + } + res = 0==sqlite3MemCompare(pL, pR, 0); + } + sqlite3ValueFree(pR); + sqlite3ValueFree(pL); + } + + return res; +} + /* ** Do a deep comparison of two expression trees. Return 0 if the two ** expressions are completely identical. Return 1 if they differ only @@ -85729,12 +99612,22 @@ SQLITE_PRIVATE void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int ** this routine is used, it does not hurt to get an extra 2 - that ** just might result in some slightly slower code. But returning ** an incorrect 0 or 1 could lead to a malfunction. +** +** If pParse is not NULL then TK_VARIABLE terms in pA with bindings in +** pParse->pReprepare can be matched against literals in pB. The +** pParse->pVdbe->expmask bitmask is updated for each variable referenced. +** If pParse is NULL (the normal case) then any TK_VARIABLE term in +** Argument pParse should normally be NULL. If it is not NULL and pA or +** pB causes a return value of 2. */ -SQLITE_PRIVATE int sqlite3ExprCompare(Expr *pA, Expr *pB, int iTab){ +SQLITE_PRIVATE int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ u32 combinedFlags; if( pA==0 || pB==0 ){ return pB==pA ? 0 : 2; } + if( pParse && pA->op==TK_VARIABLE && exprCompareVariable(pParse, pA, pB) ){ + return 0; + } combinedFlags = pA->flags | pB->flags; if( combinedFlags & EP_IntValue ){ if( (pA->flags&pB->flags&EP_IntValue)!=0 && pA->u.iValue==pB->u.iValue ){ @@ -85743,26 +99636,31 @@ SQLITE_PRIVATE int sqlite3ExprCompare(Expr *pA, Expr *pB, int iTab){ return 2; } if( pA->op!=pB->op ){ - if( pA->op==TK_COLLATE && sqlite3ExprCompare(pA->pLeft, pB, iTab)<2 ){ + if( pA->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA->pLeft,pB,iTab)<2 ){ return 1; } - if( pB->op==TK_COLLATE && sqlite3ExprCompare(pA, pB->pLeft, iTab)<2 ){ + if( pB->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA,pB->pLeft,iTab)<2 ){ return 1; } return 2; } - if( pA->op!=TK_COLUMN && ALWAYS(pA->op!=TK_AGG_COLUMN) && pA->u.zToken ){ - if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ - return pA->op==TK_COLLATE ? 1 : 2; + if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ + if( pA->op==TK_FUNCTION ){ + if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; + }else if( pA->op==TK_COLLATE ){ + if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; + }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + return 2; } } if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ if( combinedFlags & EP_xIsSelect ) return 2; - if( sqlite3ExprCompare(pA->pLeft, pB->pLeft, iTab) ) return 2; - if( sqlite3ExprCompare(pA->pRight, pB->pRight, iTab) ) return 2; + if( sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; + if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; - if( ALWAYS((combinedFlags & EP_Reduced)==0) ){ + assert( (combinedFlags & EP_Reduced)==0 ); + if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE ){ if( pA->iColumn!=pB->iColumn ) return 2; if( pA->iTable!=pB->iTable && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; @@ -85795,11 +99693,22 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ Expr *pExprA = pA->a[i].pExpr; Expr *pExprB = pB->a[i].pExpr; if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1; - if( sqlite3ExprCompare(pExprA, pExprB, iTab) ) return 1; + if( sqlite3ExprCompare(0, pExprA, pExprB, iTab) ) return 1; } return 0; } +/* +** Like sqlite3ExprCompare() except COLLATE operators at the top-level +** are ignored. +*/ +SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ + return sqlite3ExprCompare(0, + sqlite3ExprSkipCollate(pA), + sqlite3ExprSkipCollate(pB), + iTab); +} + /* ** Return true if we can prove the pE2 will always be true if pE1 is ** true. Return false if we cannot complete the proof or if pE2 might @@ -85816,29 +99725,187 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ ** When comparing TK_COLUMN nodes between pE1 and pE2, if pE2 has ** Expr.iTable<0 then assume a table number given by iTab. ** +** If pParse is not NULL, then the values of bound variables in pE1 are +** compared against literal values in pE2 and pParse->pVdbe->expmask is +** modified to record which bound variables are referenced. If pParse +** is NULL, then false will be returned if pE1 contains any bound variables. +** ** When in doubt, return false. Returning true might give a performance ** improvement. Returning false might cause a performance reduction, but ** it will always give the correct answer and is hence always safe. */ -SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Expr *pE1, Expr *pE2, int iTab){ - if( sqlite3ExprCompare(pE1, pE2, iTab)==0 ){ +SQLITE_PRIVATE int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, int iTab){ + if( sqlite3ExprCompare(pParse, pE1, pE2, iTab)==0 ){ return 1; } if( pE2->op==TK_OR - && (sqlite3ExprImpliesExpr(pE1, pE2->pLeft, iTab) - || sqlite3ExprImpliesExpr(pE1, pE2->pRight, iTab) ) + && (sqlite3ExprImpliesExpr(pParse, pE1, pE2->pLeft, iTab) + || sqlite3ExprImpliesExpr(pParse, pE1, pE2->pRight, iTab) ) ){ return 1; } - if( pE2->op==TK_NOTNULL - && sqlite3ExprCompare(pE1->pLeft, pE2->pLeft, iTab)==0 - && (pE1->op!=TK_ISNULL && pE1->op!=TK_IS) - ){ - return 1; + if( pE2->op==TK_NOTNULL && pE1->op!=TK_ISNULL && pE1->op!=TK_IS ){ + Expr *pX = sqlite3ExprSkipCollate(pE1->pLeft); + testcase( pX!=pE1->pLeft ); + if( sqlite3ExprCompare(pParse, pX, pE2->pLeft, iTab)==0 ) return 1; } return 0; } +/* +** This is the Expr node callback for sqlite3ExprImpliesNotNullRow(). +** If the expression node requires that the table at pWalker->iCur +** have a non-NULL column, then set pWalker->eCode to 1 and abort. +*/ +static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ + /* This routine is only called for WHERE clause expressions and so it + ** cannot have any TK_AGG_COLUMN entries because those are only found + ** in HAVING clauses. We can get a TK_AGG_FUNCTION in a WHERE clause, + ** but that is an illegal construct and the query will be rejected at + ** a later stage of processing, so the TK_AGG_FUNCTION case does not + ** need to be considered here. */ + assert( pExpr->op!=TK_AGG_COLUMN ); + testcase( pExpr->op==TK_AGG_FUNCTION ); + + if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune; + switch( pExpr->op ){ + case TK_ISNOT: + case TK_NOT: + case TK_ISNULL: + case TK_IS: + case TK_OR: + case TK_CASE: + case TK_IN: + case TK_FUNCTION: + testcase( pExpr->op==TK_ISNOT ); + testcase( pExpr->op==TK_NOT ); + testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_IS ); + testcase( pExpr->op==TK_OR ); + testcase( pExpr->op==TK_CASE ); + testcase( pExpr->op==TK_IN ); + testcase( pExpr->op==TK_FUNCTION ); + return WRC_Prune; + case TK_COLUMN: + if( pWalker->u.iCur==pExpr->iTable ){ + pWalker->eCode = 1; + return WRC_Abort; + } + return WRC_Prune; + + /* Virtual tables are allowed to use constraints like x=NULL. So + ** a term of the form x=y does not prove that y is not null if x + ** is the column of a virtual table */ + case TK_EQ: + case TK_NE: + case TK_LT: + case TK_LE: + case TK_GT: + case TK_GE: + testcase( pExpr->op==TK_EQ ); + testcase( pExpr->op==TK_NE ); + testcase( pExpr->op==TK_LT ); + testcase( pExpr->op==TK_LE ); + testcase( pExpr->op==TK_GT ); + testcase( pExpr->op==TK_GE ); + if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->pTab)) + || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->pTab)) + ){ + return WRC_Prune; + } + default: + return WRC_Continue; + } +} + +/* +** Return true (non-zero) if expression p can only be true if at least +** one column of table iTab is non-null. In other words, return true +** if expression p will always be NULL or false if every column of iTab +** is NULL. +** +** False negatives are acceptable. In other words, it is ok to return +** zero even if expression p will never be true of every column of iTab +** is NULL. A false negative is merely a missed optimization opportunity. +** +** False positives are not allowed, however. A false positive may result +** in an incorrect answer. +** +** Terms of p that are marked with EP_FromJoin (and hence that come from +** the ON or USING clauses of LEFT JOINS) are excluded from the analysis. +** +** This routine is used to check if a LEFT JOIN can be converted into +** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE +** clause requires that some column of the right table of the LEFT JOIN +** be non-NULL, then the LEFT JOIN can be safely converted into an +** ordinary join. +*/ +SQLITE_PRIVATE int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ + Walker w; + w.xExprCallback = impliesNotNullRow; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + w.eCode = 0; + w.u.iCur = iTab; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + +/* +** An instance of the following structure is used by the tree walker +** to determine if an expression can be evaluated by reference to the +** index only, without having to do a search for the corresponding +** table entry. The IdxCover.pIdx field is the index. IdxCover.iCur +** is the cursor for the table. +*/ +struct IdxCover { + Index *pIdx; /* The index to be tested for coverage */ + int iCur; /* Cursor number for the table corresponding to the index */ +}; + +/* +** Check to see if there are references to columns in table +** pWalker->u.pIdxCover->iCur can be satisfied using the index +** pWalker->u.pIdxCover->pIdx. +*/ +static int exprIdxCover(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pWalker->u.pIdxCover->iCur + && sqlite3ColumnOfIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + return WRC_Abort; + } + return WRC_Continue; +} + +/* +** Determine if an index pIdx on table with cursor iCur contains will +** the expression pExpr. Return true if the index does cover the +** expression and false if the pExpr expression references table columns +** that are not found in the index pIdx. +** +** An index covering an expression means that the expression can be +** evaluated using only the index and without having to lookup the +** corresponding table entry. +*/ +SQLITE_PRIVATE int sqlite3ExprCoveredByIndex( + Expr *pExpr, /* The index to be tested */ + int iCur, /* The cursor number for the corresponding table */ + Index *pIdx /* The index that might be used for coverage */ +){ + Walker w; + struct IdxCover xcov; + memset(&w, 0, sizeof(w)); + xcov.iCur = iCur; + xcov.pIdx = pIdx; + w.xExprCallback = exprIdxCover; + w.u.pIdxCover = &xcov; + sqlite3WalkExpr(&w, pExpr); + return !w.eCode; +} + + /* ** An instance of the following structure is used by the tree walker ** to count references to table columns in the arguments of an @@ -85887,8 +99954,8 @@ SQLITE_PRIVATE int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ Walker w; struct SrcCount cnt; assert( pExpr->op==TK_AGG_FUNCTION ); - memset(&w, 0, sizeof(w)); w.xExprCallback = exprSrcCount; + w.xSelectCallback = 0; w.u.pSrcCount = &cnt; cnt.pSrc = pSrcList; cnt.nThis = 0; @@ -85939,8 +100006,9 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ NameContext *pNC = pWalker->u.pNC; Parse *pParse = pNC->pParse; SrcList *pSrcList = pNC->pSrcList; - AggInfo *pAggInfo = pNC->pAggInfo; + AggInfo *pAggInfo = pNC->uNC.pAggInfo; + assert( pNC->ncFlags & NC_UAggInfo ); switch( pExpr->op ){ case TK_AGG_COLUMN: case TK_COLUMN: { @@ -86020,7 +100088,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ struct AggInfo_func *pItem = pAggInfo->aFunc; for(i=0; i<pAggInfo->nFunc; i++, pItem++){ - if( sqlite3ExprCompare(pItem->pExpr, pExpr, -1)==0 ){ + if( sqlite3ExprCompare(0, pItem->pExpr, pExpr, -1)==0 ){ break; } } @@ -86036,7 +100104,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ pItem->iMem = ++pParse->nMem; assert( !ExprHasProperty(pExpr, EP_IntValue) ); pItem->pFunc = sqlite3FindFunction(pParse->db, - pExpr->u.zToken, sqlite3Strlen30(pExpr->u.zToken), + pExpr->u.zToken, pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0); if( pExpr->flags & EP_Distinct ){ pItem->iDistinct = pParse->nTab++; @@ -86060,10 +100128,14 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ return WRC_Continue; } static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){ - UNUSED_PARAMETER(pWalker); UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth++; return WRC_Continue; } +static void analyzeAggregatesInSelectEnd(Walker *pWalker, Select *pSelect){ + UNUSED_PARAMETER(pSelect); + pWalker->walkerDepth--; +} /* ** Analyze the pExpr expression looking for aggregate functions and @@ -86076,9 +100148,10 @@ static int analyzeAggregatesInSelect(Walker *pWalker, Select *pSelect){ */ SQLITE_PRIVATE void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ Walker w; - memset(&w, 0, sizeof(w)); w.xExprCallback = analyzeAggregate; w.xSelectCallback = analyzeAggregatesInSelect; + w.xSelectCallback2 = analyzeAggregatesInSelectEnd; + w.walkerDepth = 0; w.u.pNC = pNC; assert( pNC->pSrcList!=0 ); sqlite3WalkExpr(&w, pExpr); @@ -86122,7 +100195,7 @@ SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ if( iReg && pParse->nTempReg<ArraySize(pParse->aTempReg) ){ int i; struct yColCache *p; - for(i=0, p=pParse->aColCache; i<SQLITE_N_COLCACHE; i++, p++){ + for(i=0, p=pParse->aColCache; i<pParse->nColCache; i++, p++){ if( p->iReg==iReg ){ p->tempReg = 1; return; @@ -86133,10 +100206,11 @@ SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ } /* -** Allocate or deallocate a block of nReg consecutive registers +** Allocate or deallocate a block of nReg consecutive registers. */ SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ int i, n; + if( nReg==1 ) return sqlite3GetTempReg(pParse); i = pParse->iRangeReg; n = pParse->nRangeReg; if( nReg<=n ){ @@ -86150,6 +100224,10 @@ SQLITE_PRIVATE int sqlite3GetTempRange(Parse *pParse, int nReg){ return i; } SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, iReg); + return; + } sqlite3ExprCacheRemove(pParse, iReg, nReg); if( nReg>pParse->nRangeReg ){ pParse->nRangeReg = nReg; @@ -86165,6 +100243,29 @@ SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ pParse->nRangeReg = 0; } +/* +** Validate that no temporary register falls within the range of +** iFirst..iLast, inclusive. This routine is only call from within assert() +** statements. +*/ +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3NoTempsInRange(Parse *pParse, int iFirst, int iLast){ + int i; + if( pParse->nRangeReg>0 + && pParse->iRangeReg+pParse->nRangeReg > iFirst + && pParse->iRangeReg <= iLast + ){ + return 0; + } + for(i=0; i<pParse->nTempReg; i++){ + if( pParse->aTempReg[i]>=iFirst && pParse->aTempReg[i]<=iLast ){ + return 0; + } + } + return 1; +} +#endif /* SQLITE_DEBUG */ + /************** End of expr.c ************************************************/ /************** Begin file alter.c *******************************************/ /* @@ -86181,6 +100282,7 @@ SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ ** This file contains C code routines that used to generate VDBE code ** that implements the ALTER TABLE command. */ +/* #include "sqliteInt.h" */ /* ** The code in this file only exists if we are not omitting the @@ -86294,6 +100396,7 @@ static void renameParentFunc( n = sqlite3GetToken(z, &token); }while( token==TK_SPACE ); + if( token==TK_ILLEGAL ) break; zParent = sqlite3DbStrNDup(db, (const char *)z, n); if( zParent==0 ) break; sqlite3Dequote(zParent); @@ -86396,7 +100499,7 @@ static void renameTriggerFunc( ** Register built-in functions used to help implement ALTER TABLE */ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ - static SQLITE_WSD FuncDef aAlterTableFuncs[] = { + static FuncDef aAlterTableFuncs[] = { FUNCTION(sqlite_rename_table, 2, 0, 0, renameTableFunc), #ifndef SQLITE_OMIT_TRIGGER FUNCTION(sqlite_rename_trigger, 2, 0, 0, renameTriggerFunc), @@ -86405,13 +100508,7 @@ SQLITE_PRIVATE void sqlite3AlterFunctions(void){ FUNCTION(sqlite_rename_parent, 3, 0, 0, renameParentFunc), #endif }; - int i; - FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); - FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aAlterTableFuncs); - - for(i=0; i<ArraySize(aAlterTableFuncs); i++){ - sqlite3FuncDefInsert(pHash, &aFunc[i]); - } + sqlite3InsertBuiltinFuncs(aAlterTableFuncs, ArraySize(aAlterTableFuncs)); } /* @@ -86548,7 +100645,7 @@ static void reloadTableSchema(Parse *pParse, Table *pTab, const char *zName){ ** Or, if zName is not a system table, zero is returned. */ static int isSystemTable(Parse *pParse, const char *zName){ - if( sqlite3Strlen30(zName)>6 && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ + if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ sqlite3ErrorMsg(pParse, "table %s may not be altered", zName); return 1; } @@ -86576,9 +100673,9 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( char *zWhere = 0; /* Where clause to locate temp triggers */ #endif VTable *pVTab = 0; /* Non-zero if this is a v-tab with an xRename() */ - int savedDbFlags; /* Saved value of db->flags */ + u32 savedDbFlags; /* Saved value of db->mDbFlags */ - savedDbFlags = db->flags; + savedDbFlags = db->mDbFlags; if( NEVER(db->mallocFailed) ) goto exit_rename_table; assert( pSrc->nSrc==1 ); assert( sqlite3BtreeHoldsAllMutexes(pParse->db) ); @@ -86586,8 +100683,8 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( pTab = sqlite3LocateTableItem(pParse, 0, &pSrc->a[0]); if( !pTab ) goto exit_rename_table; iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - zDb = db->aDb[iDb].zName; - db->flags |= SQLITE_PreferBuiltin; + zDb = db->aDb[iDb].zDbSName; + db->mDbFlags |= DBFLAG_PreferBuiltin; /* Get a NULL terminated version of the new table name. */ zName = sqlite3NameFromToken(db, pName); @@ -86658,7 +100755,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( #ifndef SQLITE_OMIT_VIRTUALTABLE if( pVTab ){ int i = ++pParse->nMem; - sqlite3VdbeAddOp4(v, OP_String8, 0, i, 0, zName, 0); + sqlite3VdbeLoadString(v, i, zName); sqlite3VdbeAddOp4(v, OP_VRename, i, 0, 0,(const char*)pVTab, P4_VTAB); sqlite3MayAbort(pParse); } @@ -86677,7 +100774,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = sqlite_rename_parent(sql, %Q, %Q) " - "WHERE %s;", zDb, SCHEMA_TABLE(iDb), zTabName, zName, zWhere); + "WHERE %s;", zDb, MASTER_NAME, zTabName, zName, zWhere); sqlite3DbFree(db, zWhere); } } @@ -86701,7 +100798,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( "ELSE name END " "WHERE tbl_name=%Q COLLATE nocase AND " "(type='table' OR type='index' OR type='trigger');", - zDb, SCHEMA_TABLE(iDb), zName, zName, zName, + zDb, MASTER_NAME, zName, zName, zName, #ifndef SQLITE_OMIT_TRIGGER zName, #endif @@ -86752,34 +100849,7 @@ SQLITE_PRIVATE void sqlite3AlterRenameTable( exit_rename_table: sqlite3SrcListDelete(db, pSrc); sqlite3DbFree(db, zName); - db->flags = savedDbFlags; -} - - -/* -** Generate code to make sure the file format number is at least minFormat. -** The generated code will increase the file format number if necessary. -*/ -SQLITE_PRIVATE void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){ - Vdbe *v; - v = sqlite3GetVdbe(pParse); - /* The VDBE should have been allocated before this routine is called. - ** If that allocation failed, we would have quit before reaching this - ** point */ - if( ALWAYS(v) ){ - int r1 = sqlite3GetTempReg(pParse); - int r2 = sqlite3GetTempReg(pParse); - int j1; - sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); - sqlite3VdbeUsesBtree(v, iDb); - sqlite3VdbeAddOp2(v, OP_Integer, minFormat, r2); - j1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1); - sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, r2); - sqlite3VdbeJumpHere(v, j1); - sqlite3ReleaseTempReg(pParse, r1); - sqlite3ReleaseTempReg(pParse, r2); - } + db->mDbFlags = savedDbFlags; } /* @@ -86800,15 +100870,18 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ Column *pCol; /* The new column */ Expr *pDflt; /* Default value for the new column */ sqlite3 *db; /* The database connection; */ + Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */ + int r1; /* Temporary registers */ db = pParse->db; if( pParse->nErr || db->mallocFailed ) return; + assert( v!=0 ); pNew = pParse->pNewTable; assert( pNew ); assert( sqlite3BtreeHoldsAllMutexes(db) ); iDb = sqlite3SchemaToIndex(db, pNew->pSchema); - zDb = db->aDb[iDb].zName; + zDb = db->aDb[iDb].zDbSName; zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ pCol = &pNew->aCol[pNew->nCol-1]; pDflt = pCol->pDflt; @@ -86826,7 +100899,8 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ ** literal NULL, then set pDflt to 0. This simplifies checking ** for an SQL NULL default below. */ - if( pDflt && pDflt->op==TK_NULL ){ + assert( pDflt==0 || pDflt->op==TK_SPAN ); + if( pDflt && pDflt->pLeft->op==TK_NULL ){ pDflt = 0; } @@ -86858,8 +100932,11 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ */ if( pDflt ){ sqlite3_value *pVal = 0; - if( sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_NONE, &pVal) ){ - db->mallocFailed = 1; + int rc; + rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc!=SQLITE_OK ){ + assert( db->mallocFailed == 1 ); return; } if( !pVal ){ @@ -86873,27 +100950,34 @@ SQLITE_PRIVATE void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); if( zCol ){ char *zEnd = &zCol[pColDef->n-1]; - int savedDbFlags = db->flags; + u32 savedDbFlags = db->mDbFlags; while( zEnd>zCol && (*zEnd==';' || sqlite3Isspace(*zEnd)) ){ *zEnd-- = '\0'; } - db->flags |= SQLITE_PreferBuiltin; + db->mDbFlags |= DBFLAG_PreferBuiltin; sqlite3NestedParse(pParse, "UPDATE \"%w\".%s SET " "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " "WHERE type = 'table' AND name = %Q", - zDb, SCHEMA_TABLE(iDb), pNew->addColOffset, zCol, pNew->addColOffset+1, + zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, zTab ); sqlite3DbFree(db, zCol); - db->flags = savedDbFlags; + db->mDbFlags = savedDbFlags; } - /* If the default value of the new column is NULL, then set the file - ** format to 2. If the default value of the new column is not NULL, - ** the file format becomes 3. + /* Make sure the schema version is at least 3. But do not upgrade + ** from less than 3 to 4, as that will corrupt any preexisting DESC + ** index. */ - sqlite3MinimumFileFormat(pParse, iDb, pDflt ? 3 : 2); + r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); + sqlite3VdbeUsesBtree(v, iDb); + sqlite3VdbeAddOp2(v, OP_AddImm, r1, -2); + sqlite3VdbeAddOp2(v, OP_IfPos, r1, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3); + sqlite3ReleaseTempReg(pParse, r1); /* Reload the schema of the modified table. */ reloadTableSchema(pParse, pTab, pTab->zName); @@ -86959,7 +101043,7 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ pNew = (Table*)sqlite3DbMallocZero(db, sizeof(Table)); if( !pNew ) goto exit_begin_add_column; pParse->pNewTable = pNew; - pNew->nRef = 1; + pNew->nTabRef = 1; pNew->nCol = pTab->nCol; assert( pNew->nCol>0 ); nAlloc = (((pNew->nCol-1)/8)*8)+8; @@ -86967,7 +101051,7 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ pNew->aCol = (Column*)sqlite3DbMallocZero(db, sizeof(Column)*nAlloc); pNew->zName = sqlite3MPrintf(db, "sqlite_altertab_%s", pTab->zName); if( !pNew->aCol || !pNew->zName ){ - db->mallocFailed = 1; + assert( db->mallocFailed ); goto exit_begin_add_column; } memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); @@ -86975,13 +101059,11 @@ SQLITE_PRIVATE void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ Column *pCol = &pNew->aCol[i]; pCol->zName = sqlite3DbStrDup(db, pCol->zName); pCol->zColl = 0; - pCol->zType = 0; pCol->pDflt = 0; - pCol->zDflt = 0; } pNew->pSchema = db->aDb[iDb].pSchema; pNew->addColOffset = pTab->addColOffset; - pNew->nRef = 1; + pNew->nTabRef = 1; /* Begin a transaction and increment the schema cookie. */ sqlite3BeginWriteOperation(pParse, 0, iDb); @@ -87139,6 +101221,7 @@ exit_begin_add_column: ** integer in the equivalent columns in sqlite_stat4. */ #ifndef SQLITE_OMIT_ANALYZE +/* #include "sqliteInt.h" */ #if defined(SQLITE_ENABLE_STAT4) # define IsStat4 1 @@ -87208,14 +101291,14 @@ static void openStatTable( for(i=0; i<ArraySize(aTable); i++){ const char *zTab = aTable[i].zName; Table *pStat; - if( (pStat = sqlite3FindTable(db, zTab, pDb->zName))==0 ){ + if( (pStat = sqlite3FindTable(db, zTab, pDb->zDbSName))==0 ){ if( aTable[i].zCols ){ /* The sqlite_statN table does not exist. Create it. Note that a ** side-effect of the CREATE TABLE statement is to leave the rootpage ** of the new table in register pParse->regRoot. This is important ** because the OpenWrite opcode below will be needing it. */ sqlite3NestedParse(pParse, - "CREATE TABLE %Q.%s(%s)", pDb->zName, zTab, aTable[i].zCols + "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols ); aRoot[i] = pParse->regRoot; aCreateTbl[i] = OPFLAG_P2ISREG; @@ -87230,8 +101313,12 @@ static void openStatTable( if( zWhere ){ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE %s=%Q", - pDb->zName, zTab, zWhereType, zWhere + pDb->zDbSName, zTab, zWhereType, zWhere ); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + }else if( db->xPreUpdateCallback ){ + sqlite3NestedParse(pParse, "DELETE FROM %Q.%s", pDb->zDbSName, zTab); +#endif }else{ /* The sqlite_stat[134] table already exists. Delete all rows. */ sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb); @@ -87288,6 +101375,7 @@ struct Stat4Accum { Stat4Sample *aBest; /* Array of nCol best samples */ int iMin; /* Index in a[] of entry with minimum score */ int nSample; /* Current number of samples */ + int nMaxEqZero; /* Max leading 0 in anEq[] for any a[] entry */ int iGet; /* Index of current sample accessed by stat_get() */ Stat4Sample *a; /* Array of mxSample Stat4Sample objects */ sqlite3 *db; /* Database connection, for malloc() */ @@ -87311,7 +101399,7 @@ static void sampleClear(sqlite3 *db, Stat4Sample *p){ static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){ assert( db!=0 ); if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); - p->u.aRowid = sqlite3DbMallocRaw(db, n); + p->u.aRowid = sqlite3DbMallocRawNN(db, n); if( p->u.aRowid ){ p->nRowid = n; memcpy(p->u.aRowid, pData, n); @@ -87476,12 +101564,10 @@ static const FuncDef statInitFuncdef = { SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ - statInit, /* xFunc */ - 0, /* xStep */ + statInit, /* xSFunc */ 0, /* xFinalize */ "stat_init", /* zName */ - 0, /* pHash */ - 0 /* pDestructor */ + {0} }; #ifdef SQLITE_ENABLE_STAT4 @@ -87554,6 +101640,13 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ assert( IsStat4 || nEqZero==0 ); #ifdef SQLITE_ENABLE_STAT4 + /* Stat4Accum.nMaxEqZero is set to the maximum number of leading 0 + ** values in the anEq[] array of any sample in Stat4Accum.a[]. In + ** other words, if nMaxEqZero is n, then it is guaranteed that there + ** are no samples with Stat4Sample.anEq[m]==0 for (m>=n). */ + if( nEqZero>p->nMaxEqZero ){ + p->nMaxEqZero = nEqZero; + } if( pNew->isPSample==0 ){ Stat4Sample *pUpgrade = 0; assert( pNew->anEq[pNew->iCol]>0 ); @@ -87651,12 +101744,22 @@ static void samplePushPrevious(Stat4Accum *p, int iChng){ } } - /* Update the anEq[] fields of any samples already collected. */ + /* Check that no sample contains an anEq[] entry with an index of + ** p->nMaxEqZero or greater set to zero. */ for(i=p->nSample-1; i>=0; i--){ int j; - for(j=iChng; j<p->nCol; j++){ - if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; + for(j=p->nMaxEqZero; j<p->nCol; j++) assert( p->a[i].anEq[j]>0 ); + } + + /* Update the anEq[] fields of any samples already collected. */ + if( iChng<p->nMaxEqZero ){ + for(i=p->nSample-1; i>=0; i--){ + int j; + for(j=iChng; j<p->nCol; j++){ + if( p->a[i].anEq[j]==0 ) p->a[i].anEq[j] = p->current.anEq[j]; + } } + p->nMaxEqZero = iChng; } #endif @@ -87777,12 +101880,10 @@ static const FuncDef statPushFuncdef = { SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ - statPush, /* xFunc */ - 0, /* xStep */ + statPush, /* xSFunc */ 0, /* xFinalize */ "stat_push", /* zName */ - 0, /* pHash */ - 0 /* pDestructor */ + {0} }; #define STAT_GET_STAT1 0 /* "stat" column of stat1 table */ @@ -87799,6 +101900,12 @@ static const FuncDef statPushFuncdef = { ** The content to returned is determined by the parameter J ** which is one of the STAT_GET_xxxx values defined above. ** +** The stat_get(P,J) function is not available to generic SQL. It is +** inserted as part of a manually constructed bytecode program. (See +** the callStatGet() routine below.) It is guaranteed that the P +** parameter will always be a poiner to a Stat4Accum object, never a +** NULL. +** ** If neither STAT3 nor STAT4 are enabled, then J is always ** STAT_GET_STAT1 and is hence omitted and this routine becomes ** a one-parameter function, stat_get(P), that always returns the @@ -87924,12 +102031,10 @@ static const FuncDef statGetFuncdef = { SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ - statGet, /* xFunc */ - 0, /* xStep */ + statGet, /* xSFunc */ 0, /* xFinalize */ "stat_get", /* zName */ - 0, /* pHash */ - 0 /* pDestructor */ + {0} }; static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ @@ -87941,8 +102046,8 @@ static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ #else UNUSED_PARAMETER( iParam ); #endif - sqlite3VdbeAddOp3(v, OP_Function, 0, regStat4, regOut); - sqlite3VdbeChangeP4(v, -1, (char*)&statGetFuncdef, P4_FUNCDEF); + sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4, regOut, + (char*)&statGetFuncdef, P4_FUNCDEF); sqlite3VdbeChangeP5(v, 1 + IsStat34); } @@ -87978,6 +102083,9 @@ static void analyzeOneTable( int regIdxname = iMem++; /* Register containing index name */ int regStat1 = iMem++; /* Value for the stat column of sqlite_stat1 */ int regPrev = iMem; /* MUST BE LAST (see below) */ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + Table *pStat1 = 0; +#endif pParse->nMem = MAX(pParse->nMem, iMem); v = sqlite3GetVdbe(pParse); @@ -87988,7 +102096,7 @@ static void analyzeOneTable( /* Do not gather statistics on views or virtual tables */ return; } - if( sqlite3_strnicmp(pTab->zName, "sqlite_", 7)==0 ){ + if( sqlite3_strlike("sqlite\\_%", pTab->zName, '\\')==0 ){ /* Do not gather statistics on system tables */ return; } @@ -87998,11 +102106,23 @@ static void analyzeOneTable( assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); #ifndef SQLITE_OMIT_AUTHORIZATION if( sqlite3AuthCheck(pParse, SQLITE_ANALYZE, pTab->zName, 0, - db->aDb[iDb].zName ) ){ + db->aDb[iDb].zDbSName ) ){ return; } #endif +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( db->xPreUpdateCallback ){ + pStat1 = (Table*)sqlite3DbMallocZero(db, sizeof(Table) + 13); + if( pStat1==0 ) return; + pStat1->zName = (char*)&pStat1[1]; + memcpy(pStat1->zName, "sqlite_stat1", 13); + pStat1->nCol = 3; + pStat1->iPKey = -1; + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNBLOB); + } +#endif + /* Establish a read-lock on the table at the shared-cache level. ** Open a read-only cursor on the table. Also allocate a cursor number ** to use for scanning indexes (iIdxCur). No index cursor is opened at @@ -88012,7 +102132,7 @@ static void analyzeOneTable( iIdxCur = iTab++; pParse->nTab = MAX(pParse->nTab, iTab); sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); - sqlite3VdbeAddOp4(v, OP_String8, 0, regTabname, 0, pTab->zName, 0); + sqlite3VdbeLoadString(v, regTabname, pTab->zName); for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ int nCol; /* Number of columns in pIdx. "N" */ @@ -88034,7 +102154,7 @@ static void analyzeOneTable( } /* Populate the register containing the index name. */ - sqlite3VdbeAddOp4(v, OP_String8, 0, regIdxname, 0, zIdxName, 0); + sqlite3VdbeLoadString(v, regIdxname, zIdxName); VdbeComment((v, "Analysis for %s.%s", pTab->zName, zIdxName)); /* @@ -88096,8 +102216,8 @@ static void analyzeOneTable( #endif sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); - sqlite3VdbeAddOp3(v, OP_Function, 0, regStat4+1, regStat4); - sqlite3VdbeChangeP4(v, -1, (char*)&statInitFuncdef, P4_FUNCDEF); + sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4+1, regStat4, + (char*)&statInitFuncdef, P4_FUNCDEF); sqlite3VdbeChangeP5(v, 2+IsStat34); /* Implementation of the following: @@ -88116,7 +102236,7 @@ static void analyzeOneTable( if( nColTest>0 ){ int endDistinctTest = sqlite3VdbeMakeLabel(v); int *aGotoChng; /* Array of jump instruction addresses */ - aGotoChng = sqlite3DbMallocRaw(db, sizeof(int)*nColTest); + aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); if( aGotoChng==0 ) continue; /* @@ -88148,7 +102268,7 @@ static void analyzeOneTable( VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_Integer, nColTest, regChng); - sqlite3VdbeAddOp2(v, OP_Goto, 0, endDistinctTest); + sqlite3VdbeGoto(v, endDistinctTest); /* @@ -88184,6 +102304,7 @@ static void analyzeOneTable( regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); for(j=0; j<pPk->nKeyCol; j++){ k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + assert( k>=0 && k<pIdx->nColumn ); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName)); } @@ -88192,8 +102313,8 @@ static void analyzeOneTable( } #endif assert( regChng==(regStat4+1) ); - sqlite3VdbeAddOp3(v, OP_Function, 1, regStat4, regTemp); - sqlite3VdbeChangeP4(v, -1, (char*)&statPushFuncdef, P4_FUNCDEF); + sqlite3VdbeAddOp4(v, OP_Function0, 1, regStat4, regTemp, + (char*)&statPushFuncdef, P4_FUNCDEF); sqlite3VdbeChangeP5(v, 2+IsStat34); sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); @@ -88203,6 +102324,9 @@ static void analyzeOneTable( sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); +#endif sqlite3VdbeChangeP5(v, OPFLAG_APPEND); /* Add the entries to the stat3 or stat4 table. */ @@ -88233,12 +102357,10 @@ static void analyzeOneTable( ** be taken */ VdbeCoverageNeverTaken(v); #ifdef SQLITE_ENABLE_STAT3 - sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, - pIdx->aiColumn[0], regSample); + sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample); #else for(i=0; i<nCol; i++){ - i16 iCol = pIdx->aiColumn[i]; - sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, iCol, regCol+i); + sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, i, regCol+i); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regCol, nCol, regSample); #endif @@ -88268,6 +102390,9 @@ static void analyzeOneTable( sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regTemp, regNewRowid); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeChangeP4(v, -1, (char*)pStat1, P4_TABLE); +#endif sqlite3VdbeJumpHere(v, jZeroRows); } } @@ -88369,27 +102494,14 @@ SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ if( i==1 ) continue; /* Do not analyze the TEMP database */ analyzeDatabase(pParse, i); } - }else if( pName2->n==0 ){ - /* Form 2: Analyze the database or table named */ - iDb = sqlite3FindDb(db, pName1); - if( iDb>=0 ){ - analyzeDatabase(pParse, iDb); - }else{ - z = sqlite3NameFromToken(db, pName1); - if( z ){ - if( (pIdx = sqlite3FindIndex(db, z, 0))!=0 ){ - analyzeTable(pParse, pIdx->pTable, pIdx); - }else if( (pTab = sqlite3LocateTable(pParse, 0, z, 0))!=0 ){ - analyzeTable(pParse, pTab, 0); - } - sqlite3DbFree(db, z); - } - } + }else if( pName2->n==0 && (iDb = sqlite3FindDb(db, pName1))>=0 ){ + /* Analyze the schema named as the argument */ + analyzeDatabase(pParse, iDb); }else{ - /* Form 3: Analyze the fully qualified table name */ + /* Form 3: Analyze the table or index named as an argument */ iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pTableName); if( iDb>=0 ){ - zDb = db->aDb[iDb].zName; + zDb = pName2->n ? db->aDb[iDb].zDbSName : 0; z = sqlite3NameFromToken(db, pTableName); if( z ){ if( (pIdx = sqlite3FindIndex(db, z, zDb))!=0 ){ @@ -88399,10 +102511,11 @@ SQLITE_PRIVATE void sqlite3Analyze(Parse *pParse, Token *pName1, Token *pName2){ } sqlite3DbFree(db, z); } - } + } + } + if( db->nSqlExec==0 && (v = sqlite3GetVdbe(pParse))!=0 ){ + sqlite3VdbeAddOp0(v, OP_Expire); } - v = sqlite3GetVdbe(pParse); - if( v ) sqlite3VdbeAddOp0(v, OP_Expire); } /* @@ -88517,18 +102630,25 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ z = argv[2]; if( pIndex ){ + tRowcnt *aiRowEst = 0; int nCol = pIndex->nKeyCol+1; #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 - tRowcnt * const aiRowEst = pIndex->aiRowEst = (tRowcnt*)sqlite3MallocZero( - sizeof(tRowcnt) * nCol - ); - if( aiRowEst==0 ) pInfo->db->mallocFailed = 1; -#else - tRowcnt * const aiRowEst = 0; + /* Index.aiRowEst may already be set here if there are duplicate + ** sqlite_stat1 entries for this index. In that case just clobber + ** the old data with the new instead of allocating a new array. */ + if( pIndex->aiRowEst==0 ){ + pIndex->aiRowEst = (tRowcnt*)sqlite3MallocZero(sizeof(tRowcnt) * nCol); + if( pIndex->aiRowEst==0 ) sqlite3OomFault(pInfo->db); + } + aiRowEst = pIndex->aiRowEst; #endif pIndex->bUnordered = 0; decodeIntArray((char*)z, nCol, aiRowEst, pIndex->aiRowLogEst, pIndex); - if( pIndex->pPartIdxWhere==0 ) pTable->nRowLogEst = pIndex->aiRowLogEst[0]; + pIndex->hasStat1 = 1; + if( pIndex->pPartIdxWhere==0 ){ + pTable->nRowLogEst = pIndex->aiRowLogEst[0]; + pTable->tabFlags |= TF_HasStat1; + } }else{ Index fakeIdx; fakeIdx.szIdxRow = pTable->szTabRow; @@ -88537,6 +102657,7 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ #endif decodeIntArray((char*)z, 1, 0, &pTable->nRowLogEst, &fakeIdx); pTable->szTabRow = fakeIdx.szIdxRow; + pTable->tabFlags |= TF_HasStat1; } return 0; @@ -88617,7 +102738,7 @@ static void initAvgEq(Index *pIdx){ } } - if( nDist100>nSum100 ){ + if( nDist100>nSum100 && sumEq<nRow ){ avgEq = ((i64)100 * (nRow - sumEq))/(nDist100 - nSum100); } if( avgEq==0 ) avgEq = 1; @@ -88669,10 +102790,10 @@ static int loadStatTbl( Index *pPrevIdx = 0; /* Previous index in the loop */ IndexSample *pSample; /* A slot in pIdx->aSample[] */ - assert( db->lookaside.bEnabled==0 ); + assert( db->lookaside.bDisable ); zSql = sqlite3MPrintf(db, zSql1, zDb); if( !zSql ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); sqlite3DbFree(db, zSql); @@ -88712,7 +102833,7 @@ static int loadStatTbl( pIdx->aSample = sqlite3DbMallocZero(db, nByte); if( pIdx->aSample==0 ){ sqlite3_finalize(pStmt); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pSpace = (tRowcnt*)&pIdx->aSample[nSample]; pIdx->aAvgEq = pSpace; pSpace += nIdxCol; @@ -88728,7 +102849,7 @@ static int loadStatTbl( zSql = sqlite3MPrintf(db, zSql2, zDb); if( !zSql ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); sqlite3DbFree(db, zSql); @@ -88766,9 +102887,11 @@ static int loadStatTbl( pSample->p = sqlite3DbMallocZero(db, pSample->n + 2); if( pSample->p==0 ){ sqlite3_finalize(pStmt); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; + } + if( pSample->n ){ + memcpy(pSample->p, sqlite3_column_blob(pStmt, 4), pSample->n); } - memcpy(pSample->p, sqlite3_column_blob(pStmt, 4), pSample->n); pIdx->nSample++; } rc = sqlite3_finalize(pStmt); @@ -88783,7 +102906,7 @@ static int loadStatTbl( static int loadStat4(sqlite3 *db, const char *zDb){ int rc = SQLITE_OK; /* Result codes from subroutines */ - assert( db->lookaside.bEnabled==0 ); + assert( db->lookaside.bDisable ); if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ rc = loadStatTbl(db, 0, "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", @@ -88828,49 +102951,56 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ analysisInfo sInfo; HashElem *i; char *zSql; - int rc; + int rc = SQLITE_OK; + Schema *pSchema = db->aDb[iDb].pSchema; assert( iDb>=0 && iDb<db->nDb ); assert( db->aDb[iDb].pBt!=0 ); /* Clear any prior statistics */ assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); - for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ + for(i=sqliteHashFirst(&pSchema->tblHash); i; i=sqliteHashNext(i)){ + Table *pTab = sqliteHashData(i); + pTab->tabFlags &= ~TF_HasStat1; + } + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); - sqlite3DefaultRowEst(pIdx); + pIdx->hasStat1 = 0; #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 sqlite3DeleteIndexSamples(db, pIdx); pIdx->aSample = 0; #endif } - /* Check to make sure the sqlite_stat1 table exists */ - sInfo.db = db; - sInfo.zDatabase = db->aDb[iDb].zName; - if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)==0 ){ - return SQLITE_ERROR; - } - /* Load new statistics out of the sqlite_stat1 table */ - zSql = sqlite3MPrintf(db, - "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); - if( zSql==0 ){ - rc = SQLITE_NOMEM; - }else{ - rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); - sqlite3DbFree(db, zSql); + sInfo.db = db; + sInfo.zDatabase = db->aDb[iDb].zDbSName; + if( sqlite3FindTable(db, "sqlite_stat1", sInfo.zDatabase)!=0 ){ + zSql = sqlite3MPrintf(db, + "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase); + if( zSql==0 ){ + rc = SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0); + sqlite3DbFree(db, zSql); + } } + /* Set appropriate defaults on all indexes not in the sqlite_stat1 table */ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ + Index *pIdx = sqliteHashData(i); + if( !pIdx->hasStat1 ) sqlite3DefaultRowEst(pIdx); + } /* Load the statistics from the sqlite_stat4 table. */ #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 if( rc==SQLITE_OK && OptimizationEnabled(db, SQLITE_Stat34) ){ - int lookasideEnabled = db->lookaside.bEnabled; - db->lookaside.bEnabled = 0; + db->lookaside.bDisable++; rc = loadStat4(db, sInfo.zDatabase); - db->lookaside.bEnabled = lookasideEnabled; + db->lookaside.bDisable--; } - for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){ + for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); sqlite3_free(pIdx->aiRowEst); pIdx->aiRowEst = 0; @@ -88878,7 +103008,7 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ #endif if( rc==SQLITE_NOMEM ){ - db->mallocFailed = 1; + sqlite3OomFault(db); } return rc; } @@ -88901,6 +103031,7 @@ SQLITE_PRIVATE int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ ************************************************************************* ** This file contains code used to implement the ATTACH and DETACH commands. */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_ATTACH /* @@ -88944,6 +103075,10 @@ static int resolveAttachExpr(NameContext *pName, Expr *pExpr) ** ** If the optional "KEY z" syntax is omitted, an SQL NULL is passed as the ** third argument. +** +** If the db->init.reopenMemdb flags is set, then instead of attaching a +** new database, close the database on db->init.iDb and reopen it as an +** empty MemDB. */ static void attachFunc( sqlite3_context *context, @@ -88958,101 +103093,120 @@ static void attachFunc( char *zPath = 0; char *zErr = 0; unsigned int flags; - Db *aNew; + Db *aNew; /* New array of Db pointers */ + Db *pNew; /* Db object for the newly attached database */ char *zErrDyn = 0; sqlite3_vfs *pVfs; UNUSED_PARAMETER(NotUsed); - zFile = (const char *)sqlite3_value_text(argv[0]); zName = (const char *)sqlite3_value_text(argv[1]); if( zFile==0 ) zFile = ""; if( zName==0 ) zName = ""; - /* Check for the following errors: - ** - ** * Too many attached databases, - ** * Transaction currently open - ** * Specified database name already being used. - */ - if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ - zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", - db->aLimit[SQLITE_LIMIT_ATTACHED] - ); - goto attach_error; - } - if( !db->autoCommit ){ - zErrDyn = sqlite3MPrintf(db, "cannot ATTACH database within transaction"); - goto attach_error; - } - for(i=0; i<db->nDb; i++){ - char *z = db->aDb[i].zName; - assert( z && zName ); - if( sqlite3StrICmp(z, zName)==0 ){ - zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); +#ifdef SQLITE_ENABLE_DESERIALIZE +# define REOPEN_AS_MEMDB(db) (db->init.reopenMemdb) +#else +# define REOPEN_AS_MEMDB(db) (0) +#endif + + if( REOPEN_AS_MEMDB(db) ){ + /* This is not a real ATTACH. Instead, this routine is being called + ** from sqlite3_deserialize() to close database db->init.iDb and + ** reopen it as a MemDB */ + pVfs = sqlite3_vfs_find("memdb"); + if( pVfs==0 ) return; + pNew = &db->aDb[db->init.iDb]; + if( pNew->pBt ) sqlite3BtreeClose(pNew->pBt); + pNew->pBt = 0; + pNew->pSchema = 0; + rc = sqlite3BtreeOpen(pVfs, "x", db, &pNew->pBt, 0, SQLITE_OPEN_MAIN_DB); + }else{ + /* This is a real ATTACH + ** + ** Check for the following errors: + ** + ** * Too many attached databases, + ** * Transaction currently open + ** * Specified database name already being used. + */ + if( db->nDb>=db->aLimit[SQLITE_LIMIT_ATTACHED]+2 ){ + zErrDyn = sqlite3MPrintf(db, "too many attached databases - max %d", + db->aLimit[SQLITE_LIMIT_ATTACHED] + ); goto attach_error; } + for(i=0; i<db->nDb; i++){ + char *z = db->aDb[i].zDbSName; + assert( z && zName ); + if( sqlite3StrICmp(z, zName)==0 ){ + zErrDyn = sqlite3MPrintf(db, "database %s is already in use", zName); + goto attach_error; + } + } + + /* Allocate the new entry in the db->aDb[] array and initialize the schema + ** hash tables. + */ + if( db->aDb==db->aDbStatic ){ + aNew = sqlite3DbMallocRawNN(db, sizeof(db->aDb[0])*3 ); + if( aNew==0 ) return; + memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); + }else{ + aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); + if( aNew==0 ) return; + } + db->aDb = aNew; + pNew = &db->aDb[db->nDb]; + memset(pNew, 0, sizeof(*pNew)); + + /* Open the database file. If the btree is successfully opened, use + ** it to obtain the database schema. At this point the schema may + ** or may not be initialized. + */ + flags = db->openFlags; + rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + return; + } + assert( pVfs ); + flags |= SQLITE_OPEN_MAIN_DB; + rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); + sqlite3_free( zPath ); + db->nDb++; } - - /* Allocate the new entry in the db->aDb[] array and initialize the schema - ** hash tables. - */ - if( db->aDb==db->aDbStatic ){ - aNew = sqlite3DbMallocRaw(db, sizeof(db->aDb[0])*3 ); - if( aNew==0 ) return; - memcpy(aNew, db->aDb, sizeof(db->aDb[0])*2); - }else{ - aNew = sqlite3DbRealloc(db, db->aDb, sizeof(db->aDb[0])*(db->nDb+1) ); - if( aNew==0 ) return; - } - db->aDb = aNew; - aNew = &db->aDb[db->nDb]; - memset(aNew, 0, sizeof(*aNew)); - - /* Open the database file. If the btree is successfully opened, use - ** it to obtain the database schema. At this point the schema may - ** or may not be initialized. - */ - flags = db->openFlags; - rc = sqlite3ParseUri(db->pVfs->zName, zFile, &flags, &pVfs, &zPath, &zErr); - if( rc!=SQLITE_OK ){ - if( rc==SQLITE_NOMEM ) db->mallocFailed = 1; - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); - return; - } - assert( pVfs ); - flags |= SQLITE_OPEN_MAIN_DB; - rc = sqlite3BtreeOpen(pVfs, zPath, db, &aNew->pBt, 0, flags); - sqlite3_free( zPath ); - db->nDb++; + db->noSharedCache = 0; if( rc==SQLITE_CONSTRAINT ){ rc = SQLITE_ERROR; zErrDyn = sqlite3MPrintf(db, "database is already attached"); }else if( rc==SQLITE_OK ){ Pager *pPager; - aNew->pSchema = sqlite3SchemaGet(db, aNew->pBt); - if( !aNew->pSchema ){ - rc = SQLITE_NOMEM; - }else if( aNew->pSchema->file_format && aNew->pSchema->enc!=ENC(db) ){ + pNew->pSchema = sqlite3SchemaGet(db, pNew->pBt); + if( !pNew->pSchema ){ + rc = SQLITE_NOMEM_BKPT; + }else if( pNew->pSchema->file_format && pNew->pSchema->enc!=ENC(db) ){ zErrDyn = sqlite3MPrintf(db, "attached databases must use the same text encoding as main database"); rc = SQLITE_ERROR; } - sqlite3BtreeEnter(aNew->pBt); - pPager = sqlite3BtreePager(aNew->pBt); + sqlite3BtreeEnter(pNew->pBt); + pPager = sqlite3BtreePager(pNew->pBt); sqlite3PagerLockingMode(pPager, db->dfltLockMode); - sqlite3BtreeSecureDelete(aNew->pBt, + sqlite3BtreeSecureDelete(pNew->pBt, sqlite3BtreeSecureDelete(db->aDb[0].pBt,-1) ); #ifndef SQLITE_OMIT_PAGER_PRAGMAS - sqlite3BtreeSetPagerFlags(aNew->pBt, 3 | (db->flags & PAGER_FLAGS_MASK)); + sqlite3BtreeSetPagerFlags(pNew->pBt, + PAGER_SYNCHRONOUS_FULL | (db->flags & PAGER_FLAGS_MASK)); #endif - sqlite3BtreeLeave(aNew->pBt); + sqlite3BtreeLeave(pNew->pBt); } - aNew->safety_level = 3; - aNew->zName = sqlite3DbStrDup(db, zName); - if( rc==SQLITE_OK && aNew->zName==0 ){ - rc = SQLITE_NOMEM; + pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName); + if( rc==SQLITE_OK && pNew->zDbSName==0 ){ + rc = SQLITE_NOMEM_BKPT; } @@ -89080,7 +103234,7 @@ static void attachFunc( case SQLITE_NULL: /* No key specified. Use the key from the main database */ sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - if( nKey>0 || sqlite3BtreeGetReserve(db->aDb[0].pBt)>0 ){ + if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); } break; @@ -89090,13 +103244,16 @@ static void attachFunc( /* If the file was opened successfully, read the schema for the new database. ** If this fails, or if opening the file failed, then close the file and - ** remove the entry from the db->aDb[] array. i.e. put everything back the way - ** we found it. + ** remove the entry from the db->aDb[] array. i.e. put everything back the + ** way we found it. */ if( rc==SQLITE_OK ){ sqlite3BtreeEnterAll(db); + db->init.iDb = 0; + db->mDbFlags &= ~(DBFLAG_SchemaKnownOk); rc = sqlite3Init(db, &zErrDyn); sqlite3BtreeLeaveAll(db); + assert( zErrDyn==0 || rc!=SQLITE_OK ); } #ifdef SQLITE_USER_AUTHENTICATION if( rc==SQLITE_OK ){ @@ -89108,21 +103265,23 @@ static void attachFunc( } #endif if( rc ){ - int iDb = db->nDb - 1; - assert( iDb>=2 ); - if( db->aDb[iDb].pBt ){ - sqlite3BtreeClose(db->aDb[iDb].pBt); - db->aDb[iDb].pBt = 0; - db->aDb[iDb].pSchema = 0; - } - sqlite3ResetAllSchemasOfConnection(db); - db->nDb = iDb; - if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ - db->mallocFailed = 1; - sqlite3DbFree(db, zErrDyn); - zErrDyn = sqlite3MPrintf(db, "out of memory"); - }else if( zErrDyn==0 ){ - zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile); + if( !REOPEN_AS_MEMDB(db) ){ + int iDb = db->nDb - 1; + assert( iDb>=2 ); + if( db->aDb[iDb].pBt ){ + sqlite3BtreeClose(db->aDb[iDb].pBt); + db->aDb[iDb].pBt = 0; + db->aDb[iDb].pSchema = 0; + } + sqlite3ResetAllSchemasOfConnection(db); + db->nDb = iDb; + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + sqlite3DbFree(db, zErrDyn); + zErrDyn = sqlite3MPrintf(db, "out of memory"); + }else if( zErrDyn==0 ){ + zErrDyn = sqlite3MPrintf(db, "unable to open database: %s", zFile); + } } goto attach_error; } @@ -89163,7 +103322,7 @@ static void detachFunc( for(i=0; i<db->nDb; i++){ pDb = &db->aDb[i]; if( pDb->pBt==0 ) continue; - if( sqlite3StrICmp(pDb->zName, zName)==0 ) break; + if( sqlite3StrICmp(pDb->zDbSName, zName)==0 ) break; } if( i>=db->nDb ){ @@ -89174,11 +103333,6 @@ static void detachFunc( sqlite3_snprintf(sizeof(zErr),zErr, "cannot detach database %s", zName); goto detach_error; } - if( !db->autoCommit ){ - sqlite3_snprintf(sizeof(zErr), zErr, - "cannot DETACH database within transaction"); - goto detach_error; - } if( sqlite3BtreeIsInReadTrans(pDb->pBt) || sqlite3BtreeIsInBackup(pDb->pBt) ){ sqlite3_snprintf(sizeof(zErr),zErr, "database %s is locked", zName); goto detach_error; @@ -89187,7 +103341,7 @@ static void detachFunc( sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; pDb->pSchema = 0; - sqlite3ResetAllSchemasOfConnection(db); + sqlite3CollapseDatabaseArray(db); return; detach_error: @@ -89213,6 +103367,7 @@ static void codeAttach( sqlite3* db = pParse->db; int regArgs; + if( pParse->nErr ) goto attach_end; memset(&sName, 0, sizeof(NameContext)); sName.pParse = pParse; @@ -89221,7 +103376,6 @@ static void codeAttach( SQLITE_OK!=(rc = resolveAttachExpr(&sName, pDbname)) || SQLITE_OK!=(rc = resolveAttachExpr(&sName, pKey)) ){ - pParse->nErr++; goto attach_end; } @@ -89249,11 +103403,11 @@ static void codeAttach( assert( v || db->mallocFailed ); if( v ){ - sqlite3VdbeAddOp3(v, OP_Function, 0, regArgs+3-pFunc->nArg, regArgs+3); + sqlite3VdbeAddOp4(v, OP_Function0, 0, regArgs+3-pFunc->nArg, regArgs+3, + (char *)pFunc, P4_FUNCDEF); assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg ); sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg)); - sqlite3VdbeChangeP4(v, -1, (char *)pFunc, P4_FUNCDEF); - + /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this ** statement only). For DETACH, set it to false (expire all existing ** statements). @@ -89278,12 +103432,10 @@ SQLITE_PRIVATE void sqlite3Detach(Parse *pParse, Expr *pDbname){ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ - detachFunc, /* xFunc */ - 0, /* xStep */ + detachFunc, /* xSFunc */ 0, /* xFinalize */ "sqlite_detach", /* zName */ - 0, /* pHash */ - 0 /* pDestructor */ + {0} }; codeAttach(pParse, SQLITE_DETACH, &detach_func, pDbname, 0, 0, pDbname); } @@ -89299,12 +103451,10 @@ SQLITE_PRIVATE void sqlite3Attach(Parse *pParse, Expr *p, Expr *pDbname, Expr *p SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ - attachFunc, /* xFunc */ - 0, /* xStep */ + attachFunc, /* xSFunc */ 0, /* xFinalize */ "sqlite_attach", /* zName */ - 0, /* pHash */ - 0 /* pDestructor */ + {0} }; codeAttach(pParse, SQLITE_ATTACH, &attach_func, p, p, pDbname, pKey); } @@ -89326,7 +103476,7 @@ SQLITE_PRIVATE void sqlite3FixInit( db = pParse->db; assert( db->nDb>iDb ); pFix->pParse = pParse; - pFix->zDb = db->aDb[iDb].zName; + pFix->zDb = db->aDb[iDb].zDbSName; pFix->pSchema = db->aDb[iDb].pSchema; pFix->zType = zType; pFix->pName = pName; @@ -89373,6 +103523,9 @@ SQLITE_PRIVATE int sqlite3FixSrcList( if( sqlite3FixSelect(pFix, pItem->pSelect) ) return 1; if( sqlite3FixExpr(pFix, pItem->pOn) ) return 1; #endif + if( pItem->fg.isTabFunc && sqlite3FixExprList(pFix, pItem->u1.pFuncArg) ){ + return 1; + } } return 0; } @@ -89403,8 +103556,13 @@ SQLITE_PRIVATE int sqlite3FixSelect( if( sqlite3FixExpr(pFix, pSelect->pLimit) ){ return 1; } - if( sqlite3FixExpr(pFix, pSelect->pOffset) ){ - return 1; + if( pSelect->pWith ){ + int i; + for(i=0; i<pSelect->pWith->nCte; i++){ + if( sqlite3FixSelect(pFix, pSelect->pWith->a[i].pSelect) ){ + return 1; + } + } } pSelect = pSelect->pPrior; } @@ -89423,7 +103581,7 @@ SQLITE_PRIVATE int sqlite3FixExpr( return 1; } } - if( ExprHasProperty(pExpr, EP_TokenOnly) ) break; + if( ExprHasProperty(pExpr, EP_TokenOnly|EP_Leaf) ) break; if( ExprHasProperty(pExpr, EP_xIsSelect) ){ if( sqlite3FixSelect(pFix, pExpr->x.pSelect) ) return 1; }else{ @@ -89467,6 +103625,18 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep( if( sqlite3FixExprList(pFix, pStep->pExprList) ){ return 1; } +#ifndef SQLITE_OMIT_UPSERT + if( pStep->pUpsert ){ + Upsert *pUp = pStep->pUpsert; + if( sqlite3FixExprList(pFix, pUp->pUpsertTarget) + || sqlite3FixExpr(pFix, pUp->pUpsertTargetWhere) + || sqlite3FixExprList(pFix, pUp->pUpsertSet) + || sqlite3FixExpr(pFix, pUp->pUpsertWhere) + ){ + return 1; + } + } +#endif pStep = pStep->pNext; } return 0; @@ -89491,6 +103661,7 @@ SQLITE_PRIVATE int sqlite3FixTriggerStep( ** systems that do not need this facility may omit it by recompiling ** the library with -DSQLITE_OMIT_AUTHORIZATION=1 */ +/* #include "sqliteInt.h" */ /* ** All of the code in this file may be omitted by defining a single @@ -89583,21 +103754,20 @@ SQLITE_PRIVATE int sqlite3AuthReadCol( const char *zCol, /* Column name */ int iDb /* Index of containing database. */ ){ - sqlite3 *db = pParse->db; /* Database handle */ - char *zDb = db->aDb[iDb].zName; /* Name of attached database */ - int rc; /* Auth callback return code */ + sqlite3 *db = pParse->db; /* Database handle */ + char *zDb = db->aDb[iDb].zDbSName; /* Schema name of attached database */ + int rc; /* Auth callback return code */ + if( db->init.busy ) return SQLITE_OK; rc = db->xAuth(db->pAuthArg, SQLITE_READ, zTab,zCol,zDb,pParse->zAuthContext #ifdef SQLITE_USER_AUTHENTICATION ,db->auth.zAuthUser #endif ); if( rc==SQLITE_DENY ){ - if( db->nDb>2 || iDb!=0 ){ - sqlite3ErrorMsg(pParse, "access to %s.%s.%s is prohibited",zDb,zTab,zCol); - }else{ - sqlite3ErrorMsg(pParse, "access to %s.%s is prohibited", zTab, zCol); - } + char *z = sqlite3_mprintf("%s.%s", zTab, zCol); + if( db->nDb>2 || iDb!=0 ) z = sqlite3_mprintf("%s.%z", zDb, z); + sqlite3ErrorMsg(pParse, "access to %z is prohibited", z); pParse->rc = SQLITE_AUTH; }else if( rc!=SQLITE_IGNORE && rc!=SQLITE_OK ){ sqliteAuthBadReturnCode(pParse); @@ -89627,6 +103797,7 @@ SQLITE_PRIVATE void sqlite3AuthRead( int iDb; /* The index of the database the expression refers to */ int iCol; /* Index of column in table */ + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); if( db->xAuth==0 ) return; iDb = sqlite3SchemaToIndex(pParse->db, pSchema); if( iDb<0 ){ @@ -89635,7 +103806,6 @@ SQLITE_PRIVATE void sqlite3AuthRead( return; } - assert( pExpr->op==TK_COLUMN || pExpr->op==TK_TRIGGER ); if( pExpr->op==TK_TRIGGER ){ pTab = pParse->pTriggerTab; }else{ @@ -89691,6 +103861,18 @@ SQLITE_PRIVATE int sqlite3AuthCheck( if( db->xAuth==0 ){ return SQLITE_OK; } + + /* EVIDENCE-OF: R-43249-19882 The third through sixth parameters to the + ** callback are either NULL pointers or zero-terminated strings that + ** contain additional details about the action to be authorized. + ** + ** The following testcase() macros show that any of the 3rd through 6th + ** parameters can be either NULL or a string. */ + testcase( zArg1==0 ); + testcase( zArg2==0 ); + testcase( zArg3==0 ); + testcase( pParse->zAuthContext==0 ); + rc = db->xAuth(db->pAuthArg, code, zArg1, zArg2, zArg3, pParse->zAuthContext #ifdef SQLITE_USER_AUTHENTICATION ,db->auth.zAuthUser @@ -89761,15 +103943,7 @@ SQLITE_PRIVATE void sqlite3AuthContextPop(AuthContext *pContext){ ** COMMIT ** ROLLBACK */ - -/* -** This routine is called when a new SQL statement is beginning to -** be parsed. Initialize the pParse structure as needed. -*/ -SQLITE_PRIVATE void sqlite3BeginParse(Parse *pParse, int explainFlag){ - pParse->explain = (u8)explainFlag; - pParse->nVar = 0; -} +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_SHARED_CACHE /* @@ -89777,10 +103951,10 @@ SQLITE_PRIVATE void sqlite3BeginParse(Parse *pParse, int explainFlag){ ** codeTableLocks() functions. */ struct TableLock { - int iDb; /* The database containing the table to be locked */ - int iTab; /* The root page of the table to be locked */ - u8 isWriteLock; /* True for write lock. False for a read lock */ - const char *zName; /* Name of the table */ + int iDb; /* The database containing the table to be locked */ + int iTab; /* The root page of the table to be locked */ + u8 isWriteLock; /* True for write lock. False for a read lock */ + const char *zLockName; /* Name of the table */ }; /* @@ -89806,6 +103980,8 @@ SQLITE_PRIVATE void sqlite3TableLock( TableLock *p; assert( iDb>=0 ); + if( iDb==1 ) return; + if( !sqlite3BtreeSharable(pParse->db->aDb[iDb].pBt) ) return; for(i=0; i<pToplevel->nTableLock; i++){ p = &pToplevel->aTableLock[i]; if( p->iDb==iDb && p->iTab==iTab ){ @@ -89822,10 +103998,10 @@ SQLITE_PRIVATE void sqlite3TableLock( p->iDb = iDb; p->iTab = iTab; p->isWriteLock = isWriteLock; - p->zName = zName; + p->zLockName = zName; }else{ pToplevel->nTableLock = 0; - pToplevel->db->mallocFailed = 1; + sqlite3OomFault(pToplevel->db); } } @@ -89844,7 +104020,7 @@ static void codeTableLocks(Parse *pParse){ TableLock *p = &pParse->aTableLock[i]; int p1 = p->iDb; sqlite3VdbeAddOp4(pVdbe, OP_TableLock, p1, p->iTab, p->isWriteLock, - p->zName, P4_STATIC); + p->zLockName, P4_STATIC); } } #else @@ -89880,9 +104056,11 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ assert( pParse->pToplevel==0 ); db = pParse->db; - if( db->mallocFailed ) return; if( pParse->nested ) return; - if( pParse->nErr ) return; + if( db->mallocFailed || pParse->nErr ){ + if( pParse->rc==SQLITE_OK ) pParse->rc = SQLITE_ERROR; + return; + } /* Begin by generating some termination code at the end of the ** vdbe program @@ -89891,15 +104069,14 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ assert( !pParse->isMultiWrite || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); if( v ){ - while( sqlite3VdbeDeletePriorOpcode(v, OP_Close) ){} sqlite3VdbeAddOp0(v, OP_Halt); #if SQLITE_USER_AUTHENTICATION if( pParse->nTableLock>0 && db->init.busy==0 ){ sqlite3UserAuthInit(db); if( db->auth.authLevel<UAUTH_User ){ - pParse->rc = SQLITE_AUTH_USER; sqlite3ErrorMsg(pParse, "user not authenticated"); + pParse->rc = SQLITE_AUTH_USER; return; } } @@ -89918,16 +104095,20 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); sqlite3VdbeJumpHere(v, 0); for(iDb=0; iDb<db->nDb; iDb++){ + Schema *pSchema; if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; sqlite3VdbeUsesBtree(v, iDb); + pSchema = db->aDb[iDb].pSchema; sqlite3VdbeAddOp4Int(v, OP_Transaction, /* Opcode */ iDb, /* P1 */ DbMaskTest(pParse->writeMask,iDb), /* P2 */ - pParse->cookieValue[iDb], /* P3 */ - db->aDb[iDb].pSchema->iGeneration /* P4 */ + pSchema->schema_cookie, /* P3 */ + pSchema->iGeneration /* P4 */ ); if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); + VdbeComment((v, + "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); } #ifndef SQLITE_OMIT_VIRTUALTABLE for(i=0; i<pParse->nVtabLock; i++){ @@ -89957,29 +104138,23 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ } /* Finally, jump back to the beginning of the executable code. */ - sqlite3VdbeAddOp2(v, OP_Goto, 0, 1); + sqlite3VdbeGoto(v, 1); } } /* Get the VDBE program ready for execution */ - if( v && ALWAYS(pParse->nErr==0) && !db->mallocFailed ){ + if( v && pParse->nErr==0 && !db->mallocFailed ){ assert( pParse->iCacheLevel==0 ); /* Disables and re-enables match */ /* A minimum of one cursor is required if autoincrement is used * See ticket [a696379c1f08866] */ if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1; sqlite3VdbeMakeReady(v, pParse); pParse->rc = SQLITE_DONE; - pParse->colNamesSet = 0; }else{ pParse->rc = SQLITE_ERROR; } - pParse->nTab = 0; - pParse->nMem = 0; - pParse->nSet = 0; - pParse->nVar = 0; - DbMaskZero(pParse->cookieMask); } /* @@ -89999,8 +104174,7 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ char *zSql; char *zErrMsg = 0; sqlite3 *db = pParse->db; -# define SAVE_SZ (sizeof(Parse) - offsetof(Parse,nVar)) - char saveBuf[SAVE_SZ]; + char saveBuf[PARSE_TAIL_SZ]; if( pParse->nErr ) return; assert( pParse->nested<10 ); /* Nesting should only be of limited depth */ @@ -90011,12 +104185,12 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ return; /* A malloc must have failed */ } pParse->nested++; - memcpy(saveBuf, &pParse->nVar, SAVE_SZ); - memset(&pParse->nVar, 0, SAVE_SZ); + memcpy(saveBuf, PARSE_TAIL(pParse), PARSE_TAIL_SZ); + memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); sqlite3RunParser(pParse, zSql, &zErrMsg); sqlite3DbFree(db, zErrMsg); sqlite3DbFree(db, zSql); - memcpy(&pParse->nVar, saveBuf, SAVE_SZ); + memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ); pParse->nested--; } @@ -90046,10 +104220,6 @@ SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const cha Table *p = 0; int i; -#ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zName==0 ) return 0; -#endif - /* All mutexes are required for schema access. Make sure we hold them. */ assert( zDatabase!=0 || sqlite3BtreeHoldsAllMutexes(db) ); #if SQLITE_USER_AUTHENTICATION @@ -90059,14 +104229,22 @@ SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const cha return 0; } #endif - for(i=OMIT_TEMPDB; i<db->nDb; i++){ - int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ - if( zDatabase!=0 && sqlite3StrICmp(zDatabase, db->aDb[j].zName) ) continue; - assert( sqlite3SchemaMutexHeld(db, j, 0) ); - p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); - if( p ) break; + while(1){ + for(i=OMIT_TEMPDB; i<db->nDb; i++){ + int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ + if( zDatabase==0 || sqlite3StrICmp(zDatabase, db->aDb[j].zDbSName)==0 ){ + assert( sqlite3SchemaMutexHeld(db, j, 0) ); + p = sqlite3HashFind(&db->aDb[j].pSchema->tblHash, zName); + if( p ) return p; + } + } + /* Not found. If the name we were looking for was temp.sqlite_master + ** then change the name to sqlite_temp_master and try again. */ + if( sqlite3StrICmp(zName, MASTER_NAME)!=0 ) break; + if( sqlite3_stricmp(zDatabase, db->aDb[1].zDbSName)!=0 ) break; + zName = TEMP_MASTER_NAME; } - return p; + return 0; } /* @@ -90081,34 +104259,48 @@ SQLITE_PRIVATE Table *sqlite3FindTable(sqlite3 *db, const char *zName, const cha */ SQLITE_PRIVATE Table *sqlite3LocateTable( Parse *pParse, /* context in which to report errors */ - int isView, /* True if looking for a VIEW rather than a TABLE */ + u32 flags, /* LOCATE_VIEW or LOCATE_NOERR */ const char *zName, /* Name of the table we are looking for */ const char *zDbase /* Name of the database. Might be NULL */ ){ Table *p; + sqlite3 *db = pParse->db; /* Read the database schema. If an error occurs, leave an error message ** and code in pParse and return NULL. */ - if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ + if( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 + && SQLITE_OK!=sqlite3ReadSchema(pParse) + ){ return 0; } - p = sqlite3FindTable(pParse->db, zName, zDbase); + p = sqlite3FindTable(db, zName, zDbase); if( p==0 ){ - const char *zMsg = isView ? "no such view" : "no such table"; - if( zDbase ){ - sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); - }else{ - sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( sqlite3FindDbName(db, zDbase)<1 ){ + /* If zName is the not the name of a table in the schema created using + ** CREATE, then check to see if it is the name of an virtual table that + ** can be an eponymous virtual table. */ + Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); + if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ + pMod = sqlite3PragmaVtabRegister(db, zName); + } + if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + return pMod->pEpoTab; + } } - pParse->checkSchema = 1; - } -#if SQLITE_USER_AUTHENICATION - else if( pParse->db->auth.authLevel<UAUTH_User ){ - sqlite3ErrorMsg(pParse, "user not authenticated"); - p = 0; - } #endif + if( (flags & LOCATE_NOERR)==0 ){ + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); + } + pParse->checkSchema = 1; + } + } + return p; } @@ -90123,18 +104315,18 @@ SQLITE_PRIVATE Table *sqlite3LocateTable( */ SQLITE_PRIVATE Table *sqlite3LocateTableItem( Parse *pParse, - int isView, + u32 flags, struct SrcList_item *p ){ const char *zDb; assert( p->pSchema==0 || p->zDatabase==0 ); if( p->pSchema ){ int iDb = sqlite3SchemaToIndex(pParse->db, p->pSchema); - zDb = pParse->db->aDb[iDb].zName; + zDb = pParse->db->aDb[iDb].zDbSName; }else{ zDb = p->zDatabase; } - return sqlite3LocateTable(pParse, isView, p->zName, zDb); + return sqlite3LocateTable(pParse, flags, p->zName, zDb); } /* @@ -90158,7 +104350,7 @@ SQLITE_PRIVATE Index *sqlite3FindIndex(sqlite3 *db, const char *zName, const cha int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ Schema *pSchema = db->aDb[j].pSchema; assert( pSchema ); - if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zName) ) continue; + if( zDb && sqlite3StrICmp(zDb, db->aDb[j].zDbSName) ) continue; assert( sqlite3SchemaMutexHeld(db, j, 0) ); p = sqlite3HashFind(&pSchema->idxHash, zName); if( p ) break; @@ -90174,8 +104366,9 @@ static void freeIndex(sqlite3 *db, Index *p){ sqlite3DeleteIndexSamples(db, p); #endif sqlite3ExprDelete(db, p->pPartIdxWhere); + sqlite3ExprListDelete(db, p->aColExpr); sqlite3DbFree(db, p->zColAff); - if( p->isResized ) sqlite3DbFree(db, p->azColl); + if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl); #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 sqlite3_free(p->aiRowEst); #endif @@ -90210,7 +104403,7 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteIndex(sqlite3 *db, int iDb, const char } freeIndex(db, pIndex); } - db->flags |= SQLITE_InternChanges; + db->mDbFlags |= DBFLAG_SchemaChange; } /* @@ -90226,8 +104419,8 @@ SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ for(i=j=2; i<db->nDb; i++){ struct Db *pDb = &db->aDb[i]; if( pDb->pBt==0 ){ - sqlite3DbFree(db, pDb->zName); - pDb->zName = 0; + sqlite3DbFree(db, pDb->zDbSName); + pDb->zDbSName = 0; continue; } if( j<i ){ @@ -90235,7 +104428,6 @@ SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ } j++; } - memset(&db->aDb[j], 0, (db->nDb-j)*sizeof(db->aDb[j])); db->nDb = j; if( db->nDb<=2 && db->aDb!=db->aDbStatic ){ memcpy(db->aDbStatic, db->aDb, 2*sizeof(db->aDb[0])); @@ -90246,28 +104438,27 @@ SQLITE_PRIVATE void sqlite3CollapseDatabaseArray(sqlite3 *db){ /* ** Reset the schema for the database at index iDb. Also reset the -** TEMP schema. +** TEMP schema. The reset is deferred if db->nSchemaLock is not zero. +** Deferred resets may be run by calling with iDb<0. */ SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ - Db *pDb; + int i; assert( iDb<db->nDb ); - /* Case 1: Reset the single schema identified by iDb */ - pDb = &db->aDb[iDb]; - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); - assert( pDb->pSchema!=0 ); - sqlite3SchemaClear(pDb->pSchema); - - /* If any database other than TEMP is reset, then also reset TEMP - ** since TEMP might be holding triggers that reference tables in the - ** other database. - */ - if( iDb!=1 ){ - pDb = &db->aDb[1]; - assert( pDb->pSchema!=0 ); - sqlite3SchemaClear(pDb->pSchema); + if( iDb>=0 ){ + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + DbSetProperty(db, iDb, DB_ResetWanted); + DbSetProperty(db, 1, DB_ResetWanted); + db->mDbFlags &= ~DBFLAG_SchemaKnownOk; + } + + if( db->nSchemaLock==0 ){ + for(i=0; i<db->nDb; i++){ + if( DbHasProperty(db, i, DB_ResetWanted) ){ + sqlite3SchemaClear(db->aDb[i].pSchema); + } + } } - return; } /* @@ -90277,13 +104468,14 @@ SQLITE_PRIVATE void sqlite3ResetOneSchema(sqlite3 *db, int iDb){ SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ int i; sqlite3BtreeEnterAll(db); + assert( db->nSchemaLock==0 ); for(i=0; i<db->nDb; i++){ Db *pDb = &db->aDb[i]; if( pDb->pSchema ){ sqlite3SchemaClear(pDb->pSchema); } } - db->flags &= ~SQLITE_InternChanges; + db->mDbFlags &= ~(DBFLAG_SchemaChange|DBFLAG_SchemaKnownOk); sqlite3VtabUnlockList(db); sqlite3BtreeLeaveAll(db); sqlite3CollapseDatabaseArray(db); @@ -90293,14 +104485,14 @@ SQLITE_PRIVATE void sqlite3ResetAllSchemasOfConnection(sqlite3 *db){ ** This routine is called when a commit occurs. */ SQLITE_PRIVATE void sqlite3CommitInternalChanges(sqlite3 *db){ - db->flags &= ~SQLITE_InternChanges; + db->mDbFlags &= ~DBFLAG_SchemaChange; } /* ** Delete memory allocated for the column names of a table or view (the ** Table.aCol[] array). */ -static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){ +SQLITE_PRIVATE void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ int i; Column *pCol; assert( pTable!=0 ); @@ -90308,8 +104500,6 @@ static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){ for(i=0; i<pTable->nCol; i++, pCol++){ sqlite3DbFree(db, pCol->zName); sqlite3ExprDelete(db, pCol->pDflt); - sqlite3DbFree(db, pCol->zDflt); - sqlite3DbFree(db, pCol->zType); sqlite3DbFree(db, pCol->zColl); } sqlite3DbFree(db, pTable->aCol); @@ -90331,27 +104521,25 @@ static void sqliteDeleteColumnNames(sqlite3 *db, Table *pTable){ ** db parameter can be used with db->pnBytesFreed to measure the memory ** used by the Table object. */ -SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ +static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ Index *pIndex, *pNext; - TESTONLY( int nLookaside; ) /* Used to verify lookaside not used for schema */ - - assert( !pTable || pTable->nRef>0 ); - - /* Do not delete the table until the reference count reaches zero. */ - if( !pTable ) return; - if( ((!db || db->pnBytesFreed==0) && (--pTable->nRef)>0) ) return; +#ifdef SQLITE_DEBUG /* Record the number of outstanding lookaside allocations in schema Tables ** prior to doing any free() operations. Since schema Tables do not use ** lookaside, this number should not change. */ - TESTONLY( nLookaside = (db && (pTable->tabFlags & TF_Ephemeral)==0) ? - db->lookaside.nOut : 0 ); + int nLookaside = 0; + if( db && (pTable->tabFlags & TF_Ephemeral)==0 ){ + nLookaside = sqlite3LookasideUsed(db, 0); + } +#endif /* Delete all indices associated with this table. */ for(pIndex = pTable->pIndex; pIndex; pIndex=pNext){ pNext = pIndex->pNext; - assert( pIndex->pSchema==pTable->pSchema ); - if( !db || db->pnBytesFreed==0 ){ + assert( pIndex->pSchema==pTable->pSchema + || (IsVirtual(pTable) && pIndex->idxType!=SQLITE_IDXTYPE_APPDEF) ); + if( (db==0 || db->pnBytesFreed==0) && !IsVirtual(pTable) ){ char *zName = pIndex->zName; TESTONLY ( Index *pOld = ) sqlite3HashInsert( &pIndex->pSchema->idxHash, zName, 0 @@ -90367,21 +104555,26 @@ SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ /* Delete the Table structure itself. */ - sqliteDeleteColumnNames(db, pTable); + sqlite3DeleteColumnNames(db, pTable); sqlite3DbFree(db, pTable->zName); sqlite3DbFree(db, pTable->zColAff); sqlite3SelectDelete(db, pTable->pSelect); -#ifndef SQLITE_OMIT_CHECK sqlite3ExprListDelete(db, pTable->pCheck); -#endif #ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3VtabClear(db, pTable); #endif sqlite3DbFree(db, pTable); /* Verify that no lookaside memory was used by schema tables */ - assert( nLookaside==0 || nLookaside==db->lookaside.nOut ); + assert( nLookaside==0 || nLookaside==sqlite3LookasideUsed(db,0) ); } +SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3 *db, Table *pTable){ + /* Do not delete the table until the reference count reaches zero. */ + if( !pTable ) return; + if( ((!db || db->pnBytesFreed==0) && (--pTable->nTabRef)>0) ) return; + deleteTable(db, pTable); +} + /* ** Unlink the given table from the hash tables and the delete the @@ -90399,7 +104592,7 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTable(sqlite3 *db, int iDb, const char pDb = &db->aDb[iDb]; p = sqlite3HashInsert(&pDb->pSchema->tblHash, zTabName, 0); sqlite3DeleteTable(db, p); - db->flags |= SQLITE_InternChanges; + db->mDbFlags |= DBFLAG_SchemaChange; } /* @@ -90432,7 +104625,7 @@ SQLITE_PRIVATE char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ */ SQLITE_PRIVATE void sqlite3OpenMasterTable(Parse *p, int iDb){ Vdbe *v = sqlite3GetVdbe(p); - sqlite3TableLock(p, iDb, MASTER_ROOT, 1, SCHEMA_TABLE(iDb)); + sqlite3TableLock(p, iDb, MASTER_ROOT, 1, MASTER_NAME); sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, MASTER_ROOT, iDb, 5); if( p->nTab==0 ){ p->nTab = 1; @@ -90449,12 +104642,11 @@ SQLITE_PRIVATE int sqlite3FindDbName(sqlite3 *db, const char *zName){ int i = -1; /* Database number */ if( zName ){ Db *pDb; - int n = sqlite3Strlen30(zName); for(i=(db->nDb-1), pDb=&db->aDb[i]; i>=0; i--, pDb--){ - if( (!OMIT_TEMPDB || i!=1 ) && n==sqlite3Strlen30(pDb->zName) && - 0==sqlite3StrICmp(pDb->zName, zName) ){ - break; - } + if( 0==sqlite3_stricmp(pDb->zDbSName, zName) ) break; + /* "main" is always an acceptable alias for the primary database + ** even if it has been renamed using SQLITE_DBCONFIG_MAINDBNAME. */ + if( i==0 && 0==sqlite3_stricmp("main", zName) ) break; } } return i; @@ -90500,21 +104692,21 @@ SQLITE_PRIVATE int sqlite3TwoPartName( int iDb; /* Database holding the object */ sqlite3 *db = pParse->db; - if( ALWAYS(pName2!=0) && pName2->n>0 ){ + assert( pName2!=0 ); + if( pName2->n>0 ){ if( db->init.busy ) { sqlite3ErrorMsg(pParse, "corrupt database"); - pParse->nErr++; return -1; } *pUnqual = pName2; iDb = sqlite3FindDb(db, pName1); if( iDb<0 ){ sqlite3ErrorMsg(pParse, "unknown database %T", pName1); - pParse->nErr++; return -1; } }else{ - assert( db->init.iDb==0 || db->init.busy ); + assert( db->init.iDb==0 || db->init.busy + || (db->mDbFlags & DBFLAG_Vacuum)!=0); iDb = db->init.iDb; *pUnqual = pName1; } @@ -90591,62 +104783,46 @@ SQLITE_PRIVATE void sqlite3StartTable( int iDb; /* Database number to create the table in */ Token *pName; /* Unqualified name of the table to create */ - /* The table or view name to create is passed to this routine via tokens - ** pName1 and pName2. If the table name was fully qualified, for example: - ** - ** CREATE TABLE xxx.yyy (...); - ** - ** Then pName1 is set to "xxx" and pName2 "yyy". On the other hand if - ** the table name is not fully qualified, i.e.: - ** - ** CREATE TABLE yyy(...); - ** - ** Then pName1 is set to "yyy" and pName2 is "". - ** - ** The call below sets the pName pointer to point at the token (pName1 or - ** pName2) that stores the unqualified table name. The variable iDb is - ** set to the index of the database that the table or view is to be - ** created in. - */ - iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); - if( iDb<0 ) return; - if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){ - /* If creating a temp table, the name may not be qualified. Unless - ** the database name is "temp" anyway. */ - sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); - return; + if( db->init.busy && db->init.newTnum==1 ){ + /* Special case: Parsing the sqlite_master or sqlite_temp_master schema */ + iDb = db->init.iDb; + zName = sqlite3DbStrDup(db, SCHEMA_TABLE(iDb)); + pName = pName1; + }else{ + /* The common case */ + iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName); + if( iDb<0 ) return; + if( !OMIT_TEMPDB && isTemp && pName2->n>0 && iDb!=1 ){ + /* If creating a temp table, the name may not be qualified. Unless + ** the database name is "temp" anyway. */ + sqlite3ErrorMsg(pParse, "temporary table name must be unqualified"); + return; + } + if( !OMIT_TEMPDB && isTemp ) iDb = 1; + zName = sqlite3NameFromToken(db, pName); } - if( !OMIT_TEMPDB && isTemp ) iDb = 1; - pParse->sNameToken = *pName; - zName = sqlite3NameFromToken(db, pName); if( zName==0 ) return; if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto begin_table_error; } if( db->init.iDb==1 ) isTemp = 1; #ifndef SQLITE_OMIT_AUTHORIZATION - assert( (isTemp & 1)==isTemp ); + assert( isTemp==0 || isTemp==1 ); + assert( isView==0 || isView==1 ); { - int code; - char *zDb = db->aDb[iDb].zName; + static const u8 aCode[] = { + SQLITE_CREATE_TABLE, + SQLITE_CREATE_TEMP_TABLE, + SQLITE_CREATE_VIEW, + SQLITE_CREATE_TEMP_VIEW + }; + char *zDb = db->aDb[iDb].zDbSName; if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ goto begin_table_error; } - if( isView ){ - if( !OMIT_TEMPDB && isTemp ){ - code = SQLITE_CREATE_TEMP_VIEW; - }else{ - code = SQLITE_CREATE_VIEW; - } - }else{ - if( !OMIT_TEMPDB && isTemp ){ - code = SQLITE_CREATE_TEMP_TABLE; - }else{ - code = SQLITE_CREATE_TABLE; - } - } - if( !isVirtual && sqlite3AuthCheck(pParse, code, zName, 0, zDb) ){ + if( !isVirtual && sqlite3AuthCheck(pParse, (int)aCode[isTemp+2*isView], + zName, 0, zDb) ){ goto begin_table_error; } } @@ -90660,7 +104836,7 @@ SQLITE_PRIVATE void sqlite3StartTable( ** collisions. */ if( !IN_DECLARE_VTAB ){ - char *zDb = db->aDb[iDb].zName; + char *zDb = db->aDb[iDb].zDbSName; if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ goto begin_table_error; } @@ -90669,7 +104845,7 @@ SQLITE_PRIVATE void sqlite3StartTable( if( !noErr ){ sqlite3ErrorMsg(pParse, "table %T already exists", pName); }else{ - assert( !db->init.busy ); + assert( !db->init.busy || CORRUPT_DB ); sqlite3CodeVerifySchema(pParse, iDb); } goto begin_table_error; @@ -90682,16 +104858,20 @@ SQLITE_PRIVATE void sqlite3StartTable( pTable = sqlite3DbMallocZero(db, sizeof(Table)); if( pTable==0 ){ - db->mallocFailed = 1; - pParse->rc = SQLITE_NOMEM; + assert( db->mallocFailed ); + pParse->rc = SQLITE_NOMEM_BKPT; pParse->nErr++; goto begin_table_error; } pTable->zName = zName; pTable->iPKey = -1; pTable->pSchema = db->aDb[iDb].pSchema; - pTable->nRef = 1; + pTable->nTabRef = 1; +#ifdef SQLITE_DEFAULT_ROWEST + pTable->nRowLogEst = sqlite3LogEst(SQLITE_DEFAULT_ROWEST); +#else pTable->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); +#endif assert( pParse->pNewTable==0 ); pParse->pNewTable = pTable; @@ -90715,10 +104895,12 @@ SQLITE_PRIVATE void sqlite3StartTable( ** now. */ if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ - int j1; + int addr1; int fileFormat; int reg1, reg2, reg3; - sqlite3BeginWriteOperation(pParse, 0, iDb); + /* nullRow[] is an OP_Record encoding of a row containing 5 NULLs */ + static const char nullRow[] = { 6, 0, 0, 0, 0, 0 }; + sqlite3BeginWriteOperation(pParse, 1, iDb); #ifndef SQLITE_OMIT_VIRTUALTABLE if( isVirtual ){ @@ -90734,14 +104916,12 @@ SQLITE_PRIVATE void sqlite3StartTable( reg3 = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT); sqlite3VdbeUsesBtree(v, iDb); - j1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? 1 : SQLITE_MAX_FILE_FORMAT; - sqlite3VdbeAddOp2(v, OP_Integer, fileFormat, reg3); - sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, reg3); - sqlite3VdbeAddOp2(v, OP_Integer, ENC(db), reg3); - sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, reg3); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, fileFormat); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, ENC(db)); + sqlite3VdbeJumpHere(v, addr1); /* This just creates a place-holder record in the sqlite_master table. ** The record created does not contain anything yet. It will be replaced @@ -90758,11 +104938,12 @@ SQLITE_PRIVATE void sqlite3StartTable( }else #endif { - pParse->addrCrTab = sqlite3VdbeAddOp2(v, OP_CreateTable, iDb, reg2); + pParse->addrCrTab = + sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); } sqlite3OpenMasterTable(pParse, iDb); sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1); - sqlite3VdbeAddOp2(v, OP_Null, 0, reg3); + sqlite3VdbeAddOp4(v, OP_Blob, 6, reg3, 0, nullRow, P4_STATIC); sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); sqlite3VdbeAddOp0(v, OP_Close); @@ -90777,18 +104958,19 @@ begin_table_error: return; } -/* -** This macro is used to compare two strings in a case-insensitive manner. -** It is slightly faster than calling sqlite3StrICmp() directly, but -** produces larger code. -** -** WARNING: This macro is not compatible with the strcmp() family. It -** returns true if the two strings are equal, otherwise false. +/* Set properties of a table column based on the (magical) +** name of the column. */ -#define STRICMP(x, y) (\ -sqlite3UpperToLower[*(unsigned char *)(x)]== \ -sqlite3UpperToLower[*(unsigned char *)(y)] \ -&& sqlite3StrICmp((x)+1,(y)+1)==0 ) +#if SQLITE_ENABLE_HIDDEN_COLUMNS +SQLITE_PRIVATE void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ + if( sqlite3_strnicmp(pCol->zName, "__hidden__", 10)==0 ){ + pCol->colFlags |= COLFLAG_HIDDEN; + }else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){ + pTab->tabFlags |= TF_OOOHidden; + } +} +#endif + /* ** Add a new column to the table currently being constructed. @@ -90798,23 +104980,25 @@ sqlite3UpperToLower[*(unsigned char *)(y)] \ ** first to get things going. Then this routine is called for each ** column. */ -SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName){ +SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ Table *p; int i; char *z; + char *zType; Column *pCol; sqlite3 *db = pParse->db; if( (p = pParse->pNewTable)==0 ) return; -#if SQLITE_MAX_COLUMN if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){ sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName); return; } -#endif - z = sqlite3NameFromToken(db, pName); + z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2); if( z==0 ) return; + memcpy(z, pName->z, pName->n); + z[pName->n] = 0; + sqlite3Dequote(z); for(i=0; i<p->nCol; i++){ - if( STRICMP(z, p->aCol[i].zName) ){ + if( sqlite3_stricmp(z, p->aCol[i].zName)==0 ){ sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); sqlite3DbFree(db, z); return; @@ -90832,14 +105016,28 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName){ pCol = &p->aCol[p->nCol]; memset(pCol, 0, sizeof(p->aCol[0])); pCol->zName = z; + sqlite3ColumnPropertiesFromName(p, pCol); - /* If there is no type specified, columns have the default affinity - ** 'NONE'. If there is a type specified, then sqlite3AddColumnType() will - ** be called next to set pCol->affinity correctly. - */ - pCol->affinity = SQLITE_AFF_NONE; - pCol->szEst = 1; + if( pType->n==0 ){ + /* If there is no type specified, columns have the default affinity + ** 'BLOB' with a default size of 4 bytes. */ + pCol->affinity = SQLITE_AFF_BLOB; + pCol->szEst = 1; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( 4>=sqlite3GlobalConfig.szSorterRef ){ + pCol->colFlags |= COLFLAG_SORTERREF; + } +#endif + }else{ + zType = z + sqlite3Strlen30(z) + 1; + memcpy(zType, pType->z, pType->n); + zType[pType->n] = 0; + sqlite3Dequote(zType); + pCol->affinity = sqlite3AffinityType(zType, pCol); + pCol->colFlags |= COLFLAG_HASTYPE; + } p->nCol++; + pParse->constraintName.n = 0; } /* @@ -90850,9 +105048,24 @@ SQLITE_PRIVATE void sqlite3AddColumn(Parse *pParse, Token *pName){ */ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ Table *p; + Column *pCol; p = pParse->pNewTable; if( p==0 || NEVER(p->nCol<1) ) return; - p->aCol[p->nCol-1].notNull = (u8)onError; + pCol = &p->aCol[p->nCol-1]; + pCol->notNull = (u8)onError; + p->tabFlags |= TF_HasNotNull; + + /* Set the uniqNotNull flag on any UNIQUE or PK indexes already created + ** on this column. */ + if( pCol->colFlags & COLFLAG_UNIQUE ){ + Index *pIdx; + for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ + assert( pIdx->nKeyCol==1 && pIdx->onError!=OE_None ); + if( pIdx->aiColumn[0]==p->nCol-1 ){ + pIdx->uniqNotNull = 1; + } + } + } } /* @@ -90872,7 +105085,7 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ ** 'CHAR' | SQLITE_AFF_TEXT ** 'CLOB' | SQLITE_AFF_TEXT ** 'TEXT' | SQLITE_AFF_TEXT -** 'BLOB' | SQLITE_AFF_NONE +** 'BLOB' | SQLITE_AFF_BLOB ** 'REAL' | SQLITE_AFF_REAL ** 'FLOA' | SQLITE_AFF_REAL ** 'DOUB' | SQLITE_AFF_REAL @@ -90880,12 +105093,12 @@ SQLITE_PRIVATE void sqlite3AddNotNull(Parse *pParse, int onError){ ** If none of the substrings in the above table are found, ** SQLITE_AFF_NUMERIC is returned. */ -SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){ +SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, Column *pCol){ u32 h = 0; char aff = SQLITE_AFF_NUMERIC; const char *zChar = 0; - if( zIn==0 ) return aff; + assert( zIn!=0 ); while( zIn[0] ){ h = (h<<8) + sqlite3UpperToLower[(*zIn)&0xff]; zIn++; @@ -90898,7 +105111,7 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){ aff = SQLITE_AFF_TEXT; }else if( h==(('b'<<24)+('l'<<16)+('o'<<8)+'b') /* BLOB */ && (aff==SQLITE_AFF_NUMERIC || aff==SQLITE_AFF_REAL) ){ - aff = SQLITE_AFF_NONE; + aff = SQLITE_AFF_BLOB; if( zIn[0]=='(' ) zChar = zIn; #ifndef SQLITE_OMIT_FLOATING_POINT }else if( h==(('r'<<24)+('e'<<16)+('a'<<8)+'l') /* REAL */ @@ -90917,52 +105130,36 @@ SQLITE_PRIVATE char sqlite3AffinityType(const char *zIn, u8 *pszEst){ } } - /* If pszEst is not NULL, store an estimate of the field size. The + /* If pCol is not NULL, store an estimate of the field size. The ** estimate is scaled so that the size of an integer is 1. */ - if( pszEst ){ - *pszEst = 1; /* default size is approx 4 bytes */ + if( pCol ){ + int v = 0; /* default size is approx 4 bytes */ if( aff<SQLITE_AFF_NUMERIC ){ if( zChar ){ while( zChar[0] ){ if( sqlite3Isdigit(zChar[0]) ){ - int v = 0; + /* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */ sqlite3GetInt32(zChar, &v); - v = v/4 + 1; - if( v>255 ) v = 255; - *pszEst = v; /* BLOB(k), VARCHAR(k), CHAR(k) -> r=(k/4+1) */ break; } zChar++; } }else{ - *pszEst = 5; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/ + v = 16; /* BLOB, TEXT, CLOB -> r=5 (approx 20 bytes)*/ } } +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( v>=sqlite3GlobalConfig.szSorterRef ){ + pCol->colFlags |= COLFLAG_SORTERREF; + } +#endif + v = v/4 + 1; + if( v>255 ) v = 255; + pCol->szEst = v; } return aff; } -/* -** This routine is called by the parser while in the middle of -** parsing a CREATE TABLE statement. The pFirst token is the first -** token in the sequence of tokens that describe the type of the -** column currently under construction. pLast is the last token -** in the sequence. Use this information to construct a string -** that contains the typename of the column and store that string -** in zType. -*/ -SQLITE_PRIVATE void sqlite3AddColumnType(Parse *pParse, Token *pType){ - Table *p; - Column *pCol; - - p = pParse->pNewTable; - if( p==0 || NEVER(p->nCol<1) ) return; - pCol = &p->aCol[p->nCol-1]; - assert( pCol->zType==0 ); - pCol->zType = sqlite3NameFromToken(pParse->db, pType); - pCol->affinity = sqlite3AffinityType(pCol->zType, &pCol->szEst); -} - /* ** The expression is the default value for the most recently added column ** of the table currently under construction. @@ -90973,29 +105170,61 @@ SQLITE_PRIVATE void sqlite3AddColumnType(Parse *pParse, Token *pType){ ** This routine is called by the parser while in the middle of ** parsing a CREATE TABLE statement. */ -SQLITE_PRIVATE void sqlite3AddDefaultValue(Parse *pParse, ExprSpan *pSpan){ +SQLITE_PRIVATE void sqlite3AddDefaultValue( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The parsed expression of the default value */ + const char *zStart, /* Start of the default value text */ + const char *zEnd /* First character past end of defaut value text */ +){ Table *p; Column *pCol; sqlite3 *db = pParse->db; p = pParse->pNewTable; if( p!=0 ){ pCol = &(p->aCol[p->nCol-1]); - if( !sqlite3ExprIsConstantOrFunction(pSpan->pExpr, db->init.busy) ){ + if( !sqlite3ExprIsConstantOrFunction(pExpr, db->init.busy) ){ sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", pCol->zName); }else{ /* A copy of pExpr is used instead of the original, as pExpr contains - ** tokens that point to volatile memory. The 'span' of the expression - ** is required by pragma table_info. + ** tokens that point to volatile memory. */ + Expr x; sqlite3ExprDelete(db, pCol->pDflt); - pCol->pDflt = sqlite3ExprDup(db, pSpan->pExpr, EXPRDUP_REDUCE); - sqlite3DbFree(db, pCol->zDflt); - pCol->zDflt = sqlite3DbStrNDup(db, (char*)pSpan->zStart, - (int)(pSpan->zEnd - pSpan->zStart)); + memset(&x, 0, sizeof(x)); + x.op = TK_SPAN; + x.u.zToken = sqlite3DbSpanDup(db, zStart, zEnd); + x.pLeft = pExpr; + x.flags = EP_Skip; + pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE); + sqlite3DbFree(db, x.u.zToken); } } - sqlite3ExprDelete(db, pSpan->pExpr); + sqlite3ExprDelete(db, pExpr); +} + +/* +** Backwards Compatibility Hack: +** +** Historical versions of SQLite accepted strings as column names in +** indexes and PRIMARY KEY constraints and in UNIQUE constraints. Example: +** +** CREATE TABLE xyz(a,b,c,d,e,PRIMARY KEY('a'),UNIQUE('b','c' COLLATE trim) +** CREATE INDEX abc ON xyz('c','d' DESC,'e' COLLATE nocase DESC); +** +** This is goofy. But to preserve backwards compatibility we continue to +** accept it. This routine does the necessary conversion. It converts +** the expression given in its argument from a TK_STRING into a TK_ID +** if the expression is just a TK_STRING with an optional COLLATE clause. +** If the epxression is anything other than TK_STRING, the expression is +** unchanged. +*/ +static void sqlite3StringToId(Expr *p){ + if( p->op==TK_STRING ){ + p->op = TK_ID; + }else if( p->op==TK_COLLATE && p->pLeft->op==TK_STRING ){ + p->pLeft->op = TK_ID; + } } /* @@ -91024,10 +105253,10 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( int sortOrder /* SQLITE_SO_ASC or SQLITE_SO_DESC */ ){ Table *pTab = pParse->pNewTable; - char *zType = 0; + Column *pCol = 0; int iCol = -1, i; int nTerm; - if( pTab==0 || IN_DECLARE_VTAB ) goto primary_key_exit; + if( pTab==0 ) goto primary_key_exit; if( pTab->tabFlags & TF_HasPrimaryKey ){ sqlite3ErrorMsg(pParse, "table \"%s\" has more than one primary key", pTab->zName); @@ -91036,24 +105265,31 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( pTab->tabFlags |= TF_HasPrimaryKey; if( pList==0 ){ iCol = pTab->nCol - 1; - pTab->aCol[iCol].colFlags |= COLFLAG_PRIMKEY; - zType = pTab->aCol[iCol].zType; + pCol = &pTab->aCol[iCol]; + pCol->colFlags |= COLFLAG_PRIMKEY; nTerm = 1; }else{ nTerm = pList->nExpr; for(i=0; i<nTerm; i++){ - for(iCol=0; iCol<pTab->nCol; iCol++){ - if( sqlite3StrICmp(pList->a[i].zName, pTab->aCol[iCol].zName)==0 ){ - pTab->aCol[iCol].colFlags |= COLFLAG_PRIMKEY; - zType = pTab->aCol[iCol].zType; - break; + Expr *pCExpr = sqlite3ExprSkipCollate(pList->a[i].pExpr); + assert( pCExpr!=0 ); + sqlite3StringToId(pCExpr); + if( pCExpr->op==TK_ID ){ + const char *zCName = pCExpr->u.zToken; + for(iCol=0; iCol<pTab->nCol; iCol++){ + if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){ + pCol = &pTab->aCol[iCol]; + pCol->colFlags |= COLFLAG_PRIMKEY; + break; + } } } } } if( nTerm==1 - && zType && sqlite3StrICmp(zType, "INTEGER")==0 - && sortOrder==SQLITE_SO_ASC + && pCol + && sqlite3StrICmp(sqlite3ColumnType(pCol,""), "INTEGER")==0 + && sortOrder!=SQLITE_SO_DESC ){ pTab->iPKey = iCol; pTab->keyConf = (u8)onError; @@ -91066,15 +105302,8 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( "INTEGER PRIMARY KEY"); #endif }else{ - Vdbe *v = pParse->pVdbe; - Index *p; - if( v ) pParse->addrSkipPK = sqlite3VdbeAddOp0(v, OP_Noop); - p = sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, - 0, sortOrder, 0); - if( p ){ - p->idxType = SQLITE_IDXTYPE_PRIMARYKEY; - if( v ) sqlite3VdbeJumpHere(v, pParse->addrSkipPK); - } + sqlite3CreateIndex(pParse, 0, 0, 0, pList, onError, 0, + 0, sortOrder, 0, SQLITE_IDXTYPE_PRIMARYKEY); pList = 0; } @@ -91193,15 +105422,16 @@ SQLITE_PRIVATE CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ ** set back to prior value. But schema changes are infrequent ** and the probability of hitting the same cookie value is only ** 1 chance in 2^32. So we're safe enough. +** +** IMPLEMENTATION-OF: R-34230-56049 SQLite automatically increments +** the schema-version whenever the schema changes. */ SQLITE_PRIVATE void sqlite3ChangeCookie(Parse *pParse, int iDb){ - int r1 = sqlite3GetTempReg(pParse); sqlite3 *db = pParse->db; Vdbe *v = pParse->pVdbe; assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); - sqlite3VdbeAddOp2(v, OP_Integer, db->aDb[iDb].pSchema->schema_cookie+1, r1); - sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, r1); - sqlite3ReleaseTempReg(pParse, r1); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_SCHEMA_VERSION, + (int)(1+(unsigned)db->aDb[iDb].pSchema->schema_cookie)); } /* @@ -91283,7 +105513,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){ n += 35 + 6*p->nCol; zStmt = sqlite3DbMallocRaw(0, n); if( zStmt==0 ){ - db->mallocFailed = 1; + sqlite3OomFault(db); return 0; } sqlite3_snprintf(n, zStmt, "CREATE TABLE "); @@ -91292,7 +105522,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){ zStmt[k++] = '('; for(pCol=p->aCol, i=0; i<p->nCol; i++, pCol++){ static const char * const azType[] = { - /* SQLITE_AFF_NONE */ "", + /* SQLITE_AFF_BLOB */ "", /* SQLITE_AFF_TEXT */ " TEXT", /* SQLITE_AFF_NUMERIC */ " NUM", /* SQLITE_AFF_INTEGER */ " INT", @@ -91305,17 +105535,17 @@ static char *createTableStmt(sqlite3 *db, Table *p){ k += sqlite3Strlen30(&zStmt[k]); zSep = zSep2; identPut(zStmt, &k, pCol->zName); - assert( pCol->affinity-SQLITE_AFF_NONE >= 0 ); - assert( pCol->affinity-SQLITE_AFF_NONE < ArraySize(azType) ); - testcase( pCol->affinity==SQLITE_AFF_NONE ); + assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 ); + assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) ); + testcase( pCol->affinity==SQLITE_AFF_BLOB ); testcase( pCol->affinity==SQLITE_AFF_TEXT ); testcase( pCol->affinity==SQLITE_AFF_NUMERIC ); testcase( pCol->affinity==SQLITE_AFF_INTEGER ); testcase( pCol->affinity==SQLITE_AFF_REAL ); - zType = azType[pCol->affinity - SQLITE_AFF_NONE]; + zType = azType[pCol->affinity - SQLITE_AFF_BLOB]; len = sqlite3Strlen30(zType); - assert( pCol->affinity==SQLITE_AFF_NONE + assert( pCol->affinity==SQLITE_AFF_BLOB || pCol->affinity==sqlite3AffinityType(zType, 0) ); memcpy(&zStmt[k], zType, len); k += len; @@ -91336,9 +105566,9 @@ static int resizeIndexObject(sqlite3 *db, Index *pIdx, int N){ assert( pIdx->isResized==0 ); nByte = (sizeof(char*) + sizeof(i16) + 1)*N; zExtra = sqlite3DbMallocZero(db, nByte); - if( zExtra==0 ) return SQLITE_NOMEM; + if( zExtra==0 ) return SQLITE_NOMEM_BKPT; memcpy(zExtra, pIdx->azColl, sizeof(char*)*pIdx->nColumn); - pIdx->azColl = (char**)zExtra; + pIdx->azColl = (const char**)zExtra; zExtra += sizeof(char*)*N; memcpy(zExtra, pIdx->aiColumn, sizeof(i16)*pIdx->nColumn); pIdx->aiColumn = (i16*)zExtra; @@ -91393,21 +105623,22 @@ static int hasColumn(const i16 *aiCol, int nCol, int x){ ** are appropriate for a WITHOUT ROWID table instead of a rowid table. ** Changes include: ** -** (1) Convert the OP_CreateTable into an OP_CreateIndex. There is -** no rowid btree for a WITHOUT ROWID. Instead, the canonical -** data storage is a covering index btree. -** (2) Bypass the creation of the sqlite_master table entry +** (1) Set all columns of the PRIMARY KEY schema object to be NOT NULL. +** (2) Convert P3 parameter of the OP_CreateBtree from BTREE_INTKEY +** into BTREE_BLOBKEY. +** (3) Bypass the creation of the sqlite_master table entry ** for the PRIMARY KEY as the primary key index is now ** identified by the sqlite_master table entry of the table itself. -** (3) Set the Index.tnum of the PRIMARY KEY Index object in the +** (4) Set the Index.tnum of the PRIMARY KEY Index object in the ** schema to the rootpage from the main table. -** (4) Set all columns of the PRIMARY KEY schema object to be NOT NULL. ** (5) Add all table columns to the PRIMARY KEY Index object ** so that the PRIMARY KEY is a covering index. The surplus -** columns are part of KeyInfo.nXField and are not used for +** columns are part of KeyInfo.nAllField and are not used for ** sorting or lookup or uniqueness checks. ** (6) Replace the rowid tail on all automatically generated UNIQUE ** indices with the PRIMARY KEY columns. +** +** For virtual tables, only (1) is performed. */ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ Index *pIdx; @@ -91417,21 +105648,26 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ sqlite3 *db = pParse->db; Vdbe *v = pParse->pVdbe; - /* Convert the OP_CreateTable opcode that would normally create the - ** root-page for the table into an OP_CreateIndex opcode. The index - ** created will become the PRIMARY KEY index. + /* Mark every PRIMARY KEY column as NOT NULL (except for imposter tables) + */ + if( !db->init.imposterTable ){ + for(i=0; i<pTab->nCol; i++){ + if( (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 ){ + pTab->aCol[i].notNull = OE_Abort; + } + } + } + + /* The remaining transformations only apply to b-tree tables, not to + ** virtual tables */ + if( IN_DECLARE_VTAB ) return; + + /* Convert the P3 operand of the OP_CreateBtree opcode from BTREE_INTKEY + ** into BTREE_BLOBKEY. */ if( pParse->addrCrTab ){ assert( v ); - sqlite3VdbeGetOp(v, pParse->addrCrTab)->opcode = OP_CreateIndex; - } - - /* Bypass the creation of the PRIMARY KEY btree and the sqlite_master - ** table entry. - */ - if( pParse->addrSkipPK ){ - assert( v ); - sqlite3VdbeGetOp(v, pParse->addrSkipPK)->opcode = OP_Goto; + sqlite3VdbeChangeP3(v, pParse->addrCrTab, BTREE_BLOBKEY); } /* Locate the PRIMARY KEY index. Or, if this table was originally @@ -91439,18 +105675,21 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ */ if( pTab->iPKey>=0 ){ ExprList *pList; - pList = sqlite3ExprListAppend(pParse, 0, 0); + Token ipkToken; + sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); if( pList==0 ) return; - pList->a[0].zName = sqlite3DbStrDup(pParse->db, - pTab->aCol[pTab->iPKey].zName); pList->a[0].sortOrder = pParse->iPkSortOrder; assert( pParse->pNewTable==pTab ); - pPk = sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0); - if( pPk==0 ) return; - pPk->idxType = SQLITE_IDXTYPE_PRIMARYKEY; + sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, + SQLITE_IDXTYPE_PRIMARYKEY); + if( db->mallocFailed ) return; + pPk = sqlite3PrimaryKeyIndex(pTab); pTab->iPKey = -1; }else{ pPk = sqlite3PrimaryKeyIndex(pTab); + /* ** Remove all redundant columns from the PRIMARY KEY. For example, change ** "PRIMARY KEY(a,b,a,b,c,b,c,d)" into just "PRIMARY KEY(a,b,c,d)". Later @@ -91465,15 +105704,19 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ } pPk->nKeyCol = j; } - pPk->isCovering = 1; assert( pPk!=0 ); + pPk->isCovering = 1; + if( !db->init.imposterTable ) pPk->uniqNotNull = 1; nPk = pPk->nKeyCol; - /* Make sure every column of the PRIMARY KEY is NOT NULL */ - for(i=0; i<nPk; i++){ - pTab->aCol[pPk->aiColumn[i]].notNull = 1; + /* Bypass the creation of the PRIMARY KEY btree and the sqlite_master + ** table entry. This is only required if currently generating VDBE + ** code for a CREATE TABLE (not when parsing one as part of reading + ** a database schema). */ + if( v && pPk->tnum>0 ){ + assert( db->init.busy==0 ); + sqlite3VdbeChangeOpcode(v, pPk->tnum, OP_Goto); } - pPk->uniqNotNull = 1; /* The root page of the PRIMARY KEY is the table root page */ pPk->tnum = pTab->tnum; @@ -91512,7 +105755,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ if( !hasColumn(pPk->aiColumn, j, i) ){ assert( j<pPk->nColumn ); pPk->aiColumn[j] = i; - pPk->azColl[j] = "BINARY"; + pPk->azColl[j] = sqlite3StrBINARY; j++; } } @@ -91555,22 +105798,29 @@ SQLITE_PRIVATE void sqlite3EndTable( int iDb; /* Database in which the table lives */ Index *pIdx; /* An implied index of the table */ - if( (pEnd==0 && pSelect==0) || db->mallocFailed ){ + if( pEnd==0 && pSelect==0 ){ return; } + assert( !db->mallocFailed ); p = pParse->pNewTable; if( p==0 ) return; - assert( !db->init.busy || !pSelect ); - /* If the db->init.busy is 1 it means we are reading the SQL off the ** "sqlite_master" or "sqlite_temp_master" table on the disk. ** So do not write to the disk again. Extract the root page number ** for the table from the db->init.newTnum field. (The page number ** should have been put there by the sqliteOpenCb routine.) + ** + ** If the root page number is 1, that means this is the sqlite_master + ** table itself. So mark it read-only. */ if( db->init.busy ){ + if( pSelect ){ + sqlite3ErrorMsg(pParse, ""); + return; + } p->tnum = db->init.newTnum; + if( p->tnum==1 ) p->tabFlags |= TF_Readonly; } /* Special processing for WITHOUT ROWID Tables */ @@ -91583,7 +105833,7 @@ SQLITE_PRIVATE void sqlite3EndTable( if( (p->tabFlags & TF_HasPrimaryKey)==0 ){ sqlite3ErrorMsg(pParse, "PRIMARY KEY missing on table %s", p->zName); }else{ - p->tabFlags |= TF_WithoutRowid; + p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; convertToWithoutRowidTable(pParse, p); } } @@ -91651,26 +105901,47 @@ SQLITE_PRIVATE void sqlite3EndTable( ** be redundant. */ if( pSelect ){ - SelectDest dest; - Table *pSelTab; + SelectDest dest; /* Where the SELECT should store results */ + int regYield; /* Register holding co-routine entry-point */ + int addrTop; /* Top of the co-routine */ + int regRec; /* A record to be insert into the new table */ + int regRowid; /* Rowid of the next row to insert */ + int addrInsLoop; /* Top of the loop for inserting rows */ + Table *pSelTab; /* A table that describes the SELECT results */ + regYield = ++pParse->nMem; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; assert(pParse->nTab==1); + sqlite3MayAbort(pParse); sqlite3VdbeAddOp3(v, OP_OpenWrite, 1, pParse->regRoot, iDb); sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); pParse->nTab = 2; - sqlite3SelectDestInit(&dest, SRT_Table, 1); + addrTop = sqlite3VdbeCurrentAddr(v) + 1; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); + if( pParse->nErr ) return; + pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect); + if( pSelTab==0 ) return; + assert( p->aCol==0 ); + p->nCol = pSelTab->nCol; + p->aCol = pSelTab->aCol; + pSelTab->nCol = 0; + pSelTab->aCol = 0; + sqlite3DeleteTable(db, pSelTab); + sqlite3SelectDestInit(&dest, SRT_Coroutine, regYield); sqlite3Select(pParse, pSelect, &dest); + if( pParse->nErr ) return; + sqlite3VdbeEndCoroutine(v, regYield); + sqlite3VdbeJumpHere(v, addrTop - 1); + addrInsLoop = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_MakeRecord, dest.iSdst, dest.nSdst, regRec); + sqlite3TableAffinity(v, p, 0); + sqlite3VdbeAddOp2(v, OP_NewRowid, 1, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, 1, regRec, regRowid); + sqlite3VdbeGoto(v, addrInsLoop); + sqlite3VdbeJumpHere(v, addrInsLoop); sqlite3VdbeAddOp1(v, OP_Close, 1); - if( pParse->nErr==0 ){ - pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect); - if( pSelTab==0 ) return; - assert( p->aCol==0 ); - p->nCol = pSelTab->nCol; - p->aCol = pSelTab->aCol; - pSelTab->nCol = 0; - pSelTab->aCol = 0; - sqlite3DeleteTable(db, pSelTab); - } } /* Compute the complete text of the CREATE statement */ @@ -91693,7 +105964,7 @@ SQLITE_PRIVATE void sqlite3EndTable( "UPDATE %Q.%s " "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q " "WHERE rowid=#%d", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), + db->aDb[iDb].zDbSName, MASTER_NAME, zType, p->zName, p->zName, @@ -91708,13 +105979,13 @@ SQLITE_PRIVATE void sqlite3EndTable( /* Check to see if we need to create an sqlite_sequence table for ** keeping track of autoincrement keys. */ - if( p->tabFlags & TF_Autoincrement ){ + if( (p->tabFlags & TF_Autoincrement)!=0 ){ Db *pDb = &db->aDb[iDb]; assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( pDb->pSchema->pSeqTab==0 ){ sqlite3NestedParse(pParse, "CREATE TABLE %Q.sqlite_sequence(name,seq)", - pDb->zName + pDb->zDbSName ); } } @@ -91735,11 +106006,11 @@ SQLITE_PRIVATE void sqlite3EndTable( pOld = sqlite3HashInsert(&pSchema->tblHash, p->zName, p); if( pOld ){ assert( p==pOld ); /* Malloc must have failed inside HashInsert() */ - db->mallocFailed = 1; + sqlite3OomFault(db); return; } pParse->pNewTable = 0; - db->flags |= SQLITE_InternChanges; + db->mDbFlags |= DBFLAG_SchemaChange; #ifndef SQLITE_OMIT_ALTERTABLE if( !p->pSelect ){ @@ -91765,6 +106036,7 @@ SQLITE_PRIVATE void sqlite3CreateView( Token *pBegin, /* The CREATE token that begins the statement */ Token *pName1, /* The token that holds the name of the view */ Token *pName2, /* The token that holds the name of the view */ + ExprList *pCNames, /* Optional list of view column names */ Select *pSelect, /* A SELECT statement that will become the new view */ int isTemp, /* TRUE for a TEMPORARY view */ int noErr /* Suppress error messages if VIEW already exists */ @@ -91780,22 +106052,15 @@ SQLITE_PRIVATE void sqlite3CreateView( if( pParse->nVar>0 ){ sqlite3ErrorMsg(pParse, "parameters are not allowed in views"); - sqlite3SelectDelete(db, pSelect); - return; + goto create_view_fail; } sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr); p = pParse->pNewTable; - if( p==0 || pParse->nErr ){ - sqlite3SelectDelete(db, pSelect); - return; - } + if( p==0 || pParse->nErr ) goto create_view_fail; sqlite3TwoPartName(pParse, pName1, pName2, &pName); iDb = sqlite3SchemaToIndex(db, p->pSchema); sqlite3FixInit(&sFix, pParse, iDb, "view", pName); - if( sqlite3FixSelect(&sFix, pSelect) ){ - sqlite3SelectDelete(db, pSelect); - return; - } + if( sqlite3FixSelect(&sFix, pSelect) ) goto create_view_fail; /* Make a copy of the entire SELECT statement that defines the view. ** This will force all the Expr.token.z values to be dynamically @@ -91803,30 +106068,31 @@ SQLITE_PRIVATE void sqlite3CreateView( ** they will persist after the current sqlite3_exec() call returns. */ p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); - sqlite3SelectDelete(db, pSelect); - if( db->mallocFailed ){ - return; - } - if( !db->init.busy ){ - sqlite3ViewGetColumnNames(pParse, p); - } + p->pCheck = sqlite3ExprListDup(db, pCNames, EXPRDUP_REDUCE); + if( db->mallocFailed ) goto create_view_fail; /* Locate the end of the CREATE VIEW statement. Make sEnd point to ** the end. */ sEnd = pParse->sLastToken; - if( ALWAYS(sEnd.z[0]!=0) && sEnd.z[0]!=';' ){ + assert( sEnd.z[0]!=0 || sEnd.n==0 ); + if( sEnd.z[0]!=';' ){ sEnd.z += sEnd.n; } sEnd.n = 0; n = (int)(sEnd.z - pBegin->z); + assert( n>0 ); z = pBegin->z; - while( ALWAYS(n>0) && sqlite3Isspace(z[n-1]) ){ n--; } + while( sqlite3Isspace(z[n-1]) ){ n--; } sEnd.z = &z[n-1]; sEnd.n = 1; /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */ sqlite3EndTable(pParse, 0, &sEnd, 0, 0); + +create_view_fail: + sqlite3SelectDelete(db, pSelect); + sqlite3ExprListDelete(db, pCNames); return; } #endif /* SQLITE_OMIT_VIEW */ @@ -91843,13 +106109,21 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ int nErr = 0; /* Number of errors encountered */ int n; /* Temporarily holds the number of cursors assigned */ sqlite3 *db = pParse->db; /* Database connection for malloc errors */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + int rc; +#endif +#ifndef SQLITE_OMIT_AUTHORIZATION sqlite3_xauth xAuth; /* Saved xAuth pointer */ +#endif assert( pTable ); #ifndef SQLITE_OMIT_VIRTUALTABLE - if( sqlite3VtabCallConnect(pParse, pTable) ){ - return SQLITE_ERROR; + db->nSchemaLock++; + rc = sqlite3VtabCallConnect(pParse, pTable); + db->nSchemaLock--; + if( rc ){ + return 1; } if( IsVirtual(pTable) ) return 0; #endif @@ -91891,11 +106165,10 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ assert( pTable->pSelect ); pSel = sqlite3SelectDup(db, pTable->pSelect, 0); if( pSel ){ - u8 enableLookaside = db->lookaside.bEnabled; n = pParse->nTab; sqlite3SrcListAssignCursors(pParse, pSel->pSrc); pTable->nCol = -1; - db->lookaside.bEnabled = 0; + db->lookaside.bDisable++; #ifndef SQLITE_OMIT_AUTHORIZATION xAuth = db->xAuth; db->xAuth = 0; @@ -91904,25 +106177,43 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #else pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); #endif - db->lookaside.bEnabled = enableLookaside; pParse->nTab = n; - if( pSelTab ){ + if( pTable->pCheck ){ + /* CREATE VIEW name(arglist) AS ... + ** The names of the columns in the table are taken from + ** arglist which is stored in pTable->pCheck. The pCheck field + ** normally holds CHECK constraints on an ordinary table, but for + ** a VIEW it holds the list of column names. + */ + sqlite3ColumnsFromExprList(pParse, pTable->pCheck, + &pTable->nCol, &pTable->aCol); + if( db->mallocFailed==0 + && pParse->nErr==0 + && pTable->nCol==pSel->pEList->nExpr + ){ + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel); + } + }else if( pSelTab ){ + /* CREATE VIEW name AS... without an argument list. Construct + ** the column names from the SELECT statement that defines the view. + */ assert( pTable->aCol==0 ); pTable->nCol = pSelTab->nCol; pTable->aCol = pSelTab->aCol; pSelTab->nCol = 0; pSelTab->aCol = 0; - sqlite3DeleteTable(db, pSelTab); assert( sqlite3SchemaMutexHeld(db, 0, pTable->pSchema) ); - pTable->pSchema->schemaFlags |= DB_UnresetViews; }else{ pTable->nCol = 0; nErr++; } + sqlite3DeleteTable(db, pSelTab); sqlite3SelectDelete(db, pSel); + db->lookaside.bDisable--; } else { nErr++; } + pTable->pSchema->schemaFlags |= DB_UnresetViews; #endif /* SQLITE_OMIT_VIEW */ return nErr; } @@ -91939,7 +106230,7 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){ for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ Table *pTab = sqliteHashData(i); if( pTab->pSelect ){ - sqliteDeleteColumnNames(db, pTab); + sqlite3DeleteColumnNames(db, pTab); pTab->aCol = 0; pTab->nCol = 0; } @@ -92001,6 +106292,7 @@ SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iT static void destroyRootPage(Parse *pParse, int iTable, int iDb){ Vdbe *v = sqlite3GetVdbe(pParse); int r1 = sqlite3GetTempReg(pParse); + assert( iTable>1 ); sqlite3VdbeAddOp3(v, OP_Destroy, iTable, r1, iDb); sqlite3MayAbort(pParse); #ifndef SQLITE_OMIT_AUTOVACUUM @@ -92015,7 +106307,7 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ */ sqlite3NestedParse(pParse, "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", - pParse->db->aDb[iDb].zName, SCHEMA_TABLE(iDb), iTable, r1, r1); + pParse->db->aDb[iDb].zDbSName, MASTER_NAME, iTable, r1, r1); #endif sqlite3ReleaseTempReg(pParse, r1); } @@ -92027,14 +106319,6 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ ** is also added (this can happen with an auto-vacuum database). */ static void destroyTable(Parse *pParse, Table *pTab){ -#ifdef SQLITE_OMIT_AUTOVACUUM - Index *pIdx; - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - destroyRootPage(pParse, pTab->tnum, iDb); - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - destroyRootPage(pParse, pIdx->tnum, iDb); - } -#else /* If the database may be auto-vacuum capable (if SQLITE_OMIT_AUTOVACUUM ** is not defined), then it is important to call OP_Destroy on the ** table and index root-pages in order, starting with the numerically @@ -92077,7 +106361,6 @@ static void destroyTable(Parse *pParse, Table *pTab){ iDestroyed = iLargest; } } -#endif } /* @@ -92091,7 +106374,7 @@ static void sqlite3ClearStatTables( const char *zName /* Name of index or table */ ){ int i; - const char *zDbName = pParse->db->aDb[iDb].zName; + const char *zDbName = pParse->db->aDb[iDb].zDbSName; for(i=1; i<=4; i++){ char zTab[24]; sqlite3_snprintf(sizeof(zTab),zTab,"sqlite_stat%d",i); @@ -92144,7 +106427,7 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in if( pTab->tabFlags & TF_Autoincrement ){ sqlite3NestedParse(pParse, "DELETE FROM %Q.sqlite_sequence WHERE name=%Q", - pDb->zName, pTab->zName + pDb->zDbSName, pTab->zName ); } #endif @@ -92158,7 +106441,7 @@ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, in */ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", - pDb->zName, SCHEMA_TABLE(iDb), pTab->zName); + pDb->zDbSName, MASTER_NAME, pTab->zName); if( !isView && !IsVirtual(pTab) ){ destroyTable(pParse, pTab); } @@ -92189,7 +106472,9 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, } assert( pParse->nErr==0 ); assert( pName->nSrc==1 ); + if( sqlite3ReadSchema(pParse) ) goto exit_drop_table; if( noErr ) db->suppressErr++; + assert( isView==0 || isView==LOCATE_VIEW ); pTab = sqlite3LocateTableItem(pParse, isView, &pName->a[0]); if( noErr ) db->suppressErr--; @@ -92210,7 +106495,7 @@ SQLITE_PRIVATE void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, { int code; const char *zTab = SCHEMA_TABLE(iDb); - const char *zDb = db->aDb[iDb].zName; + const char *zDb = db->aDb[iDb].zDbSName; const char *zArg2 = 0; if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb)){ goto exit_drop_table; @@ -92385,7 +106670,7 @@ SQLITE_PRIVATE void sqlite3CreateForeignKey( pFKey->zTo, (void *)pFKey ); if( pNextTo==pFKey ){ - db->mallocFailed = 1; + sqlite3OomFault(db); goto fk_end; } if( pNextTo ){ @@ -92451,7 +106736,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ #ifndef SQLITE_OMIT_AUTHORIZATION if( sqlite3AuthCheck(pParse, SQLITE_REINDEX, pIndex->zName, 0, - db->aDb[iDb].zName ) ){ + db->aDb[iDb].zDbSName ) ){ return; } #endif @@ -92467,6 +106752,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ tnum = pIndex->tnum; } pKey = sqlite3KeyInfoOfIndex(pParse, pIndex); + assert( pKey!=0 || db->mallocFailed || pParse->nErr ); /* Open the sorter cursor if we are to use one. */ iSorter = pParse->nTab++; @@ -92478,6 +106764,7 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, 0); VdbeCoverage(v); regRecord = sqlite3GetTempReg(pParse); + sqlite3MultiWrite(pParse); sqlite3GenerateIndexKey(pParse,pIndex,iTab,regRecord,0,&iPartIdxLabel,0,0); sqlite3VdbeAddOp2(v, OP_SorterInsert, iSorter, regRecord); @@ -92490,19 +106777,20 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){ sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR|((memRootPage>=0)?OPFLAG_P2ISREG:0)); addr1 = sqlite3VdbeAddOp2(v, OP_SorterSort, iSorter, 0); VdbeCoverage(v); - assert( pKey!=0 || db->mallocFailed || pParse->nErr ); - if( IsUniqueIndex(pIndex) && pKey!=0 ){ - int j2 = sqlite3VdbeCurrentAddr(v) + 3; - sqlite3VdbeAddOp2(v, OP_Goto, 0, j2); + if( IsUniqueIndex(pIndex) ){ + int j2 = sqlite3VdbeGoto(v, 1); addr2 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeVerifyAbortable(v, OE_Abort); sqlite3VdbeAddOp4Int(v, OP_SorterCompare, iSorter, j2, regRecord, pIndex->nKeyCol); VdbeCoverage(v); sqlite3UniqueConstraint(pParse, OE_Abort, pIndex); + sqlite3VdbeJumpHere(v, j2); }else{ addr2 = sqlite3VdbeCurrentAddr(v); } sqlite3VdbeAddOp3(v, OP_SorterData, iSorter, regRecord, iIdx); - sqlite3VdbeAddOp3(v, OP_IdxInsert, iIdx, regRecord, 1); + sqlite3VdbeAddOp1(v, OP_SeekEnd, iIdx); + sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); sqlite3ReleaseTempReg(pParse, regRecord); sqlite3VdbeAddOp2(v, OP_SorterNext, iSorter, addr2); VdbeCoverage(v); @@ -92537,7 +106825,7 @@ SQLITE_PRIVATE Index *sqlite3AllocateIndexObject( p = sqlite3DbMallocZero(db, nByte + nExtra); if( p ){ char *pExtra = ((char*)p)+ROUND8(sizeof(Index)); - p->azColl = (char**)pExtra; pExtra += ROUND8(sizeof(char*)*nCol); + p->azColl = (const char**)pExtra; pExtra += ROUND8(sizeof(char*)*nCol); p->aiRowLogEst = (LogEst*)pExtra; pExtra += sizeof(LogEst)*(nCol+1); p->aiColumn = (i16*)pExtra; pExtra += sizeof(i16)*nCol; p->aSortOrder = (u8*)pExtra; @@ -92559,12 +106847,8 @@ SQLITE_PRIVATE Index *sqlite3AllocateIndexObject( ** pList is a list of columns to be indexed. pList will be NULL if this ** is a primary key or unique-constraint on the most recent column added ** to the table currently under construction. -** -** If the index is created successfully, return a pointer to the new Index -** structure. This is used by sqlite3AddPrimaryKey() to mark the index -** as the tables primary key (Index.idxType==SQLITE_IDXTYPE_PRIMARYKEY) */ -SQLITE_PRIVATE Index *sqlite3CreateIndex( +SQLITE_PRIVATE void sqlite3CreateIndex( Parse *pParse, /* All information about this parse */ Token *pName1, /* First part of index name. May be NULL */ Token *pName2, /* Second part of index name. May be NULL */ @@ -92574,9 +106858,9 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( Token *pStart, /* The CREATE token that begins this statement */ Expr *pPIWhere, /* WHERE clause for partial indices */ int sortOrder, /* Sort order of primary key when pList==NULL */ - int ifNotExist /* Omit error if index already exists */ + int ifNotExist, /* Omit error if index already exists */ + u8 idxType /* The index type */ ){ - Index *pRet = 0; /* Pointer to return */ Table *pTab = 0; /* Table to be indexed */ Index *pIndex = 0; /* The index to be created */ char *zName = 0; /* Name of the index */ @@ -92589,14 +106873,15 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( int iDb; /* Index of the database that is being written */ Token *pName = 0; /* Unqualified name of the index to create */ struct ExprList_item *pListItem; /* For looping over pList */ - const Column *pTabCol; /* A column in the table */ int nExtra = 0; /* Space allocated for zExtra[] */ int nExtraCol; /* Number of extra columns needed */ char *zExtra = 0; /* Extra space after the Index object */ Index *pPk = 0; /* PRIMARY KEY index for WITHOUT ROWID tables */ - assert( pParse->nErr==0 ); /* Never called with prior errors */ - if( db->mallocFailed || IN_DECLARE_VTAB ){ + if( db->mallocFailed || pParse->nErr>0 ){ + goto exit_create_index; + } + if( IN_DECLARE_VTAB && idxType!=SQLITE_IDXTYPE_PRIMARYKEY ){ goto exit_create_index; } if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ @@ -92662,7 +106947,11 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( #if SQLITE_USER_AUTHENTICATION && sqlite3UserAuthTable(pTab->zName)==0 #endif - && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 ){ +#ifdef SQLITE_ALLOW_SQLITE_MASTER_INDEX + && sqlite3StrICmp(&pTab->zName[7],"master")!=0 +#endif + && sqlite3StrNICmp(&pTab->zName[7],"altertab_",9)!=0 + ){ sqlite3ErrorMsg(pParse, "table %s may not be indexed", pTab->zName); goto exit_create_index; } @@ -92705,7 +106994,7 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( goto exit_create_index; } } - if( sqlite3FindIndex(db, zName, pDb->zName)!=0 ){ + if( sqlite3FindIndex(db, zName, pDb->zDbSName)!=0 ){ if( !ifNotExist ){ sqlite3ErrorMsg(pParse, "index %s already exists", zName); }else{ @@ -92722,13 +107011,20 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( if( zName==0 ){ goto exit_create_index; } + + /* Automatic index names generated from within sqlite3_declare_vtab() + ** must have names that are distinct from normal automatic index names. + ** The following statement converts "sqlite3_autoindex..." into + ** "sqlite3_butoindex..." in order to make the names distinct. + ** The "vtab_err.test" test demonstrates the need of this statement. */ + if( IN_DECLARE_VTAB ) zName[7]++; } /* Check for authorization to create an index. */ #ifndef SQLITE_OMIT_AUTHORIZATION { - const char *zDb = pDb->zName; + const char *zDb = pDb->zDbSName; if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(iDb), 0, zDb) ){ goto exit_create_index; } @@ -92745,11 +107041,17 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( ** So create a fake list to simulate this. */ if( pList==0 ){ - pList = sqlite3ExprListAppend(pParse, 0, 0); + Token prevCol; + Column *pCol = &pTab->aCol[pTab->nCol-1]; + pCol->colFlags |= COLFLAG_UNIQUE; + sqlite3TokenInit(&prevCol, pCol->zName); + pList = sqlite3ExprListAppend(pParse, 0, + sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); if( pList==0 ) goto exit_create_index; - pList->a[0].zName = sqlite3DbStrDup(pParse->db, - pTab->aCol[pTab->nCol-1].zName); - pList->a[0].sortOrder = (u8)sortOrder; + assert( pList->nExpr==1 ); + sqlite3ExprListSetSortOrder(pList, sortOrder); + }else{ + sqlite3ExprListCheckLength(pParse, pList, "index"); } /* Figure out how many bytes of space are required to store explicitly @@ -92757,8 +107059,8 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( */ for(i=0; i<pList->nExpr; i++){ Expr *pExpr = pList->a[i].pExpr; - if( pExpr ){ - assert( pExpr->op==TK_COLLATE ); + assert( pExpr!=0 ); + if( pExpr->op==TK_COLLATE ){ nExtra += (1 + sqlite3Strlen30(pExpr->u.zToken)); } } @@ -92781,7 +107083,7 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( pIndex->pTable = pTab; pIndex->onError = (u8)onError; pIndex->uniqNotNull = onError!=OE_None; - pIndex->idxType = pName ? SQLITE_IDXTYPE_APPDEF : SQLITE_IDXTYPE_UNIQUE; + pIndex->idxType = idxType; pIndex->pSchema = db->aDb[iDb].pSchema; pIndex->nKeyCol = pList->nExpr; if( pPIWhere ){ @@ -92799,35 +107101,54 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( sortOrderMask = 0; /* Ignore DESC */ } - /* Scan the names of the columns of the table to be indexed and - ** load the column indices into the Index structure. Report an error - ** if any column is not found. + /* Analyze the list of expressions that form the terms of the index and + ** report any errors. In the common case where the expression is exactly + ** a table column, store that column in aiColumn[]. For general expressions, + ** populate pIndex->aColExpr and store XN_EXPR (-2) in aiColumn[]. ** - ** TODO: Add a test to make sure that the same column is not named - ** more than once within the same index. Only the first instance of - ** the column will ever be used by the optimizer. Note that using the - ** same column more than once cannot be an error because that would - ** break backwards compatibility - it needs to be a warning. + ** TODO: Issue a warning if two or more columns of the index are identical. + ** TODO: Issue a warning if the table primary key is used as part of the + ** index key. */ for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){ - const char *zColName = pListItem->zName; - int requestedSortOrder; - char *zColl; /* Collation sequence name */ + Expr *pCExpr; /* The i-th index expression */ + int requestedSortOrder; /* ASC or DESC on the i-th expression */ + const char *zColl; /* Collation sequence name */ - for(j=0, pTabCol=pTab->aCol; j<pTab->nCol; j++, pTabCol++){ - if( sqlite3StrICmp(zColName, pTabCol->zName)==0 ) break; + sqlite3StringToId(pListItem->pExpr); + sqlite3ResolveSelfReference(pParse, pTab, NC_IdxExpr, pListItem->pExpr, 0); + if( pParse->nErr ) goto exit_create_index; + pCExpr = sqlite3ExprSkipCollate(pListItem->pExpr); + if( pCExpr->op!=TK_COLUMN ){ + if( pTab==pParse->pNewTable ){ + sqlite3ErrorMsg(pParse, "expressions prohibited in PRIMARY KEY and " + "UNIQUE constraints"); + goto exit_create_index; + } + if( pIndex->aColExpr==0 ){ + ExprList *pCopy = sqlite3ExprListDup(db, pList, 0); + pIndex->aColExpr = pCopy; + if( !db->mallocFailed ){ + assert( pCopy!=0 ); + pListItem = &pCopy->a[i]; + } + } + j = XN_EXPR; + pIndex->aiColumn[i] = XN_EXPR; + pIndex->uniqNotNull = 0; + }else{ + j = pCExpr->iColumn; + assert( j<=0x7fff ); + if( j<0 ){ + j = pTab->iPKey; + }else if( pTab->aCol[j].notNull==0 ){ + pIndex->uniqNotNull = 0; + } + pIndex->aiColumn[i] = (i16)j; } - if( j>=pTab->nCol ){ - sqlite3ErrorMsg(pParse, "table %s has no column named %s", - pTab->zName, zColName); - pParse->checkSchema = 1; - goto exit_create_index; - } - assert( j<=0x7fff ); - pIndex->aiColumn[i] = (i16)j; - if( pListItem->pExpr ){ + zColl = 0; + if( pListItem->pExpr->op==TK_COLLATE ){ int nColl; - assert( pListItem->pExpr->op==TK_COLLATE ); zColl = pListItem->pExpr->u.zToken; nColl = sqlite3Strlen30(zColl) + 1; assert( nExtra>=nColl ); @@ -92835,21 +107156,26 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( zColl = zExtra; zExtra += nColl; nExtra -= nColl; - }else{ + }else if( j>=0 ){ zColl = pTab->aCol[j].zColl; - if( !zColl ) zColl = "BINARY"; } + if( !zColl ) zColl = sqlite3StrBINARY; if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ goto exit_create_index; } pIndex->azColl[i] = zColl; requestedSortOrder = pListItem->sortOrder & sortOrderMask; pIndex->aSortOrder[i] = (u8)requestedSortOrder; - if( pTab->aCol[j].notNull==0 ) pIndex->uniqNotNull = 0; } + + /* Append the table key to the end of the index. For WITHOUT ROWID + ** tables (when pPk!=0) this will be the declared PRIMARY KEY. For + ** normal tables (when pPk==0) this will be the rowid. + */ if( pPk ){ for(j=0; j<pPk->nKeyCol; j++){ int x = pPk->aiColumn[j]; + assert( x>=0 ); if( hasColumn(pIndex->aiColumn, pIndex->nKeyCol, x) ){ pIndex->nColumn--; }else{ @@ -92861,12 +107187,26 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( } assert( i==pIndex->nColumn ); }else{ - pIndex->aiColumn[i] = -1; - pIndex->azColl[i] = "BINARY"; + pIndex->aiColumn[i] = XN_ROWID; + pIndex->azColl[i] = sqlite3StrBINARY; } sqlite3DefaultRowEst(pIndex); if( pParse->pNewTable==0 ) estimateIndexWidth(pIndex); + /* If this index contains every column of its table, then mark + ** it as a covering index */ + assert( HasRowid(pTab) + || pTab->iPKey<0 || sqlite3ColumnOfIndex(pIndex, pTab->iPKey)>=0 ); + if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ + pIndex->isCovering = 1; + for(j=0; j<pTab->nCol; j++){ + if( j==pTab->iPKey ) continue; + if( sqlite3ColumnOfIndex(pIndex,j)>=0 ) continue; + pIndex->isCovering = 0; + break; + } + } + if( pTab==pParse->pNewTable ){ /* This routine has been called to create an automatic index as a ** result of a PRIMARY KEY or UNIQUE clause on a column definition, or @@ -92900,10 +107240,11 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( for(k=0; k<pIdx->nKeyCol; k++){ const char *z1; const char *z2; + assert( pIdx->aiColumn[k]>=0 ); if( pIdx->aiColumn[k]!=pIndex->aiColumn[k] ) break; z1 = pIdx->azColl[k]; z2 = pIndex->azColl[k]; - if( z1!=z2 && sqlite3StrICmp(z1, z2) ) break; + if( sqlite3StrICmp(z1, z2) ) break; } if( k==pIdx->nKeyCol ){ if( pIdx->onError!=pIndex->onError ){ @@ -92922,6 +107263,7 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( pIdx->onError = pIndex->onError; } } + if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; goto exit_create_index; } } @@ -92930,17 +107272,19 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( /* Link the new Index structure to its table and to the other ** in-memory database structures. */ + assert( pParse->nErr==0 ); if( db->init.busy ){ Index *p; + assert( !IN_DECLARE_VTAB ); assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, pIndex); if( p ){ assert( p==pIndex ); /* Malloc must have failed */ - db->mallocFailed = 1; + sqlite3OomFault(db); goto exit_create_index; } - db->flags |= SQLITE_InternChanges; + db->mDbFlags |= DBFLAG_SchemaChange; if( pTblName!=0 ){ pIndex->tnum = db->init.newTnum; } @@ -92959,7 +107303,7 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( ** has just been created, it contains no data and the index initialization ** step can be skipped. */ - else if( pParse->nErr==0 && (HasRowid(pTab) || pTblName!=0) ){ + else if( HasRowid(pTab) || pTblName!=0 ){ Vdbe *v; char *zStmt; int iMem = ++pParse->nMem; @@ -92967,11 +107311,16 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( v = sqlite3GetVdbe(pParse); if( v==0 ) goto exit_create_index; - - /* Create the rootpage for the index - */ sqlite3BeginWriteOperation(pParse, 1, iDb); - sqlite3VdbeAddOp2(v, OP_CreateIndex, iDb, iMem); + + /* Create the rootpage for the index using CreateIndex. But before + ** doing so, code a Noop instruction and store its address in + ** Index.tnum. This is required in case this index is actually a + ** PRIMARY KEY and the table is actually a WITHOUT ROWID table. In + ** that case the convertToWithoutRowidTable() routine will replace + ** the Noop with a Goto to jump over the VDBE code generated below. */ + pIndex->tnum = sqlite3VdbeAddOp0(v, OP_Noop); + sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, iMem, BTREE_BLOBKEY); /* Gather the complete text of the CREATE INDEX statement into ** the zStmt variable @@ -92992,7 +107341,7 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( */ sqlite3NestedParse(pParse, "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), + db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName, pTab->zName, iMem, @@ -93008,8 +107357,10 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddParseSchemaOp(v, iDb, sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName)); - sqlite3VdbeAddOp1(v, OP_Expire, 0); + sqlite3VdbeAddOp0(v, OP_Expire); } + + sqlite3VdbeJumpHere(v, pIndex->tnum); } /* When adding an index to the list of indices for a table, make @@ -93031,7 +107382,6 @@ SQLITE_PRIVATE Index *sqlite3CreateIndex( pIndex->pNext = pOther->pNext; pOther->pNext = pIndex; } - pRet = pIndex; pIndex = 0; } @@ -93042,7 +107392,6 @@ exit_create_index: sqlite3ExprListDelete(db, pList); sqlite3SrcListDelete(db, pTblName); sqlite3DbFree(db, zName); - return pRet; } /* @@ -93070,11 +107419,15 @@ SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){ int nCopy = MIN(ArraySize(aVal), pIdx->nKeyCol); int i; + /* Indexes with default row estimates should not have stat1 data */ + assert( !pIdx->hasStat1 ); + /* Set the first entry (number of rows in the index) to the estimated - ** number of rows in the table. Or 10, if the estimated number of rows - ** in the table is less than that. */ + ** number of rows in the table, or half the number of rows in the table + ** for a partial index. But do not let the estimate drop below 10. */ a[0] = pIdx->pTable->nRowLogEst; - if( a[0]<33 ) a[0] = 33; assert( 33==sqlite3LogEst(10) ); + if( pIdx->pPartIdxWhere!=0 ) a[0] -= 10; assert( 10==sqlite3LogEst(2) ); + if( a[0]<33 ) a[0] = 33; assert( 33==sqlite3LogEst(10) ); /* Estimate that a[1] is 10, a[2] is 9, a[3] is 8, a[4] is 7, a[5] is ** 6 and each subsequent value (if any) is 5. */ @@ -93125,7 +107478,7 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists { int code = SQLITE_DROP_INDEX; Table *pTab = pIndex->pTable; - const char *zDb = db->aDb[iDb].zName; + const char *zDb = db->aDb[iDb].zDbSName; const char *zTab = SCHEMA_TABLE(iDb); if( sqlite3AuthCheck(pParse, SQLITE_DELETE, zTab, 0, zDb) ){ goto exit_drop_index; @@ -93143,7 +107496,7 @@ SQLITE_PRIVATE void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists sqlite3BeginWriteOperation(pParse, 1, iDb); sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE name=%Q AND type='index'", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pIndex->zName + db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName ); sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); sqlite3ChangeCookie(pParse, iDb); @@ -93234,7 +107587,7 @@ SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ sqlite3DbFree(db, pList->a[i].zName); } sqlite3DbFree(db, pList->a); - sqlite3DbFree(db, pList); + sqlite3DbFreeNN(db, pList); } /* @@ -93286,7 +107639,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge( /* Allocate additional space if needed */ if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; - int nAlloc = pSrc->nSrc+nExtra; + int nAlloc = pSrc->nSrc*2+nExtra; int nGot; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); @@ -93359,12 +107712,17 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( ){ struct SrcList_item *pItem; assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ + assert( db!=0 ); if( pList==0 ){ - pList = sqlite3DbMallocZero(db, sizeof(SrcList) ); + pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); if( pList==0 ) return 0; pList->nAlloc = 1; + pList->nSrc = 1; + memset(&pList->a[0], 0, sizeof(pList->a[0])); + pList->a[0].iCursor = -1; + }else{ + pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); } - pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); if( db->mallocFailed ){ sqlite3SrcListDelete(db, pList); return 0; @@ -93374,12 +107732,12 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppend( pDatabase = 0; } if( pDatabase ){ - Token *pTemp = pDatabase; - pDatabase = pTable; - pTable = pTemp; + pItem->zName = sqlite3NameFromToken(db, pDatabase); + pItem->zDatabase = sqlite3NameFromToken(db, pTable); + }else{ + pItem->zName = sqlite3NameFromToken(db, pTable); + pItem->zDatabase = 0; } - pItem->zName = sqlite3NameFromToken(db, pTable); - pItem->zDatabase = sqlite3NameFromToken(db, pDatabase); return pList; } @@ -93412,13 +107770,14 @@ SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ sqlite3DbFree(db, pItem->zDatabase); sqlite3DbFree(db, pItem->zName); sqlite3DbFree(db, pItem->zAlias); - sqlite3DbFree(db, pItem->zIndex); + if( pItem->fg.isIndexedBy ) sqlite3DbFree(db, pItem->u1.zIndexedBy); + if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); sqlite3DeleteTable(db, pItem->pTab); sqlite3SelectDelete(db, pItem->pSelect); sqlite3ExprDelete(db, pItem->pOn); sqlite3IdListDelete(db, pItem->pUsing); } - sqlite3DbFree(db, pList); + sqlite3DbFreeNN(db, pList); } /* @@ -93456,9 +107815,10 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( goto append_from_error; } p = sqlite3SrcListAppend(db, p, pTable, pDatabase); - if( p==0 || NEVER(p->nSrc==0) ){ + if( p==0 ){ goto append_from_error; } + assert( p->nSrc>0 ); pItem = &p->a[p->nSrc-1]; assert( pAlias!=0 ); if( pAlias->n ){ @@ -93483,19 +107843,41 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( */ SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ assert( pIndexedBy!=0 ); - if( p && ALWAYS(p->nSrc>0) ){ - struct SrcList_item *pItem = &p->a[p->nSrc-1]; - assert( pItem->notIndexed==0 && pItem->zIndex==0 ); + if( p && pIndexedBy->n>0 ){ + struct SrcList_item *pItem; + assert( p->nSrc>0 ); + pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); if( pIndexedBy->n==1 && !pIndexedBy->z ){ /* A "NOT INDEXED" clause was supplied. See parse.y ** construct "indexed_opt" for details. */ - pItem->notIndexed = 1; + pItem->fg.notIndexed = 1; }else{ - pItem->zIndex = sqlite3NameFromToken(pParse->db, pIndexedBy); + pItem->u1.zIndexedBy = sqlite3NameFromToken(pParse->db, pIndexedBy); + pItem->fg.isIndexedBy = 1; } } } +/* +** Add the list of function arguments to the SrcList entry for a +** table-valued-function. +*/ +SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList *pList){ + if( p ){ + struct SrcList_item *pItem = &p->a[p->nSrc-1]; + assert( pItem->fg.notIndexed==0 ); + assert( pItem->fg.isIndexedBy==0 ); + assert( pItem->fg.isTabFunc==0 ); + pItem->u1.pFuncArg = pList; + pItem->fg.isTabFunc = 1; + }else{ + sqlite3ExprListDelete(pParse->db, pList); + } +} + /* ** When building up a FROM clause in the parser, the join operator ** is initially attached to the left operand. But the code generator @@ -93514,16 +107896,15 @@ SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pI SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){ if( p ){ int i; - assert( p->a || p->nSrc==0 ); for(i=p->nSrc-1; i>0; i--){ - p->a[i].jointype = p->a[i-1].jointype; + p->a[i].fg.jointype = p->a[i-1].fg.jointype; } - p->a[0].jointype = 0; + p->a[0].fg.jointype = 0; } } /* -** Begin a transaction +** Generate VDBE code for a BEGIN statement. */ SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ sqlite3 *db; @@ -93533,7 +107914,6 @@ SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ assert( pParse!=0 ); db = pParse->db; assert( db!=0 ); -/* if( db->aDb[0].pBt==0 ) return; */ if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "BEGIN", 0, 0) ){ return; } @@ -93545,40 +107925,29 @@ SQLITE_PRIVATE void sqlite3BeginTransaction(Parse *pParse, int type){ sqlite3VdbeUsesBtree(v, i); } } - sqlite3VdbeAddOp2(v, OP_AutoCommit, 0, 0); + sqlite3VdbeAddOp0(v, OP_AutoCommit); } /* -** Commit a transaction +** Generate VDBE code for a COMMIT or ROLLBACK statement. +** Code for ROLLBACK is generated if eType==TK_ROLLBACK. Otherwise +** code is generated for a COMMIT. */ -SQLITE_PRIVATE void sqlite3CommitTransaction(Parse *pParse){ +SQLITE_PRIVATE void sqlite3EndTransaction(Parse *pParse, int eType){ Vdbe *v; + int isRollback; assert( pParse!=0 ); assert( pParse->db!=0 ); - if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "COMMIT", 0, 0) ){ + assert( eType==TK_COMMIT || eType==TK_END || eType==TK_ROLLBACK ); + isRollback = eType==TK_ROLLBACK; + if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, + isRollback ? "ROLLBACK" : "COMMIT", 0, 0) ){ return; } v = sqlite3GetVdbe(pParse); if( v ){ - sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 0); - } -} - -/* -** Rollback a transaction -*/ -SQLITE_PRIVATE void sqlite3RollbackTransaction(Parse *pParse){ - Vdbe *v; - - assert( pParse!=0 ); - assert( pParse->db!=0 ); - if( sqlite3AuthCheck(pParse, SQLITE_TRANSACTION, "ROLLBACK", 0, 0) ){ - return; - } - v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, 1); + sqlite3VdbeAddOp2(v, OP_AutoCommit, 1, isRollback); } } @@ -93628,7 +107997,7 @@ SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ db->aDb[1].pBt = pBt; assert( db->aDb[1].pSchema ); if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ - db->mallocFailed = 1; + sqlite3OomFault(db); return 1; } } @@ -93643,15 +108012,13 @@ SQLITE_PRIVATE int sqlite3OpenTempDatabase(Parse *pParse){ */ SQLITE_PRIVATE void sqlite3CodeVerifySchema(Parse *pParse, int iDb){ Parse *pToplevel = sqlite3ParseToplevel(pParse); - sqlite3 *db = pToplevel->db; - assert( iDb>=0 && iDb<db->nDb ); - assert( db->aDb[iDb].pBt!=0 || iDb==1 ); + assert( iDb>=0 && iDb<pParse->db->nDb ); + assert( pParse->db->aDb[iDb].pBt!=0 || iDb==1 ); assert( iDb<SQLITE_MAX_ATTACHED+2 ); - assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( sqlite3SchemaMutexHeld(pParse->db, iDb, 0) ); if( DbMaskTest(pToplevel->cookieMask, iDb)==0 ){ DbMaskSet(pToplevel->cookieMask, iDb); - pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie; if( !OMIT_TEMPDB && iDb==1 ){ sqlite3OpenTempDatabase(pToplevel); } @@ -93667,7 +108034,7 @@ SQLITE_PRIVATE void sqlite3CodeVerifyNamedSchema(Parse *pParse, const char *zDb) int i; for(i=0; i<db->nDb; i++){ Db *pDb = &db->aDb[i]; - if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zName)) ){ + if( pDb->pBt && (!zDb || 0==sqlite3StrICmp(zDb, pDb->zDbSName)) ){ sqlite3CodeVerifySchema(pParse, i); } } @@ -93745,7 +108112,7 @@ SQLITE_PRIVATE void sqlite3HaltConstraint( sqlite3MayAbort(pParse); } sqlite3VdbeAddOp4(v, OP_Halt, errCode, onError, 0, p4, p4type); - if( p5Errmsg ) sqlite3VdbeChangeP5(v, p5Errmsg); + sqlite3VdbeChangeP5(v, p5Errmsg); } /* @@ -93761,14 +108128,19 @@ SQLITE_PRIVATE void sqlite3UniqueConstraint( StrAccum errMsg; Table *pTab = pIdx->pTable; - sqlite3StrAccumInit(&errMsg, 0, 0, 200); - errMsg.db = pParse->db; - for(j=0; j<pIdx->nKeyCol; j++){ - char *zCol = pTab->aCol[pIdx->aiColumn[j]].zName; - if( j ) sqlite3StrAccumAppend(&errMsg, ", ", 2); - sqlite3StrAccumAppendAll(&errMsg, pTab->zName); - sqlite3StrAccumAppend(&errMsg, ".", 1); - sqlite3StrAccumAppendAll(&errMsg, zCol); + sqlite3StrAccumInit(&errMsg, pParse->db, 0, 0, 200); + if( pIdx->aColExpr ){ + sqlite3_str_appendf(&errMsg, "index '%q'", pIdx->zName); + }else{ + for(j=0; j<pIdx->nKeyCol; j++){ + char *zCol; + assert( pIdx->aiColumn[j]>=0 ); + zCol = pTab->aCol[pIdx->aiColumn[j]].zName; + if( j ) sqlite3_str_append(&errMsg, ", ", 2); + sqlite3_str_appendall(&errMsg, pTab->zName); + sqlite3_str_append(&errMsg, ".", 1); + sqlite3_str_appendall(&errMsg, zCol); + } } zErr = sqlite3StrAccumFinish(&errMsg); sqlite3HaltConstraint(pParse, @@ -93911,7 +108283,7 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ if( iDb<0 ) return; z = sqlite3NameFromToken(db, pObjName); if( z==0 ) return; - zDb = db->aDb[iDb].zName; + zDb = db->aDb[iDb].zDbSName; pTab = sqlite3FindTable(db, z, zDb); if( pTab ){ reindexTable(pParse, pTab, 0); @@ -93932,10 +108304,6 @@ SQLITE_PRIVATE void sqlite3Reindex(Parse *pParse, Token *pName1, Token *pName2){ /* ** Return a KeyInfo structure that is appropriate for the given Index. ** -** The KeyInfo structure for an index is cached in the Index object. -** So there might be multiple references to the returned pointer. The -** caller should not try to modify the KeyInfo object. -** ** The caller should invoke sqlite3KeyInfoUnref() on the returned object ** when it has finished using it. */ @@ -93953,13 +108321,24 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ if( pKey ){ assert( sqlite3KeyInfoIsWriteable(pKey) ); for(i=0; i<nCol; i++){ - char *zColl = pIdx->azColl[i]; - assert( zColl!=0 ); - pKey->aColl[i] = strcmp(zColl,"BINARY")==0 ? 0 : + const char *zColl = pIdx->azColl[i]; + pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : sqlite3LocateCollSeq(pParse, zColl); pKey->aSortOrder[i] = pIdx->aSortOrder[i]; } if( pParse->nErr ){ + assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); + if( pIdx->bNoQuery==0 ){ + /* Deactivate the index because it contains an unknown collating + ** sequence. The only way to reactive the index is to reload the + ** schema. Adding the missing collating sequence later does not + ** reactive the index. The application had the chance to register + ** the missing index using the collation-needed callback. For + ** simplicity, SQLite will not give the application a second chance. + */ + pIdx->bNoQuery = 1; + pParse->rc = SQLITE_ERROR_RETRY; + } sqlite3KeyInfoUnref(pKey); pKey = 0; } @@ -94001,10 +108380,9 @@ SQLITE_PRIVATE With *sqlite3WithAdd( }else{ pNew = sqlite3DbMallocZero(db, sizeof(*pWith)); } - assert( zName!=0 || pNew==0 ); - assert( db->mallocFailed==0 || pNew==0 ); + assert( (pNew!=0 && zName!=0) || db->mallocFailed ); - if( pNew==0 ){ + if( db->mallocFailed ){ sqlite3ExprListDelete(db, pArglist); sqlite3SelectDelete(db, pQuery); sqlite3DbFree(db, zName); @@ -94013,7 +108391,7 @@ SQLITE_PRIVATE With *sqlite3WithAdd( pNew->a[pNew->nCte].pSelect = pQuery; pNew->a[pNew->nCte].pCols = pArglist; pNew->a[pNew->nCte].zName = zName; - pNew->a[pNew->nCte].zErr = 0; + pNew->a[pNew->nCte].zCteErr = 0; pNew->nCte++; } @@ -94055,6 +108433,7 @@ SQLITE_PRIVATE void sqlite3WithDelete(sqlite3 *db, With *pWith){ ** of user defined functions and collation sequences. */ +/* #include "sqliteInt.h" */ /* ** Invoke the 'collation needed' callback to request a collation sequence @@ -94145,6 +108524,7 @@ SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( assert( !p || p->xCmp ); if( p==0 ){ sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); + pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; } return p; } @@ -94161,7 +108541,7 @@ SQLITE_PRIVATE CollSeq *sqlite3GetCollSeq( ** from the main database is substituted, if one is available. */ SQLITE_PRIVATE int sqlite3CheckCollSeq(Parse *pParse, CollSeq *pColl){ - if( pColl ){ + if( pColl && pColl->xCmp==0 ){ const char *zName = pColl->zName; sqlite3 *db = pParse->db; CollSeq *p = sqlite3GetCollSeq(pParse, ENC(db), pColl, zName); @@ -94197,8 +108577,8 @@ static CollSeq *findCollSeqEntry( pColl = sqlite3HashFind(&db->aCollSeq, zName); if( 0==pColl && create ){ - int nName = sqlite3Strlen30(zName); - pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName + 1); + int nName = sqlite3Strlen30(zName) + 1; + pColl = sqlite3DbMallocZero(db, 3*sizeof(*pColl) + nName); if( pColl ){ CollSeq *pDel = 0; pColl[0].zName = (char*)&pColl[3]; @@ -94208,7 +108588,6 @@ static CollSeq *findCollSeqEntry( pColl[2].zName = (char*)&pColl[3]; pColl[2].enc = SQLITE_UTF16BE; memcpy(pColl[0].zName, zName, nName); - pColl[0].zName[nName] = 0; pDel = sqlite3HashInsert(&db->aCollSeq, pColl[0].zName, pColl); /* If a malloc() failure occurred in sqlite3HashInsert(), it will @@ -94217,7 +108596,7 @@ static CollSeq *findCollSeqEntry( */ assert( pDel==0 || pDel==pColl ); if( pDel!=0 ){ - db->mallocFailed = 1; + sqlite3OomFault(db); sqlite3DbFree(db, pDel); pColl = 0; } @@ -94283,8 +108662,8 @@ SQLITE_PRIVATE CollSeq *sqlite3FindCollSeq( ** 5: UTF16 byte order conversion required - argument count matches exactly ** 6: Perfect match: encoding and argument count match exactly. ** -** If nArg==(-2) then any function with a non-null xStep or xFunc is -** a perfect match and any function with both xStep and xFunc NULL is +** If nArg==(-2) then any function with a non-null xSFunc is +** a perfect match and any function with xSFunc NULL is ** a non-match. */ #define FUNC_PERFECT_MATCH 6 /* The score for a perfect match */ @@ -94296,7 +108675,7 @@ static int matchQuality( int match; /* nArg of -2 is a special case */ - if( nArg==(-2) ) return (p->xFunc==0 && p->xStep==0) ? 0 : FUNC_PERFECT_MATCH; + if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; /* Wrong number of arguments means "no match" */ if( p->nArg!=nArg && p->nArg>=0 ) return 0; @@ -94324,14 +108703,12 @@ static int matchQuality( ** a pointer to the matching FuncDef if found, or 0 if there is no match. */ static FuncDef *functionSearch( - FuncDefHash *pHash, /* Hash table to search */ int h, /* Hash of the name */ - const char *zFunc, /* Name of function */ - int nFunc /* Number of bytes in zFunc */ + const char *zFunc /* Name of function */ ){ FuncDef *p; - for(p=pHash->a[h]; p; p=p->pHash){ - if( sqlite3StrNICmp(p->zName, zFunc, nFunc)==0 && p->zName[nFunc]==0 ){ + for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ + if( sqlite3StrICmp(p->zName, zFunc)==0 ){ return p; } } @@ -94341,23 +108718,27 @@ static FuncDef *functionSearch( /* ** Insert a new FuncDef into a FuncDefHash hash table. */ -SQLITE_PRIVATE void sqlite3FuncDefInsert( - FuncDefHash *pHash, /* The hash table into which to insert */ - FuncDef *pDef /* The function definition to insert */ +SQLITE_PRIVATE void sqlite3InsertBuiltinFuncs( + FuncDef *aDef, /* List of global functions to be inserted */ + int nDef /* Length of the apDef[] list */ ){ - FuncDef *pOther; - int nName = sqlite3Strlen30(pDef->zName); - u8 c1 = (u8)pDef->zName[0]; - int h = (sqlite3UpperToLower[c1] + nName) % ArraySize(pHash->a); - pOther = functionSearch(pHash, h, pDef->zName, nName); - if( pOther ){ - assert( pOther!=pDef && pOther->pNext!=pDef ); - pDef->pNext = pOther->pNext; - pOther->pNext = pDef; - }else{ - pDef->pNext = 0; - pDef->pHash = pHash->a[h]; - pHash->a[h] = pDef; + int i; + for(i=0; i<nDef; i++){ + FuncDef *pOther; + const char *zName = aDef[i].zName; + int nName = sqlite3Strlen30(zName); + int h = (zName[0] + nName) % SQLITE_FUNC_HASH_SZ; + assert( zName[0]>='a' && zName[0]<='z' ); + pOther = functionSearch(h, zName); + if( pOther ){ + assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); + aDef[i].pNext = pOther->pNext; + pOther->pNext = &aDef[i]; + }else{ + aDef[i].pNext = 0; + aDef[i].u.pHash = sqlite3BuiltinFunctions.a[h]; + sqlite3BuiltinFunctions.a[h] = &aDef[i]; + } } } @@ -94374,7 +108755,7 @@ SQLITE_PRIVATE void sqlite3FuncDefInsert( ** no matching function previously existed. ** ** If nArg is -2, then the first valid function found is returned. A -** function is valid if either xFunc or xStep is non-zero. The nArg==(-2) +** function is valid if xSFunc is non-zero. The nArg==(-2) ** case is used to see if zName is a valid function name for some number ** of arguments. If nArg is -2, then createFlag must be 0. ** @@ -94384,8 +108765,7 @@ SQLITE_PRIVATE void sqlite3FuncDefInsert( */ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( sqlite3 *db, /* An open database */ - const char *zName, /* Name of the function. Not null-terminated */ - int nName, /* Number of characters in the name */ + const char *zName, /* Name of the function. zero-terminated */ int nArg, /* Number of arguments. -1 means any number */ u8 enc, /* Preferred text encoding */ u8 createFlag /* Create new entry if true and does not otherwise exist */ @@ -94394,14 +108774,15 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( FuncDef *pBest = 0; /* Best match found so far */ int bestScore = 0; /* Score of best match */ int h; /* Hash value */ + int nName; /* Length of the name */ assert( nArg>=(-2) ); assert( nArg>=(-1) || createFlag==0 ); - h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % ArraySize(db->aFunc.a); + nName = sqlite3Strlen30(zName); /* First search for a match amongst the application-defined functions. */ - p = functionSearch(&db->aFunc, h, zName, nName); + p = (FuncDef*)sqlite3HashFind(&db->aFunc, zName); while( p ){ int score = matchQuality(p, nArg, enc); if( score>bestScore ){ @@ -94413,7 +108794,7 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( /* If no match is found, search the built-in functions. ** - ** If the SQLITE_PreferBuiltin flag is set, then search the built-in + ** If the DBFLAG_PreferBuiltin flag is set, then search the built-in ** functions even if a prior app-defined function was found. And give ** priority to built-in functions. ** @@ -94423,10 +108804,10 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( ** new function. But the FuncDefs for built-in functions are read-only. ** So we must not search for built-ins when creating a new function. */ - if( !createFlag && (pBest==0 || (db->flags & SQLITE_PreferBuiltin)!=0) ){ - FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); + if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ bestScore = 0; - p = functionSearch(pHash, h, zName, nName); + h = (sqlite3UpperToLower[(u8)zName[0]] + nName) % SQLITE_FUNC_HASH_SZ; + p = functionSearch(h, zName); while( p ){ int score = matchQuality(p, nArg, enc); if( score>bestScore ){ @@ -94443,15 +108824,24 @@ SQLITE_PRIVATE FuncDef *sqlite3FindFunction( */ if( createFlag && bestScore<FUNC_PERFECT_MATCH && (pBest = sqlite3DbMallocZero(db, sizeof(*pBest)+nName+1))!=0 ){ - pBest->zName = (char *)&pBest[1]; + FuncDef *pOther; + u8 *z; + pBest->zName = (const char*)&pBest[1]; pBest->nArg = (u16)nArg; pBest->funcFlags = enc; - memcpy(pBest->zName, zName, nName); - pBest->zName[nName] = 0; - sqlite3FuncDefInsert(&db->aFunc, pBest); + memcpy((char*)&pBest[1], zName, nName+1); + for(z=(u8*)pBest->zName; *z; z++) *z = sqlite3UpperToLower[*z]; + pOther = (FuncDef*)sqlite3HashInsert(&db->aFunc, pBest->zName, pBest); + if( pOther==pBest ){ + sqlite3DbFree(db, pBest); + sqlite3OomFault(db); + return 0; + }else{ + pBest->pNext = pOther; + } } - if( pBest && (pBest->xStep || pBest->xFunc || createFlag) ){ + if( pBest && (pBest->xSFunc || createFlag) ){ return pBest; } return 0; @@ -94489,8 +108879,8 @@ SQLITE_PRIVATE void sqlite3SchemaClear(void *p){ pSchema->pSeqTab = 0; if( pSchema->schemaFlags & DB_SchemaLoaded ){ pSchema->iGeneration++; - pSchema->schemaFlags &= ~DB_SchemaLoaded; } + pSchema->schemaFlags &= ~(DB_SchemaLoaded|DB_ResetWanted); } /* @@ -94505,7 +108895,7 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ p = (Schema *)sqlite3DbMallocZero(0, sizeof(Schema)); } if( !p ){ - db->mallocFailed = 1; + sqlite3OomFault(db); }else if ( 0==p->file_format ){ sqlite3HashInit(&p->tblHash); sqlite3HashInit(&p->idxHash); @@ -94532,6 +108922,7 @@ SQLITE_PRIVATE Schema *sqlite3SchemaGet(sqlite3 *db, Btree *pBt){ ** This file contains C code routines that are called by the parser ** in order to generate code for DELETE FROM statements. */ +/* #include "sqliteInt.h" */ /* ** While a SrcList can in general represent multiple tables and subqueries @@ -94555,7 +108946,7 @@ SQLITE_PRIVATE Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ sqlite3DeleteTable(pParse->db, pItem->pTab); pItem->pTab = pTab; if( pTab ){ - pTab->nRef++; + pTab->nTabRef++; } if( sqlite3IndexedByLookup(pParse, pItem) ){ pTab = 0; @@ -94609,6 +109000,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView( Parse *pParse, /* Parsing context */ Table *pView, /* View definition */ Expr *pWhere, /* Optional WHERE clause to be added */ + ExprList *pOrderBy, /* Optional ORDER BY clause */ + Expr *pLimit, /* Optional LIMIT clause */ int iCur /* Cursor number for ephemeral table */ ){ SelectDest dest; @@ -94621,11 +109014,12 @@ SQLITE_PRIVATE void sqlite3MaterializeView( if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); - pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName); + pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); assert( pFrom->a[0].pOn==0 ); assert( pFrom->a[0].pUsing==0 ); } - pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, 0, 0, 0); + pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, + SF_IncludeHidden, pLimit); sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); sqlite3Select(pParse, pSel, &dest); sqlite3SelectDelete(db, pSel); @@ -94647,29 +109041,29 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( Expr *pWhere, /* The WHERE clause. May be null */ ExprList *pOrderBy, /* The ORDER BY clause. May be null */ Expr *pLimit, /* The LIMIT clause. May be null */ - Expr *pOffset, /* The OFFSET clause. May be null */ char *zStmtType /* Either DELETE or UPDATE. For err msgs. */ ){ - Expr *pWhereRowid = NULL; /* WHERE rowid .. */ + sqlite3 *db = pParse->db; + Expr *pLhs = NULL; /* LHS of IN(SELECT...) operator */ Expr *pInClause = NULL; /* WHERE rowid IN ( select ) */ - Expr *pSelectRowid = NULL; /* SELECT rowid ... */ ExprList *pEList = NULL; /* Expression list contaning only pSelectRowid */ SrcList *pSelectSrc = NULL; /* SELECT rowid FROM x ... (dup of pSrc) */ Select *pSelect = NULL; /* Complete SELECT tree */ + Table *pTab; /* Check that there isn't an ORDER BY without a LIMIT clause. */ - if( pOrderBy && (pLimit == 0) ) { + if( pOrderBy && pLimit==0 ) { sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType); - goto limit_where_cleanup_2; + sqlite3ExprDelete(pParse->db, pWhere); + sqlite3ExprListDelete(pParse->db, pOrderBy); + return 0; } /* We only need to generate a select expression if there ** is a limit/offset term to enforce. */ if( pLimit == 0 ) { - /* if pLimit is null, pOffset will always be null as well. */ - assert( pOffset == 0 ); return pWhere; } @@ -94682,46 +109076,47 @@ SQLITE_PRIVATE Expr *sqlite3LimitWhere( ** ); */ - pSelectRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0); - if( pSelectRowid == 0 ) goto limit_where_cleanup_2; - pEList = sqlite3ExprListAppend(pParse, 0, pSelectRowid); - if( pEList == 0 ) goto limit_where_cleanup_2; + pTab = pSrc->a[0].pTab; + if( HasRowid(pTab) ){ + pLhs = sqlite3PExpr(pParse, TK_ROW, 0, 0); + pEList = sqlite3ExprListAppend( + pParse, 0, sqlite3PExpr(pParse, TK_ROW, 0, 0) + ); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + if( pPk->nKeyCol==1 ){ + const char *zName = pTab->aCol[pPk->aiColumn[0]].zName; + pLhs = sqlite3Expr(db, TK_ID, zName); + pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, zName)); + }else{ + int i; + for(i=0; i<pPk->nKeyCol; i++){ + Expr *p = sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName); + pEList = sqlite3ExprListAppend(pParse, pEList, p); + } + pLhs = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( pLhs ){ + pLhs->x.pList = sqlite3ExprListDup(db, pEList, 0); + } + } + } /* duplicate the FROM clause as it is needed by both the DELETE/UPDATE tree ** and the SELECT subtree. */ + pSrc->a[0].pTab = 0; pSelectSrc = sqlite3SrcListDup(pParse->db, pSrc, 0); - if( pSelectSrc == 0 ) { - sqlite3ExprListDelete(pParse->db, pEList); - goto limit_where_cleanup_2; - } + pSrc->a[0].pTab = pTab; + pSrc->a[0].pIBIndex = 0; /* generate the SELECT expression tree. */ - pSelect = sqlite3SelectNew(pParse,pEList,pSelectSrc,pWhere,0,0, - pOrderBy,0,pLimit,pOffset); - if( pSelect == 0 ) return 0; + pSelect = sqlite3SelectNew(pParse, pEList, pSelectSrc, pWhere, 0 ,0, + pOrderBy,0,pLimit + ); /* now generate the new WHERE rowid IN clause for the DELETE/UDPATE */ - pWhereRowid = sqlite3PExpr(pParse, TK_ROW, 0, 0, 0); - if( pWhereRowid == 0 ) goto limit_where_cleanup_1; - pInClause = sqlite3PExpr(pParse, TK_IN, pWhereRowid, 0, 0); - if( pInClause == 0 ) goto limit_where_cleanup_1; - - pInClause->x.pSelect = pSelect; - pInClause->flags |= EP_xIsSelect; - sqlite3ExprSetHeight(pParse, pInClause); + pInClause = sqlite3PExpr(pParse, TK_IN, pLhs, 0); + sqlite3PExprAddSelect(pParse, pInClause, pSelect); return pInClause; - - /* something went wrong. clean up anything allocated. */ -limit_where_cleanup_1: - sqlite3SelectDelete(pParse->db, pSelect); - return 0; - -limit_where_cleanup_2: - sqlite3ExprDelete(pParse->db, pWhere); - sqlite3ExprListDelete(pParse->db, pOrderBy); - sqlite3ExprDelete(pParse->db, pLimit); - sqlite3ExprDelete(pParse->db, pOffset); - return 0; } #endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) */ /* && !defined(SQLITE_OMIT_SUBQUERY) */ @@ -94736,11 +109131,12 @@ limit_where_cleanup_2: SQLITE_PRIVATE void sqlite3DeleteFrom( Parse *pParse, /* The parser context */ SrcList *pTabList, /* The table from which we should delete things */ - Expr *pWhere /* The WHERE clause. May be null */ + Expr *pWhere, /* The WHERE clause. May be null */ + ExprList *pOrderBy, /* ORDER BY clause. May be null */ + Expr *pLimit /* LIMIT clause. May be null */ ){ Vdbe *v; /* The virtual database engine */ Table *pTab; /* The table from which records will be deleted */ - const char *zDb; /* Name of database holding pTab */ int i; /* Loop counter */ WhereInfo *pWInfo; /* Information about the WHERE clause */ Index *pIdx; /* For looping over indices of the table */ @@ -94752,9 +109148,9 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( AuthContext sContext; /* Authorization context */ NameContext sNC; /* Name context to resolve expressions in */ int iDb; /* Database number */ - int memCnt = -1; /* Memory cell used for change counting */ + int memCnt = 0; /* Memory cell used for change counting */ int rcauth; /* Value returned by authorization callback */ - int okOnePass; /* True for one-pass algorithm without the FIFO */ + int eOnePass; /* ONEPASS_OFF or _SINGLE or _MULTI */ int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ u8 *aToOpen = 0; /* Open cursor iTabCur+j if aToOpen[j] is true */ Index *pPk; /* The PRIMARY KEY index on the table */ @@ -94766,8 +109162,9 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( int iRowSet = 0; /* Register for rowset of rows to delete */ int addrBypass = 0; /* Address of jump over the delete logic */ int addrLoop = 0; /* Top of the delete loop */ - int addrDelete = 0; /* Jump directly to the delete logic */ int addrEphOpen = 0; /* Instruction to open the Ephemeral table */ + int bComplex; /* True if there are triggers or FKs or + ** subqueries in the WHERE clause */ #ifndef SQLITE_OMIT_TRIGGER int isView; /* True if attempting to delete from a view */ @@ -94781,6 +109178,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( } assert( pTabList->nSrc==1 ); + /* Locate the table which we want to delete. This table has to be ** put in an SrcList structure because some of the subroutines we ** will be calling are designed to work with multiple tables and expect @@ -94799,11 +109197,22 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( # define pTrigger 0 # define isView 0 #endif + bComplex = pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0); #ifdef SQLITE_OMIT_VIEW # undef isView # define isView 0 #endif +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( !isView ){ + pWhere = sqlite3LimitWhere( + pParse, pTabList, pWhere, pOrderBy, pLimit, "DELETE" + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + /* If pTab is really a view, make sure it has been initialized. */ if( sqlite3ViewGetColumnNames(pParse, pTab) ){ @@ -94815,8 +109224,8 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( } iDb = sqlite3SchemaToIndex(db, pTab->pSchema); assert( iDb<db->nDb ); - zDb = db->aDb[iDb].zName; - rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb); + rcauth = sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, + db->aDb[iDb].zDbSName); assert( rcauth==SQLITE_OK || rcauth==SQLITE_DENY || rcauth==SQLITE_IGNORE ); if( rcauth==SQLITE_DENY ){ goto delete_from_cleanup; @@ -94844,15 +109253,19 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( goto delete_from_cleanup; } if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); - sqlite3BeginWriteOperation(pParse, 1, iDb); + sqlite3BeginWriteOperation(pParse, bComplex, iDb); /* If we are trying to delete from a view, realize that view into ** an ephemeral table. */ #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) if( isView ){ - sqlite3MaterializeView(pParse, pTab, pWhere, iTabCur); + sqlite3MaterializeView(pParse, pTab, + pWhere, pOrderBy, pLimit, iTabCur + ); iDataCur = iIdxCur = iTabCur; + pOrderBy = 0; + pLimit = 0; } #endif @@ -94868,7 +109281,10 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( /* Initialize the counter of the number of rows deleted, if ** we are counting rows. */ - if( db->flags & SQLITE_CountRows ){ + if( (db->flags & SQLITE_CountRows)!=0 + && !pParse->nested + && !pParse->pTriggerTab + ){ memCnt = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Integer, 0, memCnt); } @@ -94877,14 +109293,26 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( /* Special case: A DELETE without a WHERE clause deletes everything. ** It is easier just to erase the whole table. Prior to version 3.6.5, ** this optimization caused the row change count (the value returned by - ** API function sqlite3_count_changes) to be set incorrectly. */ - if( rcauth==SQLITE_OK && pWhere==0 && !pTrigger && !IsVirtual(pTab) - && 0==sqlite3FkRequired(pParse, pTab, 0, 0) + ** API function sqlite3_count_changes) to be set incorrectly. + ** + ** The "rcauth==SQLITE_OK" terms is the + ** IMPLEMENTATION-OF: R-17228-37124 If the action code is SQLITE_DELETE and + ** the callback returns SQLITE_IGNORE then the DELETE operation proceeds but + ** the truncate optimization is disabled and all rows are deleted + ** individually. + */ + if( rcauth==SQLITE_OK + && pWhere==0 + && !bComplex + && !IsVirtual(pTab) +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + && db->xPreUpdateCallback==0 +#endif ){ assert( !isView ); sqlite3TableLock(pParse, iDb, pTab->tnum, 1, pTab->zName); if( HasRowid(pTab) ){ - sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt, + sqlite3VdbeAddOp4(v, OP_Clear, pTab->tnum, iDb, memCnt ? memCnt : -1, pTab->zName, P4_STATIC); } for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ @@ -94894,6 +109322,9 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( }else #endif /* SQLITE_OMIT_TRUNCATE_OPTIMIZATION */ { + u16 wcf = WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK|WHERE_SEEK_TABLE; + if( sNC.ncFlags & NC_VarSelect ) bComplex = 1; + wcf |= (bComplex ? 0 : WHERE_ONEPASS_MULTIROW); if( HasRowid(pTab) ){ /* For a rowid table, initialize the RowSet to an empty set */ pPk = 0; @@ -94914,22 +109345,29 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( } /* Construct a query to find the rowid or primary key for every row - ** to be deleted, based on the WHERE clause. + ** to be deleted, based on the WHERE clause. Set variable eOnePass + ** to indicate the strategy used to implement this delete: + ** + ** ONEPASS_OFF: Two-pass approach - use a FIFO for rowids/PK values. + ** ONEPASS_SINGLE: One-pass approach - at most one row deleted. + ** ONEPASS_MULTI: One-pass approach - any number of rows may be deleted. */ - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, - WHERE_ONEPASS_DESIRED|WHERE_DUPLICATES_OK, - iTabCur+1); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, wcf, iTabCur+1); if( pWInfo==0 ) goto delete_from_cleanup; - okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); + assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); + if( eOnePass!=ONEPASS_SINGLE ) sqlite3MultiWrite(pParse); /* Keep track of the number of rows to be deleted */ - if( db->flags & SQLITE_CountRows ){ + if( memCnt ){ sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1); } /* Extract the rowid or primary key for the current row */ if( pPk ){ for(i=0; i<nPk; i++){ + assert( pPk->aiColumn[i]>=0 ); sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, pPk->aiColumn[i], iPk+i); } @@ -94940,13 +109378,12 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( if( iKey>pParse->nMem ) pParse->nMem = iKey; } - if( okOnePass ){ - /* For ONEPASS, no need to store the rowid/primary-key. There is only + if( eOnePass!=ONEPASS_OFF ){ + /* For ONEPASS, no need to store the rowid/primary-key. There is only ** one, so just keep it in its register(s) and fall through to the - ** delete code. - */ + ** delete code. */ nKey = nPk; /* OP_Found will use an unpacked key */ - aToOpen = sqlite3DbMallocRaw(db, nIdx+2); + aToOpen = sqlite3DbMallocRawNN(db, nIdx+2); if( aToOpen==0 ){ sqlite3WhereEnd(pWInfo); goto delete_from_cleanup; @@ -94956,27 +109393,27 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iTabCur] = 0; if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iTabCur] = 0; if( addrEphOpen ) sqlite3VdbeChangeToNoop(v, addrEphOpen); - addrDelete = sqlite3VdbeAddOp0(v, OP_Goto); /* Jump to DELETE logic */ - }else if( pPk ){ - /* Construct a composite key for the row to be deleted and remember it */ - iKey = ++pParse->nMem; - nKey = 0; /* Zero tells OP_Found to use a composite key */ - sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, - sqlite3IndexAffinityStr(v, pPk), nPk); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iEphCur, iKey); }else{ - /* Get the rowid of the row to be deleted and remember it in the RowSet */ - nKey = 1; /* OP_Seek always uses a single rowid */ - sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey); + if( pPk ){ + /* Add the PK key for this row to the temporary table */ + iKey = ++pParse->nMem; + nKey = 0; /* Zero tells OP_Found to use a composite key */ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, iKey, + sqlite3IndexAffinityStr(pParse->db, pPk), nPk); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEphCur, iKey, iPk, nPk); + }else{ + /* Add the rowid of the row to be deleted to the RowSet */ + nKey = 1; /* OP_DeferredSeek always uses a single rowid */ + sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, iKey); + } } - /* End of the WHERE loop */ - sqlite3WhereEnd(pWInfo); - if( okOnePass ){ - /* Bypass the delete logic below if the WHERE loop found zero rows */ + /* If this DELETE cannot use the ONEPASS strategy, this is the + ** end of the WHERE loop */ + if( eOnePass!=ONEPASS_OFF ){ addrBypass = sqlite3VdbeMakeLabel(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrBypass); - sqlite3VdbeJumpHere(v, addrDelete); + }else{ + sqlite3WhereEnd(pWInfo); } /* Unless this is a view, open cursors for the table we are @@ -94985,28 +109422,35 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** triggers. */ if( !isView ){ + int iAddrOnce = 0; + if( eOnePass==ONEPASS_MULTI ){ + iAddrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } testcase( IsVirtual(pTab) ); - sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, iTabCur, aToOpen, - &iDataCur, &iIdxCur); + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, OPFLAG_FORDELETE, + iTabCur, aToOpen, &iDataCur, &iIdxCur); assert( pPk || IsVirtual(pTab) || iDataCur==iTabCur ); assert( pPk || IsVirtual(pTab) || iIdxCur==iDataCur+1 ); + if( eOnePass==ONEPASS_MULTI ) sqlite3VdbeJumpHere(v, iAddrOnce); } /* Set up a loop over the rowids/primary-keys that were found in the ** where-clause loop above. */ - if( okOnePass ){ - /* Just one row. Hence the top-of-loop is a no-op */ + if( eOnePass!=ONEPASS_OFF ){ assert( nKey==nPk ); /* OP_Found will use an unpacked key */ - assert( !IsVirtual(pTab) ); - if( aToOpen[iDataCur-iTabCur] ){ + if( !IsVirtual(pTab) && aToOpen[iDataCur-iTabCur] ){ assert( pPk!=0 || pTab->pSelect!=0 ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); VdbeCoverage(v); } }else if( pPk ){ addrLoop = sqlite3VdbeAddOp1(v, OP_Rewind, iEphCur); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_RowKey, iEphCur, iKey); + if( IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Column, iEphCur, 0, iKey); + }else{ + sqlite3VdbeAddOp2(v, OP_RowData, iEphCur, iKey); + } assert( nKey==0 ); /* OP_Found will use a composite key */ }else{ addrLoop = sqlite3VdbeAddOp3(v, OP_RowSetRead, iRowSet, 0, iKey); @@ -95019,35 +109463,35 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( if( IsVirtual(pTab) ){ const char *pVTab = (const char *)sqlite3GetVTable(db, pTab); sqlite3VtabMakeWritable(pParse, pTab); + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + sqlite3MayAbort(pParse); + if( eOnePass==ONEPASS_SINGLE ){ + sqlite3VdbeAddOp1(v, OP_Close, iTabCur); + if( sqlite3IsToplevel(pParse) ){ + pParse->isMultiWrite = 0; + } + } sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB); sqlite3VdbeChangeP5(v, OE_Abort); - sqlite3MayAbort(pParse); }else #endif { int count = (pParse->nested==0); /* True to count changes */ sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, - iKey, nKey, count, OE_Default, okOnePass); + iKey, nKey, count, OE_Default, eOnePass, aiCurOnePass[1]); } /* End of the loop over all rowids/primary-keys. */ - if( okOnePass ){ + if( eOnePass!=ONEPASS_OFF ){ sqlite3VdbeResolveLabel(v, addrBypass); + sqlite3WhereEnd(pWInfo); }else if( pPk ){ sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrLoop); }else{ - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrLoop); + sqlite3VdbeGoto(v, addrLoop); sqlite3VdbeJumpHere(v, addrLoop); } - - /* Close the cursors open on the table and its indexes. */ - if( !isView && !IsVirtual(pTab) ){ - if( !pPk ) sqlite3VdbeAddOp1(v, OP_Close, iDataCur); - for(i=0, pIdx=pTab->pIndex; pIdx; i++, pIdx=pIdx->pNext){ - sqlite3VdbeAddOp1(v, OP_Close, iIdxCur + i); - } - } } /* End non-truncate path */ /* Update the sqlite_sequence table by storing the content of the @@ -95062,7 +109506,7 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( ** generating code because of a call to sqlite3NestedParse(), do not ** invoke the callback function. */ - if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){ + if( memCnt ){ sqlite3VdbeAddOp2(v, OP_ResultRow, memCnt, 1); sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows deleted", SQLITE_STATIC); @@ -95072,6 +109516,10 @@ delete_from_cleanup: sqlite3AuthContextPop(&sContext); sqlite3SrcListDelete(db, pTabList); sqlite3ExprDelete(db, pWhere); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + sqlite3ExprListDelete(db, pOrderBy); + sqlite3ExprDelete(db, pLimit); +#endif sqlite3DbFree(db, aToOpen); return; } @@ -95104,6 +109552,27 @@ delete_from_cleanup: ** sequence of nPk memory cells starting at iPk. If nPk==0 that means ** that a search record formed from OP_MakeRecord is contained in the ** single memory location iPk. +** +** eMode: +** Parameter eMode may be passed either ONEPASS_OFF (0), ONEPASS_SINGLE, or +** ONEPASS_MULTI. If eMode is not ONEPASS_OFF, then the cursor +** iDataCur already points to the row to delete. If eMode is ONEPASS_OFF +** then this function must seek iDataCur to the entry identified by iPk +** and nPk before reading from it. +** +** If eMode is ONEPASS_MULTI, then this call is being made as part +** of a ONEPASS delete that affects multiple rows. In this case, if +** iIdxNoSeek is a valid cursor number (>=0) and is not the same as +** iDataCur, then its position should be preserved following the delete +** operation. Or, if iIdxNoSeek is not a valid cursor number, the +** position of iDataCur should be preserved instead. +** +** iIdxNoSeek: +** If iIdxNoSeek is a valid cursor number (>=0) not equal to iDataCur, +** then it identifies an index cursor (from within array of cursors +** starting at iIdxCur) that already points to the index entry to be deleted. +** Except, this optimization is disabled if there are BEFORE triggers since +** the trigger body might have moved the cursor. */ SQLITE_PRIVATE void sqlite3GenerateRowDelete( Parse *pParse, /* Parsing context */ @@ -95115,7 +109584,8 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( i16 nPk, /* Number of PRIMARY KEY memory cells */ u8 count, /* If non-zero, increment the row change counter */ u8 onconf, /* Default ON CONFLICT policy for triggers */ - u8 bNoSeek /* iDataCur is already pointing to the row to delete */ + u8 eMode, /* ONEPASS_OFF, _SINGLE, or _MULTI. See above */ + int iIdxNoSeek /* Cursor number of cursor that does not need seeking */ ){ Vdbe *v = pParse->pVdbe; /* Vdbe */ int iOld = 0; /* First register in OLD.* array */ @@ -95132,7 +109602,7 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( ** not attempt to delete it or fire any DELETE triggers. */ iLabel = sqlite3VdbeMakeLabel(v); opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; - if( !bNoSeek ){ + if( eMode==ONEPASS_OFF ){ sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); VdbeCoverageIf(v, opSeek==OP_NotExists); VdbeCoverageIf(v, opSeek==OP_NotFound); @@ -95173,13 +109643,18 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( /* If any BEFORE triggers were coded, then seek the cursor to the ** row to be deleted again. It may be that the BEFORE triggers moved - ** the cursor or of already deleted the row that the cursor was + ** the cursor or already deleted the row that the cursor was ** pointing to. + ** + ** Also disable the iIdxNoSeek optimization since the BEFORE trigger + ** may have moved that cursor. */ if( addrStart<sqlite3VdbeCurrentAddr(v) ){ sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); VdbeCoverageIf(v, opSeek==OP_NotExists); VdbeCoverageIf(v, opSeek==OP_NotFound); + testcase( iIdxNoSeek>=0 ); + iIdxNoSeek = -1; } /* Do FK processing. This call checks that any FK constraints that @@ -95190,13 +109665,29 @@ SQLITE_PRIVATE void sqlite3GenerateRowDelete( /* Delete the index and table entries. Skip this step if pTab is really ** a view (in which case the only effect of the DELETE statement is to - ** fire the INSTEAD OF triggers). */ + ** fire the INSTEAD OF triggers). + ** + ** If variable 'count' is non-zero, then this OP_Delete instruction should + ** invoke the update-hook. The pre-update-hook, on the other hand should + ** be invoked unless table pTab is a system table. The difference is that + ** the update-hook is not invoked for rows removed by REPLACE, but the + ** pre-update-hook is. + */ if( pTab->pSelect==0 ){ - sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, 0); + u8 p5 = 0; + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek); sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0)); - if( count ){ - sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT); + if( pParse->nested==0 || 0==sqlite3_stricmp(pTab->zName, "sqlite_stat1") ){ + sqlite3VdbeAppendP4(v, (char*)pTab, P4_TABLE); } + if( eMode!=ONEPASS_OFF ){ + sqlite3VdbeChangeP5(v, OPFLAG_AUXDELETE); + } + if( iIdxNoSeek>=0 && iIdxNoSeek!=iDataCur ){ + sqlite3VdbeAddOp1(v, OP_Delete, iIdxNoSeek); + } + if( eMode==ONEPASS_MULTI ) p5 |= OPFLAG_SAVEPOSITION; + sqlite3VdbeChangeP5(v, p5); } /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to @@ -95239,7 +109730,8 @@ SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete( Table *pTab, /* Table containing the row to be deleted */ int iDataCur, /* Cursor of table holding data. */ int iIdxCur, /* First index cursor */ - int *aRegIdx /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */ + int *aRegIdx, /* Only delete if aRegIdx!=0 && aRegIdx[i]>0 */ + int iIdxNoSeek /* Do not delete from this cursor */ ){ int i; /* Index loop counter */ int r1 = -1; /* Register holding an index key */ @@ -95255,11 +109747,12 @@ SQLITE_PRIVATE void sqlite3GenerateRowIndexDelete( assert( iIdxCur+i!=iDataCur || pPk==pIdx ); if( aRegIdx!=0 && aRegIdx[i]==0 ) continue; if( pIdx==pPk ) continue; + if( iIdxCur+i==iIdxNoSeek ) continue; VdbeModuleComment((v, "GenRowIdxDel for %s", pIdx->zName)); r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 1, - &iPartIdxLabel, pPrior, r1); + &iPartIdxLabel, pPrior, r1); sqlite3VdbeAddOp3(v, OP_IdxDelete, iIdxCur+i, r1, - pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); + pIdx->uniqNotNull ? pIdx->nKeyCol : pIdx->nColumn); sqlite3ResolvePartIdxLabel(pParse, iPartIdxLabel); pPrior = pIdx; } @@ -95308,17 +109801,17 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( ){ Vdbe *v = pParse->pVdbe; int j; - Table *pTab = pIdx->pTable; int regBase; int nCol; if( piPartIdxLabel ){ if( pIdx->pPartIdxWhere ){ *piPartIdxLabel = sqlite3VdbeMakeLabel(v); - pParse->iPartIdxTab = iDataCur; + pParse->iSelfTab = iDataCur + 1; sqlite3ExprCachePush(pParse); - sqlite3ExprIfFalse(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, - SQLITE_JUMPIFNULL); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, + SQLITE_JUMPIFNULL); + pParse->iSelfTab = 0; }else{ *piPartIdxLabel = 0; } @@ -95327,9 +109820,14 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( regBase = sqlite3GetTempRange(pParse, nCol); if( pPrior && (regBase!=regPrior || pPrior->pPartIdxWhere) ) pPrior = 0; for(j=0; j<nCol; j++){ - if( pPrior && pPrior->aiColumn[j]==pIdx->aiColumn[j] ) continue; - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pIdx->aiColumn[j], - regBase+j); + if( pPrior + && pPrior->aiColumn[j]==pIdx->aiColumn[j] + && pPrior->aiColumn[j]!=XN_EXPR + ){ + /* This column was already computed by the previous index */ + continue; + } + sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iDataCur, j, regBase+j); /* If the column affinity is REAL but the number is an integer, then it ** might be stored in the table as an integer (using a compact ** representation) then converted to REAL by an OP_RealAffinity opcode. @@ -95340,6 +109838,10 @@ SQLITE_PRIVATE int sqlite3GenerateIndexKey( } if( regOut ){ sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regOut); + if( pIdx->pTable->pSelect ){ + const char *zAff = sqlite3IndexAffinityStr(pParse->db, pIdx); + sqlite3VdbeChangeP4(v, -1, zAff, P4_TRANSIENT); + } } sqlite3ReleaseTempRange(pParse, regBase, nCol); return regBase; @@ -95374,14 +109876,18 @@ SQLITE_PRIVATE void sqlite3ResolvePartIdxLabel(Parse *pParse, int iLabel){ ** functions of SQLite. (Some function, and in particular the date and ** time functions, are implemented separately.) */ +/* #include "sqliteInt.h" */ /* #include <stdlib.h> */ /* #include <assert.h> */ +/* #include "vdbeInt.h" */ /* ** Return the collating function associated with a function. */ static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ - VdbeOp *pOp = &context->pVdbe->aOp[context->iOp-1]; + VdbeOp *pOp; + assert( context->pVdbe!=0 ); + pOp = &context->pVdbe->aOp[context->iOp-1]; assert( pOp->opcode==OP_CollSeq ); assert( pOp->p4type==P4_COLLSEQ ); return pOp->p4.pColl; @@ -95392,6 +109898,8 @@ static CollSeq *sqlite3GetFuncCollSeq(sqlite3_context *context){ ** iteration of the aggregate loop. */ static void sqlite3SkipAccumulatorLoad(sqlite3_context *context){ + assert( context->isError<=0 ); + context->isError = -1; context->skipFlag = 1; } @@ -95433,16 +109941,20 @@ static void typeofFunc( int NotUsed, sqlite3_value **argv ){ - const char *z = 0; + static const char *azType[] = { "integer", "real", "text", "blob", "null" }; + int i = sqlite3_value_type(argv[0]) - 1; UNUSED_PARAMETER(NotUsed); - switch( sqlite3_value_type(argv[0]) ){ - case SQLITE_INTEGER: z = "integer"; break; - case SQLITE_TEXT: z = "text"; break; - case SQLITE_FLOAT: z = "real"; break; - case SQLITE_BLOB: z = "blob"; break; - default: z = "null"; break; - } - sqlite3_result_text(context, z, -1, SQLITE_STATIC); + assert( i>=0 && i<ArraySize(azType) ); + assert( SQLITE_INTEGER==1 ); + assert( SQLITE_FLOAT==2 ); + assert( SQLITE_TEXT==3 ); + assert( SQLITE_BLOB==4 ); + assert( SQLITE_NULL==5 ); + /* EVIDENCE-OF: R-01470-60482 The sqlite3_value_type(V) interface returns + ** the datatype code for the initial datatype of the sqlite3_value object + ** V. The returned value is one of SQLITE_INTEGER, SQLITE_FLOAT, + ** SQLITE_TEXT, SQLITE_BLOB, or SQLITE_NULL. */ + sqlite3_result_text(context, azType[i], -1, SQLITE_STATIC); } @@ -95454,8 +109966,6 @@ static void lengthFunc( int argc, sqlite3_value **argv ){ - int len; - assert( argc==1 ); UNUSED_PARAMETER(argc); switch( sqlite3_value_type(argv[0]) ){ @@ -95467,13 +109977,17 @@ static void lengthFunc( } case SQLITE_TEXT: { const unsigned char *z = sqlite3_value_text(argv[0]); + const unsigned char *z0; + unsigned char c; if( z==0 ) return; - len = 0; - while( *z ){ - len++; - SQLITE_SKIP_UTF8(z); + z0 = z; + while( (c = *z)!=0 ){ + z++; + if( c>=0xc0 ){ + while( (*z & 0xc0)==0x80 ){ z++; z0++; } + } } - sqlite3_result_int(context, len); + sqlite3_result_int(context, (int)(z-z0)); break; } default: { @@ -95557,23 +110071,26 @@ static void instrFunc( if( typeHaystack==SQLITE_NULL || typeNeedle==SQLITE_NULL ) return; nHaystack = sqlite3_value_bytes(argv[0]); nNeedle = sqlite3_value_bytes(argv[1]); - if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ - zHaystack = sqlite3_value_blob(argv[0]); - zNeedle = sqlite3_value_blob(argv[1]); - isText = 0; - }else{ - zHaystack = sqlite3_value_text(argv[0]); - zNeedle = sqlite3_value_text(argv[1]); - isText = 1; + if( nNeedle>0 ){ + if( typeHaystack==SQLITE_BLOB && typeNeedle==SQLITE_BLOB ){ + zHaystack = sqlite3_value_blob(argv[0]); + zNeedle = sqlite3_value_blob(argv[1]); + isText = 0; + }else{ + zHaystack = sqlite3_value_text(argv[0]); + zNeedle = sqlite3_value_text(argv[1]); + isText = 1; + } + if( zNeedle==0 || (nHaystack && zHaystack==0) ) return; + while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + N++; + do{ + nHaystack--; + zHaystack++; + }while( isText && (zHaystack[0]&0xc0)==0x80 ); + } + if( nNeedle>nHaystack ) N = 0; } - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ - N++; - do{ - nHaystack--; - zHaystack++; - }while( isText && (zHaystack[0]&0xc0)==0x80 ); - } - if( nNeedle>nHaystack ) N = 0; sqlite3_result_int(context, N); } @@ -95589,14 +110106,15 @@ static void printfFunc( StrAccum str; const char *zFormat; int n; + sqlite3 *db = sqlite3_context_db_handle(context); if( argc>=1 && (zFormat = (const char*)sqlite3_value_text(argv[0]))!=0 ){ x.nArg = argc-1; x.nUsed = 0; x.apArg = argv+1; - sqlite3StrAccumInit(&str, 0, 0, SQLITE_MAX_LENGTH); - str.db = sqlite3_context_db_handle(context); - sqlite3XPrintf(&str, SQLITE_PRINTF_SQLFUNC, zFormat, &x); + sqlite3StrAccumInit(&str, db, 0, 0, db->aLimit[SQLITE_LIMIT_LENGTH]); + str.printfFlags = SQLITE_PRINTF_SQLFUNC; + sqlite3_str_appendf(&str, zFormat, &x); n = str.nChar; sqlite3_result_text(context, sqlite3StrAccumFinish(&str), n, SQLITE_DYNAMIC); @@ -95650,6 +110168,14 @@ static void substrFunc( } } } +#ifdef SQLITE_SUBSTR_COMPATIBILITY + /* If SUBSTR_COMPATIBILITY is defined then substr(X,0,N) work the same as + ** as substr(X,1,N) - it returns the first N characters of X. This + ** is essentially a back-out of the bug-fix in check-in [5fc125d362df4b8] + ** from 2009-02-02 for compatibility of applications that exploited the + ** old buggy behavior. */ + if( p1==0 ) p1 = 1; /* <rdar://problem/6778339> */ +#endif if( argc==3 ){ p2 = sqlite3_value_int(argv[2]); if( p2<0 ){ @@ -95737,7 +110263,7 @@ static void roundFunc(sqlite3_context *context, int argc, sqlite3_value **argv){ #endif /* -** Allocate nByte bytes of space using sqlite3_malloc(). If the +** Allocate nByte bytes of space using sqlite3Malloc(). If the ** allocation fails, call sqlite3_result_error_nomem() to notify ** the database handle that malloc() has failed and return NULL. ** If nByte is larger than the maximum string or blob length, then @@ -95916,25 +110442,23 @@ static void total_changes( ** A structure defining how to do GLOB-style comparisons. */ struct compareInfo { - u8 matchAll; - u8 matchOne; - u8 matchSet; - u8 noCase; + u8 matchAll; /* "*" or "%" */ + u8 matchOne; /* "?" or "_" */ + u8 matchSet; /* "[" or 0 */ + u8 noCase; /* true to ignore case differences */ }; /* ** For LIKE and GLOB matching on EBCDIC machines, assume that every -** character is exactly one byte in size. Also, all characters are -** able to participate in upper-case-to-lower-case mappings in EBCDIC -** whereas only characters less than 0x80 do in ASCII. +** character is exactly one byte in size. Also, provde the Utf8Read() +** macro for fast reading of the next character in the common case where +** the next character is ASCII. */ #if defined(SQLITE_EBCDIC) # define sqlite3Utf8Read(A) (*((*A)++)) -# define GlobUpperToLower(A) A = sqlite3UpperToLower[A] -# define GlobUpperToLowerAscii(A) A = sqlite3UpperToLower[A] +# define Utf8Read(A) (*(A++)) #else -# define GlobUpperToLower(A) if( A<=0x7f ){ A = sqlite3UpperToLower[A]; } -# define GlobUpperToLowerAscii(A) A = sqlite3UpperToLower[A] +# define Utf8Read(A) (A[0]<0x80?*(A++):sqlite3Utf8Read(&A)) #endif static const struct compareInfo globInfo = { '*', '?', '[', 0 }; @@ -95946,9 +110470,19 @@ static const struct compareInfo likeInfoNorm = { '%', '_', 0, 1 }; static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; /* -** Compare two UTF-8 strings for equality where the first string can -** potentially be a "glob" or "like" expression. Return true (1) if they -** are the same and false (0) if they are different. +** Possible error returns from patternMatch() +*/ +#define SQLITE_MATCH 0 +#define SQLITE_NOMATCH 1 +#define SQLITE_NOWILDCARDMATCH 2 + +/* +** Compare two UTF-8 strings for equality where the first string is +** a GLOB or LIKE expression. Return values: +** +** SQLITE_MATCH: Match +** SQLITE_NOMATCH: No match +** SQLITE_NOWILDCARDMATCH: No match in spite of having * or % wildcards. ** ** Globbing rules: ** @@ -95976,7 +110510,7 @@ static const struct compareInfo likeInfoAlt = { '%', '_', 0, 0 }; ** Ec Where E is the "esc" character and c is any other ** character, including '%', '_', and esc, match exactly c. ** -** The comments through this routine usually assume glob matching. +** The comments within this routine usually assume glob matching. ** ** This routine is usually quick, but can be N**2 in the worst case. */ @@ -95984,54 +110518,46 @@ static int patternCompare( const u8 *zPattern, /* The glob pattern */ const u8 *zString, /* The string to compare against the glob */ const struct compareInfo *pInfo, /* Information about how to do the compare */ - u32 esc /* The escape character */ + u32 matchOther /* The escape char (LIKE) or '[' (GLOB) */ ){ u32 c, c2; /* Next pattern and input string chars */ u32 matchOne = pInfo->matchOne; /* "?" or "_" */ u32 matchAll = pInfo->matchAll; /* "*" or "%" */ - u32 matchOther; /* "[" or the escape character */ u8 noCase = pInfo->noCase; /* True if uppercase==lowercase */ const u8 *zEscaped = 0; /* One past the last escaped input char */ - /* The GLOB operator does not have an ESCAPE clause. And LIKE does not - ** have the matchSet operator. So we either have to look for one or - ** the other, never both. Hence the single variable matchOther is used - ** to store the one we have to look for. - */ - matchOther = esc ? esc : pInfo->matchSet; - - while( (c = sqlite3Utf8Read(&zPattern))!=0 ){ + while( (c = Utf8Read(zPattern))!=0 ){ if( c==matchAll ){ /* Match "*" */ /* Skip over multiple "*" characters in the pattern. If there ** are also "?" characters, skip those as well, but consume a ** single character of the input string for each "?" skipped */ - while( (c=sqlite3Utf8Read(&zPattern)) == matchAll - || c == matchOne ){ + while( (c=Utf8Read(zPattern)) == matchAll || c == matchOne ){ if( c==matchOne && sqlite3Utf8Read(&zString)==0 ){ - return 0; + return SQLITE_NOWILDCARDMATCH; } } if( c==0 ){ - return 1; /* "*" at the end of the pattern matches */ + return SQLITE_MATCH; /* "*" at the end of the pattern matches */ }else if( c==matchOther ){ - if( esc ){ + if( pInfo->matchSet==0 ){ c = sqlite3Utf8Read(&zPattern); - if( c==0 ) return 0; + if( c==0 ) return SQLITE_NOWILDCARDMATCH; }else{ /* "[...]" immediately follows the "*". We have to do a slow ** recursive search in this case, but it is an unusual case. */ assert( matchOther<0x80 ); /* '[' is a single-byte character */ - while( *zString - && patternCompare(&zPattern[-1],zString,pInfo,esc)==0 ){ + while( *zString ){ + int bMatch = patternCompare(&zPattern[-1],zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; SQLITE_SKIP_UTF8(zString); } - return *zString!=0; + return SQLITE_NOWILDCARDMATCH; } } /* At this point variable c contains the first character of the ** pattern string past the "*". Search in the input string for the - ** first matching character and recursively contine the match from + ** first matching character and recursively continue the match from ** that point. ** ** For a case-insensitive search, set variable cx to be the same as @@ -96039,36 +110565,44 @@ static int patternCompare( ** c or cx. */ if( c<=0x80 ){ - u32 cx; + char zStop[3]; + int bMatch; if( noCase ){ - cx = sqlite3Toupper(c); - c = sqlite3Tolower(c); + zStop[0] = sqlite3Toupper(c); + zStop[1] = sqlite3Tolower(c); + zStop[2] = 0; }else{ - cx = c; + zStop[0] = c; + zStop[1] = 0; } - while( (c2 = *(zString++))!=0 ){ - if( c2!=c && c2!=cx ) continue; - if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; + while(1){ + zString += strcspn((const char*)zString, zStop); + if( zString[0]==0 ) break; + zString++; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; } }else{ - while( (c2 = sqlite3Utf8Read(&zString))!=0 ){ + int bMatch; + while( (c2 = Utf8Read(zString))!=0 ){ if( c2!=c ) continue; - if( patternCompare(zPattern,zString,pInfo,esc) ) return 1; + bMatch = patternCompare(zPattern,zString,pInfo,matchOther); + if( bMatch!=SQLITE_NOMATCH ) return bMatch; } } - return 0; + return SQLITE_NOWILDCARDMATCH; } if( c==matchOther ){ - if( esc ){ + if( pInfo->matchSet==0 ){ c = sqlite3Utf8Read(&zPattern); - if( c==0 ) return 0; + if( c==0 ) return SQLITE_NOMATCH; zEscaped = zPattern; }else{ u32 prior_c = 0; int seen = 0; int invert = 0; c = sqlite3Utf8Read(&zString); - if( c==0 ) return 0; + if( c==0 ) return SQLITE_NOMATCH; c2 = sqlite3Utf8Read(&zPattern); if( c2=='^' ){ invert = 1; @@ -96092,27 +110626,36 @@ static int patternCompare( c2 = sqlite3Utf8Read(&zPattern); } if( c2==0 || (seen ^ invert)==0 ){ - return 0; + return SQLITE_NOMATCH; } continue; } } - c2 = sqlite3Utf8Read(&zString); + c2 = Utf8Read(zString); if( c==c2 ) continue; - if( noCase && c<0x80 && c2<0x80 && sqlite3Tolower(c)==sqlite3Tolower(c2) ){ + if( noCase && sqlite3Tolower(c)==sqlite3Tolower(c2) && c<0x80 && c2<0x80 ){ continue; } if( c==matchOne && zPattern!=zEscaped && c2!=0 ) continue; - return 0; + return SQLITE_NOMATCH; } - return *zString==0; + return *zString==0 ? SQLITE_MATCH : SQLITE_NOMATCH; } /* -** The sqlite3_strglob() interface. +** The sqlite3_strglob() interface. Return 0 on a match (like strcmp()) and +** non-zero if there is no match. */ SQLITE_API int sqlite3_strglob(const char *zGlobPattern, const char *zString){ - return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, 0)==0; + return patternCompare((u8*)zGlobPattern, (u8*)zString, &globInfo, '['); +} + +/* +** The sqlite3_strlike() interface. Return 0 on a match and non-zero for +** a miss - like strcmp(). +*/ +SQLITE_API int sqlite3_strlike(const char *zPattern, const char *zStr, unsigned int esc){ + return patternCompare((u8*)zPattern, (u8*)zStr, &likeInfoNorm, esc); } /* @@ -96143,10 +110686,22 @@ static void likeFunc( sqlite3_value **argv ){ const unsigned char *zA, *zB; - u32 escape = 0; + u32 escape; int nPat; sqlite3 *db = sqlite3_context_db_handle(context); + struct compareInfo *pInfo = sqlite3_user_data(context); +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( sqlite3_value_type(argv[0])==SQLITE_BLOB + || sqlite3_value_type(argv[1])==SQLITE_BLOB + ){ +#ifdef SQLITE_TEST + sqlite3_like_count++; +#endif + sqlite3_result_int(context, 0); + return; + } +#endif zB = sqlite3_value_text(argv[0]); zA = sqlite3_value_text(argv[1]); @@ -96174,14 +110729,15 @@ static void likeFunc( return; } escape = sqlite3Utf8Read(&zEsc); + }else{ + escape = pInfo->matchSet; } if( zA && zB ){ - struct compareInfo *pInfo = sqlite3_user_data(context); #ifdef SQLITE_TEST sqlite3_like_count++; #endif - - sqlite3_result_int(context, patternCompare(zB, zA, pInfo, escape)); + sqlite3_result_int(context, + patternCompare(zB, zA, pInfo, escape)==SQLITE_MATCH); } } @@ -96406,7 +110962,7 @@ static void charFunc( ){ unsigned char *z, *zOut; int i; - zOut = z = sqlite3_malloc( argc*4+1 ); + zOut = z = sqlite3_malloc64( argc*4+1 ); if( z==0 ){ sqlite3_result_error_nomem(context); return; @@ -96474,16 +111030,14 @@ static void zeroblobFunc( sqlite3_value **argv ){ i64 n; - sqlite3 *db = sqlite3_context_db_handle(context); + int rc; assert( argc==1 ); UNUSED_PARAMETER(argc); n = sqlite3_value_int64(argv[0]); - testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH] ); - testcase( n==db->aLimit[SQLITE_LIMIT_LENGTH]+1 ); - if( n>db->aLimit[SQLITE_LIMIT_LENGTH] ){ - sqlite3_result_error_toobig(context); - }else{ - sqlite3_result_zeroblob(context, (int)n); /* IMP: R-00293-64994 */ + if( n<0 ) n = 0; + rc = sqlite3_result_zeroblob64(context, n); /* IMP: R-00293-64994 */ + if( rc ){ + sqlite3_result_error_code(context, rc); } } @@ -96508,6 +111062,8 @@ static void replaceFunc( i64 nOut; /* Maximum size of zOut */ int loopLimit; /* Last zStr[] that might match zPattern[] */ int i, j; /* Loop counters */ + unsigned cntExpand; /* Number zOut expansions */ + sqlite3 *db = sqlite3_context_db_handle(context); assert( argc==3 ); UNUSED_PARAMETER(argc); @@ -96539,33 +111095,40 @@ static void replaceFunc( return; } loopLimit = nStr - nPattern; + cntExpand = 0; for(i=j=0; i<=loopLimit; i++){ if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){ zOut[j++] = zStr[i]; }else{ - u8 *zOld; - sqlite3 *db = sqlite3_context_db_handle(context); - nOut += nRep - nPattern; - testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] ); - testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] ); - if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ - sqlite3_result_error_toobig(context); - sqlite3_free(zOut); - return; - } - zOld = zOut; - zOut = sqlite3_realloc(zOut, (int)nOut); - if( zOut==0 ){ - sqlite3_result_error_nomem(context); - sqlite3_free(zOld); - return; + if( nRep>nPattern ){ + nOut += nRep - nPattern; + testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] ); + testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] ); + if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(context); + sqlite3_free(zOut); + return; + } + cntExpand++; + if( (cntExpand&(cntExpand-1))==0 ){ + /* Grow the size of the output buffer only on substitutions + ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */ + u8 *zOld; + zOld = zOut; + zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1)); + if( zOut==0 ){ + sqlite3_result_error_nomem(context); + sqlite3_free(zOld); + return; + } + } } memcpy(&zOut[j], zRep, nRep); j += nRep; i += nPattern-1; } } - assert( j+nStr-i+1==nOut ); + assert( j+nStr-i+1<=nOut ); memcpy(&zOut[j], &zStr[i], nStr-i); j += nStr - i; assert( j<=nOut ); @@ -96658,6 +111221,26 @@ static void trimFunc( } +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION +/* +** The "unknown" function is automatically substituted in place of +** any unrecognized function name when doing an EXPLAIN or EXPLAIN QUERY PLAN +** when the SQLITE_ENABLE_UNKNOWN_FUNCTION compile-time option is used. +** When the "sqlite3" command-line shell is built using this functionality, +** that allows an EXPLAIN or EXPLAIN QUERY PLAN for complex queries +** involving application-defined functions to be examined in a generic +** sqlite3 shell. +*/ +static void unknownFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + /* no-op */ +} +#endif /*SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION*/ + + /* IMP: R-25361-16150 This function is omitted from SQLite by default. It ** is only available if the SQLITE_SOUNDEX compile-time option is used ** when SQLite is built. @@ -96728,6 +111311,14 @@ static void loadExt(sqlite3_context *context, int argc, sqlite3_value **argv){ sqlite3 *db = sqlite3_context_db_handle(context); char *zErrMsg = 0; + /* Disallow the load_extension() SQL function unless the SQLITE_LoadExtFunc + ** flag is set. See the sqlite3_enable_load_extension() API. + */ + if( (db->flags & SQLITE_LoadExtFunc)==0 ){ + sqlite3_result_error(context, "not authorized", -1); + return; + } + if( argc==2 ){ zProc = (const char *)sqlite3_value_text(argv[1]); }else{ @@ -96916,8 +111507,7 @@ static void groupConcatStep( if( pAccum ){ sqlite3 *db = sqlite3_context_db_handle(context); - int firstTerm = pAccum->useMalloc==0; - pAccum->useMalloc = 2; + int firstTerm = pAccum->mxAlloc==0; pAccum->mxAlloc = db->aLimit[SQLITE_LIMIT_LENGTH]; if( !firstTerm ){ if( argc==2 ){ @@ -96927,20 +111517,20 @@ static void groupConcatStep( zSep = ","; nSep = 1; } - if( nSep ) sqlite3StrAccumAppend(pAccum, zSep, nSep); + if( zSep ) sqlite3_str_append(pAccum, zSep, nSep); } zVal = (char*)sqlite3_value_text(argv[0]); nVal = sqlite3_value_bytes(argv[0]); - if( zVal ) sqlite3StrAccumAppend(pAccum, zVal, nVal); + if( zVal ) sqlite3_str_append(pAccum, zVal, nVal); } } static void groupConcatFinalize(sqlite3_context *context){ StrAccum *pAccum; pAccum = sqlite3_aggregate_context(context, 0); if( pAccum ){ - if( pAccum->accError==STRACCUM_TOOBIG ){ + if( pAccum->accError==SQLITE_TOOBIG ){ sqlite3_result_error_toobig(context); - }else if( pAccum->accError==STRACCUM_NOMEM ){ + }else if( pAccum->accError==SQLITE_NOMEM ){ sqlite3_result_error_nomem(context); }else{ sqlite3_result_text(context, sqlite3StrAccumFinish(pAccum), -1, @@ -96954,11 +111544,11 @@ static void groupConcatFinalize(sqlite3_context *context){ ** of the built-in functions above are part of the global function set. ** This routine only deals with those that are not global. */ -SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ +SQLITE_PRIVATE void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3 *db){ int rc = sqlite3_overload_function(db, "MATCH", 2); assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); if( rc==SQLITE_NOMEM ){ - db->mallocFailed = 1; + sqlite3OomFault(db); } } @@ -96967,8 +111557,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ */ static void setLikeOptFlag(sqlite3 *db, const char *zName, u8 flagVal){ FuncDef *pDef; - pDef = sqlite3FindFunction(db, zName, sqlite3Strlen30(zName), - 2, SQLITE_UTF8, 0); + pDef = sqlite3FindFunction(db, zName, 2, SQLITE_UTF8, 0); if( ALWAYS(pDef) ){ pDef->funcFlags |= flagVal; } @@ -96998,25 +111587,42 @@ SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive) /* ** pExpr points to an expression which implements a function. If ** it is appropriate to apply the LIKE optimization to that function -** then set aWc[0] through aWc[2] to the wildcard characters and -** return TRUE. If the function is not a LIKE-style function then -** return FALSE. +** then set aWc[0] through aWc[2] to the wildcard characters and the +** escape character and then return TRUE. If the function is not a +** LIKE-style function then return FALSE. +** +** The expression "a LIKE b ESCAPE c" is only considered a valid LIKE +** operator if c is a string literal that is exactly one byte in length. +** That one byte is stored in aWc[3]. aWc[3] is set to zero if there is +** no ESCAPE clause. +** +** *pIsNocase is set to true if uppercase and lowercase are equivalent for +** the function (default for LIKE). If the function makes the distinction +** between uppercase and lowercase (as does GLOB) then *pIsNocase is set to +** false. */ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocase, char *aWc){ FuncDef *pDef; - if( pExpr->op!=TK_FUNCTION - || !pExpr->x.pList - || pExpr->x.pList->nExpr!=2 - ){ + int nExpr; + if( pExpr->op!=TK_FUNCTION || !pExpr->x.pList ){ return 0; } assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - pDef = sqlite3FindFunction(db, pExpr->u.zToken, - sqlite3Strlen30(pExpr->u.zToken), - 2, SQLITE_UTF8, 0); + nExpr = pExpr->x.pList->nExpr; + pDef = sqlite3FindFunction(db, pExpr->u.zToken, nExpr, SQLITE_UTF8, 0); if( NEVER(pDef==0) || (pDef->funcFlags & SQLITE_FUNC_LIKE)==0 ){ return 0; } + if( nExpr<3 ){ + aWc[3] = 0; + }else{ + Expr *pEscape = pExpr->x.pList->a[2].pExpr; + char *zEscape; + if( pEscape->op!=TK_STRING ) return 0; + zEscape = pEscape->u.zToken; + if( zEscape[0]==0 || zEscape[1]!=0 ) return 0; + aWc[3] = zEscape[0]; + } /* The memcpy() statement assumes that the wildcard characters are ** the first three statements in the compareInfo structure. The @@ -97037,7 +111643,7 @@ SQLITE_PRIVATE int sqlite3IsLikeFunction(sqlite3 *db, Expr *pExpr, int *pIsNocas ** ** After this routine runs */ -SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){ +SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ /* ** The following array holds FuncDef structures for all of the functions ** defined in this file. @@ -97045,8 +111651,34 @@ SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){ ** The array cannot be constant since changes are made to the ** FuncDef.pHash elements at start-time. The elements of this array ** are read-only after initialization is complete. + ** + ** For peak efficiency, put the most frequently used function last. */ - static SQLITE_WSD FuncDef aBuiltinFunc[] = { + static FuncDef aBuiltinFunc[] = { +#ifdef SQLITE_SOUNDEX + FUNCTION(soundex, 1, 0, 0, soundexFunc ), +#endif +#ifndef SQLITE_OMIT_LOAD_EXTENSION + VFUNCTION(load_extension, 1, 0, 0, loadExt ), + VFUNCTION(load_extension, 2, 0, 0, loadExt ), +#endif +#if SQLITE_USER_AUTHENTICATION + FUNCTION(sqlite_crypt, 2, 0, 0, sqlite3CryptFunc ), +#endif +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS + DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), + DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), +#ifdef SQLITE_DEBUG + FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY), +#endif +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| + SQLITE_FUNC_TYPEOF), +#endif FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ), FUNCTION(rtrim, 1, 2, 0, trimFunc ), @@ -97064,8 +111696,6 @@ SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){ FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF), FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH), FUNCTION(instr, 2, 0, 0, instrFunc ), - FUNCTION(substr, 2, 0, 0, substrFunc ), - FUNCTION(substr, 3, 0, 0, substrFunc ), FUNCTION(printf, -1, 0, 0, printfFunc ), FUNCTION(unicode, 1, 0, 0, unicodeFunc ), FUNCTION(char, -1, 0, 0, charFunc ), @@ -97076,40 +111706,22 @@ SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){ #endif FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), - FUNCTION(coalesce, 1, 0, 0, 0 ), - FUNCTION(coalesce, 0, 0, 0, 0 ), - FUNCTION2(coalesce, -1, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), FUNCTION(hex, 1, 0, 0, hexFunc ), FUNCTION2(ifnull, 2, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), - FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), VFUNCTION(random, 0, 0, 0, randomFunc ), VFUNCTION(randomblob, 1, 0, 0, randomBlob ), FUNCTION(nullif, 2, 0, 1, nullifFunc ), - FUNCTION(sqlite_version, 0, 0, 0, versionFunc ), - FUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), + DFUNCTION(sqlite_version, 0, 0, 0, versionFunc ), + DFUNCTION(sqlite_source_id, 0, 0, 0, sourceidFunc ), FUNCTION(sqlite_log, 2, 0, 0, errlogFunc ), -#if SQLITE_USER_AUTHENTICATION - FUNCTION(sqlite_crypt, 2, 0, 0, sqlite3CryptFunc ), -#endif -#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS - FUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), - FUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), -#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ FUNCTION(quote, 1, 0, 0, quoteFunc ), VFUNCTION(last_insert_rowid, 0, 0, 0, last_insert_rowid), VFUNCTION(changes, 0, 0, 0, changes ), VFUNCTION(total_changes, 0, 0, 0, total_changes ), FUNCTION(replace, 3, 0, 0, replaceFunc ), FUNCTION(zeroblob, 1, 0, 0, zeroblobFunc ), - #ifdef SQLITE_SOUNDEX - FUNCTION(soundex, 1, 0, 0, soundexFunc ), - #endif - #ifndef SQLITE_OMIT_LOAD_EXTENSION - FUNCTION(load_extension, 1, 0, 0, loadExt ), - FUNCTION(load_extension, 2, 0, 0, loadExt ), - #endif + FUNCTION(substr, 2, 0, 0, substrFunc ), + FUNCTION(substr, 3, 0, 0, substrFunc ), AGGREGATE(sum, 1, 0, 0, sumStep, sumFinalize ), AGGREGATE(total, 1, 0, 0, sumStep, totalFinalize ), AGGREGATE(avg, 1, 0, 0, sumStep, avgFinalize ), @@ -97120,28 +111732,43 @@ SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){ AGGREGATE(group_concat, 2, 0, 0, groupConcatStep, groupConcatFinalize), LIKEFUNC(glob, 2, &globInfo, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), - #ifdef SQLITE_CASE_SENSITIVE_LIKE +#ifdef SQLITE_CASE_SENSITIVE_LIKE LIKEFUNC(like, 2, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), LIKEFUNC(like, 3, &likeInfoAlt, SQLITE_FUNC_LIKE|SQLITE_FUNC_CASE), - #else +#else LIKEFUNC(like, 2, &likeInfoNorm, SQLITE_FUNC_LIKE), LIKEFUNC(like, 3, &likeInfoNorm, SQLITE_FUNC_LIKE), - #endif +#endif +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION + FUNCTION(unknown, -1, 0, 0, unknownFunc ), +#endif + FUNCTION(coalesce, 1, 0, 0, 0 ), + FUNCTION(coalesce, 0, 0, 0, 0 ), + FUNCTION2(coalesce, -1, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), }; - - int i; - FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); - FuncDef *aFunc = (FuncDef*)&GLOBAL(FuncDef, aBuiltinFunc); - - for(i=0; i<ArraySize(aBuiltinFunc); i++){ - sqlite3FuncDefInsert(pHash, &aFunc[i]); - } - sqlite3RegisterDateTimeFunctions(); #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); #endif #if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4) sqlite3AnalyzeFunctions(); +#endif + sqlite3RegisterDateTimeFunctions(); + sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); + +#if 0 /* Enable to print out how the built-in functions are hashed */ + { + int i; + FuncDef *p; + for(i=0; i<SQLITE_FUNC_HASH_SZ; i++){ + printf("FUNC-HASH %02d:", i); + for(p=sqlite3BuiltinFunctions.a[i]; p; p=p->u.pHash){ + int n = sqlite3Strlen30(p->zName); + int h = p->zName[0] + n; + printf(" %s(%d)", p->zName, h); + } + printf("\n"); + } + } #endif } @@ -97160,6 +111787,7 @@ SQLITE_PRIVATE void sqlite3RegisterGlobalFunctions(void){ ** This file contains code used by the compiler to add foreign key ** support to compiled SQL statements. */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_FOREIGN_KEY #ifndef SQLITE_OMIT_TRIGGER @@ -97367,13 +111995,13 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( } }else if( paiCol ){ assert( nCol>1 ); - aiCol = (int *)sqlite3DbMallocRaw(pParse->db, nCol*sizeof(int)); + aiCol = (int *)sqlite3DbMallocRawNN(pParse->db, nCol*sizeof(int)); if( !aiCol ) return 1; *paiCol = aiCol; } for(pIdx=pParent->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) ){ + if( pIdx->nKeyCol==nCol && IsUniqueIndex(pIdx) && pIdx->pPartIdxWhere==0 ){ /* pIdx is a UNIQUE index (or a PRIMARY KEY) and has the right number ** of columns. If each indexed column corresponds to a foreign key ** column of pFKey, then this index is a winner. */ @@ -97397,16 +112025,16 @@ SQLITE_PRIVATE int sqlite3FkLocateIndex( int i, j; for(i=0; i<nCol; i++){ i16 iCol = pIdx->aiColumn[i]; /* Index of column in parent tbl */ - char *zDfltColl; /* Def. collation for column */ + const char *zDfltColl; /* Def. collation for column */ char *zIdxCol; /* Name of indexed column */ + if( iCol<0 ) break; /* No foreign keys against expression indexes */ + /* If the index uses a collation sequence that is different from ** the default collation sequence for the column, this index is ** unusable. Bail out early in this case. */ zDfltColl = pParent->aCol[iCol].zColl; - if( !zDfltColl ){ - zDfltColl = "BINARY"; - } + if( !zDfltColl ) zDfltColl = sqlite3StrBINARY; if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break; zIdxCol = pParent->aCol[iCol].zName; @@ -97479,6 +112107,12 @@ static void fkLookupParent( int iCur = pParse->nTab - 1; /* Cursor number to use */ int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */ + sqlite3VdbeVerifyAbortable(v, + (!pFKey->isDeferred + && !(pParse->db->flags & SQLITE_DeferFKs) + && !pParse->pToplevel + && !pParse->isMultiWrite) ? OE_Abort : OE_Ignore); + /* If nIncr is less than zero, then check at runtime if there are any ** outstanding constraints to resolve. If there are not, there is no need ** to check if deleting this row resolves any outstanding violations. @@ -97522,7 +112156,7 @@ static void fkLookupParent( sqlite3OpenTable(pParse, iCur, iDb, pTab, OP_OpenRead); sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, regTemp); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk); + sqlite3VdbeGoto(v, iOk); sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); sqlite3VdbeJumpHere(v, iMustBeInt); sqlite3ReleaseTempReg(pParse, regTemp); @@ -97552,6 +112186,7 @@ static void fkLookupParent( for(i=0; i<nCol; i++){ int iChild = aiCol[i]+1+regData; int iParent = pIdx->aiColumn[i]+1+regData; + assert( pIdx->aiColumn[i]>=0 ); assert( aiCol[i]!=pTab->iPKey ); if( pIdx->aiColumn[i]==pTab->iPKey ){ /* The parent key is a composite key that includes the IPK column */ @@ -97560,11 +112195,11 @@ static void fkLookupParent( sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); } - sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk); + sqlite3VdbeGoto(v, iOk); } sqlite3VdbeAddOp4(v, OP_MakeRecord, regTemp, nCol, regRec, - sqlite3IndexAffinityStr(v,pIdx), nCol); + sqlite3IndexAffinityStr(pParse->db,pIdx), nCol); sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v); sqlite3ReleaseTempReg(pParse, regRec); @@ -97731,7 +112366,7 @@ static void fkScanChildren( assert( iCol>=0 ); zCol = pFKey->pFrom->aCol[iCol].zName; pRight = sqlite3Expr(db, TK_ID, zCol); - pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); pWhere = sqlite3ExprAnd(db, pWhere, pEq); } @@ -97753,19 +112388,20 @@ static void fkScanChildren( if( HasRowid(pTab) ){ pLeft = exprTableRegister(pParse, pTab, regData, -1); pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, -1); - pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight, 0); + pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); }else{ Expr *pEq, *pAll = 0; Index *pPk = sqlite3PrimaryKeyIndex(pTab); assert( pIdx!=0 ); for(i=0; i<pPk->nKeyCol; i++){ i16 iCol = pIdx->aiColumn[i]; + assert( iCol>=0 ); pLeft = exprTableRegister(pParse, pTab, regData, iCol); pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, iCol); - pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0); + pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); pAll = sqlite3ExprAnd(db, pAll, pEq); } - pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0, 0); + pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); } pWhere = sqlite3ExprAnd(db, pWhere, pNe); } @@ -97779,10 +112415,12 @@ static void fkScanChildren( /* Create VDBE to loop through the entries in pSrc that match the WHERE ** clause. For each row found, increment either the deferred or immediate ** foreign key constraint counter. */ - pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0); - sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); - if( pWInfo ){ - sqlite3WhereEnd(pWInfo); + if( pParse->nErr==0 ){ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0, 0); + sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr); + if( pWInfo ){ + sqlite3WhereEnd(pWInfo); + } } /* Clean up the WHERE clause constructed above. */ @@ -97869,7 +112507,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa } pParse->disableTriggers = 1; - sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0); + sqlite3DeleteFrom(pParse, sqlite3SrcListDup(db, pName, 0), 0, 0, 0); pParse->disableTriggers = 0; /* If the DELETE has generated immediate foreign key constraint @@ -97882,6 +112520,7 @@ SQLITE_PRIVATE void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTa ** constraints are violated. */ if( (db->flags & SQLITE_DeferFKs)==0 ){ + sqlite3VdbeVerifyAbortable(v, OE_Abort); sqlite3VdbeAddOp2(v, OP_FkIfZero, 0, sqlite3VdbeCurrentAddr(v)+2); VdbeCoverage(v); sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_FOREIGNKEY, @@ -98017,7 +112656,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( if( (db->flags&SQLITE_ForeignKeys)==0 ) return; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - zDb = db->aDb[iDb].zName; + zDb = db->aDb[iDb].zDbSName; /* Loop through all the foreign key constraints for which pTab is the ** child table (the table that the foreign key definition is part of). */ @@ -98079,6 +112718,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( if( aiCol[i]==pTab->iPKey ){ aiCol[i] = -1; } + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); #ifndef SQLITE_OMIT_AUTHORIZATION /* Request permission to read the parent key columns. If the ** authorization callback returns SQLITE_IGNORE, behave as if any @@ -98152,7 +112792,7 @@ SQLITE_PRIVATE void sqlite3FkCheck( struct SrcList_item *pItem = pSrc->a; pItem->pTab = pFKey->pFrom; pItem->zName = pFKey->pFrom->zName; - pItem->pTab->nRef++; + pItem->pTab->nTabRef++; pItem->iCursor = pParse->nTab++; if( regNew!=0 ){ @@ -98210,7 +112850,10 @@ SQLITE_PRIVATE u32 sqlite3FkOldmask( Index *pIdx = 0; sqlite3FkLocateIndex(pParse, pTab, p, &pIdx, 0); if( pIdx ){ - for(i=0; i<pIdx->nKeyCol; i++) mask |= COLUMN_MASK(pIdx->aiColumn[i]); + for(i=0; i<pIdx->nKeyCol; i++){ + assert( pIdx->aiColumn[i]>=0 ); + mask |= COLUMN_MASK(pIdx->aiColumn[i]); + } } } } @@ -98229,8 +112872,16 @@ SQLITE_PRIVATE u32 sqlite3FkOldmask( ** UPDATE statement modifies the rowid fields of the table. ** ** If any foreign key processing will be required, this function returns -** true. If there is no foreign key related processing, this function -** returns false. +** non-zero. If there is no foreign key related processing, this function +** returns zero. +** +** For an UPDATE, this function returns 2 if: +** +** * There are any FKs for which pTab is the child and the parent table, or +** * the UPDATE modifies one or more parent keys for which the action is +** not "NO ACTION" (i.e. is CASCADE, SET DEFAULT or SET NULL). +** +** Or, assuming some other foreign key processing is required, 1. */ SQLITE_PRIVATE int sqlite3FkRequired( Parse *pParse, /* Parse context */ @@ -98238,12 +112889,13 @@ SQLITE_PRIVATE int sqlite3FkRequired( int *aChange, /* Non-NULL for UPDATE operations */ int chngRowid /* True for UPDATE that affects rowid */ ){ + int eRet = 0; if( pParse->db->flags&SQLITE_ForeignKeys ){ if( !aChange ){ /* A DELETE operation. Foreign key processing is required if the ** table in question is either the child or parent table for any ** foreign key constraint. */ - return (sqlite3FkReferences(pTab) || pTab->pFKey); + eRet = (sqlite3FkReferences(pTab) || pTab->pFKey); }else{ /* This is an UPDATE. Foreign key processing is only required if the ** operation modifies one or more child or parent key columns. */ @@ -98251,16 +112903,22 @@ SQLITE_PRIVATE int sqlite3FkRequired( /* Check if any child key columns are being modified. */ for(p=pTab->pFKey; p; p=p->pNextFrom){ - if( fkChildIsModified(pTab, p, aChange, chngRowid) ) return 1; + if( 0==sqlite3_stricmp(pTab->zName, p->zTo) ) return 2; + if( fkChildIsModified(pTab, p, aChange, chngRowid) ){ + eRet = 1; + } } /* Check if any parent key columns are being modified. */ for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ - if( fkParentIsModified(pTab, p, aChange, chngRowid) ) return 1; + if( fkParentIsModified(pTab, p, aChange, chngRowid) ){ + if( p->aAction[1]!=OE_None ) return 2; + eRet = 1; + } } } } - return 0; + return eRet; } /* @@ -98304,10 +112962,12 @@ static Trigger *fkActionTrigger( int iAction = (pChanges!=0); /* 1 for UPDATE, 0 for DELETE */ action = pFKey->aAction[iAction]; + if( action==OE_Restrict && (db->flags & SQLITE_DeferFKs) ){ + return 0; + } pTrigger = pFKey->apTrigger[iAction]; if( action!=OE_None && !pTrigger ){ - u8 enableLookaside; /* Copy of db->lookaside.bEnabled */ char const *zFrom; /* Name of child table */ int nFrom; /* Length in bytes of zFrom */ Index *pIdx = 0; /* Parent key index for this FK */ @@ -98332,11 +112992,11 @@ static Trigger *fkActionTrigger( iFromCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; assert( iFromCol>=0 ); - tToCol.z = pIdx ? pTab->aCol[pIdx->aiColumn[i]].zName : "oid"; - tFromCol.z = pFKey->pFrom->aCol[iFromCol].zName; - - tToCol.n = sqlite3Strlen30(tToCol.z); - tFromCol.n = sqlite3Strlen30(tFromCol.z); + assert( pIdx!=0 || (pTab->iPKey>=0 && pTab->iPKey<pTab->nCol) ); + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); + sqlite3TokenInit(&tToCol, + pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zName); + sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zName); /* Create the expression "OLD.zToCol = zFromCol". It is important ** that the "OLD.zToCol" term is on the LHS of the = operator, so @@ -98344,11 +113004,10 @@ static Trigger *fkActionTrigger( ** parent table are used for the comparison. */ pEq = sqlite3PExpr(pParse, TK_EQ, sqlite3PExpr(pParse, TK_DOT, - sqlite3PExpr(pParse, TK_ID, 0, 0, &tOld), - sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol) - , 0), - sqlite3PExpr(pParse, TK_ID, 0, 0, &tFromCol) - , 0); + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), + sqlite3ExprAlloc(db, TK_ID, &tFromCol, 0) + ); pWhere = sqlite3ExprAnd(db, pWhere, pEq); /* For ON UPDATE, construct the next term of the WHEN clause. @@ -98359,14 +113018,12 @@ static Trigger *fkActionTrigger( if( pChanges ){ pEq = sqlite3PExpr(pParse, TK_IS, sqlite3PExpr(pParse, TK_DOT, - sqlite3PExpr(pParse, TK_ID, 0, 0, &tOld), - sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol), - 0), + sqlite3ExprAlloc(db, TK_ID, &tOld, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)), sqlite3PExpr(pParse, TK_DOT, - sqlite3PExpr(pParse, TK_ID, 0, 0, &tNew), - sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol), - 0), - 0); + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)) + ); pWhen = sqlite3ExprAnd(db, pWhen, pEq); } @@ -98374,18 +113031,17 @@ static Trigger *fkActionTrigger( Expr *pNew; if( action==OE_Cascade ){ pNew = sqlite3PExpr(pParse, TK_DOT, - sqlite3PExpr(pParse, TK_ID, 0, 0, &tNew), - sqlite3PExpr(pParse, TK_ID, 0, 0, &tToCol) - , 0); + sqlite3ExprAlloc(db, TK_ID, &tNew, 0), + sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)); }else if( action==OE_SetDflt ){ Expr *pDflt = pFKey->pFrom->aCol[iFromCol].pDflt; if( pDflt ){ pNew = sqlite3ExprDup(db, pDflt, 0); }else{ - pNew = sqlite3PExpr(pParse, TK_NULL, 0, 0, 0); + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); } }else{ - pNew = sqlite3PExpr(pParse, TK_NULL, 0, 0, 0); + pNew = sqlite3ExprAlloc(db, TK_NULL, 0, 0); } pList = sqlite3ExprListAppend(pParse, pList, pNew); sqlite3ExprListSetName(pParse, pList, &tFromCol, 0); @@ -98410,37 +113066,35 @@ static Trigger *fkActionTrigger( sqlite3ExprListAppend(pParse, 0, pRaise), sqlite3SrcListAppend(db, 0, &tFrom, 0), pWhere, - 0, 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0 ); pWhere = 0; } /* Disable lookaside memory allocation */ - enableLookaside = db->lookaside.bEnabled; - db->lookaside.bEnabled = 0; + db->lookaside.bDisable++; pTrigger = (Trigger *)sqlite3DbMallocZero(db, sizeof(Trigger) + /* struct Trigger */ sizeof(TriggerStep) + /* Single step in trigger program */ - nFrom + 1 /* Space for pStep->target.z */ + nFrom + 1 /* Space for pStep->zTarget */ ); if( pTrigger ){ pStep = pTrigger->step_list = (TriggerStep *)&pTrigger[1]; - pStep->target.z = (char *)&pStep[1]; - pStep->target.n = nFrom; - memcpy((char *)pStep->target.z, zFrom, nFrom); + pStep->zTarget = (char *)&pStep[1]; + memcpy((char *)pStep->zTarget, zFrom, nFrom); pStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); pStep->pExprList = sqlite3ExprListDup(db, pList, EXPRDUP_REDUCE); pStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); if( pWhen ){ - pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0, 0); + pWhen = sqlite3PExpr(pParse, TK_NOT, pWhen, 0); pTrigger->pWhen = sqlite3ExprDup(db, pWhen, EXPRDUP_REDUCE); } } /* Re-enable the lookaside buffer, if it was disabled earlier. */ - db->lookaside.bEnabled = enableLookaside; + db->lookaside.bDisable--; sqlite3ExprDelete(db, pWhere); sqlite3ExprDelete(db, pWhen); @@ -98514,7 +113168,8 @@ SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ FKey *pFKey; /* Iterator variable */ FKey *pNext; /* Copy of pFKey->pNextFrom */ - assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); + assert( db==0 || IsVirtual(pTab) + || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){ /* Remove the FK from the fkeyHash hash table. */ @@ -98564,6 +113219,7 @@ SQLITE_PRIVATE void sqlite3FkDelete(sqlite3 *db, Table *pTab){ ** This file contains C code routines that are called by the parser ** to handle INSERT statements in SQLite. */ +/* #include "sqliteInt.h" */ /* ** Generate code that will @@ -98593,7 +113249,7 @@ SQLITE_PRIVATE void sqlite3OpenTable( }else{ Index *pPk = sqlite3PrimaryKeyIndex(pTab); assert( pPk!=0 ); - assert( pPk->tnum=pTab->tnum ); + assert( pPk->tnum==pTab->tnum ); sqlite3VdbeAddOp3(v, opcode, iCur, pPk->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pPk); VdbeComment((v, "%s", pTab->zName)); @@ -98607,7 +113263,7 @@ SQLITE_PRIVATE void sqlite3OpenTable( ** ** Character Column affinity ** ------------------------------ -** 'A' NONE +** 'A' BLOB ** 'B' TEXT ** 'C' NUMERIC ** 'D' INTEGER @@ -98620,7 +113276,7 @@ SQLITE_PRIVATE void sqlite3OpenTable( ** is managed along with the rest of the Index structure. It will be ** released when sqlite3DeleteIndex() is called. */ -SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ +SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ if( !pIdx->zColAff ){ /* The first time a column affinity string for a particular index is ** required, it is allocated and populated here. It is then stored as @@ -98632,15 +113288,25 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ */ int n; Table *pTab = pIdx->pTable; - sqlite3 *db = sqlite3VdbeDb(v); pIdx->zColAff = (char *)sqlite3DbMallocRaw(0, pIdx->nColumn+1); if( !pIdx->zColAff ){ - db->mallocFailed = 1; + sqlite3OomFault(db); return 0; } for(n=0; n<pIdx->nColumn; n++){ i16 x = pIdx->aiColumn[n]; - pIdx->zColAff[n] = x<0 ? SQLITE_AFF_INTEGER : pTab->aCol[x].affinity; + if( x>=0 ){ + pIdx->zColAff[n] = pTab->aCol[x].affinity; + }else if( x==XN_ROWID ){ + pIdx->zColAff[n] = SQLITE_AFF_INTEGER; + }else{ + char aff; + assert( x==XN_EXPR ); + assert( pIdx->aColExpr!=0 ); + aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); + if( aff==0 ) aff = SQLITE_AFF_BLOB; + pIdx->zColAff[n] = aff; + } } pIdx->zColAff[n] = 0; } @@ -98650,9 +113316,9 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ /* ** Compute the affinity string for table pTab, if it has not already been -** computed. As an optimization, omit trailing SQLITE_AFF_NONE affinities. +** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. ** -** If the affinity exists (if it is no entirely SQLITE_AFF_NONE values) and +** If the affinity exists (if it is no entirely SQLITE_AFF_BLOB values) and ** if iReg>0 then code an OP_Affinity opcode that will set the affinities ** for register iReg and following. Or if affinities exists and iReg==0, ** then just set the P4 operand of the previous opcode (which should be @@ -98662,7 +113328,7 @@ SQLITE_PRIVATE const char *sqlite3IndexAffinityStr(Vdbe *v, Index *pIdx){ ** ** Character Column affinity ** ------------------------------ -** 'A' NONE +** 'A' BLOB ** 'B' TEXT ** 'C' NUMERIC ** 'D' INTEGER @@ -98675,7 +113341,7 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ sqlite3 *db = sqlite3VdbeDb(v); zColAff = (char *)sqlite3DbMallocRaw(0, pTab->nCol+1); if( !zColAff ){ - db->mallocFailed = 1; + sqlite3OomFault(db); return; } @@ -98684,7 +113350,7 @@ SQLITE_PRIVATE void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ } do{ zColAff[i--] = 0; - }while( i>=0 && zColAff[i]==SQLITE_AFF_NONE ); + }while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB ); pTab->zColAff = zColAff; } i = sqlite3Strlen30(zColAff); @@ -98741,7 +113407,9 @@ static int readsTable(Parse *p, int iDb, Table *pTab){ /* ** Locate or create an AutoincInfo structure associated with table pTab ** which is in database iDb. Return the register number for the register -** that holds the maximum rowid. +** that holds the maximum rowid. Return zero if pTab is not an AUTOINCREMENT +** table. (Also return zero when doing a VACUUM since we do not want to +** update the AUTOINCREMENT counters during a VACUUM.) ** ** There is at most one AutoincInfo structure per table even if the ** same table is autoincremented multiple times due to inserts within @@ -98749,11 +113417,12 @@ static int readsTable(Parse *p, int iDb, Table *pTab){ ** first use of table pTab. On 2nd and subsequent uses, the original ** AutoincInfo structure is used. ** -** Three memory locations are allocated: +** Four consecutive registers are allocated: ** -** (1) Register to hold the name of the pTab table. -** (2) Register to hold the maximum ROWID of pTab. -** (3) Register to hold the rowid in sqlite_sequence of pTab +** (1) The name of the pTab table. +** (2) The maximum ROWID of pTab. +** (3) The rowid in sqlite_sequence of pTab +** (4) The original value of the max ROWID in pTab, or NULL if none ** ** The 2nd register is the one that is returned. That is all the ** insert routine needs to know about. @@ -98764,14 +113433,31 @@ static int autoIncBegin( Table *pTab /* The table we are writing to */ ){ int memId = 0; /* Register holding maximum rowid */ - if( pTab->tabFlags & TF_Autoincrement ){ + assert( pParse->db->aDb[iDb].pSchema!=0 ); + if( (pTab->tabFlags & TF_Autoincrement)!=0 + && (pParse->db->mDbFlags & DBFLAG_Vacuum)==0 + ){ Parse *pToplevel = sqlite3ParseToplevel(pParse); AutoincInfo *pInfo; + Table *pSeqTab = pParse->db->aDb[iDb].pSchema->pSeqTab; + + /* Verify that the sqlite_sequence table exists and is an ordinary + ** rowid table with exactly two columns. + ** Ticket d8dc2b3a58cd5dc2918a1d4acb 2018-05-23 */ + if( pSeqTab==0 + || !HasRowid(pSeqTab) + || IsVirtual(pSeqTab) + || pSeqTab->nCol!=2 + ){ + pParse->nErr++; + pParse->rc = SQLITE_CORRUPT_SEQUENCE; + return 0; + } pInfo = pToplevel->pAinc; while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; } if( pInfo==0 ){ - pInfo = sqlite3DbMallocRaw(pParse->db, sizeof(*pInfo)); + pInfo = sqlite3DbMallocRawNN(pParse->db, sizeof(*pInfo)); if( pInfo==0 ) return 0; pInfo->pNext = pToplevel->pAinc; pToplevel->pAinc = pInfo; @@ -98779,7 +113465,7 @@ static int autoIncBegin( pInfo->iDb = iDb; pToplevel->nMem++; /* Register to hold name of table */ pInfo->regCtr = ++pToplevel->nMem; /* Max rowid register */ - pToplevel->nMem++; /* Rowid in sqlite_sequence */ + pToplevel->nMem +=2; /* Rowid in sqlite_sequence + orig max val */ } memId = pInfo->regCtr; } @@ -98795,43 +113481,60 @@ SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse){ sqlite3 *db = pParse->db; /* The database connection */ Db *pDb; /* Database only autoinc table */ int memId; /* Register holding max rowid */ - int addr; /* A VDBE address */ Vdbe *v = pParse->pVdbe; /* VDBE under construction */ /* This routine is never called during trigger-generation. It is ** only called from the top-level */ assert( pParse->pTriggerTab==0 ); - assert( pParse==sqlite3ParseToplevel(pParse) ); + assert( sqlite3IsToplevel(pParse) ); assert( v ); /* We failed long ago if this is not so */ for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoInc[] = { + /* 0 */ {OP_Null, 0, 0, 0}, + /* 1 */ {OP_Rewind, 0, 10, 0}, + /* 2 */ {OP_Column, 0, 0, 0}, + /* 3 */ {OP_Ne, 0, 9, 0}, + /* 4 */ {OP_Rowid, 0, 0, 0}, + /* 5 */ {OP_Column, 0, 1, 0}, + /* 6 */ {OP_AddImm, 0, 0, 0}, + /* 7 */ {OP_Copy, 0, 0, 0}, + /* 8 */ {OP_Goto, 0, 11, 0}, + /* 9 */ {OP_Next, 0, 2, 0}, + /* 10 */ {OP_Integer, 0, 0, 0}, + /* 11 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; pDb = &db->aDb[p->iDb]; memId = p->regCtr; assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); - sqlite3VdbeAddOp3(v, OP_Null, 0, memId, memId+1); - addr = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, p->pTab->zName, 0); - sqlite3VdbeAddOp2(v, OP_Rewind, 0, addr+9); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Column, 0, 0, memId); - sqlite3VdbeAddOp3(v, OP_Ne, memId-1, addr+7, memId); VdbeCoverage(v); - sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL); - sqlite3VdbeAddOp2(v, OP_Rowid, 0, memId+1); - sqlite3VdbeAddOp3(v, OP_Column, 0, 1, memId); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addr+9); - sqlite3VdbeAddOp2(v, OP_Next, 0, addr+2); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, 0, memId); - sqlite3VdbeAddOp0(v, OP_Close); + sqlite3VdbeLoadString(v, memId-1, p->pTab->zName); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoInc), autoInc, iLn); + if( aOp==0 ) break; + aOp[0].p2 = memId; + aOp[0].p3 = memId+2; + aOp[2].p3 = memId; + aOp[3].p1 = memId-1; + aOp[3].p3 = memId; + aOp[3].p5 = SQLITE_JUMPIFNULL; + aOp[4].p2 = memId+1; + aOp[5].p3 = memId; + aOp[6].p1 = memId; + aOp[7].p2 = memId+2; + aOp[7].p1 = memId; + aOp[10].p2 = memId; } } /* ** Update the maximum rowid for an autoincrement calculation. ** -** This routine should be called when the top of the stack holds a +** This routine should be called when the regRowid register holds a ** new rowid that is about to be inserted. If that new rowid is ** larger than the maximum rowid in the memId memory cell, then the -** memory cell is updated. The stack is unchanged. +** memory cell is updated. */ static void autoIncStep(Parse *pParse, int memId, int regRowid){ if( memId>0 ){ @@ -98846,31 +113549,46 @@ static void autoIncStep(Parse *pParse, int memId, int regRowid){ ** table (either directly or through triggers) needs to call this ** routine just before the "exit" code. */ -SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ +static SQLITE_NOINLINE void autoIncrementEnd(Parse *pParse){ AutoincInfo *p; Vdbe *v = pParse->pVdbe; sqlite3 *db = pParse->db; assert( v ); for(p = pParse->pAinc; p; p = p->pNext){ + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList autoIncEnd[] = { + /* 0 */ {OP_NotNull, 0, 2, 0}, + /* 1 */ {OP_NewRowid, 0, 0, 0}, + /* 2 */ {OP_MakeRecord, 0, 2, 0}, + /* 3 */ {OP_Insert, 0, 0, 0}, + /* 4 */ {OP_Close, 0, 0, 0} + }; + VdbeOp *aOp; Db *pDb = &db->aDb[p->iDb]; - int j1; int iRec; int memId = p->regCtr; iRec = sqlite3GetTempReg(pParse); assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); + sqlite3VdbeAddOp3(v, OP_Le, memId+2, sqlite3VdbeCurrentAddr(v)+7, memId); + VdbeCoverage(v); sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_NewRowid, 0, memId+1); - sqlite3VdbeJumpHere(v, j1); - sqlite3VdbeAddOp3(v, OP_MakeRecord, memId-1, 2, iRec); - sqlite3VdbeAddOp3(v, OP_Insert, 0, iRec, memId+1); - sqlite3VdbeChangeP5(v, OPFLAG_APPEND); - sqlite3VdbeAddOp0(v, OP_Close); + aOp = sqlite3VdbeAddOpList(v, ArraySize(autoIncEnd), autoIncEnd, iLn); + if( aOp==0 ) break; + aOp[0].p1 = memId+1; + aOp[1].p2 = memId+1; + aOp[2].p1 = memId-1; + aOp[2].p3 = iRec; + aOp[3].p2 = iRec; + aOp[3].p3 = memId+1; + aOp[3].p5 = OPFLAG_APPEND; sqlite3ReleaseTempReg(pParse, iRec); } } +SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse){ + if( pParse->pAinc ) autoIncrementEnd(pParse); +} #else /* ** If SQLITE_OMIT_AUTOINCREMENT is defined, then the three routines @@ -98893,20 +113611,23 @@ static int xferOptimization( /* ** This routine is called to handle SQL of the following forms: ** -** insert into TABLE (IDLIST) values(EXPRLIST) +** insert into TABLE (IDLIST) values(EXPRLIST),(EXPRLIST),... ** insert into TABLE (IDLIST) select +** insert into TABLE (IDLIST) default values ** ** The IDLIST following the table name is always optional. If omitted, -** then a list of all columns for the table is substituted. The IDLIST -** appears in the pColumn parameter. pColumn is NULL if IDLIST is omitted. +** then a list of all (non-hidden) columns for the table is substituted. +** The IDLIST appears in the pColumn parameter. pColumn is NULL if IDLIST +** is omitted. ** -** The pList parameter holds EXPRLIST in the first form of the INSERT -** statement above, and pSelect is NULL. For the second form, pList is -** NULL and pSelect is a pointer to the select statement used to generate -** data for the insert. +** For the pSelect parameter holds the values to be inserted for the +** first two forms shown above. A VALUES clause is really just short-hand +** for a SELECT statement that omits the FROM clause and everything else +** that follows. If the pSelect parameter is NULL, that means that the +** DEFAULT VALUES form of the INSERT statement is intended. ** ** The code generated follows one of four templates. For a simple -** insert with data coming from a VALUES clause, the code executes +** insert with data coming from a single-row VALUES clause, the code executes ** once straight down through. Pseudo-code follows (we call this ** the "1st template"): ** @@ -98989,13 +113710,12 @@ SQLITE_PRIVATE void sqlite3Insert( SrcList *pTabList, /* Name of table into which we are inserting */ Select *pSelect, /* A SELECT statement to use as the data source */ IdList *pColumn, /* Column names corresponding to IDLIST. */ - int onError /* How to handle constraint errors */ + int onError, /* How to handle constraint errors */ + Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */ ){ sqlite3 *db; /* The main database structure */ Table *pTab; /* The table to insert into. aka TABLE */ - char *zTab; /* Name of the table into which we are inserting */ - const char *zDb; /* Name of the database holding this table */ - int i, j, idx; /* Loop counters */ + int i, j; /* Loop counters */ Vdbe *v; /* Generate code into this virtual machine */ Index *pIdx; /* For looping over indices of the table */ int nColumn; /* Number of columns in the data */ @@ -99009,11 +113729,10 @@ SQLITE_PRIVATE void sqlite3Insert( int addrCont = 0; /* Top of insert loop. Label "C" in templates 3 and 4 */ SelectDest dest; /* Destination for SELECT on rhs of INSERT */ int iDb; /* Index of database holding TABLE */ - Db *pDb; /* The database containing table being inserted into */ u8 useTempTable = 0; /* Store SELECT results in intermediate table */ u8 appendFlag = 0; /* True if the insert is likely to be an append */ u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ - u8 bIdListInOrder = 1; /* True if IDLIST is in table order */ + u8 bIdListInOrder; /* True if IDLIST is in table order */ ExprList *pList = 0; /* List of VALUES() to be inserted */ /* Register allocations */ @@ -99032,14 +113751,14 @@ SQLITE_PRIVATE void sqlite3Insert( #endif db = pParse->db; - memset(&dest, 0, sizeof(dest)); if( pParse->nErr || db->mallocFailed ){ goto insert_cleanup; } + dest.iSDParm = 0; /* Suppress a harmless compiler warning */ /* If the Select object is really just a simple VALUES() list with a - ** single row values (the common case) then keep that one row of values - ** and go ahead and discard the Select object + ** single row (the common case) then keep that one row of values + ** and discard the other (unused) parts of the pSelect object */ if( pSelect && (pSelect->selFlags & SF_Values)!=0 && pSelect->pPrior==0 ){ pList = pSelect->pEList; @@ -99051,17 +113770,14 @@ SQLITE_PRIVATE void sqlite3Insert( /* Locate the table into which we will be inserting new information. */ assert( pTabList->nSrc==1 ); - zTab = pTabList->a[0].zName; - if( NEVER(zTab==0) ) goto insert_cleanup; pTab = sqlite3SrcListLookup(pParse, pTabList); if( pTab==0 ){ goto insert_cleanup; } iDb = sqlite3SchemaToIndex(db, pTab->pSchema); assert( iDb<db->nDb ); - pDb = &db->aDb[iDb]; - zDb = pDb->zName; - if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, zDb) ){ + if( sqlite3AuthCheck(pParse, SQLITE_INSERT, pTab->zName, 0, + db->aDb[iDb].zDbSName) ){ goto insert_cleanup; } withoutRowid = !HasRowid(pTab); @@ -99147,6 +113863,7 @@ SQLITE_PRIVATE void sqlite3Insert( ** is appears in the original table. (The index of the INTEGER ** PRIMARY KEY in the original table is pTab->iPKey.) */ + bIdListInOrder = (pTab->tabFlags & TF_OOOHidden)==0; if( pColumn ){ for(i=0; i<pColumn->nId; i++){ pColumn->a[i].idx = -1; @@ -99182,7 +113899,8 @@ SQLITE_PRIVATE void sqlite3Insert( ** co-routine is the common header to the 3rd and 4th templates. */ if( pSelect ){ - /* Data is coming from a SELECT. Generate a co-routine to run the SELECT */ + /* Data is coming from a SELECT or from a multi-row VALUES clause. + ** Generate a co-routine to run the SELECT. */ int regYield; /* Register holding co-routine entry-point */ int addrTop; /* Top of the co-routine */ int rc; /* Result code */ @@ -99195,9 +113913,8 @@ SQLITE_PRIVATE void sqlite3Insert( dest.nSdst = pTab->nCol; rc = sqlite3Select(pParse, pSelect, &dest); regFromSelect = dest.iSdst; - assert( pParse->nErr==0 || rc ); - if( rc || db->mallocFailed ) goto insert_cleanup; - sqlite3VdbeAddOp1(v, OP_EndCoroutine, regYield); + if( rc || db->mallocFailed || pParse->nErr ) goto insert_cleanup; + sqlite3VdbeEndCoroutine(v, regYield); sqlite3VdbeJumpHere(v, addrTop - 1); /* label B: */ assert( pSelect->pEList ); nColumn = pSelect->pEList->nExpr; @@ -99238,25 +113955,27 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3VdbeAddOp3(v, OP_MakeRecord, regFromSelect, nColumn, regRec); sqlite3VdbeAddOp2(v, OP_NewRowid, srcTab, regTempRowid); sqlite3VdbeAddOp3(v, OP_Insert, srcTab, regRec, regTempRowid); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrL); + sqlite3VdbeGoto(v, addrL); sqlite3VdbeJumpHere(v, addrL); sqlite3ReleaseTempReg(pParse, regRec); sqlite3ReleaseTempReg(pParse, regTempRowid); } }else{ - /* This is the case if the data for the INSERT is coming from a VALUES - ** clause + /* This is the case if the data for the INSERT is coming from a + ** single-row VALUES clause */ NameContext sNC; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; srcTab = -1; assert( useTempTable==0 ); - nColumn = pList ? pList->nExpr : 0; - for(i=0; i<nColumn; i++){ - if( sqlite3ResolveExprNames(&sNC, pList->a[i].pExpr) ){ + if( pList ){ + nColumn = pList->nExpr; + if( sqlite3ResolveExprListNames(&sNC, pList) ){ goto insert_cleanup; } + }else{ + nColumn = 0; } } @@ -99271,10 +113990,8 @@ SQLITE_PRIVATE void sqlite3Insert( /* Make sure the number of columns in the source data matches the number ** of columns to be inserted into the table. */ - if( IsVirtual(pTab) ){ - for(i=0; i<pTab->nCol; i++){ - nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); - } + for(i=0; i<pTab->nCol; i++){ + nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); } if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ sqlite3ErrorMsg(pParse, @@ -99289,7 +114006,10 @@ SQLITE_PRIVATE void sqlite3Insert( /* Initialize the count of rows to be inserted */ - if( db->flags & SQLITE_CountRows ){ + if( (db->flags & SQLITE_CountRows)!=0 + && !pParse->nested + && !pParse->pTriggerTab + ){ regRowCount = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); } @@ -99297,16 +114017,31 @@ SQLITE_PRIVATE void sqlite3Insert( /* If this is not a view, open the table and and all indices */ if( !isView ){ int nIdx; - nIdx = sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, -1, 0, + nIdx = sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, -1, 0, &iDataCur, &iIdxCur); - aRegIdx = sqlite3DbMallocRaw(db, sizeof(int)*(nIdx+1)); + aRegIdx = sqlite3DbMallocRawNN(db, sizeof(int)*(nIdx+1)); if( aRegIdx==0 ){ goto insert_cleanup; } - for(i=0; i<nIdx; i++){ + for(i=0, pIdx=pTab->pIndex; i<nIdx; pIdx=pIdx->pNext, i++){ + assert( pIdx ); aRegIdx[i] = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; } } +#ifndef SQLITE_OMIT_UPSERT + if( pUpsert ){ + pTabList->a[0].iCursor = iDataCur; + pUpsert->pUpsertSrc = pTabList; + pUpsert->regData = regData; + pUpsert->iDataCur = iDataCur; + pUpsert->iIdxCur = iIdxCur; + if( pUpsert->pUpsertTarget ){ + sqlite3UpsertAnalyzeTarget(pParse, pTabList, pUpsert); + } + } +#endif + /* This is the top of the main insertion loop */ if( useTempTable ){ @@ -99349,7 +114084,7 @@ SQLITE_PRIVATE void sqlite3Insert( if( ipkColumn<0 ){ sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); }else{ - int j1; + int addr1; assert( !withoutRowid ); if( useTempTable ){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regCols); @@ -99357,9 +114092,9 @@ SQLITE_PRIVATE void sqlite3Insert( assert( pSelect==0 ); /* Otherwise useTempTable is true */ sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); } - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); } @@ -99370,15 +114105,14 @@ SQLITE_PRIVATE void sqlite3Insert( /* Create the new column data */ - for(i=0; i<pTab->nCol; i++){ - if( pColumn==0 ){ - j = i; - }else{ + for(i=j=0; i<pTab->nCol; i++){ + if( pColumn ){ for(j=0; j<pColumn->nId; j++){ if( pColumn->a[j].idx==i ) break; } } - if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId) ){ + if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId) + || (pColumn==0 && IsOrdinaryHiddenColumn(&pTab->aCol[i])) ){ sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1); }else if( useTempTable ){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); @@ -99386,6 +114120,7 @@ SQLITE_PRIVATE void sqlite3Insert( assert( pSelect==0 ); /* Otherwise useTempTable is true */ sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1); } + if( pColumn==0 && !IsOrdinaryHiddenColumn(&pTab->aCol[i]) ) j++; } /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, @@ -99421,7 +114156,8 @@ SQLITE_PRIVATE void sqlite3Insert( VdbeOp *pOp; sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); pOp = sqlite3VdbeGetOp(v, -1); - if( ALWAYS(pOp) && pOp->opcode==OP_Null && !IsVirtual(pTab) ){ + assert( pOp!=0 ); + if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){ appendFlag = 1; pOp->opcode = OP_NewRowid; pOp->p1 = iDataCur; @@ -99433,14 +114169,14 @@ SQLITE_PRIVATE void sqlite3Insert( ** to generate a unique primary key value. */ if( !appendFlag ){ - int j1; + int addr1; if( !IsVirtual(pTab) ){ - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); }else{ - j1 = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, j1+2); VdbeCoverage(v); + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); } sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); } @@ -99469,7 +114205,6 @@ SQLITE_PRIVATE void sqlite3Insert( } if( pColumn==0 ){ if( IsHiddenColumn(&pTab->aCol[i]) ){ - assert( IsVirtual(pTab) ); j = -1; nHidden++; }else{ @@ -99507,18 +114242,32 @@ SQLITE_PRIVATE void sqlite3Insert( #endif { int isReplace; /* Set to true if constraints may cause a replace */ + int bUseSeek; /* True to use OPFLAG_SEEKRESULT */ sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, - regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace + regIns, 0, ipkColumn>=0, onError, endOfLoop, &isReplace, 0, pUpsert ); sqlite3FkCheck(pParse, pTab, 0, regIns, 0, 0); + + /* Set the OPFLAG_USESEEKRESULT flag if either (a) there are no REPLACE + ** constraints or (b) there are no triggers and this table is not a + ** parent table in a foreign key constraint. It is safe to set the + ** flag in the second case as if any REPLACE constraint is hit, an + ** OP_Delete or OP_IdxDelete instruction will be executed on each + ** cursor that is disturbed. And these instructions both clear the + ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT + ** functionality. */ + bUseSeek = (isReplace==0 || (pTrigger==0 && + ((db->flags & SQLITE_ForeignKeys)==0 || sqlite3FkReferences(pTab)==0) + )); sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, - regIns, aRegIdx, 0, appendFlag, isReplace==0); + regIns, aRegIdx, 0, appendFlag, bUseSeek + ); } } /* Update the count of rows that are inserted */ - if( (db->flags & SQLITE_CountRows)!=0 ){ + if( regRowCount ){ sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); } @@ -99537,18 +114286,10 @@ SQLITE_PRIVATE void sqlite3Insert( sqlite3VdbeJumpHere(v, addrInsTop); sqlite3VdbeAddOp1(v, OP_Close, srcTab); }else if( pSelect ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrCont); + sqlite3VdbeGoto(v, addrCont); sqlite3VdbeJumpHere(v, addrInsTop); } - if( !IsVirtual(pTab) && !isView ){ - /* Close all tables opened */ - if( iDataCur<iIdxCur ) sqlite3VdbeAddOp1(v, OP_Close, iDataCur); - for(idx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, idx++){ - sqlite3VdbeAddOp1(v, OP_Close, idx+iIdxCur); - } - } - insert_end: /* Update the sqlite_sequence table by storing the content of the ** maximum rowid counter values recorded while inserting into @@ -99563,7 +114304,7 @@ insert_end: ** generating code because of a call to sqlite3NestedParse(), do not ** invoke the callback function. */ - if( (db->flags&SQLITE_CountRows) && !pParse->nested && !pParse->pTriggerTab ){ + if( regRowCount ){ sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows inserted", SQLITE_STATIC); @@ -99572,6 +114313,7 @@ insert_end: insert_cleanup: sqlite3SrcListDelete(db, pTabList); sqlite3ExprListDelete(db, pList); + sqlite3UpsertDelete(db, pUpsert); sqlite3SelectDelete(db, pSelect); sqlite3IdListDelete(db, pColumn); sqlite3DbFree(db, aRegIdx); @@ -99590,6 +114332,97 @@ insert_cleanup: #undef tmask #endif +/* +** Meanings of bits in of pWalker->eCode for checkConstraintUnchanged() +*/ +#define CKCNSTRNT_COLUMN 0x01 /* CHECK constraint uses a changing column */ +#define CKCNSTRNT_ROWID 0x02 /* CHECK constraint references the ROWID */ + +/* This is the Walker callback from checkConstraintUnchanged(). Set +** bit 0x01 of pWalker->eCode if +** pWalker->eCode to 0 if this expression node references any of the +** columns that are being modifed by an UPDATE statement. +*/ +static int checkConstraintExprNode(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + assert( pExpr->iColumn>=0 || pExpr->iColumn==-1 ); + if( pExpr->iColumn>=0 ){ + if( pWalker->u.aiCol[pExpr->iColumn]>=0 ){ + pWalker->eCode |= CKCNSTRNT_COLUMN; + } + }else{ + pWalker->eCode |= CKCNSTRNT_ROWID; + } + } + return WRC_Continue; +} + +/* +** pExpr is a CHECK constraint on a row that is being UPDATE-ed. The +** only columns that are modified by the UPDATE are those for which +** aiChng[i]>=0, and also the ROWID is modified if chngRowid is true. +** +** Return true if CHECK constraint pExpr does not use any of the +** changing columns (or the rowid if it is changing). In other words, +** return true if this CHECK constraint can be skipped when validating +** the new row in the UPDATE statement. +*/ +static int checkConstraintUnchanged(Expr *pExpr, int *aiChng, int chngRowid){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 0; + w.xExprCallback = checkConstraintExprNode; + w.u.aiCol = aiChng; + sqlite3WalkExpr(&w, pExpr); + if( !chngRowid ){ + testcase( (w.eCode & CKCNSTRNT_ROWID)!=0 ); + w.eCode &= ~CKCNSTRNT_ROWID; + } + testcase( w.eCode==0 ); + testcase( w.eCode==CKCNSTRNT_COLUMN ); + testcase( w.eCode==CKCNSTRNT_ROWID ); + testcase( w.eCode==(CKCNSTRNT_ROWID|CKCNSTRNT_COLUMN) ); + return !w.eCode; +} + +/* +** An instance of the ConstraintAddr object remembers the byte-code addresses +** for sections of the constraint checks that deal with uniqueness constraints +** on the rowid and on the upsert constraint. +** +** This information is passed into checkReorderConstraintChecks() to insert +** some OP_Goto operations so that the rowid and upsert constraints occur +** in the correct order relative to other constraints. +*/ +typedef struct ConstraintAddr ConstraintAddr; +struct ConstraintAddr { + int ipkTop; /* Subroutine for rowid constraint check */ + int upsertTop; /* Label for upsert constraint check subroutine */ + int upsertTop2; /* Copy of upsertTop not cleared by the call */ + int upsertBtm; /* upsert constraint returns to this label */ + int ipkBtm; /* Return opcode rowid constraint check */ +}; + +/* +** Generate any OP_Goto operations needed to cause constraints to be +** run that haven't already been run. +*/ +static void reorderConstraintChecks(Vdbe *v, ConstraintAddr *p){ + if( p->upsertTop ){ + testcase( sqlite3VdbeLabelHasBeenResolved(v, p->upsertTop) ); + sqlite3VdbeGoto(v, p->upsertTop); + VdbeComment((v, "call upsert subroutine")); + sqlite3VdbeResolveLabel(v, p->upsertBtm); + p->upsertTop = 0; + } + if( p->ipkTop ){ + sqlite3VdbeGoto(v, p->ipkTop); + VdbeComment((v, "call rowid unique-check subroutine")); + sqlite3VdbeJumpHere(v, p->ipkBtm); + p->ipkTop = 0; + } +} + /* ** Generate code to do constraint checks prior to an INSERT or an UPDATE ** on table pTab. @@ -99684,7 +114517,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( u8 pkChng, /* Non-zero if the rowid or PRIMARY KEY changed */ u8 overrideError, /* Override onError to this if not OE_Default */ int ignoreDest, /* Jump to this label on an OE_Ignore resolution */ - int *pbMayReplace /* OUT: Set to true if constraint may cause a replace */ + int *pbMayReplace, /* OUT: Set to true if constraint may cause a replace */ + int *aiChng, /* column i is unchanged if aiChng[i]<0 */ + Upsert *pUpsert /* ON CONFLICT clauses, if any. NULL otherwise */ ){ Vdbe *v; /* VDBE under constrution */ Index *pIdx; /* Pointer to one of the indices */ @@ -99694,14 +114529,14 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int ix; /* Index loop counter */ int nCol; /* Number of columns */ int onError; /* Conflict resolution strategy */ - int j1; /* Address of jump instruction */ + int addr1; /* Address of jump instruction */ int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ - int ipkTop = 0; /* Top of the rowid change constraint check */ - int ipkBottom = 0; /* Bottom of the rowid change constraint check */ + ConstraintAddr sAddr;/* Address information for constraint reordering */ + Index *pUpIdx = 0; /* Index to which to apply the upsert */ u8 isUpdate; /* True if this is an UPDATE operation */ u8 bAffinityDone = 0; /* True if the OP_Affinity operation has been run */ - int regRowid = -1; /* Register holding ROWID value */ + int upsertBypass = 0; /* Address of Goto to bypass upsert subroutine */ isUpdate = regOldData!=0; db = pParse->db; @@ -99709,6 +114544,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( assert( v!=0 ); assert( pTab->pSelect==0 ); /* This table is not a VIEW */ nCol = pTab->nCol; + memset(&sAddr, 0, sizeof(sAddr)); /* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for ** normal rowid tables. nPkField is the number of key fields in the @@ -99730,10 +114566,14 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( */ for(i=0; i<nCol; i++){ if( i==pTab->iPKey ){ + continue; /* ROWID is never NULL */ + } + if( aiChng && aiChng[i]<0 ){ + /* Don't bother checking for NOT NULL on columns that do not change */ continue; } onError = pTab->aCol[i].notNull; - if( onError==OE_None ) continue; + if( onError==OE_None ) continue; /* This column is allowed to be NULL */ if( overrideError!=OE_Default ){ onError = overrideError; }else if( onError==OE_Default ){ @@ -99752,8 +114592,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( case OE_Fail: { char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, pTab->aCol[i].zName); - sqlite3VdbeAddOp4(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, - regNewData+1+i, zMsg, P4_DYNAMIC); + sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, + regNewData+1+i); + sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); VdbeCoverage(v); break; @@ -99765,9 +114606,10 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } default: { assert( onError==OE_Replace ); - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); + VdbeCoverage(v); sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); break; } } @@ -99778,13 +114620,17 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( #ifndef SQLITE_OMIT_CHECK if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ ExprList *pCheck = pTab->pCheck; - pParse->ckBase = regNewData+1; + pParse->iSelfTab = -(regNewData+1); onError = overrideError!=OE_Default ? overrideError : OE_Abort; for(i=0; i<pCheck->nExpr; i++){ - int allOk = sqlite3VdbeMakeLabel(v); - sqlite3ExprIfTrue(pParse, pCheck->a[i].pExpr, allOk, SQLITE_JUMPIFNULL); + int allOk; + Expr *pExpr = pCheck->a[i].pExpr; + if( aiChng && checkConstraintUnchanged(pExpr, aiChng, pkChng) ) continue; + allOk = sqlite3VdbeMakeLabel(v); + sqlite3VdbeVerifyAbortable(v, onError); + sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); if( onError==OE_Ignore ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest); + sqlite3VdbeGoto(v, ignoreDest); }else{ char *zName = pCheck->a[i].zName; if( zName==0 ) zName = pTab->zName; @@ -99795,9 +114641,50 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( } sqlite3VdbeResolveLabel(v, allOk); } + pParse->iSelfTab = 0; } #endif /* !defined(SQLITE_OMIT_CHECK) */ + /* UNIQUE and PRIMARY KEY constraints should be handled in the following + ** order: + ** + ** (1) OE_Abort, OE_Fail, OE_Rollback, OE_Ignore + ** (2) OE_Update + ** (3) OE_Replace + ** + ** OE_Fail and OE_Ignore must happen before any changes are made. + ** OE_Update guarantees that only a single row will change, so it + ** must happen before OE_Replace. Technically, OE_Abort and OE_Rollback + ** could happen in any order, but they are grouped up front for + ** convenience. + ** + ** Constraint checking code is generated in this order: + ** (A) The rowid constraint + ** (B) Unique index constraints that do not have OE_Replace as their + ** default conflict resolution strategy + ** (C) Unique index that do use OE_Replace by default. + ** + ** The ordering of (2) and (3) is accomplished by making sure the linked + ** list of indexes attached to a table puts all OE_Replace indexes last + ** in the list. See sqlite3CreateIndex() for where that happens. + */ + + if( pUpsert ){ + if( pUpsert->pUpsertTarget==0 ){ + /* An ON CONFLICT DO NOTHING clause, without a constraint-target. + ** Make all unique constraint resolution be OE_Ignore */ + assert( pUpsert->pUpsertSet==0 ); + overrideError = OE_Ignore; + pUpsert = 0; + }else if( (pUpIdx = pUpsert->pUpsertIdx)!=0 ){ + /* If the constraint-target is on some column other than + ** then ROWID, then we might need to move the UPSERT around + ** so that it occurs in the correct order. */ + sAddr.upsertTop = sAddr.upsertTop2 = sqlite3VdbeMakeLabel(v); + sAddr.upsertBtm = sqlite3VdbeMakeLabel(v); + } + } + /* If rowid is changing, make sure the new rowid does not previously ** exist in the table. */ @@ -99812,13 +114699,13 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( onError = OE_Abort; } - if( isUpdate ){ - /* pkChng!=0 does not mean that the rowid has change, only that - ** it might have changed. Skip the conflict logic below if the rowid - ** is unchanged. */ - sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); - sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); - VdbeCoverage(v); + /* figure out whether or not upsert applies in this case */ + if( pUpsert && pUpsert->pUpsertIdx==0 ){ + if( pUpsert->pUpsertSet==0 ){ + onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ + }else{ + onError = OE_Update; /* DO UPDATE */ + } } /* If the response to a rowid conflict is REPLACE but the response @@ -99826,21 +114713,34 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** to defer the running of the rowid conflict checking until after ** the UNIQUE constraints have run. */ - if( onError==OE_Replace && overrideError!=OE_Replace ){ - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->onError==OE_Ignore || pIdx->onError==OE_Fail ){ - ipkTop = sqlite3VdbeAddOp0(v, OP_Goto); - break; - } - } + assert( OE_Update>OE_Replace ); + assert( OE_Ignore<OE_Replace ); + assert( OE_Fail<OE_Replace ); + assert( OE_Abort<OE_Replace ); + assert( OE_Rollback<OE_Replace ); + if( onError>=OE_Replace + && (pUpsert || onError!=overrideError) + && pTab->pIndex + ){ + sAddr.ipkTop = sqlite3VdbeAddOp0(v, OP_Goto)+1; + } + + if( isUpdate ){ + /* pkChng!=0 does not mean that the rowid has changed, only that + ** it might have changed. Skip the conflict logic below if the rowid + ** is unchanged. */ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRowidOk, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); } /* Check to see if the new rowid already exists in the table. Skip ** the following conflict logic if it does not. */ + VdbeNoopComment((v, "uniqueness check for ROWID")); + sqlite3VdbeVerifyAbortable(v, onError); sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); VdbeCoverage(v); - /* Generate code that deals with a rowid collision */ switch( onError ){ default: { onError = OE_Abort; @@ -99849,6 +114749,9 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( case OE_Rollback: case OE_Abort: case OE_Fail: { + testcase( onError==OE_Rollback ); + testcase( onError==OE_Abort ); + testcase( onError==OE_Fail ); sqlite3RowidConstraint(pParse, onError, pTab); break; } @@ -99882,24 +114785,41 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ sqlite3MultiWrite(pParse); sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, - regNewData, 1, 0, OE_Replace, 1); - }else if( pTab->pIndex ){ - sqlite3MultiWrite(pParse); - sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, 0); + regNewData, 1, 0, OE_Replace, 1, -1); + }else{ +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + assert( HasRowid(pTab) ); + /* This OP_Delete opcode fires the pre-update-hook only. It does + ** not modify the b-tree. It is more efficient to let the coming + ** OP_Insert replace the existing entry than it is to delete the + ** existing entry and then insert a new one. */ + sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, OPFLAG_ISNOOP); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + if( pTab->pIndex ){ + sqlite3MultiWrite(pParse); + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,-1); + } } seenReplace = 1; break; } +#ifndef SQLITE_OMIT_UPSERT + case OE_Update: { + sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, 0, iDataCur); + /* Fall through */ + } +#endif case OE_Ignore: { - /*assert( seenReplace==0 );*/ - sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest); + testcase( onError==OE_Ignore ); + sqlite3VdbeGoto(v, ignoreDest); break; } } sqlite3VdbeResolveLabel(v, addrRowidOk); - if( ipkTop ){ - ipkBottom = sqlite3VdbeAddOp0(v, OP_Goto); - sqlite3VdbeJumpHere(v, ipkTop); + if( sAddr.ipkTop ){ + sAddr.ipkBtm = sqlite3VdbeAddOp0(v, OP_Goto); + sqlite3VdbeJumpHere(v, sAddr.ipkTop-1); } } @@ -99917,42 +114837,58 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ + if( pUpIdx==pIdx ){ + addrUniqueOk = sAddr.upsertBtm; + upsertBypass = sqlite3VdbeGoto(v, 0); + VdbeComment((v, "Skip upsert subroutine")); + sqlite3VdbeResolveLabel(v, sAddr.upsertTop2); + }else{ + addrUniqueOk = sqlite3VdbeMakeLabel(v); + } + VdbeNoopComment((v, "uniqueness check for %s", pIdx->zName)); if( bAffinityDone==0 ){ sqlite3TableAffinity(v, pTab, regNewData+1); bAffinityDone = 1; } iThisCur = iIdxCur+ix; - addrUniqueOk = sqlite3VdbeMakeLabel(v); + /* Skip partial indices for which the WHERE clause is not true */ if( pIdx->pPartIdxWhere ){ sqlite3VdbeAddOp2(v, OP_Null, 0, aRegIdx[ix]); - pParse->ckBase = regNewData+1; - sqlite3ExprIfFalse(pParse, pIdx->pPartIdxWhere, addrUniqueOk, - SQLITE_JUMPIFNULL); - pParse->ckBase = 0; + pParse->iSelfTab = -(regNewData+1); + sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, addrUniqueOk, + SQLITE_JUMPIFNULL); + pParse->iSelfTab = 0; } /* Create a record for this index entry as it should appear after ** the insert or update. Store that record in the aRegIdx[ix] register */ - regIdx = sqlite3GetTempRange(pParse, pIdx->nColumn); + regIdx = aRegIdx[ix]+1; for(i=0; i<pIdx->nColumn; i++){ int iField = pIdx->aiColumn[i]; int x; - if( iField<0 || iField==pTab->iPKey ){ - if( regRowid==regIdx+i ) continue; /* ROWID already in regIdx+i */ - x = regNewData; - regRowid = pIdx->pPartIdxWhere ? -1 : regIdx+i; + if( iField==XN_EXPR ){ + pParse->iSelfTab = -(regNewData+1); + sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); + pParse->iSelfTab = 0; + VdbeComment((v, "%s column %d", pIdx->zName, i)); }else{ - x = iField + regNewData + 1; + if( iField==XN_ROWID || iField==pTab->iPKey ){ + x = regNewData; + }else{ + x = iField + regNewData + 1; + } + sqlite3VdbeAddOp2(v, iField<0 ? OP_IntCopy : OP_SCopy, x, regIdx+i); + VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); } - sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); - VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); VdbeComment((v, "for %s", pIdx->zName)); - sqlite3ExprCacheAffinityChange(pParse, regIdx, pIdx->nColumn); +#ifdef SQLITE_ENABLE_NULL_TRIM + if( pIdx->idxType==2 ) sqlite3SetMakeRecordP5(v, pIdx->pTable); +#endif /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the @@ -99966,7 +114902,6 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* Find out what action to take in case there is a uniqueness conflict */ onError = pIdx->onError; if( onError==OE_None ){ - sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn); sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; /* pIdx is not a UNIQUE index */ } @@ -99975,8 +114910,47 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( }else if( onError==OE_Default ){ onError = OE_Abort; } - + + /* Figure out if the upsert clause applies to this index */ + if( pUpIdx==pIdx ){ + if( pUpsert->pUpsertSet==0 ){ + onError = OE_Ignore; /* DO NOTHING is the same as INSERT OR IGNORE */ + }else{ + onError = OE_Update; /* DO UPDATE */ + } + } + + /* Invoke subroutines to handle IPK replace and upsert prior to running + ** the first REPLACE constraint check. */ + if( onError==OE_Replace ){ + testcase( sAddr.ipkTop ); + testcase( sAddr.upsertTop + && sqlite3VdbeLabelHasBeenResolved(v,sAddr.upsertTop) ); + reorderConstraintChecks(v, &sAddr); + } + + /* Collision detection may be omitted if all of the following are true: + ** (1) The conflict resolution algorithm is REPLACE + ** (2) The table is a WITHOUT ROWID table + ** (3) There are no secondary indexes on the table + ** (4) No delete triggers need to be fired if there is a conflict + ** (5) No FK constraint counters need to be updated if a conflict occurs. + */ + if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ + && pPk==pIdx /* Condition 2 */ + && onError==OE_Replace /* Condition 1 */ + && ( 0==(db->flags&SQLITE_RecTriggers) || /* Condition 4 */ + 0==sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0)) + && ( 0==(db->flags&SQLITE_ForeignKeys) || /* Condition 5 */ + (0==pTab->pFKey && 0==sqlite3FkReferences(pTab))) + ){ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + continue; + } + /* Check to see if the new index entry will be unique */ + sqlite3ExprCachePush(pParse); + sqlite3VdbeVerifyAbortable(v, onError); sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, regIdx, pIdx->nKeyCol); VdbeCoverage(v); @@ -99998,6 +114972,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( ** store it in registers regR..regR+nPk-1 */ if( pIdx!=pPk ){ for(i=0; i<pPk->nKeyCol; i++){ + assert( pPk->aiColumn[i]>=0 ); x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); VdbeComment((v, "%s.%s", pTab->zName, @@ -100019,6 +114994,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( for(i=0; i<pPk->nKeyCol; i++){ char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); x = pPk->aiColumn[i]; + assert( x>=0 ); if( i==(pPk->nKeyCol-1) ){ addrJump = addrUniqueOk; op = OP_Eq; @@ -100036,44 +115012,84 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( /* Generate code that executes if the new index entry is not unique */ assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail - || onError==OE_Ignore || onError==OE_Replace ); + || onError==OE_Ignore || onError==OE_Replace || onError==OE_Update ); switch( onError ){ case OE_Rollback: case OE_Abort: case OE_Fail: { + testcase( onError==OE_Rollback ); + testcase( onError==OE_Abort ); + testcase( onError==OE_Fail ); sqlite3UniqueConstraint(pParse, onError, pIdx); break; } +#ifndef SQLITE_OMIT_UPSERT + case OE_Update: { + sqlite3UpsertDoUpdate(pParse, pUpsert, pTab, pIdx, iIdxCur+ix); + /* Fall through */ + } +#endif case OE_Ignore: { - sqlite3VdbeAddOp2(v, OP_Goto, 0, ignoreDest); + testcase( onError==OE_Ignore ); + sqlite3VdbeGoto(v, ignoreDest); break; } default: { Trigger *pTrigger = 0; assert( onError==OE_Replace ); - sqlite3MultiWrite(pParse); if( db->flags&SQLITE_RecTriggers ){ pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); } + if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ + sqlite3MultiWrite(pParse); + } sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, - regR, nPkField, 0, OE_Replace, pIdx==pPk); + regR, nPkField, 0, OE_Replace, + (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); seenReplace = 1; break; } } - sqlite3VdbeResolveLabel(v, addrUniqueOk); - sqlite3ReleaseTempRange(pParse, regIdx, pIdx->nColumn); + if( pUpIdx==pIdx ){ + sqlite3VdbeJumpHere(v, upsertBypass); + }else{ + sqlite3VdbeResolveLabel(v, addrUniqueOk); + } + sqlite3ExprCachePop(pParse); if( regR!=regIdx ) sqlite3ReleaseTempRange(pParse, regR, nPkField); + } - if( ipkTop ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, ipkTop+1); - sqlite3VdbeJumpHere(v, ipkBottom); - } + testcase( sAddr.ipkTop!=0 ); + testcase( sAddr.upsertTop + && sqlite3VdbeLabelHasBeenResolved(v,sAddr.upsertTop) ); + reorderConstraintChecks(v, &sAddr); *pbMayReplace = seenReplace; VdbeModuleComment((v, "END: GenCnstCks(%d)", seenReplace)); } +#ifdef SQLITE_ENABLE_NULL_TRIM +/* +** Change the P5 operand on the last opcode (which should be an OP_MakeRecord) +** to be the number of columns in table pTab that must not be NULL-trimmed. +** +** Or if no columns of pTab may be NULL-trimmed, leave P5 at zero. +*/ +SQLITE_PRIVATE void sqlite3SetMakeRecordP5(Vdbe *v, Table *pTab){ + u16 i; + + /* Records with omitted columns are only allowed for schema format + ** version 2 and later (SQLite version 3.1.4, 2005-02-20). */ + if( pTab->pSchema->file_format<2 ) return; + + for(i=pTab->nCol-1; i>0; i--){ + if( pTab->aCol[i].pDflt!=0 ) break; + if( pTab->aCol[i].colFlags & COLFLAG_PRIMKEY ) break; + } + sqlite3VdbeChangeP5(v, i+1); +} +#endif + /* ** This routine generates code to finish the INSERT or UPDATE operation ** that was started by a prior call to sqlite3GenerateConstraintChecks. @@ -100090,7 +115106,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( int iIdxCur, /* First index cursor */ int regNewData, /* Range of content */ int *aRegIdx, /* Register used by each index. 0 for unused indices */ - int isUpdate, /* True for UPDATE, False for INSERT */ + int update_flags, /* True for UPDATE, False for INSERT */ int appendBias, /* True if this is likely to be an append */ int useSeekResult /* True to set the USESEEKRESULT flag on OP_[Idx]Insert */ ){ @@ -100102,6 +115118,11 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( int i; /* Loop counter */ u8 bAffinityDone = 0; /* True if OP_Affinity has been run already */ + assert( update_flags==0 + || update_flags==OPFLAG_ISUPDATE + || update_flags==(OPFLAG_ISUPDATE|OPFLAG_SAVEPOSITION) + ); + v = sqlite3GetVdbe(pParse); assert( v!=0 ); assert( pTab->pSelect==0 ); /* This table is not a VIEW */ @@ -100112,26 +115133,39 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( sqlite3VdbeAddOp2(v, OP_IsNull, aRegIdx[i], sqlite3VdbeCurrentAddr(v)+2); VdbeCoverage(v); } - sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i]); - pik_flags = 0; - if( useSeekResult ) pik_flags = OPFLAG_USESEEKRESULT; + pik_flags = (useSeekResult ? OPFLAG_USESEEKRESULT : 0); if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ assert( pParse->nested==0 ); pik_flags |= OPFLAG_NCHANGE; + pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + if( update_flags==0 ){ + sqlite3VdbeAddOp4(v, OP_InsertInt, + iIdxCur+i, aRegIdx[i], 0, (char*)pTab, P4_TABLE + ); + sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + } +#endif } - if( pik_flags ) sqlite3VdbeChangeP5(v, pik_flags); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iIdxCur+i, aRegIdx[i], + aRegIdx[i]+1, + pIdx->uniqNotNull ? pIdx->nKeyCol: pIdx->nColumn); + sqlite3VdbeChangeP5(v, pik_flags); } if( !HasRowid(pTab) ) return; regData = regNewData + 1; regRec = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regData, pTab->nCol, regRec); - if( !bAffinityDone ) sqlite3TableAffinity(v, pTab, 0); - sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol); + sqlite3SetMakeRecordP5(v, pTab); + if( !bAffinityDone ){ + sqlite3TableAffinity(v, pTab, 0); + sqlite3ExprCacheAffinityChange(pParse, regData, pTab->nCol); + } if( pParse->nested ){ pik_flags = 0; }else{ pik_flags = OPFLAG_NCHANGE; - pik_flags |= (isUpdate?OPFLAG_ISUPDATE:OPFLAG_LASTROWID); + pik_flags |= (update_flags?update_flags:OPFLAG_LASTROWID); } if( appendBias ){ pik_flags |= OPFLAG_APPEND; @@ -100141,7 +115175,7 @@ SQLITE_PRIVATE void sqlite3CompleteInsertion( } sqlite3VdbeAddOp3(v, OP_Insert, iDataCur, regRec, regNewData); if( !pParse->nested ){ - sqlite3VdbeChangeP4(v, -1, pTab->zName, P4_TRANSIENT); + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); } sqlite3VdbeChangeP5(v, pik_flags); } @@ -100171,6 +115205,7 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices( Parse *pParse, /* Parsing context */ Table *pTab, /* Table to be opened */ int op, /* OP_OpenRead or OP_OpenWrite */ + u8 p5, /* P5 value for OP_Open* opcodes (except on WITHOUT ROWID) */ int iBase, /* Use this for the table cursor, if there is one */ u8 *aToOpen, /* If not NULL: boolean for each table and index */ int *piDataCur, /* Write the database source cursor number here */ @@ -100183,6 +115218,7 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices( Vdbe *v; assert( op==OP_OpenRead || op==OP_OpenWrite ); + assert( op==OP_OpenWrite || p5==0 ); if( IsVirtual(pTab) ){ /* This routine is a no-op for virtual tables. Leave the output ** variables *piDataCur and *piIdxCur uninitialized so that valgrind @@ -100204,12 +115240,14 @@ SQLITE_PRIVATE int sqlite3OpenTableAndIndices( for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ int iIdxCur = iBase++; assert( pIdx->pSchema==pTab->pSchema ); - if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) && piDataCur ){ - *piDataCur = iIdxCur; + if( IsPrimaryKeyIndex(pIdx) && !HasRowid(pTab) ){ + if( piDataCur ) *piDataCur = iIdxCur; + p5 = 0; } if( aToOpen==0 || aToOpen[i+1] ){ sqlite3VdbeAddOp3(v, op, iIdxCur, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); + sqlite3VdbeChangeP5(v, p5); VdbeComment((v, "%s", pIdx->zName)); } } @@ -100230,20 +115268,6 @@ SQLITE_API int sqlite3_xferopt_count; #ifndef SQLITE_OMIT_XFER_OPT -/* -** Check to collation names to see if they are compatible. -*/ -static int xferCompatibleCollation(const char *z1, const char *z2){ - if( z1==0 ){ - return z2==0; - } - if( z2==0 ){ - return 0; - } - return sqlite3StrICmp(z1, z2)==0; -} - - /* ** Check to see if index pSrc is compatible as a source of data ** for index pDest in an insert transfer optimization. The rules @@ -100269,14 +115293,21 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){ if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ return 0; /* Different columns indexed */ } + if( pSrc->aiColumn[i]==XN_EXPR ){ + assert( pSrc->aColExpr!=0 && pDest->aColExpr!=0 ); + if( sqlite3ExprCompare(0, pSrc->aColExpr->a[i].pExpr, + pDest->aColExpr->a[i].pExpr, -1)!=0 ){ + return 0; /* Different expressions in the index */ + } + } if( pSrc->aSortOrder[i]!=pDest->aSortOrder[i] ){ return 0; /* Different sort orders */ } - if( !xferCompatibleCollation(pSrc->azColl[i],pDest->azColl[i]) ){ + if( sqlite3_stricmp(pSrc->azColl[i],pDest->azColl[i])!=0 ){ return 0; /* Different collating sequences */ } } - if( sqlite3ExprCompare(pSrc->pPartIdxWhere, pDest->pPartIdxWhere, -1) ){ + if( sqlite3ExprCompare(0, pSrc->pPartIdxWhere, pDest->pPartIdxWhere, -1) ){ return 0; /* Different WHERE clauses */ } @@ -100316,6 +115347,7 @@ static int xferOptimization( int onError, /* How to handle constraint errors */ int iDbDest /* The database of pDest */ ){ + sqlite3 *db = pParse->db; ExprList *pEList; /* The result set of the SELECT */ Table *pSrc; /* The table in the FROM clause of SELECT */ Index *pSrcIdx, *pDestIdx; /* Source and destination indices */ @@ -100344,7 +115376,7 @@ static int xferOptimization( return 0; /* tab1 must not have triggers */ } #ifndef SQLITE_OMIT_VIRTUALTABLE - if( pDest->tabFlags & TF_Virtual ){ + if( IsVirtual(pDest) ){ return 0; /* tab1 must not be a virtual table */ } #endif @@ -100373,7 +115405,6 @@ static int xferOptimization( if( pSelect->pLimit ){ return 0; /* SELECT may not have a LIMIT clause */ } - assert( pSelect->pOffset==0 ); /* Must be so if pLimit==0 */ if( pSelect->pPrior ){ return 0; /* SELECT may not be a compound query */ } @@ -100386,7 +115417,7 @@ static int xferOptimization( return 0; /* The result set must have exactly one column */ } assert( pEList->a[0].pExpr ); - if( pEList->a[0].pExpr->op!=TK_ALL ){ + if( pEList->a[0].pExpr->op!=TK_ASTERISK ){ return 0; /* The result set must be the special operator "*" */ } @@ -100406,7 +115437,7 @@ static int xferOptimization( return 0; /* source and destination must both be WITHOUT ROWID or not */ } #ifndef SQLITE_OMIT_VIRTUALTABLE - if( pSrc->tabFlags & TF_Virtual ){ + if( IsVirtual(pSrc) ){ return 0; /* tab2 must not be a virtual table */ } #endif @@ -100422,21 +115453,32 @@ static int xferOptimization( for(i=0; i<pDest->nCol; i++){ Column *pDestCol = &pDest->aCol[i]; Column *pSrcCol = &pSrc->aCol[i]; +#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS + if( (db->mDbFlags & DBFLAG_Vacuum)==0 + && (pDestCol->colFlags | pSrcCol->colFlags) & COLFLAG_HIDDEN + ){ + return 0; /* Neither table may have __hidden__ columns */ + } +#endif if( pDestCol->affinity!=pSrcCol->affinity ){ return 0; /* Affinity must be the same on all columns */ } - if( !xferCompatibleCollation(pDestCol->zColl, pSrcCol->zColl) ){ + if( sqlite3_stricmp(pDestCol->zColl, pSrcCol->zColl)!=0 ){ return 0; /* Collating sequence must be the same on all columns */ } if( pDestCol->notNull && !pSrcCol->notNull ){ return 0; /* tab2 must be NOT NULL if tab1 is */ } /* Default values for second and subsequent columns need to match. */ - if( i>0 - && ((pDestCol->zDflt==0)!=(pSrcCol->zDflt==0) - || (pDestCol->zDflt && strcmp(pDestCol->zDflt, pSrcCol->zDflt)!=0)) - ){ - return 0; /* Default values must be the same for all columns */ + if( i>0 ){ + assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN ); + assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN ); + if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) + || (pDestCol->pDflt && strcmp(pDestCol->pDflt->u.zToken, + pSrcCol->pDflt->u.zToken)!=0) + ){ + return 0; /* Default values must be the same for all columns */ + } } } for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ @@ -100463,11 +115505,11 @@ static int xferOptimization( ** the extra complication to make this rule less restrictive is probably ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e] */ - if( (pParse->db->flags & SQLITE_ForeignKeys)!=0 && pDest->pFKey!=0 ){ + if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->pFKey!=0 ){ return 0; } #endif - if( (pParse->db->flags & SQLITE_CountRows)!=0 ){ + if( (db->flags & SQLITE_CountRows)!=0 ){ return 0; /* xfer opt does not play well with PRAGMA count_changes */ } @@ -100478,7 +115520,7 @@ static int xferOptimization( #ifdef SQLITE_TEST sqlite3_xferopt_count++; #endif - iDbSrc = sqlite3SchemaToIndex(pParse->db, pSrc->pSchema); + iDbSrc = sqlite3SchemaToIndex(db, pSrc->pSchema); v = sqlite3GetVdbe(pParse); sqlite3CodeVerifySchema(pParse, iDbSrc); iSrc = pParse->nTab++; @@ -100488,14 +115530,18 @@ static int xferOptimization( regRowid = sqlite3GetTempReg(pParse); sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); assert( HasRowid(pDest) || destHasUniqueIdx ); - if( (pDest->iPKey<0 && pDest->pIndex!=0) /* (1) */ + if( (db->mDbFlags & DBFLAG_Vacuum)==0 && ( + (pDest->iPKey<0 && pDest->pIndex!=0) /* (1) */ || destHasUniqueIdx /* (2) */ || (onError!=OE_Abort && onError!=OE_Rollback) /* (3) */ - ){ + )){ /* In some circumstances, we are able to run the xfer optimization - ** only if the destination table is initially empty. This code makes - ** that determination. Conditions under which the destination must - ** be empty: + ** only if the destination table is initially empty. Unless the + ** DBFLAG_Vacuum flag is set, this block generates code to make + ** that determination. If DBFLAG_Vacuum is set, then the destination + ** table is always empty. + ** + ** Conditions under which the destination must be empty: ** ** (1) There is no INTEGER PRIMARY KEY but there are indices. ** (If the destination is not initially empty, the rowid fields @@ -100507,14 +115553,16 @@ static int xferOptimization( ** (3) onError is something other than OE_Abort and OE_Rollback. */ addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); VdbeCoverage(v); - emptyDestTest = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); + emptyDestTest = sqlite3VdbeAddOp0(v, OP_Goto); sqlite3VdbeJumpHere(v, addr1); } if( HasRowid(pSrc) ){ + u8 insFlags; sqlite3OpenTable(pParse, iSrc, iDbSrc, pSrc, OP_OpenRead); emptySrcTest = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); if( pDest->iPKey>=0 ){ addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); + sqlite3VdbeVerifyAbortable(v, onError); addr2 = sqlite3VdbeAddOp3(v, OP_NotExists, iDest, 0, regRowid); VdbeCoverage(v); sqlite3RowidConstraint(pParse, onError, pDest); @@ -100526,10 +115574,17 @@ static int xferOptimization( addr1 = sqlite3VdbeAddOp2(v, OP_Rowid, iSrc, regRowid); assert( (pDest->tabFlags & TF_Autoincrement)==0 ); } - sqlite3VdbeAddOp2(v, OP_RowData, iSrc, regData); - sqlite3VdbeAddOp3(v, OP_Insert, iDest, regData, regRowid); - sqlite3VdbeChangeP5(v, OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND); - sqlite3VdbeChangeP4(v, -1, pDest->zName, 0); + sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); + if( db->mDbFlags & DBFLAG_Vacuum ){ + sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); + insFlags = OPFLAG_NCHANGE|OPFLAG_LASTROWID| + OPFLAG_APPEND|OPFLAG_USESEEKRESULT; + }else{ + insFlags = OPFLAG_NCHANGE|OPFLAG_LASTROWID|OPFLAG_APPEND; + } + sqlite3VdbeAddOp4(v, OP_Insert, iDest, regData, regRowid, + (char*)pDest, P4_TABLE); + sqlite3VdbeChangeP5(v, insFlags); sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); @@ -100538,6 +115593,7 @@ static int xferOptimization( sqlite3TableLock(pParse, iDbSrc, pSrc->tnum, 0, pSrc->zName); } for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ + u8 idxInsFlags = 0; for(pSrcIdx=pSrc->pIndex; ALWAYS(pSrcIdx); pSrcIdx=pSrcIdx->pNext){ if( xferCompatibleIndex(pDestIdx, pSrcIdx) ) break; } @@ -100550,8 +115606,36 @@ static int xferOptimization( sqlite3VdbeChangeP5(v, OPFLAG_BULKCSR); VdbeComment((v, "%s", pDestIdx->zName)); addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iSrc, 0); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_RowKey, iSrc, regData); - sqlite3VdbeAddOp3(v, OP_IdxInsert, iDest, regData, 1); + sqlite3VdbeAddOp3(v, OP_RowData, iSrc, regData, 1); + if( db->mDbFlags & DBFLAG_Vacuum ){ + /* This INSERT command is part of a VACUUM operation, which guarantees + ** that the destination table is empty. If all indexed columns use + ** collation sequence BINARY, then it can also be assumed that the + ** index will be populated by inserting keys in strictly sorted + ** order. In this case, instead of seeking within the b-tree as part + ** of every OP_IdxInsert opcode, an OP_SeekEnd is added before the + ** OP_IdxInsert to seek to the point within the b-tree where each key + ** should be inserted. This is faster. + ** + ** If any of the indexed columns use a collation sequence other than + ** BINARY, this optimization is disabled. This is because the user + ** might change the definition of a collation sequence and then run + ** a VACUUM command. In that case keys may not be written in strictly + ** sorted order. */ + for(i=0; i<pSrcIdx->nColumn; i++){ + const char *zColl = pSrcIdx->azColl[i]; + if( sqlite3_stricmp(sqlite3StrBINARY, zColl) ) break; + } + if( i==pSrcIdx->nColumn ){ + idxInsFlags = OPFLAG_USESEEKRESULT; + sqlite3VdbeAddOp1(v, OP_SeekEnd, iDest); + } + } + if( !HasRowid(pSrc) && pDestIdx->idxType==2 ){ + idxInsFlags |= OPFLAG_NCHANGE; + } + sqlite3VdbeAddOp2(v, OP_IdxInsert, iDest, regData); + sqlite3VdbeChangeP5(v, idxInsFlags|OPFLAG_APPEND); sqlite3VdbeAddOp2(v, OP_Next, iSrc, addr1+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp2(v, OP_Close, iSrc, 0); @@ -100561,6 +115645,7 @@ static int xferOptimization( sqlite3ReleaseTempReg(pParse, regRowid); sqlite3ReleaseTempReg(pParse, regData); if( emptyDestTest ){ + sqlite3AutoincrementEnd(pParse); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_OK, 0); sqlite3VdbeJumpHere(v, emptyDestTest); sqlite3VdbeAddOp2(v, OP_Close, iDest, 0); @@ -100590,6 +115675,7 @@ static int xferOptimization( ** accessed by users of the library. */ +/* #include "sqliteInt.h" */ /* ** Execute SQL code. Return one of the SQLITE_ success/failure @@ -100647,7 +115733,7 @@ SQLITE_API int sqlite3_exec( (SQLITE_DONE==rc && !callbackIsInit && db->flags&SQLITE_NullCallback)) ){ if( !callbackIsInit ){ - azCols = sqlite3DbMallocZero(db, 2*nCol*sizeof(const char*) + 1); + azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); if( azCols==0 ){ goto exec_out; } @@ -100664,10 +115750,11 @@ SQLITE_API int sqlite3_exec( for(i=0; i<nCol; i++){ azVals[i] = (char *)sqlite3_column_text(pStmt, i); if( !azVals[i] && sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){ - db->mallocFailed = 1; + sqlite3OomFault(db); goto exec_out; } } + azVals[i] = 0; } if( xCallback(pArg, nCol, azVals, azCols) ){ /* EVIDENCE-OF: R-38229-40159 If the callback function to @@ -100700,12 +115787,9 @@ exec_out: rc = sqlite3ApiExit(db, rc); if( rc!=SQLITE_OK && pzErrMsg ){ - int nErrMsg = 1 + sqlite3Strlen30(sqlite3_errmsg(db)); - *pzErrMsg = sqlite3Malloc(nErrMsg); - if( *pzErrMsg ){ - memcpy(*pzErrMsg, sqlite3_errmsg(db), nErrMsg); - }else{ - rc = SQLITE_NOMEM; + *pzErrMsg = sqlite3DbStrDup(0, sqlite3_errmsg(db)); + if( *pzErrMsg==0 ){ + rc = SQLITE_NOMEM_BKPT; sqlite3Error(db, SQLITE_NOMEM); } }else if( pzErrMsg ){ @@ -100756,10 +115840,9 @@ exec_out: ** as extensions by SQLite should #include this file instead of ** sqlite3.h. */ -#ifndef _SQLITE3EXT_H_ -#define _SQLITE3EXT_H_ - -typedef struct sqlite3_api_routines sqlite3_api_routines; +#ifndef SQLITE3EXT_H +#define SQLITE3EXT_H +/* #include "sqlite3.h" */ /* ** The following structure holds pointers to all of the SQLite API @@ -100876,7 +115959,7 @@ struct sqlite3_api_routines { int (*set_authorizer)(sqlite3*,int(*)(void*,int,const char*,const char*, const char*,const char*),void*); void (*set_auxdata)(sqlite3_context*,int,void*,void (*)(void*)); - char * (*snprintf)(int,char*,const char*,...); + char * (*xsnprintf)(int,char*,const char*,...); int (*step)(sqlite3_stmt*); int (*table_column_metadata)(sqlite3*,const char*,const char*,const char*, char const**,char const**,int*,int*,int*); @@ -100988,7 +116071,7 @@ struct sqlite3_api_routines { int (*uri_boolean)(const char*,const char*,int); sqlite3_int64 (*uri_int64)(const char*,const char*,sqlite3_int64); const char *(*uri_parameter)(const char*,const char*); - char *(*vsnprintf)(int,char*,const char*,va_list); + char *(*xvsnprintf)(int,char*,const char*,va_list); int (*wal_checkpoint_v2)(sqlite3*,const char*,int,int*,int*); /* Version 3.8.7 and later */ int (*auto_extension)(void(*)(void)); @@ -101007,8 +116090,63 @@ struct sqlite3_api_routines { void (*result_text64)(sqlite3_context*,const char*,sqlite3_uint64, void(*)(void*), unsigned char); int (*strglob)(const char*,const char*); + /* Version 3.8.11 and later */ + sqlite3_value *(*value_dup)(const sqlite3_value*); + void (*value_free)(sqlite3_value*); + int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); + int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); + /* Version 3.9.0 and later */ + unsigned int (*value_subtype)(sqlite3_value*); + void (*result_subtype)(sqlite3_context*,unsigned int); + /* Version 3.10.0 and later */ + int (*status64)(int,sqlite3_int64*,sqlite3_int64*,int); + int (*strlike)(const char*,const char*,unsigned int); + int (*db_cacheflush)(sqlite3*); + /* Version 3.12.0 and later */ + int (*system_errno)(sqlite3*); + /* Version 3.14.0 and later */ + int (*trace_v2)(sqlite3*,unsigned,int(*)(unsigned,void*,void*,void*),void*); + char *(*expanded_sql)(sqlite3_stmt*); + /* Version 3.18.0 and later */ + void (*set_last_insert_rowid)(sqlite3*,sqlite3_int64); + /* Version 3.20.0 and later */ + int (*prepare_v3)(sqlite3*,const char*,int,unsigned int, + sqlite3_stmt**,const char**); + int (*prepare16_v3)(sqlite3*,const void*,int,unsigned int, + sqlite3_stmt**,const void**); + int (*bind_pointer)(sqlite3_stmt*,int,void*,const char*,void(*)(void*)); + void (*result_pointer)(sqlite3_context*,void*,const char*,void(*)(void*)); + void *(*value_pointer)(sqlite3_value*,const char*); + int (*vtab_nochange)(sqlite3_context*); + int (*value_nochange)(sqlite3_value*); + const char *(*vtab_collation)(sqlite3_index_info*,int); + /* Version 3.24.0 and later */ + int (*keyword_count)(void); + int (*keyword_name)(int,const char**,int*); + int (*keyword_check)(const char*,int); + sqlite3_str *(*str_new)(sqlite3*); + char *(*str_finish)(sqlite3_str*); + void (*str_appendf)(sqlite3_str*, const char *zFormat, ...); + void (*str_vappendf)(sqlite3_str*, const char *zFormat, va_list); + void (*str_append)(sqlite3_str*, const char *zIn, int N); + void (*str_appendall)(sqlite3_str*, const char *zIn); + void (*str_appendchar)(sqlite3_str*, int N, char C); + void (*str_reset)(sqlite3_str*); + int (*str_errcode)(sqlite3_str*); + int (*str_length)(sqlite3_str*); + char *(*str_value)(sqlite3_str*); }; +/* +** This is the function signature used for all extension entry points. It +** is also defined in the file "loadext.c". +*/ +typedef int (*sqlite3_loadext_entry)( + sqlite3 *db, /* Handle to the database. */ + char **pzErrMsg, /* Used to set error string on failure. */ + const sqlite3_api_routines *pThunk /* Extension API function pointers. */ +); + /* ** The following macros redefine the API routines so that they are ** redirected through the global sqlite3_api structure. @@ -101020,7 +116158,7 @@ struct sqlite3_api_routines { ** the API. So the redefinition macros are only valid if the ** SQLITE_CORE macros is undefined. */ -#ifndef SQLITE_CORE +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) #define sqlite3_aggregate_context sqlite3_api->aggregate_context #ifndef SQLITE_OMIT_DEPRECATED #define sqlite3_aggregate_count sqlite3_api->aggregate_count @@ -101123,7 +116261,7 @@ struct sqlite3_api_routines { #define sqlite3_rollback_hook sqlite3_api->rollback_hook #define sqlite3_set_authorizer sqlite3_api->set_authorizer #define sqlite3_set_auxdata sqlite3_api->set_auxdata -#define sqlite3_snprintf sqlite3_api->snprintf +#define sqlite3_snprintf sqlite3_api->xsnprintf #define sqlite3_step sqlite3_api->step #define sqlite3_table_column_metadata sqlite3_api->table_column_metadata #define sqlite3_thread_cleanup sqlite3_api->thread_cleanup @@ -101147,6 +116285,7 @@ struct sqlite3_api_routines { #define sqlite3_value_text16le sqlite3_api->value_text16le #define sqlite3_value_type sqlite3_api->value_type #define sqlite3_vmprintf sqlite3_api->vmprintf +#define sqlite3_vsnprintf sqlite3_api->xvsnprintf #define sqlite3_overload_function sqlite3_api->overload_function #define sqlite3_prepare_v2 sqlite3_api->prepare_v2 #define sqlite3_prepare16_v2 sqlite3_api->prepare16_v2 @@ -101222,7 +116361,7 @@ struct sqlite3_api_routines { #define sqlite3_uri_boolean sqlite3_api->uri_boolean #define sqlite3_uri_int64 sqlite3_api->uri_int64 #define sqlite3_uri_parameter sqlite3_api->uri_parameter -#define sqlite3_uri_vsnprintf sqlite3_api->vsnprintf +#define sqlite3_uri_vsnprintf sqlite3_api->xvsnprintf #define sqlite3_wal_checkpoint_v2 sqlite3_api->wal_checkpoint_v2 /* Version 3.8.7 and later */ #define sqlite3_auto_extension sqlite3_api->auto_extension @@ -101237,9 +116376,53 @@ struct sqlite3_api_routines { #define sqlite3_result_blob64 sqlite3_api->result_blob64 #define sqlite3_result_text64 sqlite3_api->result_text64 #define sqlite3_strglob sqlite3_api->strglob -#endif /* SQLITE_CORE */ +/* Version 3.8.11 and later */ +#define sqlite3_value_dup sqlite3_api->value_dup +#define sqlite3_value_free sqlite3_api->value_free +#define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 +#define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 +/* Version 3.9.0 and later */ +#define sqlite3_value_subtype sqlite3_api->value_subtype +#define sqlite3_result_subtype sqlite3_api->result_subtype +/* Version 3.10.0 and later */ +#define sqlite3_status64 sqlite3_api->status64 +#define sqlite3_strlike sqlite3_api->strlike +#define sqlite3_db_cacheflush sqlite3_api->db_cacheflush +/* Version 3.12.0 and later */ +#define sqlite3_system_errno sqlite3_api->system_errno +/* Version 3.14.0 and later */ +#define sqlite3_trace_v2 sqlite3_api->trace_v2 +#define sqlite3_expanded_sql sqlite3_api->expanded_sql +/* Version 3.18.0 and later */ +#define sqlite3_set_last_insert_rowid sqlite3_api->set_last_insert_rowid +/* Version 3.20.0 and later */ +#define sqlite3_prepare_v3 sqlite3_api->prepare_v3 +#define sqlite3_prepare16_v3 sqlite3_api->prepare16_v3 +#define sqlite3_bind_pointer sqlite3_api->bind_pointer +#define sqlite3_result_pointer sqlite3_api->result_pointer +#define sqlite3_value_pointer sqlite3_api->value_pointer +/* Version 3.22.0 and later */ +#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange +#define sqlite3_value_nochange sqlite3_api->value_nochange +#define sqlite3_vtab_collation sqlite3_api->vtab_collation +/* Version 3.24.0 and later */ +#define sqlite3_keyword_count sqlite3_api->keyword_count +#define sqlite3_keyword_name sqlite3_api->keyword_name +#define sqlite3_keyword_check sqlite3_api->keyword_check +#define sqlite3_str_new sqlite3_api->str_new +#define sqlite3_str_finish sqlite3_api->str_finish +#define sqlite3_str_appendf sqlite3_api->str_appendf +#define sqlite3_str_vappendf sqlite3_api->str_vappendf +#define sqlite3_str_append sqlite3_api->str_append +#define sqlite3_str_appendall sqlite3_api->str_appendall +#define sqlite3_str_appendchar sqlite3_api->str_appendchar +#define sqlite3_str_reset sqlite3_api->str_reset +#define sqlite3_str_errcode sqlite3_api->str_errcode +#define sqlite3_str_length sqlite3_api->str_length +#define sqlite3_str_value sqlite3_api->str_value +#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ -#ifndef SQLITE_CORE +#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) /* This case when the file really is being compiled as a loadable ** extension */ # define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api=0; @@ -101254,14 +116437,13 @@ struct sqlite3_api_routines { # define SQLITE_EXTENSION_INIT3 /*no-op*/ #endif -#endif /* _SQLITE3EXT_H_ */ +#endif /* SQLITE3EXT_H */ /************** End of sqlite3ext.h ******************************************/ /************** Continuing where we left off in loadext.c ********************/ -/* #include <string.h> */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_LOAD_EXTENSION - /* ** Some API routines are omitted when various features are ** excluded from a build of SQLite. Substitute a NULL pointer @@ -101293,6 +116475,7 @@ struct sqlite3_api_routines { # define sqlite3_open16 0 # define sqlite3_prepare16 0 # define sqlite3_prepare16_v2 0 +# define sqlite3_prepare16_v3 0 # define sqlite3_result_error16 0 # define sqlite3_result_text16 0 # define sqlite3_result_text16be 0 @@ -101331,7 +116514,7 @@ struct sqlite3_api_routines { # define sqlite3_enable_shared_cache 0 #endif -#ifdef SQLITE_OMIT_TRACE +#if defined(SQLITE_OMIT_TRACE) || defined(SQLITE_OMIT_DEPRECATED) # define sqlite3_profile 0 # define sqlite3_trace 0 #endif @@ -101351,6 +116534,10 @@ struct sqlite3_api_routines { #define sqlite3_blob_reopen 0 #endif +#if defined(SQLITE_OMIT_TRACE) +# define sqlite3_trace_v2 0 +#endif + /* ** The following structure contains pointers to all SQLite API routines. ** A pointer to this structure is passed into extensions when they are @@ -101642,7 +116829,51 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_reset_auto_extension, sqlite3_result_blob64, sqlite3_result_text64, - sqlite3_strglob + sqlite3_strglob, + /* Version 3.8.11 and later */ + (sqlite3_value*(*)(const sqlite3_value*))sqlite3_value_dup, + sqlite3_value_free, + sqlite3_result_zeroblob64, + sqlite3_bind_zeroblob64, + /* Version 3.9.0 and later */ + sqlite3_value_subtype, + sqlite3_result_subtype, + /* Version 3.10.0 and later */ + sqlite3_status64, + sqlite3_strlike, + sqlite3_db_cacheflush, + /* Version 3.12.0 and later */ + sqlite3_system_errno, + /* Version 3.14.0 and later */ + sqlite3_trace_v2, + sqlite3_expanded_sql, + /* Version 3.18.0 and later */ + sqlite3_set_last_insert_rowid, + /* Version 3.20.0 and later */ + sqlite3_prepare_v3, + sqlite3_prepare16_v3, + sqlite3_bind_pointer, + sqlite3_result_pointer, + sqlite3_value_pointer, + /* Version 3.22.0 and later */ + sqlite3_vtab_nochange, + sqlite3_value_nochange, + sqlite3_vtab_collation, + /* Version 3.24.0 and later */ + sqlite3_keyword_count, + sqlite3_keyword_name, + sqlite3_keyword_check, + sqlite3_str_new, + sqlite3_str_finish, + sqlite3_str_appendf, + sqlite3_str_vappendf, + sqlite3_str_append, + sqlite3_str_appendall, + sqlite3_str_appendchar, + sqlite3_str_reset, + sqlite3_str_errcode, + sqlite3_str_length, + sqlite3_str_value }; /* @@ -101665,13 +116896,14 @@ static int sqlite3LoadExtension( ){ sqlite3_vfs *pVfs = db->pVfs; void *handle; - int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); + sqlite3_loadext_entry xInit; char *zErrmsg = 0; const char *zEntry; char *zAltEntry = 0; void **aHandle; - int nMsg = 300 + sqlite3Strlen30(zFile); + u64 nMsg = 300 + sqlite3Strlen30(zFile); int ii; + int rc; /* Shared library endings to try if zFile cannot be loaded as written */ static const char *azEndings[] = { @@ -101690,8 +116922,9 @@ static int sqlite3LoadExtension( /* Ticket #1863. To avoid a creating security problems for older ** applications that relink against newer versions of SQLite, the ** ability to run load_extension is turned off by default. One - ** must call sqlite3_enable_load_extension() to turn on extension - ** loading. Otherwise you get the following error. + ** must call either sqlite3_enable_load_extension(db) or + ** sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0) + ** to turn on extension loading. */ if( (db->flags & SQLITE_LoadExtension)==0 ){ if( pzErrMsg ){ @@ -101706,14 +116939,14 @@ static int sqlite3LoadExtension( #if SQLITE_OS_UNIX || SQLITE_OS_WIN for(ii=0; ii<ArraySize(azEndings) && handle==0; ii++){ char *zAltFile = sqlite3_mprintf("%s.%s", zFile, azEndings[ii]); - if( zAltFile==0 ) return SQLITE_NOMEM; + if( zAltFile==0 ) return SQLITE_NOMEM_BKPT; handle = sqlite3OsDlOpen(pVfs, zAltFile); sqlite3_free(zAltFile); } #endif if( handle==0 ){ if( pzErrMsg ){ - *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); + *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); if( zErrmsg ){ sqlite3_snprintf(nMsg, zErrmsg, "unable to open shared library [%s]", zFile); @@ -101722,8 +116955,7 @@ static int sqlite3LoadExtension( } return SQLITE_ERROR; } - xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) - sqlite3OsDlSym(pVfs, handle, zEntry); + xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry); /* If no entry point was specified and the default legacy ** entry point name "sqlite3_extension_init" was not found, then @@ -101739,10 +116971,10 @@ static int sqlite3LoadExtension( if( xInit==0 && zProc==0 ){ int iFile, iEntry, c; int ncFile = sqlite3Strlen30(zFile); - zAltEntry = sqlite3_malloc(ncFile+30); + zAltEntry = sqlite3_malloc64(ncFile+30); if( zAltEntry==0 ){ sqlite3OsDlClose(pVfs, handle); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memcpy(zAltEntry, "sqlite3_", 8); for(iFile=ncFile-1; iFile>=0 && zFile[iFile]!='/'; iFile--){} @@ -101755,13 +116987,12 @@ static int sqlite3LoadExtension( } memcpy(zAltEntry+iEntry, "_init", 6); zEntry = zAltEntry; - xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) - sqlite3OsDlSym(pVfs, handle, zEntry); + xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry); } if( xInit==0 ){ if( pzErrMsg ){ nMsg += sqlite3Strlen30(zEntry); - *pzErrMsg = zErrmsg = sqlite3_malloc(nMsg); + *pzErrMsg = zErrmsg = sqlite3_malloc64(nMsg); if( zErrmsg ){ sqlite3_snprintf(nMsg, zErrmsg, "no entry point [%s] in shared library [%s]", zEntry, zFile); @@ -101773,7 +117004,9 @@ static int sqlite3LoadExtension( return SQLITE_ERROR; } sqlite3_free(zAltEntry); - if( xInit(db, &zErrmsg, &sqlite3Apis) ){ + rc = xInit(db, &zErrmsg, &sqlite3Apis); + if( rc ){ + if( rc==SQLITE_OK_LOAD_PERMANENTLY ) return SQLITE_OK; if( pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("error during initialization: %s", zErrmsg); } @@ -101785,7 +117018,7 @@ static int sqlite3LoadExtension( /* Append the new shared library handle to the db->aExtension array. */ aHandle = sqlite3DbMallocZero(db, sizeof(handle)*(db->nExtension+1)); if( aHandle==0 ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } if( db->nExtension>0 ){ memcpy(aHandle, db->aExtension, sizeof(handle)*db->nExtension); @@ -101830,26 +117063,15 @@ SQLITE_PRIVATE void sqlite3CloseExtensions(sqlite3 *db){ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ sqlite3_mutex_enter(db->mutex); if( onoff ){ - db->flags |= SQLITE_LoadExtension; + db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; }else{ - db->flags &= ~SQLITE_LoadExtension; + db->flags &= ~(SQLITE_LoadExtension|SQLITE_LoadExtFunc); } sqlite3_mutex_leave(db->mutex); return SQLITE_OK; } -#endif /* SQLITE_OMIT_LOAD_EXTENSION */ - -/* -** The auto-extension code added regardless of whether or not extension -** loading is supported. We need a dummy sqlite3Apis pointer for that -** code if regular extension loading is not available. This is that -** dummy pointer. -*/ -#ifdef SQLITE_OMIT_LOAD_EXTENSION -static const sqlite3_api_routines sqlite3Apis = { 0 }; -#endif - +#endif /* !defined(SQLITE_OMIT_LOAD_EXTENSION) */ /* ** The following object holds the list of automatically loaded @@ -101860,7 +117082,7 @@ static const sqlite3_api_routines sqlite3Apis = { 0 }; */ typedef struct sqlite3AutoExtList sqlite3AutoExtList; static SQLITE_WSD struct sqlite3AutoExtList { - int nExt; /* Number of entries in aExt[] */ + u32 nExt; /* Number of entries in aExt[] */ void (**aExt)(void); /* Pointers to the extension init functions */ } sqlite3Autoext = { 0, 0 }; @@ -101884,7 +117106,9 @@ static SQLITE_WSD struct sqlite3AutoExtList { ** Register a statically linked extension that is automatically ** loaded by every new database connection. */ -SQLITE_API int sqlite3_auto_extension(void (*xInit)(void)){ +SQLITE_API int sqlite3_auto_extension( + void (*xInit)(void) +){ int rc = SQLITE_OK; #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); @@ -101893,7 +117117,7 @@ SQLITE_API int sqlite3_auto_extension(void (*xInit)(void)){ }else #endif { - int i; + u32 i; #if SQLITE_THREADSAFE sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); #endif @@ -101903,11 +117127,11 @@ SQLITE_API int sqlite3_auto_extension(void (*xInit)(void)){ if( wsdAutoext.aExt[i]==xInit ) break; } if( i==wsdAutoext.nExt ){ - int nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]); + u64 nByte = (wsdAutoext.nExt+1)*sizeof(wsdAutoext.aExt[0]); void (**aNew)(void); - aNew = sqlite3_realloc(wsdAutoext.aExt, nByte); + aNew = sqlite3_realloc64(wsdAutoext.aExt, nByte); if( aNew==0 ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; }else{ wsdAutoext.aExt = aNew; wsdAutoext.aExt[wsdAutoext.nExt] = xInit; @@ -101929,7 +117153,9 @@ SQLITE_API int sqlite3_auto_extension(void (*xInit)(void)){ ** Return 1 if xInit was found on the list and removed. Return 0 if xInit ** was not on the list. */ -SQLITE_API int sqlite3_cancel_auto_extension(void (*xInit)(void)){ +SQLITE_API int sqlite3_cancel_auto_extension( + void (*xInit)(void) +){ #if SQLITE_THREADSAFE sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); #endif @@ -101937,7 +117163,7 @@ SQLITE_API int sqlite3_cancel_auto_extension(void (*xInit)(void)){ int n = 0; wsdAutoextInit; sqlite3_mutex_enter(mutex); - for(i=wsdAutoext.nExt-1; i>=0; i--){ + for(i=(int)wsdAutoext.nExt-1; i>=0; i--){ if( wsdAutoext.aExt[i]==xInit ){ wsdAutoext.nExt--; wsdAutoext.aExt[i] = wsdAutoext.aExt[wsdAutoext.nExt]; @@ -101975,10 +117201,10 @@ SQLITE_API void sqlite3_reset_auto_extension(void){ ** If anything goes wrong, set an error in the database connection. */ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ - int i; + u32 i; int go = 1; int rc; - int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); + sqlite3_loadext_entry xInit; wsdAutoextInit; if( wsdAutoext.nExt==0 ){ @@ -101989,18 +117215,22 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ char *zErrmsg; #if SQLITE_THREADSAFE sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); +#endif +#ifdef SQLITE_OMIT_LOAD_EXTENSION + const sqlite3_api_routines *pThunk = 0; +#else + const sqlite3_api_routines *pThunk = &sqlite3Apis; #endif sqlite3_mutex_enter(mutex); if( i>=wsdAutoext.nExt ){ xInit = 0; go = 0; }else{ - xInit = (int(*)(sqlite3*,char**,const sqlite3_api_routines*)) - wsdAutoext.aExt[i]; + xInit = (sqlite3_loadext_entry)wsdAutoext.aExt[i]; } sqlite3_mutex_leave(mutex); zErrmsg = 0; - if( xInit && (rc = xInit(db, &zErrmsg, &sqlite3Apis))!=0 ){ + if( xInit && (rc = xInit(db, &zErrmsg, pThunk))!=0 ){ sqlite3ErrorWithMsg(db, rc, "automatic extension loading failed: %s", zErrmsg); go = 0; @@ -102024,6 +117254,7 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ ************************************************************************* ** This file contains code used to implement the PRAGMA command. */ +/* #include "sqliteInt.h" */ #if !defined(SQLITE_ENABLE_LOCKING_STYLE) # if defined(__APPLE__) @@ -102034,469 +117265,671 @@ SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ #endif /*************************************************************************** -** The next block of code, including the PragTyp_XXXX macro definitions and -** the aPragmaName[] object is composed of generated code. DO NOT EDIT. -** -** To add new pragmas, edit the code in ../tool/mkpragmatab.tcl and rerun -** that script. Then copy/paste the output in place of the following: +** The "pragma.h" include file is an automatically generated file that +** that includes the PragType_XXXX macro definitions and the aPragmaName[] +** object. This ensures that the aPragmaName[] table is arranged in +** lexicographical order to facility a binary search of the pragma name. +** Do not edit pragma.h directly. Edit and rerun the script in at +** ../tool/mkpragmatab.tcl. */ +/************** Include pragma.h in the middle of pragma.c *******************/ +/************** Begin file pragma.h ******************************************/ +/* DO NOT EDIT! +** This file is automatically generated by the script at +** ../tool/mkpragmatab.tcl. To update the set of pragmas, edit +** that script and rerun it. */ + +/* The various pragma types */ #define PragTyp_HEADER_VALUE 0 #define PragTyp_AUTO_VACUUM 1 #define PragTyp_FLAG 2 #define PragTyp_BUSY_TIMEOUT 3 #define PragTyp_CACHE_SIZE 4 -#define PragTyp_CASE_SENSITIVE_LIKE 5 -#define PragTyp_COLLATION_LIST 6 -#define PragTyp_COMPILE_OPTIONS 7 -#define PragTyp_DATA_STORE_DIRECTORY 8 -#define PragTyp_DATABASE_LIST 9 -#define PragTyp_DEFAULT_CACHE_SIZE 10 -#define PragTyp_ENCODING 11 -#define PragTyp_FOREIGN_KEY_CHECK 12 -#define PragTyp_FOREIGN_KEY_LIST 13 -#define PragTyp_INCREMENTAL_VACUUM 14 -#define PragTyp_INDEX_INFO 15 -#define PragTyp_INDEX_LIST 16 -#define PragTyp_INTEGRITY_CHECK 17 -#define PragTyp_JOURNAL_MODE 18 -#define PragTyp_JOURNAL_SIZE_LIMIT 19 -#define PragTyp_LOCK_PROXY_FILE 20 -#define PragTyp_LOCKING_MODE 21 -#define PragTyp_PAGE_COUNT 22 -#define PragTyp_MMAP_SIZE 23 -#define PragTyp_PAGE_SIZE 24 -#define PragTyp_SECURE_DELETE 25 -#define PragTyp_SHRINK_MEMORY 26 -#define PragTyp_SOFT_HEAP_LIMIT 27 -#define PragTyp_STATS 28 -#define PragTyp_SYNCHRONOUS 29 -#define PragTyp_TABLE_INFO 30 -#define PragTyp_TEMP_STORE 31 -#define PragTyp_TEMP_STORE_DIRECTORY 32 -#define PragTyp_THREADS 33 -#define PragTyp_WAL_AUTOCHECKPOINT 34 -#define PragTyp_WAL_CHECKPOINT 35 -#define PragTyp_ACTIVATE_EXTENSIONS 36 -#define PragTyp_HEXKEY 37 -#define PragTyp_KEY 38 -#define PragTyp_REKEY 39 -#define PragTyp_LOCK_STATUS 40 -#define PragTyp_PARSER_TRACE 41 -#define PragFlag_NeedSchema 0x01 -#define PragFlag_ReadOnly 0x02 -static const struct sPragmaNames { - const char *const zName; /* Name of pragma */ - u8 ePragTyp; /* PragTyp_XXX value */ - u8 mPragFlag; /* Zero or more PragFlag_XXX values */ - u32 iArg; /* Extra argument */ -} aPragmaNames[] = { +#define PragTyp_CACHE_SPILL 5 +#define PragTyp_CASE_SENSITIVE_LIKE 6 +#define PragTyp_COLLATION_LIST 7 +#define PragTyp_COMPILE_OPTIONS 8 +#define PragTyp_DATA_STORE_DIRECTORY 9 +#define PragTyp_DATABASE_LIST 10 +#define PragTyp_DEFAULT_CACHE_SIZE 11 +#define PragTyp_ENCODING 12 +#define PragTyp_FOREIGN_KEY_CHECK 13 +#define PragTyp_FOREIGN_KEY_LIST 14 +#define PragTyp_FUNCTION_LIST 15 +#define PragTyp_INCREMENTAL_VACUUM 16 +#define PragTyp_INDEX_INFO 17 +#define PragTyp_INDEX_LIST 18 +#define PragTyp_INTEGRITY_CHECK 19 +#define PragTyp_JOURNAL_MODE 20 +#define PragTyp_JOURNAL_SIZE_LIMIT 21 +#define PragTyp_LOCK_PROXY_FILE 22 +#define PragTyp_LOCKING_MODE 23 +#define PragTyp_PAGE_COUNT 24 +#define PragTyp_MMAP_SIZE 25 +#define PragTyp_MODULE_LIST 26 +#define PragTyp_OPTIMIZE 27 +#define PragTyp_PAGE_SIZE 28 +#define PragTyp_PRAGMA_LIST 29 +#define PragTyp_SECURE_DELETE 30 +#define PragTyp_SHRINK_MEMORY 31 +#define PragTyp_SOFT_HEAP_LIMIT 32 +#define PragTyp_SYNCHRONOUS 33 +#define PragTyp_TABLE_INFO 34 +#define PragTyp_TEMP_STORE 35 +#define PragTyp_TEMP_STORE_DIRECTORY 36 +#define PragTyp_THREADS 37 +#define PragTyp_WAL_AUTOCHECKPOINT 38 +#define PragTyp_WAL_CHECKPOINT 39 +#define PragTyp_ACTIVATE_EXTENSIONS 40 +#define PragTyp_HEXKEY 41 +#define PragTyp_KEY 42 +#define PragTyp_REKEY 43 +#define PragTyp_LOCK_STATUS 44 +#define PragTyp_PARSER_TRACE 45 +#define PragTyp_STATS 46 + +/* Property flags associated with various pragma. */ +#define PragFlg_NeedSchema 0x01 /* Force schema load before running */ +#define PragFlg_NoColumns 0x02 /* OP_ResultRow called with zero columns */ +#define PragFlg_NoColumns1 0x04 /* zero columns if RHS argument is present */ +#define PragFlg_ReadOnly 0x08 /* Read-only HEADER_VALUE */ +#define PragFlg_Result0 0x10 /* Acts as query when no argument */ +#define PragFlg_Result1 0x20 /* Acts as query when has one argument */ +#define PragFlg_SchemaOpt 0x40 /* Schema restricts name search if present */ +#define PragFlg_SchemaReq 0x80 /* Schema required - "main" is default */ + +/* Names of columns for pragmas that return multi-column result +** or that return single-column results where the name of the +** result column is different from the name of the pragma +*/ +static const char *const pragCName[] = { + /* 0 */ "cache_size", /* Used by: default_cache_size */ + /* 1 */ "cid", /* Used by: table_info */ + /* 2 */ "name", + /* 3 */ "type", + /* 4 */ "notnull", + /* 5 */ "dflt_value", + /* 6 */ "pk", + /* 7 */ "tbl", /* Used by: stats */ + /* 8 */ "idx", + /* 9 */ "wdth", + /* 10 */ "hght", + /* 11 */ "flgs", + /* 12 */ "seqno", /* Used by: index_info */ + /* 13 */ "cid", + /* 14 */ "name", + /* 15 */ "seqno", /* Used by: index_xinfo */ + /* 16 */ "cid", + /* 17 */ "name", + /* 18 */ "desc", + /* 19 */ "coll", + /* 20 */ "key", + /* 21 */ "seq", /* Used by: index_list */ + /* 22 */ "name", + /* 23 */ "unique", + /* 24 */ "origin", + /* 25 */ "partial", + /* 26 */ "seq", /* Used by: database_list */ + /* 27 */ "name", + /* 28 */ "file", + /* 29 */ "name", /* Used by: function_list */ + /* 30 */ "builtin", + /* 31 */ "name", /* Used by: module_list pragma_list */ + /* 32 */ "seq", /* Used by: collation_list */ + /* 33 */ "name", + /* 34 */ "id", /* Used by: foreign_key_list */ + /* 35 */ "seq", + /* 36 */ "table", + /* 37 */ "from", + /* 38 */ "to", + /* 39 */ "on_update", + /* 40 */ "on_delete", + /* 41 */ "match", + /* 42 */ "table", /* Used by: foreign_key_check */ + /* 43 */ "rowid", + /* 44 */ "parent", + /* 45 */ "fkid", + /* 46 */ "busy", /* Used by: wal_checkpoint */ + /* 47 */ "log", + /* 48 */ "checkpointed", + /* 49 */ "timeout", /* Used by: busy_timeout */ + /* 50 */ "database", /* Used by: lock_status */ + /* 51 */ "status", +}; + +/* Definitions of all built-in pragmas */ +typedef struct PragmaName { + const char *const zName; /* Name of pragma */ + u8 ePragTyp; /* PragTyp_XXX value */ + u8 mPragFlg; /* Zero or more PragFlg_XXX values */ + u8 iPragCName; /* Start of column names in pragCName[] */ + u8 nPragCName; /* Num of col names. 0 means use pragma name */ + u32 iArg; /* Extra argument */ +} PragmaName; +static const PragmaName aPragmaName[] = { #if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) - { /* zName: */ "activate_extensions", - /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "activate_extensions", + /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "application_id", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ 0, - /* iArg: */ BTREE_APPLICATION_ID }, + {/* zName: */ "application_id", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_APPLICATION_ID }, #endif #if !defined(SQLITE_OMIT_AUTOVACUUM) - { /* zName: */ "auto_vacuum", - /* ePragTyp: */ PragTyp_AUTO_VACUUM, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "auto_vacuum", + /* ePragTyp: */ PragTyp_AUTO_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) - { /* zName: */ "automatic_index", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_AutoIndex }, + {/* zName: */ "automatic_index", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_AutoIndex }, #endif #endif - { /* zName: */ "busy_timeout", - /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "busy_timeout", + /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 49, 1, + /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "cache_size", - /* ePragTyp: */ PragTyp_CACHE_SIZE, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "cache_size", + /* ePragTyp: */ PragTyp_CACHE_SIZE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "cache_spill", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_CacheSpill }, + {/* zName: */ "cache_spill", + /* ePragTyp: */ PragTyp_CACHE_SPILL, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif - { /* zName: */ "case_sensitive_like", - /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "case_sensitive_like", + /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, + /* ePragFlg: */ PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "cell_size_check", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CellSizeCk }, #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "checkpoint_fullfsync", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_CkptFullFSync }, + {/* zName: */ "checkpoint_fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CkptFullFSync }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "collation_list", - /* ePragTyp: */ PragTyp_COLLATION_LIST, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "collation_list", + /* ePragTyp: */ PragTyp_COLLATION_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 32, 2, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) - { /* zName: */ "compile_options", - /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "compile_options", + /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "count_changes", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_CountRows }, + {/* zName: */ "count_changes", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_CountRows }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN - { /* zName: */ "data_store_directory", - /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "data_store_directory", + /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "data_version", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ PragFlag_ReadOnly, - /* iArg: */ BTREE_DATA_VERSION }, + {/* zName: */ "data_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_ReadOnly|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_DATA_VERSION }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "database_list", - /* ePragTyp: */ PragTyp_DATABASE_LIST, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "database_list", + /* ePragTyp: */ PragTyp_DATABASE_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ColNames: */ 26, 3, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) - { /* zName: */ "default_cache_size", - /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "default_cache_size", + /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 1, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) - { /* zName: */ "defer_foreign_keys", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_DeferFKs }, + {/* zName: */ "defer_foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_DeferFKs }, #endif #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "empty_result_callbacks", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_NullCallback }, + {/* zName: */ "empty_result_callbacks", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_NullCallback }, #endif #if !defined(SQLITE_OMIT_UTF16) - { /* zName: */ "encoding", - /* ePragTyp: */ PragTyp_ENCODING, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "encoding", + /* ePragTyp: */ PragTyp_ENCODING, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) - { /* zName: */ "foreign_key_check", - /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "foreign_key_check", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ColNames: */ 42, 4, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FOREIGN_KEY) - { /* zName: */ "foreign_key_list", - /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "foreign_key_list", + /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 34, 8, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) - { /* zName: */ "foreign_keys", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ForeignKeys }, + {/* zName: */ "foreign_keys", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ForeignKeys }, #endif #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "freelist_count", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ PragFlag_ReadOnly, - /* iArg: */ BTREE_FREE_PAGE_COUNT }, + {/* zName: */ "freelist_count", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_ReadOnly|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_FREE_PAGE_COUNT }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "full_column_names", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_FullColNames }, - { /* zName: */ "fullfsync", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_FullFSync }, + {/* zName: */ "full_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullColNames }, + {/* zName: */ "fullfsync", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_FullFSync }, +#endif +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) +#if defined(SQLITE_INTROSPECTION_PRAGMAS) + {/* zName: */ "function_list", + /* ePragTyp: */ PragTyp_FUNCTION_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 29, 2, + /* iArg: */ 0 }, +#endif #endif #if defined(SQLITE_HAS_CODEC) - { /* zName: */ "hexkey", - /* ePragTyp: */ PragTyp_HEXKEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "hexrekey", - /* ePragTyp: */ PragTyp_HEXKEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "hexkey", + /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "hexrekey", + /* ePragTyp: */ PragTyp_HEXKEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if !defined(SQLITE_OMIT_CHECK) - { /* zName: */ "ignore_check_constraints", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_IgnoreChecks }, + {/* zName: */ "ignore_check_constraints", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_IgnoreChecks }, #endif #endif #if !defined(SQLITE_OMIT_AUTOVACUUM) - { /* zName: */ "incremental_vacuum", - /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "incremental_vacuum", + /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "index_info", - /* ePragTyp: */ PragTyp_INDEX_INFO, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "index_list", - /* ePragTyp: */ PragTyp_INDEX_LIST, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "index_info", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 12, 3, + /* iArg: */ 0 }, + {/* zName: */ "index_list", + /* ePragTyp: */ PragTyp_INDEX_LIST, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 21, 5, + /* iArg: */ 0 }, + {/* zName: */ "index_xinfo", + /* ePragTyp: */ PragTyp_INDEX_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 15, 6, + /* iArg: */ 1 }, #endif #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) - { /* zName: */ "integrity_check", - /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "integrity_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "journal_mode", - /* ePragTyp: */ PragTyp_JOURNAL_MODE, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "journal_size_limit", - /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "journal_mode", + /* ePragTyp: */ PragTyp_JOURNAL_MODE, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "journal_size_limit", + /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if defined(SQLITE_HAS_CODEC) - { /* zName: */ "key", - /* ePragTyp: */ PragTyp_KEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "key", + /* ePragTyp: */ PragTyp_KEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "legacy_file_format", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_LegacyFileFmt }, + {/* zName: */ "legacy_file_format", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_LegacyFileFmt }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE - { /* zName: */ "lock_proxy_file", - /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "lock_proxy_file", + /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) - { /* zName: */ "lock_status", - /* ePragTyp: */ PragTyp_LOCK_STATUS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "lock_status", + /* ePragTyp: */ PragTyp_LOCK_STATUS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 50, 2, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "locking_mode", - /* ePragTyp: */ PragTyp_LOCKING_MODE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "max_page_count", - /* ePragTyp: */ PragTyp_PAGE_COUNT, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "mmap_size", - /* ePragTyp: */ PragTyp_MMAP_SIZE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "page_count", - /* ePragTyp: */ PragTyp_PAGE_COUNT, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, - { /* zName: */ "page_size", - /* ePragTyp: */ PragTyp_PAGE_SIZE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "locking_mode", + /* ePragTyp: */ PragTyp_LOCKING_MODE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "max_page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "mmap_size", + /* ePragTyp: */ PragTyp_MMAP_SIZE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif -#if defined(SQLITE_DEBUG) - { /* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) +#if !defined(SQLITE_OMIT_VIRTUALTABLE) +#if defined(SQLITE_INTROSPECTION_PRAGMAS) + {/* zName: */ "module_list", + /* ePragTyp: */ PragTyp_MODULE_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 31, 1, + /* iArg: */ 0 }, +#endif +#endif +#endif + {/* zName: */ "optimize", + /* ePragTyp: */ PragTyp_OPTIMIZE, + /* ePragFlg: */ PragFlg_Result1|PragFlg_NeedSchema, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) + {/* zName: */ "page_count", + /* ePragTyp: */ PragTyp_PAGE_COUNT, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "page_size", + /* ePragTyp: */ PragTyp_PAGE_SIZE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) + {/* zName: */ "parser_trace", + /* ePragTyp: */ PragTyp_PARSER_TRACE, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, +#endif +#if defined(SQLITE_INTROSPECTION_PRAGMAS) + {/* zName: */ "pragma_list", + /* ePragTyp: */ PragTyp_PRAGMA_LIST, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 31, 1, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "query_only", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_QueryOnly }, + {/* zName: */ "query_only", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_QueryOnly }, #endif #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) - { /* zName: */ "quick_check", - /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "quick_check", + /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "read_uncommitted", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ReadUncommitted }, - { /* zName: */ "recursive_triggers", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_RecTriggers }, + {/* zName: */ "read_uncommitted", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReadUncommit }, + {/* zName: */ "recursive_triggers", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_RecTriggers }, #endif #if defined(SQLITE_HAS_CODEC) - { /* zName: */ "rekey", - /* ePragTyp: */ PragTyp_REKEY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "rekey", + /* ePragTyp: */ PragTyp_REKEY, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "reverse_unordered_selects", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ReverseOrder }, + {/* zName: */ "reverse_unordered_selects", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ReverseOrder }, #endif #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "schema_version", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ 0, - /* iArg: */ BTREE_SCHEMA_VERSION }, + {/* zName: */ "schema_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_SCHEMA_VERSION }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "secure_delete", - /* ePragTyp: */ PragTyp_SECURE_DELETE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "secure_delete", + /* ePragTyp: */ PragTyp_SECURE_DELETE, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "short_column_names", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_ShortColNames }, + {/* zName: */ "short_column_names", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_ShortColNames }, #endif - { /* zName: */ "shrink_memory", - /* ePragTyp: */ PragTyp_SHRINK_MEMORY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "soft_heap_limit", - /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "shrink_memory", + /* ePragTyp: */ PragTyp_SHRINK_MEMORY, + /* ePragFlg: */ PragFlg_NoColumns, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "soft_heap_limit", + /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) - { /* zName: */ "sql_trace", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_SqlTrace }, + {/* zName: */ "sql_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace }, #endif #endif -#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "stats", - /* ePragTyp: */ PragTyp_STATS, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, +#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) && defined(SQLITE_DEBUG) + {/* zName: */ "stats", + /* ePragTyp: */ PragTyp_STATS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq, + /* ColNames: */ 7, 5, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "synchronous", - /* ePragTyp: */ PragTyp_SYNCHRONOUS, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "synchronous", + /* ePragTyp: */ PragTyp_SYNCHRONOUS, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_SchemaReq|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - { /* zName: */ "table_info", - /* ePragTyp: */ PragTyp_TABLE_INFO, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "table_info", + /* ePragTyp: */ PragTyp_TABLE_INFO, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result1|PragFlg_SchemaOpt, + /* ColNames: */ 1, 6, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) - { /* zName: */ "temp_store", - /* ePragTyp: */ PragTyp_TEMP_STORE, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "temp_store_directory", - /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "temp_store", + /* ePragTyp: */ PragTyp_TEMP_STORE, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "temp_store_directory", + /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, + /* ePragFlg: */ PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #endif - { /* zName: */ "threads", - /* ePragTyp: */ PragTyp_THREADS, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, + {/* zName: */ "threads", + /* ePragTyp: */ PragTyp_THREADS, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) - { /* zName: */ "user_version", - /* ePragTyp: */ PragTyp_HEADER_VALUE, - /* ePragFlag: */ 0, - /* iArg: */ BTREE_USER_VERSION }, + {/* zName: */ "user_version", + /* ePragTyp: */ PragTyp_HEADER_VALUE, + /* ePragFlg: */ PragFlg_NoColumns1|PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ BTREE_USER_VERSION }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) #if defined(SQLITE_DEBUG) - { /* zName: */ "vdbe_addoptrace", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeAddopTrace }, - { /* zName: */ "vdbe_debug", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, - { /* zName: */ "vdbe_eqp", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeEQP }, - { /* zName: */ "vdbe_listing", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeListing }, - { /* zName: */ "vdbe_trace", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_VdbeTrace }, + {/* zName: */ "vdbe_addoptrace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeAddopTrace }, + {/* zName: */ "vdbe_debug", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, + {/* zName: */ "vdbe_eqp", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeEQP }, + {/* zName: */ "vdbe_listing", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeListing }, + {/* zName: */ "vdbe_trace", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_VdbeTrace }, #endif #endif #if !defined(SQLITE_OMIT_WAL) - { /* zName: */ "wal_autocheckpoint", - /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, - /* ePragFlag: */ 0, - /* iArg: */ 0 }, - { /* zName: */ "wal_checkpoint", - /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, - /* ePragFlag: */ PragFlag_NeedSchema, - /* iArg: */ 0 }, + {/* zName: */ "wal_autocheckpoint", + /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, + /* ePragFlg: */ 0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, + {/* zName: */ "wal_checkpoint", + /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, + /* ePragFlg: */ PragFlg_NeedSchema, + /* ColNames: */ 46, 3, + /* iArg: */ 0 }, #endif #if !defined(SQLITE_OMIT_FLAG_PRAGMAS) - { /* zName: */ "writable_schema", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlag: */ 0, - /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, + {/* zName: */ "writable_schema", + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, + /* ColNames: */ 0, 0, + /* iArg: */ SQLITE_WriteSchema }, #endif }; -/* Number of pragmas: 58 on by default, 71 total. */ -/* End of the automatically generated pragma table. -***************************************************************************/ +/* Number of pragmas: 60 on by default, 77 total. */ + +/************** End of pragma.h **********************************************/ +/************** Continuing where we left off in pragma.c *********************/ /* ** Interpret the given string as a safety level. Return 0 for OFF, -** 1 for ON or NORMAL and 2 for FULL. Return 1 for an empty or -** unrecognized string argument. The FULL option is disallowed +** 1 for ON or NORMAL, 2 for FULL, and 3 for EXTRA. Return 1 for an empty or +** unrecognized string argument. The FULL and EXTRA option is disallowed ** if the omitFull parameter it 1. ** ** Note that the values returned are one less that the values that @@ -102505,18 +117938,21 @@ static const struct sPragmaNames { ** and older scripts may have used numbers 0 for OFF and 1 for ON. */ static u8 getSafetyLevel(const char *z, int omitFull, u8 dflt){ - /* 123456789 123456789 */ - static const char zText[] = "onoffalseyestruefull"; - static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 16}; - static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 4}; - static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 2}; + /* 123456789 123456789 123 */ + static const char zText[] = "onoffalseyestruextrafull"; + static const u8 iOffset[] = {0, 1, 2, 4, 9, 12, 15, 20}; + static const u8 iLength[] = {2, 2, 3, 5, 3, 4, 5, 4}; + static const u8 iValue[] = {1, 0, 0, 0, 1, 1, 3, 2}; + /* on no off false yes true extra full */ int i, n; if( sqlite3Isdigit(*z) ){ return (u8)sqlite3Atoi(z); } n = sqlite3Strlen30(z); - for(i=0; i<ArraySize(iLength)-omitFull; i++){ - if( iLength[i]==n && sqlite3StrNICmp(&zText[iOffset[i]],z,n)==0 ){ + for(i=0; i<ArraySize(iLength); i++){ + if( iLength[i]==n && sqlite3StrNICmp(&zText[iOffset[i]],z,n)==0 + && (!omitFull || iValue[i]<=1) + ){ return iValue[i]; } } @@ -102622,20 +118058,44 @@ static int changeTempStorage(Parse *pParse, const char *zStorageType){ } #endif /* SQLITE_PAGER_PRAGMAS */ +/* +** Set result column names for a pragma. +*/ +static void setPragmaResultColumnNames( + Vdbe *v, /* The query under construction */ + const PragmaName *pPragma /* The pragma */ +){ + u8 n = pPragma->nPragCName; + sqlite3VdbeSetNumCols(v, n==0 ? 1 : n); + if( n==0 ){ + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, pPragma->zName, SQLITE_STATIC); + }else{ + int i, j; + for(i=0, j=pPragma->iPragCName; i<n; i++, j++){ + sqlite3VdbeSetColName(v, i, COLNAME_NAME, pragCName[j], SQLITE_STATIC); + } + } +} + /* ** Generate code to return a single integer value. */ -static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){ - Vdbe *v = sqlite3GetVdbe(pParse); - int mem = ++pParse->nMem; - i64 *pI64 = sqlite3DbMallocRaw(pParse->db, sizeof(value)); - if( pI64 ){ - memcpy(pI64, &value, sizeof(value)); +static void returnSingleInt(Vdbe *v, i64 value){ + sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, 1, 0, (const u8*)&value, P4_INT64); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); +} + +/* +** Generate code to return a single text value. +*/ +static void returnSingleText( + Vdbe *v, /* Prepared statement under construction */ + const char *zValue /* Value to be returned */ +){ + if( zValue ){ + sqlite3VdbeLoadString(v, 1, (const char*)zValue); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); } - sqlite3VdbeAddOp4(v, OP_Int64, 0, mem, 0, (char*)pI64, P4_INT64); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC); - sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1); } @@ -102711,12 +118171,48 @@ SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){ return azModeName[eMode]; } +/* +** Locate a pragma in the aPragmaName[] array. +*/ +static const PragmaName *pragmaLocate(const char *zName){ + int upr, lwr, mid = 0, rc; + lwr = 0; + upr = ArraySize(aPragmaName)-1; + while( lwr<=upr ){ + mid = (lwr+upr)/2; + rc = sqlite3_stricmp(zName, aPragmaName[mid].zName); + if( rc==0 ) break; + if( rc<0 ){ + upr = mid - 1; + }else{ + lwr = mid + 1; + } + } + return lwr>upr ? 0 : &aPragmaName[mid]; +} + +/* +** Helper subroutine for PRAGMA integrity_check: +** +** Generate code to output a single-column result row with a value of the +** string held in register 3. Decrement the result count in register 1 +** and halt if the maximum number of result rows have been issued. +*/ +static int integrityCheckResultRow(Vdbe *v){ + int addr; + sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); + addr = sqlite3VdbeAddOp3(v, OP_IfPos, 1, sqlite3VdbeCurrentAddr(v)+2, 1); + VdbeCoverage(v); + sqlite3VdbeAddOp0(v, OP_Halt); + return addr; +} + /* ** Process a pragma statement. ** ** Pragmas are of this form: ** -** PRAGMA [database.]id [= value] +** PRAGMA [schema.]id [= value] ** ** The identifier might also be a string. The value is a string, and ** identifier, or a number. If minusFlag is true, then the value is @@ -102728,8 +118224,8 @@ SQLITE_PRIVATE const char *sqlite3JournalModename(int eMode){ */ SQLITE_PRIVATE void sqlite3Pragma( Parse *pParse, - Token *pId1, /* First part of [database.]id field */ - Token *pId2, /* Second part of [database.]id field, or NULL */ + Token *pId1, /* First part of [schema.]id field */ + Token *pId2, /* Second part of [schema.]id field, or NULL */ Token *pValue, /* Token for <value>, or NULL */ int minusFlag /* True if a '-' sign preceded <value> */ ){ @@ -102739,17 +118235,17 @@ SQLITE_PRIVATE void sqlite3Pragma( Token *pId; /* Pointer to <id> token */ char *aFcntl[4]; /* Argument to SQLITE_FCNTL_PRAGMA */ int iDb; /* Database index for <database> */ - int lwr, upr, mid = 0; /* Binary search bounds */ int rc; /* return value form SQLITE_FCNTL_PRAGMA */ sqlite3 *db = pParse->db; /* The database connection */ Db *pDb; /* The specific database being pragmaed */ Vdbe *v = sqlite3GetVdbe(pParse); /* Prepared statement */ + const PragmaName *pPragma; /* The pragma */ if( v==0 ) return; sqlite3VdbeRunOnlyOnce(v); pParse->nMem = 2; - /* Interpret the [database.] part of the pragma statement. iDb is the + /* Interpret the [schema.] part of the pragma statement. iDb is the ** index of the database this pragma is being applied to in db.aDb[]. */ iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); if( iDb<0 ) return; @@ -102771,7 +118267,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } assert( pId2 ); - zDb = pId2->n>0 ? pDb->zName : 0; + zDb = pId2->n>0 ? pDb->zDbSName : 0; if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){ goto pragma_out; } @@ -102779,6 +118275,17 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS ** connection. If it returns SQLITE_OK, then assume that the VFS ** handled the pragma and generate a no-op prepared statement. + ** + ** IMPLEMENTATION-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, + ** an SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file + ** object corresponding to the database file to which the pragma + ** statement refers. + ** + ** IMPLEMENTATION-OF: R-29875-31678 The argument to the SQLITE_FCNTL_PRAGMA + ** file control is an array of pointers to strings (char**) in which the + ** second element of the array is the name of the pragma and the third + ** element is the argument to the pragma or NULL if the pragma has no + ** argument. */ aFcntl[0] = 0; aFcntl[1] = zLeft; @@ -102787,14 +118294,10 @@ SQLITE_PRIVATE void sqlite3Pragma( db->busyHandler.nBusy = 0; rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl); if( rc==SQLITE_OK ){ - if( aFcntl[0] ){ - int mem = ++pParse->nMem; - sqlite3VdbeAddOp4(v, OP_String8, 0, mem, 0, aFcntl[0], 0); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "result", SQLITE_STATIC); - sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1); - sqlite3_free(aFcntl[0]); - } + sqlite3VdbeSetNumCols(v, 1); + sqlite3VdbeSetColName(v, 0, COLNAME_NAME, aFcntl[0], SQLITE_TRANSIENT); + returnSingleText(v, aFcntl[0]); + sqlite3_free(aFcntl[0]); goto pragma_out; } if( rc!=SQLITE_NOTFOUND ){ @@ -102808,32 +118311,28 @@ SQLITE_PRIVATE void sqlite3Pragma( } /* Locate the pragma in the lookup table */ - lwr = 0; - upr = ArraySize(aPragmaNames)-1; - while( lwr<=upr ){ - mid = (lwr+upr)/2; - rc = sqlite3_stricmp(zLeft, aPragmaNames[mid].zName); - if( rc==0 ) break; - if( rc<0 ){ - upr = mid - 1; - }else{ - lwr = mid + 1; - } - } - if( lwr>upr ) goto pragma_out; + pPragma = pragmaLocate(zLeft); + if( pPragma==0 ) goto pragma_out; /* Make sure the database schema is loaded if the pragma requires that */ - if( (aPragmaNames[mid].mPragFlag & PragFlag_NeedSchema)!=0 ){ + if( (pPragma->mPragFlg & PragFlg_NeedSchema)!=0 ){ if( sqlite3ReadSchema(pParse) ) goto pragma_out; } + /* Register the result column names for pragmas that return results */ + if( (pPragma->mPragFlg & PragFlg_NoColumns)==0 + && ((pPragma->mPragFlg & PragFlg_NoColumns1)==0 || zRight==0) + ){ + setPragmaResultColumnNames(v, pPragma); + } + /* Jump to the appropriate pragma handler */ - switch( aPragmaNames[mid].ePragTyp ){ + switch( pPragma->ePragTyp ){ #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) /* - ** PRAGMA [database.]default_cache_size - ** PRAGMA [database.]default_cache_size=N + ** PRAGMA [schema.]default_cache_size + ** PRAGMA [schema.]default_cache_size=N ** ** The first form reports the current persistent setting for the ** page cache size. The value returned is the maximum number of @@ -102860,21 +118359,20 @@ SQLITE_PRIVATE void sqlite3Pragma( { OP_Noop, 0, 0, 0}, { OP_ResultRow, 1, 1, 0}, }; - int addr; + VdbeOp *aOp; sqlite3VdbeUsesBtree(v, iDb); if( !zRight ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC); pParse->nMem += 2; - addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize,iLn); - sqlite3VdbeChangeP1(v, addr, iDb); - sqlite3VdbeChangeP1(v, addr+1, iDb); - sqlite3VdbeChangeP1(v, addr+6, SQLITE_DEFAULT_CACHE_SIZE); + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(getCacheSize)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[6].p1 = SQLITE_DEFAULT_CACHE_SIZE; }else{ int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3VdbeAddOp2(v, OP_Integer, size, 1); - sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, 1); + sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_DEFAULT_CACHE_SIZE, size); assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); pDb->pSchema->cache_size = size; sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); @@ -102885,8 +118383,8 @@ SQLITE_PRIVATE void sqlite3Pragma( #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) /* - ** PRAGMA [database.]page_size - ** PRAGMA [database.]page_size=N + ** PRAGMA [schema.]page_size + ** PRAGMA [schema.]page_size=N ** ** The first form reports the current setting for the ** database page size in bytes. The second form sets the @@ -102898,33 +118396,37 @@ SQLITE_PRIVATE void sqlite3Pragma( assert( pBt!=0 ); if( !zRight ){ int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; - returnSingleInt(pParse, "page_size", size); + returnSingleInt(v, size); }else{ /* Malloc may fail when setting the page-size, as there is an internal ** buffer that the pager module resizes using sqlite3_realloc(). */ db->nextPagesize = sqlite3Atoi(zRight); if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,-1,0) ){ - db->mallocFailed = 1; + sqlite3OomFault(db); } } break; } /* - ** PRAGMA [database.]secure_delete - ** PRAGMA [database.]secure_delete=ON/OFF + ** PRAGMA [schema.]secure_delete + ** PRAGMA [schema.]secure_delete=ON/OFF/FAST ** ** The first form reports the current setting for the ** secure_delete flag. The second form changes the secure_delete - ** flag setting and reports thenew value. + ** flag setting and reports the new value. */ case PragTyp_SECURE_DELETE: { Btree *pBt = pDb->pBt; int b = -1; assert( pBt!=0 ); if( zRight ){ - b = sqlite3GetBoolean(zRight, 0); + if( sqlite3_stricmp(zRight, "fast")==0 ){ + b = 2; + }else{ + b = sqlite3GetBoolean(zRight, 0); + } } if( pId2->n==0 && b>=0 ){ int ii; @@ -102933,13 +118435,13 @@ SQLITE_PRIVATE void sqlite3Pragma( } } b = sqlite3BtreeSecureDelete(pBt, b); - returnSingleInt(pParse, "secure_delete", b); + returnSingleInt(v, b); break; } /* - ** PRAGMA [database.]max_page_count - ** PRAGMA [database.]max_page_count=N + ** PRAGMA [schema.]max_page_count + ** PRAGMA [schema.]max_page_count=N ** ** The first form reports the current setting for the ** maximum number of pages in the database file. The @@ -102950,7 +118452,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** change. The only purpose is to provide an easy way to test ** the sqlite3AbsInt32() function. ** - ** PRAGMA [database.]page_count + ** PRAGMA [schema.]page_count ** ** Return the number of pages in the specified database. */ @@ -102965,14 +118467,12 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3AbsInt32(sqlite3Atoi(zRight))); } sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); break; } /* - ** PRAGMA [database.]locking_mode - ** PRAGMA [database.]locking_mode = (normal|exclusive) + ** PRAGMA [schema.]locking_mode + ** PRAGMA [schema.]locking_mode = (normal|exclusive) */ case PragTyp_LOCKING_MODE: { const char *zRet = "normal"; @@ -103012,25 +118512,19 @@ SQLITE_PRIVATE void sqlite3Pragma( if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ zRet = "exclusive"; } - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", SQLITE_STATIC); - sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + returnSingleText(v, zRet); break; } /* - ** PRAGMA [database.]journal_mode - ** PRAGMA [database.]journal_mode = + ** PRAGMA [schema.]journal_mode + ** PRAGMA [schema.]journal_mode = ** (delete|persist|off|truncate|memory|wal|off) */ case PragTyp_JOURNAL_MODE: { int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ int ii; /* Loop counter */ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC); - if( zRight==0 ){ /* If there is no "=MODE" part of the pragma, do a query for the ** current mode */ @@ -103063,8 +118557,8 @@ SQLITE_PRIVATE void sqlite3Pragma( } /* - ** PRAGMA [database.]journal_size_limit - ** PRAGMA [database.]journal_size_limit=N + ** PRAGMA [schema.]journal_size_limit + ** PRAGMA [schema.]journal_size_limit=N ** ** Get or set the size limit on rollback journal files. */ @@ -103076,15 +118570,15 @@ SQLITE_PRIVATE void sqlite3Pragma( if( iLimit<-1 ) iLimit = -1; } iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); - returnSingleInt(pParse, "journal_size_limit", iLimit); + returnSingleInt(v, iLimit); break; } #endif /* SQLITE_OMIT_PAGER_PRAGMAS */ /* - ** PRAGMA [database.]auto_vacuum - ** PRAGMA [database.]auto_vacuum=N + ** PRAGMA [schema.]auto_vacuum + ** PRAGMA [schema.]auto_vacuum=N ** ** Get or set the value of the database 'auto-vacuum' parameter. ** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL @@ -103094,7 +118588,7 @@ SQLITE_PRIVATE void sqlite3Pragma( Btree *pBt = pDb->pBt; assert( pBt!=0 ); if( !zRight ){ - returnSingleInt(pParse, "auto_vacuum", sqlite3BtreeGetAutoVacuum(pBt)); + returnSingleInt(v, sqlite3BtreeGetAutoVacuum(pBt)); }else{ int eAuto = getAutoVacuum(zRight); assert( eAuto>=0 && eAuto<=2 ); @@ -103117,16 +118611,18 @@ SQLITE_PRIVATE void sqlite3Pragma( { OP_ReadCookie, 0, 1, BTREE_LARGEST_ROOT_PAGE}, { OP_If, 1, 0, 0}, /* 2 */ { OP_Halt, SQLITE_OK, OE_Abort, 0}, /* 3 */ - { OP_Integer, 0, 1, 0}, /* 4 */ - { OP_SetCookie, 0, BTREE_INCR_VACUUM, 1}, /* 5 */ + { OP_SetCookie, 0, BTREE_INCR_VACUUM, 0}, /* 4 */ }; - int iAddr; - iAddr = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6, iLn); - sqlite3VdbeChangeP1(v, iAddr, iDb); - sqlite3VdbeChangeP1(v, iAddr+1, iDb); - sqlite3VdbeChangeP2(v, iAddr+2, iAddr+4); - sqlite3VdbeChangeP1(v, iAddr+4, eAuto-1); - sqlite3VdbeChangeP1(v, iAddr+5, iDb); + VdbeOp *aOp; + int iAddr = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setMeta6)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setMeta6), setMeta6, iLn); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[2].p2 = iAddr+4; + aOp[4].p1 = iDb; + aOp[4].p3 = eAuto - 1; sqlite3VdbeUsesBtree(v, iDb); } } @@ -103135,7 +118631,7 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif /* - ** PRAGMA [database.]incremental_vacuum(N) + ** PRAGMA [schema.]incremental_vacuum(N) ** ** Do N steps of incremental vacuuming on a database. */ @@ -103158,8 +118654,8 @@ SQLITE_PRIVATE void sqlite3Pragma( #ifndef SQLITE_OMIT_PAGER_PRAGMAS /* - ** PRAGMA [database.]cache_size - ** PRAGMA [database.]cache_size=N + ** PRAGMA [schema.]cache_size + ** PRAGMA [schema.]cache_size=N ** ** The first form reports the current local setting for the ** page cache size. The second form sets the local @@ -103171,7 +118667,7 @@ SQLITE_PRIVATE void sqlite3Pragma( case PragTyp_CACHE_SIZE: { assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( !zRight ){ - returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); + returnSingleInt(v, pDb->pSchema->cache_size); }else{ int size = sqlite3Atoi(zRight); pDb->pSchema->cache_size = size; @@ -103181,7 +118677,50 @@ SQLITE_PRIVATE void sqlite3Pragma( } /* - ** PRAGMA [database.]mmap_size(N) + ** PRAGMA [schema.]cache_spill + ** PRAGMA cache_spill=BOOLEAN + ** PRAGMA [schema.]cache_spill=N + ** + ** The first form reports the current local setting for the + ** page cache spill size. The second form turns cache spill on + ** or off. When turnning cache spill on, the size is set to the + ** current cache_size. The third form sets a spill size that + ** may be different form the cache size. + ** If N is positive then that is the + ** number of pages in the cache. If N is negative, then the + ** number of pages is adjusted so that the cache uses -N kibibytes + ** of memory. + ** + ** If the number of cache_spill pages is less then the number of + ** cache_size pages, no spilling occurs until the page count exceeds + ** the number of cache_size pages. + ** + ** The cache_spill=BOOLEAN setting applies to all attached schemas, + ** not just the schema specified. + */ + case PragTyp_CACHE_SPILL: { + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + if( !zRight ){ + returnSingleInt(v, + (db->flags & SQLITE_CacheSpill)==0 ? 0 : + sqlite3BtreeSetSpillSize(pDb->pBt,0)); + }else{ + int size = 1; + if( sqlite3GetInt32(zRight, &size) ){ + sqlite3BtreeSetSpillSize(pDb->pBt, size); + } + if( sqlite3GetBoolean(zRight, size!=0) ){ + db->flags |= SQLITE_CacheSpill; + }else{ + db->flags &= ~SQLITE_CacheSpill; + } + setAllPagerFlags(db); + } + break; + } + + /* + ** PRAGMA [schema.]mmap_size(N) ** ** Used to set mapping size limit. The mapping size limit is ** used to limit the aggregate size of all memory mapped regions of the @@ -103216,7 +118755,7 @@ SQLITE_PRIVATE void sqlite3Pragma( rc = SQLITE_OK; #endif if( rc==SQLITE_OK ){ - returnSingleInt(pParse, "mmap_size", sz); + returnSingleInt(v, sz); }else if( rc!=SQLITE_NOTFOUND ){ pParse->nErr++; pParse->rc = rc; @@ -103237,7 +118776,7 @@ SQLITE_PRIVATE void sqlite3Pragma( */ case PragTyp_TEMP_STORE: { if( !zRight ){ - returnSingleInt(pParse, "temp_store", db->temp_store); + returnSingleInt(v, db->temp_store); }else{ changeTempStorage(pParse, zRight); } @@ -103256,13 +118795,7 @@ SQLITE_PRIVATE void sqlite3Pragma( */ case PragTyp_TEMP_STORE_DIRECTORY: { if( !zRight ){ - if( sqlite3_temp_directory ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, - "temp_store_directory", SQLITE_STATIC); - sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_temp_directory, 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); - } + returnSingleText(v, sqlite3_temp_directory); }else{ #ifndef SQLITE_OMIT_WSD if( zRight[0] ){ @@ -103306,13 +118839,7 @@ SQLITE_PRIVATE void sqlite3Pragma( */ case PragTyp_DATA_STORE_DIRECTORY: { if( !zRight ){ - if( sqlite3_data_directory ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, - "data_store_directory", SQLITE_STATIC); - sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_data_directory, 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); - } + returnSingleText(v, sqlite3_data_directory); }else{ #ifndef SQLITE_OMIT_WSD if( zRight[0] ){ @@ -103337,8 +118864,8 @@ SQLITE_PRIVATE void sqlite3Pragma( #if SQLITE_ENABLE_LOCKING_STYLE /* - ** PRAGMA [database.]lock_proxy_file - ** PRAGMA [database.]lock_proxy_file = ":auto:"|"lock_file_path" + ** PRAGMA [schema.]lock_proxy_file + ** PRAGMA [schema.]lock_proxy_file = ":auto:"|"lock_file_path" ** ** Return or set the value of the lock_proxy_file flag. Changing ** the value sets a specific file to be used for database access locks. @@ -103351,14 +118878,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3_file *pFile = sqlite3PagerFile(pPager); sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, &proxy_file_path); - - if( proxy_file_path ){ - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, - "lock_proxy_file", SQLITE_STATIC); - sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, proxy_file_path, 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); - } + returnSingleText(v, proxy_file_path); }else{ Pager *pPager = sqlite3BtreePager(pDb->pBt); sqlite3_file *pFile = sqlite3PagerFile(pPager); @@ -103380,8 +118900,8 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif /* SQLITE_ENABLE_LOCKING_STYLE */ /* - ** PRAGMA [database.]synchronous - ** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL + ** PRAGMA [schema.]synchronous + ** PRAGMA [schema.]synchronous=OFF|ON|NORMAL|FULL|EXTRA ** ** Return or set the local value of the synchronous flag. Changing ** the local value does not make changes to the disk file and the @@ -103390,13 +118910,16 @@ SQLITE_PRIVATE void sqlite3Pragma( */ case PragTyp_SYNCHRONOUS: { if( !zRight ){ - returnSingleInt(pParse, "synchronous", pDb->safety_level-1); + returnSingleInt(v, pDb->safety_level-1); }else{ if( !db->autoCommit ){ sqlite3ErrorMsg(pParse, "Safety level may not be changed inside a transaction"); - }else{ - pDb->safety_level = getSafetyLevel(zRight,0,1)+1; + }else if( iDb!=1 ){ + int iLevel = (getSafetyLevel(zRight,0,1)+1) & PAGER_SYNCHRONOUS_MASK; + if( iLevel==0 ) iLevel = 1; + pDb->safety_level = iLevel; + pDb->bSyncSet = 1; setAllPagerFlags(db); } } @@ -103407,10 +118930,10 @@ SQLITE_PRIVATE void sqlite3Pragma( #ifndef SQLITE_OMIT_FLAG_PRAGMAS case PragTyp_FLAG: { if( zRight==0 ){ - returnSingleInt(pParse, aPragmaNames[mid].zName, - (db->flags & aPragmaNames[mid].iArg)!=0 ); + setPragmaResultColumnNames(v, pPragma); + returnSingleInt(v, (db->flags & pPragma->iArg)!=0 ); }else{ - int mask = aPragmaNames[mid].iArg; /* Mask of bits to set or clear. */ + int mask = pPragma->iArg; /* Mask of bits to set or clear. */ if( db->autoCommit==0 ){ /* Foreign key support may not be enabled or disabled while not ** in auto-commit mode. */ @@ -103434,7 +118957,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** compiler (eg. count_changes). So add an opcode to expire all ** compiled SQL statements after modifying a pragma value. */ - sqlite3VdbeAddOp2(v, OP_Expire, 0, 0); + sqlite3VdbeAddOp0(v, OP_Expire); setAllPagerFlags(db); } break; @@ -103453,85 +118976,70 @@ SQLITE_PRIVATE void sqlite3Pragma( ** type: Column declaration type. ** notnull: True if 'NOT NULL' is part of column declaration ** dflt_value: The default value for the column, if any. + ** pk: Non-zero for PK fields. */ case PragTyp_TABLE_INFO: if( zRight ){ Table *pTab; - pTab = sqlite3FindTable(db, zRight, zDb); + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); if( pTab ){ int i, k; int nHidden = 0; Column *pCol; Index *pPk = sqlite3PrimaryKeyIndex(pTab); - sqlite3VdbeSetNumCols(v, 6); pParse->nMem = 6; sqlite3CodeVerifySchema(pParse, iDb); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", SQLITE_STATIC); sqlite3ViewGetColumnNames(pParse, pTab); for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){ if( IsHiddenColumn(pCol) ){ nHidden++; continue; } - sqlite3VdbeAddOp2(v, OP_Integer, i-nHidden, 1); - sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pCol->zName, 0); - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, - pCol->zType ? pCol->zType : "", 0); - sqlite3VdbeAddOp2(v, OP_Integer, (pCol->notNull ? 1 : 0), 4); - if( pCol->zDflt ){ - sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pCol->zDflt, 0); - }else{ - sqlite3VdbeAddOp2(v, OP_Null, 0, 5); - } if( (pCol->colFlags & COLFLAG_PRIMKEY)==0 ){ k = 0; }else if( pPk==0 ){ k = 1; }else{ - for(k=1; ALWAYS(k<=pTab->nCol) && pPk->aiColumn[k-1]!=i; k++){} + for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } - sqlite3VdbeAddOp2(v, OP_Integer, k, 6); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6); + assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN ); + sqlite3VdbeMultiLoad(v, 1, "issisi", + i-nHidden, + pCol->zName, + sqlite3ColumnType(pCol,""), + pCol->notNull ? 1 : 0, + pCol->pDflt ? pCol->pDflt->u.zToken : 0, + k); } } } break; +#ifdef SQLITE_DEBUG case PragTyp_STATS: { Index *pIdx; HashElem *i; - v = sqlite3GetVdbe(pParse); - sqlite3VdbeSetNumCols(v, 4); - pParse->nMem = 4; + pParse->nMem = 5; sqlite3CodeVerifySchema(pParse, iDb); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "table", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "index", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "width", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "height", SQLITE_STATIC); for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ Table *pTab = sqliteHashData(i); - sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, pTab->zName, 0); - sqlite3VdbeAddOp2(v, OP_Null, 0, 2); - sqlite3VdbeAddOp2(v, OP_Integer, - (int)sqlite3LogEstToInt(pTab->szTabRow), 3); - sqlite3VdbeAddOp2(v, OP_Integer, - (int)sqlite3LogEstToInt(pTab->nRowLogEst), 4); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); + sqlite3VdbeMultiLoad(v, 1, "ssiii", + pTab->zName, + 0, + pTab->szTabRow, + pTab->nRowLogEst, + pTab->tabFlags); for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0); - sqlite3VdbeAddOp2(v, OP_Integer, - (int)sqlite3LogEstToInt(pIdx->szIdxRow), 3); - sqlite3VdbeAddOp2(v, OP_Integer, - (int)sqlite3LogEstToInt(pIdx->aiRowLogEst[0]), 4); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); + sqlite3VdbeMultiLoad(v, 2, "siiiX", + pIdx->zName, + pIdx->szIdxRow, + pIdx->aiRowLogEst[0], + pIdx->hasStat1); + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5); } } } break; +#endif case PragTyp_INDEX_INFO: if( zRight ){ Index *pIdx; @@ -103539,20 +119047,30 @@ SQLITE_PRIVATE void sqlite3Pragma( pIdx = sqlite3FindIndex(db, zRight, zDb); if( pIdx ){ int i; + int mx; + if( pPragma->iArg ){ + /* PRAGMA index_xinfo (newer version with more rows and columns) */ + mx = pIdx->nColumn; + pParse->nMem = 6; + }else{ + /* PRAGMA index_info (legacy version) */ + mx = pIdx->nKeyCol; + pParse->nMem = 3; + } pTab = pIdx->pTable; - sqlite3VdbeSetNumCols(v, 3); - pParse->nMem = 3; sqlite3CodeVerifySchema(pParse, iDb); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC); - for(i=0; i<pIdx->nKeyCol; i++){ + assert( pParse->nMem<=pPragma->nPragCName ); + for(i=0; i<mx; i++){ i16 cnum = pIdx->aiColumn[i]; - sqlite3VdbeAddOp2(v, OP_Integer, i, 1); - sqlite3VdbeAddOp2(v, OP_Integer, cnum, 2); - assert( pTab->nCol>cnum ); - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); + sqlite3VdbeMultiLoad(v, 1, "iisX", i, cnum, + cnum<0 ? 0 : pTab->aCol[cnum].zName); + if( pPragma->iArg ){ + sqlite3VdbeMultiLoad(v, 4, "isiX", + pIdx->aSortOrder[i], + pIdx->azColl[i], + i<pIdx->nKeyCol); + } + sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem); } } } @@ -103564,18 +119082,16 @@ SQLITE_PRIVATE void sqlite3Pragma( int i; pTab = sqlite3FindTable(db, zRight, zDb); if( pTab ){ - v = sqlite3GetVdbe(pParse); - sqlite3VdbeSetNumCols(v, 3); - pParse->nMem = 3; + pParse->nMem = 5; sqlite3CodeVerifySchema(pParse, iDb); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC); for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ - sqlite3VdbeAddOp2(v, OP_Integer, i, 1); - sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0); - sqlite3VdbeAddOp2(v, OP_Integer, IsUniqueIndex(pIdx), 3); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); + const char *azOrigin[] = { "c", "u", "pk" }; + sqlite3VdbeMultiLoad(v, 1, "isisi", + i, + pIdx->zName, + IsUniqueIndex(pIdx), + azOrigin[pIdx->idxType], + pIdx->pPartIdxWhere!=0); } } } @@ -103583,19 +119099,14 @@ SQLITE_PRIVATE void sqlite3Pragma( case PragTyp_DATABASE_LIST: { int i; - sqlite3VdbeSetNumCols(v, 3); pParse->nMem = 3; - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", SQLITE_STATIC); for(i=0; i<db->nDb; i++){ if( db->aDb[i].pBt==0 ) continue; - assert( db->aDb[i].zName!=0 ); - sqlite3VdbeAddOp2(v, OP_Integer, i, 1); - sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, db->aDb[i].zName, 0); - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, - sqlite3BtreeGetFilename(db->aDb[i].pBt), 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); + assert( db->aDb[i].zDbSName!=0 ); + sqlite3VdbeMultiLoad(v, 1, "iss", + i, + db->aDb[i].zDbSName, + sqlite3BtreeGetFilename(db->aDb[i].pBt)); } } break; @@ -103603,18 +119114,53 @@ SQLITE_PRIVATE void sqlite3Pragma( case PragTyp_COLLATION_LIST: { int i = 0; HashElem *p; - sqlite3VdbeSetNumCols(v, 2); pParse->nMem = 2; - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ CollSeq *pColl = (CollSeq *)sqliteHashData(p); - sqlite3VdbeAddOp2(v, OP_Integer, i++, 1); - sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pColl->zName, 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); + sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName); } } break; + +#ifdef SQLITE_INTROSPECTION_PRAGMAS + case PragTyp_FUNCTION_LIST: { + int i; + HashElem *j; + FuncDef *p; + pParse->nMem = 2; + for(i=0; i<SQLITE_FUNC_HASH_SZ; i++){ + for(p=sqlite3BuiltinFunctions.a[i]; p; p=p->u.pHash ){ + sqlite3VdbeMultiLoad(v, 1, "si", p->zName, 1); + } + } + for(j=sqliteHashFirst(&db->aFunc); j; j=sqliteHashNext(j)){ + p = (FuncDef*)sqliteHashData(j); + sqlite3VdbeMultiLoad(v, 1, "si", p->zName, 0); + } + } + break; + +#ifndef SQLITE_OMIT_VIRTUALTABLE + case PragTyp_MODULE_LIST: { + HashElem *j; + pParse->nMem = 1; + for(j=sqliteHashFirst(&db->aModule); j; j=sqliteHashNext(j)){ + Module *pMod = (Module*)sqliteHashData(j); + sqlite3VdbeMultiLoad(v, 1, "s", pMod->zName); + } + } + break; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + case PragTyp_PRAGMA_LIST: { + int i; + for(i=0; i<ArraySize(aPragmaName); i++){ + sqlite3VdbeMultiLoad(v, 1, "s", aPragmaName[i].zName); + } + } + break; +#endif /* SQLITE_INTROSPECTION_PRAGMAS */ + #endif /* SQLITE_OMIT_SCHEMA_PRAGMAS */ #ifndef SQLITE_OMIT_FOREIGN_KEY @@ -103623,37 +119169,23 @@ SQLITE_PRIVATE void sqlite3Pragma( Table *pTab; pTab = sqlite3FindTable(db, zRight, zDb); if( pTab ){ - v = sqlite3GetVdbe(pParse); pFK = pTab->pFKey; if( pFK ){ int i = 0; - sqlite3VdbeSetNumCols(v, 8); pParse->nMem = 8; sqlite3CodeVerifySchema(pParse, iDb); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC); while(pFK){ int j; for(j=0; j<pFK->nCol; j++){ - char *zCol = pFK->aCol[j].zCol; - char *zOnDelete = (char *)actionName(pFK->aAction[0]); - char *zOnUpdate = (char *)actionName(pFK->aAction[1]); - sqlite3VdbeAddOp2(v, OP_Integer, i, 1); - sqlite3VdbeAddOp2(v, OP_Integer, j, 2); - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0); - sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, - pTab->aCol[pFK->aCol[j].iFrom].zName, 0); - sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0); - sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0); - sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0); - sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8); + sqlite3VdbeMultiLoad(v, 1, "iissssss", + i, + j, + pFK->zTo, + pTab->aCol[pFK->aCol[j].iFrom].zName, + pFK->aCol[j].zCol, + actionName(pFK->aAction[1]), /* ON UPDATE */ + actionName(pFK->aAction[0]), /* ON DELETE */ + "NONE"); } ++i; pFK = pFK->pNextFrom; @@ -103686,12 +119218,6 @@ SQLITE_PRIVATE void sqlite3Pragma( pParse->nMem += 4; regKey = ++pParse->nMem; regRow = ++pParse->nMem; - v = sqlite3GetVdbe(pParse); - sqlite3VdbeSetNumCols(v, 4); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "table", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "rowid", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "parent", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "fkid", SQLITE_STATIC); sqlite3CodeVerifySchema(pParse, iDb); k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); while( k ){ @@ -103706,8 +119232,7 @@ SQLITE_PRIVATE void sqlite3Pragma( sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); - sqlite3VdbeAddOp4(v, OP_String8, 0, regResult, 0, pTab->zName, - P4_TRANSIENT); + sqlite3VdbeLoadString(v, regResult, pTab->zName); for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); if( pParent==0 ) continue; @@ -103739,38 +119264,38 @@ SQLITE_PRIVATE void sqlite3Pragma( assert( x==0 ); } addrOk = sqlite3VdbeMakeLabel(v); - if( pParent && pIdx==0 ){ - int iKey = pFK->aCol[0].iFrom; - assert( iKey>=0 && iKey<pTab->nCol ); - if( iKey!=pTab->iPKey ){ - sqlite3VdbeAddOp3(v, OP_Column, 0, iKey, regRow); - sqlite3ColumnDefault(v, pTab, iKey, regRow); - sqlite3VdbeAddOp2(v, OP_IsNull, regRow, addrOk); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_MustBeInt, regRow, - sqlite3VdbeCurrentAddr(v)+3); VdbeCoverage(v); - }else{ - sqlite3VdbeAddOp2(v, OP_Rowid, 0, regRow); - } - sqlite3VdbeAddOp3(v, OP_NotExists, i, 0, regRow); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrOk); - sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); - }else{ - for(j=0; j<pFK->nCol; j++){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, - aiCols ? aiCols[j] : pFK->aCol[j].iFrom, regRow+j); - sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); - } - if( pParent ){ - sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, - sqlite3IndexAffinityStr(v,pIdx), pFK->nCol); - sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); - VdbeCoverage(v); - } + + /* Generate code to read the child key values into registers + ** regRow..regRow+n. If any of the child key values are NULL, this + ** row cannot cause an FK violation. Jump directly to addrOk in + ** this case. */ + for(j=0; j<pFK->nCol; j++){ + int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; + sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); + sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); } - sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1); - sqlite3VdbeAddOp4(v, OP_String8, 0, regResult+2, 0, - pFK->zTo, P4_TRANSIENT); - sqlite3VdbeAddOp2(v, OP_Integer, i-1, regResult+3); + + /* Generate code to query the parent index for a matching parent + ** key. If a match is found, jump to addrOk. */ + if( pIdx ){ + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, + sqlite3IndexAffinityStr(db,pIdx), pFK->nCol); + sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); + VdbeCoverage(v); + }else if( pParent ){ + int jmp = sqlite3VdbeCurrentAddr(v)+2; + sqlite3VdbeAddOp3(v, OP_SeekRowid, i, jmp, regRow); VdbeCoverage(v); + sqlite3VdbeGoto(v, addrOk); + assert( pFK->nCol==1 ); + } + + /* Generate code to report an FK violation to the caller. */ + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, regResult+1); + } + sqlite3VdbeMultiLoad(v, regResult+2, "siX", pFK->zTo, i-1); sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4); sqlite3VdbeResolveLabel(v, addrOk); sqlite3DbFree(db, aiCols); @@ -103787,7 +119312,7 @@ SQLITE_PRIVATE void sqlite3Pragma( case PragTyp_PARSER_TRACE: { if( zRight ){ if( sqlite3GetBoolean(zRight, 0) ){ - sqlite3ParserTrace(stderr, "parser: "); + sqlite3ParserTrace(stdout, "parser: "); }else{ sqlite3ParserTrace(0, 0); } @@ -103811,24 +119336,21 @@ SQLITE_PRIVATE void sqlite3Pragma( #endif #ifndef SQLITE_OMIT_INTEGRITY_CHECK - /* Pragma "quick_check" is reduced version of + /* PRAGMA integrity_check + ** PRAGMA integrity_check(N) + ** PRAGMA quick_check + ** PRAGMA quick_check(N) + ** + ** Verify the integrity of the database. + ** + ** The "quick_check" is reduced version of ** integrity_check designed to detect most database corruption - ** without most of the overhead of a full integrity-check. + ** without the overhead of cross-checking indexes. Quick_check + ** is linear time wherease integrity_check is O(NlogN). */ case PragTyp_INTEGRITY_CHECK: { int i, j, addr, mxErr; - /* Code that appears at the end of the integrity check. If no error - ** messages have been generated, output OK. Otherwise output the - ** error message - */ - static const int iLn = VDBE_OFFSET_LINENO(2); - static const VdbeOpList endCode[] = { - { OP_IfNeg, 1, 0, 0}, /* 0 */ - { OP_String8, 0, 3, 0}, /* 1 */ - { OP_ResultRow, 3, 1, 0}, - }; - int isQuick = (sqlite3Tolower(zLeft[0])=='q'); /* If the PRAGMA command was of the form "PRAGMA <db>.integrity_check", @@ -103846,8 +119368,6 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Initialize the VDBE program */ pParse->nMem = 6; - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC); /* Set the maximum error count */ mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; @@ -103857,63 +119377,66 @@ SQLITE_PRIVATE void sqlite3Pragma( mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; } } - sqlite3VdbeAddOp2(v, OP_Integer, mxErr, 1); /* reg[1] holds errors left */ + sqlite3VdbeAddOp2(v, OP_Integer, mxErr-1, 1); /* reg[1] holds errors left */ /* Do an integrity check on each database file */ for(i=0; i<db->nDb; i++){ - HashElem *x; - Hash *pTbls; - int cnt = 0; + HashElem *x; /* For looping over tables in the schema */ + Hash *pTbls; /* Set of all tables in the schema */ + int *aRoot; /* Array of root page numbers of all btrees */ + int cnt = 0; /* Number of entries in aRoot[] */ + int mxIdx = 0; /* Maximum number of indexes for any table */ if( OMIT_TEMPDB && i==1 ) continue; if( iDb>=0 && i!=iDb ) continue; sqlite3CodeVerifySchema(pParse, i); - addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Halt if out of errors */ - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); - sqlite3VdbeJumpHere(v, addr); /* Do an integrity check of the B-Tree ** - ** Begin by filling registers 2, 3, ... with the root pages numbers + ** Begin by finding the root pages numbers ** for all tables and indices in the database. */ assert( sqlite3SchemaMutexHeld(db, i, 0) ); pTbls = &db->aDb[i].pSchema->tblHash; - for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ + Table *pTab = sqliteHashData(x); /* Current table */ + Index *pIdx; /* An index on pTab */ + int nIdx; /* Number of indexes on pTab */ + if( HasRowid(pTab) ) cnt++; + for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ cnt++; } + if( nIdx>mxIdx ) mxIdx = nIdx; + } + aRoot = sqlite3DbMallocRawNN(db, sizeof(int)*(cnt+1)); + if( aRoot==0 ) break; + for(cnt=0, x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ Table *pTab = sqliteHashData(x); Index *pIdx; - if( HasRowid(pTab) ){ - sqlite3VdbeAddOp2(v, OP_Integer, pTab->tnum, 2+cnt); - VdbeComment((v, "%s", pTab->zName)); - cnt++; - } + if( HasRowid(pTab) ) aRoot[++cnt] = pTab->tnum; for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - sqlite3VdbeAddOp2(v, OP_Integer, pIdx->tnum, 2+cnt); - VdbeComment((v, "%s", pIdx->zName)); - cnt++; + aRoot[++cnt] = pIdx->tnum; } } + aRoot[0] = cnt; /* Make sure sufficient number of registers have been allocated */ - pParse->nMem = MAX( pParse->nMem, cnt+8 ); + pParse->nMem = MAX( pParse->nMem, 8+mxIdx ); + sqlite3ClearTempRegCache(pParse); /* Do the b-tree integrity checks */ - sqlite3VdbeAddOp3(v, OP_IntegrityCk, 2, cnt, 1); + sqlite3VdbeAddOp4(v, OP_IntegrityCk, 2, cnt, 1, (char*)aRoot,P4_INTARRAY); sqlite3VdbeChangeP5(v, (u8)i); addr = sqlite3VdbeAddOp1(v, OP_IsNull, 2); VdbeCoverage(v); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, - sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zName), + sqlite3MPrintf(db, "*** in database %s ***\n", db->aDb[i].zDbSName), P4_DYNAMIC); - sqlite3VdbeAddOp3(v, OP_Move, 2, 4, 1); - sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 2); - sqlite3VdbeAddOp2(v, OP_ResultRow, 2, 1); + sqlite3VdbeAddOp3(v, OP_Concat, 2, 3, 3); + integrityCheckResultRow(v); sqlite3VdbeJumpHere(v, addr); /* Make sure all the indices are constructed correctly. */ - for(x=sqliteHashFirst(pTbls); x && !isQuick; x=sqliteHashNext(x)){ + for(x=sqliteHashFirst(pTbls); x; x=sqliteHashNext(x)){ Table *pTab = sqliteHashData(x); Index *pIdx, *pPk; Index *pPrior = 0; @@ -103921,119 +119444,156 @@ SQLITE_PRIVATE void sqlite3Pragma( int iDataCur, iIdxCur; int r1 = -1; - if( pTab->pIndex==0 ) continue; + if( pTab->tnum<1 ) continue; /* Skip VIEWs or VIRTUAL TABLEs */ pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); - addr = sqlite3VdbeAddOp1(v, OP_IfPos, 1); /* Stop if out of errors */ - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); - sqlite3VdbeJumpHere(v, addr); sqlite3ExprCacheClear(pParse); - sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, 1, 0, &iDataCur, &iIdxCur); + /* reg[7] counts the number of entries in the table. + ** reg[8+i] counts the number of entries in the i-th index + */ sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ sqlite3VdbeAddOp2(v, OP_Integer, 0, 8+j); /* index entries counter */ } - pParse->nMem = MAX(pParse->nMem, 8+j); + assert( pParse->nMem>=8+j ); + assert( sqlite3NoTempsInRange(pParse,1,7+j) ); sqlite3VdbeAddOp2(v, OP_Rewind, iDataCur, 0); VdbeCoverage(v); loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); /* Verify that all NOT NULL columns really are NOT NULL */ for(j=0; j<pTab->nCol; j++){ char *zErr; - int jmp2, jmp3; + int jmp2; if( j==pTab->iPKey ) continue; if( pTab->aCol[j].notNull==0 ) continue; sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, pTab->aCol[j].zName); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); - sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); - jmp3 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); - sqlite3VdbeAddOp0(v, OP_Halt); + integrityCheckResultRow(v); sqlite3VdbeJumpHere(v, jmp2); - sqlite3VdbeJumpHere(v, jmp3); } - /* Validate index entries for the current row */ - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ - int jmp2, jmp3, jmp4, jmp5; - int ckUniq = sqlite3VdbeMakeLabel(v); - if( pPk==pIdx ) continue; - r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, - pPrior, r1); - pPrior = pIdx; - sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1); /* increment entry count */ - /* Verify that an index entry exists for the current table row */ - jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1, - pIdx->nColumn); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, "row ", P4_STATIC); - sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); - sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, - " missing from index ", P4_STATIC); - sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); - jmp5 = sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, - pIdx->zName, P4_TRANSIENT); - sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); - sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); - jmp4 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); - sqlite3VdbeAddOp0(v, OP_Halt); - sqlite3VdbeJumpHere(v, jmp2); - /* For UNIQUE indexes, verify that only one entry exists with the - ** current key. The entry is unique if (1) any column is NULL - ** or (2) the next entry has a different key */ - if( IsUniqueIndex(pIdx) ){ - int uniqOk = sqlite3VdbeMakeLabel(v); - int jmp6; - int kk; - for(kk=0; kk<pIdx->nKeyCol; kk++){ - int iCol = pIdx->aiColumn[kk]; - assert( iCol>=0 && iCol<pTab->nCol ); - if( pTab->aCol[iCol].notNull ) continue; - sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); - VdbeCoverage(v); + /* Verify CHECK constraints */ + if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ + ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0); + if( db->mallocFailed==0 ){ + int addrCkFault = sqlite3VdbeMakeLabel(v); + int addrCkOk = sqlite3VdbeMakeLabel(v); + char *zErr; + int k; + pParse->iSelfTab = iDataCur + 1; + sqlite3ExprCachePush(pParse); + for(k=pCheck->nExpr-1; k>0; k--){ + sqlite3ExprIfFalse(pParse, pCheck->a[k].pExpr, addrCkFault, 0); } - jmp6 = sqlite3VdbeAddOp1(v, OP_Next, iIdxCur+j); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, uniqOk); - sqlite3VdbeJumpHere(v, jmp6); - sqlite3VdbeAddOp4Int(v, OP_IdxGT, iIdxCur+j, uniqOk, r1, - pIdx->nKeyCol); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, - "non-unique entry in index ", P4_STATIC); - sqlite3VdbeAddOp2(v, OP_Goto, 0, jmp5); - sqlite3VdbeResolveLabel(v, uniqOk); + sqlite3ExprIfTrue(pParse, pCheck->a[0].pExpr, addrCkOk, + SQLITE_JUMPIFNULL); + sqlite3VdbeResolveLabel(v, addrCkFault); + pParse->iSelfTab = 0; + zErr = sqlite3MPrintf(db, "CHECK constraint failed in %s", + pTab->zName); + sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); + integrityCheckResultRow(v); + sqlite3VdbeResolveLabel(v, addrCkOk); + sqlite3ExprCachePop(pParse); + } + sqlite3ExprListDelete(db, pCheck); + } + if( !isQuick ){ /* Omit the remaining tests for quick_check */ + /* Sanity check on record header decoding */ + sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3); + sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); + /* Validate index entries for the current row */ + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + int jmp2, jmp3, jmp4, jmp5; + int ckUniq = sqlite3VdbeMakeLabel(v); + if( pPk==pIdx ) continue; + r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, + pPrior, r1); + pPrior = pIdx; + sqlite3VdbeAddOp2(v, OP_AddImm, 8+j, 1);/* increment entry count */ + /* Verify that an index entry exists for the current table row */ + jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1, + pIdx->nColumn); VdbeCoverage(v); + sqlite3VdbeLoadString(v, 3, "row "); + sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); + sqlite3VdbeLoadString(v, 4, " missing from index "); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + jmp5 = sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); + jmp4 = integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, jmp2); + /* For UNIQUE indexes, verify that only one entry exists with the + ** current key. The entry is unique if (1) any column is NULL + ** or (2) the next entry has a different key */ + if( IsUniqueIndex(pIdx) ){ + int uniqOk = sqlite3VdbeMakeLabel(v); + int jmp6; + int kk; + for(kk=0; kk<pIdx->nKeyCol; kk++){ + int iCol = pIdx->aiColumn[kk]; + assert( iCol!=XN_ROWID && iCol<pTab->nCol ); + if( iCol>=0 && pTab->aCol[iCol].notNull ) continue; + sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); + VdbeCoverage(v); + } + jmp6 = sqlite3VdbeAddOp1(v, OP_Next, iIdxCur+j); VdbeCoverage(v); + sqlite3VdbeGoto(v, uniqOk); + sqlite3VdbeJumpHere(v, jmp6); + sqlite3VdbeAddOp4Int(v, OP_IdxGT, iIdxCur+j, uniqOk, r1, + pIdx->nKeyCol); VdbeCoverage(v); + sqlite3VdbeLoadString(v, 3, "non-unique entry in index "); + sqlite3VdbeGoto(v, jmp5); + sqlite3VdbeResolveLabel(v, uniqOk); + } + sqlite3VdbeJumpHere(v, jmp4); + sqlite3ResolvePartIdxLabel(pParse, jmp3); } - sqlite3VdbeJumpHere(v, jmp4); - sqlite3ResolvePartIdxLabel(pParse, jmp3); } sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); sqlite3VdbeJumpHere(v, loopTop-1); #ifndef SQLITE_OMIT_BTREECOUNT - sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, - "wrong # of entries in index ", P4_STATIC); - for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ - if( pPk==pIdx ) continue; - addr = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IfPos, 1, addr+2); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); - sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); - sqlite3VdbeAddOp3(v, OP_Eq, 8+j, addr+8, 3); VdbeCoverage(v); - sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); - sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); - sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pIdx->zName, P4_TRANSIENT); - sqlite3VdbeAddOp3(v, OP_Concat, 3, 2, 7); - sqlite3VdbeAddOp2(v, OP_ResultRow, 7, 1); + if( !isQuick ){ + sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); + for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ + if( pPk==pIdx ) continue; + sqlite3VdbeAddOp2(v, OP_Count, iIdxCur+j, 3); + addr = sqlite3VdbeAddOp3(v, OP_Eq, 8+j, 0, 3); VdbeCoverage(v); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + sqlite3VdbeLoadString(v, 4, pIdx->zName); + sqlite3VdbeAddOp3(v, OP_Concat, 4, 2, 3); + integrityCheckResultRow(v); + sqlite3VdbeJumpHere(v, addr); + } } #endif /* SQLITE_OMIT_BTREECOUNT */ } } - addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); - sqlite3VdbeChangeP3(v, addr, -mxErr); - sqlite3VdbeJumpHere(v, addr); - sqlite3VdbeChangeP4(v, addr+1, "ok", P4_STATIC); + { + static const int iLn = VDBE_OFFSET_LINENO(2); + static const VdbeOpList endCode[] = { + { OP_AddImm, 1, 0, 0}, /* 0 */ + { OP_IfNotZero, 1, 4, 0}, /* 1 */ + { OP_String8, 0, 3, 0}, /* 2 */ + { OP_ResultRow, 3, 1, 0}, /* 3 */ + { OP_Halt, 0, 0, 0}, /* 4 */ + { OP_String8, 0, 3, 0}, /* 5 */ + { OP_Goto, 0, 3, 0}, /* 6 */ + }; + VdbeOp *aOp; + + aOp = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); + if( aOp ){ + aOp[0].p2 = 1-mxErr; + aOp[2].p4type = P4_STATIC; + aOp[2].p4.z = "ok"; + aOp[5].p4type = P4_STATIC; + aOp[5].p4.z = (char*)sqlite3ErrStr(SQLITE_CORRUPT); + } + sqlite3VdbeChangeP3(v, 0, sqlite3VdbeCurrentAddr(v)-2); + } } break; #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ @@ -104079,14 +119639,10 @@ SQLITE_PRIVATE void sqlite3Pragma( const struct EncName *pEnc; if( !zRight ){ /* "PRAGMA encoding" */ if( sqlite3ReadSchema(pParse) ) goto pragma_out; - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", SQLITE_STATIC); - sqlite3VdbeAddOp2(v, OP_String8, 0, 1); assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 ); assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE ); assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE ); - sqlite3VdbeChangeP4(v, -1, encnames[ENC(pParse->db)].zName, P4_STATIC); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); + returnSingleText(v, encnames[ENC(pParse->db)].zName); }else{ /* "PRAGMA encoding = XXX" */ /* Only change the value of sqlite.enc if the database handle is not ** initialized. If the main database exists, the new sqlite.enc value @@ -104115,16 +119671,18 @@ SQLITE_PRIVATE void sqlite3Pragma( #ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS /* - ** PRAGMA [database.]schema_version - ** PRAGMA [database.]schema_version = <integer> + ** PRAGMA [schema.]schema_version + ** PRAGMA [schema.]schema_version = <integer> ** - ** PRAGMA [database.]user_version - ** PRAGMA [database.]user_version = <integer> + ** PRAGMA [schema.]user_version + ** PRAGMA [schema.]user_version = <integer> ** - ** PRAGMA [database.]freelist_count = <integer> + ** PRAGMA [schema.]freelist_count ** - ** PRAGMA [database.]application_id - ** PRAGMA [database.]application_id = <integer> + ** PRAGMA [schema.]data_version + ** + ** PRAGMA [schema.]application_id + ** PRAGMA [schema.]application_id = <integer> ** ** The pragma's schema_version and user_version are used to set or get ** the value of the schema-version and user-version, respectively. Both @@ -104145,20 +119703,22 @@ SQLITE_PRIVATE void sqlite3Pragma( ** applications for any purpose. */ case PragTyp_HEADER_VALUE: { - int iCookie = aPragmaNames[mid].iArg; /* Which cookie to read or write */ + int iCookie = pPragma->iArg; /* Which cookie to read or write */ sqlite3VdbeUsesBtree(v, iDb); - if( zRight && (aPragmaNames[mid].mPragFlag & PragFlag_ReadOnly)==0 ){ + if( zRight && (pPragma->mPragFlg & PragFlg_ReadOnly)==0 ){ /* Write the specified cookie value */ static const VdbeOpList setCookie[] = { { OP_Transaction, 0, 1, 0}, /* 0 */ - { OP_Integer, 0, 1, 0}, /* 1 */ - { OP_SetCookie, 0, 0, 1}, /* 2 */ + { OP_SetCookie, 0, 0, 0}, /* 1 */ }; - int addr = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie, 0); - sqlite3VdbeChangeP1(v, addr, iDb); - sqlite3VdbeChangeP1(v, addr+1, sqlite3Atoi(zRight)); - sqlite3VdbeChangeP1(v, addr+2, iDb); - sqlite3VdbeChangeP2(v, addr+2, iCookie); + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(setCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(setCookie), setCookie, 0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p2 = iCookie; + aOp[1].p3 = sqlite3Atoi(zRight); }else{ /* Read the specified cookie value */ static const VdbeOpList readCookie[] = { @@ -104166,12 +119726,14 @@ SQLITE_PRIVATE void sqlite3Pragma( { OP_ReadCookie, 0, 1, 0}, /* 1 */ { OP_ResultRow, 1, 1, 0} }; - int addr = sqlite3VdbeAddOpList(v, ArraySize(readCookie), readCookie, 0); - sqlite3VdbeChangeP1(v, addr, iDb); - sqlite3VdbeChangeP1(v, addr+1, iDb); - sqlite3VdbeChangeP3(v, addr+1, iCookie); - sqlite3VdbeSetNumCols(v, 1); - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLeft, SQLITE_TRANSIENT); + VdbeOp *aOp; + sqlite3VdbeVerifyNoMallocRequired(v, ArraySize(readCookie)); + aOp = sqlite3VdbeAddOpList(v, ArraySize(readCookie),readCookie,0); + if( ONLY_IF_REALLOC_STRESS(aOp==0) ) break; + aOp[0].p1 = iDb; + aOp[1].p1 = iDb; + aOp[1].p3 = iCookie; + sqlite3VdbeReusable(v); } } break; @@ -104187,20 +119749,19 @@ SQLITE_PRIVATE void sqlite3Pragma( case PragTyp_COMPILE_OPTIONS: { int i = 0; const char *zOpt; - sqlite3VdbeSetNumCols(v, 1); pParse->nMem = 1; - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "compile_option", SQLITE_STATIC); while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ - sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zOpt, 0); + sqlite3VdbeLoadString(v, 1, zOpt); sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); } + sqlite3VdbeReusable(v); } break; #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ #ifndef SQLITE_OMIT_WAL /* - ** PRAGMA [database.]wal_checkpoint = passive|full|restart|truncate + ** PRAGMA [schema.]wal_checkpoint = passive|full|restart|truncate ** ** Checkpoint the database. */ @@ -104216,12 +119777,7 @@ SQLITE_PRIVATE void sqlite3Pragma( eMode = SQLITE_CHECKPOINT_TRUNCATE; } } - sqlite3VdbeSetNumCols(v, 3); pParse->nMem = 3; - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "busy", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "log", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "checkpointed", SQLITE_STATIC); - sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); } @@ -104239,7 +119795,7 @@ SQLITE_PRIVATE void sqlite3Pragma( if( zRight ){ sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); } - returnSingleInt(pParse, "wal_autocheckpoint", + returnSingleInt(v, db->xWalCallback==sqlite3WalDefaultHook ? SQLITE_PTR_TO_INT(db->pWalArg) : 0); } @@ -104249,14 +119805,128 @@ SQLITE_PRIVATE void sqlite3Pragma( /* ** PRAGMA shrink_memory ** - ** This pragma attempts to free as much memory as possible from the - ** current database connection. + ** IMPLEMENTATION-OF: R-23445-46109 This pragma causes the database + ** connection on which it is invoked to free up as much memory as it + ** can, by calling sqlite3_db_release_memory(). */ case PragTyp_SHRINK_MEMORY: { sqlite3_db_release_memory(db); break; } + /* + ** PRAGMA optimize + ** PRAGMA optimize(MASK) + ** PRAGMA schema.optimize + ** PRAGMA schema.optimize(MASK) + ** + ** Attempt to optimize the database. All schemas are optimized in the first + ** two forms, and only the specified schema is optimized in the latter two. + ** + ** The details of optimizations performed by this pragma are expected + ** to change and improve over time. Applications should anticipate that + ** this pragma will perform new optimizations in future releases. + ** + ** The optional argument is a bitmask of optimizations to perform: + ** + ** 0x0001 Debugging mode. Do not actually perform any optimizations + ** but instead return one line of text for each optimization + ** that would have been done. Off by default. + ** + ** 0x0002 Run ANALYZE on tables that might benefit. On by default. + ** See below for additional information. + ** + ** 0x0004 (Not yet implemented) Record usage and performance + ** information from the current session in the + ** database file so that it will be available to "optimize" + ** pragmas run by future database connections. + ** + ** 0x0008 (Not yet implemented) Create indexes that might have + ** been helpful to recent queries + ** + ** The default MASK is and always shall be 0xfffe. 0xfffe means perform all + ** of the optimizations listed above except Debug Mode, including new + ** optimizations that have not yet been invented. If new optimizations are + ** ever added that should be off by default, those off-by-default + ** optimizations will have bitmasks of 0x10000 or larger. + ** + ** DETERMINATION OF WHEN TO RUN ANALYZE + ** + ** In the current implementation, a table is analyzed if only if all of + ** the following are true: + ** + ** (1) MASK bit 0x02 is set. + ** + ** (2) The query planner used sqlite_stat1-style statistics for one or + ** more indexes of the table at some point during the lifetime of + ** the current connection. + ** + ** (3) One or more indexes of the table are currently unanalyzed OR + ** the number of rows in the table has increased by 25 times or more + ** since the last time ANALYZE was run. + ** + ** The rules for when tables are analyzed are likely to change in + ** future releases. + */ + case PragTyp_OPTIMIZE: { + int iDbLast; /* Loop termination point for the schema loop */ + int iTabCur; /* Cursor for a table whose size needs checking */ + HashElem *k; /* Loop over tables of a schema */ + Schema *pSchema; /* The current schema */ + Table *pTab; /* A table in the schema */ + Index *pIdx; /* An index of the table */ + LogEst szThreshold; /* Size threshold above which reanalysis is needd */ + char *zSubSql; /* SQL statement for the OP_SqlExec opcode */ + u32 opMask; /* Mask of operations to perform */ + + if( zRight ){ + opMask = (u32)sqlite3Atoi(zRight); + if( (opMask & 0x02)==0 ) break; + }else{ + opMask = 0xfffe; + } + iTabCur = pParse->nTab++; + for(iDbLast = zDb?iDb:db->nDb-1; iDb<=iDbLast; iDb++){ + if( iDb==1 ) continue; + sqlite3CodeVerifySchema(pParse, iDb); + pSchema = db->aDb[iDb].pSchema; + for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){ + pTab = (Table*)sqliteHashData(k); + + /* If table pTab has not been used in a way that would benefit from + ** having analysis statistics during the current session, then skip it. + ** This also has the effect of skipping virtual tables and views */ + if( (pTab->tabFlags & TF_StatsUsed)==0 ) continue; + + /* Reanalyze if the table is 25 times larger than the last analysis */ + szThreshold = pTab->nRowLogEst + 46; assert( sqlite3LogEst(25)==46 ); + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( !pIdx->hasStat1 ){ + szThreshold = 0; /* Always analyze if any index lacks statistics */ + break; + } + } + if( szThreshold ){ + sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead); + sqlite3VdbeAddOp3(v, OP_IfSmaller, iTabCur, + sqlite3VdbeCurrentAddr(v)+2+(opMask&1), szThreshold); + VdbeCoverage(v); + } + zSubSql = sqlite3MPrintf(db, "ANALYZE \"%w\".\"%w\"", + db->aDb[iDb].zDbSName, pTab->zName); + if( opMask & 0x01 ){ + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp4(v, OP_String8, 0, r1, 0, zSubSql, P4_DYNAMIC); + sqlite3VdbeAddOp2(v, OP_ResultRow, r1, 1); + }else{ + sqlite3VdbeAddOp4(v, OP_SqlExec, 0, 0, 0, zSubSql, P4_DYNAMIC); + } + } + } + sqlite3VdbeAddOp0(v, OP_Expire); + break; + } + /* ** PRAGMA busy_timeout ** PRAGMA busy_timeout = N @@ -104267,11 +119937,11 @@ SQLITE_PRIVATE void sqlite3Pragma( ** disables the timeout. */ /*case PragTyp_BUSY_TIMEOUT*/ default: { - assert( aPragmaNames[mid].ePragTyp==PragTyp_BUSY_TIMEOUT ); + assert( pPragma->ePragTyp==PragTyp_BUSY_TIMEOUT ); if( zRight ){ sqlite3_busy_timeout(db, sqlite3Atoi(zRight)); } - returnSingleInt(pParse, "timeout", db->busyTimeout); + returnSingleInt(v, db->busyTimeout); break; } @@ -104279,15 +119949,19 @@ SQLITE_PRIVATE void sqlite3Pragma( ** PRAGMA soft_heap_limit ** PRAGMA soft_heap_limit = N ** - ** Call sqlite3_soft_heap_limit64(N). Return the result. If N is omitted, - ** use -1. + ** IMPLEMENTATION-OF: R-26343-45930 This pragma invokes the + ** sqlite3_soft_heap_limit64() interface with the argument N, if N is + ** specified and is a non-negative integer. + ** IMPLEMENTATION-OF: R-64451-07163 The soft_heap_limit pragma always + ** returns the same integer that would be returned by the + ** sqlite3_soft_heap_limit64(-1) C-language function. */ case PragTyp_SOFT_HEAP_LIMIT: { sqlite3_int64 N; if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ sqlite3_soft_heap_limit64(N); } - returnSingleInt(pParse, "soft_heap_limit", sqlite3_soft_heap_limit64(-1)); + returnSingleInt(v, sqlite3_soft_heap_limit64(-1)); break; } @@ -104306,8 +119980,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ){ sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); } - returnSingleInt(pParse, "threads", - sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); + returnSingleInt(v, sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); break; } @@ -104320,25 +119993,20 @@ SQLITE_PRIVATE void sqlite3Pragma( "unlocked", "shared", "reserved", "pending", "exclusive" }; int i; - sqlite3VdbeSetNumCols(v, 2); pParse->nMem = 2; - sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", SQLITE_STATIC); - sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", SQLITE_STATIC); for(i=0; i<db->nDb; i++){ Btree *pBt; const char *zState = "unknown"; int j; - if( db->aDb[i].zName==0 ) continue; - sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, db->aDb[i].zName, P4_STATIC); + if( db->aDb[i].zDbSName==0 ) continue; pBt = db->aDb[i].pBt; if( pBt==0 || sqlite3BtreePager(pBt)==0 ){ zState = "closed"; - }else if( sqlite3_file_control(db, i ? db->aDb[i].zName : 0, + }else if( sqlite3_file_control(db, i ? db->aDb[i].zDbSName : 0, SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ zState = azLockName[j]; } - sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, zState, P4_STATIC); - sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); + sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zDbSName, zState); } break; } @@ -104389,10 +120057,329 @@ SQLITE_PRIVATE void sqlite3Pragma( } /* End of the PRAGMA switch */ + /* The following block is a no-op unless SQLITE_DEBUG is defined. Its only + ** purpose is to execute assert() statements to verify that if the + ** PragFlg_NoColumns1 flag is set and the caller specified an argument + ** to the PRAGMA, the implementation has not added any OP_ResultRow + ** instructions to the VM. */ + if( (pPragma->mPragFlg & PragFlg_NoColumns1) && zRight ){ + sqlite3VdbeVerifyNoResultRow(v); + } + pragma_out: sqlite3DbFree(db, zLeft); sqlite3DbFree(db, zRight); } +#ifndef SQLITE_OMIT_VIRTUALTABLE +/***************************************************************************** +** Implementation of an eponymous virtual table that runs a pragma. +** +*/ +typedef struct PragmaVtab PragmaVtab; +typedef struct PragmaVtabCursor PragmaVtabCursor; +struct PragmaVtab { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* The database connection to which it belongs */ + const PragmaName *pName; /* Name of the pragma */ + u8 nHidden; /* Number of hidden columns */ + u8 iHidden; /* Index of the first hidden column */ +}; +struct PragmaVtabCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + sqlite3_stmt *pPragma; /* The pragma statement to run */ + sqlite_int64 iRowid; /* Current rowid */ + char *azArg[2]; /* Value of the argument and schema */ +}; + +/* +** Pragma virtual table module xConnect method. +*/ +static int pragmaVtabConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + const PragmaName *pPragma = (const PragmaName*)pAux; + PragmaVtab *pTab = 0; + int rc; + int i, j; + char cSep = '('; + StrAccum acc; + char zBuf[200]; + + UNUSED_PARAMETER(argc); + UNUSED_PARAMETER(argv); + sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); + sqlite3_str_appendall(&acc, "CREATE TABLE x"); + for(i=0, j=pPragma->iPragCName; i<pPragma->nPragCName; i++, j++){ + sqlite3_str_appendf(&acc, "%c\"%s\"", cSep, pragCName[j]); + cSep = ','; + } + if( i==0 ){ + sqlite3_str_appendf(&acc, "(\"%s\"", pPragma->zName); + cSep = ','; + i++; + } + j = 0; + if( pPragma->mPragFlg & PragFlg_Result1 ){ + sqlite3_str_appendall(&acc, ",arg HIDDEN"); + j++; + } + if( pPragma->mPragFlg & (PragFlg_SchemaOpt|PragFlg_SchemaReq) ){ + sqlite3_str_appendall(&acc, ",schema HIDDEN"); + j++; + } + sqlite3_str_append(&acc, ")", 1); + sqlite3StrAccumFinish(&acc); + assert( strlen(zBuf) < sizeof(zBuf)-1 ); + rc = sqlite3_declare_vtab(db, zBuf); + if( rc==SQLITE_OK ){ + pTab = (PragmaVtab*)sqlite3_malloc(sizeof(PragmaVtab)); + if( pTab==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pTab, 0, sizeof(PragmaVtab)); + pTab->pName = pPragma; + pTab->db = db; + pTab->iHidden = i; + pTab->nHidden = j; + } + }else{ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } + + *ppVtab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** Pragma virtual table module xDisconnect method. +*/ +static int pragmaVtabDisconnect(sqlite3_vtab *pVtab){ + PragmaVtab *pTab = (PragmaVtab*)pVtab; + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* Figure out the best index to use to search a pragma virtual table. +** +** There are not really any index choices. But we want to encourage the +** query planner to give == constraints on as many hidden parameters as +** possible, and especially on the first hidden parameter. So return a +** high cost if hidden parameters are unconstrained. +*/ +static int pragmaVtabBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + PragmaVtab *pTab = (PragmaVtab*)tab; + const struct sqlite3_index_constraint *pConstraint; + int i, j; + int seen[2]; + + pIdxInfo->estimatedCost = (double)1; + if( pTab->nHidden==0 ){ return SQLITE_OK; } + pConstraint = pIdxInfo->aConstraint; + seen[0] = 0; + seen[1] = 0; + for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ + if( pConstraint->usable==0 ) continue; + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pConstraint->iColumn < pTab->iHidden ) continue; + j = pConstraint->iColumn - pTab->iHidden; + assert( j < 2 ); + seen[j] = i+1; + } + if( seen[0]==0 ){ + pIdxInfo->estimatedCost = (double)2147483647; + pIdxInfo->estimatedRows = 2147483647; + return SQLITE_OK; + } + j = seen[0]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 1; + pIdxInfo->aConstraintUsage[j].omit = 1; + if( seen[1]==0 ) return SQLITE_OK; + pIdxInfo->estimatedCost = (double)20; + pIdxInfo->estimatedRows = 20; + j = seen[1]-1; + pIdxInfo->aConstraintUsage[j].argvIndex = 2; + pIdxInfo->aConstraintUsage[j].omit = 1; + return SQLITE_OK; +} + +/* Create a new cursor for the pragma virtual table */ +static int pragmaVtabOpen(sqlite3_vtab *pVtab, sqlite3_vtab_cursor **ppCursor){ + PragmaVtabCursor *pCsr; + pCsr = (PragmaVtabCursor*)sqlite3_malloc(sizeof(*pCsr)); + if( pCsr==0 ) return SQLITE_NOMEM; + memset(pCsr, 0, sizeof(PragmaVtabCursor)); + pCsr->base.pVtab = pVtab; + *ppCursor = &pCsr->base; + return SQLITE_OK; +} + +/* Clear all content from pragma virtual table cursor. */ +static void pragmaVtabCursorClear(PragmaVtabCursor *pCsr){ + int i; + sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + for(i=0; i<ArraySize(pCsr->azArg); i++){ + sqlite3_free(pCsr->azArg[i]); + pCsr->azArg[i] = 0; + } +} + +/* Close a pragma virtual table cursor */ +static int pragmaVtabClose(sqlite3_vtab_cursor *cur){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)cur; + pragmaVtabCursorClear(pCsr); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* Advance the pragma virtual table cursor to the next row */ +static int pragmaVtabNext(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + int rc = SQLITE_OK; + + /* Increment the xRowid value */ + pCsr->iRowid++; + assert( pCsr->pPragma ); + if( SQLITE_ROW!=sqlite3_step(pCsr->pPragma) ){ + rc = sqlite3_finalize(pCsr->pPragma); + pCsr->pPragma = 0; + pragmaVtabCursorClear(pCsr); + } + return rc; +} + +/* +** Pragma virtual table module xFilter method. +*/ +static int pragmaVtabFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + int rc; + int i, j; + StrAccum acc; + char *zSql; + + UNUSED_PARAMETER(idxNum); + UNUSED_PARAMETER(idxStr); + pragmaVtabCursorClear(pCsr); + j = (pTab->pName->mPragFlg & PragFlg_Result1)!=0 ? 0 : 1; + for(i=0; i<argc; i++, j++){ + const char *zText = (const char*)sqlite3_value_text(argv[i]); + assert( j<ArraySize(pCsr->azArg) ); + assert( pCsr->azArg[j]==0 ); + if( zText ){ + pCsr->azArg[j] = sqlite3_mprintf("%s", zText); + if( pCsr->azArg[j]==0 ){ + return SQLITE_NOMEM; + } + } + } + sqlite3StrAccumInit(&acc, 0, 0, 0, pTab->db->aLimit[SQLITE_LIMIT_SQL_LENGTH]); + sqlite3_str_appendall(&acc, "PRAGMA "); + if( pCsr->azArg[1] ){ + sqlite3_str_appendf(&acc, "%Q.", pCsr->azArg[1]); + } + sqlite3_str_appendall(&acc, pTab->pName->zName); + if( pCsr->azArg[0] ){ + sqlite3_str_appendf(&acc, "=%Q", pCsr->azArg[0]); + } + zSql = sqlite3StrAccumFinish(&acc); + if( zSql==0 ) return SQLITE_NOMEM; + rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pPragma, 0); + sqlite3_free(zSql); + if( rc!=SQLITE_OK ){ + pTab->base.zErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pTab->db)); + return rc; + } + return pragmaVtabNext(pVtabCursor); +} + +/* +** Pragma virtual table module xEof method. +*/ +static int pragmaVtabEof(sqlite3_vtab_cursor *pVtabCursor){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + return (pCsr->pPragma==0); +} + +/* The xColumn method simply returns the corresponding column from +** the PRAGMA. +*/ +static int pragmaVtabColumn( + sqlite3_vtab_cursor *pVtabCursor, + sqlite3_context *ctx, + int i +){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + PragmaVtab *pTab = (PragmaVtab*)(pVtabCursor->pVtab); + if( i<pTab->iHidden ){ + sqlite3_result_value(ctx, sqlite3_column_value(pCsr->pPragma, i)); + }else{ + sqlite3_result_text(ctx, pCsr->azArg[i-pTab->iHidden],-1,SQLITE_TRANSIENT); + } + return SQLITE_OK; +} + +/* +** Pragma virtual table module xRowid method. +*/ +static int pragmaVtabRowid(sqlite3_vtab_cursor *pVtabCursor, sqlite_int64 *p){ + PragmaVtabCursor *pCsr = (PragmaVtabCursor*)pVtabCursor; + *p = pCsr->iRowid; + return SQLITE_OK; +} + +/* The pragma virtual table object */ +static const sqlite3_module pragmaVtabModule = { + 0, /* iVersion */ + 0, /* xCreate - create a table */ + pragmaVtabConnect, /* xConnect - connect to an existing table */ + pragmaVtabBestIndex, /* xBestIndex - Determine search strategy */ + pragmaVtabDisconnect, /* xDisconnect - Disconnect from a table */ + 0, /* xDestroy - Drop a table */ + pragmaVtabOpen, /* xOpen - open a cursor */ + pragmaVtabClose, /* xClose - close a cursor */ + pragmaVtabFilter, /* xFilter - configure scan constraints */ + pragmaVtabNext, /* xNext - advance a cursor */ + pragmaVtabEof, /* xEof */ + pragmaVtabColumn, /* xColumn - read data */ + pragmaVtabRowid, /* xRowid - read data */ + 0, /* xUpdate - write data */ + 0, /* xBegin - begin transaction */ + 0, /* xSync - sync transaction */ + 0, /* xCommit - commit transaction */ + 0, /* xRollback - rollback transaction */ + 0, /* xFindFunction - function overloading */ + 0, /* xRename - rename the table */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ +}; + +/* +** Check to see if zTabName is really the name of a pragma. If it is, +** then register an eponymous virtual table for that pragma and return +** a pointer to the Module object for the new virtual table. +*/ +SQLITE_PRIVATE Module *sqlite3PragmaVtabRegister(sqlite3 *db, const char *zName){ + const PragmaName *pName; + assert( sqlite3_strnicmp(zName, "pragma_", 7)==0 ); + pName = pragmaLocate(zName+7); + if( pName==0 ) return 0; + if( (pName->mPragFlg & (PragFlg_Result0|PragFlg_Result1))==0 ) return 0; + assert( sqlite3HashFind(&db->aModule, zName)==0 ); + return sqlite3VtabCreateModule(db, zName, &pragmaVtabModule, (void*)pName, 0); +} + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ #endif /* SQLITE_OMIT_PRAGMA */ @@ -104413,6 +120400,7 @@ pragma_out: ** interface, and routines that contribute to loading the database schema ** from disk. */ +/* #include "sqliteInt.h" */ /* ** Fill the InitData structure with an error message that indicates @@ -104424,16 +120412,15 @@ static void corruptSchema( const char *zExtra /* Error information */ ){ sqlite3 *db = pData->db; - if( !db->mallocFailed && (db->flags & SQLITE_RecoveryMode)==0 ){ + if( !db->mallocFailed && (db->flags & SQLITE_WriteSchema)==0 ){ + char *z; if( zObj==0 ) zObj = "?"; - sqlite3SetString(pData->pzErrMsg, db, - "malformed database schema (%s)", zObj); - if( zExtra ){ - *pData->pzErrMsg = sqlite3MAppendf(db, *pData->pzErrMsg, - "%s - %s", *pData->pzErrMsg, zExtra); - } + z = sqlite3MPrintf(db, "malformed database schema (%s)", zObj); + if( zExtra && zExtra[0] ) z = sqlite3MPrintf(db, "%z - %s", z, zExtra); + sqlite3DbFree(db, *pData->pzErrMsg); + *pData->pzErrMsg = z; } - pData->rc = db->mallocFailed ? SQLITE_NOMEM : SQLITE_CORRUPT_BKPT; + pData->rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_CORRUPT_BKPT; } /* @@ -104466,13 +120453,14 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ if( argv[1]==0 ){ corruptSchema(pData, argv[0], 0); - }else if( argv[2] && argv[2][0] ){ + }else if( sqlite3_strnicmp(argv[2],"create ",7)==0 ){ /* Call the parser to process a CREATE TABLE, INDEX or VIEW. ** But because db->init.busy is set to 1, no VDBE code is generated ** or executed. All the parser does is build the internal data ** structures that describe the table, index, or view. */ int rc; + u8 saved_iDb = db->init.iDb; sqlite3_stmt *pStmt; TESTONLY(int rcp); /* Return code from sqlite3_prepare() */ @@ -104483,22 +120471,23 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char TESTONLY(rcp = ) sqlite3_prepare(db, argv[2], -1, &pStmt, 0); rc = db->errCode; assert( (rc&0xFF)==(rcp&0xFF) ); - db->init.iDb = 0; + db->init.iDb = saved_iDb; + assert( saved_iDb==0 || (db->mDbFlags & DBFLAG_Vacuum)!=0 ); if( SQLITE_OK!=rc ){ if( db->init.orphanTrigger ){ assert( iDb==1 ); }else{ pData->rc = rc; if( rc==SQLITE_NOMEM ){ - db->mallocFailed = 1; + sqlite3OomFault(db); }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ corruptSchema(pData, argv[0], sqlite3_errmsg(db)); } } } sqlite3_finalize(pStmt); - }else if( argv[0]==0 ){ - corruptSchema(pData, 0, 0); + }else if( argv[0]==0 || (argv[2]!=0 && argv[2][0]!=0) ){ + corruptSchema(pData, argv[0], 0); }else{ /* If the SQL column is blank it means this is an index that ** was created to be the PRIMARY KEY or to fulfill a UNIQUE @@ -104507,7 +120496,7 @@ SQLITE_PRIVATE int sqlite3InitCallback(void *pInit, int argc, char **argv, char ** to do here is record the root page number for that index. */ Index *pIndex; - pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zName); + pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); if( pIndex==0 ){ /* This can occur if there exists an index on a TEMP table which ** has the same name as another index on a permanent index. Since @@ -104536,61 +120525,30 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ #ifndef SQLITE_OMIT_DEPRECATED int size; #endif - Table *pTab; Db *pDb; char const *azArg[4]; int meta[5]; InitData initData; - char const *zMasterSchema; - char const *zMasterName; + const char *zMasterName; int openedTransaction = 0; - /* - ** The master database table has a structure like this - */ - static const char master_schema[] = - "CREATE TABLE sqlite_master(\n" - " type text,\n" - " name text,\n" - " tbl_name text,\n" - " rootpage integer,\n" - " sql text\n" - ")" - ; -#ifndef SQLITE_OMIT_TEMPDB - static const char temp_master_schema[] = - "CREATE TEMP TABLE sqlite_temp_master(\n" - " type text,\n" - " name text,\n" - " tbl_name text,\n" - " rootpage integer,\n" - " sql text\n" - ")" - ; -#else - #define temp_master_schema 0 -#endif - + assert( (db->mDbFlags & DBFLAG_SchemaKnownOk)==0 ); assert( iDb>=0 && iDb<db->nDb ); assert( db->aDb[iDb].pSchema ); assert( sqlite3_mutex_held(db->mutex) ); assert( iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[iDb].pBt) ); - /* zMasterSchema and zInitScript are set to point at the master schema - ** and initialisation script appropriate for the database being - ** initialized. zMasterName is the name of the master table. - */ - if( !OMIT_TEMPDB && iDb==1 ){ - zMasterSchema = temp_master_schema; - }else{ - zMasterSchema = master_schema; - } - zMasterName = SCHEMA_TABLE(iDb); + db->init.busy = 1; - /* Construct the schema tables. */ - azArg[0] = zMasterName; + /* Construct the in-memory representation schema tables (sqlite_master or + ** sqlite_temp_master) by invoking the parser directly. The appropriate + ** table name will be inserted automatically by the parser so we can just + ** use the abbreviation "x" here. The parser will also automatically tag + ** the schema table as read-only. */ + azArg[0] = zMasterName = SCHEMA_TABLE(iDb); azArg[1] = "1"; - azArg[2] = zMasterSchema; + azArg[2] = "CREATE TABLE x(type text,name text,tbl_name text," + "rootpage int,sql text)"; azArg[3] = 0; initData.db = db; initData.iDb = iDb; @@ -104601,19 +120559,15 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ rc = initData.rc; goto error_out; } - pTab = sqlite3FindTable(db, zMasterName, db->aDb[iDb].zName); - if( ALWAYS(pTab) ){ - pTab->tabFlags |= TF_Readonly; - } /* Create a cursor to hold the database open */ pDb = &db->aDb[iDb]; if( pDb->pBt==0 ){ - if( !OMIT_TEMPDB && ALWAYS(iDb==1) ){ - DbSetProperty(db, 1, DB_SchemaLoaded); - } - return SQLITE_OK; + assert( iDb==1 ); + DbSetProperty(db, 1, DB_SchemaLoaded); + rc = SQLITE_OK; + goto error_out; } /* If there is not already a read-only (or read-write) transaction opened @@ -104623,7 +120577,7 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ if( !sqlite3BtreeIsInReadTrans(pDb->pBt) ){ rc = sqlite3BtreeBeginTrans(pDb->pBt, 0); if( rc!=SQLITE_OK ){ - sqlite3SetString(pzErrMsg, db, "%s", sqlite3ErrStr(rc)); + sqlite3SetString(pzErrMsg, db, sqlite3ErrStr(rc)); goto initone_error_out; } openedTransaction = 1; @@ -104649,6 +120603,9 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ for(i=0; i<ArraySize(meta); i++){ sqlite3BtreeGetMeta(pDb->pBt, i+1, (u32 *)&meta[i]); } + if( (db->flags & SQLITE_ResetDatabase)!=0 ){ + memset(meta, 0, sizeof(meta)); + } pDb->pSchema->schema_cookie = meta[BTREE_SCHEMA_VERSION-1]; /* If opening a non-empty database, check the text encoding. For the @@ -104723,8 +120680,8 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ { char *zSql; zSql = sqlite3MPrintf(db, - "SELECT name, rootpage, sql FROM '%q'.%s ORDER BY rowid", - db->aDb[iDb].zName, zMasterName); + "SELECT name, rootpage, sql FROM \"%w\".%s ORDER BY rowid", + db->aDb[iDb].zDbSName, zMasterName); #ifndef SQLITE_OMIT_AUTHORIZATION { sqlite3_xauth xAuth; @@ -104745,11 +120702,11 @@ static int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg){ #endif } if( db->mallocFailed ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; sqlite3ResetAllSchemasOfConnection(db); } - if( rc==SQLITE_OK || (db->flags&SQLITE_RecoveryMode)){ - /* Black magic: If the SQLITE_RecoveryMode flag is set, then consider + if( rc==SQLITE_OK || (db->flags&SQLITE_WriteSchema)){ + /* Black magic: If the SQLITE_WriteSchema flag is set, then consider ** the schema loaded, even if errors occurred. In this situation the ** current sqlite3_prepare() operation will fail, but the following one ** will attempt to compile the supplied statement against whatever subset @@ -104772,9 +120729,13 @@ initone_error_out: sqlite3BtreeLeave(pDb->pBt); error_out: - if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ - db->mallocFailed = 1; + if( rc ){ + if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ + sqlite3OomFault(db); + } + sqlite3ResetOneSchema(db, iDb); } + db->init.busy = 0; return rc; } @@ -104790,42 +120751,30 @@ error_out: */ SQLITE_PRIVATE int sqlite3Init(sqlite3 *db, char **pzErrMsg){ int i, rc; - int commit_internal = !(db->flags&SQLITE_InternChanges); + int commit_internal = !(db->mDbFlags&DBFLAG_SchemaChange); assert( sqlite3_mutex_held(db->mutex) ); assert( sqlite3BtreeHoldsMutex(db->aDb[0].pBt) ); assert( db->init.busy==0 ); - rc = SQLITE_OK; - db->init.busy = 1; ENC(db) = SCHEMA_ENC(db); - for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ - if( DbHasProperty(db, i, DB_SchemaLoaded) || i==1 ) continue; - rc = sqlite3InitOne(db, i, pzErrMsg); - if( rc ){ - sqlite3ResetOneSchema(db, i); + assert( db->nDb>0 ); + /* Do the main schema first */ + if( !DbHasProperty(db, 0, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, 0, pzErrMsg); + if( rc ) return rc; + } + /* All other schemas after the main schema. The "temp" schema must be last */ + for(i=db->nDb-1; i>0; i--){ + assert( i==1 || sqlite3BtreeHoldsMutex(db->aDb[i].pBt) ); + if( !DbHasProperty(db, i, DB_SchemaLoaded) ){ + rc = sqlite3InitOne(db, i, pzErrMsg); + if( rc ) return rc; } } - - /* Once all the other databases have been initialized, load the schema - ** for the TEMP database. This is loaded last, as the TEMP database - ** schema may contain references to objects in other databases. - */ -#ifndef SQLITE_OMIT_TEMPDB - assert( db->nDb>1 ); - if( rc==SQLITE_OK && !DbHasProperty(db, 1, DB_SchemaLoaded) ){ - rc = sqlite3InitOne(db, 1, pzErrMsg); - if( rc ){ - sqlite3ResetOneSchema(db, 1); - } - } -#endif - - db->init.busy = 0; - if( rc==SQLITE_OK && commit_internal ){ + if( commit_internal ){ sqlite3CommitInternalChanges(db); } - - return rc; + return SQLITE_OK; } /* @@ -104838,10 +120787,12 @@ SQLITE_PRIVATE int sqlite3ReadSchema(Parse *pParse){ assert( sqlite3_mutex_held(db->mutex) ); if( !db->init.busy ){ rc = sqlite3Init(db, &pParse->zErrMsg); - } - if( rc!=SQLITE_OK ){ - pParse->rc = rc; - pParse->nErr++; + if( rc!=SQLITE_OK ){ + pParse->rc = rc; + pParse->nErr++; + }else if( db->noSharedCache ){ + db->mDbFlags |= DBFLAG_SchemaKnownOk; + } } return rc; } @@ -104871,7 +120822,7 @@ static void schemaIsValid(Parse *pParse){ if( !sqlite3BtreeIsInReadTrans(pBt) ){ rc = sqlite3BtreeBeginTrans(pBt, 0); if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ){ - db->mallocFailed = 1; + sqlite3OomFault(db); } if( rc!=SQLITE_OK ) return; openedTransaction = 1; @@ -104916,7 +120867,8 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ */ assert( sqlite3_mutex_held(db->mutex) ); if( pSchema ){ - for(i=0; ALWAYS(i<db->nDb); i++){ + for(i=0; 1; i++){ + assert( i<db->nDb ); if( db->aDb[i].pSchema==pSchema ){ break; } @@ -104930,11 +120882,14 @@ SQLITE_PRIVATE int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ ** Free all memory allocations in the pParse object */ SQLITE_PRIVATE void sqlite3ParserReset(Parse *pParse){ - if( pParse ){ - sqlite3 *db = pParse->db; - sqlite3DbFree(db, pParse->aLabel); - sqlite3ExprListDelete(db, pParse->pConstExpr); + sqlite3 *db = pParse->db; + sqlite3DbFree(db, pParse->aLabel); + sqlite3ExprListDelete(db, pParse->pConstExpr); + if( db ){ + assert( db->lookaside.bDisable >= pParse->disableLookaside ); + db->lookaside.bDisable -= pParse->disableLookaside; } + pParse->disableLookaside = 0; } /* @@ -104944,27 +120899,31 @@ static int sqlite3Prepare( sqlite3 *db, /* Database handle. */ const char *zSql, /* UTF-8 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ - int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ Vdbe *pReprepare, /* VM being reprepared */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ const char **pzTail /* OUT: End of parsed string */ ){ - Parse *pParse; /* Parsing context */ char *zErrMsg = 0; /* Error message */ int rc = SQLITE_OK; /* Result code */ int i; /* Loop counter */ + Parse sParse; /* Parsing context */ - /* Allocate the parsing context */ - pParse = sqlite3StackAllocZero(db, sizeof(*pParse)); - if( pParse==0 ){ - rc = SQLITE_NOMEM; - goto end_prepare; - } - pParse->pReprepare = pReprepare; + memset(&sParse, 0, PARSE_HDR_SZ); + memset(PARSE_TAIL(&sParse), 0, PARSE_TAIL_SZ); + sParse.pReprepare = pReprepare; assert( ppStmt && *ppStmt==0 ); - assert( !db->mallocFailed ); + /* assert( !db->mallocFailed ); // not true with SQLITE_USE_ALLOCA */ assert( sqlite3_mutex_held(db->mutex) ); + /* For a long-term use prepared statement avoid the use of + ** lookaside memory. + */ + if( prepFlags & SQLITE_PREPARE_PERSISTENT ){ + sParse.disableLookaside++; + db->lookaside.bDisable++; + } + /* Check to verify that it is possible to get a read lock on all ** database schemas. The inability to get a read lock indicates that ** some other database connection is holding a write-lock, which in @@ -104994,9 +120953,9 @@ static int sqlite3Prepare( assert( sqlite3BtreeHoldsMutex(pBt) ); rc = sqlite3BtreeSchemaLocked(pBt); if( rc ){ - const char *zDb = db->aDb[i].zName; + const char *zDb = db->aDb[i].zDbSName; sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); - testcase( db->flags & SQLITE_ReadUncommitted ); + testcase( db->flags & SQLITE_ReadUncommit ); goto end_prepare; } } @@ -105004,8 +120963,7 @@ static int sqlite3Prepare( sqlite3VtabUnlockList(db); - pParse->db = db; - pParse->nQueryLoop = 0; /* Logarithmic, so 0 really means 1 */ + sParse.db = db; if( nBytes>=0 && (nBytes==0 || zSql[nBytes-1]!=0) ){ char *zSqlCopy; int mxLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; @@ -105018,64 +120976,60 @@ static int sqlite3Prepare( } zSqlCopy = sqlite3DbStrNDup(db, zSql, nBytes); if( zSqlCopy ){ - sqlite3RunParser(pParse, zSqlCopy, &zErrMsg); + sqlite3RunParser(&sParse, zSqlCopy, &zErrMsg); + sParse.zTail = &zSql[sParse.zTail-zSqlCopy]; sqlite3DbFree(db, zSqlCopy); - pParse->zTail = &zSql[pParse->zTail-zSqlCopy]; }else{ - pParse->zTail = &zSql[nBytes]; + sParse.zTail = &zSql[nBytes]; } }else{ - sqlite3RunParser(pParse, zSql, &zErrMsg); + sqlite3RunParser(&sParse, zSql, &zErrMsg); } - assert( 0==pParse->nQueryLoop ); + assert( 0==sParse.nQueryLoop ); - if( db->mallocFailed ){ - pParse->rc = SQLITE_NOMEM; - } - if( pParse->rc==SQLITE_DONE ) pParse->rc = SQLITE_OK; - if( pParse->checkSchema ){ - schemaIsValid(pParse); + if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK; + if( sParse.checkSchema ){ + schemaIsValid(&sParse); } if( db->mallocFailed ){ - pParse->rc = SQLITE_NOMEM; + sParse.rc = SQLITE_NOMEM_BKPT; } if( pzTail ){ - *pzTail = pParse->zTail; + *pzTail = sParse.zTail; } - rc = pParse->rc; + rc = sParse.rc; #ifndef SQLITE_OMIT_EXPLAIN - if( rc==SQLITE_OK && pParse->pVdbe && pParse->explain ){ + if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){ static const char * const azColName[] = { "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", - "selectid", "order", "from", "detail" + "id", "parent", "notused", "detail" }; int iFirst, mx; - if( pParse->explain==2 ){ - sqlite3VdbeSetNumCols(pParse->pVdbe, 4); + if( sParse.explain==2 ){ + sqlite3VdbeSetNumCols(sParse.pVdbe, 4); iFirst = 8; mx = 12; }else{ - sqlite3VdbeSetNumCols(pParse->pVdbe, 8); + sqlite3VdbeSetNumCols(sParse.pVdbe, 8); iFirst = 0; mx = 8; } for(i=iFirst; i<mx; i++){ - sqlite3VdbeSetColName(pParse->pVdbe, i-iFirst, COLNAME_NAME, + sqlite3VdbeSetColName(sParse.pVdbe, i-iFirst, COLNAME_NAME, azColName[i], SQLITE_STATIC); } } #endif if( db->init.busy==0 ){ - Vdbe *pVdbe = pParse->pVdbe; - sqlite3VdbeSetSql(pVdbe, zSql, (int)(pParse->zTail-zSql), saveSqlFlag); + sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); } - if( pParse->pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){ - sqlite3VdbeFinalize(pParse->pVdbe); + if( sParse.pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){ + sqlite3VdbeFinalize(sParse.pVdbe); assert(!(*ppStmt)); }else{ - *ppStmt = (sqlite3_stmt*)pParse->pVdbe; + *ppStmt = (sqlite3_stmt*)sParse.pVdbe; } if( zErrMsg ){ @@ -105086,30 +121040,28 @@ static int sqlite3Prepare( } /* Delete any TriggerPrg structures allocated while parsing this statement. */ - while( pParse->pTriggerPrg ){ - TriggerPrg *pT = pParse->pTriggerPrg; - pParse->pTriggerPrg = pT->pNext; + while( sParse.pTriggerPrg ){ + TriggerPrg *pT = sParse.pTriggerPrg; + sParse.pTriggerPrg = pT->pNext; sqlite3DbFree(db, pT); } end_prepare: - sqlite3ParserReset(pParse); - sqlite3StackFree(db, pParse); - rc = sqlite3ApiExit(db, rc); - assert( (rc&db->errMask)==rc ); + sqlite3ParserReset(&sParse); return rc; } static int sqlite3LockAndPrepare( sqlite3 *db, /* Database handle. */ const char *zSql, /* UTF-8 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ - int saveSqlFlag, /* True to copy SQL text into the sqlite3_stmt */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ Vdbe *pOld, /* VM being reprepared */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ const char **pzTail /* OUT: End of parsed string */ ){ int rc; + int cnt = 0; #ifdef SQLITE_ENABLE_API_ARMOR if( ppStmt==0 ) return SQLITE_MISUSE_BKPT; @@ -105120,14 +121072,18 @@ static int sqlite3LockAndPrepare( } sqlite3_mutex_enter(db->mutex); sqlite3BtreeEnterAll(db); - rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail); - if( rc==SQLITE_SCHEMA ){ - sqlite3_finalize(*ppStmt); - rc = sqlite3Prepare(db, zSql, nBytes, saveSqlFlag, pOld, ppStmt, pzTail); - } + do{ + /* Make multiple attempts to compile the SQL, until it either succeeds + ** or encounters a permanent error. A schema problem after one schema + ** reset is considered a permanent error. */ + rc = sqlite3Prepare(db, zSql, nBytes, prepFlags, pOld, ppStmt, pzTail); + assert( rc==SQLITE_OK || *ppStmt==0 ); + }while( rc==SQLITE_ERROR_RETRY + || (rc==SQLITE_SCHEMA && (sqlite3ResetOneSchema(db,-1), cnt++)==0) ); sqlite3BtreeLeaveAll(db); + rc = sqlite3ApiExit(db, rc); + assert( (rc&db->errMask)==rc ); sqlite3_mutex_leave(db->mutex); - assert( rc==SQLITE_OK || *ppStmt==0 ); return rc; } @@ -105144,16 +121100,18 @@ SQLITE_PRIVATE int sqlite3Reprepare(Vdbe *p){ sqlite3_stmt *pNew; const char *zSql; sqlite3 *db; + u8 prepFlags; assert( sqlite3_mutex_held(sqlite3VdbeDb(p)->mutex) ); zSql = sqlite3_sql((sqlite3_stmt *)p); assert( zSql!=0 ); /* Reprepare only called for prepare_v2() statements */ db = sqlite3VdbeDb(p); assert( sqlite3_mutex_held(db->mutex) ); - rc = sqlite3LockAndPrepare(db, zSql, -1, 0, p, &pNew, 0); + prepFlags = sqlite3VdbePrepareFlags(p); + rc = sqlite3LockAndPrepare(db, zSql, -1, prepFlags, p, &pNew, 0); if( rc ){ if( rc==SQLITE_NOMEM ){ - db->mallocFailed = 1; + sqlite3OomFault(db); } assert( pNew==0 ); return rc; @@ -105196,8 +121154,36 @@ SQLITE_API int sqlite3_prepare_v2( const char **pzTail /* OUT: End of parsed string */ ){ int rc; - rc = sqlite3LockAndPrepare(db,zSql,nBytes,1,0,ppStmt,pzTail); - assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + /* EVIDENCE-OF: R-37923-12173 The sqlite3_prepare_v2() interface works + ** exactly the same as sqlite3_prepare_v3() with a zero prepFlags + ** parameter. + ** + ** Proof in that the 5th parameter to sqlite3LockAndPrepare is 0 */ + rc = sqlite3LockAndPrepare(db,zSql,nBytes,SQLITE_PREPARE_SAVESQL,0, + ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); + return rc; +} +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +){ + int rc; + /* EVIDENCE-OF: R-56861-42673 sqlite3_prepare_v3() differs from + ** sqlite3_prepare_v2() only in having the extra prepFlags parameter, + ** which is a bit array consisting of zero or more of the + ** SQLITE_PREPARE_* flags. + ** + ** Proof by comparison to the implementation of sqlite3_prepare_v2() + ** directly above. */ + rc = sqlite3LockAndPrepare(db,zSql,nBytes, + SQLITE_PREPARE_SAVESQL|(prepFlags&SQLITE_PREPARE_MASK), + 0,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); return rc; } @@ -105210,7 +121196,7 @@ static int sqlite3Prepare16( sqlite3 *db, /* Database handle. */ const void *zSql, /* UTF-16 encoded SQL statement. */ int nBytes, /* Length of zSql in bytes. */ - int saveSqlFlag, /* True to save SQL text into the sqlite3_stmt */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ const void **pzTail /* OUT: End of parsed string */ ){ @@ -105238,7 +121224,7 @@ static int sqlite3Prepare16( sqlite3_mutex_enter(db->mutex); zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); if( zSql8 ){ - rc = sqlite3LockAndPrepare(db, zSql8, -1, saveSqlFlag, 0, ppStmt, &zTail8); + rc = sqlite3LockAndPrepare(db, zSql8, -1, prepFlags, 0, ppStmt, &zTail8); } if( zTail8 && pzTail ){ @@ -105284,7 +121270,22 @@ SQLITE_API int sqlite3_prepare16_v2( const void **pzTail /* OUT: End of parsed string */ ){ int rc; - rc = sqlite3Prepare16(db,zSql,nBytes,1,ppStmt,pzTail); + rc = sqlite3Prepare16(db,zSql,nBytes,SQLITE_PREPARE_SAVESQL,ppStmt,pzTail); + assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ + return rc; +} +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle. */ + const void *zSql, /* UTF-16 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const void **pzTail /* OUT: End of parsed string */ +){ + int rc; + rc = sqlite3Prepare16(db,zSql,nBytes, + SQLITE_PREPARE_SAVESQL|(prepFlags&SQLITE_PREPARE_MASK), + ppStmt,pzTail); assert( rc==SQLITE_OK || ppStmt==0 || *ppStmt==0 ); /* VERIFY: F13021 */ return rc; } @@ -105307,6 +121308,7 @@ SQLITE_API int sqlite3_prepare16_v2( ** This file contains C code routines that are called by the parser ** to handle SELECT statements in SQLite. */ +/* #include "sqliteInt.h" */ /* ** Trace output macros @@ -105315,7 +121317,7 @@ SQLITE_API int sqlite3_prepare16_v2( /***/ int sqlite3SelectTrace = 0; # define SELECTTRACE(K,P,S,X) \ if(sqlite3SelectTrace&(K)) \ - sqlite3DebugPrintf("%*s%s.%p: ",(P)->nSelectIndent*2-2,"",(S)->zSelName,(S)),\ + sqlite3DebugPrintf("%s/%d/%p: ",(S)->zSelName,(P)->addrExplain,(S)),\ sqlite3DebugPrintf X #else # define SELECTTRACE(K,P,S,X) @@ -105338,6 +121340,20 @@ struct DistinctCtx { /* ** An instance of the following object is used to record information about ** the ORDER BY (or GROUP BY) clause of query is being coded. +** +** The aDefer[] array is used by the sorter-references optimization. For +** example, assuming there is no index that can be used for the ORDER BY, +** for the query: +** +** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10; +** +** it may be more efficient to add just the "a" values to the sorter, and +** retrieve the associated "bigblob" values directly from table t1 as the +** 10 smallest "a" values are extracted from the sorter. +** +** When the sorter-reference optimization is used, there is one entry in the +** aDefer[] array for each database table that may be read as values are +** extracted from the sorter. */ typedef struct SortCtx SortCtx; struct SortCtx { @@ -105347,7 +121363,18 @@ struct SortCtx { int regReturn; /* Register holding block-output return address */ int labelBkOut; /* Start label for the block-output subroutine */ int addrSortIndex; /* Address of the OP_SorterOpen or OP_OpenEphemeral */ + int labelDone; /* Jump here when done, ex: LIMIT reached */ u8 sortFlags; /* Zero or more SORTFLAG_* bits */ + u8 bOrderedInnerLoop; /* ORDER BY correctly sorts the inner loop */ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + u8 nDefer; /* Number of valid entries in aDefer[] */ + struct DeferredCsr { + Table *pTab; /* Table definition */ + int iCsr; /* Cursor number for table */ + int nKey; /* Number of PK columns for table pTab (>=1) */ + } aDefer[4]; +#endif + struct RowLoadInfo *pDeferredRowLoad; /* Deferred row loading info or NULL */ }; #define SORTFLAG_UseSorter 0x01 /* Use SorterOpen instead of OpenEphemeral */ @@ -105365,9 +121392,8 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ sqlite3ExprDelete(db, p->pHaving); sqlite3ExprListDelete(db, p->pOrderBy); sqlite3ExprDelete(db, p->pLimit); - sqlite3ExprDelete(db, p->pOffset); - sqlite3WithDelete(db, p->pWith); - if( bFree ) sqlite3DbFree(db, p); + if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); + if( bFree ) sqlite3DbFreeNN(db, p); p = pPrior; bFree = 1; } @@ -105379,7 +121405,7 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){ pDest->eDest = (u8)eDest; pDest->iSDParm = iParm; - pDest->affSdst = 0; + pDest->zAffSdst = 0; pDest->iSdst = 0; pDest->nSdst = 0; } @@ -105397,39 +121423,43 @@ SQLITE_PRIVATE Select *sqlite3SelectNew( ExprList *pGroupBy, /* the GROUP BY clause */ Expr *pHaving, /* the HAVING clause */ ExprList *pOrderBy, /* the ORDER BY clause */ - u16 selFlags, /* Flag parameters, such as SF_Distinct */ - Expr *pLimit, /* LIMIT value. NULL means not used */ - Expr *pOffset /* OFFSET value. NULL means no offset */ + u32 selFlags, /* Flag parameters, such as SF_Distinct */ + Expr *pLimit /* LIMIT value. NULL means not used */ ){ Select *pNew; Select standin; - sqlite3 *db = pParse->db; - pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); - assert( db->mallocFailed || !pOffset || pLimit ); /* OFFSET implies LIMIT */ + pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) ); if( pNew==0 ){ - assert( db->mallocFailed ); + assert( pParse->db->mallocFailed ); pNew = &standin; - memset(pNew, 0, sizeof(*pNew)); } if( pEList==0 ){ - pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db,TK_ALL,0)); + pEList = sqlite3ExprListAppend(pParse, 0, + sqlite3Expr(pParse->db,TK_ASTERISK,0)); } pNew->pEList = pEList; - if( pSrc==0 ) pSrc = sqlite3DbMallocZero(db, sizeof(*pSrc)); + pNew->op = TK_SELECT; + pNew->selFlags = selFlags; + pNew->iLimit = 0; + pNew->iOffset = 0; +#if SELECTTRACE_ENABLED + pNew->zSelName[0] = 0; +#endif + pNew->addrOpenEphm[0] = -1; + pNew->addrOpenEphm[1] = -1; + pNew->nSelectRow = 0; + if( pSrc==0 ) pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*pSrc)); pNew->pSrc = pSrc; pNew->pWhere = pWhere; pNew->pGroupBy = pGroupBy; pNew->pHaving = pHaving; pNew->pOrderBy = pOrderBy; - pNew->selFlags = selFlags; - pNew->op = TK_SELECT; + pNew->pPrior = 0; + pNew->pNext = 0; pNew->pLimit = pLimit; - pNew->pOffset = pOffset; - assert( pOffset==0 || pLimit!=0 ); - pNew->addrOpenEphm[0] = -1; - pNew->addrOpenEphm[1] = -1; - if( db->mallocFailed ) { - clearSelect(db, pNew, pNew!=&standin); + pNew->pWith = 0; + if( pParse->db->mallocFailed ) { + clearSelect(pParse->db, pNew, pNew!=&standin); pNew = 0; }else{ assert( pNew->pSrc!=0 || pParse->nErr>0 ); @@ -105454,7 +121484,7 @@ SQLITE_PRIVATE void sqlite3SelectSetName(Select *p, const char *zName){ ** Delete the given Select structure and all of its substructures. */ SQLITE_PRIVATE void sqlite3SelectDelete(sqlite3 *db, Select *p){ - clearSelect(db, p, 1); + if( OK_IF_ALWAYS_TRUE(p) ) clearSelect(db, p, 1); } /* @@ -105618,7 +121648,7 @@ static void addWhereTerm( pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft); pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); - pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2, 0); + pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); if( pEq && isOuterJoin ){ ExprSetProperty(pEq, EP_FromJoin); assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); @@ -105660,11 +121690,40 @@ static void setJoinExpr(Expr *p, int iTable){ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); p->iRightJoinTable = (i16)iTable; + if( p->op==TK_FUNCTION && p->x.pList ){ + int i; + for(i=0; i<p->x.pList->nExpr; i++){ + setJoinExpr(p->x.pList->a[i].pExpr, iTable); + } + } setJoinExpr(p->pLeft, iTable); p = p->pRight; } } +/* Undo the work of setJoinExpr(). In the expression tree p, convert every +** term that is marked with EP_FromJoin and iRightJoinTable==iTable into +** an ordinary term that omits the EP_FromJoin mark. +** +** This happens when a LEFT JOIN is simplified into an ordinary JOIN. +*/ +static void unsetJoinExpr(Expr *p, int iTable){ + while( p ){ + if( ExprHasProperty(p, EP_FromJoin) + && (iTable<0 || p->iRightJoinTable==iTable) ){ + ExprClearProperty(p, EP_FromJoin); + } + if( p->op==TK_FUNCTION && p->x.pList ){ + int i; + for(i=0; i<p->x.pList->nExpr; i++){ + unsetJoinExpr(p->x.pList->a[i].pExpr, iTable); + } + } + unsetJoinExpr(p->pLeft, iTable); + p = p->pRight; + } +} + /* ** This routine processes the join information for a SELECT statement. ** ON and USING clauses are converted into extra terms of the WHERE clause. @@ -105689,17 +121748,16 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ pLeft = &pSrc->a[0]; pRight = &pLeft[1]; for(i=0; i<pSrc->nSrc-1; i++, pRight++, pLeft++){ - Table *pLeftTab = pLeft->pTab; Table *pRightTab = pRight->pTab; int isOuter; - if( NEVER(pLeftTab==0 || pRightTab==0) ) continue; - isOuter = (pRight->jointype & JT_OUTER)!=0; + if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue; + isOuter = (pRight->fg.jointype & JT_OUTER)!=0; /* When the NATURAL keyword is present, add WHERE clause terms for ** every column that the two tables have in common. */ - if( pRight->jointype & JT_NATURAL ){ + if( pRight->fg.jointype & JT_NATURAL ){ if( pRight->pOn || pRight->pUsing ){ sqlite3ErrorMsg(pParse, "a NATURAL join may not have " "an ON or USING clause", 0); @@ -105775,6 +121833,62 @@ static KeyInfo *keyInfoFromExprList( int nExtra /* Add this many extra columns to the end */ ); +/* +** An instance of this object holds information (beyond pParse and pSelect) +** needed to load the next result row that is to be added to the sorter. +*/ +typedef struct RowLoadInfo RowLoadInfo; +struct RowLoadInfo { + int regResult; /* Store results in array of registers here */ + u8 ecelFlags; /* Flag argument to ExprCodeExprList() */ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + ExprList *pExtra; /* Extra columns needed by sorter refs */ + int regExtraResult; /* Where to load the extra columns */ +#endif +}; + +/* +** This routine does the work of loading query data into an array of +** registers so that it can be added to the sorter. +*/ +static void innerLoopLoadRow( + Parse *pParse, /* Statement under construction */ + Select *pSelect, /* The query being coded */ + RowLoadInfo *pInfo /* Info needed to complete the row load */ +){ + sqlite3ExprCodeExprList(pParse, pSelect->pEList, pInfo->regResult, + 0, pInfo->ecelFlags); +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( pInfo->pExtra ){ + sqlite3ExprCodeExprList(pParse, pInfo->pExtra, pInfo->regExtraResult, 0, 0); + sqlite3ExprListDelete(pParse->db, pInfo->pExtra); + } +#endif +} + +/* +** Code the OP_MakeRecord instruction that generates the entry to be +** added into the sorter. +** +** Return the register in which the result is stored. +*/ +static int makeSorterRecord( + Parse *pParse, + SortCtx *pSort, + Select *pSelect, + int regBase, + int nBase +){ + int nOBSat = pSort->nOBSat; + Vdbe *v = pParse->pVdbe; + int regOut = ++pParse->nMem; + if( pSort->pDeferredRowLoad ){ + innerLoopLoadRow(pParse, pSelect, pSort->pDeferredRowLoad); + } + sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regOut); + return regOut; +} + /* ** Generate code that will push the record in registers regData ** through regData+nData-1 onto the sorter. @@ -105784,7 +121898,8 @@ static void pushOntoSorter( SortCtx *pSort, /* Information about the ORDER BY clause */ Select *pSelect, /* The whole SELECT statement */ int regData, /* First register holding data to be sorted */ - int nData, /* Number of elements in the data array */ + int regOrigData, /* First register holding data before packing */ + int nData, /* Number of elements in the regData data array */ int nPrefixReg /* No. of reg prior to regData available for use */ ){ Vdbe *v = pParse->pVdbe; /* Stmt under construction */ @@ -105792,27 +121907,47 @@ static void pushOntoSorter( int nExpr = pSort->pOrderBy->nExpr; /* No. of ORDER BY terms */ int nBase = nExpr + bSeq + nData; /* Fields in sorter record */ int regBase; /* Regs for sorter record */ - int regRecord = ++pParse->nMem; /* Assembled sorter record */ + int regRecord = 0; /* Assembled sorter record */ int nOBSat = pSort->nOBSat; /* ORDER BY terms to skip */ int op; /* Opcode to add sorter record to sorter */ + int iLimit; /* LIMIT counter */ + int iSkip = 0; /* End of the sorter insert loop */ assert( bSeq==0 || bSeq==1 ); + + /* Three cases: + ** (1) The data to be sorted has already been packed into a Record + ** by a prior OP_MakeRecord. In this case nData==1 and regData + ** will be completely unrelated to regOrigData. + ** (2) All output columns are included in the sort record. In that + ** case regData==regOrigData. + ** (3) Some output columns are omitted from the sort record due to + ** the SQLITE_ENABLE_SORTER_REFERENCE optimization, or due to the + ** SQLITE_ECEL_OMITREF optimization, or due to the + ** SortCtx.pDeferredRowLoad optimiation. In any of these cases + ** regOrigData is 0 to prevent this routine from trying to copy + ** values that might not yet exist. + */ + assert( nData==1 || regData==regOrigData || regOrigData==0 ); + if( nPrefixReg ){ assert( nPrefixReg==nExpr+bSeq ); - regBase = regData - nExpr - bSeq; + regBase = regData - nPrefixReg; }else{ regBase = pParse->nMem + 1; pParse->nMem += nBase; } - sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, SQLITE_ECEL_DUP); + assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); + iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; + pSort->labelDone = sqlite3VdbeMakeLabel(v); + sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, + SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); if( bSeq ){ sqlite3VdbeAddOp2(v, OP_Sequence, pSort->iECursor, regBase+nExpr); } - if( nPrefixReg==0 ){ + if( nPrefixReg==0 && nData>0 ){ sqlite3ExprCodeMove(pParse, regData, regBase+nExpr+bSeq, nData); } - - sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase+nOBSat, nBase-nOBSat, regRecord); if( nOBSat>0 ){ int regPrevKey; /* The first nOBSat columns of the previous row */ int addrFirst; /* Address of the OP_IfNot opcode */ @@ -105821,6 +121956,7 @@ static void pushOntoSorter( int nKey; /* Number of sorting key columns, including OP_Sequence */ KeyInfo *pKI; /* Original KeyInfo on the sorter table */ + regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase); regPrevKey = pParse->nMem+1; pParse->nMem += pSort->nOBSat; nKey = nExpr - pSort->nOBSat + bSeq; @@ -105835,42 +121971,64 @@ static void pushOntoSorter( if( pParse->db->mallocFailed ) return; pOp->p2 = nKey + nData; pKI = pOp->p4.pKeyInfo; - memset(pKI->aSortOrder, 0, pKI->nField); /* Makes OP_Jump below testable */ + memset(pKI->aSortOrder, 0, pKI->nKeyField); /* Makes OP_Jump testable */ sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); - testcase( pKI->nXField>2 ); + testcase( pKI->nAllField > pKI->nKeyField+2 ); pOp->p4.pKeyInfo = keyInfoFromExprList(pParse, pSort->pOrderBy, nOBSat, - pKI->nXField-1); + pKI->nAllField-pKI->nKeyField-1); addrJmp = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); pSort->labelBkOut = sqlite3VdbeMakeLabel(v); pSort->regReturn = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); + if( iLimit ){ + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, pSort->labelDone); + VdbeCoverage(v); + } sqlite3VdbeJumpHere(v, addrFirst); sqlite3ExprCodeMove(pParse, regBase, regPrevKey, pSort->nOBSat); sqlite3VdbeJumpHere(v, addrJmp); } + if( iLimit ){ + /* At this point the values for the new sorter entry are stored + ** in an array of registers. They need to be composed into a record + ** and inserted into the sorter if either (a) there are currently + ** less than LIMIT+OFFSET items or (b) the new record is smaller than + ** the largest record currently in the sorter. If (b) is true and there + ** are already LIMIT+OFFSET items in the sorter, delete the largest + ** entry before inserting the new one. This way there are never more + ** than LIMIT+OFFSET items in the sorter. + ** + ** If the new record does not need to be inserted into the sorter, + ** jump to the next iteration of the loop. Or, if the + ** pSort->bOrderedInnerLoop flag is set to indicate that the inner + ** loop delivers items in sorted order, jump to the next iteration + ** of the outer loop. + */ + int iCsr = pSort->iECursor; + sqlite3VdbeAddOp2(v, OP_IfNotZero, iLimit, sqlite3VdbeCurrentAddr(v)+4); + VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Last, iCsr, 0); + iSkip = sqlite3VdbeAddOp4Int(v, OP_IdxLE, + iCsr, 0, regBase+nOBSat, nExpr-nOBSat); + VdbeCoverage(v); + sqlite3VdbeAddOp1(v, OP_Delete, iCsr); + } + if( regRecord==0 ){ + regRecord = makeSorterRecord(pParse, pSort, pSelect, regBase, nBase); + } if( pSort->sortFlags & SORTFLAG_UseSorter ){ op = OP_SorterInsert; }else{ op = OP_IdxInsert; } - sqlite3VdbeAddOp2(v, op, pSort->iECursor, regRecord); - if( pSelect->iLimit ){ - int addr1, addr2; - int iLimit; - if( pSelect->iOffset ){ - iLimit = pSelect->iOffset+1; - }else{ - iLimit = pSelect->iLimit; - } - addr1 = sqlite3VdbeAddOp1(v, OP_IfZero, iLimit); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_AddImm, iLimit, -1); - addr2 = sqlite3VdbeAddOp0(v, OP_Goto); - sqlite3VdbeJumpHere(v, addr1); - sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor); - sqlite3VdbeAddOp1(v, OP_Delete, pSort->iECursor); - sqlite3VdbeJumpHere(v, addr2); + sqlite3VdbeAddOp4Int(v, op, pSort->iECursor, regRecord, + regBase+nOBSat, nBase-nOBSat); + if( iSkip ){ + assert( pSort->bOrderedInnerLoop==0 || pSort->bOrderedInnerLoop==1 ); + sqlite3VdbeChangeP2(v, iSkip, + sqlite3VdbeCurrentAddr(v) + pSort->bOrderedInnerLoop); } } @@ -105883,11 +122041,8 @@ static void codeOffset( int iContinue /* Jump here to skip the current record */ ){ if( iOffset>0 ){ - int addr; - addr = sqlite3VdbeAddOp3(v, OP_IfNeg, iOffset, 0, -1); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, iContinue); - VdbeComment((v, "skip OFFSET records")); - sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp3(v, OP_IfPos, iOffset, iContinue, 1); VdbeCoverage(v); + VdbeComment((v, "OFFSET")); } } @@ -105914,31 +122069,89 @@ static void codeDistinct( r1 = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp4Int(v, OP_Found, iTab, addrRepeat, iMem, N); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_MakeRecord, iMem, N, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iTab, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r1, iMem, N); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); sqlite3ReleaseTempReg(pParse, r1); } -#ifndef SQLITE_OMIT_SUBQUERY +#ifdef SQLITE_ENABLE_SORTER_REFERENCES /* -** Generate an error message when a SELECT is used within a subexpression -** (example: "a IN (SELECT * FROM table)") but it has more than 1 result -** column. We do this in a subroutine because the error used to occur -** in multiple places. (The error only occurs in one place now, but we -** retain the subroutine to minimize code disruption.) +** This function is called as part of inner-loop generation for a SELECT +** statement with an ORDER BY that is not optimized by an index. It +** determines the expressions, if any, that the sorter-reference +** optimization should be used for. The sorter-reference optimization +** is used for SELECT queries like: +** +** SELECT a, bigblob FROM t1 ORDER BY a LIMIT 10 +** +** If the optimization is used for expression "bigblob", then instead of +** storing values read from that column in the sorter records, the PK of +** the row from table t1 is stored instead. Then, as records are extracted from +** the sorter to return to the user, the required value of bigblob is +** retrieved directly from table t1. If the values are very large, this +** can be more efficient than storing them directly in the sorter records. +** +** The ExprList_item.bSorterRef flag is set for each expression in pEList +** for which the sorter-reference optimization should be enabled. +** Additionally, the pSort->aDefer[] array is populated with entries +** for all cursors required to evaluate all selected expressions. Finally. +** output variable (*ppExtra) is set to an expression list containing +** expressions for all extra PK values that should be stored in the +** sorter records. */ -static int checkForMultiColumnSelectError( - Parse *pParse, /* Parse context. */ - SelectDest *pDest, /* Destination of SELECT results */ - int nExpr /* Number of result columns returned by SELECT */ +static void selectExprDefer( + Parse *pParse, /* Leave any error here */ + SortCtx *pSort, /* Sorter context */ + ExprList *pEList, /* Expressions destined for sorter */ + ExprList **ppExtra /* Expressions to append to sorter record */ ){ - int eDest = pDest->eDest; - if( nExpr>1 && (eDest==SRT_Mem || eDest==SRT_Set) ){ - sqlite3ErrorMsg(pParse, "only a single result allowed for " - "a SELECT that is part of an expression"); - return 1; - }else{ - return 0; + int i; + int nDefer = 0; + ExprList *pExtra = 0; + for(i=0; i<pEList->nExpr; i++){ + struct ExprList_item *pItem = &pEList->a[i]; + if( pItem->u.x.iOrderByCol==0 ){ + Expr *pExpr = pItem->pExpr; + Table *pTab = pExpr->pTab; + if( pExpr->op==TK_COLUMN && pExpr->iColumn>=0 && pTab && !IsVirtual(pTab) + && (pTab->aCol[pExpr->iColumn].colFlags & COLFLAG_SORTERREF) + ){ + int j; + for(j=0; j<nDefer; j++){ + if( pSort->aDefer[j].iCsr==pExpr->iTable ) break; + } + if( j==nDefer ){ + if( nDefer==ArraySize(pSort->aDefer) ){ + continue; + }else{ + int nKey = 1; + int k; + Index *pPk = 0; + if( !HasRowid(pTab) ){ + pPk = sqlite3PrimaryKeyIndex(pTab); + nKey = pPk->nKeyCol; + } + for(k=0; k<nKey; k++){ + Expr *pNew = sqlite3PExpr(pParse, TK_COLUMN, 0, 0); + if( pNew ){ + pNew->iTable = pExpr->iTable; + pNew->pTab = pExpr->pTab; + pNew->iColumn = pPk ? pPk->aiColumn[k] : -1; + pExtra = sqlite3ExprListAppend(pParse, pExtra, pNew); + } + } + pSort->aDefer[nDefer].pTab = pExpr->pTab; + pSort->aDefer[nDefer].iCsr = pExpr->iTable; + pSort->aDefer[nDefer].nKey = nKey; + nDefer++; + } + } + pItem->bSorterRef = 1; + } + } } + pSort->nDefer = (u8)nDefer; + *ppExtra = pExtra; } #endif @@ -105946,16 +122159,15 @@ static int checkForMultiColumnSelectError( ** This routine generates the code for the inside of the inner loop ** of a SELECT. ** -** If srcTab is negative, then the pEList expressions +** If srcTab is negative, then the p->pEList expressions ** are evaluated in order to get the data for this row. If srcTab is -** zero or more, then data is pulled from srcTab and pEList is used only -** to get number columns and the datatype for each column. +** zero or more, then data is pulled from srcTab and p->pEList is used only +** to get the number of columns and the collation sequence for each column. */ static void selectInnerLoop( Parse *pParse, /* The parser context */ Select *p, /* The complete select statement being coded */ - ExprList *pEList, /* List of values being extracted */ - int srcTab, /* Pull data from this table */ + int srcTab, /* Pull data from this table if non-negative */ SortCtx *pSort, /* If not NULL, info on how to process ORDER BY */ DistinctCtx *pDistinct, /* If not NULL, info on how to process DISTINCT */ SelectDest *pDest, /* How to dispose of the results */ @@ -105964,15 +122176,23 @@ static void selectInnerLoop( ){ Vdbe *v = pParse->pVdbe; int i; - int hasDistinct; /* True if the DISTINCT keyword is present */ - int regResult; /* Start of memory holding result set */ + int hasDistinct; /* True if the DISTINCT keyword is present */ int eDest = pDest->eDest; /* How to dispose of results */ int iParm = pDest->iSDParm; /* First argument to disposal method */ int nResultCol; /* Number of result columns */ int nPrefixReg = 0; /* Number of extra registers before regResult */ + RowLoadInfo sRowLoadInfo; /* Info for deferred row loading */ + + /* Usually, regResult is the first cell in an array of memory cells + ** containing the current result row. In this case regOrig is set to the + ** same value. However, if the results are being sent to the sorter, the + ** values for any expressions that are also part of the sort-key are omitted + ** from this array. In this case regOrig is set to zero. */ + int regResult; /* Start of memory holding current results */ + int regOrig; /* Start of memory holding full result (or 0) */ assert( v ); - assert( pEList!=0 ); + assert( p->pEList!=0 ); hasDistinct = pDistinct ? pDistinct->eTnctType : WHERE_DISTINCT_NOOP; if( pSort && pSort->pOrderBy==0 ) pSort = 0; if( pSort==0 && !hasDistinct ){ @@ -105982,7 +122202,7 @@ static void selectInnerLoop( /* Pull the requested columns. */ - nResultCol = pEList->nExpr; + nResultCol = p->pEList->nExpr; if( pDest->iSdst==0 ){ if( pSort ){ @@ -106001,18 +122221,96 @@ static void selectInnerLoop( pParse->nMem += nResultCol; } pDest->nSdst = nResultCol; - regResult = pDest->iSdst; + regOrig = regResult = pDest->iSdst; if( srcTab>=0 ){ for(i=0; i<nResultCol; i++){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, i, regResult+i); - VdbeComment((v, "%s", pEList->a[i].zName)); + VdbeComment((v, "%s", p->pEList->a[i].zName)); } }else if( eDest!=SRT_Exists ){ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + ExprList *pExtra = 0; +#endif /* If the destination is an EXISTS(...) expression, the actual ** values returned by the SELECT are not required. */ - sqlite3ExprCodeExprList(pParse, pEList, regResult, - (eDest==SRT_Output||eDest==SRT_Coroutine)?SQLITE_ECEL_DUP:0); + u8 ecelFlags; /* "ecel" is an abbreviation of "ExprCodeExprList" */ + ExprList *pEList; + if( eDest==SRT_Mem || eDest==SRT_Output || eDest==SRT_Coroutine ){ + ecelFlags = SQLITE_ECEL_DUP; + }else{ + ecelFlags = 0; + } + if( pSort && hasDistinct==0 && eDest!=SRT_EphemTab && eDest!=SRT_Table ){ + /* For each expression in p->pEList that is a copy of an expression in + ** the ORDER BY clause (pSort->pOrderBy), set the associated + ** iOrderByCol value to one more than the index of the ORDER BY + ** expression within the sort-key that pushOntoSorter() will generate. + ** This allows the p->pEList field to be omitted from the sorted record, + ** saving space and CPU cycles. */ + ecelFlags |= (SQLITE_ECEL_OMITREF|SQLITE_ECEL_REF); + + for(i=pSort->nOBSat; i<pSort->pOrderBy->nExpr; i++){ + int j; + if( (j = pSort->pOrderBy->a[i].u.x.iOrderByCol)>0 ){ + p->pEList->a[j-1].u.x.iOrderByCol = i+1-pSort->nOBSat; + } + } +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + selectExprDefer(pParse, pSort, p->pEList, &pExtra); + if( pExtra && pParse->db->mallocFailed==0 ){ + /* If there are any extra PK columns to add to the sorter records, + ** allocate extra memory cells and adjust the OpenEphemeral + ** instruction to account for the larger records. This is only + ** required if there are one or more WITHOUT ROWID tables with + ** composite primary keys in the SortCtx.aDefer[] array. */ + VdbeOp *pOp = sqlite3VdbeGetOp(v, pSort->addrSortIndex); + pOp->p2 += (pExtra->nExpr - pSort->nDefer); + pOp->p4.pKeyInfo->nAllField += (pExtra->nExpr - pSort->nDefer); + pParse->nMem += pExtra->nExpr; + } +#endif + + /* Adjust nResultCol to account for columns that are omitted + ** from the sorter by the optimizations in this branch */ + pEList = p->pEList; + for(i=0; i<pEList->nExpr; i++){ + if( pEList->a[i].u.x.iOrderByCol>0 +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + || pEList->a[i].bSorterRef +#endif + ){ + nResultCol--; + regOrig = 0; + } + } + + testcase( regOrig ); + testcase( eDest==SRT_Set ); + testcase( eDest==SRT_Mem ); + testcase( eDest==SRT_Coroutine ); + testcase( eDest==SRT_Output ); + assert( eDest==SRT_Set || eDest==SRT_Mem + || eDest==SRT_Coroutine || eDest==SRT_Output ); + } + sRowLoadInfo.regResult = regResult; + sRowLoadInfo.ecelFlags = ecelFlags; +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + sRowLoadInfo.pExtra = pExtra; + sRowLoadInfo.regExtraResult = regResult + nResultCol; + if( pExtra ) nResultCol += pExtra->nExpr; +#endif + if( p->iLimit + && (ecelFlags & SQLITE_ECEL_OMITREF)!=0 + && nPrefixReg>0 + ){ + assert( pSort!=0 ); + assert( hasDistinct==0 ); + pSort->pDeferredRowLoad = &sRowLoadInfo; + regOrig = 0; + }else{ + innerLoopLoadRow(pParse, p, &sRowLoadInfo); + } } /* If the DISTINCT keyword was present on the SELECT statement @@ -106044,7 +122342,7 @@ static void selectInnerLoop( iJump = sqlite3VdbeCurrentAddr(v) + nResultCol; for(i=0; i<nResultCol; i++){ - CollSeq *pColl = sqlite3ExprCollSeq(pParse, pEList->a[i].pExpr); + CollSeq *pColl = sqlite3ExprCollSeq(pParse, p->pEList->a[i].pExpr); if( i<nResultCol-1 ){ sqlite3VdbeAddOp3(v, OP_Ne, regResult+i, iJump, regPrev+i); VdbeCoverage(v); @@ -106067,7 +122365,8 @@ static void selectInnerLoop( default: { assert( pDistinct->eTnctType==WHERE_DISTINCT_UNORDERED ); - codeDistinct(pParse, pDistinct->tabTnct, iContinue, nResultCol, regResult); + codeDistinct(pParse, pDistinct->tabTnct, iContinue, nResultCol, + regResult); break; } } @@ -106085,7 +122384,7 @@ static void selectInnerLoop( int r1; r1 = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); sqlite3ReleaseTempReg(pParse, r1); break; } @@ -106109,6 +122408,8 @@ static void selectInnerLoop( int r1 = sqlite3GetTempRange(pParse, nPrefixReg+1); testcase( eDest==SRT_Table ); testcase( eDest==SRT_EphemTab ); + testcase( eDest==SRT_Fifo ); + testcase( eDest==SRT_DistFifo ); sqlite3VdbeAddOp3(v, OP_MakeRecord, regResult, nResultCol, r1+nPrefixReg); #ifndef SQLITE_OMIT_CTE if( eDest==SRT_DistFifo ){ @@ -106118,13 +122419,15 @@ static void selectInnerLoop( ** current row to the index and proceed with writing it to the ** output table as well. */ int addr = sqlite3VdbeCurrentAddr(v) + 4; - sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm+1, r1); + sqlite3VdbeAddOp4Int(v, OP_Found, iParm+1, addr, r1, 0); + VdbeCoverage(v); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm+1, r1,regResult,nResultCol); assert( pSort==0 ); } #endif if( pSort ){ - pushOntoSorter(pParse, pSort, p, r1+nPrefixReg, 1, nPrefixReg); + assert( regResult==regOrig ); + pushOntoSorter(pParse, pSort, p, r1+nPrefixReg, regOrig, 1, nPrefixReg); }else{ int r2 = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, r2); @@ -106142,20 +122445,20 @@ static void selectInnerLoop( ** item into the set table with bogus data. */ case SRT_Set: { - assert( nResultCol==1 ); - pDest->affSdst = - sqlite3CompareAffinity(pEList->a[0].pExpr, pDest->affSdst); if( pSort ){ /* At first glance you would think we could optimize out the ** ORDER BY in this case since the order of entries in the set ** does not matter. But there might be a LIMIT clause, in which ** case the order does matter */ - pushOntoSorter(pParse, pSort, p, regResult, 1, nPrefixReg); + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else{ int r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult,1,r1, &pDest->affSdst, 1); - sqlite3ExprCacheAffinityChange(pParse, regResult, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, + r1, pDest->zAffSdst, nResultCol); + sqlite3ExprCacheAffinityChange(pParse, regResult, nResultCol); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); sqlite3ReleaseTempReg(pParse, r1); } break; @@ -106170,14 +122473,16 @@ static void selectInnerLoop( } /* If this is a scalar select that is part of an expression, then - ** store the results in the appropriate memory cell and break out - ** of the scan loop. + ** store the results in the appropriate memory cell or array of + ** memory cells and break out of the scan loop. */ case SRT_Mem: { - assert( nResultCol==1 ); if( pSort ){ - pushOntoSorter(pParse, pSort, p, regResult, 1, nPrefixReg); + assert( nResultCol<=pDest->nSdst ); + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else{ + assert( nResultCol==pDest->nSdst ); assert( regResult==iParm ); /* The LIMIT clause will jump out of the loop for us */ } @@ -106190,7 +122495,8 @@ static void selectInnerLoop( testcase( eDest==SRT_Coroutine ); testcase( eDest==SRT_Output ); if( pSort ){ - pushOntoSorter(pParse, pSort, p, regResult, nResultCol, nPrefixReg); + pushOntoSorter(pParse, pSort, p, regResult, regOrig, nResultCol, + nPrefixReg); }else if( eDest==SRT_Coroutine ){ sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); }else{ @@ -106239,7 +122545,7 @@ static void selectInnerLoop( } sqlite3VdbeAddOp2(v, OP_Sequence, iParm, r2+nKey); sqlite3VdbeAddOp3(v, OP_MakeRecord, r2, nKey+2, r1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, r1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, r2, nKey+2); if( addrTest ) sqlite3VdbeJumpHere(v, addrTest); sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempRange(pParse, r2, nKey+2); @@ -106267,7 +122573,7 @@ static void selectInnerLoop( ** the output for us. */ if( pSort==0 && p->iLimit ){ - sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); } } @@ -106276,17 +122582,18 @@ static void selectInnerLoop( ** X extra columns. */ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ - KeyInfo *p = sqlite3DbMallocZero(0, - sizeof(KeyInfo) + (N+X)*(sizeof(CollSeq*)+1)); + int nExtra = (N+X)*(sizeof(CollSeq*)+1) - sizeof(CollSeq*); + KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); if( p ){ p->aSortOrder = (u8*)&p->aColl[N+X]; - p->nField = (u16)N; - p->nXField = (u16)X; + p->nKeyField = (u16)N; + p->nAllField = (u16)(N+X); p->enc = ENC(db); p->db = db; p->nRef = 1; + memset(&p[1], 0, nExtra); }else{ - db->mallocFailed = 1; + sqlite3OomFault(db); } return p; } @@ -106298,7 +122605,7 @@ SQLITE_PRIVATE void sqlite3KeyInfoUnref(KeyInfo *p){ if( p ){ assert( p->nRef>0 ); p->nRef--; - if( p->nRef==0 ) sqlite3DbFree(0, p); + if( p->nRef==0 ) sqlite3DbFreeNN(p->db, p); } } @@ -106354,17 +122661,13 @@ static KeyInfo *keyInfoFromExprList( if( pInfo ){ assert( sqlite3KeyInfoIsWriteable(pInfo) ); for(i=iStart, pItem=pList->a+iStart; i<nExpr; i++, pItem++){ - CollSeq *pColl; - pColl = sqlite3ExprCollSeq(pParse, pItem->pExpr); - if( !pColl ) pColl = db->pDfltColl; - pInfo->aColl[i-iStart] = pColl; + pInfo->aColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); pInfo->aSortOrder[i-iStart] = pItem->sortOrder; } } return pInfo; } -#ifndef SQLITE_OMIT_COMPOUND_SELECT /* ** Name of the connection operator, used for error messages. */ @@ -106378,7 +122681,6 @@ static const char *selectOpName(int id){ } return z; } -#endif /* SQLITE_OMIT_COMPOUND_SELECT */ #ifndef SQLITE_OMIT_EXPLAIN /* @@ -106392,11 +122694,7 @@ static const char *selectOpName(int id){ ** is determined by the zUsage argument. */ static void explainTempTable(Parse *pParse, const char *zUsage){ - if( pParse->explain==2 ){ - Vdbe *v = pParse->pVdbe; - char *zMsg = sqlite3MPrintf(pParse->db, "USE TEMP B-TREE FOR %s", zUsage); - sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); - } + ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s", zUsage)); } /* @@ -106414,42 +122712,6 @@ static void explainTempTable(Parse *pParse, const char *zUsage){ # define explainSetInteger(y,z) #endif -#if !defined(SQLITE_OMIT_EXPLAIN) && !defined(SQLITE_OMIT_COMPOUND_SELECT) -/* -** Unless an "EXPLAIN QUERY PLAN" command is being processed, this function -** is a no-op. Otherwise, it adds a single row of output to the EQP result, -** where the caption is of one of the two forms: -** -** "COMPOSITE SUBQUERIES iSub1 and iSub2 (op)" -** "COMPOSITE SUBQUERIES iSub1 and iSub2 USING TEMP B-TREE (op)" -** -** where iSub1 and iSub2 are the integers passed as the corresponding -** function parameters, and op is the text representation of the parameter -** of the same name. The parameter "op" must be one of TK_UNION, TK_EXCEPT, -** TK_INTERSECT or TK_ALL. The first form is used if argument bUseTmp is -** false, or the second form if it is true. -*/ -static void explainComposite( - Parse *pParse, /* Parse context */ - int op, /* One of TK_UNION, TK_EXCEPT etc. */ - int iSub1, /* Subquery id 1 */ - int iSub2, /* Subquery id 2 */ - int bUseTmp /* True if a temp table was used */ -){ - assert( op==TK_UNION || op==TK_EXCEPT || op==TK_INTERSECT || op==TK_ALL ); - if( pParse->explain==2 ){ - Vdbe *v = pParse->pVdbe; - char *zMsg = sqlite3MPrintf( - pParse->db, "COMPOUND SUBQUERIES %d AND %d %s(%s)", iSub1, iSub2, - bUseTmp?"USING TEMP B-TREE ":"", selectOpName(op) - ); - sqlite3VdbeAddOp4(v, OP_Explain, pParse->iSelectId, 0, 0, zMsg, P4_DYNAMIC); - } -} -#else -/* No-op versions of the explainXXX() functions and macros. */ -# define explainComposite(v,w,x,y,z) -#endif /* ** If the inner loop was generated using a non-null pOrderBy argument, @@ -106465,9 +122727,9 @@ static void generateSortTail( SelectDest *pDest /* Write the sorted results here */ ){ Vdbe *v = pParse->pVdbe; /* The prepared statement */ - int addrBreak = sqlite3VdbeMakeLabel(v); /* Jump here to exit loop */ + int addrBreak = pSort->labelDone; /* Jump here to exit loop */ int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */ - int addr; + int addr; /* Top of output loop. Jump for Next. */ int addrOnce = 0; int iTab; ExprList *pOrderBy = pSort->pOrderBy; @@ -106475,38 +122737,48 @@ static void generateSortTail( int iParm = pDest->iSDParm; int regRow; int regRowid; - int nKey; + int iCol; + int nKey; /* Number of key columns in sorter record */ int iSortTab; /* Sorter cursor to read from */ - int nSortData; /* Trailing values to read from sorter */ int i; int bSeq; /* True if sorter record includes seq. no. */ -#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + int nRefKey = 0; struct ExprList_item *aOutEx = p->pEList->a; -#endif + assert( addrBreak<0 ); if( pSort->labelBkOut ){ sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrBreak); + sqlite3VdbeGoto(v, addrBreak); sqlite3VdbeResolveLabel(v, pSort->labelBkOut); } + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + /* Open any cursors needed for sorter-reference expressions */ + for(i=0; i<pSort->nDefer; i++){ + Table *pTab = pSort->aDefer[i].pTab; + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3OpenTable(pParse, pSort->aDefer[i].iCsr, iDb, pTab, OP_OpenRead); + nRefKey = MAX(nRefKey, pSort->aDefer[i].nKey); + } +#endif + iTab = pSort->iECursor; - if( eDest==SRT_Output || eDest==SRT_Coroutine ){ + if( eDest==SRT_Output || eDest==SRT_Coroutine || eDest==SRT_Mem ){ regRowid = 0; regRow = pDest->iSdst; - nSortData = nColumn; }else{ regRowid = sqlite3GetTempReg(pParse); - regRow = sqlite3GetTempReg(pParse); - nSortData = 1; + regRow = sqlite3GetTempRange(pParse, nColumn); } nKey = pOrderBy->nExpr - pSort->nOBSat; if( pSort->sortFlags & SORTFLAG_UseSorter ){ int regSortOut = ++pParse->nMem; iSortTab = pParse->nTab++; if( pSort->labelBkOut ){ - addrOnce = sqlite3CodeOnce(pParse); VdbeCoverage(v); + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } - sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, nKey+1+nSortData); + sqlite3VdbeAddOp3(v, OP_OpenPseudo, iSortTab, regSortOut, + nKey+1+nColumn+nRefKey); if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); VdbeCoverage(v); @@ -106519,15 +122791,63 @@ static void generateSortTail( iSortTab = iTab; bSeq = 1; } - for(i=0; i<nSortData; i++){ - sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq+i, regRow+i); - VdbeComment((v, "%s", aOutEx[i].zName ? aOutEx[i].zName : aOutEx[i].zSpan)); + for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( aOutEx[i].bSorterRef ) continue; +#endif + if( aOutEx[i].u.x.iOrderByCol==0 ) iCol++; + } +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( pSort->nDefer ){ + int iKey = iCol+1; + int regKey = sqlite3GetTempRange(pParse, nRefKey); + + for(i=0; i<pSort->nDefer; i++){ + int iCsr = pSort->aDefer[i].iCsr; + Table *pTab = pSort->aDefer[i].pTab; + int nKey = pSort->aDefer[i].nKey; + + sqlite3VdbeAddOp1(v, OP_NullRow, iCsr); + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCsr, + sqlite3VdbeCurrentAddr(v)+1, regKey); + }else{ + int k; + int iJmp; + assert( sqlite3PrimaryKeyIndex(pTab)->nKeyCol==nKey ); + for(k=0; k<nKey; k++){ + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iKey++, regKey+k); + } + iJmp = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp4Int(v, OP_SeekGE, iCsr, iJmp+2, regKey, nKey); + sqlite3VdbeAddOp4Int(v, OP_IdxLE, iCsr, iJmp+3, regKey, nKey); + sqlite3VdbeAddOp1(v, OP_NullRow, iCsr); + } + } + sqlite3ReleaseTempRange(pParse, regKey, nRefKey); + } +#endif + for(i=nColumn-1; i>=0; i--){ +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + if( aOutEx[i].bSorterRef ){ + sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); + }else +#endif + { + int iRead; + if( aOutEx[i].u.x.iOrderByCol ){ + iRead = aOutEx[i].u.x.iOrderByCol-1; + }else{ + iRead = iCol--; + } + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i); + VdbeComment((v, "%s", aOutEx[i].zName?aOutEx[i].zName : aOutEx[i].zSpan)); + } } switch( eDest ){ case SRT_Table: case SRT_EphemTab: { - testcase( eDest==SRT_Table ); - testcase( eDest==SRT_EphemTab ); sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); @@ -106535,16 +122855,14 @@ static void generateSortTail( } #ifndef SQLITE_OMIT_SUBQUERY case SRT_Set: { - assert( nColumn==1 ); - sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, 1, regRowid, - &pDest->affSdst, 1); - sqlite3ExprCacheAffinityChange(pParse, regRow, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iParm, regRowid); + assert( nColumn==sqlite3Strlen30(pDest->zAffSdst) ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, nColumn, regRowid, + pDest->zAffSdst, nColumn); + sqlite3ExprCacheAffinityChange(pParse, regRow, nColumn); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, regRowid, regRow, nColumn); break; } case SRT_Mem: { - assert( nColumn==1 ); - sqlite3ExprCodeMove(pParse, regRow, iParm, 1); /* The LIMIT clause will terminate the loop for us */ break; } @@ -106563,7 +122881,11 @@ static void generateSortTail( } } if( regRowid ){ - sqlite3ReleaseTempReg(pParse, regRow); + if( eDest==SRT_Set ){ + sqlite3ReleaseTempRange(pParse, regRow, nColumn); + }else{ + sqlite3ReleaseTempReg(pParse, regRow); + } sqlite3ReleaseTempReg(pParse, regRowid); } /* The bottom of the loop @@ -106603,33 +122925,34 @@ static void generateSortTail( ** the SQLITE_ENABLE_COLUMN_METADATA compile-time option is used. */ #ifdef SQLITE_ENABLE_COLUMN_METADATA -# define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,C,D,E,F) +# define columnType(A,B,C,D,E) columnTypeImpl(A,B,C,D,E) +#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */ +# define columnType(A,B,C,D,E) columnTypeImpl(A,B) +#endif static const char *columnTypeImpl( NameContext *pNC, +#ifndef SQLITE_ENABLE_COLUMN_METADATA + Expr *pExpr +#else Expr *pExpr, const char **pzOrigDb, const char **pzOrigTab, - const char **pzOrigCol, - u8 *pEstWidth + const char **pzOrigCol +#endif ){ + char const *zType = 0; + int j; +#ifdef SQLITE_ENABLE_COLUMN_METADATA char const *zOrigDb = 0; char const *zOrigTab = 0; char const *zOrigCol = 0; -#else /* if !defined(SQLITE_ENABLE_COLUMN_METADATA) */ -# define columnType(A,B,C,D,E,F) columnTypeImpl(A,B,F) -static const char *columnTypeImpl( - NameContext *pNC, - Expr *pExpr, - u8 *pEstWidth -){ -#endif /* !defined(SQLITE_ENABLE_COLUMN_METADATA) */ - char const *zType = 0; - int j; - u8 estWidth = 1; +#endif - if( NEVER(pExpr==0) || pNC->pSrcList==0 ) return 0; + assert( pExpr!=0 ); + assert( pNC->pSrcList!=0 ); + assert( pExpr->op!=TK_AGG_COLUMN ); /* This routine runes before aggregates + ** are processed */ switch( pExpr->op ){ - case TK_AGG_COLUMN: case TK_COLUMN: { /* The expression is a column. Locate the table the column is being ** extracted from in NameContext.pSrcList. This table may be real @@ -106638,8 +122961,6 @@ static const char *columnTypeImpl( Table *pTab = 0; /* Table structure column is extracted from */ Select *pS = 0; /* Select the column is extracted from */ int iCol = pExpr->iColumn; /* Index of column in pTab */ - testcase( pExpr->op==TK_AGG_COLUMN ); - testcase( pExpr->op==TK_COLUMN ); while( pNC && !pTab ){ SrcList *pTabList = pNC->pSrcList; for(j=0;j<pTabList->nSrc && pTabList->a[j].iCursor!=pExpr->iTable;j++); @@ -106678,7 +122999,7 @@ static const char *columnTypeImpl( ** of the SELECT statement. Return the declaration type and origin ** data for the result-set column of the sub-select. */ - if( iCol>=0 && ALWAYS(iCol<pS->pEList->nExpr) ){ + if( iCol>=0 && iCol<pS->pEList->nExpr ){ /* If iCol is less than zero, then the expression requests the ** rowid of the sub-select or view. This expression is legal (see ** test case misc2.2.2) - it always evaluates to NULL. @@ -106688,33 +123009,32 @@ static const char *columnTypeImpl( sNC.pSrcList = pS->pSrc; sNC.pNext = pNC; sNC.pParse = pNC->pParse; - zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol, &estWidth); + zType = columnType(&sNC, p,&zOrigDb,&zOrigTab,&zOrigCol); } - }else if( pTab->pSchema ){ - /* A real table */ + }else{ + /* A real table or a CTE table */ assert( !pS ); - if( iCol<0 ) iCol = pTab->iPKey; - assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); #ifdef SQLITE_ENABLE_COLUMN_METADATA + if( iCol<0 ) iCol = pTab->iPKey; + assert( iCol==XN_ROWID || (iCol>=0 && iCol<pTab->nCol) ); if( iCol<0 ){ zType = "INTEGER"; zOrigCol = "rowid"; }else{ - zType = pTab->aCol[iCol].zType; zOrigCol = pTab->aCol[iCol].zName; - estWidth = pTab->aCol[iCol].szEst; + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); } zOrigTab = pTab->zName; - if( pNC->pParse ){ + if( pNC->pParse && pTab->pSchema ){ int iDb = sqlite3SchemaToIndex(pNC->pParse->db, pTab->pSchema); - zOrigDb = pNC->pParse->db->aDb[iDb].zName; + zOrigDb = pNC->pParse->db->aDb[iDb].zDbSName; } #else + assert( iCol==XN_ROWID || (iCol>=0 && iCol<pTab->nCol) ); if( iCol<0 ){ zType = "INTEGER"; }else{ - zType = pTab->aCol[iCol].zType; - estWidth = pTab->aCol[iCol].szEst; + zType = sqlite3ColumnType(&pTab->aCol[iCol],0); } #endif } @@ -106733,7 +123053,7 @@ static const char *columnTypeImpl( sNC.pSrcList = pS->pSrc; sNC.pNext = pNC; sNC.pParse = pNC->pParse; - zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol, &estWidth); + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); break; } #endif @@ -106747,7 +123067,6 @@ static const char *columnTypeImpl( *pzOrigCol = zOrigCol; } #endif - if( pEstWidth ) *pEstWidth = estWidth; return zType; } @@ -106766,6 +123085,7 @@ static void generateColumnTypes( NameContext sNC; sNC.pSrcList = pTabList; sNC.pParse = pParse; + sNC.pNext = 0; for(i=0; i<pEList->nExpr; i++){ Expr *p = pEList->a[i].pExpr; const char *zType; @@ -106773,7 +123093,7 @@ static void generateColumnTypes( const char *zOrigDb = 0; const char *zOrigTab = 0; const char *zOrigCol = 0; - zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol, 0); + zType = columnType(&sNC, p, &zOrigDb, &zOrigTab, &zOrigCol); /* The vdbe must make its own copy of the column-type and other ** column specific strings, in case the schema is reset before this @@ -106783,27 +123103,56 @@ static void generateColumnTypes( sqlite3VdbeSetColName(v, i, COLNAME_TABLE, zOrigTab, SQLITE_TRANSIENT); sqlite3VdbeSetColName(v, i, COLNAME_COLUMN, zOrigCol, SQLITE_TRANSIENT); #else - zType = columnType(&sNC, p, 0, 0, 0, 0); + zType = columnType(&sNC, p, 0, 0, 0); #endif sqlite3VdbeSetColName(v, i, COLNAME_DECLTYPE, zType, SQLITE_TRANSIENT); } #endif /* !defined(SQLITE_OMIT_DECLTYPE) */ } + /* -** Generate code that will tell the VDBE the names of columns -** in the result set. This information is used to provide the -** azCol[] values in the callback. +** Compute the column names for a SELECT statement. +** +** The only guarantee that SQLite makes about column names is that if the +** column has an AS clause assigning it a name, that will be the name used. +** That is the only documented guarantee. However, countless applications +** developed over the years have made baseless assumptions about column names +** and will break if those assumptions changes. Hence, use extreme caution +** when modifying this routine to avoid breaking legacy. +** +** See Also: sqlite3ColumnsFromExprList() +** +** The PRAGMA short_column_names and PRAGMA full_column_names settings are +** deprecated. The default setting is short=ON, full=OFF. 99.9% of all +** applications should operate this way. Nevertheless, we need to support the +** other modes for legacy: +** +** short=OFF, full=OFF: Column name is the text of the expression has it +** originally appears in the SELECT statement. In +** other words, the zSpan of the result expression. +** +** short=ON, full=OFF: (This is the default setting). If the result +** refers directly to a table column, then the +** result column name is just the table column +** name: COLUMN. Otherwise use zSpan. +** +** full=ON, short=ANY: If the result refers directly to a table column, +** then the result column name with the table name +** prefix, ex: TABLE.COLUMN. Otherwise use zSpan. */ static void generateColumnNames( Parse *pParse, /* Parser context */ - SrcList *pTabList, /* List of tables */ - ExprList *pEList /* Expressions defining the result set */ + Select *pSelect /* Generate column names for this SELECT statement */ ){ Vdbe *v = pParse->pVdbe; - int i, j; + int i; + Table *pTab; + SrcList *pTabList; + ExprList *pEList; sqlite3 *db = pParse->db; - int fullNames, shortNames; + int fullName; /* TABLE.COLUMN if no AS clause and is a direct table ref */ + int srcName; /* COLUMN or TABLE.COLUMN if no AS clause and is direct */ #ifndef SQLITE_OMIT_EXPLAIN /* If this is an EXPLAIN, skip this step */ @@ -106812,27 +123161,33 @@ static void generateColumnNames( } #endif - if( pParse->colNamesSet || NEVER(v==0) || db->mallocFailed ) return; + if( pParse->colNamesSet ) return; + /* Column names are determined by the left-most term of a compound select */ + while( pSelect->pPrior ) pSelect = pSelect->pPrior; + SELECTTRACE(1,pParse,pSelect,("generating column names\n")); + pTabList = pSelect->pSrc; + pEList = pSelect->pEList; + assert( v!=0 ); + assert( pTabList!=0 ); pParse->colNamesSet = 1; - fullNames = (db->flags & SQLITE_FullColNames)!=0; - shortNames = (db->flags & SQLITE_ShortColNames)!=0; + fullName = (db->flags & SQLITE_FullColNames)!=0; + srcName = (db->flags & SQLITE_ShortColNames)!=0 || fullName; sqlite3VdbeSetNumCols(v, pEList->nExpr); for(i=0; i<pEList->nExpr; i++){ - Expr *p; - p = pEList->a[i].pExpr; - if( NEVER(p==0) ) continue; + Expr *p = pEList->a[i].pExpr; + + assert( p!=0 ); + assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ + assert( p->op!=TK_COLUMN || p->pTab!=0 ); /* Covering idx not yet coded */ if( pEList->a[i].zName ){ + /* An AS clause always takes first priority */ char *zName = pEList->a[i].zName; sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); - }else if( (p->op==TK_COLUMN || p->op==TK_AGG_COLUMN) && pTabList ){ - Table *pTab; + }else if( srcName && p->op==TK_COLUMN ){ char *zCol; int iCol = p->iColumn; - for(j=0; ALWAYS(j<pTabList->nSrc); j++){ - if( pTabList->a[j].iCursor==p->iTable ) break; - } - assert( j<pTabList->nSrc ); - pTab = pTabList->a[j].pTab; + pTab = p->pTab; + assert( pTab!=0 ); if( iCol<0 ) iCol = pTab->iPKey; assert( iCol==-1 || (iCol>=0 && iCol<pTab->nCol) ); if( iCol<0 ){ @@ -106840,10 +123195,7 @@ static void generateColumnNames( }else{ zCol = pTab->aCol[iCol].zName; } - if( !shortNames && !fullNames ){ - sqlite3VdbeSetColName(v, i, COLNAME_NAME, - sqlite3DbStrDup(db, pEList->a[i].zSpan), SQLITE_DYNAMIC); - }else if( fullNames ){ + if( fullName ){ char *zName = 0; zName = sqlite3MPrintf(db, "%s.%s", pTab->zName, zCol); sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_DYNAMIC); @@ -106871,8 +123223,17 @@ static void generateColumnNames( ** ** Return SQLITE_OK on success. If a memory allocation error occurs, ** store NULL in *paCol and 0 in *pnCol and return SQLITE_NOMEM. +** +** The only guarantee that SQLite makes about column names is that if the +** column has an AS clause assigning it a name, that will be the name used. +** That is the only documented guarantee. However, countless applications +** developed over the years have made baseless assumptions about column names +** and will break if those assumptions changes. Hence, use extreme caution +** when modifying this routine to avoid breaking legacy. +** +** See Also: generateColumnNames() */ -static int selectColumnsFromExprList( +SQLITE_PRIVATE int sqlite3ColumnsFromExprList( Parse *pParse, /* Parsing context */ ExprList *pEList, /* Expr list from which to derive column names */ i16 *pnCol, /* Write the number of columns here */ @@ -106880,78 +123241,80 @@ static int selectColumnsFromExprList( ){ sqlite3 *db = pParse->db; /* Database connection */ int i, j; /* Loop counters */ - int cnt; /* Index added to make the name unique */ + u32 cnt; /* Index added to make the name unique */ Column *aCol, *pCol; /* For looping over result columns */ int nCol; /* Number of columns in the result set */ - Expr *p; /* Expression for a single result column */ char *zName; /* Column name */ int nName; /* Size of name in zName[] */ + Hash ht; /* Hash table of column names */ + sqlite3HashInit(&ht); if( pEList ){ nCol = pEList->nExpr; aCol = sqlite3DbMallocZero(db, sizeof(aCol[0])*nCol); testcase( aCol==0 ); + if( nCol>32767 ) nCol = 32767; }else{ nCol = 0; aCol = 0; } + assert( nCol==(i16)nCol ); *pnCol = nCol; *paCol = aCol; - for(i=0, pCol=aCol; i<nCol; i++, pCol++){ + for(i=0, pCol=aCol; i<nCol && !db->mallocFailed; i++, pCol++){ /* Get an appropriate name for the column */ - p = sqlite3ExprSkipCollate(pEList->a[i].pExpr); if( (zName = pEList->a[i].zName)!=0 ){ /* If the column contains an "AS <name>" phrase, use <name> as the name */ - zName = sqlite3DbStrDup(db, zName); }else{ - Expr *pColExpr = p; /* The expression that is the result column name */ - Table *pTab; /* Table associated with this expression */ + Expr *pColExpr = sqlite3ExprSkipCollate(pEList->a[i].pExpr); while( pColExpr->op==TK_DOT ){ pColExpr = pColExpr->pRight; assert( pColExpr!=0 ); } - if( pColExpr->op==TK_COLUMN && ALWAYS(pColExpr->pTab!=0) ){ + assert( pColExpr->op!=TK_AGG_COLUMN ); + if( pColExpr->op==TK_COLUMN ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; - pTab = pColExpr->pTab; + Table *pTab = pColExpr->pTab; + assert( pTab!=0 ); if( iCol<0 ) iCol = pTab->iPKey; - zName = sqlite3MPrintf(db, "%s", - iCol>=0 ? pTab->aCol[iCol].zName : "rowid"); + zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid"; }else if( pColExpr->op==TK_ID ){ assert( !ExprHasProperty(pColExpr, EP_IntValue) ); - zName = sqlite3MPrintf(db, "%s", pColExpr->u.zToken); + zName = pColExpr->u.zToken; }else{ /* Use the original text of the column expression as its name */ - zName = sqlite3MPrintf(db, "%s", pEList->a[i].zSpan); + zName = pEList->a[i].zSpan; } } - if( db->mallocFailed ){ - sqlite3DbFree(db, zName); - break; + if( zName ){ + zName = sqlite3DbStrDup(db, zName); + }else{ + zName = sqlite3MPrintf(db,"column%d",i+1); } /* Make sure the column name is unique. If the name is not unique, ** append an integer to the name so that it becomes unique. */ - nName = sqlite3Strlen30(zName); - for(j=cnt=0; j<i; j++){ - if( sqlite3StrICmp(aCol[j].zName, zName)==0 ){ - char *zNewName; - int k; - for(k=nName-1; k>1 && sqlite3Isdigit(zName[k]); k--){} - if( k>=0 && zName[k]==':' ) nName = k; - zName[nName] = 0; - zNewName = sqlite3MPrintf(db, "%s:%d", zName, ++cnt); - sqlite3DbFree(db, zName); - zName = zNewName; - j = -1; - if( zName==0 ) break; + cnt = 0; + while( zName && sqlite3HashFind(&ht, zName)!=0 ){ + nName = sqlite3Strlen30(zName); + if( nName>0 ){ + for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} + if( zName[j]==':' ) nName = j; } + zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); + if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); } pCol->zName = zName; + sqlite3ColumnPropertiesFromName(0, pCol); + if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ + sqlite3OomFault(db); + } } + sqlite3HashClear(&ht); if( db->mallocFailed ){ for(j=0; j<i; j++){ sqlite3DbFree(db, aCol[j].zName); @@ -106959,7 +123322,7 @@ static int selectColumnsFromExprList( sqlite3DbFree(db, aCol); *paCol = 0; *pnCol = 0; - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } return SQLITE_OK; } @@ -106975,7 +123338,7 @@ static int selectColumnsFromExprList( ** This routine requires that all identifiers in the SELECT ** statement be resolved. */ -static void selectAddColumnTypeAndCollation( +SQLITE_PRIVATE void sqlite3SelectAddColumnTypeAndCollation( Parse *pParse, /* Parsing contexts */ Table *pTab, /* Add column type information to this table */ Select *pSelect /* SELECT used to determine types and collations */ @@ -106987,7 +123350,6 @@ static void selectAddColumnTypeAndCollation( int i; Expr *p; struct ExprList_item *a; - u64 szAll = 0; assert( pSelect!=0 ); assert( (pSelect->selFlags & SF_Resolved)!=0 ); @@ -106997,17 +123359,28 @@ static void selectAddColumnTypeAndCollation( sNC.pSrcList = pSelect->pSrc; a = pSelect->pEList->a; for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){ + const char *zType; + int n, m; p = a[i].pExpr; - pCol->zType = sqlite3DbStrDup(db, columnType(&sNC, p,0,0,0, &pCol->szEst)); - szAll += pCol->szEst; + zType = columnType(&sNC, p, 0, 0, 0); + /* pCol->szEst = ... // Column size est for SELECT tables never used */ pCol->affinity = sqlite3ExprAffinity(p); - if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_NONE; + if( zType ){ + m = sqlite3Strlen30(zType); + n = sqlite3Strlen30(pCol->zName); + pCol->zName = sqlite3DbReallocOrFree(db, pCol->zName, n+m+2); + if( pCol->zName ){ + memcpy(&pCol->zName[n+1], zType, m+1); + pCol->colFlags |= COLFLAG_HASTYPE; + } + } + if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_BLOB; pColl = sqlite3ExprCollSeq(pParse, p); - if( pColl ){ + if( pColl && pCol->zColl==0 ){ pCol->zColl = sqlite3DbStrDup(db, pColl->zName); } } - pTab->szTabRow = sqlite3LogEst(szAll*4); + pTab->szTabRow = 1; /* Any non-zero value works */ } /* @@ -107032,12 +123405,12 @@ SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ } /* The sqlite3ResultSetOfSelect() is only used n contexts where lookaside ** is disabled */ - assert( db->lookaside.bEnabled==0 ); - pTab->nRef = 1; + assert( db->lookaside.bDisable ); + pTab->nTabRef = 1; pTab->zName = 0; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); - selectColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); - selectAddColumnTypeAndCollation(pParse, pTab, pSelect); + sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect); pTab->iPKey = -1; if( db->mallocFailed ){ sqlite3DeleteTable(db, pTab); @@ -107051,24 +123424,21 @@ SQLITE_PRIVATE Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ ** If an error occurs, return NULL and leave a message in pParse. */ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ - Vdbe *v = pParse->pVdbe; - if( v==0 ){ - v = pParse->pVdbe = sqlite3VdbeCreate(pParse); - if( v ) sqlite3VdbeAddOp0(v, OP_Init); - if( pParse->pToplevel==0 - && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst) - ){ - pParse->okConstFactor = 1; - } - + if( pParse->pVdbe ){ + return pParse->pVdbe; } - return v; + if( pParse->pToplevel==0 + && OptimizationEnabled(pParse->db,SQLITE_FactorOutConst) + ){ + pParse->okConstFactor = 1; + } + return sqlite3VdbeCreate(pParse); } /* ** Compute the iLimit and iOffset fields of the SELECT based on the -** pLimit and pOffset expressions. pLimit and pOffset hold the expressions +** pLimit expressions. pLimit->pLeft and pLimit->pRight hold the expressions ** that appear in the original SQL statement after the LIMIT and OFFSET ** keywords. Or NULL if those keywords are omitted. iLimit and iOffset ** are the integer memory register numbers for counters used to compute @@ -107076,15 +123446,15 @@ SQLITE_PRIVATE Vdbe *sqlite3GetVdbe(Parse *pParse){ ** iLimit and iOffset are negative. ** ** This routine changes the values of iLimit and iOffset only if -** a limit or offset is defined by pLimit and pOffset. iLimit and -** iOffset should have been preset to appropriate default values (zero) +** a limit or offset is defined by pLimit->pLeft and pLimit->pRight. iLimit +** and iOffset should have been preset to appropriate default values (zero) ** prior to calling this routine. ** ** The iOffset register (if it exists) is initialized to the value ** of the OFFSET. The iLimit register is initialized to LIMIT. Register ** iOffset+1 is initialized to LIMIT+OFFSET. ** -** Only if pLimit!=0 or pOffset!=0 do the limit registers get +** Only if pLimit->pLeft!=0 do the limit registers get ** redefined. The UNION ALL operator uses this property to force ** the reuse of the same limit and offset registers across multiple ** SELECT statements. @@ -107093,7 +123463,9 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ Vdbe *v = 0; int iLimit = 0; int iOffset; - int addr1, n; + int n; + Expr *pLimit = p->pLimit; + if( p->iLimit ) return; /* @@ -107103,39 +123475,35 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ ** no rows. */ sqlite3ExprCacheClear(pParse); - assert( p->pOffset==0 || p->pLimit!=0 ); - if( p->pLimit ){ + if( pLimit ){ + assert( pLimit->op==TK_LIMIT ); + assert( pLimit->pLeft!=0 ); p->iLimit = iLimit = ++pParse->nMem; v = sqlite3GetVdbe(pParse); assert( v!=0 ); - if( sqlite3ExprIsInteger(p->pLimit, &n) ){ + if( sqlite3ExprIsInteger(pLimit->pLeft, &n) ){ sqlite3VdbeAddOp2(v, OP_Integer, n, iLimit); VdbeComment((v, "LIMIT counter")); if( n==0 ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, iBreak); - }else if( n>=0 && p->nSelectRow>(u64)n ){ - p->nSelectRow = n; + sqlite3VdbeGoto(v, iBreak); + }else if( n>=0 && p->nSelectRow>sqlite3LogEst((u64)n) ){ + p->nSelectRow = sqlite3LogEst((u64)n); + p->selFlags |= SF_FixedLimit; } }else{ - sqlite3ExprCode(pParse, p->pLimit, iLimit); + sqlite3ExprCode(pParse, pLimit->pLeft, iLimit); sqlite3VdbeAddOp1(v, OP_MustBeInt, iLimit); VdbeCoverage(v); VdbeComment((v, "LIMIT counter")); - sqlite3VdbeAddOp2(v, OP_IfZero, iLimit, iBreak); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_IfNot, iLimit, iBreak); VdbeCoverage(v); } - if( p->pOffset ){ + if( pLimit->pRight ){ p->iOffset = iOffset = ++pParse->nMem; pParse->nMem++; /* Allocate an extra register for limit+offset */ - sqlite3ExprCode(pParse, p->pOffset, iOffset); + sqlite3ExprCode(pParse, pLimit->pRight, iOffset); sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); VdbeComment((v, "OFFSET counter")); - addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, 0, iOffset); - sqlite3VdbeJumpHere(v, addr1); - sqlite3VdbeAddOp3(v, OP_Add, iLimit, iOffset, iOffset+1); + sqlite3VdbeAddOp3(v, OP_OffsetLimit, iLimit, iOffset+1, iOffset); VdbeComment((v, "LIMIT+OFFSET")); - addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iLimit); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, -1, iOffset+1); - sqlite3VdbeJumpHere(v, addr1); } } } @@ -107157,7 +123525,10 @@ static CollSeq *multiSelectCollSeq(Parse *pParse, Select *p, int iCol){ pRet = 0; } assert( iCol>=0 ); - if( pRet==0 && iCol<p->pEList->nExpr ){ + /* iCol must be less than p->pEList->nExpr. Otherwise an error would + ** have been thrown during name resolution and we would not have gotten + ** this far */ + if( pRet==0 && ALWAYS(iCol<p->pEList->nExpr) ){ pRet = sqlite3ExprCollSeq(pParse, p->pEList->a[iCol].pExpr); } return pRet; @@ -107212,7 +123583,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ ** ** ** There is exactly one reference to the recursive-table in the FROM clause -** of recursive-query, marked with the SrcList->a[].isRecursive flag. +** of recursive-query, marked with the SrcList->a[].fg.isRecursive flag. ** ** The setup-query runs once to generate an initial set of rows that go ** into a Queue table. Rows are extracted from the Queue table one by @@ -107258,7 +123629,7 @@ static void generateWithRecursiveQuery( int i; /* Loop counter */ int rc; /* Result code */ ExprList *pOrderBy; /* The ORDER BY clause */ - Expr *pLimit, *pOffset; /* Saved LIMIT and OFFSET */ + Expr *pLimit; /* Saved LIMIT and OFFSET */ int regLimit, regOffset; /* Registers used by LIMIT and OFFSET */ /* Obtain authorization to do a recursive query */ @@ -107266,18 +123637,18 @@ static void generateWithRecursiveQuery( /* Process the LIMIT and OFFSET clauses, if they exist */ addrBreak = sqlite3VdbeMakeLabel(v); + p->nSelectRow = 320; /* 4 billion rows */ computeLimitRegisters(pParse, p, addrBreak); pLimit = p->pLimit; - pOffset = p->pOffset; regLimit = p->iLimit; regOffset = p->iOffset; - p->pLimit = p->pOffset = 0; + p->pLimit = 0; p->iLimit = p->iOffset = 0; pOrderBy = p->pOrderBy; /* Locate the cursor number of the Current table */ for(i=0; ALWAYS(i<pSrc->nSrc); i++){ - if( pSrc->a[i].isRecursive ){ + if( pSrc->a[i].fg.isRecursive ){ iCurrent = pSrc->a[i].iCursor; break; } @@ -107317,6 +123688,7 @@ static void generateWithRecursiveQuery( /* Store the results of the setup-query in Queue. */ pSetup->pNext = 0; + ExplainQueryPlan((pParse, 1, "SETUP")); rc = sqlite3Select(pParse, pSetup, &destQueue); pSetup->pNext = p; if( rc ) goto end_of_recursive_query; @@ -107336,10 +123708,10 @@ static void generateWithRecursiveQuery( /* Output the single row in Current */ addrCont = sqlite3VdbeMakeLabel(v); codeOffset(v, regOffset, addrCont); - selectInnerLoop(pParse, p, p->pEList, iCurrent, + selectInnerLoop(pParse, p, iCurrent, 0, 0, pDest, addrCont, addrBreak); if( regLimit ){ - sqlite3VdbeAddOp3(v, OP_IfZero, regLimit, addrBreak, -1); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, regLimit, addrBreak); VdbeCoverage(v); } sqlite3VdbeResolveLabel(v, addrCont); @@ -107347,20 +123719,24 @@ static void generateWithRecursiveQuery( /* Execute the recursive SELECT taking the single row in Current as ** the value for the recursive-table. Store the results in the Queue. */ - p->pPrior = 0; - sqlite3Select(pParse, p, &destQueue); - assert( p->pPrior==0 ); - p->pPrior = pSetup; + if( p->selFlags & SF_Aggregate ){ + sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported"); + }else{ + p->pPrior = 0; + ExplainQueryPlan((pParse, 1, "RECURSIVE STEP")); + sqlite3Select(pParse, p, &destQueue); + assert( p->pPrior==0 ); + p->pPrior = pSetup; + } /* Keep running the loop until the Queue is empty */ - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrTop); + sqlite3VdbeGoto(v, addrTop); sqlite3VdbeResolveLabel(v, addrBreak); end_of_recursive_query: sqlite3ExprListDelete(pParse->db, p->pOrderBy); p->pOrderBy = pOrderBy; p->pLimit = pLimit; - p->pOffset = pOffset; return; } #endif /* SQLITE_OMIT_CTE */ @@ -107372,19 +123748,6 @@ static int multiSelectOrderBy( SelectDest *pDest /* What to do with query results */ ); -/* -** Error message for when two or more terms of a compound select have different -** size result sets. -*/ -static void selectWrongNumTermsError(Parse *pParse, Select *p){ - if( p->selFlags & SF_Values ){ - sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms"); - }else{ - sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" - " do not have the same number of result columns", selectOpName(p->op)); - } -} - /* ** Handle the special case of a compound-select that originates from a ** VALUES clause. By handling this as a special case, we avoid deep @@ -107392,41 +123755,38 @@ static void selectWrongNumTermsError(Parse *pParse, Select *p){ ** on a VALUES clause. ** ** Because the Select object originates from a VALUES clause: -** (1) It has no LIMIT or OFFSET +** (1) There is no LIMIT or OFFSET or else there is a LIMIT of exactly 1 ** (2) All terms are UNION ALL ** (3) There is no ORDER BY clause +** +** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES +** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))"). +** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case. +** Since the limit is exactly 1, we only need to evalutes the left-most VALUES. */ static int multiSelectValues( Parse *pParse, /* Parsing context */ Select *p, /* The right-most of SELECTs to be coded */ SelectDest *pDest /* What to do with query results */ ){ - Select *pPrior; - int nExpr = p->pEList->nExpr; int nRow = 1; int rc = 0; - assert( p->pNext==0 ); - assert( p->selFlags & SF_AllValues ); + int bShowAll = p->pLimit==0; + assert( p->selFlags & SF_MultiValue ); do{ assert( p->selFlags & SF_Values ); assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) ); - assert( p->pLimit==0 ); - assert( p->pOffset==0 ); - if( p->pEList->nExpr!=nExpr ){ - selectWrongNumTermsError(pParse, p); - return 1; - } + assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr ); if( p->pPrior==0 ) break; assert( p->pPrior->pNext==p ); p = p->pPrior; - nRow++; + nRow += bShowAll; }while(1); + ExplainQueryPlan((pParse, 0, "SCAN %d CONSTANT ROW%s", nRow, + nRow==1 ? "" : "S")); while( p ){ - pPrior = p->pPrior; - p->pPrior = 0; - rc = sqlite3Select(pParse, p, pDest); - p->pPrior = pPrior; - if( rc ) break; + selectInnerLoop(pParse, p, -1, 0, 0, pDest, 1, 1); + if( !bShowAll ) break; p->nSelectRow = nRow; p = p->pNext; } @@ -107475,10 +123835,6 @@ static int multiSelect( SelectDest dest; /* Alternative data destination */ Select *pDelete = 0; /* Chain of simple selects to delete */ sqlite3 *db; /* Database connection */ -#ifndef SQLITE_OMIT_EXPLAIN - int iSub1 = 0; /* EQP id of left-hand query */ - int iSub2 = 0; /* EQP id of right-hand query */ -#endif /* Make sure there is no ORDER BY or LIMIT clause on prior SELECTs. Only ** the last (right-most) SELECT in the series may have an ORDER BY or LIMIT. @@ -107488,15 +123844,9 @@ static int multiSelect( db = pParse->db; pPrior = p->pPrior; dest = *pDest; - if( pPrior->pOrderBy ){ - sqlite3ErrorMsg(pParse,"ORDER BY clause should come after %s not before", - selectOpName(p->op)); - rc = 1; - goto multi_select_end; - } - if( pPrior->pLimit ){ - sqlite3ErrorMsg(pParse,"LIMIT clause should come after %s not before", - selectOpName(p->op)); + if( pPrior->pOrderBy || pPrior->pLimit ){ + sqlite3ErrorMsg(pParse,"%s clause should come after %s not before", + pPrior->pOrderBy!=0 ? "ORDER BY" : "LIMIT", selectOpName(p->op)); rc = 1; goto multi_select_end; } @@ -107509,13 +123859,12 @@ static int multiSelect( if( dest.eDest==SRT_EphemTab ){ assert( p->pEList ); sqlite3VdbeAddOp2(v, OP_OpenEphemeral, dest.iSDParm, p->pEList->nExpr); - sqlite3VdbeChangeP5(v, BTREE_UNORDERED); dest.eDest = SRT_Table; } /* Special handling for a compound-select that originates as a VALUES clause. */ - if( p->selFlags & SF_AllValues ){ + if( p->selFlags & SF_MultiValue ){ rc = multiSelectValues(pParse, p, &dest); goto multi_select_end; } @@ -107524,11 +123873,7 @@ static int multiSelect( ** in their result sets. */ assert( p->pEList && pPrior->pEList ); - if( p->pEList->nExpr!=pPrior->pEList->nExpr ){ - selectWrongNumTermsError(pParse, p); - rc = 1; - goto multi_select_end; - } + assert( p->pEList->nExpr==pPrior->pEList->nExpr ); #ifndef SQLITE_OMIT_CTE if( p->selFlags & SF_Recursive ){ @@ -107540,230 +123885,231 @@ static int multiSelect( */ if( p->pOrderBy ){ return multiSelectOrderBy(pParse, p, pDest); - }else + }else{ - /* Generate code for the left and right SELECT statements. - */ - switch( p->op ){ - case TK_ALL: { - int addr = 0; - int nLimit; - assert( !pPrior->pLimit ); - pPrior->iLimit = p->iLimit; - pPrior->iOffset = p->iOffset; - pPrior->pLimit = p->pLimit; - pPrior->pOffset = p->pOffset; - explainSetInteger(iSub1, pParse->iNextSelectId); - rc = sqlite3Select(pParse, pPrior, &dest); - p->pLimit = 0; - p->pOffset = 0; - if( rc ){ - goto multi_select_end; - } - p->pPrior = 0; - p->iLimit = pPrior->iLimit; - p->iOffset = pPrior->iOffset; - if( p->iLimit ){ - addr = sqlite3VdbeAddOp1(v, OP_IfZero, p->iLimit); VdbeCoverage(v); - VdbeComment((v, "Jump ahead if LIMIT reached")); - } - explainSetInteger(iSub2, pParse->iNextSelectId); - rc = sqlite3Select(pParse, p, &dest); - testcase( rc!=SQLITE_OK ); - pDelete = p->pPrior; - p->pPrior = pPrior; - p->nSelectRow += pPrior->nSelectRow; - if( pPrior->pLimit - && sqlite3ExprIsInteger(pPrior->pLimit, &nLimit) - && nLimit>0 && p->nSelectRow > (u64)nLimit - ){ - p->nSelectRow = nLimit; - } - if( addr ){ - sqlite3VdbeJumpHere(v, addr); - } - break; +#ifndef SQLITE_OMIT_EXPLAIN + if( pPrior->pPrior==0 ){ + ExplainQueryPlan((pParse, 1, "COMPOUND QUERY")); + ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY")); } - case TK_EXCEPT: - case TK_UNION: { - int unionTab; /* Cursor number of the temporary table holding result */ - u8 op = 0; /* One of the SRT_ operations to apply to self */ - int priorOp; /* The SRT_ operation to apply to prior selects */ - Expr *pLimit, *pOffset; /* Saved values of p->nLimit and p->nOffset */ - int addr; - SelectDest uniondest; +#endif - testcase( p->op==TK_EXCEPT ); - testcase( p->op==TK_UNION ); - priorOp = SRT_Union; - if( dest.eDest==priorOp ){ - /* We can reuse a temporary table generated by a SELECT to our - ** right. + /* Generate code for the left and right SELECT statements. + */ + switch( p->op ){ + case TK_ALL: { + int addr = 0; + int nLimit; + assert( !pPrior->pLimit ); + pPrior->iLimit = p->iLimit; + pPrior->iOffset = p->iOffset; + pPrior->pLimit = p->pLimit; + rc = sqlite3Select(pParse, pPrior, &dest); + p->pLimit = 0; + if( rc ){ + goto multi_select_end; + } + p->pPrior = 0; + p->iLimit = pPrior->iLimit; + p->iOffset = pPrior->iOffset; + if( p->iLimit ){ + addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v); + VdbeComment((v, "Jump ahead if LIMIT reached")); + if( p->iOffset ){ + sqlite3VdbeAddOp3(v, OP_OffsetLimit, + p->iLimit, p->iOffset+1, p->iOffset); + } + } + ExplainQueryPlan((pParse, 1, "UNION ALL")); + rc = sqlite3Select(pParse, p, &dest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + if( pPrior->pLimit + && sqlite3ExprIsInteger(pPrior->pLimit->pLeft, &nLimit) + && nLimit>0 && p->nSelectRow > sqlite3LogEst((u64)nLimit) + ){ + p->nSelectRow = sqlite3LogEst((u64)nLimit); + } + if( addr ){ + sqlite3VdbeJumpHere(v, addr); + } + break; + } + case TK_EXCEPT: + case TK_UNION: { + int unionTab; /* Cursor number of the temp table holding result */ + u8 op = 0; /* One of the SRT_ operations to apply to self */ + int priorOp; /* The SRT_ operation to apply to prior selects */ + Expr *pLimit; /* Saved values of p->nLimit */ + int addr; + SelectDest uniondest; + + testcase( p->op==TK_EXCEPT ); + testcase( p->op==TK_UNION ); + priorOp = SRT_Union; + if( dest.eDest==priorOp ){ + /* We can reuse a temporary table generated by a SELECT to our + ** right. + */ + assert( p->pLimit==0 ); /* Not allowed on leftward elements */ + unionTab = dest.iSDParm; + }else{ + /* We will need to create our own temporary table to hold the + ** intermediate results. + */ + unionTab = pParse->nTab++; + assert( p->pOrderBy==0 ); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0); + assert( p->addrOpenEphm[0] == -1 ); + p->addrOpenEphm[0] = addr; + findRightmost(p)->selFlags |= SF_UsesEphemeral; + assert( p->pEList ); + } + + /* Code the SELECT statements to our left */ - assert( p->pLimit==0 ); /* Not allowed on leftward elements */ - assert( p->pOffset==0 ); /* Not allowed on leftward elements */ - unionTab = dest.iSDParm; - }else{ - /* We will need to create our own temporary table to hold the - ** intermediate results. + assert( !pPrior->pOrderBy ); + sqlite3SelectDestInit(&uniondest, priorOp, unionTab); + rc = sqlite3Select(pParse, pPrior, &uniondest); + if( rc ){ + goto multi_select_end; + } + + /* Code the current SELECT statement */ - unionTab = pParse->nTab++; + if( p->op==TK_EXCEPT ){ + op = SRT_Except; + }else{ + assert( p->op==TK_UNION ); + op = SRT_Union; + } + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + uniondest.eDest = op; + ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE", + selectOpName(p->op))); + rc = sqlite3Select(pParse, p, &uniondest); + testcase( rc!=SQLITE_OK ); + /* Query flattening in sqlite3Select() might refill p->pOrderBy. + ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ + sqlite3ExprListDelete(db, p->pOrderBy); + pDelete = p->pPrior; + p->pPrior = pPrior; + p->pOrderBy = 0; + if( p->op==TK_UNION ){ + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + p->iLimit = 0; + p->iOffset = 0; + + /* Convert the data in the temporary table into whatever form + ** it is that we currently need. + */ + assert( unionTab==dest.iSDParm || dest.eDest!=priorOp ); + if( dest.eDest!=priorOp ){ + int iCont, iBreak, iStart; + assert( p->pEList ); + iBreak = sqlite3VdbeMakeLabel(v); + iCont = sqlite3VdbeMakeLabel(v); + computeLimitRegisters(pParse, p, iBreak); + sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); + iStart = sqlite3VdbeCurrentAddr(v); + selectInnerLoop(pParse, p, unionTab, + 0, 0, &dest, iCont, iBreak); + sqlite3VdbeResolveLabel(v, iCont); + sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v); + sqlite3VdbeResolveLabel(v, iBreak); + sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0); + } + break; + } + default: assert( p->op==TK_INTERSECT ); { + int tab1, tab2; + int iCont, iBreak, iStart; + Expr *pLimit; + int addr; + SelectDest intersectdest; + int r1; + + /* INTERSECT is different from the others since it requires + ** two temporary tables. Hence it has its own case. Begin + ** by allocating the tables we will need. + */ + tab1 = pParse->nTab++; + tab2 = pParse->nTab++; assert( p->pOrderBy==0 ); - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, unionTab, 0); + + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); assert( p->addrOpenEphm[0] == -1 ); p->addrOpenEphm[0] = addr; findRightmost(p)->selFlags |= SF_UsesEphemeral; assert( p->pEList ); - } - - /* Code the SELECT statements to our left - */ - assert( !pPrior->pOrderBy ); - sqlite3SelectDestInit(&uniondest, priorOp, unionTab); - explainSetInteger(iSub1, pParse->iNextSelectId); - rc = sqlite3Select(pParse, pPrior, &uniondest); - if( rc ){ - goto multi_select_end; - } - - /* Code the current SELECT statement - */ - if( p->op==TK_EXCEPT ){ - op = SRT_Except; - }else{ - assert( p->op==TK_UNION ); - op = SRT_Union; - } - p->pPrior = 0; - pLimit = p->pLimit; - p->pLimit = 0; - pOffset = p->pOffset; - p->pOffset = 0; - uniondest.eDest = op; - explainSetInteger(iSub2, pParse->iNextSelectId); - rc = sqlite3Select(pParse, p, &uniondest); - testcase( rc!=SQLITE_OK ); - /* Query flattening in sqlite3Select() might refill p->pOrderBy. - ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ - sqlite3ExprListDelete(db, p->pOrderBy); - pDelete = p->pPrior; - p->pPrior = pPrior; - p->pOrderBy = 0; - if( p->op==TK_UNION ) p->nSelectRow += pPrior->nSelectRow; - sqlite3ExprDelete(db, p->pLimit); - p->pLimit = pLimit; - p->pOffset = pOffset; - p->iLimit = 0; - p->iOffset = 0; - - /* Convert the data in the temporary table into whatever form - ** it is that we currently need. - */ - assert( unionTab==dest.iSDParm || dest.eDest!=priorOp ); - if( dest.eDest!=priorOp ){ - int iCont, iBreak, iStart; - assert( p->pEList ); - if( dest.eDest==SRT_Output ){ - Select *pFirst = p; - while( pFirst->pPrior ) pFirst = pFirst->pPrior; - generateColumnNames(pParse, 0, pFirst->pEList); + + /* Code the SELECTs to our left into temporary table "tab1". + */ + sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1); + rc = sqlite3Select(pParse, pPrior, &intersectdest); + if( rc ){ + goto multi_select_end; } + + /* Code the current SELECT into temporary table "tab2" + */ + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); + assert( p->addrOpenEphm[1] == -1 ); + p->addrOpenEphm[1] = addr; + p->pPrior = 0; + pLimit = p->pLimit; + p->pLimit = 0; + intersectdest.iSDParm = tab2; + ExplainQueryPlan((pParse, 1, "%s USING TEMP B-TREE", + selectOpName(p->op))); + rc = sqlite3Select(pParse, p, &intersectdest); + testcase( rc!=SQLITE_OK ); + pDelete = p->pPrior; + p->pPrior = pPrior; + if( p->nSelectRow>pPrior->nSelectRow ){ + p->nSelectRow = pPrior->nSelectRow; + } + sqlite3ExprDelete(db, p->pLimit); + p->pLimit = pLimit; + + /* Generate code to take the intersection of the two temporary + ** tables. + */ + assert( p->pEList ); iBreak = sqlite3VdbeMakeLabel(v); iCont = sqlite3VdbeMakeLabel(v); computeLimitRegisters(pParse, p, iBreak); - sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); - iStart = sqlite3VdbeCurrentAddr(v); - selectInnerLoop(pParse, p, p->pEList, unionTab, + sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); + r1 = sqlite3GetTempReg(pParse); + iStart = sqlite3VdbeAddOp2(v, OP_RowData, tab1, r1); + sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, r1); + selectInnerLoop(pParse, p, tab1, 0, 0, &dest, iCont, iBreak); sqlite3VdbeResolveLabel(v, iCont); - sqlite3VdbeAddOp2(v, OP_Next, unionTab, iStart); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v); sqlite3VdbeResolveLabel(v, iBreak); - sqlite3VdbeAddOp2(v, OP_Close, unionTab, 0); + sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); + sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); + break; } - break; } - default: assert( p->op==TK_INTERSECT ); { - int tab1, tab2; - int iCont, iBreak, iStart; - Expr *pLimit, *pOffset; - int addr; - SelectDest intersectdest; - int r1; - - /* INTERSECT is different from the others since it requires - ** two temporary tables. Hence it has its own case. Begin - ** by allocating the tables we will need. - */ - tab1 = pParse->nTab++; - tab2 = pParse->nTab++; - assert( p->pOrderBy==0 ); - - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab1, 0); - assert( p->addrOpenEphm[0] == -1 ); - p->addrOpenEphm[0] = addr; - findRightmost(p)->selFlags |= SF_UsesEphemeral; - assert( p->pEList ); - - /* Code the SELECTs to our left into temporary table "tab1". - */ - sqlite3SelectDestInit(&intersectdest, SRT_Union, tab1); - explainSetInteger(iSub1, pParse->iNextSelectId); - rc = sqlite3Select(pParse, pPrior, &intersectdest); - if( rc ){ - goto multi_select_end; - } - - /* Code the current SELECT into temporary table "tab2" - */ - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, tab2, 0); - assert( p->addrOpenEphm[1] == -1 ); - p->addrOpenEphm[1] = addr; - p->pPrior = 0; - pLimit = p->pLimit; - p->pLimit = 0; - pOffset = p->pOffset; - p->pOffset = 0; - intersectdest.iSDParm = tab2; - explainSetInteger(iSub2, pParse->iNextSelectId); - rc = sqlite3Select(pParse, p, &intersectdest); - testcase( rc!=SQLITE_OK ); - pDelete = p->pPrior; - p->pPrior = pPrior; - if( p->nSelectRow>pPrior->nSelectRow ) p->nSelectRow = pPrior->nSelectRow; - sqlite3ExprDelete(db, p->pLimit); - p->pLimit = pLimit; - p->pOffset = pOffset; - - /* Generate code to take the intersection of the two temporary - ** tables. - */ - assert( p->pEList ); - if( dest.eDest==SRT_Output ){ - Select *pFirst = p; - while( pFirst->pPrior ) pFirst = pFirst->pPrior; - generateColumnNames(pParse, 0, pFirst->pEList); - } - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); - computeLimitRegisters(pParse, p, iBreak); - sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); - r1 = sqlite3GetTempReg(pParse); - iStart = sqlite3VdbeAddOp2(v, OP_RowKey, tab1, r1); - sqlite3VdbeAddOp4Int(v, OP_NotFound, tab2, iCont, r1, 0); VdbeCoverage(v); - sqlite3ReleaseTempReg(pParse, r1); - selectInnerLoop(pParse, p, p->pEList, tab1, - 0, 0, &dest, iCont, iBreak); - sqlite3VdbeResolveLabel(v, iCont); - sqlite3VdbeAddOp2(v, OP_Next, tab1, iStart); VdbeCoverage(v); - sqlite3VdbeResolveLabel(v, iBreak); - sqlite3VdbeAddOp2(v, OP_Close, tab2, 0); - sqlite3VdbeAddOp2(v, OP_Close, tab1, 0); - break; + + #ifndef SQLITE_OMIT_EXPLAIN + if( p->pNext==0 ){ + ExplainQueryPlanPop(pParse); } + #endif } - - explainComposite(pParse, p->op, iSub1, iSub2, p->op!=TK_ALL); - + /* Compute collating sequences used by ** temporary tables needed to implement the compound select. ** Attach the KeyInfo structure to all temporary tables. @@ -107784,7 +124130,7 @@ static int multiSelect( nCol = p->pEList->nExpr; pKeyInfo = sqlite3KeyInfoAlloc(db, nCol, 1); if( !pKeyInfo ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto multi_select_end; } for(i=0, apColl=pKeyInfo->aColl; i<nCol; i++, apColl++){ @@ -107820,6 +124166,19 @@ multi_select_end: } #endif /* SQLITE_OMIT_COMPOUND_SELECT */ +/* +** Error message for when two or more terms of a compound select have different +** size result sets. +*/ +SQLITE_PRIVATE void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p){ + if( p->selFlags & SF_Values ){ + sqlite3ErrorMsg(pParse, "all VALUES must have the same number of terms"); + }else{ + sqlite3ErrorMsg(pParse, "SELECTs to the left and right of %s" + " do not have the same number of result columns", selectOpName(p->op)); + } +} + /* ** Code an output subroutine for a coroutine implementation of a ** SELECT statment. @@ -107860,12 +124219,12 @@ static int generateOutputSubroutine( /* Suppress duplicates for UNION, EXCEPT, and INTERSECT */ if( regPrev ){ - int j1, j2; - j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); - j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, + int addr1, addr2; + addr1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); + addr2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); - sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2); VdbeCoverage(v); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeAddOp3(v, OP_Jump, addr2+2, iContinue, addr2+2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1); sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); } @@ -107875,15 +124234,14 @@ static int generateOutputSubroutine( */ codeOffset(v, p->iOffset, iContinue); + assert( pDest->eDest!=SRT_Exists ); + assert( pDest->eDest!=SRT_Table ); switch( pDest->eDest ){ /* Store the result as data using a unique key. */ - case SRT_Table: case SRT_EphemTab: { int r1 = sqlite3GetTempReg(pParse); int r2 = sqlite3GetTempReg(pParse); - testcase( pDest->eDest==SRT_Table ); - testcase( pDest->eDest==SRT_EphemTab ); sqlite3VdbeAddOp3(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, r1); sqlite3VdbeAddOp2(v, OP_NewRowid, pDest->iSDParm, r2); sqlite3VdbeAddOp3(v, OP_Insert, pDest->iSDParm, r1, r2); @@ -107894,39 +124252,27 @@ static int generateOutputSubroutine( } #ifndef SQLITE_OMIT_SUBQUERY - /* If we are creating a set for an "expr IN (SELECT ...)" construct, - ** then there should be a single item on the stack. Write this - ** item into the set table with bogus data. + /* If we are creating a set for an "expr IN (SELECT ...)". */ case SRT_Set: { int r1; - assert( pIn->nSdst==1 ); - pDest->affSdst = - sqlite3CompareAffinity(p->pEList->a[0].pExpr, pDest->affSdst); + testcase( pIn->nSdst>1 ); r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, 1, r1, &pDest->affSdst,1); - sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, 1); - sqlite3VdbeAddOp2(v, OP_IdxInsert, pDest->iSDParm, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, pIn->iSdst, pIn->nSdst, + r1, pDest->zAffSdst, pIn->nSdst); + sqlite3ExprCacheAffinityChange(pParse, pIn->iSdst, pIn->nSdst); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pDest->iSDParm, r1, + pIn->iSdst, pIn->nSdst); sqlite3ReleaseTempReg(pParse, r1); break; } -#if 0 /* Never occurs on an ORDER BY query */ - /* If any row exist in the result set, record that fact and abort. - */ - case SRT_Exists: { - sqlite3VdbeAddOp2(v, OP_Integer, 1, pDest->iSDParm); - /* The LIMIT clause will terminate the loop for us */ - break; - } -#endif - /* If this is a scalar select that is part of an expression, then ** store the results in the appropriate memory cell and break out ** of the scan loop. */ case SRT_Mem: { - assert( pIn->nSdst==1 ); + assert( pIn->nSdst==1 || pParse->nErr>0 ); testcase( pIn->nSdst!=1 ); sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1); /* The LIMIT clause will jump out of the loop for us */ break; @@ -107941,7 +124287,7 @@ static int generateOutputSubroutine( pDest->iSdst = sqlite3GetTempRange(pParse, pIn->nSdst); pDest->nSdst = pIn->nSdst; } - sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSdst, pDest->nSdst); + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSdst, pIn->nSdst); sqlite3VdbeAddOp1(v, OP_Yield, pDest->iSDParm); break; } @@ -107965,7 +124311,7 @@ static int generateOutputSubroutine( /* Jump to the end of the loop if the LIMIT is reached. */ if( p->iLimit ){ - sqlite3VdbeAddOp3(v, OP_IfZero, p->iLimit, iBreak, -1); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, p->iLimit, iBreak); VdbeCoverage(v); } /* Generate the subroutine return @@ -108093,7 +124439,7 @@ static int multiSelectOrderBy( int savedOffset; /* Saved value of p->iOffset */ int labelCmpr; /* Label for the start of the merge algorithm */ int labelEnd; /* Label for the end of the overall SELECT stmt */ - int j1; /* Jump instructions that get retargetted */ + int addr1; /* Jump instructions that get retargetted */ int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */ KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */ KeyInfo *pKeyMerge; /* Comparison information for merging rows */ @@ -108101,10 +124447,6 @@ static int multiSelectOrderBy( ExprList *pOrderBy; /* The ORDER BY clause */ int nOrderBy; /* Number of terms in the ORDER BY clause */ int *aPermute; /* Mapping from ORDER BY terms to result set columns */ -#ifndef SQLITE_OMIT_EXPLAIN - int iSub1; /* EQP id of left-hand query */ - int iSub2; /* EQP id of right-hand query */ -#endif assert( p->pOrderBy!=0 ); assert( pKeyDup==0 ); /* "Managed" code needs this. Ticket #3382. */ @@ -108137,10 +124479,10 @@ static int multiSelectOrderBy( } if( j==nOrderBy ){ Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); - if( pNew==0 ) return SQLITE_NOMEM; + if( pNew==0 ) return SQLITE_NOMEM_BKPT; pNew->flags |= EP_IntValue; pNew->u.iValue = i; - pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew); + p->pOrderBy = pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew); if( pOrderBy ) pOrderBy->a[nOrderBy++].u.x.iOrderByCol = (u16)i; } } @@ -108153,12 +124495,13 @@ static int multiSelectOrderBy( ** to the right and the left are evaluated, they use the correct ** collation. */ - aPermute = sqlite3DbMallocRaw(db, sizeof(int)*nOrderBy); + aPermute = sqlite3DbMallocRawNN(db, sizeof(int)*(nOrderBy + 1)); if( aPermute ){ struct ExprList_item *pItem; - for(i=0, pItem=pOrderBy->a; i<nOrderBy; i++, pItem++){ - assert( pItem->u.x.iOrderByCol>0 - && pItem->u.x.iOrderByCol<=p->pEList->nExpr ); + aPermute[0] = nOrderBy; + for(i=1, pItem=pOrderBy->a; i<=nOrderBy; i++, pItem++){ + assert( pItem->u.x.iOrderByCol>0 ); + assert( pItem->u.x.iOrderByCol<=p->pEList->nExpr ); aPermute[i] = pItem->u.x.iOrderByCol - 1; } pKeyMerge = multiSelectOrderByKeyInfo(pParse, p, 1); @@ -108215,8 +124558,6 @@ static int multiSelectOrderBy( } sqlite3ExprDelete(db, p->pLimit); p->pLimit = 0; - sqlite3ExprDelete(db, p->pOffset); - p->pOffset = 0; regAddrA = ++pParse->nMem; regAddrB = ++pParse->nMem; @@ -108225,33 +124566,35 @@ static int multiSelectOrderBy( sqlite3SelectDestInit(&destA, SRT_Coroutine, regAddrA); sqlite3SelectDestInit(&destB, SRT_Coroutine, regAddrB); + ExplainQueryPlan((pParse, 1, "MERGE (%s)", selectOpName(p->op))); + /* Generate a coroutine to evaluate the SELECT statement to the ** left of the compound operator - the "A" select. */ addrSelectA = sqlite3VdbeCurrentAddr(v) + 1; - j1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); VdbeComment((v, "left SELECT")); pPrior->iLimit = regLimitA; - explainSetInteger(iSub1, pParse->iNextSelectId); + ExplainQueryPlan((pParse, 1, "LEFT")); sqlite3Select(pParse, pPrior, &destA); - sqlite3VdbeAddOp1(v, OP_EndCoroutine, regAddrA); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeEndCoroutine(v, regAddrA); + sqlite3VdbeJumpHere(v, addr1); /* Generate a coroutine to evaluate the SELECT statement on ** the right - the "B" select */ addrSelectB = sqlite3VdbeCurrentAddr(v) + 1; - j1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); VdbeComment((v, "right SELECT")); savedLimit = p->iLimit; savedOffset = p->iOffset; p->iLimit = regLimitB; p->iOffset = 0; - explainSetInteger(iSub2, pParse->iNextSelectId); + ExplainQueryPlan((pParse, 1, "RIGHT")); sqlite3Select(pParse, p, &destB); p->iLimit = savedLimit; p->iOffset = savedOffset; - sqlite3VdbeAddOp1(v, OP_EndCoroutine, regAddrB); + sqlite3VdbeEndCoroutine(v, regAddrB); /* Generate a subroutine that outputs the current row of the A ** select as the next output row of the compound select. @@ -108282,8 +124625,8 @@ static int multiSelectOrderBy( addrEofA = sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); addrEofA_noB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, labelEnd); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofA); - p->nSelectRow += pPrior->nSelectRow; + sqlite3VdbeGoto(v, addrEofA); + p->nSelectRow = sqlite3LogEstAdd(p->nSelectRow, pPrior->nSelectRow); } /* Generate a subroutine to run when the results from select B @@ -108296,7 +124639,7 @@ static int multiSelectOrderBy( VdbeNoopComment((v, "eof-B subroutine")); addrEofB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, labelEnd); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEofB); + sqlite3VdbeGoto(v, addrEofB); } /* Generate code to handle the case of A<B @@ -108304,7 +124647,7 @@ static int multiSelectOrderBy( VdbeNoopComment((v, "A-lt-B subroutine")); addrAltB = sqlite3VdbeAddOp2(v, OP_Gosub, regOutA, addrOutA); sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); + sqlite3VdbeGoto(v, labelCmpr); /* Generate code to handle the case of A==B */ @@ -108317,7 +124660,7 @@ static int multiSelectOrderBy( VdbeNoopComment((v, "A-eq-B subroutine")); addrAeqB = sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); + sqlite3VdbeGoto(v, labelCmpr); } /* Generate code to handle the case of A>B @@ -108328,11 +124671,11 @@ static int multiSelectOrderBy( sqlite3VdbeAddOp2(v, OP_Gosub, regOutB, addrOutB); } sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Goto, 0, labelCmpr); + sqlite3VdbeGoto(v, labelCmpr); /* This code runs once to initialize everything. */ - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA_noB); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); @@ -108349,14 +124692,6 @@ static int multiSelectOrderBy( */ sqlite3VdbeResolveLabel(v, labelEnd); - /* Set the number of output columns - */ - if( pDest->eDest==SRT_Output ){ - Select *pFirst = pPrior; - while( pFirst->pPrior ) pFirst = pFirst->pPrior; - generateColumnNames(pParse, 0, pFirst->pEList); - } - /* Reassembly the compound query so that it will be freed correctly ** by the calling function */ if( p->pPrior ){ @@ -108367,15 +124702,30 @@ static int multiSelectOrderBy( /*** TBD: Insert subroutine calls to close cursors on incomplete **** subqueries ****/ - explainComposite(pParse, p->op, iSub1, iSub2, 0); - return SQLITE_OK; + ExplainQueryPlanPop(pParse); + return pParse->nErr!=0; } #endif #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + +/* An instance of the SubstContext object describes an substitution edit +** to be performed on a parse tree. +** +** All references to columns in table iTable are to be replaced by corresponding +** expressions in pEList. +*/ +typedef struct SubstContext { + Parse *pParse; /* The parsing context */ + int iTable; /* Replace references to this table */ + int iNewTable; /* New table number */ + int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ + ExprList *pEList; /* Replacement expressions */ +} SubstContext; + /* Forward Declarations */ -static void substExprList(sqlite3*, ExprList*, int, ExprList*); -static void substSelect(sqlite3*, Select *, int, ExprList *); +static void substExprList(SubstContext*, ExprList*); +static void substSelect(SubstContext*, Select*, int); /* ** Scan through the expression pExpr. Replace every reference to @@ -108386,74 +124736,100 @@ static void substSelect(sqlite3*, Select *, int, ExprList *); ** This routine is part of the flattening procedure. A subquery ** whose result set is defined by pEList appears as entry in the ** FROM clause of a SELECT such that the VDBE cursor assigned to that -** FORM clause entry is iTable. This routine make the necessary +** FORM clause entry is iTable. This routine makes the necessary ** changes to pExpr so that it refers directly to the source table ** of the subquery rather the result set of the subquery. */ static Expr *substExpr( - sqlite3 *db, /* Report malloc errors to this connection */ - Expr *pExpr, /* Expr in which substitution occurs */ - int iTable, /* Table to be substituted */ - ExprList *pEList /* Substitute expressions */ + SubstContext *pSubst, /* Description of the substitution */ + Expr *pExpr /* Expr in which substitution occurs */ ){ if( pExpr==0 ) return 0; - if( pExpr->op==TK_COLUMN && pExpr->iTable==iTable ){ + if( ExprHasProperty(pExpr, EP_FromJoin) + && pExpr->iRightJoinTable==pSubst->iTable + ){ + pExpr->iRightJoinTable = pSubst->iNewTable; + } + if( pExpr->op==TK_COLUMN && pExpr->iTable==pSubst->iTable ){ if( pExpr->iColumn<0 ){ pExpr->op = TK_NULL; }else{ Expr *pNew; - assert( pEList!=0 && pExpr->iColumn<pEList->nExpr ); + Expr *pCopy = pSubst->pEList->a[pExpr->iColumn].pExpr; + Expr ifNullRow; + assert( pSubst->pEList!=0 && pExpr->iColumn<pSubst->pEList->nExpr ); assert( pExpr->pLeft==0 && pExpr->pRight==0 ); - pNew = sqlite3ExprDup(db, pEList->a[pExpr->iColumn].pExpr, 0); - sqlite3ExprDelete(db, pExpr); - pExpr = pNew; + if( sqlite3ExprIsVector(pCopy) ){ + sqlite3VectorErrorMsg(pSubst->pParse, pCopy); + }else{ + sqlite3 *db = pSubst->pParse->db; + if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){ + memset(&ifNullRow, 0, sizeof(ifNullRow)); + ifNullRow.op = TK_IF_NULL_ROW; + ifNullRow.pLeft = pCopy; + ifNullRow.iTable = pSubst->iNewTable; + pCopy = &ifNullRow; + } + pNew = sqlite3ExprDup(db, pCopy, 0); + if( pNew && pSubst->isLeftJoin ){ + ExprSetProperty(pNew, EP_CanBeNull); + } + if( pNew && ExprHasProperty(pExpr,EP_FromJoin) ){ + pNew->iRightJoinTable = pExpr->iRightJoinTable; + ExprSetProperty(pNew, EP_FromJoin); + } + sqlite3ExprDelete(db, pExpr); + pExpr = pNew; + } } }else{ - pExpr->pLeft = substExpr(db, pExpr->pLeft, iTable, pEList); - pExpr->pRight = substExpr(db, pExpr->pRight, iTable, pEList); + if( pExpr->op==TK_IF_NULL_ROW && pExpr->iTable==pSubst->iTable ){ + pExpr->iTable = pSubst->iNewTable; + } + pExpr->pLeft = substExpr(pSubst, pExpr->pLeft); + pExpr->pRight = substExpr(pSubst, pExpr->pRight); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - substSelect(db, pExpr->x.pSelect, iTable, pEList); + substSelect(pSubst, pExpr->x.pSelect, 1); }else{ - substExprList(db, pExpr->x.pList, iTable, pEList); + substExprList(pSubst, pExpr->x.pList); } } return pExpr; } static void substExprList( - sqlite3 *db, /* Report malloc errors here */ - ExprList *pList, /* List to scan and in which to make substitutes */ - int iTable, /* Table to be substituted */ - ExprList *pEList /* Substitute values */ + SubstContext *pSubst, /* Description of the substitution */ + ExprList *pList /* List to scan and in which to make substitutes */ ){ int i; if( pList==0 ) return; for(i=0; i<pList->nExpr; i++){ - pList->a[i].pExpr = substExpr(db, pList->a[i].pExpr, iTable, pEList); + pList->a[i].pExpr = substExpr(pSubst, pList->a[i].pExpr); } } static void substSelect( - sqlite3 *db, /* Report malloc errors here */ - Select *p, /* SELECT statement in which to make substitutions */ - int iTable, /* Table to be replaced */ - ExprList *pEList /* Substitute values */ + SubstContext *pSubst, /* Description of the substitution */ + Select *p, /* SELECT statement in which to make substitutions */ + int doPrior /* Do substitutes on p->pPrior too */ ){ SrcList *pSrc; struct SrcList_item *pItem; int i; if( !p ) return; - substExprList(db, p->pEList, iTable, pEList); - substExprList(db, p->pGroupBy, iTable, pEList); - substExprList(db, p->pOrderBy, iTable, pEList); - p->pHaving = substExpr(db, p->pHaving, iTable, pEList); - p->pWhere = substExpr(db, p->pWhere, iTable, pEList); - substSelect(db, p->pPrior, iTable, pEList); - pSrc = p->pSrc; - assert( pSrc ); /* Even for (SELECT 1) we have: pSrc!=0 but pSrc->nSrc==0 */ - if( ALWAYS(pSrc) ){ + do{ + substExprList(pSubst, p->pEList); + substExprList(pSubst, p->pGroupBy); + substExprList(pSubst, p->pOrderBy); + p->pHaving = substExpr(pSubst, p->pHaving); + p->pWhere = substExpr(pSubst, p->pWhere); + pSrc = p->pSrc; + assert( pSrc!=0 ); for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ - substSelect(db, pItem->pSelect, iTable, pEList); + substSelect(pSubst, pItem->pSelect, 1); + if( pItem->fg.isTabFunc ){ + substExprList(pSubst, pItem->u1.pFuncArg); + } } - } + }while( doPrior && (p = p->pPrior)!=0 ); } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ @@ -108484,63 +124860,74 @@ static void substSelect( ** exist on the table t1, a complete scan of the data might be ** avoided. ** -** Flattening is only attempted if all of the following are true: +** Flattening is subject to the following constraints: ** -** (1) The subquery and the outer query do not both use aggregates. +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** The subquery and the outer query cannot both be aggregates. ** -** (2) The subquery is not an aggregate or the outer query is not a join. +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** (2) If the subquery is an aggregate then +** (2a) the outer query must not be a join and +** (2b) the outer query must not use subqueries +** other than the one FROM-clause subquery that is a candidate +** for flattening. (This is due to ticket [2f7170d73bf9abf80] +** from 2015-02-09.) ** -** (3) The subquery is not the right operand of a left outer join -** (Originally ticket #306. Strengthened by ticket #3300) +** (3) If the subquery is the right operand of a LEFT JOIN then +** (3a) the subquery may not be a join and +** (3b) the FROM clause of the subquery may not contain a virtual +** table and +** (3c) the outer query may not be an aggregate. ** -** (4) The subquery is not DISTINCT. +** (4) The subquery can not be DISTINCT. ** ** (**) At one point restrictions (4) and (5) defined a subset of DISTINCT ** sub-queries that were excluded from this optimization. Restriction ** (4) has since been expanded to exclude all DISTINCT subqueries. ** -** (6) The subquery does not use aggregates or the outer query is not -** DISTINCT. +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** If the subquery is aggregate, the outer query may not be DISTINCT. ** -** (7) The subquery has a FROM clause. TODO: For subqueries without -** A FROM clause, consider adding a FROM close with the special +** (7) The subquery must have a FROM clause. TODO: For subqueries without +** A FROM clause, consider adding a FROM clause with the special ** table sqlite_once that consists of a single row containing a ** single NULL. ** -** (8) The subquery does not use LIMIT or the outer query is not a join. +** (8) If the subquery uses LIMIT then the outer query may not be a join. ** -** (9) The subquery does not use LIMIT or the outer query does not use -** aggregates. +** (9) If the subquery uses LIMIT then the outer query may not be aggregate. ** ** (**) Restriction (10) was removed from the code on 2005-02-05 but we ** accidently carried the comment forward until 2014-09-15. Original -** text: "The subquery does not use aggregates or the outer query does not -** use LIMIT." +** constraint: "If the subquery is aggregate then the outer query +** may not use LIMIT." ** -** (11) The subquery and the outer query do not both have ORDER BY clauses. +** (11) The subquery and the outer query may not both have ORDER BY clauses. ** ** (**) Not implemented. Subsumed into restriction (3). Was previously ** a separate restriction deriving from ticket #350. ** -** (13) The subquery and outer query do not both use LIMIT. +** (13) The subquery and outer query may not both use LIMIT. ** -** (14) The subquery does not use OFFSET. +** (14) The subquery may not use OFFSET. ** -** (15) The outer query is not part of a compound select or the -** subquery does not have a LIMIT clause. +** (15) If the outer query is part of a compound select, then the +** subquery may not use LIMIT. ** (See ticket #2339 and ticket [02a8e81d44]). ** -** (16) The outer query is not an aggregate or the subquery does -** not contain ORDER BY. (Ticket #2942) This used to not matter +** (16) If the outer query is aggregate, then the subquery may not +** use ORDER BY. (Ticket #2942) This used to not matter ** until we introduced the group_concat() function. ** -** (17) The sub-query is not a compound select, or it is a UNION ALL -** compound clause made up entirely of non-aggregate queries, and -** the parent query: -** -** * is not itself part of a compound select, -** * is not an aggregate or DISTINCT query, and -** * is not a join +** (17) If the subquery is a compound select, then +** (17a) all compound operators must be a UNION ALL, and +** (17b) no terms within the subquery compound may be aggregate +** or DISTINCT, and +** (17c) every term within the subquery compound must have a FROM clause +** (17d) the outer query may not be +** (17d1) aggregate, or +** (17d2) DISTINCT, or +** (17d3) a join. ** ** The parent and sub-query may contain WHERE clauses. Subject to ** rules (11), (13) and (14), they may also contain ORDER BY, @@ -108556,10 +124943,10 @@ static void substSelect( ** syntax error and return a detailed message. ** ** (18) If the sub-query is a compound select, then all terms of the -** ORDER by clause of the parent must be simple references to +** ORDER BY clause of the parent must be simple references to ** columns of the sub-query. ** -** (19) The subquery does not use LIMIT or the outer query does not +** (19) If the subquery uses LIMIT then the outer query may not ** have a WHERE clause. ** ** (20) If the sub-query is a compound select, then it must not use @@ -108568,17 +124955,19 @@ static void substSelect( ** appear as unmodified result columns in the outer query. But we ** have other optimizations in mind to deal with that case. ** -** (21) The subquery does not use LIMIT or the outer query is not +** (21) If the subquery uses LIMIT then the outer query may not be ** DISTINCT. (See ticket [752e1646fc]). ** -** (22) The subquery is not a recursive CTE. +** (22) The subquery may not be a recursive CTE. ** -** (23) The parent is not a recursive CTE, or the sub-query is not a -** compound query. This restriction is because transforming the +** (**) Subsumed into restriction (17d3). Was: If the outer query is +** a recursive CTE, then the sub-query may not be a compound query. +** This restriction is because transforming the ** parent to a compound query confuses the code that handles ** recursive queries in multiSelect(). ** -** (24) The subquery is not an aggregate that uses the built-in min() or +** (**) We no longer attempt to flatten aggregate subqueries. Was: +** The subquery may not be an aggregate that uses the built-in min() or ** or max() functions. (Without this restriction, a query like: ** "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily ** return the value X for which Y was maximal.) @@ -108586,7 +124975,7 @@ static void substSelect( ** ** In this routine, the "p" parameter is a pointer to the outer query. ** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query -** uses aggregates and subqueryIsAgg is true if the subquery uses aggregates. +** uses aggregates. ** ** If flattening is not attempted, this routine is a no-op and returns 0. ** If flattening is attempted this routine returns 1. @@ -108598,17 +124987,17 @@ static int flattenSubquery( Parse *pParse, /* Parsing context */ Select *p, /* The parent or outer SELECT statement */ int iFrom, /* Index in p->pSrc->a[] of the inner subquery */ - int isAgg, /* True if outer SELECT uses aggregate functions */ - int subqueryIsAgg /* True if the subquery uses aggregate functions */ + int isAgg /* True if outer SELECT uses aggregate functions */ ){ const char *zSavedAuthContext = pParse->zAuthContext; - Select *pParent; + Select *pParent; /* Current UNION ALL term of the other query */ Select *pSub; /* The inner query or "subquery" */ Select *pSub1; /* Pointer to the rightmost select in sub-query */ SrcList *pSrc; /* The FROM clause of the outer query */ SrcList *pSubSrc; /* The FROM clause of the subquery */ - ExprList *pList; /* The result set of the outer query */ int iParent; /* VDBE cursor number of the pSub result set temp table */ + int iNewParent = -1;/* Replacement table for iParent */ + int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ int i; /* Loop counter */ Expr *pWhere; /* The WHERE clause */ struct SrcList_item *pSubitem; /* The subquery */ @@ -108617,7 +125006,7 @@ static int flattenSubquery( /* Check to see if flattening is permitted. Return 0 if not. */ assert( p!=0 ); - assert( p->pPrior==0 ); /* Unable to flatten compound queries */ + assert( p->pPrior==0 ); if( OptimizationDisabled(db, SQLITE_QueryFlattener) ) return 0; pSrc = p->pSrc; assert( pSrc && iFrom>=0 && iFrom<pSrc->nSrc ); @@ -108625,8 +125014,7 @@ static int flattenSubquery( iParent = pSubitem->iCursor; pSub = pSubitem->pSelect; assert( pSub!=0 ); - if( isAgg && subqueryIsAgg ) return 0; /* Restriction (1) */ - if( subqueryIsAgg && pSrc->nSrc>1 ) return 0; /* Restriction (2) */ + pSubSrc = pSub->pSrc; assert( pSubSrc ); /* Prior to version 3.1.2, when LIMIT and OFFSET had to be simple constants, @@ -108635,18 +125023,15 @@ static int flattenSubquery( ** became arbitrary expressions, we were forced to add restrictions (13) ** and (14). */ if( pSub->pLimit && p->pLimit ) return 0; /* Restriction (13) */ - if( pSub->pOffset ) return 0; /* Restriction (14) */ + if( pSub->pLimit && pSub->pLimit->pRight ) return 0; /* Restriction (14) */ if( (p->selFlags & SF_Compound)!=0 && pSub->pLimit ){ return 0; /* Restriction (15) */ } if( pSubSrc->nSrc==0 ) return 0; /* Restriction (7) */ - if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (5) */ + if( pSub->selFlags & SF_Distinct ) return 0; /* Restriction (4) */ if( pSub->pLimit && (pSrc->nSrc>1 || isAgg) ){ return 0; /* Restrictions (8)(9) */ } - if( (p->selFlags & SF_Distinct)!=0 && subqueryIsAgg ){ - return 0; /* Restriction (6) */ - } if( p->pOrderBy && pSub->pOrderBy ){ return 0; /* Restriction (11) */ } @@ -108655,19 +125040,14 @@ static int flattenSubquery( if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){ return 0; /* Restriction (21) */ } - testcase( pSub->selFlags & SF_Recursive ); - testcase( pSub->selFlags & SF_MinMaxAgg ); - if( pSub->selFlags & (SF_Recursive|SF_MinMaxAgg) ){ - return 0; /* Restrictions (22) and (24) */ - } - if( (p->selFlags & SF_Recursive) && pSub->pPrior ){ - return 0; /* Restriction (23) */ + if( pSub->selFlags & (SF_Recursive) ){ + return 0; /* Restrictions (22) */ } - /* OBSOLETE COMMENT 1: - ** Restriction 3: If the subquery is a join, make sure the subquery is - ** not used as the right operand of an outer join. Examples of why this - ** is not allowed: + /* + ** If the subquery is the right operand of a LEFT JOIN, then the + ** subquery may not be a join itself (3a). Example of why this is not + ** allowed: ** ** t1 LEFT OUTER JOIN (t2 JOIN t3) ** @@ -108677,56 +125057,57 @@ static int flattenSubquery( ** ** which is not at all the same thing. ** - ** OBSOLETE COMMENT 2: - ** Restriction 12: If the subquery is the right operand of a left outer - ** join, make sure the subquery has no WHERE clause. - ** An examples of why this is not allowed: + ** If the subquery is the right operand of a LEFT JOIN, then the outer + ** query cannot be an aggregate. (3c) This is an artifact of the way + ** aggregates are processed - there is no mechanism to determine if + ** the LEFT JOIN table should be all-NULL. ** - ** t1 LEFT OUTER JOIN (SELECT * FROM t2 WHERE t2.x>0) - ** - ** If we flatten the above, we would get - ** - ** (t1 LEFT OUTER JOIN t2) WHERE t2.x>0 - ** - ** But the t2.x>0 test will always fail on a NULL row of t2, which - ** effectively converts the OUTER JOIN into an INNER JOIN. - ** - ** THIS OVERRIDES OBSOLETE COMMENTS 1 AND 2 ABOVE: - ** Ticket #3300 shows that flattening the right term of a LEFT JOIN - ** is fraught with danger. Best to avoid the whole thing. If the - ** subquery is the right term of a LEFT JOIN, then do not flatten. + ** See also tickets #306, #350, and #3300. */ - if( (pSubitem->jointype & JT_OUTER)!=0 ){ - return 0; + if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){ + isLeftJoin = 1; + if( pSubSrc->nSrc>1 || isAgg || IsVirtual(pSubSrc->a[0].pTab) ){ + /* (3a) (3c) (3b) */ + return 0; + } } +#ifdef SQLITE_EXTRA_IFNULLROW + else if( iFrom>0 && !isAgg ){ + /* Setting isLeftJoin to -1 causes OP_IfNullRow opcodes to be generated for + ** every reference to any result column from subquery in a join, even + ** though they are not necessary. This will stress-test the OP_IfNullRow + ** opcode. */ + isLeftJoin = -1; + } +#endif - /* Restriction 17: If the sub-query is a compound SELECT, then it must + /* Restriction (17): If the sub-query is a compound SELECT, then it must ** use only the UNION ALL operator. And none of the simple select queries ** that make up the compound SELECT are allowed to be aggregate or distinct ** queries. */ if( pSub->pPrior ){ if( pSub->pOrderBy ){ - return 0; /* Restriction 20 */ + return 0; /* Restriction (20) */ } if( isAgg || (p->selFlags & SF_Distinct)!=0 || pSrc->nSrc!=1 ){ - return 0; + return 0; /* (17d1), (17d2), or (17d3) */ } for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); assert( pSub->pSrc!=0 ); - if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 - || (pSub1->pPrior && pSub1->op!=TK_ALL) - || pSub1->pSrc->nSrc<1 - || pSub->pEList->nExpr!=pSub1->pEList->nExpr + assert( pSub->pEList->nExpr==pSub1->pEList->nExpr ); + if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 /* (17b) */ + || (pSub1->pPrior && pSub1->op!=TK_ALL) /* (17a) */ + || pSub1->pSrc->nSrc<1 /* (17c) */ ){ return 0; } testcase( pSub1->pSrc->nSrc>1 ); } - /* Restriction 18. */ + /* Restriction (18). */ if( p->pOrderBy ){ int ii; for(ii=0; ii<p->pOrderBy->nExpr; ii++){ @@ -108735,6 +125116,14 @@ static int flattenSubquery( } } + /* Ex-restriction (23): + ** The only way that the recursive part of a CTE can contain a compound + ** subquery is for the subquery to be one term of a join. But if the + ** subquery is a join, then the flattening has already been stopped by + ** restriction (17d3) + */ + assert( (p->selFlags & SF_Recursive)==0 || pSub->pPrior==0 ); + /***** If we reach this point, flattening is permitted. *****/ SELECTTRACE(1,pParse,p,("flatten %s.%p from term %d\n", pSub->zSelName, pSub, iFrom)); @@ -108782,16 +125171,13 @@ static int flattenSubquery( Select *pNew; ExprList *pOrderBy = p->pOrderBy; Expr *pLimit = p->pLimit; - Expr *pOffset = p->pOffset; Select *pPrior = p->pPrior; p->pOrderBy = 0; p->pSrc = 0; p->pPrior = 0; p->pLimit = 0; - p->pOffset = 0; pNew = sqlite3SelectDup(db, p, 0); sqlite3SelectSetName(pNew, pSub->zSelName); - p->pOffset = pOffset; p->pLimit = pLimit; p->pOrderBy = pOrderBy; p->pSrc = pSrc; @@ -108803,9 +125189,8 @@ static int flattenSubquery( if( pPrior ) pPrior->pNext = pNew; pNew->pNext = p; p->pPrior = pNew; - SELECTTRACE(2,pParse,p, - ("compound-subquery flattener creates %s.%p as peer\n", - pNew->zSelName, pNew)); + SELECTTRACE(2,pParse,p,("compound-subquery flattener" + " creates %s.%p as peer\n",pNew->zSelName, pNew)); } if( db->mallocFailed ) return 1; } @@ -108835,12 +125220,12 @@ static int flattenSubquery( */ if( ALWAYS(pSubitem->pTab!=0) ){ Table *pTabToDel = pSubitem->pTab; - if( pTabToDel->nRef==1 ){ + if( pTabToDel->nTabRef==1 ){ Parse *pToplevel = sqlite3ParseToplevel(pParse); pTabToDel->pNextZombie = pToplevel->pZombieTab; pToplevel->pZombieTab = pTabToDel; }else{ - pTabToDel->nRef--; + pTabToDel->nTabRef--; } pSubitem->pTab = 0; } @@ -108867,7 +125252,7 @@ static int flattenSubquery( if( pSrc ){ assert( pParent==p ); /* First time through the loop */ - jointype = pSubitem->jointype; + jointype = pSubitem->fg.jointype; }else{ assert( pParent!=p ); /* 2nd and subsequent times through the loop */ pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); @@ -108888,9 +125273,9 @@ static int flattenSubquery( ** ** The outer query has 3 slots in its FROM clause. One slot of the ** outer query (the middle slot) is used by the subquery. The next - ** block of code will expand the out query to 4 slots. The middle - ** slot is expanded to two slots in order to make space for the - ** two elements in the FROM clause of the subquery. + ** block of code will expand the outer query FROM clause to 4 slots. + ** The middle slot is expanded to two slots in order to make space + ** for the two elements in the FROM clause of the subquery. */ if( nSubSrc>1 ){ pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); @@ -108904,10 +125289,12 @@ static int flattenSubquery( */ for(i=0; i<nSubSrc; i++){ sqlite3IdListDelete(db, pSrc->a[i+iFrom].pUsing); + assert( pSrc->a[i+iFrom].fg.isTabFunc==0 ); pSrc->a[i+iFrom] = pSubSrc->a[i]; + iNewParent = pSubSrc->a[i].iCursor; memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); } - pSrc->a[iFrom].jointype = jointype; + pSrc->a[iFrom].fg.jointype = jointype; /* Now begin substituting subquery result set expressions for ** references to the iParent in the outer query. @@ -108921,19 +125308,6 @@ static int flattenSubquery( ** We look at every expression in the outer query and every place we see ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". */ - pList = pParent->pEList; - for(i=0; i<pList->nExpr; i++){ - if( pList->a[i].zName==0 ){ - char *zName = sqlite3DbStrDup(db, pList->a[i].zSpan); - sqlite3Dequote(zName); - pList->a[i].zName = zName; - } - } - substExprList(db, pParent->pEList, iParent, pSub->pEList); - if( isAgg ){ - substExprList(db, pParent->pGroupBy, iParent, pSub->pEList); - pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList); - } if( pSub->pOrderBy ){ /* At this point, any non-zero iOrderByCol values indicate that the ** ORDER BY column expression is identical to the iOrderByCol'th @@ -108950,29 +125324,22 @@ static int flattenSubquery( pOrderBy->a[i].u.x.iOrderByCol = 0; } assert( pParent->pOrderBy==0 ); - assert( pSub->pPrior==0 ); pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; - }else if( pParent->pOrderBy ){ - substExprList(db, pParent->pOrderBy, iParent, pSub->pEList); } - if( pSub->pWhere ){ - pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); - }else{ - pWhere = 0; + pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); + if( isLeftJoin>0 ){ + setJoinExpr(pWhere, iNewParent); } - if( subqueryIsAgg ){ - assert( pParent->pHaving==0 ); - pParent->pHaving = pParent->pWhere; - pParent->pWhere = pWhere; - pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList); - pParent->pHaving = sqlite3ExprAnd(db, pParent->pHaving, - sqlite3ExprDup(db, pSub->pHaving, 0)); - assert( pParent->pGroupBy==0 ); - pParent->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy, 0); - }else{ - pParent->pWhere = substExpr(db, pParent->pWhere, iParent, pSub->pEList); - pParent->pWhere = sqlite3ExprAnd(db, pParent->pWhere, pWhere); + pParent->pWhere = sqlite3ExprAnd(db, pWhere, pParent->pWhere); + if( db->mallocFailed==0 ){ + SubstContext x; + x.pParse = pParse; + x.iTable = iParent; + x.iNewTable = iNewParent; + x.isLeftJoin = isLeftJoin; + x.pEList = pSub->pEList; + substSelect(&x, pParent, 0); } /* The flattened query is distinct if either the inner or the @@ -108999,7 +125366,7 @@ static int flattenSubquery( #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x100 ){ - sqlite3DebugPrintf("After flattening:\n"); + SELECTTRACE(0x100,pParse,p,("After flattening:\n")); sqlite3TreeViewSelect(0, p, 0); } #endif @@ -109008,43 +125375,163 @@ static int flattenSubquery( } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) /* -** Based on the contents of the AggInfo structure indicated by the first -** argument, this function checks if the following are true: +** Make copies of relevant WHERE clause terms of the outer query into +** the WHERE clause of subquery. Example: ** -** * the query contains just a single aggregate function, -** * the aggregate function is either min() or max(), and -** * the argument to the aggregate function is a column value. +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1) WHERE x=5 AND y=10; ** -** If all of the above are true, then WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX -** is returned as appropriate. Also, *ppMinMax is set to point to the -** list of arguments passed to the aggregate before returning. +** Transformed into: ** -** Or, if the conditions above are not met, *ppMinMax is set to 0 and -** WHERE_ORDERBY_NORMAL is returned. +** SELECT * FROM (SELECT a AS x, c-d AS y FROM t1 WHERE a=5 AND c-d=10) +** WHERE x=5 AND y=10; +** +** The hope is that the terms added to the inner query will make it more +** efficient. +** +** Do not attempt this optimization if: +** +** (1) (** This restriction was removed on 2017-09-29. We used to +** disallow this optimization for aggregate subqueries, but now +** it is allowed by putting the extra terms on the HAVING clause. +** The added HAVING clause is pointless if the subquery lacks +** a GROUP BY clause. But such a HAVING clause is also harmless +** so there does not appear to be any reason to add extra logic +** to suppress it. **) +** +** (2) The inner query is the recursive part of a common table expression. +** +** (3) The inner query has a LIMIT clause (since the changes to the WHERE +** close would change the meaning of the LIMIT). +** +** (4) The inner query is the right operand of a LEFT JOIN and the +** expression to be pushed down does not come from the ON clause +** on that LEFT JOIN. +** +** (5) The WHERE clause expression originates in the ON or USING clause +** of a LEFT JOIN where iCursor is not the right-hand table of that +** left join. An example: +** +** SELECT * +** FROM (SELECT 1 AS a1 UNION ALL SELECT 2) AS aa +** JOIN (SELECT 1 AS b2 UNION ALL SELECT 2) AS bb ON (a1=b2) +** LEFT JOIN (SELECT 8 AS c3 UNION ALL SELECT 9) AS cc ON (b2=2); +** +** The correct answer is three rows: (1,1,NULL),(2,2,8),(2,2,9). +** But if the (b2=2) term were to be pushed down into the bb subquery, +** then the (1,1,NULL) row would be suppressed. +** +** Return 0 if no changes are made and non-zero if one or more WHERE clause +** terms are duplicated into the subquery. */ -static u8 minMaxQuery(AggInfo *pAggInfo, ExprList **ppMinMax){ - int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ +static int pushDownWhereTerms( + Parse *pParse, /* Parse context (for malloc() and error reporting) */ + Select *pSubq, /* The subquery whose WHERE clause is to be augmented */ + Expr *pWhere, /* The WHERE clause of the outer query */ + int iCursor, /* Cursor number of the subquery */ + int isLeftJoin /* True if pSubq is the right term of a LEFT JOIN */ +){ + Expr *pNew; + int nChng = 0; + if( pWhere==0 ) return 0; + if( pSubq->selFlags & SF_Recursive ) return 0; /* restriction (2) */ - *ppMinMax = 0; - if( pAggInfo->nFunc==1 ){ - Expr *pExpr = pAggInfo->aFunc[0].pExpr; /* Aggregate function */ - ExprList *pEList = pExpr->x.pList; /* Arguments to agg function */ - - assert( pExpr->op==TK_AGG_FUNCTION ); - if( pEList && pEList->nExpr==1 && pEList->a[0].pExpr->op==TK_AGG_COLUMN ){ - const char *zFunc = pExpr->u.zToken; - if( sqlite3StrICmp(zFunc, "min")==0 ){ - eRet = WHERE_ORDERBY_MIN; - *ppMinMax = pEList; - }else if( sqlite3StrICmp(zFunc, "max")==0 ){ - eRet = WHERE_ORDERBY_MAX; - *ppMinMax = pEList; - } +#ifdef SQLITE_DEBUG + /* Only the first term of a compound can have a WITH clause. But make + ** sure no other terms are marked SF_Recursive in case something changes + ** in the future. + */ + { + Select *pX; + for(pX=pSubq; pX; pX=pX->pPrior){ + assert( (pX->selFlags & (SF_Recursive))==0 ); } } +#endif - assert( *ppMinMax==0 || (*ppMinMax)->nExpr==1 ); + if( pSubq->pLimit!=0 ){ + return 0; /* restriction (3) */ + } + while( pWhere->op==TK_AND ){ + nChng += pushDownWhereTerms(pParse, pSubq, pWhere->pRight, + iCursor, isLeftJoin); + pWhere = pWhere->pLeft; + } + if( isLeftJoin + && (ExprHasProperty(pWhere,EP_FromJoin)==0 + || pWhere->iRightJoinTable!=iCursor) + ){ + return 0; /* restriction (4) */ + } + if( ExprHasProperty(pWhere,EP_FromJoin) && pWhere->iRightJoinTable!=iCursor ){ + return 0; /* restriction (5) */ + } + if( sqlite3ExprIsTableConstant(pWhere, iCursor) ){ + nChng++; + while( pSubq ){ + SubstContext x; + pNew = sqlite3ExprDup(pParse->db, pWhere, 0); + unsetJoinExpr(pNew, -1); + x.pParse = pParse; + x.iTable = iCursor; + x.iNewTable = iCursor; + x.isLeftJoin = 0; + x.pEList = pSubq->pEList; + pNew = substExpr(&x, pNew); + if( pSubq->selFlags & SF_Aggregate ){ + pSubq->pHaving = sqlite3ExprAnd(pParse->db, pSubq->pHaving, pNew); + }else{ + pSubq->pWhere = sqlite3ExprAnd(pParse->db, pSubq->pWhere, pNew); + } + pSubq = pSubq->pPrior; + } + } + return nChng; +} +#endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ + +/* +** The pFunc is the only aggregate function in the query. Check to see +** if the query is a candidate for the min/max optimization. +** +** If the query is a candidate for the min/max optimization, then set +** *ppMinMax to be an ORDER BY clause to be used for the optimization +** and return either WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX depending on +** whether pFunc is a min() or max() function. +** +** If the query is not a candidate for the min/max optimization, return +** WHERE_ORDERBY_NORMAL (which must be zero). +** +** This routine must be called after aggregate functions have been +** located but before their arguments have been subjected to aggregate +** analysis. +*/ +static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ + int eRet = WHERE_ORDERBY_NORMAL; /* Return value */ + ExprList *pEList = pFunc->x.pList; /* Arguments to agg function */ + const char *zFunc; /* Name of aggregate function pFunc */ + ExprList *pOrderBy; + u8 sortOrder; + + assert( *ppMinMax==0 ); + assert( pFunc->op==TK_AGG_FUNCTION ); + if( pEList==0 || pEList->nExpr!=1 ) return eRet; + zFunc = pFunc->u.zToken; + if( sqlite3StrICmp(zFunc, "min")==0 ){ + eRet = WHERE_ORDERBY_MIN; + sortOrder = SQLITE_SO_ASC; + }else if( sqlite3StrICmp(zFunc, "max")==0 ){ + eRet = WHERE_ORDERBY_MAX; + sortOrder = SQLITE_SO_DESC; + }else{ + return eRet; + } + *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); + assert( pOrderBy!=0 || db->mallocFailed ); + if( pOrderBy ) pOrderBy->a[0].sortOrder = sortOrder; return eRet; } @@ -109091,20 +125578,20 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ ** pFrom->pIndex and return SQLITE_OK. */ SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *pParse, struct SrcList_item *pFrom){ - if( pFrom->pTab && pFrom->zIndex ){ + if( pFrom->pTab && pFrom->fg.isIndexedBy ){ Table *pTab = pFrom->pTab; - char *zIndex = pFrom->zIndex; + char *zIndexedBy = pFrom->u1.zIndexedBy; Index *pIdx; for(pIdx=pTab->pIndex; - pIdx && sqlite3StrICmp(pIdx->zName, zIndex); + pIdx && sqlite3StrICmp(pIdx->zName, zIndexedBy); pIdx=pIdx->pNext ); if( !pIdx ){ - sqlite3ErrorMsg(pParse, "no such index: %s", zIndex, 0); + sqlite3ErrorMsg(pParse, "no such index: %s", zIndexedBy, 0); pParse->checkSchema = 1; return SQLITE_ERROR; } - pFrom->pIndex = pIdx; + pFrom->pIBIndex = pIdx; } return SQLITE_OK; } @@ -109160,7 +125647,7 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ if( pNewSrc==0 ) return WRC_Abort; *pNew = *p; p->pSrc = pNewSrc; - p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ALL, 0)); + p->pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ASTERISK, 0)); p->op = TK_SELECT; p->pWhere = 0; pNew->pGroupBy = 0; @@ -109168,14 +125655,29 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ pNew->pOrderBy = 0; p->pPrior = 0; p->pNext = 0; + p->pWith = 0; p->selFlags &= ~SF_Compound; + assert( (p->selFlags & SF_Converted)==0 ); + p->selFlags |= SF_Converted; assert( pNew->pPrior!=0 ); pNew->pPrior->pNext = pNew; pNew->pLimit = 0; - pNew->pOffset = 0; return WRC_Continue; } +/* +** Check to see if the FROM clause term pFrom has table-valued function +** arguments. If it does, leave an error message in pParse and return +** non-zero, since pFrom is not allowed to be a table-valued function. +*/ +static int cannotBeFunction(Parse *pParse, struct SrcList_item *pFrom){ + if( pFrom->fg.isTabFunc ){ + sqlite3ErrorMsg(pParse, "'%s' is not a function", pFrom->zName); + return 1; + } + return 0; +} + #ifndef SQLITE_OMIT_CTE /* ** Argument pWith (which may be NULL) points to a linked list of nested @@ -109188,7 +125690,7 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ ** object that the returned CTE belongs to. */ static struct Cte *searchWith( - With *pWith, /* Current outermost WITH clause */ + With *pWith, /* Current innermost WITH clause */ struct SrcList_item *pItem, /* FROM clause element to resolve */ With **ppContext /* OUT: WITH clause return value belongs to */ ){ @@ -109219,11 +125721,12 @@ static struct Cte *searchWith( ** statement with which it is associated. */ SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){ - assert( bFree==0 || pParse->pWith==0 ); + assert( bFree==0 || (pParse->pWith==0 && pParse->pWithToFree==0) ); if( pWith ){ + assert( pParse->pWith!=pWith ); pWith->pOuter = pParse->pWith; pParse->pWith = pWith; - pParse->bFreeWith = bFree; + if( bFree ) pParse->pWithToFree = pWith; } } @@ -109262,25 +125765,26 @@ static int withExpand( int bMayRecursive; /* True if compound joined by UNION [ALL] */ With *pSavedWith; /* Initial value of pParse->pWith */ - /* If pCte->zErr is non-NULL at this point, then this is an illegal + /* If pCte->zCteErr is non-NULL at this point, then this is an illegal ** recursive reference to CTE pCte. Leave an error in pParse and return - ** early. If pCte->zErr is NULL, then this is not a recursive reference. + ** early. If pCte->zCteErr is NULL, then this is not a recursive reference. ** In this case, proceed. */ - if( pCte->zErr ){ - sqlite3ErrorMsg(pParse, pCte->zErr, pCte->zName); + if( pCte->zCteErr ){ + sqlite3ErrorMsg(pParse, pCte->zCteErr, pCte->zName); return SQLITE_ERROR; } + if( cannotBeFunction(pParse, pFrom) ) return SQLITE_ERROR; assert( pFrom->pTab==0 ); pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ) return WRC_Abort; - pTab->nRef = 1; + pTab->nTabRef = 1; pTab->zName = sqlite3DbStrDup(db, pCte->zName); pTab->iPKey = -1; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); - pTab->tabFlags |= TF_Ephemeral; + pTab->tabFlags |= TF_Ephemeral | TF_NoVisibleRowid; pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0); - if( db->mallocFailed ) return SQLITE_NOMEM; + if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; assert( pFrom->pSelect ); /* Check if this is a recursive CTE. */ @@ -109296,31 +125800,41 @@ static int withExpand( && 0==sqlite3StrICmp(pItem->zName, pCte->zName) ){ pItem->pTab = pTab; - pItem->isRecursive = 1; - pTab->nRef++; + pItem->fg.isRecursive = 1; + pTab->nTabRef++; pSel->selFlags |= SF_Recursive; } } } /* Only one recursive reference is permitted. */ - if( pTab->nRef>2 ){ + if( pTab->nTabRef>2 ){ sqlite3ErrorMsg( pParse, "multiple references to recursive table: %s", pCte->zName ); return SQLITE_ERROR; } - assert( pTab->nRef==1 || ((pSel->selFlags&SF_Recursive) && pTab->nRef==2 )); + assert( pTab->nTabRef==1 || + ((pSel->selFlags&SF_Recursive) && pTab->nTabRef==2 )); - pCte->zErr = "circular reference: %s"; + pCte->zCteErr = "circular reference: %s"; pSavedWith = pParse->pWith; pParse->pWith = pWith; - sqlite3WalkSelect(pWalker, bMayRecursive ? pSel->pPrior : pSel); + if( bMayRecursive ){ + Select *pPrior = pSel->pPrior; + assert( pPrior->pWith==0 ); + pPrior->pWith = pSel->pWith; + sqlite3WalkSelect(pWalker, pPrior); + pPrior->pWith = 0; + }else{ + sqlite3WalkSelect(pWalker, pSel); + } + pParse->pWith = pWith; for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); pEList = pLeft->pEList; if( pCte->pCols ){ - if( pEList->nExpr!=pCte->pCols->nExpr ){ + if( pEList && pEList->nExpr!=pCte->pCols->nExpr ){ sqlite3ErrorMsg(pParse, "table %s has %d values for %d columns", pCte->zName, pEList->nExpr, pCte->pCols->nExpr ); @@ -109330,16 +125844,16 @@ static int withExpand( pEList = pCte->pCols; } - selectColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); + sqlite3ColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); if( bMayRecursive ){ if( pSel->selFlags & SF_Recursive ){ - pCte->zErr = "multiple recursive references: %s"; + pCte->zCteErr = "multiple recursive references: %s"; }else{ - pCte->zErr = "recursive reference in a subquery: %s"; + pCte->zCteErr = "recursive reference in a subquery: %s"; } sqlite3WalkSelect(pWalker, pSel); } - pCte->zErr = 0; + pCte->zCteErr = 0; pParse->pWith = pSavedWith; } @@ -109358,10 +125872,12 @@ static int withExpand( */ static void selectPopWith(Walker *pWalker, Select *p){ Parse *pParse = pWalker->pParse; - With *pWith = findRightmost(p)->pWith; - if( pWith!=0 ){ - assert( pParse->pWith==pWith ); - pParse->pWith = pWith->pOuter; + if( OK_IF_ALWAYS_TRUE(pParse->pWith) && p->pPrior==0 ){ + With *pWith = findRightmost(p)->pWith; + if( pWith!=0 ){ + assert( pParse->pWith==pWith ); + pParse->pWith = pWith->pOuter; + } } } #else @@ -109401,19 +125917,19 @@ static int selectExpander(Walker *pWalker, Select *p){ sqlite3 *db = pParse->db; Expr *pE, *pRight, *pExpr; u16 selFlags = p->selFlags; + u32 elistFlags = 0; p->selFlags |= SF_Expanded; if( db->mallocFailed ){ return WRC_Abort; } - if( NEVER(p->pSrc==0) || (selFlags & SF_Expanded)!=0 ){ + assert( p->pSrc!=0 ); + if( (selFlags & SF_Expanded)!=0 ){ return WRC_Prune; } pTabList = p->pSrc; pEList = p->pEList; - if( pWalker->xSelectCallback2==selectPopWith ){ - sqlite3WithPush(pParse, findRightmost(p)->pWith, 0); - } + sqlite3WithPush(pParse, p->pWith, 0); /* Make sure cursor numbers have been assigned to all entries in ** the FROM clause of the SELECT statement. @@ -109426,17 +125942,9 @@ static int selectExpander(Walker *pWalker, Select *p){ */ for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){ Table *pTab; - assert( pFrom->isRecursive==0 || pFrom->pTab ); - if( pFrom->isRecursive ) continue; - if( pFrom->pTab!=0 ){ - /* This statement has already been prepared. There is no need - ** to go further. */ - assert( i==0 ); -#ifndef SQLITE_OMIT_CTE - selectPopWith(pWalker, p); -#endif - return WRC_Prune; - } + assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 ); + if( pFrom->fg.isRecursive ) continue; + assert( pFrom->pTab==0 ); #ifndef SQLITE_OMIT_CTE if( withExpand(pWalker, pFrom) ) return WRC_Abort; if( pFrom->pTab ) {} else @@ -109447,13 +125955,17 @@ static int selectExpander(Walker *pWalker, Select *p){ /* A sub-query in the FROM clause of a SELECT */ assert( pSel!=0 ); assert( pFrom->pTab==0 ); - sqlite3WalkSelect(pWalker, pSel); + if( sqlite3WalkSelect(pWalker, pSel) ) return WRC_Abort; pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ) return WRC_Abort; - pTab->nRef = 1; - pTab->zName = sqlite3MPrintf(db, "sqlite_sq_%p", (void*)pTab); + pTab->nTabRef = 1; + if( pFrom->zAlias ){ + pTab->zName = sqlite3DbStrDup(db, pFrom->zAlias); + }else{ + pTab->zName = sqlite3MPrintf(db, "subquery_%p", (void*)pTab); + } while( pSel->pPrior ){ pSel = pSel->pPrior; } - selectColumnsFromExprList(pParse, pSel->pEList, &pTab->nCol, &pTab->aCol); + sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); pTab->iPKey = -1; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); pTab->tabFlags |= TF_Ephemeral; @@ -109463,21 +125975,27 @@ static int selectExpander(Walker *pWalker, Select *p){ assert( pFrom->pTab==0 ); pFrom->pTab = pTab = sqlite3LocateTableItem(pParse, 0, pFrom); if( pTab==0 ) return WRC_Abort; - if( pTab->nRef==0xffff ){ + if( pTab->nTabRef>=0xffff ){ sqlite3ErrorMsg(pParse, "too many references to \"%s\": max 65535", pTab->zName); pFrom->pTab = 0; return WRC_Abort; } - pTab->nRef++; + pTab->nTabRef++; + if( !IsVirtual(pTab) && cannotBeFunction(pParse, pFrom) ){ + return WRC_Abort; + } #if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) - if( pTab->pSelect || IsVirtual(pTab) ){ - /* We reach here if the named table is a really a view */ + if( IsVirtual(pTab) || pTab->pSelect ){ + i16 nCol; if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; assert( pFrom->pSelect==0 ); pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); sqlite3SelectSetName(pFrom->pSelect, pTab->zName); + nCol = pTab->nCol; + pTab->nCol = -1; sqlite3WalkSelect(pWalker, pFrom->pSelect); + pTab->nCol = nCol; } #endif } @@ -109497,19 +126015,21 @@ static int selectExpander(Walker *pWalker, Select *p){ /* For every "*" that occurs in the column list, insert the names of ** all columns in all tables. And for every TABLE.* insert the names ** of all columns in TABLE. The parser inserted a special expression - ** with the TK_ALL operator for each "*" that it found in the column list. - ** The following code just has to locate the TK_ALL expressions and expand - ** each one to the list of all columns in all tables. + ** with the TK_ASTERISK operator for each "*" that it found in the column + ** list. The following code just has to locate the TK_ASTERISK + ** expressions and expand each one to the list of all columns in + ** all tables. ** ** The first loop just checks to see if there are any "*" operators ** that need expanding. */ for(k=0; k<pEList->nExpr; k++){ pE = pEList->a[k].pExpr; - if( pE->op==TK_ALL ) break; + if( pE->op==TK_ASTERISK ) break; assert( pE->op!=TK_DOT || pE->pRight!=0 ); assert( pE->op!=TK_DOT || (pE->pLeft!=0 && pE->pLeft->op==TK_ID) ); - if( pE->op==TK_DOT && pE->pRight->op==TK_ALL ) break; + if( pE->op==TK_DOT && pE->pRight->op==TK_ASTERISK ) break; + elistFlags |= pE->flags; } if( k<pEList->nExpr ){ /* @@ -109523,18 +126043,14 @@ static int selectExpander(Walker *pWalker, Select *p){ int longNames = (flags & SQLITE_FullColNames)!=0 && (flags & SQLITE_ShortColNames)==0; - /* When processing FROM-clause subqueries, it is always the case - ** that full_column_names=OFF and short_column_names=ON. The - ** sqlite3ResultSetOfSelect() routine makes it so. */ - assert( (p->selFlags & SF_NestedFrom)==0 - || ((flags & SQLITE_FullColNames)==0 && - (flags & SQLITE_ShortColNames)!=0) ); - for(k=0; k<pEList->nExpr; k++){ pE = a[k].pExpr; + elistFlags |= pE->flags; pRight = pE->pRight; assert( pE->op!=TK_DOT || pRight!=0 ); - if( pE->op!=TK_ALL && (pE->op!=TK_DOT || pRight->op!=TK_ALL) ){ + if( pE->op!=TK_ASTERISK + && (pE->op!=TK_DOT || pRight->op!=TK_ASTERISK) + ){ /* This particular expression does not need to be expanded. */ pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); @@ -109571,7 +126087,7 @@ static int selectExpander(Walker *pWalker, Select *p){ continue; } iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - zSchemaName = iDb>=0 ? db->aDb[iDb].zName : "*"; + zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; } for(j=0; j<pTab->nCol; j++){ char *zName = pTab->aCol[j].zName; @@ -109586,18 +126102,19 @@ static int selectExpander(Walker *pWalker, Select *p){ continue; } - /* If a column is marked as 'hidden' (currently only possible - ** for virtual tables), do not include it in the expanded - ** result-set list. + /* If a column is marked as 'hidden', omit it from the expanded + ** result-set list unless the SELECT has the SF_IncludeHidden + ** bit set. */ - if( IsHiddenColumn(&pTab->aCol[j]) ){ - assert(IsVirtual(pTab)); + if( (p->selFlags & SF_IncludeHidden)==0 + && IsHiddenColumn(&pTab->aCol[j]) + ){ continue; } tableSeen = 1; if( i>0 && zTName==0 ){ - if( (pFrom->jointype & JT_NATURAL)!=0 + if( (pFrom->fg.jointype & JT_NATURAL)!=0 && tableAndColumnIndex(pTabList, i, zName, 0, 0) ){ /* In a NATURAL join, omit the join columns from the @@ -109616,10 +126133,10 @@ static int selectExpander(Walker *pWalker, Select *p){ if( longNames || pTabList->nSrc>1 ){ Expr *pLeft; pLeft = sqlite3Expr(db, TK_ID, zTabName); - pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); if( zSchemaName ){ pLeft = sqlite3Expr(db, TK_ID, zSchemaName); - pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr, 0); + pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); } if( longNames ){ zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName); @@ -109629,8 +126146,7 @@ static int selectExpander(Walker *pWalker, Select *p){ pExpr = pRight; } pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); - sColname.z = zColname; - sColname.n = sqlite3Strlen30(zColname); + sqlite3TokenInit(&sColname, zColname); sqlite3ExprListSetName(pParse, pNew, &sColname, 0); if( pNew && (p->selFlags & SF_NestedFrom)!=0 ){ struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; @@ -109659,11 +126175,15 @@ static int selectExpander(Walker *pWalker, Select *p){ sqlite3ExprListDelete(db, pEList); p->pEList = pNew; } -#if SQLITE_MAX_COLUMN - if( p->pEList && p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ - sqlite3ErrorMsg(pParse, "too many columns in result set"); + if( p->pEList ){ + if( p->pEList->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ + sqlite3ErrorMsg(pParse, "too many columns in result set"); + return WRC_Abort; + } + if( (elistFlags & (EP_HasFunc|EP_Subquery))!=0 ){ + p->selFlags |= SF_ComplexResult; + } } -#endif return WRC_Continue; } @@ -109676,11 +126196,30 @@ static int selectExpander(Walker *pWalker, Select *p){ ** Walker.xSelectCallback is set to do something useful for every ** subquery in the parser tree. */ -static int exprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ +SQLITE_PRIVATE int sqlite3ExprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ UNUSED_PARAMETER2(NotUsed, NotUsed2); return WRC_Continue; } +/* +** No-op routine for the parse-tree walker for SELECT statements. +** subquery in the parser tree. +*/ +SQLITE_PRIVATE int sqlite3SelectWalkNoop(Walker *NotUsed, Select *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + return WRC_Continue; +} + +#if SQLITE_DEBUG +/* +** Always assert. This xSelectCallback2 implementation proves that the +** xSelectCallback2 is never invoked. +*/ +SQLITE_PRIVATE void sqlite3SelectWalkAssert2(Walker *NotUsed, Select *NotUsed2){ + UNUSED_PARAMETER2(NotUsed, NotUsed2); + assert( 0 ); +} +#endif /* ** This routine "expands" a SELECT statement and all of its subqueries. ** For additional information on what it means to "expand" a SELECT @@ -109696,17 +126235,15 @@ static int exprWalkNoop(Walker *NotUsed, Expr *NotUsed2){ */ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){ Walker w; - memset(&w, 0, sizeof(w)); - w.xExprCallback = exprWalkNoop; + w.xExprCallback = sqlite3ExprWalkNoop; w.pParse = pParse; - if( pParse->hasCompound ){ + if( OK_IF_ALWAYS_TRUE(pParse->hasCompound) ){ w.xSelectCallback = convertCompoundSelectToSubquery; + w.xSelectCallback2 = 0; sqlite3WalkSelect(&w, pSelect); } w.xSelectCallback = selectExpander; - if( (pSelect->selFlags & SF_AllValues)==0 ){ - w.xSelectCallback2 = selectPopWith; - } + w.xSelectCallback2 = selectPopWith; sqlite3WalkSelect(&w, pSelect); } @@ -109732,19 +126269,19 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ struct SrcList_item *pFrom; assert( p->selFlags & SF_Resolved ); - if( (p->selFlags & SF_HasTypeInfo)==0 ){ - p->selFlags |= SF_HasTypeInfo; - pParse = pWalker->pParse; - pTabList = p->pSrc; - for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; - if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){ - /* A sub-query in the FROM clause of a SELECT */ - Select *pSel = pFrom->pSelect; - if( pSel ){ - while( pSel->pPrior ) pSel = pSel->pPrior; - selectAddColumnTypeAndCollation(pParse, pTab, pSel); - } + assert( (p->selFlags & SF_HasTypeInfo)==0 ); + p->selFlags |= SF_HasTypeInfo; + pParse = pWalker->pParse; + pTabList = p->pSrc; + for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + assert( pTab!=0 ); + if( (pTab->tabFlags & TF_Ephemeral)!=0 ){ + /* A sub-query in the FROM clause of a SELECT */ + Select *pSel = pFrom->pSelect; + if( pSel ){ + while( pSel->pPrior ) pSel = pSel->pPrior; + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel); } } } @@ -109762,9 +126299,9 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ static void sqlite3SelectAddTypeInfo(Parse *pParse, Select *pSelect){ #ifndef SQLITE_OMIT_SUBQUERY Walker w; - memset(&w, 0, sizeof(w)); + w.xSelectCallback = sqlite3SelectWalkNoop; w.xSelectCallback2 = selectAddSubqueryTypeInfo; - w.xExprCallback = exprWalkNoop; + w.xExprCallback = sqlite3ExprWalkNoop; w.pParse = pParse; sqlite3WalkSelect(&w, pSelect); #endif @@ -109788,15 +126325,13 @@ SQLITE_PRIVATE void sqlite3SelectPrep( Select *p, /* The SELECT statement being coded. */ NameContext *pOuterNC /* Name context for container */ ){ - sqlite3 *db; - if( NEVER(p==0) ) return; - db = pParse->db; - if( db->mallocFailed ) return; + assert( p!=0 || pParse->db->mallocFailed ); + if( pParse->db->mallocFailed ) return; if( p->selFlags & SF_HasTypeInfo ) return; sqlite3SelectExpand(pParse, p); - if( pParse->nErr || db->mallocFailed ) return; + if( pParse->nErr || pParse->db->mallocFailed ) return; sqlite3ResolveSelectNames(pParse, p, pOuterNC); - if( pParse->nErr || db->mallocFailed ) return; + if( pParse->nErr || pParse->db->mallocFailed ) return; sqlite3SelectAddTypeInfo(pParse, p); } @@ -109856,8 +126391,8 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ for(i=0, pF=pAggInfo->aFunc; i<pAggInfo->nFunc; i++, pF++){ ExprList *pList = pF->pExpr->x.pList; assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); - sqlite3VdbeAddOp4(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0, 0, - (void*)pF->pFunc, P4_FUNCDEF); + sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); } } @@ -109883,14 +126418,15 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ if( pList ){ nArg = pList->nExpr; regAgg = sqlite3GetTempRange(pParse, nArg); - sqlite3ExprCodeExprList(pParse, pList, regAgg, SQLITE_ECEL_DUP); + sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP); }else{ nArg = 0; regAgg = 0; } if( pF->iDistinct>=0 ){ addrNext = sqlite3VdbeMakeLabel(v); - assert( nArg==1 ); + testcase( nArg==0 ); /* Error condition */ + testcase( nArg>1 ); /* Also an error */ codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); } if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ @@ -109907,8 +126443,8 @@ static void updateAccumulator(Parse *pParse, AggInfo *pAggInfo){ if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem; sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ); } - sqlite3VdbeAddOp4(v, OP_AggStep, 0, regAgg, pF->iMem, - (void*)pF->pFunc, P4_FUNCDEF); + sqlite3VdbeAddOp3(v, OP_AggStep0, 0, regAgg, pF->iMem); + sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); sqlite3ExprCacheAffinityChange(pParse, regAgg, nArg); sqlite3ReleaseTempRange(pParse, regAgg, nArg); @@ -109954,20 +126490,187 @@ static void explainSimpleCount( ){ if( pParse->explain==2 ){ int bCover = (pIdx!=0 && (HasRowid(pTab) || !IsPrimaryKeyIndex(pIdx))); - char *zEqp = sqlite3MPrintf(pParse->db, "SCAN TABLE %s%s%s", + sqlite3VdbeExplain(pParse, 0, "SCAN TABLE %s%s%s", pTab->zName, bCover ? " USING COVERING INDEX " : "", bCover ? pIdx->zName : "" ); - sqlite3VdbeAddOp4( - pParse->pVdbe, OP_Explain, pParse->iSelectId, 0, 0, zEqp, P4_DYNAMIC - ); } } #else # define explainSimpleCount(a,b,c) #endif +/* +** sqlite3WalkExpr() callback used by havingToWhere(). +** +** If the node passed to the callback is a TK_AND node, return +** WRC_Continue to tell sqlite3WalkExpr() to iterate through child nodes. +** +** Otherwise, return WRC_Prune. In this case, also check if the +** sub-expression matches the criteria for being moved to the WHERE +** clause. If so, add it to the WHERE clause and replace the sub-expression +** within the HAVING expression with a constant "1". +*/ +static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){ + if( pExpr->op!=TK_AND ){ + Select *pS = pWalker->u.pSelect; + if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) ){ + sqlite3 *db = pWalker->pParse->db; + Expr *pNew = sqlite3ExprAlloc(db, TK_INTEGER, &sqlite3IntTokens[1], 0); + if( pNew ){ + Expr *pWhere = pS->pWhere; + SWAP(Expr, *pNew, *pExpr); + pNew = sqlite3ExprAnd(db, pWhere, pNew); + pS->pWhere = pNew; + pWalker->eCode = 1; + } + } + return WRC_Prune; + } + return WRC_Continue; +} + +/* +** Transfer eligible terms from the HAVING clause of a query, which is +** processed after grouping, to the WHERE clause, which is processed before +** grouping. For example, the query: +** +** SELECT * FROM <tables> WHERE a=? GROUP BY b HAVING b=? AND c=? +** +** can be rewritten as: +** +** SELECT * FROM <tables> WHERE a=? AND b=? GROUP BY b HAVING c=? +** +** A term of the HAVING expression is eligible for transfer if it consists +** entirely of constants and expressions that are also GROUP BY terms that +** use the "BINARY" collation sequence. +*/ +static void havingToWhere(Parse *pParse, Select *p){ + Walker sWalker; + memset(&sWalker, 0, sizeof(sWalker)); + sWalker.pParse = pParse; + sWalker.xExprCallback = havingToWhereExprCb; + sWalker.u.pSelect = p; + sqlite3WalkExpr(&sWalker, p->pHaving); +#if SELECTTRACE_ENABLED + if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){ + SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif +} + +/* +** Check to see if the pThis entry of pTabList is a self-join of a prior view. +** If it is, then return the SrcList_item for the prior view. If it is not, +** then return 0. +*/ +static struct SrcList_item *isSelfJoinView( + SrcList *pTabList, /* Search for self-joins in this FROM clause */ + struct SrcList_item *pThis /* Search for prior reference to this subquery */ +){ + struct SrcList_item *pItem; + for(pItem = pTabList->a; pItem<pThis; pItem++){ + if( pItem->pSelect==0 ) continue; + if( pItem->fg.viaCoroutine ) continue; + if( pItem->zName==0 ) continue; + if( sqlite3_stricmp(pItem->zDatabase, pThis->zDatabase)!=0 ) continue; + if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; + if( sqlite3ExprCompare(0, + pThis->pSelect->pWhere, pItem->pSelect->pWhere, -1) + ){ + /* The view was modified by some other optimization such as + ** pushDownWhereTerms() */ + continue; + } + return pItem; + } + return 0; +} + +#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION +/* +** Attempt to transform a query of the form +** +** SELECT count(*) FROM (SELECT x FROM t1 UNION ALL SELECT y FROM t2) +** +** Into this: +** +** SELECT (SELECT count(*) FROM t1)+(SELECT count(*) FROM t2) +** +** The transformation only works if all of the following are true: +** +** * The subquery is a UNION ALL of two or more terms +** * There is no WHERE or GROUP BY or HAVING clauses on the subqueries +** * The outer query is a simple count(*) +** +** Return TRUE if the optimization is undertaken. +*/ +static int countOfViewOptimization(Parse *pParse, Select *p){ + Select *pSub, *pPrior; + Expr *pExpr; + Expr *pCount; + sqlite3 *db; + if( (p->selFlags & SF_Aggregate)==0 ) return 0; /* This is an aggregate */ + if( p->pEList->nExpr!=1 ) return 0; /* Single result column */ + pExpr = p->pEList->a[0].pExpr; + if( pExpr->op!=TK_AGG_FUNCTION ) return 0; /* Result is an aggregate */ + if( sqlite3_stricmp(pExpr->u.zToken,"count") ) return 0; /* Is count() */ + if( pExpr->x.pList!=0 ) return 0; /* Must be count(*) */ + if( p->pSrc->nSrc!=1 ) return 0; /* One table in FROM */ + pSub = p->pSrc->a[0].pSelect; + if( pSub==0 ) return 0; /* The FROM is a subquery */ + if( pSub->pPrior==0 ) return 0; /* Must be a compound ry */ + do{ + if( pSub->op!=TK_ALL && pSub->pPrior ) return 0; /* Must be UNION ALL */ + if( pSub->pWhere ) return 0; /* No WHERE clause */ + if( pSub->selFlags & SF_Aggregate ) return 0; /* Not an aggregate */ + pSub = pSub->pPrior; /* Repeat over compound */ + }while( pSub ); + + /* If we reach this point then it is OK to perform the transformation */ + + db = pParse->db; + pCount = pExpr; + pExpr = 0; + pSub = p->pSrc->a[0].pSelect; + p->pSrc->a[0].pSelect = 0; + sqlite3SrcListDelete(db, p->pSrc); + p->pSrc = sqlite3DbMallocZero(pParse->db, sizeof(*p->pSrc)); + while( pSub ){ + Expr *pTerm; + pPrior = pSub->pPrior; + pSub->pPrior = 0; + pSub->pNext = 0; + pSub->selFlags |= SF_Aggregate; + pSub->selFlags &= ~SF_Compound; + pSub->nSelectRow = 0; + sqlite3ExprListDelete(db, pSub->pEList); + pTerm = pPrior ? sqlite3ExprDup(db, pCount, 0) : pCount; + pSub->pEList = sqlite3ExprListAppend(pParse, 0, pTerm); + pTerm = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, pTerm, pSub); + if( pExpr==0 ){ + pExpr = pTerm; + }else{ + pExpr = sqlite3PExpr(pParse, TK_PLUS, pTerm, pExpr); + } + pSub = pPrior; + } + p->pEList->a[0].pExpr = pExpr; + p->selFlags &= ~SF_Aggregate; + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif + return 1; +} +#endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */ + /* ** Generate code for the SELECT statement given in the p argument. ** @@ -109990,7 +126693,7 @@ SQLITE_PRIVATE int sqlite3Select( WhereInfo *pWInfo; /* Return from sqlite3WhereBegin() */ Vdbe *v; /* The virtual machine under construction */ int isAgg; /* True for select lists like "count(*)" */ - ExprList *pEList; /* List of columns to extract. */ + ExprList *pEList = 0; /* List of columns to extract. */ SrcList *pTabList; /* List of tables to select from */ Expr *pWhere; /* The WHERE clause. May be NULL */ ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ @@ -110001,21 +126704,18 @@ SQLITE_PRIVATE int sqlite3Select( AggInfo sAggInfo; /* Information used by aggregate queries */ int iEnd; /* Address of the end of the query */ sqlite3 *db; /* The database connection */ - -#ifndef SQLITE_OMIT_EXPLAIN - int iRestoreSelectId = pParse->iSelectId; - pParse->iSelectId = pParse->iNextSelectId++; -#endif + ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */ + u8 minMaxFlag; /* Flag for min/max queries */ db = pParse->db; + v = sqlite3GetVdbe(pParse); if( p==0 || db->mallocFailed || pParse->nErr ){ return 1; } if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; memset(&sAggInfo, 0, sizeof(sAggInfo)); #if SELECTTRACE_ENABLED - pParse->nSelectIndent++; - SELECTTRACE(1,pParse,p, ("begin processing:\n")); + SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); if( sqlite3SelectTrace & 0x100 ){ sqlite3TreeViewSelect(0, p, 0); } @@ -110040,36 +126740,157 @@ SQLITE_PRIVATE int sqlite3Select( memset(&sSort, 0, sizeof(sSort)); sSort.pOrderBy = p->pOrderBy; pTabList = p->pSrc; - pEList = p->pEList; if( pParse->nErr || db->mallocFailed ){ goto select_end; } + assert( p->pEList!=0 ); isAgg = (p->selFlags & SF_Aggregate)!=0; - assert( pEList!=0 ); - - /* Begin generating code. - */ - v = sqlite3GetVdbe(pParse); - if( v==0 ) goto select_end; - - /* If writing to memory or generating a set - ** only a single column may be output. - */ -#ifndef SQLITE_OMIT_SUBQUERY - if( checkForMultiColumnSelectError(pParse, pDest, pEList->nExpr) ){ - goto select_end; +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x104 ){ + SELECTTRACE(0x104,pParse,p, ("after name resolution:\n")); + sqlite3TreeViewSelect(0, p, 0); } #endif - /* Generate code for all sub-queries in the FROM clause + if( pDest->eDest==SRT_Output ){ + generateColumnNames(pParse, p); + } + + /* Try to various optimizations (flattening subqueries, and strength + ** reduction of join operators) in the FROM clause up into the main query */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) for(i=0; !p->pPrior && i<pTabList->nSrc; i++){ struct SrcList_item *pItem = &pTabList->a[i]; - SelectDest dest; Select *pSub = pItem->pSelect; - int isAggSub; + Table *pTab = pItem->pTab; + /* Convert LEFT JOIN into JOIN if there are terms of the right table + ** of the LEFT JOIN used in the WHERE clause. + */ + if( (pItem->fg.jointype & JT_LEFT)!=0 + && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor) + && OptimizationEnabled(db, SQLITE_SimplifyJoin) + ){ + SELECTTRACE(0x100,pParse,p, + ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); + pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); + unsetJoinExpr(p->pWhere, pItem->iCursor); + } + + /* No futher action if this term of the FROM clause is no a subquery */ + if( pSub==0 ) continue; + + /* Catch mismatch in the declared columns of a view and the number of + ** columns in the SELECT on the RHS */ + if( pTab->nCol!=pSub->pEList->nExpr ){ + sqlite3ErrorMsg(pParse, "expected %d columns for '%s' but got %d", + pTab->nCol, pTab->zName, pSub->pEList->nExpr); + goto select_end; + } + + /* Do not try to flatten an aggregate subquery. + ** + ** Flattening an aggregate subquery is only possible if the outer query + ** is not a join. But if the outer query is not a join, then the subquery + ** will be implemented as a co-routine and there is no advantage to + ** flattening in that case. + */ + if( (pSub->selFlags & SF_Aggregate)!=0 ) continue; + assert( pSub->pGroupBy==0 ); + + /* If the outer query contains a "complex" result set (that is, + ** if the result set of the outer query uses functions or subqueries) + ** and if the subquery contains an ORDER BY clause and if + ** it will be implemented as a co-routine, then do not flatten. This + ** restriction allows SQL constructs like this: + ** + ** SELECT expensive_function(x) + ** FROM (SELECT x FROM tab ORDER BY y LIMIT 10); + ** + ** The expensive_function() is only computed on the 10 rows that + ** are output, rather than every row of the table. + ** + ** The requirement that the outer query have a complex result set + ** means that flattening does occur on simpler SQL constraints without + ** the expensive_function() like: + ** + ** SELECT x FROM (SELECT x FROM tab ORDER BY y LIMIT 10); + */ + if( pSub->pOrderBy!=0 + && i==0 + && (p->selFlags & SF_ComplexResult)!=0 + && (pTabList->nSrc==1 + || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) + ){ + continue; + } + + if( flattenSubquery(pParse, p, i, isAgg) ){ + /* This subquery can be absorbed into its parent. */ + i = -1; + } + pTabList = p->pSrc; + if( db->mallocFailed ) goto select_end; + if( !IgnorableOrderby(pDest) ){ + sSort.pOrderBy = p->pOrderBy; + } + } +#endif + +#ifndef SQLITE_OMIT_COMPOUND_SELECT + /* Handle compound SELECT statements using the separate multiSelect() + ** procedure. + */ + if( p->pPrior ){ + rc = multiSelect(pParse, p, pDest); +#if SELECTTRACE_ENABLED + SELECTTRACE(0x1,pParse,p,("end compound-select processing\n")); + if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + sqlite3TreeViewSelect(0, p, 0); + } +#endif + if( p->pNext==0 ) ExplainQueryPlanPop(pParse); + return rc; + } +#endif + + /* For each term in the FROM clause, do two things: + ** (1) Authorized unreferenced tables + ** (2) Generate code for all sub-queries + */ + for(i=0; i<pTabList->nSrc; i++){ + struct SrcList_item *pItem = &pTabList->a[i]; + SelectDest dest; + Select *pSub; +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + const char *zSavedAuthContext; +#endif + + /* Issue SQLITE_READ authorizations with a fake column name for any + ** tables that are referenced but from which no values are extracted. + ** Examples of where these kinds of null SQLITE_READ authorizations + ** would occur: + ** + ** SELECT count(*) FROM t1; -- SQLITE_READ t1."" + ** SELECT t1.* FROM t1, t2; -- SQLITE_READ t2."" + ** + ** The fake column name is an empty string. It is possible for a table to + ** have a column named by the empty string, in which case there is no way to + ** distinguish between an unreferenced table and an actual reference to the + ** "" column. The original design was for the fake column name to be a NULL, + ** which would be unambiguous. But legacy authorization callbacks might + ** assume the column name is non-NULL and segfault. The use of an empty + ** string for the fake column name seems safer. + */ + if( pItem->colUsed==0 ){ + sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase); + } + +#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) + /* Generate code for all sub-queries in the FROM clause + */ + pSub = pItem->pSelect; if( pSub==0 ) continue; /* Sometimes the code for a subquery will be generated more than @@ -110079,7 +126900,11 @@ SQLITE_PRIVATE int sqlite3Select( ** is sufficient, though the subroutine to manifest the view does need ** to be invoked again. */ if( pItem->addrFillSub ){ - if( pItem->viaCoroutine==0 ){ + if( pItem->fg.viaCoroutine==0 ){ + /* The subroutine that manifests the view might be a one-time routine, + ** or it might need to be rerun on each iteration because it + ** encodes a correlated subquery. */ + testcase( sqlite3VdbeGetOp(v, pItem->addrFillSub)->opcode==OP_Once ); sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub); } continue; @@ -110094,32 +126919,55 @@ SQLITE_PRIVATE int sqlite3Select( */ pParse->nHeight += sqlite3SelectExprHeight(p); - isAggSub = (pSub->selFlags & SF_Aggregate)!=0; - if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){ - /* This subquery can be absorbed into its parent. */ - if( isAggSub ){ - isAgg = 1; - p->selFlags |= SF_Aggregate; + /* Make copies of constant WHERE-clause terms in the outer query down + ** inside the subquery. This can help the subquery to run more efficiently. + */ + if( OptimizationEnabled(db, SQLITE_PushDown) + && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem->iCursor, + (pItem->fg.jointype & JT_OUTER)!=0) + ){ +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After WHERE-clause push-down:\n")); + sqlite3TreeViewSelect(0, p, 0); } - i = -1; - }else if( pTabList->nSrc==1 - && OptimizationEnabled(db, SQLITE_SubqCoroutine) +#endif + }else{ + SELECTTRACE(0x100,pParse,p,("Push-down not possible\n")); + } + + zSavedAuthContext = pParse->zAuthContext; + pParse->zAuthContext = pItem->zName; + + /* Generate code to implement the subquery + ** + ** The subquery is implemented as a co-routine if the subquery is + ** guaranteed to be the outer loop (so that it does not need to be + ** computed more than once) + ** + ** TODO: Are there other reasons beside (1) to use a co-routine + ** implementation? + */ + if( i==0 + && (pTabList->nSrc==1 + || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) /* (1) */ ){ /* Implement a co-routine that will return a single row of the result ** set on each invocation. */ int addrTop = sqlite3VdbeCurrentAddr(v)+1; + pItem->regReturn = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_InitCoroutine, pItem->regReturn, 0, addrTop); VdbeComment((v, "%s", pItem->pTab->zName)); pItem->addrFillSub = addrTop; sqlite3SelectDestInit(&dest, SRT_Coroutine, pItem->regReturn); - explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); + ExplainQueryPlan((pParse, 1, "CO-ROUTINE 0x%p", pSub)); sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); - pItem->viaCoroutine = 1; + pItem->pTab->nRowLogEst = pSub->nSelectRow; + pItem->fg.viaCoroutine = 1; pItem->regResult = dest.iSdst; - sqlite3VdbeAddOp1(v, OP_EndCoroutine, pItem->regReturn); + sqlite3VdbeEndCoroutine(v, pItem->regReturn); sqlite3VdbeJumpHere(v, addrTop-1); sqlite3ClearTempRegCache(pParse); }else{ @@ -110131,56 +126979,66 @@ SQLITE_PRIVATE int sqlite3Select( int topAddr; int onceAddr = 0; int retAddr; + struct SrcList_item *pPrior; + assert( pItem->addrFillSub==0 ); pItem->regReturn = ++pParse->nMem; topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); pItem->addrFillSub = topAddr+1; - if( pItem->isCorrelated==0 ){ + if( pItem->fg.isCorrelated==0 ){ /* If the subquery is not correlated and if we are not inside of ** a trigger, then we only need to compute the value of the subquery ** once. */ - onceAddr = sqlite3CodeOnce(pParse); VdbeCoverage(v); + onceAddr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); VdbeComment((v, "materialize \"%s\"", pItem->pTab->zName)); }else{ VdbeNoopComment((v, "materialize \"%s\"", pItem->pTab->zName)); } - sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); - explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); - sqlite3Select(pParse, pSub, &dest); - pItem->pTab->nRowLogEst = sqlite3LogEst(pSub->nSelectRow); + pPrior = isSelfJoinView(pTabList, pItem); + if( pPrior ){ + sqlite3VdbeAddOp2(v, OP_OpenDup, pItem->iCursor, pPrior->iCursor); + assert( pPrior->pSelect!=0 ); + pSub->nSelectRow = pPrior->pSelect->nSelectRow; + }else{ + sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); + ExplainQueryPlan((pParse, 1, "MATERIALIZE 0x%p", pSub)); + sqlite3Select(pParse, pSub, &dest); + } + pItem->pTab->nRowLogEst = pSub->nSelectRow; if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); VdbeComment((v, "end %s", pItem->pTab->zName)); sqlite3VdbeChangeP1(v, topAddr, retAddr); sqlite3ClearTempRegCache(pParse); } - if( /*pParse->nErr ||*/ db->mallocFailed ){ - goto select_end; - } + if( db->mallocFailed ) goto select_end; pParse->nHeight -= sqlite3SelectExprHeight(p); - pTabList = p->pSrc; - if( !IgnorableOrderby(pDest) ){ - sSort.pOrderBy = p->pOrderBy; - } - } - pEList = p->pEList; + pParse->zAuthContext = zSavedAuthContext; #endif + } + + /* Various elements of the SELECT copied into local variables for + ** convenience */ + pEList = p->pEList; pWhere = p->pWhere; pGroupBy = p->pGroupBy; pHaving = p->pHaving; sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; -#ifndef SQLITE_OMIT_COMPOUND_SELECT - /* If there is are a sequence of queries, do the earlier ones first. - */ - if( p->pPrior ){ - rc = multiSelect(pParse, p, pDest); - explainSetInteger(pParse->iSelectId, iRestoreSelectId); #if SELECTTRACE_ENABLED - SELECTTRACE(1,pParse,p,("end compound-select processing\n")); - pParse->nSelectIndent--; + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); + sqlite3TreeViewSelect(0, p, 0); + } #endif - return rc; + +#ifdef SQLITE_COUNTOFVIEW_OPTIMIZATION + if( OptimizationEnabled(db, SQLITE_QueryFlattener|SQLITE_CountOfView) + && countOfViewOptimization(pParse, p) + ){ + if( db->mallocFailed ) goto select_end; + pEList = p->pEList; + pTabList = p->pSrc; } #endif @@ -110200,23 +127058,30 @@ SQLITE_PRIVATE int sqlite3Select( ** BY and DISTINCT, and an index or separate temp-table for the other. */ if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct - && sqlite3ExprListCompare(sSort.pOrderBy, p->pEList, -1)==0 + && sqlite3ExprListCompare(sSort.pOrderBy, pEList, -1)==0 ){ p->selFlags &= ~SF_Distinct; - p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0); - pGroupBy = p->pGroupBy; + pGroupBy = p->pGroupBy = sqlite3ExprListDup(db, pEList, 0); /* Notice that even thought SF_Distinct has been cleared from p->selFlags, ** the sDistinct.isTnct is still set. Hence, isTnct represents the ** original setting of the SF_Distinct flag, not the current setting */ assert( sDistinct.isTnct ); + +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif } - /* If there is an ORDER BY clause, then this sorting - ** index might end up being unused if the data can be - ** extracted in pre-sorted order. If that is the case, then the - ** OP_OpenEphemeral instruction will be changed to an OP_Noop once - ** we figure out that the sorting index is not needed. The addrSortIndex - ** variable is used to facilitate that change. + /* If there is an ORDER BY clause, then create an ephemeral index to + ** do the sorting. But this sorting ephemeral index might end up + ** being unused if the data can be extracted in pre-sorted order. + ** If that is the case, then the OP_OpenEphemeral instruction will be + ** changed to an OP_Noop once we figure out that the sorting index is + ** not needed. The sSort.addrSortIndex variable is used to facilitate + ** that change. */ if( sSort.pOrderBy ){ KeyInfo *pKeyInfo; @@ -110240,21 +127105,23 @@ SQLITE_PRIVATE int sqlite3Select( /* Set the limiter. */ iEnd = sqlite3VdbeMakeLabel(v); - p->nSelectRow = LARGEST_INT64; + if( (p->selFlags & SF_FixedLimit)==0 ){ + p->nSelectRow = 320; /* 4 billion rows */ + } computeLimitRegisters(pParse, p, iEnd); if( p->iLimit==0 && sSort.addrSortIndex>=0 ){ - sqlite3VdbeGetOp(v, sSort.addrSortIndex)->opcode = OP_SorterOpen; + sqlite3VdbeChangeOpcode(v, sSort.addrSortIndex, OP_SorterOpen); sSort.sortFlags |= SORTFLAG_UseSorter; } - /* Open a virtual index to use for the distinct set. + /* Open an ephemeral index to use for the distinct set. */ if( p->selFlags & SF_Distinct ){ sDistinct.tabTnct = pParse->nTab++; sDistinct.addrTnct = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, - sDistinct.tabTnct, 0, 0, - (char*)keyInfoFromExprList(pParse, p->pEList,0,0), - P4_KEYINFO); + sDistinct.tabTnct, 0, 0, + (char*)keyInfoFromExprList(pParse, p->pEList,0,0), + P4_KEYINFO); sqlite3VdbeChangeP5(v, BTREE_UNORDERED); sDistinct.eTnctType = WHERE_DISTINCT_UNORDERED; }else{ @@ -110264,10 +127131,13 @@ SQLITE_PRIVATE int sqlite3Select( if( !isAgg && pGroupBy==0 ){ /* No aggregate functions and no GROUP BY clause */ u16 wctrlFlags = (sDistinct.isTnct ? WHERE_WANT_DISTINCT : 0); + assert( WHERE_USE_LIMIT==SF_FixedLimit ); + wctrlFlags |= p->selFlags & SF_FixedLimit; /* Begin the database scan. */ + SELECTTRACE(1,pParse,p,("WhereBegin\n")); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, sSort.pOrderBy, - p->pEList, wctrlFlags, 0); + p->pEList, wctrlFlags, p->nSelectRow); if( pWInfo==0 ) goto select_end; if( sqlite3WhereOutputRowCount(pWInfo) < p->nSelectRow ){ p->nSelectRow = sqlite3WhereOutputRowCount(pWInfo); @@ -110277,6 +127147,7 @@ SQLITE_PRIVATE int sqlite3Select( } if( sSort.pOrderBy ){ sSort.nOBSat = sqlite3WhereIsOrdered(pWInfo); + sSort.bOrderedInnerLoop = sqlite3WhereOrderedInnerLoop(pWInfo); if( sSort.nOBSat==sSort.pOrderBy->nExpr ){ sSort.pOrderBy = 0; } @@ -110291,7 +127162,8 @@ SQLITE_PRIVATE int sqlite3Select( } /* Use the standard inner loop. */ - selectInnerLoop(pParse, p, pEList, -1, &sSort, &sDistinct, pDest, + assert( p->pEList==pEList ); + selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, sqlite3WhereContinueLabel(pWInfo), sqlite3WhereBreakLabel(pWInfo)); @@ -110327,16 +127199,17 @@ SQLITE_PRIVATE int sqlite3Select( for(k=pGroupBy->nExpr, pItem=pGroupBy->a; k>0; k--, pItem++){ pItem->u.x.iAlias = 0; } - if( p->nSelectRow>100 ) p->nSelectRow = 100; + assert( 66==sqlite3LogEst(100) ); + if( p->nSelectRow>66 ) p->nSelectRow = 66; }else{ - p->nSelectRow = 1; + assert( 0==sqlite3LogEst(1) ); + p->nSelectRow = 0; } - /* If there is both a GROUP BY and an ORDER BY clause and they are ** identical, then it may be possible to disable the ORDER BY clause ** on the grounds that the GROUP BY will cause elements to come out - ** in the correct order. It also may not - the GROUP BY may use a + ** in the correct order. It also may not - the GROUP BY might use a ** database index that causes rows to be grouped together as required ** but not actually sorted. Either way, record the fact that the ** ORDER BY and GROUP BY clauses are the same by setting the orderByGrp @@ -110355,16 +127228,29 @@ SQLITE_PRIVATE int sqlite3Select( memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; - sNC.pAggInfo = &sAggInfo; + sNC.uNC.pAggInfo = &sAggInfo; + VVA_ONLY( sNC.ncFlags = NC_UAggInfo; ) sAggInfo.mnReg = pParse->nMem+1; sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; sAggInfo.pGroupBy = pGroupBy; sqlite3ExprAnalyzeAggList(&sNC, pEList); sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy); if( pHaving ){ + if( pGroupBy ){ + assert( pWhere==p->pWhere ); + assert( pHaving==p->pHaving ); + assert( pGroupBy==p->pGroupBy ); + havingToWhere(pParse, p); + pWhere = p->pWhere; + } sqlite3ExprAnalyzeAggregates(&sNC, pHaving); } sAggInfo.nAccumulator = sAggInfo.nColumn; + if( p->pGroupBy==0 && p->pHaving==0 && sAggInfo.nFunc==1 ){ + minMaxFlag = minMaxQuery(db, sAggInfo.aFunc[0].pExpr, &pMinMaxOrderBy); + }else{ + minMaxFlag = WHERE_ORDERBY_NORMAL; + } for(i=0; i<sAggInfo.nFunc; i++){ assert( !ExprHasProperty(sAggInfo.aFunc[i].pExpr, EP_xIsSelect) ); sNC.ncFlags |= NC_InAggFunc; @@ -110373,13 +127259,31 @@ SQLITE_PRIVATE int sqlite3Select( } sAggInfo.mxReg = pParse->nMem; if( db->mallocFailed ) goto select_end; +#if SELECTTRACE_ENABLED + if( sqlite3SelectTrace & 0x400 ){ + int ii; + SELECTTRACE(0x400,pParse,p,("After aggregate analysis:\n")); + sqlite3TreeViewSelect(0, p, 0); + for(ii=0; ii<sAggInfo.nColumn; ii++){ + sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", + ii, sAggInfo.aCol[ii].iMem); + sqlite3TreeViewExpr(0, sAggInfo.aCol[ii].pExpr, 0); + } + for(ii=0; ii<sAggInfo.nFunc; ii++){ + sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n", + ii, sAggInfo.aFunc[ii].iMem); + sqlite3TreeViewExpr(0, sAggInfo.aFunc[ii].pExpr, 0); + } + } +#endif + /* Processing for aggregates with GROUP BY is very different and ** much more complex than aggregates without a GROUP BY. */ if( pGroupBy ){ KeyInfo *pKeyInfo; /* Keying information for the group by clause */ - int j1; /* A-vs-B comparision jump */ + int addr1; /* A-vs-B comparision jump */ int addrOutputRow; /* Start of subroutine that outputs a result row */ int regOutputRow; /* Return address register for output subroutine */ int addrSetAbort; /* Set the abort flag and return */ @@ -110423,6 +127327,7 @@ SQLITE_PRIVATE int sqlite3Select( ** in the right order to begin with. */ sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); + SELECTTRACE(1,pParse,p,("WhereBegin\n")); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, 0, WHERE_GROUPBY | (orderByGrp ? WHERE_SORTBYGROUP : 0), 0 ); @@ -110460,19 +127365,14 @@ SQLITE_PRIVATE int sqlite3Select( } regBase = sqlite3GetTempRange(pParse, nCol); sqlite3ExprCacheClear(pParse); - sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0); + sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0); j = nGroupBy; for(i=0; i<sAggInfo.nColumn; i++){ struct AggInfo_col *pCol = &sAggInfo.aCol[i]; if( pCol->iSorterColumn>=j ){ int r1 = j + regBase; - int r2; - - r2 = sqlite3ExprCodeGetColumn(pParse, - pCol->pTab, pCol->iColumn, pCol->iTable, r1, 0); - if( r1!=r2 ){ - sqlite3VdbeAddOp2(v, OP_SCopy, r2, r1); - } + sqlite3ExprCodeGetColumnToReg(pParse, + pCol->pTab, pCol->iColumn, pCol->iTable, r1); j++; } } @@ -110514,7 +127414,8 @@ SQLITE_PRIVATE int sqlite3Select( addrTopOfLoop = sqlite3VdbeCurrentAddr(v); sqlite3ExprCacheClear(pParse); if( groupBySort ){ - sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx, sortOut,sortPTab); + sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx, + sortOut, sortPTab); } for(j=0; j<pGroupBy->nExpr; j++){ if( groupBySort ){ @@ -110526,8 +127427,8 @@ SQLITE_PRIVATE int sqlite3Select( } sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); - j1 = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp3(v, OP_Jump, j1+1, 0, j1+1); VdbeCoverage(v); + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addr1+1, 0, addr1+1); VdbeCoverage(v); /* Generate code that runs whenever the GROUP BY changes. ** Changes in the GROUP BY are detected by the previous code @@ -110549,7 +127450,7 @@ SQLITE_PRIVATE int sqlite3Select( /* Update the aggregate accumulators based on the content of ** the current row */ - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); updateAccumulator(pParse, &sAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); VdbeComment((v, "indicate data in accumulator")); @@ -110571,7 +127472,7 @@ SQLITE_PRIVATE int sqlite3Select( /* Jump over the subroutines */ - sqlite3VdbeAddOp2(v, OP_Goto, 0, addrEnd); + sqlite3VdbeGoto(v, addrEnd); /* Generate a subroutine that outputs a single row of the result ** set. This subroutine first looks at the iUseFlag. If iUseFlag @@ -110586,12 +127487,13 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); sqlite3VdbeResolveLabel(v, addrOutputRow); addrOutputRow = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_IfPos, iUseFlag, addrOutputRow+2); + VdbeCoverage(v); VdbeComment((v, "Groupby result generator entry point")); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); finalizeAggFunctions(pParse, &sAggInfo); sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); - selectInnerLoop(pParse, p, p->pEList, -1, &sSort, + selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, addrOutputRow+1, addrSetAbort); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); @@ -110605,7 +127507,6 @@ SQLITE_PRIVATE int sqlite3Select( } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { - ExprList *pDel = 0; #ifndef SQLITE_OMIT_BTREECOUNT Table *pTab; if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){ @@ -110667,66 +127568,32 @@ SQLITE_PRIVATE int sqlite3Select( }else #endif /* SQLITE_OMIT_BTREECOUNT */ { - /* Check if the query is of one of the following forms: - ** - ** SELECT min(x) FROM ... - ** SELECT max(x) FROM ... - ** - ** If it is, then ask the code in where.c to attempt to sort results - ** as if there was an "ORDER ON x" or "ORDER ON x DESC" clause. - ** If where.c is able to produce results sorted in this order, then - ** add vdbe code to break out of the processing loop after the - ** first iteration (since the first iteration of the loop is - ** guaranteed to operate on the row with the minimum or maximum - ** value of x, the only row required). - ** - ** A special flag must be passed to sqlite3WhereBegin() to slightly - ** modify behavior as follows: - ** - ** + If the query is a "SELECT min(x)", then the loop coded by - ** where.c should not iterate over any values with a NULL value - ** for x. - ** - ** + The optimizer code in where.c (the thing that decides which - ** index or indices to use) should place a different priority on - ** satisfying the 'ORDER BY' clause than it does in other cases. - ** Refer to code and comments in where.c for details. - */ - ExprList *pMinMax = 0; - u8 flag = WHERE_ORDERBY_NORMAL; - - assert( p->pGroupBy==0 ); - assert( flag==0 ); - if( p->pHaving==0 ){ - flag = minMaxQuery(&sAggInfo, &pMinMax); - } - assert( flag==0 || (pMinMax!=0 && pMinMax->nExpr==1) ); - - if( flag ){ - pMinMax = sqlite3ExprListDup(db, pMinMax, 0); - pDel = pMinMax; - if( pMinMax && !db->mallocFailed ){ - pMinMax->a[0].sortOrder = flag!=WHERE_ORDERBY_MIN ?1:0; - pMinMax->a[0].pExpr->op = TK_COLUMN; - } - } - /* This case runs if the aggregate has no GROUP BY clause. The ** processing is much simpler since there is only a single row ** of output. */ + assert( p->pGroupBy==0 ); resetAccumulator(pParse, &sAggInfo); - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMax,0,flag,0); + + /* If this query is a candidate for the min/max optimization, then + ** minMaxFlag will have been previously set to either + ** WHERE_ORDERBY_MIN or WHERE_ORDERBY_MAX and pMinMaxOrderBy will + ** be an appropriate ORDER BY expression for the optimization. + */ + assert( minMaxFlag==WHERE_ORDERBY_NORMAL || pMinMaxOrderBy!=0 ); + assert( pMinMaxOrderBy==0 || pMinMaxOrderBy->nExpr==1 ); + + SELECTTRACE(1,pParse,p,("WhereBegin\n")); + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pMinMaxOrderBy, + 0, minMaxFlag, 0); if( pWInfo==0 ){ - sqlite3ExprListDelete(db, pDel); goto select_end; } updateAccumulator(pParse, &sAggInfo); - assert( pMinMax==0 || pMinMax->nExpr==1 ); if( sqlite3WhereIsOrdered(pWInfo)>0 ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3WhereBreakLabel(pWInfo)); + sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo)); VdbeComment((v, "%s() by index", - (flag==WHERE_ORDERBY_MIN?"min":"max"))); + (minMaxFlag==WHERE_ORDERBY_MIN?"min":"max"))); } sqlite3WhereEnd(pWInfo); finalizeAggFunctions(pParse, &sAggInfo); @@ -110734,9 +127601,8 @@ SQLITE_PRIVATE int sqlite3Select( sSort.pOrderBy = 0; sqlite3ExprIfFalse(pParse, pHaving, addrEnd, SQLITE_JUMPIFNULL); - selectInnerLoop(pParse, p, p->pEList, -1, 0, 0, + selectInnerLoop(pParse, p, -1, 0, 0, pDest, addrEnd, addrEnd); - sqlite3ExprListDelete(db, pDel); } sqlite3VdbeResolveLabel(v, addrEnd); @@ -110750,7 +127616,9 @@ SQLITE_PRIVATE int sqlite3Select( ** and send them to the callback one by one. */ if( sSort.pOrderBy ){ - explainTempTable(pParse, sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY"); + explainTempTable(pParse, + sSort.nOBSat>0 ? "RIGHT PART OF ORDER BY":"ORDER BY"); + assert( p->pEList==pEList ); generateSortTail(pParse, p, &sSort, pEList->nExpr, pDest); } @@ -110758,126 +127626,27 @@ SQLITE_PRIVATE int sqlite3Select( */ sqlite3VdbeResolveLabel(v, iEnd); - /* The SELECT was successfully coded. Set the return code to 0 - ** to indicate no errors. - */ - rc = 0; + /* The SELECT has been coded. If there is an error in the Parse structure, + ** set the return code to 1. Otherwise 0. */ + rc = (pParse->nErr>0); /* Control jumps to here if an error is encountered above, or upon ** successful coding of the SELECT. */ select_end: - explainSetInteger(pParse->iSelectId, iRestoreSelectId); - - /* Identify column names if results of the SELECT are to be output. - */ - if( rc==SQLITE_OK && pDest->eDest==SRT_Output ){ - generateColumnNames(pParse, pTabList, pEList); - } - + sqlite3ExprListDelete(db, pMinMaxOrderBy); sqlite3DbFree(db, sAggInfo.aCol); sqlite3DbFree(db, sAggInfo.aFunc); #if SELECTTRACE_ENABLED - SELECTTRACE(1,pParse,p,("end processing\n")); - pParse->nSelectIndent--; + SELECTTRACE(0x1,pParse,p,("end processing\n")); + if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + sqlite3TreeViewSelect(0, p, 0); + } #endif + ExplainQueryPlanPop(pParse); return rc; } -#ifdef SQLITE_DEBUG -/* -** Generate a human-readable description of a the Select object. -*/ -SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ - int n = 0; - pView = sqlite3TreeViewPush(pView, moreToFollow); - sqlite3TreeViewLine(pView, "SELECT%s%s", - ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), - ((p->selFlags & SF_Aggregate) ? " agg_flag" : "") - ); - if( p->pSrc && p->pSrc->nSrc ) n++; - if( p->pWhere ) n++; - if( p->pGroupBy ) n++; - if( p->pHaving ) n++; - if( p->pOrderBy ) n++; - if( p->pLimit ) n++; - if( p->pOffset ) n++; - if( p->pPrior ) n++; - sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); - if( p->pSrc && p->pSrc->nSrc ){ - int i; - pView = sqlite3TreeViewPush(pView, (n--)>0); - sqlite3TreeViewLine(pView, "FROM"); - for(i=0; i<p->pSrc->nSrc; i++){ - struct SrcList_item *pItem = &p->pSrc->a[i]; - StrAccum x; - char zLine[100]; - sqlite3StrAccumInit(&x, zLine, sizeof(zLine), 0); - sqlite3XPrintf(&x, 0, "{%d,*}", pItem->iCursor); - if( pItem->zDatabase ){ - sqlite3XPrintf(&x, 0, " %s.%s", pItem->zDatabase, pItem->zName); - }else if( pItem->zName ){ - sqlite3XPrintf(&x, 0, " %s", pItem->zName); - } - if( pItem->pTab ){ - sqlite3XPrintf(&x, 0, " tabname=%Q", pItem->pTab->zName); - } - if( pItem->zAlias ){ - sqlite3XPrintf(&x, 0, " (AS %s)", pItem->zAlias); - } - if( pItem->jointype & JT_LEFT ){ - sqlite3XPrintf(&x, 0, " LEFT-JOIN"); - } - sqlite3StrAccumFinish(&x); - sqlite3TreeViewItem(pView, zLine, i<p->pSrc->nSrc-1); - if( pItem->pSelect ){ - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); - } - sqlite3TreeViewPop(pView); - } - sqlite3TreeViewPop(pView); - } - if( p->pWhere ){ - sqlite3TreeViewItem(pView, "WHERE", (n--)>0); - sqlite3TreeViewExpr(pView, p->pWhere, 0); - sqlite3TreeViewPop(pView); - } - if( p->pGroupBy ){ - sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); - } - if( p->pHaving ){ - sqlite3TreeViewItem(pView, "HAVING", (n--)>0); - sqlite3TreeViewExpr(pView, p->pHaving, 0); - sqlite3TreeViewPop(pView); - } - if( p->pOrderBy ){ - sqlite3TreeViewExprList(pView, p->pOrderBy, (n--)>0, "ORDERBY"); - } - if( p->pLimit ){ - sqlite3TreeViewItem(pView, "LIMIT", (n--)>0); - sqlite3TreeViewExpr(pView, p->pLimit, 0); - sqlite3TreeViewPop(pView); - } - if( p->pOffset ){ - sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); - sqlite3TreeViewExpr(pView, p->pOffset, 0); - sqlite3TreeViewPop(pView); - } - if( p->pPrior ){ - const char *zOp = "UNION"; - switch( p->op ){ - case TK_ALL: zOp = "UNION ALL"; break; - case TK_INTERSECT: zOp = "INTERSECT"; break; - case TK_EXCEPT: zOp = "EXCEPT"; break; - } - sqlite3TreeViewItem(pView, zOp, (n--)>0); - sqlite3TreeViewSelect(pView, p->pPrior, 0); - sqlite3TreeViewPop(pView); - } - sqlite3TreeViewPop(pView); -} -#endif /* SQLITE_DEBUG */ - /************** End of select.c **********************************************/ /************** Begin file table.c *******************************************/ /* @@ -110898,8 +127667,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m ** These routines are in a separate files so that they will not be linked ** if they are not used. */ -/* #include <stdlib.h> */ -/* #include <string.h> */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_GET_TABLE @@ -110971,7 +127739,7 @@ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ z = 0; }else{ int n = sqlite3Strlen30(argv[i])+1; - z = sqlite3_malloc( n ); + z = sqlite3_malloc64( n ); if( z==0 ) goto malloc_failed; memcpy(z, argv[i], n); } @@ -110982,7 +127750,7 @@ static int sqlite3_get_table_cb(void *pArg, int nCol, char **argv, char **colv){ return 0; malloc_failed: - p->rc = SQLITE_NOMEM; + p->rc = SQLITE_NOMEM_BKPT; return 1; } @@ -111020,10 +127788,10 @@ SQLITE_API int sqlite3_get_table( res.nData = 1; res.nAlloc = 20; res.rc = SQLITE_OK; - res.azResult = sqlite3_malloc(sizeof(char*)*res.nAlloc ); + res.azResult = sqlite3_malloc64(sizeof(char*)*res.nAlloc ); if( res.azResult==0 ){ db->errCode = SQLITE_NOMEM; - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } res.azResult[0] = 0; rc = sqlite3_exec(db, zSql, sqlite3_get_table_cb, &res, pzErrMsg); @@ -111048,11 +127816,11 @@ SQLITE_API int sqlite3_get_table( } if( res.nAlloc>res.nData ){ char **azNew; - azNew = sqlite3_realloc( res.azResult, sizeof(char*)*res.nData ); + azNew = sqlite3_realloc64( res.azResult, sizeof(char*)*res.nData ); if( azNew==0 ){ sqlite3_free_table(&res.azResult[1]); db->errCode = SQLITE_NOMEM; - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } res.azResult = azNew; } @@ -111094,6 +127862,7 @@ SQLITE_API void sqlite3_free_table( ************************************************************************* ** This file contains the implementation for TRIGGERs */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_TRIGGER /* @@ -111108,6 +127877,8 @@ SQLITE_PRIVATE void sqlite3DeleteTriggerStep(sqlite3 *db, TriggerStep *pTriggerS sqlite3ExprListDelete(db, pTmp->pExprList); sqlite3SelectDelete(db, pTmp->pSelect); sqlite3IdListDelete(db, pTmp->pIdList); + sqlite3UpsertDelete(db, pTmp->pUpsert); + sqlite3DbFree(db, pTmp->zSpan); sqlite3DbFree(db, pTmp); } @@ -111179,7 +127950,6 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( int iDb; /* The database to store the trigger in */ Token *pName; /* The unqualified db name */ DbFixer sFix; /* State vector for the DB fixer */ - int iTabDb; /* Index of the database holding pTab */ assert( pName1!=0 ); /* pName1->z might be NULL, but not pName1 itself */ assert( pName2!=0 ); @@ -111276,7 +128046,6 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( /* Do not create a trigger on a system table */ if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){ sqlite3ErrorMsg(pParse, "cannot create trigger on system table"); - pParse->nErr++; goto trigger_cleanup; } @@ -111293,13 +128062,13 @@ SQLITE_PRIVATE void sqlite3BeginTrigger( " trigger on table: %S", pTableName, 0); goto trigger_cleanup; } - iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); #ifndef SQLITE_OMIT_AUTHORIZATION { + int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); int code = SQLITE_CREATE_TRIGGER; - const char *zDb = db->aDb[iTabDb].zName; - const char *zDbTrig = isTemp ? db->aDb[1].zName : zDb; + const char *zDb = db->aDb[iTabDb].zDbSName; + const char *zDbTrig = isTemp ? db->aDb[1].zDbSName : zDb; if( iTabDb==1 || isTemp ) code = SQLITE_CREATE_TEMP_TRIGGER; if( sqlite3AuthCheck(pParse, code, zName, pTab->zName, zDbTrig) ){ goto trigger_cleanup; @@ -111371,8 +128140,7 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( pStepList->pTrig = pTrig; pStepList = pStepList->pNext; } - nameToken.z = pTrig->zName; - nameToken.n = sqlite3Strlen30(nameToken.z); + sqlite3TokenInit(&nameToken, pTrig->zName); sqlite3FixInit(&sFix, pParse, iDb, "trigger", &nameToken); if( sqlite3FixTriggerStep(&sFix, pTrig->step_list) || sqlite3FixExpr(&sFix, pTrig->pWhen) @@ -111392,9 +128160,10 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( if( v==0 ) goto triggerfinish_cleanup; sqlite3BeginWriteOperation(pParse, 0, iDb); z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); + testcase( z==0 ); sqlite3NestedParse(pParse, "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), zName, + db->aDb[iDb].zDbSName, MASTER_NAME, zName, pTrig->table, z); sqlite3DbFree(db, z); sqlite3ChangeCookie(pParse, iDb); @@ -111408,7 +128177,7 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); pTrig = sqlite3HashInsert(pHash, zName, pTrig); if( pTrig ){ - db->mallocFailed = 1; + sqlite3OomFault(db); }else if( pLink->pSchema==pLink->pTabSchema ){ Table *pTab; pTab = sqlite3HashFind(&pLink->pTabSchema->tblHash, pLink->table); @@ -111424,6 +128193,17 @@ triggerfinish_cleanup: sqlite3DeleteTriggerStep(db, pStepList); } +/* +** Duplicate a range of text from an SQL statement, then convert all +** whitespace characters into ordinary space characters. +*/ +static char *triggerSpanDup(sqlite3 *db, const char *zStart, const char *zEnd){ + char *z = sqlite3DbSpanDup(db, zStart, zEnd); + int i; + if( z ) for(i=0; z[i]; i++) if( sqlite3Isspace(z[i]) ) z[i] = ' '; + return z; +} + /* ** Turn a SELECT statement (that the pSelect parameter points to) into ** a trigger step. Return a pointer to a TriggerStep structure. @@ -111431,7 +128211,12 @@ triggerfinish_cleanup: ** The parser calls this routine when it finds a SELECT statement in ** body of a TRIGGER. */ -SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelect){ +SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep( + sqlite3 *db, /* Database connection */ + Select *pSelect, /* The SELECT statement */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ +){ TriggerStep *pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep)); if( pTriggerStep==0 ) { sqlite3SelectDelete(db, pSelect); @@ -111440,6 +128225,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelec pTriggerStep->op = TK_SELECT; pTriggerStep->pSelect = pSelect; pTriggerStep->orconf = OE_Default; + pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd); return pTriggerStep; } @@ -111452,17 +128238,20 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerSelectStep(sqlite3 *db, Select *pSelec static TriggerStep *triggerStepAllocate( sqlite3 *db, /* Database connection */ u8 op, /* Trigger opcode */ - Token *pName /* The target name */ + Token *pName, /* The target name */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ ){ TriggerStep *pTriggerStep; - pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n); + pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1); if( pTriggerStep ){ char *z = (char*)&pTriggerStep[1]; memcpy(z, pName->z, pName->n); - pTriggerStep->target.z = z; - pTriggerStep->target.n = pName->n; + sqlite3Dequote(z); + pTriggerStep->zTarget = z; pTriggerStep->op = op; + pTriggerStep->zSpan = triggerSpanDup(db, zStart, zEnd); } return pTriggerStep; } @@ -111479,19 +128268,26 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( Token *pTableName, /* Name of the table into which we insert */ IdList *pColumn, /* List of columns in pTableName to insert into */ Select *pSelect, /* A SELECT statement that supplies values */ - u8 orconf /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ + u8 orconf, /* The conflict algorithm (OE_Abort, OE_Replace, etc.) */ + Upsert *pUpsert, /* ON CONFLICT clauses for upsert */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ ){ TriggerStep *pTriggerStep; assert(pSelect != 0 || db->mallocFailed); - pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName); + pTriggerStep = triggerStepAllocate(db, TK_INSERT, pTableName, zStart, zEnd); if( pTriggerStep ){ pTriggerStep->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); pTriggerStep->pIdList = pColumn; + pTriggerStep->pUpsert = pUpsert; pTriggerStep->orconf = orconf; }else{ + testcase( pColumn ); sqlite3IdListDelete(db, pColumn); + testcase( pUpsert ); + sqlite3UpsertDelete(db, pUpsert); } sqlite3SelectDelete(db, pSelect); @@ -111508,11 +128304,13 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( Token *pTableName, /* Name of the table to be updated */ ExprList *pEList, /* The SET clause: list of column and new values */ Expr *pWhere, /* The WHERE clause */ - u8 orconf /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ + u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ ){ TriggerStep *pTriggerStep; - pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName); + pTriggerStep = triggerStepAllocate(db, TK_UPDATE, pTableName, zStart, zEnd); if( pTriggerStep ){ pTriggerStep->pExprList = sqlite3ExprListDup(db, pEList, EXPRDUP_REDUCE); pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); @@ -111531,11 +128329,13 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( SQLITE_PRIVATE TriggerStep *sqlite3TriggerDeleteStep( sqlite3 *db, /* Database connection */ Token *pTableName, /* The table from which rows are deleted */ - Expr *pWhere /* The WHERE clause */ + Expr *pWhere, /* The WHERE clause */ + const char *zStart, /* Start of SQL text */ + const char *zEnd /* End of SQL text */ ){ TriggerStep *pTriggerStep; - pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName); + pTriggerStep = triggerStepAllocate(db, TK_DELETE, pTableName, zStart, zEnd); if( pTriggerStep ){ pTriggerStep->pWhere = sqlite3ExprDup(db, pWhere, EXPRDUP_REDUCE); pTriggerStep->orconf = OE_Default; @@ -111583,7 +128383,7 @@ SQLITE_PRIVATE void sqlite3DropTrigger(Parse *pParse, SrcList *pName, int noErr) assert( zDb!=0 || sqlite3BtreeHoldsAllMutexes(db) ); for(i=OMIT_TEMPDB; i<db->nDb; i++){ int j = (i<2) ? i^1 : i; /* Search TEMP before MAIN */ - if( zDb && sqlite3StrICmp(db->aDb[j].zName, zDb) ) continue; + if( zDb && sqlite3StrICmp(db->aDb[j].zDbSName, zDb) ) continue; assert( sqlite3SchemaMutexHeld(db, j, 0) ); pTrigger = sqlite3HashFind(&(db->aDb[j].pSchema->trigHash), zName); if( pTrigger ) break; @@ -111629,7 +128429,7 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ #ifndef SQLITE_OMIT_AUTHORIZATION { int code = SQLITE_DROP_TRIGGER; - const char *zDb = db->aDb[iDb].zName; + const char *zDb = db->aDb[iDb].zDbSName; const char *zTab = SCHEMA_TABLE(iDb); if( iDb==1 ) code = SQLITE_DROP_TEMP_TRIGGER; if( sqlite3AuthCheck(pParse, code, pTrigger->zName, pTable->zName, zDb) || @@ -111643,31 +128443,12 @@ SQLITE_PRIVATE void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ */ assert( pTable!=0 ); if( (v = sqlite3GetVdbe(pParse))!=0 ){ - int base; - static const int iLn = VDBE_OFFSET_LINENO(2); - static const VdbeOpList dropTrigger[] = { - { OP_Rewind, 0, ADDR(9), 0}, - { OP_String8, 0, 1, 0}, /* 1 */ - { OP_Column, 0, 1, 2}, - { OP_Ne, 2, ADDR(8), 1}, - { OP_String8, 0, 1, 0}, /* 4: "trigger" */ - { OP_Column, 0, 0, 2}, - { OP_Ne, 2, ADDR(8), 1}, - { OP_Delete, 0, 0, 0}, - { OP_Next, 0, ADDR(1), 0}, /* 8 */ - }; - - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3OpenMasterTable(pParse, iDb); - base = sqlite3VdbeAddOpList(v, ArraySize(dropTrigger), dropTrigger, iLn); - sqlite3VdbeChangeP4(v, base+1, pTrigger->zName, P4_TRANSIENT); - sqlite3VdbeChangeP4(v, base+4, "trigger", P4_STATIC); + sqlite3NestedParse(pParse, + "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", + db->aDb[iDb].zDbSName, MASTER_NAME, pTrigger->zName + ); sqlite3ChangeCookie(pParse, iDb); - sqlite3VdbeAddOp2(v, OP_Close, 0, 0); sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); - if( pParse->nMem<3 ){ - pParse->nMem = 3; - } } } @@ -111689,7 +128470,7 @@ SQLITE_PRIVATE void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const ch *pp = (*pp)->pNext; } sqlite3DeleteTrigger(db, pTrigger); - db->flags |= SQLITE_InternChanges; + db->mDbFlags |= DBFLAG_SchemaChange; } } @@ -111744,7 +128525,7 @@ SQLITE_PRIVATE Trigger *sqlite3TriggersExist( } /* -** Convert the pStep->target token into a SrcList and return a pointer +** Convert the pStep->zTarget string into a SrcList and return a pointer ** to that SrcList. ** ** This routine adds a specific database name, if needed, to the target when @@ -111757,18 +128538,20 @@ static SrcList *targetSrcList( Parse *pParse, /* The parsing context */ TriggerStep *pStep /* The trigger containing the target token */ ){ + sqlite3 *db = pParse->db; int iDb; /* Index of the database to use */ SrcList *pSrc; /* SrcList to be returned */ - pSrc = sqlite3SrcListAppend(pParse->db, 0, &pStep->target, 0); + pSrc = sqlite3SrcListAppend(db, 0, 0, 0); if( pSrc ){ assert( pSrc->nSrc>0 ); - assert( pSrc->a!=0 ); - iDb = sqlite3SchemaToIndex(pParse->db, pStep->pTrig->pSchema); + pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); + iDb = sqlite3SchemaToIndex(db, pStep->pTrig->pSchema); if( iDb==0 || iDb>=2 ){ - sqlite3 *db = pParse->db; - assert( iDb<pParse->db->nDb ); - pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zName); + const char *zDb; + assert( iDb<db->nDb ); + zDb = db->aDb[iDb].zDbSName; + pSrc->a[pSrc->nSrc-1].zDatabase = sqlite3DbStrDup(db, zDb); } } return pSrc; @@ -111807,13 +128590,21 @@ static int codeTriggerProgram( pParse->eOrconf = (orconf==OE_Default)?pStep->orconf:(u8)orconf; assert( pParse->okConstFactor==0 ); +#ifndef SQLITE_OMIT_TRACE + if( pStep->zSpan ){ + sqlite3VdbeAddOp4(v, OP_Trace, 0x7fffffff, 1, 0, + sqlite3MPrintf(db, "-- %s", pStep->zSpan), + P4_DYNAMIC); + } +#endif + switch( pStep->op ){ case TK_UPDATE: { sqlite3Update(pParse, targetSrcList(pParse, pStep), sqlite3ExprListDup(db, pStep->pExprList, 0), sqlite3ExprDup(db, pStep->pWhere, 0), - pParse->eOrconf + pParse->eOrconf, 0, 0, 0 ); break; } @@ -111822,14 +128613,15 @@ static int codeTriggerProgram( targetSrcList(pParse, pStep), sqlite3SelectDup(db, pStep->pSelect, 0), sqlite3IdListDup(db, pStep->pIdList), - pParse->eOrconf + pParse->eOrconf, + sqlite3UpsertDup(db, pStep->pUpsert) ); break; } case TK_DELETE: { sqlite3DeleteFrom(pParse, targetSrcList(pParse, pStep), - sqlite3ExprDup(db, pStep->pWhere, 0) + sqlite3ExprDup(db, pStep->pWhere, 0), 0, 0 ); break; } @@ -111879,6 +128671,7 @@ static void transferParseError(Parse *pTo, Parse *pFrom){ if( pTo->nErr==0 ){ pTo->zErrMsg = pFrom->zErrMsg; pTo->nErr = pFrom->nErr; + pTo->rc = pFrom->rc; }else{ sqlite3DbFree(pFrom->db, pFrom->zErrMsg); } @@ -111946,9 +128739,11 @@ static TriggerPrg *codeRowTrigger( pTab->zName )); #ifndef SQLITE_OMIT_TRACE - sqlite3VdbeChangeP4(v, -1, - sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC - ); + if( pTrigger->zName ){ + sqlite3VdbeChangeP4(v, -1, + sqlite3MPrintf(db, "-- TRIGGER %s", pTrigger->zName), P4_DYNAMIC + ); + } #endif /* If one was specified, code the WHEN clause. If it evaluates to false @@ -111976,12 +128771,11 @@ static TriggerPrg *codeRowTrigger( VdbeComment((v, "End: %s.%s", pTrigger->zName, onErrorText(orconf))); transferParseError(pParse, pSubParse); - if( db->mallocFailed==0 ){ + if( db->mallocFailed==0 && pParse->nErr==0 ){ pProgram->aOp = sqlite3VdbeTakeOpArray(v, &pProgram->nOp, &pTop->nMaxArg); } pProgram->nMem = pSubParse->nMem; pProgram->nCsr = pSubParse->nTab; - pProgram->nOnce = pSubParse->nOnce; pProgram->token = (void *)pTrigger; pPrg->aColmask[0] = pSubParse->oldmask; pPrg->aColmask[1] = pSubParse->newmask; @@ -112054,8 +128848,8 @@ SQLITE_PRIVATE void sqlite3CodeRowTriggerDirect( if( pPrg ){ int bRecursive = (p->zName && 0==(pParse->db->flags&SQLITE_RecTriggers)); - sqlite3VdbeAddOp3(v, OP_Program, reg, ignoreJump, ++pParse->nMem); - sqlite3VdbeChangeP4(v, -1, (const char *)pPrg->pProgram, P4_SUBPROGRAM); + sqlite3VdbeAddOp4(v, OP_Program, reg, ignoreJump, ++pParse->nMem, + (const char *)pPrg->pProgram, P4_SUBPROGRAM); VdbeComment( (v, "Call: %s.%s", (p->zName?p->zName:"fkey"), onErrorText(orconf))); @@ -112217,6 +129011,7 @@ SQLITE_PRIVATE u32 sqlite3TriggerColmask( ** This file contains C code routines that are called by the parser ** to handle UPDATE statements. */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_VIRTUALTABLE /* Forward declaration */ @@ -112273,14 +129068,14 @@ SQLITE_PRIVATE void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, pCol->affinity, &pValue); if( pValue ){ - sqlite3VdbeChangeP4(v, -1, (const char *)pValue, P4_MEM); + sqlite3VdbeAppendP4(v, pValue, P4_MEM); } -#ifndef SQLITE_OMIT_FLOATING_POINT - if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ - sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); - } -#endif } +#ifndef SQLITE_OMIT_FLOATING_POINT + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, iReg); + } +#endif } /* @@ -112295,7 +129090,10 @@ SQLITE_PRIVATE void sqlite3Update( SrcList *pTabList, /* The table in which we should change things */ ExprList *pChanges, /* Things to be changed */ Expr *pWhere, /* The WHERE clause. May be null */ - int onError /* How to handle constraint errors */ + int onError, /* How to handle constraint errors */ + ExprList *pOrderBy, /* ORDER BY clause. May be null */ + Expr *pLimit, /* LIMIT clause. May be null */ + Upsert *pUpsert /* ON CONFLICT clause, or null */ ){ int i, j; /* Loop counters */ Table *pTab; /* The table to be updated */ @@ -112309,7 +129107,7 @@ SQLITE_PRIVATE void sqlite3Update( int iDataCur; /* Cursor for the canonical data btree */ int iIdxCur; /* Cursor for the first index */ sqlite3 *db; /* The database structure */ - int *aRegIdx = 0; /* One register assigned to each index to be updated */ + int *aRegIdx = 0; /* First register in array assigned to each index */ int *aXRef = 0; /* aXRef[i] is the index in pChanges->a[] of the ** an expression for the i-th column of the table. ** aXRef[i]==-1 if the i-th column is not changed. */ @@ -112321,10 +129119,11 @@ SQLITE_PRIVATE void sqlite3Update( AuthContext sContext; /* The authorization context */ NameContext sNC; /* The name-context to resolve expressions in */ int iDb; /* Database containing the table being updated */ - int okOnePass; /* True for one-pass algorithm without the FIFO */ + int eOnePass; /* ONEPASS_XXX value from where.c */ int hasFK; /* True if foreign key processing is required */ int labelBreak; /* Jump here to break out of UPDATE loop */ int labelContinue; /* Jump here to continue next step of UPDATE loop */ + int flags; /* Flags for sqlite3WhereBegin() */ #ifndef SQLITE_OMIT_TRIGGER int isView; /* True when updating a view (INSTEAD OF trigger) */ @@ -112335,12 +129134,16 @@ SQLITE_PRIVATE void sqlite3Update( int iEph = 0; /* Ephemeral table holding all primary key values */ int nKey = 0; /* Number of elements in regKey for WITHOUT ROWID */ int aiCurOnePass[2]; /* The write cursors opened by WHERE_ONEPASS */ + int addrOpen = 0; /* Address of OP_OpenEphemeral */ + int iPk = 0; /* First of nPk cells holding PRIMARY KEY value */ + i16 nPk = 0; /* Number of components of the PRIMARY KEY */ + int bReplace = 0; /* True if REPLACE conflict resolution might happen */ /* Register Allocations */ int regRowCount = 0; /* A count of rows changed */ - int regOldRowid; /* The old rowid */ - int regNewRowid; /* The new rowid */ - int regNew; /* Content of the NEW.* table in triggers */ + int regOldRowid = 0; /* The old rowid */ + int regNewRowid = 0; /* The new rowid */ + int regNew = 0; /* Content of the NEW.* table in triggers */ int regOld = 0; /* Content of OLD.* table in triggers */ int regRowSet = 0; /* Rowset of rows to be updated */ int regKey = 0; /* composite PRIMARY KEY value */ @@ -112375,6 +129178,16 @@ SQLITE_PRIVATE void sqlite3Update( # define isView 0 #endif +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + if( !isView ){ + pWhere = sqlite3LimitWhere( + pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE" + ); + pOrderBy = 0; + pLimit = 0; + } +#endif + if( sqlite3ViewGetColumnNames(pParse, pTab) ){ goto update_cleanup; } @@ -112387,21 +129200,28 @@ SQLITE_PRIVATE void sqlite3Update( ** need to occur right after the database cursor. So go ahead and ** allocate enough space, just in case. */ - pTabList->a[0].iCursor = iBaseCur = iDataCur = pParse->nTab++; + iBaseCur = iDataCur = pParse->nTab++; iIdxCur = iDataCur+1; pPk = HasRowid(pTab) ? 0 : sqlite3PrimaryKeyIndex(pTab); + testcase( pPk!=0 && pPk!=pTab->pIndex ); for(nIdx=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, nIdx++){ - if( IsPrimaryKeyIndex(pIdx) && pPk!=0 ){ + if( pPk==pIdx ){ iDataCur = pParse->nTab; - pTabList->a[0].iCursor = iDataCur; } pParse->nTab++; } + if( pUpsert ){ + /* On an UPSERT, reuse the same cursors already opened by INSERT */ + iDataCur = pUpsert->iDataCur; + iIdxCur = pUpsert->iIdxCur; + pParse->nTab = iBaseCur; + } + pTabList->a[0].iCursor = iDataCur; /* Allocate space for aXRef[], aRegIdx[], and aToOpen[]. ** Initialize aXRef[] and aToOpen[] to their default values. */ - aXRef = sqlite3DbMallocRaw(db, sizeof(int) * (pTab->nCol+nIdx) + nIdx+2 ); + aXRef = sqlite3DbMallocRawNN(db, sizeof(int) * (pTab->nCol+nIdx) + nIdx+2 ); if( aXRef==0 ) goto update_cleanup; aRegIdx = aXRef+pTab->nCol; aToOpen = (u8*)(aRegIdx+nIdx); @@ -112413,6 +129233,8 @@ SQLITE_PRIVATE void sqlite3Update( memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; + sNC.uNC.pUpsert = pUpsert; + sNC.ncFlags = NC_UUpsert; /* Resolve the column names in all the expressions of the ** of the UPDATE statement. Also find the column index @@ -112453,7 +129275,7 @@ SQLITE_PRIVATE void sqlite3Update( int rc; rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName, j<0 ? "ROWID" : pTab->aCol[j].zName, - db->aDb[iDb].zName); + db->aDb[iDb].zDbSName); if( rc==SQLITE_DENY ){ goto update_cleanup; }else if( rc==SQLITE_IGNORE ){ @@ -112467,26 +129289,38 @@ SQLITE_PRIVATE void sqlite3Update( assert( chngPk==0 || chngPk==1 ); chngKey = chngRowid + chngPk; - /* The SET expressions are not actually used inside the WHERE loop. - ** So reset the colUsed mask + /* The SET expressions are not actually used inside the WHERE loop. + ** So reset the colUsed mask. Unless this is a virtual table. In that + ** case, set all bits of the colUsed mask (to ensure that the virtual + ** table implementation makes all columns available). */ - pTabList->a[0].colUsed = 0; + pTabList->a[0].colUsed = IsVirtual(pTab) ? ALLBITS : 0; hasFK = sqlite3FkRequired(pParse, pTab, aXRef, chngKey); /* There is one entry in the aRegIdx[] array for each index on the table ** being updated. Fill in aRegIdx[] with a register number that will hold - ** the key for accessing each index. + ** the key for accessing each index. + ** + ** FIXME: Be smarter about omitting indexes that use expressions. */ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int reg; - if( chngKey || hasFK || pIdx->pPartIdxWhere || pIdx==pPk ){ + if( chngKey || hasFK>1 || pIdx->pPartIdxWhere || pIdx==pPk ){ reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; }else{ reg = 0; for(i=0; i<pIdx->nKeyCol; i++){ - if( aXRef[pIdx->aiColumn[i]]>=0 ){ + i16 iIdxCol = pIdx->aiColumn[i]; + if( iIdxCol<0 || aXRef[iIdxCol]>=0 ){ reg = ++pParse->nMem; + pParse->nMem += pIdx->nColumn; + if( (onError==OE_Replace) + || (onError==OE_Default && pIdx->onError==OE_Replace) + ){ + bReplace = 1; + } break; } } @@ -112494,36 +129328,32 @@ SQLITE_PRIVATE void sqlite3Update( if( reg==0 ) aToOpen[j+1] = 0; aRegIdx[j] = reg; } + if( bReplace ){ + /* If REPLACE conflict resolution might be invoked, open cursors on all + ** indexes in case they are needed to delete records. */ + memset(aToOpen, 1, nIdx+1); + } /* Begin generating code. */ v = sqlite3GetVdbe(pParse); if( v==0 ) goto update_cleanup; if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); - sqlite3BeginWriteOperation(pParse, 1, iDb); - -#ifndef SQLITE_OMIT_VIRTUALTABLE - /* Virtual tables must be handled separately */ - if( IsVirtual(pTab) ){ - updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, - pWhere, onError); - pWhere = 0; - pTabList = 0; - goto update_cleanup; - } -#endif + sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb); /* Allocate required registers. */ - regRowSet = ++pParse->nMem; - regOldRowid = regNewRowid = ++pParse->nMem; - if( chngPk || pTrigger || hasFK ){ - regOld = pParse->nMem + 1; + if( !IsVirtual(pTab) ){ + regRowSet = ++pParse->nMem; + regOldRowid = regNewRowid = ++pParse->nMem; + if( chngPk || pTrigger || hasFK ){ + regOld = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + if( chngKey || pTrigger || hasFK ){ + regNewRowid = ++pParse->nMem; + } + regNew = pParse->nMem + 1; pParse->nMem += pTab->nCol; } - if( chngKey || pTrigger || hasFK ){ - regNewRowid = ++pParse->nMem; - } - regNew = pParse->nMem + 1; - pParse->nMem += pTab->nCol; /* Start the view context. */ if( isView ){ @@ -112535,7 +129365,11 @@ SQLITE_PRIVATE void sqlite3Update( */ #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) if( isView ){ - sqlite3MaterializeView(pParse, pTab, pWhere, iDataCur); + sqlite3MaterializeView(pParse, pTab, + pWhere, pOrderBy, pLimit, iDataCur + ); + pOrderBy = 0; + pLimit = 0; } #endif @@ -112546,120 +129380,173 @@ SQLITE_PRIVATE void sqlite3Update( goto update_cleanup; } - /* Begin the database scan - */ +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Virtual tables must be handled separately */ + if( IsVirtual(pTab) ){ + updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, + pWhere, onError); + goto update_cleanup; + } +#endif + + /* Jump to labelBreak to abandon further processing of this UPDATE */ + labelContinue = labelBreak = sqlite3VdbeMakeLabel(v); + + /* Not an UPSERT. Normal processing. Begin by + ** initialize the count of updated rows */ + if( (db->flags&SQLITE_CountRows)!=0 + && !pParse->pTriggerTab + && !pParse->nested + && pUpsert==0 + ){ + regRowCount = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); + } + if( HasRowid(pTab) ){ sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid); - pWInfo = sqlite3WhereBegin( - pParse, pTabList, pWhere, 0, 0, WHERE_ONEPASS_DESIRED, iIdxCur - ); - if( pWInfo==0 ) goto update_cleanup; - okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); - - /* Remember the rowid of every item to be updated. - */ - sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); - if( !okOnePass ){ - sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); - } - - /* End the database scan loop. - */ - sqlite3WhereEnd(pWInfo); }else{ - int iPk; /* First of nPk memory cells holding PRIMARY KEY value */ - i16 nPk; /* Number of components of the PRIMARY KEY */ - int addrOpen; /* Address of the OpenEphemeral instruction */ - assert( pPk!=0 ); nPk = pPk->nKeyCol; iPk = pParse->nMem+1; pParse->nMem += nPk; regKey = ++pParse->nMem; - iEph = pParse->nTab++; - sqlite3VdbeAddOp2(v, OP_Null, 0, iPk); - addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk); - sqlite3VdbeSetP4KeyInfo(pParse, pPk); - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, - WHERE_ONEPASS_DESIRED, iIdxCur); - if( pWInfo==0 ) goto update_cleanup; - okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); - for(i=0; i<nPk; i++){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pPk->aiColumn[i], - iPk+i); + if( pUpsert==0 ){ + iEph = pParse->nTab++; + sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1); + addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); } - if( okOnePass ){ - sqlite3VdbeChangeToNoop(v, addrOpen); + } + + if( pUpsert ){ + /* If this is an UPSERT, then all cursors have already been opened by + ** the outer INSERT and the data cursor should be pointing at the row + ** that is to be updated. So bypass the code that searches for the + ** row(s) to be updated. + */ + pWInfo = 0; + eOnePass = ONEPASS_SINGLE; + sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); + }else{ + /* Begin the database scan. + ** + ** Do not consider a single-pass strategy for a multi-row update if + ** there are any triggers or foreign keys to process, or rows may + ** be deleted as a result of REPLACE conflict handling. Any of these + ** things might disturb a cursor being used to scan through the table + ** or index, causing a single-pass approach to malfunction. */ + flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE; + if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){ + flags |= WHERE_ONEPASS_MULTIROW; + } + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur); + if( pWInfo==0 ) goto update_cleanup; + + /* A one-pass strategy that might update more than one row may not + ** be used if any column of the index used for the scan is being + ** updated. Otherwise, if there is an index on "b", statements like + ** the following could create an infinite loop: + ** + ** UPDATE t1 SET b=b+1 WHERE b>? + ** + ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI + ** strategy that uses an index for which one or more columns are being + ** updated. */ + eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + if( eOnePass!=ONEPASS_SINGLE ){ + sqlite3MultiWrite(pParse); + if( eOnePass==ONEPASS_MULTI ){ + int iCur = aiCurOnePass[1]; + if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){ + eOnePass = ONEPASS_OFF; + } + assert( iCur!=iDataCur || !HasRowid(pTab) ); + } + } + } + + if( HasRowid(pTab) ){ + /* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF + ** mode, write the rowid into the FIFO. In either of the one-pass modes, + ** leave it in register regOldRowid. */ + sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); + if( eOnePass==ONEPASS_OFF ){ + sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); + } + }else{ + /* Read the PK of the current row into an array of registers. In + ** ONEPASS_OFF mode, serialize the array into a record and store it in + ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change + ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table + ** is not required) and leave the PK fields in the array of registers. */ + for(i=0; i<nPk; i++){ + assert( pPk->aiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur,pPk->aiColumn[i],iPk+i); + } + if( eOnePass ){ + if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); nKey = nPk; regKey = iPk; }else{ sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, - sqlite3IndexAffinityStr(v, pPk), nPk); - sqlite3VdbeAddOp2(v, OP_IdxInsert, iEph, regKey); + sqlite3IndexAffinityStr(db, pPk), nPk); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk); } - sqlite3WhereEnd(pWInfo); } - /* Initialize the count of updated rows - */ - if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab ){ - regRowCount = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); - } - - labelBreak = sqlite3VdbeMakeLabel(v); - if( !isView ){ - /* - ** Open every index that needs updating. Note that if any - ** index could potentially invoke a REPLACE conflict resolution - ** action, then we need to open all indices because we might need - ** to be deleting some records. - */ - if( onError==OE_Replace ){ - memset(aToOpen, 1, nIdx+1); - }else{ - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - if( pIdx->onError==OE_Replace ){ - memset(aToOpen, 1, nIdx+1); - break; - } + if( pUpsert==0 ){ + if( eOnePass!=ONEPASS_MULTI ){ + sqlite3WhereEnd(pWInfo); + } + + if( !isView ){ + int addrOnce = 0; + + /* Open every index that needs updating. */ + if( eOnePass!=ONEPASS_OFF ){ + if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0; + if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0; } + + if( eOnePass==ONEPASS_MULTI && (nIdx-(aiCurOnePass[1]>=0))>0 ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, 0, iBaseCur, + aToOpen, 0, 0); + if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); } - if( okOnePass ){ - if( aiCurOnePass[0]>=0 ) aToOpen[aiCurOnePass[0]-iBaseCur] = 0; - if( aiCurOnePass[1]>=0 ) aToOpen[aiCurOnePass[1]-iBaseCur] = 0; + + /* Top of the update loop */ + if( eOnePass!=ONEPASS_OFF ){ + if( !isView && aiCurOnePass[0]!=iDataCur && aiCurOnePass[1]!=iDataCur ){ + assert( pPk ); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey,nKey); + VdbeCoverageNeverTaken(v); + } + if( eOnePass!=ONEPASS_SINGLE ){ + labelContinue = sqlite3VdbeMakeLabel(v); + } + sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); + VdbeCoverageIf(v, pPk==0); + VdbeCoverageIf(v, pPk!=0); + }else if( pPk ){ + labelContinue = sqlite3VdbeMakeLabel(v); + sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); + addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); + VdbeCoverage(v); + }else{ + labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet,labelBreak, + regOldRowid); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); + VdbeCoverage(v); } - sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenWrite, iBaseCur, aToOpen, - 0, 0); } - /* Top of the update loop */ - if( okOnePass ){ - if( aToOpen[iDataCur-iBaseCur] && !isView ){ - assert( pPk ); - sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelBreak, regKey, nKey); - VdbeCoverageNeverTaken(v); - } - labelContinue = labelBreak; - sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); - VdbeCoverageIf(v, pPk==0); - VdbeCoverageIf(v, pPk!=0); - }else if( pPk ){ - labelContinue = sqlite3VdbeMakeLabel(v); - sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); - addrTop = sqlite3VdbeAddOp2(v, OP_RowKey, iEph, regKey); - sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); - VdbeCoverage(v); - }else{ - labelContinue = sqlite3VdbeAddOp3(v, OP_RowSetRead, regRowSet, labelBreak, - regOldRowid); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); - VdbeCoverage(v); - } - - /* If the record number will change, set register regNewRowid to - ** contain the new value. If the record number is not being modified, + /* If the rowid value will change, set register regNewRowid to + ** contain the new value. If the rowid is not being modified, ** then regNewRowid is the same register as regOldRowid, which is ** already populated. */ assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid ); @@ -112707,7 +129594,6 @@ SQLITE_PRIVATE void sqlite3Update( newmask = sqlite3TriggerColmask( pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError ); - /*sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1);*/ for(i=0; i<pTab->nCol; i++){ if( i==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); @@ -112723,7 +129609,13 @@ SQLITE_PRIVATE void sqlite3Update( */ testcase( i==31 ); testcase( i==32 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); + sqlite3ExprCodeGetColumnToReg(pParse, pTab, i, iDataCur, regNew+i); + if( tmask & TRIGGER_BEFORE ){ + /* This value will be recomputed in After-BEFORE-trigger-reload-loop + ** below, so make sure that it is not cached and reused. + ** Ticket d85fffd6ffe856092ed8daefa811b1e399706b28. */ + sqlite3ExprCacheRemove(pParse, regNew+i, 1); + } }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); } @@ -112752,10 +129644,14 @@ SQLITE_PRIVATE void sqlite3Update( VdbeCoverage(v); } - /* If it did not delete it, the row-trigger may still have modified + /* After-BEFORE-trigger-reload-loop: + ** If it did not delete it, the BEFORE trigger may still have modified ** some of the columns of the row being updated. Load the values for - ** all columns not modified by the update statement into their - ** registers in case this has happened. + ** all columns not modified by the update statement into their registers + ** in case this has happened. Only unmodified columns are reloaded. + ** The values computed for modified columns use the values before the + ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26) + ** for an example. */ for(i=0; i<pTab->nCol; i++){ if( aXRef[i]<0 && i!=pTab->iPKey ){ @@ -112765,13 +129661,13 @@ SQLITE_PRIVATE void sqlite3Update( } if( !isView ){ - int j1 = 0; /* Address of jump instruction */ - int bReplace = 0; /* True if REPLACE conflict resolution might happen */ + int addr1 = 0; /* Address of jump instruction */ /* Do constraint checks. */ assert( regOldRowid>0 ); sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, - regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace); + regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, + aXRef, 0); /* Do FK constraint checks. */ if( hasFK ){ @@ -112781,20 +129677,43 @@ SQLITE_PRIVATE void sqlite3Update( /* Delete the index entries associated with the current record. */ if( bReplace || chngKey ){ if( pPk ){ - j1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); + addr1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); }else{ - j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); + addr1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); } VdbeCoverageNeverTaken(v); } - sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx); - - /* If changing the record number, delete the old record. */ - if( hasFK || chngKey || pPk!=0 ){ + sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); + + /* If changing the rowid value, or if there are foreign key constraints + ** to process, delete the old record. Otherwise, add a noop OP_Delete + ** to invoke the pre-update hook. + ** + ** That (regNew==regnewRowid+1) is true is also important for the + ** pre-update hook. If the caller invokes preupdate_new(), the returned + ** value is copied from memory cell (regNewRowid+1+iCol), where iCol + ** is the column index supplied by the user. + */ + assert( regNew==regNewRowid+1 ); +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK + sqlite3VdbeAddOp3(v, OP_Delete, iDataCur, + OPFLAG_ISUPDATE | ((hasFK>1 || chngKey) ? 0 : OPFLAG_ISNOOP), + regNewRowid + ); + if( eOnePass==ONEPASS_MULTI ){ + assert( hasFK==0 && chngKey==0 ); + sqlite3VdbeChangeP5(v, OPFLAG_SAVEPOSITION); + } + if( !pParse->nested ){ + sqlite3VdbeAppendP4(v, pTab, P4_TABLE); + } +#else + if( hasFK>1 || chngKey ){ sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); } +#endif if( bReplace || chngKey ){ - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); } if( hasFK ){ @@ -112802,8 +129721,11 @@ SQLITE_PRIVATE void sqlite3Update( } /* Insert the new index entries and the new record. */ - sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, - regNewRowid, aRegIdx, 1, 0, 0); + sqlite3CompleteInsertion( + pParse, pTab, iDataCur, iIdxCur, regNewRowid, aRegIdx, + OPFLAG_ISUPDATE | (eOnePass==ONEPASS_MULTI ? OPFLAG_SAVEPOSITION : 0), + 0, 0 + ); /* Do any ON CASCADE, SET NULL or SET DEFAULT operations required to ** handle rows (possibly in other tables) that refer via a foreign key @@ -112815,7 +129737,7 @@ SQLITE_PRIVATE void sqlite3Update( /* Increment the row counter */ - if( (db->flags & SQLITE_CountRows) && !pParse->pTriggerTab){ + if( regRowCount ){ sqlite3VdbeAddOp2(v, OP_AddImm, regRowCount, 1); } @@ -112825,39 +129747,32 @@ SQLITE_PRIVATE void sqlite3Update( /* Repeat the above with the next record to be updated, until ** all record selected by the WHERE clause have been updated. */ - if( okOnePass ){ + if( eOnePass==ONEPASS_SINGLE ){ /* Nothing to do at end-of-loop for a single-pass */ + }else if( eOnePass==ONEPASS_MULTI ){ + sqlite3VdbeResolveLabel(v, labelContinue); + sqlite3WhereEnd(pWInfo); }else if( pPk ){ sqlite3VdbeResolveLabel(v, labelContinue); sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v); }else{ - sqlite3VdbeAddOp2(v, OP_Goto, 0, labelContinue); + sqlite3VdbeGoto(v, labelContinue); } sqlite3VdbeResolveLabel(v, labelBreak); - /* Close all tables */ - for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ - assert( aRegIdx ); - if( aToOpen[i+1] ){ - sqlite3VdbeAddOp2(v, OP_Close, iIdxCur+i, 0); - } - } - if( iDataCur<iIdxCur ) sqlite3VdbeAddOp2(v, OP_Close, iDataCur, 0); - /* Update the sqlite_sequence table by storing the content of the ** maximum rowid counter values recorded while inserting into ** autoincrement tables. */ - if( pParse->nested==0 && pParse->pTriggerTab==0 ){ + if( pParse->nested==0 && pParse->pTriggerTab==0 && pUpsert==0 ){ sqlite3AutoincrementEnd(pParse); } /* - ** Return the number of rows that were changed. If this routine is - ** generating code because of a call to sqlite3NestedParse(), do not - ** invoke the callback function. + ** Return the number of rows that were changed, if we are tracking + ** that information. */ - if( (db->flags&SQLITE_CountRows) && !pParse->pTriggerTab && !pParse->nested ){ + if( regRowCount ){ sqlite3VdbeAddOp2(v, OP_ResultRow, regRowCount, 1); sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "rows updated", SQLITE_STATIC); @@ -112869,6 +129784,10 @@ update_cleanup: sqlite3SrcListDelete(db, pTabList); sqlite3ExprListDelete(db, pChanges); sqlite3ExprDelete(db, pWhere); +#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) + sqlite3ExprListDelete(db, pOrderBy); + sqlite3ExprDelete(db, pLimit); +#endif return; } /* Make sure "isView" and other macros defined above are undefined. Otherwise @@ -112885,21 +129804,23 @@ update_cleanup: /* ** Generate code for an UPDATE of a virtual table. ** -** The strategy is that we create an ephemeral table that contains +** There are two possible strategies - the default and the special +** "onepass" strategy. Onepass is only used if the virtual table +** implementation indicates that pWhere may match at most one row. +** +** The default strategy is to create an ephemeral table that contains ** for each row to be changed: ** ** (A) The original rowid of that row. -** (B) The revised rowid for the row. (note1) +** (B) The revised rowid for the row. ** (C) The content of every column in the row. ** -** Then we loop over this ephemeral table and for each row in -** the ephemeral table call VUpdate. +** Then loop through the contents of this ephemeral table executing a +** VUpdate for each row. When finished, drop the ephemeral table. ** -** When finished, drop the ephemeral table. -** -** (note1) Actually, if we know in advance that (A) is always the same -** as (B) we only store (A), then duplicate (A) when pulling -** it out of the ephemeral table before calling VUpdate. +** The "onepass" strategy does not use an ephemeral table. Instead, it +** stores the same values (A, B and C above) in a register array and +** makes a single invocation of VUpdate. */ static void updateVirtualTable( Parse *pParse, /* The parsing context */ @@ -112912,72 +129833,371 @@ static void updateVirtualTable( int onError /* ON CONFLICT strategy */ ){ Vdbe *v = pParse->pVdbe; /* Virtual machine under construction */ - ExprList *pEList = 0; /* The result set of the SELECT statement */ - Select *pSelect = 0; /* The SELECT statement */ - Expr *pExpr; /* Temporary expression */ int ephemTab; /* Table holding the result of the SELECT */ int i; /* Loop counter */ - int addr; /* Address of top of loop */ - int iReg; /* First register in set passed to OP_VUpdate */ sqlite3 *db = pParse->db; /* Database connection */ const char *pVTab = (const char*)sqlite3GetVTable(db, pTab); - SelectDest dest; + WhereInfo *pWInfo; + int nArg = 2 + pTab->nCol; /* Number of arguments to VUpdate */ + int regArg; /* First register in VUpdate arg array */ + int regRec; /* Register in which to assemble record */ + int regRowid; /* Register for ephem table rowid */ + int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */ + int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */ + int eOnePass; /* True to use onepass strategy */ + int addr; /* Address of OP_OpenEphemeral */ - /* Construct the SELECT statement that will find the new values for - ** all updated rows. - */ - pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, "_rowid_")); - if( pRowid ){ - pEList = sqlite3ExprListAppend(pParse, pEList, - sqlite3ExprDup(db, pRowid, 0)); - } - assert( pTab->iPKey<0 ); - for(i=0; i<pTab->nCol; i++){ - if( aXRef[i]>=0 ){ - pExpr = sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0); - }else{ - pExpr = sqlite3Expr(db, TK_ID, pTab->aCol[i].zName); - } - pEList = sqlite3ExprListAppend(pParse, pEList, pExpr); - } - pSelect = sqlite3SelectNew(pParse, pEList, pSrc, pWhere, 0, 0, 0, 0, 0, 0); - - /* Create the ephemeral table into which the update results will - ** be stored. - */ + /* Allocate nArg registers in which to gather the arguments for VUpdate. Then + ** create and open the ephemeral table in which the records created from + ** these arguments will be temporarily stored. */ assert( v ); ephemTab = pParse->nTab++; - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, pTab->nCol+1+(pRowid!=0)); - sqlite3VdbeChangeP5(v, BTREE_UNORDERED); + addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg); + regArg = pParse->nMem + 1; + pParse->nMem += nArg; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; - /* fill the ephemeral table - */ - sqlite3SelectDestInit(&dest, SRT_Table, ephemTab); - sqlite3Select(pParse, pSelect, &dest); + /* Start scanning the virtual table */ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0,0,WHERE_ONEPASS_DESIRED,0); + if( pWInfo==0 ) return; - /* Generate code to scan the ephemeral table and call VUpdate. */ - iReg = ++pParse->nMem; - pParse->nMem += pTab->nCol+1; - addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Column, ephemTab, 0, iReg); - sqlite3VdbeAddOp3(v, OP_Column, ephemTab, (pRowid?1:0), iReg+1); + /* Populate the argument registers. */ for(i=0; i<pTab->nCol; i++){ - sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i+1+(pRowid!=0), iReg+2+i); + if( aXRef[i]>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); + }else{ + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); + sqlite3VdbeChangeP5(v, 1); /* Enable sqlite3_vtab_nochange() */ + } + } + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pRowid ){ + sqlite3ExprCode(pParse, pRowid, regArg+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + } + }else{ + Index *pPk; /* PRIMARY KEY index */ + i16 iPk; /* PRIMARY KEY column */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->nKeyCol==1 ); + iPk = pPk->aiColumn[0]; + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg); + sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1); + } + + eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); + + /* There is no ONEPASS_MULTI on virtual tables */ + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + + if( eOnePass ){ + /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded + ** above. */ + sqlite3VdbeChangeToNoop(v, addr); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); + }else{ + /* Create a record from the argument register contents and insert it into + ** the ephemeral table. */ + sqlite3MultiWrite(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec); +#ifdef SQLITE_DEBUG + /* Signal an assert() within OP_MakeRecord that it is allowed to + ** accept no-change records with serial_type 10 */ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC); +#endif + sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); + } + + + if( eOnePass==ONEPASS_OFF ){ + /* End the virtual table scan */ + sqlite3WhereEnd(pWInfo); + + /* Begin scannning through the ephemeral table. */ + addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); + + /* Extract arguments from the current row of the ephemeral table and + ** invoke the VUpdate method. */ + for(i=0; i<nArg; i++){ + sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i, regArg+i); + } } sqlite3VtabMakeWritable(pParse, pTab); - sqlite3VdbeAddOp4(v, OP_VUpdate, 0, pTab->nCol+2, iReg, pVTab, P4_VTAB); + sqlite3VdbeAddOp4(v, OP_VUpdate, 0, nArg, regArg, pVTab, P4_VTAB); sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); sqlite3MayAbort(pParse); - sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v); - sqlite3VdbeJumpHere(v, addr); - sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0); - /* Cleanup */ - sqlite3SelectDelete(db, pSelect); + /* End of the ephemeral table scan. Or, if using the onepass strategy, + ** jump to here if the scan visited zero rows. */ + if( eOnePass==ONEPASS_OFF ){ + sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0); + }else{ + sqlite3WhereEnd(pWInfo); + } } #endif /* SQLITE_OMIT_VIRTUALTABLE */ /************** End of update.c **********************************************/ +/************** Begin file upsert.c ******************************************/ +/* +** 2018-04-12 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This file contains code to implement various aspects of UPSERT +** processing and handling of the Upsert object. +*/ +/* #include "sqliteInt.h" */ + +#ifndef SQLITE_OMIT_UPSERT +/* +** Free a list of Upsert objects +*/ +SQLITE_PRIVATE void sqlite3UpsertDelete(sqlite3 *db, Upsert *p){ + if( p ){ + sqlite3ExprListDelete(db, p->pUpsertTarget); + sqlite3ExprDelete(db, p->pUpsertTargetWhere); + sqlite3ExprListDelete(db, p->pUpsertSet); + sqlite3ExprDelete(db, p->pUpsertWhere); + sqlite3DbFree(db, p); + } +} + +/* +** Duplicate an Upsert object. +*/ +SQLITE_PRIVATE Upsert *sqlite3UpsertDup(sqlite3 *db, Upsert *p){ + if( p==0 ) return 0; + return sqlite3UpsertNew(db, + sqlite3ExprListDup(db, p->pUpsertTarget, 0), + sqlite3ExprDup(db, p->pUpsertTargetWhere, 0), + sqlite3ExprListDup(db, p->pUpsertSet, 0), + sqlite3ExprDup(db, p->pUpsertWhere, 0) + ); +} + +/* +** Create a new Upsert object. +*/ +SQLITE_PRIVATE Upsert *sqlite3UpsertNew( + sqlite3 *db, /* Determines which memory allocator to use */ + ExprList *pTarget, /* Target argument to ON CONFLICT, or NULL */ + Expr *pTargetWhere, /* Optional WHERE clause on the target */ + ExprList *pSet, /* UPDATE columns, or NULL for a DO NOTHING */ + Expr *pWhere /* WHERE clause for the ON CONFLICT UPDATE */ +){ + Upsert *pNew; + pNew = sqlite3DbMallocRaw(db, sizeof(Upsert)); + if( pNew==0 ){ + sqlite3ExprListDelete(db, pTarget); + sqlite3ExprDelete(db, pTargetWhere); + sqlite3ExprListDelete(db, pSet); + sqlite3ExprDelete(db, pWhere); + return 0; + }else{ + pNew->pUpsertTarget = pTarget; + pNew->pUpsertTargetWhere = pTargetWhere; + pNew->pUpsertSet = pSet; + pNew->pUpsertWhere = pWhere; + pNew->pUpsertIdx = 0; + } + return pNew; +} + +/* +** Analyze the ON CONFLICT clause described by pUpsert. Resolve all +** symbols in the conflict-target. +** +** Return SQLITE_OK if everything works, or an error code is something +** is wrong. +*/ +SQLITE_PRIVATE int sqlite3UpsertAnalyzeTarget( + Parse *pParse, /* The parsing context */ + SrcList *pTabList, /* Table into which we are inserting */ + Upsert *pUpsert /* The ON CONFLICT clauses */ +){ + Table *pTab; /* That table into which we are inserting */ + int rc; /* Result code */ + int iCursor; /* Cursor used by pTab */ + Index *pIdx; /* One of the indexes of pTab */ + ExprList *pTarget; /* The conflict-target clause */ + Expr *pTerm; /* One term of the conflict-target clause */ + NameContext sNC; /* Context for resolving symbolic names */ + Expr sCol[2]; /* Index column converted into an Expr */ + + assert( pTabList->nSrc==1 ); + assert( pTabList->a[0].pTab!=0 ); + assert( pUpsert!=0 ); + assert( pUpsert->pUpsertTarget!=0 ); + + /* Resolve all symbolic names in the conflict-target clause, which + ** includes both the list of columns and the optional partial-index + ** WHERE clause. + */ + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pParse; + sNC.pSrcList = pTabList; + rc = sqlite3ResolveExprListNames(&sNC, pUpsert->pUpsertTarget); + if( rc ) return rc; + rc = sqlite3ResolveExprNames(&sNC, pUpsert->pUpsertTargetWhere); + if( rc ) return rc; + + /* Check to see if the conflict target matches the rowid. */ + pTab = pTabList->a[0].pTab; + pTarget = pUpsert->pUpsertTarget; + iCursor = pTabList->a[0].iCursor; + if( HasRowid(pTab) + && pTarget->nExpr==1 + && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN + && pTerm->iColumn==XN_ROWID + ){ + /* The conflict-target is the rowid of the primary table */ + assert( pUpsert->pUpsertIdx==0 ); + return SQLITE_OK; + } + + /* Initialize sCol[0..1] to be an expression parse tree for a + ** single column of an index. The sCol[0] node will be the TK_COLLATE + ** operator and sCol[1] will be the TK_COLUMN operator. Code below + ** will populate the specific collation and column number values + ** prior to comparing against the conflict-target expression. + */ + memset(sCol, 0, sizeof(sCol)); + sCol[0].op = TK_COLLATE; + sCol[0].pLeft = &sCol[1]; + sCol[1].op = TK_COLUMN; + sCol[1].iTable = pTabList->a[0].iCursor; + + /* Check for matches against other indexes */ + for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int ii, jj, nn; + if( !IsUniqueIndex(pIdx) ) continue; + if( pTarget->nExpr!=pIdx->nKeyCol ) continue; + if( pIdx->pPartIdxWhere ){ + if( pUpsert->pUpsertTargetWhere==0 ) continue; + if( sqlite3ExprCompare(pParse, pUpsert->pUpsertTargetWhere, + pIdx->pPartIdxWhere, iCursor)!=0 ){ + continue; + } + } + nn = pIdx->nKeyCol; + for(ii=0; ii<nn; ii++){ + Expr *pExpr; + sCol[0].u.zToken = (char*)pIdx->azColl[ii]; + if( pIdx->aiColumn[ii]==XN_EXPR ){ + assert( pIdx->aColExpr!=0 ); + assert( pIdx->aColExpr->nExpr>ii ); + pExpr = pIdx->aColExpr->a[ii].pExpr; + if( pExpr->op!=TK_COLLATE ){ + sCol[0].pLeft = pExpr; + pExpr = &sCol[0]; + } + }else{ + sCol[0].pLeft = &sCol[1]; + sCol[1].iColumn = pIdx->aiColumn[ii]; + pExpr = &sCol[0]; + } + for(jj=0; jj<nn; jj++){ + if( sqlite3ExprCompare(pParse, pTarget->a[jj].pExpr, pExpr,iCursor)<2 ){ + break; /* Column ii of the index matches column jj of target */ + } + } + if( jj>=nn ){ + /* The target contains no match for column jj of the index */ + break; + } + } + if( ii<nn ){ + /* Column ii of the index did not match any term of the conflict target. + ** Continue the search with the next index. */ + continue; + } + pUpsert->pUpsertIdx = pIdx; + return SQLITE_OK; + } + sqlite3ErrorMsg(pParse, "ON CONFLICT clause does not match any " + "PRIMARY KEY or UNIQUE constraint"); + return SQLITE_ERROR; +} + +/* +** Generate bytecode that does an UPDATE as part of an upsert. +** +** If pIdx is NULL, then the UNIQUE constraint that failed was the IPK. +** In this case parameter iCur is a cursor open on the table b-tree that +** currently points to the conflicting table row. Otherwise, if pIdx +** is not NULL, then pIdx is the constraint that failed and iCur is a +** cursor points to the conflicting row. +*/ +SQLITE_PRIVATE void sqlite3UpsertDoUpdate( + Parse *pParse, /* The parsing and code-generating context */ + Upsert *pUpsert, /* The ON CONFLICT clause for the upsert */ + Table *pTab, /* The table being updated */ + Index *pIdx, /* The UNIQUE constraint that failed */ + int iCur /* Cursor for pIdx (or pTab if pIdx==NULL) */ +){ + Vdbe *v = pParse->pVdbe; + sqlite3 *db = pParse->db; + SrcList *pSrc; /* FROM clause for the UPDATE */ + int iDataCur = pUpsert->iDataCur; + + assert( v!=0 ); + VdbeNoopComment((v, "Begin DO UPDATE of UPSERT")); + if( pIdx && iCur!=iDataCur ){ + if( HasRowid(pTab) ){ + int regRowid = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_IdxRowid, iCur, regRowid); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iDataCur, 0, regRowid); + VdbeCoverage(v); + sqlite3ReleaseTempReg(pParse, regRowid); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk = pParse->nMem+1; + int i; + pParse->nMem += nPk; + for(i=0; i<nPk; i++){ + int k; + assert( pPk->aiColumn[i]>=0 ); + k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); + sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i); + VdbeComment((v, "%s.%s", pIdx->zName, + pTab->aCol[pPk->aiColumn[i]].zName)); + } + sqlite3VdbeVerifyAbortable(v, OE_Abort); + i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk); + VdbeCoverage(v); + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_CORRUPT, OE_Abort, 0, + "corrupt database", P4_STATIC); + sqlite3VdbeJumpHere(v, i); + } + } + /* pUpsert does not own pUpsertSrc - the outer INSERT statement does. So + ** we have to make a copy before passing it down into sqlite3Update() */ + pSrc = sqlite3SrcListDup(db, pUpsert->pUpsertSrc, 0); + sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet, + pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert); + pUpsert->pUpsertSet = 0; /* Will have been deleted by sqlite3Update() */ + pUpsert->pUpsertWhere = 0; /* Will have been deleted by sqlite3Update() */ + VdbeNoopComment((v, "End DO UPDATE of UPSERT")); +} + +#endif /* SQLITE_OMIT_UPSERT */ + +/************** End of upsert.c **********************************************/ /************** Begin file vacuum.c ******************************************/ /* ** 2003 April 6 @@ -112995,59 +130215,62 @@ static void updateVirtualTable( ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. */ +/* #include "sqliteInt.h" */ +/* #include "vdbeInt.h" */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) -/* -** Finalize a prepared statement. If there was an error, store the -** text of the error message in *pzErrMsg. Return the result code. -*/ -static int vacuumFinalize(sqlite3 *db, sqlite3_stmt *pStmt, char **pzErrMsg){ - int rc; - rc = sqlite3VdbeFinalize((Vdbe*)pStmt); - if( rc ){ - sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db)); - } - return rc; -} /* -** Execute zSql on database db. Return an error code. +** Execute zSql on database db. +** +** If zSql returns rows, then each row will have exactly one +** column. (This will only happen if zSql begins with "SELECT".) +** Take each row of result and call execSql() again recursively. +** +** The execSqlF() routine does the same thing, except it accepts +** a format string as its third argument */ static int execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){ - sqlite3_stmt *pStmt; - VVA_ONLY( int rc; ) - if( !zSql ){ - return SQLITE_NOMEM; - } - if( SQLITE_OK!=sqlite3_prepare(db, zSql, -1, &pStmt, 0) ){ - sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db)); - return sqlite3_errcode(db); - } - VVA_ONLY( rc = ) sqlite3_step(pStmt); - assert( rc!=SQLITE_ROW || (db->flags&SQLITE_CountRows) ); - return vacuumFinalize(db, pStmt, pzErrMsg); -} - -/* -** Execute zSql on database db. The statement returns exactly -** one column. Execute this as SQL on the same database. -*/ -static int execExecSql(sqlite3 *db, char **pzErrMsg, const char *zSql){ sqlite3_stmt *pStmt; int rc; - rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + /* printf("SQL: [%s]\n", zSql); fflush(stdout); */ + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); if( rc!=SQLITE_OK ) return rc; - - while( SQLITE_ROW==sqlite3_step(pStmt) ){ - rc = execSql(db, pzErrMsg, (char*)sqlite3_column_text(pStmt, 0)); - if( rc!=SQLITE_OK ){ - vacuumFinalize(db, pStmt, pzErrMsg); - return rc; + while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){ + const char *zSubSql = (const char*)sqlite3_column_text(pStmt,0); + assert( sqlite3_strnicmp(zSql,"SELECT",6)==0 ); + /* The secondary SQL must be one of CREATE TABLE, CREATE INDEX, + ** or INSERT. Historically there have been attacks that first + ** corrupt the sqlite_master.sql field with other kinds of statements + ** then run VACUUM to get those statements to execute at inappropriate + ** times. */ + if( zSubSql + && (strncmp(zSubSql,"CRE",3)==0 || strncmp(zSubSql,"INS",3)==0) + ){ + rc = execSql(db, pzErrMsg, zSubSql); + if( rc!=SQLITE_OK ) break; } } - - return vacuumFinalize(db, pStmt, pzErrMsg); + assert( rc!=SQLITE_ROW ); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + if( rc ){ + sqlite3SetString(pzErrMsg, db, sqlite3_errmsg(db)); + } + (void)sqlite3_finalize(pStmt); + return rc; +} +static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ + char *z; + va_list ap; + int rc; + va_start(ap, zSql); + z = sqlite3VMPrintf(db, zSql, ap); + va_end(ap); + if( z==0 ) return SQLITE_NOMEM; + rc = execSql(db, pzErrMsg, z); + sqlite3DbFree(db, z); + return rc; } /* @@ -113080,11 +130303,29 @@ static int execExecSql(sqlite3 *db, char **pzErrMsg, const char *zSql){ ** transient would cause the database file to appear to be deleted ** following reboot. */ -SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse){ +SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse, Token *pNm){ Vdbe *v = sqlite3GetVdbe(pParse); - if( v ){ - sqlite3VdbeAddOp2(v, OP_Vacuum, 0, 0); - sqlite3VdbeUsesBtree(v, 0); + int iDb = 0; + if( v==0 ) return; + if( pNm ){ +#ifndef SQLITE_BUG_COMPATIBLE_20160819 + /* Default behavior: Report an error if the argument to VACUUM is + ** not recognized */ + iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); + if( iDb<0 ) return; +#else + /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments + ** to VACUUM are silently ignored. This is a back-out of a bug fix that + ** occurred on 2016-08-19 (https://www.sqlite.org/src/info/083f9e6270). + ** The buggy behavior is required for binary compatibility with some + ** legacy applications. */ + iDb = sqlite3FindDb(pParse->db, pNm); + if( iDb<0 ) iDb = 0; +#endif + } + if( iDb!=1 ){ + sqlite3VdbeAddOp1(v, OP_Vacuum, iDb); + sqlite3VdbeUsesBtree(v, iDb); } return; } @@ -113092,19 +130333,20 @@ SQLITE_PRIVATE void sqlite3Vacuum(Parse *pParse){ /* ** This routine implements the OP_Vacuum opcode of the VDBE. */ -SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ +SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ int rc = SQLITE_OK; /* Return code from service routines */ Btree *pMain; /* The database being vacuumed */ Btree *pTemp; /* The temporary database we vacuum into */ - char *zSql = 0; /* SQL statements */ - int saved_flags; /* Saved value of the db->flags */ + u16 saved_mDbFlags; /* Saved value of db->mDbFlags */ + u32 saved_flags; /* Saved value of db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ - void (*saved_xTrace)(void*,const char*); /* Saved db->xTrace */ + u8 saved_mTrace; /* Saved trace settings */ Db *pDb = 0; /* Database to detach at end of vacuum */ int isMemDb; /* True if vacuuming a :memory: database */ int nRes; /* Bytes of reserved space at the end of each page */ int nDb; /* Number of attached databases */ + const char *zDbMain; /* Schema name of database to vacuum */ if( !db->autoCommit ){ sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); @@ -113119,14 +130361,17 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ ** restored before returning. Then set the writable-schema flag, and ** disable CHECK and foreign key constraints. */ saved_flags = db->flags; + saved_mDbFlags = db->mDbFlags; saved_nChange = db->nChange; saved_nTotalChange = db->nTotalChange; - saved_xTrace = db->xTrace; - db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin; - db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder); - db->xTrace = 0; + saved_mTrace = db->mTrace; + db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; + db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; + db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_CountRows); + db->mTrace = 0; - pMain = db->aDb[0].pBt; + zDbMain = db->aDb[iDb].zDbSName; + pMain = db->aDb[iDb].pBt; isMemDb = sqlite3PagerIsMemdb(sqlite3BtreePager(pMain)); /* Attach the temporary database as 'vacuum_db'. The synchronous pragma @@ -113144,18 +130389,12 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ ** to write the journal header file. */ nDb = db->nDb; - if( sqlite3TempInMemory(db) ){ - zSql = "ATTACH ':memory:' AS vacuum_db;"; - }else{ - zSql = "ATTACH '' AS vacuum_db;"; - } - rc = execSql(db, pzErrMsg, zSql); - if( db->nDb>nDb ){ - pDb = &db->aDb[db->nDb-1]; - assert( strcmp(pDb->zName,"vacuum_db")==0 ); - } + rc = execSql(db, pzErrMsg, "ATTACH''AS vacuum_db"); if( rc!=SQLITE_OK ) goto end_of_vacuum; - pTemp = db->aDb[db->nDb-1].pBt; + assert( (db->nDb-1)==nDb ); + pDb = &db->aDb[nDb]; + assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); + pTemp = pDb->pBt; /* The call to execSql() to attach the temp database has left the file ** locked (as there was more than one active statement when the transaction @@ -113163,7 +130402,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ ** cause problems for the call to BtreeSetPageSize() below. */ sqlite3BtreeCommit(pTemp); - nRes = sqlite3BtreeGetReserve(pMain); + nRes = sqlite3BtreeGetOptimalReserve(pMain); /* A VACUUM cannot change the pagesize of an encrypted database. */ #ifdef SQLITE_HAS_CODEC @@ -113171,19 +130410,20 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); int nKey; char *zKey; - sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + sqlite3CodecGetKey(db, iDb, (void**)&zKey, &nKey); if( nKey ) db->nextPagesize = 0; } #endif - rc = execSql(db, pzErrMsg, "PRAGMA vacuum_db.synchronous=OFF"); - if( rc!=SQLITE_OK ) goto end_of_vacuum; + sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size); + sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0)); + sqlite3BtreeSetPagerFlags(pTemp, PAGER_SYNCHRONOUS_OFF|PAGER_CACHESPILL); /* Begin a transaction and take an exclusive lock on the main database ** file. This is done before the sqlite3BtreeGetPageSize(pMain) call below, ** to ensure that we do not try to change the page-size on a WAL database. */ - rc = execSql(db, pzErrMsg, "BEGIN;"); + rc = execSql(db, pzErrMsg, "BEGIN"); if( rc!=SQLITE_OK ) goto end_of_vacuum; rc = sqlite3BtreeBeginTrans(pMain, 2); if( rc!=SQLITE_OK ) goto end_of_vacuum; @@ -113198,7 +130438,7 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ || (!isMemDb && sqlite3BtreeSetPageSize(pTemp, db->nextPagesize, nRes, 0)) || NEVER(db->mallocFailed) ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; goto end_of_vacuum; } @@ -113210,60 +130450,48 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ /* Query the schema of the main database. Create a mirror schema ** in the temporary database. */ - rc = execExecSql(db, pzErrMsg, - "SELECT 'CREATE TABLE vacuum_db.' || substr(sql,14) " - " FROM sqlite_master WHERE type='table' AND name!='sqlite_sequence'" - " AND coalesce(rootpage,1)>0" + db->init.iDb = nDb; /* force new CREATE statements into vacuum_db */ + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_master" + " WHERE type='table'AND name<>'sqlite_sequence'" + " AND coalesce(rootpage,1)>0", + zDbMain ); if( rc!=SQLITE_OK ) goto end_of_vacuum; - rc = execExecSql(db, pzErrMsg, - "SELECT 'CREATE INDEX vacuum_db.' || substr(sql,14)" - " FROM sqlite_master WHERE sql LIKE 'CREATE INDEX %' "); - if( rc!=SQLITE_OK ) goto end_of_vacuum; - rc = execExecSql(db, pzErrMsg, - "SELECT 'CREATE UNIQUE INDEX vacuum_db.' || substr(sql,21) " - " FROM sqlite_master WHERE sql LIKE 'CREATE UNIQUE INDEX %'"); + rc = execSqlF(db, pzErrMsg, + "SELECT sql FROM \"%w\".sqlite_master" + " WHERE type='index'", + zDbMain + ); if( rc!=SQLITE_OK ) goto end_of_vacuum; + db->init.iDb = 0; /* Loop through the tables in the main database. For each, do ** an "INSERT INTO vacuum_db.xxx SELECT * FROM main.xxx;" to copy ** the contents to the temporary database. */ - rc = execExecSql(db, pzErrMsg, - "SELECT 'INSERT INTO vacuum_db.' || quote(name) " - "|| ' SELECT * FROM main.' || quote(name) || ';'" - "FROM main.sqlite_master " - "WHERE type = 'table' AND name!='sqlite_sequence' " - " AND coalesce(rootpage,1)>0" + rc = execSqlF(db, pzErrMsg, + "SELECT'INSERT INTO vacuum_db.'||quote(name)" + "||' SELECT*FROM\"%w\".'||quote(name)" + "FROM vacuum_db.sqlite_master " + "WHERE type='table'AND coalesce(rootpage,1)>0", + zDbMain ); + assert( (db->mDbFlags & DBFLAG_Vacuum)!=0 ); + db->mDbFlags &= ~DBFLAG_Vacuum; if( rc!=SQLITE_OK ) goto end_of_vacuum; - /* Copy over the sequence table - */ - rc = execExecSql(db, pzErrMsg, - "SELECT 'DELETE FROM vacuum_db.' || quote(name) || ';' " - "FROM vacuum_db.sqlite_master WHERE name='sqlite_sequence' " - ); - if( rc!=SQLITE_OK ) goto end_of_vacuum; - rc = execExecSql(db, pzErrMsg, - "SELECT 'INSERT INTO vacuum_db.' || quote(name) " - "|| ' SELECT * FROM main.' || quote(name) || ';' " - "FROM vacuum_db.sqlite_master WHERE name=='sqlite_sequence';" - ); - if( rc!=SQLITE_OK ) goto end_of_vacuum; - - /* Copy the triggers, views, and virtual tables from the main database ** over to the temporary database. None of these objects has any ** associated storage, so all we have to do is copy their entries ** from the SQLITE_MASTER table. */ - rc = execSql(db, pzErrMsg, - "INSERT INTO vacuum_db.sqlite_master " - " SELECT type, name, tbl_name, rootpage, sql" - " FROM main.sqlite_master" - " WHERE type='view' OR type='trigger'" - " OR (type='table' AND rootpage=0)" + rc = execSqlF(db, pzErrMsg, + "INSERT INTO vacuum_db.sqlite_master" + " SELECT*FROM \"%w\".sqlite_master" + " WHERE type IN('view','trigger')" + " OR(type='table'AND rootpage=0)", + zDbMain ); if( rc ) goto end_of_vacuum; @@ -113317,10 +130545,12 @@ SQLITE_PRIVATE int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db){ end_of_vacuum: /* Restore the original value of db->flags */ + db->init.iDb = 0; + db->mDbFlags = saved_mDbFlags; db->flags = saved_flags; db->nChange = saved_nChange; db->nTotalChange = saved_nTotalChange; - db->xTrace = saved_xTrace; + db->mTrace = saved_mTrace; sqlite3BtreeSetPageSize(pMain, -1, -1, 1); /* Currently there is an SQL level transaction open on the vacuum @@ -113363,6 +130593,7 @@ end_of_vacuum: ** This file contains code used to help implement virtual tables. */ #ifndef SQLITE_OMIT_VIRTUALTABLE +/* #include "sqliteInt.h" */ /* ** Before a virtual table xCreate() or xConnect() method is invoked, the @@ -113374,8 +130605,47 @@ end_of_vacuum: struct VtabCtx { VTable *pVTable; /* The virtual table being constructed */ Table *pTab; /* The Table object to which the virtual table belongs */ + VtabCtx *pPrior; /* Parent context (if any) */ + int bDeclared; /* True after sqlite3_declare_vtab() is called */ }; +/* +** Construct and install a Module object for a virtual table. When this +** routine is called, it is guaranteed that all appropriate locks are held +** and the module is not already part of the connection. +*/ +SQLITE_PRIVATE Module *sqlite3VtabCreateModule( + sqlite3 *db, /* Database in which module is registered */ + const char *zName, /* Name assigned to this module */ + const sqlite3_module *pModule, /* The definition of the module */ + void *pAux, /* Context pointer for xCreate/xConnect */ + void (*xDestroy)(void *) /* Module destructor function */ +){ + Module *pMod; + int nName = sqlite3Strlen30(zName); + pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); + if( pMod==0 ){ + sqlite3OomFault(db); + }else{ + Module *pDel; + char *zCopy = (char *)(&pMod[1]); + memcpy(zCopy, zName, nName+1); + pMod->zName = zCopy; + pMod->pModule = pModule; + pMod->pAux = pAux; + pMod->xDestroy = xDestroy; + pMod->pEpoTab = 0; + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); + assert( pDel==0 || pDel==pMod ); + if( pDel ){ + sqlite3OomFault(db); + sqlite3DbFree(db, pDel); + pMod = 0; + } + } + return pMod; +} + /* ** The actual function that does the work of creating a new module. ** This function implements the sqlite3_create_module() and @@ -113389,34 +130659,15 @@ static int createModule( void (*xDestroy)(void *) /* Module destructor function */ ){ int rc = SQLITE_OK; - int nName; sqlite3_mutex_enter(db->mutex); - nName = sqlite3Strlen30(zName); if( sqlite3HashFind(&db->aModule, zName) ){ rc = SQLITE_MISUSE_BKPT; }else{ - Module *pMod; - pMod = (Module *)sqlite3DbMallocRaw(db, sizeof(Module) + nName + 1); - if( pMod ){ - Module *pDel; - char *zCopy = (char *)(&pMod[1]); - memcpy(zCopy, zName, nName+1); - pMod->zName = zCopy; - pMod->pModule = pModule; - pMod->pAux = pAux; - pMod->xDestroy = xDestroy; - pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); - assert( pDel==0 || pDel==pMod ); - if( pDel ){ - db->mallocFailed = 1; - sqlite3DbFree(db, pDel); - } - } + (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); } rc = sqlite3ApiExit(db, rc); if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); - sqlite3_mutex_leave(db->mutex); return rc; } @@ -113633,23 +130884,17 @@ SQLITE_PRIVATE void sqlite3VtabClear(sqlite3 *db, Table *p){ ** deleted. */ static void addModuleArgument(sqlite3 *db, Table *pTable, char *zArg){ - int i = pTable->nModuleArg++; - int nBytes = sizeof(char *)*(1+pTable->nModuleArg); + int nBytes = sizeof(char *)*(2+pTable->nModuleArg); char **azModuleArg; azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes); if( azModuleArg==0 ){ - int j; - for(j=0; j<i; j++){ - sqlite3DbFree(db, pTable->azModuleArg[j]); - } sqlite3DbFree(db, zArg); - sqlite3DbFree(db, pTable->azModuleArg); - pTable->nModuleArg = 0; }else{ + int i = pTable->nModuleArg++; azModuleArg[i] = zArg; azModuleArg[i+1] = 0; + pTable->azModuleArg = azModuleArg; } - pTable->azModuleArg = azModuleArg; } /* @@ -113677,8 +130922,7 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( iDb = sqlite3SchemaToIndex(db, pTable->pSchema); assert( iDb>=0 ); - pTable->tabFlags |= TF_Virtual; - pTable->nModuleArg = 0; + assert( pTable->nModuleArg==0 ); addModuleArgument(db, pTable, sqlite3NameFromToken(db, pModuleName)); addModuleArgument(db, pTable, 0); addModuleArgument(db, pTable, sqlite3DbStrDup(db, pTable->zName)); @@ -113697,7 +130941,7 @@ SQLITE_PRIVATE void sqlite3VtabBeginParse( */ if( pTable->azModuleArg ){ sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, - pTable->azModuleArg[0], pParse->db->aDb[iDb].zName); + pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); } #endif } @@ -113739,6 +130983,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ char *zStmt; char *zWhere; int iDb; + int iReg; Vdbe *v; /* Compute the complete text of the CREATE VIRTUAL TABLE statement */ @@ -113760,7 +131005,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ "UPDATE %Q.%s " "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " "WHERE rowid=#%d", - db->aDb[iDb].zName, SCHEMA_TABLE(iDb), + db->aDb[iDb].zDbSName, MASTER_NAME, pTab->zName, pTab->zName, zStmt, @@ -113770,11 +131015,13 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ v = sqlite3GetVdbe(pParse); sqlite3ChangeCookie(pParse, iDb); - sqlite3VdbeAddOp2(v, OP_Expire, 0, 0); + sqlite3VdbeAddOp0(v, OP_Expire); zWhere = sqlite3MPrintf(db, "name='%q' AND type='table'", pTab->zName); sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere); - sqlite3VdbeAddOp4(v, OP_VCreate, iDb, 0, 0, - pTab->zName, sqlite3Strlen30(pTab->zName) + 1); + + iReg = ++pParse->nMem; + sqlite3VdbeLoadString(v, iReg, pTab->zName); + sqlite3VdbeAddOp2(v, OP_VCreate, iDb, iReg); } /* If we are rereading the sqlite_master table create the in-memory @@ -113789,7 +131036,7 @@ SQLITE_PRIVATE void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ assert( sqlite3SchemaMutexHeld(db, 0, pSchema) ); pOld = sqlite3HashInsert(&pSchema->tblHash, zName, pTab); if( pOld ){ - db->mallocFailed = 1; + sqlite3OomFault(db); assert( pTab==pOld ); /* Malloc must have failed inside HashInsert() */ return; } @@ -113817,7 +131064,7 @@ SQLITE_PRIVATE void sqlite3VtabArgExtend(Parse *pParse, Token *p){ pArg->z = p->z; pArg->n = p->n; }else{ - assert(pArg->z < p->z); + assert(pArg->z <= p->z); pArg->n = (int)(&p->z[p->n] - pArg->z); } } @@ -113834,40 +131081,55 @@ static int vtabCallConstructor( int (*xConstruct)(sqlite3*,void*,int,const char*const*,sqlite3_vtab**,char**), char **pzErr ){ - VtabCtx sCtx, *pPriorCtx; + VtabCtx sCtx; VTable *pVTable; int rc; const char *const*azArg = (const char *const*)pTab->azModuleArg; int nArg = pTab->nModuleArg; char *zErr = 0; - char *zModuleName = sqlite3MPrintf(db, "%s", pTab->zName); + char *zModuleName; int iDb; + VtabCtx *pCtx; - if( !zModuleName ){ - return SQLITE_NOMEM; + /* Check that the virtual-table is not already being initialized */ + for(pCtx=db->pVtabCtx; pCtx; pCtx=pCtx->pPrior){ + if( pCtx->pTab==pTab ){ + *pzErr = sqlite3MPrintf(db, + "vtable constructor called recursively: %s", pTab->zName + ); + return SQLITE_LOCKED; + } } - pVTable = sqlite3DbMallocZero(db, sizeof(VTable)); + zModuleName = sqlite3DbStrDup(db, pTab->zName); + if( !zModuleName ){ + return SQLITE_NOMEM_BKPT; + } + + pVTable = sqlite3MallocZero(sizeof(VTable)); if( !pVTable ){ + sqlite3OomFault(db); sqlite3DbFree(db, zModuleName); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } pVTable->db = db; pVTable->pMod = pMod; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - pTab->azModuleArg[1] = db->aDb[iDb].zName; + pTab->azModuleArg[1] = db->aDb[iDb].zDbSName; /* Invoke the virtual table constructor */ assert( &db->pVtabCtx ); assert( xConstruct ); sCtx.pTab = pTab; sCtx.pVTable = pVTable; - pPriorCtx = db->pVtabCtx; + sCtx.pPrior = db->pVtabCtx; + sCtx.bDeclared = 0; db->pVtabCtx = &sCtx; rc = xConstruct(db, pMod->pAux, nArg, azArg, &pVTable->pVtab, &zErr); - db->pVtabCtx = pPriorCtx; - if( rc==SQLITE_NOMEM ) db->mallocFailed = 1; + db->pVtabCtx = sCtx.pPrior; + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); + assert( sCtx.pTab==pTab ); if( SQLITE_OK!=rc ){ if( zErr==0 ){ @@ -113883,13 +131145,14 @@ static int vtabCallConstructor( memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0])); pVTable->pVtab->pModule = pMod->pModule; pVTable->nRef = 1; - if( sCtx.pTab ){ + if( sCtx.bDeclared==0 ){ const char *zFormat = "vtable constructor did not declare schema: %s"; *pzErr = sqlite3MPrintf(db, zFormat, pTab->zName); sqlite3VtabUnlock(pVTable); rc = SQLITE_ERROR; }else{ int iCol; + u8 oooHidden = 0; /* If everything went according to plan, link the new VTable structure ** into the linked list headed by pTab->pVTable. Then loop through the ** columns of the table to see if any of them contain the token "hidden". @@ -113899,19 +131162,16 @@ static int vtabCallConstructor( pTab->pVTable = pVTable; for(iCol=0; iCol<pTab->nCol; iCol++){ - char *zType = pTab->aCol[iCol].zType; + char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); int nType; int i = 0; - if( !zType ) continue; nType = sqlite3Strlen30(zType); - if( sqlite3StrNICmp("hidden", zType, 6)||(zType[6] && zType[6]!=' ') ){ - for(i=0; i<nType; i++){ - if( (0==sqlite3StrNICmp(" hidden", &zType[i], 7)) - && (zType[i+7]=='\0' || zType[i+7]==' ') - ){ - i++; - break; - } + for(i=0; i<nType; i++){ + if( 0==sqlite3StrNICmp("hidden", &zType[i], 6) + && (i==0 || zType[i-1]==' ') + && (zType[i+6]=='\0' || zType[i+6]==' ') + ){ + break; } } if( i<nType ){ @@ -113925,6 +131185,9 @@ static int vtabCallConstructor( zType[i-1] = '\0'; } pTab->aCol[iCol].colFlags |= COLFLAG_HIDDEN; + oooHidden = TF_OOOHidden; + }else{ + pTab->tabFlags |= oooHidden; } } } @@ -113948,7 +131211,7 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ int rc; assert( pTab ); - if( (pTab->tabFlags & TF_Virtual)==0 || sqlite3GetVTable(db, pTab) ){ + if( !IsVirtual(pTab) || sqlite3GetVTable(db, pTab) ){ return SQLITE_OK; } @@ -113965,6 +131228,7 @@ SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ rc = vtabCallConstructor(db, pTab, pMod, pMod->pModule->xConnect, &zErr); if( rc!=SQLITE_OK ){ sqlite3ErrorMsg(pParse, "%s", zErr); + pParse->rc = rc; } sqlite3DbFree(db, zErr); } @@ -113984,7 +131248,7 @@ static int growVTrans(sqlite3 *db){ int nBytes = sizeof(sqlite3_vtab *) * (db->nVTrans + ARRAY_INCR); aVTrans = sqlite3DbRealloc(db, (void *)db->aVTrans, nBytes); if( !aVTrans ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memset(&aVTrans[db->nVTrans], 0, sizeof(sqlite3_vtab *)*ARRAY_INCR); db->aVTrans = aVTrans; @@ -114007,7 +131271,7 @@ static void addToVTrans(sqlite3 *db, VTable *pVTab){ ** This function is invoked by the vdbe to call the xCreate method ** of the virtual table named zTab in database iDb. ** -** If an error occurs, *pzErr is set to point an an English language +** If an error occurs, *pzErr is set to point to an English language ** description of the error and an SQLITE_XXX error code is returned. ** In this case the caller must call sqlite3DbFree(db, ) on *pzErr. */ @@ -114017,8 +131281,8 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, Module *pMod; const char *zMod; - pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName); - assert( pTab && (pTab->tabFlags & TF_Virtual)!=0 && !pTab->pVTable ); + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + assert( pTab && IsVirtual(pTab) && !pTab->pVTable ); /* Locate the required virtual table module */ zMod = pTab->azModuleArg[0]; @@ -114028,7 +131292,7 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, ** invoke it now. If the module has not been registered, return an ** error. Otherwise, do nothing. */ - if( !pMod ){ + if( pMod==0 || pMod->pModule->xCreate==0 || pMod->pModule->xDestroy==0 ){ *pzErr = sqlite3MPrintf(db, "no such module: %s", zMod); rc = SQLITE_ERROR; }else{ @@ -114053,58 +131317,76 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, ** virtual table module. */ SQLITE_API int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ - Parse *pParse; - + VtabCtx *pCtx; int rc = SQLITE_OK; Table *pTab; char *zErr = 0; + Parse sParse; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; + if( !sqlite3SafetyCheckOk(db) || zCreateTable==0 ){ + return SQLITE_MISUSE_BKPT; + } #endif sqlite3_mutex_enter(db->mutex); - if( !db->pVtabCtx || !(pTab = db->pVtabCtx->pTab) ){ + pCtx = db->pVtabCtx; + if( !pCtx || pCtx->bDeclared ){ sqlite3Error(db, SQLITE_MISUSE); sqlite3_mutex_leave(db->mutex); return SQLITE_MISUSE_BKPT; } - assert( (pTab->tabFlags & TF_Virtual)!=0 ); + pTab = pCtx->pTab; + assert( IsVirtual(pTab) ); - pParse = sqlite3StackAllocZero(db, sizeof(*pParse)); - if( pParse==0 ){ - rc = SQLITE_NOMEM; - }else{ - pParse->declareVtab = 1; - pParse->db = db; - pParse->nQueryLoop = 1; - - if( SQLITE_OK==sqlite3RunParser(pParse, zCreateTable, &zErr) - && pParse->pNewTable - && !db->mallocFailed - && !pParse->pNewTable->pSelect - && (pParse->pNewTable->tabFlags & TF_Virtual)==0 - ){ - if( !pTab->aCol ){ - pTab->aCol = pParse->pNewTable->aCol; - pTab->nCol = pParse->pNewTable->nCol; - pParse->pNewTable->nCol = 0; - pParse->pNewTable->aCol = 0; + memset(&sParse, 0, sizeof(sParse)); + sParse.declareVtab = 1; + sParse.db = db; + sParse.nQueryLoop = 1; + if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr) + && sParse.pNewTable + && !db->mallocFailed + && !sParse.pNewTable->pSelect + && !IsVirtual(sParse.pNewTable) + ){ + if( !pTab->aCol ){ + Table *pNew = sParse.pNewTable; + Index *pIdx; + pTab->aCol = pNew->aCol; + pTab->nCol = pNew->nCol; + pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); + pNew->nCol = 0; + pNew->aCol = 0; + assert( pTab->pIndex==0 ); + assert( HasRowid(pNew) || sqlite3PrimaryKeyIndex(pNew)!=0 ); + if( !HasRowid(pNew) + && pCtx->pVTable->pMod->pModule->xUpdate!=0 + && sqlite3PrimaryKeyIndex(pNew)->nKeyCol!=1 + ){ + /* WITHOUT ROWID virtual tables must either be read-only (xUpdate==0) + ** or else must have a single-column PRIMARY KEY */ + rc = SQLITE_ERROR; + } + pIdx = pNew->pIndex; + if( pIdx ){ + assert( pIdx->pNext==0 ); + pTab->pIndex = pIdx; + pNew->pIndex = 0; + pIdx->pTable = pTab; } - db->pVtabCtx->pTab = 0; - }else{ - sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr); - sqlite3DbFree(db, zErr); - rc = SQLITE_ERROR; } - pParse->declareVtab = 0; - - if( pParse->pVdbe ){ - sqlite3VdbeFinalize(pParse->pVdbe); - } - sqlite3DeleteTable(db, pParse->pNewTable); - sqlite3ParserReset(pParse); - sqlite3StackFree(db, pParse); + pCtx->bDeclared = 1; + }else{ + sqlite3ErrorWithMsg(db, SQLITE_ERROR, (zErr ? "%s" : 0), zErr); + sqlite3DbFree(db, zErr); + rc = SQLITE_ERROR; } + sParse.declareVtab = 0; + + if( sParse.pVdbe ){ + sqlite3VdbeFinalize(sParse.pVdbe); + } + sqlite3DeleteTable(db, sParse.pNewTable); + sqlite3ParserReset(&sParse); assert( (rc&0xff)==rc ); rc = sqlite3ApiExit(db, rc); @@ -114123,13 +131405,20 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab int rc = SQLITE_OK; Table *pTab; - pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zName); - if( ALWAYS(pTab!=0 && pTab->pVTable!=0) ){ - VTable *p = vtabDisconnectAll(db, pTab); - - assert( rc==SQLITE_OK ); - rc = p->pMod->pModule->xDestroy(p->pVtab); - + pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); + if( pTab!=0 && ALWAYS(pTab->pVTable!=0) ){ + VTable *p; + int (*xDestroy)(sqlite3_vtab *); + for(p=pTab->pVTable; p; p=p->pNext){ + assert( p->pVtab ); + if( p->pVtab->nRef>0 ){ + return SQLITE_LOCKED; + } + } + p = vtabDisconnectAll(db, pTab); + xDestroy = p->pMod->pModule->xDestroy; + assert( xDestroy!=0 ); /* Checked before the virtual table is created */ + rc = xDestroy(p->pVtab); /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */ if( rc==SQLITE_OK ){ assert( pTab->pVTable==p && p->pNext==0 ); @@ -114153,8 +131442,10 @@ SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab static void callFinaliser(sqlite3 *db, int offset){ int i; if( db->aVTrans ){ + VTable **aVTrans = db->aVTrans; + db->aVTrans = 0; for(i=0; i<db->nVTrans; i++){ - VTable *pVTab = db->aVTrans[i]; + VTable *pVTab = aVTrans[i]; sqlite3_vtab *p = pVTab->pVtab; if( p ){ int (*x)(sqlite3_vtab *); @@ -114164,9 +131455,8 @@ static void callFinaliser(sqlite3 *db, int offset){ pVTab->iSavepoint = 0; sqlite3VtabUnlock(pVTab); } - sqlite3DbFree(db, db->aVTrans); + sqlite3DbFree(db, aVTrans); db->nVTrans = 0; - db->aVTrans = 0; } } @@ -114254,7 +131544,12 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ if( rc==SQLITE_OK ){ rc = pModule->xBegin(pVTab->pVtab); if( rc==SQLITE_OK ){ + int iSvpt = db->nStatement + db->nSavepoint; addToVTrans(db, pVTab); + if( iSvpt && pModule->xSavepoint ){ + pVTab->iSavepoint = iSvpt; + rc = pModule->xSavepoint(pVTab->pVtab, iSvpt-1); + } } } } @@ -114280,7 +131575,7 @@ SQLITE_PRIVATE int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ int rc = SQLITE_OK; assert( op==SAVEPOINT_RELEASE||op==SAVEPOINT_ROLLBACK||op==SAVEPOINT_BEGIN ); - assert( iSavepoint>=0 ); + assert( iSavepoint>=-1 ); if( db->aVTrans ){ int i; for(i=0; rc==SQLITE_OK && i<db->nVTrans; i++){ @@ -114331,20 +131626,17 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( Table *pTab; sqlite3_vtab *pVtab; sqlite3_module *pMod; - void (*xFunc)(sqlite3_context*,int,sqlite3_value**) = 0; + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**) = 0; void *pArg = 0; FuncDef *pNew; int rc = 0; - char *zLowerName; - unsigned char *z; - /* Check to see the left operand is a column in a virtual table */ if( NEVER(pExpr==0) ) return pDef; if( pExpr->op!=TK_COLUMN ) return pDef; pTab = pExpr->pTab; - if( NEVER(pTab==0) ) return pDef; - if( (pTab->tabFlags & TF_Virtual)==0 ) return pDef; + if( pTab==0 ) return pDef; + if( !IsVirtual(pTab) ) return pDef; pVtab = sqlite3GetVTable(db, pTab)->pVtab; assert( pVtab!=0 ); assert( pVtab->pModule!=0 ); @@ -114352,16 +131644,22 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( if( pMod->xFindFunction==0 ) return pDef; /* Call the xFindFunction method on the virtual table implementation - ** to see if the implementation wants to overload this function + ** to see if the implementation wants to overload this function. + ** + ** Though undocumented, we have historically always invoked xFindFunction + ** with an all lower-case function name. Continue in this tradition to + ** avoid any chance of an incompatibility. */ - zLowerName = sqlite3DbStrDup(db, pDef->zName); - if( zLowerName ){ - for(z=(unsigned char*)zLowerName; *z; z++){ - *z = sqlite3UpperToLower[*z]; +#ifdef SQLITE_DEBUG + { + int i; + for(i=0; pDef->zName[i]; i++){ + unsigned char x = (unsigned char)pDef->zName[i]; + assert( x==sqlite3UpperToLower[x] ); } - rc = pMod->xFindFunction(pVtab, nArg, zLowerName, &xFunc, &pArg); - sqlite3DbFree(db, zLowerName); } +#endif + rc = pMod->xFindFunction(pVtab, nArg, pDef->zName, &xSFunc, &pArg); if( rc==0 ){ return pDef; } @@ -114374,9 +131672,9 @@ SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction( return pDef; } *pNew = *pDef; - pNew->zName = (char *)&pNew[1]; - memcpy(pNew->zName, pDef->zName, sqlite3Strlen30(pDef->zName)+1); - pNew->xFunc = xFunc; + pNew->zName = (const char*)&pNew[1]; + memcpy((char*)&pNew[1], pDef->zName, sqlite3Strlen30(pDef->zName)+1); + pNew->xSFunc = xSFunc; pNew->pUserData = pArg; pNew->funcFlags |= SQLITE_FUNC_EPHEM; return pNew; @@ -114398,12 +131696,75 @@ SQLITE_PRIVATE void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ if( pTab==pToplevel->apVtabLock[i] ) return; } n = (pToplevel->nVtabLock+1)*sizeof(pToplevel->apVtabLock[0]); - apVtabLock = sqlite3_realloc(pToplevel->apVtabLock, n); + apVtabLock = sqlite3_realloc64(pToplevel->apVtabLock, n); if( apVtabLock ){ pToplevel->apVtabLock = apVtabLock; pToplevel->apVtabLock[pToplevel->nVtabLock++] = pTab; }else{ - pToplevel->db->mallocFailed = 1; + sqlite3OomFault(pToplevel->db); + } +} + +/* +** Check to see if virtual table module pMod can be have an eponymous +** virtual table instance. If it can, create one if one does not already +** exist. Return non-zero if the eponymous virtual table instance exists +** when this routine returns, and return zero if it does not exist. +** +** An eponymous virtual table instance is one that is named after its +** module, and more importantly, does not require a CREATE VIRTUAL TABLE +** statement in order to come into existance. Eponymous virtual table +** instances always exist. They cannot be DROP-ed. +** +** Any virtual table module for which xConnect and xCreate are the same +** method can have an eponymous virtual table instance. +*/ +SQLITE_PRIVATE int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ + const sqlite3_module *pModule = pMod->pModule; + Table *pTab; + char *zErr = 0; + int rc; + sqlite3 *db = pParse->db; + if( pMod->pEpoTab ) return 1; + if( pModule->xCreate!=0 && pModule->xCreate!=pModule->xConnect ) return 0; + pTab = sqlite3DbMallocZero(db, sizeof(Table)); + if( pTab==0 ) return 0; + pTab->zName = sqlite3DbStrDup(db, pMod->zName); + if( pTab->zName==0 ){ + sqlite3DbFree(db, pTab); + return 0; + } + pMod->pEpoTab = pTab; + pTab->nTabRef = 1; + pTab->pSchema = db->aDb[0].pSchema; + assert( pTab->nModuleArg==0 ); + pTab->iPKey = -1; + addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); + addModuleArgument(db, pTab, 0); + addModuleArgument(db, pTab, sqlite3DbStrDup(db, pTab->zName)); + rc = vtabCallConstructor(db, pTab, pMod, pModule->xConnect, &zErr); + if( rc ){ + sqlite3ErrorMsg(pParse, "%s", zErr); + sqlite3DbFree(db, zErr); + sqlite3VtabEponymousTableClear(db, pMod); + return 0; + } + return 1; +} + +/* +** Erase the eponymous virtual table instance associated with +** virtual table module pMod, if it exists. +*/ +SQLITE_PRIVATE void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ + Table *pTab = pMod->pEpoTab; + if( pTab!=0 ){ + /* Mark the table as Ephemeral prior to deleting it, so that the + ** sqlite3DeleteTable() routine will know that it is not stored in + ** the schema. */ + pTab->tabFlags |= TF_Ephemeral; + sqlite3DeleteTable(db, pTab); + pMod->pEpoTab = 0; } } @@ -114447,7 +131808,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ if( !p ){ rc = SQLITE_MISUSE_BKPT; }else{ - assert( p->pTab==0 || (p->pTab->tabFlags & TF_Virtual)!=0 ); + assert( p->pTab==0 || IsVirtual(p->pTab) ); p->pVTable->bConstraint = (u8)va_arg(ap, int); } break; @@ -114466,9 +131827,9 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ #endif /* SQLITE_OMIT_VIRTUALTABLE */ /************** End of vtab.c ************************************************/ -/************** Begin file where.c *******************************************/ +/************** Begin file wherecode.c ***************************************/ /* -** 2001 September 15 +** 2015-06-06 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -114479,13 +131840,15 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ ** ************************************************************************* ** This module contains C code that generates VDBE code used to process -** the WHERE clause of SQL statements. This module is responsible for -** generating the code that loops through a table looking for applicable -** rows. Indices are selected and used to speed the search when doing -** so is applicable. Because this module is responsible for selecting -** indices, you might also think of this module as the "query optimizer". +** the WHERE clause of SQL statements. +** +** This file was split off from where.c on 2015-06-06 in order to reduce the +** size of where.c and make it easier to edit. This file contains the routines +** that actually generate the bulk of the WHERE loop code. The original where.c +** file retains the code that does query planning and analysis. */ -/************** Include whereInt.h in the middle of where.c ******************/ +/* #include "sqliteInt.h" */ +/************** Include whereInt.h in the middle of wherecode.c **************/ /************** Begin file whereInt.h ****************************************/ /* ** 2013-11-12 @@ -114508,7 +131871,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3 *db, int op, ...){ ** Trace output macros */ #if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) -/***/ int sqlite3WhereTrace = 0; +/***/ extern int sqlite3WhereTrace; #endif #if defined(SQLITE_DEBUG) \ && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_WHERETRACE)) @@ -114558,6 +131921,10 @@ struct WhereLevel { int addrCont; /* Jump here to continue with the next loop cycle */ int addrFirst; /* First instruction of interior of the loop */ int addrBody; /* Beginning of the body of this loop */ +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ + int addrLikeRep; /* LIKE range processing address */ +#endif u8 iFrom; /* Which entry in the FROM clause */ u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ int p1, p2; /* Operands of the opcode used to ends the loop */ @@ -114607,6 +131974,9 @@ struct WhereLoop { union { struct { /* Information for internal btree tables */ u16 nEq; /* Number of equality constraints */ + u16 nBtm; /* Size of BTM vector */ + u16 nTop; /* Size of TOP vector */ + u16 nIdxCol; /* Index column used for ORDER BY */ Index *pIndex; /* Index used, or NULL */ } btree; struct { /* Information for virtual tables */ @@ -114648,10 +132018,6 @@ struct WhereOrSet { WhereOrCost a[N_OR_COST]; /* Set of best costs */ }; - -/* Forward declaration of methods */ -static int whereLoopResize(sqlite3*, WhereLoop*, int); - /* ** Each instance of this object holds a sequence of WhereLoop objects ** that implement some or all of a query plan. @@ -114733,18 +132099,20 @@ struct WherePath { */ struct WhereTerm { Expr *pExpr; /* Pointer to the subexpression that is this term */ + WhereClause *pWC; /* The clause this term is part of */ + LogEst truthProb; /* Probability of truth for this expression */ + u16 wtFlags; /* TERM_xxx bit flags. See below */ + u16 eOperator; /* A WO_xx value describing <op> */ + u8 nChild; /* Number of children that must disable us */ + u8 eMatchOp; /* Op for vtab MATCH/LIKE/GLOB/REGEXP terms */ int iParent; /* Disable pWC->a[iParent] when this term disabled */ int leftCursor; /* Cursor number of X in "X <op> <expr>" */ + int iField; /* Field in (?,?,?) IN (SELECT...) vector */ union { int leftColumn; /* Column number of X in "X <op> <expr>" */ WhereOrInfo *pOrInfo; /* Extra information if (eOperator & WO_OR)!=0 */ WhereAndInfo *pAndInfo; /* Extra information if (eOperator& WO_AND)!=0 */ } u; - LogEst truthProb; /* Probability of truth for this expression */ - u16 eOperator; /* A WO_xx value describing <op> */ - u8 wtFlags; /* TERM_xxx bit flags. See below */ - u8 nChild; /* Number of children that must disable us */ - WhereClause *pWC; /* The clause this term is part of */ Bitmask prereqRight; /* Bitmask of tables used by pExpr->pRight */ Bitmask prereqAll; /* Bitmask of tables referenced by pExpr */ }; @@ -114764,6 +132132,11 @@ struct WhereTerm { #else # define TERM_VNULL 0x00 /* Disabled if not using stat3 */ #endif +#define TERM_LIKEOPT 0x100 /* Virtual terms from the LIKE optimization */ +#define TERM_LIKECOND 0x200 /* Conditionally this LIKE operator term */ +#define TERM_LIKE 0x400 /* The original LIKE operator */ +#define TERM_IS 0x800 /* Term.pExpr is an IS operator */ +#define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ /* ** An instance of the WhereScan object is used as an iterator for locating @@ -114772,13 +132145,15 @@ struct WhereTerm { struct WhereScan { WhereClause *pOrigWC; /* Original, innermost WhereClause */ WhereClause *pWC; /* WhereClause currently being scanned */ - char *zCollName; /* Required collating sequence, if not NULL */ + const char *zCollName; /* Required collating sequence, if not NULL */ + Expr *pIdxExpr; /* Search for this index expression */ char idxaff; /* Must match this affinity, if zCollName!=NULL */ unsigned char nEquiv; /* Number of entries in aEquiv[] */ unsigned char iEquiv; /* Next unused slot in aEquiv[] */ u32 opMask; /* Acceptable operators */ int k; /* Resume scanning at this->pWC->a[this->k] */ - int aEquiv[22]; /* Cursor,Column pairs for equivalence classes */ + int aiCur[11]; /* Cursors in the equivalence class */ + i16 aiColumn[11]; /* Corresponding column number in the eq-class */ }; /* @@ -114851,10 +132226,16 @@ struct WhereAndInfo { ** no gaps. */ struct WhereMaskSet { + int bVarSelect; /* Used by sqlite3WhereExprUsage() */ int n; /* Number of assigned cursor values */ int ix[BMS]; /* Cursor assigned to each bit */ }; +/* +** Initialize a WhereMaskSet object +*/ +#define initMaskSet(P) (P)->n=0 + /* ** This object is a convenience wrapper holding all information needed ** to construct WhereLoop objects for a particular query. @@ -114869,8 +132250,13 @@ struct WhereLoopBuilder { UnpackedRecord *pRec; /* Probe for stat4 (if required) */ int nRecValid; /* Number of valid fields currently in pRec */ #endif + unsigned int bldFlags; /* SQLITE_BLDF_* flags */ }; +/* Allowed values for WhereLoopBuider.bldFlags */ +#define SQLITE_BLDF_INDEXED 0x0001 /* An index is used */ +#define SQLITE_BLDF_UNIQUE 0x0002 /* All keys of a UNIQUE index used */ + /* ** The WHERE clause processing routine has two halves. The ** first part does the start of the WHERE loop and the second @@ -114885,48 +132271,117 @@ struct WhereInfo { Parse *pParse; /* Parsing and code generating context */ SrcList *pTabList; /* List of tables in the join */ ExprList *pOrderBy; /* The ORDER BY clause or NULL */ - ExprList *pResultSet; /* Result set. DISTINCT operates on these */ - WhereLoop *pLoops; /* List of all WhereLoop objects */ - Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ - LogEst nRowOut; /* Estimated number of output rows */ - u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ - i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ - u8 sorted; /* True if really sorted (not just grouped) */ - u8 okOnePass; /* Ok to use one-pass algorithm for UPDATE/DELETE */ - u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ - u8 eDistinct; /* One of the WHERE_DISTINCT_* values below */ - u8 nLevel; /* Number of nested loop */ - int iTop; /* The very beginning of the WHERE loop */ + ExprList *pResultSet; /* Result set of the query */ + Expr *pWhere; /* The complete WHERE clause */ + LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ + int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ int iContinue; /* Jump here to continue with next record */ int iBreak; /* Jump here to break out of the loop */ int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ - int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ - WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ + u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ + u8 nLevel; /* Number of nested loop */ + i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ + u8 sorted; /* True if really sorted (not just grouped) */ + u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ + u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ + u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ + u8 bOrderedInnerLoop; /* True if only the inner-most loop is ordered */ + int iTop; /* The very beginning of the WHERE loop */ + WhereLoop *pLoops; /* List of all WhereLoop objects */ + Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ + LogEst nRowOut; /* Estimated number of output rows */ WhereClause sWC; /* Decomposition of the WHERE clause */ + WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ WhereLevel a[1]; /* Information about each nest loop in WHERE */ }; +/* +** Private interfaces - callable only by other where.c routines. +** +** where.c: +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet*,int); +#ifdef WHERETRACE_ENABLED +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC); +#endif +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +); + +/* wherecode.c: */ +#ifndef SQLITE_OMIT_EXPLAIN +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +); +#else +# define sqlite3WhereExplainOneScan(u,v,w,x) 0 +#endif /* SQLITE_OMIT_EXPLAIN */ +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +); +#else +# define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) +#endif +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + Bitmask notReady /* Which tables are currently available */ +); + +/* whereexpr.c: */ +SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause*); +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause*,Expr*,u8); +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet*, Expr*); +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet*, ExprList*); +SQLITE_PRIVATE void sqlite3WhereExprAnalyze(SrcList*, WhereClause*); +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereClause*); + + + + + /* ** Bitmasks for the operators on WhereTerm objects. These are all ** operators that are of interest to the query planner. An ** OR-ed combination of these values can be used when searching for ** particular WhereTerms within a WhereClause. +** +** Value constraints: +** WO_EQ == SQLITE_INDEX_CONSTRAINT_EQ +** WO_LT == SQLITE_INDEX_CONSTRAINT_LT +** WO_LE == SQLITE_INDEX_CONSTRAINT_LE +** WO_GT == SQLITE_INDEX_CONSTRAINT_GT +** WO_GE == SQLITE_INDEX_CONSTRAINT_GE */ -#define WO_IN 0x001 -#define WO_EQ 0x002 +#define WO_IN 0x0001 +#define WO_EQ 0x0002 #define WO_LT (WO_EQ<<(TK_LT-TK_EQ)) #define WO_LE (WO_EQ<<(TK_LE-TK_EQ)) #define WO_GT (WO_EQ<<(TK_GT-TK_EQ)) #define WO_GE (WO_EQ<<(TK_GE-TK_EQ)) -#define WO_MATCH 0x040 -#define WO_ISNULL 0x080 -#define WO_OR 0x100 /* Two or more OR-connected terms */ -#define WO_AND 0x200 /* Two or more AND-connected terms */ -#define WO_EQUIV 0x400 /* Of the form A==B, both columns */ -#define WO_NOOP 0x800 /* This term does not restrict search space */ +#define WO_AUX 0x0040 /* Op useful to virtual tables only */ +#define WO_IS 0x0080 +#define WO_ISNULL 0x0100 +#define WO_OR 0x0200 /* Two or more OR-connected terms */ +#define WO_AND 0x0400 /* Two or more AND-connected terms */ +#define WO_EQUIV 0x0800 /* Of the form A==B, both columns */ +#define WO_NOOP 0x1000 /* This term does not restrict search space */ -#define WO_ALL 0xfff /* Mask of all possible WO_* values */ -#define WO_SINGLE 0x0ff /* Mask of all non-compound WO_* values */ +#define WO_ALL 0x1fff /* Mask of all possible WO_* values */ +#define WO_SINGLE 0x01ff /* Mask of all non-compound WO_* values */ /* ** These are definitions of bits in the WhereLoop.wsFlags field. @@ -114954,138 +132409,2252 @@ struct WhereInfo { #define WHERE_PARTIALIDX 0x00020000 /* The automatic index is partial */ /************** End of whereInt.h ********************************************/ -/************** Continuing where we left off in where.c **********************/ +/************** Continuing where we left off in wherecode.c ******************/ + +#ifndef SQLITE_OMIT_EXPLAIN /* -** Return the estimated number of output rows from a WHERE clause +** Return the name of the i-th column of the pIdx index. */ -SQLITE_PRIVATE u64 sqlite3WhereOutputRowCount(WhereInfo *pWInfo){ - return sqlite3LogEstToInt(pWInfo->nRowOut); +static const char *explainIndexColumnName(Index *pIdx, int i){ + i = pIdx->aiColumn[i]; + if( i==XN_EXPR ) return "<expr>"; + if( i==XN_ROWID ) return "rowid"; + return pIdx->pTable->aCol[i].zName; } /* -** Return one of the WHERE_DISTINCT_xxxxx values to indicate how this -** WHERE clause returns outputs for DISTINCT processing. -*/ -SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){ - return pWInfo->eDistinct; -} - -/* -** Return TRUE if the WHERE clause returns rows in ORDER BY order. -** Return FALSE if the output needs to be sorted. -*/ -SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ - return pWInfo->nOBSat; -} - -/* -** Return the VDBE address or label to jump to in order to continue -** immediately with the next row of a WHERE clause. -*/ -SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo *pWInfo){ - assert( pWInfo->iContinue!=0 ); - return pWInfo->iContinue; -} - -/* -** Return the VDBE address or label to jump to in order to break -** out of a WHERE loop. -*/ -SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ - return pWInfo->iBreak; -} - -/* -** Return TRUE if an UPDATE or DELETE statement can operate directly on -** the rowids returned by a WHERE clause. Return FALSE if doing an -** UPDATE or DELETE might change subsequent WHERE clause results. +** This routine is a helper for explainIndexRange() below ** -** If the ONEPASS optimization is used (if this routine returns true) -** then also write the indices of open cursors used by ONEPASS -** into aiCur[0] and aiCur[1]. iaCur[0] gets the cursor of the data -** table and iaCur[1] gets the cursor used by an auxiliary index. -** Either value may be -1, indicating that cursor is not used. -** Any cursors returned will have been opened for writing. -** -** aiCur[0] and aiCur[1] both get -1 if the where-clause logic is -** unable to use the ONEPASS optimization. +** pStr holds the text of an expression that we are building up one term +** at a time. This routine adds a new term to the end of the expression. +** Terms are separated by AND so add the "AND" text for second and subsequent +** terms only. */ -SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ - memcpy(aiCur, pWInfo->aiCurOnePass, sizeof(int)*2); - return pWInfo->okOnePass; -} - -/* -** Move the content of pSrc into pDest -*/ -static void whereOrMove(WhereOrSet *pDest, WhereOrSet *pSrc){ - pDest->n = pSrc->n; - memcpy(pDest->a, pSrc->a, pDest->n*sizeof(pDest->a[0])); -} - -/* -** Try to insert a new prerequisite/cost entry into the WhereOrSet pSet. -** -** The new entry might overwrite an existing entry, or it might be -** appended, or it might be discarded. Do whatever is the right thing -** so that pSet keeps the N_OR_COST best entries seen so far. -*/ -static int whereOrInsert( - WhereOrSet *pSet, /* The WhereOrSet to be updated */ - Bitmask prereq, /* Prerequisites of the new entry */ - LogEst rRun, /* Run-cost of the new entry */ - LogEst nOut /* Number of outputs for the new entry */ +static void explainAppendTerm( + StrAccum *pStr, /* The text expression being built */ + Index *pIdx, /* Index to read column names from */ + int nTerm, /* Number of terms */ + int iTerm, /* Zero-based index of first term. */ + int bAnd, /* Non-zero to append " AND " */ + const char *zOp /* Name of the operator */ ){ - u16 i; - WhereOrCost *p; - for(i=pSet->n, p=pSet->a; i>0; i--, p++){ - if( rRun<=p->rRun && (prereq & p->prereq)==prereq ){ - goto whereOrInsert_done; - } - if( p->rRun<=rRun && (p->prereq & prereq)==p->prereq ){ - return 0; - } + int i; + + assert( nTerm>=1 ); + if( bAnd ) sqlite3_str_append(pStr, " AND ", 5); + + if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); + for(i=0; i<nTerm; i++){ + if( i ) sqlite3_str_append(pStr, ",", 1); + sqlite3_str_appendall(pStr, explainIndexColumnName(pIdx, iTerm+i)); } - if( pSet->n<N_OR_COST ){ - p = &pSet->a[pSet->n++]; - p->nOut = nOut; + if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1); + + sqlite3_str_append(pStr, zOp, 1); + + if( nTerm>1 ) sqlite3_str_append(pStr, "(", 1); + for(i=0; i<nTerm; i++){ + if( i ) sqlite3_str_append(pStr, ",", 1); + sqlite3_str_append(pStr, "?", 1); + } + if( nTerm>1 ) sqlite3_str_append(pStr, ")", 1); +} + +/* +** Argument pLevel describes a strategy for scanning table pTab. This +** function appends text to pStr that describes the subset of table +** rows scanned by the strategy in the form of an SQL expression. +** +** For example, if the query: +** +** SELECT * FROM t1 WHERE a=1 AND b>2; +** +** is run and there is an index on (a, b), then this function returns a +** string similar to: +** +** "a=? AND b>?" +*/ +static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ + Index *pIndex = pLoop->u.btree.pIndex; + u16 nEq = pLoop->u.btree.nEq; + u16 nSkip = pLoop->nSkip; + int i, j; + + if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; + sqlite3_str_append(pStr, " (", 2); + for(i=0; i<nEq; i++){ + const char *z = explainIndexColumnName(pIndex, i); + if( i ) sqlite3_str_append(pStr, " AND ", 5); + sqlite3_str_appendf(pStr, i>=nSkip ? "%s=?" : "ANY(%s)", z); + } + + j = i; + if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nBtm, j, i, ">"); + i = 1; + } + if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ + explainAppendTerm(pStr, pIndex, pLoop->u.btree.nTop, j, i, "<"); + } + sqlite3_str_append(pStr, ")", 1); +} + +/* +** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN +** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was +** defined at compile-time. If it is not a no-op, a single OP_Explain opcode +** is added to the output to describe the table scan strategy in pLevel. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +SQLITE_PRIVATE int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +){ + int ret = 0; +#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) + if( sqlite3ParseToplevel(pParse)->explain==2 ) +#endif + { + struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom]; + Vdbe *v = pParse->pVdbe; /* VM being constructed */ + sqlite3 *db = pParse->db; /* Database handle */ + int isSearch; /* True for a SEARCH. False for SCAN. */ + WhereLoop *pLoop; /* The controlling WhereLoop object */ + u32 flags; /* Flags that describe this loop */ + char *zMsg; /* Text to add to EQP output */ + StrAccum str; /* EQP output string */ + char zBuf[100]; /* Initial space for EQP output string */ + + pLoop = pLevel->pWLoop; + flags = pLoop->wsFlags; + if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_OR_SUBCLAUSE) ) return 0; + + isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 + || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) + || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX)); + + sqlite3StrAccumInit(&str, db, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); + sqlite3_str_appendall(&str, isSearch ? "SEARCH" : "SCAN"); + if( pItem->pSelect ){ + sqlite3_str_appendf(&str, " SUBQUERY 0x%p", pItem->pSelect); + }else{ + sqlite3_str_appendf(&str, " TABLE %s", pItem->zName); + } + + if( pItem->zAlias ){ + sqlite3_str_appendf(&str, " AS %s", pItem->zAlias); + } + if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ + const char *zFmt = 0; + Index *pIdx; + + assert( pLoop->u.btree.pIndex!=0 ); + pIdx = pLoop->u.btree.pIndex; + assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); + if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ + if( isSearch ){ + zFmt = "PRIMARY KEY"; + } + }else if( flags & WHERE_PARTIALIDX ){ + zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; + }else if( flags & WHERE_AUTO_INDEX ){ + zFmt = "AUTOMATIC COVERING INDEX"; + }else if( flags & WHERE_IDX_ONLY ){ + zFmt = "COVERING INDEX %s"; + }else{ + zFmt = "INDEX %s"; + } + if( zFmt ){ + sqlite3_str_append(&str, " USING ", 7); + sqlite3_str_appendf(&str, zFmt, pIdx->zName); + explainIndexRange(&str, pLoop); + } + }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ + const char *zRangeOp; + if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ + zRangeOp = "="; + }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ + zRangeOp = ">? AND rowid<"; + }else if( flags&WHERE_BTM_LIMIT ){ + zRangeOp = ">"; + }else{ + assert( flags&WHERE_TOP_LIMIT); + zRangeOp = "<"; + } + sqlite3_str_appendf(&str, + " USING INTEGER PRIMARY KEY (rowid%s?)",zRangeOp); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + else if( (flags & WHERE_VIRTUALTABLE)!=0 ){ + sqlite3_str_appendf(&str, " VIRTUAL TABLE INDEX %d:%s", + pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); + } +#endif +#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS + if( pLoop->nOut>=10 ){ + sqlite3_str_appendf(&str, " (~%llu rows)", + sqlite3LogEstToInt(pLoop->nOut)); + }else{ + sqlite3_str_append(&str, " (~1 row)", 9); + } +#endif + zMsg = sqlite3StrAccumFinish(&str); + ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), + pParse->addrExplain, 0, zMsg,P4_DYNAMIC); + } + return ret; +} +#endif /* SQLITE_OMIT_EXPLAIN */ + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS +/* +** Configure the VM passed as the first argument with an +** sqlite3_stmt_scanstatus() entry corresponding to the scan used to +** implement level pLvl. Argument pSrclist is a pointer to the FROM +** clause that the scan reads data from. +** +** If argument addrExplain is not 0, it must be the address of an +** OP_Explain instruction that describes the same loop. +*/ +SQLITE_PRIVATE void sqlite3WhereAddScanStatus( + Vdbe *v, /* Vdbe to add scanstatus entry to */ + SrcList *pSrclist, /* FROM clause pLvl reads data from */ + WhereLevel *pLvl, /* Level to add scanstatus() entry for */ + int addrExplain /* Address of OP_Explain (or 0) */ +){ + const char *zObj = 0; + WhereLoop *pLoop = pLvl->pWLoop; + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ + zObj = pLoop->u.btree.pIndex->zName; }else{ - p = pSet->a; - for(i=1; i<pSet->n; i++){ - if( p->rRun>pSet->a[i].rRun ) p = pSet->a + i; - } - if( p->rRun<=rRun ) return 0; + zObj = pSrclist->a[pLvl->iFrom].zName; + } + sqlite3VdbeScanStatus( + v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj + ); +} +#endif + + +/* +** Disable a term in the WHERE clause. Except, do not disable the term +** if it controls a LEFT OUTER JOIN and it did not originate in the ON +** or USING clause of that join. +** +** Consider the term t2.z='ok' in the following queries: +** +** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok' +** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok' +** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok' +** +** The t2.z='ok' is disabled in the in (2) because it originates +** in the ON clause. The term is disabled in (3) because it is not part +** of a LEFT OUTER JOIN. In (1), the term is not disabled. +** +** Disabling a term causes that term to not be tested in the inner loop +** of the join. Disabling is an optimization. When terms are satisfied +** by indices, we disable them to prevent redundant tests in the inner +** loop. We would get the correct results if nothing were ever disabled, +** but joins might run a little slower. The trick is to disable as much +** as we can without disabling too much. If we disabled in (1), we'd get +** the wrong answer. See ticket #813. +** +** If all the children of a term are disabled, then that term is also +** automatically disabled. In this way, terms get disabled if derived +** virtual terms are tested first. For example: +** +** x GLOB 'abc*' AND x>='abc' AND x<'acd' +** \___________/ \______/ \_____/ +** parent child1 child2 +** +** Only the parent term was in the original WHERE clause. The child1 +** and child2 terms were added by the LIKE optimization. If both of +** the virtual child terms are valid, then testing of the parent can be +** skipped. +** +** Usually the parent term is marked as TERM_CODED. But if the parent +** term was originally TERM_LIKE, then the parent gets TERM_LIKECOND instead. +** The TERM_LIKECOND marking indicates that the term should be coded inside +** a conditional such that is only evaluated on the second pass of a +** LIKE-optimization loop, when scanning BLOBs instead of strings. +*/ +static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ + int nLoop = 0; + assert( pTerm!=0 ); + while( (pTerm->wtFlags & TERM_CODED)==0 + && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pLevel->notReady & pTerm->prereqAll)==0 + ){ + if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ + pTerm->wtFlags |= TERM_LIKECOND; + }else{ + pTerm->wtFlags |= TERM_CODED; + } + if( pTerm->iParent<0 ) break; + pTerm = &pTerm->pWC->a[pTerm->iParent]; + assert( pTerm!=0 ); + pTerm->nChild--; + if( pTerm->nChild!=0 ) break; + nLoop++; } -whereOrInsert_done: - p->prereq = prereq; - p->rRun = rRun; - if( p->nOut>nOut ) p->nOut = nOut; - return 1; } /* -** Initialize a preallocated WhereClause structure. +** Code an OP_Affinity opcode to apply the column affinity string zAff +** to the n registers starting at base. +** +** As an optimization, SQLITE_AFF_BLOB entries (which are no-ops) at the +** beginning and end of zAff are ignored. If all entries in zAff are +** SQLITE_AFF_BLOB, then no code gets generated. +** +** This routine makes its own copy of zAff so that the caller is free +** to modify zAff after this routine returns. */ -static void whereClauseInit( - WhereClause *pWC, /* The WhereClause to be initialized */ - WhereInfo *pWInfo /* The WHERE processing context */ -){ - pWC->pWInfo = pWInfo; - pWC->pOuter = 0; - pWC->nTerm = 0; - pWC->nSlot = ArraySize(pWC->aStatic); - pWC->a = pWC->aStatic; +static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ + Vdbe *v = pParse->pVdbe; + if( zAff==0 ){ + assert( pParse->db->mallocFailed ); + return; + } + assert( v!=0 ); + + /* Adjust base and n to skip over SQLITE_AFF_BLOB entries at the beginning + ** and end of the affinity string. + */ + while( n>0 && zAff[0]==SQLITE_AFF_BLOB ){ + n--; + base++; + zAff++; + } + while( n>1 && zAff[n-1]==SQLITE_AFF_BLOB ){ + n--; + } + + /* Code the OP_Affinity opcode if there is anything left to do. */ + if( n>0 ){ + sqlite3VdbeAddOp4(v, OP_Affinity, base, n, 0, zAff, n); + sqlite3ExprCacheAffinityChange(pParse, base, n); + } } -/* Forward reference */ -static void whereClauseClear(WhereClause*); +/* +** Expression pRight, which is the RHS of a comparison operation, is +** either a vector of n elements or, if n==1, a scalar expression. +** Before the comparison operation, affinity zAff is to be applied +** to the pRight values. This function modifies characters within the +** affinity string to SQLITE_AFF_BLOB if either: +** +** * the comparison will be performed with no affinity, or +** * the affinity change in zAff is guaranteed not to change the value. +*/ +static void updateRangeAffinityStr( + Expr *pRight, /* RHS of comparison */ + int n, /* Number of vector elements in comparison */ + char *zAff /* Affinity string to modify */ +){ + int i; + for(i=0; i<n; i++){ + Expr *p = sqlite3VectorFieldSubexpr(pRight, i); + if( sqlite3CompareAffinity(p, zAff[i])==SQLITE_AFF_BLOB + || sqlite3ExprNeedsNoAffinityChange(p, zAff[i]) + ){ + zAff[i] = SQLITE_AFF_BLOB; + } + } +} + + +/* +** pX is an expression of the form: (vector) IN (SELECT ...) +** In other words, it is a vector IN operator with a SELECT clause on the +** LHS. But not all terms in the vector are indexable and the terms might +** not be in the correct order for indexing. +** +** This routine makes a copy of the input pX expression and then adjusts +** the vector on the LHS with corresponding changes to the SELECT so that +** the vector contains only index terms and those terms are in the correct +** order. The modified IN expression is returned. The caller is responsible +** for deleting the returned expression. +** +** Example: +** +** CREATE TABLE t1(a,b,c,d,e,f); +** CREATE INDEX t1x1 ON t1(e,c); +** SELECT * FROM t1 WHERE (a,b,c,d,e) IN (SELECT v,w,x,y,z FROM t2) +** \_______________________________________/ +** The pX expression +** +** Since only columns e and c can be used with the index, in that order, +** the modified IN expression that is returned will be: +** +** (e,c) IN (SELECT z,x FROM t2) +** +** The reduced pX is different from the original (obviously) and thus is +** only used for indexing, to improve performance. The original unaltered +** IN expression must also be run on each output row for correctness. +*/ +static Expr *removeUnindexableInClauseTerms( + Parse *pParse, /* The parsing context */ + int iEq, /* Look at loop terms starting here */ + WhereLoop *pLoop, /* The current loop */ + Expr *pX /* The IN expression to be reduced */ +){ + sqlite3 *db = pParse->db; + Expr *pNew = sqlite3ExprDup(db, pX, 0); + if( db->mallocFailed==0 ){ + ExprList *pOrigRhs = pNew->x.pSelect->pEList; /* Original unmodified RHS */ + ExprList *pOrigLhs = pNew->pLeft->x.pList; /* Original unmodified LHS */ + ExprList *pRhs = 0; /* New RHS after modifications */ + ExprList *pLhs = 0; /* New LHS after mods */ + int i; /* Loop counter */ + Select *pSelect; /* Pointer to the SELECT on the RHS */ + + for(i=iEq; i<pLoop->nLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iField = pLoop->aLTerm[i]->iField - 1; + assert( pOrigRhs->a[iField].pExpr!=0 ); + pRhs = sqlite3ExprListAppend(pParse, pRhs, pOrigRhs->a[iField].pExpr); + pOrigRhs->a[iField].pExpr = 0; + assert( pOrigLhs->a[iField].pExpr!=0 ); + pLhs = sqlite3ExprListAppend(pParse, pLhs, pOrigLhs->a[iField].pExpr); + pOrigLhs->a[iField].pExpr = 0; + } + } + sqlite3ExprListDelete(db, pOrigRhs); + sqlite3ExprListDelete(db, pOrigLhs); + pNew->pLeft->x.pList = pLhs; + pNew->x.pSelect->pEList = pRhs; + if( pLhs && pLhs->nExpr==1 ){ + /* Take care here not to generate a TK_VECTOR containing only a + ** single value. Since the parser never creates such a vector, some + ** of the subroutines do not handle this case. */ + Expr *p = pLhs->a[0].pExpr; + pLhs->a[0].pExpr = 0; + sqlite3ExprDelete(db, pNew->pLeft); + pNew->pLeft = p; + } + pSelect = pNew->x.pSelect; + if( pSelect->pOrderBy ){ + /* If the SELECT statement has an ORDER BY clause, zero the + ** iOrderByCol variables. These are set to non-zero when an + ** ORDER BY term exactly matches one of the terms of the + ** result-set. Since the result-set of the SELECT statement may + ** have been modified or reordered, these variables are no longer + ** set correctly. Since setting them is just an optimization, + ** it's easiest just to zero them here. */ + ExprList *pOrderBy = pSelect->pOrderBy; + for(i=0; i<pOrderBy->nExpr; i++){ + pOrderBy->a[i].u.x.iOrderByCol = 0; + } + } + +#if 0 + printf("For indexing, change the IN expr:\n"); + sqlite3TreeViewExpr(0, pX, 0); + printf("Into:\n"); + sqlite3TreeViewExpr(0, pNew, 0); +#endif + } + return pNew; +} + + +/* +** Generate code for a single equality term of the WHERE clause. An equality +** term can be either X=expr or X IN (...). pTerm is the term to be +** coded. +** +** The current value for the constraint is left in a register, the index +** of which is returned. An attempt is made store the result in iTarget but +** this is only guaranteed for TK_ISNULL and TK_IN constraints. If the +** constraint is a TK_EQ or TK_IS, then the current value might be left in +** some other register and it is the caller's responsibility to compensate. +** +** For a constraint of the form X=expr, the expression is evaluated in +** straight-line code. For constraints of the form X IN (...) +** this routine sets up a loop that will iterate over all values of X. +*/ +static int codeEqualityTerm( + Parse *pParse, /* The parsing context */ + WhereTerm *pTerm, /* The term of the WHERE clause to be coded */ + WhereLevel *pLevel, /* The level of the FROM clause we are working on */ + int iEq, /* Index of the equality term within this level */ + int bRev, /* True for reverse-order IN operations */ + int iTarget /* Attempt to leave results in this register */ +){ + Expr *pX = pTerm->pExpr; + Vdbe *v = pParse->pVdbe; + int iReg; /* Register holding results */ + + assert( pLevel->pWLoop->aLTerm[iEq]==pTerm ); + assert( iTarget>0 ); + if( pX->op==TK_EQ || pX->op==TK_IS ){ + iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); + }else if( pX->op==TK_ISNULL ){ + iReg = iTarget; + sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); +#ifndef SQLITE_OMIT_SUBQUERY + }else{ + int eType = IN_INDEX_NOOP; + int iTab; + struct InLoop *pIn; + WhereLoop *pLoop = pLevel->pWLoop; + int i; + int nEq = 0; + int *aiMap = 0; + + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 + && pLoop->u.btree.pIndex!=0 + && pLoop->u.btree.pIndex->aSortOrder[iEq] + ){ + testcase( iEq==0 ); + testcase( bRev ); + bRev = !bRev; + } + assert( pX->op==TK_IN ); + iReg = iTarget; + + for(i=0; i<iEq; i++){ + if( pLoop->aLTerm[i] && pLoop->aLTerm[i]->pExpr==pX ){ + disableTerm(pLevel, pTerm); + return iTarget; + } + } + for(i=iEq;i<pLoop->nLTerm; i++){ + assert( pLoop->aLTerm[i]!=0 ); + if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; + } + + if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0); + }else{ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap); + pTerm->pExpr->iTable = pX->iTable; + } + sqlite3ExprDelete(db, pX); + pX = pTerm->pExpr; + } + + if( eType==IN_INDEX_INDEX_DESC ){ + testcase( bRev ); + bRev = !bRev; + } + iTab = pX->iTable; + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); + VdbeCoverageIf(v, bRev); + VdbeCoverageIf(v, !bRev); + assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); + + pLoop->wsFlags |= WHERE_IN_ABLE; + if( pLevel->u.in.nIn==0 ){ + pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + } + + i = pLevel->u.in.nIn; + pLevel->u.in.nIn += nEq; + pLevel->u.in.aInLoop = + sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + pIn = pLevel->u.in.aInLoop; + if( pIn ){ + int iMap = 0; /* Index in aiMap[] */ + pIn += i; + for(i=iEq;i<pLoop->nLTerm; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + int iOut = iReg + i - iEq; + if( eType==IN_INDEX_ROWID ){ + testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ + pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); + }else{ + int iCol = aiMap ? aiMap[iMap++] : 0; + pIn->addrInTop = sqlite3VdbeAddOp3(v,OP_Column,iTab, iCol, iOut); + } + sqlite3VdbeAddOp1(v, OP_IsNull, iOut); VdbeCoverage(v); + if( i==iEq ){ + pIn->iCur = iTab; + pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen; + }else{ + pIn->eEndLoopOp = OP_Noop; + } + pIn++; + } + } + }else{ + pLevel->u.in.nIn = 0; + } + sqlite3DbFree(pParse->db, aiMap); +#endif + } + disableTerm(pLevel, pTerm); + return iReg; +} + +/* +** Generate code that will evaluate all == and IN constraints for an +** index scan. +** +** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). +** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 +** The index has as many as three equality constraints, but in this +** example, the third "c" value is an inequality. So only two +** constraints are coded. This routine will generate code to evaluate +** a==5 and b IN (1,2,3). The current values for a and b will be stored +** in consecutive registers and the index of the first register is returned. +** +** In the example above nEq==2. But this subroutine works for any value +** of nEq including 0. If nEq==0, this routine is nearly a no-op. +** The only thing it does is allocate the pLevel->iMem memory cell and +** compute the affinity string. +** +** The nExtraReg parameter is 0 or 1. It is 0 if all WHERE clause constraints +** are == or IN and are covered by the nEq. nExtraReg is 1 if there is +** an inequality constraint (such as the "c>=5 AND c<10" in the example) that +** occurs after the nEq quality constraints. +** +** This routine allocates a range of nEq+nExtraReg memory cells and returns +** the index of the first memory cell in that range. The code that +** calls this routine will use that memory range to store keys for +** start and termination conditions of the loop. +** key value of the loop. If one or more IN operators appear, then +** this routine allocates an additional nEq memory cells for internal +** use. +** +** Before returning, *pzAff is set to point to a buffer containing a +** copy of the column affinity string of the index allocated using +** sqlite3DbMalloc(). Except, entries in the copy of the string associated +** with equality constraints that use BLOB or NONE affinity are set to +** SQLITE_AFF_BLOB. This is to deal with SQL such as the following: +** +** CREATE TABLE t1(a TEXT PRIMARY KEY, b); +** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b; +** +** In the example above, the index on t1(a) has TEXT affinity. But since +** the right hand side of the equality constraint (t2.b) has BLOB/NONE affinity, +** no conversion should be attempted before using a t2.b value as part of +** a key to search the index. Hence the first byte in the returned affinity +** string in this example would be set to SQLITE_AFF_BLOB. +*/ +static int codeAllEqualityTerms( + Parse *pParse, /* Parsing context */ + WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */ + int bRev, /* Reverse the order of IN operators */ + int nExtraReg, /* Number of extra registers to allocate */ + char **pzAff /* OUT: Set to point to affinity string */ +){ + u16 nEq; /* The number of == or IN constraints to code */ + u16 nSkip; /* Number of left-most columns to skip */ + Vdbe *v = pParse->pVdbe; /* The vm under construction */ + Index *pIdx; /* The index being used for this loop */ + WhereTerm *pTerm; /* A single constraint term */ + WhereLoop *pLoop; /* The WhereLoop object */ + int j; /* Loop counter */ + int regBase; /* Base register */ + int nReg; /* Number of registers to allocate */ + char *zAff; /* Affinity string to return */ + + /* This module is only called on query plans that use an index. */ + pLoop = pLevel->pWLoop; + assert( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ); + nEq = pLoop->u.btree.nEq; + nSkip = pLoop->nSkip; + pIdx = pLoop->u.btree.pIndex; + assert( pIdx!=0 ); + + /* Figure out how many memory cells we will need then allocate them. + */ + regBase = pParse->nMem + 1; + nReg = pLoop->u.btree.nEq + nExtraReg; + pParse->nMem += nReg; + + zAff = sqlite3DbStrDup(pParse->db,sqlite3IndexAffinityStr(pParse->db,pIdx)); + assert( zAff!=0 || pParse->db->mallocFailed ); + + if( nSkip ){ + int iIdxCur = pLevel->iIdxCur; + sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); + j = sqlite3VdbeAddOp0(v, OP_Goto); + pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), + iIdxCur, 0, regBase, nSkip); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + sqlite3VdbeJumpHere(v, j); + for(j=0; j<nSkip; j++){ + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, j, regBase+j); + testcase( pIdx->aiColumn[j]==XN_EXPR ); + VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); + } + } + + /* Evaluate the equality constraints + */ + assert( zAff==0 || (int)strlen(zAff)>=nEq ); + for(j=nSkip; j<nEq; j++){ + int r1; + pTerm = pLoop->aLTerm[j]; + assert( pTerm!=0 ); + /* The following testcase is true for indices with redundant columns. + ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ + testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j); + if( r1!=regBase+j ){ + if( nReg==1 ){ + sqlite3ReleaseTempReg(pParse, regBase); + regBase = r1; + }else{ + sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j); + } + } + if( pTerm->eOperator & WO_IN ){ + if( pTerm->pExpr->flags & EP_xIsSelect ){ + /* No affinity ever needs to be (or should be) applied to a value + ** from the RHS of an "? IN (SELECT ...)" expression. The + ** sqlite3FindInIndex() routine has already ensured that the + ** affinity of the comparison has been applied to the value. */ + if( zAff ) zAff[j] = SQLITE_AFF_BLOB; + } + }else if( (pTerm->eOperator & WO_ISNULL)==0 ){ + Expr *pRight = pTerm->pExpr->pRight; + if( (pTerm->wtFlags & TERM_IS)==0 && sqlite3ExprCanBeNull(pRight) ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); + VdbeCoverage(v); + } + if( zAff ){ + if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_BLOB ){ + zAff[j] = SQLITE_AFF_BLOB; + } + if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ + zAff[j] = SQLITE_AFF_BLOB; + } + } + } + } + *pzAff = zAff; + return regBase; +} + +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS +/* +** If the most recently coded instruction is a constant range constraint +** (a string literal) that originated from the LIKE optimization, then +** set P3 and P5 on the OP_String opcode so that the string will be cast +** to a BLOB at appropriate times. +** +** The LIKE optimization trys to evaluate "x LIKE 'abc%'" as a range +** expression: "x>='ABC' AND x<'abd'". But this requires that the range +** scan loop run twice, once for strings and a second time for BLOBs. +** The OP_String opcodes on the second pass convert the upper and lower +** bound string constants to blobs. This routine makes the necessary changes +** to the OP_String opcodes for that to happen. +** +** Except, of course, if SQLITE_LIKE_DOESNT_MATCH_BLOBS is defined, then +** only the one pass through the string space is required, so this routine +** becomes a no-op. +*/ +static void whereLikeOptimizationStringFixup( + Vdbe *v, /* prepared statement under construction */ + WhereLevel *pLevel, /* The loop that contains the LIKE operator */ + WhereTerm *pTerm /* The upper or lower bound just coded */ +){ + if( pTerm->wtFlags & TERM_LIKEOPT ){ + VdbeOp *pOp; + assert( pLevel->iLikeRepCntr>0 ); + pOp = sqlite3VdbeGetOp(v, -1); + assert( pOp!=0 ); + assert( pOp->opcode==OP_String8 + || pTerm->pWC->pWInfo->pParse->db->mallocFailed ); + pOp->p3 = (int)(pLevel->iLikeRepCntr>>1); /* Register holding counter */ + pOp->p5 = (u8)(pLevel->iLikeRepCntr&1); /* ASC or DESC */ + } +} +#else +# define whereLikeOptimizationStringFixup(A,B,C) +#endif + +#ifdef SQLITE_ENABLE_CURSOR_HINTS +/* +** Information is passed from codeCursorHint() down to individual nodes of +** the expression tree (by sqlite3WalkExpr()) using an instance of this +** structure. +*/ +struct CCurHint { + int iTabCur; /* Cursor for the main table */ + int iIdxCur; /* Cursor for the index, if pIdx!=0. Unused otherwise */ + Index *pIdx; /* The index used to access the table */ +}; + +/* +** This function is called for every node of an expression that is a candidate +** for a cursor hint on an index cursor. For TK_COLUMN nodes that reference +** the table CCurHint.iTabCur, verify that the same column can be +** accessed through the index. If it cannot, then set pWalker->eCode to 1. +*/ +static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ + struct CCurHint *pHint = pWalker->u.pCCurHint; + assert( pHint->pIdx!=0 ); + if( pExpr->op==TK_COLUMN + && pExpr->iTable==pHint->iTabCur + && sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn)<0 + ){ + pWalker->eCode = 1; + } + return WRC_Continue; +} + +/* +** Test whether or not expression pExpr, which was part of a WHERE clause, +** should be included in the cursor-hint for a table that is on the rhs +** of a LEFT JOIN. Set Walker.eCode to non-zero before returning if the +** expression is not suitable. +** +** An expression is unsuitable if it might evaluate to non NULL even if +** a TK_COLUMN node that does affect the value of the expression is set +** to NULL. For example: +** +** col IS NULL +** col IS NOT NULL +** coalesce(col, 1) +** CASE WHEN col THEN 0 ELSE 1 END +*/ +static int codeCursorHintIsOrFunction(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_IS + || pExpr->op==TK_ISNULL || pExpr->op==TK_ISNOT + || pExpr->op==TK_NOTNULL || pExpr->op==TK_CASE + ){ + pWalker->eCode = 1; + }else if( pExpr->op==TK_FUNCTION ){ + int d1; + char d2[4]; + if( 0==sqlite3IsLikeFunction(pWalker->pParse->db, pExpr, &d1, d2) ){ + pWalker->eCode = 1; + } + } + + return WRC_Continue; +} + + +/* +** This function is called on every node of an expression tree used as an +** argument to the OP_CursorHint instruction. If the node is a TK_COLUMN +** that accesses any table other than the one identified by +** CCurHint.iTabCur, then do the following: +** +** 1) allocate a register and code an OP_Column instruction to read +** the specified column into the new register, and +** +** 2) transform the expression node to a TK_REGISTER node that reads +** from the newly populated register. +** +** Also, if the node is a TK_COLUMN that does access the table idenified +** by pCCurHint.iTabCur, and an index is being used (which we will +** know because CCurHint.pIdx!=0) then transform the TK_COLUMN into +** an access of the index rather than the original table. +*/ +static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ + int rc = WRC_Continue; + struct CCurHint *pHint = pWalker->u.pCCurHint; + if( pExpr->op==TK_COLUMN ){ + if( pExpr->iTable!=pHint->iTabCur ){ + Vdbe *v = pWalker->pParse->pVdbe; + int reg = ++pWalker->pParse->nMem; /* Register for column value */ + sqlite3ExprCodeGetColumnOfTable( + v, pExpr->pTab, pExpr->iTable, pExpr->iColumn, reg + ); + pExpr->op = TK_REGISTER; + pExpr->iTable = reg; + }else if( pHint->pIdx!=0 ){ + pExpr->iTable = pHint->iIdxCur; + pExpr->iColumn = sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn); + assert( pExpr->iColumn>=0 ); + } + }else if( pExpr->op==TK_AGG_FUNCTION ){ + /* An aggregate function in the WHERE clause of a query means this must + ** be a correlated sub-query, and expression pExpr is an aggregate from + ** the parent context. Do not walk the function arguments in this case. + ** + ** todo: It should be possible to replace this node with a TK_REGISTER + ** expression, as the result of the expression must be stored in a + ** register at this point. The same holds for TK_AGG_COLUMN nodes. */ + rc = WRC_Prune; + } + return rc; +} + +/* +** Insert an OP_CursorHint instruction if it is appropriate to do so. +*/ +static void codeCursorHint( + struct SrcList_item *pTabItem, /* FROM clause item */ + WhereInfo *pWInfo, /* The where clause */ + WhereLevel *pLevel, /* Which loop to provide hints for */ + WhereTerm *pEndRange /* Hint this end-of-scan boundary term if not NULL */ +){ + Parse *pParse = pWInfo->pParse; + sqlite3 *db = pParse->db; + Vdbe *v = pParse->pVdbe; + Expr *pExpr = 0; + WhereLoop *pLoop = pLevel->pWLoop; + int iCur; + WhereClause *pWC; + WhereTerm *pTerm; + int i, j; + struct CCurHint sHint; + Walker sWalker; + + if( OptimizationDisabled(db, SQLITE_CursorHints) ) return; + iCur = pLevel->iTabCur; + assert( iCur==pWInfo->pTabList->a[pLevel->iFrom].iCursor ); + sHint.iTabCur = iCur; + sHint.iIdxCur = pLevel->iIdxCur; + sHint.pIdx = pLoop->u.btree.pIndex; + memset(&sWalker, 0, sizeof(sWalker)); + sWalker.pParse = pParse; + sWalker.u.pCCurHint = &sHint; + pWC = &pWInfo->sWC; + for(i=0; i<pWC->nTerm; i++){ + pTerm = &pWC->a[i]; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( pTerm->prereqAll & pLevel->notReady ) continue; + + /* Any terms specified as part of the ON(...) clause for any LEFT + ** JOIN for which the current table is not the rhs are omitted + ** from the cursor-hint. + ** + ** If this table is the rhs of a LEFT JOIN, "IS" or "IS NULL" terms + ** that were specified as part of the WHERE clause must be excluded. + ** This is to address the following: + ** + ** SELECT ... t1 LEFT JOIN t2 ON (t1.a=t2.b) WHERE t2.c IS NULL; + ** + ** Say there is a single row in t2 that matches (t1.a=t2.b), but its + ** t2.c values is not NULL. If the (t2.c IS NULL) constraint is + ** pushed down to the cursor, this row is filtered out, causing + ** SQLite to synthesize a row of NULL values. Which does match the + ** WHERE clause, and so the query returns a row. Which is incorrect. + ** + ** For the same reason, WHERE terms such as: + ** + ** WHERE 1 = (t2.c IS NULL) + ** + ** are also excluded. See codeCursorHintIsOrFunction() for details. + */ + if( pTabItem->fg.jointype & JT_LEFT ){ + Expr *pExpr = pTerm->pExpr; + if( !ExprHasProperty(pExpr, EP_FromJoin) + || pExpr->iRightJoinTable!=pTabItem->iCursor + ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintIsOrFunction; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + }else{ + if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) continue; + } + + /* All terms in pWLoop->aLTerm[] except pEndRange are used to initialize + ** the cursor. These terms are not needed as hints for a pure range + ** scan (that has no == terms) so omit them. */ + if( pLoop->u.btree.nEq==0 && pTerm!=pEndRange ){ + for(j=0; j<pLoop->nLTerm && pLoop->aLTerm[j]!=pTerm; j++){} + if( j<pLoop->nLTerm ) continue; + } + + /* No subqueries or non-deterministic functions allowed */ + if( sqlite3ExprContainsSubquery(pTerm->pExpr) ) continue; + + /* For an index scan, make sure referenced columns are actually in + ** the index. */ + if( sHint.pIdx!=0 ){ + sWalker.eCode = 0; + sWalker.xExprCallback = codeCursorHintCheckExpr; + sqlite3WalkExpr(&sWalker, pTerm->pExpr); + if( sWalker.eCode ) continue; + } + + /* If we survive all prior tests, that means this term is worth hinting */ + pExpr = sqlite3ExprAnd(db, pExpr, sqlite3ExprDup(db, pTerm->pExpr, 0)); + } + if( pExpr!=0 ){ + sWalker.xExprCallback = codeCursorHintFixExpr; + sqlite3WalkExpr(&sWalker, pExpr); + sqlite3VdbeAddOp4(v, OP_CursorHint, + (sHint.pIdx ? sHint.iIdxCur : sHint.iTabCur), 0, 0, + (const char*)pExpr, P4_EXPR); + } +} +#else +# define codeCursorHint(A,B,C,D) /* No-op */ +#endif /* SQLITE_ENABLE_CURSOR_HINTS */ + +/* +** Cursor iCur is open on an intkey b-tree (a table). Register iRowid contains +** a rowid value just read from cursor iIdxCur, open on index pIdx. This +** function generates code to do a deferred seek of cursor iCur to the +** rowid stored in register iRowid. +** +** Normally, this is just: +** +** OP_DeferredSeek $iCur $iRowid +** +** However, if the scan currently being coded is a branch of an OR-loop and +** the statement currently being coded is a SELECT, then P3 of OP_DeferredSeek +** is set to iIdxCur and P4 is set to point to an array of integers +** containing one entry for each column of the table cursor iCur is open +** on. For each table column, if the column is the i'th column of the +** index, then the corresponding array entry is set to (i+1). If the column +** does not appear in the index at all, the array entry is set to 0. +*/ +static void codeDeferredSeek( + WhereInfo *pWInfo, /* Where clause context */ + Index *pIdx, /* Index scan is using */ + int iCur, /* Cursor for IPK b-tree */ + int iIdxCur /* Index cursor */ +){ + Parse *pParse = pWInfo->pParse; /* Parse context */ + Vdbe *v = pParse->pVdbe; /* Vdbe to generate code within */ + + assert( iIdxCur>0 ); + assert( pIdx->aiColumn[pIdx->nColumn-1]==-1 ); + + sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); + if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) + ){ + int i; + Table *pTab = pIdx->pTable; + int *ai = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*(pTab->nCol+1)); + if( ai ){ + ai[0] = pTab->nCol; + for(i=0; i<pIdx->nColumn-1; i++){ + assert( pIdx->aiColumn[i]<pTab->nCol ); + if( pIdx->aiColumn[i]>=0 ) ai[pIdx->aiColumn[i]+1] = i+1; + } + sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); + } + } +} + +/* +** If the expression passed as the second argument is a vector, generate +** code to write the first nReg elements of the vector into an array +** of registers starting with iReg. +** +** If the expression is not a vector, then nReg must be passed 1. In +** this case, generate code to evaluate the expression and leave the +** result in register iReg. +*/ +static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ + assert( nReg>0 ); + if( p && sqlite3ExprIsVector(p) ){ +#ifndef SQLITE_OMIT_SUBQUERY + if( (p->flags & EP_xIsSelect) ){ + Vdbe *v = pParse->pVdbe; + int iSelect = sqlite3CodeSubselect(pParse, p, 0, 0); + sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); + }else +#endif + { + int i; + ExprList *pList = p->x.pList; + assert( nReg<=pList->nExpr ); + for(i=0; i<nReg; i++){ + sqlite3ExprCode(pParse, pList->a[i].pExpr, iReg+i); + } + } + }else{ + assert( nReg==1 ); + sqlite3ExprCode(pParse, p, iReg); + } +} + +/* An instance of the IdxExprTrans object carries information about a +** mapping from an expression on table columns into a column in an index +** down through the Walker. +*/ +typedef struct IdxExprTrans { + Expr *pIdxExpr; /* The index expression */ + int iTabCur; /* The cursor of the corresponding table */ + int iIdxCur; /* The cursor for the index */ + int iIdxCol; /* The column for the index */ +} IdxExprTrans; + +/* The walker node callback used to transform matching expressions into +** a reference to an index column for an index on an expression. +** +** If pExpr matches, then transform it into a reference to the index column +** that contains the value of pExpr. +*/ +static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ + IdxExprTrans *pX = p->u.pIdxTrans; + if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + pExpr->op = TK_COLUMN; + pExpr->iTable = pX->iIdxCur; + pExpr->iColumn = pX->iIdxCol; + pExpr->pTab = 0; + return WRC_Prune; + }else{ + return WRC_Continue; + } +} + +/* +** For an indexes on expression X, locate every instance of expression X +** in pExpr and change that subexpression into a reference to the appropriate +** column of the index. +*/ +static void whereIndexExprTrans( + Index *pIdx, /* The Index */ + int iTabCur, /* Cursor of the table that is being indexed */ + int iIdxCur, /* Cursor of the index itself */ + WhereInfo *pWInfo /* Transform expressions in this WHERE clause */ +){ + int iIdxCol; /* Column number of the index */ + ExprList *aColExpr; /* Expressions that are indexed */ + Walker w; + IdxExprTrans x; + aColExpr = pIdx->aColExpr; + if( aColExpr==0 ) return; /* Not an index on expressions */ + memset(&w, 0, sizeof(w)); + w.xExprCallback = whereIndexExprTransNode; + w.u.pIdxTrans = &x; + x.iTabCur = iTabCur; + x.iIdxCur = iIdxCur; + for(iIdxCol=0; iIdxCol<aColExpr->nExpr; iIdxCol++){ + if( pIdx->aiColumn[iIdxCol]!=XN_EXPR ) continue; + assert( aColExpr->a[iIdxCol].pExpr!=0 ); + x.iIdxCol = iIdxCol; + x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; + sqlite3WalkExpr(&w, pWInfo->pWhere); + sqlite3WalkExprList(&w, pWInfo->pOrderBy); + sqlite3WalkExprList(&w, pWInfo->pResultSet); + } +} + +/* +** Generate code for the start of the iLevel-th loop in the WHERE clause +** implementation described by pWInfo. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( + WhereInfo *pWInfo, /* Complete information about the WHERE clause */ + int iLevel, /* Which level of pWInfo->a[] should be coded */ + Bitmask notReady /* Which tables are currently available */ +){ + int j, k; /* Loop counters */ + int iCur; /* The VDBE cursor for the table */ + int addrNxt; /* Where to jump to continue with the next IN case */ + int omitTable; /* True if we use the index only */ + int bRev; /* True if we need to scan in reverse order */ + WhereLevel *pLevel; /* The where level to be coded */ + WhereLoop *pLoop; /* The WhereLoop object being coded */ + WhereClause *pWC; /* Decomposition of the entire WHERE clause */ + WhereTerm *pTerm; /* A WHERE clause term */ + Parse *pParse; /* Parsing context */ + sqlite3 *db; /* Database connection */ + Vdbe *v; /* The prepared stmt under constructions */ + struct SrcList_item *pTabItem; /* FROM clause term being coded */ + int addrBrk; /* Jump here to break out of the loop */ + int addrHalt; /* addrBrk for the outermost loop */ + int addrCont; /* Jump here to continue with next cycle */ + int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ + int iReleaseReg = 0; /* Temp register to free before returning */ + Index *pIdx = 0; /* Index used by loop (if any) */ + int iLoop; /* Iteration of constraint generator loop */ + + pParse = pWInfo->pParse; + v = pParse->pVdbe; + pWC = &pWInfo->sWC; + db = pParse->db; + pLevel = &pWInfo->a[iLevel]; + pLoop = pLevel->pWLoop; + pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + iCur = pTabItem->iCursor; + pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); + bRev = (pWInfo->revMask>>iLevel)&1; + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; + VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); + + /* Create labels for the "break" and "continue" instructions + ** for the current loop. Jump to addrBrk to break out of a loop. + ** Jump to cont to go immediately to the next iteration of the + ** loop. + ** + ** When there is an IN operator, we also have a "addrNxt" label that + ** means to continue with the next IN value combination. When + ** there are no IN operators in the constraints, the "addrNxt" label + ** is the same as "addrBrk". + */ + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); + + /* If this is the right table of a LEFT OUTER JOIN, allocate and + ** initialize a memory cell that records if this table matches any + ** row of the left table of the join. + */ + assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0 + ); + if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ + pLevel->iLeftJoin = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); + VdbeComment((v, "init LEFT JOIN no-match flag")); + } + + /* Compute a safe address to jump to if we discover that the table for + ** this loop is empty and can never contribute content. */ + for(j=iLevel; j>0 && pWInfo->a[j].iLeftJoin==0; j--){} + addrHalt = pWInfo->a[j].addrBrk; + + /* Special case of a FROM clause subquery implemented as a co-routine */ + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); + VdbeCoverage(v); + VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); + pLevel->op = OP_Goto; + }else + +#ifndef SQLITE_OMIT_VIRTUALTABLE + if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ + /* Case 1: The table is a virtual-table. Use the VFilter and VNext + ** to access the data. + */ + int iReg; /* P3 Value for OP_VFilter */ + int addrNotFound; + int nConstraint = pLoop->nLTerm; + int iIn; /* Counter for IN constraints */ + + sqlite3ExprCachePush(pParse); + iReg = sqlite3GetTempRange(pParse, nConstraint+2); + addrNotFound = pLevel->addrBrk; + for(j=0; j<nConstraint; j++){ + int iTarget = iReg+j+2; + pTerm = pLoop->aLTerm[j]; + if( NEVER(pTerm==0) ) continue; + if( pTerm->eOperator & WO_IN ){ + codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); + addrNotFound = pLevel->addrNxt; + }else{ + Expr *pRight = pTerm->pExpr->pRight; + codeExprOrVector(pParse, pRight, iTarget, 1); + } + } + sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); + sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); + sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, + pLoop->u.vtab.idxStr, + pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC); + VdbeCoverage(v); + pLoop->u.vtab.needFree = 0; + pLevel->p1 = iCur; + pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext; + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + iIn = pLevel->u.in.nIn; + for(j=nConstraint-1; j>=0; j--){ + pTerm = pLoop->aLTerm[j]; + if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ + disableTerm(pLevel, pTerm); + }else if( (pTerm->eOperator & WO_IN)!=0 ){ + Expr *pCompare; /* The comparison operator */ + Expr *pRight; /* RHS of the comparison */ + VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ + + /* Reload the constraint value into reg[iReg+j+2]. The same value + ** was loaded into the same register prior to the OP_VFilter, but + ** the xFilter implementation might have changed the datatype or + ** encoding of the value in the register, so it *must* be reloaded. */ + assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed ); + if( !db->mallocFailed ){ + assert( iIn>0 ); + pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[--iIn].addrInTop); + assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid ); + assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 ); + assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 ); + testcase( pOp->opcode==OP_Rowid ); + sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3); + } + + /* Generate code that will continue to the next row if + ** the IN constraint is not satisfied */ + pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0); + assert( pCompare!=0 || db->mallocFailed ); + if( pCompare ){ + pCompare->pLeft = pTerm->pExpr->pLeft; + pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0); + if( pRight ){ + pRight->iTable = iReg+j+2; + sqlite3ExprIfFalse(pParse, pCompare, pLevel->addrCont, 0); + } + pCompare->pLeft = 0; + sqlite3ExprDelete(db, pCompare); + } + } + } + /* These registers need to be preserved in case there is an IN operator + ** loop. So we could deallocate the registers here (and potentially + ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems + ** simpler and safer to simply not reuse the registers. + ** + ** sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); + */ + sqlite3ExprCachePop(pParse); + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + + if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_EQ))!=0 + ){ + /* Case 2: We can directly reference a single row using an + ** equality comparison against the ROWID field. Or + ** we reference multiple rows using a "rowid IN (...)" + ** construct. + */ + assert( pLoop->u.btree.nEq==1 ); + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->pExpr!=0 ); + assert( omitTable==0 ); + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + iReleaseReg = ++pParse->nMem; + iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); + if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); + addrNxt = pLevel->addrNxt; + sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); + VdbeCoverage(v); + sqlite3ExprCacheAffinityChange(pParse, iRowidReg, 1); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + VdbeComment((v, "pk")); + pLevel->op = OP_Noop; + }else if( (pLoop->wsFlags & WHERE_IPK)!=0 + && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 + ){ + /* Case 3: We have an inequality comparison against the ROWID field. + */ + int testOp = OP_Noop; + int start; + int memEndValue = 0; + WhereTerm *pStart, *pEnd; + + assert( omitTable==0 ); + j = 0; + pStart = pEnd = 0; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; + if( pLoop->wsFlags & WHERE_TOP_LIMIT ) pEnd = pLoop->aLTerm[j++]; + assert( pStart!=0 || pEnd!=0 ); + if( bRev ){ + pTerm = pStart; + pStart = pEnd; + pEnd = pTerm; + } + codeCursorHint(pTabItem, pWInfo, pLevel, pEnd); + if( pStart ){ + Expr *pX; /* The expression that defines the start bound */ + int r1, rTemp; /* Registers for holding the start boundary */ + int op; /* Cursor seek operation */ + + /* The following constant maps TK_xx codes into corresponding + ** seek opcodes. It depends on a particular ordering of TK_xx + */ + const u8 aMoveOp[] = { + /* TK_GT */ OP_SeekGT, + /* TK_LE */ OP_SeekLE, + /* TK_LT */ OP_SeekLT, + /* TK_GE */ OP_SeekGE + }; + assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ + assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ + assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ + + assert( (pStart->wtFlags & TERM_VNULL)==0 ); + testcase( pStart->wtFlags & TERM_VIRTUAL ); + pX = pStart->pExpr; + assert( pX!=0 ); + testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ + if( sqlite3ExprIsVector(pX->pRight) ){ + r1 = rTemp = sqlite3GetTempReg(pParse); + codeExprOrVector(pParse, pX->pRight, r1, 1); + testcase( pX->op==TK_GT ); + testcase( pX->op==TK_GE ); + testcase( pX->op==TK_LT ); + testcase( pX->op==TK_LE ); + op = aMoveOp[((pX->op - TK_GT - 1) & 0x3) | 0x1]; + assert( pX->op!=TK_GT || op==OP_SeekGE ); + assert( pX->op!=TK_GE || op==OP_SeekGE ); + assert( pX->op!=TK_LT || op==OP_SeekLE ); + assert( pX->op!=TK_LE || op==OP_SeekLE ); + }else{ + r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); + disableTerm(pLevel, pStart); + op = aMoveOp[(pX->op - TK_GT)]; + } + sqlite3VdbeAddOp3(v, op, iCur, addrBrk, r1); + VdbeComment((v, "pk")); + VdbeCoverageIf(v, pX->op==TK_GT); + VdbeCoverageIf(v, pX->op==TK_LE); + VdbeCoverageIf(v, pX->op==TK_LT); + VdbeCoverageIf(v, pX->op==TK_GE); + sqlite3ExprCacheAffinityChange(pParse, r1, 1); + sqlite3ReleaseTempReg(pParse, rTemp); + }else{ + sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrHalt); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + } + if( pEnd ){ + Expr *pX; + pX = pEnd->pExpr; + assert( pX!=0 ); + assert( (pEnd->wtFlags & TERM_VNULL)==0 ); + testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */ + testcase( pEnd->wtFlags & TERM_VIRTUAL ); + memEndValue = ++pParse->nMem; + codeExprOrVector(pParse, pX->pRight, memEndValue, 1); + if( 0==sqlite3ExprIsVector(pX->pRight) + && (pX->op==TK_LT || pX->op==TK_GT) + ){ + testOp = bRev ? OP_Le : OP_Ge; + }else{ + testOp = bRev ? OP_Lt : OP_Gt; + } + if( 0==sqlite3ExprIsVector(pX->pRight) ){ + disableTerm(pLevel, pEnd); + } + } + start = sqlite3VdbeCurrentAddr(v); + pLevel->op = bRev ? OP_Prev : OP_Next; + pLevel->p1 = iCur; + pLevel->p2 = start; + assert( pLevel->p5==0 ); + if( testOp!=OP_Noop ){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); + VdbeCoverageIf(v, testOp==OP_Le); + VdbeCoverageIf(v, testOp==OP_Lt); + VdbeCoverageIf(v, testOp==OP_Ge); + VdbeCoverageIf(v, testOp==OP_Gt); + sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); + } + }else if( pLoop->wsFlags & WHERE_INDEXED ){ + /* Case 4: A scan using an index. + ** + ** The WHERE clause may contain zero or more equality + ** terms ("==" or "IN" operators) that refer to the N + ** left-most columns of the index. It may also contain + ** inequality constraints (>, <, >= or <=) on the indexed + ** column that immediately follows the N equalities. Only + ** the right-most column can be an inequality - the rest must + ** use the "==" and "IN" operators. For example, if the + ** index is on (x,y,z), then the following clauses are all + ** optimized: + ** + ** x=5 + ** x=5 AND y=10 + ** x=5 AND y<10 + ** x=5 AND y>5 AND y<10 + ** x=5 AND y=5 AND z<=10 + ** + ** The z<10 term of the following cannot be used, only + ** the x=5 term: + ** + ** x=5 AND z<10 + ** + ** N may be zero if there are inequality constraints. + ** If there are no inequality constraints, then N is at + ** least one. + ** + ** This case is also used when there are no WHERE clause + ** constraints but an index is selected anyway, in order + ** to force the output order to conform to an ORDER BY. + */ + static const u8 aStartOp[] = { + 0, + 0, + OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ + OP_Last, /* 3: (!start_constraints && startEq && bRev) */ + OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ + OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ + OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ + OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ + }; + static const u8 aEndOp[] = { + OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ + OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ + OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ + OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ + }; + u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ + u16 nBtm = pLoop->u.btree.nBtm; /* Length of BTM vector */ + u16 nTop = pLoop->u.btree.nTop; /* Length of TOP vector */ + int regBase; /* Base register holding constraint values */ + WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ + WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ + int startEq; /* True if range start uses ==, >= or <= */ + int endEq; /* True if range end uses ==, >= or <= */ + int start_constraints; /* Start of range is constrained */ + int nConstraint; /* Number of constraint terms */ + int iIdxCur; /* The VDBE cursor for the index */ + int nExtraReg = 0; /* Number of extra registers needed */ + int op; /* Instruction opcode */ + char *zStartAff; /* Affinity for start of range constraint */ + char *zEndAff = 0; /* Affinity for end of range constraint */ + u8 bSeekPastNull = 0; /* True to seek past initial nulls */ + u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + + pIdx = pLoop->u.btree.pIndex; + iIdxCur = pLevel->iIdxCur; + assert( nEq>=pLoop->nSkip ); + + /* If this loop satisfies a sort order (pOrderBy) request that + ** was passed to this function to implement a "SELECT min(x) ..." + ** query, then the caller will only allow the loop to run for + ** a single iteration. This means that the first row returned + ** should not have a NULL value stored in 'x'. If column 'x' is + ** the first one after the nEq equality constraints in the index, + ** this requires some special handling. + */ + assert( pWInfo->pOrderBy==0 + || pWInfo->pOrderBy->nExpr==1 + || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); + if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 + && pWInfo->nOBSat>0 + && (pIdx->nKeyCol>nEq) + ){ + assert( pLoop->nSkip==0 ); + bSeekPastNull = 1; + nExtraReg = 1; + } + + /* Find any inequality constraint terms for the start and end + ** of the range. + */ + j = nEq; + if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ + pRangeStart = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nBtm); + /* Like optimization range constraints always occur in pairs */ + assert( (pRangeStart->wtFlags & TERM_LIKEOPT)==0 || + (pLoop->wsFlags & WHERE_TOP_LIMIT)!=0 ); + } + if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ + pRangeEnd = pLoop->aLTerm[j++]; + nExtraReg = MAX(nExtraReg, pLoop->u.btree.nTop); +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0 ){ + assert( pRangeStart!=0 ); /* LIKE opt constraints */ + assert( pRangeStart->wtFlags & TERM_LIKEOPT ); /* occur in pairs */ + pLevel->iLikeRepCntr = (u32)++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 1, (int)pLevel->iLikeRepCntr); + VdbeComment((v, "LIKE loop counter")); + pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v); + /* iLikeRepCntr actually stores 2x the counter register number. The + ** bottom bit indicates whether the search order is ASC or DESC. */ + testcase( bRev ); + testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC ); + assert( (bRev & ~1)==0 ); + pLevel->iLikeRepCntr <<=1; + pLevel->iLikeRepCntr |= bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC); + } +#endif + if( pRangeStart==0 ){ + j = pIdx->aiColumn[nEq]; + if( (j>=0 && pIdx->pTable->aCol[j].notNull==0) || j==XN_EXPR ){ + bSeekPastNull = 1; + } + } + } + assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); + + /* If we are doing a reverse order scan on an ascending index, or + ** a forward order scan on a descending index, interchange the + ** start and end terms (pRangeStart and pRangeEnd). + */ + if( (nEq<pIdx->nKeyCol && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) + || (bRev && pIdx->nKeyCol==nEq) + ){ + SWAP(WhereTerm *, pRangeEnd, pRangeStart); + SWAP(u8, bSeekPastNull, bStopAtNull); + SWAP(u8, nBtm, nTop); + } + + /* Generate code to evaluate all constraint terms using == or IN + ** and store the values of those terms in an array of registers + ** starting at regBase. + */ + codeCursorHint(pTabItem, pWInfo, pLevel, pRangeEnd); + regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); + assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); + if( zStartAff && nTop ){ + zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); + } + addrNxt = pLevel->addrNxt; + + testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); + testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); + testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); + startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE); + endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE); + start_constraints = pRangeStart || nEq>0; + + /* Seek the index cursor to the start of the range. */ + nConstraint = nEq; + if( pRangeStart ){ + Expr *pRight = pRangeStart->pExpr->pRight; + codeExprOrVector(pParse, pRight, regBase+nEq, nBtm); + whereLikeOptimizationStringFixup(v, pLevel, pRangeStart); + if( (pRangeStart->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zStartAff ){ + updateRangeAffinityStr(pRight, nBtm, &zStartAff[nEq]); + } + nConstraint += nBtm; + testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeStart); + }else{ + startEq = 1; + } + bSeekPastNull = 0; + }else if( bSeekPastNull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + nConstraint++; + startEq = 0; + start_constraints = 1; + } + codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); + if( pLoop->nSkip>0 && nConstraint==pLoop->nSkip ){ + /* The skip-scan logic inside the call to codeAllEqualityConstraints() + ** above has already left the cursor sitting on the correct row, + ** so no further seeking is needed */ + }else{ + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; + assert( op!=0 ); + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + } + + /* Load the value for the inequality constraint at the end of the + ** range (if any). + */ + nConstraint = nEq; + if( pRangeEnd ){ + Expr *pRight = pRangeEnd->pExpr->pRight; + sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); + codeExprOrVector(pParse, pRight, regBase+nEq, nTop); + whereLikeOptimizationStringFixup(v, pLevel, pRangeEnd); + if( (pRangeEnd->wtFlags & TERM_VNULL)==0 + && sqlite3ExprCanBeNull(pRight) + ){ + sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); + VdbeCoverage(v); + } + if( zEndAff ){ + updateRangeAffinityStr(pRight, nTop, zEndAff); + codeApplyAffinity(pParse, regBase+nEq, nTop, zEndAff); + }else{ + assert( pParse->db->mallocFailed ); + } + nConstraint += nTop; + testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); + + if( sqlite3ExprIsVector(pRight)==0 ){ + disableTerm(pLevel, pRangeEnd); + }else{ + endEq = 1; + } + }else if( bStopAtNull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); + endEq = 0; + nConstraint++; + } + sqlite3DbFree(db, zStartAff); + sqlite3DbFree(db, zEndAff); + + /* Top of the loop body */ + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + + /* Check if the index cursor is past the end of the range. */ + if( nConstraint ){ + op = aEndOp[bRev*2 + endEq]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); + } + + /* Seek the table cursor, if required */ + if( omitTable ){ + /* pIdx is a covering index. No need to access the main table. */ + }else if( HasRowid(pIdx->pTable) ){ + if( (pWInfo->wctrlFlags & WHERE_SEEK_TABLE) || ( + (pWInfo->wctrlFlags & WHERE_SEEK_UNIQ_TABLE) + && (pWInfo->eOnePass==ONEPASS_SINGLE) + )){ + iRowidReg = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); + sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); + sqlite3VdbeAddOp3(v, OP_NotExists, iCur, 0, iRowidReg); + VdbeCoverage(v); + }else{ + codeDeferredSeek(pWInfo, pIdx, iCur, iIdxCur); + } + }else if( iCur!=iIdxCur ){ + Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); + iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); + for(j=0; j<pPk->nKeyCol; j++){ + k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); + } + sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, + iRowidReg, pPk->nKeyCol); VdbeCoverage(v); + } + + /* If pIdx is an index on one or more expressions, then look through + ** all the expressions in pWInfo and try to transform matching expressions + ** into reference to index columns. + ** + ** Do not do this for the RHS of a LEFT JOIN. This is because the + ** expression may be evaluated after OP_NullRow has been executed on + ** the cursor. In this case it is important to do the full evaluation, + ** as the result of the expression may not be NULL, even if all table + ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + */ + if( pLevel->iLeftJoin==0 ){ + whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); + } + + /* Record the instruction used to terminate the loop. */ + if( pLoop->wsFlags & WHERE_ONEROW ){ + pLevel->op = OP_Noop; + }else if( bRev ){ + pLevel->op = OP_Prev; + }else{ + pLevel->op = OP_Next; + } + pLevel->p1 = iIdxCur; + pLevel->p3 = (pLoop->wsFlags&WHERE_UNQ_WANTED)!=0 ? 1:0; + if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + }else{ + assert( pLevel->p5==0 ); + } + if( omitTable ) pIdx = 0; + }else + +#ifndef SQLITE_OMIT_OR_OPTIMIZATION + if( pLoop->wsFlags & WHERE_MULTI_OR ){ + /* Case 5: Two or more separately indexed terms connected by OR + ** + ** Example: + ** + ** CREATE TABLE t1(a,b,c,d); + ** CREATE INDEX i1 ON t1(a); + ** CREATE INDEX i2 ON t1(b); + ** CREATE INDEX i3 ON t1(c); + ** + ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13) + ** + ** In the example, there are three indexed terms connected by OR. + ** The top of the loop looks like this: + ** + ** Null 1 # Zero the rowset in reg 1 + ** + ** Then, for each indexed term, the following. The arguments to + ** RowSetTest are such that the rowid of the current row is inserted + ** into the RowSet. If it is already present, control skips the + ** Gosub opcode and jumps straight to the code generated by WhereEnd(). + ** + ** sqlite3WhereBegin(<term>) + ** RowSetTest # Insert rowid into rowset + ** Gosub 2 A + ** sqlite3WhereEnd() + ** + ** Following the above, code to terminate the loop. Label A, the target + ** of the Gosub above, jumps to the instruction right after the Goto. + ** + ** Null 1 # Zero the rowset in reg 1 + ** Goto B # The loop is finished. + ** + ** A: <loop body> # Return data, whatever. + ** + ** Return 2 # Jump back to the Gosub + ** + ** B: <after the loop> + ** + ** Added 2014-05-26: If the table is a WITHOUT ROWID table, then + ** use an ephemeral index instead of a RowSet to record the primary + ** keys of the rows we have already seen. + ** + */ + WhereClause *pOrWc; /* The OR-clause broken out into subterms */ + SrcList *pOrTab; /* Shortened table list or OR-clause generation */ + Index *pCov = 0; /* Potential covering index (or NULL) */ + int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */ + + int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ + int regRowset = 0; /* Register for RowSet object */ + int regRowid = 0; /* Register holding rowid */ + int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ + int iRetInit; /* Address of regReturn init */ + int untestedTerms = 0; /* Some terms not completely tested */ + int ii; /* Loop counter */ + u16 wctrlFlags; /* Flags for sub-WHERE clause */ + Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ + Table *pTab = pTabItem->pTab; + + pTerm = pLoop->aLTerm[0]; + assert( pTerm!=0 ); + assert( pTerm->eOperator & WO_OR ); + assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); + pOrWc = &pTerm->u.pOrInfo->wc; + pLevel->op = OP_Return; + pLevel->p1 = regReturn; + + /* Set up a new SrcList in pOrTab containing the table being scanned + ** by this loop in the a[0] slot and all notReady tables in a[1..] slots. + ** This becomes the SrcList in the recursive call to sqlite3WhereBegin(). + */ + if( pWInfo->nLevel>1 ){ + int nNotReady; /* The number of notReady tables */ + struct SrcList_item *origSrc; /* Original list of tables */ + nNotReady = pWInfo->nLevel - iLevel - 1; + pOrTab = sqlite3StackAllocRaw(db, + sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); + if( pOrTab==0 ) return notReady; + pOrTab->nAlloc = (u8)(nNotReady + 1); + pOrTab->nSrc = pOrTab->nAlloc; + memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem)); + origSrc = pWInfo->pTabList->a; + for(k=1; k<=nNotReady; k++){ + memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k])); + } + }else{ + pOrTab = pWInfo->pTabList; + } + + /* Initialize the rowset register to contain NULL. An SQL NULL is + ** equivalent to an empty rowset. Or, create an ephemeral index + ** capable of holding primary keys in the case of a WITHOUT ROWID. + ** + ** Also initialize regReturn to contain the address of the instruction + ** immediately following the OP_Return at the bottom of the loop. This + ** is required in a few obscure LEFT JOIN cases where control jumps + ** over the top of the loop into the body of it. In this case the + ** correct response for the end-of-loop code (the OP_Return) is to + ** fall through to the next instruction, just as an OP_Next does if + ** called on an uninitialized cursor. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + if( HasRowid(pTab) ){ + regRowset = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + regRowset = pParse->nTab++; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, regRowset, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + regRowid = ++pParse->nMem; + } + iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); + + /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y + ** Then for every term xN, evaluate as the subexpression: xN AND z + ** That way, terms in y that are factored into the disjunction will + ** be picked up by the recursive calls to sqlite3WhereBegin() below. + ** + ** Actually, each subexpression is converted to "xN AND w" where w is + ** the "interesting" terms of z - terms that did not originate in the + ** ON or USING clause of a LEFT JOIN, and terms that are usable as + ** indices. + ** + ** This optimization also only applies if the (x1 OR x2 OR ...) term + ** is not contained in the ON clause of a LEFT JOIN. + ** See ticket http://www.sqlite.org/src/info/f2369304e4 + */ + if( pWC->nTerm>1 ){ + int iTerm; + for(iTerm=0; iTerm<pWC->nTerm; iTerm++){ + Expr *pExpr = pWC->a[iTerm].pExpr; + if( &pWC->a[iTerm] == pTerm ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_VIRTUAL ); + testcase( pWC->a[iTerm].wtFlags & TERM_CODED ); + if( (pWC->a[iTerm].wtFlags & (TERM_VIRTUAL|TERM_CODED))!=0 ) continue; + if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; + testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); + pExpr = sqlite3ExprDup(db, pExpr, 0); + pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); + } + if( pAndExpr ){ + pAndExpr = sqlite3PExpr(pParse, TK_AND|TKFLG_DONTFOLD, 0, pAndExpr); + } + } + + /* Run a separate WHERE clause for each term of the OR clause. After + ** eliminating duplicates from other WHERE clauses, the action for each + ** sub-WHERE clause is to to invoke the main loop body as a subroutine. + */ + wctrlFlags = WHERE_OR_SUBCLAUSE | (pWInfo->wctrlFlags & WHERE_SEEK_TABLE); + ExplainQueryPlan((pParse, 1, "MULTI-INDEX OR")); + for(ii=0; ii<pOrWc->nTerm; ii++){ + WhereTerm *pOrTerm = &pOrWc->a[ii]; + if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ + WhereInfo *pSubWInfo; /* Info for single OR-term scan */ + Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ + int jmp1 = 0; /* Address of jump operation */ + assert( (pTabItem[0].fg.jointype & JT_LEFT)==0 + || ExprHasProperty(pOrExpr, EP_FromJoin) + ); + if( pAndExpr ){ + pAndExpr->pLeft = pOrExpr; + pOrExpr = pAndExpr; + } + /* Loop through table entries that match term pOrTerm. */ + WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); + pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, + wctrlFlags, iCovCur); + assert( pSubWInfo || pParse->nErr || db->mallocFailed ); + if( pSubWInfo ){ + WhereLoop *pSubLoop; + int addrExplain = sqlite3WhereExplainOneScan( + pParse, pOrTab, &pSubWInfo->a[0], 0 + ); + sqlite3WhereAddScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain); + + /* This is the sub-WHERE clause body. First skip over + ** duplicate rows from prior sub-WHERE clauses, and record the + ** rowid (or PRIMARY KEY) for the current row so that the same + ** row will be skipped in subsequent sub-WHERE clauses. + */ + if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ + int r; + int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); + if( HasRowid(pTab) ){ + r = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, regRowid, 0); + jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, + r,iSet); + VdbeCoverage(v); + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + int nPk = pPk->nKeyCol; + int iPk; + + /* Read the PK into an array of temp registers. */ + r = sqlite3GetTempRange(pParse, nPk); + for(iPk=0; iPk<nPk; iPk++){ + int iCol = pPk->aiColumn[iPk]; + sqlite3ExprCodeGetColumnToReg(pParse, pTab, iCol, iCur, r+iPk); + } + + /* Check if the temp table already contains this key. If so, + ** the row has already been included in the result set and + ** can be ignored (by jumping past the Gosub below). Otherwise, + ** insert the key into the temp table and proceed with processing + ** the row. + ** + ** Use some of the same optimizations as OP_RowSetTest: If iSet + ** is zero, assume that the key cannot already be present in + ** the temp table. And if iSet is -1, assume that there is no + ** need to insert the key into the temp table, as it will never + ** be tested for. */ + if( iSet ){ + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); + VdbeCoverage(v); + } + if( iSet>=0 ){ + sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, regRowset, regRowid, + r, nPk); + if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + } + + /* Release the array of temp registers */ + sqlite3ReleaseTempRange(pParse, r, nPk); + } + } + + /* Invoke the main loop body as a subroutine */ + sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); + + /* Jump here (skipping the main loop body subroutine) if the + ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ + if( jmp1 ) sqlite3VdbeJumpHere(v, jmp1); + + /* The pSubWInfo->untestedTerms flag means that this OR term + ** contained one or more AND term from a notReady table. The + ** terms from the notReady table could not be tested and will + ** need to be tested later. + */ + if( pSubWInfo->untestedTerms ) untestedTerms = 1; + + /* If all of the OR-connected terms are optimized using the same + ** index, and the index is opened using the same cursor number + ** by each call to sqlite3WhereBegin() made by this loop, it may + ** be possible to use that index as a covering index. + ** + ** If the call to sqlite3WhereBegin() above resulted in a scan that + ** uses an index, and this is either the first OR-connected term + ** processed or the index is the same as that used by all previous + ** terms, set pCov to the candidate covering index. Otherwise, set + ** pCov to NULL to indicate that no candidate covering index will + ** be available. + */ + pSubLoop = pSubWInfo->a[0].pWLoop; + assert( (pSubLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); + if( (pSubLoop->wsFlags & WHERE_INDEXED)!=0 + && (ii==0 || pSubLoop->u.btree.pIndex==pCov) + && (HasRowid(pTab) || !IsPrimaryKeyIndex(pSubLoop->u.btree.pIndex)) + ){ + assert( pSubWInfo->a[0].iIdxCur==iCovCur ); + pCov = pSubLoop->u.btree.pIndex; + }else{ + pCov = 0; + } + + /* Finish the loop through table entries that match term pOrTerm. */ + sqlite3WhereEnd(pSubWInfo); + } + } + } + ExplainQueryPlanPop(pParse); + pLevel->u.pCovidx = pCov; + if( pCov ) pLevel->iIdxCur = iCovCur; + if( pAndExpr ){ + pAndExpr->pLeft = 0; + sqlite3ExprDelete(db, pAndExpr); + } + sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); + sqlite3VdbeGoto(v, pLevel->addrBrk); + sqlite3VdbeResolveLabel(v, iLoopBody); + + if( pWInfo->nLevel>1 ) sqlite3StackFree(db, pOrTab); + if( !untestedTerms ) disableTerm(pLevel, pTerm); + }else +#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ + + { + /* Case 6: There is no usable index. We must do a complete + ** scan of the entire table. + */ + static const u8 aStep[] = { OP_Next, OP_Prev }; + static const u8 aStart[] = { OP_Rewind, OP_Last }; + assert( bRev==0 || bRev==1 ); + if( pTabItem->fg.isRecursive ){ + /* Tables marked isRecursive have only a single row that is stored in + ** a pseudo-cursor. No need to Rewind or Next such cursors. */ + pLevel->op = OP_Noop; + }else{ + codeCursorHint(pTabItem, pWInfo, pLevel, 0); + pLevel->op = aStep[bRev]; + pLevel->p1 = iCur; + pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrHalt); + VdbeCoverageIf(v, bRev==0); + VdbeCoverageIf(v, bRev!=0); + pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; + } + } + +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + pLevel->addrVisit = sqlite3VdbeCurrentAddr(v); +#endif + + /* Insert code to test every subexpression that can be completely + ** computed using the current set of tables. + ** + ** This loop may run between one and three times, depending on the + ** constraints to be generated. The value of stack variable iLoop + ** determines the constraints coded by each iteration, as follows: + ** + ** iLoop==1: Code only expressions that are entirely covered by pIdx. + ** iLoop==2: Code remaining expressions that do not contain correlated + ** sub-queries. + ** iLoop==3: Code all remaining expressions. + ** + ** An effort is made to skip unnecessary iterations of the loop. + */ + iLoop = (pIdx ? 1 : 2); + do{ + int iNext = 0; /* Next value for iLoop */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE; + int skipLikeAddr = 0; + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + testcase( pWInfo->untestedTerms==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ); + pWInfo->untestedTerms = 1; + continue; + } + pE = pTerm->pExpr; + assert( pE!=0 ); + if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){ + continue; + } + + if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ + iNext = 2; + continue; + } + if( iLoop<3 && (pTerm->wtFlags & TERM_VARSELECT) ){ + if( iNext==0 ) iNext = 3; + continue; + } + + if( (pTerm->wtFlags & TERM_LIKECOND)!=0 ){ + /* If the TERM_LIKECOND flag is set, that means that the range search + ** is sufficient to guarantee that the LIKE operator is true, so we + ** can skip the call to the like(A,B) function. But this only works + ** for strings. So do not skip the call to the function on the pass + ** that compares BLOBs. */ +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS + continue; +#else + u32 x = pLevel->iLikeRepCntr; + if( x>0 ){ + skipLikeAddr = sqlite3VdbeAddOp1(v, (x&1)?OP_IfNot:OP_If,(int)(x>>1)); + } + VdbeCoverage(v); +#endif + } +#ifdef WHERETRACE_ENABLED /* 0xffff */ + if( sqlite3WhereTrace ){ + VdbeNoopComment((v, "WhereTerm[%d] (%p) priority=%d", + pWC->nTerm-j, pTerm, iLoop)); + } +#endif + sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); + if( skipLikeAddr ) sqlite3VdbeJumpHere(v, skipLikeAddr); + pTerm->wtFlags |= TERM_CODED; + } + iLoop = iNext; + }while( iLoop>0 ); + + /* Insert code to test for implied constraints based on transitivity + ** of the "==" operator. + ** + ** Example: If the WHERE clause contains "t1.a=t2.b" and "t2.b=123" + ** and we are coding the t1 loop and the t2 loop has not yet coded, + ** then we cannot use the "t1.a=t2.b" constraint, but we can code + ** the implied "t1.a=123" constraint. + */ + for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ + Expr *pE, sEAlt; + WhereTerm *pAlt; + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; + if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; + if( pTerm->leftCursor!=iCur ) continue; + if( pLevel->iLeftJoin ) continue; + pE = pTerm->pExpr; + assert( !ExprHasProperty(pE, EP_FromJoin) ); + assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); + pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.leftColumn, notReady, + WO_EQ|WO_IN|WO_IS, 0); + if( pAlt==0 ) continue; + if( pAlt->wtFlags & (TERM_CODED) ) continue; + if( (pAlt->eOperator & WO_IN) + && (pAlt->pExpr->flags & EP_xIsSelect) + && (pAlt->pExpr->x.pSelect->pEList->nExpr>1) + ){ + continue; + } + testcase( pAlt->eOperator & WO_EQ ); + testcase( pAlt->eOperator & WO_IS ); + testcase( pAlt->eOperator & WO_IN ); + VdbeModuleComment((v, "begin transitive constraint")); + sEAlt = *pAlt->pExpr; + sEAlt.pLeft = pE->pLeft; + sqlite3ExprIfFalse(pParse, &sEAlt, addrCont, SQLITE_JUMPIFNULL); + } + + /* For a LEFT OUTER JOIN, generate code that will record the fact that + ** at least one row of the right table has matched the left table. + */ + if( pLevel->iLeftJoin ){ + pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); + VdbeComment((v, "record LEFT JOIN hit")); + sqlite3ExprCacheClear(pParse); + for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){ + testcase( pTerm->wtFlags & TERM_VIRTUAL ); + testcase( pTerm->wtFlags & TERM_CODED ); + if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; + if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ + assert( pWInfo->untestedTerms ); + continue; + } + assert( pTerm->pExpr ); + sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); + pTerm->wtFlags |= TERM_CODED; + } + } + + return pLevel->notReady; +} + +/************** End of wherecode.c *******************************************/ +/************** Begin file whereexpr.c ***************************************/ +/* +** 2015-06-08 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. +** +** This file was originally part of where.c but was split out to improve +** readability and editabiliity. This file contains utility routines for +** analyzing Expr objects in the WHERE clause. +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* Forward declarations */ +static void exprAnalyze(SrcList*, WhereClause*, int); /* ** Deallocate all memory associated with a WhereOrInfo object. */ static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ - whereClauseClear(&p->wc); + sqlite3WhereClauseClear(&p->wc); sqlite3DbFree(db, p); } @@ -115093,33 +134662,10 @@ static void whereOrInfoDelete(sqlite3 *db, WhereOrInfo *p){ ** Deallocate all memory associated with a WhereAndInfo object. */ static void whereAndInfoDelete(sqlite3 *db, WhereAndInfo *p){ - whereClauseClear(&p->wc); + sqlite3WhereClauseClear(&p->wc); sqlite3DbFree(db, p); } -/* -** Deallocate a WhereClause structure. The WhereClause structure -** itself is not freed. This routine is the inverse of whereClauseInit(). -*/ -static void whereClauseClear(WhereClause *pWC){ - int i; - WhereTerm *a; - sqlite3 *db = pWC->pWInfo->pParse->db; - for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){ - if( a->wtFlags & TERM_DYNAMIC ){ - sqlite3ExprDelete(db, a->pExpr); - } - if( a->wtFlags & TERM_ORINFO ){ - whereOrInfoDelete(db, a->u.pOrInfo); - }else if( a->wtFlags & TERM_ANDINFO ){ - whereAndInfoDelete(db, a->u.pAndInfo); - } - } - if( pWC->a!=pWC->aStatic ){ - sqlite3DbFree(db, pWC->a); - } -} - /* ** Add a single new WhereTerm entry to the WhereClause object pWC. ** The new WhereTerm object is constructed from Expr p and with wtFlags. @@ -115139,14 +134685,14 @@ static void whereClauseClear(WhereClause *pWC){ ** calling this routine. Such pointers may be reinitialized by referencing ** the pWC->a[] array. */ -static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){ +static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ WhereTerm *pTerm; int idx; testcase( wtFlags & TERM_VIRTUAL ); if( pWC->nTerm>=pWC->nSlot ){ WhereTerm *pOld = pWC->a; sqlite3 *db = pWC->pWInfo->pParse->db; - pWC->a = sqlite3DbMallocRaw(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); + pWC->a = sqlite3DbMallocRawNN(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); if( pWC->a==0 ){ if( wtFlags & TERM_DYNAMIC ){ sqlite3ExprDelete(db, p); @@ -115159,7 +134705,6 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){ sqlite3DbFree(db, pOld); } pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); - memset(&pWC->a[pWC->nTerm], 0, sizeof(pWC->a[0])*(pWC->nSlot-pWC->nTerm)); } pTerm = &pWC->a[idx = pWC->nTerm++]; if( p && ExprHasProperty(p, EP_Unlikely) ){ @@ -115171,135 +134716,22 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u8 wtFlags){ pTerm->wtFlags = wtFlags; pTerm->pWC = pWC; pTerm->iParent = -1; + memset(&pTerm->eOperator, 0, + sizeof(WhereTerm) - offsetof(WhereTerm,eOperator)); return idx; } -/* -** This routine identifies subexpressions in the WHERE clause where -** each subexpression is separated by the AND operator or some other -** operator specified in the op parameter. The WhereClause structure -** is filled with pointers to subexpressions. For example: -** -** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) -** \________/ \_______________/ \________________/ -** slot[0] slot[1] slot[2] -** -** The original WHERE clause in pExpr is unaltered. All this routine -** does is make slot[] entries point to substructure within pExpr. -** -** In the previous sentence and in the diagram, "slot[]" refers to -** the WhereClause.a[] array. The slot[] array grows as needed to contain -** all terms of the WHERE clause. -*/ -static void whereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ - pWC->op = op; - if( pExpr==0 ) return; - if( pExpr->op!=op ){ - whereClauseInsert(pWC, pExpr, 0); - }else{ - whereSplit(pWC, pExpr->pLeft, op); - whereSplit(pWC, pExpr->pRight, op); - } -} - -/* -** Initialize a WhereMaskSet object -*/ -#define initMaskSet(P) (P)->n=0 - -/* -** Return the bitmask for the given cursor number. Return 0 if -** iCursor is not in the set. -*/ -static Bitmask getMask(WhereMaskSet *pMaskSet, int iCursor){ - int i; - assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); - for(i=0; i<pMaskSet->n; i++){ - if( pMaskSet->ix[i]==iCursor ){ - return MASKBIT(i); - } - } - return 0; -} - -/* -** Create a new mask for cursor iCursor. -** -** There is one cursor per table in the FROM clause. The number of -** tables in the FROM clause is limited by a test early in the -** sqlite3WhereBegin() routine. So we know that the pMaskSet->ix[] -** array will never overflow. -*/ -static void createMask(WhereMaskSet *pMaskSet, int iCursor){ - assert( pMaskSet->n < ArraySize(pMaskSet->ix) ); - pMaskSet->ix[pMaskSet->n++] = iCursor; -} - -/* -** These routines walk (recursively) an expression tree and generate -** a bitmask indicating which tables are used in that expression -** tree. -*/ -static Bitmask exprListTableUsage(WhereMaskSet*, ExprList*); -static Bitmask exprSelectTableUsage(WhereMaskSet*, Select*); -static Bitmask exprTableUsage(WhereMaskSet *pMaskSet, Expr *p){ - Bitmask mask = 0; - if( p==0 ) return 0; - if( p->op==TK_COLUMN ){ - mask = getMask(pMaskSet, p->iTable); - return mask; - } - mask = exprTableUsage(pMaskSet, p->pRight); - mask |= exprTableUsage(pMaskSet, p->pLeft); - if( ExprHasProperty(p, EP_xIsSelect) ){ - mask |= exprSelectTableUsage(pMaskSet, p->x.pSelect); - }else{ - mask |= exprListTableUsage(pMaskSet, p->x.pList); - } - return mask; -} -static Bitmask exprListTableUsage(WhereMaskSet *pMaskSet, ExprList *pList){ - int i; - Bitmask mask = 0; - if( pList ){ - for(i=0; i<pList->nExpr; i++){ - mask |= exprTableUsage(pMaskSet, pList->a[i].pExpr); - } - } - return mask; -} -static Bitmask exprSelectTableUsage(WhereMaskSet *pMaskSet, Select *pS){ - Bitmask mask = 0; - while( pS ){ - SrcList *pSrc = pS->pSrc; - mask |= exprListTableUsage(pMaskSet, pS->pEList); - mask |= exprListTableUsage(pMaskSet, pS->pGroupBy); - mask |= exprListTableUsage(pMaskSet, pS->pOrderBy); - mask |= exprTableUsage(pMaskSet, pS->pWhere); - mask |= exprTableUsage(pMaskSet, pS->pHaving); - if( ALWAYS(pSrc!=0) ){ - int i; - for(i=0; i<pSrc->nSrc; i++){ - mask |= exprSelectTableUsage(pMaskSet, pSrc->a[i].pSelect); - mask |= exprTableUsage(pMaskSet, pSrc->a[i].pOn); - } - } - pS = pS->pPrior; - } - return mask; -} - /* ** Return TRUE if the given operator is one of the operators that is ** allowed for an indexable WHERE clause term. The allowed operators are -** "=", "<", ">", "<=", ">=", "IN", and "IS NULL" +** "=", "<", ">", "<=", ">=", "IN", "IS", and "IS NULL" */ static int allowedOp(int op){ assert( TK_GT>TK_EQ && TK_GT<TK_GE ); assert( TK_LT>TK_EQ && TK_LT<TK_GE ); assert( TK_LE>TK_EQ && TK_LE<TK_GE ); assert( TK_GE==TK_EQ+4 ); - return op==TK_IN || (op>=TK_EQ && op<=TK_GE) || op==TK_ISNULL; + return op==TK_IN || (op>=TK_EQ && op<=TK_GE) || op==TK_ISNULL || op==TK_IS; } /* @@ -115352,6 +134784,8 @@ static u16 operatorMask(int op){ c = WO_IN; }else if( op==TK_ISNULL ){ c = WO_ISNULL; + }else if( op==TK_IS ){ + c = WO_IS; }else{ assert( (WO_EQ<<(op-TK_EQ)) < 0x7fff ); c = (u16)(WO_EQ<<(op-TK_EQ)); @@ -115363,199 +134797,10 @@ static u16 operatorMask(int op){ assert( op!=TK_LE || c==WO_LE ); assert( op!=TK_GT || c==WO_GT ); assert( op!=TK_GE || c==WO_GE ); + assert( op!=TK_IS || c==WO_IS ); return c; } -/* -** Advance to the next WhereTerm that matches according to the criteria -** established when the pScan object was initialized by whereScanInit(). -** Return NULL if there are no more matching WhereTerms. -*/ -static WhereTerm *whereScanNext(WhereScan *pScan){ - int iCur; /* The cursor on the LHS of the term */ - int iColumn; /* The column on the LHS of the term. -1 for IPK */ - Expr *pX; /* An expression being tested */ - WhereClause *pWC; /* Shorthand for pScan->pWC */ - WhereTerm *pTerm; /* The term being tested */ - int k = pScan->k; /* Where to start scanning */ - - while( pScan->iEquiv<=pScan->nEquiv ){ - iCur = pScan->aEquiv[pScan->iEquiv-2]; - iColumn = pScan->aEquiv[pScan->iEquiv-1]; - while( (pWC = pScan->pWC)!=0 ){ - for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){ - if( pTerm->leftCursor==iCur - && pTerm->u.leftColumn==iColumn - && (pScan->iEquiv<=2 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) - ){ - if( (pTerm->eOperator & WO_EQUIV)!=0 - && pScan->nEquiv<ArraySize(pScan->aEquiv) - ){ - int j; - pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight); - assert( pX->op==TK_COLUMN ); - for(j=0; j<pScan->nEquiv; j+=2){ - if( pScan->aEquiv[j]==pX->iTable - && pScan->aEquiv[j+1]==pX->iColumn ){ - break; - } - } - if( j==pScan->nEquiv ){ - pScan->aEquiv[j] = pX->iTable; - pScan->aEquiv[j+1] = pX->iColumn; - pScan->nEquiv += 2; - } - } - if( (pTerm->eOperator & pScan->opMask)!=0 ){ - /* Verify the affinity and collating sequence match */ - if( pScan->zCollName && (pTerm->eOperator & WO_ISNULL)==0 ){ - CollSeq *pColl; - Parse *pParse = pWC->pWInfo->pParse; - pX = pTerm->pExpr; - if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ - continue; - } - assert(pX->pLeft); - pColl = sqlite3BinaryCompareCollSeq(pParse, - pX->pLeft, pX->pRight); - if( pColl==0 ) pColl = pParse->db->pDfltColl; - if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ - continue; - } - } - if( (pTerm->eOperator & WO_EQ)!=0 - && (pX = pTerm->pExpr->pRight)->op==TK_COLUMN - && pX->iTable==pScan->aEquiv[0] - && pX->iColumn==pScan->aEquiv[1] - ){ - continue; - } - pScan->k = k+1; - return pTerm; - } - } - } - pScan->pWC = pScan->pWC->pOuter; - k = 0; - } - pScan->pWC = pScan->pOrigWC; - k = 0; - pScan->iEquiv += 2; - } - return 0; -} - -/* -** Initialize a WHERE clause scanner object. Return a pointer to the -** first match. Return NULL if there are no matches. -** -** The scanner will be searching the WHERE clause pWC. It will look -** for terms of the form "X <op> <expr>" where X is column iColumn of table -** iCur. The <op> must be one of the operators described by opMask. -** -** If the search is for X and the WHERE clause contains terms of the -** form X=Y then this routine might also return terms of the form -** "Y <op> <expr>". The number of levels of transitivity is limited, -** but is enough to handle most commonly occurring SQL statements. -** -** If X is not the INTEGER PRIMARY KEY then X must be compatible with -** index pIdx. -*/ -static WhereTerm *whereScanInit( - WhereScan *pScan, /* The WhereScan object being initialized */ - WhereClause *pWC, /* The WHERE clause to be scanned */ - int iCur, /* Cursor to scan for */ - int iColumn, /* Column to scan for */ - u32 opMask, /* Operator(s) to scan for */ - Index *pIdx /* Must be compatible with this index */ -){ - int j; - - /* memset(pScan, 0, sizeof(*pScan)); */ - pScan->pOrigWC = pWC; - pScan->pWC = pWC; - if( pIdx && iColumn>=0 ){ - pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; - for(j=0; pIdx->aiColumn[j]!=iColumn; j++){ - if( NEVER(j>pIdx->nColumn) ) return 0; - } - pScan->zCollName = pIdx->azColl[j]; - }else{ - pScan->idxaff = 0; - pScan->zCollName = 0; - } - pScan->opMask = opMask; - pScan->k = 0; - pScan->aEquiv[0] = iCur; - pScan->aEquiv[1] = iColumn; - pScan->nEquiv = 2; - pScan->iEquiv = 2; - return whereScanNext(pScan); -} - -/* -** Search for a term in the WHERE clause that is of the form "X <op> <expr>" -** where X is a reference to the iColumn of table iCur and <op> is one of -** the WO_xx operator codes specified by the op parameter. -** Return a pointer to the term. Return 0 if not found. -** -** The term returned might by Y=<expr> if there is another constraint in -** the WHERE clause that specifies that X=Y. Any such constraints will be -** identified by the WO_EQUIV bit in the pTerm->eOperator field. The -** aEquiv[] array holds X and all its equivalents, with each SQL variable -** taking up two slots in aEquiv[]. The first slot is for the cursor number -** and the second is for the column number. There are 22 slots in aEquiv[] -** so that means we can look for X plus up to 10 other equivalent values. -** Hence a search for X will return <expr> if X=A1 and A1=A2 and A2=A3 -** and ... and A9=A10 and A10=<expr>. -** -** If there are multiple terms in the WHERE clause of the form "X <op> <expr>" -** then try for the one with no dependencies on <expr> - in other words where -** <expr> is a constant expression of some kind. Only return entries of -** the form "X <op> Y" where Y is a column in another table if no terms of -** the form "X <op> <const-expr>" exist. If no terms with a constant RHS -** exist, try to return a term that does not use WO_EQUIV. -*/ -static WhereTerm *findTerm( - WhereClause *pWC, /* The WHERE clause to be searched */ - int iCur, /* Cursor number of LHS */ - int iColumn, /* Column number of LHS */ - Bitmask notReady, /* RHS must not overlap with this mask */ - u32 op, /* Mask of WO_xx values describing operator */ - Index *pIdx /* Must be compatible with this index, if not NULL */ -){ - WhereTerm *pResult = 0; - WhereTerm *p; - WhereScan scan; - - p = whereScanInit(&scan, pWC, iCur, iColumn, op, pIdx); - while( p ){ - if( (p->prereqRight & notReady)==0 ){ - if( p->prereqRight==0 && (p->eOperator&WO_EQ)!=0 ){ - return p; - } - if( pResult==0 ) pResult = p; - } - p = whereScanNext(&scan); - } - return pResult; -} - -/* Forward reference */ -static void exprAnalyze(SrcList*, WhereClause*, int); - -/* -** Call exprAnalyze on all terms in a WHERE clause. -*/ -static void exprAnalyzeAll( - SrcList *pTabList, /* the FROM clause */ - WhereClause *pWC /* the WHERE clause to be analyzed */ -){ - int i; - for(i=pWC->nTerm-1; i>=0; i--){ - exprAnalyze(pTabList, pWC, i); - } -} #ifndef SQLITE_OMIT_LIKE_OPTIMIZATION /* @@ -115564,7 +134809,11 @@ static void exprAnalyzeAll( ** so and false if not. ** ** In order for the operator to be optimizible, the RHS must be a string -** literal that does not begin with a wildcard. +** literal that does not begin with a wildcard. The LHS must be a column +** that may only be NULL, a string, or a BLOB, never a number. (This means +** that virtual tables cannot participate in the LIKE optimization.) The +** collating sequence for the column on the LHS must be appropriate for +** the operator. */ static int isLikeOrGlob( Parse *pParse, /* Parsing and code generating context */ @@ -115573,15 +134822,16 @@ static int isLikeOrGlob( int *pisComplete, /* True if the only wildcard is % in the last character */ int *pnoCase /* True if uppercase is equivalent to lowercase */ ){ - const char *z = 0; /* String on RHS of LIKE operator */ + const u8 *z = 0; /* String on RHS of LIKE operator */ Expr *pRight, *pLeft; /* Right and left size of LIKE operator */ ExprList *pList; /* List of operands to the LIKE operator */ int c; /* One character in z[] */ int cnt; /* Number of non-wildcard prefix characters */ - char wc[3]; /* Wildcard characters */ + char wc[4]; /* Wildcard characters */ sqlite3 *db = pParse->db; /* Database connection */ sqlite3_value *pVal = 0; int op; /* Opcode of pRight */ + int rc; /* Result code to return */ if( !sqlite3IsLikeFunction(db, pExpr, pnoCase, wc) ){ return 0; @@ -115591,41 +134841,75 @@ static int isLikeOrGlob( #endif pList = pExpr->x.pList; pLeft = pList->a[1].pExpr; - if( pLeft->op!=TK_COLUMN - || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT - || IsVirtual(pLeft->pTab) - ){ - /* IMP: R-02065-49465 The left-hand side of the LIKE or GLOB operator must - ** be the name of an indexed column with TEXT affinity. */ - return 0; - } - assert( pLeft->iColumn!=(-1) ); /* Because IPK never has AFF_TEXT */ pRight = sqlite3ExprSkipCollate(pList->a[0].pExpr); op = pRight->op; - if( op==TK_VARIABLE ){ + if( op==TK_VARIABLE && (db->flags & SQLITE_EnableQPSG)==0 ){ Vdbe *pReprepare = pParse->pReprepare; int iCol = pRight->iColumn; - pVal = sqlite3VdbeGetBoundValue(pReprepare, iCol, SQLITE_AFF_NONE); + pVal = sqlite3VdbeGetBoundValue(pReprepare, iCol, SQLITE_AFF_BLOB); if( pVal && sqlite3_value_type(pVal)==SQLITE_TEXT ){ - z = (char *)sqlite3_value_text(pVal); + z = sqlite3_value_text(pVal); } sqlite3VdbeSetVarmask(pParse->pVdbe, iCol); assert( pRight->op==TK_VARIABLE || pRight->op==TK_REGISTER ); }else if( op==TK_STRING ){ - z = pRight->u.zToken; + z = (u8*)pRight->u.zToken; } if( z ){ + + /* If the RHS begins with a digit or a minus sign, then the LHS must + ** be an ordinary column (not a virtual table column) with TEXT affinity. + ** Otherwise the LHS might be numeric and "lhs >= rhs" would be false + ** even though "lhs LIKE rhs" is true. But if the RHS does not start + ** with a digit or '-', then "lhs LIKE rhs" will always be false if + ** the LHS is numeric and so the optimization still works. + */ + if( sqlite3Isdigit(z[0]) || z[0]=='-' ){ + if( pLeft->op!=TK_COLUMN + || sqlite3ExprAffinity(pLeft)!=SQLITE_AFF_TEXT + || IsVirtual(pLeft->pTab) /* Value might be numeric */ + ){ + sqlite3ValueFree(pVal); + return 0; + } + } + + /* Count the number of prefix characters prior to the first wildcard */ cnt = 0; while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ cnt++; + if( c==wc[3] && z[cnt]!=0 ) cnt++; } + + /* The optimization is possible only if (1) the pattern does not begin + ** with a wildcard and if (2) the non-wildcard prefix does not end with + ** an (illegal 0xff) character. The second condition is necessary so + ** that we can increment the prefix key to find an upper bound for the + ** range search. + */ if( cnt!=0 && 255!=(u8)z[cnt-1] ){ Expr *pPrefix; + + /* A "complete" match if the pattern ends with "*" or "%" */ *pisComplete = c==wc[0] && z[cnt+1]==0; - pPrefix = sqlite3Expr(db, TK_STRING, z); - if( pPrefix ) pPrefix->u.zToken[cnt] = 0; + + /* Get the pattern prefix. Remove all escapes from the prefix. */ + pPrefix = sqlite3Expr(db, TK_STRING, (char*)z); + if( pPrefix ){ + int iFrom, iTo; + char *zNew = pPrefix->u.zToken; + zNew[cnt] = 0; + for(iFrom=iTo=0; iFrom<cnt; iFrom++){ + if( zNew[iFrom]==wc[3] ) iFrom++; + zNew[iTo++] = zNew[iFrom]; + } + zNew[iTo] = 0; + } *ppPrefix = pPrefix; + + /* If the RHS pattern is a bound parameter, make arrangements to + ** reprepare the statement when that parameter is rebound */ if( op==TK_VARIABLE ){ Vdbe *v = pParse->pVdbe; sqlite3VdbeSetVarmask(v, pRight->iColumn); @@ -115647,39 +134931,95 @@ static int isLikeOrGlob( } } + rc = (z!=0); sqlite3ValueFree(pVal); - return (z!=0); + return rc; } #endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ #ifndef SQLITE_OMIT_VIRTUALTABLE /* -** Check to see if the given expression is of the form +** Check to see if the pExpr expression is a form that needs to be passed +** to the xBestIndex method of virtual tables. Forms of interest include: ** -** column MATCH expr +** Expression Virtual Table Operator +** ----------------------- --------------------------------- +** 1. column MATCH expr SQLITE_INDEX_CONSTRAINT_MATCH +** 2. column GLOB expr SQLITE_INDEX_CONSTRAINT_GLOB +** 3. column LIKE expr SQLITE_INDEX_CONSTRAINT_LIKE +** 4. column REGEXP expr SQLITE_INDEX_CONSTRAINT_REGEXP +** 5. column != expr SQLITE_INDEX_CONSTRAINT_NE +** 6. expr != column SQLITE_INDEX_CONSTRAINT_NE +** 7. column IS NOT expr SQLITE_INDEX_CONSTRAINT_ISNOT +** 8. expr IS NOT column SQLITE_INDEX_CONSTRAINT_ISNOT +** 9. column IS NOT NULL SQLITE_INDEX_CONSTRAINT_ISNOTNULL ** -** If it is then return TRUE. If not, return FALSE. +** In every case, "column" must be a column of a virtual table. If there +** is a match, set *ppLeft to the "column" expression, set *ppRight to the +** "expr" expression (even though in forms (6) and (8) the column is on the +** right and the expression is on the left). Also set *peOp2 to the +** appropriate virtual table operator. The return value is 1 or 2 if there +** is a match. The usual return is 1, but if the RHS is also a column +** of virtual table in forms (5) or (7) then return 2. +** +** If the expression matches none of the patterns above, return 0. */ -static int isMatchOfColumn( - Expr *pExpr /* Test this expression */ +static int isAuxiliaryVtabOperator( + Expr *pExpr, /* Test this expression */ + unsigned char *peOp2, /* OUT: 0 for MATCH, or else an op2 value */ + Expr **ppLeft, /* Column expression to left of MATCH/op2 */ + Expr **ppRight /* Expression to left of MATCH/op2 */ ){ - ExprList *pList; + if( pExpr->op==TK_FUNCTION ){ + static const struct Op2 { + const char *zOp; + unsigned char eOp2; + } aOp[] = { + { "match", SQLITE_INDEX_CONSTRAINT_MATCH }, + { "glob", SQLITE_INDEX_CONSTRAINT_GLOB }, + { "like", SQLITE_INDEX_CONSTRAINT_LIKE }, + { "regexp", SQLITE_INDEX_CONSTRAINT_REGEXP } + }; + ExprList *pList; + Expr *pCol; /* Column reference */ + int i; - if( pExpr->op!=TK_FUNCTION ){ - return 0; + pList = pExpr->x.pList; + if( pList==0 || pList->nExpr!=2 ){ + return 0; + } + pCol = pList->a[1].pExpr; + if( pCol->op!=TK_COLUMN || !IsVirtual(pCol->pTab) ){ + return 0; + } + for(i=0; i<ArraySize(aOp); i++){ + if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){ + *peOp2 = aOp[i].eOp2; + *ppRight = pList->a[0].pExpr; + *ppLeft = pCol; + return 1; + } + } + }else if( pExpr->op==TK_NE || pExpr->op==TK_ISNOT || pExpr->op==TK_NOTNULL ){ + int res = 0; + Expr *pLeft = pExpr->pLeft; + Expr *pRight = pExpr->pRight; + if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->pTab) ){ + res++; + } + if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->pTab) ){ + res++; + SWAP(Expr*, pLeft, pRight); + } + *ppLeft = pLeft; + *ppRight = pRight; + if( pExpr->op==TK_NE ) *peOp2 = SQLITE_INDEX_CONSTRAINT_NE; + if( pExpr->op==TK_ISNOT ) *peOp2 = SQLITE_INDEX_CONSTRAINT_ISNOT; + if( pExpr->op==TK_NOTNULL ) *peOp2 = SQLITE_INDEX_CONSTRAINT_ISNOTNULL; + return res; } - if( sqlite3StrICmp(pExpr->u.zToken,"match")!=0 ){ - return 0; - } - pList = pExpr->x.pList; - if( pList->nExpr!=2 ){ - return 0; - } - if( pList->a[1].pExpr->op != TK_COLUMN ){ - return 0; - } - return 1; + return 0; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -115703,6 +135043,79 @@ static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ pWC->a[iParent].nChild++; } +/* +** Return the N-th AND-connected subterm of pTerm. Or if pTerm is not +** a conjunction, then return just pTerm when N==0. If N is exceeds +** the number of available subterms, return NULL. +*/ +static WhereTerm *whereNthSubterm(WhereTerm *pTerm, int N){ + if( pTerm->eOperator!=WO_AND ){ + return N==0 ? pTerm : 0; + } + if( N<pTerm->u.pAndInfo->wc.nTerm ){ + return &pTerm->u.pAndInfo->wc.a[N]; + } + return 0; +} + +/* +** Subterms pOne and pTwo are contained within WHERE clause pWC. The +** two subterms are in disjunction - they are OR-ed together. +** +** If these two terms are both of the form: "A op B" with the same +** A and B values but different operators and if the operators are +** compatible (if one is = and the other is <, for example) then +** add a new virtual AND term to pWC that is the combination of the +** two. +** +** Some examples: +** +** x<y OR x=y --> x<=y +** x=y OR x=y --> x=y +** x<=y OR x<y --> x<=y +** +** The following is NOT generated: +** +** x<y OR x>y --> x!=y +*/ +static void whereCombineDisjuncts( + SrcList *pSrc, /* the FROM clause */ + WhereClause *pWC, /* The complete WHERE clause */ + WhereTerm *pOne, /* First disjunct */ + WhereTerm *pTwo /* Second disjunct */ +){ + u16 eOp = pOne->eOperator | pTwo->eOperator; + sqlite3 *db; /* Database connection (for malloc) */ + Expr *pNew; /* New virtual expression */ + int op; /* Operator for the combined expression */ + int idxNew; /* Index in pWC of the next virtual term */ + + if( (pOne->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (pTwo->eOperator & (WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE))==0 ) return; + if( (eOp & (WO_EQ|WO_LT|WO_LE))!=eOp + && (eOp & (WO_EQ|WO_GT|WO_GE))!=eOp ) return; + assert( pOne->pExpr->pLeft!=0 && pOne->pExpr->pRight!=0 ); + assert( pTwo->pExpr->pLeft!=0 && pTwo->pExpr->pRight!=0 ); + if( sqlite3ExprCompare(0,pOne->pExpr->pLeft, pTwo->pExpr->pLeft, -1) ) return; + if( sqlite3ExprCompare(0,pOne->pExpr->pRight, pTwo->pExpr->pRight,-1) )return; + /* If we reach this point, it means the two subterms can be combined */ + if( (eOp & (eOp-1))!=0 ){ + if( eOp & (WO_LT|WO_LE) ){ + eOp = WO_LE; + }else{ + assert( eOp & (WO_GT|WO_GE) ); + eOp = WO_GE; + } + } + db = pWC->pWInfo->pParse->db; + pNew = sqlite3ExprDup(db, pOne->pExpr, 0); + if( pNew==0 ) return; + for(op=TK_EQ; eOp!=(WO_EQ<<(op-TK_EQ)); op++){ assert( op<TK_GE ); } + pNew->op = op; + idxNew = whereClauseInsert(pWC, pNew, TERM_VIRTUAL|TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); +} + #if !defined(SQLITE_OMIT_OR_OPTIMIZATION) && !defined(SQLITE_OMIT_SUBQUERY) /* ** Analyze a term that consists of two or more OR-connected @@ -115727,6 +135140,7 @@ static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ ** (C) t1.x=t2.y OR (t1.x=t2.z AND t1.y=15) ** (D) x=expr1 OR (y>11 AND y<22 AND z LIKE '*hello*') ** (E) (p.a=1 AND q.b=2 AND r.c=3) OR (p.x=4 AND q.y=5 AND r.z=6) +** (F) x>A OR (x=A AND y>=B) ** ** CASE 1: ** @@ -115743,6 +135157,16 @@ static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ ** ** CASE 2: ** +** If there are exactly two disjuncts and one side has x>A and the other side +** has x=A (for the same x and A) then add a new virtual conjunct term to the +** WHERE clause of the form "x>=A". Example: +** +** x>A OR (x=A AND y>B) adds: x>=A +** +** The added conjunct can sometimes be helpful in query planning. +** +** CASE 3: +** ** If all subterms are indexable by a single table T, then set ** ** WhereTerm.eOperator = WO_OR @@ -115762,22 +135186,22 @@ static void markTermAsChild(WhereClause *pWC, int iChild, int iParent){ ** is decided elsewhere. This analysis only looks at whether subterms ** appropriate for indexing exist. ** -** All examples A through E above satisfy case 2. But if a term +** All examples A through E above satisfy case 3. But if a term ** also satisfies case 1 (such as B) we know that the optimizer will -** always prefer case 1, so in that case we pretend that case 2 is not +** always prefer case 1, so in that case we pretend that case 3 is not ** satisfied. ** ** It might be the case that multiple tables are indexable. For example, ** (E) above is indexable on tables P, Q, and R. ** -** Terms that satisfy case 2 are candidates for lookup by using +** Terms that satisfy case 3 are candidates for lookup by using ** separate indices to find rowids for each subterm and composing ** the union of all rowids using a RowSet object. This is similar ** to "bitmap indices" in other database engines. ** ** OTHERWISE: ** -** If neither case 1 nor case 2 apply, then leave the eOperator set to +** If none of cases 1, 2, or 3 apply, then leave the eOperator set to ** zero. This term is not useful for search. */ static void exprAnalyzeOrTerm( @@ -115808,14 +135232,15 @@ static void exprAnalyzeOrTerm( if( pOrInfo==0 ) return; pTerm->wtFlags |= TERM_ORINFO; pOrWc = &pOrInfo->wc; - whereClauseInit(pOrWc, pWInfo); - whereSplit(pOrWc, pExpr, TK_OR); - exprAnalyzeAll(pSrc, pOrWc); + memset(pOrWc->aStatic, 0, sizeof(pOrWc->aStatic)); + sqlite3WhereClauseInit(pOrWc, pWInfo); + sqlite3WhereSplit(pOrWc, pExpr, TK_OR); + sqlite3WhereExprAnalyze(pSrc, pOrWc); if( db->mallocFailed ) return; assert( pOrWc->nTerm>=2 ); /* - ** Compute the set of tables that might satisfy cases 1 or 2. + ** Compute the set of tables that might satisfy cases 1 or 3. */ indexable = ~(Bitmask)0; chngToIN = ~(Bitmask)0; @@ -115824,7 +135249,7 @@ static void exprAnalyzeOrTerm( WhereAndInfo *pAndInfo; assert( (pOrTerm->wtFlags & (TERM_ANDINFO|TERM_ORINFO))==0 ); chngToIN = 0; - pAndInfo = sqlite3DbMallocRaw(db, sizeof(*pAndInfo)); + pAndInfo = sqlite3DbMallocRawNN(db, sizeof(*pAndInfo)); if( pAndInfo ){ WhereClause *pAndWC; WhereTerm *pAndTerm; @@ -115834,16 +135259,18 @@ static void exprAnalyzeOrTerm( pOrTerm->wtFlags |= TERM_ANDINFO; pOrTerm->eOperator = WO_AND; pAndWC = &pAndInfo->wc; - whereClauseInit(pAndWC, pWC->pWInfo); - whereSplit(pAndWC, pOrTerm->pExpr, TK_AND); - exprAnalyzeAll(pSrc, pAndWC); + memset(pAndWC->aStatic, 0, sizeof(pAndWC->aStatic)); + sqlite3WhereClauseInit(pAndWC, pWC->pWInfo); + sqlite3WhereSplit(pAndWC, pOrTerm->pExpr, TK_AND); + sqlite3WhereExprAnalyze(pSrc, pAndWC); pAndWC->pOuter = pWC; - testcase( db->mallocFailed ); if( !db->mallocFailed ){ for(j=0, pAndTerm=pAndWC->a; j<pAndWC->nTerm; j++, pAndTerm++){ assert( pAndTerm->pExpr ); - if( allowedOp(pAndTerm->pExpr->op) ){ - b |= getMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); + if( allowedOp(pAndTerm->pExpr->op) + || pAndTerm->eOperator==WO_AUX + ){ + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pAndTerm->leftCursor); } } } @@ -115854,10 +135281,10 @@ static void exprAnalyzeOrTerm( ** corresponding TERM_VIRTUAL term */ }else{ Bitmask b; - b = getMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); + b = sqlite3WhereGetMask(&pWInfo->sMaskSet, pOrTerm->leftCursor); if( pOrTerm->wtFlags & TERM_VIRTUAL ){ WhereTerm *pOther = &pOrWc->a[pOrTerm->iParent]; - b |= getMask(&pWInfo->sMaskSet, pOther->leftCursor); + b |= sqlite3WhereGetMask(&pWInfo->sMaskSet, pOther->leftCursor); } indexable &= b; if( (pOrTerm->eOperator & WO_EQ)==0 ){ @@ -115869,12 +135296,26 @@ static void exprAnalyzeOrTerm( } /* - ** Record the set of tables that satisfy case 2. The set might be + ** Record the set of tables that satisfy case 3. The set might be ** empty. */ pOrInfo->indexable = indexable; pTerm->eOperator = indexable==0 ? 0 : WO_OR; + /* For a two-way OR, attempt to implementation case 2. + */ + if( indexable && pOrWc->nTerm==2 ){ + int iOne = 0; + WhereTerm *pOne; + while( (pOne = whereNthSubterm(&pOrWc->a[0],iOne++))!=0 ){ + int iTwo = 0; + WhereTerm *pTwo; + while( (pTwo = whereNthSubterm(&pOrWc->a[1],iTwo++))!=0 ){ + whereCombineDisjuncts(pSrc, pWC, pOne, pTwo); + } + } + } + /* ** chngToIN holds a set of tables that *might* satisfy case 1. But ** we have to do some additional checking to see if case 1 really @@ -115919,7 +135360,8 @@ static void exprAnalyzeOrTerm( assert( j==1 ); continue; } - if( (chngToIN & getMask(&pWInfo->sMaskSet, pOrTerm->leftCursor))==0 ){ + if( (chngToIN & sqlite3WhereGetMask(&pWInfo->sMaskSet, + pOrTerm->leftCursor))==0 ){ /* This term must be of the form t1.a==t2.b where t2 is in the ** chngToIN set but t1 is not. This term will be either preceded ** or follwed by an inverted copy (t2.b==t1.a). Skip this term @@ -115938,7 +135380,7 @@ static void exprAnalyzeOrTerm( ** on the second iteration */ assert( j==1 ); assert( IsPowerOfTwo(chngToIN) ); - assert( chngToIN==getMask(&pWInfo->sMaskSet, iCursor) ); + assert( chngToIN==sqlite3WhereGetMask(&pWInfo->sMaskSet, iCursor) ); break; } testcase( j==1 ); @@ -115990,7 +135432,7 @@ static void exprAnalyzeOrTerm( } assert( pLeft!=0 ); pDup = sqlite3ExprDup(db, pLeft, 0); - pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0, 0); + pNew = sqlite3PExpr(pParse, TK_IN, pDup, 0); if( pNew ){ int idxNew; transferJoinMarkings(pNew, pExpr); @@ -116004,12 +135446,137 @@ static void exprAnalyzeOrTerm( }else{ sqlite3ExprListDelete(db, pList); } - pTerm->eOperator = WO_NOOP; /* case 1 trumps case 2 */ } } } #endif /* !SQLITE_OMIT_OR_OPTIMIZATION && !SQLITE_OMIT_SUBQUERY */ +/* +** We already know that pExpr is a binary operator where both operands are +** column references. This routine checks to see if pExpr is an equivalence +** relation: +** 1. The SQLITE_Transitive optimization must be enabled +** 2. Must be either an == or an IS operator +** 3. Not originating in the ON clause of an OUTER JOIN +** 4. The affinities of A and B must be compatible +** 5a. Both operands use the same collating sequence OR +** 5b. The overall collating sequence is BINARY +** If this routine returns TRUE, that means that the RHS can be substituted +** for the LHS anyplace else in the WHERE clause where the LHS column occurs. +** This is an optimization. No harm comes from returning 0. But if 1 is +** returned when it should not be, then incorrect answers might result. +*/ +static int termIsEquivalence(Parse *pParse, Expr *pExpr){ + char aff1, aff2; + CollSeq *pColl; + if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; + if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; + if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; + aff1 = sqlite3ExprAffinity(pExpr->pLeft); + aff2 = sqlite3ExprAffinity(pExpr->pRight); + if( aff1!=aff2 + && (!sqlite3IsNumericAffinity(aff1) || !sqlite3IsNumericAffinity(aff2)) + ){ + return 0; + } + pColl = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight); + if( pColl==0 || sqlite3StrICmp(pColl->zName, "BINARY")==0 ) return 1; + return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight); +} + +/* +** Recursively walk the expressions of a SELECT statement and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ + Bitmask mask = 0; + while( pS ){ + SrcList *pSrc = pS->pSrc; + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pEList); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pGroupBy); + mask |= sqlite3WhereExprListUsage(pMaskSet, pS->pOrderBy); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pWhere); + mask |= sqlite3WhereExprUsage(pMaskSet, pS->pHaving); + if( ALWAYS(pSrc!=0) ){ + int i; + for(i=0; i<pSrc->nSrc; i++){ + mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); + mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn); + if( pSrc->a[i].fg.isTabFunc ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg); + } + } + } + pS = pS->pPrior; + } + return mask; +} + +/* +** Expression pExpr is one operand of a comparison operator that might +** be useful for indexing. This routine checks to see if pExpr appears +** in any index. Return TRUE (1) if pExpr is an indexed term and return +** FALSE (0) if not. If TRUE is returned, also set aiCurCol[0] to the cursor +** number of the table that is indexed and aiCurCol[1] to the column number +** of the column that is indexed, or XN_EXPR (-2) if an expression is being +** indexed. +** +** If pExpr is a TK_COLUMN column reference, then this routine always returns +** true even if that particular column is not indexed, because the column +** might be added to an automatic index later. +*/ +static SQLITE_NOINLINE int exprMightBeIndexed2( + SrcList *pFrom, /* The FROM clause */ + Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */ + int *aiCurCol, /* Write the referenced table cursor and column here */ + Expr *pExpr /* An operand of a comparison operator */ +){ + Index *pIdx; + int i; + int iCur; + for(i=0; mPrereq>1; i++, mPrereq>>=1){} + iCur = pFrom->a[i].iCursor; + for(pIdx=pFrom->a[i].pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + if( pIdx->aColExpr==0 ) continue; + for(i=0; i<pIdx->nKeyCol; i++){ + if( pIdx->aiColumn[i]!=XN_EXPR ) continue; + if( sqlite3ExprCompareSkip(pExpr, pIdx->aColExpr->a[i].pExpr, iCur)==0 ){ + aiCurCol[0] = iCur; + aiCurCol[1] = XN_EXPR; + return 1; + } + } + } + return 0; +} +static int exprMightBeIndexed( + SrcList *pFrom, /* The FROM clause */ + Bitmask mPrereq, /* Bitmask of FROM clause terms referenced by pExpr */ + int *aiCurCol, /* Write the referenced table cursor & column here */ + Expr *pExpr, /* An operand of a comparison operator */ + int op /* The specific comparison operator */ +){ + /* If this expression is a vector to the left or right of a + ** inequality constraint (>, <, >= or <=), perform the processing + ** on the first element of the vector. */ + assert( TK_GT+1==TK_LE && TK_GT+2==TK_LT && TK_GT+3==TK_GE ); + assert( TK_IS<TK_GE && TK_ISNULL<TK_GE && TK_IN<TK_GE ); + assert( op<=TK_GE ); + if( pExpr->op==TK_VECTOR && (op>=TK_GT && ALWAYS(op<=TK_GE)) ){ + pExpr = pExpr->x.pList->a[0].pExpr; + } + + if( pExpr->op==TK_COLUMN ){ + aiCurCol[0] = pExpr->iTable; + aiCurCol[1] = pExpr->iColumn; + return 1; + } + if( mPrereq==0 ) return 0; /* No table references */ + if( (mPrereq&(mPrereq-1))!=0 ) return 0; /* Refs more than one table */ + return exprMightBeIndexed2(pFrom,mPrereq,aiCurCol,pExpr); +} + /* ** The input to this routine is an WhereTerm structure with only the ** "pExpr" field filled in. The job of this routine is to analyze the @@ -116042,10 +135609,12 @@ static void exprAnalyze( Bitmask extraRight = 0; /* Extra dependencies on LEFT JOIN */ Expr *pStr1 = 0; /* RHS of LIKE/GLOB operator */ int isComplete = 0; /* RHS of LIKE/GLOB ends with wildcard */ - int noCase = 0; /* LIKE/GLOB distinguishes case */ + int noCase = 0; /* uppercase equivalent to lowercase */ int op; /* Top-level operator. pExpr->op */ Parse *pParse = pWInfo->pParse; /* Parsing context */ sqlite3 *db = pParse->db; /* Database connection */ + unsigned char eOp2 = 0; /* op2 value for LIKE/REGEXP/GLOB */ + int nLeft; /* Number of elements on left side vector */ if( db->mallocFailed ){ return; @@ -116054,44 +135623,63 @@ static void exprAnalyze( pMaskSet = &pWInfo->sMaskSet; pExpr = pTerm->pExpr; assert( pExpr->op!=TK_AS && pExpr->op!=TK_COLLATE ); - prereqLeft = exprTableUsage(pMaskSet, pExpr->pLeft); + prereqLeft = sqlite3WhereExprUsage(pMaskSet, pExpr->pLeft); op = pExpr->op; if( op==TK_IN ){ assert( pExpr->pRight==0 ); + if( sqlite3ExprCheckIN(pParse, pExpr) ) return; if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - pTerm->prereqRight = exprSelectTableUsage(pMaskSet, pExpr->x.pSelect); + pTerm->prereqRight = exprSelectUsage(pMaskSet, pExpr->x.pSelect); }else{ - pTerm->prereqRight = exprListTableUsage(pMaskSet, pExpr->x.pList); + pTerm->prereqRight = sqlite3WhereExprListUsage(pMaskSet, pExpr->x.pList); } }else if( op==TK_ISNULL ){ pTerm->prereqRight = 0; }else{ - pTerm->prereqRight = exprTableUsage(pMaskSet, pExpr->pRight); + pTerm->prereqRight = sqlite3WhereExprUsage(pMaskSet, pExpr->pRight); } - prereqAll = exprTableUsage(pMaskSet, pExpr); + pMaskSet->bVarSelect = 0; + prereqAll = sqlite3WhereExprUsage(pMaskSet, pExpr); + if( pMaskSet->bVarSelect ) pTerm->wtFlags |= TERM_VARSELECT; if( ExprHasProperty(pExpr, EP_FromJoin) ){ - Bitmask x = getMask(pMaskSet, pExpr->iRightJoinTable); + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->iRightJoinTable); prereqAll |= x; extraRight = x-1; /* ON clause terms may not be used with an index ** on left table of a LEFT JOIN. Ticket #3015 */ + if( (prereqAll>>1)>=x ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } } pTerm->prereqAll = prereqAll; pTerm->leftCursor = -1; pTerm->iParent = -1; pTerm->eOperator = 0; if( allowedOp(op) ){ + int aiCurCol[2]; Expr *pLeft = sqlite3ExprSkipCollate(pExpr->pLeft); Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); u16 opMask = (pTerm->prereqRight & prereqLeft)==0 ? WO_ALL : WO_EQUIV; - if( pLeft->op==TK_COLUMN ){ - pTerm->leftCursor = pLeft->iTable; - pTerm->u.leftColumn = pLeft->iColumn; + + if( pTerm->iField>0 ){ + assert( op==TK_IN ); + assert( pLeft->op==TK_VECTOR ); + pLeft = pLeft->x.pList->a[pTerm->iField-1].pExpr; + } + + if( exprMightBeIndexed(pSrc, prereqLeft, aiCurCol, pLeft, op) ){ + pTerm->leftCursor = aiCurCol[0]; + pTerm->u.leftColumn = aiCurCol[1]; pTerm->eOperator = operatorMask(op) & opMask; } - if( pRight && pRight->op==TK_COLUMN ){ + if( op==TK_IS ) pTerm->wtFlags |= TERM_IS; + if( pRight + && exprMightBeIndexed(pSrc, pTerm->prereqRight, aiCurCol, pRight, op) + ){ WhereTerm *pNew; Expr *pDup; u16 eExtraOp = 0; /* Extra bits for pNew->eOperator */ + assert( pTerm->iField==0 ); if( pTerm->leftCursor>=0 ){ int idxNew; pDup = sqlite3ExprDup(db, pExpr, 0); @@ -116103,12 +135691,11 @@ static void exprAnalyze( if( idxNew==0 ) return; pNew = &pWC->a[idxNew]; markTermAsChild(pWC, idxNew, idxTerm); + if( op==TK_IS ) pNew->wtFlags |= TERM_IS; pTerm = &pWC->a[idxTerm]; pTerm->wtFlags |= TERM_COPIED; - if( pExpr->op==TK_EQ - && !ExprHasProperty(pExpr, EP_FromJoin) - && OptimizationEnabled(db, SQLITE_Transitive) - ){ + + if( termIsEquivalence(pParse, pDup) ){ pTerm->eOperator |= WO_EQUIV; eExtraOp = WO_EQUIV; } @@ -116117,9 +135704,8 @@ static void exprAnalyze( pNew = pTerm; } exprCommute(pParse, pDup); - pLeft = sqlite3ExprSkipCollate(pDup->pLeft); - pNew->leftCursor = pLeft->iTable; - pNew->u.leftColumn = pLeft->iColumn; + pNew->leftCursor = aiCurCol[0]; + pNew->u.leftColumn = aiCurCol[1]; testcase( (prereqLeft | extraRight) != prereqLeft ); pNew->prereqRight = prereqLeft | extraRight; pNew->prereqAll = prereqAll; @@ -116154,7 +135740,7 @@ static void exprAnalyze( int idxNew; pNewExpr = sqlite3PExpr(pParse, ops[i], sqlite3ExprDup(db, pExpr->pLeft, 0), - sqlite3ExprDup(db, pList->a[i].pExpr, 0), 0); + sqlite3ExprDup(db, pList->a[i].pExpr, 0)); transferJoinMarkings(pNewExpr, pExpr); idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); @@ -116180,12 +135766,15 @@ static void exprAnalyze( /* Add constraints to reduce the search space on a LIKE or GLOB ** operator. ** - ** A like pattern of the form "x LIKE 'abc%'" is changed into constraints + ** A like pattern of the form "x LIKE 'aBc%'" is changed into constraints ** - ** x>='abc' AND x<'abd' AND x LIKE 'abc%' + ** x>='ABC' AND x<'abd' AND x LIKE 'aBc%' ** ** The last character of the prefix "abc" is incremented to form the - ** termination condition "abd". + ** termination condition "abd". If case is not significant (the default + ** for LIKE) then the lower-bound is made all uppercase and the upper- + ** bound is made all lowercase so that the bounds also work when comparing + ** BLOBs. */ if( pWC->op==TK_AND && isLikeOrGlob(pParse, pExpr, &pStr1, &isComplete, &noCase) @@ -116196,10 +135785,26 @@ static void exprAnalyze( Expr *pNewExpr2; int idxNew1; int idxNew2; - Token sCollSeqName; /* Name of collating sequence */ + const char *zCollSeqName; /* Name of collating sequence */ + const u16 wtFlags = TERM_LIKEOPT | TERM_VIRTUAL | TERM_DYNAMIC; pLeft = pExpr->x.pList->a[1].pExpr; pStr2 = sqlite3ExprDup(db, pStr1, 0); + + /* Convert the lower bound to upper-case and the upper bound to + ** lower-case (upper-case is less than lower-case in ASCII) so that + ** the range constraints also work for BLOBs + */ + if( noCase && !pParse->db->mallocFailed ){ + int i; + char c; + pTerm->wtFlags |= TERM_LIKE; + for(i=0; (c = pStr1->u.zToken[i])!=0; i++){ + pStr1->u.zToken[i] = sqlite3Toupper(c); + pStr2->u.zToken[i] = sqlite3Tolower(c); + } + } + if( !db->mallocFailed ){ u8 c, *pC; /* Last character before the first wildcard */ pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; @@ -116216,22 +135821,21 @@ static void exprAnalyze( } *pC = c + 1; } - sCollSeqName.z = noCase ? "NOCASE" : "BINARY"; - sCollSeqName.n = 6; + zCollSeqName = noCase ? "NOCASE" : "BINARY"; pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); - pNewExpr1 = sqlite3PExpr(pParse, TK_GE, - sqlite3ExprAddCollateToken(pParse,pNewExpr1,&sCollSeqName), - pStr1, 0); + pNewExpr1 = sqlite3PExpr(pParse, TK_GE, + sqlite3ExprAddCollateString(pParse,pNewExpr1,zCollSeqName), + pStr1); transferJoinMarkings(pNewExpr1, pExpr); - idxNew1 = whereClauseInsert(pWC, pNewExpr1, TERM_VIRTUAL|TERM_DYNAMIC); + idxNew1 = whereClauseInsert(pWC, pNewExpr1, wtFlags); testcase( idxNew1==0 ); exprAnalyze(pSrc, pWC, idxNew1); pNewExpr2 = sqlite3ExprDup(db, pLeft, 0); pNewExpr2 = sqlite3PExpr(pParse, TK_LT, - sqlite3ExprAddCollateToken(pParse,pNewExpr2,&sCollSeqName), - pStr2, 0); + sqlite3ExprAddCollateString(pParse,pNewExpr2,zCollSeqName), + pStr2); transferJoinMarkings(pNewExpr2, pExpr); - idxNew2 = whereClauseInsert(pWC, pNewExpr2, TERM_VIRTUAL|TERM_DYNAMIC); + idxNew2 = whereClauseInsert(pWC, pNewExpr2, wtFlags); testcase( idxNew2==0 ); exprAnalyze(pSrc, pWC, idxNew2); pTerm = &pWC->a[idxTerm]; @@ -116243,51 +135847,110 @@ static void exprAnalyze( #endif /* SQLITE_OMIT_LIKE_OPTIMIZATION */ #ifndef SQLITE_OMIT_VIRTUALTABLE - /* Add a WO_MATCH auxiliary term to the constraint set if the - ** current expression is of the form: column MATCH expr. + /* Add a WO_AUX auxiliary term to the constraint set if the + ** current expression is of the form "column OP expr" where OP + ** is an operator that gets passed into virtual tables but which is + ** not normally optimized for ordinary tables. In other words, OP + ** is one of MATCH, LIKE, GLOB, REGEXP, !=, IS, IS NOT, or NOT NULL. ** This information is used by the xBestIndex methods of ** virtual tables. The native query optimizer does not attempt ** to do anything with MATCH functions. */ - if( isMatchOfColumn(pExpr) ){ - int idxNew; - Expr *pRight, *pLeft; - WhereTerm *pNewTerm; - Bitmask prereqColumn, prereqExpr; + if( pWC->op==TK_AND ){ + Expr *pRight = 0, *pLeft = 0; + int res = isAuxiliaryVtabOperator(pExpr, &eOp2, &pLeft, &pRight); + while( res-- > 0 ){ + int idxNew; + WhereTerm *pNewTerm; + Bitmask prereqColumn, prereqExpr; - pRight = pExpr->x.pList->a[0].pExpr; - pLeft = pExpr->x.pList->a[1].pExpr; - prereqExpr = exprTableUsage(pMaskSet, pRight); - prereqColumn = exprTableUsage(pMaskSet, pLeft); - if( (prereqExpr & prereqColumn)==0 ){ - Expr *pNewExpr; - pNewExpr = sqlite3PExpr(pParse, TK_MATCH, - 0, sqlite3ExprDup(db, pRight, 0), 0); - idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); - testcase( idxNew==0 ); - pNewTerm = &pWC->a[idxNew]; - pNewTerm->prereqRight = prereqExpr; - pNewTerm->leftCursor = pLeft->iTable; - pNewTerm->u.leftColumn = pLeft->iColumn; - pNewTerm->eOperator = WO_MATCH; - markTermAsChild(pWC, idxNew, idxTerm); - pTerm = &pWC->a[idxTerm]; - pTerm->wtFlags |= TERM_COPIED; - pNewTerm->prereqAll = pTerm->prereqAll; + prereqExpr = sqlite3WhereExprUsage(pMaskSet, pRight); + prereqColumn = sqlite3WhereExprUsage(pMaskSet, pLeft); + if( (prereqExpr & prereqColumn)==0 ){ + Expr *pNewExpr; + pNewExpr = sqlite3PExpr(pParse, TK_MATCH, + 0, sqlite3ExprDup(db, pRight, 0)); + if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ + ExprSetProperty(pNewExpr, EP_FromJoin); + } + idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); + testcase( idxNew==0 ); + pNewTerm = &pWC->a[idxNew]; + pNewTerm->prereqRight = prereqExpr; + pNewTerm->leftCursor = pLeft->iTable; + pNewTerm->u.leftColumn = pLeft->iColumn; + pNewTerm->eOperator = WO_AUX; + pNewTerm->eMatchOp = eOp2; + markTermAsChild(pWC, idxNew, idxTerm); + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_COPIED; + pNewTerm->prereqAll = pTerm->prereqAll; + } + SWAP(Expr*, pLeft, pRight); } } #endif /* SQLITE_OMIT_VIRTUALTABLE */ + /* If there is a vector == or IS term - e.g. "(a, b) == (?, ?)" - create + ** new terms for each component comparison - "a = ?" and "b = ?". The + ** new terms completely replace the original vector comparison, which is + ** no longer used. + ** + ** This is only required if at least one side of the comparison operation + ** is not a sub-select. */ + if( pWC->op==TK_AND + && (pExpr->op==TK_EQ || pExpr->op==TK_IS) + && (nLeft = sqlite3ExprVectorSize(pExpr->pLeft))>1 + && sqlite3ExprVectorSize(pExpr->pRight)==nLeft + && ( (pExpr->pLeft->flags & EP_xIsSelect)==0 + || (pExpr->pRight->flags & EP_xIsSelect)==0) + ){ + int i; + for(i=0; i<nLeft; i++){ + int idxNew; + Expr *pNew; + Expr *pLeft = sqlite3ExprForVectorField(pParse, pExpr->pLeft, i); + Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i); + + pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight); + transferJoinMarkings(pNew, pExpr); + idxNew = whereClauseInsert(pWC, pNew, TERM_DYNAMIC); + exprAnalyze(pSrc, pWC, idxNew); + } + pTerm = &pWC->a[idxTerm]; + pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */ + pTerm->eOperator = 0; + } + + /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create + ** a virtual term for each vector component. The expression object + ** used by each such virtual term is pExpr (the full vector IN(...) + ** expression). The WhereTerm.iField variable identifies the index within + ** the vector on the LHS that the virtual term represents. + ** + ** This only works if the RHS is a simple SELECT, not a compound + */ + if( pWC->op==TK_AND && pExpr->op==TK_IN && pTerm->iField==0 + && pExpr->pLeft->op==TK_VECTOR + && pExpr->x.pSelect->pPrior==0 + ){ + int i; + for(i=0; i<sqlite3ExprVectorSize(pExpr->pLeft); i++){ + int idxNew; + idxNew = whereClauseInsert(pWC, pExpr, TERM_VIRTUAL); + pWC->a[idxNew].iField = i+1; + exprAnalyze(pSrc, pWC, idxNew); + markTermAsChild(pWC, idxNew, idxTerm); + } + } + #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 /* When sqlite_stat3 histogram data is available an operator of the ** form "x IS NOT NULL" can sometimes be evaluated more efficiently ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a ** virtual term of that form. ** - ** Note that the virtual term must be tagged with TERM_VNULL. This - ** TERM_VNULL tag will suppress the not-null check at the beginning - ** of the loop. Without the TERM_VNULL flag, the not-null check at - ** the start of the loop will prevent any results from being returned. + ** Note that the virtual term must be tagged with TERM_VNULL. */ if( pExpr->op==TK_NOTNULL && pExpr->pLeft->op==TK_COLUMN @@ -116301,7 +135964,7 @@ static void exprAnalyze( pNewExpr = sqlite3PExpr(pParse, TK_GT, sqlite3ExprDup(db, pLeft, 0), - sqlite3PExpr(pParse, TK_NULL, 0, 0, 0), 0); + sqlite3ExprAlloc(db, TK_NULL, 0, 0)); idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC|TERM_VNULL); @@ -116322,9 +135985,578 @@ static void exprAnalyze( /* Prevent ON clause terms of a LEFT JOIN from being used to drive ** an index for tables to the left of the join. */ + testcase( pTerm!=&pWC->a[idxTerm] ); + pTerm = &pWC->a[idxTerm]; pTerm->prereqRight |= extraRight; } +/*************************************************************************** +** Routines with file scope above. Interface to the rest of the where.c +** subsystem follows. +***************************************************************************/ + +/* +** This routine identifies subexpressions in the WHERE clause where +** each subexpression is separated by the AND operator or some other +** operator specified in the op parameter. The WhereClause structure +** is filled with pointers to subexpressions. For example: +** +** WHERE a=='hello' AND coalesce(b,11)<10 AND (c+12!=d OR c==22) +** \________/ \_______________/ \________________/ +** slot[0] slot[1] slot[2] +** +** The original WHERE clause in pExpr is unaltered. All this routine +** does is make slot[] entries point to substructure within pExpr. +** +** In the previous sentence and in the diagram, "slot[]" refers to +** the WhereClause.a[] array. The slot[] array grows as needed to contain +** all terms of the WHERE clause. +*/ +SQLITE_PRIVATE void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ + Expr *pE2 = sqlite3ExprSkipCollate(pExpr); + pWC->op = op; + if( pE2==0 ) return; + if( pE2->op!=op ){ + whereClauseInsert(pWC, pExpr, 0); + }else{ + sqlite3WhereSplit(pWC, pE2->pLeft, op); + sqlite3WhereSplit(pWC, pE2->pRight, op); + } +} + +/* +** Initialize a preallocated WhereClause structure. +*/ +SQLITE_PRIVATE void sqlite3WhereClauseInit( + WhereClause *pWC, /* The WhereClause to be initialized */ + WhereInfo *pWInfo /* The WHERE processing context */ +){ + pWC->pWInfo = pWInfo; + pWC->pOuter = 0; + pWC->nTerm = 0; + pWC->nSlot = ArraySize(pWC->aStatic); + pWC->a = pWC->aStatic; +} + +/* +** Deallocate a WhereClause structure. The WhereClause structure +** itself is not freed. This routine is the inverse of +** sqlite3WhereClauseInit(). +*/ +SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ + int i; + WhereTerm *a; + sqlite3 *db = pWC->pWInfo->pParse->db; + for(i=pWC->nTerm-1, a=pWC->a; i>=0; i--, a++){ + if( a->wtFlags & TERM_DYNAMIC ){ + sqlite3ExprDelete(db, a->pExpr); + } + if( a->wtFlags & TERM_ORINFO ){ + whereOrInfoDelete(db, a->u.pOrInfo); + }else if( a->wtFlags & TERM_ANDINFO ){ + whereAndInfoDelete(db, a->u.pAndInfo); + } + } + if( pWC->a!=pWC->aStatic ){ + sqlite3DbFree(db, pWC->a); + } +} + + +/* +** These routines walk (recursively) an expression tree and generate +** a bitmask indicating which tables are used in that expression +** tree. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereExprUsage(WhereMaskSet *pMaskSet, Expr *p){ + Bitmask mask; + if( p==0 ) return 0; + if( p->op==TK_COLUMN ){ + return sqlite3WhereGetMask(pMaskSet, p->iTable); + } + mask = (p->op==TK_IF_NULL_ROW) ? sqlite3WhereGetMask(pMaskSet, p->iTable) : 0; + assert( !ExprHasProperty(p, EP_TokenOnly) ); + if( p->pLeft ) mask |= sqlite3WhereExprUsage(pMaskSet, p->pLeft); + if( p->pRight ){ + mask |= sqlite3WhereExprUsage(pMaskSet, p->pRight); + assert( p->x.pList==0 ); + }else if( ExprHasProperty(p, EP_xIsSelect) ){ + if( ExprHasProperty(p, EP_VarSelect) ) pMaskSet->bVarSelect = 1; + mask |= exprSelectUsage(pMaskSet, p->x.pSelect); + }else if( p->x.pList ){ + mask |= sqlite3WhereExprListUsage(pMaskSet, p->x.pList); + } + return mask; +} +SQLITE_PRIVATE Bitmask sqlite3WhereExprListUsage(WhereMaskSet *pMaskSet, ExprList *pList){ + int i; + Bitmask mask = 0; + if( pList ){ + for(i=0; i<pList->nExpr; i++){ + mask |= sqlite3WhereExprUsage(pMaskSet, pList->a[i].pExpr); + } + } + return mask; +} + + +/* +** Call exprAnalyze on all terms in a WHERE clause. +** +** Note that exprAnalyze() might add new virtual terms onto the +** end of the WHERE clause. We do not want to analyze these new +** virtual terms, so start analyzing at the end and work forward +** so that the added virtual terms are never processed. +*/ +SQLITE_PRIVATE void sqlite3WhereExprAnalyze( + SrcList *pTabList, /* the FROM clause */ + WhereClause *pWC /* the WHERE clause to be analyzed */ +){ + int i; + for(i=pWC->nTerm-1; i>=0; i--){ + exprAnalyze(pTabList, pWC, i); + } +} + +/* +** For table-valued-functions, transform the function arguments into +** new WHERE clause terms. +** +** Each function argument translates into an equality constraint against +** a HIDDEN column in the table. +*/ +SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( + Parse *pParse, /* Parsing context */ + struct SrcList_item *pItem, /* The FROM clause term to process */ + WhereClause *pWC /* Xfer function arguments to here */ +){ + Table *pTab; + int j, k; + ExprList *pArgs; + Expr *pColRef; + Expr *pTerm; + if( pItem->fg.isTabFunc==0 ) return; + pTab = pItem->pTab; + assert( pTab!=0 ); + pArgs = pItem->u1.pFuncArg; + if( pArgs==0 ) return; + for(j=k=0; j<pArgs->nExpr; j++){ + while( k<pTab->nCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} + if( k>=pTab->nCol ){ + sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", + pTab->zName, j); + return; + } + pColRef = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0); + if( pColRef==0 ) return; + pColRef->iTable = pItem->iCursor; + pColRef->iColumn = k++; + pColRef->pTab = pTab; + pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, + sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0)); + whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); + } +} + +/************** End of whereexpr.c *******************************************/ +/************** Begin file where.c *******************************************/ +/* +** 2001 September 15 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** This module contains C code that generates VDBE code used to process +** the WHERE clause of SQL statements. This module is responsible for +** generating the code that loops through a table looking for applicable +** rows. Indices are selected and used to speed the search when doing +** so is applicable. Because this module is responsible for selecting +** indices, you might also think of this module as the "query optimizer". +*/ +/* #include "sqliteInt.h" */ +/* #include "whereInt.h" */ + +/* +** Extra information appended to the end of sqlite3_index_info but not +** visible to the xBestIndex function, at least not directly. The +** sqlite3_vtab_collation() interface knows how to reach it, however. +** +** This object is not an API and can be changed from one release to the +** next. As long as allocateIndexInfo() and sqlite3_vtab_collation() +** agree on the structure, all will be well. +*/ +typedef struct HiddenIndexInfo HiddenIndexInfo; +struct HiddenIndexInfo { + WhereClause *pWC; /* The Where clause being analyzed */ + Parse *pParse; /* The parsing context */ +}; + +/* Forward declaration of methods */ +static int whereLoopResize(sqlite3*, WhereLoop*, int); + +/* Test variable that can be set to enable WHERE tracing */ +#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG) +/***/ int sqlite3WhereTrace = 0; +#endif + + +/* +** Return the estimated number of output rows from a WHERE clause +*/ +SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo *pWInfo){ + return pWInfo->nRowOut; +} + +/* +** Return one of the WHERE_DISTINCT_xxxxx values to indicate how this +** WHERE clause returns outputs for DISTINCT processing. +*/ +SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){ + return pWInfo->eDistinct; +} + +/* +** Return TRUE if the WHERE clause returns rows in ORDER BY order. +** Return FALSE if the output needs to be sorted. +*/ +SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){ + return pWInfo->nOBSat; +} + +/* +** Return TRUE if the innermost loop of the WHERE clause implementation +** returns rows in ORDER BY order for complete run of the inner loop. +** +** Across multiple iterations of outer loops, the output rows need not be +** sorted. As long as rows are sorted for just the innermost loop, this +** routine can return TRUE. +*/ +SQLITE_PRIVATE int sqlite3WhereOrderedInnerLoop(WhereInfo *pWInfo){ + return pWInfo->bOrderedInnerLoop; +} + +/* +** Return the VDBE address or label to jump to in order to continue +** immediately with the next row of a WHERE clause. +*/ +SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo *pWInfo){ + assert( pWInfo->iContinue!=0 ); + return pWInfo->iContinue; +} + +/* +** Return the VDBE address or label to jump to in order to break +** out of a WHERE loop. +*/ +SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ + return pWInfo->iBreak; +} + +/* +** Return ONEPASS_OFF (0) if an UPDATE or DELETE statement is unable to +** operate directly on the rowis returned by a WHERE clause. Return +** ONEPASS_SINGLE (1) if the statement can operation directly because only +** a single row is to be changed. Return ONEPASS_MULTI (2) if the one-pass +** optimization can be used on multiple +** +** If the ONEPASS optimization is used (if this routine returns true) +** then also write the indices of open cursors used by ONEPASS +** into aiCur[0] and aiCur[1]. iaCur[0] gets the cursor of the data +** table and iaCur[1] gets the cursor used by an auxiliary index. +** Either value may be -1, indicating that cursor is not used. +** Any cursors returned will have been opened for writing. +** +** aiCur[0] and aiCur[1] both get -1 if the where-clause logic is +** unable to use the ONEPASS optimization. +*/ +SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ + memcpy(aiCur, pWInfo->aiCurOnePass, sizeof(int)*2); +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace && pWInfo->eOnePass!=ONEPASS_OFF ){ + sqlite3DebugPrintf("%s cursors: %d %d\n", + pWInfo->eOnePass==ONEPASS_SINGLE ? "ONEPASS_SINGLE" : "ONEPASS_MULTI", + aiCur[0], aiCur[1]); + } +#endif + return pWInfo->eOnePass; +} + +/* +** Move the content of pSrc into pDest +*/ +static void whereOrMove(WhereOrSet *pDest, WhereOrSet *pSrc){ + pDest->n = pSrc->n; + memcpy(pDest->a, pSrc->a, pDest->n*sizeof(pDest->a[0])); +} + +/* +** Try to insert a new prerequisite/cost entry into the WhereOrSet pSet. +** +** The new entry might overwrite an existing entry, or it might be +** appended, or it might be discarded. Do whatever is the right thing +** so that pSet keeps the N_OR_COST best entries seen so far. +*/ +static int whereOrInsert( + WhereOrSet *pSet, /* The WhereOrSet to be updated */ + Bitmask prereq, /* Prerequisites of the new entry */ + LogEst rRun, /* Run-cost of the new entry */ + LogEst nOut /* Number of outputs for the new entry */ +){ + u16 i; + WhereOrCost *p; + for(i=pSet->n, p=pSet->a; i>0; i--, p++){ + if( rRun<=p->rRun && (prereq & p->prereq)==prereq ){ + goto whereOrInsert_done; + } + if( p->rRun<=rRun && (p->prereq & prereq)==p->prereq ){ + return 0; + } + } + if( pSet->n<N_OR_COST ){ + p = &pSet->a[pSet->n++]; + p->nOut = nOut; + }else{ + p = pSet->a; + for(i=1; i<pSet->n; i++){ + if( p->rRun>pSet->a[i].rRun ) p = pSet->a + i; + } + if( p->rRun<=rRun ) return 0; + } +whereOrInsert_done: + p->prereq = prereq; + p->rRun = rRun; + if( p->nOut>nOut ) p->nOut = nOut; + return 1; +} + +/* +** Return the bitmask for the given cursor number. Return 0 if +** iCursor is not in the set. +*/ +SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ + int i; + assert( pMaskSet->n<=(int)sizeof(Bitmask)*8 ); + for(i=0; i<pMaskSet->n; i++){ + if( pMaskSet->ix[i]==iCursor ){ + return MASKBIT(i); + } + } + return 0; +} + +/* +** Create a new mask for cursor iCursor. +** +** There is one cursor per table in the FROM clause. The number of +** tables in the FROM clause is limited by a test early in the +** sqlite3WhereBegin() routine. So we know that the pMaskSet->ix[] +** array will never overflow. +*/ +static void createMask(WhereMaskSet *pMaskSet, int iCursor){ + assert( pMaskSet->n < ArraySize(pMaskSet->ix) ); + pMaskSet->ix[pMaskSet->n++] = iCursor; +} + +/* +** Advance to the next WhereTerm that matches according to the criteria +** established when the pScan object was initialized by whereScanInit(). +** Return NULL if there are no more matching WhereTerms. +*/ +static WhereTerm *whereScanNext(WhereScan *pScan){ + int iCur; /* The cursor on the LHS of the term */ + i16 iColumn; /* The column on the LHS of the term. -1 for IPK */ + Expr *pX; /* An expression being tested */ + WhereClause *pWC; /* Shorthand for pScan->pWC */ + WhereTerm *pTerm; /* The term being tested */ + int k = pScan->k; /* Where to start scanning */ + + assert( pScan->iEquiv<=pScan->nEquiv ); + pWC = pScan->pWC; + while(1){ + iColumn = pScan->aiColumn[pScan->iEquiv-1]; + iCur = pScan->aiCur[pScan->iEquiv-1]; + assert( pWC!=0 ); + do{ + for(pTerm=pWC->a+k; k<pWC->nTerm; k++, pTerm++){ + if( pTerm->leftCursor==iCur + && pTerm->u.leftColumn==iColumn + && (iColumn!=XN_EXPR + || sqlite3ExprCompareSkip(pTerm->pExpr->pLeft, + pScan->pIdxExpr,iCur)==0) + && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + ){ + if( (pTerm->eOperator & WO_EQUIV)!=0 + && pScan->nEquiv<ArraySize(pScan->aiCur) + && (pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight))->op==TK_COLUMN + ){ + int j; + for(j=0; j<pScan->nEquiv; j++){ + if( pScan->aiCur[j]==pX->iTable + && pScan->aiColumn[j]==pX->iColumn ){ + break; + } + } + if( j==pScan->nEquiv ){ + pScan->aiCur[j] = pX->iTable; + pScan->aiColumn[j] = pX->iColumn; + pScan->nEquiv++; + } + } + if( (pTerm->eOperator & pScan->opMask)!=0 ){ + /* Verify the affinity and collating sequence match */ + if( pScan->zCollName && (pTerm->eOperator & WO_ISNULL)==0 ){ + CollSeq *pColl; + Parse *pParse = pWC->pWInfo->pParse; + pX = pTerm->pExpr; + if( !sqlite3IndexAffinityOk(pX, pScan->idxaff) ){ + continue; + } + assert(pX->pLeft); + pColl = sqlite3BinaryCompareCollSeq(pParse, + pX->pLeft, pX->pRight); + if( pColl==0 ) pColl = pParse->db->pDfltColl; + if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ + continue; + } + } + if( (pTerm->eOperator & (WO_EQ|WO_IS))!=0 + && (pX = pTerm->pExpr->pRight)->op==TK_COLUMN + && pX->iTable==pScan->aiCur[0] + && pX->iColumn==pScan->aiColumn[0] + ){ + testcase( pTerm->eOperator & WO_IS ); + continue; + } + pScan->pWC = pWC; + pScan->k = k+1; + return pTerm; + } + } + } + pWC = pWC->pOuter; + k = 0; + }while( pWC!=0 ); + if( pScan->iEquiv>=pScan->nEquiv ) break; + pWC = pScan->pOrigWC; + k = 0; + pScan->iEquiv++; + } + return 0; +} + +/* +** Initialize a WHERE clause scanner object. Return a pointer to the +** first match. Return NULL if there are no matches. +** +** The scanner will be searching the WHERE clause pWC. It will look +** for terms of the form "X <op> <expr>" where X is column iColumn of table +** iCur. Or if pIdx!=0 then X is column iColumn of index pIdx. pIdx +** must be one of the indexes of table iCur. +** +** The <op> must be one of the operators described by opMask. +** +** If the search is for X and the WHERE clause contains terms of the +** form X=Y then this routine might also return terms of the form +** "Y <op> <expr>". The number of levels of transitivity is limited, +** but is enough to handle most commonly occurring SQL statements. +** +** If X is not the INTEGER PRIMARY KEY then X must be compatible with +** index pIdx. +*/ +static WhereTerm *whereScanInit( + WhereScan *pScan, /* The WhereScan object being initialized */ + WhereClause *pWC, /* The WHERE clause to be scanned */ + int iCur, /* Cursor to scan for */ + int iColumn, /* Column to scan for */ + u32 opMask, /* Operator(s) to scan for */ + Index *pIdx /* Must be compatible with this index */ +){ + pScan->pOrigWC = pWC; + pScan->pWC = pWC; + pScan->pIdxExpr = 0; + pScan->idxaff = 0; + pScan->zCollName = 0; + if( pIdx ){ + int j = iColumn; + iColumn = pIdx->aiColumn[j]; + if( iColumn==XN_EXPR ){ + pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + pScan->zCollName = pIdx->azColl[j]; + }else if( iColumn==pIdx->pTable->iPKey ){ + iColumn = XN_ROWID; + }else if( iColumn>=0 ){ + pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; + pScan->zCollName = pIdx->azColl[j]; + } + }else if( iColumn==XN_EXPR ){ + return 0; + } + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->aiColumn[0] = iColumn; + pScan->nEquiv = 1; + pScan->iEquiv = 1; + return whereScanNext(pScan); +} + +/* +** Search for a term in the WHERE clause that is of the form "X <op> <expr>" +** where X is a reference to the iColumn of table iCur or of index pIdx +** if pIdx!=0 and <op> is one of the WO_xx operator codes specified by +** the op parameter. Return a pointer to the term. Return 0 if not found. +** +** If pIdx!=0 then it must be one of the indexes of table iCur. +** Search for terms matching the iColumn-th column of pIdx +** rather than the iColumn-th column of table iCur. +** +** The term returned might by Y=<expr> if there is another constraint in +** the WHERE clause that specifies that X=Y. Any such constraints will be +** identified by the WO_EQUIV bit in the pTerm->eOperator field. The +** aiCur[]/iaColumn[] arrays hold X and all its equivalents. There are 11 +** slots in aiCur[]/aiColumn[] so that means we can look for X plus up to 10 +** other equivalent values. Hence a search for X will return <expr> if X=A1 +** and A1=A2 and A2=A3 and ... and A9=A10 and A10=<expr>. +** +** If there are multiple terms in the WHERE clause of the form "X <op> <expr>" +** then try for the one with no dependencies on <expr> - in other words where +** <expr> is a constant expression of some kind. Only return entries of +** the form "X <op> Y" where Y is a column in another table if no terms of +** the form "X <op> <const-expr>" exist. If no terms with a constant RHS +** exist, try to return a term that does not use WO_EQUIV. +*/ +SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( + WhereClause *pWC, /* The WHERE clause to be searched */ + int iCur, /* Cursor number of LHS */ + int iColumn, /* Column number of LHS */ + Bitmask notReady, /* RHS must not overlap with this mask */ + u32 op, /* Mask of WO_xx values describing operator */ + Index *pIdx /* Must be compatible with this index, if not NULL */ +){ + WhereTerm *pResult = 0; + WhereTerm *p; + WhereScan scan; + + p = whereScanInit(&scan, pWC, iCur, iColumn, op, pIdx); + op &= WO_EQ|WO_IS; + while( p ){ + if( (p->prereqRight & notReady)==0 ){ + if( p->prereqRight==0 && (p->eOperator&op)!=0 ){ + testcase( p->eOperator & WO_IS ); + return p; + } + if( pResult==0 ) pResult = p; + } + p = whereScanNext(&scan); + } + return pResult; +} + /* ** This function searches pList for an entry that matches the iCol-th column ** of index pIdx. @@ -116348,8 +136580,8 @@ static int findIndexCol( && p->iColumn==pIdx->aiColumn[iCol] && p->iTable==iBase ){ - CollSeq *pColl = sqlite3ExprCollSeq(pParse, pList->a[i].pExpr); - if( ALWAYS(pColl) && 0==sqlite3StrICmp(pColl->zName, zColl) ){ + CollSeq *pColl = sqlite3ExprNNCollSeq(pParse, pList->a[i].pExpr); + if( 0==sqlite3StrICmp(pColl->zName, zColl) ){ return i; } } @@ -116358,12 +136590,31 @@ static int findIndexCol( return -1; } +/* +** Return TRUE if the iCol-th column of index pIdx is NOT NULL +*/ +static int indexColumnNotNull(Index *pIdx, int iCol){ + int j; + assert( pIdx!=0 ); + assert( iCol>=0 && iCol<pIdx->nColumn ); + j = pIdx->aiColumn[iCol]; + if( j>=0 ){ + return pIdx->pTable->aCol[j].notNull; + }else if( j==(-1) ){ + return 1; + }else{ + assert( j==(-2) ); + return 0; /* Assume an indexed expression can always yield a NULL */ + + } +} + /* ** Return true if the DISTINCT expression-list passed as the third argument ** is redundant. ** -** A DISTINCT list is redundant if the database contains some subset of -** columns that are unique and non-null. +** A DISTINCT list is redundant if any subset of the columns in the +** DISTINCT list are collectively unique and individually non-null. */ static int isDistinctRedundant( Parse *pParse, /* Parsing context */ @@ -116408,12 +136659,9 @@ static int isDistinctRedundant( for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ if( !IsUniqueIndex(pIdx) ) continue; for(i=0; i<pIdx->nKeyCol; i++){ - i16 iCol = pIdx->aiColumn[i]; - if( 0==findTerm(pWC, iBase, iCol, ~(Bitmask)0, WO_EQ, pIdx) ){ - int iIdxCol = findIndexCol(pParse, pDistinct, iBase, pIdx, i); - if( iIdxCol<0 || pTab->aCol[iCol].notNull==0 ){ - break; - } + if( 0==sqlite3WhereFindTerm(pWC, iBase, i, ~(Bitmask)0, WO_EQ, pIdx) ){ + if( findIndexCol(pParse, pDistinct, iBase, pIdx, i)<0 ) break; + if( indexColumnNotNull(pIdx, i)==0 ) break; } } if( i==pIdx->nKeyCol ){ @@ -116433,6 +136681,51 @@ static LogEst estLog(LogEst N){ return N<=10 ? 0 : sqlite3LogEst(N) - 33; } +/* +** Convert OP_Column opcodes to OP_Copy in previously generated code. +** +** This routine runs over generated VDBE code and translates OP_Column +** opcodes into OP_Copy when the table is being accessed via co-routine +** instead of via table lookup. +** +** If the bIncrRowid parameter is 0, then any OP_Rowid instructions on +** cursor iTabCur are transformed into OP_Null. Or, if bIncrRowid is non-zero, +** then each OP_Rowid is transformed into an instruction to increment the +** value stored in its output register. +*/ +static void translateColumnToCopy( + Parse *pParse, /* Parsing context */ + int iStart, /* Translate from this opcode to the end */ + int iTabCur, /* OP_Column/OP_Rowid references to this table */ + int iRegister, /* The first column is in this register */ + int bIncrRowid /* If non-zero, transform OP_rowid to OP_AddImm(1) */ +){ + Vdbe *v = pParse->pVdbe; + VdbeOp *pOp = sqlite3VdbeGetOp(v, iStart); + int iEnd = sqlite3VdbeCurrentAddr(v); + if( pParse->db->mallocFailed ) return; + for(; iStart<iEnd; iStart++, pOp++){ + if( pOp->p1!=iTabCur ) continue; + if( pOp->opcode==OP_Column ){ + pOp->opcode = OP_Copy; + pOp->p1 = pOp->p2 + iRegister; + pOp->p2 = pOp->p3; + pOp->p3 = 0; + }else if( pOp->opcode==OP_Rowid ){ + if( bIncrRowid ){ + /* Increment the value stored in the P2 operand of the OP_Rowid. */ + pOp->opcode = OP_AddImm; + pOp->p1 = pOp->p2; + pOp->p2 = 1; + }else{ + pOp->opcode = OP_Null; + pOp->p1 = 0; + pOp->p3 = 0; + } + } + } +} + /* ** Two routines for printing the content of an sqlite3_index_info ** structure. Used for testing and debugging only. If neither @@ -116491,11 +136784,21 @@ static int termCanDriveIndex( ){ char aff; if( pTerm->leftCursor!=pSrc->iCursor ) return 0; - if( (pTerm->eOperator & WO_EQ)==0 ) return 0; + if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; + if( (pSrc->fg.jointype & JT_LEFT) + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + && (pTerm->eOperator & WO_IS) + ){ + /* Cannot use an IS term from the WHERE clause as an index driver for + ** the RHS of a LEFT JOIN. Such a term can only be used if it is from + ** the ON clause. */ + return 0; + } if( (pTerm->prereqRight & notReady)!=0 ) return 0; if( pTerm->u.leftColumn<0 ) return 0; aff = pSrc->pTab->aCol[pTerm->u.leftColumn].affinity; if( !sqlite3IndexAffinityOk(pTerm->pExpr, aff) ) return 0; + testcase( pTerm->pExpr->op==TK_IS ); return 1; } #endif @@ -116534,12 +136837,15 @@ static void constructAutomaticIndex( u8 sentWarning = 0; /* True if a warnning has been issued */ Expr *pPartial = 0; /* Partial Index Expression */ int iContinue = 0; /* Jump here to skip excluded rows */ + struct SrcList_item *pTabItem; /* FROM clause term being indexed */ + int addrCounter = 0; /* Address where integer counter is initialized */ + int regBase; /* Array of registers where record is assembled */ /* Generate code to skip over the creation and initialization of the ** transient index on 2nd and subsequent iterations of the loop. */ v = pParse->pVdbe; assert( v!=0 ); - addrInit = sqlite3CodeOnce(pParse); VdbeCoverage(v); + addrInit = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); /* Count the number of columns that will be added to the index ** and used to match WHERE clause constraints */ @@ -116549,11 +136855,16 @@ static void constructAutomaticIndex( pLoop = pLevel->pWLoop; idxCols = 0; for(pTerm=pWC->a; pTerm<pWCEnd; pTerm++){ + Expr *pExpr = pTerm->pExpr; + assert( !ExprHasProperty(pExpr, EP_FromJoin) /* prereq always non-zero */ + || pExpr->iRightJoinTable!=pSrc->iCursor /* for the right-hand */ + || pLoop->prereq!=0 ); /* table of a LEFT JOIN */ if( pLoop->prereq==0 && (pTerm->wtFlags & TERM_VIRTUAL)==0 - && sqlite3ExprIsTableConstant(pTerm->pExpr, pSrc->iCursor) ){ + && !ExprHasProperty(pExpr, EP_FromJoin) + && sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor) ){ pPartial = sqlite3ExprAnd(pParse->db, pPartial, - sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); + sqlite3ExprDup(pParse->db, pExpr, 0)); } if( termCanDriveIndex(pTerm, pSrc, notReady) ){ int iCol = pTerm->u.leftColumn; @@ -116618,7 +136929,7 @@ static void constructAutomaticIndex( idxCols |= cMask; pIdx->aiColumn[n] = pTerm->u.leftColumn; pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); - pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : "BINARY"; + pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; n++; } } @@ -116630,20 +136941,20 @@ static void constructAutomaticIndex( for(i=0; i<mxBitCol; i++){ if( extraCols & MASKBIT(i) ){ pIdx->aiColumn[n] = i; - pIdx->azColl[n] = "BINARY"; + pIdx->azColl[n] = sqlite3StrBINARY; n++; } } if( pSrc->colUsed & MASKBIT(BMS-1) ){ for(i=BMS-1; i<pTable->nCol; i++){ pIdx->aiColumn[n] = i; - pIdx->azColl[n] = "BINARY"; + pIdx->azColl[n] = sqlite3StrBINARY; n++; } } assert( n==nKeyCol ); - pIdx->aiColumn[n] = -1; - pIdx->azColl[n] = "BINARY"; + pIdx->aiColumn[n] = XN_ROWID; + pIdx->azColl[n] = sqlite3StrBINARY; /* Create the automatic index */ assert( pLevel->iIdxCur>=0 ); @@ -116654,18 +136965,39 @@ static void constructAutomaticIndex( /* Fill the automatic index with content */ sqlite3ExprCachePush(pParse); - addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); + pTabItem = &pWC->pWInfo->pTabList->a[pLevel->iFrom]; + if( pTabItem->fg.viaCoroutine ){ + int regYield = pTabItem->regReturn; + addrCounter = sqlite3VdbeAddOp2(v, OP_Integer, 0, 0); + sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); + addrTop = sqlite3VdbeAddOp1(v, OP_Yield, regYield); + VdbeCoverage(v); + VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); + }else{ + addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); + } if( pPartial ){ iContinue = sqlite3VdbeMakeLabel(v); sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); pLoop->wsFlags |= WHERE_PARTIALIDX; } regRecord = sqlite3GetTempReg(pParse); - sqlite3GenerateIndexKey(pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0); + regBase = sqlite3GenerateIndexKey( + pParse, pIdx, pLevel->iTabCur, regRecord, 0, 0, 0, 0 + ); sqlite3VdbeAddOp2(v, OP_IdxInsert, pLevel->iIdxCur, regRecord); sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); if( pPartial ) sqlite3VdbeResolveLabel(v, iContinue); - sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); + if( pTabItem->fg.viaCoroutine ){ + sqlite3VdbeChangeP2(v, addrCounter, regBase+n); + testcase( pParse->db->mallocFailed ); + translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, + pTabItem->regResult, 1); + sqlite3VdbeGoto(v, addrTop); + pTabItem->fg.viaCoroutine = 0; + }else{ + sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); + } sqlite3VdbeChangeP5(v, SQLITE_STMTSTATUS_AUTOINDEX); sqlite3VdbeJumpHere(v, addrTop); sqlite3ReleaseTempReg(pParse, regRecord); @@ -116686,30 +137018,37 @@ end_auto_index_create: ** by passing the pointer returned by this function to sqlite3_free(). */ static sqlite3_index_info *allocateIndexInfo( - Parse *pParse, - WhereClause *pWC, - struct SrcList_item *pSrc, - ExprList *pOrderBy + Parse *pParse, /* The parsing context */ + WhereClause *pWC, /* The WHERE clause being analyzed */ + Bitmask mUnusable, /* Ignore terms with these prereqs */ + struct SrcList_item *pSrc, /* The FROM clause term that is the vtab */ + ExprList *pOrderBy, /* The ORDER BY clause */ + u16 *pmNoOmit /* Mask of terms not to omit */ ){ int i, j; int nTerm; struct sqlite3_index_constraint *pIdxCons; struct sqlite3_index_orderby *pIdxOrderBy; struct sqlite3_index_constraint_usage *pUsage; + struct HiddenIndexInfo *pHidden; WhereTerm *pTerm; int nOrderBy; sqlite3_index_info *pIdxInfo; + u16 mNoOmit = 0; /* Count the number of possible WHERE clause constraints referring ** to this virtual table */ for(i=nTerm=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){ if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); testcase( pTerm->eOperator & WO_IN ); testcase( pTerm->eOperator & WO_ISNULL ); + testcase( pTerm->eOperator & WO_IS ); testcase( pTerm->eOperator & WO_ALL ); - if( (pTerm->eOperator & ~(WO_ISNULL|WO_EQUIV))==0 ) continue; + if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; if( pTerm->wtFlags & TERM_VNULL ) continue; + assert( pTerm->u.leftColumn>=(-1) ); nTerm++; } @@ -116733,7 +137072,7 @@ static sqlite3_index_info *allocateIndexInfo( */ pIdxInfo = sqlite3DbMallocZero(pParse->db, sizeof(*pIdxInfo) + (sizeof(*pIdxCons) + sizeof(*pUsage))*nTerm - + sizeof(*pIdxOrderBy)*nOrderBy ); + + sizeof(*pIdxOrderBy)*nOrderBy + sizeof(*pHidden) ); if( pIdxInfo==0 ){ sqlite3ErrorMsg(pParse, "out of memory"); return 0; @@ -116744,7 +137083,8 @@ static sqlite3_index_info *allocateIndexInfo( ** changing them. We have to do some funky casting in order to ** initialize those fields. */ - pIdxCons = (struct sqlite3_index_constraint*)&pIdxInfo[1]; + pHidden = (struct HiddenIndexInfo*)&pIdxInfo[1]; + pIdxCons = (struct sqlite3_index_constraint*)&pHidden[1]; pIdxOrderBy = (struct sqlite3_index_orderby*)&pIdxCons[nTerm]; pUsage = (struct sqlite3_index_constraint_usage*)&pIdxOrderBy[nOrderBy]; *(int*)&pIdxInfo->nConstraint = nTerm; @@ -116754,30 +137094,53 @@ static sqlite3_index_info *allocateIndexInfo( *(struct sqlite3_index_constraint_usage**)&pIdxInfo->aConstraintUsage = pUsage; + pHidden->pWC = pWC; + pHidden->pParse = pParse; for(i=j=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){ - u8 op; + u16 op; if( pTerm->leftCursor != pSrc->iCursor ) continue; + if( pTerm->prereqRight & mUnusable ) continue; assert( IsPowerOfTwo(pTerm->eOperator & ~WO_EQUIV) ); testcase( pTerm->eOperator & WO_IN ); + testcase( pTerm->eOperator & WO_IS ); testcase( pTerm->eOperator & WO_ISNULL ); testcase( pTerm->eOperator & WO_ALL ); - if( (pTerm->eOperator & ~(WO_ISNULL|WO_EQUIV))==0 ) continue; + if( (pTerm->eOperator & ~(WO_EQUIV))==0 ) continue; if( pTerm->wtFlags & TERM_VNULL ) continue; + assert( pTerm->u.leftColumn>=(-1) ); pIdxCons[j].iColumn = pTerm->u.leftColumn; pIdxCons[j].iTermOffset = i; - op = (u8)pTerm->eOperator & WO_ALL; + op = pTerm->eOperator & WO_ALL; if( op==WO_IN ) op = WO_EQ; - pIdxCons[j].op = op; - /* The direct assignment in the previous line is possible only because - ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The - ** following asserts verify this fact. */ - assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ ); - assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT ); - assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE ); - assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT ); - assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE ); - assert( WO_MATCH==SQLITE_INDEX_CONSTRAINT_MATCH ); - assert( pTerm->eOperator & (WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_MATCH) ); + if( op==WO_AUX ){ + pIdxCons[j].op = pTerm->eMatchOp; + }else if( op & (WO_ISNULL|WO_IS) ){ + if( op==WO_ISNULL ){ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_ISNULL; + }else{ + pIdxCons[j].op = SQLITE_INDEX_CONSTRAINT_IS; + } + }else{ + pIdxCons[j].op = (u8)op; + /* The direct assignment in the previous line is possible only because + ** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The + ** following asserts verify this fact. */ + assert( WO_EQ==SQLITE_INDEX_CONSTRAINT_EQ ); + assert( WO_LT==SQLITE_INDEX_CONSTRAINT_LT ); + assert( WO_LE==SQLITE_INDEX_CONSTRAINT_LE ); + assert( WO_GT==SQLITE_INDEX_CONSTRAINT_GT ); + assert( WO_GE==SQLITE_INDEX_CONSTRAINT_GE ); + assert( pTerm->eOperator&(WO_IN|WO_EQ|WO_LT|WO_LE|WO_GT|WO_GE|WO_AUX) ); + + if( op & (WO_LT|WO_LE|WO_GT|WO_GE) + && sqlite3ExprIsVector(pTerm->pExpr->pRight) + ){ + if( i<16 ) mNoOmit |= (1 << i); + if( op==WO_LT ) pIdxCons[j].op = WO_LE; + if( op==WO_GT ) pIdxCons[j].op = WO_GE; + } + } + j++; } for(i=0; i<nOrderBy; i++){ @@ -116786,6 +137149,7 @@ static sqlite3_index_info *allocateIndexInfo( pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder; } + *pmNoOmit = mNoOmit; return pIdxInfo; } @@ -116805,7 +137169,6 @@ static sqlite3_index_info *allocateIndexInfo( */ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; - int i; int rc; TRACE_IDX_INPUTS(p); @@ -116814,7 +137177,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ if( rc!=SQLITE_OK ){ if( rc==SQLITE_NOMEM ){ - pParse->db->mallocFailed = 1; + sqlite3OomFault(pParse->db); }else if( !pVtab->zErrMsg ){ sqlite3ErrorMsg(pParse, "%s", sqlite3ErrStr(rc)); }else{ @@ -116824,12 +137187,16 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ sqlite3_free(pVtab->zErrMsg); pVtab->zErrMsg = 0; +#if 0 + /* This error is now caught by the caller. + ** Search for "xBestIndex malfunction" below */ for(i=0; i<p->nConstraint; i++){ if( !p->aConstraint[i].usable && p->aConstraintUsage[i].argvIndex>0 ){ sqlite3ErrorMsg(pParse, "table %s: xBestIndex returned an invalid plan", pTab->zName); } } +#endif return pParse->nErr; } @@ -116840,11 +137207,14 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ ** Estimate the location of a particular key among all keys in an ** index. Store the results in aStat as follows: ** -** aStat[0] Est. number of rows less than pVal -** aStat[1] Est. number of rows equal to pVal +** aStat[0] Est. number of rows less than pRec +** aStat[1] Est. number of rows equal to pRec ** ** Return the index of the sample that is the smallest sample that -** is greater than or equal to pRec. +** is greater than or equal to pRec. Note that this index is not an index +** into the aSample[] array - it is an index into a virtual set of samples +** based on the contents of aSample[] and the number of fields in record +** pRec. */ static int whereKeyStats( Parse *pParse, /* Database connection */ @@ -116855,67 +137225,158 @@ static int whereKeyStats( ){ IndexSample *aSample = pIdx->aSample; int iCol; /* Index of required stats in anEq[] etc. */ + int i; /* Index of first sample >= pRec */ + int iSample; /* Smallest sample larger than or equal to pRec */ int iMin = 0; /* Smallest sample not yet tested */ - int i = pIdx->nSample; /* Smallest sample larger than or equal to pRec */ int iTest; /* Next sample to test */ int res; /* Result of comparison operation */ + int nField; /* Number of fields in pRec */ + tRowcnt iLower = 0; /* anLt[] + anEq[] of largest sample pRec is > */ #ifndef SQLITE_DEBUG UNUSED_PARAMETER( pParse ); #endif assert( pRec!=0 ); - iCol = pRec->nField - 1; assert( pIdx->nSample>0 ); - assert( pRec->nField>0 && iCol<pIdx->nSampleCol ); + assert( pRec->nField>0 && pRec->nField<=pIdx->nSampleCol ); + + /* Do a binary search to find the first sample greater than or equal + ** to pRec. If pRec contains a single field, the set of samples to search + ** is simply the aSample[] array. If the samples in aSample[] contain more + ** than one fields, all fields following the first are ignored. + ** + ** If pRec contains N fields, where N is more than one, then as well as the + ** samples in aSample[] (truncated to N fields), the search also has to + ** consider prefixes of those samples. For example, if the set of samples + ** in aSample is: + ** + ** aSample[0] = (a, 5) + ** aSample[1] = (a, 10) + ** aSample[2] = (b, 5) + ** aSample[3] = (c, 100) + ** aSample[4] = (c, 105) + ** + ** Then the search space should ideally be the samples above and the + ** unique prefixes [a], [b] and [c]. But since that is hard to organize, + ** the code actually searches this set: + ** + ** 0: (a) + ** 1: (a, 5) + ** 2: (a, 10) + ** 3: (a, 10) + ** 4: (b) + ** 5: (b, 5) + ** 6: (c) + ** 7: (c, 100) + ** 8: (c, 105) + ** 9: (c, 105) + ** + ** For each sample in the aSample[] array, N samples are present in the + ** effective sample array. In the above, samples 0 and 1 are based on + ** sample aSample[0]. Samples 2 and 3 on aSample[1] etc. + ** + ** Often, sample i of each block of N effective samples has (i+1) fields. + ** Except, each sample may be extended to ensure that it is greater than or + ** equal to the previous sample in the array. For example, in the above, + ** sample 2 is the first sample of a block of N samples, so at first it + ** appears that it should be 1 field in size. However, that would make it + ** smaller than sample 1, so the binary search would not work. As a result, + ** it is extended to two fields. The duplicates that this creates do not + ** cause any problems. + */ + nField = pRec->nField; + iCol = 0; + iSample = pIdx->nSample * nField; do{ - iTest = (iMin+i)/2; - res = sqlite3VdbeRecordCompare(aSample[iTest].n, aSample[iTest].p, pRec); - if( res<0 ){ - iMin = iTest+1; + int iSamp; /* Index in aSample[] of test sample */ + int n; /* Number of fields in test sample */ + + iTest = (iMin+iSample)/2; + iSamp = iTest / nField; + if( iSamp>0 ){ + /* The proposed effective sample is a prefix of sample aSample[iSamp]. + ** Specifically, the shortest prefix of at least (1 + iTest%nField) + ** fields that is greater than the previous effective sample. */ + for(n=(iTest % nField) + 1; n<nField; n++){ + if( aSample[iSamp-1].anLt[n-1]!=aSample[iSamp].anLt[n-1] ) break; + } }else{ - i = iTest; + n = iTest + 1; } - }while( res && iMin<i ); + + pRec->nField = n; + res = sqlite3VdbeRecordCompare(aSample[iSamp].n, aSample[iSamp].p, pRec); + if( res<0 ){ + iLower = aSample[iSamp].anLt[n-1] + aSample[iSamp].anEq[n-1]; + iMin = iTest+1; + }else if( res==0 && n<nField ){ + iLower = aSample[iSamp].anLt[n-1]; + iMin = iTest+1; + res = -1; + }else{ + iSample = iTest; + iCol = n-1; + } + }while( res && iMin<iSample ); + i = iSample / nField; #ifdef SQLITE_DEBUG /* The following assert statements check that the binary search code ** above found the right answer. This block serves no purpose other ** than to invoke the asserts. */ - if( res==0 ){ - /* If (res==0) is true, then sample $i must be equal to pRec */ - assert( i<pIdx->nSample ); - assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) - || pParse->db->mallocFailed ); - }else{ - /* Otherwise, pRec must be smaller than sample $i and larger than - ** sample ($i-1). */ - assert( i==pIdx->nSample - || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 - || pParse->db->mallocFailed ); - assert( i==0 - || sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 - || pParse->db->mallocFailed ); + if( pParse->db->mallocFailed==0 ){ + if( res==0 ){ + /* If (res==0) is true, then pRec must be equal to sample i. */ + assert( i<pIdx->nSample ); + assert( iCol==nField-1 ); + pRec->nField = nField; + assert( 0==sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec) + || pParse->db->mallocFailed + ); + }else{ + /* Unless i==pIdx->nSample, indicating that pRec is larger than + ** all samples in the aSample[] array, pRec must be smaller than the + ** (iCol+1) field prefix of sample i. */ + assert( i<=pIdx->nSample && i>=0 ); + pRec->nField = iCol+1; + assert( i==pIdx->nSample + || sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)>0 + || pParse->db->mallocFailed ); + + /* if i==0 and iCol==0, then record pRec is smaller than all samples + ** in the aSample[] array. Otherwise, if (iCol>0) then pRec must + ** be greater than or equal to the (iCol) field prefix of sample i. + ** If (i>0), then pRec must also be greater than sample (i-1). */ + if( iCol>0 ){ + pRec->nField = iCol; + assert( sqlite3VdbeRecordCompare(aSample[i].n, aSample[i].p, pRec)<=0 + || pParse->db->mallocFailed ); + } + if( i>0 ){ + pRec->nField = nField; + assert( sqlite3VdbeRecordCompare(aSample[i-1].n, aSample[i-1].p, pRec)<0 + || pParse->db->mallocFailed ); + } + } } #endif /* ifdef SQLITE_DEBUG */ - /* At this point, aSample[i] is the first sample that is greater than - ** or equal to pVal. Or if i==pIdx->nSample, then all samples are less - ** than pVal. If aSample[i]==pVal, then res==0. - */ if( res==0 ){ + /* Record pRec is equal to sample i */ + assert( iCol==nField-1 ); aStat[0] = aSample[i].anLt[iCol]; aStat[1] = aSample[i].anEq[iCol]; }else{ - tRowcnt iLower, iUpper, iGap; - if( i==0 ){ - iLower = 0; - iUpper = aSample[0].anLt[iCol]; + /* At this point, the (iCol+1) field prefix of aSample[i] is the first + ** sample that is greater than pRec. Or, if i==pIdx->nSample then pRec + ** is larger than all samples in the array. */ + tRowcnt iUpper, iGap; + if( i>=pIdx->nSample ){ + iUpper = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]); }else{ - i64 nRow0 = sqlite3LogEstToInt(pIdx->aiRowLogEst[0]); - iUpper = i>=pIdx->nSample ? nRow0 : aSample[i].anLt[iCol]; - iLower = aSample[i-1].anEq[iCol] + aSample[i-1].anLt[iCol]; + iUpper = aSample[i].anLt[iCol]; } - aStat[1] = pIdx->aAvgEq[iCol]; + if( iLower>=iUpper ){ iGap = 0; }else{ @@ -116927,7 +137388,11 @@ static int whereKeyStats( iGap = iGap/3; } aStat[0] = iLower + iGap; + aStat[1] = pIdx->aAvgEq[nField-1]; } + + /* Restore the pRec->nField value before returning. */ + pRec->nField = nField; return i; } #endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ @@ -116955,6 +137420,21 @@ static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){ return nRet; } + +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +/* +** Return the affinity for a single column of an index. +*/ +SQLITE_PRIVATE char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ + assert( iCol>=0 && iCol<pIdx->nColumn ); + if( !pIdx->zColAff ){ + if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; + } + return pIdx->zColAff[iCol]; +} +#endif + + #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 /* ** This function is called to estimate the number of rows visited by a @@ -117004,8 +137484,7 @@ static int whereRangeSkipScanEst( int nLower = -1; int nUpper = p->nSample+1; int rc = SQLITE_OK; - int iCol = p->aiColumn[nEq]; - u8 aff = iCol>=0 ? p->pTable->aCol[iCol].affinity : SQLITE_AFF_INTEGER; + u8 aff = sqlite3IndexColumnAffinity(db, p, nEq); CollSeq *pColl; sqlite3_value *p1 = 0; /* Value extracted from pLower */ @@ -117123,7 +137602,8 @@ static int whereRangeScanEst( if( nEq==pBuilder->nRecValid ){ UnpackedRecord *pRec = pBuilder->pRec; tRowcnt a[2]; - u8 aff; + int nBtm = pLoop->u.btree.nBtm; + int nTop = pLoop->u.btree.nTop; /* Variable iLower will be set to the estimate of the number of rows in ** the index that are less than the lower bound of the range query. The @@ -117153,11 +137633,6 @@ static int whereRangeScanEst( testcase( pRec->nField!=pBuilder->nRecValid ); pRec->nField = pBuilder->nRecValid; } - if( nEq==p->nKeyCol ){ - aff = SQLITE_AFF_INTEGER; - }else{ - aff = p->pTable->aCol[p->aiColumn[nEq]].affinity; - } /* Determine iLower and iUpper using ($P) only. */ if( nEq==0 ){ iLower = 0; @@ -117176,17 +137651,20 @@ static int whereRangeScanEst( if( p->aSortOrder[nEq] ){ /* The roles of pLower and pUpper are swapped for a DESC index */ SWAP(WhereTerm*, pLower, pUpper); + SWAP(int, nBtm, nTop); } /* If possible, improve on the iLower estimate using ($P:$L). */ if( pLower ){ - int bOk; /* True if value is extracted from pExpr */ + int n; /* Values extracted from pExpr */ Expr *pExpr = pLower->pExpr->pRight; - rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, aff, nEq, &bOk); - if( rc==SQLITE_OK && bOk ){ + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nBtm, nEq, &n); + if( rc==SQLITE_OK && n ){ tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); iLwrIdx = whereKeyStats(pParse, p, pRec, 0, a); - iNew = a[0] + ((pLower->eOperator & (WO_GT|WO_LE)) ? a[1] : 0); + iNew = a[0] + ((pLower->eOperator & mask) ? a[1] : 0); if( iNew>iLower ) iLower = iNew; nOut--; pLower = 0; @@ -117195,13 +137673,15 @@ static int whereRangeScanEst( /* If possible, improve on the iUpper estimate using ($P:$U). */ if( pUpper ){ - int bOk; /* True if value is extracted from pExpr */ + int n; /* Values extracted from pExpr */ Expr *pExpr = pUpper->pExpr->pRight; - rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, aff, nEq, &bOk); - if( rc==SQLITE_OK && bOk ){ + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, nTop, nEq, &n); + if( rc==SQLITE_OK && n ){ tRowcnt iNew; + u16 mask = WO_GT|WO_LE; + if( sqlite3ExprVectorSize(pExpr)>n ) mask = (WO_LE|WO_LT); iUprIdx = whereKeyStats(pParse, p, pRec, 1, a); - iNew = a[0] + ((pUpper->eOperator & (WO_GT|WO_LE)) ? a[1] : 0); + iNew = a[0] + ((pUpper->eOperator & mask) ? a[1] : 0); if( iNew<iUpper ) iUpper = iNew; nOut--; pUpper = 0; @@ -117291,7 +137771,6 @@ static int whereEqualScanEst( Index *p = pBuilder->pNew->u.btree.pIndex; int nEq = pBuilder->pNew->u.btree.nEq; UnpackedRecord *pRec = pBuilder->pRec; - u8 aff; /* Column affinity */ int rc; /* Subfunction return code */ tRowcnt a[2]; /* Statistics */ int bOk; @@ -117315,15 +137794,15 @@ static int whereEqualScanEst( return SQLITE_OK; } - aff = p->pTable->aCol[p->aiColumn[nEq-1]].affinity; - rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, aff, nEq-1, &bOk); + rc = sqlite3Stat4ProbeSetValue(pParse, p, &pRec, pExpr, 1, nEq-1, &bOk); pBuilder->pRec = pRec; if( rc!=SQLITE_OK ) return rc; if( bOk==0 ) return SQLITE_NOTFOUND; pBuilder->nRecValid = nEq; whereKeyStats(pParse, p, pRec, 0, a); - WHERETRACE(0x10,("equality scan regions: %d\n", (int)a[1])); + WHERETRACE(0x10,("equality scan regions %s(%d): %d\n", + p->zName, nEq-1, (int)a[1])); *pnRow = a[1]; return rc; @@ -117379,1410 +137858,6 @@ static int whereInScanEst( } #endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ -/* -** Disable a term in the WHERE clause. Except, do not disable the term -** if it controls a LEFT OUTER JOIN and it did not originate in the ON -** or USING clause of that join. -** -** Consider the term t2.z='ok' in the following queries: -** -** (1) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x WHERE t2.z='ok' -** (2) SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.x AND t2.z='ok' -** (3) SELECT * FROM t1, t2 WHERE t1.a=t2.x AND t2.z='ok' -** -** The t2.z='ok' is disabled in the in (2) because it originates -** in the ON clause. The term is disabled in (3) because it is not part -** of a LEFT OUTER JOIN. In (1), the term is not disabled. -** -** Disabling a term causes that term to not be tested in the inner loop -** of the join. Disabling is an optimization. When terms are satisfied -** by indices, we disable them to prevent redundant tests in the inner -** loop. We would get the correct results if nothing were ever disabled, -** but joins might run a little slower. The trick is to disable as much -** as we can without disabling too much. If we disabled in (1), we'd get -** the wrong answer. See ticket #813. -*/ -static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ - if( pTerm - && (pTerm->wtFlags & TERM_CODED)==0 - && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) - && (pLevel->notReady & pTerm->prereqAll)==0 - ){ - pTerm->wtFlags |= TERM_CODED; - if( pTerm->iParent>=0 ){ - WhereTerm *pOther = &pTerm->pWC->a[pTerm->iParent]; - if( (--pOther->nChild)==0 ){ - disableTerm(pLevel, pOther); - } - } - } -} - -/* -** Code an OP_Affinity opcode to apply the column affinity string zAff -** to the n registers starting at base. -** -** As an optimization, SQLITE_AFF_NONE entries (which are no-ops) at the -** beginning and end of zAff are ignored. If all entries in zAff are -** SQLITE_AFF_NONE, then no code gets generated. -** -** This routine makes its own copy of zAff so that the caller is free -** to modify zAff after this routine returns. -*/ -static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ - Vdbe *v = pParse->pVdbe; - if( zAff==0 ){ - assert( pParse->db->mallocFailed ); - return; - } - assert( v!=0 ); - - /* Adjust base and n to skip over SQLITE_AFF_NONE entries at the beginning - ** and end of the affinity string. - */ - while( n>0 && zAff[0]==SQLITE_AFF_NONE ){ - n--; - base++; - zAff++; - } - while( n>1 && zAff[n-1]==SQLITE_AFF_NONE ){ - n--; - } - - /* Code the OP_Affinity opcode if there is anything left to do. */ - if( n>0 ){ - sqlite3VdbeAddOp2(v, OP_Affinity, base, n); - sqlite3VdbeChangeP4(v, -1, zAff, n); - sqlite3ExprCacheAffinityChange(pParse, base, n); - } -} - - -/* -** Generate code for a single equality term of the WHERE clause. An equality -** term can be either X=expr or X IN (...). pTerm is the term to be -** coded. -** -** The current value for the constraint is left in register iReg. -** -** For a constraint of the form X=expr, the expression is evaluated and its -** result is left on the stack. For constraints of the form X IN (...) -** this routine sets up a loop that will iterate over all values of X. -*/ -static int codeEqualityTerm( - Parse *pParse, /* The parsing context */ - WhereTerm *pTerm, /* The term of the WHERE clause to be coded */ - WhereLevel *pLevel, /* The level of the FROM clause we are working on */ - int iEq, /* Index of the equality term within this level */ - int bRev, /* True for reverse-order IN operations */ - int iTarget /* Attempt to leave results in this register */ -){ - Expr *pX = pTerm->pExpr; - Vdbe *v = pParse->pVdbe; - int iReg; /* Register holding results */ - - assert( iTarget>0 ); - if( pX->op==TK_EQ ){ - iReg = sqlite3ExprCodeTarget(pParse, pX->pRight, iTarget); - }else if( pX->op==TK_ISNULL ){ - iReg = iTarget; - sqlite3VdbeAddOp2(v, OP_Null, 0, iReg); -#ifndef SQLITE_OMIT_SUBQUERY - }else{ - int eType; - int iTab; - struct InLoop *pIn; - WhereLoop *pLoop = pLevel->pWLoop; - - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 - && pLoop->u.btree.pIndex!=0 - && pLoop->u.btree.pIndex->aSortOrder[iEq] - ){ - testcase( iEq==0 ); - testcase( bRev ); - bRev = !bRev; - } - assert( pX->op==TK_IN ); - iReg = iTarget; - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0); - if( eType==IN_INDEX_INDEX_DESC ){ - testcase( bRev ); - bRev = !bRev; - } - iTab = pX->iTable; - sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); - VdbeCoverageIf(v, bRev); - VdbeCoverageIf(v, !bRev); - assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 ); - pLoop->wsFlags |= WHERE_IN_ABLE; - if( pLevel->u.in.nIn==0 ){ - pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - } - pLevel->u.in.nIn++; - pLevel->u.in.aInLoop = - sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, - sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); - pIn = pLevel->u.in.aInLoop; - if( pIn ){ - pIn += pLevel->u.in.nIn - 1; - pIn->iCur = iTab; - if( eType==IN_INDEX_ROWID ){ - pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iReg); - }else{ - pIn->addrInTop = sqlite3VdbeAddOp3(v, OP_Column, iTab, 0, iReg); - } - pIn->eEndLoopOp = bRev ? OP_PrevIfOpen : OP_NextIfOpen; - sqlite3VdbeAddOp1(v, OP_IsNull, iReg); VdbeCoverage(v); - }else{ - pLevel->u.in.nIn = 0; - } -#endif - } - disableTerm(pLevel, pTerm); - return iReg; -} - -/* -** Generate code that will evaluate all == and IN constraints for an -** index scan. -** -** For example, consider table t1(a,b,c,d,e,f) with index i1(a,b,c). -** Suppose the WHERE clause is this: a==5 AND b IN (1,2,3) AND c>5 AND c<10 -** The index has as many as three equality constraints, but in this -** example, the third "c" value is an inequality. So only two -** constraints are coded. This routine will generate code to evaluate -** a==5 and b IN (1,2,3). The current values for a and b will be stored -** in consecutive registers and the index of the first register is returned. -** -** In the example above nEq==2. But this subroutine works for any value -** of nEq including 0. If nEq==0, this routine is nearly a no-op. -** The only thing it does is allocate the pLevel->iMem memory cell and -** compute the affinity string. -** -** The nExtraReg parameter is 0 or 1. It is 0 if all WHERE clause constraints -** are == or IN and are covered by the nEq. nExtraReg is 1 if there is -** an inequality constraint (such as the "c>=5 AND c<10" in the example) that -** occurs after the nEq quality constraints. -** -** This routine allocates a range of nEq+nExtraReg memory cells and returns -** the index of the first memory cell in that range. The code that -** calls this routine will use that memory range to store keys for -** start and termination conditions of the loop. -** key value of the loop. If one or more IN operators appear, then -** this routine allocates an additional nEq memory cells for internal -** use. -** -** Before returning, *pzAff is set to point to a buffer containing a -** copy of the column affinity string of the index allocated using -** sqlite3DbMalloc(). Except, entries in the copy of the string associated -** with equality constraints that use NONE affinity are set to -** SQLITE_AFF_NONE. This is to deal with SQL such as the following: -** -** CREATE TABLE t1(a TEXT PRIMARY KEY, b); -** SELECT ... FROM t1 AS t2, t1 WHERE t1.a = t2.b; -** -** In the example above, the index on t1(a) has TEXT affinity. But since -** the right hand side of the equality constraint (t2.b) has NONE affinity, -** no conversion should be attempted before using a t2.b value as part of -** a key to search the index. Hence the first byte in the returned affinity -** string in this example would be set to SQLITE_AFF_NONE. -*/ -static int codeAllEqualityTerms( - Parse *pParse, /* Parsing context */ - WhereLevel *pLevel, /* Which nested loop of the FROM we are coding */ - int bRev, /* Reverse the order of IN operators */ - int nExtraReg, /* Number of extra registers to allocate */ - char **pzAff /* OUT: Set to point to affinity string */ -){ - u16 nEq; /* The number of == or IN constraints to code */ - u16 nSkip; /* Number of left-most columns to skip */ - Vdbe *v = pParse->pVdbe; /* The vm under construction */ - Index *pIdx; /* The index being used for this loop */ - WhereTerm *pTerm; /* A single constraint term */ - WhereLoop *pLoop; /* The WhereLoop object */ - int j; /* Loop counter */ - int regBase; /* Base register */ - int nReg; /* Number of registers to allocate */ - char *zAff; /* Affinity string to return */ - - /* This module is only called on query plans that use an index. */ - pLoop = pLevel->pWLoop; - assert( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 ); - nEq = pLoop->u.btree.nEq; - nSkip = pLoop->nSkip; - pIdx = pLoop->u.btree.pIndex; - assert( pIdx!=0 ); - - /* Figure out how many memory cells we will need then allocate them. - */ - regBase = pParse->nMem + 1; - nReg = pLoop->u.btree.nEq + nExtraReg; - pParse->nMem += nReg; - - zAff = sqlite3DbStrDup(pParse->db, sqlite3IndexAffinityStr(v, pIdx)); - if( !zAff ){ - pParse->db->mallocFailed = 1; - } - - if( nSkip ){ - int iIdxCur = pLevel->iIdxCur; - sqlite3VdbeAddOp1(v, (bRev?OP_Last:OP_Rewind), iIdxCur); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - VdbeComment((v, "begin skip-scan on %s", pIdx->zName)); - j = sqlite3VdbeAddOp0(v, OP_Goto); - pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT), - iIdxCur, 0, regBase, nSkip); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - sqlite3VdbeJumpHere(v, j); - for(j=0; j<nSkip; j++){ - sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, j, regBase+j); - assert( pIdx->aiColumn[j]>=0 ); - VdbeComment((v, "%s", pIdx->pTable->aCol[pIdx->aiColumn[j]].zName)); - } - } - - /* Evaluate the equality constraints - */ - assert( zAff==0 || (int)strlen(zAff)>=nEq ); - for(j=nSkip; j<nEq; j++){ - int r1; - pTerm = pLoop->aLTerm[j]; - assert( pTerm!=0 ); - /* The following testcase is true for indices with redundant columns. - ** Ex: CREATE INDEX i1 ON t1(a,b,a); SELECT * FROM t1 WHERE a=0 AND b=0; */ - testcase( (pTerm->wtFlags & TERM_CODED)!=0 ); - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - r1 = codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, regBase+j); - if( r1!=regBase+j ){ - if( nReg==1 ){ - sqlite3ReleaseTempReg(pParse, regBase); - regBase = r1; - }else{ - sqlite3VdbeAddOp2(v, OP_SCopy, r1, regBase+j); - } - } - testcase( pTerm->eOperator & WO_ISNULL ); - testcase( pTerm->eOperator & WO_IN ); - if( (pTerm->eOperator & (WO_ISNULL|WO_IN))==0 ){ - Expr *pRight = pTerm->pExpr->pRight; - if( sqlite3ExprCanBeNull(pRight) ){ - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+j, pLevel->addrBrk); - VdbeCoverage(v); - } - if( zAff ){ - if( sqlite3CompareAffinity(pRight, zAff[j])==SQLITE_AFF_NONE ){ - zAff[j] = SQLITE_AFF_NONE; - } - if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ - zAff[j] = SQLITE_AFF_NONE; - } - } - } - } - *pzAff = zAff; - return regBase; -} - -#ifndef SQLITE_OMIT_EXPLAIN -/* -** This routine is a helper for explainIndexRange() below -** -** pStr holds the text of an expression that we are building up one term -** at a time. This routine adds a new term to the end of the expression. -** Terms are separated by AND so add the "AND" text for second and subsequent -** terms only. -*/ -static void explainAppendTerm( - StrAccum *pStr, /* The text expression being built */ - int iTerm, /* Index of this term. First is zero */ - const char *zColumn, /* Name of the column */ - const char *zOp /* Name of the operator */ -){ - if( iTerm ) sqlite3StrAccumAppend(pStr, " AND ", 5); - sqlite3StrAccumAppendAll(pStr, zColumn); - sqlite3StrAccumAppend(pStr, zOp, 1); - sqlite3StrAccumAppend(pStr, "?", 1); -} - -/* -** Argument pLevel describes a strategy for scanning table pTab. This -** function appends text to pStr that describes the subset of table -** rows scanned by the strategy in the form of an SQL expression. -** -** For example, if the query: -** -** SELECT * FROM t1 WHERE a=1 AND b>2; -** -** is run and there is an index on (a, b), then this function returns a -** string similar to: -** -** "a=? AND b>?" -*/ -static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop, Table *pTab){ - Index *pIndex = pLoop->u.btree.pIndex; - u16 nEq = pLoop->u.btree.nEq; - u16 nSkip = pLoop->nSkip; - int i, j; - Column *aCol = pTab->aCol; - i16 *aiColumn = pIndex->aiColumn; - - if( nEq==0 && (pLoop->wsFlags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))==0 ) return; - sqlite3StrAccumAppend(pStr, " (", 2); - for(i=0; i<nEq; i++){ - char *z = aiColumn[i] < 0 ? "rowid" : aCol[aiColumn[i]].zName; - if( i>=nSkip ){ - explainAppendTerm(pStr, i, z, "="); - }else{ - if( i ) sqlite3StrAccumAppend(pStr, " AND ", 5); - sqlite3XPrintf(pStr, 0, "ANY(%s)", z); - } - } - - j = i; - if( pLoop->wsFlags&WHERE_BTM_LIMIT ){ - char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; - explainAppendTerm(pStr, i++, z, ">"); - } - if( pLoop->wsFlags&WHERE_TOP_LIMIT ){ - char *z = aiColumn[j] < 0 ? "rowid" : aCol[aiColumn[j]].zName; - explainAppendTerm(pStr, i, z, "<"); - } - sqlite3StrAccumAppend(pStr, ")", 1); -} - -/* -** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN -** command, or if either SQLITE_DEBUG or SQLITE_ENABLE_STMT_SCANSTATUS was -** defined at compile-time. If it is not a no-op, a single OP_Explain opcode -** is added to the output to describe the table scan strategy in pLevel. -** -** If an OP_Explain opcode is added to the VM, its address is returned. -** Otherwise, if no OP_Explain is coded, zero is returned. -*/ -static int explainOneScan( - Parse *pParse, /* Parse context */ - SrcList *pTabList, /* Table list this loop refers to */ - WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ - int iLevel, /* Value for "level" column of output */ - int iFrom, /* Value for "from" column of output */ - u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ -){ - int ret = 0; -#if !defined(SQLITE_DEBUG) && !defined(SQLITE_ENABLE_STMT_SCANSTATUS) - if( pParse->explain==2 ) -#endif - { - struct SrcList_item *pItem = &pTabList->a[pLevel->iFrom]; - Vdbe *v = pParse->pVdbe; /* VM being constructed */ - sqlite3 *db = pParse->db; /* Database handle */ - int iId = pParse->iSelectId; /* Select id (left-most output column) */ - int isSearch; /* True for a SEARCH. False for SCAN. */ - WhereLoop *pLoop; /* The controlling WhereLoop object */ - u32 flags; /* Flags that describe this loop */ - char *zMsg; /* Text to add to EQP output */ - StrAccum str; /* EQP output string */ - char zBuf[100]; /* Initial space for EQP output string */ - - pLoop = pLevel->pWLoop; - flags = pLoop->wsFlags; - if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_ONETABLE_ONLY) ) return 0; - - isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 - || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) - || (wctrlFlags&(WHERE_ORDERBY_MIN|WHERE_ORDERBY_MAX)); - - sqlite3StrAccumInit(&str, zBuf, sizeof(zBuf), SQLITE_MAX_LENGTH); - str.db = db; - sqlite3StrAccumAppendAll(&str, isSearch ? "SEARCH" : "SCAN"); - if( pItem->pSelect ){ - sqlite3XPrintf(&str, 0, " SUBQUERY %d", pItem->iSelectId); - }else{ - sqlite3XPrintf(&str, 0, " TABLE %s", pItem->zName); - } - - if( pItem->zAlias ){ - sqlite3XPrintf(&str, 0, " AS %s", pItem->zAlias); - } - if( (flags & (WHERE_IPK|WHERE_VIRTUALTABLE))==0 ){ - const char *zFmt = 0; - Index *pIdx; - - assert( pLoop->u.btree.pIndex!=0 ); - pIdx = pLoop->u.btree.pIndex; - assert( !(flags&WHERE_AUTO_INDEX) || (flags&WHERE_IDX_ONLY) ); - if( !HasRowid(pItem->pTab) && IsPrimaryKeyIndex(pIdx) ){ - if( isSearch ){ - zFmt = "PRIMARY KEY"; - } - }else if( flags & WHERE_PARTIALIDX ){ - zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; - }else if( flags & WHERE_AUTO_INDEX ){ - zFmt = "AUTOMATIC COVERING INDEX"; - }else if( flags & WHERE_IDX_ONLY ){ - zFmt = "COVERING INDEX %s"; - }else{ - zFmt = "INDEX %s"; - } - if( zFmt ){ - sqlite3StrAccumAppend(&str, " USING ", 7); - sqlite3XPrintf(&str, 0, zFmt, pIdx->zName); - explainIndexRange(&str, pLoop, pItem->pTab); - } - }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ - const char *zRange; - if( flags&(WHERE_COLUMN_EQ|WHERE_COLUMN_IN) ){ - zRange = "(rowid=?)"; - }else if( (flags&WHERE_BOTH_LIMIT)==WHERE_BOTH_LIMIT ){ - zRange = "(rowid>? AND rowid<?)"; - }else if( flags&WHERE_BTM_LIMIT ){ - zRange = "(rowid>?)"; - }else{ - assert( flags&WHERE_TOP_LIMIT); - zRange = "(rowid<?)"; - } - sqlite3StrAccumAppendAll(&str, " USING INTEGER PRIMARY KEY "); - sqlite3StrAccumAppendAll(&str, zRange); - } -#ifndef SQLITE_OMIT_VIRTUALTABLE - else if( (flags & WHERE_VIRTUALTABLE)!=0 ){ - sqlite3XPrintf(&str, 0, " VIRTUAL TABLE INDEX %d:%s", - pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); - } -#endif -#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS - if( pLoop->nOut>=10 ){ - sqlite3XPrintf(&str, 0, " (~%llu rows)", sqlite3LogEstToInt(pLoop->nOut)); - }else{ - sqlite3StrAccumAppend(&str, " (~1 row)", 9); - } -#endif - zMsg = sqlite3StrAccumFinish(&str); - ret = sqlite3VdbeAddOp4(v, OP_Explain, iId, iLevel, iFrom, zMsg,P4_DYNAMIC); - } - return ret; -} -#else -# define explainOneScan(u,v,w,x,y,z) 0 -#endif /* SQLITE_OMIT_EXPLAIN */ - -#ifdef SQLITE_ENABLE_STMT_SCANSTATUS -/* -** Configure the VM passed as the first argument with an -** sqlite3_stmt_scanstatus() entry corresponding to the scan used to -** implement level pLvl. Argument pSrclist is a pointer to the FROM -** clause that the scan reads data from. -** -** If argument addrExplain is not 0, it must be the address of an -** OP_Explain instruction that describes the same loop. -*/ -static void addScanStatus( - Vdbe *v, /* Vdbe to add scanstatus entry to */ - SrcList *pSrclist, /* FROM clause pLvl reads data from */ - WhereLevel *pLvl, /* Level to add scanstatus() entry for */ - int addrExplain /* Address of OP_Explain (or 0) */ -){ - const char *zObj = 0; - WhereLoop *pLoop = pLvl->pWLoop; - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)==0 && pLoop->u.btree.pIndex!=0 ){ - zObj = pLoop->u.btree.pIndex->zName; - }else{ - zObj = pSrclist->a[pLvl->iFrom].zName; - } - sqlite3VdbeScanStatus( - v, addrExplain, pLvl->addrBody, pLvl->addrVisit, pLoop->nOut, zObj - ); -} -#else -# define addScanStatus(a, b, c, d) ((void)d) -#endif - - - -/* -** Generate code for the start of the iLevel-th loop in the WHERE clause -** implementation described by pWInfo. -*/ -static Bitmask codeOneLoopStart( - WhereInfo *pWInfo, /* Complete information about the WHERE clause */ - int iLevel, /* Which level of pWInfo->a[] should be coded */ - Bitmask notReady /* Which tables are currently available */ -){ - int j, k; /* Loop counters */ - int iCur; /* The VDBE cursor for the table */ - int addrNxt; /* Where to jump to continue with the next IN case */ - int omitTable; /* True if we use the index only */ - int bRev; /* True if we need to scan in reverse order */ - WhereLevel *pLevel; /* The where level to be coded */ - WhereLoop *pLoop; /* The WhereLoop object being coded */ - WhereClause *pWC; /* Decomposition of the entire WHERE clause */ - WhereTerm *pTerm; /* A WHERE clause term */ - Parse *pParse; /* Parsing context */ - sqlite3 *db; /* Database connection */ - Vdbe *v; /* The prepared stmt under constructions */ - struct SrcList_item *pTabItem; /* FROM clause term being coded */ - int addrBrk; /* Jump here to break out of the loop */ - int addrCont; /* Jump here to continue with next cycle */ - int iRowidReg = 0; /* Rowid is stored in this register, if not zero */ - int iReleaseReg = 0; /* Temp register to free before returning */ - - pParse = pWInfo->pParse; - v = pParse->pVdbe; - pWC = &pWInfo->sWC; - db = pParse->db; - pLevel = &pWInfo->a[iLevel]; - pLoop = pLevel->pWLoop; - pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; - iCur = pTabItem->iCursor; - pLevel->notReady = notReady & ~getMask(&pWInfo->sMaskSet, iCur); - bRev = (pWInfo->revMask>>iLevel)&1; - omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_FORCE_TABLE)==0; - VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); - - /* Create labels for the "break" and "continue" instructions - ** for the current loop. Jump to addrBrk to break out of a loop. - ** Jump to cont to go immediately to the next iteration of the - ** loop. - ** - ** When there is an IN operator, we also have a "addrNxt" label that - ** means to continue with the next IN value combination. When - ** there are no IN operators in the constraints, the "addrNxt" label - ** is the same as "addrBrk". - */ - addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); - - /* If this is the right table of a LEFT OUTER JOIN, allocate and - ** initialize a memory cell that records if this table matches any - ** row of the left table of the join. - */ - if( pLevel->iFrom>0 && (pTabItem[0].jointype & JT_LEFT)!=0 ){ - pLevel->iLeftJoin = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLeftJoin); - VdbeComment((v, "init LEFT JOIN no-match flag")); - } - - /* Special case of a FROM clause subquery implemented as a co-routine */ - if( pTabItem->viaCoroutine ){ - int regYield = pTabItem->regReturn; - sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, pTabItem->addrFillSub); - pLevel->p2 = sqlite3VdbeAddOp2(v, OP_Yield, regYield, addrBrk); - VdbeCoverage(v); - VdbeComment((v, "next row of \"%s\"", pTabItem->pTab->zName)); - pLevel->op = OP_Goto; - }else - -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( (pLoop->wsFlags & WHERE_VIRTUALTABLE)!=0 ){ - /* Case 1: The table is a virtual-table. Use the VFilter and VNext - ** to access the data. - */ - int iReg; /* P3 Value for OP_VFilter */ - int addrNotFound; - int nConstraint = pLoop->nLTerm; - - sqlite3ExprCachePush(pParse); - iReg = sqlite3GetTempRange(pParse, nConstraint+2); - addrNotFound = pLevel->addrBrk; - for(j=0; j<nConstraint; j++){ - int iTarget = iReg+j+2; - pTerm = pLoop->aLTerm[j]; - if( pTerm==0 ) continue; - if( pTerm->eOperator & WO_IN ){ - codeEqualityTerm(pParse, pTerm, pLevel, j, bRev, iTarget); - addrNotFound = pLevel->addrNxt; - }else{ - sqlite3ExprCode(pParse, pTerm->pExpr->pRight, iTarget); - } - } - sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); - sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); - sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, - pLoop->u.vtab.idxStr, - pLoop->u.vtab.needFree ? P4_MPRINTF : P4_STATIC); - VdbeCoverage(v); - pLoop->u.vtab.needFree = 0; - for(j=0; j<nConstraint && j<16; j++){ - if( (pLoop->u.vtab.omitMask>>j)&1 ){ - disableTerm(pLevel, pLoop->aLTerm[j]); - } - } - pLevel->op = OP_VNext; - pLevel->p1 = iCur; - pLevel->p2 = sqlite3VdbeCurrentAddr(v); - sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); - sqlite3ExprCachePop(pParse); - }else -#endif /* SQLITE_OMIT_VIRTUALTABLE */ - - if( (pLoop->wsFlags & WHERE_IPK)!=0 - && (pLoop->wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_EQ))!=0 - ){ - /* Case 2: We can directly reference a single row using an - ** equality comparison against the ROWID field. Or - ** we reference multiple rows using a "rowid IN (...)" - ** construct. - */ - assert( pLoop->u.btree.nEq==1 ); - pTerm = pLoop->aLTerm[0]; - assert( pTerm!=0 ); - assert( pTerm->pExpr!=0 ); - assert( omitTable==0 ); - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - iReleaseReg = ++pParse->nMem; - iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); - if( iRowidReg!=iReleaseReg ) sqlite3ReleaseTempReg(pParse, iReleaseReg); - addrNxt = pLevel->addrNxt; - sqlite3VdbeAddOp2(v, OP_MustBeInt, iRowidReg, addrNxt); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_NotExists, iCur, addrNxt, iRowidReg); - VdbeCoverage(v); - sqlite3ExprCacheAffinityChange(pParse, iRowidReg, 1); - sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); - VdbeComment((v, "pk")); - pLevel->op = OP_Noop; - }else if( (pLoop->wsFlags & WHERE_IPK)!=0 - && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 - ){ - /* Case 3: We have an inequality comparison against the ROWID field. - */ - int testOp = OP_Noop; - int start; - int memEndValue = 0; - WhereTerm *pStart, *pEnd; - - assert( omitTable==0 ); - j = 0; - pStart = pEnd = 0; - if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; - if( pLoop->wsFlags & WHERE_TOP_LIMIT ) pEnd = pLoop->aLTerm[j++]; - assert( pStart!=0 || pEnd!=0 ); - if( bRev ){ - pTerm = pStart; - pStart = pEnd; - pEnd = pTerm; - } - if( pStart ){ - Expr *pX; /* The expression that defines the start bound */ - int r1, rTemp; /* Registers for holding the start boundary */ - - /* The following constant maps TK_xx codes into corresponding - ** seek opcodes. It depends on a particular ordering of TK_xx - */ - const u8 aMoveOp[] = { - /* TK_GT */ OP_SeekGT, - /* TK_LE */ OP_SeekLE, - /* TK_LT */ OP_SeekLT, - /* TK_GE */ OP_SeekGE - }; - assert( TK_LE==TK_GT+1 ); /* Make sure the ordering.. */ - assert( TK_LT==TK_GT+2 ); /* ... of the TK_xx values... */ - assert( TK_GE==TK_GT+3 ); /* ... is correcct. */ - - assert( (pStart->wtFlags & TERM_VNULL)==0 ); - testcase( pStart->wtFlags & TERM_VIRTUAL ); - pX = pStart->pExpr; - assert( pX!=0 ); - testcase( pStart->leftCursor!=iCur ); /* transitive constraints */ - r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp); - sqlite3VdbeAddOp3(v, aMoveOp[pX->op-TK_GT], iCur, addrBrk, r1); - VdbeComment((v, "pk")); - VdbeCoverageIf(v, pX->op==TK_GT); - VdbeCoverageIf(v, pX->op==TK_LE); - VdbeCoverageIf(v, pX->op==TK_LT); - VdbeCoverageIf(v, pX->op==TK_GE); - sqlite3ExprCacheAffinityChange(pParse, r1, 1); - sqlite3ReleaseTempReg(pParse, rTemp); - disableTerm(pLevel, pStart); - }else{ - sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iCur, addrBrk); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - } - if( pEnd ){ - Expr *pX; - pX = pEnd->pExpr; - assert( pX!=0 ); - assert( (pEnd->wtFlags & TERM_VNULL)==0 ); - testcase( pEnd->leftCursor!=iCur ); /* Transitive constraints */ - testcase( pEnd->wtFlags & TERM_VIRTUAL ); - memEndValue = ++pParse->nMem; - sqlite3ExprCode(pParse, pX->pRight, memEndValue); - if( pX->op==TK_LT || pX->op==TK_GT ){ - testOp = bRev ? OP_Le : OP_Ge; - }else{ - testOp = bRev ? OP_Lt : OP_Gt; - } - disableTerm(pLevel, pEnd); - } - start = sqlite3VdbeCurrentAddr(v); - pLevel->op = bRev ? OP_Prev : OP_Next; - pLevel->p1 = iCur; - pLevel->p2 = start; - assert( pLevel->p5==0 ); - if( testOp!=OP_Noop ){ - iRowidReg = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Rowid, iCur, iRowidReg); - sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); - sqlite3VdbeAddOp3(v, testOp, memEndValue, addrBrk, iRowidReg); - VdbeCoverageIf(v, testOp==OP_Le); - VdbeCoverageIf(v, testOp==OP_Lt); - VdbeCoverageIf(v, testOp==OP_Ge); - VdbeCoverageIf(v, testOp==OP_Gt); - sqlite3VdbeChangeP5(v, SQLITE_AFF_NUMERIC | SQLITE_JUMPIFNULL); - } - }else if( pLoop->wsFlags & WHERE_INDEXED ){ - /* Case 4: A scan using an index. - ** - ** The WHERE clause may contain zero or more equality - ** terms ("==" or "IN" operators) that refer to the N - ** left-most columns of the index. It may also contain - ** inequality constraints (>, <, >= or <=) on the indexed - ** column that immediately follows the N equalities. Only - ** the right-most column can be an inequality - the rest must - ** use the "==" and "IN" operators. For example, if the - ** index is on (x,y,z), then the following clauses are all - ** optimized: - ** - ** x=5 - ** x=5 AND y=10 - ** x=5 AND y<10 - ** x=5 AND y>5 AND y<10 - ** x=5 AND y=5 AND z<=10 - ** - ** The z<10 term of the following cannot be used, only - ** the x=5 term: - ** - ** x=5 AND z<10 - ** - ** N may be zero if there are inequality constraints. - ** If there are no inequality constraints, then N is at - ** least one. - ** - ** This case is also used when there are no WHERE clause - ** constraints but an index is selected anyway, in order - ** to force the output order to conform to an ORDER BY. - */ - static const u8 aStartOp[] = { - 0, - 0, - OP_Rewind, /* 2: (!start_constraints && startEq && !bRev) */ - OP_Last, /* 3: (!start_constraints && startEq && bRev) */ - OP_SeekGT, /* 4: (start_constraints && !startEq && !bRev) */ - OP_SeekLT, /* 5: (start_constraints && !startEq && bRev) */ - OP_SeekGE, /* 6: (start_constraints && startEq && !bRev) */ - OP_SeekLE /* 7: (start_constraints && startEq && bRev) */ - }; - static const u8 aEndOp[] = { - OP_IdxGE, /* 0: (end_constraints && !bRev && !endEq) */ - OP_IdxGT, /* 1: (end_constraints && !bRev && endEq) */ - OP_IdxLE, /* 2: (end_constraints && bRev && !endEq) */ - OP_IdxLT, /* 3: (end_constraints && bRev && endEq) */ - }; - u16 nEq = pLoop->u.btree.nEq; /* Number of == or IN terms */ - int regBase; /* Base register holding constraint values */ - WhereTerm *pRangeStart = 0; /* Inequality constraint at range start */ - WhereTerm *pRangeEnd = 0; /* Inequality constraint at range end */ - int startEq; /* True if range start uses ==, >= or <= */ - int endEq; /* True if range end uses ==, >= or <= */ - int start_constraints; /* Start of range is constrained */ - int nConstraint; /* Number of constraint terms */ - Index *pIdx; /* The index we will be using */ - int iIdxCur; /* The VDBE cursor for the index */ - int nExtraReg = 0; /* Number of extra registers needed */ - int op; /* Instruction opcode */ - char *zStartAff; /* Affinity for start of range constraint */ - char cEndAff = 0; /* Affinity for end of range constraint */ - u8 bSeekPastNull = 0; /* True to seek past initial nulls */ - u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ - - pIdx = pLoop->u.btree.pIndex; - iIdxCur = pLevel->iIdxCur; - assert( nEq>=pLoop->nSkip ); - - /* If this loop satisfies a sort order (pOrderBy) request that - ** was passed to this function to implement a "SELECT min(x) ..." - ** query, then the caller will only allow the loop to run for - ** a single iteration. This means that the first row returned - ** should not have a NULL value stored in 'x'. If column 'x' is - ** the first one after the nEq equality constraints in the index, - ** this requires some special handling. - */ - assert( pWInfo->pOrderBy==0 - || pWInfo->pOrderBy->nExpr==1 - || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); - if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 - && pWInfo->nOBSat>0 - && (pIdx->nKeyCol>nEq) - ){ - assert( pLoop->nSkip==0 ); - bSeekPastNull = 1; - nExtraReg = 1; - } - - /* Find any inequality constraint terms for the start and end - ** of the range. - */ - j = nEq; - if( pLoop->wsFlags & WHERE_BTM_LIMIT ){ - pRangeStart = pLoop->aLTerm[j++]; - nExtraReg = 1; - } - if( pLoop->wsFlags & WHERE_TOP_LIMIT ){ - pRangeEnd = pLoop->aLTerm[j++]; - nExtraReg = 1; - if( pRangeStart==0 - && (j = pIdx->aiColumn[nEq])>=0 - && pIdx->pTable->aCol[j].notNull==0 - ){ - bSeekPastNull = 1; - } - } - assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); - - /* Generate code to evaluate all constraint terms using == or IN - ** and store the values of those terms in an array of registers - ** starting at regBase. - */ - regBase = codeAllEqualityTerms(pParse,pLevel,bRev,nExtraReg,&zStartAff); - assert( zStartAff==0 || sqlite3Strlen30(zStartAff)>=nEq ); - if( zStartAff ) cEndAff = zStartAff[nEq]; - addrNxt = pLevel->addrNxt; - - /* If we are doing a reverse order scan on an ascending index, or - ** a forward order scan on a descending index, interchange the - ** start and end terms (pRangeStart and pRangeEnd). - */ - if( (nEq<pIdx->nKeyCol && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) - || (bRev && pIdx->nKeyCol==nEq) - ){ - SWAP(WhereTerm *, pRangeEnd, pRangeStart); - SWAP(u8, bSeekPastNull, bStopAtNull); - } - - testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); - testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); - testcase( pRangeEnd && (pRangeEnd->eOperator & WO_LE)!=0 ); - testcase( pRangeEnd && (pRangeEnd->eOperator & WO_GE)!=0 ); - startEq = !pRangeStart || pRangeStart->eOperator & (WO_LE|WO_GE); - endEq = !pRangeEnd || pRangeEnd->eOperator & (WO_LE|WO_GE); - start_constraints = pRangeStart || nEq>0; - - /* Seek the index cursor to the start of the range. */ - nConstraint = nEq; - if( pRangeStart ){ - Expr *pRight = pRangeStart->pExpr->pRight; - sqlite3ExprCode(pParse, pRight, regBase+nEq); - if( (pRangeStart->wtFlags & TERM_VNULL)==0 - && sqlite3ExprCanBeNull(pRight) - ){ - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); - VdbeCoverage(v); - } - if( zStartAff ){ - if( sqlite3CompareAffinity(pRight, zStartAff[nEq])==SQLITE_AFF_NONE){ - /* Since the comparison is to be performed with no conversions - ** applied to the operands, set the affinity to apply to pRight to - ** SQLITE_AFF_NONE. */ - zStartAff[nEq] = SQLITE_AFF_NONE; - } - if( sqlite3ExprNeedsNoAffinityChange(pRight, zStartAff[nEq]) ){ - zStartAff[nEq] = SQLITE_AFF_NONE; - } - } - nConstraint++; - testcase( pRangeStart->wtFlags & TERM_VIRTUAL ); - }else if( bSeekPastNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - nConstraint++; - startEq = 0; - start_constraints = 1; - } - codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); - op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; - assert( op!=0 ); - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - VdbeCoverage(v); - VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); - VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); - VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); - VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); - VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); - VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); - - /* Load the value for the inequality constraint at the end of the - ** range (if any). - */ - nConstraint = nEq; - if( pRangeEnd ){ - Expr *pRight = pRangeEnd->pExpr->pRight; - sqlite3ExprCacheRemove(pParse, regBase+nEq, 1); - sqlite3ExprCode(pParse, pRight, regBase+nEq); - if( (pRangeEnd->wtFlags & TERM_VNULL)==0 - && sqlite3ExprCanBeNull(pRight) - ){ - sqlite3VdbeAddOp2(v, OP_IsNull, regBase+nEq, addrNxt); - VdbeCoverage(v); - } - if( sqlite3CompareAffinity(pRight, cEndAff)!=SQLITE_AFF_NONE - && !sqlite3ExprNeedsNoAffinityChange(pRight, cEndAff) - ){ - codeApplyAffinity(pParse, regBase+nEq, 1, &cEndAff); - } - nConstraint++; - testcase( pRangeEnd->wtFlags & TERM_VIRTUAL ); - }else if( bStopAtNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - endEq = 0; - nConstraint++; - } - sqlite3DbFree(db, zStartAff); - - /* Top of the loop body */ - pLevel->p2 = sqlite3VdbeCurrentAddr(v); - - /* Check if the index cursor is past the end of the range. */ - if( nConstraint ){ - op = aEndOp[bRev*2 + endEq]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); - testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); - testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); - testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); - } - - /* Seek the table cursor, if required */ - disableTerm(pLevel, pRangeStart); - disableTerm(pLevel, pRangeEnd); - if( omitTable ){ - /* pIdx is a covering index. No need to access the main table. */ - }else if( HasRowid(pIdx->pTable) ){ - iRowidReg = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, iRowidReg); - sqlite3ExprCacheStore(pParse, iCur, -1, iRowidReg); - sqlite3VdbeAddOp2(v, OP_Seek, iCur, iRowidReg); /* Deferred seek */ - }else if( iCur!=iIdxCur ){ - Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); - iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); - for(j=0; j<pPk->nKeyCol; j++){ - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); - sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); - } - sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, - iRowidReg, pPk->nKeyCol); VdbeCoverage(v); - } - - /* Record the instruction used to terminate the loop. Disable - ** WHERE clause terms made redundant by the index range scan. - */ - if( pLoop->wsFlags & WHERE_ONEROW ){ - pLevel->op = OP_Noop; - }else if( bRev ){ - pLevel->op = OP_Prev; - }else{ - pLevel->op = OP_Next; - } - pLevel->p1 = iIdxCur; - pLevel->p3 = (pLoop->wsFlags&WHERE_UNQ_WANTED)!=0 ? 1:0; - if( (pLoop->wsFlags & WHERE_CONSTRAINT)==0 ){ - pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; - }else{ - assert( pLevel->p5==0 ); - } - }else - -#ifndef SQLITE_OMIT_OR_OPTIMIZATION - if( pLoop->wsFlags & WHERE_MULTI_OR ){ - /* Case 5: Two or more separately indexed terms connected by OR - ** - ** Example: - ** - ** CREATE TABLE t1(a,b,c,d); - ** CREATE INDEX i1 ON t1(a); - ** CREATE INDEX i2 ON t1(b); - ** CREATE INDEX i3 ON t1(c); - ** - ** SELECT * FROM t1 WHERE a=5 OR b=7 OR (c=11 AND d=13) - ** - ** In the example, there are three indexed terms connected by OR. - ** The top of the loop looks like this: - ** - ** Null 1 # Zero the rowset in reg 1 - ** - ** Then, for each indexed term, the following. The arguments to - ** RowSetTest are such that the rowid of the current row is inserted - ** into the RowSet. If it is already present, control skips the - ** Gosub opcode and jumps straight to the code generated by WhereEnd(). - ** - ** sqlite3WhereBegin(<term>) - ** RowSetTest # Insert rowid into rowset - ** Gosub 2 A - ** sqlite3WhereEnd() - ** - ** Following the above, code to terminate the loop. Label A, the target - ** of the Gosub above, jumps to the instruction right after the Goto. - ** - ** Null 1 # Zero the rowset in reg 1 - ** Goto B # The loop is finished. - ** - ** A: <loop body> # Return data, whatever. - ** - ** Return 2 # Jump back to the Gosub - ** - ** B: <after the loop> - ** - ** Added 2014-05-26: If the table is a WITHOUT ROWID table, then - ** use an ephemeral index instead of a RowSet to record the primary - ** keys of the rows we have already seen. - ** - */ - WhereClause *pOrWc; /* The OR-clause broken out into subterms */ - SrcList *pOrTab; /* Shortened table list or OR-clause generation */ - Index *pCov = 0; /* Potential covering index (or NULL) */ - int iCovCur = pParse->nTab++; /* Cursor used for index scans (if any) */ - - int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ - int regRowset = 0; /* Register for RowSet object */ - int regRowid = 0; /* Register holding rowid */ - int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ - int iRetInit; /* Address of regReturn init */ - int untestedTerms = 0; /* Some terms not completely tested */ - int ii; /* Loop counter */ - u16 wctrlFlags; /* Flags for sub-WHERE clause */ - Expr *pAndExpr = 0; /* An ".. AND (...)" expression */ - Table *pTab = pTabItem->pTab; - - pTerm = pLoop->aLTerm[0]; - assert( pTerm!=0 ); - assert( pTerm->eOperator & WO_OR ); - assert( (pTerm->wtFlags & TERM_ORINFO)!=0 ); - pOrWc = &pTerm->u.pOrInfo->wc; - pLevel->op = OP_Return; - pLevel->p1 = regReturn; - - /* Set up a new SrcList in pOrTab containing the table being scanned - ** by this loop in the a[0] slot and all notReady tables in a[1..] slots. - ** This becomes the SrcList in the recursive call to sqlite3WhereBegin(). - */ - if( pWInfo->nLevel>1 ){ - int nNotReady; /* The number of notReady tables */ - struct SrcList_item *origSrc; /* Original list of tables */ - nNotReady = pWInfo->nLevel - iLevel - 1; - pOrTab = sqlite3StackAllocRaw(db, - sizeof(*pOrTab)+ nNotReady*sizeof(pOrTab->a[0])); - if( pOrTab==0 ) return notReady; - pOrTab->nAlloc = (u8)(nNotReady + 1); - pOrTab->nSrc = pOrTab->nAlloc; - memcpy(pOrTab->a, pTabItem, sizeof(*pTabItem)); - origSrc = pWInfo->pTabList->a; - for(k=1; k<=nNotReady; k++){ - memcpy(&pOrTab->a[k], &origSrc[pLevel[k].iFrom], sizeof(pOrTab->a[k])); - } - }else{ - pOrTab = pWInfo->pTabList; - } - - /* Initialize the rowset register to contain NULL. An SQL NULL is - ** equivalent to an empty rowset. Or, create an ephemeral index - ** capable of holding primary keys in the case of a WITHOUT ROWID. - ** - ** Also initialize regReturn to contain the address of the instruction - ** immediately following the OP_Return at the bottom of the loop. This - ** is required in a few obscure LEFT JOIN cases where control jumps - ** over the top of the loop into the body of it. In this case the - ** correct response for the end-of-loop code (the OP_Return) is to - ** fall through to the next instruction, just as an OP_Next does if - ** called on an uninitialized cursor. - */ - if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ - if( HasRowid(pTab) ){ - regRowset = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Null, 0, regRowset); - }else{ - Index *pPk = sqlite3PrimaryKeyIndex(pTab); - regRowset = pParse->nTab++; - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, regRowset, pPk->nKeyCol); - sqlite3VdbeSetP4KeyInfo(pParse, pPk); - } - regRowid = ++pParse->nMem; - } - iRetInit = sqlite3VdbeAddOp2(v, OP_Integer, 0, regReturn); - - /* If the original WHERE clause is z of the form: (x1 OR x2 OR ...) AND y - ** Then for every term xN, evaluate as the subexpression: xN AND z - ** That way, terms in y that are factored into the disjunction will - ** be picked up by the recursive calls to sqlite3WhereBegin() below. - ** - ** Actually, each subexpression is converted to "xN AND w" where w is - ** the "interesting" terms of z - terms that did not originate in the - ** ON or USING clause of a LEFT JOIN, and terms that are usable as - ** indices. - ** - ** This optimization also only applies if the (x1 OR x2 OR ...) term - ** is not contained in the ON clause of a LEFT JOIN. - ** See ticket http://www.sqlite.org/src/info/f2369304e4 - */ - if( pWC->nTerm>1 ){ - int iTerm; - for(iTerm=0; iTerm<pWC->nTerm; iTerm++){ - Expr *pExpr = pWC->a[iTerm].pExpr; - if( &pWC->a[iTerm] == pTerm ) continue; - if( ExprHasProperty(pExpr, EP_FromJoin) ) continue; - if( (pWC->a[iTerm].wtFlags & TERM_VIRTUAL)!=0 ) continue; - if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue; - testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO ); - pExpr = sqlite3ExprDup(db, pExpr, 0); - pAndExpr = sqlite3ExprAnd(db, pAndExpr, pExpr); - } - if( pAndExpr ){ - pAndExpr = sqlite3PExpr(pParse, TK_AND, 0, pAndExpr, 0); - } - } - - /* Run a separate WHERE clause for each term of the OR clause. After - ** eliminating duplicates from other WHERE clauses, the action for each - ** sub-WHERE clause is to to invoke the main loop body as a subroutine. - */ - wctrlFlags = WHERE_OMIT_OPEN_CLOSE - | WHERE_FORCE_TABLE - | WHERE_ONETABLE_ONLY; - for(ii=0; ii<pOrWc->nTerm; ii++){ - WhereTerm *pOrTerm = &pOrWc->a[ii]; - if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ - WhereInfo *pSubWInfo; /* Info for single OR-term scan */ - Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ - int j1 = 0; /* Address of jump operation */ - if( pAndExpr && !ExprHasProperty(pOrExpr, EP_FromJoin) ){ - pAndExpr->pLeft = pOrExpr; - pOrExpr = pAndExpr; - } - /* Loop through table entries that match term pOrTerm. */ - WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); - pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, - wctrlFlags, iCovCur); - assert( pSubWInfo || pParse->nErr || db->mallocFailed ); - if( pSubWInfo ){ - WhereLoop *pSubLoop; - int addrExplain = explainOneScan( - pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0 - ); - addScanStatus(v, pOrTab, &pSubWInfo->a[0], addrExplain); - - /* This is the sub-WHERE clause body. First skip over - ** duplicate rows from prior sub-WHERE clauses, and record the - ** rowid (or PRIMARY KEY) for the current row so that the same - ** row will be skipped in subsequent sub-WHERE clauses. - */ - if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ - int r; - int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); - if( HasRowid(pTab) ){ - r = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, regRowid, 0); - j1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, r,iSet); - VdbeCoverage(v); - }else{ - Index *pPk = sqlite3PrimaryKeyIndex(pTab); - int nPk = pPk->nKeyCol; - int iPk; - - /* Read the PK into an array of temp registers. */ - r = sqlite3GetTempRange(pParse, nPk); - for(iPk=0; iPk<nPk; iPk++){ - int iCol = pPk->aiColumn[iPk]; - sqlite3ExprCodeGetColumn(pParse, pTab, iCol, iCur, r+iPk, 0); - } - - /* Check if the temp table already contains this key. If so, - ** the row has already been included in the result set and - ** can be ignored (by jumping past the Gosub below). Otherwise, - ** insert the key into the temp table and proceed with processing - ** the row. - ** - ** Use some of the same optimizations as OP_RowSetTest: If iSet - ** is zero, assume that the key cannot already be present in - ** the temp table. And if iSet is -1, assume that there is no - ** need to insert the key into the temp table, as it will never - ** be tested for. */ - if( iSet ){ - j1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); - VdbeCoverage(v); - } - if( iSet>=0 ){ - sqlite3VdbeAddOp3(v, OP_MakeRecord, r, nPk, regRowid); - sqlite3VdbeAddOp3(v, OP_IdxInsert, regRowset, regRowid, 0); - if( iSet ) sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); - } - - /* Release the array of temp registers */ - sqlite3ReleaseTempRange(pParse, r, nPk); - } - } - - /* Invoke the main loop body as a subroutine */ - sqlite3VdbeAddOp2(v, OP_Gosub, regReturn, iLoopBody); - - /* Jump here (skipping the main loop body subroutine) if the - ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ - if( j1 ) sqlite3VdbeJumpHere(v, j1); - - /* The pSubWInfo->untestedTerms flag means that this OR term - ** contained one or more AND term from a notReady table. The - ** terms from the notReady table could not be tested and will - ** need to be tested later. - */ - if( pSubWInfo->untestedTerms ) untestedTerms = 1; - - /* If all of the OR-connected terms are optimized using the same - ** index, and the index is opened using the same cursor number - ** by each call to sqlite3WhereBegin() made by this loop, it may - ** be possible to use that index as a covering index. - ** - ** If the call to sqlite3WhereBegin() above resulted in a scan that - ** uses an index, and this is either the first OR-connected term - ** processed or the index is the same as that used by all previous - ** terms, set pCov to the candidate covering index. Otherwise, set - ** pCov to NULL to indicate that no candidate covering index will - ** be available. - */ - pSubLoop = pSubWInfo->a[0].pWLoop; - assert( (pSubLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); - if( (pSubLoop->wsFlags & WHERE_INDEXED)!=0 - && (ii==0 || pSubLoop->u.btree.pIndex==pCov) - && (HasRowid(pTab) || !IsPrimaryKeyIndex(pSubLoop->u.btree.pIndex)) - ){ - assert( pSubWInfo->a[0].iIdxCur==iCovCur ); - pCov = pSubLoop->u.btree.pIndex; - wctrlFlags |= WHERE_REOPEN_IDX; - }else{ - pCov = 0; - } - - /* Finish the loop through table entries that match term pOrTerm. */ - sqlite3WhereEnd(pSubWInfo); - } - } - } - pLevel->u.pCovidx = pCov; - if( pCov ) pLevel->iIdxCur = iCovCur; - if( pAndExpr ){ - pAndExpr->pLeft = 0; - sqlite3ExprDelete(db, pAndExpr); - } - sqlite3VdbeChangeP1(v, iRetInit, sqlite3VdbeCurrentAddr(v)); - sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk); - sqlite3VdbeResolveLabel(v, iLoopBody); - - if( pWInfo->nLevel>1 ) sqlite3StackFree(db, pOrTab); - if( !untestedTerms ) disableTerm(pLevel, pTerm); - }else -#endif /* SQLITE_OMIT_OR_OPTIMIZATION */ - - { - /* Case 6: There is no usable index. We must do a complete - ** scan of the entire table. - */ - static const u8 aStep[] = { OP_Next, OP_Prev }; - static const u8 aStart[] = { OP_Rewind, OP_Last }; - assert( bRev==0 || bRev==1 ); - if( pTabItem->isRecursive ){ - /* Tables marked isRecursive have only a single row that is stored in - ** a pseudo-cursor. No need to Rewind or Next such cursors. */ - pLevel->op = OP_Noop; - }else{ - pLevel->op = aStep[bRev]; - pLevel->p1 = iCur; - pLevel->p2 = 1 + sqlite3VdbeAddOp2(v, aStart[bRev], iCur, addrBrk); - VdbeCoverageIf(v, bRev==0); - VdbeCoverageIf(v, bRev!=0); - pLevel->p5 = SQLITE_STMTSTATUS_FULLSCAN_STEP; - } - } - -#ifdef SQLITE_ENABLE_STMT_SCANSTATUS - pLevel->addrVisit = sqlite3VdbeCurrentAddr(v); -#endif - - /* Insert code to test every subexpression that can be completely - ** computed using the current set of tables. - */ - for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ - Expr *pE; - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - testcase( pTerm->wtFlags & TERM_CODED ); - if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ - testcase( pWInfo->untestedTerms==0 - && (pWInfo->wctrlFlags & WHERE_ONETABLE_ONLY)!=0 ); - pWInfo->untestedTerms = 1; - continue; - } - pE = pTerm->pExpr; - assert( pE!=0 ); - if( pLevel->iLeftJoin && !ExprHasProperty(pE, EP_FromJoin) ){ - continue; - } - sqlite3ExprIfFalse(pParse, pE, addrCont, SQLITE_JUMPIFNULL); - pTerm->wtFlags |= TERM_CODED; - } - - /* Insert code to test for implied constraints based on transitivity - ** of the "==" operator. - ** - ** Example: If the WHERE clause contains "t1.a=t2.b" and "t2.b=123" - ** and we are coding the t1 loop and the t2 loop has not yet coded, - ** then we cannot use the "t1.a=t2.b" constraint, but we can code - ** the implied "t1.a=123" constraint. - */ - for(pTerm=pWC->a, j=pWC->nTerm; j>0; j--, pTerm++){ - Expr *pE, *pEAlt; - WhereTerm *pAlt; - if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( pTerm->eOperator!=(WO_EQUIV|WO_EQ) ) continue; - if( pTerm->leftCursor!=iCur ) continue; - if( pLevel->iLeftJoin ) continue; - pE = pTerm->pExpr; - assert( !ExprHasProperty(pE, EP_FromJoin) ); - assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); - pAlt = findTerm(pWC, iCur, pTerm->u.leftColumn, notReady, WO_EQ|WO_IN, 0); - if( pAlt==0 ) continue; - if( pAlt->wtFlags & (TERM_CODED) ) continue; - testcase( pAlt->eOperator & WO_EQ ); - testcase( pAlt->eOperator & WO_IN ); - VdbeModuleComment((v, "begin transitive constraint")); - pEAlt = sqlite3StackAllocRaw(db, sizeof(*pEAlt)); - if( pEAlt ){ - *pEAlt = *pAlt->pExpr; - pEAlt->pLeft = pE->pLeft; - sqlite3ExprIfFalse(pParse, pEAlt, addrCont, SQLITE_JUMPIFNULL); - sqlite3StackFree(db, pEAlt); - } - } - - /* For a LEFT OUTER JOIN, generate code that will record the fact that - ** at least one row of the right table has matched the left table. - */ - if( pLevel->iLeftJoin ){ - pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); - VdbeComment((v, "record LEFT JOIN hit")); - sqlite3ExprCacheClear(pParse); - for(pTerm=pWC->a, j=0; j<pWC->nTerm; j++, pTerm++){ - testcase( pTerm->wtFlags & TERM_VIRTUAL ); - testcase( pTerm->wtFlags & TERM_CODED ); - if( pTerm->wtFlags & (TERM_VIRTUAL|TERM_CODED) ) continue; - if( (pTerm->prereqAll & pLevel->notReady)!=0 ){ - assert( pWInfo->untestedTerms ); - continue; - } - assert( pTerm->pExpr ); - sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); - pTerm->wtFlags |= TERM_CODED; - } - } - - return pLevel->notReady; -} #ifdef WHERETRACE_ENABLED /* @@ -118793,29 +137868,58 @@ static void whereTermPrint(WhereTerm *pTerm, int iTerm){ sqlite3DebugPrintf("TERM-%-3d NULL\n", iTerm); }else{ char zType[4]; + char zLeft[50]; memcpy(zType, "...", 4); if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; - sqlite3DebugPrintf("TERM-%-3d %p %s cursor=%-3d prob=%-3d op=0x%03x\n", - iTerm, pTerm, zType, pTerm->leftCursor, pTerm->truthProb, - pTerm->eOperator); + if( pTerm->eOperator & WO_SINGLE ){ + sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}", + pTerm->leftCursor, pTerm->u.leftColumn); + }else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){ + sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld", + pTerm->u.pOrInfo->indexable); + }else{ + sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor); + } + sqlite3DebugPrintf( + "TERM-%-3d %p %s %-12s prob=%-3d op=0x%03x wtFlags=0x%04x", + iTerm, pTerm, zType, zLeft, pTerm->truthProb, + pTerm->eOperator, pTerm->wtFlags); + if( pTerm->iField ){ + sqlite3DebugPrintf(" iField=%d\n", pTerm->iField); + }else{ + sqlite3DebugPrintf("\n"); + } sqlite3TreeViewExpr(0, pTerm->pExpr, 0); } } #endif +#ifdef WHERETRACE_ENABLED +/* +** Show the complete content of a WhereClause +*/ +SQLITE_PRIVATE void sqlite3WhereClausePrint(WhereClause *pWC){ + int i; + for(i=0; i<pWC->nTerm; i++){ + whereTermPrint(&pWC->a[i], i); + } +} +#endif + #ifdef WHERETRACE_ENABLED /* ** Print a WhereLoop object for debugging purposes */ static void whereLoopPrint(WhereLoop *p, WhereClause *pWC){ WhereInfo *pWInfo = pWC->pWInfo; - int nb = 1+(pWInfo->pTabList->nSrc+7)/8; + int nb = 1+(pWInfo->pTabList->nSrc+3)/4; struct SrcList_item *pItem = pWInfo->pTabList->a + p->iTab; Table *pTab = pItem->pTab; + Bitmask mAll = (((Bitmask)1)<<(nb*4)) - 1; sqlite3DebugPrintf("%c%2d.%0*llx.%0*llx", p->cId, - p->iTab, nb, p->maskSelf, nb, p->prereq); + p->iTab, nb, p->maskSelf, nb, p->prereq & mAll); sqlite3DebugPrintf(" %12s", pItem->zAlias ? pItem->zAlias : pTab->zName); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ @@ -118878,7 +137982,7 @@ static void whereLoopClearUnion(sqlite3 *db, WhereLoop *p){ p->u.vtab.idxStr = 0; }else if( (p->wsFlags & WHERE_AUTO_INDEX)!=0 && p->u.btree.pIndex!=0 ){ sqlite3DbFree(db, p->u.btree.pIndex->zColAff); - sqlite3DbFree(db, p->u.btree.pIndex); + sqlite3DbFreeNN(db, p->u.btree.pIndex); p->u.btree.pIndex = 0; } } @@ -118888,7 +137992,7 @@ static void whereLoopClearUnion(sqlite3 *db, WhereLoop *p){ ** Deallocate internal memory used by a WhereLoop object */ static void whereLoopClear(sqlite3 *db, WhereLoop *p){ - if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFree(db, p->aLTerm); + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm); whereLoopClearUnion(db, p); whereLoopInit(p); } @@ -118900,10 +138004,10 @@ static int whereLoopResize(sqlite3 *db, WhereLoop *p, int n){ WhereTerm **paNew; if( p->nLSlot>=n ) return SQLITE_OK; n = (n+7)&~7; - paNew = sqlite3DbMallocRaw(db, sizeof(p->aLTerm[0])*n); - if( paNew==0 ) return SQLITE_NOMEM; + paNew = sqlite3DbMallocRawNN(db, sizeof(p->aLTerm[0])*n); + if( paNew==0 ) return SQLITE_NOMEM_BKPT; memcpy(paNew, p->aLTerm, sizeof(p->aLTerm[0])*p->nLSlot); - if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFree(db, p->aLTerm); + if( p->aLTerm!=p->aLTermSpace ) sqlite3DbFreeNN(db, p->aLTerm); p->aLTerm = paNew; p->nLSlot = n; return SQLITE_OK; @@ -118916,7 +138020,7 @@ static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){ whereLoopClearUnion(db, pTo); if( whereLoopResize(db, pTo, pFrom->nLTerm) ){ memset(&pTo->u, 0, sizeof(pTo->u)); - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } memcpy(pTo, pFrom, WHERE_LOOP_XFER_SZ); memcpy(pTo->aLTerm, pFrom->aLTerm, pTo->nLTerm*sizeof(pTo->aLTerm[0])); @@ -118933,40 +138037,47 @@ static int whereLoopXfer(sqlite3 *db, WhereLoop *pTo, WhereLoop *pFrom){ */ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ whereLoopClear(db, p); - sqlite3DbFree(db, p); + sqlite3DbFreeNN(db, p); } /* ** Free a WhereInfo structure */ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ - if( ALWAYS(pWInfo) ){ - whereClauseClear(&pWInfo->sWC); - while( pWInfo->pLoops ){ - WhereLoop *p = pWInfo->pLoops; - pWInfo->pLoops = p->pNextLoop; - whereLoopDelete(db, p); + int i; + assert( pWInfo!=0 ); + for(i=0; i<pWInfo->nLevel; i++){ + WhereLevel *pLevel = &pWInfo->a[i]; + if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE) ){ + sqlite3DbFree(db, pLevel->u.in.aInLoop); } - sqlite3DbFree(db, pWInfo); } + sqlite3WhereClauseClear(&pWInfo->sWC); + while( pWInfo->pLoops ){ + WhereLoop *p = pWInfo->pLoops; + pWInfo->pLoops = p->pNextLoop; + whereLoopDelete(db, p); + } + sqlite3DbFreeNN(db, pWInfo); } /* ** Return TRUE if all of the following are true: ** ** (1) X has the same or lower cost that Y -** (2) X is a proper subset of Y -** (3) X skips at least as many columns as Y -** -** By "proper subset" we mean that X uses fewer WHERE clause terms -** than Y and that every WHERE clause term used by X is also used -** by Y. +** (2) X uses fewer WHERE clause terms than Y +** (3) Every WHERE clause term used by X is also used by Y +** (4) X skips at least as many columns as Y +** (5) If X is a covering index, than Y is too ** +** Conditions (2) and (3) mean that X is a "proper subset" of Y. ** If X is a proper subset of Y then Y is a better choice and ought ** to have a lower cost. This routine returns TRUE when that cost -** relationship is inverted and needs to be adjusted. The third rule +** relationship is inverted and needs to be adjusted. Constraint (4) ** was added because if X uses skip-scan less than Y it still might -** deserve a lower cost even if it is a proper subset of Y. +** deserve a lower cost even if it is a proper subset of Y. Constraint (5) +** was added because a covering index probably deserves to have a lower cost +** than a non-covering index even if it is a proper subset. */ static int whereLoopCheaperProperSubset( const WhereLoop *pX, /* First WhereLoop to compare */ @@ -118988,6 +138099,10 @@ static int whereLoopCheaperProperSubset( } if( j<0 ) return 0; /* X not a subset of Y since term X[i] not used by Y */ } + if( (pX->wsFlags&WHERE_IDX_ONLY)!=0 + && (pY->wsFlags&WHERE_IDX_ONLY)==0 ){ + return 0; /* Constraint (5) */ + } return 1; /* All conditions meet */ } @@ -119030,16 +138145,17 @@ static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ /* ** Search the list of WhereLoops in *ppPrev looking for one that can be -** supplanted by pTemplate. +** replaced by pTemplate. ** -** Return NULL if the WhereLoop list contains an entry that can supplant -** pTemplate, in other words if pTemplate does not belong on the list. +** Return NULL if pTemplate does not belong on the WhereLoop list. +** In other words if pTemplate ought to be dropped from further consideration. ** -** If pX is a WhereLoop that pTemplate can supplant, then return the +** If pX is a WhereLoop that pTemplate can replace, then return the ** link that points to pX. ** -** If pTemplate cannot supplant any existing element of the list but needs -** to be added to the list, then return a pointer to the tail of the list. +** If pTemplate cannot replace any existing element of the list but needs +** to be added to the list as a new entry, then return a pointer to the +** tail of the list. */ static WhereLoop **whereLoopFindLesser( WhereLoop **ppPrev, @@ -119133,23 +138249,26 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ WhereLoop **ppPrev, *p; WhereInfo *pWInfo = pBuilder->pWInfo; sqlite3 *db = pWInfo->pParse->db; + int rc; /* If pBuilder->pOrSet is defined, then only keep track of the costs ** and prereqs. */ if( pBuilder->pOrSet!=0 ){ + if( pTemplate->nLTerm ){ #if WHERETRACE_ENABLED - u16 n = pBuilder->pOrSet->n; - int x = + u16 n = pBuilder->pOrSet->n; + int x = #endif - whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, + whereOrInsert(pBuilder->pOrSet, pTemplate->prereq, pTemplate->rRun, pTemplate->nOut); #if WHERETRACE_ENABLED /* 0x8 */ - if( sqlite3WhereTrace & 0x8 ){ - sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); - whereLoopPrint(pTemplate, pBuilder->pWC); - } + if( sqlite3WhereTrace & 0x8 ){ + sqlite3DebugPrintf(x?" or-%d: ":" or-X: ", n); + whereLoopPrint(pTemplate, pBuilder->pWC); + } #endif + } return SQLITE_OK; } @@ -119181,15 +138300,17 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ if( p!=0 ){ sqlite3DebugPrintf("replace: "); whereLoopPrint(p, pBuilder->pWC); + sqlite3DebugPrintf(" with: "); + }else{ + sqlite3DebugPrintf(" add: "); } - sqlite3DebugPrintf(" add: "); whereLoopPrint(pTemplate, pBuilder->pWC); } #endif if( p==0 ){ /* Allocate a new WhereLoop to add to the end of the list */ - *ppPrev = p = sqlite3DbMallocRaw(db, sizeof(WhereLoop)); - if( p==0 ) return SQLITE_NOMEM; + *ppPrev = p = sqlite3DbMallocRawNN(db, sizeof(WhereLoop)); + if( p==0 ) return SQLITE_NOMEM_BKPT; whereLoopInit(p); p->pNextLoop = 0; }else{ @@ -119213,14 +138334,14 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ whereLoopDelete(db, pToDel); } } - whereLoopXfer(db, p, pTemplate); + rc = whereLoopXfer(db, p, pTemplate); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ Index *pIndex = p->u.btree.pIndex; if( pIndex && pIndex->tnum==0 ){ p->u.btree.pIndex = 0; } } - return SQLITE_OK; + return rc; } /* @@ -119282,8 +138403,9 @@ static void whereLoopOutputAdjust( /* In the absence of explicit truth probabilities, use heuristics to ** guess a reasonable truth probability. */ pLoop->nOut--; - if( pTerm->eOperator&WO_EQ ){ + if( pTerm->eOperator&(WO_EQ|WO_IS) ){ Expr *pRight = pTerm->pExpr->pRight; + testcase( pTerm->pExpr->op==TK_IS ); if( sqlite3ExprIsInteger(pRight, &k) && k>=(-1) && k<=1 ){ k = 10; }else{ @@ -119297,6 +138419,72 @@ static void whereLoopOutputAdjust( if( pLoop->nOut > nRow-iReduce ) pLoop->nOut = nRow - iReduce; } +/* +** Term pTerm is a vector range comparison operation. The first comparison +** in the vector can be optimized using column nEq of the index. This +** function returns the total number of vector elements that can be used +** as part of the range comparison. +** +** For example, if the query is: +** +** WHERE a = ? AND (b, c, d) > (?, ?, ?) +** +** and the index: +** +** CREATE INDEX ... ON (a, b, c, d, e) +** +** then this function would be invoked with nEq=1. The value returned in +** this case is 3. +*/ +static int whereRangeVectorLen( + Parse *pParse, /* Parsing context */ + int iCur, /* Cursor open on pIdx */ + Index *pIdx, /* The index to be used for a inequality constraint */ + int nEq, /* Number of prior equality constraints on same index */ + WhereTerm *pTerm /* The vector inequality constraint */ +){ + int nCmp = sqlite3ExprVectorSize(pTerm->pExpr->pLeft); + int i; + + nCmp = MIN(nCmp, (pIdx->nColumn - nEq)); + for(i=1; i<nCmp; i++){ + /* Test if comparison i of pTerm is compatible with column (i+nEq) + ** of the index. If not, exit the loop. */ + char aff; /* Comparison affinity */ + char idxaff = 0; /* Indexed columns affinity */ + CollSeq *pColl; /* Comparison collation sequence */ + Expr *pLhs = pTerm->pExpr->pLeft->x.pList->a[i].pExpr; + Expr *pRhs = pTerm->pExpr->pRight; + if( pRhs->flags & EP_xIsSelect ){ + pRhs = pRhs->x.pSelect->pEList->a[i].pExpr; + }else{ + pRhs = pRhs->x.pList->a[i].pExpr; + } + + /* Check that the LHS of the comparison is a column reference to + ** the right column of the right source table. And that the sort + ** order of the index column is the same as the sort order of the + ** leftmost index column. */ + if( pLhs->op!=TK_COLUMN + || pLhs->iTable!=iCur + || pLhs->iColumn!=pIdx->aiColumn[i+nEq] + || pIdx->aSortOrder[i+nEq]!=pIdx->aSortOrder[nEq] + ){ + break; + } + + testcase( pLhs->iColumn==XN_ROWID ); + aff = sqlite3CompareAffinity(pRhs, sqlite3ExprAffinity(pLhs)); + idxaff = sqlite3TableColumnAffinity(pIdx->pTable, pLhs->iColumn); + if( aff!=idxaff ) break; + + pColl = sqlite3BinaryCompareCollSeq(pParse, pLhs, pRhs); + if( pColl==0 ) break; + if( sqlite3StrICmp(pColl->zName, pIdx->azColl[i+nEq]) ) break; + } + return i; +} + /* ** Adjust the cost C by the costMult facter T. This only occurs if ** compiled with -DSQLITE_ENABLE_COSTMULT @@ -119335,40 +138523,43 @@ static int whereLoopAddBtreeIndex( Bitmask saved_prereq; /* Original value of pNew->prereq */ u16 saved_nLTerm; /* Original value of pNew->nLTerm */ u16 saved_nEq; /* Original value of pNew->u.btree.nEq */ + u16 saved_nBtm; /* Original value of pNew->u.btree.nBtm */ + u16 saved_nTop; /* Original value of pNew->u.btree.nTop */ u16 saved_nSkip; /* Original value of pNew->nSkip */ u32 saved_wsFlags; /* Original value of pNew->wsFlags */ LogEst saved_nOut; /* Original value of pNew->nOut */ - int iCol; /* Index of the column in the table */ int rc = SQLITE_OK; /* Return code */ LogEst rSize; /* Number of rows in the table */ LogEst rLogSize; /* Logarithm of table size */ WhereTerm *pTop = 0, *pBtm = 0; /* Top and bottom range constraints */ pNew = pBuilder->pNew; - if( db->mallocFailed ) return SQLITE_NOMEM; + if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; + WHERETRACE(0x800, ("BEGIN %s.addBtreeIdx(%s), nEq=%d\n", + pProbe->pTable->zName,pProbe->zName, pNew->u.btree.nEq)); assert( (pNew->wsFlags & WHERE_VIRTUALTABLE)==0 ); assert( (pNew->wsFlags & WHERE_TOP_LIMIT)==0 ); if( pNew->wsFlags & WHERE_BTM_LIMIT ){ opMask = WO_LT|WO_LE; - }else if( pProbe->tnum<=0 || (pSrc->jointype & JT_LEFT)!=0 ){ - opMask = WO_EQ|WO_IN|WO_GT|WO_GE|WO_LT|WO_LE; }else{ - opMask = WO_EQ|WO_IN|WO_ISNULL|WO_GT|WO_GE|WO_LT|WO_LE; + assert( pNew->u.btree.nBtm==0 ); + opMask = WO_EQ|WO_IN|WO_GT|WO_GE|WO_LT|WO_LE|WO_ISNULL|WO_IS; } if( pProbe->bUnordered ) opMask &= ~(WO_GT|WO_GE|WO_LT|WO_LE); assert( pNew->u.btree.nEq<pProbe->nColumn ); - iCol = pProbe->aiColumn[pNew->u.btree.nEq]; - pTerm = whereScanInit(&scan, pBuilder->pWC, pSrc->iCursor, iCol, - opMask, pProbe); saved_nEq = pNew->u.btree.nEq; + saved_nBtm = pNew->u.btree.nBtm; + saved_nTop = pNew->u.btree.nTop; saved_nSkip = pNew->nSkip; saved_nLTerm = pNew->nLTerm; saved_wsFlags = pNew->wsFlags; saved_prereq = pNew->prereq; saved_nOut = pNew->nOut; + pTerm = whereScanInit(&scan, pBuilder->pWC, pSrc->iCursor, saved_nEq, + opMask, pProbe); pNew->rSetup = 0; rSize = pProbe->aiRowLogEst[0]; rLogSize = estLog(rSize); @@ -119381,14 +138572,34 @@ static int whereLoopAddBtreeIndex( int nRecValid = pBuilder->nRecValid; #endif if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0) - && (iCol<0 || pSrc->pTab->aCol[iCol].notNull) + && indexColumnNotNull(pProbe, saved_nEq) ){ continue; /* ignore IS [NOT] NULL constraints on NOT NULL columns */ } if( pTerm->prereqRight & pNew->maskSelf ) continue; + /* Do not allow the upper bound of a LIKE optimization range constraint + ** to mix with a lower range bound from some other source */ + if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; + + /* Do not allow constraints from the WHERE clause to be used by the + ** right table of a LEFT JOIN. Only constraints in the ON clause are + ** allowed */ + if( (pSrc->fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + ){ + continue; + } + + if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ + pBuilder->bldFlags |= SQLITE_BLDF_UNIQUE; + }else{ + pBuilder->bldFlags |= SQLITE_BLDF_INDEXED; + } pNew->wsFlags = saved_wsFlags; pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; pNew->nLTerm = saved_nLTerm; if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ pNew->aLTerm[pNew->nLTerm++] = pTerm; @@ -119405,21 +138616,36 @@ static int whereLoopAddBtreeIndex( pNew->wsFlags |= WHERE_COLUMN_IN; if( ExprHasProperty(pExpr, EP_xIsSelect) ){ /* "x IN (SELECT ...)": TUNING: the SELECT returns 25 rows */ + int i; nIn = 46; assert( 46==sqlite3LogEst(25) ); + + /* The expression may actually be of the form (x, y) IN (SELECT...). + ** In this case there is a separate term for each of (x) and (y). + ** However, the nIn multiplier should only be applied once, not once + ** for each such term. The following loop checks that pTerm is the + ** first such term in use, and sets nIn back to 0 if it is not. */ + for(i=0; i<pNew->nLTerm-1; i++){ + if( pNew->aLTerm[i] && pNew->aLTerm[i]->pExpr==pExpr ) nIn = 0; + } }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ /* "x IN (value, value, ...)" */ nIn = sqlite3LogEst(pExpr->x.pList->nExpr); + assert( nIn>0 ); /* RHS always has 2 or more terms... The parser + ** changes "x IN (?)" into "x=?". */ } - assert( nIn>0 ); /* RHS always has 2 or more terms... The parser - ** changes "x IN (?)" into "x=?". */ - - }else if( eOp & (WO_EQ) ){ + }else if( eOp & (WO_EQ|WO_IS) ){ + int iCol = pProbe->aiColumn[saved_nEq]; pNew->wsFlags |= WHERE_COLUMN_EQ; - if( iCol<0 || (nInMul==0 && pNew->u.btree.nEq==pProbe->nKeyCol-1) ){ - if( iCol>=0 && !IsUniqueIndex(pProbe) ){ - pNew->wsFlags |= WHERE_UNQ_WANTED; - }else{ + assert( saved_nEq==pNew->u.btree.nEq ); + if( iCol==XN_ROWID + || (iCol>=0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) + ){ + if( iCol==XN_ROWID || pProbe->uniqNotNull + || (pProbe->nKeyCol==1 && pProbe->onError && eOp==WO_EQ) + ){ pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags |= WHERE_UNQ_WANTED; } } }else if( eOp & WO_ISNULL ){ @@ -119428,13 +138654,31 @@ static int whereLoopAddBtreeIndex( testcase( eOp & WO_GT ); testcase( eOp & WO_GE ); pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_BTM_LIMIT; + pNew->u.btree.nBtm = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); pBtm = pTerm; pTop = 0; + if( pTerm->wtFlags & TERM_LIKEOPT ){ + /* Range contraints that come from the LIKE optimization are + ** always used in pairs. */ + pTop = &pTerm[1]; + assert( (pTop-(pTerm->pWC->a))<pTerm->pWC->nTerm ); + assert( pTop->wtFlags & TERM_LIKEOPT ); + assert( pTop->eOperator==WO_LT ); + if( whereLoopResize(db, pNew, pNew->nLTerm+1) ) break; /* OOM */ + pNew->aLTerm[pNew->nLTerm++] = pTop; + pNew->wsFlags |= WHERE_TOP_LIMIT; + pNew->u.btree.nTop = 1; + } }else{ assert( eOp & (WO_LT|WO_LE) ); testcase( eOp & WO_LT ); testcase( eOp & WO_LE ); pNew->wsFlags |= WHERE_COLUMN_RANGE|WHERE_TOP_LIMIT; + pNew->u.btree.nTop = whereRangeVectorLen( + pParse, pSrc->iCursor, pProbe, saved_nEq, pTerm + ); pTop = pTerm; pBtm = (pNew->wsFlags & WHERE_BTM_LIMIT)!=0 ? pNew->aLTerm[pNew->nLTerm-2] : 0; @@ -119452,10 +138696,10 @@ static int whereLoopAddBtreeIndex( whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew); }else{ int nEq = ++pNew->u.btree.nEq; - assert( eOp & (WO_ISNULL|WO_EQ|WO_IN) ); + assert( eOp & (WO_ISNULL|WO_EQ|WO_IN|WO_IS) ); assert( pNew->nOut==saved_nOut ); - if( pTerm->truthProb<=0 && iCol>=0 ){ + if( pTerm->truthProb<=0 && pProbe->aiColumn[saved_nEq]>=0 ){ assert( (eOp & WO_IN) || nIn==0 ); testcase( eOp & WO_IN ); pNew->nOut += pTerm->truthProb; @@ -119469,8 +138713,9 @@ static int whereLoopAddBtreeIndex( && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) ){ Expr *pExpr = pTerm->pExpr; - if( (eOp & (WO_EQ|WO_ISNULL))!=0 ){ + if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){ testcase( eOp & WO_EQ ); + testcase( eOp & WO_IS ); testcase( eOp & WO_ISNULL ); rc = whereEqualScanEst(pParse, pBuilder, pExpr->pRight, &nOut); }else{ @@ -119533,6 +138778,8 @@ static int whereLoopAddBtreeIndex( } pNew->prereq = saved_prereq; pNew->u.btree.nEq = saved_nEq; + pNew->u.btree.nBtm = saved_nBtm; + pNew->u.btree.nTop = saved_nTop; pNew->nSkip = saved_nSkip; pNew->wsFlags = saved_wsFlags; pNew->nOut = saved_nOut; @@ -119572,6 +138819,8 @@ static int whereLoopAddBtreeIndex( pNew->wsFlags = saved_wsFlags; } + WHERETRACE(0x800, ("END %s.addBtreeIdx(%s), nEq=%d, rc=%d\n", + pProbe->pTable->zName, pProbe->zName, saved_nEq, rc)); return rc; } @@ -119589,18 +138838,25 @@ static int indexMightHelpWithOrderBy( int iCursor ){ ExprList *pOB; + ExprList *aColExpr; int ii, jj; if( pIndex->bUnordered ) return 0; if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; for(ii=0; ii<pOB->nExpr; ii++){ Expr *pExpr = sqlite3ExprSkipCollate(pOB->a[ii].pExpr); - if( pExpr->op!=TK_COLUMN ) return 0; - if( pExpr->iTable==iCursor ){ + if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ if( pExpr->iColumn<0 ) return 1; for(jj=0; jj<pIndex->nKeyCol; jj++){ if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1; } + }else if( (aColExpr = pIndex->aColExpr)!=0 ){ + for(jj=0; jj<pIndex->nKeyCol; jj++){ + if( pIndex->aiColumn[jj]!=XN_EXPR ) continue; + if( sqlite3ExprCompareSkip(pExpr,aColExpr->a[jj].pExpr,iCursor)==0 ){ + return 1; + } + } } } return 0; @@ -119630,15 +138886,26 @@ static Bitmask columnsInIndex(Index *pIdx){ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ int i; WhereTerm *pTerm; + Parse *pParse = pWC->pWInfo->pParse; + while( pWhere->op==TK_AND ){ + if( !whereUsablePartialIndex(iTab,pWC,pWhere->pLeft) ) return 0; + pWhere = pWhere->pRight; + } + if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; i<pWC->nTerm; i++, pTerm++){ - if( sqlite3ExprImpliesExpr(pTerm->pExpr, pWhere, iTab) ) return 1; + Expr *pExpr = pTerm->pExpr; + if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) + && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) + ){ + return 1; + } } return 0; } /* ** Add all WhereLoop objects for a single table of the join where the table -** is idenfied by pBuilder->pNew->iTab. That table is guaranteed to be +** is identified by pBuilder->pNew->iTab. That table is guaranteed to be ** a b-tree table, not a virtual table. ** ** The costs (WhereLoop.rRun) of the b-tree loops added by this function @@ -119674,7 +138941,7 @@ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ */ static int whereLoopAddBtree( WhereLoopBuilder *pBuilder, /* WHERE clause information */ - Bitmask mExtra /* Extra prerequesites for using this table */ + Bitmask mPrereq /* Extra prerequesites for using this table */ ){ WhereInfo *pWInfo; /* WHERE analysis context */ Index *pProbe; /* An index we are evaluating */ @@ -119700,9 +138967,9 @@ static int whereLoopAddBtree( pWC = pBuilder->pWC; assert( !IsVirtual(pSrc->pTab) ); - if( pSrc->pIndex ){ + if( pSrc->pIBIndex ){ /* An INDEXED BY clause specifies a particular index to use */ - pProbe = pSrc->pIndex; + pProbe = pSrc->pIBIndex; }else if( !HasRowid(pTab) ){ pProbe = pTab->pIndex; }else{ @@ -119722,7 +138989,7 @@ static int whereLoopAddBtree( aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; pFirst = pSrc->pTab->pIndex; - if( pSrc->notIndexed==0 ){ + if( pSrc->fg.notIndexed==0 ){ /* The real indices of the table are only considered if the ** NOT INDEXED qualifier is omitted from the FROM clause */ sPk.pNext = pFirst; @@ -119734,14 +139001,14 @@ static int whereLoopAddBtree( #ifndef SQLITE_OMIT_AUTOMATIC_INDEX /* Automatic indexes */ - if( !pBuilder->pOrSet + if( !pBuilder->pOrSet /* Not part of an OR optimization */ + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 - && pSrc->pIndex==0 - && !pSrc->viaCoroutine - && !pSrc->notIndexed - && HasRowid(pTab) - && !pSrc->isCorrelated - && !pSrc->isRecursive + && pSrc->pIBIndex==0 /* Has no INDEXED BY clause */ + && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ + && HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */ + && !pSrc->fg.isCorrelated /* Not a correlated subquery */ + && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ ){ /* Generate auto-index WhereLoops */ WhereTerm *pTerm; @@ -119757,16 +139024,19 @@ static int whereLoopAddBtree( /* TUNING: One-time cost for computing the automatic index is ** estimated to be X*N*log2(N) where N is the number of rows in ** the table being indexed and where X is 7 (LogEst=28) for normal - ** tables or 1.375 (LogEst=4) for views and subqueries. The value + ** tables or 0.5 (LogEst=-10) for views and subqueries. The value ** of X is smaller for views and subqueries so that the query planner ** will be more aggressive about generating automatic indexes for ** those objects, since there is no opportunity to add schema ** indexes on subqueries and views. */ - pNew->rSetup = rLogSize + rSize + 4; + pNew->rSetup = rLogSize + rSize; if( pTab->pSelect==0 && (pTab->tabFlags & TF_Ephemeral)==0 ){ - pNew->rSetup += 24; + pNew->rSetup += 28; + }else{ + pNew->rSetup -= 10; } ApplyCostMultiplier(pNew->rSetup, pTab->costMult); + if( pNew->rSetup<0 ) pNew->rSetup = 0; /* TUNING: Each index lookup yields 20 rows in the table. This ** is more than the usual guess of 10 rows, since we have no way ** of knowing how selective the index will ultimately be. It would @@ -119774,28 +139044,33 @@ static int whereLoopAddBtree( pNew->nOut = 43; assert( 43==sqlite3LogEst(20) ); pNew->rRun = sqlite3LogEstAdd(rLogSize,pNew->nOut); pNew->wsFlags = WHERE_AUTO_INDEX; - pNew->prereq = mExtra | pTerm->prereqRight; + pNew->prereq = mPrereq | pTerm->prereqRight; rc = whereLoopInsert(pBuilder, pNew); } } } #endif /* SQLITE_OMIT_AUTOMATIC_INDEX */ - /* Loop over all indices - */ - for(; rc==SQLITE_OK && pProbe; pProbe=pProbe->pNext, iSortIdx++){ + /* Loop over all indices. If there was an INDEXED BY clause, then only + ** consider index pProbe. */ + for(; rc==SQLITE_OK && pProbe; + pProbe=(pSrc->pIBIndex ? 0 : pProbe->pNext), iSortIdx++ + ){ if( pProbe->pPartIdxWhere!=0 && !whereUsablePartialIndex(pSrc->iCursor, pWC, pProbe->pPartIdxWhere) ){ testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */ continue; /* Partial index inappropriate for this query */ } + if( pProbe->bNoQuery ) continue; rSize = pProbe->aiRowLogEst[0]; pNew->u.btree.nEq = 0; + pNew->u.btree.nBtm = 0; + pNew->u.btree.nTop = 0; pNew->nSkip = 0; pNew->nLTerm = 0; pNew->iSortIdx = 0; pNew->rSetup = 0; - pNew->prereq = mExtra; + pNew->prereq = mPrereq; pNew->nOut = rSize; pNew->u.btree.pIndex = pProbe; b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); @@ -119827,6 +139102,7 @@ static int whereLoopAddBtree( /* Full scan via index */ if( b || !HasRowid(pTab) + || pProbe->pPartIdxWhere!=0 || ( m==0 && pProbe->bUnordered==0 && (pProbe->szIdxRow<pTab->szTabRow) @@ -119839,11 +139115,34 @@ static int whereLoopAddBtree( /* The cost of visiting the index rows is N*K, where K is ** between 1.1 and 3.0, depending on the relative sizes of the - ** index and table rows. If this is a non-covering index scan, - ** also add the cost of visiting table rows (N*3.0). */ + ** index and table rows. */ pNew->rRun = rSize + 1 + (15*pProbe->szIdxRow)/pTab->szTabRow; if( m!=0 ){ - pNew->rRun = sqlite3LogEstAdd(pNew->rRun, rSize+16); + /* If this is a non-covering index scan, add in the cost of + ** doing table lookups. The cost will be 3x the number of + ** lookups. Take into account WHERE clause terms that can be + ** satisfied using just the index, and that do not require a + ** table lookup. */ + LogEst nLookup = rSize + 16; /* Base cost: N*3 */ + int ii; + int iCur = pSrc->iCursor; + WhereClause *pWC2 = &pWInfo->sWC; + for(ii=0; ii<pWC2->nTerm; ii++){ + WhereTerm *pTerm = &pWC2->a[ii]; + if( !sqlite3ExprCoveredByIndex(pTerm->pExpr, iCur, pProbe) ){ + break; + } + /* pTerm can be evaluated using just the index. So reduce + ** the expected number of table lookups accordingly */ + if( pTerm->truthProb<=0 ){ + nLookup += pTerm->truthProb; + }else{ + nLookup--; + if( pTerm->eOperator & (WO_EQ|WO_IS) ) nLookup -= 19; + } + } + + pNew->rRun = sqlite3LogEstAdd(pNew->rRun, nLookup); } ApplyCostMultiplier(pNew->rRun, pTab->costMult); whereLoopOutputAdjust(pWC, pNew, rSize); @@ -119853,185 +139152,345 @@ static int whereLoopAddBtree( } } + pBuilder->bldFlags = 0; rc = whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, 0); + if( pBuilder->bldFlags==SQLITE_BLDF_INDEXED ){ + /* If a non-unique index is used, or if a prefix of the key for + ** unique index is used (making the index functionally non-unique) + ** then the sqlite_stat1 data becomes important for scoring the + ** plan */ + pTab->tabFlags |= TF_StatsUsed; + } #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 sqlite3Stat4ProbeFree(pBuilder->pRec); pBuilder->nRecValid = 0; pBuilder->pRec = 0; #endif - - /* If there was an INDEXED BY clause, then only that one index is - ** considered. */ - if( pSrc->pIndex ) break; } return rc; } #ifndef SQLITE_OMIT_VIRTUALTABLE + +/* +** Argument pIdxInfo is already populated with all constraints that may +** be used by the virtual table identified by pBuilder->pNew->iTab. This +** function marks a subset of those constraints usable, invokes the +** xBestIndex method and adds the returned plan to pBuilder. +** +** A constraint is marked usable if: +** +** * Argument mUsable indicates that its prerequisites are available, and +** +** * It is not one of the operators specified in the mExclude mask passed +** as the fourth argument (which in practice is either WO_IN or 0). +** +** Argument mPrereq is a mask of tables that must be scanned before the +** virtual table in question. These are added to the plans prerequisites +** before it is added to pBuilder. +** +** Output parameter *pbIn is set to true if the plan added to pBuilder +** uses one or more WO_IN terms, or false otherwise. +*/ +static int whereLoopAddVirtualOne( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, /* Mask of tables that must be used. */ + Bitmask mUsable, /* Mask of usable tables */ + u16 mExclude, /* Exclude terms using these operators */ + sqlite3_index_info *pIdxInfo, /* Populated object for xBestIndex */ + u16 mNoOmit, /* Do not omit these constraints */ + int *pbIn /* OUT: True if plan uses an IN(...) op */ +){ + WhereClause *pWC = pBuilder->pWC; + struct sqlite3_index_constraint *pIdxCons; + struct sqlite3_index_constraint_usage *pUsage = pIdxInfo->aConstraintUsage; + int i; + int mxTerm; + int rc = SQLITE_OK; + WhereLoop *pNew = pBuilder->pNew; + Parse *pParse = pBuilder->pWInfo->pParse; + struct SrcList_item *pSrc = &pBuilder->pWInfo->pTabList->a[pNew->iTab]; + int nConstraint = pIdxInfo->nConstraint; + + assert( (mUsable & mPrereq)==mPrereq ); + *pbIn = 0; + pNew->prereq = mPrereq; + + /* Set the usable flag on the subset of constraints identified by + ** arguments mUsable and mExclude. */ + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; i<nConstraint; i++, pIdxCons++){ + WhereTerm *pTerm = &pWC->a[pIdxCons->iTermOffset]; + pIdxCons->usable = 0; + if( (pTerm->prereqRight & mUsable)==pTerm->prereqRight + && (pTerm->eOperator & mExclude)==0 + ){ + pIdxCons->usable = 1; + } + } + + /* Initialize the output fields of the sqlite3_index_info structure */ + memset(pUsage, 0, sizeof(pUsage[0])*nConstraint); + assert( pIdxInfo->needToFreeIdxStr==0 ); + pIdxInfo->idxStr = 0; + pIdxInfo->idxNum = 0; + pIdxInfo->orderByConsumed = 0; + pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; + pIdxInfo->estimatedRows = 25; + pIdxInfo->idxFlags = 0; + pIdxInfo->colUsed = (sqlite3_int64)pSrc->colUsed; + + /* Invoke the virtual table xBestIndex() method */ + rc = vtabBestIndex(pParse, pSrc->pTab, pIdxInfo); + if( rc ) return rc; + + mxTerm = -1; + assert( pNew->nLSlot>=nConstraint ); + for(i=0; i<nConstraint; i++) pNew->aLTerm[i] = 0; + pNew->u.vtab.omitMask = 0; + pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; + for(i=0; i<nConstraint; i++, pIdxCons++){ + int iTerm; + if( (iTerm = pUsage[i].argvIndex - 1)>=0 ){ + WhereTerm *pTerm; + int j = pIdxCons->iTermOffset; + if( iTerm>=nConstraint + || j<0 + || j>=pWC->nTerm + || pNew->aLTerm[iTerm]!=0 + || pIdxCons->usable==0 + ){ + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); + testcase( pIdxInfo->needToFreeIdxStr ); + return SQLITE_ERROR; + } + testcase( iTerm==nConstraint-1 ); + testcase( j==0 ); + testcase( j==pWC->nTerm-1 ); + pTerm = &pWC->a[j]; + pNew->prereq |= pTerm->prereqRight; + assert( iTerm<pNew->nLSlot ); + pNew->aLTerm[iTerm] = pTerm; + if( iTerm>mxTerm ) mxTerm = iTerm; + testcase( iTerm==15 ); + testcase( iTerm==16 ); + if( iTerm<16 && pUsage[i].omit ) pNew->u.vtab.omitMask |= 1<<iTerm; + if( (pTerm->eOperator & WO_IN)!=0 ){ + /* A virtual table that is constrained by an IN clause may not + ** consume the ORDER BY clause because (1) the order of IN terms + ** is not necessarily related to the order of output terms and + ** (2) Multiple outputs from a single IN value will not merge + ** together. */ + pIdxInfo->orderByConsumed = 0; + pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE; + *pbIn = 1; assert( (mExclude & WO_IN)==0 ); + } + } + } + pNew->u.vtab.omitMask &= ~mNoOmit; + + pNew->nLTerm = mxTerm+1; + for(i=0; i<=mxTerm; i++){ + if( pNew->aLTerm[i]==0 ){ + /* The non-zero argvIdx values must be contiguous. Raise an + ** error if they are not */ + sqlite3ErrorMsg(pParse,"%s.xBestIndex malfunction",pSrc->pTab->zName); + testcase( pIdxInfo->needToFreeIdxStr ); + return SQLITE_ERROR; + } + } + assert( pNew->nLTerm<=pNew->nLSlot ); + pNew->u.vtab.idxNum = pIdxInfo->idxNum; + pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr; + pIdxInfo->needToFreeIdxStr = 0; + pNew->u.vtab.idxStr = pIdxInfo->idxStr; + pNew->u.vtab.isOrdered = (i8)(pIdxInfo->orderByConsumed ? + pIdxInfo->nOrderBy : 0); + pNew->rSetup = 0; + pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost); + pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows); + + /* Set the WHERE_ONEROW flag if the xBestIndex() method indicated + ** that the scan will visit at most one row. Clear it otherwise. */ + if( pIdxInfo->idxFlags & SQLITE_INDEX_SCAN_UNIQUE ){ + pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags &= ~WHERE_ONEROW; + } + rc = whereLoopInsert(pBuilder, pNew); + if( pNew->u.vtab.needFree ){ + sqlite3_free(pNew->u.vtab.idxStr); + pNew->u.vtab.needFree = 0; + } + WHERETRACE(0xffff, (" bIn=%d prereqIn=%04llx prereqOut=%04llx\n", + *pbIn, (sqlite3_uint64)mPrereq, + (sqlite3_uint64)(pNew->prereq & ~mPrereq))); + + return rc; +} + +/* +** If this function is invoked from within an xBestIndex() callback, it +** returns a pointer to a buffer containing the name of the collation +** sequence associated with element iCons of the sqlite3_index_info.aConstraint +** array. Or, if iCons is out of range or there is no active xBestIndex +** call, return NULL. +*/ +SQLITE_API const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){ + HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; + const char *zRet = 0; + if( iCons>=0 && iCons<pIdxInfo->nConstraint ){ + CollSeq *pC = 0; + int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset; + Expr *pX = pHidden->pWC->a[iTerm].pExpr; + if( pX->pLeft ){ + pC = sqlite3BinaryCompareCollSeq(pHidden->pParse, pX->pLeft, pX->pRight); + } + zRet = (pC ? pC->zName : "BINARY"); + } + return zRet; +} + /* ** Add all WhereLoop objects for a table of the join identified by ** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table. +** +** If there are no LEFT or CROSS JOIN joins in the query, both mPrereq and +** mUnusable are set to 0. Otherwise, mPrereq is a mask of all FROM clause +** entries that occur before the virtual table in the FROM clause and are +** separated from it by at least one LEFT or CROSS JOIN. Similarly, the +** mUnusable mask contains all FROM clause entries that occur after the +** virtual table and are separated from it by at least one LEFT or +** CROSS JOIN. +** +** For example, if the query were: +** +** ... FROM t1, t2 LEFT JOIN t3, t4, vt CROSS JOIN t5, t6; +** +** then mPrereq corresponds to (t1, t2) and mUnusable to (t5, t6). +** +** All the tables in mPrereq must be scanned before the current virtual +** table. So any terms for which all prerequisites are satisfied by +** mPrereq may be specified as "usable" in all calls to xBestIndex. +** Conversely, all tables in mUnusable must be scanned after the current +** virtual table, so any terms for which the prerequisites overlap with +** mUnusable should always be configured as "not-usable" for xBestIndex. */ static int whereLoopAddVirtual( WhereLoopBuilder *pBuilder, /* WHERE clause information */ - Bitmask mExtra + Bitmask mPrereq, /* Tables that must be scanned before this one */ + Bitmask mUnusable /* Tables that must be scanned after this one */ ){ + int rc = SQLITE_OK; /* Return code */ WhereInfo *pWInfo; /* WHERE analysis context */ Parse *pParse; /* The parsing context */ WhereClause *pWC; /* The WHERE clause */ struct SrcList_item *pSrc; /* The FROM clause term to search */ - Table *pTab; - sqlite3 *db; - sqlite3_index_info *pIdxInfo; - struct sqlite3_index_constraint *pIdxCons; - struct sqlite3_index_constraint_usage *pUsage; - WhereTerm *pTerm; - int i, j; - int iTerm, mxTerm; - int nConstraint; - int seenIn = 0; /* True if an IN operator is seen */ - int seenVar = 0; /* True if a non-constant constraint is seen */ - int iPhase; /* 0: const w/o IN, 1: const, 2: no IN, 2: IN */ + sqlite3_index_info *p; /* Object to pass to xBestIndex() */ + int nConstraint; /* Number of constraints in p */ + int bIn; /* True if plan uses IN(...) operator */ WhereLoop *pNew; - int rc = SQLITE_OK; + Bitmask mBest; /* Tables used by best possible plan */ + u16 mNoOmit; + assert( (mPrereq & mUnusable)==0 ); pWInfo = pBuilder->pWInfo; pParse = pWInfo->pParse; - db = pParse->db; pWC = pBuilder->pWC; pNew = pBuilder->pNew; pSrc = &pWInfo->pTabList->a[pNew->iTab]; - pTab = pSrc->pTab; - assert( IsVirtual(pTab) ); - pIdxInfo = allocateIndexInfo(pParse, pWC, pSrc, pBuilder->pOrderBy); - if( pIdxInfo==0 ) return SQLITE_NOMEM; - pNew->prereq = 0; + assert( IsVirtual(pSrc->pTab) ); + p = allocateIndexInfo(pParse, pWC, mUnusable, pSrc, pBuilder->pOrderBy, + &mNoOmit); + if( p==0 ) return SQLITE_NOMEM_BKPT; pNew->rSetup = 0; pNew->wsFlags = WHERE_VIRTUALTABLE; pNew->nLTerm = 0; pNew->u.vtab.needFree = 0; - pUsage = pIdxInfo->aConstraintUsage; - nConstraint = pIdxInfo->nConstraint; - if( whereLoopResize(db, pNew, nConstraint) ){ - sqlite3DbFree(db, pIdxInfo); - return SQLITE_NOMEM; + nConstraint = p->nConstraint; + if( whereLoopResize(pParse->db, pNew, nConstraint) ){ + sqlite3DbFree(pParse->db, p); + return SQLITE_NOMEM_BKPT; } - for(iPhase=0; iPhase<=3; iPhase++){ - if( !seenIn && (iPhase&1)!=0 ){ - iPhase++; - if( iPhase>3 ) break; - } - if( !seenVar && iPhase>1 ) break; - pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; - for(i=0; i<pIdxInfo->nConstraint; i++, pIdxCons++){ - j = pIdxCons->iTermOffset; - pTerm = &pWC->a[j]; - switch( iPhase ){ - case 0: /* Constants without IN operator */ - pIdxCons->usable = 0; - if( (pTerm->eOperator & WO_IN)!=0 ){ - seenIn = 1; - } - if( pTerm->prereqRight!=0 ){ - seenVar = 1; - }else if( (pTerm->eOperator & WO_IN)==0 ){ - pIdxCons->usable = 1; - } - break; - case 1: /* Constants with IN operators */ - assert( seenIn ); - pIdxCons->usable = (pTerm->prereqRight==0); - break; - case 2: /* Variables without IN */ - assert( seenVar ); - pIdxCons->usable = (pTerm->eOperator & WO_IN)==0; - break; - default: /* Variables with IN */ - assert( seenVar && seenIn ); - pIdxCons->usable = 1; - break; - } - } - memset(pUsage, 0, sizeof(pUsage[0])*pIdxInfo->nConstraint); - if( pIdxInfo->needToFreeIdxStr ) sqlite3_free(pIdxInfo->idxStr); - pIdxInfo->idxStr = 0; - pIdxInfo->idxNum = 0; - pIdxInfo->needToFreeIdxStr = 0; - pIdxInfo->orderByConsumed = 0; - pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; - pIdxInfo->estimatedRows = 25; - rc = vtabBestIndex(pParse, pTab, pIdxInfo); - if( rc ) goto whereLoopAddVtab_exit; - pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; - pNew->prereq = mExtra; - mxTerm = -1; - assert( pNew->nLSlot>=nConstraint ); - for(i=0; i<nConstraint; i++) pNew->aLTerm[i] = 0; - pNew->u.vtab.omitMask = 0; - for(i=0; i<nConstraint; i++, pIdxCons++){ - if( (iTerm = pUsage[i].argvIndex - 1)>=0 ){ - j = pIdxCons->iTermOffset; - if( iTerm>=nConstraint - || j<0 - || j>=pWC->nTerm - || pNew->aLTerm[iTerm]!=0 - ){ - rc = SQLITE_ERROR; - sqlite3ErrorMsg(pParse, "%s.xBestIndex() malfunction", pTab->zName); - goto whereLoopAddVtab_exit; - } - testcase( iTerm==nConstraint-1 ); - testcase( j==0 ); - testcase( j==pWC->nTerm-1 ); - pTerm = &pWC->a[j]; - pNew->prereq |= pTerm->prereqRight; - assert( iTerm<pNew->nLSlot ); - pNew->aLTerm[iTerm] = pTerm; - if( iTerm>mxTerm ) mxTerm = iTerm; - testcase( iTerm==15 ); - testcase( iTerm==16 ); - if( iTerm<16 && pUsage[i].omit ) pNew->u.vtab.omitMask |= 1<<iTerm; - if( (pTerm->eOperator & WO_IN)!=0 ){ - if( pUsage[i].omit==0 ){ - /* Do not attempt to use an IN constraint if the virtual table - ** says that the equivalent EQ constraint cannot be safely omitted. - ** If we do attempt to use such a constraint, some rows might be - ** repeated in the output. */ - break; - } - /* A virtual table that is constrained by an IN clause may not - ** consume the ORDER BY clause because (1) the order of IN terms - ** is not necessarily related to the order of output terms and - ** (2) Multiple outputs from a single IN value will not merge - ** together. */ - pIdxInfo->orderByConsumed = 0; - } - } - } - if( i>=nConstraint ){ - pNew->nLTerm = mxTerm+1; - assert( pNew->nLTerm<=pNew->nLSlot ); - pNew->u.vtab.idxNum = pIdxInfo->idxNum; - pNew->u.vtab.needFree = pIdxInfo->needToFreeIdxStr; - pIdxInfo->needToFreeIdxStr = 0; - pNew->u.vtab.idxStr = pIdxInfo->idxStr; - pNew->u.vtab.isOrdered = (i8)(pIdxInfo->orderByConsumed ? - pIdxInfo->nOrderBy : 0); - pNew->rSetup = 0; - pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost); - pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows); - whereLoopInsert(pBuilder, pNew); - if( pNew->u.vtab.needFree ){ - sqlite3_free(pNew->u.vtab.idxStr); - pNew->u.vtab.needFree = 0; - } - } - } + /* First call xBestIndex() with all constraints usable. */ + WHERETRACE(0x800, ("BEGIN %s.addVirtual()\n", pSrc->pTab->zName)); + WHERETRACE(0x40, (" VirtualOne: all usable\n")); + rc = whereLoopAddVirtualOne(pBuilder, mPrereq, ALLBITS, 0, p, mNoOmit, &bIn); -whereLoopAddVtab_exit: - if( pIdxInfo->needToFreeIdxStr ) sqlite3_free(pIdxInfo->idxStr); - sqlite3DbFree(db, pIdxInfo); + /* If the call to xBestIndex() with all terms enabled produced a plan + ** that does not require any source tables (IOW: a plan with mBest==0), + ** then there is no point in making any further calls to xBestIndex() + ** since they will all return the same result (if the xBestIndex() + ** implementation is sane). */ + if( rc==SQLITE_OK && (mBest = (pNew->prereq & ~mPrereq))!=0 ){ + int seenZero = 0; /* True if a plan with no prereqs seen */ + int seenZeroNoIN = 0; /* Plan with no prereqs and no IN(...) seen */ + Bitmask mPrev = 0; + Bitmask mBestNoIn = 0; + + /* If the plan produced by the earlier call uses an IN(...) term, call + ** xBestIndex again, this time with IN(...) terms disabled. */ + if( bIn ){ + WHERETRACE(0x40, (" VirtualOne: all usable w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, ALLBITS, WO_IN, p, mNoOmit, &bIn); + assert( bIn==0 ); + mBestNoIn = pNew->prereq & ~mPrereq; + if( mBestNoIn==0 ){ + seenZero = 1; + seenZeroNoIN = 1; + } + } + + /* Call xBestIndex once for each distinct value of (prereqRight & ~mPrereq) + ** in the set of terms that apply to the current virtual table. */ + while( rc==SQLITE_OK ){ + int i; + Bitmask mNext = ALLBITS; + assert( mNext>0 ); + for(i=0; i<nConstraint; i++){ + Bitmask mThis = ( + pWC->a[p->aConstraint[i].iTermOffset].prereqRight & ~mPrereq + ); + if( mThis>mPrev && mThis<mNext ) mNext = mThis; + } + mPrev = mNext; + if( mNext==ALLBITS ) break; + if( mNext==mBest || mNext==mBestNoIn ) continue; + WHERETRACE(0x40, (" VirtualOne: mPrev=%04llx mNext=%04llx\n", + (sqlite3_uint64)mPrev, (sqlite3_uint64)mNext)); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mNext|mPrereq, 0, p, mNoOmit, &bIn); + if( pNew->prereq==mPrereq ){ + seenZero = 1; + if( bIn==0 ) seenZeroNoIN = 1; + } + } + + /* If the calls to xBestIndex() in the above loop did not find a plan + ** that requires no source tables at all (i.e. one guaranteed to be + ** usable), make a call here with all source tables disabled */ + if( rc==SQLITE_OK && seenZero==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, 0, p, mNoOmit, &bIn); + if( bIn==0 ) seenZeroNoIN = 1; + } + + /* If the calls to xBestIndex() have so far failed to find a plan + ** that requires no source tables at all and does not use an IN(...) + ** operator, make a final call to obtain one here. */ + if( rc==SQLITE_OK && seenZeroNoIN==0 ){ + WHERETRACE(0x40, (" VirtualOne: all disabled and w/o IN\n")); + rc = whereLoopAddVirtualOne( + pBuilder, mPrereq, mPrereq, WO_IN, p, mNoOmit, &bIn); + } + } + + if( p->needToFreeIdxStr ) sqlite3_free(p->idxStr); + sqlite3DbFreeNN(pParse->db, p); + WHERETRACE(0x800, ("END %s.addVirtual(), rc=%d\n", pSrc->pTab->zName, rc)); return rc; } #endif /* SQLITE_OMIT_VIRTUALTABLE */ @@ -120040,7 +139499,11 @@ whereLoopAddVtab_exit: ** Add WhereLoop entries to handle OR terms. This works for either ** btrees or virtual tables. */ -static int whereLoopAddOr(WhereLoopBuilder *pBuilder, Bitmask mExtra){ +static int whereLoopAddOr( + WhereLoopBuilder *pBuilder, + Bitmask mPrereq, + Bitmask mUnusable +){ WhereInfo *pWInfo = pBuilder->pWInfo; WhereClause *pWC; WhereLoop *pNew; @@ -120092,21 +139555,19 @@ static int whereLoopAddOr(WhereLoopBuilder *pBuilder, Bitmask mExtra){ WHERETRACE(0x200, ("OR-term %d of %p has %d subterms:\n", (int)(pOrTerm-pOrWC->a), pTerm, sSubBuild.pWC->nTerm)); if( sqlite3WhereTrace & 0x400 ){ - for(i=0; i<sSubBuild.pWC->nTerm; i++){ - whereTermPrint(&sSubBuild.pWC->a[i], i); - } + sqlite3WhereClausePrint(sSubBuild.pWC); } #endif #ifndef SQLITE_OMIT_VIRTUALTABLE if( IsVirtual(pItem->pTab) ){ - rc = whereLoopAddVirtual(&sSubBuild, mExtra); + rc = whereLoopAddVirtual(&sSubBuild, mPrereq, mUnusable); }else #endif { - rc = whereLoopAddBtree(&sSubBuild, mExtra); + rc = whereLoopAddBtree(&sSubBuild, mPrereq); } if( rc==SQLITE_OK ){ - rc = whereLoopAddOr(&sSubBuild, mExtra); + rc = whereLoopAddOr(&sSubBuild, mPrereq, mUnusable); } assert( rc==SQLITE_OK || sCur.n==0 ); if( sCur.n==0 ){ @@ -120163,44 +139624,57 @@ static int whereLoopAddOr(WhereLoopBuilder *pBuilder, Bitmask mExtra){ */ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ WhereInfo *pWInfo = pBuilder->pWInfo; - Bitmask mExtra = 0; + Bitmask mPrereq = 0; Bitmask mPrior = 0; int iTab; SrcList *pTabList = pWInfo->pTabList; struct SrcList_item *pItem; + struct SrcList_item *pEnd = &pTabList->a[pWInfo->nLevel]; sqlite3 *db = pWInfo->pParse->db; - int nTabList = pWInfo->nLevel; int rc = SQLITE_OK; - u8 priorJoinType = 0; WhereLoop *pNew; + u8 priorJointype = 0; /* Loop over the tables in the join, from left to right */ pNew = pBuilder->pNew; whereLoopInit(pNew); - for(iTab=0, pItem=pTabList->a; iTab<nTabList; iTab++, pItem++){ + for(iTab=0, pItem=pTabList->a; pItem<pEnd; iTab++, pItem++){ + Bitmask mUnusable = 0; pNew->iTab = iTab; - pNew->maskSelf = getMask(&pWInfo->sMaskSet, pItem->iCursor); - if( ((pItem->jointype|priorJoinType) & (JT_LEFT|JT_CROSS))!=0 ){ - mExtra = mPrior; + pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); + if( ((pItem->fg.jointype|priorJointype) & (JT_LEFT|JT_CROSS))!=0 ){ + /* This condition is true when pItem is the FROM clause term on the + ** right-hand-side of a LEFT or CROSS JOIN. */ + mPrereq = mPrior; } - priorJoinType = pItem->jointype; + priorJointype = pItem->fg.jointype; +#ifndef SQLITE_OMIT_VIRTUALTABLE if( IsVirtual(pItem->pTab) ){ - rc = whereLoopAddVirtual(pBuilder, mExtra); - }else{ - rc = whereLoopAddBtree(pBuilder, mExtra); + struct SrcList_item *p; + for(p=&pItem[1]; p<pEnd; p++){ + if( mUnusable || (p->fg.jointype & (JT_LEFT|JT_CROSS)) ){ + mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); + } + } + rc = whereLoopAddVirtual(pBuilder, mPrereq, mUnusable); + }else +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + { + rc = whereLoopAddBtree(pBuilder, mPrereq); } if( rc==SQLITE_OK ){ - rc = whereLoopAddOr(pBuilder, mExtra); + rc = whereLoopAddOr(pBuilder, mPrereq, mUnusable); } mPrior |= pNew->maskSelf; if( rc || db->mallocFailed ) break; } + whereLoopClear(db, pNew); return rc; } /* -** Examine a WherePath (with the addition of the extra WhereLoop of the 5th +** Examine a WherePath (with the addition of the extra WhereLoop of the 6th ** parameters) to see if it outputs rows in the requested ORDER BY ** (or GROUP BY) without requiring a separate sort operation. Return N: ** @@ -120220,7 +139694,7 @@ static i8 wherePathSatisfiesOrderBy( WhereInfo *pWInfo, /* The WHERE clause */ ExprList *pOrderBy, /* ORDER BY or GROUP BY or DISTINCT clause to check */ WherePath *pPath, /* The WherePath to check */ - u16 wctrlFlags, /* Might contain WHERE_GROUPBY or WHERE_DISTINCTBY */ + u16 wctrlFlags, /* WHERE_GROUPBY or _DISTINCTBY or _ORDERBY_LIMIT */ u16 nLoop, /* Number of entries in pPath->aLoop[] */ WhereLoop *pLast, /* Add this WhereLoop to the end of pPath->aLoop[] */ Bitmask *pRevMask /* OUT: Mask of WhereLoops to run in reverse order */ @@ -120231,6 +139705,7 @@ static i8 wherePathSatisfiesOrderBy( u8 isOrderDistinct; /* All prior WhereLoops are order-distinct */ u8 distinctColumns; /* True if the loop has UNIQUE NOT NULL columns */ u8 isMatch; /* iColumn matches a term of the ORDER BY clause */ + u16 eqOpMask; /* Allowed equality operators */ u16 nKeyCol; /* Number of key columns in pIndex */ u16 nColumn; /* Total number of ordered columns in the index */ u16 nOrderBy; /* Number terms in the ORDER BY clause */ @@ -120281,12 +139756,21 @@ static i8 wherePathSatisfiesOrderBy( obDone = MASKBIT(nOrderBy)-1; orderDistinctMask = 0; ready = 0; + eqOpMask = WO_EQ | WO_IS | WO_ISNULL; + if( wctrlFlags & WHERE_ORDERBY_LIMIT ) eqOpMask |= WO_IN; for(iLoop=0; isOrderDistinct && obSat<obDone && iLoop<=nLoop; iLoop++){ if( iLoop>0 ) ready |= pLoop->maskSelf; - pLoop = iLoop<nLoop ? pPath->aLoop[iLoop] : pLast; + if( iLoop<nLoop ){ + pLoop = pPath->aLoop[iLoop]; + if( wctrlFlags & WHERE_ORDERBY_LIMIT ) continue; + }else{ + pLoop = pLast; + } if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ if( pLoop->u.vtab.isOrdered ) obSat = obDone; break; + }else{ + pLoop->u.btree.nIdxCol = 0; } iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; @@ -120300,18 +139784,23 @@ static i8 wherePathSatisfiesOrderBy( pOBExpr = sqlite3ExprSkipCollate(pOrderBy->a[i].pExpr); if( pOBExpr->op!=TK_COLUMN ) continue; if( pOBExpr->iTable!=iCur ) continue; - pTerm = findTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, - ~ready, WO_EQ|WO_ISNULL, 0); + pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, + ~ready, eqOpMask, 0); if( pTerm==0 ) continue; - if( (pTerm->eOperator&WO_EQ)!=0 && pOBExpr->iColumn>=0 ){ - const char *z1, *z2; - pColl = sqlite3ExprCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); - if( !pColl ) pColl = db->pDfltColl; - z1 = pColl->zName; - pColl = sqlite3ExprCollSeq(pWInfo->pParse, pTerm->pExpr); - if( !pColl ) pColl = db->pDfltColl; - z2 = pColl->zName; - if( sqlite3StrICmp(z1, z2)!=0 ) continue; + if( pTerm->eOperator==WO_IN ){ + /* IN terms are only valid for sorting in the ORDER BY LIMIT + ** optimization, and then only if they are actually used + ** by the query plan */ + assert( wctrlFlags & WHERE_ORDERBY_LIMIT ); + for(j=0; j<pLoop->nLTerm && pTerm!=pLoop->aLTerm[j]; j++){} + if( j>=pLoop->nLTerm ) continue; + } + if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ + if( sqlite3ExprCollSeqMatch(pWInfo->pParse, + pOrderBy->a[i].pExpr, pTerm->pExpr)==0 ){ + continue; + } + testcase( pTerm->pExpr->op==TK_IS ); } obSat |= MASKBIT(i); } @@ -120327,7 +139816,8 @@ static i8 wherePathSatisfiesOrderBy( nKeyCol = pIndex->nKeyCol; nColumn = pIndex->nColumn; assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); - assert( pIndex->aiColumn[nColumn-1]==(-1) || !HasRowid(pIndex->pTable)); + assert( pIndex->aiColumn[nColumn-1]==XN_ROWID + || !HasRowid(pIndex->pTable)); isOrderDistinct = IsUniqueIndex(pIndex); } @@ -120337,18 +139827,42 @@ static i8 wherePathSatisfiesOrderBy( rev = revSet = 0; distinctColumns = 0; for(j=0; j<nColumn; j++){ - u8 bOnce; /* True to run the ORDER BY search loop */ + u8 bOnce = 1; /* True to run the ORDER BY search loop */ - /* Skip over == and IS NULL terms */ - if( j<pLoop->u.btree.nEq - && pLoop->nSkip==0 - && ((i = pLoop->aLTerm[j]->eOperator) & (WO_EQ|WO_ISNULL))!=0 - ){ - if( i & WO_ISNULL ){ - testcase( isOrderDistinct ); - isOrderDistinct = 0; + assert( j>=pLoop->u.btree.nEq + || (pLoop->aLTerm[j]==0)==(j<pLoop->nSkip) + ); + if( j<pLoop->u.btree.nEq && j>=pLoop->nSkip ){ + u16 eOp = pLoop->aLTerm[j]->eOperator; + + /* Skip over == and IS and ISNULL terms. (Also skip IN terms when + ** doing WHERE_ORDERBY_LIMIT processing). + ** + ** If the current term is a column of an ((?,?) IN (SELECT...)) + ** expression for which the SELECT returns more than one column, + ** check that it is the only column used by this loop. Otherwise, + ** if it is one of two or more, none of the columns can be + ** considered to match an ORDER BY term. */ + if( (eOp & eqOpMask)!=0 ){ + if( eOp & WO_ISNULL ){ + testcase( isOrderDistinct ); + isOrderDistinct = 0; + } + continue; + }else if( ALWAYS(eOp & WO_IN) ){ + /* ALWAYS() justification: eOp is an equality operator due to the + ** j<pLoop->u.btree.nEq constraint above. Any equality other + ** than WO_IN is captured by the previous "if". So this one + ** always has to be WO_IN. */ + Expr *pX = pLoop->aLTerm[j]->pExpr; + for(i=j+1; i<pLoop->u.btree.nEq; i++){ + if( pLoop->aLTerm[i]->pExpr==pX ){ + assert( (pLoop->aLTerm[i]->eOperator & WO_IN) ); + bOnce = 0; + break; + } + } } - continue; } /* Get the column number in the table (iColumn) and sort order @@ -120357,9 +139871,9 @@ static i8 wherePathSatisfiesOrderBy( if( pIndex ){ iColumn = pIndex->aiColumn[j]; revIdx = pIndex->aSortOrder[j]; - if( iColumn==pIndex->pTable->iPKey ) iColumn = -1; + if( iColumn==pIndex->pTable->iPKey ) iColumn = XN_ROWID; }else{ - iColumn = -1; + iColumn = XN_ROWID; revIdx = 0; } @@ -120377,7 +139891,6 @@ static i8 wherePathSatisfiesOrderBy( /* Find the ORDER BY term that corresponds to the j-th column ** of the index and mark that ORDER BY term off */ - bOnce = 1; isMatch = 0; for(i=0; bOnce && i<nOrderBy; i++){ if( MASKBIT(i) & obSat ) continue; @@ -120385,14 +139898,21 @@ static i8 wherePathSatisfiesOrderBy( testcase( wctrlFlags & WHERE_GROUPBY ); testcase( wctrlFlags & WHERE_DISTINCTBY ); if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; - if( pOBExpr->op!=TK_COLUMN ) continue; - if( pOBExpr->iTable!=iCur ) continue; - if( pOBExpr->iColumn!=iColumn ) continue; - if( iColumn>=0 ){ - pColl = sqlite3ExprCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); - if( !pColl ) pColl = db->pDfltColl; + if( iColumn>=XN_ROWID ){ + if( pOBExpr->op!=TK_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + if( pOBExpr->iColumn!=iColumn ) continue; + }else{ + Expr *pIdxExpr = pIndex->aColExpr->a[j].pExpr; + if( sqlite3ExprCompareSkip(pOBExpr, pIdxExpr, iCur) ){ + continue; + } + } + if( iColumn!=XN_ROWID ){ + pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; } + pLoop->u.btree.nIdxCol = j+1; isMatch = 1; break; } @@ -120408,7 +139928,7 @@ static i8 wherePathSatisfiesOrderBy( } } if( isMatch ){ - if( iColumn<0 ){ + if( iColumn==XN_ROWID ){ testcase( distinctColumns==0 ); distinctColumns = 1; } @@ -120436,7 +139956,7 @@ static i8 wherePathSatisfiesOrderBy( Bitmask mTerm; if( MASKBIT(i) & obSat ) continue; p = pOrderBy->a[i].pExpr; - mTerm = exprTableUsage(&pWInfo->sMaskSet,p); + mTerm = sqlite3WhereExprUsage(&pWInfo->sMaskSet,p); if( mTerm==0 && !sqlite3ExprIsConstant(p) ) continue; if( (mTerm&~orderDistinctMask)==0 ){ obSat |= MASKBIT(i); @@ -120524,15 +140044,14 @@ static LogEst whereSortingCost( LogEst rScale, rSortCost; assert( nOrderBy>0 && 66==sqlite3LogEst(100) ); rScale = sqlite3LogEst((nOrderBy-nSorted)*100/nOrderBy) - 66; - rSortCost = nRow + estLog(nRow) + rScale + 16; + rSortCost = nRow + rScale + 16; - /* TUNING: The cost of implementing DISTINCT using a B-TREE is - ** similar but with a larger constant of proportionality. - ** Multiply by an additional factor of 3.0. */ - if( pWInfo->wctrlFlags & WHERE_WANT_DISTINCT ){ - rSortCost += 16; + /* Multiple by log(M) where M is the number of output rows. + ** Use the LIMIT for M if it is smaller */ + if( (pWInfo->wctrlFlags & WHERE_USE_LIMIT)!=0 && pWInfo->iLimit<nRow ){ + nRow = pWInfo->iLimit; } - + rSortCost += estLog(nRow); return rSortCost; } @@ -120594,8 +140113,8 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ /* Allocate and initialize space for aTo, aFrom and aSortCost[] */ nSpace = (sizeof(WherePath)+sizeof(WhereLoop*)*nLoop)*mxChoice*2; nSpace += sizeof(LogEst) * nOrderBy; - pSpace = sqlite3DbMallocRaw(db, nSpace); - if( pSpace==0 ) return SQLITE_NOMEM; + pSpace = sqlite3DbMallocRawNN(db, nSpace); + if( pSpace==0 ) return SQLITE_NOMEM_BKPT; aTo = (WherePath*)pSpace; aFrom = aTo+mxChoice; memset(aFrom, 0, sizeof(aFrom[0])); @@ -120618,10 +140137,10 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ /* Seed the search with a single WherePath containing zero WhereLoops. ** - ** TUNING: Do not let the number of iterations go above 25. If the cost - ** of computing an automatic index is not paid back within the first 25 + ** TUNING: Do not let the number of iterations go above 28. If the cost + ** of computing an automatic index is not paid back within the first 28 ** rows, then do not use the automatic index. */ - aFrom[0].nRow = MIN(pParse->nQueryLoop, 46); assert( 46==sqlite3LogEst(25) ); + aFrom[0].nRow = MIN(pParse->nQueryLoop, 48); assert( 48==sqlite3LogEst(28) ); nFrom = 1; assert( aFrom[0].isOrdered==0 ); if( nOrderBy ){ @@ -120650,6 +140169,15 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ if( (pWLoop->prereq & ~pFrom->maskLoop)!=0 ) continue; if( (pWLoop->maskSelf & pFrom->maskLoop)!=0 ) continue; + if( (pWLoop->wsFlags & WHERE_AUTO_INDEX)!=0 && pFrom->nRow<3 ){ + /* Do not use an automatic index if the this loop is expected + ** to run less than 1.25 times. It is tempting to also exclude + ** automatic index usage on an outer loop, but sometimes an automatic + ** index is useful in the outer loop of a correlated subquery. */ + assert( 10==sqlite3LogEst(2) ); + continue; + } + /* At this point, pWLoop is a candidate to be the next loop. ** Compute its cost */ rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup,pWLoop->rRun + pFrom->nRow); @@ -120677,6 +140205,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ rUnsorted, rCost)); }else{ rCost = rUnsorted; + rUnsorted -= 2; /* TUNING: Slight bias in favor of no-sort plans */ } /* Check to see if pWLoop should be added to the set of @@ -120708,8 +140237,8 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** this candidate as not viable. */ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ - sqlite3DebugPrintf("Skip %s cost=%-3d,%3d order=%c\n", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, + sqlite3DebugPrintf("Skip %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, isOrdered>=0 ? isOrdered+'0' : '?'); } #endif @@ -120727,26 +140256,36 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ pTo = &aTo[jj]; #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ - sqlite3DebugPrintf("New %s cost=%-3d,%3d order=%c\n", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, + sqlite3DebugPrintf("New %s cost=%-3d,%3d,%3d order=%c\n", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, isOrdered>=0 ? isOrdered+'0' : '?'); } #endif }else{ /* Control reaches here if best-so-far path pTo=aTo[jj] covers the - ** same set of loops and has the sam isOrdered setting as the + ** same set of loops and has the same isOrdered setting as the ** candidate path. Check to see if the candidate should replace - ** pTo or if the candidate should be skipped */ - if( pTo->rCost<rCost || (pTo->rCost==rCost && pTo->nRow<=nOut) ){ + ** pTo or if the candidate should be skipped. + ** + ** The conditional is an expanded vector comparison equivalent to: + ** (pTo->rCost,pTo->nRow,pTo->rUnsorted) <= (rCost,nOut,rUnsorted) + */ + if( pTo->rCost<rCost + || (pTo->rCost==rCost + && (pTo->nRow<nOut + || (pTo->nRow==nOut && pTo->rUnsorted<=rUnsorted) + ) + ) + ){ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( - "Skip %s cost=%-3d,%3d order=%c", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, + "Skip %s cost=%-3d,%3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, isOrdered>=0 ? isOrdered+'0' : '?'); - sqlite3DebugPrintf(" vs %s cost=%-3d,%d order=%c\n", + sqlite3DebugPrintf(" vs %s cost=%-3d,%3d,%3d order=%c\n", wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, - pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); } #endif /* Discard the candidate path from further consideration */ @@ -120759,12 +140298,12 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( - "Update %s cost=%-3d,%3d order=%c", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, + "Update %s cost=%-3d,%3d,%3d order=%c", + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, isOrdered>=0 ? isOrdered+'0' : '?'); - sqlite3DebugPrintf(" was %s cost=%-3d,%3d order=%c\n", + sqlite3DebugPrintf(" was %s cost=%-3d,%3d,%3d order=%c\n", wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, - pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); } #endif } @@ -120819,7 +140358,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ if( nFrom==0 ){ sqlite3ErrorMsg(pParse, "no query solution"); - sqlite3DbFree(db, pSpace); + sqlite3DbFreeNN(db, pSpace); return SQLITE_ERROR; } @@ -120855,11 +140394,29 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } }else{ pWInfo->nOBSat = pFrom->isOrdered; - if( pWInfo->nOBSat<0 ) pWInfo->nOBSat = 0; pWInfo->revMask = pFrom->revLoop; + if( pWInfo->nOBSat<=0 ){ + pWInfo->nOBSat = 0; + if( nLoop>0 ){ + u32 wsFlags = pFrom->aLoop[nLoop-1]->wsFlags; + if( (wsFlags & WHERE_ONEROW)==0 + && (wsFlags&(WHERE_IPK|WHERE_COLUMN_IN))!=(WHERE_IPK|WHERE_COLUMN_IN) + ){ + Bitmask m = 0; + int rc = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, pFrom, + WHERE_ORDERBY_LIMIT, nLoop-1, pFrom->aLoop[nLoop-1], &m); + testcase( wsFlags & WHERE_IPK ); + testcase( wsFlags & WHERE_COLUMN_IN ); + if( rc==pWInfo->pOrderBy->nExpr ){ + pWInfo->bOrderedInnerLoop = 1; + pWInfo->revMask = m; + } + } + } + } } if( (pWInfo->wctrlFlags & WHERE_SORTBYGROUP) - && pWInfo->nOBSat==pWInfo->pOrderBy->nExpr + && pWInfo->nOBSat==pWInfo->pOrderBy->nExpr && nLoop>0 ){ Bitmask revMask = 0; int nOrder = wherePathSatisfiesOrderBy(pWInfo, pWInfo->pOrderBy, @@ -120877,7 +140434,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ pWInfo->nRowOut = pFrom->nRow; /* Free temporary memory and return success */ - sqlite3DbFree(db, pSpace); + sqlite3DbFreeNN(db, pSpace); return SQLITE_OK; } @@ -120902,21 +140459,22 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ int j; Table *pTab; Index *pIdx; - + pWInfo = pBuilder->pWInfo; - if( pWInfo->wctrlFlags & WHERE_FORCE_TABLE ) return 0; + if( pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE ) return 0; assert( pWInfo->pTabList->nSrc>=1 ); pItem = pWInfo->pTabList->a; pTab = pItem->pTab; if( IsVirtual(pTab) ) return 0; - if( pItem->zIndex ) return 0; + if( pItem->fg.isIndexedBy ) return 0; iCur = pItem->iCursor; pWC = &pWInfo->sWC; pLoop = pBuilder->pNew; pLoop->wsFlags = 0; pLoop->nSkip = 0; - pTerm = findTerm(pWC, iCur, -1, 0, WO_EQ, 0); + pTerm = sqlite3WhereFindTerm(pWC, iCur, -1, 0, WO_EQ|WO_IS, 0); if( pTerm ){ + testcase( pTerm->eOperator & WO_IS ); pLoop->wsFlags = WHERE_COLUMN_EQ|WHERE_IPK|WHERE_ONEROW; pLoop->aLTerm[0] = pTerm; pLoop->nLTerm = 1; @@ -120925,14 +140483,17 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pLoop->rRun = 33; /* 33==sqlite3LogEst(10) */ }else{ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ + int opMask; assert( pLoop->aLTermSpace==pLoop->aLTerm ); if( !IsUniqueIndex(pIdx) || pIdx->pPartIdxWhere!=0 || pIdx->nKeyCol>ArraySize(pLoop->aLTermSpace) ) continue; + opMask = pIdx->uniqNotNull ? (WO_EQ|WO_IS) : WO_EQ; for(j=0; j<pIdx->nKeyCol; j++){ - pTerm = findTerm(pWC, iCur, pIdx->aiColumn[j], 0, WO_EQ, pIdx); + pTerm = sqlite3WhereFindTerm(pWC, iCur, j, 0, opMask, pIdx); if( pTerm==0 ) break; + testcase( pTerm->eOperator & WO_IS ); pLoop->aLTerm[j] = pTerm; } if( j!=pIdx->nKeyCol ) continue; @@ -120951,7 +140512,8 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ if( pLoop->wsFlags ){ pLoop->nOut = (LogEst)1; pWInfo->a[0].pWLoop = pLoop; - pLoop->maskSelf = getMask(&pWInfo->sMaskSet, iCur); + assert( pWInfo->sMaskSet.n==1 && iCur==pWInfo->sMaskSet.ix[0] ); + pLoop->maskSelf = 1; /* sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); */ pWInfo->a[0].iTabCur = iCur; pWInfo->nRowOut = 1; if( pWInfo->pOrderBy ) pWInfo->nOBSat = pWInfo->pOrderBy->nExpr; @@ -120966,6 +140528,32 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ return 0; } +/* +** Helper function for exprIsDeterministic(). +*/ +static int exprNodeIsDeterministic(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_ConstFunc)==0 ){ + pWalker->eCode = 0; + return WRC_Abort; + } + return WRC_Continue; +} + +/* +** Return true if the expression contains no non-deterministic SQL +** functions. Do not consider non-deterministic SQL functions that are +** part of sub-select statements. +*/ +static int exprIsDeterministic(Expr *p){ + Walker w; + memset(&w, 0, sizeof(w)); + w.eCode = 1; + w.xExprCallback = exprNodeIsDeterministic; + w.xSelectCallback = sqlite3SelectWalkFail; + sqlite3WalkExpr(&w, p); + return w.eCode; +} + /* ** Generate the beginning of the loop used for WHERE clause processing. ** The return value is a pointer to an opaque structure that contains @@ -121047,7 +140635,7 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ ** is called from an UPDATE or DELETE statement, then pOrderBy is NULL. ** ** The iIdxCur parameter is the cursor number of an index. If -** WHERE_ONETABLE_ONLY is set, iIdxCur is the cursor number of an index +** WHERE_OR_SUBCLAUSE is set, iIdxCur is the cursor number of an index ** to use for OR clause processing. The WHERE clause should use this ** specific cursor. If WHERE_ONEPASS_DESIRED is set, then iIdxCur is ** the first cursor in an array of cursors for all indices. iIdxCur should @@ -121055,13 +140643,14 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ ** used. */ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( - Parse *pParse, /* The parser context */ - SrcList *pTabList, /* FROM clause: A list of all tables to be scanned */ - Expr *pWhere, /* The WHERE clause */ - ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */ - ExprList *pResultSet, /* Result set of the query */ - u16 wctrlFlags, /* One of the WHERE_* flags defined in sqliteInt.h */ - int iIdxCur /* If WHERE_ONETABLE_ONLY is set, index cursor number */ + Parse *pParse, /* The parser context */ + SrcList *pTabList, /* FROM clause: A list of all tables to be scanned */ + Expr *pWhere, /* The WHERE clause */ + ExprList *pOrderBy, /* An ORDER BY (or GROUP BY) clause, or NULL */ + ExprList *pResultSet, /* Query result set. Req'd for DISTINCT */ + u16 wctrlFlags, /* The WHERE_* flags defined in sqliteInt.h */ + int iAuxArg /* If WHERE_OR_SUBCLAUSE is set, index cursor number + ** If WHERE_USE_LIMIT, then the limit amount */ ){ int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */ int nTabList; /* Number of elements in pTabList */ @@ -121075,7 +140664,16 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( int ii; /* Loop counter */ sqlite3 *db; /* Database connection */ int rc; /* Return code */ + u8 bFordelete = 0; /* OPFLAG_FORDELETE or zero, as appropriate */ + assert( (wctrlFlags & WHERE_ONEPASS_MULTIROW)==0 || ( + (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + )); + + /* Only one of WHERE_OR_SUBCLAUSE or WHERE_USE_LIMIT */ + assert( (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + || (wctrlFlags & WHERE_USE_LIMIT)==0 ); /* Variable initialization */ db = pParse->db; @@ -121102,11 +140700,11 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } /* This function normally generates a nested loop for all tables in - ** pTabList. But if the WHERE_ONETABLE_ONLY flag is set, then we should + ** pTabList. But if the WHERE_OR_SUBCLAUSE flag is set, then we should ** only generate code for the first table in pTabList and assume that ** any cursors associated with subsequent tables are uninitialized. */ - nTabList = (wctrlFlags & WHERE_ONETABLE_ONLY) ? 1 : pTabList->nSrc; + nTabList = (wctrlFlags & WHERE_OR_SUBCLAUSE) ? 1 : pTabList->nSrc; /* Allocate and initialize the WhereInfo structure that will become the ** return value. A single allocation is used to store the WhereInfo @@ -121116,21 +140714,27 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** some architectures. Hence the ROUND8() below. */ nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); - pWInfo = sqlite3DbMallocZero(db, nByteWInfo + sizeof(WhereLoop)); + pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); if( db->mallocFailed ){ sqlite3DbFree(db, pWInfo); pWInfo = 0; goto whereBeginError; } - pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; - pWInfo->nLevel = nTabList; pWInfo->pParse = pParse; pWInfo->pTabList = pTabList; pWInfo->pOrderBy = pOrderBy; + pWInfo->pWhere = pWhere; pWInfo->pResultSet = pResultSet; + pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; + pWInfo->nLevel = nTabList; pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v); pWInfo->wctrlFlags = wctrlFlags; + pWInfo->iLimit = iAuxArg; pWInfo->savedNQueryLoop = pParse->nQueryLoop; + memset(&pWInfo->nOBSat, 0, + offsetof(WhereInfo,sWC) - offsetof(WhereInfo,nOBSat)); + memset(&pWInfo->a[0], 0, sizeof(WhereLoop)+nTabList*sizeof(WhereLevel)); + assert( pWInfo->eOnePass==ONEPASS_OFF ); /* ONEPASS defaults to OFF */ pMaskSet = &pWInfo->sMaskSet; sWLB.pWInfo = pWInfo; sWLB.pWC = &pWInfo->sWC; @@ -121145,20 +140749,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** subexpression is separated by an AND operator. */ initMaskSet(pMaskSet); - whereClauseInit(&pWInfo->sWC, pWInfo); - whereSplit(&pWInfo->sWC, pWhere, TK_AND); + sqlite3WhereClauseInit(&pWInfo->sWC, pWInfo); + sqlite3WhereSplit(&pWInfo->sWC, pWhere, TK_AND); - /* Special case: a WHERE clause that is constant. Evaluate the - ** expression and either jump over all of the code or fall thru. - */ - for(ii=0; ii<sWLB.pWC->nTerm; ii++){ - if( nTabList==0 || sqlite3ExprIsConstantNotJoin(sWLB.pWC->a[ii].pExpr) ){ - sqlite3ExprIfFalse(pParse, sWLB.pWC->a[ii].pExpr, pWInfo->iBreak, - SQLITE_JUMPIFNULL); - sWLB.pWC->a[ii].wtFlags |= TERM_CODED; - } - } - /* Special case: No FROM clause */ if( nTabList==0 ){ @@ -121166,46 +140759,61 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( wctrlFlags & WHERE_WANT_DISTINCT ){ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE; } - } - - /* Assign a bit from the bitmask to every term in the FROM clause. - ** - ** When assigning bitmask values to FROM clause cursors, it must be - ** the case that if X is the bitmask for the N-th FROM clause term then - ** the bitmask for all FROM clause terms to the left of the N-th term - ** is (X-1). An expression from the ON clause of a LEFT JOIN can use - ** its Expr.iRightJoinTable value to find the bitmask of the right table - ** of the join. Subtracting one from the right table bitmask gives a - ** bitmask for all tables to the left of the join. Knowing the bitmask - ** for all tables to the left of a left join is important. Ticket #3015. - ** - ** Note that bitmasks are created for all pTabList->nSrc tables in - ** pTabList, not just the first nTabList tables. nTabList is normally - ** equal to pTabList->nSrc but might be shortened to 1 if the - ** WHERE_ONETABLE_ONLY flag is set. - */ - for(ii=0; ii<pTabList->nSrc; ii++){ - createMask(pMaskSet, pTabList->a[ii].iCursor); - } -#ifndef NDEBUG - { - Bitmask toTheLeft = 0; - for(ii=0; ii<pTabList->nSrc; ii++){ - Bitmask m = getMask(pMaskSet, pTabList->a[ii].iCursor); - assert( (m-1)==toTheLeft ); - toTheLeft |= m; + ExplainQueryPlan((pParse, 0, "SCAN CONSTANT ROW")); + }else{ + /* Assign a bit from the bitmask to every term in the FROM clause. + ** + ** The N-th term of the FROM clause is assigned a bitmask of 1<<N. + ** + ** The rule of the previous sentence ensures thta if X is the bitmask for + ** a table T, then X-1 is the bitmask for all other tables to the left of T. + ** Knowing the bitmask for all tables to the left of a left join is + ** important. Ticket #3015. + ** + ** Note that bitmasks are created for all pTabList->nSrc tables in + ** pTabList, not just the first nTabList tables. nTabList is normally + ** equal to pTabList->nSrc but might be shortened to 1 if the + ** WHERE_OR_SUBCLAUSE flag is set. + */ + ii = 0; + do{ + createMask(pMaskSet, pTabList->a[ii].iCursor); + sqlite3WhereTabFuncArgs(pParse, &pTabList->a[ii], &pWInfo->sWC); + }while( (++ii)<pTabList->nSrc ); + #ifdef SQLITE_DEBUG + { + Bitmask mx = 0; + for(ii=0; ii<pTabList->nSrc; ii++){ + Bitmask m = sqlite3WhereGetMask(pMaskSet, pTabList->a[ii].iCursor); + assert( m>=mx ); + mx = m; + } } + #endif } -#endif + + /* Analyze all of the subexpressions. */ + sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); + if( db->mallocFailed ) goto whereBeginError; - /* Analyze all of the subexpressions. Note that exprAnalyze() might - ** add new virtual terms onto the end of the WHERE clause. We do not - ** want to analyze these virtual terms, so start analyzing at the end - ** and work forward so that the added virtual terms are never processed. + /* Special case: WHERE terms that do not refer to any tables in the join + ** (constant expressions). Evaluate each such term, and jump over all the + ** generated code if the result is not true. + ** + ** Do not do this if the expression contains non-deterministic functions + ** that are not within a sub-select. This is not strictly required, but + ** preserves SQLite's legacy behaviour in the following two cases: + ** + ** FROM ... WHERE random()>0; -- eval random() once per row + ** FROM ... WHERE (SELECT random())>0; -- eval random() once overall */ - exprAnalyzeAll(pTabList, &pWInfo->sWC); - if( db->mallocFailed ){ - goto whereBeginError; + for(ii=0; ii<sWLB.pWC->nTerm; ii++){ + WhereTerm *pT = &sWLB.pWC->a[ii]; + if( pT->wtFlags & TERM_VIRTUAL ) continue; + if( pT->prereqAll==0 && (nTabList==0 || exprIsDeterministic(pT->pExpr)) ){ + sqlite3ExprIfFalse(pParse, pT->pExpr, pWInfo->iBreak, SQLITE_JUMPIFNULL); + pT->wtFlags |= TERM_CODED; + } } if( wctrlFlags & WHERE_WANT_DISTINCT ){ @@ -121220,14 +140828,16 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } /* Construct the WhereLoop objects */ - WHERETRACE(0xffff,("*** Optimizer Start ***\n")); #if defined(WHERETRACE_ENABLED) - /* Display all terms of the WHERE clause */ - if( sqlite3WhereTrace & 0x100 ){ - int i; - for(i=0; i<sWLB.pWC->nTerm; i++){ - whereTermPrint(&sWLB.pWC->a[i], i); + if( sqlite3WhereTrace & 0xffff ){ + sqlite3DebugPrintf("*** Optimizer Start *** (wctrlFlags: 0x%x",wctrlFlags); + if( wctrlFlags & WHERE_USE_LIMIT ){ + sqlite3DebugPrintf(", limit: %d", iAuxArg); } + sqlite3DebugPrintf(")\n"); + } + if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ + sqlite3WhereClausePrint(sWLB.pWC); } #endif @@ -121235,15 +140845,14 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( rc = whereLoopAddAll(&sWLB); if( rc ) goto whereBeginError; - /* Display all of the WhereLoop objects if wheretrace is enabled */ -#ifdef WHERETRACE_ENABLED /* !=0 */ - if( sqlite3WhereTrace ){ +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace ){ /* Display all of the WhereLoop objects */ WhereLoop *p; int i; - static char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" - "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; + static const char zLabel[] = "0123456789abcdefghijklmnopqrstuvwyxz" + "ABCDEFGHIJKLMNOPQRSTUVWYXZ"; for(p=pWInfo->pLoops, i=0; p; p=p->pNextLoop, i++){ - p->cId = zLabel[i%sizeof(zLabel)]; + p->cId = zLabel[i%(sizeof(zLabel)-1)]; whereLoopPrint(p, sWLB.pWC); } } @@ -121257,14 +140866,13 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } } if( pWInfo->pOrderBy==0 && (db->flags & SQLITE_ReverseOrder)!=0 ){ - pWInfo->revMask = (Bitmask)(-1); + pWInfo->revMask = ALLBITS; } if( pParse->nErr || NEVER(db->mallocFailed) ){ goto whereBeginError; } -#ifdef WHERETRACE_ENABLED /* !=0 */ +#ifdef WHERETRACE_ENABLED if( sqlite3WhereTrace ){ - int ii; sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); if( pWInfo->nOBSat>0 ){ sqlite3DebugPrintf(" ORDERBY=%d,0x%llx", pWInfo->nOBSat, pWInfo->revMask); @@ -121289,33 +140897,80 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } } #endif - /* Attempt to omit tables from the join that do not effect the result */ + + /* Attempt to omit tables from the join that do not affect the result. + ** For a table to not affect the result, the following must be true: + ** + ** 1) The query must not be an aggregate. + ** 2) The table must be the RHS of a LEFT JOIN. + ** 3) Either the query must be DISTINCT, or else the ON or USING clause + ** must contain a constraint that limits the scan of the table to + ** at most a single row. + ** 4) The table must not be referenced by any part of the query apart + ** from its own USING or ON clause. + ** + ** For example, given: + ** + ** CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1); + ** CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2); + ** CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3); + ** + ** then table t2 can be omitted from the following: + ** + ** SELECT v1, v3 FROM t1 + ** LEFT JOIN t2 USING (t1.ipk=t2.ipk) + ** LEFT JOIN t3 USING (t1.ipk=t3.ipk) + ** + ** or from: + ** + ** SELECT DISTINCT v1, v3 FROM t1 + ** LEFT JOIN t2 + ** LEFT JOIN t3 USING (t1.ipk=t3.ipk) + */ + notReady = ~(Bitmask)0; if( pWInfo->nLevel>=2 - && pResultSet!=0 + && pResultSet!=0 /* guarantees condition (1) above */ && OptimizationEnabled(db, SQLITE_OmitNoopJoin) ){ - Bitmask tabUsed = exprListTableUsage(pMaskSet, pResultSet); - if( sWLB.pOrderBy ) tabUsed |= exprListTableUsage(pMaskSet, sWLB.pOrderBy); - while( pWInfo->nLevel>=2 ){ + int i; + Bitmask tabUsed = sqlite3WhereExprListUsage(pMaskSet, pResultSet); + if( sWLB.pOrderBy ){ + tabUsed |= sqlite3WhereExprListUsage(pMaskSet, sWLB.pOrderBy); + } + for(i=pWInfo->nLevel-1; i>=1; i--){ WhereTerm *pTerm, *pEnd; - pLoop = pWInfo->a[pWInfo->nLevel-1].pWLoop; - if( (pWInfo->pTabList->a[pLoop->iTab].jointype & JT_LEFT)==0 ) break; + struct SrcList_item *pItem; + pLoop = pWInfo->a[i].pWLoop; + pItem = &pWInfo->pTabList->a[pLoop->iTab]; + if( (pItem->fg.jointype & JT_LEFT)==0 ) continue; if( (wctrlFlags & WHERE_WANT_DISTINCT)==0 && (pLoop->wsFlags & WHERE_ONEROW)==0 ){ - break; + continue; } - if( (tabUsed & pLoop->maskSelf)!=0 ) break; + if( (tabUsed & pLoop->maskSelf)!=0 ) continue; pEnd = sWLB.pWC->a + sWLB.pWC->nTerm; for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){ - if( (pTerm->prereqAll & pLoop->maskSelf)!=0 - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - ){ - break; + if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){ + if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin) + || pTerm->pExpr->iRightJoinTable!=pItem->iCursor + ){ + break; + } } } - if( pTerm<pEnd ) break; + if( pTerm<pEnd ) continue; WHERETRACE(0xffff, ("-> drop loop %c not used\n", pLoop->cId)); + notReady &= ~pLoop->maskSelf; + for(pTerm=sWLB.pWC->a; pTerm<pEnd; pTerm++){ + if( (pTerm->prereqAll & pLoop->maskSelf)!=0 ){ + pTerm->wtFlags |= TERM_CODED; + } + } + if( i!=pWInfo->nLevel-1 ){ + int nByte = (pWInfo->nLevel-1-i) * sizeof(WhereLevel); + memmove(&pWInfo->a[i], &pWInfo->a[i+1], nByte); + } pWInfo->nLevel--; nTabList--; } @@ -121325,22 +140980,45 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* If the caller is an UPDATE or DELETE statement that is requesting ** to use a one-pass algorithm, determine if this is appropriate. - ** The one-pass algorithm only works if the WHERE clause constrains - ** the statement to update a single row. + ** + ** A one-pass approach can be used if the caller has requested one + ** and either (a) the scan visits at most one row or (b) each + ** of the following are true: + ** + ** * the caller has indicated that a one-pass approach can be used + ** with multiple rows (by setting WHERE_ONEPASS_MULTIROW), and + ** * the table is not a virtual table, and + ** * either the scan does not use the OR optimization or the caller + ** is a DELETE operation (WHERE_DUPLICATES_OK is only specified + ** for DELETE). + ** + ** The last qualification is because an UPDATE statement uses + ** WhereInfo.aiCurOnePass[1] to determine whether or not it really can + ** use a one-pass approach, and this is not set accurately for scans + ** that use the OR optimization. */ assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 ); - if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 - && (pWInfo->a[0].pWLoop->wsFlags & WHERE_ONEROW)!=0 ){ - pWInfo->okOnePass = 1; - if( HasRowid(pTabList->a[0].pTab) ){ - pWInfo->a[0].pWLoop->wsFlags &= ~WHERE_IDX_ONLY; + if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ + int wsFlags = pWInfo->a[0].pWLoop->wsFlags; + int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + if( bOnerow || ( + 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) + && 0==(wsFlags & WHERE_VIRTUALTABLE) + && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) + )){ + pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; + if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){ + if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){ + bFordelete = OPFLAG_FORDELETE; + } + pWInfo->a[0].pWLoop->wsFlags = (wsFlags & ~WHERE_IDX_ONLY); + } } } /* Open all tables in the pTabList and any indices selected for ** searching those tables. */ - notReady = ~(Bitmask)0; for(ii=0, pLevel=pWInfo->a; ii<nTabList; ii++, pLevel++){ Table *pTab; /* Table to open */ int iDb; /* Index of database containing table/index */ @@ -121363,24 +141041,35 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( }else #endif if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 - && (wctrlFlags & WHERE_OMIT_OPEN_CLOSE)==0 ){ + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ int op = OP_OpenRead; - if( pWInfo->okOnePass ){ + if( pWInfo->eOnePass!=ONEPASS_OFF ){ op = OP_OpenWrite; pWInfo->aiCurOnePass[0] = pTabItem->iCursor; }; sqlite3OpenTable(pParse, pTabItem->iCursor, iDb, pTab, op); assert( pTabItem->iCursor==pLevel->iTabCur ); - testcase( !pWInfo->okOnePass && pTab->nCol==BMS-1 ); - testcase( !pWInfo->okOnePass && pTab->nCol==BMS ); - if( !pWInfo->okOnePass && pTab->nCol<BMS && HasRowid(pTab) ){ + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS-1 ); + testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS ); + if( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol<BMS && HasRowid(pTab) ){ Bitmask b = pTabItem->colUsed; int n = 0; for(; b; b=b>>1, n++){} - sqlite3VdbeChangeP4(v, sqlite3VdbeCurrentAddr(v)-1, - SQLITE_INT_TO_PTR(n), P4_INT32); + sqlite3VdbeChangeP4(v, -1, SQLITE_INT_TO_PTR(n), P4_INT32); assert( n<=pTab->nCol ); } +#ifdef SQLITE_ENABLE_CURSOR_HINTS + if( pLoop->u.btree.pIndex!=0 ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ|bFordelete); + }else +#endif + { + sqlite3VdbeChangeP5(v, bFordelete); + } +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, pTabItem->iCursor, 0, 0, + (const u8*)&pTabItem->colUsed, P4_INT64); +#endif }else{ sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); } @@ -121388,18 +141077,18 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( Index *pIx = pLoop->u.btree.pIndex; int iIndexCur; int op = OP_OpenRead; - /* iIdxCur is always set if to a positive value if ONEPASS is possible */ - assert( iIdxCur!=0 || (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 ); + /* iAuxArg is always set to a positive value if ONEPASS is possible */ + assert( iAuxArg!=0 || (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 ); if( !HasRowid(pTab) && IsPrimaryKeyIndex(pIx) - && (wctrlFlags & WHERE_ONETABLE_ONLY)!=0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ){ /* This is one term of an OR-optimization using the PRIMARY KEY of a ** WITHOUT ROWID table. No need for a separate index */ iIndexCur = pLevel->iTabCur; op = 0; - }else if( pWInfo->okOnePass ){ + }else if( pWInfo->eOnePass!=ONEPASS_OFF ){ Index *pJ = pTabItem->pTab->pIndex; - iIndexCur = iIdxCur; + iIndexCur = iAuxArg; assert( wctrlFlags & WHERE_ONEPASS_DESIRED ); while( ALWAYS(pJ) && pJ!=pIx ){ iIndexCur++; @@ -121407,9 +141096,9 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } op = OP_OpenWrite; pWInfo->aiCurOnePass[1] = iIndexCur; - }else if( iIdxCur && (wctrlFlags & WHERE_ONETABLE_ONLY)!=0 ){ - iIndexCur = iIdxCur; - if( wctrlFlags & WHERE_REOPEN_IDX ) op = OP_ReopenIdx; + }else if( iAuxArg && (wctrlFlags & WHERE_OR_SUBCLAUSE)!=0 ){ + iIndexCur = iAuxArg; + op = OP_ReopenIdx; }else{ iIndexCur = pParse->nTab++; } @@ -121419,11 +141108,32 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( op ){ sqlite3VdbeAddOp3(v, op, iIndexCur, pIx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIx); + if( (pLoop->wsFlags & WHERE_CONSTRAINT)!=0 + && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 + && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 + && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED + ){ + sqlite3VdbeChangeP5(v, OPFLAG_SEEKEQ); /* Hint to COMDB2 */ + } VdbeComment((v, "%s", pIx->zName)); +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK + { + u64 colUsed = 0; + int ii, jj; + for(ii=0; ii<pIx->nColumn; ii++){ + jj = pIx->aiColumn[ii]; + if( jj<0 ) continue; + if( jj>63 ) jj = 63; + if( (pTabItem->colUsed & MASKBIT(jj))==0 ) continue; + colUsed |= ((u64)1)<<(ii<63 ? ii : 63); + } + sqlite3VdbeAddOp4Dup8(v, OP_ColumnsUsed, iIndexCur, 0, 0, + (u8*)&colUsed, P4_INT64); + } +#endif /* SQLITE_ENABLE_COLUMN_USED_MASK */ } } if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); - notReady &= ~getMask(&pWInfo->sMaskSet, pTabItem->iCursor); } pWInfo->iTop = sqlite3VdbeCurrentAddr(v); if( db->mallocFailed ) goto whereBeginError; @@ -121432,7 +141142,6 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** loop below generates code for a single nested loop of the VM ** program. */ - notReady = ~(Bitmask)0; for(ii=0; ii<nTabList; ii++){ int addrExplain; int wsFlags; @@ -121445,14 +141154,14 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( if( db->mallocFailed ) goto whereBeginError; } #endif - addrExplain = explainOneScan( - pParse, pTabList, pLevel, ii, pLevel->iFrom, wctrlFlags + addrExplain = sqlite3WhereExplainOneScan( + pParse, pTabList, pLevel, wctrlFlags ); pLevel->addrBody = sqlite3VdbeCurrentAddr(v); - notReady = codeOneLoopStart(pWInfo, ii, notReady); + notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady); pWInfo->iContinue = pLevel->addrCont; - if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_ONETABLE_ONLY)==0 ){ - addScanStatus(v, pTabList, pLevel, addrExplain); + if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ + sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); } } @@ -121490,14 +141199,44 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ int addr; pLevel = &pWInfo->a[i]; pLoop = pLevel->pWLoop; - sqlite3VdbeResolveLabel(v, pLevel->addrCont); if( pLevel->op!=OP_Noop ){ +#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT + int addrSeek = 0; + Index *pIdx; + int n; + if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED + && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */ + && (pLoop->wsFlags & WHERE_INDEXED)!=0 + && (pIdx = pLoop->u.btree.pIndex)->hasStat1 + && (n = pLoop->u.btree.nIdxCol)>0 + && pIdx->aiRowLogEst[n]>=36 + ){ + int r1 = pParse->nMem+1; + int j, op; + for(j=0; j<n; j++){ + sqlite3VdbeAddOp3(v, OP_Column, pLevel->iIdxCur, j, r1+j); + } + pParse->nMem += n+1; + op = pLevel->op==OP_Prev ? OP_SeekLT : OP_SeekGT; + addrSeek = sqlite3VdbeAddOp4Int(v, op, pLevel->iIdxCur, 0, r1, n); + VdbeCoverageIf(v, op==OP_SeekLT); + VdbeCoverageIf(v, op==OP_SeekGT); + sqlite3VdbeAddOp2(v, OP_Goto, 1, pLevel->p2); + } +#endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */ + /* The common case: Advance to the next row */ + sqlite3VdbeResolveLabel(v, pLevel->addrCont); sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); sqlite3VdbeChangeP5(v, pLevel->p5); VdbeCoverage(v); VdbeCoverageIf(v, pLevel->op==OP_Next); VdbeCoverageIf(v, pLevel->op==OP_Prev); VdbeCoverageIf(v, pLevel->op==OP_VNext); +#ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT + if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); +#endif + }else{ + sqlite3VdbeResolveLabel(v, pLevel->addrCont); } if( pLoop->wsFlags & WHERE_IN_ABLE && pLevel->u.in.nIn>0 ){ struct InLoop *pIn; @@ -121505,35 +141244,46 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ sqlite3VdbeResolveLabel(v, pLevel->addrNxt); for(j=pLevel->u.in.nIn, pIn=&pLevel->u.in.aInLoop[j-1]; j>0; j--, pIn--){ sqlite3VdbeJumpHere(v, pIn->addrInTop+1); - sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); - VdbeCoverage(v); - VdbeCoverageIf(v, pIn->eEndLoopOp==OP_PrevIfOpen); - VdbeCoverageIf(v, pIn->eEndLoopOp==OP_NextIfOpen); + if( pIn->eEndLoopOp!=OP_Noop ){ + sqlite3VdbeAddOp2(v, pIn->eEndLoopOp, pIn->iCur, pIn->addrInTop); + VdbeCoverage(v); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_PrevIfOpen); + VdbeCoverageIf(v, pIn->eEndLoopOp==OP_NextIfOpen); + } sqlite3VdbeJumpHere(v, pIn->addrInTop-1); } - sqlite3DbFree(db, pLevel->u.in.aInLoop); } sqlite3VdbeResolveLabel(v, pLevel->addrBrk); if( pLevel->addrSkip ){ - sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrSkip); + sqlite3VdbeGoto(v, pLevel->addrSkip); VdbeComment((v, "next skip-scan on %s", pLoop->u.btree.pIndex->zName)); sqlite3VdbeJumpHere(v, pLevel->addrSkip); sqlite3VdbeJumpHere(v, pLevel->addrSkip-2); } +#ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS + if( pLevel->addrLikeRep ){ + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, (int)(pLevel->iLikeRepCntr>>1), + pLevel->addrLikeRep); + VdbeCoverage(v); + } +#endif if( pLevel->iLeftJoin ){ + int ws = pLoop->wsFlags; addr = sqlite3VdbeAddOp1(v, OP_IfPos, pLevel->iLeftJoin); VdbeCoverage(v); - assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 - || (pLoop->wsFlags & WHERE_INDEXED)!=0 ); - if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 ){ - sqlite3VdbeAddOp1(v, OP_NullRow, pTabList->a[i].iCursor); + assert( (ws & WHERE_IDX_ONLY)==0 || (ws & WHERE_INDEXED)!=0 ); + if( (ws & WHERE_IDX_ONLY)==0 ){ + assert( pLevel->iTabCur==pTabList->a[pLevel->iFrom].iCursor ); + sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iTabCur); } - if( pLoop->wsFlags & WHERE_INDEXED ){ + if( (ws & WHERE_INDEXED) + || ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx) + ){ sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); } if( pLevel->op==OP_Return ){ sqlite3VdbeAddOp2(v, OP_Gosub, pLevel->p1, pLevel->addrFirst); }else{ - sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrFirst); + sqlite3VdbeGoto(v, pLevel->addrFirst); } sqlite3VdbeJumpHere(v, addr); } @@ -121557,50 +141307,16 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ pLoop = pLevel->pWLoop; /* For a co-routine, change all OP_Column references to the table of - ** the co-routine into OP_SCopy of result contained in a register. + ** the co-routine into OP_Copy of result contained in a register. ** OP_Rowid becomes OP_Null. */ - if( pTabItem->viaCoroutine && !db->mallocFailed ){ - last = sqlite3VdbeCurrentAddr(v); - k = pLevel->addrBody; - pOp = sqlite3VdbeGetOp(v, k); - for(; k<last; k++, pOp++){ - if( pOp->p1!=pLevel->iTabCur ) continue; - if( pOp->opcode==OP_Column ){ - pOp->opcode = OP_Copy; - pOp->p1 = pOp->p2 + pTabItem->regResult; - pOp->p2 = pOp->p3; - pOp->p3 = 0; - }else if( pOp->opcode==OP_Rowid ){ - pOp->opcode = OP_Null; - pOp->p1 = 0; - pOp->p3 = 0; - } - } + if( pTabItem->fg.viaCoroutine ){ + testcase( pParse->db->mallocFailed ); + translateColumnToCopy(pParse, pLevel->addrBody, pLevel->iTabCur, + pTabItem->regResult, 0); continue; } - /* Close all of the cursors that were opened by sqlite3WhereBegin. - ** Except, do not close cursors that will be reused by the OR optimization - ** (WHERE_OMIT_OPEN_CLOSE). And do not close the OP_OpenWrite cursors - ** created for the ONEPASS optimization. - */ - if( (pTab->tabFlags & TF_Ephemeral)==0 - && pTab->pSelect==0 - && (pWInfo->wctrlFlags & WHERE_OMIT_OPEN_CLOSE)==0 - ){ - int ws = pLoop->wsFlags; - if( !pWInfo->okOnePass && (ws & WHERE_IDX_ONLY)==0 ){ - sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); - } - if( (ws & WHERE_INDEXED)!=0 - && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 - && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] - ){ - sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); - } - } - /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can @@ -121617,28 +141333,39 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ }else if( pLoop->wsFlags & WHERE_MULTI_OR ){ pIdx = pLevel->u.pCovidx; } - if( pIdx && !db->mallocFailed ){ + if( pIdx + && (pWInfo->eOnePass==ONEPASS_OFF || !HasRowid(pIdx->pTable)) + && !db->mallocFailed + ){ last = sqlite3VdbeCurrentAddr(v); k = pLevel->addrBody; pOp = sqlite3VdbeGetOp(v, k); for(; k<last; k++, pOp++){ if( pOp->p1!=pLevel->iTabCur ) continue; - if( pOp->opcode==OP_Column ){ + if( pOp->opcode==OP_Column +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + || pOp->opcode==OP_Offset +#endif + ){ int x = pOp->p2; assert( pIdx->pTable==pTab ); if( !HasRowid(pTab) ){ Index *pPk = sqlite3PrimaryKeyIndex(pTab); x = pPk->aiColumn[x]; + assert( x>=0 ); } x = sqlite3ColumnOfIndex(pIdx, x); if( x>=0 ){ pOp->p2 = x; pOp->p1 = pLevel->iIdxCur; } - assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0 ); + assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 || x>=0 + || pWInfo->eOnePass ); }else if( pOp->opcode==OP_Rowid ){ pOp->p1 = pLevel->iIdxCur; pOp->opcode = OP_IdxRowid; + }else if( pOp->opcode==OP_IfNullRow ){ + pOp->p1 = pLevel->iIdxCur; } } } @@ -121653,19 +141380,34 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ /************** End of where.c ***********************************************/ /************** Begin file parse.c *******************************************/ -/* Driver template for the LEMON parser generator. -** The author disclaims copyright to this source code. +/* +** 2000-05-29 ** -** This version of "lempar.c" is modified, slightly, for use by SQLite. -** The only modifications are the addition of a couple of NEVER() -** macros to disable tests that are needed in the case of a general -** LALR(1) grammar but which are always false in the -** specific grammar used by SQLite. +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Driver template for the LEMON parser generator. +** +** The "lemon" program processes an LALR(1) input grammar file, then uses +** this template to construct a parser. The "lemon" program inserts text +** at each "%%" line. Also, any "P-a-r-s-e" identifer prefix (without the +** interstitial "-" characters) contained in this template is changed into +** the value of the %name directive from the grammar. Otherwise, the content +** of this template is copied straight through into the generate parser +** source file. +** +** The following is the concatenation of all %include directives from the +** input grammar file: */ -/* First off, code is included that follows the "include" declaration -** in the input grammar file. */ /* #include <stdio.h> */ +/************ Begin %include sections from the grammar ************************/ +/* #include "sqliteInt.h" */ /* ** Disable all error recovery processing in the parser push-down @@ -121679,22 +141421,29 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ #define yytestcase(X) testcase(X) /* -** An instance of this structure holds information about the -** LIMIT clause of a SELECT statement. +** Indicate that sqlite3ParserFree() will never be called with a null +** pointer. */ -struct LimitVal { - Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ - Expr *pOffset; /* The OFFSET expression. NULL if there is none */ -}; +#define YYPARSEFREENEVERNULL 1 /* -** An instance of this structure is used to store the LIKE, -** GLOB, NOT LIKE, and NOT GLOB operators. +** In the amalgamation, the parse.c file generated by lemon and the +** tokenize.c file are concatenated. In that case, sqlite3RunParser() +** has access to the the size of the yyParser object and so the parser +** engine can be allocated from stack. In that case, only the +** sqlite3ParserInit() and sqlite3ParserFinalize() routines are invoked +** and the sqlite3ParserAlloc() and sqlite3ParserFree() routines can be +** omitted. */ -struct LikeOp { - Token eOperator; /* "like" or "glob" or "regexp" */ - int bNot; /* True if the NOT keyword is present */ -}; +#ifdef SQLITE_AMALGAMATION +# define sqlite3Parser_ENGINEALWAYSONSTACK 1 +#endif + +/* +** Alternative datatype for the argument to the malloc() routine passed +** into sqlite3ParserAlloc(). The default is size_t. +*/ +#define YYMALLOCARGTYPE u64 /* ** An instance of the following structure describes the event of a @@ -121708,173 +141457,205 @@ struct LikeOp { struct TrigEvent { int a; IdList * b; }; /* -** An instance of this structure holds the ATTACH key and the key type. +** Disable lookaside memory allocation for objects that might be +** shared across database connections. */ -struct AttachKey { int type; Token key; }; +static void disableLookaside(Parse *pParse){ + pParse->disableLookaside++; + pParse->db->lookaside.bDisable++; +} - /* This is a utility routine used to set the ExprSpan.zStart and - ** ExprSpan.zEnd values of pOut so that the span covers the complete - ** range of text beginning with pStart and going to the end of pEnd. + /* + ** For a compound SELECT statement, make sure p->pPrior->pNext==p for + ** all elements in the list. And make sure list length does not exceed + ** SQLITE_LIMIT_COMPOUND_SELECT. */ - static void spanSet(ExprSpan *pOut, Token *pStart, Token *pEnd){ - pOut->zStart = pStart->z; - pOut->zEnd = &pEnd->z[pEnd->n]; + static void parserDoubleLinkSelect(Parse *pParse, Select *p){ + if( p->pPrior ){ + Select *pNext = 0, *pLoop; + int mxSelect, cnt = 0; + for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ + pLoop->pNext = pNext; + pLoop->selFlags |= SF_Compound; + } + if( (p->selFlags & SF_MultiValue)==0 && + (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && + cnt>mxSelect + ){ + sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); + } + } } + /* Construct a new Expr object from a single identifier. Use the ** new Expr to populate pOut. Set the span of pOut to be the identifier ** that created the expression. */ - static void spanExpr(ExprSpan *pOut, Parse *pParse, int op, Token *pValue){ - pOut->pExpr = sqlite3PExpr(pParse, op, 0, 0, pValue); - pOut->zStart = pValue->z; - pOut->zEnd = &pValue->z[pValue->n]; + static Expr *tokenExpr(Parse *pParse, int op, Token t){ + Expr *p = sqlite3DbMallocRawNN(pParse->db, sizeof(Expr)+t.n+1); + if( p ){ + memset(p, 0, sizeof(Expr)); + p->op = (u8)op; + p->flags = EP_Leaf; + p->iAgg = -1; + p->u.zToken = (char*)&p[1]; + memcpy(p->u.zToken, t.z, t.n); + p->u.zToken[t.n] = 0; + if( sqlite3Isquote(p->u.zToken[0]) ){ + if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; + sqlite3Dequote(p->u.zToken); + } +#if SQLITE_MAX_EXPR_DEPTH>0 + p->nHeight = 1; +#endif + } + return p; } - /* This routine constructs a binary expression node out of two ExprSpan - ** objects and uses the result to populate a new ExprSpan object. - */ - static void spanBinaryExpr( - ExprSpan *pOut, /* Write the result here */ - Parse *pParse, /* The parsing context. Errors accumulate here */ - int op, /* The binary operation */ - ExprSpan *pLeft, /* The left operand */ - ExprSpan *pRight /* The right operand */ - ){ - pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); - pOut->zStart = pLeft->zStart; - pOut->zEnd = pRight->zEnd; - } - - /* Construct an expression node for a unary postfix operator - */ - static void spanUnaryPostfix( - ExprSpan *pOut, /* Write the new expression node here */ - Parse *pParse, /* Parsing context to record errors */ - int op, /* The operator */ - ExprSpan *pOperand, /* The operand */ - Token *pPostOp /* The operand token for setting the span */ - ){ - pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); - pOut->zStart = pOperand->zStart; - pOut->zEnd = &pPostOp->z[pPostOp->n]; - } - /* A routine to convert a binary TK_IS or TK_ISNOT expression into a ** unary TK_ISNULL or TK_NOTNULL expression. */ static void binaryToUnaryIfNull(Parse *pParse, Expr *pY, Expr *pA, int op){ sqlite3 *db = pParse->db; - if( pY && pA && pY->op==TK_NULL ){ + if( pA && pY && pY->op==TK_NULL ){ pA->op = (u8)op; sqlite3ExprDelete(db, pA->pRight); pA->pRight = 0; } } - /* Construct an expression node for a unary prefix operator + /* Add a single new term to an ExprList that is used to store a + ** list of identifiers. Report an error if the ID list contains + ** a COLLATE clause or an ASC or DESC keyword, except ignore the + ** error while parsing a legacy schema. */ - static void spanUnaryPrefix( - ExprSpan *pOut, /* Write the new expression node here */ - Parse *pParse, /* Parsing context to record errors */ - int op, /* The operator */ - ExprSpan *pOperand, /* The operand */ - Token *pPreOp /* The operand token for setting the span */ + static ExprList *parserAddExprIdListTerm( + Parse *pParse, + ExprList *pPrior, + Token *pIdToken, + int hasCollate, + int sortOrder ){ - pOut->pExpr = sqlite3PExpr(pParse, op, pOperand->pExpr, 0, 0); - pOut->zStart = pPreOp->z; - pOut->zEnd = pOperand->zEnd; + ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); + if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) + && pParse->db->init.busy==0 + ){ + sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", + pIdToken->n, pIdToken->z); + } + sqlite3ExprListSetName(pParse, p, pIdToken, 1); + return p; } -/* Next is all token values, in a form suitable for use by makeheaders. -** This section will be null unless lemon is run with the -m switch. -*/ -/* -** These constants (all generated automatically by the parser generator) -** specify the various kinds of tokens (terminals) that the parser -** understands. -** -** Each symbol here is a terminal symbol in the grammar. -*/ -/* Make sure the INTERFACE macro is defined. -*/ -#ifndef INTERFACE -# define INTERFACE 1 -#endif -/* The next thing included is series of defines which control +/**************** End of %include directives **********************************/ +/* These constants specify the various numeric values for terminal symbols +** in a format understandable to "makeheaders". This section is blank unless +** "lemon" is run with the "-m" command-line option. +***************** Begin makeheaders token definitions *************************/ +/**************** End makeheaders token definitions ***************************/ + +/* The next sections is a series of control #defines. ** various aspects of the generated parser. -** YYCODETYPE is the data type used for storing terminal -** and nonterminal numbers. "unsigned char" is -** used if there are fewer than 250 terminals -** and nonterminals. "int" is used otherwise. -** YYNOCODE is a number of type YYCODETYPE which corresponds -** to no legal terminal or nonterminal number. This -** number is used to fill in empty slots of the hash -** table. +** YYCODETYPE is the data type used to store the integer codes +** that represent terminal and non-terminal symbols. +** "unsigned char" is used if there are fewer than +** 256 symbols. Larger types otherwise. +** YYNOCODE is a number of type YYCODETYPE that is not used for +** any terminal or nonterminal symbol. ** YYFALLBACK If defined, this indicates that one or more tokens -** have fall-back values which should be used if the -** original value of the token will not parse. -** YYACTIONTYPE is the data type used for storing terminal -** and nonterminal numbers. "unsigned char" is -** used if there are fewer than 250 rules and -** states combined. "int" is used otherwise. -** sqlite3ParserTOKENTYPE is the data type used for minor tokens given -** directly to the parser from the tokenizer. -** YYMINORTYPE is the data type used for all minor tokens. +** (also known as: "terminal symbols") have fall-back +** values which should be used if the original symbol +** would not parse. This permits keywords to sometimes +** be used as identifiers, for example. +** YYACTIONTYPE is the data type used for "action codes" - numbers +** that indicate what to do in response to the next +** token. +** sqlite3ParserTOKENTYPE is the data type used for minor type for terminal +** symbols. Background: A "minor type" is a semantic +** value associated with a terminal or non-terminal +** symbols. For example, for an "ID" terminal symbol, +** the minor type might be the name of the identifier. +** Each non-terminal can have a different minor type. +** Terminal symbols all have the same minor type, though. +** This macros defines the minor type for terminal +** symbols. +** YYMINORTYPE is the data type used for all minor types. ** This is typically a union of many types, one of ** which is sqlite3ParserTOKENTYPE. The entry in the union -** for base tokens is called "yy0". +** for terminal symbols is called "yy0". ** YYSTACKDEPTH is the maximum depth of the parser's stack. If ** zero the stack is dynamically sized using realloc() ** sqlite3ParserARG_SDECL A static variable declaration for the %extra_argument ** sqlite3ParserARG_PDECL A parameter declaration for the %extra_argument +** sqlite3ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter ** sqlite3ParserARG_STORE Code to store %extra_argument into yypParser ** sqlite3ParserARG_FETCH Code to extract %extra_argument from yypParser -** YYNSTATE the combined number of states. -** YYNRULE the number of rules in the grammar +** sqlite3ParserCTX_* As sqlite3ParserARG_ except for %extra_context ** YYERRORSYMBOL is the code number of the error symbol. If not ** defined, then do no error processing. +** YYNSTATE the combined number of states. +** YYNRULE the number of rules in the grammar +** YYNTOKEN Number of terminal symbols +** YY_MAX_SHIFT Maximum value for shift actions +** YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions +** YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions +** YY_ERROR_ACTION The yy_action[] code for syntax error +** YY_ACCEPT_ACTION The yy_action[] code for accept +** YY_NO_ACTION The yy_action[] code for no-op +** YY_MIN_REDUCE Minimum value for reduce actions +** YY_MAX_REDUCE Maximum value for reduce actions */ +#ifndef INTERFACE +# define INTERFACE 1 +#endif +/************* Begin control #defines *****************************************/ #define YYCODETYPE unsigned char -#define YYNOCODE 254 +#define YYNOCODE 255 #define YYACTIONTYPE unsigned short int -#define YYWILDCARD 70 +#define YYWILDCARD 84 #define sqlite3ParserTOKENTYPE Token typedef union { int yyinit; sqlite3ParserTOKENTYPE yy0; - Select* yy3; - ExprList* yy14; - With* yy59; - SrcList* yy65; - struct LikeOp yy96; - Expr* yy132; - u8 yy186; - int yy328; - ExprSpan yy346; - struct TrigEvent yy378; - u16 yy381; - IdList* yy408; - struct {int value; int mask;} yy429; - TriggerStep* yy473; - struct LimitVal yy476; + const char* yy36; + TriggerStep* yy47; + With* yy91; + struct {int value; int mask;} yy107; + Expr* yy182; + Upsert* yy198; + ExprList* yy232; + struct TrigEvent yy300; + Select* yy399; + SrcList* yy427; + int yy502; + IdList* yy510; } YYMINORTYPE; #ifndef YYSTACKDEPTH #define YYSTACKDEPTH 100 #endif -#define sqlite3ParserARG_SDECL Parse *pParse; -#define sqlite3ParserARG_PDECL ,Parse *pParse -#define sqlite3ParserARG_FETCH Parse *pParse = yypParser->pParse -#define sqlite3ParserARG_STORE yypParser->pParse = pParse -#define YYNSTATE 642 -#define YYNRULE 327 +#define sqlite3ParserARG_SDECL +#define sqlite3ParserARG_PDECL +#define sqlite3ParserARG_PARAM +#define sqlite3ParserARG_FETCH +#define sqlite3ParserARG_STORE +#define sqlite3ParserCTX_SDECL Parse *pParse; +#define sqlite3ParserCTX_PDECL ,Parse *pParse +#define sqlite3ParserCTX_PARAM ,pParse +#define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; +#define sqlite3ParserCTX_STORE yypParser->pParse=pParse; #define YYFALLBACK 1 -#define YY_NO_ACTION (YYNSTATE+YYNRULE+2) -#define YY_ACCEPT_ACTION (YYNSTATE+YYNRULE+1) -#define YY_ERROR_ACTION (YYNSTATE+YYNRULE) - -/* The yyzerominor constant is used to initialize instances of -** YYMINORTYPE objects to zero. */ -static const YYMINORTYPE yyzerominor = { 0 }; +#define YYNSTATE 490 +#define YYNRULE 341 +#define YYNTOKEN 145 +#define YY_MAX_SHIFT 489 +#define YY_MIN_SHIFTREDUCE 705 +#define YY_MAX_SHIFTREDUCE 1045 +#define YY_ERROR_ACTION 1046 +#define YY_ACCEPT_ACTION 1047 +#define YY_NO_ACTION 1048 +#define YY_MIN_REDUCE 1049 +#define YY_MAX_REDUCE 1389 +/************* End control #defines *******************************************/ /* Define the yytestcase() macro to be a no-op if is not already defined ** otherwise. @@ -121897,33 +141678,35 @@ static const YYMINORTYPE yyzerominor = { 0 }; ** Suppose the action integer is N. Then the action is determined as ** follows ** -** 0 <= N < YYNSTATE Shift N. That is, push the lookahead +** 0 <= N <= YY_MAX_SHIFT Shift N. That is, push the lookahead ** token onto the stack and goto state N. ** -** YYNSTATE <= N < YYNSTATE+YYNRULE Reduce by rule N-YYNSTATE. +** N between YY_MIN_SHIFTREDUCE Shift to an arbitrary state then +** and YY_MAX_SHIFTREDUCE reduce by rule N-YY_MIN_SHIFTREDUCE. ** -** N == YYNSTATE+YYNRULE A syntax error has occurred. +** N == YY_ERROR_ACTION A syntax error has occurred. ** -** N == YYNSTATE+YYNRULE+1 The parser accepts its input. +** N == YY_ACCEPT_ACTION The parser accepts its input. ** -** N == YYNSTATE+YYNRULE+2 No such action. Denotes unused +** N == YY_NO_ACTION No such action. Denotes unused ** slots in the yy_action[] table. ** +** N between YY_MIN_REDUCE Reduce by rule N-YY_MIN_REDUCE +** and YY_MAX_REDUCE +** ** The action table is constructed as a single large table named yy_action[]. -** Given state S and lookahead X, the action is computed as +** Given state S and lookahead X, the action is computed as either: ** -** yy_action[ yy_shift_ofst[S] + X ] +** (A) N = yy_action[ yy_shift_ofst[S] + X ] +** (B) N = yy_default[S] ** -** If the index value yy_shift_ofst[S]+X is out of range or if the value -** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X or if yy_shift_ofst[S] -** is equal to YY_SHIFT_USE_DFLT, it means that the action is not in the table -** and that yy_default[S] should be used instead. +** The (A) formula is preferred. The B formula is used instead if +** yy_lookahead[yy_shift_ofst[S]+X] is not equal to X. ** -** The formula above is for computing the action when the lookahead is +** The formulas above are for computing the action when the lookahead is ** a terminal symbol. If the lookahead is a non-terminal (as occurs after ** a reduce action) then the yy_reduce_ofst[] array is used in place of -** the yy_shift_ofst[] array and YY_REDUCE_USE_DFLT is used in place of -** YY_SHIFT_USE_DFLT. +** the yy_shift_ofst[] array. ** ** The following are the tables generated in this section: ** @@ -121935,468 +141718,510 @@ static const YYMINORTYPE yyzerominor = { 0 }; ** yy_reduce_ofst[] For each state, the offset into yy_action for ** shifting non-terminals after a reduce. ** yy_default[] Default action for each state. -*/ -#define YY_ACTTAB_COUNT (1497) +** +*********** Begin parsing tables **********************************************/ +#define YY_ACTTAB_COUNT (1657) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 306, 212, 432, 955, 639, 191, 955, 295, 559, 88, - /* 10 */ 88, 88, 88, 81, 86, 86, 86, 86, 85, 85, - /* 20 */ 84, 84, 84, 83, 330, 185, 184, 183, 635, 635, - /* 30 */ 292, 606, 606, 88, 88, 88, 88, 683, 86, 86, - /* 40 */ 86, 86, 85, 85, 84, 84, 84, 83, 330, 16, - /* 50 */ 436, 597, 89, 90, 80, 600, 599, 601, 601, 87, - /* 60 */ 87, 88, 88, 88, 88, 684, 86, 86, 86, 86, - /* 70 */ 85, 85, 84, 84, 84, 83, 330, 306, 559, 84, - /* 80 */ 84, 84, 83, 330, 65, 86, 86, 86, 86, 85, - /* 90 */ 85, 84, 84, 84, 83, 330, 635, 635, 634, 633, - /* 100 */ 182, 682, 550, 379, 376, 375, 17, 322, 606, 606, - /* 110 */ 371, 198, 479, 91, 374, 82, 79, 165, 85, 85, - /* 120 */ 84, 84, 84, 83, 330, 598, 635, 635, 107, 89, - /* 130 */ 90, 80, 600, 599, 601, 601, 87, 87, 88, 88, - /* 140 */ 88, 88, 186, 86, 86, 86, 86, 85, 85, 84, - /* 150 */ 84, 84, 83, 330, 306, 594, 594, 142, 328, 327, - /* 160 */ 484, 249, 344, 238, 635, 635, 634, 633, 585, 448, - /* 170 */ 526, 525, 229, 388, 1, 394, 450, 584, 449, 635, - /* 180 */ 635, 635, 635, 319, 395, 606, 606, 199, 157, 273, - /* 190 */ 382, 268, 381, 187, 635, 635, 634, 633, 311, 555, - /* 200 */ 266, 593, 593, 266, 347, 588, 89, 90, 80, 600, - /* 210 */ 599, 601, 601, 87, 87, 88, 88, 88, 88, 478, - /* 220 */ 86, 86, 86, 86, 85, 85, 84, 84, 84, 83, - /* 230 */ 330, 306, 272, 536, 634, 633, 146, 610, 197, 310, - /* 240 */ 575, 182, 482, 271, 379, 376, 375, 506, 21, 634, - /* 250 */ 633, 634, 633, 635, 635, 374, 611, 574, 548, 440, - /* 260 */ 111, 563, 606, 606, 634, 633, 324, 479, 608, 608, - /* 270 */ 608, 300, 435, 573, 119, 407, 210, 162, 562, 883, - /* 280 */ 592, 592, 306, 89, 90, 80, 600, 599, 601, 601, - /* 290 */ 87, 87, 88, 88, 88, 88, 506, 86, 86, 86, - /* 300 */ 86, 85, 85, 84, 84, 84, 83, 330, 620, 111, - /* 310 */ 635, 635, 361, 606, 606, 358, 249, 349, 248, 433, - /* 320 */ 243, 479, 586, 634, 633, 195, 611, 93, 119, 221, - /* 330 */ 575, 497, 534, 534, 89, 90, 80, 600, 599, 601, - /* 340 */ 601, 87, 87, 88, 88, 88, 88, 574, 86, 86, - /* 350 */ 86, 86, 85, 85, 84, 84, 84, 83, 330, 306, - /* 360 */ 77, 429, 638, 573, 589, 530, 240, 230, 242, 105, - /* 370 */ 249, 349, 248, 515, 588, 208, 460, 529, 564, 173, - /* 380 */ 634, 633, 970, 144, 430, 2, 424, 228, 380, 557, - /* 390 */ 606, 606, 190, 153, 159, 158, 514, 51, 632, 631, - /* 400 */ 630, 71, 536, 432, 954, 196, 610, 954, 614, 45, - /* 410 */ 18, 89, 90, 80, 600, 599, 601, 601, 87, 87, - /* 420 */ 88, 88, 88, 88, 261, 86, 86, 86, 86, 85, - /* 430 */ 85, 84, 84, 84, 83, 330, 306, 608, 608, 608, - /* 440 */ 542, 424, 402, 385, 241, 506, 451, 320, 211, 543, - /* 450 */ 164, 436, 386, 293, 451, 587, 108, 496, 111, 334, - /* 460 */ 391, 591, 424, 614, 27, 452, 453, 606, 606, 72, - /* 470 */ 257, 70, 259, 452, 339, 342, 564, 582, 68, 415, - /* 480 */ 469, 328, 327, 62, 614, 45, 110, 393, 89, 90, - /* 490 */ 80, 600, 599, 601, 601, 87, 87, 88, 88, 88, - /* 500 */ 88, 152, 86, 86, 86, 86, 85, 85, 84, 84, - /* 510 */ 84, 83, 330, 306, 110, 499, 520, 538, 402, 389, - /* 520 */ 424, 110, 566, 500, 593, 593, 454, 82, 79, 165, - /* 530 */ 424, 591, 384, 564, 340, 615, 188, 162, 424, 350, - /* 540 */ 616, 424, 614, 44, 606, 606, 445, 582, 300, 434, - /* 550 */ 151, 19, 614, 9, 568, 580, 348, 615, 469, 567, - /* 560 */ 614, 26, 616, 614, 45, 89, 90, 80, 600, 599, - /* 570 */ 601, 601, 87, 87, 88, 88, 88, 88, 411, 86, - /* 580 */ 86, 86, 86, 85, 85, 84, 84, 84, 83, 330, - /* 590 */ 306, 579, 110, 578, 521, 282, 433, 398, 400, 255, - /* 600 */ 486, 82, 79, 165, 487, 164, 82, 79, 165, 488, - /* 610 */ 488, 364, 387, 424, 544, 544, 509, 350, 362, 155, - /* 620 */ 191, 606, 606, 559, 642, 640, 333, 82, 79, 165, - /* 630 */ 305, 564, 507, 312, 357, 614, 45, 329, 596, 595, - /* 640 */ 194, 337, 89, 90, 80, 600, 599, 601, 601, 87, - /* 650 */ 87, 88, 88, 88, 88, 424, 86, 86, 86, 86, - /* 660 */ 85, 85, 84, 84, 84, 83, 330, 306, 20, 323, - /* 670 */ 150, 263, 211, 543, 421, 596, 595, 614, 22, 424, - /* 680 */ 193, 424, 284, 424, 391, 424, 509, 424, 577, 424, - /* 690 */ 186, 335, 424, 559, 424, 313, 120, 546, 606, 606, - /* 700 */ 67, 614, 47, 614, 50, 614, 48, 614, 100, 614, - /* 710 */ 99, 614, 101, 576, 614, 102, 614, 109, 326, 89, - /* 720 */ 90, 80, 600, 599, 601, 601, 87, 87, 88, 88, - /* 730 */ 88, 88, 424, 86, 86, 86, 86, 85, 85, 84, - /* 740 */ 84, 84, 83, 330, 306, 424, 311, 424, 585, 54, - /* 750 */ 424, 516, 517, 590, 614, 112, 424, 584, 424, 572, - /* 760 */ 424, 195, 424, 571, 424, 67, 424, 614, 94, 614, - /* 770 */ 98, 424, 614, 97, 264, 606, 606, 195, 614, 46, - /* 780 */ 614, 96, 614, 30, 614, 49, 614, 115, 614, 114, - /* 790 */ 418, 229, 388, 614, 113, 306, 89, 90, 80, 600, - /* 800 */ 599, 601, 601, 87, 87, 88, 88, 88, 88, 424, - /* 810 */ 86, 86, 86, 86, 85, 85, 84, 84, 84, 83, - /* 820 */ 330, 119, 424, 590, 110, 372, 606, 606, 195, 53, - /* 830 */ 250, 614, 29, 195, 472, 438, 729, 190, 302, 498, - /* 840 */ 14, 523, 641, 2, 614, 43, 306, 89, 90, 80, - /* 850 */ 600, 599, 601, 601, 87, 87, 88, 88, 88, 88, - /* 860 */ 424, 86, 86, 86, 86, 85, 85, 84, 84, 84, - /* 870 */ 83, 330, 424, 613, 964, 964, 354, 606, 606, 420, - /* 880 */ 312, 64, 614, 42, 391, 355, 283, 437, 301, 255, - /* 890 */ 414, 410, 495, 492, 614, 28, 471, 306, 89, 90, - /* 900 */ 80, 600, 599, 601, 601, 87, 87, 88, 88, 88, - /* 910 */ 88, 424, 86, 86, 86, 86, 85, 85, 84, 84, - /* 920 */ 84, 83, 330, 424, 110, 110, 110, 110, 606, 606, - /* 930 */ 110, 254, 13, 614, 41, 532, 531, 283, 481, 531, - /* 940 */ 457, 284, 119, 561, 356, 614, 40, 284, 306, 89, - /* 950 */ 78, 80, 600, 599, 601, 601, 87, 87, 88, 88, - /* 960 */ 88, 88, 424, 86, 86, 86, 86, 85, 85, 84, - /* 970 */ 84, 84, 83, 330, 110, 424, 341, 220, 555, 606, - /* 980 */ 606, 351, 555, 318, 614, 95, 413, 255, 83, 330, - /* 990 */ 284, 284, 255, 640, 333, 356, 255, 614, 39, 306, - /* 1000 */ 356, 90, 80, 600, 599, 601, 601, 87, 87, 88, - /* 1010 */ 88, 88, 88, 424, 86, 86, 86, 86, 85, 85, - /* 1020 */ 84, 84, 84, 83, 330, 424, 317, 316, 141, 465, - /* 1030 */ 606, 606, 219, 619, 463, 614, 10, 417, 462, 255, - /* 1040 */ 189, 510, 553, 351, 207, 363, 161, 614, 38, 315, - /* 1050 */ 218, 255, 255, 80, 600, 599, 601, 601, 87, 87, - /* 1060 */ 88, 88, 88, 88, 424, 86, 86, 86, 86, 85, - /* 1070 */ 85, 84, 84, 84, 83, 330, 76, 419, 255, 3, - /* 1080 */ 878, 461, 424, 247, 331, 331, 614, 37, 217, 76, - /* 1090 */ 419, 390, 3, 216, 215, 422, 4, 331, 331, 424, - /* 1100 */ 547, 12, 424, 545, 614, 36, 424, 541, 422, 424, - /* 1110 */ 540, 424, 214, 424, 408, 424, 539, 403, 605, 605, - /* 1120 */ 237, 614, 25, 119, 614, 24, 588, 408, 614, 45, - /* 1130 */ 118, 614, 35, 614, 34, 614, 33, 614, 23, 588, - /* 1140 */ 60, 223, 603, 602, 513, 378, 73, 74, 140, 139, - /* 1150 */ 424, 110, 265, 75, 426, 425, 59, 424, 610, 73, - /* 1160 */ 74, 549, 402, 404, 424, 373, 75, 426, 425, 604, - /* 1170 */ 138, 610, 614, 11, 392, 76, 419, 181, 3, 614, - /* 1180 */ 32, 271, 369, 331, 331, 493, 614, 31, 149, 608, - /* 1190 */ 608, 608, 607, 15, 422, 365, 614, 8, 137, 489, - /* 1200 */ 136, 190, 608, 608, 608, 607, 15, 485, 176, 135, - /* 1210 */ 7, 252, 477, 408, 174, 133, 175, 474, 57, 56, - /* 1220 */ 132, 130, 119, 76, 419, 588, 3, 468, 245, 464, - /* 1230 */ 171, 331, 331, 125, 123, 456, 447, 122, 446, 104, - /* 1240 */ 336, 231, 422, 166, 154, 73, 74, 332, 116, 431, - /* 1250 */ 121, 309, 75, 426, 425, 222, 106, 610, 308, 637, - /* 1260 */ 204, 408, 629, 627, 628, 6, 200, 428, 427, 290, - /* 1270 */ 203, 622, 201, 588, 62, 63, 289, 66, 419, 399, - /* 1280 */ 3, 401, 288, 92, 143, 331, 331, 287, 608, 608, - /* 1290 */ 608, 607, 15, 73, 74, 227, 422, 325, 69, 416, - /* 1300 */ 75, 426, 425, 612, 412, 610, 192, 61, 569, 209, - /* 1310 */ 396, 226, 278, 225, 383, 408, 527, 558, 276, 533, - /* 1320 */ 552, 528, 321, 523, 370, 508, 180, 588, 494, 179, - /* 1330 */ 366, 117, 253, 269, 522, 503, 608, 608, 608, 607, - /* 1340 */ 15, 551, 502, 58, 274, 524, 178, 73, 74, 304, - /* 1350 */ 501, 368, 303, 206, 75, 426, 425, 491, 360, 610, - /* 1360 */ 213, 177, 483, 131, 345, 298, 297, 296, 202, 294, - /* 1370 */ 480, 490, 466, 134, 172, 129, 444, 346, 470, 128, - /* 1380 */ 314, 459, 103, 127, 126, 148, 124, 167, 443, 235, - /* 1390 */ 608, 608, 608, 607, 15, 442, 439, 623, 234, 299, - /* 1400 */ 145, 583, 291, 377, 581, 160, 119, 156, 270, 636, - /* 1410 */ 971, 169, 279, 626, 520, 625, 473, 624, 170, 621, - /* 1420 */ 618, 119, 168, 55, 409, 423, 537, 609, 286, 285, - /* 1430 */ 405, 570, 560, 556, 5, 52, 458, 554, 147, 267, - /* 1440 */ 519, 504, 518, 406, 262, 239, 260, 512, 343, 511, - /* 1450 */ 258, 353, 565, 256, 224, 251, 359, 277, 275, 476, - /* 1460 */ 475, 246, 352, 244, 467, 455, 236, 233, 232, 307, - /* 1470 */ 441, 281, 205, 163, 397, 280, 535, 505, 330, 617, - /* 1480 */ 971, 971, 971, 971, 367, 971, 971, 971, 971, 971, - /* 1490 */ 971, 971, 971, 971, 971, 971, 338, + /* 0 */ 349, 99, 96, 185, 99, 96, 185, 233, 1047, 1, + /* 10 */ 1, 489, 2, 1051, 484, 477, 477, 477, 260, 351, + /* 20 */ 121, 1310, 1120, 1120, 1178, 1115, 1094, 1128, 380, 380, + /* 30 */ 380, 835, 454, 410, 1115, 59, 59, 1357, 425, 836, + /* 40 */ 710, 711, 712, 106, 107, 97, 1023, 1023, 900, 903, + /* 50 */ 892, 892, 104, 104, 105, 105, 105, 105, 346, 238, + /* 60 */ 238, 99, 96, 185, 238, 238, 889, 889, 901, 904, + /* 70 */ 460, 481, 351, 99, 96, 185, 481, 347, 1177, 82, + /* 80 */ 388, 214, 182, 23, 194, 103, 103, 103, 103, 102, + /* 90 */ 102, 101, 101, 101, 100, 381, 106, 107, 97, 1023, + /* 100 */ 1023, 900, 903, 892, 892, 104, 104, 105, 105, 105, + /* 110 */ 105, 10, 385, 484, 24, 484, 1333, 489, 2, 1051, + /* 120 */ 335, 1043, 108, 893, 260, 351, 121, 99, 96, 185, + /* 130 */ 100, 381, 386, 1128, 59, 59, 59, 59, 103, 103, + /* 140 */ 103, 103, 102, 102, 101, 101, 101, 100, 381, 106, + /* 150 */ 107, 97, 1023, 1023, 900, 903, 892, 892, 104, 104, + /* 160 */ 105, 105, 105, 105, 360, 238, 238, 170, 170, 467, + /* 170 */ 455, 467, 464, 67, 381, 329, 169, 481, 351, 343, + /* 180 */ 338, 400, 1044, 68, 101, 101, 101, 100, 381, 393, + /* 190 */ 194, 103, 103, 103, 103, 102, 102, 101, 101, 101, + /* 200 */ 100, 381, 106, 107, 97, 1023, 1023, 900, 903, 892, + /* 210 */ 892, 104, 104, 105, 105, 105, 105, 483, 385, 103, + /* 220 */ 103, 103, 103, 102, 102, 101, 101, 101, 100, 381, + /* 230 */ 268, 351, 946, 946, 422, 296, 102, 102, 101, 101, + /* 240 */ 101, 100, 381, 861, 103, 103, 103, 103, 102, 102, + /* 250 */ 101, 101, 101, 100, 381, 106, 107, 97, 1023, 1023, + /* 260 */ 900, 903, 892, 892, 104, 104, 105, 105, 105, 105, + /* 270 */ 484, 983, 1383, 206, 1353, 1383, 438, 435, 434, 281, + /* 280 */ 396, 269, 1089, 941, 351, 1002, 433, 861, 743, 401, + /* 290 */ 282, 57, 57, 482, 145, 791, 791, 103, 103, 103, + /* 300 */ 103, 102, 102, 101, 101, 101, 100, 381, 106, 107, + /* 310 */ 97, 1023, 1023, 900, 903, 892, 892, 104, 104, 105, + /* 320 */ 105, 105, 105, 281, 1002, 1003, 1004, 206, 879, 319, + /* 330 */ 438, 435, 434, 981, 259, 474, 360, 351, 1118, 1118, + /* 340 */ 433, 736, 379, 378, 872, 1002, 1356, 322, 871, 766, + /* 350 */ 103, 103, 103, 103, 102, 102, 101, 101, 101, 100, + /* 360 */ 381, 106, 107, 97, 1023, 1023, 900, 903, 892, 892, + /* 370 */ 104, 104, 105, 105, 105, 105, 484, 801, 484, 871, + /* 380 */ 871, 873, 401, 282, 1002, 1003, 1004, 1030, 360, 1030, + /* 390 */ 351, 983, 1384, 213, 880, 1384, 145, 59, 59, 59, + /* 400 */ 59, 1002, 244, 103, 103, 103, 103, 102, 102, 101, + /* 410 */ 101, 101, 100, 381, 106, 107, 97, 1023, 1023, 900, + /* 420 */ 903, 892, 892, 104, 104, 105, 105, 105, 105, 274, + /* 430 */ 484, 110, 467, 479, 467, 444, 259, 474, 232, 232, + /* 440 */ 1002, 1003, 1004, 351, 210, 335, 982, 866, 1385, 336, + /* 450 */ 481, 59, 59, 981, 245, 307, 103, 103, 103, 103, + /* 460 */ 102, 102, 101, 101, 101, 100, 381, 106, 107, 97, + /* 470 */ 1023, 1023, 900, 903, 892, 892, 104, 104, 105, 105, + /* 480 */ 105, 105, 453, 459, 484, 408, 377, 259, 474, 271, + /* 490 */ 183, 273, 209, 208, 207, 356, 351, 307, 178, 177, + /* 500 */ 127, 1006, 1098, 14, 14, 43, 43, 1044, 425, 103, + /* 510 */ 103, 103, 103, 102, 102, 101, 101, 101, 100, 381, + /* 520 */ 106, 107, 97, 1023, 1023, 900, 903, 892, 892, 104, + /* 530 */ 104, 105, 105, 105, 105, 294, 1132, 408, 160, 484, + /* 540 */ 408, 1006, 129, 962, 1209, 239, 239, 481, 307, 425, + /* 550 */ 1309, 1097, 351, 235, 243, 272, 820, 481, 963, 425, + /* 560 */ 11, 11, 103, 103, 103, 103, 102, 102, 101, 101, + /* 570 */ 101, 100, 381, 964, 362, 1002, 106, 107, 97, 1023, + /* 580 */ 1023, 900, 903, 892, 892, 104, 104, 105, 105, 105, + /* 590 */ 105, 1275, 161, 126, 777, 289, 1209, 292, 1072, 357, + /* 600 */ 1209, 1127, 476, 357, 778, 425, 247, 425, 351, 248, + /* 610 */ 414, 364, 414, 171, 1002, 1003, 1004, 84, 103, 103, + /* 620 */ 103, 103, 102, 102, 101, 101, 101, 100, 381, 1002, + /* 630 */ 184, 484, 106, 107, 97, 1023, 1023, 900, 903, 892, + /* 640 */ 892, 104, 104, 105, 105, 105, 105, 1123, 1209, 287, + /* 650 */ 484, 1209, 11, 11, 179, 820, 259, 474, 307, 237, + /* 660 */ 182, 351, 321, 365, 414, 308, 367, 366, 1002, 1003, + /* 670 */ 1004, 44, 44, 87, 103, 103, 103, 103, 102, 102, + /* 680 */ 101, 101, 101, 100, 381, 106, 107, 97, 1023, 1023, + /* 690 */ 900, 903, 892, 892, 104, 104, 105, 105, 105, 105, + /* 700 */ 246, 368, 280, 128, 10, 358, 146, 796, 835, 258, + /* 710 */ 1020, 88, 795, 86, 351, 421, 836, 943, 376, 348, + /* 720 */ 191, 943, 1318, 267, 308, 279, 456, 103, 103, 103, + /* 730 */ 103, 102, 102, 101, 101, 101, 100, 381, 106, 95, + /* 740 */ 97, 1023, 1023, 900, 903, 892, 892, 104, 104, 105, + /* 750 */ 105, 105, 105, 420, 249, 238, 238, 238, 238, 79, + /* 760 */ 375, 125, 305, 29, 262, 978, 351, 481, 337, 481, + /* 770 */ 756, 755, 304, 278, 415, 15, 81, 940, 1126, 940, + /* 780 */ 103, 103, 103, 103, 102, 102, 101, 101, 101, 100, + /* 790 */ 381, 107, 97, 1023, 1023, 900, 903, 892, 892, 104, + /* 800 */ 104, 105, 105, 105, 105, 457, 263, 484, 174, 484, + /* 810 */ 238, 238, 863, 407, 402, 216, 216, 351, 409, 193, + /* 820 */ 283, 216, 481, 81, 763, 764, 266, 5, 13, 13, + /* 830 */ 34, 34, 103, 103, 103, 103, 102, 102, 101, 101, + /* 840 */ 101, 100, 381, 97, 1023, 1023, 900, 903, 892, 892, + /* 850 */ 104, 104, 105, 105, 105, 105, 93, 475, 1002, 4, + /* 860 */ 403, 1002, 340, 431, 1002, 297, 212, 1277, 81, 746, + /* 870 */ 1163, 152, 926, 478, 166, 212, 757, 829, 930, 939, + /* 880 */ 216, 939, 858, 103, 103, 103, 103, 102, 102, 101, + /* 890 */ 101, 101, 100, 381, 238, 238, 382, 1002, 1003, 1004, + /* 900 */ 1002, 1003, 1004, 1002, 1003, 1004, 481, 439, 472, 746, + /* 910 */ 105, 105, 105, 105, 98, 758, 1162, 145, 930, 412, + /* 920 */ 879, 406, 793, 81, 395, 89, 90, 91, 105, 105, + /* 930 */ 105, 105, 1323, 92, 484, 382, 486, 485, 240, 275, + /* 940 */ 871, 103, 103, 103, 103, 102, 102, 101, 101, 101, + /* 950 */ 100, 381, 1096, 371, 355, 45, 45, 259, 474, 103, + /* 960 */ 103, 103, 103, 102, 102, 101, 101, 101, 100, 381, + /* 970 */ 1150, 871, 871, 873, 874, 21, 1332, 991, 384, 730, + /* 980 */ 722, 242, 123, 1298, 124, 875, 333, 333, 332, 227, + /* 990 */ 330, 991, 384, 719, 256, 242, 484, 391, 413, 1297, + /* 1000 */ 333, 333, 332, 227, 330, 748, 187, 719, 265, 470, + /* 1010 */ 1279, 1002, 484, 417, 391, 390, 264, 11, 11, 284, + /* 1020 */ 187, 732, 265, 93, 475, 875, 4, 1279, 1281, 419, + /* 1030 */ 264, 369, 416, 11, 11, 1159, 288, 484, 399, 1346, + /* 1040 */ 478, 379, 378, 291, 484, 293, 189, 250, 295, 1027, + /* 1050 */ 1002, 1003, 1004, 190, 1029, 1111, 140, 188, 11, 11, + /* 1060 */ 189, 732, 1028, 382, 923, 46, 46, 190, 1095, 230, + /* 1070 */ 140, 188, 462, 93, 475, 472, 4, 300, 309, 391, + /* 1080 */ 373, 6, 1069, 217, 739, 310, 1030, 879, 1030, 1171, + /* 1090 */ 478, 352, 1279, 90, 91, 800, 259, 474, 1208, 484, + /* 1100 */ 92, 1268, 382, 486, 485, 352, 1002, 871, 879, 426, + /* 1110 */ 259, 474, 172, 382, 238, 238, 1146, 170, 1021, 389, + /* 1120 */ 47, 47, 1157, 739, 872, 472, 481, 469, 871, 350, + /* 1130 */ 1214, 83, 475, 389, 4, 1078, 1071, 879, 871, 871, + /* 1140 */ 873, 874, 21, 90, 91, 1002, 1003, 1004, 478, 251, + /* 1150 */ 92, 251, 382, 486, 485, 443, 370, 871, 1021, 871, + /* 1160 */ 871, 873, 224, 241, 306, 441, 301, 440, 211, 1060, + /* 1170 */ 820, 382, 822, 447, 299, 1059, 484, 1061, 1143, 962, + /* 1180 */ 430, 796, 484, 472, 1340, 312, 795, 465, 871, 871, + /* 1190 */ 873, 874, 21, 314, 963, 879, 316, 59, 59, 1002, + /* 1200 */ 9, 90, 91, 48, 48, 238, 238, 210, 92, 964, + /* 1210 */ 382, 486, 485, 176, 334, 871, 242, 481, 1193, 238, + /* 1220 */ 238, 333, 333, 332, 227, 330, 394, 270, 719, 277, + /* 1230 */ 471, 481, 467, 466, 484, 145, 217, 1201, 1002, 1003, + /* 1240 */ 1004, 187, 3, 265, 184, 445, 871, 871, 873, 874, + /* 1250 */ 21, 264, 1337, 450, 1051, 39, 39, 392, 356, 260, + /* 1260 */ 342, 121, 468, 411, 436, 821, 180, 1094, 1128, 820, + /* 1270 */ 303, 1021, 1272, 1271, 299, 259, 474, 238, 238, 1002, + /* 1280 */ 473, 189, 484, 318, 327, 238, 238, 484, 190, 481, + /* 1290 */ 446, 140, 188, 1343, 238, 238, 1038, 481, 148, 175, + /* 1300 */ 238, 238, 484, 49, 49, 219, 481, 484, 35, 35, + /* 1310 */ 1317, 1021, 481, 484, 1035, 484, 1315, 484, 1002, 1003, + /* 1320 */ 1004, 484, 66, 36, 36, 194, 352, 484, 38, 38, + /* 1330 */ 484, 259, 474, 69, 50, 50, 51, 51, 52, 52, + /* 1340 */ 359, 484, 12, 12, 484, 1198, 484, 158, 53, 53, + /* 1350 */ 405, 112, 112, 385, 389, 484, 26, 484, 143, 484, + /* 1360 */ 150, 484, 54, 54, 397, 40, 40, 55, 55, 484, + /* 1370 */ 79, 484, 153, 1190, 484, 154, 56, 56, 41, 41, + /* 1380 */ 58, 58, 133, 133, 484, 398, 484, 429, 484, 155, + /* 1390 */ 134, 134, 135, 135, 484, 63, 63, 484, 341, 484, + /* 1400 */ 339, 484, 196, 484, 156, 42, 42, 113, 113, 60, + /* 1410 */ 60, 484, 404, 484, 27, 114, 114, 1204, 115, 115, + /* 1420 */ 111, 111, 132, 132, 131, 131, 1266, 418, 484, 162, + /* 1430 */ 484, 200, 119, 119, 118, 118, 484, 74, 424, 484, + /* 1440 */ 1286, 484, 231, 484, 202, 484, 167, 286, 427, 116, + /* 1450 */ 116, 117, 117, 290, 203, 442, 1062, 62, 62, 204, + /* 1460 */ 64, 64, 61, 61, 33, 33, 37, 37, 344, 372, + /* 1470 */ 1114, 1105, 748, 1113, 374, 1112, 254, 458, 1086, 255, + /* 1480 */ 345, 1085, 302, 1084, 1355, 78, 1154, 311, 1104, 449, + /* 1490 */ 452, 1155, 1153, 218, 7, 313, 315, 320, 1152, 85, + /* 1500 */ 1252, 317, 109, 80, 463, 225, 461, 1068, 25, 487, + /* 1510 */ 997, 323, 257, 226, 229, 228, 1136, 324, 325, 326, + /* 1520 */ 488, 136, 1057, 1052, 1302, 1303, 1301, 706, 1300, 137, + /* 1530 */ 122, 138, 383, 173, 1082, 261, 186, 252, 1081, 65, + /* 1540 */ 387, 120, 938, 936, 855, 353, 149, 1079, 139, 151, + /* 1550 */ 192, 780, 195, 276, 952, 157, 141, 361, 70, 363, + /* 1560 */ 859, 159, 71, 72, 142, 73, 955, 354, 147, 197, + /* 1570 */ 198, 951, 130, 16, 199, 285, 216, 1032, 201, 423, + /* 1580 */ 164, 944, 163, 28, 721, 428, 304, 165, 205, 759, + /* 1590 */ 75, 432, 298, 17, 18, 437, 76, 253, 878, 144, + /* 1600 */ 877, 906, 77, 986, 30, 448, 987, 31, 451, 181, + /* 1610 */ 234, 236, 168, 828, 823, 89, 910, 921, 81, 907, + /* 1620 */ 215, 905, 909, 961, 960, 19, 221, 20, 220, 22, + /* 1630 */ 32, 331, 876, 731, 94, 790, 794, 8, 992, 222, + /* 1640 */ 480, 328, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 1048, + /* 1650 */ 223, 1048, 1048, 1048, 1048, 1348, 1347, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 19, 22, 22, 23, 1, 24, 26, 15, 27, 80, - /* 10 */ 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - /* 20 */ 91, 92, 93, 94, 95, 108, 109, 110, 27, 28, - /* 30 */ 23, 50, 51, 80, 81, 82, 83, 122, 85, 86, - /* 40 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 22, - /* 50 */ 70, 23, 71, 72, 73, 74, 75, 76, 77, 78, - /* 60 */ 79, 80, 81, 82, 83, 122, 85, 86, 87, 88, - /* 70 */ 89, 90, 91, 92, 93, 94, 95, 19, 97, 91, - /* 80 */ 92, 93, 94, 95, 26, 85, 86, 87, 88, 89, - /* 90 */ 90, 91, 92, 93, 94, 95, 27, 28, 97, 98, - /* 100 */ 99, 122, 211, 102, 103, 104, 79, 19, 50, 51, - /* 110 */ 19, 122, 59, 55, 113, 224, 225, 226, 89, 90, - /* 120 */ 91, 92, 93, 94, 95, 23, 27, 28, 26, 71, - /* 130 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - /* 140 */ 82, 83, 51, 85, 86, 87, 88, 89, 90, 91, - /* 150 */ 92, 93, 94, 95, 19, 132, 133, 58, 89, 90, - /* 160 */ 21, 108, 109, 110, 27, 28, 97, 98, 33, 100, - /* 170 */ 7, 8, 119, 120, 22, 19, 107, 42, 109, 27, - /* 180 */ 28, 27, 28, 95, 28, 50, 51, 99, 100, 101, - /* 190 */ 102, 103, 104, 105, 27, 28, 97, 98, 107, 152, - /* 200 */ 112, 132, 133, 112, 65, 69, 71, 72, 73, 74, - /* 210 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 11, - /* 220 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - /* 230 */ 95, 19, 101, 97, 97, 98, 24, 101, 122, 157, - /* 240 */ 12, 99, 103, 112, 102, 103, 104, 152, 22, 97, - /* 250 */ 98, 97, 98, 27, 28, 113, 27, 29, 91, 164, - /* 260 */ 165, 124, 50, 51, 97, 98, 219, 59, 132, 133, - /* 270 */ 134, 22, 23, 45, 66, 47, 212, 213, 124, 140, - /* 280 */ 132, 133, 19, 71, 72, 73, 74, 75, 76, 77, - /* 290 */ 78, 79, 80, 81, 82, 83, 152, 85, 86, 87, - /* 300 */ 88, 89, 90, 91, 92, 93, 94, 95, 164, 165, - /* 310 */ 27, 28, 230, 50, 51, 233, 108, 109, 110, 70, - /* 320 */ 16, 59, 23, 97, 98, 26, 97, 22, 66, 185, - /* 330 */ 12, 187, 27, 28, 71, 72, 73, 74, 75, 76, - /* 340 */ 77, 78, 79, 80, 81, 82, 83, 29, 85, 86, - /* 350 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 19, - /* 360 */ 22, 148, 149, 45, 23, 47, 62, 154, 64, 156, - /* 370 */ 108, 109, 110, 37, 69, 23, 163, 59, 26, 26, - /* 380 */ 97, 98, 144, 145, 146, 147, 152, 200, 52, 23, - /* 390 */ 50, 51, 26, 22, 89, 90, 60, 210, 7, 8, - /* 400 */ 9, 138, 97, 22, 23, 26, 101, 26, 174, 175, - /* 410 */ 197, 71, 72, 73, 74, 75, 76, 77, 78, 79, - /* 420 */ 80, 81, 82, 83, 16, 85, 86, 87, 88, 89, - /* 430 */ 90, 91, 92, 93, 94, 95, 19, 132, 133, 134, - /* 440 */ 23, 152, 208, 209, 140, 152, 152, 111, 195, 196, - /* 450 */ 98, 70, 163, 160, 152, 23, 22, 164, 165, 246, - /* 460 */ 207, 27, 152, 174, 175, 171, 172, 50, 51, 137, - /* 470 */ 62, 139, 64, 171, 172, 222, 124, 27, 138, 24, - /* 480 */ 163, 89, 90, 130, 174, 175, 197, 163, 71, 72, - /* 490 */ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - /* 500 */ 83, 22, 85, 86, 87, 88, 89, 90, 91, 92, - /* 510 */ 93, 94, 95, 19, 197, 181, 182, 23, 208, 209, - /* 520 */ 152, 197, 26, 189, 132, 133, 232, 224, 225, 226, - /* 530 */ 152, 97, 91, 26, 232, 116, 212, 213, 152, 222, - /* 540 */ 121, 152, 174, 175, 50, 51, 243, 97, 22, 23, - /* 550 */ 22, 234, 174, 175, 177, 23, 239, 116, 163, 177, - /* 560 */ 174, 175, 121, 174, 175, 71, 72, 73, 74, 75, - /* 570 */ 76, 77, 78, 79, 80, 81, 82, 83, 24, 85, - /* 580 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, - /* 590 */ 19, 23, 197, 11, 23, 227, 70, 208, 220, 152, - /* 600 */ 31, 224, 225, 226, 35, 98, 224, 225, 226, 108, - /* 610 */ 109, 110, 115, 152, 117, 118, 27, 222, 49, 123, - /* 620 */ 24, 50, 51, 27, 0, 1, 2, 224, 225, 226, - /* 630 */ 166, 124, 168, 169, 239, 174, 175, 170, 171, 172, - /* 640 */ 22, 194, 71, 72, 73, 74, 75, 76, 77, 78, - /* 650 */ 79, 80, 81, 82, 83, 152, 85, 86, 87, 88, - /* 660 */ 89, 90, 91, 92, 93, 94, 95, 19, 22, 208, - /* 670 */ 24, 23, 195, 196, 170, 171, 172, 174, 175, 152, - /* 680 */ 26, 152, 152, 152, 207, 152, 97, 152, 23, 152, - /* 690 */ 51, 244, 152, 97, 152, 247, 248, 23, 50, 51, - /* 700 */ 26, 174, 175, 174, 175, 174, 175, 174, 175, 174, - /* 710 */ 175, 174, 175, 23, 174, 175, 174, 175, 188, 71, - /* 720 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - /* 730 */ 82, 83, 152, 85, 86, 87, 88, 89, 90, 91, - /* 740 */ 92, 93, 94, 95, 19, 152, 107, 152, 33, 24, - /* 750 */ 152, 100, 101, 27, 174, 175, 152, 42, 152, 23, - /* 760 */ 152, 26, 152, 23, 152, 26, 152, 174, 175, 174, - /* 770 */ 175, 152, 174, 175, 23, 50, 51, 26, 174, 175, - /* 780 */ 174, 175, 174, 175, 174, 175, 174, 175, 174, 175, - /* 790 */ 163, 119, 120, 174, 175, 19, 71, 72, 73, 74, - /* 800 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 152, - /* 810 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, - /* 820 */ 95, 66, 152, 97, 197, 23, 50, 51, 26, 53, - /* 830 */ 23, 174, 175, 26, 23, 23, 23, 26, 26, 26, - /* 840 */ 36, 106, 146, 147, 174, 175, 19, 71, 72, 73, - /* 850 */ 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, - /* 860 */ 152, 85, 86, 87, 88, 89, 90, 91, 92, 93, - /* 870 */ 94, 95, 152, 196, 119, 120, 19, 50, 51, 168, - /* 880 */ 169, 26, 174, 175, 207, 28, 152, 249, 250, 152, - /* 890 */ 163, 163, 163, 163, 174, 175, 163, 19, 71, 72, - /* 900 */ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - /* 910 */ 83, 152, 85, 86, 87, 88, 89, 90, 91, 92, - /* 920 */ 93, 94, 95, 152, 197, 197, 197, 197, 50, 51, - /* 930 */ 197, 194, 36, 174, 175, 191, 192, 152, 191, 192, - /* 940 */ 163, 152, 66, 124, 152, 174, 175, 152, 19, 71, - /* 950 */ 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - /* 960 */ 82, 83, 152, 85, 86, 87, 88, 89, 90, 91, - /* 970 */ 92, 93, 94, 95, 197, 152, 100, 188, 152, 50, - /* 980 */ 51, 152, 152, 188, 174, 175, 252, 152, 94, 95, - /* 990 */ 152, 152, 152, 1, 2, 152, 152, 174, 175, 19, - /* 1000 */ 152, 72, 73, 74, 75, 76, 77, 78, 79, 80, - /* 1010 */ 81, 82, 83, 152, 85, 86, 87, 88, 89, 90, - /* 1020 */ 91, 92, 93, 94, 95, 152, 188, 188, 22, 194, - /* 1030 */ 50, 51, 240, 173, 194, 174, 175, 252, 194, 152, - /* 1040 */ 36, 181, 28, 152, 23, 219, 122, 174, 175, 219, - /* 1050 */ 221, 152, 152, 73, 74, 75, 76, 77, 78, 79, - /* 1060 */ 80, 81, 82, 83, 152, 85, 86, 87, 88, 89, - /* 1070 */ 90, 91, 92, 93, 94, 95, 19, 20, 152, 22, - /* 1080 */ 23, 194, 152, 240, 27, 28, 174, 175, 240, 19, - /* 1090 */ 20, 26, 22, 194, 194, 38, 22, 27, 28, 152, - /* 1100 */ 23, 22, 152, 116, 174, 175, 152, 23, 38, 152, - /* 1110 */ 23, 152, 221, 152, 57, 152, 23, 163, 50, 51, - /* 1120 */ 194, 174, 175, 66, 174, 175, 69, 57, 174, 175, - /* 1130 */ 40, 174, 175, 174, 175, 174, 175, 174, 175, 69, - /* 1140 */ 22, 53, 74, 75, 30, 53, 89, 90, 22, 22, - /* 1150 */ 152, 197, 23, 96, 97, 98, 22, 152, 101, 89, - /* 1160 */ 90, 91, 208, 209, 152, 53, 96, 97, 98, 101, - /* 1170 */ 22, 101, 174, 175, 152, 19, 20, 105, 22, 174, - /* 1180 */ 175, 112, 19, 27, 28, 20, 174, 175, 24, 132, - /* 1190 */ 133, 134, 135, 136, 38, 44, 174, 175, 107, 61, - /* 1200 */ 54, 26, 132, 133, 134, 135, 136, 54, 107, 22, - /* 1210 */ 5, 140, 1, 57, 36, 111, 122, 28, 79, 79, - /* 1220 */ 131, 123, 66, 19, 20, 69, 22, 1, 16, 20, - /* 1230 */ 125, 27, 28, 123, 111, 120, 23, 131, 23, 16, - /* 1240 */ 68, 142, 38, 15, 22, 89, 90, 3, 167, 4, - /* 1250 */ 248, 251, 96, 97, 98, 180, 180, 101, 251, 151, - /* 1260 */ 6, 57, 151, 13, 151, 26, 25, 151, 161, 202, - /* 1270 */ 153, 162, 153, 69, 130, 128, 203, 19, 20, 127, - /* 1280 */ 22, 126, 204, 129, 22, 27, 28, 205, 132, 133, - /* 1290 */ 134, 135, 136, 89, 90, 231, 38, 95, 137, 179, - /* 1300 */ 96, 97, 98, 206, 179, 101, 122, 107, 159, 159, - /* 1310 */ 125, 231, 216, 228, 107, 57, 184, 217, 216, 176, - /* 1320 */ 217, 176, 48, 106, 18, 184, 158, 69, 159, 158, - /* 1330 */ 46, 71, 237, 176, 176, 176, 132, 133, 134, 135, - /* 1340 */ 136, 217, 176, 137, 216, 178, 158, 89, 90, 179, - /* 1350 */ 176, 159, 179, 159, 96, 97, 98, 159, 159, 101, - /* 1360 */ 5, 158, 202, 22, 18, 10, 11, 12, 13, 14, - /* 1370 */ 190, 238, 17, 190, 158, 193, 41, 159, 202, 193, - /* 1380 */ 159, 202, 245, 193, 193, 223, 190, 32, 159, 34, - /* 1390 */ 132, 133, 134, 135, 136, 159, 39, 155, 43, 150, - /* 1400 */ 223, 177, 201, 178, 177, 186, 66, 199, 177, 152, - /* 1410 */ 253, 56, 215, 152, 182, 152, 202, 152, 63, 152, - /* 1420 */ 152, 66, 67, 242, 229, 152, 174, 152, 152, 152, - /* 1430 */ 152, 152, 152, 152, 199, 242, 202, 152, 198, 152, - /* 1440 */ 152, 152, 183, 192, 152, 215, 152, 183, 215, 183, - /* 1450 */ 152, 241, 214, 152, 211, 152, 152, 211, 211, 152, - /* 1460 */ 152, 241, 152, 152, 152, 152, 152, 152, 152, 114, - /* 1470 */ 152, 152, 235, 152, 152, 152, 174, 187, 95, 174, - /* 1480 */ 253, 253, 253, 253, 236, 253, 253, 253, 253, 253, - /* 1490 */ 253, 253, 253, 253, 253, 253, 141, + /* 0 */ 174, 226, 227, 228, 226, 227, 228, 172, 145, 146, + /* 10 */ 147, 148, 149, 150, 153, 169, 170, 171, 155, 19, + /* 20 */ 157, 246, 192, 193, 177, 181, 182, 164, 169, 170, + /* 30 */ 171, 31, 164, 153, 190, 174, 175, 187, 153, 39, + /* 40 */ 7, 8, 9, 43, 44, 45, 46, 47, 48, 49, + /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 174, 196, + /* 60 */ 197, 226, 227, 228, 196, 197, 46, 47, 48, 49, + /* 70 */ 209, 208, 19, 226, 227, 228, 208, 174, 177, 26, + /* 80 */ 195, 213, 214, 22, 221, 85, 86, 87, 88, 89, + /* 90 */ 90, 91, 92, 93, 94, 95, 43, 44, 45, 46, + /* 100 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 110 */ 57, 172, 249, 153, 53, 153, 147, 148, 149, 150, + /* 120 */ 22, 23, 69, 103, 155, 19, 157, 226, 227, 228, + /* 130 */ 94, 95, 247, 164, 174, 175, 174, 175, 85, 86, + /* 140 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 43, + /* 150 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, + /* 160 */ 54, 55, 56, 57, 153, 196, 197, 153, 153, 209, + /* 170 */ 210, 209, 210, 67, 95, 161, 237, 208, 19, 165, + /* 180 */ 165, 242, 84, 24, 91, 92, 93, 94, 95, 223, + /* 190 */ 221, 85, 86, 87, 88, 89, 90, 91, 92, 93, + /* 200 */ 94, 95, 43, 44, 45, 46, 47, 48, 49, 50, + /* 210 */ 51, 52, 53, 54, 55, 56, 57, 153, 249, 85, + /* 220 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + /* 230 */ 219, 19, 109, 110, 111, 23, 89, 90, 91, 92, + /* 240 */ 93, 94, 95, 73, 85, 86, 87, 88, 89, 90, + /* 250 */ 91, 92, 93, 94, 95, 43, 44, 45, 46, 47, + /* 260 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 270 */ 153, 22, 23, 101, 173, 26, 104, 105, 106, 109, + /* 280 */ 110, 111, 181, 11, 19, 59, 114, 73, 23, 110, + /* 290 */ 111, 174, 175, 116, 80, 118, 119, 85, 86, 87, + /* 300 */ 88, 89, 90, 91, 92, 93, 94, 95, 43, 44, + /* 310 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + /* 320 */ 55, 56, 57, 109, 98, 99, 100, 101, 83, 153, + /* 330 */ 104, 105, 106, 84, 120, 121, 153, 19, 192, 193, + /* 340 */ 114, 23, 89, 90, 99, 59, 23, 230, 103, 26, + /* 350 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + /* 360 */ 95, 43, 44, 45, 46, 47, 48, 49, 50, 51, + /* 370 */ 52, 53, 54, 55, 56, 57, 153, 91, 153, 134, + /* 380 */ 135, 136, 110, 111, 98, 99, 100, 134, 153, 136, + /* 390 */ 19, 22, 23, 26, 23, 26, 80, 174, 175, 174, + /* 400 */ 175, 59, 219, 85, 86, 87, 88, 89, 90, 91, + /* 410 */ 92, 93, 94, 95, 43, 44, 45, 46, 47, 48, + /* 420 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 16, + /* 430 */ 153, 22, 209, 210, 209, 210, 120, 121, 196, 197, + /* 440 */ 98, 99, 100, 19, 46, 22, 23, 23, 252, 253, + /* 450 */ 208, 174, 175, 84, 219, 153, 85, 86, 87, 88, + /* 460 */ 89, 90, 91, 92, 93, 94, 95, 43, 44, 45, + /* 470 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, + /* 480 */ 56, 57, 153, 153, 153, 153, 209, 120, 121, 76, + /* 490 */ 153, 78, 109, 110, 111, 97, 19, 153, 89, 90, + /* 500 */ 198, 59, 183, 174, 175, 174, 175, 84, 153, 85, + /* 510 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + /* 520 */ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 530 */ 53, 54, 55, 56, 57, 16, 197, 153, 22, 153, + /* 540 */ 153, 99, 198, 12, 153, 196, 197, 208, 153, 153, + /* 550 */ 195, 183, 19, 23, 222, 142, 26, 208, 27, 153, + /* 560 */ 174, 175, 85, 86, 87, 88, 89, 90, 91, 92, + /* 570 */ 93, 94, 95, 42, 188, 59, 43, 44, 45, 46, + /* 580 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + /* 590 */ 57, 195, 22, 198, 63, 76, 153, 78, 167, 168, + /* 600 */ 153, 195, 167, 168, 73, 153, 222, 153, 19, 222, + /* 610 */ 153, 220, 153, 24, 98, 99, 100, 140, 85, 86, + /* 620 */ 87, 88, 89, 90, 91, 92, 93, 94, 95, 59, + /* 630 */ 100, 153, 43, 44, 45, 46, 47, 48, 49, 50, + /* 640 */ 51, 52, 53, 54, 55, 56, 57, 195, 153, 195, + /* 650 */ 153, 153, 174, 175, 26, 125, 120, 121, 153, 213, + /* 660 */ 214, 19, 153, 220, 153, 153, 188, 220, 98, 99, + /* 670 */ 100, 174, 175, 140, 85, 86, 87, 88, 89, 90, + /* 680 */ 91, 92, 93, 94, 95, 43, 44, 45, 46, 47, + /* 690 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + /* 700 */ 243, 189, 243, 198, 172, 250, 251, 117, 31, 201, + /* 710 */ 26, 139, 122, 141, 19, 220, 39, 29, 220, 211, + /* 720 */ 24, 33, 153, 164, 153, 164, 19, 85, 86, 87, + /* 730 */ 88, 89, 90, 91, 92, 93, 94, 95, 43, 44, + /* 740 */ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + /* 750 */ 55, 56, 57, 65, 243, 196, 197, 196, 197, 131, + /* 760 */ 189, 22, 103, 24, 153, 23, 19, 208, 26, 208, + /* 770 */ 102, 103, 113, 23, 242, 22, 26, 134, 164, 136, + /* 780 */ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + /* 790 */ 95, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 800 */ 53, 54, 55, 56, 57, 98, 153, 153, 124, 153, + /* 810 */ 196, 197, 23, 23, 61, 26, 26, 19, 23, 123, + /* 820 */ 23, 26, 208, 26, 7, 8, 153, 22, 174, 175, + /* 830 */ 174, 175, 85, 86, 87, 88, 89, 90, 91, 92, + /* 840 */ 93, 94, 95, 45, 46, 47, 48, 49, 50, 51, + /* 850 */ 52, 53, 54, 55, 56, 57, 19, 20, 59, 22, + /* 860 */ 111, 59, 164, 23, 59, 23, 26, 153, 26, 59, + /* 870 */ 153, 72, 23, 36, 72, 26, 35, 23, 59, 134, + /* 880 */ 26, 136, 133, 85, 86, 87, 88, 89, 90, 91, + /* 890 */ 92, 93, 94, 95, 196, 197, 59, 98, 99, 100, + /* 900 */ 98, 99, 100, 98, 99, 100, 208, 66, 71, 99, + /* 910 */ 54, 55, 56, 57, 58, 74, 153, 80, 99, 19, + /* 920 */ 83, 223, 23, 26, 153, 26, 89, 90, 54, 55, + /* 930 */ 56, 57, 153, 96, 153, 98, 99, 100, 22, 153, + /* 940 */ 103, 85, 86, 87, 88, 89, 90, 91, 92, 93, + /* 950 */ 94, 95, 183, 112, 158, 174, 175, 120, 121, 85, + /* 960 */ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, + /* 970 */ 215, 134, 135, 136, 137, 138, 0, 1, 2, 23, + /* 980 */ 21, 5, 26, 153, 22, 59, 10, 11, 12, 13, + /* 990 */ 14, 1, 2, 17, 212, 5, 153, 153, 98, 153, + /* 1000 */ 10, 11, 12, 13, 14, 108, 30, 17, 32, 193, + /* 1010 */ 153, 59, 153, 153, 170, 171, 40, 174, 175, 153, + /* 1020 */ 30, 59, 32, 19, 20, 99, 22, 170, 171, 233, + /* 1030 */ 40, 188, 236, 174, 175, 153, 153, 153, 79, 123, + /* 1040 */ 36, 89, 90, 153, 153, 153, 70, 188, 153, 97, + /* 1050 */ 98, 99, 100, 77, 102, 153, 80, 81, 174, 175, + /* 1060 */ 70, 99, 110, 59, 105, 174, 175, 77, 153, 238, + /* 1070 */ 80, 81, 188, 19, 20, 71, 22, 153, 153, 235, + /* 1080 */ 19, 22, 164, 24, 59, 153, 134, 83, 136, 153, + /* 1090 */ 36, 115, 235, 89, 90, 91, 120, 121, 153, 153, + /* 1100 */ 96, 142, 98, 99, 100, 115, 59, 103, 83, 239, + /* 1110 */ 120, 121, 199, 59, 196, 197, 153, 153, 59, 143, + /* 1120 */ 174, 175, 153, 98, 99, 71, 208, 153, 103, 165, + /* 1130 */ 153, 19, 20, 143, 22, 153, 153, 83, 134, 135, + /* 1140 */ 136, 137, 138, 89, 90, 98, 99, 100, 36, 185, + /* 1150 */ 96, 187, 98, 99, 100, 91, 95, 103, 99, 134, + /* 1160 */ 135, 136, 101, 102, 103, 104, 105, 106, 107, 153, + /* 1170 */ 26, 59, 125, 164, 113, 153, 153, 153, 212, 12, + /* 1180 */ 19, 117, 153, 71, 153, 212, 122, 164, 134, 135, + /* 1190 */ 136, 137, 138, 212, 27, 83, 212, 174, 175, 59, + /* 1200 */ 200, 89, 90, 174, 175, 196, 197, 46, 96, 42, + /* 1210 */ 98, 99, 100, 172, 151, 103, 5, 208, 203, 196, + /* 1220 */ 197, 10, 11, 12, 13, 14, 216, 216, 17, 244, + /* 1230 */ 63, 208, 209, 210, 153, 80, 24, 203, 98, 99, + /* 1240 */ 100, 30, 22, 32, 100, 164, 134, 135, 136, 137, + /* 1250 */ 138, 40, 148, 164, 150, 174, 175, 102, 97, 155, + /* 1260 */ 203, 157, 164, 244, 178, 125, 186, 182, 164, 125, + /* 1270 */ 177, 59, 177, 177, 113, 120, 121, 196, 197, 59, + /* 1280 */ 232, 70, 153, 216, 202, 196, 197, 153, 77, 208, + /* 1290 */ 209, 80, 81, 156, 196, 197, 60, 208, 248, 200, + /* 1300 */ 196, 197, 153, 174, 175, 123, 208, 153, 174, 175, + /* 1310 */ 160, 99, 208, 153, 38, 153, 160, 153, 98, 99, + /* 1320 */ 100, 153, 245, 174, 175, 221, 115, 153, 174, 175, + /* 1330 */ 153, 120, 121, 245, 174, 175, 174, 175, 174, 175, + /* 1340 */ 160, 153, 174, 175, 153, 225, 153, 22, 174, 175, + /* 1350 */ 97, 174, 175, 249, 143, 153, 224, 153, 43, 153, + /* 1360 */ 191, 153, 174, 175, 18, 174, 175, 174, 175, 153, + /* 1370 */ 131, 153, 194, 203, 153, 194, 174, 175, 174, 175, + /* 1380 */ 174, 175, 174, 175, 153, 160, 153, 18, 153, 194, + /* 1390 */ 174, 175, 174, 175, 153, 174, 175, 153, 225, 153, + /* 1400 */ 203, 153, 159, 153, 194, 174, 175, 174, 175, 174, + /* 1410 */ 175, 153, 203, 153, 224, 174, 175, 191, 174, 175, + /* 1420 */ 174, 175, 174, 175, 174, 175, 203, 160, 153, 191, + /* 1430 */ 153, 159, 174, 175, 174, 175, 153, 139, 62, 153, + /* 1440 */ 241, 153, 160, 153, 159, 153, 22, 240, 179, 174, + /* 1450 */ 175, 174, 175, 160, 159, 97, 160, 174, 175, 159, + /* 1460 */ 174, 175, 174, 175, 174, 175, 174, 175, 179, 64, + /* 1470 */ 176, 184, 108, 176, 95, 176, 234, 126, 176, 234, + /* 1480 */ 179, 178, 176, 176, 176, 97, 218, 217, 184, 179, + /* 1490 */ 179, 218, 218, 160, 22, 217, 217, 160, 218, 139, + /* 1500 */ 229, 217, 130, 129, 127, 25, 128, 163, 26, 162, + /* 1510 */ 13, 206, 231, 154, 6, 154, 207, 205, 204, 203, + /* 1520 */ 152, 166, 152, 152, 172, 172, 172, 4, 172, 166, + /* 1530 */ 180, 166, 3, 22, 172, 144, 15, 180, 172, 172, + /* 1540 */ 82, 16, 23, 23, 121, 254, 132, 172, 112, 124, + /* 1550 */ 24, 20, 126, 16, 1, 124, 112, 61, 53, 37, + /* 1560 */ 133, 132, 53, 53, 112, 53, 98, 254, 251, 34, + /* 1570 */ 123, 1, 5, 22, 97, 142, 26, 75, 123, 41, + /* 1580 */ 97, 68, 68, 24, 20, 19, 113, 22, 107, 28, + /* 1590 */ 22, 67, 23, 22, 22, 67, 22, 67, 23, 37, + /* 1600 */ 23, 23, 26, 23, 22, 24, 23, 22, 24, 123, + /* 1610 */ 23, 23, 22, 98, 125, 26, 11, 23, 26, 23, + /* 1620 */ 34, 23, 23, 23, 23, 34, 22, 34, 26, 22, + /* 1630 */ 22, 15, 23, 23, 22, 117, 23, 22, 1, 123, + /* 1640 */ 26, 23, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1650 */ 123, 255, 255, 255, 255, 123, 123, 255, 255, 255, + /* 1660 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1670 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1680 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1690 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1700 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1710 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1720 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1730 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1740 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1750 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1760 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1770 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1780 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1790 */ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + /* 1800 */ 255, 255, }; -#define YY_SHIFT_USE_DFLT (-86) -#define YY_SHIFT_COUNT (429) -#define YY_SHIFT_MIN (-85) -#define YY_SHIFT_MAX (1383) -static const short yy_shift_ofst[] = { - /* 0 */ 992, 1057, 1355, 1156, 1204, 1204, 1, 262, -19, 135, - /* 10 */ 135, 776, 1204, 1204, 1204, 1204, 69, 69, 53, 208, - /* 20 */ 283, 755, 58, 725, 648, 571, 494, 417, 340, 263, - /* 30 */ 212, 827, 827, 827, 827, 827, 827, 827, 827, 827, - /* 40 */ 827, 827, 827, 827, 827, 827, 878, 827, 929, 980, - /* 50 */ 980, 1070, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, - /* 60 */ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, - /* 70 */ 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, - /* 80 */ 1258, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, - /* 90 */ 1204, 1204, 1204, 1204, -71, -47, -47, -47, -47, -47, - /* 100 */ 0, 29, -12, 283, 283, 139, 91, 392, 392, 894, - /* 110 */ 672, 726, 1383, -86, -86, -86, 88, 318, 318, 99, - /* 120 */ 381, -20, 283, 283, 283, 283, 283, 283, 283, 283, - /* 130 */ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - /* 140 */ 283, 283, 283, 283, 624, 876, 726, 672, 1340, 1340, - /* 150 */ 1340, 1340, 1340, 1340, -86, -86, -86, 305, 136, 136, - /* 160 */ 142, 167, 226, 154, 137, 152, 283, 283, 283, 283, - /* 170 */ 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, - /* 180 */ 283, 283, 283, 336, 336, 336, 283, 283, 352, 283, - /* 190 */ 283, 283, 283, 283, 228, 283, 283, 283, 283, 283, - /* 200 */ 283, 283, 283, 283, 283, 501, 569, 596, 596, 596, - /* 210 */ 507, 497, 441, 391, 353, 156, 156, 857, 353, 857, - /* 220 */ 735, 813, 639, 715, 156, 332, 715, 715, 496, 419, - /* 230 */ 646, 1357, 1184, 1184, 1335, 1335, 1184, 1341, 1260, 1144, - /* 240 */ 1346, 1346, 1346, 1346, 1184, 1306, 1144, 1341, 1260, 1260, - /* 250 */ 1144, 1184, 1306, 1206, 1284, 1184, 1184, 1306, 1184, 1306, - /* 260 */ 1184, 1306, 1262, 1207, 1207, 1207, 1274, 1262, 1207, 1217, - /* 270 */ 1207, 1274, 1207, 1207, 1185, 1200, 1185, 1200, 1185, 1200, - /* 280 */ 1184, 1184, 1161, 1262, 1202, 1202, 1262, 1154, 1155, 1147, - /* 290 */ 1152, 1144, 1241, 1239, 1250, 1250, 1254, 1254, 1254, 1254, - /* 300 */ -86, -86, -86, -86, -86, -86, 1068, 304, 526, 249, - /* 310 */ 408, -83, 434, 812, 27, 811, 807, 802, 751, 589, - /* 320 */ 651, 163, 131, 674, 366, 450, 299, 148, 23, 102, - /* 330 */ 229, -21, 1245, 1244, 1222, 1099, 1228, 1172, 1223, 1215, - /* 340 */ 1213, 1115, 1106, 1123, 1110, 1209, 1105, 1212, 1226, 1098, - /* 350 */ 1089, 1140, 1139, 1104, 1189, 1178, 1094, 1211, 1205, 1187, - /* 360 */ 1101, 1071, 1153, 1175, 1146, 1138, 1151, 1091, 1164, 1165, - /* 370 */ 1163, 1069, 1072, 1148, 1112, 1134, 1127, 1129, 1126, 1092, - /* 380 */ 1114, 1118, 1088, 1090, 1093, 1087, 1084, 987, 1079, 1077, - /* 390 */ 1074, 1065, 924, 1021, 1014, 1004, 1006, 819, 739, 896, - /* 400 */ 855, 804, 739, 740, 736, 690, 654, 665, 618, 582, - /* 410 */ 568, 528, 554, 379, 532, 479, 455, 379, 432, 371, - /* 420 */ 341, 28, 338, 116, -11, -57, -85, 7, -8, 3, +#define YY_SHIFT_COUNT (489) +#define YY_SHIFT_MIN (0) +#define YY_SHIFT_MAX (1637) +static const unsigned short int yy_shift_ofst[] = { + /* 0 */ 990, 976, 1211, 837, 837, 316, 1054, 1054, 1054, 1054, + /* 10 */ 214, 0, 0, 106, 642, 1054, 1054, 1054, 1054, 1054, + /* 20 */ 1054, 1054, 1054, 952, 952, 226, 1155, 316, 316, 316, + /* 30 */ 316, 316, 316, 53, 159, 212, 265, 318, 371, 424, + /* 40 */ 477, 533, 589, 642, 642, 642, 642, 642, 642, 642, + /* 50 */ 642, 642, 642, 642, 642, 642, 642, 642, 642, 642, + /* 60 */ 695, 642, 747, 798, 798, 1004, 1054, 1054, 1054, 1054, + /* 70 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + /* 80 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + /* 90 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1112, 1054, 1054, + /* 100 */ 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, 1054, + /* 110 */ 1054, 856, 874, 874, 874, 874, 874, 134, 147, 93, + /* 120 */ 342, 959, 1161, 253, 253, 342, 367, 367, 367, 367, + /* 130 */ 179, 36, 79, 1657, 1657, 1657, 1061, 1061, 1061, 516, + /* 140 */ 799, 516, 516, 531, 531, 802, 249, 369, 342, 342, + /* 150 */ 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, + /* 160 */ 342, 342, 342, 342, 342, 342, 342, 342, 342, 272, + /* 170 */ 442, 442, 536, 1657, 1657, 1657, 1025, 245, 245, 570, + /* 180 */ 172, 286, 805, 1047, 1140, 1220, 342, 342, 342, 342, + /* 190 */ 342, 342, 342, 342, 170, 342, 342, 342, 342, 342, + /* 200 */ 342, 342, 342, 342, 342, 342, 342, 841, 841, 841, + /* 210 */ 342, 342, 342, 342, 530, 342, 342, 342, 1059, 342, + /* 220 */ 342, 1167, 342, 342, 342, 342, 342, 342, 342, 342, + /* 230 */ 123, 688, 177, 1212, 1212, 1212, 1212, 1144, 177, 177, + /* 240 */ 1064, 409, 33, 628, 707, 707, 900, 628, 628, 900, + /* 250 */ 897, 323, 398, 677, 677, 677, 707, 572, 684, 590, + /* 260 */ 739, 1236, 1182, 1182, 1276, 1276, 1182, 1253, 1325, 1315, + /* 270 */ 1239, 1346, 1346, 1346, 1346, 1182, 1369, 1239, 1239, 1253, + /* 280 */ 1325, 1315, 1315, 1239, 1182, 1369, 1298, 1376, 1182, 1369, + /* 290 */ 1424, 1182, 1369, 1182, 1369, 1424, 1358, 1358, 1358, 1405, + /* 300 */ 1424, 1358, 1364, 1358, 1405, 1358, 1358, 1424, 1379, 1379, + /* 310 */ 1424, 1351, 1388, 1351, 1388, 1351, 1388, 1351, 1388, 1182, + /* 320 */ 1472, 1182, 1360, 1372, 1377, 1374, 1378, 1239, 1480, 1482, + /* 330 */ 1497, 1497, 1508, 1508, 1508, 1657, 1657, 1657, 1657, 1657, + /* 340 */ 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, + /* 350 */ 1657, 20, 413, 98, 423, 519, 383, 962, 742, 61, + /* 360 */ 696, 749, 750, 753, 789, 790, 795, 797, 840, 842, + /* 370 */ 810, 668, 817, 659, 819, 849, 854, 899, 643, 745, + /* 380 */ 956, 926, 916, 1523, 1529, 1511, 1391, 1521, 1458, 1525, + /* 390 */ 1519, 1520, 1423, 1414, 1436, 1526, 1425, 1531, 1426, 1537, + /* 400 */ 1553, 1431, 1427, 1444, 1496, 1522, 1429, 1505, 1509, 1510, + /* 410 */ 1512, 1452, 1468, 1535, 1447, 1570, 1567, 1551, 1477, 1433, + /* 420 */ 1513, 1550, 1514, 1502, 1538, 1455, 1483, 1559, 1564, 1566, + /* 430 */ 1473, 1481, 1565, 1524, 1568, 1571, 1569, 1572, 1528, 1561, + /* 440 */ 1574, 1530, 1562, 1575, 1577, 1578, 1576, 1580, 1582, 1581, + /* 450 */ 1583, 1585, 1584, 1486, 1587, 1588, 1515, 1586, 1590, 1489, + /* 460 */ 1589, 1591, 1592, 1593, 1594, 1596, 1598, 1589, 1599, 1600, + /* 470 */ 1602, 1601, 1604, 1605, 1607, 1608, 1609, 1610, 1612, 1613, + /* 480 */ 1615, 1614, 1518, 1516, 1527, 1532, 1533, 1618, 1616, 1637, }; -#define YY_REDUCE_USE_DFLT (-110) -#define YY_REDUCE_COUNT (305) -#define YY_REDUCE_MIN (-109) -#define YY_REDUCE_MAX (1323) +#define YY_REDUCE_COUNT (350) +#define YY_REDUCE_MIN (-225) +#define YY_REDUCE_MAX (1375) static const short yy_reduce_ofst[] = { - /* 0 */ 238, 954, 213, 289, 310, 234, 144, 317, -109, 382, - /* 10 */ 377, 303, 461, 389, 378, 368, 302, 294, 253, 395, - /* 20 */ 293, 324, 403, 403, 403, 403, 403, 403, 403, 403, - /* 30 */ 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - /* 40 */ 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, - /* 50 */ 403, 1022, 1012, 1005, 998, 963, 961, 959, 957, 950, - /* 60 */ 947, 930, 912, 873, 861, 823, 810, 771, 759, 720, - /* 70 */ 708, 670, 657, 619, 614, 612, 610, 608, 606, 604, - /* 80 */ 598, 595, 593, 580, 542, 540, 537, 535, 533, 531, - /* 90 */ 529, 527, 503, 386, 403, 403, 403, 403, 403, 403, - /* 100 */ 403, 403, 403, 95, 447, 82, 334, 504, 467, 403, - /* 110 */ 477, 464, 403, 403, 403, 403, 860, 747, 744, 785, - /* 120 */ 638, 638, 926, 891, 900, 899, 887, 844, 840, 835, - /* 130 */ 848, 830, 843, 829, 792, 839, 826, 737, 838, 795, - /* 140 */ 789, 47, 734, 530, 696, 777, 711, 677, 733, 730, - /* 150 */ 729, 728, 727, 627, 448, 64, 187, 1305, 1302, 1252, - /* 160 */ 1290, 1273, 1323, 1322, 1321, 1319, 1318, 1316, 1315, 1314, - /* 170 */ 1313, 1312, 1311, 1310, 1308, 1307, 1304, 1303, 1301, 1298, - /* 180 */ 1294, 1292, 1289, 1266, 1264, 1259, 1288, 1287, 1238, 1285, - /* 190 */ 1281, 1280, 1279, 1278, 1251, 1277, 1276, 1275, 1273, 1268, - /* 200 */ 1267, 1265, 1263, 1261, 1257, 1248, 1237, 1247, 1246, 1243, - /* 210 */ 1238, 1240, 1235, 1249, 1234, 1233, 1230, 1220, 1214, 1210, - /* 220 */ 1225, 1219, 1232, 1231, 1197, 1195, 1227, 1224, 1201, 1208, - /* 230 */ 1242, 1137, 1236, 1229, 1193, 1181, 1221, 1177, 1196, 1179, - /* 240 */ 1191, 1190, 1186, 1182, 1218, 1216, 1176, 1162, 1183, 1180, - /* 250 */ 1160, 1199, 1203, 1133, 1095, 1198, 1194, 1188, 1192, 1171, - /* 260 */ 1169, 1168, 1173, 1174, 1166, 1159, 1141, 1170, 1158, 1167, - /* 270 */ 1157, 1132, 1145, 1143, 1124, 1128, 1103, 1102, 1100, 1096, - /* 280 */ 1150, 1149, 1085, 1125, 1080, 1064, 1120, 1097, 1082, 1078, - /* 290 */ 1073, 1067, 1109, 1107, 1119, 1117, 1116, 1113, 1111, 1108, - /* 300 */ 1007, 1000, 1002, 1076, 1075, 1081, + /* 0 */ -137, -31, 1104, 1023, 1081, -132, -40, -38, 223, 225, + /* 10 */ 698, -153, -99, -225, -165, 386, 478, 843, 859, -139, + /* 20 */ 884, 117, 277, 844, 857, 964, 559, 561, 614, 918, + /* 30 */ 1009, 1089, 1098, -222, -222, -222, -222, -222, -222, -222, + /* 40 */ -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, + /* 50 */ -222, -222, -222, -222, -222, -222, -222, -222, -222, -222, + /* 60 */ -222, -222, -222, -222, -222, 329, 331, 497, 654, 656, + /* 70 */ 781, 891, 946, 1029, 1129, 1134, 1149, 1154, 1160, 1162, + /* 80 */ 1164, 1168, 1174, 1177, 1188, 1191, 1193, 1202, 1204, 1206, + /* 90 */ 1208, 1216, 1218, 1221, 1231, 1233, 1235, 1241, 1244, 1246, + /* 100 */ 1248, 1250, 1258, 1260, 1275, 1277, 1283, 1286, 1288, 1290, + /* 110 */ 1292, -222, -222, -222, -222, -222, -222, -222, -222, -222, + /* 120 */ -115, 796, -156, -154, -141, 14, 242, 349, 242, 349, + /* 130 */ -61, -222, -222, -222, -222, -222, 101, 101, 101, 332, + /* 140 */ 302, 384, 387, -170, 146, 344, 196, 196, 15, 11, + /* 150 */ 183, 235, 395, 355, 396, 406, 452, 457, 391, 459, + /* 160 */ 443, 447, 511, 495, 454, 512, 505, 571, 498, 532, + /* 170 */ 431, 435, 339, 455, 446, 508, -174, -116, -97, -120, + /* 180 */ -150, 64, 176, 330, 337, 509, 569, 611, 653, 673, + /* 190 */ 714, 717, 763, 771, -34, 779, 786, 830, 846, 860, + /* 200 */ 866, 882, 883, 890, 892, 895, 902, 319, 368, 769, + /* 210 */ 915, 924, 925, 932, 755, 936, 945, 963, 782, 969, + /* 220 */ 974, 816, 977, 64, 982, 983, 1016, 1022, 1024, 1031, + /* 230 */ 870, 831, 913, 966, 973, 981, 984, 755, 913, 913, + /* 240 */ 1000, 1041, 1063, 1015, 1010, 1011, 985, 1034, 1057, 1019, + /* 250 */ 1086, 1080, 1085, 1093, 1095, 1096, 1067, 1048, 1082, 1099, + /* 260 */ 1137, 1050, 1150, 1156, 1077, 1088, 1180, 1120, 1132, 1169, + /* 270 */ 1170, 1178, 1181, 1195, 1210, 1225, 1243, 1197, 1209, 1173, + /* 280 */ 1190, 1226, 1238, 1223, 1267, 1272, 1199, 1207, 1282, 1285, + /* 290 */ 1269, 1293, 1295, 1296, 1300, 1289, 1294, 1297, 1299, 1287, + /* 300 */ 1301, 1302, 1303, 1306, 1304, 1307, 1308, 1310, 1242, 1245, + /* 310 */ 1311, 1268, 1270, 1273, 1278, 1274, 1279, 1280, 1284, 1333, + /* 320 */ 1271, 1337, 1281, 1309, 1305, 1312, 1314, 1316, 1344, 1347, + /* 330 */ 1359, 1361, 1368, 1370, 1371, 1291, 1313, 1317, 1355, 1352, + /* 340 */ 1353, 1354, 1356, 1363, 1350, 1357, 1362, 1366, 1367, 1375, + /* 350 */ 1365, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 647, 964, 964, 964, 878, 878, 969, 964, 774, 802, - /* 10 */ 802, 938, 969, 969, 969, 876, 969, 969, 969, 964, - /* 20 */ 969, 778, 808, 969, 969, 969, 969, 969, 969, 969, - /* 30 */ 969, 937, 939, 816, 815, 918, 789, 813, 806, 810, - /* 40 */ 879, 872, 873, 871, 875, 880, 969, 809, 841, 856, - /* 50 */ 840, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 60 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 70 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 80 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 90 */ 969, 969, 969, 969, 850, 855, 862, 854, 851, 843, - /* 100 */ 842, 844, 845, 969, 969, 673, 739, 969, 969, 846, - /* 110 */ 969, 685, 847, 859, 858, 857, 680, 969, 969, 969, - /* 120 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 130 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 140 */ 969, 969, 969, 969, 647, 964, 969, 969, 964, 964, - /* 150 */ 964, 964, 964, 964, 956, 778, 768, 969, 969, 969, - /* 160 */ 969, 969, 969, 969, 969, 969, 969, 944, 942, 969, - /* 170 */ 891, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 180 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 190 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 200 */ 969, 969, 969, 969, 653, 969, 911, 774, 774, 774, - /* 210 */ 776, 754, 766, 655, 812, 791, 791, 923, 812, 923, - /* 220 */ 710, 733, 707, 802, 791, 874, 802, 802, 775, 766, - /* 230 */ 969, 949, 782, 782, 941, 941, 782, 821, 743, 812, - /* 240 */ 750, 750, 750, 750, 782, 670, 812, 821, 743, 743, - /* 250 */ 812, 782, 670, 917, 915, 782, 782, 670, 782, 670, - /* 260 */ 782, 670, 884, 741, 741, 741, 725, 884, 741, 710, - /* 270 */ 741, 725, 741, 741, 795, 790, 795, 790, 795, 790, - /* 280 */ 782, 782, 969, 884, 888, 888, 884, 807, 796, 805, - /* 290 */ 803, 812, 676, 728, 663, 663, 652, 652, 652, 652, - /* 300 */ 961, 961, 956, 712, 712, 695, 969, 969, 969, 969, - /* 310 */ 969, 969, 687, 969, 893, 969, 969, 969, 969, 969, - /* 320 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 330 */ 969, 828, 969, 648, 951, 969, 969, 948, 969, 969, - /* 340 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 350 */ 969, 969, 969, 969, 969, 969, 921, 969, 969, 969, - /* 360 */ 969, 969, 969, 914, 913, 969, 969, 969, 969, 969, - /* 370 */ 969, 969, 969, 969, 969, 969, 969, 969, 969, 969, - /* 380 */ 969, 969, 969, 969, 969, 969, 969, 757, 969, 969, - /* 390 */ 969, 761, 969, 969, 969, 969, 969, 969, 804, 969, - /* 400 */ 797, 969, 877, 969, 969, 969, 969, 969, 969, 969, - /* 410 */ 969, 969, 969, 966, 969, 969, 969, 965, 969, 969, - /* 420 */ 969, 969, 969, 830, 969, 829, 833, 969, 661, 969, - /* 430 */ 644, 649, 960, 963, 962, 959, 958, 957, 952, 950, - /* 440 */ 947, 946, 945, 943, 940, 936, 897, 895, 902, 901, - /* 450 */ 900, 899, 898, 896, 894, 892, 818, 817, 814, 811, - /* 460 */ 753, 935, 890, 752, 749, 748, 669, 953, 920, 929, - /* 470 */ 928, 927, 822, 926, 925, 924, 922, 919, 906, 820, - /* 480 */ 819, 744, 882, 881, 672, 910, 909, 908, 912, 916, - /* 490 */ 907, 784, 751, 671, 668, 675, 679, 731, 732, 740, - /* 500 */ 738, 737, 736, 735, 734, 730, 681, 686, 724, 709, - /* 510 */ 708, 717, 716, 722, 721, 720, 719, 718, 715, 714, - /* 520 */ 713, 706, 705, 711, 704, 727, 726, 723, 703, 747, - /* 530 */ 746, 745, 742, 702, 701, 700, 833, 699, 698, 838, - /* 540 */ 837, 866, 826, 755, 759, 758, 762, 763, 771, 770, - /* 550 */ 769, 780, 781, 793, 792, 824, 823, 794, 779, 773, - /* 560 */ 772, 788, 787, 786, 785, 777, 767, 799, 798, 868, - /* 570 */ 783, 867, 865, 934, 933, 932, 931, 930, 870, 967, - /* 580 */ 968, 887, 889, 886, 801, 800, 885, 869, 839, 836, - /* 590 */ 690, 691, 905, 904, 903, 693, 692, 689, 688, 863, - /* 600 */ 860, 852, 864, 861, 853, 849, 848, 834, 832, 831, - /* 610 */ 827, 835, 760, 756, 825, 765, 764, 697, 696, 694, - /* 620 */ 678, 677, 674, 667, 665, 664, 666, 662, 660, 659, - /* 630 */ 658, 657, 656, 684, 683, 682, 654, 651, 650, 646, - /* 640 */ 645, 643, + /* 0 */ 1389, 1389, 1389, 1261, 1046, 1151, 1261, 1261, 1261, 1261, + /* 10 */ 1046, 1181, 1181, 1312, 1077, 1046, 1046, 1046, 1046, 1046, + /* 20 */ 1046, 1260, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 30 */ 1046, 1046, 1046, 1187, 1046, 1046, 1046, 1046, 1262, 1263, + /* 40 */ 1046, 1046, 1046, 1311, 1313, 1197, 1196, 1195, 1194, 1294, + /* 50 */ 1168, 1192, 1185, 1189, 1256, 1257, 1255, 1259, 1262, 1263, + /* 60 */ 1046, 1188, 1226, 1240, 1225, 1046, 1046, 1046, 1046, 1046, + /* 70 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 80 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 90 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 100 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 110 */ 1046, 1234, 1239, 1246, 1238, 1235, 1228, 1227, 1229, 1230, + /* 120 */ 1046, 1067, 1116, 1046, 1046, 1046, 1329, 1328, 1046, 1046, + /* 130 */ 1077, 1231, 1232, 1243, 1242, 1241, 1319, 1345, 1344, 1046, + /* 140 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 150 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 160 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1077, + /* 170 */ 1073, 1073, 1046, 1324, 1151, 1142, 1046, 1046, 1046, 1046, + /* 180 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1316, 1314, 1046, + /* 190 */ 1276, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 200 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 210 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1147, 1046, + /* 220 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1339, + /* 230 */ 1046, 1289, 1130, 1147, 1147, 1147, 1147, 1149, 1131, 1129, + /* 240 */ 1141, 1077, 1053, 1191, 1170, 1170, 1378, 1191, 1191, 1378, + /* 250 */ 1091, 1359, 1088, 1181, 1181, 1181, 1170, 1258, 1148, 1141, + /* 260 */ 1046, 1381, 1156, 1156, 1380, 1380, 1156, 1200, 1206, 1119, + /* 270 */ 1191, 1125, 1125, 1125, 1125, 1156, 1064, 1191, 1191, 1200, + /* 280 */ 1206, 1119, 1119, 1191, 1156, 1064, 1293, 1375, 1156, 1064, + /* 290 */ 1269, 1156, 1064, 1156, 1064, 1269, 1117, 1117, 1117, 1106, + /* 300 */ 1269, 1117, 1091, 1117, 1106, 1117, 1117, 1269, 1273, 1273, + /* 310 */ 1269, 1174, 1169, 1174, 1169, 1174, 1169, 1174, 1169, 1156, + /* 320 */ 1264, 1156, 1046, 1186, 1175, 1184, 1182, 1191, 1070, 1109, + /* 330 */ 1342, 1342, 1338, 1338, 1338, 1386, 1386, 1324, 1354, 1077, + /* 340 */ 1077, 1077, 1077, 1354, 1093, 1093, 1077, 1077, 1077, 1077, + /* 350 */ 1354, 1046, 1046, 1046, 1046, 1046, 1046, 1349, 1046, 1278, + /* 360 */ 1160, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 370 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 380 */ 1046, 1046, 1211, 1046, 1049, 1321, 1046, 1046, 1320, 1046, + /* 390 */ 1046, 1046, 1046, 1046, 1046, 1161, 1046, 1046, 1046, 1046, + /* 400 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 410 */ 1046, 1046, 1046, 1046, 1377, 1046, 1046, 1046, 1046, 1046, + /* 420 */ 1046, 1292, 1291, 1046, 1046, 1158, 1046, 1046, 1046, 1046, + /* 430 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 440 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 450 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 460 */ 1183, 1046, 1176, 1046, 1046, 1046, 1046, 1368, 1046, 1046, + /* 470 */ 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, 1046, + /* 480 */ 1046, 1363, 1133, 1213, 1046, 1212, 1216, 1046, 1058, 1046, }; +/********** End of lemon-generated parsing tables *****************************/ -/* The next table maps tokens into fallback tokens. If a construct -** like the following: +/* The next table maps tokens (terminal symbols) into fallback tokens. +** If a construct like the following: ** ** %fallback ID X Y Z. ** @@ -122404,79 +142229,97 @@ static const YYACTIONTYPE yy_default[] = { ** and Z. Whenever one of the tokens X, Y, or Z is input to the parser ** but it does not parse, the type of the token is changed to ID and ** the parse is retried before an error is thrown. +** +** This feature can be used, for example, to cause some keywords in a language +** to revert to identifiers if they keyword does not apply in the context where +** it appears. */ #ifdef YYFALLBACK static const YYCODETYPE yyFallback[] = { 0, /* $ => nothing */ 0, /* SEMI => nothing */ - 27, /* EXPLAIN => ID */ - 27, /* QUERY => ID */ - 27, /* PLAN => ID */ - 27, /* BEGIN => ID */ + 59, /* EXPLAIN => ID */ + 59, /* QUERY => ID */ + 59, /* PLAN => ID */ + 59, /* BEGIN => ID */ 0, /* TRANSACTION => nothing */ - 27, /* DEFERRED => ID */ - 27, /* IMMEDIATE => ID */ - 27, /* EXCLUSIVE => ID */ + 59, /* DEFERRED => ID */ + 59, /* IMMEDIATE => ID */ + 59, /* EXCLUSIVE => ID */ 0, /* COMMIT => nothing */ - 27, /* END => ID */ - 27, /* ROLLBACK => ID */ - 27, /* SAVEPOINT => ID */ - 27, /* RELEASE => ID */ + 59, /* END => ID */ + 59, /* ROLLBACK => ID */ + 59, /* SAVEPOINT => ID */ + 59, /* RELEASE => ID */ 0, /* TO => nothing */ 0, /* TABLE => nothing */ 0, /* CREATE => nothing */ - 27, /* IF => ID */ + 59, /* IF => ID */ 0, /* NOT => nothing */ 0, /* EXISTS => nothing */ - 27, /* TEMP => ID */ + 59, /* TEMP => ID */ 0, /* LP => nothing */ 0, /* RP => nothing */ 0, /* AS => nothing */ - 27, /* WITHOUT => ID */ + 59, /* WITHOUT => ID */ 0, /* COMMA => nothing */ + 59, /* ABORT => ID */ + 59, /* ACTION => ID */ + 59, /* AFTER => ID */ + 59, /* ANALYZE => ID */ + 59, /* ASC => ID */ + 59, /* ATTACH => ID */ + 59, /* BEFORE => ID */ + 59, /* BY => ID */ + 59, /* CASCADE => ID */ + 59, /* CAST => ID */ + 59, /* CONFLICT => ID */ + 59, /* DATABASE => ID */ + 59, /* DESC => ID */ + 59, /* DETACH => ID */ + 59, /* EACH => ID */ + 59, /* FAIL => ID */ + 0, /* OR => nothing */ + 0, /* AND => nothing */ + 0, /* IS => nothing */ + 59, /* MATCH => ID */ + 59, /* LIKE_KW => ID */ + 0, /* BETWEEN => nothing */ + 0, /* IN => nothing */ + 0, /* ISNULL => nothing */ + 0, /* NOTNULL => nothing */ + 0, /* NE => nothing */ + 0, /* EQ => nothing */ + 0, /* GT => nothing */ + 0, /* LE => nothing */ + 0, /* LT => nothing */ + 0, /* GE => nothing */ + 0, /* ESCAPE => nothing */ 0, /* ID => nothing */ - 0, /* INDEXED => nothing */ - 27, /* ABORT => ID */ - 27, /* ACTION => ID */ - 27, /* AFTER => ID */ - 27, /* ANALYZE => ID */ - 27, /* ASC => ID */ - 27, /* ATTACH => ID */ - 27, /* BEFORE => ID */ - 27, /* BY => ID */ - 27, /* CASCADE => ID */ - 27, /* CAST => ID */ - 27, /* COLUMNKW => ID */ - 27, /* CONFLICT => ID */ - 27, /* DATABASE => ID */ - 27, /* DESC => ID */ - 27, /* DETACH => ID */ - 27, /* EACH => ID */ - 27, /* FAIL => ID */ - 27, /* FOR => ID */ - 27, /* IGNORE => ID */ - 27, /* INITIALLY => ID */ - 27, /* INSTEAD => ID */ - 27, /* LIKE_KW => ID */ - 27, /* MATCH => ID */ - 27, /* NO => ID */ - 27, /* KEY => ID */ - 27, /* OF => ID */ - 27, /* OFFSET => ID */ - 27, /* PRAGMA => ID */ - 27, /* RAISE => ID */ - 27, /* RECURSIVE => ID */ - 27, /* REPLACE => ID */ - 27, /* RESTRICT => ID */ - 27, /* ROW => ID */ - 27, /* TRIGGER => ID */ - 27, /* VACUUM => ID */ - 27, /* VIEW => ID */ - 27, /* VIRTUAL => ID */ - 27, /* WITH => ID */ - 27, /* REINDEX => ID */ - 27, /* RENAME => ID */ - 27, /* CTIME_KW => ID */ + 59, /* COLUMNKW => ID */ + 59, /* DO => ID */ + 59, /* FOR => ID */ + 59, /* IGNORE => ID */ + 59, /* INITIALLY => ID */ + 59, /* INSTEAD => ID */ + 59, /* NO => ID */ + 59, /* KEY => ID */ + 59, /* OF => ID */ + 59, /* OFFSET => ID */ + 59, /* PRAGMA => ID */ + 59, /* RAISE => ID */ + 59, /* RECURSIVE => ID */ + 59, /* REPLACE => ID */ + 59, /* RESTRICT => ID */ + 59, /* ROW => ID */ + 59, /* TRIGGER => ID */ + 59, /* VACUUM => ID */ + 59, /* VIEW => ID */ + 59, /* VIRTUAL => ID */ + 59, /* WITH => ID */ + 59, /* REINDEX => ID */ + 59, /* RENAME => ID */ + 59, /* CTIME_KW => ID */ }; #endif /* YYFALLBACK */ @@ -122491,9 +142334,13 @@ static const YYCODETYPE yyFallback[] = { ** + The semantic value stored at this level of the stack. This is ** the information used by the action routines in the grammar. ** It is sometimes called the "minor" token. +** +** After the "shift" half of a SHIFTREDUCE action, the stateno field +** actually contains the reduce action for the second half of the +** SHIFTREDUCE. */ struct yyStackEntry { - YYACTIONTYPE stateno; /* The state-number */ + YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ YYCODETYPE major; /* The major token value. This is the code ** number for the token at this stack level */ YYMINORTYPE minor; /* The user-supplied minor token value. This @@ -122504,17 +142351,22 @@ typedef struct yyStackEntry yyStackEntry; /* The state of the parser is completely contained in an instance of ** the following structure */ struct yyParser { - int yyidx; /* Index of top element in stack */ + yyStackEntry *yytos; /* Pointer to top element of the stack */ #ifdef YYTRACKMAXSTACKDEPTH - int yyidxMax; /* Maximum value of yyidx */ + int yyhwm; /* High-water mark of the stack */ #endif +#ifndef YYNOERRORRECOVERY int yyerrcnt; /* Shifts left before out of the error */ +#endif sqlite3ParserARG_SDECL /* A place to hold %extra_argument */ + sqlite3ParserCTX_SDECL /* A place to hold %extra_context */ #if YYSTACKDEPTH<=0 int yystksz; /* Current side of the stack */ yyStackEntry *yystack; /* The parser's stack */ + yyStackEntry yystk0; /* First stack entry */ #else yyStackEntry yystack[YYSTACKDEPTH]; /* The parser's stack */ + yyStackEntry *yystackEnd; /* Last entry in the stack */ #endif }; typedef struct yyParser yyParser; @@ -122551,435 +142403,688 @@ SQLITE_PRIVATE void sqlite3ParserTrace(FILE *TraceFILE, char *zTracePrompt){ } #endif /* NDEBUG */ -#ifndef NDEBUG +#if defined(YYCOVERAGE) || !defined(NDEBUG) /* For tracing shifts, the names of all terminals and nonterminals ** are required. The following table supplies these names */ static const char *const yyTokenName[] = { - "$", "SEMI", "EXPLAIN", "QUERY", - "PLAN", "BEGIN", "TRANSACTION", "DEFERRED", - "IMMEDIATE", "EXCLUSIVE", "COMMIT", "END", - "ROLLBACK", "SAVEPOINT", "RELEASE", "TO", - "TABLE", "CREATE", "IF", "NOT", - "EXISTS", "TEMP", "LP", "RP", - "AS", "WITHOUT", "COMMA", "ID", - "INDEXED", "ABORT", "ACTION", "AFTER", - "ANALYZE", "ASC", "ATTACH", "BEFORE", - "BY", "CASCADE", "CAST", "COLUMNKW", - "CONFLICT", "DATABASE", "DESC", "DETACH", - "EACH", "FAIL", "FOR", "IGNORE", - "INITIALLY", "INSTEAD", "LIKE_KW", "MATCH", - "NO", "KEY", "OF", "OFFSET", - "PRAGMA", "RAISE", "RECURSIVE", "REPLACE", - "RESTRICT", "ROW", "TRIGGER", "VACUUM", - "VIEW", "VIRTUAL", "WITH", "REINDEX", - "RENAME", "CTIME_KW", "ANY", "OR", - "AND", "IS", "BETWEEN", "IN", - "ISNULL", "NOTNULL", "NE", "EQ", - "GT", "LE", "LT", "GE", - "ESCAPE", "BITAND", "BITOR", "LSHIFT", - "RSHIFT", "PLUS", "MINUS", "STAR", - "SLASH", "REM", "CONCAT", "COLLATE", - "BITNOT", "STRING", "JOIN_KW", "CONSTRAINT", - "DEFAULT", "NULL", "PRIMARY", "UNIQUE", - "CHECK", "REFERENCES", "AUTOINCR", "ON", - "INSERT", "DELETE", "UPDATE", "SET", - "DEFERRABLE", "FOREIGN", "DROP", "UNION", - "ALL", "EXCEPT", "INTERSECT", "SELECT", - "VALUES", "DISTINCT", "DOT", "FROM", - "JOIN", "USING", "ORDER", "GROUP", - "HAVING", "LIMIT", "WHERE", "INTO", - "INTEGER", "FLOAT", "BLOB", "VARIABLE", - "CASE", "WHEN", "THEN", "ELSE", - "INDEX", "ALTER", "ADD", "error", - "input", "cmdlist", "ecmd", "explain", - "cmdx", "cmd", "transtype", "trans_opt", - "nm", "savepoint_opt", "create_table", "create_table_args", - "createkw", "temp", "ifnotexists", "dbnm", - "columnlist", "conslist_opt", "table_options", "select", - "column", "columnid", "type", "carglist", - "typetoken", "typename", "signed", "plus_num", - "minus_num", "ccons", "term", "expr", - "onconf", "sortorder", "autoinc", "idxlist_opt", - "refargs", "defer_subclause", "refarg", "refact", - "init_deferred_pred_opt", "conslist", "tconscomma", "tcons", - "idxlist", "defer_subclause_opt", "orconf", "resolvetype", - "raisetype", "ifexists", "fullname", "selectnowith", - "oneselect", "with", "multiselect_op", "distinct", - "selcollist", "from", "where_opt", "groupby_opt", - "having_opt", "orderby_opt", "limit_opt", "values", - "nexprlist", "exprlist", "sclp", "as", - "seltablist", "stl_prefix", "joinop", "indexed_opt", - "on_opt", "using_opt", "joinop2", "idlist", - "sortlist", "setlist", "insert_cmd", "inscollist_opt", - "likeop", "between_op", "in_op", "case_operand", - "case_exprlist", "case_else", "uniqueflag", "collate", - "nmnum", "trigger_decl", "trigger_cmd_list", "trigger_time", - "trigger_event", "foreach_clause", "when_clause", "trigger_cmd", - "trnm", "tridxby", "database_kw_opt", "key_opt", - "add_column_fullname", "kwcolumn_opt", "create_vtab", "vtabarglist", - "vtabarg", "vtabargtoken", "lp", "anylist", - "wqlist", + /* 0 */ "$", + /* 1 */ "SEMI", + /* 2 */ "EXPLAIN", + /* 3 */ "QUERY", + /* 4 */ "PLAN", + /* 5 */ "BEGIN", + /* 6 */ "TRANSACTION", + /* 7 */ "DEFERRED", + /* 8 */ "IMMEDIATE", + /* 9 */ "EXCLUSIVE", + /* 10 */ "COMMIT", + /* 11 */ "END", + /* 12 */ "ROLLBACK", + /* 13 */ "SAVEPOINT", + /* 14 */ "RELEASE", + /* 15 */ "TO", + /* 16 */ "TABLE", + /* 17 */ "CREATE", + /* 18 */ "IF", + /* 19 */ "NOT", + /* 20 */ "EXISTS", + /* 21 */ "TEMP", + /* 22 */ "LP", + /* 23 */ "RP", + /* 24 */ "AS", + /* 25 */ "WITHOUT", + /* 26 */ "COMMA", + /* 27 */ "ABORT", + /* 28 */ "ACTION", + /* 29 */ "AFTER", + /* 30 */ "ANALYZE", + /* 31 */ "ASC", + /* 32 */ "ATTACH", + /* 33 */ "BEFORE", + /* 34 */ "BY", + /* 35 */ "CASCADE", + /* 36 */ "CAST", + /* 37 */ "CONFLICT", + /* 38 */ "DATABASE", + /* 39 */ "DESC", + /* 40 */ "DETACH", + /* 41 */ "EACH", + /* 42 */ "FAIL", + /* 43 */ "OR", + /* 44 */ "AND", + /* 45 */ "IS", + /* 46 */ "MATCH", + /* 47 */ "LIKE_KW", + /* 48 */ "BETWEEN", + /* 49 */ "IN", + /* 50 */ "ISNULL", + /* 51 */ "NOTNULL", + /* 52 */ "NE", + /* 53 */ "EQ", + /* 54 */ "GT", + /* 55 */ "LE", + /* 56 */ "LT", + /* 57 */ "GE", + /* 58 */ "ESCAPE", + /* 59 */ "ID", + /* 60 */ "COLUMNKW", + /* 61 */ "DO", + /* 62 */ "FOR", + /* 63 */ "IGNORE", + /* 64 */ "INITIALLY", + /* 65 */ "INSTEAD", + /* 66 */ "NO", + /* 67 */ "KEY", + /* 68 */ "OF", + /* 69 */ "OFFSET", + /* 70 */ "PRAGMA", + /* 71 */ "RAISE", + /* 72 */ "RECURSIVE", + /* 73 */ "REPLACE", + /* 74 */ "RESTRICT", + /* 75 */ "ROW", + /* 76 */ "TRIGGER", + /* 77 */ "VACUUM", + /* 78 */ "VIEW", + /* 79 */ "VIRTUAL", + /* 80 */ "WITH", + /* 81 */ "REINDEX", + /* 82 */ "RENAME", + /* 83 */ "CTIME_KW", + /* 84 */ "ANY", + /* 85 */ "BITAND", + /* 86 */ "BITOR", + /* 87 */ "LSHIFT", + /* 88 */ "RSHIFT", + /* 89 */ "PLUS", + /* 90 */ "MINUS", + /* 91 */ "STAR", + /* 92 */ "SLASH", + /* 93 */ "REM", + /* 94 */ "CONCAT", + /* 95 */ "COLLATE", + /* 96 */ "BITNOT", + /* 97 */ "ON", + /* 98 */ "INDEXED", + /* 99 */ "STRING", + /* 100 */ "JOIN_KW", + /* 101 */ "CONSTRAINT", + /* 102 */ "DEFAULT", + /* 103 */ "NULL", + /* 104 */ "PRIMARY", + /* 105 */ "UNIQUE", + /* 106 */ "CHECK", + /* 107 */ "REFERENCES", + /* 108 */ "AUTOINCR", + /* 109 */ "INSERT", + /* 110 */ "DELETE", + /* 111 */ "UPDATE", + /* 112 */ "SET", + /* 113 */ "DEFERRABLE", + /* 114 */ "FOREIGN", + /* 115 */ "DROP", + /* 116 */ "UNION", + /* 117 */ "ALL", + /* 118 */ "EXCEPT", + /* 119 */ "INTERSECT", + /* 120 */ "SELECT", + /* 121 */ "VALUES", + /* 122 */ "DISTINCT", + /* 123 */ "DOT", + /* 124 */ "FROM", + /* 125 */ "JOIN", + /* 126 */ "USING", + /* 127 */ "ORDER", + /* 128 */ "GROUP", + /* 129 */ "HAVING", + /* 130 */ "LIMIT", + /* 131 */ "WHERE", + /* 132 */ "INTO", + /* 133 */ "NOTHING", + /* 134 */ "FLOAT", + /* 135 */ "BLOB", + /* 136 */ "INTEGER", + /* 137 */ "VARIABLE", + /* 138 */ "CASE", + /* 139 */ "WHEN", + /* 140 */ "THEN", + /* 141 */ "ELSE", + /* 142 */ "INDEX", + /* 143 */ "ALTER", + /* 144 */ "ADD", + /* 145 */ "input", + /* 146 */ "cmdlist", + /* 147 */ "ecmd", + /* 148 */ "cmdx", + /* 149 */ "explain", + /* 150 */ "cmd", + /* 151 */ "transtype", + /* 152 */ "trans_opt", + /* 153 */ "nm", + /* 154 */ "savepoint_opt", + /* 155 */ "create_table", + /* 156 */ "create_table_args", + /* 157 */ "createkw", + /* 158 */ "temp", + /* 159 */ "ifnotexists", + /* 160 */ "dbnm", + /* 161 */ "columnlist", + /* 162 */ "conslist_opt", + /* 163 */ "table_options", + /* 164 */ "select", + /* 165 */ "columnname", + /* 166 */ "carglist", + /* 167 */ "typetoken", + /* 168 */ "typename", + /* 169 */ "signed", + /* 170 */ "plus_num", + /* 171 */ "minus_num", + /* 172 */ "scanpt", + /* 173 */ "ccons", + /* 174 */ "term", + /* 175 */ "expr", + /* 176 */ "onconf", + /* 177 */ "sortorder", + /* 178 */ "autoinc", + /* 179 */ "eidlist_opt", + /* 180 */ "refargs", + /* 181 */ "defer_subclause", + /* 182 */ "refarg", + /* 183 */ "refact", + /* 184 */ "init_deferred_pred_opt", + /* 185 */ "conslist", + /* 186 */ "tconscomma", + /* 187 */ "tcons", + /* 188 */ "sortlist", + /* 189 */ "eidlist", + /* 190 */ "defer_subclause_opt", + /* 191 */ "orconf", + /* 192 */ "resolvetype", + /* 193 */ "raisetype", + /* 194 */ "ifexists", + /* 195 */ "fullname", + /* 196 */ "selectnowith", + /* 197 */ "oneselect", + /* 198 */ "wqlist", + /* 199 */ "multiselect_op", + /* 200 */ "distinct", + /* 201 */ "selcollist", + /* 202 */ "from", + /* 203 */ "where_opt", + /* 204 */ "groupby_opt", + /* 205 */ "having_opt", + /* 206 */ "orderby_opt", + /* 207 */ "limit_opt", + /* 208 */ "values", + /* 209 */ "nexprlist", + /* 210 */ "exprlist", + /* 211 */ "sclp", + /* 212 */ "as", + /* 213 */ "seltablist", + /* 214 */ "stl_prefix", + /* 215 */ "joinop", + /* 216 */ "indexed_opt", + /* 217 */ "on_opt", + /* 218 */ "using_opt", + /* 219 */ "xfullname", + /* 220 */ "idlist", + /* 221 */ "with", + /* 222 */ "setlist", + /* 223 */ "insert_cmd", + /* 224 */ "idlist_opt", + /* 225 */ "upsert", + /* 226 */ "likeop", + /* 227 */ "between_op", + /* 228 */ "in_op", + /* 229 */ "paren_exprlist", + /* 230 */ "case_operand", + /* 231 */ "case_exprlist", + /* 232 */ "case_else", + /* 233 */ "uniqueflag", + /* 234 */ "collate", + /* 235 */ "nmnum", + /* 236 */ "trigger_decl", + /* 237 */ "trigger_cmd_list", + /* 238 */ "trigger_time", + /* 239 */ "trigger_event", + /* 240 */ "foreach_clause", + /* 241 */ "when_clause", + /* 242 */ "trigger_cmd", + /* 243 */ "trnm", + /* 244 */ "tridxby", + /* 245 */ "database_kw_opt", + /* 246 */ "key_opt", + /* 247 */ "add_column_fullname", + /* 248 */ "kwcolumn_opt", + /* 249 */ "create_vtab", + /* 250 */ "vtabarglist", + /* 251 */ "vtabarg", + /* 252 */ "vtabargtoken", + /* 253 */ "lp", + /* 254 */ "anylist", }; -#endif /* NDEBUG */ +#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */ #ifndef NDEBUG /* For tracing reduce actions, the names of all rules are required. */ static const char *const yyRuleName[] = { - /* 0 */ "input ::= cmdlist", - /* 1 */ "cmdlist ::= cmdlist ecmd", - /* 2 */ "cmdlist ::= ecmd", - /* 3 */ "ecmd ::= SEMI", - /* 4 */ "ecmd ::= explain cmdx SEMI", - /* 5 */ "explain ::=", - /* 6 */ "explain ::= EXPLAIN", - /* 7 */ "explain ::= EXPLAIN QUERY PLAN", - /* 8 */ "cmdx ::= cmd", - /* 9 */ "cmd ::= BEGIN transtype trans_opt", - /* 10 */ "trans_opt ::=", - /* 11 */ "trans_opt ::= TRANSACTION", - /* 12 */ "trans_opt ::= TRANSACTION nm", - /* 13 */ "transtype ::=", - /* 14 */ "transtype ::= DEFERRED", - /* 15 */ "transtype ::= IMMEDIATE", - /* 16 */ "transtype ::= EXCLUSIVE", - /* 17 */ "cmd ::= COMMIT trans_opt", - /* 18 */ "cmd ::= END trans_opt", - /* 19 */ "cmd ::= ROLLBACK trans_opt", - /* 20 */ "savepoint_opt ::= SAVEPOINT", - /* 21 */ "savepoint_opt ::=", - /* 22 */ "cmd ::= SAVEPOINT nm", - /* 23 */ "cmd ::= RELEASE savepoint_opt nm", - /* 24 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm", - /* 25 */ "cmd ::= create_table create_table_args", - /* 26 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm", - /* 27 */ "createkw ::= CREATE", - /* 28 */ "ifnotexists ::=", - /* 29 */ "ifnotexists ::= IF NOT EXISTS", - /* 30 */ "temp ::= TEMP", - /* 31 */ "temp ::=", - /* 32 */ "create_table_args ::= LP columnlist conslist_opt RP table_options", - /* 33 */ "create_table_args ::= AS select", - /* 34 */ "table_options ::=", - /* 35 */ "table_options ::= WITHOUT nm", - /* 36 */ "columnlist ::= columnlist COMMA column", - /* 37 */ "columnlist ::= column", - /* 38 */ "column ::= columnid type carglist", - /* 39 */ "columnid ::= nm", - /* 40 */ "nm ::= ID|INDEXED", - /* 41 */ "nm ::= STRING", - /* 42 */ "nm ::= JOIN_KW", - /* 43 */ "type ::=", - /* 44 */ "type ::= typetoken", - /* 45 */ "typetoken ::= typename", - /* 46 */ "typetoken ::= typename LP signed RP", - /* 47 */ "typetoken ::= typename LP signed COMMA signed RP", - /* 48 */ "typename ::= ID|STRING", - /* 49 */ "typename ::= typename ID|STRING", - /* 50 */ "signed ::= plus_num", - /* 51 */ "signed ::= minus_num", - /* 52 */ "carglist ::= carglist ccons", - /* 53 */ "carglist ::=", - /* 54 */ "ccons ::= CONSTRAINT nm", - /* 55 */ "ccons ::= DEFAULT term", - /* 56 */ "ccons ::= DEFAULT LP expr RP", - /* 57 */ "ccons ::= DEFAULT PLUS term", - /* 58 */ "ccons ::= DEFAULT MINUS term", - /* 59 */ "ccons ::= DEFAULT ID|INDEXED", - /* 60 */ "ccons ::= NULL onconf", - /* 61 */ "ccons ::= NOT NULL onconf", - /* 62 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", - /* 63 */ "ccons ::= UNIQUE onconf", - /* 64 */ "ccons ::= CHECK LP expr RP", - /* 65 */ "ccons ::= REFERENCES nm idxlist_opt refargs", - /* 66 */ "ccons ::= defer_subclause", - /* 67 */ "ccons ::= COLLATE ID|STRING", - /* 68 */ "autoinc ::=", - /* 69 */ "autoinc ::= AUTOINCR", - /* 70 */ "refargs ::=", - /* 71 */ "refargs ::= refargs refarg", - /* 72 */ "refarg ::= MATCH nm", - /* 73 */ "refarg ::= ON INSERT refact", - /* 74 */ "refarg ::= ON DELETE refact", - /* 75 */ "refarg ::= ON UPDATE refact", - /* 76 */ "refact ::= SET NULL", - /* 77 */ "refact ::= SET DEFAULT", - /* 78 */ "refact ::= CASCADE", - /* 79 */ "refact ::= RESTRICT", - /* 80 */ "refact ::= NO ACTION", - /* 81 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", - /* 82 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", - /* 83 */ "init_deferred_pred_opt ::=", - /* 84 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", - /* 85 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", - /* 86 */ "conslist_opt ::=", - /* 87 */ "conslist_opt ::= COMMA conslist", - /* 88 */ "conslist ::= conslist tconscomma tcons", - /* 89 */ "conslist ::= tcons", - /* 90 */ "tconscomma ::= COMMA", - /* 91 */ "tconscomma ::=", - /* 92 */ "tcons ::= CONSTRAINT nm", - /* 93 */ "tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf", - /* 94 */ "tcons ::= UNIQUE LP idxlist RP onconf", - /* 95 */ "tcons ::= CHECK LP expr RP onconf", - /* 96 */ "tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt", - /* 97 */ "defer_subclause_opt ::=", - /* 98 */ "defer_subclause_opt ::= defer_subclause", - /* 99 */ "onconf ::=", - /* 100 */ "onconf ::= ON CONFLICT resolvetype", - /* 101 */ "orconf ::=", - /* 102 */ "orconf ::= OR resolvetype", - /* 103 */ "resolvetype ::= raisetype", - /* 104 */ "resolvetype ::= IGNORE", - /* 105 */ "resolvetype ::= REPLACE", - /* 106 */ "cmd ::= DROP TABLE ifexists fullname", - /* 107 */ "ifexists ::= IF EXISTS", - /* 108 */ "ifexists ::=", - /* 109 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select", - /* 110 */ "cmd ::= DROP VIEW ifexists fullname", - /* 111 */ "cmd ::= select", - /* 112 */ "select ::= with selectnowith", - /* 113 */ "selectnowith ::= oneselect", - /* 114 */ "selectnowith ::= selectnowith multiselect_op oneselect", - /* 115 */ "multiselect_op ::= UNION", - /* 116 */ "multiselect_op ::= UNION ALL", - /* 117 */ "multiselect_op ::= EXCEPT|INTERSECT", - /* 118 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", - /* 119 */ "oneselect ::= values", - /* 120 */ "values ::= VALUES LP nexprlist RP", - /* 121 */ "values ::= values COMMA LP exprlist RP", - /* 122 */ "distinct ::= DISTINCT", - /* 123 */ "distinct ::= ALL", - /* 124 */ "distinct ::=", - /* 125 */ "sclp ::= selcollist COMMA", - /* 126 */ "sclp ::=", - /* 127 */ "selcollist ::= sclp expr as", - /* 128 */ "selcollist ::= sclp STAR", - /* 129 */ "selcollist ::= sclp nm DOT STAR", - /* 130 */ "as ::= AS nm", - /* 131 */ "as ::= ID|STRING", - /* 132 */ "as ::=", - /* 133 */ "from ::=", - /* 134 */ "from ::= FROM seltablist", - /* 135 */ "stl_prefix ::= seltablist joinop", - /* 136 */ "stl_prefix ::=", - /* 137 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", - /* 138 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", - /* 139 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", - /* 140 */ "dbnm ::=", - /* 141 */ "dbnm ::= DOT nm", - /* 142 */ "fullname ::= nm dbnm", - /* 143 */ "joinop ::= COMMA|JOIN", - /* 144 */ "joinop ::= JOIN_KW JOIN", - /* 145 */ "joinop ::= JOIN_KW nm JOIN", - /* 146 */ "joinop ::= JOIN_KW nm nm JOIN", - /* 147 */ "on_opt ::= ON expr", - /* 148 */ "on_opt ::=", - /* 149 */ "indexed_opt ::=", - /* 150 */ "indexed_opt ::= INDEXED BY nm", - /* 151 */ "indexed_opt ::= NOT INDEXED", - /* 152 */ "using_opt ::= USING LP idlist RP", - /* 153 */ "using_opt ::=", - /* 154 */ "orderby_opt ::=", - /* 155 */ "orderby_opt ::= ORDER BY sortlist", - /* 156 */ "sortlist ::= sortlist COMMA expr sortorder", - /* 157 */ "sortlist ::= expr sortorder", - /* 158 */ "sortorder ::= ASC", - /* 159 */ "sortorder ::= DESC", - /* 160 */ "sortorder ::=", - /* 161 */ "groupby_opt ::=", - /* 162 */ "groupby_opt ::= GROUP BY nexprlist", - /* 163 */ "having_opt ::=", - /* 164 */ "having_opt ::= HAVING expr", - /* 165 */ "limit_opt ::=", - /* 166 */ "limit_opt ::= LIMIT expr", - /* 167 */ "limit_opt ::= LIMIT expr OFFSET expr", - /* 168 */ "limit_opt ::= LIMIT expr COMMA expr", - /* 169 */ "cmd ::= with DELETE FROM fullname indexed_opt where_opt", - /* 170 */ "where_opt ::=", - /* 171 */ "where_opt ::= WHERE expr", - /* 172 */ "cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt", - /* 173 */ "setlist ::= setlist COMMA nm EQ expr", - /* 174 */ "setlist ::= nm EQ expr", - /* 175 */ "cmd ::= with insert_cmd INTO fullname inscollist_opt select", - /* 176 */ "cmd ::= with insert_cmd INTO fullname inscollist_opt DEFAULT VALUES", - /* 177 */ "insert_cmd ::= INSERT orconf", - /* 178 */ "insert_cmd ::= REPLACE", - /* 179 */ "inscollist_opt ::=", - /* 180 */ "inscollist_opt ::= LP idlist RP", - /* 181 */ "idlist ::= idlist COMMA nm", - /* 182 */ "idlist ::= nm", - /* 183 */ "expr ::= term", - /* 184 */ "expr ::= LP expr RP", - /* 185 */ "term ::= NULL", - /* 186 */ "expr ::= ID|INDEXED", - /* 187 */ "expr ::= JOIN_KW", - /* 188 */ "expr ::= nm DOT nm", - /* 189 */ "expr ::= nm DOT nm DOT nm", - /* 190 */ "term ::= INTEGER|FLOAT|BLOB", - /* 191 */ "term ::= STRING", - /* 192 */ "expr ::= VARIABLE", - /* 193 */ "expr ::= expr COLLATE ID|STRING", - /* 194 */ "expr ::= CAST LP expr AS typetoken RP", - /* 195 */ "expr ::= ID|INDEXED LP distinct exprlist RP", - /* 196 */ "expr ::= ID|INDEXED LP STAR RP", - /* 197 */ "term ::= CTIME_KW", - /* 198 */ "expr ::= expr AND expr", - /* 199 */ "expr ::= expr OR expr", - /* 200 */ "expr ::= expr LT|GT|GE|LE expr", - /* 201 */ "expr ::= expr EQ|NE expr", - /* 202 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", - /* 203 */ "expr ::= expr PLUS|MINUS expr", - /* 204 */ "expr ::= expr STAR|SLASH|REM expr", - /* 205 */ "expr ::= expr CONCAT expr", - /* 206 */ "likeop ::= LIKE_KW|MATCH", - /* 207 */ "likeop ::= NOT LIKE_KW|MATCH", - /* 208 */ "expr ::= expr likeop expr", - /* 209 */ "expr ::= expr likeop expr ESCAPE expr", - /* 210 */ "expr ::= expr ISNULL|NOTNULL", - /* 211 */ "expr ::= expr NOT NULL", - /* 212 */ "expr ::= expr IS expr", - /* 213 */ "expr ::= expr IS NOT expr", - /* 214 */ "expr ::= NOT expr", - /* 215 */ "expr ::= BITNOT expr", - /* 216 */ "expr ::= MINUS expr", - /* 217 */ "expr ::= PLUS expr", - /* 218 */ "between_op ::= BETWEEN", - /* 219 */ "between_op ::= NOT BETWEEN", - /* 220 */ "expr ::= expr between_op expr AND expr", - /* 221 */ "in_op ::= IN", - /* 222 */ "in_op ::= NOT IN", - /* 223 */ "expr ::= expr in_op LP exprlist RP", - /* 224 */ "expr ::= LP select RP", - /* 225 */ "expr ::= expr in_op LP select RP", - /* 226 */ "expr ::= expr in_op nm dbnm", - /* 227 */ "expr ::= EXISTS LP select RP", - /* 228 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 229 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 230 */ "case_exprlist ::= WHEN expr THEN expr", - /* 231 */ "case_else ::= ELSE expr", - /* 232 */ "case_else ::=", - /* 233 */ "case_operand ::= expr", - /* 234 */ "case_operand ::=", - /* 235 */ "exprlist ::= nexprlist", - /* 236 */ "exprlist ::=", - /* 237 */ "nexprlist ::= nexprlist COMMA expr", - /* 238 */ "nexprlist ::= expr", - /* 239 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt", - /* 240 */ "uniqueflag ::= UNIQUE", - /* 241 */ "uniqueflag ::=", - /* 242 */ "idxlist_opt ::=", - /* 243 */ "idxlist_opt ::= LP idxlist RP", - /* 244 */ "idxlist ::= idxlist COMMA nm collate sortorder", - /* 245 */ "idxlist ::= nm collate sortorder", - /* 246 */ "collate ::=", - /* 247 */ "collate ::= COLLATE ID|STRING", - /* 248 */ "cmd ::= DROP INDEX ifexists fullname", - /* 249 */ "cmd ::= VACUUM", - /* 250 */ "cmd ::= VACUUM nm", - /* 251 */ "cmd ::= PRAGMA nm dbnm", - /* 252 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 253 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 254 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 255 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 256 */ "nmnum ::= plus_num", - /* 257 */ "nmnum ::= nm", - /* 258 */ "nmnum ::= ON", - /* 259 */ "nmnum ::= DELETE", - /* 260 */ "nmnum ::= DEFAULT", - /* 261 */ "plus_num ::= PLUS INTEGER|FLOAT", - /* 262 */ "plus_num ::= INTEGER|FLOAT", - /* 263 */ "minus_num ::= MINUS INTEGER|FLOAT", - /* 264 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 265 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 266 */ "trigger_time ::= BEFORE", - /* 267 */ "trigger_time ::= AFTER", - /* 268 */ "trigger_time ::= INSTEAD OF", - /* 269 */ "trigger_time ::=", - /* 270 */ "trigger_event ::= DELETE|INSERT", - /* 271 */ "trigger_event ::= UPDATE", - /* 272 */ "trigger_event ::= UPDATE OF idlist", - /* 273 */ "foreach_clause ::=", - /* 274 */ "foreach_clause ::= FOR EACH ROW", - /* 275 */ "when_clause ::=", - /* 276 */ "when_clause ::= WHEN expr", - /* 277 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 278 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 279 */ "trnm ::= nm", - /* 280 */ "trnm ::= nm DOT nm", - /* 281 */ "tridxby ::=", - /* 282 */ "tridxby ::= INDEXED BY nm", - /* 283 */ "tridxby ::= NOT INDEXED", - /* 284 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt", - /* 285 */ "trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select", - /* 286 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt", - /* 287 */ "trigger_cmd ::= select", - /* 288 */ "expr ::= RAISE LP IGNORE RP", - /* 289 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 290 */ "raisetype ::= ROLLBACK", - /* 291 */ "raisetype ::= ABORT", - /* 292 */ "raisetype ::= FAIL", - /* 293 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 294 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 295 */ "cmd ::= DETACH database_kw_opt expr", - /* 296 */ "key_opt ::=", - /* 297 */ "key_opt ::= KEY expr", - /* 298 */ "database_kw_opt ::= DATABASE", - /* 299 */ "database_kw_opt ::=", - /* 300 */ "cmd ::= REINDEX", - /* 301 */ "cmd ::= REINDEX nm dbnm", - /* 302 */ "cmd ::= ANALYZE", - /* 303 */ "cmd ::= ANALYZE nm dbnm", - /* 304 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 305 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column", - /* 306 */ "add_column_fullname ::= fullname", - /* 307 */ "kwcolumn_opt ::=", - /* 308 */ "kwcolumn_opt ::= COLUMNKW", - /* 309 */ "cmd ::= create_vtab", - /* 310 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 311 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 312 */ "vtabarglist ::= vtabarg", - /* 313 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 314 */ "vtabarg ::=", - /* 315 */ "vtabarg ::= vtabarg vtabargtoken", - /* 316 */ "vtabargtoken ::= ANY", - /* 317 */ "vtabargtoken ::= lp anylist RP", - /* 318 */ "lp ::= LP", - /* 319 */ "anylist ::=", - /* 320 */ "anylist ::= anylist LP anylist RP", - /* 321 */ "anylist ::= anylist ANY", - /* 322 */ "with ::=", - /* 323 */ "with ::= WITH wqlist", - /* 324 */ "with ::= WITH RECURSIVE wqlist", - /* 325 */ "wqlist ::= nm idxlist_opt AS LP select RP", - /* 326 */ "wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP", + /* 0 */ "explain ::= EXPLAIN", + /* 1 */ "explain ::= EXPLAIN QUERY PLAN", + /* 2 */ "cmdx ::= cmd", + /* 3 */ "cmd ::= BEGIN transtype trans_opt", + /* 4 */ "transtype ::=", + /* 5 */ "transtype ::= DEFERRED", + /* 6 */ "transtype ::= IMMEDIATE", + /* 7 */ "transtype ::= EXCLUSIVE", + /* 8 */ "cmd ::= COMMIT|END trans_opt", + /* 9 */ "cmd ::= ROLLBACK trans_opt", + /* 10 */ "cmd ::= SAVEPOINT nm", + /* 11 */ "cmd ::= RELEASE savepoint_opt nm", + /* 12 */ "cmd ::= ROLLBACK trans_opt TO savepoint_opt nm", + /* 13 */ "create_table ::= createkw temp TABLE ifnotexists nm dbnm", + /* 14 */ "createkw ::= CREATE", + /* 15 */ "ifnotexists ::=", + /* 16 */ "ifnotexists ::= IF NOT EXISTS", + /* 17 */ "temp ::= TEMP", + /* 18 */ "temp ::=", + /* 19 */ "create_table_args ::= LP columnlist conslist_opt RP table_options", + /* 20 */ "create_table_args ::= AS select", + /* 21 */ "table_options ::=", + /* 22 */ "table_options ::= WITHOUT nm", + /* 23 */ "columnname ::= nm typetoken", + /* 24 */ "typetoken ::=", + /* 25 */ "typetoken ::= typename LP signed RP", + /* 26 */ "typetoken ::= typename LP signed COMMA signed RP", + /* 27 */ "typename ::= typename ID|STRING", + /* 28 */ "scanpt ::=", + /* 29 */ "ccons ::= CONSTRAINT nm", + /* 30 */ "ccons ::= DEFAULT scanpt term scanpt", + /* 31 */ "ccons ::= DEFAULT LP expr RP", + /* 32 */ "ccons ::= DEFAULT PLUS term scanpt", + /* 33 */ "ccons ::= DEFAULT MINUS term scanpt", + /* 34 */ "ccons ::= DEFAULT scanpt ID|INDEXED", + /* 35 */ "ccons ::= NOT NULL onconf", + /* 36 */ "ccons ::= PRIMARY KEY sortorder onconf autoinc", + /* 37 */ "ccons ::= UNIQUE onconf", + /* 38 */ "ccons ::= CHECK LP expr RP", + /* 39 */ "ccons ::= REFERENCES nm eidlist_opt refargs", + /* 40 */ "ccons ::= defer_subclause", + /* 41 */ "ccons ::= COLLATE ID|STRING", + /* 42 */ "autoinc ::=", + /* 43 */ "autoinc ::= AUTOINCR", + /* 44 */ "refargs ::=", + /* 45 */ "refargs ::= refargs refarg", + /* 46 */ "refarg ::= MATCH nm", + /* 47 */ "refarg ::= ON INSERT refact", + /* 48 */ "refarg ::= ON DELETE refact", + /* 49 */ "refarg ::= ON UPDATE refact", + /* 50 */ "refact ::= SET NULL", + /* 51 */ "refact ::= SET DEFAULT", + /* 52 */ "refact ::= CASCADE", + /* 53 */ "refact ::= RESTRICT", + /* 54 */ "refact ::= NO ACTION", + /* 55 */ "defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt", + /* 56 */ "defer_subclause ::= DEFERRABLE init_deferred_pred_opt", + /* 57 */ "init_deferred_pred_opt ::=", + /* 58 */ "init_deferred_pred_opt ::= INITIALLY DEFERRED", + /* 59 */ "init_deferred_pred_opt ::= INITIALLY IMMEDIATE", + /* 60 */ "conslist_opt ::=", + /* 61 */ "tconscomma ::= COMMA", + /* 62 */ "tcons ::= CONSTRAINT nm", + /* 63 */ "tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf", + /* 64 */ "tcons ::= UNIQUE LP sortlist RP onconf", + /* 65 */ "tcons ::= CHECK LP expr RP onconf", + /* 66 */ "tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt", + /* 67 */ "defer_subclause_opt ::=", + /* 68 */ "onconf ::=", + /* 69 */ "onconf ::= ON CONFLICT resolvetype", + /* 70 */ "orconf ::=", + /* 71 */ "orconf ::= OR resolvetype", + /* 72 */ "resolvetype ::= IGNORE", + /* 73 */ "resolvetype ::= REPLACE", + /* 74 */ "cmd ::= DROP TABLE ifexists fullname", + /* 75 */ "ifexists ::= IF EXISTS", + /* 76 */ "ifexists ::=", + /* 77 */ "cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select", + /* 78 */ "cmd ::= DROP VIEW ifexists fullname", + /* 79 */ "cmd ::= select", + /* 80 */ "select ::= WITH wqlist selectnowith", + /* 81 */ "select ::= WITH RECURSIVE wqlist selectnowith", + /* 82 */ "select ::= selectnowith", + /* 83 */ "selectnowith ::= selectnowith multiselect_op oneselect", + /* 84 */ "multiselect_op ::= UNION", + /* 85 */ "multiselect_op ::= UNION ALL", + /* 86 */ "multiselect_op ::= EXCEPT|INTERSECT", + /* 87 */ "oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt", + /* 88 */ "values ::= VALUES LP nexprlist RP", + /* 89 */ "values ::= values COMMA LP exprlist RP", + /* 90 */ "distinct ::= DISTINCT", + /* 91 */ "distinct ::= ALL", + /* 92 */ "distinct ::=", + /* 93 */ "sclp ::=", + /* 94 */ "selcollist ::= sclp scanpt expr scanpt as", + /* 95 */ "selcollist ::= sclp scanpt STAR", + /* 96 */ "selcollist ::= sclp scanpt nm DOT STAR", + /* 97 */ "as ::= AS nm", + /* 98 */ "as ::=", + /* 99 */ "from ::=", + /* 100 */ "from ::= FROM seltablist", + /* 101 */ "stl_prefix ::= seltablist joinop", + /* 102 */ "stl_prefix ::=", + /* 103 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", + /* 104 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt", + /* 105 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", + /* 106 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", + /* 107 */ "dbnm ::=", + /* 108 */ "dbnm ::= DOT nm", + /* 109 */ "fullname ::= nm", + /* 110 */ "fullname ::= nm DOT nm", + /* 111 */ "xfullname ::= nm", + /* 112 */ "xfullname ::= nm DOT nm", + /* 113 */ "xfullname ::= nm DOT nm AS nm", + /* 114 */ "xfullname ::= nm AS nm", + /* 115 */ "joinop ::= COMMA|JOIN", + /* 116 */ "joinop ::= JOIN_KW JOIN", + /* 117 */ "joinop ::= JOIN_KW nm JOIN", + /* 118 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 119 */ "on_opt ::= ON expr", + /* 120 */ "on_opt ::=", + /* 121 */ "indexed_opt ::=", + /* 122 */ "indexed_opt ::= INDEXED BY nm", + /* 123 */ "indexed_opt ::= NOT INDEXED", + /* 124 */ "using_opt ::= USING LP idlist RP", + /* 125 */ "using_opt ::=", + /* 126 */ "orderby_opt ::=", + /* 127 */ "orderby_opt ::= ORDER BY sortlist", + /* 128 */ "sortlist ::= sortlist COMMA expr sortorder", + /* 129 */ "sortlist ::= expr sortorder", + /* 130 */ "sortorder ::= ASC", + /* 131 */ "sortorder ::= DESC", + /* 132 */ "sortorder ::=", + /* 133 */ "groupby_opt ::=", + /* 134 */ "groupby_opt ::= GROUP BY nexprlist", + /* 135 */ "having_opt ::=", + /* 136 */ "having_opt ::= HAVING expr", + /* 137 */ "limit_opt ::=", + /* 138 */ "limit_opt ::= LIMIT expr", + /* 139 */ "limit_opt ::= LIMIT expr OFFSET expr", + /* 140 */ "limit_opt ::= LIMIT expr COMMA expr", + /* 141 */ "cmd ::= with DELETE FROM xfullname indexed_opt where_opt", + /* 142 */ "where_opt ::=", + /* 143 */ "where_opt ::= WHERE expr", + /* 144 */ "cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt", + /* 145 */ "setlist ::= setlist COMMA nm EQ expr", + /* 146 */ "setlist ::= setlist COMMA LP idlist RP EQ expr", + /* 147 */ "setlist ::= nm EQ expr", + /* 148 */ "setlist ::= LP idlist RP EQ expr", + /* 149 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert", + /* 150 */ "cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES", + /* 151 */ "upsert ::=", + /* 152 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt", + /* 153 */ "upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING", + /* 154 */ "upsert ::= ON CONFLICT DO NOTHING", + /* 155 */ "insert_cmd ::= INSERT orconf", + /* 156 */ "insert_cmd ::= REPLACE", + /* 157 */ "idlist_opt ::=", + /* 158 */ "idlist_opt ::= LP idlist RP", + /* 159 */ "idlist ::= idlist COMMA nm", + /* 160 */ "idlist ::= nm", + /* 161 */ "expr ::= LP expr RP", + /* 162 */ "expr ::= ID|INDEXED", + /* 163 */ "expr ::= JOIN_KW", + /* 164 */ "expr ::= nm DOT nm", + /* 165 */ "expr ::= nm DOT nm DOT nm", + /* 166 */ "term ::= NULL|FLOAT|BLOB", + /* 167 */ "term ::= STRING", + /* 168 */ "term ::= INTEGER", + /* 169 */ "expr ::= VARIABLE", + /* 170 */ "expr ::= expr COLLATE ID|STRING", + /* 171 */ "expr ::= CAST LP expr AS typetoken RP", + /* 172 */ "expr ::= ID|INDEXED LP distinct exprlist RP", + /* 173 */ "expr ::= ID|INDEXED LP STAR RP", + /* 174 */ "term ::= CTIME_KW", + /* 175 */ "expr ::= LP nexprlist COMMA expr RP", + /* 176 */ "expr ::= expr AND expr", + /* 177 */ "expr ::= expr OR expr", + /* 178 */ "expr ::= expr LT|GT|GE|LE expr", + /* 179 */ "expr ::= expr EQ|NE expr", + /* 180 */ "expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr", + /* 181 */ "expr ::= expr PLUS|MINUS expr", + /* 182 */ "expr ::= expr STAR|SLASH|REM expr", + /* 183 */ "expr ::= expr CONCAT expr", + /* 184 */ "likeop ::= NOT LIKE_KW|MATCH", + /* 185 */ "expr ::= expr likeop expr", + /* 186 */ "expr ::= expr likeop expr ESCAPE expr", + /* 187 */ "expr ::= expr ISNULL|NOTNULL", + /* 188 */ "expr ::= expr NOT NULL", + /* 189 */ "expr ::= expr IS expr", + /* 190 */ "expr ::= expr IS NOT expr", + /* 191 */ "expr ::= NOT expr", + /* 192 */ "expr ::= BITNOT expr", + /* 193 */ "expr ::= MINUS expr", + /* 194 */ "expr ::= PLUS expr", + /* 195 */ "between_op ::= BETWEEN", + /* 196 */ "between_op ::= NOT BETWEEN", + /* 197 */ "expr ::= expr between_op expr AND expr", + /* 198 */ "in_op ::= IN", + /* 199 */ "in_op ::= NOT IN", + /* 200 */ "expr ::= expr in_op LP exprlist RP", + /* 201 */ "expr ::= LP select RP", + /* 202 */ "expr ::= expr in_op LP select RP", + /* 203 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 204 */ "expr ::= EXISTS LP select RP", + /* 205 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 206 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 207 */ "case_exprlist ::= WHEN expr THEN expr", + /* 208 */ "case_else ::= ELSE expr", + /* 209 */ "case_else ::=", + /* 210 */ "case_operand ::= expr", + /* 211 */ "case_operand ::=", + /* 212 */ "exprlist ::=", + /* 213 */ "nexprlist ::= nexprlist COMMA expr", + /* 214 */ "nexprlist ::= expr", + /* 215 */ "paren_exprlist ::=", + /* 216 */ "paren_exprlist ::= LP exprlist RP", + /* 217 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 218 */ "uniqueflag ::= UNIQUE", + /* 219 */ "uniqueflag ::=", + /* 220 */ "eidlist_opt ::=", + /* 221 */ "eidlist_opt ::= LP eidlist RP", + /* 222 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 223 */ "eidlist ::= nm collate sortorder", + /* 224 */ "collate ::=", + /* 225 */ "collate ::= COLLATE ID|STRING", + /* 226 */ "cmd ::= DROP INDEX ifexists fullname", + /* 227 */ "cmd ::= VACUUM", + /* 228 */ "cmd ::= VACUUM nm", + /* 229 */ "cmd ::= PRAGMA nm dbnm", + /* 230 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 231 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 232 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 233 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 234 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 235 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 236 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 237 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 238 */ "trigger_time ::= BEFORE|AFTER", + /* 239 */ "trigger_time ::= INSTEAD OF", + /* 240 */ "trigger_time ::=", + /* 241 */ "trigger_event ::= DELETE|INSERT", + /* 242 */ "trigger_event ::= UPDATE", + /* 243 */ "trigger_event ::= UPDATE OF idlist", + /* 244 */ "when_clause ::=", + /* 245 */ "when_clause ::= WHEN expr", + /* 246 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 247 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 248 */ "trnm ::= nm DOT nm", + /* 249 */ "tridxby ::= INDEXED BY nm", + /* 250 */ "tridxby ::= NOT INDEXED", + /* 251 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt", + /* 252 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 253 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 254 */ "trigger_cmd ::= scanpt select scanpt", + /* 255 */ "expr ::= RAISE LP IGNORE RP", + /* 256 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 257 */ "raisetype ::= ROLLBACK", + /* 258 */ "raisetype ::= ABORT", + /* 259 */ "raisetype ::= FAIL", + /* 260 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 261 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 262 */ "cmd ::= DETACH database_kw_opt expr", + /* 263 */ "key_opt ::=", + /* 264 */ "key_opt ::= KEY expr", + /* 265 */ "cmd ::= REINDEX", + /* 266 */ "cmd ::= REINDEX nm dbnm", + /* 267 */ "cmd ::= ANALYZE", + /* 268 */ "cmd ::= ANALYZE nm dbnm", + /* 269 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 270 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 271 */ "add_column_fullname ::= fullname", + /* 272 */ "cmd ::= create_vtab", + /* 273 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 274 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 275 */ "vtabarg ::=", + /* 276 */ "vtabargtoken ::= ANY", + /* 277 */ "vtabargtoken ::= lp anylist RP", + /* 278 */ "lp ::= LP", + /* 279 */ "with ::= WITH wqlist", + /* 280 */ "with ::= WITH RECURSIVE wqlist", + /* 281 */ "wqlist ::= nm eidlist_opt AS LP select RP", + /* 282 */ "wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP", + /* 283 */ "input ::= cmdlist", + /* 284 */ "cmdlist ::= cmdlist ecmd", + /* 285 */ "cmdlist ::= ecmd", + /* 286 */ "ecmd ::= SEMI", + /* 287 */ "ecmd ::= cmdx SEMI", + /* 288 */ "ecmd ::= explain cmdx", + /* 289 */ "trans_opt ::=", + /* 290 */ "trans_opt ::= TRANSACTION", + /* 291 */ "trans_opt ::= TRANSACTION nm", + /* 292 */ "savepoint_opt ::= SAVEPOINT", + /* 293 */ "savepoint_opt ::=", + /* 294 */ "cmd ::= create_table create_table_args", + /* 295 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 296 */ "columnlist ::= columnname carglist", + /* 297 */ "nm ::= ID|INDEXED", + /* 298 */ "nm ::= STRING", + /* 299 */ "nm ::= JOIN_KW", + /* 300 */ "typetoken ::= typename", + /* 301 */ "typename ::= ID|STRING", + /* 302 */ "signed ::= plus_num", + /* 303 */ "signed ::= minus_num", + /* 304 */ "carglist ::= carglist ccons", + /* 305 */ "carglist ::=", + /* 306 */ "ccons ::= NULL onconf", + /* 307 */ "conslist_opt ::= COMMA conslist", + /* 308 */ "conslist ::= conslist tconscomma tcons", + /* 309 */ "conslist ::= tcons", + /* 310 */ "tconscomma ::=", + /* 311 */ "defer_subclause_opt ::= defer_subclause", + /* 312 */ "resolvetype ::= raisetype", + /* 313 */ "selectnowith ::= oneselect", + /* 314 */ "oneselect ::= values", + /* 315 */ "sclp ::= selcollist COMMA", + /* 316 */ "as ::= ID|STRING", + /* 317 */ "expr ::= term", + /* 318 */ "likeop ::= LIKE_KW|MATCH", + /* 319 */ "exprlist ::= nexprlist", + /* 320 */ "nmnum ::= plus_num", + /* 321 */ "nmnum ::= nm", + /* 322 */ "nmnum ::= ON", + /* 323 */ "nmnum ::= DELETE", + /* 324 */ "nmnum ::= DEFAULT", + /* 325 */ "plus_num ::= INTEGER|FLOAT", + /* 326 */ "foreach_clause ::=", + /* 327 */ "foreach_clause ::= FOR EACH ROW", + /* 328 */ "trnm ::= nm", + /* 329 */ "tridxby ::=", + /* 330 */ "database_kw_opt ::= DATABASE", + /* 331 */ "database_kw_opt ::=", + /* 332 */ "kwcolumn_opt ::=", + /* 333 */ "kwcolumn_opt ::= COLUMNKW", + /* 334 */ "vtabarglist ::= vtabarg", + /* 335 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 336 */ "vtabarg ::= vtabarg vtabargtoken", + /* 337 */ "anylist ::=", + /* 338 */ "anylist ::= anylist LP anylist RP", + /* 339 */ "anylist ::= anylist ANY", + /* 340 */ "with ::=", }; #endif /* NDEBUG */ #if YYSTACKDEPTH<=0 /* -** Try to increase the size of the parser stack. +** Try to increase the size of the parser stack. Return the number +** of errors. Return 0 on success. */ -static void yyGrowStack(yyParser *p){ +static int yyGrowStack(yyParser *p){ int newSize; + int idx; yyStackEntry *pNew; newSize = p->yystksz*2 + 100; - pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + idx = p->yytos ? (int)(p->yytos - p->yystack) : 0; + if( p->yystack==&p->yystk0 ){ + pNew = malloc(newSize*sizeof(pNew[0])); + if( pNew ) pNew[0] = p->yystk0; + }else{ + pNew = realloc(p->yystack, newSize*sizeof(pNew[0])); + } if( pNew ){ p->yystack = pNew; - p->yystksz = newSize; + p->yytos = &p->yystack[idx]; #ifndef NDEBUG if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sStack grows to %d entries!\n", - yyTracePrompt, p->yystksz); + fprintf(yyTraceFILE,"%sStack grows from %d to %d entries.\n", + yyTracePrompt, p->yystksz, newSize); } #endif + p->yystksz = newSize; } + return pNew==0; } #endif +/* Datatype of the argument to the memory allocated passed as the +** second argument to sqlite3ParserAlloc() below. This can be changed by +** putting an appropriate #define in the %include section of the input +** grammar. +*/ +#ifndef YYMALLOCARGTYPE +# define YYMALLOCARGTYPE size_t +#endif + +/* Initialize a new parser that has already been allocated. +*/ +SQLITE_PRIVATE void sqlite3ParserInit(void *yypRawParser sqlite3ParserCTX_PDECL){ + yyParser *yypParser = (yyParser*)yypRawParser; + sqlite3ParserCTX_STORE +#ifdef YYTRACKMAXSTACKDEPTH + yypParser->yyhwm = 0; +#endif +#if YYSTACKDEPTH<=0 + yypParser->yytos = NULL; + yypParser->yystack = NULL; + yypParser->yystksz = 0; + if( yyGrowStack(yypParser) ){ + yypParser->yystack = &yypParser->yystk0; + yypParser->yystksz = 1; + } +#endif +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + yypParser->yytos = yypParser->yystack; + yypParser->yystack[0].stateno = 0; + yypParser->yystack[0].major = 0; +#if YYSTACKDEPTH>0 + yypParser->yystackEnd = &yypParser->yystack[YYSTACKDEPTH-1]; +#endif +} + +#ifndef sqlite3Parser_ENGINEALWAYSONSTACK /* ** This function allocates a new parser. ** The only argument is a pointer to a function which works like @@ -122992,34 +143097,32 @@ static void yyGrowStack(yyParser *p){ ** A pointer to a parser. This pointer is used in subsequent calls ** to sqlite3Parser and sqlite3ParserFree. */ -SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(u64)){ - yyParser *pParser; - pParser = (yyParser*)(*mallocProc)( (u64)sizeof(yyParser) ); - if( pParser ){ - pParser->yyidx = -1; -#ifdef YYTRACKMAXSTACKDEPTH - pParser->yyidxMax = 0; -#endif -#if YYSTACKDEPTH<=0 - pParser->yystack = NULL; - pParser->yystksz = 0; - yyGrowStack(pParser); -#endif +SQLITE_PRIVATE void *sqlite3ParserAlloc(void *(*mallocProc)(YYMALLOCARGTYPE) sqlite3ParserCTX_PDECL){ + yyParser *yypParser; + yypParser = (yyParser*)(*mallocProc)( (YYMALLOCARGTYPE)sizeof(yyParser) ); + if( yypParser ){ + sqlite3ParserCTX_STORE + sqlite3ParserInit(yypParser sqlite3ParserCTX_PARAM); } - return pParser; + return (void*)yypParser; } +#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */ -/* The following function deletes the value associated with a -** symbol. The symbol can be either a terminal or nonterminal. -** "yymajor" is the symbol code, and "yypminor" is a pointer to -** the value. + +/* The following function deletes the "minor type" or semantic value +** associated with a symbol. The symbol can be either a terminal +** or nonterminal. "yymajor" is the symbol code, and "yypminor" is +** a pointer to the value to be deleted. The code used to do the +** deletions is derived from the %destructor and/or %token_destructor +** directives of the input grammar. */ static void yy_destructor( yyParser *yypParser, /* The parser */ YYCODETYPE yymajor, /* Type code for object to destroy */ YYMINORTYPE *yypminor /* The object to be destroyed */ ){ - sqlite3ParserARG_FETCH; + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH switch( yymajor ){ /* Here is inserted the actions which take place when a ** terminal or non-terminal is destroyed. This can happen @@ -123028,81 +143131,80 @@ static void yy_destructor( ** being destroyed before it is finished parsing. ** ** Note: during a reduce, the only symbols destroyed are those - ** which appear on the RHS of the rule, but which are not used + ** which appear on the RHS of the rule, but which are *not* used ** inside the C code. */ - case 163: /* select */ - case 195: /* selectnowith */ - case 196: /* oneselect */ - case 207: /* values */ +/********* Begin destructor definitions ***************************************/ + case 164: /* select */ + case 196: /* selectnowith */ + case 197: /* oneselect */ + case 208: /* values */ { -sqlite3SelectDelete(pParse->db, (yypminor->yy3)); +sqlite3SelectDelete(pParse->db, (yypminor->yy399)); } break; case 174: /* term */ case 175: /* expr */ + case 203: /* where_opt */ + case 205: /* having_opt */ + case 217: /* on_opt */ + case 230: /* case_operand */ + case 232: /* case_else */ + case 241: /* when_clause */ + case 246: /* key_opt */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy346).pExpr); +sqlite3ExprDelete(pParse->db, (yypminor->yy182)); } break; - case 179: /* idxlist_opt */ - case 188: /* idxlist */ - case 200: /* selcollist */ - case 203: /* groupby_opt */ - case 205: /* orderby_opt */ - case 208: /* nexprlist */ - case 209: /* exprlist */ - case 210: /* sclp */ - case 220: /* sortlist */ - case 221: /* setlist */ - case 228: /* case_exprlist */ + case 179: /* eidlist_opt */ + case 188: /* sortlist */ + case 189: /* eidlist */ + case 201: /* selcollist */ + case 204: /* groupby_opt */ + case 206: /* orderby_opt */ + case 209: /* nexprlist */ + case 210: /* exprlist */ + case 211: /* sclp */ + case 222: /* setlist */ + case 229: /* paren_exprlist */ + case 231: /* case_exprlist */ { -sqlite3ExprListDelete(pParse->db, (yypminor->yy14)); +sqlite3ExprListDelete(pParse->db, (yypminor->yy232)); } break; - case 194: /* fullname */ - case 201: /* from */ - case 212: /* seltablist */ - case 213: /* stl_prefix */ + case 195: /* fullname */ + case 202: /* from */ + case 213: /* seltablist */ + case 214: /* stl_prefix */ + case 219: /* xfullname */ { -sqlite3SrcListDelete(pParse->db, (yypminor->yy65)); +sqlite3SrcListDelete(pParse->db, (yypminor->yy427)); } break; - case 197: /* with */ - case 252: /* wqlist */ + case 198: /* wqlist */ { -sqlite3WithDelete(pParse->db, (yypminor->yy59)); +sqlite3WithDelete(pParse->db, (yypminor->yy91)); } break; - case 202: /* where_opt */ - case 204: /* having_opt */ - case 216: /* on_opt */ - case 227: /* case_operand */ - case 229: /* case_else */ - case 238: /* when_clause */ - case 243: /* key_opt */ + case 218: /* using_opt */ + case 220: /* idlist */ + case 224: /* idlist_opt */ { -sqlite3ExprDelete(pParse->db, (yypminor->yy132)); +sqlite3IdListDelete(pParse->db, (yypminor->yy510)); } break; - case 217: /* using_opt */ - case 219: /* idlist */ - case 223: /* inscollist_opt */ + case 237: /* trigger_cmd_list */ + case 242: /* trigger_cmd */ { -sqlite3IdListDelete(pParse->db, (yypminor->yy408)); +sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy47)); } break; - case 234: /* trigger_cmd_list */ - case 239: /* trigger_cmd */ + case 239: /* trigger_event */ { -sqlite3DeleteTriggerStep(pParse->db, (yypminor->yy473)); -} - break; - case 236: /* trigger_event */ -{ -sqlite3IdListDelete(pParse->db, (yypminor->yy378).b); +sqlite3IdListDelete(pParse->db, (yypminor->yy300).b); } break; +/********* End destructor definitions *****************************************/ default: break; /* If no destructor action specified: do nothing */ } } @@ -123112,55 +143214,53 @@ sqlite3IdListDelete(pParse->db, (yypminor->yy378).b); ** ** If there is a destructor routine associated with the token which ** is popped from the stack, then call it. -** -** Return the major token number for the symbol popped. */ -static int yy_pop_parser_stack(yyParser *pParser){ - YYCODETYPE yymajor; - yyStackEntry *yytos = &pParser->yystack[pParser->yyidx]; - - /* There is no mechanism by which the parser stack can be popped below - ** empty in SQLite. */ - if( NEVER(pParser->yyidx<0) ) return 0; +static void yy_pop_parser_stack(yyParser *pParser){ + yyStackEntry *yytos; + assert( pParser->yytos!=0 ); + assert( pParser->yytos > pParser->yystack ); + yytos = pParser->yytos--; #ifndef NDEBUG - if( yyTraceFILE && pParser->yyidx>=0 ){ + if( yyTraceFILE ){ fprintf(yyTraceFILE,"%sPopping %s\n", yyTracePrompt, yyTokenName[yytos->major]); } #endif - yymajor = yytos->major; - yy_destructor(pParser, yymajor, &yytos->minor); - pParser->yyidx--; - return yymajor; + yy_destructor(pParser, yytos->major, &yytos->minor); } +/* +** Clear all secondary memory allocations from the parser +*/ +SQLITE_PRIVATE void sqlite3ParserFinalize(void *p){ + yyParser *pParser = (yyParser*)p; + while( pParser->yytos>pParser->yystack ) yy_pop_parser_stack(pParser); +#if YYSTACKDEPTH<=0 + if( pParser->yystack!=&pParser->yystk0 ) free(pParser->yystack); +#endif +} + +#ifndef sqlite3Parser_ENGINEALWAYSONSTACK /* -** Deallocate and destroy a parser. Destructors are all called for +** Deallocate and destroy a parser. Destructors are called for ** all stack elements before shutting the parser down. ** -** Inputs: -** <ul> -** <li> A pointer to the parser. This should be a pointer -** obtained from sqlite3ParserAlloc. -** <li> A pointer to a function used to reclaim memory obtained -** from malloc. -** </ul> +** If the YYPARSEFREENEVERNULL macro exists (for example because it +** is defined in a %include section of the input grammar) then it is +** assumed that the input pointer is never NULL. */ SQLITE_PRIVATE void sqlite3ParserFree( void *p, /* The parser to be deleted */ void (*freeProc)(void*) /* Function used to reclaim memory */ ){ - yyParser *pParser = (yyParser*)p; - /* In SQLite, we never try to destroy a parser that was not successfully - ** created in the first place. */ - if( NEVER(pParser==0) ) return; - while( pParser->yyidx>=0 ) yy_pop_parser_stack(pParser); -#if YYSTACKDEPTH<=0 - free(pParser->yystack); +#ifndef YYPARSEFREENEVERNULL + if( p==0 ) return; #endif - (*freeProc)((void*)pParser); + sqlite3ParserFinalize(p); + (*freeProc)(p); } +#endif /* sqlite3Parser_ENGINEALWAYSONSTACK */ /* ** Return the peak depth of the stack for a parser. @@ -123168,33 +143268,70 @@ SQLITE_PRIVATE void sqlite3ParserFree( #ifdef YYTRACKMAXSTACKDEPTH SQLITE_PRIVATE int sqlite3ParserStackPeak(void *p){ yyParser *pParser = (yyParser*)p; - return pParser->yyidxMax; + return pParser->yyhwm; +} +#endif + +/* This array of booleans keeps track of the parser statement +** coverage. The element yycoverage[X][Y] is set when the parser +** is in state X and has a lookahead token Y. In a well-tested +** systems, every element of this matrix should end up being set. +*/ +#if defined(YYCOVERAGE) +static unsigned char yycoverage[YYNSTATE][YYNTOKEN]; +#endif + +/* +** Write into out a description of every state/lookahead combination that +** +** (1) has not been used by the parser, and +** (2) is not a syntax error. +** +** Return the number of missed state/lookahead combinations. +*/ +#if defined(YYCOVERAGE) +SQLITE_PRIVATE int sqlite3ParserCoverage(FILE *out){ + int stateno, iLookAhead, i; + int nMissed = 0; + for(stateno=0; stateno<YYNSTATE; stateno++){ + i = yy_shift_ofst[stateno]; + for(iLookAhead=0; iLookAhead<YYNTOKEN; iLookAhead++){ + if( yy_lookahead[i+iLookAhead]!=iLookAhead ) continue; + if( yycoverage[stateno][iLookAhead]==0 ) nMissed++; + if( out ){ + fprintf(out,"State %d lookahead %s %s\n", stateno, + yyTokenName[iLookAhead], + yycoverage[stateno][iLookAhead] ? "ok" : "missed"); + } + } + } + return nMissed; } #endif /* ** Find the appropriate action for a parser given the terminal ** look-ahead token iLookAhead. -** -** If the look-ahead token is YYNOCODE, then check to see if the action is -** independent of the look-ahead. If it is, return the action, otherwise -** return YY_NO_ACTION. */ -static int yy_find_shift_action( - yyParser *pParser, /* The parser */ - YYCODETYPE iLookAhead /* The look-ahead token */ +static YYACTIONTYPE yy_find_shift_action( + YYCODETYPE iLookAhead, /* The look-ahead token */ + YYACTIONTYPE stateno /* Current state number */ ){ int i; - int stateno = pParser->yystack[pParser->yyidx].stateno; - - if( stateno>YY_SHIFT_COUNT - || (i = yy_shift_ofst[stateno])==YY_SHIFT_USE_DFLT ){ - return yy_default[stateno]; - } - assert( iLookAhead!=YYNOCODE ); - i += iLookAhead; - if( i<0 || i>=YY_ACTTAB_COUNT || yy_lookahead[i]!=iLookAhead ){ - if( iLookAhead>0 ){ + + if( stateno>YY_MAX_SHIFT ) return stateno; + assert( stateno <= YY_SHIFT_COUNT ); +#if defined(YYCOVERAGE) + yycoverage[stateno][iLookAhead] = 1; +#endif + do{ + i = yy_shift_ofst[stateno]; + assert( i>=0 ); + assert( i+YYNTOKEN<=(int)sizeof(yy_lookahead)/sizeof(yy_lookahead[0]) ); + assert( iLookAhead!=YYNOCODE ); + assert( iLookAhead < YYNTOKEN ); + i += iLookAhead; + if( yy_lookahead[i]!=iLookAhead ){ #ifdef YYFALLBACK YYCODETYPE iFallback; /* Fallback token */ if( iLookAhead<sizeof(yyFallback)/sizeof(yyFallback[0]) @@ -123205,7 +143342,9 @@ static int yy_find_shift_action( yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[iFallback]); } #endif - return yy_find_shift_action(pParser, iFallback); + assert( yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ + iLookAhead = iFallback; + continue; } #endif #ifdef YYWILDCARD @@ -123218,35 +143357,32 @@ static int yy_find_shift_action( #if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT j<YY_ACTTAB_COUNT && #endif - yy_lookahead[j]==YYWILDCARD + yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){ #ifndef NDEBUG if( yyTraceFILE ){ fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", - yyTracePrompt, yyTokenName[iLookAhead], yyTokenName[YYWILDCARD]); + yyTracePrompt, yyTokenName[iLookAhead], + yyTokenName[YYWILDCARD]); } #endif /* NDEBUG */ return yy_action[j]; } } #endif /* YYWILDCARD */ + return yy_default[stateno]; + }else{ + return yy_action[i]; } - return yy_default[stateno]; - }else{ - return yy_action[i]; - } + }while(1); } /* ** Find the appropriate action for a parser given the non-terminal ** look-ahead token iLookAhead. -** -** If the look-ahead token is YYNOCODE, then check to see if the action is -** independent of the look-ahead. If it is, return the action, otherwise -** return YY_NO_ACTION. */ static int yy_find_reduce_action( - int stateno, /* Current state number */ + YYACTIONTYPE stateno, /* Current state number */ YYCODETYPE iLookAhead /* The look-ahead token */ ){ int i; @@ -123258,7 +143394,6 @@ static int yy_find_reduce_action( assert( stateno<=YY_REDUCE_COUNT ); #endif i = yy_reduce_ofst[stateno]; - assert( i!=YY_REDUCE_USE_DFLT ); assert( iLookAhead!=YYNOCODE ); i += iLookAhead; #ifdef YYERRORSYMBOL @@ -123275,403 +143410,436 @@ static int yy_find_reduce_action( /* ** The following routine is called if the stack overflows. */ -static void yyStackOverflow(yyParser *yypParser, YYMINORTYPE *yypMinor){ - sqlite3ParserARG_FETCH; - yypParser->yyidx--; +static void yyStackOverflow(yyParser *yypParser){ + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH #ifndef NDEBUG if( yyTraceFILE ){ fprintf(yyTraceFILE,"%sStack Overflow!\n",yyTracePrompt); } #endif - while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); + while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); /* Here code is inserted which will execute if the parser ** stack every overflows */ +/******** Begin %stack_overflow code ******************************************/ - UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ sqlite3ErrorMsg(pParse, "parser stack overflow"); - sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */ +/******** End %stack_overflow code ********************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument var */ + sqlite3ParserCTX_STORE } +/* +** Print tracing information for a SHIFT action +*/ +#ifndef NDEBUG +static void yyTraceShift(yyParser *yypParser, int yyNewState, const char *zTag){ + if( yyTraceFILE ){ + if( yyNewState<YYNSTATE ){ + fprintf(yyTraceFILE,"%s%s '%s', go to state %d\n", + yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major], + yyNewState); + }else{ + fprintf(yyTraceFILE,"%s%s '%s', pending reduce %d\n", + yyTracePrompt, zTag, yyTokenName[yypParser->yytos->major], + yyNewState - YY_MIN_REDUCE); + } + } +} +#else +# define yyTraceShift(X,Y,Z) +#endif + /* ** Perform a shift action. */ static void yy_shift( yyParser *yypParser, /* The parser to be shifted */ - int yyNewState, /* The new state to shift in */ - int yyMajor, /* The major token to shift in */ - YYMINORTYPE *yypMinor /* Pointer to the minor token to shift in */ + YYACTIONTYPE yyNewState, /* The new state to shift in */ + YYCODETYPE yyMajor, /* The major token to shift in */ + sqlite3ParserTOKENTYPE yyMinor /* The minor token to shift in */ ){ yyStackEntry *yytos; - yypParser->yyidx++; + yypParser->yytos++; #ifdef YYTRACKMAXSTACKDEPTH - if( yypParser->yyidx>yypParser->yyidxMax ){ - yypParser->yyidxMax = yypParser->yyidx; + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack) ); } #endif #if YYSTACKDEPTH>0 - if( yypParser->yyidx>=YYSTACKDEPTH ){ - yyStackOverflow(yypParser, yypMinor); + if( yypParser->yytos>yypParser->yystackEnd ){ + yypParser->yytos--; + yyStackOverflow(yypParser); return; } #else - if( yypParser->yyidx>=yypParser->yystksz ){ - yyGrowStack(yypParser); - if( yypParser->yyidx>=yypParser->yystksz ){ - yyStackOverflow(yypParser, yypMinor); + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz] ){ + if( yyGrowStack(yypParser) ){ + yypParser->yytos--; + yyStackOverflow(yypParser); return; } } #endif - yytos = &yypParser->yystack[yypParser->yyidx]; - yytos->stateno = (YYACTIONTYPE)yyNewState; - yytos->major = (YYCODETYPE)yyMajor; - yytos->minor = *yypMinor; -#ifndef NDEBUG - if( yyTraceFILE && yypParser->yyidx>0 ){ - int i; - fprintf(yyTraceFILE,"%sShift %d\n",yyTracePrompt,yyNewState); - fprintf(yyTraceFILE,"%sStack:",yyTracePrompt); - for(i=1; i<=yypParser->yyidx; i++) - fprintf(yyTraceFILE," %s",yyTokenName[yypParser->yystack[i].major]); - fprintf(yyTraceFILE,"\n"); + if( yyNewState > YY_MAX_SHIFT ){ + yyNewState += YY_MIN_REDUCE - YY_MIN_SHIFTREDUCE; } -#endif + yytos = yypParser->yytos; + yytos->stateno = yyNewState; + yytos->major = yyMajor; + yytos->minor.yy0 = yyMinor; + yyTraceShift(yypParser, yyNewState, "Shift"); } /* The following table contains information about every rule that ** is used during the reduce. */ static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - unsigned char nrhs; /* Number of right-hand side symbols in the rule */ + YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ + signed char nrhs; /* Negative of the number of RHS symbols in the rule */ } yyRuleInfo[] = { - { 144, 1 }, - { 145, 2 }, - { 145, 1 }, - { 146, 1 }, - { 146, 3 }, - { 147, 0 }, - { 147, 1 }, - { 147, 3 }, - { 148, 1 }, - { 149, 3 }, - { 151, 0 }, - { 151, 1 }, - { 151, 2 }, - { 150, 0 }, - { 150, 1 }, - { 150, 1 }, - { 150, 1 }, - { 149, 2 }, - { 149, 2 }, - { 149, 2 }, - { 153, 1 }, - { 153, 0 }, - { 149, 2 }, - { 149, 3 }, - { 149, 5 }, - { 149, 2 }, - { 154, 6 }, - { 156, 1 }, - { 158, 0 }, - { 158, 3 }, - { 157, 1 }, - { 157, 0 }, - { 155, 5 }, - { 155, 2 }, - { 162, 0 }, - { 162, 2 }, - { 160, 3 }, - { 160, 1 }, - { 164, 3 }, - { 165, 1 }, - { 152, 1 }, - { 152, 1 }, - { 152, 1 }, - { 166, 0 }, - { 166, 1 }, - { 168, 1 }, - { 168, 4 }, - { 168, 6 }, - { 169, 1 }, - { 169, 2 }, - { 170, 1 }, - { 170, 1 }, - { 167, 2 }, - { 167, 0 }, - { 173, 2 }, - { 173, 2 }, - { 173, 4 }, - { 173, 3 }, - { 173, 3 }, - { 173, 2 }, - { 173, 2 }, - { 173, 3 }, - { 173, 5 }, - { 173, 2 }, - { 173, 4 }, - { 173, 4 }, - { 173, 1 }, - { 173, 2 }, - { 178, 0 }, - { 178, 1 }, - { 180, 0 }, - { 180, 2 }, - { 182, 2 }, - { 182, 3 }, - { 182, 3 }, - { 182, 3 }, - { 183, 2 }, - { 183, 2 }, - { 183, 1 }, - { 183, 1 }, - { 183, 2 }, - { 181, 3 }, - { 181, 2 }, - { 184, 0 }, - { 184, 2 }, - { 184, 2 }, - { 161, 0 }, - { 161, 2 }, - { 185, 3 }, - { 185, 1 }, - { 186, 1 }, - { 186, 0 }, - { 187, 2 }, - { 187, 7 }, - { 187, 5 }, - { 187, 5 }, - { 187, 10 }, - { 189, 0 }, - { 189, 1 }, - { 176, 0 }, - { 176, 3 }, - { 190, 0 }, - { 190, 2 }, - { 191, 1 }, - { 191, 1 }, - { 191, 1 }, - { 149, 4 }, - { 193, 2 }, - { 193, 0 }, - { 149, 8 }, - { 149, 4 }, - { 149, 1 }, - { 163, 2 }, - { 195, 1 }, - { 195, 3 }, - { 198, 1 }, - { 198, 2 }, - { 198, 1 }, - { 196, 9 }, - { 196, 1 }, - { 207, 4 }, - { 207, 5 }, - { 199, 1 }, - { 199, 1 }, - { 199, 0 }, - { 210, 2 }, - { 210, 0 }, - { 200, 3 }, - { 200, 2 }, - { 200, 4 }, - { 211, 2 }, - { 211, 1 }, - { 211, 0 }, - { 201, 0 }, - { 201, 2 }, - { 213, 2 }, - { 213, 0 }, - { 212, 7 }, - { 212, 7 }, - { 212, 7 }, - { 159, 0 }, - { 159, 2 }, - { 194, 2 }, - { 214, 1 }, - { 214, 2 }, - { 214, 3 }, - { 214, 4 }, - { 216, 2 }, - { 216, 0 }, - { 215, 0 }, - { 215, 3 }, - { 215, 2 }, - { 217, 4 }, - { 217, 0 }, - { 205, 0 }, - { 205, 3 }, - { 220, 4 }, - { 220, 2 }, - { 177, 1 }, - { 177, 1 }, - { 177, 0 }, - { 203, 0 }, - { 203, 3 }, - { 204, 0 }, - { 204, 2 }, - { 206, 0 }, - { 206, 2 }, - { 206, 4 }, - { 206, 4 }, - { 149, 6 }, - { 202, 0 }, - { 202, 2 }, - { 149, 8 }, - { 221, 5 }, - { 221, 3 }, - { 149, 6 }, - { 149, 7 }, - { 222, 2 }, - { 222, 1 }, - { 223, 0 }, - { 223, 3 }, - { 219, 3 }, - { 219, 1 }, - { 175, 1 }, - { 175, 3 }, - { 174, 1 }, - { 175, 1 }, - { 175, 1 }, - { 175, 3 }, - { 175, 5 }, - { 174, 1 }, - { 174, 1 }, - { 175, 1 }, - { 175, 3 }, - { 175, 6 }, - { 175, 5 }, - { 175, 4 }, - { 174, 1 }, - { 175, 3 }, - { 175, 3 }, - { 175, 3 }, - { 175, 3 }, - { 175, 3 }, - { 175, 3 }, - { 175, 3 }, - { 175, 3 }, - { 224, 1 }, - { 224, 2 }, - { 175, 3 }, - { 175, 5 }, - { 175, 2 }, - { 175, 3 }, - { 175, 3 }, - { 175, 4 }, - { 175, 2 }, - { 175, 2 }, - { 175, 2 }, - { 175, 2 }, - { 225, 1 }, - { 225, 2 }, - { 175, 5 }, - { 226, 1 }, - { 226, 2 }, - { 175, 5 }, - { 175, 3 }, - { 175, 5 }, - { 175, 4 }, - { 175, 4 }, - { 175, 5 }, - { 228, 5 }, - { 228, 4 }, - { 229, 2 }, - { 229, 0 }, - { 227, 1 }, - { 227, 0 }, - { 209, 1 }, - { 209, 0 }, - { 208, 3 }, - { 208, 1 }, - { 149, 12 }, - { 230, 1 }, - { 230, 0 }, - { 179, 0 }, - { 179, 3 }, - { 188, 5 }, - { 188, 3 }, - { 231, 0 }, - { 231, 2 }, - { 149, 4 }, - { 149, 1 }, - { 149, 2 }, - { 149, 3 }, - { 149, 5 }, - { 149, 6 }, - { 149, 5 }, - { 149, 6 }, - { 232, 1 }, - { 232, 1 }, - { 232, 1 }, - { 232, 1 }, - { 232, 1 }, - { 171, 2 }, - { 171, 1 }, - { 172, 2 }, - { 149, 5 }, - { 233, 11 }, - { 235, 1 }, - { 235, 1 }, - { 235, 2 }, - { 235, 0 }, - { 236, 1 }, - { 236, 1 }, - { 236, 3 }, - { 237, 0 }, - { 237, 3 }, - { 238, 0 }, - { 238, 2 }, - { 234, 3 }, - { 234, 2 }, - { 240, 1 }, - { 240, 3 }, - { 241, 0 }, - { 241, 3 }, - { 241, 2 }, - { 239, 7 }, - { 239, 5 }, - { 239, 5 }, - { 239, 1 }, - { 175, 4 }, - { 175, 6 }, - { 192, 1 }, - { 192, 1 }, - { 192, 1 }, - { 149, 4 }, - { 149, 6 }, - { 149, 3 }, - { 243, 0 }, - { 243, 2 }, - { 242, 1 }, - { 242, 0 }, - { 149, 1 }, - { 149, 3 }, - { 149, 1 }, - { 149, 3 }, - { 149, 6 }, - { 149, 6 }, - { 244, 1 }, - { 245, 0 }, - { 245, 1 }, - { 149, 1 }, - { 149, 4 }, - { 246, 8 }, - { 247, 1 }, - { 247, 3 }, - { 248, 0 }, - { 248, 2 }, - { 249, 1 }, - { 249, 3 }, - { 250, 1 }, - { 251, 0 }, - { 251, 4 }, - { 251, 2 }, - { 197, 0 }, - { 197, 2 }, - { 197, 3 }, - { 252, 6 }, - { 252, 8 }, + { 149, -1 }, /* (0) explain ::= EXPLAIN */ + { 149, -3 }, /* (1) explain ::= EXPLAIN QUERY PLAN */ + { 148, -1 }, /* (2) cmdx ::= cmd */ + { 150, -3 }, /* (3) cmd ::= BEGIN transtype trans_opt */ + { 151, 0 }, /* (4) transtype ::= */ + { 151, -1 }, /* (5) transtype ::= DEFERRED */ + { 151, -1 }, /* (6) transtype ::= IMMEDIATE */ + { 151, -1 }, /* (7) transtype ::= EXCLUSIVE */ + { 150, -2 }, /* (8) cmd ::= COMMIT|END trans_opt */ + { 150, -2 }, /* (9) cmd ::= ROLLBACK trans_opt */ + { 150, -2 }, /* (10) cmd ::= SAVEPOINT nm */ + { 150, -3 }, /* (11) cmd ::= RELEASE savepoint_opt nm */ + { 150, -5 }, /* (12) cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + { 155, -6 }, /* (13) create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + { 157, -1 }, /* (14) createkw ::= CREATE */ + { 159, 0 }, /* (15) ifnotexists ::= */ + { 159, -3 }, /* (16) ifnotexists ::= IF NOT EXISTS */ + { 158, -1 }, /* (17) temp ::= TEMP */ + { 158, 0 }, /* (18) temp ::= */ + { 156, -5 }, /* (19) create_table_args ::= LP columnlist conslist_opt RP table_options */ + { 156, -2 }, /* (20) create_table_args ::= AS select */ + { 163, 0 }, /* (21) table_options ::= */ + { 163, -2 }, /* (22) table_options ::= WITHOUT nm */ + { 165, -2 }, /* (23) columnname ::= nm typetoken */ + { 167, 0 }, /* (24) typetoken ::= */ + { 167, -4 }, /* (25) typetoken ::= typename LP signed RP */ + { 167, -6 }, /* (26) typetoken ::= typename LP signed COMMA signed RP */ + { 168, -2 }, /* (27) typename ::= typename ID|STRING */ + { 172, 0 }, /* (28) scanpt ::= */ + { 173, -2 }, /* (29) ccons ::= CONSTRAINT nm */ + { 173, -4 }, /* (30) ccons ::= DEFAULT scanpt term scanpt */ + { 173, -4 }, /* (31) ccons ::= DEFAULT LP expr RP */ + { 173, -4 }, /* (32) ccons ::= DEFAULT PLUS term scanpt */ + { 173, -4 }, /* (33) ccons ::= DEFAULT MINUS term scanpt */ + { 173, -3 }, /* (34) ccons ::= DEFAULT scanpt ID|INDEXED */ + { 173, -3 }, /* (35) ccons ::= NOT NULL onconf */ + { 173, -5 }, /* (36) ccons ::= PRIMARY KEY sortorder onconf autoinc */ + { 173, -2 }, /* (37) ccons ::= UNIQUE onconf */ + { 173, -4 }, /* (38) ccons ::= CHECK LP expr RP */ + { 173, -4 }, /* (39) ccons ::= REFERENCES nm eidlist_opt refargs */ + { 173, -1 }, /* (40) ccons ::= defer_subclause */ + { 173, -2 }, /* (41) ccons ::= COLLATE ID|STRING */ + { 178, 0 }, /* (42) autoinc ::= */ + { 178, -1 }, /* (43) autoinc ::= AUTOINCR */ + { 180, 0 }, /* (44) refargs ::= */ + { 180, -2 }, /* (45) refargs ::= refargs refarg */ + { 182, -2 }, /* (46) refarg ::= MATCH nm */ + { 182, -3 }, /* (47) refarg ::= ON INSERT refact */ + { 182, -3 }, /* (48) refarg ::= ON DELETE refact */ + { 182, -3 }, /* (49) refarg ::= ON UPDATE refact */ + { 183, -2 }, /* (50) refact ::= SET NULL */ + { 183, -2 }, /* (51) refact ::= SET DEFAULT */ + { 183, -1 }, /* (52) refact ::= CASCADE */ + { 183, -1 }, /* (53) refact ::= RESTRICT */ + { 183, -2 }, /* (54) refact ::= NO ACTION */ + { 181, -3 }, /* (55) defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ + { 181, -2 }, /* (56) defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + { 184, 0 }, /* (57) init_deferred_pred_opt ::= */ + { 184, -2 }, /* (58) init_deferred_pred_opt ::= INITIALLY DEFERRED */ + { 184, -2 }, /* (59) init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ + { 162, 0 }, /* (60) conslist_opt ::= */ + { 186, -1 }, /* (61) tconscomma ::= COMMA */ + { 187, -2 }, /* (62) tcons ::= CONSTRAINT nm */ + { 187, -7 }, /* (63) tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ + { 187, -5 }, /* (64) tcons ::= UNIQUE LP sortlist RP onconf */ + { 187, -5 }, /* (65) tcons ::= CHECK LP expr RP onconf */ + { 187, -10 }, /* (66) tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ + { 190, 0 }, /* (67) defer_subclause_opt ::= */ + { 176, 0 }, /* (68) onconf ::= */ + { 176, -3 }, /* (69) onconf ::= ON CONFLICT resolvetype */ + { 191, 0 }, /* (70) orconf ::= */ + { 191, -2 }, /* (71) orconf ::= OR resolvetype */ + { 192, -1 }, /* (72) resolvetype ::= IGNORE */ + { 192, -1 }, /* (73) resolvetype ::= REPLACE */ + { 150, -4 }, /* (74) cmd ::= DROP TABLE ifexists fullname */ + { 194, -2 }, /* (75) ifexists ::= IF EXISTS */ + { 194, 0 }, /* (76) ifexists ::= */ + { 150, -9 }, /* (77) cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ + { 150, -4 }, /* (78) cmd ::= DROP VIEW ifexists fullname */ + { 150, -1 }, /* (79) cmd ::= select */ + { 164, -3 }, /* (80) select ::= WITH wqlist selectnowith */ + { 164, -4 }, /* (81) select ::= WITH RECURSIVE wqlist selectnowith */ + { 164, -1 }, /* (82) select ::= selectnowith */ + { 196, -3 }, /* (83) selectnowith ::= selectnowith multiselect_op oneselect */ + { 199, -1 }, /* (84) multiselect_op ::= UNION */ + { 199, -2 }, /* (85) multiselect_op ::= UNION ALL */ + { 199, -1 }, /* (86) multiselect_op ::= EXCEPT|INTERSECT */ + { 197, -9 }, /* (87) oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + { 208, -4 }, /* (88) values ::= VALUES LP nexprlist RP */ + { 208, -5 }, /* (89) values ::= values COMMA LP exprlist RP */ + { 200, -1 }, /* (90) distinct ::= DISTINCT */ + { 200, -1 }, /* (91) distinct ::= ALL */ + { 200, 0 }, /* (92) distinct ::= */ + { 211, 0 }, /* (93) sclp ::= */ + { 201, -5 }, /* (94) selcollist ::= sclp scanpt expr scanpt as */ + { 201, -3 }, /* (95) selcollist ::= sclp scanpt STAR */ + { 201, -5 }, /* (96) selcollist ::= sclp scanpt nm DOT STAR */ + { 212, -2 }, /* (97) as ::= AS nm */ + { 212, 0 }, /* (98) as ::= */ + { 202, 0 }, /* (99) from ::= */ + { 202, -2 }, /* (100) from ::= FROM seltablist */ + { 214, -2 }, /* (101) stl_prefix ::= seltablist joinop */ + { 214, 0 }, /* (102) stl_prefix ::= */ + { 213, -7 }, /* (103) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + { 213, -9 }, /* (104) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + { 213, -7 }, /* (105) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + { 213, -7 }, /* (106) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + { 160, 0 }, /* (107) dbnm ::= */ + { 160, -2 }, /* (108) dbnm ::= DOT nm */ + { 195, -1 }, /* (109) fullname ::= nm */ + { 195, -3 }, /* (110) fullname ::= nm DOT nm */ + { 219, -1 }, /* (111) xfullname ::= nm */ + { 219, -3 }, /* (112) xfullname ::= nm DOT nm */ + { 219, -5 }, /* (113) xfullname ::= nm DOT nm AS nm */ + { 219, -3 }, /* (114) xfullname ::= nm AS nm */ + { 215, -1 }, /* (115) joinop ::= COMMA|JOIN */ + { 215, -2 }, /* (116) joinop ::= JOIN_KW JOIN */ + { 215, -3 }, /* (117) joinop ::= JOIN_KW nm JOIN */ + { 215, -4 }, /* (118) joinop ::= JOIN_KW nm nm JOIN */ + { 217, -2 }, /* (119) on_opt ::= ON expr */ + { 217, 0 }, /* (120) on_opt ::= */ + { 216, 0 }, /* (121) indexed_opt ::= */ + { 216, -3 }, /* (122) indexed_opt ::= INDEXED BY nm */ + { 216, -2 }, /* (123) indexed_opt ::= NOT INDEXED */ + { 218, -4 }, /* (124) using_opt ::= USING LP idlist RP */ + { 218, 0 }, /* (125) using_opt ::= */ + { 206, 0 }, /* (126) orderby_opt ::= */ + { 206, -3 }, /* (127) orderby_opt ::= ORDER BY sortlist */ + { 188, -4 }, /* (128) sortlist ::= sortlist COMMA expr sortorder */ + { 188, -2 }, /* (129) sortlist ::= expr sortorder */ + { 177, -1 }, /* (130) sortorder ::= ASC */ + { 177, -1 }, /* (131) sortorder ::= DESC */ + { 177, 0 }, /* (132) sortorder ::= */ + { 204, 0 }, /* (133) groupby_opt ::= */ + { 204, -3 }, /* (134) groupby_opt ::= GROUP BY nexprlist */ + { 205, 0 }, /* (135) having_opt ::= */ + { 205, -2 }, /* (136) having_opt ::= HAVING expr */ + { 207, 0 }, /* (137) limit_opt ::= */ + { 207, -2 }, /* (138) limit_opt ::= LIMIT expr */ + { 207, -4 }, /* (139) limit_opt ::= LIMIT expr OFFSET expr */ + { 207, -4 }, /* (140) limit_opt ::= LIMIT expr COMMA expr */ + { 150, -6 }, /* (141) cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ + { 203, 0 }, /* (142) where_opt ::= */ + { 203, -2 }, /* (143) where_opt ::= WHERE expr */ + { 150, -8 }, /* (144) cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ + { 222, -5 }, /* (145) setlist ::= setlist COMMA nm EQ expr */ + { 222, -7 }, /* (146) setlist ::= setlist COMMA LP idlist RP EQ expr */ + { 222, -3 }, /* (147) setlist ::= nm EQ expr */ + { 222, -5 }, /* (148) setlist ::= LP idlist RP EQ expr */ + { 150, -7 }, /* (149) cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ + { 150, -7 }, /* (150) cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ + { 225, 0 }, /* (151) upsert ::= */ + { 225, -11 }, /* (152) upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ + { 225, -8 }, /* (153) upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ + { 225, -4 }, /* (154) upsert ::= ON CONFLICT DO NOTHING */ + { 223, -2 }, /* (155) insert_cmd ::= INSERT orconf */ + { 223, -1 }, /* (156) insert_cmd ::= REPLACE */ + { 224, 0 }, /* (157) idlist_opt ::= */ + { 224, -3 }, /* (158) idlist_opt ::= LP idlist RP */ + { 220, -3 }, /* (159) idlist ::= idlist COMMA nm */ + { 220, -1 }, /* (160) idlist ::= nm */ + { 175, -3 }, /* (161) expr ::= LP expr RP */ + { 175, -1 }, /* (162) expr ::= ID|INDEXED */ + { 175, -1 }, /* (163) expr ::= JOIN_KW */ + { 175, -3 }, /* (164) expr ::= nm DOT nm */ + { 175, -5 }, /* (165) expr ::= nm DOT nm DOT nm */ + { 174, -1 }, /* (166) term ::= NULL|FLOAT|BLOB */ + { 174, -1 }, /* (167) term ::= STRING */ + { 174, -1 }, /* (168) term ::= INTEGER */ + { 175, -1 }, /* (169) expr ::= VARIABLE */ + { 175, -3 }, /* (170) expr ::= expr COLLATE ID|STRING */ + { 175, -6 }, /* (171) expr ::= CAST LP expr AS typetoken RP */ + { 175, -5 }, /* (172) expr ::= ID|INDEXED LP distinct exprlist RP */ + { 175, -4 }, /* (173) expr ::= ID|INDEXED LP STAR RP */ + { 174, -1 }, /* (174) term ::= CTIME_KW */ + { 175, -5 }, /* (175) expr ::= LP nexprlist COMMA expr RP */ + { 175, -3 }, /* (176) expr ::= expr AND expr */ + { 175, -3 }, /* (177) expr ::= expr OR expr */ + { 175, -3 }, /* (178) expr ::= expr LT|GT|GE|LE expr */ + { 175, -3 }, /* (179) expr ::= expr EQ|NE expr */ + { 175, -3 }, /* (180) expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ + { 175, -3 }, /* (181) expr ::= expr PLUS|MINUS expr */ + { 175, -3 }, /* (182) expr ::= expr STAR|SLASH|REM expr */ + { 175, -3 }, /* (183) expr ::= expr CONCAT expr */ + { 226, -2 }, /* (184) likeop ::= NOT LIKE_KW|MATCH */ + { 175, -3 }, /* (185) expr ::= expr likeop expr */ + { 175, -5 }, /* (186) expr ::= expr likeop expr ESCAPE expr */ + { 175, -2 }, /* (187) expr ::= expr ISNULL|NOTNULL */ + { 175, -3 }, /* (188) expr ::= expr NOT NULL */ + { 175, -3 }, /* (189) expr ::= expr IS expr */ + { 175, -4 }, /* (190) expr ::= expr IS NOT expr */ + { 175, -2 }, /* (191) expr ::= NOT expr */ + { 175, -2 }, /* (192) expr ::= BITNOT expr */ + { 175, -2 }, /* (193) expr ::= MINUS expr */ + { 175, -2 }, /* (194) expr ::= PLUS expr */ + { 227, -1 }, /* (195) between_op ::= BETWEEN */ + { 227, -2 }, /* (196) between_op ::= NOT BETWEEN */ + { 175, -5 }, /* (197) expr ::= expr between_op expr AND expr */ + { 228, -1 }, /* (198) in_op ::= IN */ + { 228, -2 }, /* (199) in_op ::= NOT IN */ + { 175, -5 }, /* (200) expr ::= expr in_op LP exprlist RP */ + { 175, -3 }, /* (201) expr ::= LP select RP */ + { 175, -5 }, /* (202) expr ::= expr in_op LP select RP */ + { 175, -5 }, /* (203) expr ::= expr in_op nm dbnm paren_exprlist */ + { 175, -4 }, /* (204) expr ::= EXISTS LP select RP */ + { 175, -5 }, /* (205) expr ::= CASE case_operand case_exprlist case_else END */ + { 231, -5 }, /* (206) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + { 231, -4 }, /* (207) case_exprlist ::= WHEN expr THEN expr */ + { 232, -2 }, /* (208) case_else ::= ELSE expr */ + { 232, 0 }, /* (209) case_else ::= */ + { 230, -1 }, /* (210) case_operand ::= expr */ + { 230, 0 }, /* (211) case_operand ::= */ + { 210, 0 }, /* (212) exprlist ::= */ + { 209, -3 }, /* (213) nexprlist ::= nexprlist COMMA expr */ + { 209, -1 }, /* (214) nexprlist ::= expr */ + { 229, 0 }, /* (215) paren_exprlist ::= */ + { 229, -3 }, /* (216) paren_exprlist ::= LP exprlist RP */ + { 150, -12 }, /* (217) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + { 233, -1 }, /* (218) uniqueflag ::= UNIQUE */ + { 233, 0 }, /* (219) uniqueflag ::= */ + { 179, 0 }, /* (220) eidlist_opt ::= */ + { 179, -3 }, /* (221) eidlist_opt ::= LP eidlist RP */ + { 189, -5 }, /* (222) eidlist ::= eidlist COMMA nm collate sortorder */ + { 189, -3 }, /* (223) eidlist ::= nm collate sortorder */ + { 234, 0 }, /* (224) collate ::= */ + { 234, -2 }, /* (225) collate ::= COLLATE ID|STRING */ + { 150, -4 }, /* (226) cmd ::= DROP INDEX ifexists fullname */ + { 150, -1 }, /* (227) cmd ::= VACUUM */ + { 150, -2 }, /* (228) cmd ::= VACUUM nm */ + { 150, -3 }, /* (229) cmd ::= PRAGMA nm dbnm */ + { 150, -5 }, /* (230) cmd ::= PRAGMA nm dbnm EQ nmnum */ + { 150, -6 }, /* (231) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + { 150, -5 }, /* (232) cmd ::= PRAGMA nm dbnm EQ minus_num */ + { 150, -6 }, /* (233) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + { 170, -2 }, /* (234) plus_num ::= PLUS INTEGER|FLOAT */ + { 171, -2 }, /* (235) minus_num ::= MINUS INTEGER|FLOAT */ + { 150, -5 }, /* (236) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + { 236, -11 }, /* (237) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + { 238, -1 }, /* (238) trigger_time ::= BEFORE|AFTER */ + { 238, -2 }, /* (239) trigger_time ::= INSTEAD OF */ + { 238, 0 }, /* (240) trigger_time ::= */ + { 239, -1 }, /* (241) trigger_event ::= DELETE|INSERT */ + { 239, -1 }, /* (242) trigger_event ::= UPDATE */ + { 239, -3 }, /* (243) trigger_event ::= UPDATE OF idlist */ + { 241, 0 }, /* (244) when_clause ::= */ + { 241, -2 }, /* (245) when_clause ::= WHEN expr */ + { 237, -3 }, /* (246) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + { 237, -2 }, /* (247) trigger_cmd_list ::= trigger_cmd SEMI */ + { 243, -3 }, /* (248) trnm ::= nm DOT nm */ + { 244, -3 }, /* (249) tridxby ::= INDEXED BY nm */ + { 244, -2 }, /* (250) tridxby ::= NOT INDEXED */ + { 242, -8 }, /* (251) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ + { 242, -8 }, /* (252) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + { 242, -6 }, /* (253) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + { 242, -3 }, /* (254) trigger_cmd ::= scanpt select scanpt */ + { 175, -4 }, /* (255) expr ::= RAISE LP IGNORE RP */ + { 175, -6 }, /* (256) expr ::= RAISE LP raisetype COMMA nm RP */ + { 193, -1 }, /* (257) raisetype ::= ROLLBACK */ + { 193, -1 }, /* (258) raisetype ::= ABORT */ + { 193, -1 }, /* (259) raisetype ::= FAIL */ + { 150, -4 }, /* (260) cmd ::= DROP TRIGGER ifexists fullname */ + { 150, -6 }, /* (261) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + { 150, -3 }, /* (262) cmd ::= DETACH database_kw_opt expr */ + { 246, 0 }, /* (263) key_opt ::= */ + { 246, -2 }, /* (264) key_opt ::= KEY expr */ + { 150, -1 }, /* (265) cmd ::= REINDEX */ + { 150, -3 }, /* (266) cmd ::= REINDEX nm dbnm */ + { 150, -1 }, /* (267) cmd ::= ANALYZE */ + { 150, -3 }, /* (268) cmd ::= ANALYZE nm dbnm */ + { 150, -6 }, /* (269) cmd ::= ALTER TABLE fullname RENAME TO nm */ + { 150, -7 }, /* (270) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + { 247, -1 }, /* (271) add_column_fullname ::= fullname */ + { 150, -1 }, /* (272) cmd ::= create_vtab */ + { 150, -4 }, /* (273) cmd ::= create_vtab LP vtabarglist RP */ + { 249, -8 }, /* (274) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + { 251, 0 }, /* (275) vtabarg ::= */ + { 252, -1 }, /* (276) vtabargtoken ::= ANY */ + { 252, -3 }, /* (277) vtabargtoken ::= lp anylist RP */ + { 253, -1 }, /* (278) lp ::= LP */ + { 221, -2 }, /* (279) with ::= WITH wqlist */ + { 221, -3 }, /* (280) with ::= WITH RECURSIVE wqlist */ + { 198, -6 }, /* (281) wqlist ::= nm eidlist_opt AS LP select RP */ + { 198, -8 }, /* (282) wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ + { 145, -1 }, /* (283) input ::= cmdlist */ + { 146, -2 }, /* (284) cmdlist ::= cmdlist ecmd */ + { 146, -1 }, /* (285) cmdlist ::= ecmd */ + { 147, -1 }, /* (286) ecmd ::= SEMI */ + { 147, -2 }, /* (287) ecmd ::= cmdx SEMI */ + { 147, -2 }, /* (288) ecmd ::= explain cmdx */ + { 152, 0 }, /* (289) trans_opt ::= */ + { 152, -1 }, /* (290) trans_opt ::= TRANSACTION */ + { 152, -2 }, /* (291) trans_opt ::= TRANSACTION nm */ + { 154, -1 }, /* (292) savepoint_opt ::= SAVEPOINT */ + { 154, 0 }, /* (293) savepoint_opt ::= */ + { 150, -2 }, /* (294) cmd ::= create_table create_table_args */ + { 161, -4 }, /* (295) columnlist ::= columnlist COMMA columnname carglist */ + { 161, -2 }, /* (296) columnlist ::= columnname carglist */ + { 153, -1 }, /* (297) nm ::= ID|INDEXED */ + { 153, -1 }, /* (298) nm ::= STRING */ + { 153, -1 }, /* (299) nm ::= JOIN_KW */ + { 167, -1 }, /* (300) typetoken ::= typename */ + { 168, -1 }, /* (301) typename ::= ID|STRING */ + { 169, -1 }, /* (302) signed ::= plus_num */ + { 169, -1 }, /* (303) signed ::= minus_num */ + { 166, -2 }, /* (304) carglist ::= carglist ccons */ + { 166, 0 }, /* (305) carglist ::= */ + { 173, -2 }, /* (306) ccons ::= NULL onconf */ + { 162, -2 }, /* (307) conslist_opt ::= COMMA conslist */ + { 185, -3 }, /* (308) conslist ::= conslist tconscomma tcons */ + { 185, -1 }, /* (309) conslist ::= tcons */ + { 186, 0 }, /* (310) tconscomma ::= */ + { 190, -1 }, /* (311) defer_subclause_opt ::= defer_subclause */ + { 192, -1 }, /* (312) resolvetype ::= raisetype */ + { 196, -1 }, /* (313) selectnowith ::= oneselect */ + { 197, -1 }, /* (314) oneselect ::= values */ + { 211, -2 }, /* (315) sclp ::= selcollist COMMA */ + { 212, -1 }, /* (316) as ::= ID|STRING */ + { 175, -1 }, /* (317) expr ::= term */ + { 226, -1 }, /* (318) likeop ::= LIKE_KW|MATCH */ + { 210, -1 }, /* (319) exprlist ::= nexprlist */ + { 235, -1 }, /* (320) nmnum ::= plus_num */ + { 235, -1 }, /* (321) nmnum ::= nm */ + { 235, -1 }, /* (322) nmnum ::= ON */ + { 235, -1 }, /* (323) nmnum ::= DELETE */ + { 235, -1 }, /* (324) nmnum ::= DEFAULT */ + { 170, -1 }, /* (325) plus_num ::= INTEGER|FLOAT */ + { 240, 0 }, /* (326) foreach_clause ::= */ + { 240, -3 }, /* (327) foreach_clause ::= FOR EACH ROW */ + { 243, -1 }, /* (328) trnm ::= nm */ + { 244, 0 }, /* (329) tridxby ::= */ + { 245, -1 }, /* (330) database_kw_opt ::= DATABASE */ + { 245, 0 }, /* (331) database_kw_opt ::= */ + { 248, 0 }, /* (332) kwcolumn_opt ::= */ + { 248, -1 }, /* (333) kwcolumn_opt ::= COLUMNKW */ + { 250, -1 }, /* (334) vtabarglist ::= vtabarg */ + { 250, -3 }, /* (335) vtabarglist ::= vtabarglist COMMA vtabarg */ + { 251, -2 }, /* (336) vtabarg ::= vtabarg vtabargtoken */ + { 254, 0 }, /* (337) anylist ::= */ + { 254, -4 }, /* (338) anylist ::= anylist LP anylist RP */ + { 254, -2 }, /* (339) anylist ::= anylist ANY */ + { 221, 0 }, /* (340) with ::= */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -123679,43 +143847,73 @@ static void yy_accept(yyParser*); /* Forward Declaration */ /* ** Perform a reduce action and the shift that must immediately ** follow the reduce. +** +** The yyLookahead and yyLookaheadToken parameters provide reduce actions +** access to the lookahead token (if any). The yyLookahead will be YYNOCODE +** if the lookahead token has already been consumed. As this procedure is +** only called from one place, optimizing compilers will in-line it, which +** means that the extra parameters have no performance impact. */ -static void yy_reduce( +static YYACTIONTYPE yy_reduce( yyParser *yypParser, /* The parser */ - int yyruleno /* Number of the rule by which to reduce */ + unsigned int yyruleno, /* Number of the rule by which to reduce */ + int yyLookahead, /* Lookahead token, or YYNOCODE if none */ + sqlite3ParserTOKENTYPE yyLookaheadToken /* Value of the lookahead token */ + sqlite3ParserCTX_PDECL /* %extra_context */ ){ int yygoto; /* The next state */ int yyact; /* The next action */ - YYMINORTYPE yygotominor; /* The LHS of the rule reduced */ yyStackEntry *yymsp; /* The top of the parser's stack */ int yysize; /* Amount to pop the stack */ - sqlite3ParserARG_FETCH; - yymsp = &yypParser->yystack[yypParser->yyidx]; + sqlite3ParserARG_FETCH + (void)yyLookahead; + (void)yyLookaheadToken; + yymsp = yypParser->yytos; #ifndef NDEBUG - if( yyTraceFILE && yyruleno>=0 - && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - fprintf(yyTraceFILE, "%sReduce [%s].\n", yyTracePrompt, - yyRuleName[yyruleno]); + if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ + yysize = yyRuleInfo[yyruleno].nrhs; + if( yysize ){ + fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", + yyTracePrompt, + yyruleno, yyRuleName[yyruleno], yymsp[yysize].stateno); + }else{ + fprintf(yyTraceFILE, "%sReduce %d [%s].\n", + yyTracePrompt, yyruleno, yyRuleName[yyruleno]); + } } #endif /* NDEBUG */ - /* Silence complaints from purify about yygotominor being uninitialized - ** in some cases when it is copied into the stack after the following - ** switch. yygotominor is uninitialized when a rule reduces that does - ** not set the value of its left-hand side nonterminal. Leaving the - ** value of the nonterminal uninitialized is utterly harmless as long - ** as the value is never used. So really the only thing this code - ** accomplishes is to quieten purify. - ** - ** 2007-01-16: The wireshark project (www.wireshark.org) reports that - ** without this code, their parser segfaults. I'm not sure what there - ** parser is doing to make this happen. This is the second bug report - ** from wireshark this week. Clearly they are stressing Lemon in ways - ** that it has not been previously stressed... (SQLite ticket #2172) - */ - /*memset(&yygotominor, 0, sizeof(yygotominor));*/ - yygotominor = yyzerominor; - + /* Check that the stack is large enough to grow by a single entry + ** if the RHS of the rule is empty. This ensures that there is room + ** enough on the stack to push the LHS value */ + if( yyRuleInfo[yyruleno].nrhs==0 ){ +#ifdef YYTRACKMAXSTACKDEPTH + if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ + yypParser->yyhwm++; + assert( yypParser->yyhwm == (int)(yypParser->yytos - yypParser->yystack)); + } +#endif +#if YYSTACKDEPTH>0 + if( yypParser->yytos>=yypParser->yystackEnd ){ + yyStackOverflow(yypParser); + /* The call to yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } +#else + if( yypParser->yytos>=&yypParser->yystack[yypParser->yystksz-1] ){ + if( yyGrowStack(yypParser) ){ + yyStackOverflow(yypParser); + /* The call to yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } + yymsp = yypParser->yytos; + } +#endif + } switch( yyruleno ){ /* Beginning here are the reduction cases. A typical example @@ -123726,366 +143924,348 @@ static void yy_reduce( ** #line <lineno> <thisfile> ** break; */ - case 5: /* explain ::= */ -{ sqlite3BeginParse(pParse, 0); } +/********** Begin reduce actions **********************************************/ + YYMINORTYPE yylhsminor; + case 0: /* explain ::= EXPLAIN */ +{ pParse->explain = 1; } break; - case 6: /* explain ::= EXPLAIN */ -{ sqlite3BeginParse(pParse, 1); } + case 1: /* explain ::= EXPLAIN QUERY PLAN */ +{ pParse->explain = 2; } break; - case 7: /* explain ::= EXPLAIN QUERY PLAN */ -{ sqlite3BeginParse(pParse, 2); } - break; - case 8: /* cmdx ::= cmd */ + case 2: /* cmdx ::= cmd */ { sqlite3FinishCoding(pParse); } break; - case 9: /* cmd ::= BEGIN transtype trans_opt */ -{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy328);} + case 3: /* cmd ::= BEGIN transtype trans_opt */ +{sqlite3BeginTransaction(pParse, yymsp[-1].minor.yy502);} break; - case 13: /* transtype ::= */ -{yygotominor.yy328 = TK_DEFERRED;} + case 4: /* transtype ::= */ +{yymsp[1].minor.yy502 = TK_DEFERRED;} break; - case 14: /* transtype ::= DEFERRED */ - case 15: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==15); - case 16: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==16); - case 115: /* multiselect_op ::= UNION */ yytestcase(yyruleno==115); - case 117: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==117); -{yygotominor.yy328 = yymsp[0].major;} + case 5: /* transtype ::= DEFERRED */ + case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); + case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); +{yymsp[0].minor.yy502 = yymsp[0].major; /*A-overwrites-X*/} break; - case 17: /* cmd ::= COMMIT trans_opt */ - case 18: /* cmd ::= END trans_opt */ yytestcase(yyruleno==18); -{sqlite3CommitTransaction(pParse);} + case 8: /* cmd ::= COMMIT|END trans_opt */ + case 9: /* cmd ::= ROLLBACK trans_opt */ yytestcase(yyruleno==9); +{sqlite3EndTransaction(pParse,yymsp[-1].major);} break; - case 19: /* cmd ::= ROLLBACK trans_opt */ -{sqlite3RollbackTransaction(pParse);} - break; - case 22: /* cmd ::= SAVEPOINT nm */ + case 10: /* cmd ::= SAVEPOINT nm */ { sqlite3Savepoint(pParse, SAVEPOINT_BEGIN, &yymsp[0].minor.yy0); } break; - case 23: /* cmd ::= RELEASE savepoint_opt nm */ + case 11: /* cmd ::= RELEASE savepoint_opt nm */ { sqlite3Savepoint(pParse, SAVEPOINT_RELEASE, &yymsp[0].minor.yy0); } break; - case 24: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ + case 12: /* cmd ::= ROLLBACK trans_opt TO savepoint_opt nm */ { sqlite3Savepoint(pParse, SAVEPOINT_ROLLBACK, &yymsp[0].minor.yy0); } break; - case 26: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ + case 13: /* create_table ::= createkw temp TABLE ifnotexists nm dbnm */ { - sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy328,0,0,yymsp[-2].minor.yy328); + sqlite3StartTable(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,yymsp[-4].minor.yy502,0,0,yymsp[-2].minor.yy502); } break; - case 27: /* createkw ::= CREATE */ + case 14: /* createkw ::= CREATE */ +{disableLookaside(pParse);} + break; + case 15: /* ifnotexists ::= */ + case 18: /* temp ::= */ yytestcase(yyruleno==18); + case 21: /* table_options ::= */ yytestcase(yyruleno==21); + case 42: /* autoinc ::= */ yytestcase(yyruleno==42); + case 57: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==57); + case 67: /* defer_subclause_opt ::= */ yytestcase(yyruleno==67); + case 76: /* ifexists ::= */ yytestcase(yyruleno==76); + case 92: /* distinct ::= */ yytestcase(yyruleno==92); + case 224: /* collate ::= */ yytestcase(yyruleno==224); +{yymsp[1].minor.yy502 = 0;} + break; + case 16: /* ifnotexists ::= IF NOT EXISTS */ +{yymsp[-2].minor.yy502 = 1;} + break; + case 17: /* temp ::= TEMP */ + case 43: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==43); +{yymsp[0].minor.yy502 = 1;} + break; + case 19: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ { - pParse->db->lookaside.bEnabled = 0; - yygotominor.yy0 = yymsp[0].minor.yy0; + sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy502,0); } break; - case 28: /* ifnotexists ::= */ - case 31: /* temp ::= */ yytestcase(yyruleno==31); - case 68: /* autoinc ::= */ yytestcase(yyruleno==68); - case 81: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ yytestcase(yyruleno==81); - case 83: /* init_deferred_pred_opt ::= */ yytestcase(yyruleno==83); - case 85: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ yytestcase(yyruleno==85); - case 97: /* defer_subclause_opt ::= */ yytestcase(yyruleno==97); - case 108: /* ifexists ::= */ yytestcase(yyruleno==108); - case 218: /* between_op ::= BETWEEN */ yytestcase(yyruleno==218); - case 221: /* in_op ::= IN */ yytestcase(yyruleno==221); -{yygotominor.yy328 = 0;} - break; - case 29: /* ifnotexists ::= IF NOT EXISTS */ - case 30: /* temp ::= TEMP */ yytestcase(yyruleno==30); - case 69: /* autoinc ::= AUTOINCR */ yytestcase(yyruleno==69); - case 84: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ yytestcase(yyruleno==84); - case 107: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==107); - case 219: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==219); - case 222: /* in_op ::= NOT IN */ yytestcase(yyruleno==222); -{yygotominor.yy328 = 1;} - break; - case 32: /* create_table_args ::= LP columnlist conslist_opt RP table_options */ + case 20: /* create_table_args ::= AS select */ { - sqlite3EndTable(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,yymsp[0].minor.yy186,0); + sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy399); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy399); } break; - case 33: /* create_table_args ::= AS select */ -{ - sqlite3EndTable(pParse,0,0,0,yymsp[0].minor.yy3); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy3); -} - break; - case 34: /* table_options ::= */ -{yygotominor.yy186 = 0;} - break; - case 35: /* table_options ::= WITHOUT nm */ + case 22: /* table_options ::= WITHOUT nm */ { if( yymsp[0].minor.yy0.n==5 && sqlite3_strnicmp(yymsp[0].minor.yy0.z,"rowid",5)==0 ){ - yygotominor.yy186 = TF_WithoutRowid; + yymsp[-1].minor.yy502 = TF_WithoutRowid | TF_NoVisibleRowid; }else{ - yygotominor.yy186 = 0; + yymsp[-1].minor.yy502 = 0; sqlite3ErrorMsg(pParse, "unknown table option: %.*s", yymsp[0].minor.yy0.n, yymsp[0].minor.yy0.z); } } break; - case 38: /* column ::= columnid type carglist */ + case 23: /* columnname ::= nm typetoken */ +{sqlite3AddColumn(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} + break; + case 24: /* typetoken ::= */ + case 60: /* conslist_opt ::= */ yytestcase(yyruleno==60); + case 98: /* as ::= */ yytestcase(yyruleno==98); +{yymsp[1].minor.yy0.n = 0; yymsp[1].minor.yy0.z = 0;} + break; + case 25: /* typetoken ::= typename LP signed RP */ { - yygotominor.yy0.z = yymsp[-2].minor.yy0.z; - yygotominor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-2].minor.yy0.z) + pParse->sLastToken.n; + yymsp[-3].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z); } break; - case 39: /* columnid ::= nm */ + case 26: /* typetoken ::= typename LP signed COMMA signed RP */ { - sqlite3AddColumn(pParse,&yymsp[0].minor.yy0); - yygotominor.yy0 = yymsp[0].minor.yy0; - pParse->constraintName.n = 0; + yymsp[-5].minor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z); } break; - case 40: /* nm ::= ID|INDEXED */ - case 41: /* nm ::= STRING */ yytestcase(yyruleno==41); - case 42: /* nm ::= JOIN_KW */ yytestcase(yyruleno==42); - case 45: /* typetoken ::= typename */ yytestcase(yyruleno==45); - case 48: /* typename ::= ID|STRING */ yytestcase(yyruleno==48); - case 130: /* as ::= AS nm */ yytestcase(yyruleno==130); - case 131: /* as ::= ID|STRING */ yytestcase(yyruleno==131); - case 141: /* dbnm ::= DOT nm */ yytestcase(yyruleno==141); - case 150: /* indexed_opt ::= INDEXED BY nm */ yytestcase(yyruleno==150); - case 247: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==247); - case 256: /* nmnum ::= plus_num */ yytestcase(yyruleno==256); - case 257: /* nmnum ::= nm */ yytestcase(yyruleno==257); - case 258: /* nmnum ::= ON */ yytestcase(yyruleno==258); - case 259: /* nmnum ::= DELETE */ yytestcase(yyruleno==259); - case 260: /* nmnum ::= DEFAULT */ yytestcase(yyruleno==260); - case 261: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==261); - case 262: /* plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==262); - case 263: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==263); - case 279: /* trnm ::= nm */ yytestcase(yyruleno==279); -{yygotominor.yy0 = yymsp[0].minor.yy0;} + case 27: /* typename ::= typename ID|STRING */ +{yymsp[-1].minor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);} break; - case 44: /* type ::= typetoken */ -{sqlite3AddColumnType(pParse,&yymsp[0].minor.yy0);} - break; - case 46: /* typetoken ::= typename LP signed RP */ + case 28: /* scanpt ::= */ { - yygotominor.yy0.z = yymsp[-3].minor.yy0.z; - yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-3].minor.yy0.z); + assert( yyLookahead!=YYNOCODE ); + yymsp[1].minor.yy36 = yyLookaheadToken.z; } break; - case 47: /* typetoken ::= typename LP signed COMMA signed RP */ -{ - yygotominor.yy0.z = yymsp[-5].minor.yy0.z; - yygotominor.yy0.n = (int)(&yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] - yymsp[-5].minor.yy0.z); -} - break; - case 49: /* typename ::= typename ID|STRING */ -{yygotominor.yy0.z=yymsp[-1].minor.yy0.z; yygotominor.yy0.n=yymsp[0].minor.yy0.n+(int)(yymsp[0].minor.yy0.z-yymsp[-1].minor.yy0.z);} - break; - case 54: /* ccons ::= CONSTRAINT nm */ - case 92: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==92); + case 29: /* ccons ::= CONSTRAINT nm */ + case 62: /* tcons ::= CONSTRAINT nm */ yytestcase(yyruleno==62); {pParse->constraintName = yymsp[0].minor.yy0;} break; - case 55: /* ccons ::= DEFAULT term */ - case 57: /* ccons ::= DEFAULT PLUS term */ yytestcase(yyruleno==57); -{sqlite3AddDefaultValue(pParse,&yymsp[0].minor.yy346);} + case 30: /* ccons ::= DEFAULT scanpt term scanpt */ +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy182,yymsp[-2].minor.yy36,yymsp[0].minor.yy36);} break; - case 56: /* ccons ::= DEFAULT LP expr RP */ -{sqlite3AddDefaultValue(pParse,&yymsp[-1].minor.yy346);} + case 31: /* ccons ::= DEFAULT LP expr RP */ +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy182,yymsp[-2].minor.yy0.z+1,yymsp[0].minor.yy0.z);} break; - case 58: /* ccons ::= DEFAULT MINUS term */ + case 32: /* ccons ::= DEFAULT PLUS term scanpt */ +{sqlite3AddDefaultValue(pParse,yymsp[-1].minor.yy182,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy36);} + break; + case 33: /* ccons ::= DEFAULT MINUS term scanpt */ { - ExprSpan v; - v.pExpr = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy346.pExpr, 0, 0); - v.zStart = yymsp[-1].minor.yy0.z; - v.zEnd = yymsp[0].minor.yy346.zEnd; - sqlite3AddDefaultValue(pParse,&v); + Expr *p = sqlite3PExpr(pParse, TK_UMINUS, yymsp[-1].minor.yy182, 0); + sqlite3AddDefaultValue(pParse,p,yymsp[-2].minor.yy0.z,yymsp[0].minor.yy36); } break; - case 59: /* ccons ::= DEFAULT ID|INDEXED */ + case 34: /* ccons ::= DEFAULT scanpt ID|INDEXED */ { - ExprSpan v; - spanExpr(&v, pParse, TK_STRING, &yymsp[0].minor.yy0); - sqlite3AddDefaultValue(pParse,&v); + Expr *p = tokenExpr(pParse, TK_STRING, yymsp[0].minor.yy0); + if( p ){ + sqlite3ExprIdToTrueFalse(p); + testcase( p->op==TK_TRUEFALSE && sqlite3ExprTruthValue(p) ); + } + sqlite3AddDefaultValue(pParse,p,yymsp[0].minor.yy0.z,yymsp[0].minor.yy0.z+yymsp[0].minor.yy0.n); } break; - case 61: /* ccons ::= NOT NULL onconf */ -{sqlite3AddNotNull(pParse, yymsp[0].minor.yy328);} + case 35: /* ccons ::= NOT NULL onconf */ +{sqlite3AddNotNull(pParse, yymsp[0].minor.yy502);} break; - case 62: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ -{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy328,yymsp[0].minor.yy328,yymsp[-2].minor.yy328);} + case 36: /* ccons ::= PRIMARY KEY sortorder onconf autoinc */ +{sqlite3AddPrimaryKey(pParse,0,yymsp[-1].minor.yy502,yymsp[0].minor.yy502,yymsp[-2].minor.yy502);} break; - case 63: /* ccons ::= UNIQUE onconf */ -{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy328,0,0,0,0);} + case 37: /* ccons ::= UNIQUE onconf */ +{sqlite3CreateIndex(pParse,0,0,0,0,yymsp[0].minor.yy502,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} break; - case 64: /* ccons ::= CHECK LP expr RP */ -{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy346.pExpr);} + case 38: /* ccons ::= CHECK LP expr RP */ +{sqlite3AddCheckConstraint(pParse,yymsp[-1].minor.yy182);} break; - case 65: /* ccons ::= REFERENCES nm idxlist_opt refargs */ -{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy14,yymsp[0].minor.yy328);} + case 39: /* ccons ::= REFERENCES nm eidlist_opt refargs */ +{sqlite3CreateForeignKey(pParse,0,&yymsp[-2].minor.yy0,yymsp[-1].minor.yy232,yymsp[0].minor.yy502);} break; - case 66: /* ccons ::= defer_subclause */ -{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy328);} + case 40: /* ccons ::= defer_subclause */ +{sqlite3DeferForeignKey(pParse,yymsp[0].minor.yy502);} break; - case 67: /* ccons ::= COLLATE ID|STRING */ + case 41: /* ccons ::= COLLATE ID|STRING */ {sqlite3AddCollateType(pParse, &yymsp[0].minor.yy0);} break; - case 70: /* refargs ::= */ -{ yygotominor.yy328 = OE_None*0x0101; /* EV: R-19803-45884 */} + case 44: /* refargs ::= */ +{ yymsp[1].minor.yy502 = OE_None*0x0101; /* EV: R-19803-45884 */} break; - case 71: /* refargs ::= refargs refarg */ -{ yygotominor.yy328 = (yymsp[-1].minor.yy328 & ~yymsp[0].minor.yy429.mask) | yymsp[0].minor.yy429.value; } + case 45: /* refargs ::= refargs refarg */ +{ yymsp[-1].minor.yy502 = (yymsp[-1].minor.yy502 & ~yymsp[0].minor.yy107.mask) | yymsp[0].minor.yy107.value; } break; - case 72: /* refarg ::= MATCH nm */ - case 73: /* refarg ::= ON INSERT refact */ yytestcase(yyruleno==73); -{ yygotominor.yy429.value = 0; yygotominor.yy429.mask = 0x000000; } + case 46: /* refarg ::= MATCH nm */ +{ yymsp[-1].minor.yy107.value = 0; yymsp[-1].minor.yy107.mask = 0x000000; } break; - case 74: /* refarg ::= ON DELETE refact */ -{ yygotominor.yy429.value = yymsp[0].minor.yy328; yygotominor.yy429.mask = 0x0000ff; } + case 47: /* refarg ::= ON INSERT refact */ +{ yymsp[-2].minor.yy107.value = 0; yymsp[-2].minor.yy107.mask = 0x000000; } break; - case 75: /* refarg ::= ON UPDATE refact */ -{ yygotominor.yy429.value = yymsp[0].minor.yy328<<8; yygotominor.yy429.mask = 0x00ff00; } + case 48: /* refarg ::= ON DELETE refact */ +{ yymsp[-2].minor.yy107.value = yymsp[0].minor.yy502; yymsp[-2].minor.yy107.mask = 0x0000ff; } break; - case 76: /* refact ::= SET NULL */ -{ yygotominor.yy328 = OE_SetNull; /* EV: R-33326-45252 */} + case 49: /* refarg ::= ON UPDATE refact */ +{ yymsp[-2].minor.yy107.value = yymsp[0].minor.yy502<<8; yymsp[-2].minor.yy107.mask = 0x00ff00; } break; - case 77: /* refact ::= SET DEFAULT */ -{ yygotominor.yy328 = OE_SetDflt; /* EV: R-33326-45252 */} + case 50: /* refact ::= SET NULL */ +{ yymsp[-1].minor.yy502 = OE_SetNull; /* EV: R-33326-45252 */} break; - case 78: /* refact ::= CASCADE */ -{ yygotominor.yy328 = OE_Cascade; /* EV: R-33326-45252 */} + case 51: /* refact ::= SET DEFAULT */ +{ yymsp[-1].minor.yy502 = OE_SetDflt; /* EV: R-33326-45252 */} break; - case 79: /* refact ::= RESTRICT */ -{ yygotominor.yy328 = OE_Restrict; /* EV: R-33326-45252 */} + case 52: /* refact ::= CASCADE */ +{ yymsp[0].minor.yy502 = OE_Cascade; /* EV: R-33326-45252 */} break; - case 80: /* refact ::= NO ACTION */ -{ yygotominor.yy328 = OE_None; /* EV: R-33326-45252 */} + case 53: /* refact ::= RESTRICT */ +{ yymsp[0].minor.yy502 = OE_Restrict; /* EV: R-33326-45252 */} break; - case 82: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ - case 98: /* defer_subclause_opt ::= defer_subclause */ yytestcase(yyruleno==98); - case 100: /* onconf ::= ON CONFLICT resolvetype */ yytestcase(yyruleno==100); - case 103: /* resolvetype ::= raisetype */ yytestcase(yyruleno==103); -{yygotominor.yy328 = yymsp[0].minor.yy328;} + case 54: /* refact ::= NO ACTION */ +{ yymsp[-1].minor.yy502 = OE_None; /* EV: R-33326-45252 */} break; - case 86: /* conslist_opt ::= */ -{yygotominor.yy0.n = 0; yygotominor.yy0.z = 0;} + case 55: /* defer_subclause ::= NOT DEFERRABLE init_deferred_pred_opt */ +{yymsp[-2].minor.yy502 = 0;} break; - case 87: /* conslist_opt ::= COMMA conslist */ -{yygotominor.yy0 = yymsp[-1].minor.yy0;} + case 56: /* defer_subclause ::= DEFERRABLE init_deferred_pred_opt */ + case 71: /* orconf ::= OR resolvetype */ yytestcase(yyruleno==71); + case 155: /* insert_cmd ::= INSERT orconf */ yytestcase(yyruleno==155); +{yymsp[-1].minor.yy502 = yymsp[0].minor.yy502;} break; - case 90: /* tconscomma ::= COMMA */ + case 58: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ + case 75: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==75); + case 196: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==196); + case 199: /* in_op ::= NOT IN */ yytestcase(yyruleno==199); + case 225: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==225); +{yymsp[-1].minor.yy502 = 1;} + break; + case 59: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ +{yymsp[-1].minor.yy502 = 0;} + break; + case 61: /* tconscomma ::= COMMA */ {pParse->constraintName.n = 0;} break; - case 93: /* tcons ::= PRIMARY KEY LP idxlist autoinc RP onconf */ -{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy14,yymsp[0].minor.yy328,yymsp[-2].minor.yy328,0);} + case 63: /* tcons ::= PRIMARY KEY LP sortlist autoinc RP onconf */ +{sqlite3AddPrimaryKey(pParse,yymsp[-3].minor.yy232,yymsp[0].minor.yy502,yymsp[-2].minor.yy502,0);} break; - case 94: /* tcons ::= UNIQUE LP idxlist RP onconf */ -{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy14,yymsp[0].minor.yy328,0,0,0,0);} + case 64: /* tcons ::= UNIQUE LP sortlist RP onconf */ +{sqlite3CreateIndex(pParse,0,0,0,yymsp[-2].minor.yy232,yymsp[0].minor.yy502,0,0,0,0, + SQLITE_IDXTYPE_UNIQUE);} break; - case 95: /* tcons ::= CHECK LP expr RP onconf */ -{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy346.pExpr);} + case 65: /* tcons ::= CHECK LP expr RP onconf */ +{sqlite3AddCheckConstraint(pParse,yymsp[-2].minor.yy182);} break; - case 96: /* tcons ::= FOREIGN KEY LP idxlist RP REFERENCES nm idxlist_opt refargs defer_subclause_opt */ + case 66: /* tcons ::= FOREIGN KEY LP eidlist RP REFERENCES nm eidlist_opt refargs defer_subclause_opt */ { - sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy14, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy14, yymsp[-1].minor.yy328); - sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy328); + sqlite3CreateForeignKey(pParse, yymsp[-6].minor.yy232, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy232, yymsp[-1].minor.yy502); + sqlite3DeferForeignKey(pParse, yymsp[0].minor.yy502); } break; - case 99: /* onconf ::= */ -{yygotominor.yy328 = OE_Default;} + case 68: /* onconf ::= */ + case 70: /* orconf ::= */ yytestcase(yyruleno==70); +{yymsp[1].minor.yy502 = OE_Default;} break; - case 101: /* orconf ::= */ -{yygotominor.yy186 = OE_Default;} + case 69: /* onconf ::= ON CONFLICT resolvetype */ +{yymsp[-2].minor.yy502 = yymsp[0].minor.yy502;} break; - case 102: /* orconf ::= OR resolvetype */ -{yygotominor.yy186 = (u8)yymsp[0].minor.yy328;} + case 72: /* resolvetype ::= IGNORE */ +{yymsp[0].minor.yy502 = OE_Ignore;} break; - case 104: /* resolvetype ::= IGNORE */ -{yygotominor.yy328 = OE_Ignore;} + case 73: /* resolvetype ::= REPLACE */ + case 156: /* insert_cmd ::= REPLACE */ yytestcase(yyruleno==156); +{yymsp[0].minor.yy502 = OE_Replace;} break; - case 105: /* resolvetype ::= REPLACE */ -{yygotominor.yy328 = OE_Replace;} - break; - case 106: /* cmd ::= DROP TABLE ifexists fullname */ + case 74: /* cmd ::= DROP TABLE ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy65, 0, yymsp[-1].minor.yy328); + sqlite3DropTable(pParse, yymsp[0].minor.yy427, 0, yymsp[-1].minor.yy502); } break; - case 109: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm AS select */ + case 77: /* cmd ::= createkw temp VIEW ifnotexists nm dbnm eidlist_opt AS select */ { - sqlite3CreateView(pParse, &yymsp[-7].minor.yy0, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, yymsp[0].minor.yy3, yymsp[-6].minor.yy328, yymsp[-4].minor.yy328); + sqlite3CreateView(pParse, &yymsp[-8].minor.yy0, &yymsp[-4].minor.yy0, &yymsp[-3].minor.yy0, yymsp[-2].minor.yy232, yymsp[0].minor.yy399, yymsp[-7].minor.yy502, yymsp[-5].minor.yy502); } break; - case 110: /* cmd ::= DROP VIEW ifexists fullname */ + case 78: /* cmd ::= DROP VIEW ifexists fullname */ { - sqlite3DropTable(pParse, yymsp[0].minor.yy65, 1, yymsp[-1].minor.yy328); + sqlite3DropTable(pParse, yymsp[0].minor.yy427, 1, yymsp[-1].minor.yy502); } break; - case 111: /* cmd ::= select */ + case 79: /* cmd ::= select */ { SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; - sqlite3Select(pParse, yymsp[0].minor.yy3, &dest); - sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy3); + sqlite3Select(pParse, yymsp[0].minor.yy399, &dest); + sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy399); } break; - case 112: /* select ::= with selectnowith */ + case 80: /* select ::= WITH wqlist selectnowith */ { - Select *p = yymsp[0].minor.yy3, *pNext, *pLoop; + Select *p = yymsp[0].minor.yy399; if( p ){ - int cnt = 0, mxSelect; - p->pWith = yymsp[-1].minor.yy59; - if( p->pPrior ){ - u16 allValues = SF_Values; - pNext = 0; - for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ - pLoop->pNext = pNext; - pLoop->selFlags |= SF_Compound; - allValues &= pLoop->selFlags; - } - if( allValues ){ - p->selFlags |= SF_AllValues; - }else if( - (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 - && cnt>mxSelect - ){ - sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); - } - } + p->pWith = yymsp[-1].minor.yy91; + parserDoubleLinkSelect(pParse, p); }else{ - sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy59); + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy91); } - yygotominor.yy3 = p; + yymsp[-2].minor.yy399 = p; } break; - case 113: /* selectnowith ::= oneselect */ - case 119: /* oneselect ::= values */ yytestcase(yyruleno==119); -{yygotominor.yy3 = yymsp[0].minor.yy3;} - break; - case 114: /* selectnowith ::= selectnowith multiselect_op oneselect */ + case 81: /* select ::= WITH RECURSIVE wqlist selectnowith */ { - Select *pRhs = yymsp[0].minor.yy3; + Select *p = yymsp[0].minor.yy399; + if( p ){ + p->pWith = yymsp[-1].minor.yy91; + parserDoubleLinkSelect(pParse, p); + }else{ + sqlite3WithDelete(pParse->db, yymsp[-1].minor.yy91); + } + yymsp[-3].minor.yy399 = p; +} + break; + case 82: /* select ::= selectnowith */ +{ + Select *p = yymsp[0].minor.yy399; + if( p ){ + parserDoubleLinkSelect(pParse, p); + } + yymsp[0].minor.yy399 = p; /*A-overwrites-X*/ +} + break; + case 83: /* selectnowith ::= selectnowith multiselect_op oneselect */ +{ + Select *pRhs = yymsp[0].minor.yy399; + Select *pLhs = yymsp[-2].minor.yy399; if( pRhs && pRhs->pPrior ){ SrcList *pFrom; Token x; x.n = 0; + parserDoubleLinkSelect(pParse, pRhs); pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); - pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0); + pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); } if( pRhs ){ - pRhs->op = (u8)yymsp[-1].minor.yy328; - pRhs->pPrior = yymsp[-2].minor.yy3; - if( yymsp[-1].minor.yy328!=TK_ALL ) pParse->hasCompound = 1; + pRhs->op = (u8)yymsp[-1].minor.yy502; + pRhs->pPrior = pLhs; + if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; + pRhs->selFlags &= ~SF_MultiValue; + if( yymsp[-1].minor.yy502!=TK_ALL ) pParse->hasCompound = 1; }else{ - sqlite3SelectDelete(pParse->db, yymsp[-2].minor.yy3); + sqlite3SelectDelete(pParse->db, pLhs); } - yygotominor.yy3 = pRhs; + yymsp[-2].minor.yy399 = pRhs; } break; - case 116: /* multiselect_op ::= UNION ALL */ -{yygotominor.yy328 = TK_ALL;} + case 84: /* multiselect_op ::= UNION */ + case 86: /* multiselect_op ::= EXCEPT|INTERSECT */ yytestcase(yyruleno==86); +{yymsp[0].minor.yy502 = yymsp[0].major; /*A-overwrites-OP*/} break; - case 118: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ + case 85: /* multiselect_op ::= UNION ALL */ +{yymsp[-1].minor.yy502 = TK_ALL;} + break; + case 87: /* oneselect ::= SELECT distinct selcollist from where_opt groupby_opt having_opt orderby_opt limit_opt */ { - yygotominor.yy3 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy14,yymsp[-5].minor.yy65,yymsp[-4].minor.yy132,yymsp[-3].minor.yy14,yymsp[-2].minor.yy132,yymsp[-1].minor.yy14,yymsp[-7].minor.yy381,yymsp[0].minor.yy476.pLimit,yymsp[0].minor.yy476.pOffset); +#if SELECTTRACE_ENABLED + Token s = yymsp[-8].minor.yy0; /*A-overwrites-S*/ +#endif + yymsp[-8].minor.yy399 = sqlite3SelectNew(pParse,yymsp[-6].minor.yy232,yymsp[-5].minor.yy427,yymsp[-4].minor.yy182,yymsp[-3].minor.yy232,yymsp[-2].minor.yy182,yymsp[-1].minor.yy232,yymsp[-7].minor.yy502,yymsp[0].minor.yy182); #if SELECTTRACE_ENABLED /* Populate the Select.zSelName[] string that is used to help with ** query planner debugging, to differentiate between multiple Select @@ -124096,442 +144276,492 @@ static void yy_reduce( ** comment to be the zSelName value. Otherwise, the label is #N where ** is an integer that is incremented with each SELECT statement seen. */ - if( yygotominor.yy3!=0 ){ - const char *z = yymsp[-8].minor.yy0.z+6; + if( yymsp[-8].minor.yy399!=0 ){ + const char *z = s.z+6; int i; - sqlite3_snprintf(sizeof(yygotominor.yy3->zSelName), yygotominor.yy3->zSelName, "#%d", - ++pParse->nSelect); + sqlite3_snprintf(sizeof(yymsp[-8].minor.yy399->zSelName), yymsp[-8].minor.yy399->zSelName,"#%d",++pParse->nSelect); while( z[0]==' ' ) z++; if( z[0]=='/' && z[1]=='*' ){ z += 2; while( z[0]==' ' ) z++; for(i=0; sqlite3Isalnum(z[i]); i++){} - sqlite3_snprintf(sizeof(yygotominor.yy3->zSelName), yygotominor.yy3->zSelName, "%.*s", i, z); + sqlite3_snprintf(sizeof(yymsp[-8].minor.yy399->zSelName), yymsp[-8].minor.yy399->zSelName, "%.*s", i, z); } } #endif /* SELECTRACE_ENABLED */ } break; - case 120: /* values ::= VALUES LP nexprlist RP */ + case 88: /* values ::= VALUES LP nexprlist RP */ { - yygotominor.yy3 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy14,0,0,0,0,0,SF_Values,0,0); + yymsp[-3].minor.yy399 = sqlite3SelectNew(pParse,yymsp[-1].minor.yy232,0,0,0,0,0,SF_Values,0); } break; - case 121: /* values ::= values COMMA LP exprlist RP */ + case 89: /* values ::= values COMMA LP exprlist RP */ { - Select *pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy14,0,0,0,0,0,SF_Values,0,0); + Select *pRight, *pLeft = yymsp[-4].minor.yy399; + pRight = sqlite3SelectNew(pParse,yymsp[-1].minor.yy232,0,0,0,0,0,SF_Values|SF_MultiValue,0); + if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; if( pRight ){ pRight->op = TK_ALL; - pRight->pPrior = yymsp[-4].minor.yy3; - yygotominor.yy3 = pRight; + pRight->pPrior = pLeft; + yymsp[-4].minor.yy399 = pRight; }else{ - yygotominor.yy3 = yymsp[-4].minor.yy3; + yymsp[-4].minor.yy399 = pLeft; } } break; - case 122: /* distinct ::= DISTINCT */ -{yygotominor.yy381 = SF_Distinct;} + case 90: /* distinct ::= DISTINCT */ +{yymsp[0].minor.yy502 = SF_Distinct;} break; - case 123: /* distinct ::= ALL */ - case 124: /* distinct ::= */ yytestcase(yyruleno==124); -{yygotominor.yy381 = 0;} + case 91: /* distinct ::= ALL */ +{yymsp[0].minor.yy502 = SF_All;} break; - case 125: /* sclp ::= selcollist COMMA */ - case 243: /* idxlist_opt ::= LP idxlist RP */ yytestcase(yyruleno==243); -{yygotominor.yy14 = yymsp[-1].minor.yy14;} + case 93: /* sclp ::= */ + case 126: /* orderby_opt ::= */ yytestcase(yyruleno==126); + case 133: /* groupby_opt ::= */ yytestcase(yyruleno==133); + case 212: /* exprlist ::= */ yytestcase(yyruleno==212); + case 215: /* paren_exprlist ::= */ yytestcase(yyruleno==215); + case 220: /* eidlist_opt ::= */ yytestcase(yyruleno==220); +{yymsp[1].minor.yy232 = 0;} break; - case 126: /* sclp ::= */ - case 154: /* orderby_opt ::= */ yytestcase(yyruleno==154); - case 161: /* groupby_opt ::= */ yytestcase(yyruleno==161); - case 236: /* exprlist ::= */ yytestcase(yyruleno==236); - case 242: /* idxlist_opt ::= */ yytestcase(yyruleno==242); -{yygotominor.yy14 = 0;} - break; - case 127: /* selcollist ::= sclp expr as */ + case 94: /* selcollist ::= sclp scanpt expr scanpt as */ { - yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy14, yymsp[-1].minor.yy346.pExpr); - if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[0].minor.yy0, 1); - sqlite3ExprListSetSpan(pParse,yygotominor.yy14,&yymsp[-1].minor.yy346); + yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy232, yymsp[-2].minor.yy182); + if( yymsp[0].minor.yy0.n>0 ) sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy232, &yymsp[0].minor.yy0, 1); + sqlite3ExprListSetSpan(pParse,yymsp[-4].minor.yy232,yymsp[-3].minor.yy36,yymsp[-1].minor.yy36); } break; - case 128: /* selcollist ::= sclp STAR */ + case 95: /* selcollist ::= sclp scanpt STAR */ { - Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); - yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-1].minor.yy14, p); + Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); + yymsp[-2].minor.yy232 = sqlite3ExprListAppend(pParse, yymsp[-2].minor.yy232, p); } break; - case 129: /* selcollist ::= sclp nm DOT STAR */ + case 96: /* selcollist ::= sclp scanpt nm DOT STAR */ { - Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &yymsp[0].minor.yy0); - Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); - Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); - yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14, pDot); + Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0); + Expr *pLeft = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy232, pDot); } break; - case 132: /* as ::= */ -{yygotominor.yy0.n = 0;} + case 97: /* as ::= AS nm */ + case 108: /* dbnm ::= DOT nm */ yytestcase(yyruleno==108); + case 234: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==234); + case 235: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==235); +{yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} break; - case 133: /* from ::= */ -{yygotominor.yy65 = sqlite3DbMallocZero(pParse->db, sizeof(*yygotominor.yy65));} + case 99: /* from ::= */ +{yymsp[1].minor.yy427 = sqlite3DbMallocZero(pParse->db, sizeof(*yymsp[1].minor.yy427));} break; - case 134: /* from ::= FROM seltablist */ + case 100: /* from ::= FROM seltablist */ { - yygotominor.yy65 = yymsp[0].minor.yy65; - sqlite3SrcListShiftJoinType(yygotominor.yy65); + yymsp[-1].minor.yy427 = yymsp[0].minor.yy427; + sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy427); } break; - case 135: /* stl_prefix ::= seltablist joinop */ + case 101: /* stl_prefix ::= seltablist joinop */ { - yygotominor.yy65 = yymsp[-1].minor.yy65; - if( ALWAYS(yygotominor.yy65 && yygotominor.yy65->nSrc>0) ) yygotominor.yy65->a[yygotominor.yy65->nSrc-1].jointype = (u8)yymsp[0].minor.yy328; + if( ALWAYS(yymsp[-1].minor.yy427 && yymsp[-1].minor.yy427->nSrc>0) ) yymsp[-1].minor.yy427->a[yymsp[-1].minor.yy427->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy502; } break; - case 136: /* stl_prefix ::= */ -{yygotominor.yy65 = 0;} + case 102: /* stl_prefix ::= */ +{yymsp[1].minor.yy427 = 0;} break; - case 137: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + case 103: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ { - yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); - sqlite3SrcListIndexedBy(pParse, yygotominor.yy65, &yymsp[-2].minor.yy0); + yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy182,yymsp[0].minor.yy510); + sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy427, &yymsp[-2].minor.yy0); } break; - case 138: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + case 104: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ { - yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy3,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); + yymsp[-8].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy427,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy182,yymsp[0].minor.yy510); + sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy427, yymsp[-4].minor.yy232); +} + break; + case 105: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ +{ + yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy399,yymsp[-1].minor.yy182,yymsp[0].minor.yy510); } break; - case 139: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + case 106: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ { - if( yymsp[-6].minor.yy65==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy132==0 && yymsp[0].minor.yy408==0 ){ - yygotominor.yy65 = yymsp[-4].minor.yy65; - }else if( yymsp[-4].minor.yy65->nSrc==1 ){ - yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); - if( yygotominor.yy65 ){ - struct SrcList_item *pNew = &yygotominor.yy65->a[yygotominor.yy65->nSrc-1]; - struct SrcList_item *pOld = yymsp[-4].minor.yy65->a; + if( yymsp[-6].minor.yy427==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy182==0 && yymsp[0].minor.yy510==0 ){ + yymsp[-6].minor.yy427 = yymsp[-4].minor.yy427; + }else if( yymsp[-4].minor.yy427->nSrc==1 ){ + yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy182,yymsp[0].minor.yy510); + if( yymsp[-6].minor.yy427 ){ + struct SrcList_item *pNew = &yymsp[-6].minor.yy427->a[yymsp[-6].minor.yy427->nSrc-1]; + struct SrcList_item *pOld = yymsp[-4].minor.yy427->a; pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } - sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy65); + sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy427); }else{ Select *pSubquery; - sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy65); - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy65,0,0,0,0,SF_NestedFrom,0,0); - yygotominor.yy65 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy65,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy132,yymsp[0].minor.yy408); + sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy427); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy427,0,0,0,0,SF_NestedFrom,0); + yymsp[-6].minor.yy427 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy427,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy182,yymsp[0].minor.yy510); } } break; - case 140: /* dbnm ::= */ - case 149: /* indexed_opt ::= */ yytestcase(yyruleno==149); -{yygotominor.yy0.z=0; yygotominor.yy0.n=0;} + case 107: /* dbnm ::= */ + case 121: /* indexed_opt ::= */ yytestcase(yyruleno==121); +{yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} break; - case 142: /* fullname ::= nm dbnm */ -{yygotominor.yy65 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0);} + case 109: /* fullname ::= nm */ + case 111: /* xfullname ::= nm */ yytestcase(yyruleno==111); +{yymsp[0].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} break; - case 143: /* joinop ::= COMMA|JOIN */ -{ yygotominor.yy328 = JT_INNER; } + case 110: /* fullname ::= nm DOT nm */ + case 112: /* xfullname ::= nm DOT nm */ yytestcase(yyruleno==112); +{yymsp[-2].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 144: /* joinop ::= JOIN_KW JOIN */ -{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); } - break; - case 145: /* joinop ::= JOIN_KW nm JOIN */ -{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); } - break; - case 146: /* joinop ::= JOIN_KW nm nm JOIN */ -{ yygotominor.yy328 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); } - break; - case 147: /* on_opt ::= ON expr */ - case 164: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==164); - case 171: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==171); - case 231: /* case_else ::= ELSE expr */ yytestcase(yyruleno==231); - case 233: /* case_operand ::= expr */ yytestcase(yyruleno==233); -{yygotominor.yy132 = yymsp[0].minor.yy346.pExpr;} - break; - case 148: /* on_opt ::= */ - case 163: /* having_opt ::= */ yytestcase(yyruleno==163); - case 170: /* where_opt ::= */ yytestcase(yyruleno==170); - case 232: /* case_else ::= */ yytestcase(yyruleno==232); - case 234: /* case_operand ::= */ yytestcase(yyruleno==234); -{yygotominor.yy132 = 0;} - break; - case 151: /* indexed_opt ::= NOT INDEXED */ -{yygotominor.yy0.z=0; yygotominor.yy0.n=1;} - break; - case 152: /* using_opt ::= USING LP idlist RP */ - case 180: /* inscollist_opt ::= LP idlist RP */ yytestcase(yyruleno==180); -{yygotominor.yy408 = yymsp[-1].minor.yy408;} - break; - case 153: /* using_opt ::= */ - case 179: /* inscollist_opt ::= */ yytestcase(yyruleno==179); -{yygotominor.yy408 = 0;} - break; - case 155: /* orderby_opt ::= ORDER BY sortlist */ - case 162: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==162); - case 235: /* exprlist ::= nexprlist */ yytestcase(yyruleno==235); -{yygotominor.yy14 = yymsp[0].minor.yy14;} - break; - case 156: /* sortlist ::= sortlist COMMA expr sortorder */ + case 113: /* xfullname ::= nm DOT nm AS nm */ { - yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy14,yymsp[-1].minor.yy346.pExpr); - if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; + yymsp[-4].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ + if( yymsp[-4].minor.yy427 ) yymsp[-4].minor.yy427->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 157: /* sortlist ::= expr sortorder */ -{ - yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy346.pExpr); - if( yygotominor.yy14 && ALWAYS(yygotominor.yy14->a) ) yygotominor.yy14->a[0].sortOrder = (u8)yymsp[0].minor.yy328; + case 114: /* xfullname ::= nm AS nm */ +{ + yymsp[-2].minor.yy427 = sqlite3SrcListAppend(pParse->db,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ + if( yymsp[-2].minor.yy427 ) yymsp[-2].minor.yy427->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 158: /* sortorder ::= ASC */ - case 160: /* sortorder ::= */ yytestcase(yyruleno==160); -{yygotominor.yy328 = SQLITE_SO_ASC;} + case 115: /* joinop ::= COMMA|JOIN */ +{ yymsp[0].minor.yy502 = JT_INNER; } break; - case 159: /* sortorder ::= DESC */ -{yygotominor.yy328 = SQLITE_SO_DESC;} + case 116: /* joinop ::= JOIN_KW JOIN */ +{yymsp[-1].minor.yy502 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} break; - case 165: /* limit_opt ::= */ -{yygotominor.yy476.pLimit = 0; yygotominor.yy476.pOffset = 0;} + case 117: /* joinop ::= JOIN_KW nm JOIN */ +{yymsp[-2].minor.yy502 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} break; - case 166: /* limit_opt ::= LIMIT expr */ -{yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr; yygotominor.yy476.pOffset = 0;} + case 118: /* joinop ::= JOIN_KW nm nm JOIN */ +{yymsp[-3].minor.yy502 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} break; - case 167: /* limit_opt ::= LIMIT expr OFFSET expr */ -{yygotominor.yy476.pLimit = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pOffset = yymsp[0].minor.yy346.pExpr;} + case 119: /* on_opt ::= ON expr */ + case 136: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==136); + case 143: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==143); + case 208: /* case_else ::= ELSE expr */ yytestcase(yyruleno==208); +{yymsp[-1].minor.yy182 = yymsp[0].minor.yy182;} break; - case 168: /* limit_opt ::= LIMIT expr COMMA expr */ -{yygotominor.yy476.pOffset = yymsp[-2].minor.yy346.pExpr; yygotominor.yy476.pLimit = yymsp[0].minor.yy346.pExpr;} + case 120: /* on_opt ::= */ + case 135: /* having_opt ::= */ yytestcase(yyruleno==135); + case 137: /* limit_opt ::= */ yytestcase(yyruleno==137); + case 142: /* where_opt ::= */ yytestcase(yyruleno==142); + case 209: /* case_else ::= */ yytestcase(yyruleno==209); + case 211: /* case_operand ::= */ yytestcase(yyruleno==211); +{yymsp[1].minor.yy182 = 0;} break; - case 169: /* cmd ::= with DELETE FROM fullname indexed_opt where_opt */ + case 122: /* indexed_opt ::= INDEXED BY nm */ +{yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} + break; + case 123: /* indexed_opt ::= NOT INDEXED */ +{yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} + break; + case 124: /* using_opt ::= USING LP idlist RP */ +{yymsp[-3].minor.yy510 = yymsp[-1].minor.yy510;} + break; + case 125: /* using_opt ::= */ + case 157: /* idlist_opt ::= */ yytestcase(yyruleno==157); +{yymsp[1].minor.yy510 = 0;} + break; + case 127: /* orderby_opt ::= ORDER BY sortlist */ + case 134: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==134); +{yymsp[-2].minor.yy232 = yymsp[0].minor.yy232;} + break; + case 128: /* sortlist ::= sortlist COMMA expr sortorder */ { - sqlite3WithPush(pParse, yymsp[-5].minor.yy59, 1); - sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy65, &yymsp[-1].minor.yy0); - sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy65,yymsp[0].minor.yy132); + yymsp[-3].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy232,yymsp[-1].minor.yy182); + sqlite3ExprListSetSortOrder(yymsp[-3].minor.yy232,yymsp[0].minor.yy502); } break; - case 172: /* cmd ::= with UPDATE orconf fullname indexed_opt SET setlist where_opt */ + case 129: /* sortlist ::= expr sortorder */ { - sqlite3WithPush(pParse, yymsp[-7].minor.yy59, 1); - sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy65, &yymsp[-3].minor.yy0); - sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy14,"set list"); - sqlite3Update(pParse,yymsp[-4].minor.yy65,yymsp[-1].minor.yy14,yymsp[0].minor.yy132,yymsp[-5].minor.yy186); + yymsp[-1].minor.yy232 = sqlite3ExprListAppend(pParse,0,yymsp[-1].minor.yy182); /*A-overwrites-Y*/ + sqlite3ExprListSetSortOrder(yymsp[-1].minor.yy232,yymsp[0].minor.yy502); } break; - case 173: /* setlist ::= setlist COMMA nm EQ expr */ + case 130: /* sortorder ::= ASC */ +{yymsp[0].minor.yy502 = SQLITE_SO_ASC;} + break; + case 131: /* sortorder ::= DESC */ +{yymsp[0].minor.yy502 = SQLITE_SO_DESC;} + break; + case 132: /* sortorder ::= */ +{yymsp[1].minor.yy502 = SQLITE_SO_UNDEFINED;} + break; + case 138: /* limit_opt ::= LIMIT expr */ +{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy182,0);} + break; + case 139: /* limit_opt ::= LIMIT expr OFFSET expr */ +{yymsp[-3].minor.yy182 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[-2].minor.yy182,yymsp[0].minor.yy182);} + break; + case 140: /* limit_opt ::= LIMIT expr COMMA expr */ +{yymsp[-3].minor.yy182 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy182,yymsp[-2].minor.yy182);} + break; + case 141: /* cmd ::= with DELETE FROM xfullname indexed_opt where_opt */ { - yygotominor.yy14 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy14, yymsp[0].minor.yy346.pExpr); - sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); + sqlite3SrcListIndexedBy(pParse, yymsp[-2].minor.yy427, &yymsp[-1].minor.yy0); + sqlite3DeleteFrom(pParse,yymsp[-2].minor.yy427,yymsp[0].minor.yy182,0,0); } break; - case 174: /* setlist ::= nm EQ expr */ + case 144: /* cmd ::= with UPDATE orconf xfullname indexed_opt SET setlist where_opt */ { - yygotominor.yy14 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy346.pExpr); - sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); + sqlite3SrcListIndexedBy(pParse, yymsp[-4].minor.yy427, &yymsp[-3].minor.yy0); + sqlite3ExprListCheckLength(pParse,yymsp[-1].minor.yy232,"set list"); + sqlite3Update(pParse,yymsp[-4].minor.yy427,yymsp[-1].minor.yy232,yymsp[0].minor.yy182,yymsp[-5].minor.yy502,0,0,0); } break; - case 175: /* cmd ::= with insert_cmd INTO fullname inscollist_opt select */ + case 145: /* setlist ::= setlist COMMA nm EQ expr */ { - sqlite3WithPush(pParse, yymsp[-5].minor.yy59, 1); - sqlite3Insert(pParse, yymsp[-2].minor.yy65, yymsp[0].minor.yy3, yymsp[-1].minor.yy408, yymsp[-4].minor.yy186); + yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse, yymsp[-4].minor.yy232, yymsp[0].minor.yy182); + sqlite3ExprListSetName(pParse, yymsp[-4].minor.yy232, &yymsp[-2].minor.yy0, 1); } break; - case 176: /* cmd ::= with insert_cmd INTO fullname inscollist_opt DEFAULT VALUES */ + case 146: /* setlist ::= setlist COMMA LP idlist RP EQ expr */ { - sqlite3WithPush(pParse, yymsp[-6].minor.yy59, 1); - sqlite3Insert(pParse, yymsp[-3].minor.yy65, 0, yymsp[-2].minor.yy408, yymsp[-5].minor.yy186); + yymsp[-6].minor.yy232 = sqlite3ExprListAppendVector(pParse, yymsp[-6].minor.yy232, yymsp[-3].minor.yy510, yymsp[0].minor.yy182); } break; - case 177: /* insert_cmd ::= INSERT orconf */ -{yygotominor.yy186 = yymsp[0].minor.yy186;} - break; - case 178: /* insert_cmd ::= REPLACE */ -{yygotominor.yy186 = OE_Replace;} - break; - case 181: /* idlist ::= idlist COMMA nm */ -{yygotominor.yy408 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy408,&yymsp[0].minor.yy0);} - break; - case 182: /* idlist ::= nm */ -{yygotominor.yy408 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0);} - break; - case 183: /* expr ::= term */ -{yygotominor.yy346 = yymsp[0].minor.yy346;} - break; - case 184: /* expr ::= LP expr RP */ -{yygotominor.yy346.pExpr = yymsp[-1].minor.yy346.pExpr; spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0);} - break; - case 185: /* term ::= NULL */ - case 190: /* term ::= INTEGER|FLOAT|BLOB */ yytestcase(yyruleno==190); - case 191: /* term ::= STRING */ yytestcase(yyruleno==191); -{spanExpr(&yygotominor.yy346, pParse, yymsp[0].major, &yymsp[0].minor.yy0);} - break; - case 186: /* expr ::= ID|INDEXED */ - case 187: /* expr ::= JOIN_KW */ yytestcase(yyruleno==187); -{spanExpr(&yygotominor.yy346, pParse, TK_ID, &yymsp[0].minor.yy0);} - break; - case 188: /* expr ::= nm DOT nm */ + case 147: /* setlist ::= nm EQ expr */ { - Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); - Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0); - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp2, 0); - spanSet(&yygotominor.yy346,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); + yylhsminor.yy232 = sqlite3ExprListAppend(pParse, 0, yymsp[0].minor.yy182); + sqlite3ExprListSetName(pParse, yylhsminor.yy232, &yymsp[-2].minor.yy0, 1); +} + yymsp[-2].minor.yy232 = yylhsminor.yy232; + break; + case 148: /* setlist ::= LP idlist RP EQ expr */ +{ + yymsp[-4].minor.yy232 = sqlite3ExprListAppendVector(pParse, 0, yymsp[-3].minor.yy510, yymsp[0].minor.yy182); } break; - case 189: /* expr ::= nm DOT nm DOT nm */ + case 149: /* cmd ::= with insert_cmd INTO xfullname idlist_opt select upsert */ { - Expr *temp1 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-4].minor.yy0); - Expr *temp2 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[-2].minor.yy0); - Expr *temp3 = sqlite3PExpr(pParse, TK_ID, 0, 0, &yymsp[0].minor.yy0); - Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3, 0); - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_DOT, temp1, temp4, 0); - spanSet(&yygotominor.yy346,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); + sqlite3Insert(pParse, yymsp[-3].minor.yy427, yymsp[-1].minor.yy399, yymsp[-2].minor.yy510, yymsp[-5].minor.yy502, yymsp[0].minor.yy198); } break; - case 192: /* expr ::= VARIABLE */ + case 150: /* cmd ::= with insert_cmd INTO xfullname idlist_opt DEFAULT VALUES */ { - if( yymsp[0].minor.yy0.n>=2 && yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1]) ){ + sqlite3Insert(pParse, yymsp[-3].minor.yy427, 0, yymsp[-2].minor.yy510, yymsp[-5].minor.yy502, 0); +} + break; + case 151: /* upsert ::= */ +{ yymsp[1].minor.yy198 = 0; } + break; + case 152: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO UPDATE SET setlist where_opt */ +{ yymsp[-10].minor.yy198 = sqlite3UpsertNew(pParse->db,yymsp[-7].minor.yy232,yymsp[-5].minor.yy182,yymsp[-1].minor.yy232,yymsp[0].minor.yy182);} + break; + case 153: /* upsert ::= ON CONFLICT LP sortlist RP where_opt DO NOTHING */ +{ yymsp[-7].minor.yy198 = sqlite3UpsertNew(pParse->db,yymsp[-4].minor.yy232,yymsp[-2].minor.yy182,0,0); } + break; + case 154: /* upsert ::= ON CONFLICT DO NOTHING */ +{ yymsp[-3].minor.yy198 = sqlite3UpsertNew(pParse->db,0,0,0,0); } + break; + case 158: /* idlist_opt ::= LP idlist RP */ +{yymsp[-2].minor.yy510 = yymsp[-1].minor.yy510;} + break; + case 159: /* idlist ::= idlist COMMA nm */ +{yymsp[-2].minor.yy510 = sqlite3IdListAppend(pParse->db,yymsp[-2].minor.yy510,&yymsp[0].minor.yy0);} + break; + case 160: /* idlist ::= nm */ +{yymsp[0].minor.yy510 = sqlite3IdListAppend(pParse->db,0,&yymsp[0].minor.yy0); /*A-overwrites-Y*/} + break; + case 161: /* expr ::= LP expr RP */ +{yymsp[-2].minor.yy182 = yymsp[-1].minor.yy182;} + break; + case 162: /* expr ::= ID|INDEXED */ + case 163: /* expr ::= JOIN_KW */ yytestcase(yyruleno==163); +{yymsp[0].minor.yy182=tokenExpr(pParse,TK_ID,yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 164: /* expr ::= nm DOT nm */ +{ + Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); + yylhsminor.yy182 = sqlite3PExpr(pParse, TK_DOT, temp1, temp2); +} + yymsp[-2].minor.yy182 = yylhsminor.yy182; + break; + case 165: /* expr ::= nm DOT nm DOT nm */ +{ + Expr *temp1 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-4].minor.yy0, 1); + Expr *temp2 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[-2].minor.yy0, 1); + Expr *temp3 = sqlite3ExprAlloc(pParse->db, TK_ID, &yymsp[0].minor.yy0, 1); + Expr *temp4 = sqlite3PExpr(pParse, TK_DOT, temp2, temp3); + yylhsminor.yy182 = sqlite3PExpr(pParse, TK_DOT, temp1, temp4); +} + yymsp[-4].minor.yy182 = yylhsminor.yy182; + break; + case 166: /* term ::= NULL|FLOAT|BLOB */ + case 167: /* term ::= STRING */ yytestcase(yyruleno==167); +{yymsp[0].minor.yy182=tokenExpr(pParse,yymsp[0].major,yymsp[0].minor.yy0); /*A-overwrites-X*/} + break; + case 168: /* term ::= INTEGER */ +{ + yylhsminor.yy182 = sqlite3ExprAlloc(pParse->db, TK_INTEGER, &yymsp[0].minor.yy0, 1); +} + yymsp[0].minor.yy182 = yylhsminor.yy182; + break; + case 169: /* expr ::= VARIABLE */ +{ + if( !(yymsp[0].minor.yy0.z[0]=='#' && sqlite3Isdigit(yymsp[0].minor.yy0.z[1])) ){ + u32 n = yymsp[0].minor.yy0.n; + yymsp[0].minor.yy182 = tokenExpr(pParse, TK_VARIABLE, yymsp[0].minor.yy0); + sqlite3ExprAssignVarNumber(pParse, yymsp[0].minor.yy182, n); + }else{ /* When doing a nested parse, one can include terms in an expression ** that look like this: #1 #2 ... These terms refer to registers ** in the virtual machine. #N is the N-th register. */ + Token t = yymsp[0].minor.yy0; /*A-overwrites-X*/ + assert( t.n>=2 ); if( pParse->nested==0 ){ - sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &yymsp[0].minor.yy0); - yygotominor.yy346.pExpr = 0; + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &t); + yymsp[0].minor.yy182 = 0; }else{ - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &yymsp[0].minor.yy0); - if( yygotominor.yy346.pExpr ) sqlite3GetInt32(&yymsp[0].minor.yy0.z[1], &yygotominor.yy346.pExpr->iTable); + yymsp[0].minor.yy182 = sqlite3PExpr(pParse, TK_REGISTER, 0, 0); + if( yymsp[0].minor.yy182 ) sqlite3GetInt32(&t.z[1], &yymsp[0].minor.yy182->iTable); } - }else{ - spanExpr(&yygotominor.yy346, pParse, TK_VARIABLE, &yymsp[0].minor.yy0); - sqlite3ExprAssignVarNumber(pParse, yygotominor.yy346.pExpr); } - spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); } break; - case 193: /* expr ::= expr COLLATE ID|STRING */ + case 170: /* expr ::= expr COLLATE ID|STRING */ { - yygotominor.yy346.pExpr = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy346.pExpr, &yymsp[0].minor.yy0); - yygotominor.yy346.zStart = yymsp[-2].minor.yy346.zStart; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; + yymsp[-2].minor.yy182 = sqlite3ExprAddCollateToken(pParse, yymsp[-2].minor.yy182, &yymsp[0].minor.yy0, 1); } break; - case 194: /* expr ::= CAST LP expr AS typetoken RP */ + case 171: /* expr ::= CAST LP expr AS typetoken RP */ { - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CAST, yymsp[-3].minor.yy346.pExpr, 0, &yymsp[-1].minor.yy0); - spanSet(&yygotominor.yy346,&yymsp[-5].minor.yy0,&yymsp[0].minor.yy0); + yymsp[-5].minor.yy182 = sqlite3ExprAlloc(pParse->db, TK_CAST, &yymsp[-1].minor.yy0, 1); + sqlite3ExprAttachSubtrees(pParse->db, yymsp[-5].minor.yy182, yymsp[-3].minor.yy182, 0); } break; - case 195: /* expr ::= ID|INDEXED LP distinct exprlist RP */ + case 172: /* expr ::= ID|INDEXED LP distinct exprlist RP */ { - if( yymsp[-1].minor.yy14 && yymsp[-1].minor.yy14->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ + if( yymsp[-1].minor.yy232 && yymsp[-1].minor.yy232->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ sqlite3ErrorMsg(pParse, "too many arguments on function %T", &yymsp[-4].minor.yy0); } - yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy14, &yymsp[-4].minor.yy0); - spanSet(&yygotominor.yy346,&yymsp[-4].minor.yy0,&yymsp[0].minor.yy0); - if( yymsp[-2].minor.yy381 && yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->flags |= EP_Distinct; + yylhsminor.yy182 = sqlite3ExprFunction(pParse, yymsp[-1].minor.yy232, &yymsp[-4].minor.yy0); + if( yymsp[-2].minor.yy502==SF_Distinct && yylhsminor.yy182 ){ + yylhsminor.yy182->flags |= EP_Distinct; + } +} + yymsp[-4].minor.yy182 = yylhsminor.yy182; + break; + case 173: /* expr ::= ID|INDEXED LP STAR RP */ +{ + yylhsminor.yy182 = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0); +} + yymsp[-3].minor.yy182 = yylhsminor.yy182; + break; + case 174: /* term ::= CTIME_KW */ +{ + yylhsminor.yy182 = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0); +} + yymsp[0].minor.yy182 = yylhsminor.yy182; + break; + case 175: /* expr ::= LP nexprlist COMMA expr RP */ +{ + ExprList *pList = sqlite3ExprListAppend(pParse, yymsp[-3].minor.yy232, yymsp[-1].minor.yy182); + yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); + if( yymsp[-4].minor.yy182 ){ + yymsp[-4].minor.yy182->x.pList = pList; + }else{ + sqlite3ExprListDelete(pParse->db, pList); } } break; - case 196: /* expr ::= ID|INDEXED LP STAR RP */ -{ - yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[-3].minor.yy0); - spanSet(&yygotominor.yy346,&yymsp[-3].minor.yy0,&yymsp[0].minor.yy0); -} + case 176: /* expr ::= expr AND expr */ + case 177: /* expr ::= expr OR expr */ yytestcase(yyruleno==177); + case 178: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==178); + case 179: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==179); + case 180: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==180); + case 181: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==181); + case 182: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==182); + case 183: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==183); +{yymsp[-2].minor.yy182=sqlite3PExpr(pParse,yymsp[-1].major,yymsp[-2].minor.yy182,yymsp[0].minor.yy182);} break; - case 197: /* term ::= CTIME_KW */ -{ - yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, 0, &yymsp[0].minor.yy0); - spanSet(&yygotominor.yy346, &yymsp[0].minor.yy0, &yymsp[0].minor.yy0); -} + case 184: /* likeop ::= NOT LIKE_KW|MATCH */ +{yymsp[-1].minor.yy0=yymsp[0].minor.yy0; yymsp[-1].minor.yy0.n|=0x80000000; /*yymsp[-1].minor.yy0-overwrite-yymsp[0].minor.yy0*/} break; - case 198: /* expr ::= expr AND expr */ - case 199: /* expr ::= expr OR expr */ yytestcase(yyruleno==199); - case 200: /* expr ::= expr LT|GT|GE|LE expr */ yytestcase(yyruleno==200); - case 201: /* expr ::= expr EQ|NE expr */ yytestcase(yyruleno==201); - case 202: /* expr ::= expr BITAND|BITOR|LSHIFT|RSHIFT expr */ yytestcase(yyruleno==202); - case 203: /* expr ::= expr PLUS|MINUS expr */ yytestcase(yyruleno==203); - case 204: /* expr ::= expr STAR|SLASH|REM expr */ yytestcase(yyruleno==204); - case 205: /* expr ::= expr CONCAT expr */ yytestcase(yyruleno==205); -{spanBinaryExpr(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346);} - break; - case 206: /* likeop ::= LIKE_KW|MATCH */ -{yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.bNot = 0;} - break; - case 207: /* likeop ::= NOT LIKE_KW|MATCH */ -{yygotominor.yy96.eOperator = yymsp[0].minor.yy0; yygotominor.yy96.bNot = 1;} - break; - case 208: /* expr ::= expr likeop expr */ + case 185: /* expr ::= expr likeop expr */ { ExprList *pList; - pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy346.pExpr); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy346.pExpr); - yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy96.eOperator); - if( yymsp[-1].minor.yy96.bNot ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); - yygotominor.yy346.zStart = yymsp[-2].minor.yy346.zStart; - yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd; - if( yygotominor.yy346.pExpr ) yygotominor.yy346.pExpr->flags |= EP_InfixFunc; + int bNot = yymsp[-1].minor.yy0.n & 0x80000000; + yymsp[-1].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[0].minor.yy182); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-2].minor.yy182); + yymsp[-2].minor.yy182 = sqlite3ExprFunction(pParse, pList, &yymsp[-1].minor.yy0); + if( bNot ) yymsp[-2].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-2].minor.yy182, 0); + if( yymsp[-2].minor.yy182 ) yymsp[-2].minor.yy182->flags |= EP_InfixFunc; } break; - case 209: /* expr ::= expr likeop expr ESCAPE expr */ + case 186: /* expr ::= expr likeop expr ESCAPE expr */ { ExprList *pList; - pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy346.pExpr); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy346.pExpr); - yygotominor.yy346.pExpr = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy96.eOperator); - if( yymsp[-3].minor.yy96.bNot ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); - yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; - yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd; - if( yygotominor.yy346.pExpr ) yygotominor.yy346.pExpr->flags |= EP_InfixFunc; + int bNot = yymsp[-3].minor.yy0.n & 0x80000000; + yymsp[-3].minor.yy0.n &= 0x7fffffff; + pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy182); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[-4].minor.yy182); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy182); + yymsp[-4].minor.yy182 = sqlite3ExprFunction(pParse, pList, &yymsp[-3].minor.yy0); + if( bNot ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0); + if( yymsp[-4].minor.yy182 ) yymsp[-4].minor.yy182->flags |= EP_InfixFunc; } break; - case 210: /* expr ::= expr ISNULL|NOTNULL */ -{spanUnaryPostfix(&yygotominor.yy346,pParse,yymsp[0].major,&yymsp[-1].minor.yy346,&yymsp[0].minor.yy0);} + case 187: /* expr ::= expr ISNULL|NOTNULL */ +{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse,yymsp[0].major,yymsp[-1].minor.yy182,0);} break; - case 211: /* expr ::= expr NOT NULL */ -{spanUnaryPostfix(&yygotominor.yy346,pParse,TK_NOTNULL,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy0);} + case 188: /* expr ::= expr NOT NULL */ +{yymsp[-2].minor.yy182 = sqlite3PExpr(pParse,TK_NOTNULL,yymsp[-2].minor.yy182,0);} break; - case 212: /* expr ::= expr IS expr */ + case 189: /* expr ::= expr IS expr */ { - spanBinaryExpr(&yygotominor.yy346,pParse,TK_IS,&yymsp[-2].minor.yy346,&yymsp[0].minor.yy346); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy346.pExpr, yygotominor.yy346.pExpr, TK_ISNULL); + yymsp[-2].minor.yy182 = sqlite3PExpr(pParse,TK_IS,yymsp[-2].minor.yy182,yymsp[0].minor.yy182); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy182, yymsp[-2].minor.yy182, TK_ISNULL); } break; - case 213: /* expr ::= expr IS NOT expr */ + case 190: /* expr ::= expr IS NOT expr */ { - spanBinaryExpr(&yygotominor.yy346,pParse,TK_ISNOT,&yymsp[-3].minor.yy346,&yymsp[0].minor.yy346); - binaryToUnaryIfNull(pParse, yymsp[0].minor.yy346.pExpr, yygotominor.yy346.pExpr, TK_NOTNULL); + yymsp[-3].minor.yy182 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-3].minor.yy182,yymsp[0].minor.yy182); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy182, yymsp[-3].minor.yy182, TK_NOTNULL); } break; - case 214: /* expr ::= NOT expr */ - case 215: /* expr ::= BITNOT expr */ yytestcase(yyruleno==215); -{spanUnaryPrefix(&yygotominor.yy346,pParse,yymsp[-1].major,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} + case 191: /* expr ::= NOT expr */ + case 192: /* expr ::= BITNOT expr */ yytestcase(yyruleno==192); +{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy182, 0);/*A-overwrites-B*/} break; - case 216: /* expr ::= MINUS expr */ -{spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UMINUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} + case 193: /* expr ::= MINUS expr */ +{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse, TK_UMINUS, yymsp[0].minor.yy182, 0);} break; - case 217: /* expr ::= PLUS expr */ -{spanUnaryPrefix(&yygotominor.yy346,pParse,TK_UPLUS,&yymsp[0].minor.yy346,&yymsp[-1].minor.yy0);} + case 194: /* expr ::= PLUS expr */ +{yymsp[-1].minor.yy182 = sqlite3PExpr(pParse, TK_UPLUS, yymsp[0].minor.yy182, 0);} break; - case 220: /* expr ::= expr between_op expr AND expr */ + case 195: /* between_op ::= BETWEEN */ + case 198: /* in_op ::= IN */ yytestcase(yyruleno==198); +{yymsp[0].minor.yy502 = 0;} + break; + case 197: /* expr ::= expr between_op expr AND expr */ { - ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); - pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy346.pExpr); - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy346.pExpr, 0, 0); - if( yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->x.pList = pList; + ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy182); + pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy182); + yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_BETWEEN, yymsp[-4].minor.yy182, 0); + if( yymsp[-4].minor.yy182 ){ + yymsp[-4].minor.yy182->x.pList = pList; }else{ sqlite3ExprListDelete(pParse->db, pList); } - if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); - yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; - yygotominor.yy346.zEnd = yymsp[0].minor.yy346.zEnd; + if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0); } break; - case 223: /* expr ::= expr in_op LP exprlist RP */ + case 200: /* expr ::= expr in_op LP exprlist RP */ { - if( yymsp[-1].minor.yy14==0 ){ + if( yymsp[-1].minor.yy232==0 ){ /* Expressions of the form ** ** expr1 IN () @@ -124540,9 +144770,9 @@ static void yy_reduce( ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_INTEGER, 0, 0, &sqlite3IntTokens[yymsp[-3].minor.yy328]); - sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy346.pExpr); - }else if( yymsp[-1].minor.yy14->nExpr==1 ){ + sqlite3ExprDelete(pParse->db, yymsp[-4].minor.yy182); + yymsp[-4].minor.yy182 = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[yymsp[-3].minor.yy502],1); + }else if( yymsp[-1].minor.yy232->nExpr==1 ){ /* Expressions of the form: ** ** expr1 IN (?1) @@ -124559,435 +144789,413 @@ static void yy_reduce( ** affinity or the collating sequence to use for comparison. Otherwise, ** the semantics would be subtly different from IN or NOT IN. */ - Expr *pRHS = yymsp[-1].minor.yy14->a[0].pExpr; - yymsp[-1].minor.yy14->a[0].pExpr = 0; - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy14); + Expr *pRHS = yymsp[-1].minor.yy232->a[0].pExpr; + yymsp[-1].minor.yy232->a[0].pExpr = 0; + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy232); /* pRHS cannot be NULL because a malloc error would have been detected ** before now and control would have never reached this point */ if( ALWAYS(pRHS) ){ pRHS->flags &= ~EP_Collate; pRHS->flags |= EP_Generic; } - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, yymsp[-3].minor.yy328 ? TK_NE : TK_EQ, yymsp[-4].minor.yy346.pExpr, pRHS, 0); + yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, yymsp[-3].minor.yy502 ? TK_NE : TK_EQ, yymsp[-4].minor.yy182, pRHS); }else{ - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0); - if( yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->x.pList = yymsp[-1].minor.yy14; - sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); + yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy182, 0); + if( yymsp[-4].minor.yy182 ){ + yymsp[-4].minor.yy182->x.pList = yymsp[-1].minor.yy232; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy182); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy14); + sqlite3ExprListDelete(pParse->db, yymsp[-1].minor.yy232); } - if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); + if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0); } - yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 224: /* expr ::= LP select RP */ + case 201: /* expr ::= LP select RP */ { - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); - if( yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->x.pSelect = yymsp[-1].minor.yy3; - ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect); - sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ - sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3); - } - yygotominor.yy346.zStart = yymsp[-2].minor.yy0.z; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; + yymsp[-2].minor.yy182 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); + sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy182, yymsp[-1].minor.yy399); } break; - case 225: /* expr ::= expr in_op LP select RP */ + case 202: /* expr ::= expr in_op LP select RP */ { - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy346.pExpr, 0, 0); - if( yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->x.pSelect = yymsp[-1].minor.yy3; - ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect); - sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ - sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3); - } - if( yymsp[-3].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); - yygotominor.yy346.zStart = yymsp[-4].minor.yy346.zStart; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; + yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy182, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy182, yymsp[-1].minor.yy399); + if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0); } break; - case 226: /* expr ::= expr in_op nm dbnm */ + case 203: /* expr ::= expr in_op nm dbnm paren_exprlist */ { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0); - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_IN, yymsp[-3].minor.yy346.pExpr, 0, 0); - if( yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); - ExprSetProperty(yygotominor.yy346.pExpr, EP_xIsSelect); - sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); - }else{ - sqlite3SrcListDelete(pParse->db, pSrc); - } - if( yymsp[-2].minor.yy328 ) yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_NOT, yygotominor.yy346.pExpr, 0, 0); - yygotominor.yy346.zStart = yymsp[-3].minor.yy346.zStart; - yygotominor.yy346.zEnd = yymsp[0].minor.yy0.z ? &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n] : &yymsp[-1].minor.yy0.z[yymsp[-1].minor.yy0.n]; + SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); + Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); + if( yymsp[0].minor.yy232 ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, yymsp[0].minor.yy232); + yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy182, 0); + sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy182, pSelect); + if( yymsp[-3].minor.yy502 ) yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy182, 0); } break; - case 227: /* expr ::= EXISTS LP select RP */ + case 204: /* expr ::= EXISTS LP select RP */ { - Expr *p = yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); - if( p ){ - p->x.pSelect = yymsp[-1].minor.yy3; - ExprSetProperty(p, EP_xIsSelect); - sqlite3ExprSetHeight(pParse, p); - }else{ - sqlite3SelectDelete(pParse->db, yymsp[-1].minor.yy3); - } - yygotominor.yy346.zStart = yymsp[-3].minor.yy0.z; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; + Expr *p; + p = yymsp[-3].minor.yy182 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); + sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy399); } break; - case 228: /* expr ::= CASE case_operand case_exprlist case_else END */ + case 205: /* expr ::= CASE case_operand case_exprlist case_else END */ { - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy132, 0, 0); - if( yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->x.pList = yymsp[-1].minor.yy132 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[-1].minor.yy132) : yymsp[-2].minor.yy14; - sqlite3ExprSetHeight(pParse, yygotominor.yy346.pExpr); + yymsp[-4].minor.yy182 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy182, 0); + if( yymsp[-4].minor.yy182 ){ + yymsp[-4].minor.yy182->x.pList = yymsp[-1].minor.yy182 ? sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy232,yymsp[-1].minor.yy182) : yymsp[-2].minor.yy232; + sqlite3ExprSetHeightAndFlags(pParse, yymsp[-4].minor.yy182); }else{ - sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy14); - sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy132); + sqlite3ExprListDelete(pParse->db, yymsp[-2].minor.yy232); + sqlite3ExprDelete(pParse->db, yymsp[-1].minor.yy182); } - yygotominor.yy346.zStart = yymsp[-4].minor.yy0.z; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 229: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 206: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { - yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, yymsp[-2].minor.yy346.pExpr); - yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr); + yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy232, yymsp[-2].minor.yy182); + yymsp[-4].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy232, yymsp[0].minor.yy182); } break; - case 230: /* case_exprlist ::= WHEN expr THEN expr */ + case 207: /* case_exprlist ::= WHEN expr THEN expr */ { - yygotominor.yy14 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy346.pExpr); - yygotominor.yy14 = sqlite3ExprListAppend(pParse,yygotominor.yy14, yymsp[0].minor.yy346.pExpr); + yymsp[-3].minor.yy232 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy182); + yymsp[-3].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy232, yymsp[0].minor.yy182); } break; - case 237: /* nexprlist ::= nexprlist COMMA expr */ -{yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy14,yymsp[0].minor.yy346.pExpr);} + case 210: /* case_operand ::= expr */ +{yymsp[0].minor.yy182 = yymsp[0].minor.yy182; /*A-overwrites-X*/} break; - case 238: /* nexprlist ::= expr */ -{yygotominor.yy14 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy346.pExpr);} + case 213: /* nexprlist ::= nexprlist COMMA expr */ +{yymsp[-2].minor.yy232 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy232,yymsp[0].minor.yy182);} break; - case 239: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP idxlist RP where_opt */ + case 214: /* nexprlist ::= expr */ +{yymsp[0].minor.yy232 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy182); /*A-overwrites-Y*/} + break; + case 216: /* paren_exprlist ::= LP exprlist RP */ + case 221: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==221); +{yymsp[-2].minor.yy232 = yymsp[-1].minor.yy232;} + break; + case 217: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, - sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy14, yymsp[-10].minor.yy328, - &yymsp[-11].minor.yy0, yymsp[0].minor.yy132, SQLITE_SO_ASC, yymsp[-8].minor.yy328); + sqlite3SrcListAppend(pParse->db,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy232, yymsp[-10].minor.yy502, + &yymsp[-11].minor.yy0, yymsp[0].minor.yy182, SQLITE_SO_ASC, yymsp[-8].minor.yy502, SQLITE_IDXTYPE_APPDEF); } break; - case 240: /* uniqueflag ::= UNIQUE */ - case 291: /* raisetype ::= ABORT */ yytestcase(yyruleno==291); -{yygotominor.yy328 = OE_Abort;} + case 218: /* uniqueflag ::= UNIQUE */ + case 258: /* raisetype ::= ABORT */ yytestcase(yyruleno==258); +{yymsp[0].minor.yy502 = OE_Abort;} break; - case 241: /* uniqueflag ::= */ -{yygotominor.yy328 = OE_None;} + case 219: /* uniqueflag ::= */ +{yymsp[1].minor.yy502 = OE_None;} break; - case 244: /* idxlist ::= idxlist COMMA nm collate sortorder */ + case 222: /* eidlist ::= eidlist COMMA nm collate sortorder */ { - Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &yymsp[-1].minor.yy0); - yygotominor.yy14 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy14, p); - sqlite3ExprListSetName(pParse,yygotominor.yy14,&yymsp[-2].minor.yy0,1); - sqlite3ExprListCheckLength(pParse, yygotominor.yy14, "index"); - if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; + yymsp[-4].minor.yy232 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy232, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy502, yymsp[0].minor.yy502); } break; - case 245: /* idxlist ::= nm collate sortorder */ + case 223: /* eidlist ::= nm collate sortorder */ { - Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &yymsp[-1].minor.yy0); - yygotominor.yy14 = sqlite3ExprListAppend(pParse,0, p); - sqlite3ExprListSetName(pParse, yygotominor.yy14, &yymsp[-2].minor.yy0, 1); - sqlite3ExprListCheckLength(pParse, yygotominor.yy14, "index"); - if( yygotominor.yy14 ) yygotominor.yy14->a[yygotominor.yy14->nExpr-1].sortOrder = (u8)yymsp[0].minor.yy328; + yymsp[-2].minor.yy232 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy502, yymsp[0].minor.yy502); /*A-overwrites-Y*/ } break; - case 246: /* collate ::= */ -{yygotominor.yy0.z = 0; yygotominor.yy0.n = 0;} + case 226: /* cmd ::= DROP INDEX ifexists fullname */ +{sqlite3DropIndex(pParse, yymsp[0].minor.yy427, yymsp[-1].minor.yy502);} break; - case 248: /* cmd ::= DROP INDEX ifexists fullname */ -{sqlite3DropIndex(pParse, yymsp[0].minor.yy65, yymsp[-1].minor.yy328);} + case 227: /* cmd ::= VACUUM */ +{sqlite3Vacuum(pParse,0);} break; - case 249: /* cmd ::= VACUUM */ - case 250: /* cmd ::= VACUUM nm */ yytestcase(yyruleno==250); -{sqlite3Vacuum(pParse);} + case 228: /* cmd ::= VACUUM nm */ +{sqlite3Vacuum(pParse,&yymsp[0].minor.yy0);} break; - case 251: /* cmd ::= PRAGMA nm dbnm */ + case 229: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 252: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 230: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 253: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 231: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 254: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 232: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 255: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 233: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 264: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 236: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; all.n = (int)(yymsp[0].minor.yy0.z - yymsp[-3].minor.yy0.z) + yymsp[0].minor.yy0.n; - sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy473, &all); + sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy47, &all); } break; - case 265: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 237: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { - sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy328, yymsp[-4].minor.yy378.a, yymsp[-4].minor.yy378.b, yymsp[-2].minor.yy65, yymsp[0].minor.yy132, yymsp[-10].minor.yy328, yymsp[-8].minor.yy328); - yygotominor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); + sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy502, yymsp[-4].minor.yy300.a, yymsp[-4].minor.yy300.b, yymsp[-2].minor.yy427, yymsp[0].minor.yy182, yymsp[-10].minor.yy502, yymsp[-8].minor.yy502); + yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ } break; - case 266: /* trigger_time ::= BEFORE */ - case 269: /* trigger_time ::= */ yytestcase(yyruleno==269); -{ yygotominor.yy328 = TK_BEFORE; } + case 238: /* trigger_time ::= BEFORE|AFTER */ +{ yymsp[0].minor.yy502 = yymsp[0].major; /*A-overwrites-X*/ } break; - case 267: /* trigger_time ::= AFTER */ -{ yygotominor.yy328 = TK_AFTER; } + case 239: /* trigger_time ::= INSTEAD OF */ +{ yymsp[-1].minor.yy502 = TK_INSTEAD;} break; - case 268: /* trigger_time ::= INSTEAD OF */ -{ yygotominor.yy328 = TK_INSTEAD;} + case 240: /* trigger_time ::= */ +{ yymsp[1].minor.yy502 = TK_BEFORE; } break; - case 270: /* trigger_event ::= DELETE|INSERT */ - case 271: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==271); -{yygotominor.yy378.a = yymsp[0].major; yygotominor.yy378.b = 0;} + case 241: /* trigger_event ::= DELETE|INSERT */ + case 242: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==242); +{yymsp[0].minor.yy300.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy300.b = 0;} break; - case 272: /* trigger_event ::= UPDATE OF idlist */ -{yygotominor.yy378.a = TK_UPDATE; yygotominor.yy378.b = yymsp[0].minor.yy408;} + case 243: /* trigger_event ::= UPDATE OF idlist */ +{yymsp[-2].minor.yy300.a = TK_UPDATE; yymsp[-2].minor.yy300.b = yymsp[0].minor.yy510;} break; - case 275: /* when_clause ::= */ - case 296: /* key_opt ::= */ yytestcase(yyruleno==296); -{ yygotominor.yy132 = 0; } + case 244: /* when_clause ::= */ + case 263: /* key_opt ::= */ yytestcase(yyruleno==263); +{ yymsp[1].minor.yy182 = 0; } break; - case 276: /* when_clause ::= WHEN expr */ - case 297: /* key_opt ::= KEY expr */ yytestcase(yyruleno==297); -{ yygotominor.yy132 = yymsp[0].minor.yy346.pExpr; } + case 245: /* when_clause ::= WHEN expr */ + case 264: /* key_opt ::= KEY expr */ yytestcase(yyruleno==264); +{ yymsp[-1].minor.yy182 = yymsp[0].minor.yy182; } break; - case 277: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 246: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { - assert( yymsp[-2].minor.yy473!=0 ); - yymsp[-2].minor.yy473->pLast->pNext = yymsp[-1].minor.yy473; - yymsp[-2].minor.yy473->pLast = yymsp[-1].minor.yy473; - yygotominor.yy473 = yymsp[-2].minor.yy473; + assert( yymsp[-2].minor.yy47!=0 ); + yymsp[-2].minor.yy47->pLast->pNext = yymsp[-1].minor.yy47; + yymsp[-2].minor.yy47->pLast = yymsp[-1].minor.yy47; } break; - case 278: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 247: /* trigger_cmd_list ::= trigger_cmd SEMI */ { - assert( yymsp[-1].minor.yy473!=0 ); - yymsp[-1].minor.yy473->pLast = yymsp[-1].minor.yy473; - yygotominor.yy473 = yymsp[-1].minor.yy473; + assert( yymsp[-1].minor.yy47!=0 ); + yymsp[-1].minor.yy47->pLast = yymsp[-1].minor.yy47; } break; - case 280: /* trnm ::= nm DOT nm */ + case 248: /* trnm ::= nm DOT nm */ { - yygotominor.yy0 = yymsp[0].minor.yy0; + yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, "qualified table names are not allowed on INSERT, UPDATE, and DELETE " "statements within triggers"); } break; - case 282: /* tridxby ::= INDEXED BY nm */ + case 249: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 283: /* tridxby ::= NOT INDEXED */ + case 250: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 284: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt */ -{ yygotominor.yy473 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-4].minor.yy0, yymsp[-1].minor.yy14, yymsp[0].minor.yy132, yymsp[-5].minor.yy186); } + case 251: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist where_opt scanpt */ +{yylhsminor.yy47 = sqlite3TriggerUpdateStep(pParse->db, &yymsp[-5].minor.yy0, yymsp[-2].minor.yy232, yymsp[-1].minor.yy182, yymsp[-6].minor.yy502, yymsp[-7].minor.yy0.z, yymsp[0].minor.yy36);} + yymsp[-7].minor.yy47 = yylhsminor.yy47; break; - case 285: /* trigger_cmd ::= insert_cmd INTO trnm inscollist_opt select */ -{yygotominor.yy473 = sqlite3TriggerInsertStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy408, yymsp[0].minor.yy3, yymsp[-4].minor.yy186);} - break; - case 286: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt */ -{yygotominor.yy473 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-2].minor.yy0, yymsp[0].minor.yy132);} - break; - case 287: /* trigger_cmd ::= select */ -{yygotominor.yy473 = sqlite3TriggerSelectStep(pParse->db, yymsp[0].minor.yy3); } - break; - case 288: /* expr ::= RAISE LP IGNORE RP */ + case 252: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ { - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, 0); - if( yygotominor.yy346.pExpr ){ - yygotominor.yy346.pExpr->affinity = OE_Ignore; + yylhsminor.yy47 = sqlite3TriggerInsertStep(pParse->db,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy510,yymsp[-2].minor.yy399,yymsp[-6].minor.yy502,yymsp[-1].minor.yy198,yymsp[-7].minor.yy36,yymsp[0].minor.yy36);/*yylhsminor.yy47-overwrites-yymsp[-6].minor.yy502*/ +} + yymsp[-7].minor.yy47 = yylhsminor.yy47; + break; + case 253: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ +{yylhsminor.yy47 = sqlite3TriggerDeleteStep(pParse->db, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy182, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy36);} + yymsp[-5].minor.yy47 = yylhsminor.yy47; + break; + case 254: /* trigger_cmd ::= scanpt select scanpt */ +{yylhsminor.yy47 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy399, yymsp[-2].minor.yy36, yymsp[0].minor.yy36); /*yylhsminor.yy47-overwrites-yymsp[-1].minor.yy399*/} + yymsp[-2].minor.yy47 = yylhsminor.yy47; + break; + case 255: /* expr ::= RAISE LP IGNORE RP */ +{ + yymsp[-3].minor.yy182 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); + if( yymsp[-3].minor.yy182 ){ + yymsp[-3].minor.yy182->affinity = OE_Ignore; } - yygotominor.yy346.zStart = yymsp[-3].minor.yy0.z; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 289: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 256: /* expr ::= RAISE LP raisetype COMMA nm RP */ { - yygotominor.yy346.pExpr = sqlite3PExpr(pParse, TK_RAISE, 0, 0, &yymsp[-1].minor.yy0); - if( yygotominor.yy346.pExpr ) { - yygotominor.yy346.pExpr->affinity = (char)yymsp[-3].minor.yy328; + yymsp[-5].minor.yy182 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); + if( yymsp[-5].minor.yy182 ) { + yymsp[-5].minor.yy182->affinity = (char)yymsp[-3].minor.yy502; } - yygotominor.yy346.zStart = yymsp[-5].minor.yy0.z; - yygotominor.yy346.zEnd = &yymsp[0].minor.yy0.z[yymsp[0].minor.yy0.n]; } break; - case 290: /* raisetype ::= ROLLBACK */ -{yygotominor.yy328 = OE_Rollback;} + case 257: /* raisetype ::= ROLLBACK */ +{yymsp[0].minor.yy502 = OE_Rollback;} break; - case 292: /* raisetype ::= FAIL */ -{yygotominor.yy328 = OE_Fail;} + case 259: /* raisetype ::= FAIL */ +{yymsp[0].minor.yy502 = OE_Fail;} break; - case 293: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 260: /* cmd ::= DROP TRIGGER ifexists fullname */ { - sqlite3DropTrigger(pParse,yymsp[0].minor.yy65,yymsp[-1].minor.yy328); + sqlite3DropTrigger(pParse,yymsp[0].minor.yy427,yymsp[-1].minor.yy502); } break; - case 294: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 261: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { - sqlite3Attach(pParse, yymsp[-3].minor.yy346.pExpr, yymsp[-1].minor.yy346.pExpr, yymsp[0].minor.yy132); + sqlite3Attach(pParse, yymsp[-3].minor.yy182, yymsp[-1].minor.yy182, yymsp[0].minor.yy182); } break; - case 295: /* cmd ::= DETACH database_kw_opt expr */ + case 262: /* cmd ::= DETACH database_kw_opt expr */ { - sqlite3Detach(pParse, yymsp[0].minor.yy346.pExpr); + sqlite3Detach(pParse, yymsp[0].minor.yy182); } break; - case 300: /* cmd ::= REINDEX */ + case 265: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 301: /* cmd ::= REINDEX nm dbnm */ + case 266: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 302: /* cmd ::= ANALYZE */ + case 267: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 303: /* cmd ::= ANALYZE nm dbnm */ + case 268: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 304: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 269: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { - sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy65,&yymsp[0].minor.yy0); + sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy427,&yymsp[0].minor.yy0); } break; - case 305: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt column */ + case 270: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ { - sqlite3AlterFinishAddColumn(pParse, &yymsp[0].minor.yy0); + yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; + sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); } break; - case 306: /* add_column_fullname ::= fullname */ + case 271: /* add_column_fullname ::= fullname */ { - pParse->db->lookaside.bEnabled = 0; - sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy65); + disableLookaside(pParse); + sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy427); } break; - case 309: /* cmd ::= create_vtab */ + case 272: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 310: /* cmd ::= create_vtab LP vtabarglist RP */ + case 273: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 311: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 274: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { - sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy328); + sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy502); } break; - case 314: /* vtabarg ::= */ + case 275: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 316: /* vtabargtoken ::= ANY */ - case 317: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==317); - case 318: /* lp ::= LP */ yytestcase(yyruleno==318); + case 276: /* vtabargtoken ::= ANY */ + case 277: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==277); + case 278: /* lp ::= LP */ yytestcase(yyruleno==278); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; - case 322: /* with ::= */ -{yygotominor.yy59 = 0;} + case 279: /* with ::= WITH wqlist */ + case 280: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==280); +{ sqlite3WithPush(pParse, yymsp[0].minor.yy91, 1); } break; - case 323: /* with ::= WITH wqlist */ - case 324: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==324); -{ yygotominor.yy59 = yymsp[0].minor.yy59; } - break; - case 325: /* wqlist ::= nm idxlist_opt AS LP select RP */ + case 281: /* wqlist ::= nm eidlist_opt AS LP select RP */ { - yygotominor.yy59 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy14, yymsp[-1].minor.yy3); + yymsp[-5].minor.yy91 = sqlite3WithAdd(pParse, 0, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy232, yymsp[-1].minor.yy399); /*A-overwrites-X*/ } break; - case 326: /* wqlist ::= wqlist COMMA nm idxlist_opt AS LP select RP */ + case 282: /* wqlist ::= wqlist COMMA nm eidlist_opt AS LP select RP */ { - yygotominor.yy59 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy59, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy14, yymsp[-1].minor.yy3); + yymsp[-7].minor.yy91 = sqlite3WithAdd(pParse, yymsp[-7].minor.yy91, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy232, yymsp[-1].minor.yy399); } break; default: - /* (0) input ::= cmdlist */ yytestcase(yyruleno==0); - /* (1) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==1); - /* (2) cmdlist ::= ecmd */ yytestcase(yyruleno==2); - /* (3) ecmd ::= SEMI */ yytestcase(yyruleno==3); - /* (4) ecmd ::= explain cmdx SEMI */ yytestcase(yyruleno==4); - /* (10) trans_opt ::= */ yytestcase(yyruleno==10); - /* (11) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==11); - /* (12) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==12); - /* (20) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==20); - /* (21) savepoint_opt ::= */ yytestcase(yyruleno==21); - /* (25) cmd ::= create_table create_table_args */ yytestcase(yyruleno==25); - /* (36) columnlist ::= columnlist COMMA column */ yytestcase(yyruleno==36); - /* (37) columnlist ::= column */ yytestcase(yyruleno==37); - /* (43) type ::= */ yytestcase(yyruleno==43); - /* (50) signed ::= plus_num */ yytestcase(yyruleno==50); - /* (51) signed ::= minus_num */ yytestcase(yyruleno==51); - /* (52) carglist ::= carglist ccons */ yytestcase(yyruleno==52); - /* (53) carglist ::= */ yytestcase(yyruleno==53); - /* (60) ccons ::= NULL onconf */ yytestcase(yyruleno==60); - /* (88) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==88); - /* (89) conslist ::= tcons */ yytestcase(yyruleno==89); - /* (91) tconscomma ::= */ yytestcase(yyruleno==91); - /* (273) foreach_clause ::= */ yytestcase(yyruleno==273); - /* (274) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==274); - /* (281) tridxby ::= */ yytestcase(yyruleno==281); - /* (298) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==298); - /* (299) database_kw_opt ::= */ yytestcase(yyruleno==299); - /* (307) kwcolumn_opt ::= */ yytestcase(yyruleno==307); - /* (308) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==308); - /* (312) vtabarglist ::= vtabarg */ yytestcase(yyruleno==312); - /* (313) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==313); - /* (315) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==315); - /* (319) anylist ::= */ yytestcase(yyruleno==319); - /* (320) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==320); - /* (321) anylist ::= anylist ANY */ yytestcase(yyruleno==321); + /* (283) input ::= cmdlist */ yytestcase(yyruleno==283); + /* (284) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==284); + /* (285) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=285); + /* (286) ecmd ::= SEMI */ yytestcase(yyruleno==286); + /* (287) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==287); + /* (288) ecmd ::= explain cmdx */ yytestcase(yyruleno==288); + /* (289) trans_opt ::= */ yytestcase(yyruleno==289); + /* (290) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==290); + /* (291) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==291); + /* (292) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==292); + /* (293) savepoint_opt ::= */ yytestcase(yyruleno==293); + /* (294) cmd ::= create_table create_table_args */ yytestcase(yyruleno==294); + /* (295) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==295); + /* (296) columnlist ::= columnname carglist */ yytestcase(yyruleno==296); + /* (297) nm ::= ID|INDEXED */ yytestcase(yyruleno==297); + /* (298) nm ::= STRING */ yytestcase(yyruleno==298); + /* (299) nm ::= JOIN_KW */ yytestcase(yyruleno==299); + /* (300) typetoken ::= typename */ yytestcase(yyruleno==300); + /* (301) typename ::= ID|STRING */ yytestcase(yyruleno==301); + /* (302) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=302); + /* (303) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=303); + /* (304) carglist ::= carglist ccons */ yytestcase(yyruleno==304); + /* (305) carglist ::= */ yytestcase(yyruleno==305); + /* (306) ccons ::= NULL onconf */ yytestcase(yyruleno==306); + /* (307) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==307); + /* (308) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==308); + /* (309) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=309); + /* (310) tconscomma ::= */ yytestcase(yyruleno==310); + /* (311) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=311); + /* (312) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=312); + /* (313) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=313); + /* (314) oneselect ::= values */ yytestcase(yyruleno==314); + /* (315) sclp ::= selcollist COMMA */ yytestcase(yyruleno==315); + /* (316) as ::= ID|STRING */ yytestcase(yyruleno==316); + /* (317) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=317); + /* (318) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==318); + /* (319) exprlist ::= nexprlist */ yytestcase(yyruleno==319); + /* (320) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=320); + /* (321) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=321); + /* (322) nmnum ::= ON */ yytestcase(yyruleno==322); + /* (323) nmnum ::= DELETE */ yytestcase(yyruleno==323); + /* (324) nmnum ::= DEFAULT */ yytestcase(yyruleno==324); + /* (325) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==325); + /* (326) foreach_clause ::= */ yytestcase(yyruleno==326); + /* (327) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==327); + /* (328) trnm ::= nm */ yytestcase(yyruleno==328); + /* (329) tridxby ::= */ yytestcase(yyruleno==329); + /* (330) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==330); + /* (331) database_kw_opt ::= */ yytestcase(yyruleno==331); + /* (332) kwcolumn_opt ::= */ yytestcase(yyruleno==332); + /* (333) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==333); + /* (334) vtabarglist ::= vtabarg */ yytestcase(yyruleno==334); + /* (335) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==335); + /* (336) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==336); + /* (337) anylist ::= */ yytestcase(yyruleno==337); + /* (338) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==338); + /* (339) anylist ::= anylist ANY */ yytestcase(yyruleno==339); + /* (340) with ::= */ yytestcase(yyruleno==340); break; +/********** End reduce actions ************************************************/ }; - assert( yyruleno>=0 && yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) ); + assert( yyruleno<sizeof(yyRuleInfo)/sizeof(yyRuleInfo[0]) ); yygoto = yyRuleInfo[yyruleno].lhs; yysize = yyRuleInfo[yyruleno].nrhs; - yypParser->yyidx -= yysize; - yyact = yy_find_reduce_action(yymsp[-yysize].stateno,(YYCODETYPE)yygoto); - if( yyact < YYNSTATE ){ -#ifdef NDEBUG - /* If we are not debugging and the reduce action popped at least - ** one element off the stack, then we can push the new element back - ** onto the stack here, and skip the stack overflow test in yy_shift(). - ** That gives a significant speed improvement. */ - if( yysize ){ - yypParser->yyidx++; - yymsp -= yysize-1; - yymsp->stateno = (YYACTIONTYPE)yyact; - yymsp->major = (YYCODETYPE)yygoto; - yymsp->minor = yygotominor; - }else -#endif - { - yy_shift(yypParser,yyact,yygoto,&yygotominor); - } - }else{ - assert( yyact == YYNSTATE + YYNRULE + 1 ); - yy_accept(yypParser); - } + yyact = yy_find_reduce_action(yymsp[yysize].stateno,(YYCODETYPE)yygoto); + + /* There are no SHIFTREDUCE actions on nonterminals because the table + ** generator has simplified them to pure REDUCE actions. */ + assert( !(yyact>YY_MAX_SHIFT && yyact<=YY_MAX_SHIFTREDUCE) ); + + /* It is not possible for a REDUCE to be followed by an error */ + assert( yyact!=YY_ERROR_ACTION ); + + yymsp += yysize+1; + yypParser->yytos = yymsp; + yymsp->stateno = (YYACTIONTYPE)yyact; + yymsp->major = (YYCODETYPE)yygoto; + yyTraceShift(yypParser, yyact, "... then shift"); + return yyact; } /* @@ -124997,16 +145205,20 @@ static void yy_reduce( static void yy_parse_failed( yyParser *yypParser /* The parser */ ){ - sqlite3ParserARG_FETCH; + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH #ifndef NDEBUG if( yyTraceFILE ){ fprintf(yyTraceFILE,"%sFail!\n",yyTracePrompt); } #endif - while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); + while( yypParser->yytos>yypParser->yystack ) yy_pop_parser_stack(yypParser); /* Here code is inserted which will be executed whenever the ** parser fails */ - sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ +/************ Begin %parse_failure code ***************************************/ +/************ End %parse_failure code *****************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE } #endif /* YYNOERRORRECOVERY */ @@ -125016,15 +145228,22 @@ static void yy_parse_failed( static void yy_syntax_error( yyParser *yypParser, /* The parser */ int yymajor, /* The major type of the error token */ - YYMINORTYPE yyminor /* The minor type of the error token */ + sqlite3ParserTOKENTYPE yyminor /* The minor type of the error token */ ){ - sqlite3ParserARG_FETCH; -#define TOKEN (yyminor.yy0) + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH +#define TOKEN yyminor +/************ Begin %syntax_error code ****************************************/ UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ - assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ - sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); - sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ + if( TOKEN.z[0] ){ + sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); + }else{ + sqlite3ErrorMsg(pParse, "incomplete input"); + } +/************ End %syntax_error code ******************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE } /* @@ -125033,16 +145252,23 @@ static void yy_syntax_error( static void yy_accept( yyParser *yypParser /* The parser */ ){ - sqlite3ParserARG_FETCH; + sqlite3ParserARG_FETCH + sqlite3ParserCTX_FETCH #ifndef NDEBUG if( yyTraceFILE ){ fprintf(yyTraceFILE,"%sAccept!\n",yyTracePrompt); } #endif - while( yypParser->yyidx>=0 ) yy_pop_parser_stack(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif + assert( yypParser->yytos==yypParser->yystack ); /* Here code is inserted which will be executed whenever the ** parser accepts */ - sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ +/*********** Begin %parse_accept code *****************************************/ +/*********** End %parse_accept code *******************************************/ + sqlite3ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3ParserCTX_STORE } /* The main parser program. @@ -125071,53 +145297,54 @@ SQLITE_PRIVATE void sqlite3Parser( sqlite3ParserARG_PDECL /* Optional %extra_argument parameter */ ){ YYMINORTYPE yyminorunion; - int yyact; /* The parser action. */ + YYACTIONTYPE yyact; /* The parser action. */ #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) int yyendofinput; /* True if we are at the end of input */ #endif #ifdef YYERRORSYMBOL int yyerrorhit = 0; /* True if yymajor has invoked an error */ #endif - yyParser *yypParser; /* The parser */ + yyParser *yypParser = (yyParser*)yyp; /* The parser */ + sqlite3ParserCTX_FETCH + sqlite3ParserARG_STORE - /* (re)initialize the parser, if necessary */ - yypParser = (yyParser*)yyp; - if( yypParser->yyidx<0 ){ -#if YYSTACKDEPTH<=0 - if( yypParser->yystksz <=0 ){ - /*memset(&yyminorunion, 0, sizeof(yyminorunion));*/ - yyminorunion = yyzerominor; - yyStackOverflow(yypParser, &yyminorunion); - return; - } -#endif - yypParser->yyidx = 0; - yypParser->yyerrcnt = -1; - yypParser->yystack[0].stateno = 0; - yypParser->yystack[0].major = 0; - } - yyminorunion.yy0 = yyminor; + assert( yypParser->yytos!=0 ); #if !defined(YYERRORSYMBOL) && !defined(YYNOERRORRECOVERY) yyendofinput = (yymajor==0); #endif - sqlite3ParserARG_STORE; + yyact = yypParser->yytos->stateno; #ifndef NDEBUG if( yyTraceFILE ){ - fprintf(yyTraceFILE,"%sInput %s\n",yyTracePrompt,yyTokenName[yymajor]); + if( yyact < YY_MIN_REDUCE ){ + fprintf(yyTraceFILE,"%sInput '%s' in state %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact); + }else{ + fprintf(yyTraceFILE,"%sInput '%s' with pending reduce %d\n", + yyTracePrompt,yyTokenName[yymajor],yyact-YY_MIN_REDUCE); + } } #endif do{ - yyact = yy_find_shift_action(yypParser,(YYCODETYPE)yymajor); - if( yyact<YYNSTATE ){ - yy_shift(yypParser,yyact,yymajor,&yyminorunion); + assert( yyact==yypParser->yytos->stateno ); + yyact = yy_find_shift_action(yymajor,yyact); + if( yyact >= YY_MIN_REDUCE ){ + yyact = yy_reduce(yypParser,yyact-YY_MIN_REDUCE,yymajor, + yyminor sqlite3ParserCTX_PARAM); + }else if( yyact <= YY_MAX_SHIFTREDUCE ){ + yy_shift(yypParser,yyact,yymajor,yyminor); +#ifndef YYNOERRORRECOVERY yypParser->yyerrcnt--; - yymajor = YYNOCODE; - }else if( yyact < YYNSTATE + YYNRULE ){ - yy_reduce(yypParser,yyact-YYNSTATE); +#endif + break; + }else if( yyact==YY_ACCEPT_ACTION ){ + yypParser->yytos--; + yy_accept(yypParser); + return; }else{ assert( yyact == YY_ERROR_ACTION ); + yyminorunion.yy0 = yyminor; #ifdef YYERRORSYMBOL int yymx; #endif @@ -125147,9 +145374,9 @@ SQLITE_PRIVATE void sqlite3Parser( ** */ if( yypParser->yyerrcnt<0 ){ - yy_syntax_error(yypParser,yymajor,yyminorunion); + yy_syntax_error(yypParser,yymajor,yyminor); } - yymx = yypParser->yystack[yypParser->yyidx].major; + yymx = yypParser->yytos->major; if( yymx==YYERRORSYMBOL || yyerrorhit ){ #ifndef NDEBUG if( yyTraceFILE ){ @@ -125157,30 +145384,32 @@ SQLITE_PRIVATE void sqlite3Parser( yyTracePrompt,yyTokenName[yymajor]); } #endif - yy_destructor(yypParser, (YYCODETYPE)yymajor,&yyminorunion); + yy_destructor(yypParser, (YYCODETYPE)yymajor, &yyminorunion); yymajor = YYNOCODE; }else{ - while( - yypParser->yyidx >= 0 && - yymx != YYERRORSYMBOL && - (yyact = yy_find_reduce_action( - yypParser->yystack[yypParser->yyidx].stateno, - YYERRORSYMBOL)) >= YYNSTATE + while( yypParser->yytos >= yypParser->yystack + && yymx != YYERRORSYMBOL + && (yyact = yy_find_reduce_action( + yypParser->yytos->stateno, + YYERRORSYMBOL)) >= YY_MIN_REDUCE ){ yy_pop_parser_stack(yypParser); } - if( yypParser->yyidx < 0 || yymajor==0 ){ + if( yypParser->yytos < yypParser->yystack || yymajor==0 ){ yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif yymajor = YYNOCODE; }else if( yymx!=YYERRORSYMBOL ){ - YYMINORTYPE u2; - u2.YYERRSYMDT = 0; - yy_shift(yypParser,yyact,YYERRORSYMBOL,&u2); + yy_shift(yypParser,yyact,YYERRORSYMBOL,yyminor); } } yypParser->yyerrcnt = 3; yyerrorhit = 1; + if( yymajor==YYNOCODE ) break; + yyact = yypParser->yytos->stateno; #elif defined(YYNOERRORRECOVERY) /* If the YYNOERRORRECOVERY macro is defined, then do not attempt to ** do any kind of error recovery. Instead, simply invoke the syntax @@ -125189,10 +145418,9 @@ SQLITE_PRIVATE void sqlite3Parser( ** Applications can set this macro (for example inside %include) if ** they intend to abandon the parse upon the first syntax error seen. */ - yy_syntax_error(yypParser,yymajor,yyminorunion); + yy_syntax_error(yypParser,yymajor, yyminor); yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); - yymajor = YYNOCODE; - + break; #else /* YYERRORSYMBOL is not defined */ /* This is what we do if the grammar does not define ERROR: ** @@ -125204,17 +145432,32 @@ SQLITE_PRIVATE void sqlite3Parser( ** three input tokens have been successfully shifted. */ if( yypParser->yyerrcnt<=0 ){ - yy_syntax_error(yypParser,yymajor,yyminorunion); + yy_syntax_error(yypParser,yymajor, yyminor); } yypParser->yyerrcnt = 3; yy_destructor(yypParser,(YYCODETYPE)yymajor,&yyminorunion); if( yyendofinput ){ yy_parse_failed(yypParser); +#ifndef YYNOERRORRECOVERY + yypParser->yyerrcnt = -1; +#endif } - yymajor = YYNOCODE; + break; #endif } - }while( yymajor!=YYNOCODE && yypParser->yyidx>=0 ); + }while( yypParser->yytos>yypParser->yystack ); +#ifndef NDEBUG + if( yyTraceFILE ){ + yyStackEntry *i; + char cDiv = '['; + fprintf(yyTraceFILE,"%sReturn. Stack=",yyTracePrompt); + for(i=&yypParser->yystack[1]; i<=yypParser->yytos; i++){ + fprintf(yyTraceFILE,"%c%s", cDiv, yyTokenName[i->major]); + cDiv = ' '; + } + fprintf(yyTraceFILE,"]\n"); + } +#endif return; } @@ -125237,14 +145480,95 @@ SQLITE_PRIVATE void sqlite3Parser( ** individual tokens and sends those tokens one-by-one over to the ** parser for analysis. */ +/* #include "sqliteInt.h" */ /* #include <stdlib.h> */ +/* Character classes for tokenizing +** +** In the sqlite3GetToken() function, a switch() on aiClass[c] is implemented +** using a lookup table, whereas a switch() directly on c uses a binary search. +** The lookup table is much faster. To maximize speed, and to ensure that +** a lookup table is used, all of the classes need to be small integers and +** all of them need to be used within the switch. +*/ +#define CC_X 0 /* The letter 'x', or start of BLOB literal */ +#define CC_KYWD 1 /* Alphabetics or '_'. Usable in a keyword */ +#define CC_ID 2 /* unicode characters usable in IDs */ +#define CC_DIGIT 3 /* Digits */ +#define CC_DOLLAR 4 /* '$' */ +#define CC_VARALPHA 5 /* '@', '#', ':'. Alphabetic SQL variables */ +#define CC_VARNUM 6 /* '?'. Numeric SQL variables */ +#define CC_SPACE 7 /* Space characters */ +#define CC_QUOTE 8 /* '"', '\'', or '`'. String literals, quoted ids */ +#define CC_QUOTE2 9 /* '['. [...] style quoted ids */ +#define CC_PIPE 10 /* '|'. Bitwise OR or concatenate */ +#define CC_MINUS 11 /* '-'. Minus or SQL-style comment */ +#define CC_LT 12 /* '<'. Part of < or <= or <> */ +#define CC_GT 13 /* '>'. Part of > or >= */ +#define CC_EQ 14 /* '='. Part of = or == */ +#define CC_BANG 15 /* '!'. Part of != */ +#define CC_SLASH 16 /* '/'. / or c-style comment */ +#define CC_LP 17 /* '(' */ +#define CC_RP 18 /* ')' */ +#define CC_SEMI 19 /* ';' */ +#define CC_PLUS 20 /* '+' */ +#define CC_STAR 21 /* '*' */ +#define CC_PERCENT 22 /* '%' */ +#define CC_COMMA 23 /* ',' */ +#define CC_AND 24 /* '&' */ +#define CC_TILDA 25 /* '~' */ +#define CC_DOT 26 /* '.' */ +#define CC_ILLEGAL 27 /* Illegal character */ + +static const unsigned char aiClass[] = { +#ifdef SQLITE_ASCII +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 7, 7, 27, 7, 7, 27, 27, +/* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 2x */ 7, 15, 8, 5, 4, 22, 24, 8, 17, 18, 21, 20, 23, 11, 26, 16, +/* 3x */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 19, 12, 14, 13, 6, +/* 4x */ 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 9, 27, 27, 27, 1, +/* 6x */ 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +/* 7x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 27, 10, 27, 25, 27, +/* 8x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* 9x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Ax */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Bx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Cx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Dx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Ex */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, +/* Fx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 +#endif +#ifdef SQLITE_EBCDIC +/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */ +/* 0x */ 27, 27, 27, 27, 27, 7, 27, 27, 27, 27, 27, 27, 7, 7, 27, 27, +/* 1x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 2x */ 27, 27, 27, 27, 27, 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 3x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +/* 4x */ 7, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, 12, 17, 20, 10, +/* 5x */ 24, 27, 27, 27, 27, 27, 27, 27, 27, 27, 15, 4, 21, 18, 19, 27, +/* 6x */ 11, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 23, 22, 1, 13, 6, +/* 7x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 8, 5, 5, 5, 8, 14, 8, +/* 8x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* 9x */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Ax */ 27, 25, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, +/* Bx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 9, 27, 27, 27, 27, 27, +/* Cx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Dx */ 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, 27, 27, 27, 27, 27, +/* Ex */ 27, 27, 1, 1, 1, 1, 1, 0, 1, 1, 27, 27, 27, 27, 27, 27, +/* Fx */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 27, 27, 27, 27, 27, 27, +#endif +}; + /* -** The charMap() macro maps alphabetic characters into their +** The charMap() macro maps alphabetic characters (only) into their ** lower-case ASCII equivalent. On ASCII machines, this is just ** an upper-to-lower case map. On EBCDIC machines we also need -** to adjust the encoding. Only alphabetic characters and underscores -** need to be translated. +** to adjust the encoding. The mapping is only valid for alphabetics +** which are the only characters for which this feature is used. +** +** Used by keywordhash.h */ #ifdef SQLITE_ASCII # define charMap(X) sqlite3UpperToLower[(unsigned char)X] @@ -125278,7 +145602,7 @@ const unsigned char ebcdicToAscii[] = { ** returned. If the input is not a keyword, TK_ID is returned. ** ** The implementation of this routine was generated by a program, -** mkkeywordhash.h, located in the tool subdirectory of the distribution. +** mkkeywordhash.c, located in the tool subdirectory of the distribution. ** The output of the mkkeywordhash.c program is written into a file ** named keywordhash.h and then included into this source file by ** the #include below. @@ -125298,134 +145622,155 @@ const unsigned char ebcdicToAscii[] = { ** is substantially reduced. This is important for embedded applications ** on platforms with limited memory. */ -/* Hash score: 182 */ -static int keywordCode(const char *z, int n){ - /* zText[] encodes 834 bytes of keywords in 554 bytes */ - /* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */ - /* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */ - /* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */ - /* UNIQUERYWITHOUTERELEASEATTACHAVINGROUPDATEBEGINNERECURSIVE */ - /* BETWEENOTNULLIKECASCADELETECASECOLLATECREATECURRENT_DATEDETACH */ - /* IMMEDIATEJOINSERTMATCHPLANALYZEPRAGMABORTVALUESVIRTUALIMITWHEN */ - /* WHERENAMEAFTEREPLACEANDEFAULTAUTOINCREMENTCASTCOLUMNCOMMIT */ - /* CONFLICTCROSSCURRENT_TIMESTAMPRIMARYDEFERREDISTINCTDROPFAIL */ - /* FROMFULLGLOBYIFISNULLORDERESTRICTRIGHTROLLBACKROWUNIONUSING */ - /* VACUUMVIEWINITIALLY */ - static const char zText[553] = { - 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H', - 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G', - 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A', - 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F', - 'E','R','R','A','B','L','E','L','S','E','X','C','E','P','T','R','A','N', - 'S','A','C','T','I','O','N','A','T','U','R','A','L','T','E','R','A','I', - 'S','E','X','C','L','U','S','I','V','E','X','I','S','T','S','A','V','E', - 'P','O','I','N','T','E','R','S','E','C','T','R','I','G','G','E','R','E', - 'F','E','R','E','N','C','E','S','C','O','N','S','T','R','A','I','N','T', - 'O','F','F','S','E','T','E','M','P','O','R','A','R','Y','U','N','I','Q', - 'U','E','R','Y','W','I','T','H','O','U','T','E','R','E','L','E','A','S', - 'E','A','T','T','A','C','H','A','V','I','N','G','R','O','U','P','D','A', - 'T','E','B','E','G','I','N','N','E','R','E','C','U','R','S','I','V','E', - 'B','E','T','W','E','E','N','O','T','N','U','L','L','I','K','E','C','A', - 'S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L','A', - 'T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D','A', - 'T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E','J', - 'O','I','N','S','E','R','T','M','A','T','C','H','P','L','A','N','A','L', - 'Y','Z','E','P','R','A','G','M','A','B','O','R','T','V','A','L','U','E', - 'S','V','I','R','T','U','A','L','I','M','I','T','W','H','E','N','W','H', - 'E','R','E','N','A','M','E','A','F','T','E','R','E','P','L','A','C','E', - 'A','N','D','E','F','A','U','L','T','A','U','T','O','I','N','C','R','E', - 'M','E','N','T','C','A','S','T','C','O','L','U','M','N','C','O','M','M', - 'I','T','C','O','N','F','L','I','C','T','C','R','O','S','S','C','U','R', - 'R','E','N','T','_','T','I','M','E','S','T','A','M','P','R','I','M','A', - 'R','Y','D','E','F','E','R','R','E','D','I','S','T','I','N','C','T','D', - 'R','O','P','F','A','I','L','F','R','O','M','F','U','L','L','G','L','O', - 'B','Y','I','F','I','S','N','U','L','L','O','R','D','E','R','E','S','T', - 'R','I','C','T','R','I','G','H','T','R','O','L','L','B','A','C','K','R', - 'O','W','U','N','I','O','N','U','S','I','N','G','V','A','C','U','U','M', - 'V','I','E','W','I','N','I','T','I','A','L','L','Y', - }; - static const unsigned char aHash[127] = { - 76, 105, 117, 74, 0, 45, 0, 0, 82, 0, 77, 0, 0, - 42, 12, 78, 15, 0, 116, 85, 54, 112, 0, 19, 0, 0, - 121, 0, 119, 115, 0, 22, 93, 0, 9, 0, 0, 70, 71, - 0, 69, 6, 0, 48, 90, 102, 0, 118, 101, 0, 0, 44, - 0, 103, 24, 0, 17, 0, 122, 53, 23, 0, 5, 110, 25, - 96, 0, 0, 124, 106, 60, 123, 57, 28, 55, 0, 91, 0, - 100, 26, 0, 99, 0, 0, 0, 95, 92, 97, 88, 109, 14, - 39, 108, 0, 81, 0, 18, 89, 111, 32, 0, 120, 80, 113, - 62, 46, 84, 0, 0, 94, 40, 59, 114, 0, 36, 0, 0, - 29, 0, 86, 63, 64, 0, 20, 61, 0, 56, - }; - static const unsigned char aNext[124] = { - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, - 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 33, 0, 21, 0, 0, 0, 0, 0, 50, - 0, 43, 3, 47, 0, 0, 0, 0, 30, 0, 58, 0, 38, - 0, 0, 0, 1, 66, 0, 0, 67, 0, 41, 0, 0, 0, - 0, 0, 0, 49, 65, 0, 0, 0, 0, 31, 52, 16, 34, - 10, 0, 0, 0, 0, 0, 0, 0, 11, 72, 79, 0, 8, - 0, 104, 98, 0, 107, 0, 87, 0, 75, 51, 0, 27, 37, - 73, 83, 0, 35, 68, 0, 0, - }; - static const unsigned char aLen[124] = { - 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, - 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6, - 11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10, - 4, 6, 2, 3, 9, 4, 2, 6, 5, 7, 4, 5, 7, - 6, 6, 5, 6, 5, 5, 9, 7, 7, 3, 2, 4, 4, - 7, 3, 6, 4, 7, 6, 12, 6, 9, 4, 6, 5, 4, - 7, 6, 5, 6, 7, 5, 4, 5, 6, 5, 7, 3, 7, - 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, 7, 8, 8, - 2, 4, 4, 4, 4, 4, 2, 2, 6, 5, 8, 5, 8, - 3, 5, 5, 6, 4, 9, 3, - }; - static const unsigned short int aOffset[124] = { - 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, - 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, - 86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152, - 159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 184, 188, 192, - 199, 204, 209, 212, 218, 221, 225, 234, 240, 240, 240, 243, 246, - 250, 251, 255, 261, 265, 272, 278, 290, 296, 305, 307, 313, 318, - 320, 327, 332, 337, 343, 349, 354, 358, 361, 367, 371, 378, 380, - 387, 389, 391, 400, 404, 410, 416, 424, 429, 429, 445, 452, 459, - 460, 467, 471, 475, 479, 483, 486, 488, 490, 496, 500, 508, 513, - 521, 524, 529, 534, 540, 544, 549, - }; - static const unsigned char aCode[124] = { - TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, - TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, - TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, - TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, - TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, - TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, - TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_SAVEPOINT, - TK_INTERSECT, TK_TRIGGER, TK_REFERENCES, TK_CONSTRAINT, TK_INTO, - TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP, - TK_OR, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH, - TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_GROUP, - TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RECURSIVE, TK_BETWEEN, - TK_NOTNULL, TK_NOT, TK_NO, TK_NULL, TK_LIKE_KW, - TK_CASCADE, TK_ASC, TK_DELETE, TK_CASE, TK_COLLATE, - TK_CREATE, TK_CTIME_KW, TK_DETACH, TK_IMMEDIATE, TK_JOIN, - TK_INSERT, TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA, - TK_ABORT, TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN, - TK_WHERE, TK_RENAME, TK_AFTER, TK_REPLACE, TK_AND, - TK_DEFAULT, TK_AUTOINCR, TK_TO, TK_IN, TK_CAST, - TK_COLUMNKW, TK_COMMIT, TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, - TK_CTIME_KW, TK_PRIMARY, TK_DEFERRED, TK_DISTINCT, TK_IS, - TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW, TK_LIKE_KW, - TK_BY, TK_IF, TK_ISNULL, TK_ORDER, TK_RESTRICT, - TK_JOIN_KW, TK_ROLLBACK, TK_ROW, TK_UNION, TK_USING, - TK_VACUUM, TK_VIEW, TK_INITIALLY, TK_ALL, - }; - int h, i; - if( n<2 ) return TK_ID; - h = ((charMap(z[0])*4) ^ - (charMap(z[n-1])*3) ^ - n) % 127; - for(i=((int)aHash[h])-1; i>=0; i=((int)aNext[i])-1){ - if( aLen[i]==n && sqlite3StrNICmp(&zText[aOffset[i]],z,n)==0 ){ +/* Hash score: 185 */ +/* zKWText[] encodes 845 bytes of keyword text in 561 bytes */ +/* REINDEXEDESCAPEACHECKEYBEFOREIGNOREGEXPLAINSTEADDATABASELECT */ +/* ABLEFTHENDEFERRABLELSEXCEPTRANSACTIONATURALTERAISEXCLUSIVE */ +/* XISTSAVEPOINTERSECTRIGGEREFERENCESCONSTRAINTOFFSETEMPORARY */ +/* UNIQUERYWITHOUTERELEASEATTACHAVINGROUPDATEBEGINNERECURSIVE */ +/* BETWEENOTHINGLOBYCASCADELETECASECOLLATECREATECURRENT_DATE */ +/* DETACHIMMEDIATEJOINSERTLIKEMATCHPLANALYZEPRAGMABORTVALUES */ +/* VIRTUALIMITWHENOTNULLWHERENAMEAFTEREPLACEANDEFAULT */ +/* AUTOINCREMENTCASTCOLUMNCOMMITCONFLICTCROSSCURRENT_TIMESTAMP */ +/* RIMARYDEFERREDISTINCTDORDERESTRICTDROPFAILFROMFULLIFISNULL */ +/* RIGHTROLLBACKROWUNIONUSINGVACUUMVIEWINITIALLY */ +static const char zKWText[560] = { + 'R','E','I','N','D','E','X','E','D','E','S','C','A','P','E','A','C','H', + 'E','C','K','E','Y','B','E','F','O','R','E','I','G','N','O','R','E','G', + 'E','X','P','L','A','I','N','S','T','E','A','D','D','A','T','A','B','A', + 'S','E','L','E','C','T','A','B','L','E','F','T','H','E','N','D','E','F', + 'E','R','R','A','B','L','E','L','S','E','X','C','E','P','T','R','A','N', + 'S','A','C','T','I','O','N','A','T','U','R','A','L','T','E','R','A','I', + 'S','E','X','C','L','U','S','I','V','E','X','I','S','T','S','A','V','E', + 'P','O','I','N','T','E','R','S','E','C','T','R','I','G','G','E','R','E', + 'F','E','R','E','N','C','E','S','C','O','N','S','T','R','A','I','N','T', + 'O','F','F','S','E','T','E','M','P','O','R','A','R','Y','U','N','I','Q', + 'U','E','R','Y','W','I','T','H','O','U','T','E','R','E','L','E','A','S', + 'E','A','T','T','A','C','H','A','V','I','N','G','R','O','U','P','D','A', + 'T','E','B','E','G','I','N','N','E','R','E','C','U','R','S','I','V','E', + 'B','E','T','W','E','E','N','O','T','H','I','N','G','L','O','B','Y','C', + 'A','S','C','A','D','E','L','E','T','E','C','A','S','E','C','O','L','L', + 'A','T','E','C','R','E','A','T','E','C','U','R','R','E','N','T','_','D', + 'A','T','E','D','E','T','A','C','H','I','M','M','E','D','I','A','T','E', + 'J','O','I','N','S','E','R','T','L','I','K','E','M','A','T','C','H','P', + 'L','A','N','A','L','Y','Z','E','P','R','A','G','M','A','B','O','R','T', + 'V','A','L','U','E','S','V','I','R','T','U','A','L','I','M','I','T','W', + 'H','E','N','O','T','N','U','L','L','W','H','E','R','E','N','A','M','E', + 'A','F','T','E','R','E','P','L','A','C','E','A','N','D','E','F','A','U', + 'L','T','A','U','T','O','I','N','C','R','E','M','E','N','T','C','A','S', + 'T','C','O','L','U','M','N','C','O','M','M','I','T','C','O','N','F','L', + 'I','C','T','C','R','O','S','S','C','U','R','R','E','N','T','_','T','I', + 'M','E','S','T','A','M','P','R','I','M','A','R','Y','D','E','F','E','R', + 'R','E','D','I','S','T','I','N','C','T','D','O','R','D','E','R','E','S', + 'T','R','I','C','T','D','R','O','P','F','A','I','L','F','R','O','M','F', + 'U','L','L','I','F','I','S','N','U','L','L','R','I','G','H','T','R','O', + 'L','L','B','A','C','K','R','O','W','U','N','I','O','N','U','S','I','N', + 'G','V','A','C','U','U','M','V','I','E','W','I','N','I','T','I','A','L', + 'L','Y', +}; +/* aKWHash[i] is the hash value for the i-th keyword */ +static const unsigned char aKWHash[127] = { + 74, 108, 119, 72, 0, 45, 0, 0, 81, 0, 76, 61, 0, + 42, 12, 77, 15, 0, 118, 84, 54, 116, 0, 19, 0, 0, + 123, 0, 121, 111, 0, 22, 96, 0, 9, 0, 0, 68, 69, + 0, 67, 6, 0, 48, 93, 105, 0, 120, 104, 0, 0, 44, + 0, 106, 24, 0, 17, 0, 124, 53, 23, 0, 5, 62, 25, + 99, 0, 0, 126, 112, 60, 125, 57, 28, 55, 0, 94, 0, + 103, 26, 0, 102, 0, 0, 0, 98, 95, 100, 91, 115, 14, + 39, 114, 0, 80, 0, 109, 92, 90, 32, 0, 122, 79, 117, + 86, 46, 83, 0, 0, 97, 40, 59, 110, 0, 36, 0, 0, + 29, 0, 89, 87, 88, 0, 20, 85, 0, 56, +}; +/* aKWNext[] forms the hash collision chain. If aKWHash[i]==0 +** then the i-th keyword has no more hash collisions. Otherwise, +** the next keyword with the same hash is aKWHash[i]-1. */ +static const unsigned char aKWNext[126] = { + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, + 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 33, 0, 21, 0, 0, 0, 0, 0, 50, + 0, 43, 3, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 64, 0, 0, 65, 0, 41, 0, 38, 0, 0, 0, + 0, 0, 49, 75, 0, 0, 30, 0, 58, 0, 0, 63, 31, + 52, 16, 34, 10, 0, 0, 0, 0, 0, 0, 0, 11, 70, + 78, 0, 8, 0, 18, 51, 0, 107, 101, 0, 113, 0, 73, + 27, 37, 71, 82, 0, 35, 66, 0, 0, +}; +/* aKWLen[i] is the length (in bytes) of the i-th keyword */ +static const unsigned char aKWLen[126] = { + 7, 7, 5, 4, 6, 4, 5, 3, 6, 7, 3, 6, 6, + 7, 7, 3, 8, 2, 6, 5, 4, 4, 3, 10, 4, 6, + 11, 6, 2, 7, 5, 5, 9, 6, 9, 9, 7, 10, 10, + 4, 6, 2, 3, 9, 4, 2, 6, 5, 7, 4, 5, 7, + 6, 6, 5, 6, 5, 5, 9, 7, 7, 4, 2, 7, 3, + 6, 4, 7, 6, 12, 6, 9, 4, 6, 4, 5, 4, 7, + 6, 5, 6, 7, 5, 4, 7, 3, 2, 4, 5, 6, 5, + 7, 3, 7, 13, 2, 2, 4, 6, 6, 8, 5, 17, 12, + 7, 8, 8, 2, 2, 5, 8, 4, 4, 4, 4, 2, 6, + 5, 8, 3, 5, 5, 6, 4, 9, 3, +}; +/* aKWOffset[i] is the index into zKWText[] of the start of +** the text for the i-th keyword. */ +static const unsigned short int aKWOffset[126] = { + 0, 2, 2, 8, 9, 14, 16, 20, 23, 25, 25, 29, 33, + 36, 41, 46, 48, 53, 54, 59, 62, 65, 67, 69, 78, 81, + 86, 91, 95, 96, 101, 105, 109, 117, 122, 128, 136, 142, 152, + 159, 162, 162, 165, 167, 167, 171, 176, 179, 184, 184, 188, 192, + 199, 204, 209, 212, 218, 221, 225, 234, 240, 246, 249, 251, 252, + 256, 262, 266, 273, 279, 291, 297, 306, 308, 314, 318, 323, 325, + 332, 337, 342, 348, 354, 359, 362, 362, 362, 365, 369, 372, 378, + 382, 389, 391, 398, 400, 402, 411, 415, 421, 427, 435, 440, 440, + 456, 463, 470, 471, 478, 479, 483, 491, 495, 499, 503, 507, 509, + 515, 520, 528, 531, 536, 541, 547, 551, 556, +}; +/* aKWCode[i] is the parser symbol code for the i-th keyword */ +static const unsigned char aKWCode[126] = { + TK_REINDEX, TK_INDEXED, TK_INDEX, TK_DESC, TK_ESCAPE, + TK_EACH, TK_CHECK, TK_KEY, TK_BEFORE, TK_FOREIGN, + TK_FOR, TK_IGNORE, TK_LIKE_KW, TK_EXPLAIN, TK_INSTEAD, + TK_ADD, TK_DATABASE, TK_AS, TK_SELECT, TK_TABLE, + TK_JOIN_KW, TK_THEN, TK_END, TK_DEFERRABLE, TK_ELSE, + TK_EXCEPT, TK_TRANSACTION,TK_ACTION, TK_ON, TK_JOIN_KW, + TK_ALTER, TK_RAISE, TK_EXCLUSIVE, TK_EXISTS, TK_SAVEPOINT, + TK_INTERSECT, TK_TRIGGER, TK_REFERENCES, TK_CONSTRAINT, TK_INTO, + TK_OFFSET, TK_OF, TK_SET, TK_TEMP, TK_TEMP, + TK_OR, TK_UNIQUE, TK_QUERY, TK_WITHOUT, TK_WITH, + TK_JOIN_KW, TK_RELEASE, TK_ATTACH, TK_HAVING, TK_GROUP, + TK_UPDATE, TK_BEGIN, TK_JOIN_KW, TK_RECURSIVE, TK_BETWEEN, + TK_NOTHING, TK_LIKE_KW, TK_BY, TK_CASCADE, TK_ASC, + TK_DELETE, TK_CASE, TK_COLLATE, TK_CREATE, TK_CTIME_KW, + TK_DETACH, TK_IMMEDIATE, TK_JOIN, TK_INSERT, TK_LIKE_KW, + TK_MATCH, TK_PLAN, TK_ANALYZE, TK_PRAGMA, TK_ABORT, + TK_VALUES, TK_VIRTUAL, TK_LIMIT, TK_WHEN, TK_NOTNULL, + TK_NOT, TK_NO, TK_NULL, TK_WHERE, TK_RENAME, + TK_AFTER, TK_REPLACE, TK_AND, TK_DEFAULT, TK_AUTOINCR, + TK_TO, TK_IN, TK_CAST, TK_COLUMNKW, TK_COMMIT, + TK_CONFLICT, TK_JOIN_KW, TK_CTIME_KW, TK_CTIME_KW, TK_PRIMARY, + TK_DEFERRED, TK_DISTINCT, TK_IS, TK_DO, TK_ORDER, + TK_RESTRICT, TK_DROP, TK_FAIL, TK_FROM, TK_JOIN_KW, + TK_IF, TK_ISNULL, TK_JOIN_KW, TK_ROLLBACK, TK_ROW, + TK_UNION, TK_USING, TK_VACUUM, TK_VIEW, TK_INITIALLY, + TK_ALL, +}; +/* Check to see if z[0..n-1] is a keyword. If it is, write the +** parser symbol code for that keyword into *pType. Always +** return the integer n (the length of the token). */ +static int keywordCode(const char *z, int n, int *pType){ + int i, j; + const char *zKW; + if( n>=2 ){ + i = ((charMap(z[0])*4) ^ (charMap(z[n-1])*3) ^ n) % 127; + for(i=((int)aKWHash[i])-1; i>=0; i=((int)aKWNext[i])-1){ + if( aKWLen[i]!=n ) continue; + j = 0; + zKW = &zKWText[aKWOffset[i]]; +#ifdef SQLITE_ASCII + while( j<n && (z[j]&~0x20)==zKW[j] ){ j++; } +#endif +#ifdef SQLITE_EBCDIC + while( j<n && toupper(z[j])==zKW[j] ){ j++; } +#endif + if( j<n ) continue; testcase( i==0 ); /* REINDEX */ testcase( i==1 ); /* INDEXED */ testcase( i==2 ); /* INDEX */ @@ -125486,79 +145831,94 @@ static int keywordCode(const char *z, int n){ testcase( i==57 ); /* INNER */ testcase( i==58 ); /* RECURSIVE */ testcase( i==59 ); /* BETWEEN */ - testcase( i==60 ); /* NOTNULL */ - testcase( i==61 ); /* NOT */ - testcase( i==62 ); /* NO */ - testcase( i==63 ); /* NULL */ - testcase( i==64 ); /* LIKE */ - testcase( i==65 ); /* CASCADE */ - testcase( i==66 ); /* ASC */ - testcase( i==67 ); /* DELETE */ - testcase( i==68 ); /* CASE */ - testcase( i==69 ); /* COLLATE */ - testcase( i==70 ); /* CREATE */ - testcase( i==71 ); /* CURRENT_DATE */ - testcase( i==72 ); /* DETACH */ - testcase( i==73 ); /* IMMEDIATE */ - testcase( i==74 ); /* JOIN */ - testcase( i==75 ); /* INSERT */ - testcase( i==76 ); /* MATCH */ - testcase( i==77 ); /* PLAN */ - testcase( i==78 ); /* ANALYZE */ - testcase( i==79 ); /* PRAGMA */ - testcase( i==80 ); /* ABORT */ - testcase( i==81 ); /* VALUES */ - testcase( i==82 ); /* VIRTUAL */ - testcase( i==83 ); /* LIMIT */ - testcase( i==84 ); /* WHEN */ - testcase( i==85 ); /* WHERE */ - testcase( i==86 ); /* RENAME */ - testcase( i==87 ); /* AFTER */ - testcase( i==88 ); /* REPLACE */ - testcase( i==89 ); /* AND */ - testcase( i==90 ); /* DEFAULT */ - testcase( i==91 ); /* AUTOINCREMENT */ - testcase( i==92 ); /* TO */ - testcase( i==93 ); /* IN */ - testcase( i==94 ); /* CAST */ - testcase( i==95 ); /* COLUMN */ - testcase( i==96 ); /* COMMIT */ - testcase( i==97 ); /* CONFLICT */ - testcase( i==98 ); /* CROSS */ - testcase( i==99 ); /* CURRENT_TIMESTAMP */ - testcase( i==100 ); /* CURRENT_TIME */ - testcase( i==101 ); /* PRIMARY */ - testcase( i==102 ); /* DEFERRED */ - testcase( i==103 ); /* DISTINCT */ - testcase( i==104 ); /* IS */ - testcase( i==105 ); /* DROP */ - testcase( i==106 ); /* FAIL */ - testcase( i==107 ); /* FROM */ - testcase( i==108 ); /* FULL */ - testcase( i==109 ); /* GLOB */ - testcase( i==110 ); /* BY */ - testcase( i==111 ); /* IF */ - testcase( i==112 ); /* ISNULL */ - testcase( i==113 ); /* ORDER */ - testcase( i==114 ); /* RESTRICT */ - testcase( i==115 ); /* RIGHT */ - testcase( i==116 ); /* ROLLBACK */ - testcase( i==117 ); /* ROW */ - testcase( i==118 ); /* UNION */ - testcase( i==119 ); /* USING */ - testcase( i==120 ); /* VACUUM */ - testcase( i==121 ); /* VIEW */ - testcase( i==122 ); /* INITIALLY */ - testcase( i==123 ); /* ALL */ - return aCode[i]; + testcase( i==60 ); /* NOTHING */ + testcase( i==61 ); /* GLOB */ + testcase( i==62 ); /* BY */ + testcase( i==63 ); /* CASCADE */ + testcase( i==64 ); /* ASC */ + testcase( i==65 ); /* DELETE */ + testcase( i==66 ); /* CASE */ + testcase( i==67 ); /* COLLATE */ + testcase( i==68 ); /* CREATE */ + testcase( i==69 ); /* CURRENT_DATE */ + testcase( i==70 ); /* DETACH */ + testcase( i==71 ); /* IMMEDIATE */ + testcase( i==72 ); /* JOIN */ + testcase( i==73 ); /* INSERT */ + testcase( i==74 ); /* LIKE */ + testcase( i==75 ); /* MATCH */ + testcase( i==76 ); /* PLAN */ + testcase( i==77 ); /* ANALYZE */ + testcase( i==78 ); /* PRAGMA */ + testcase( i==79 ); /* ABORT */ + testcase( i==80 ); /* VALUES */ + testcase( i==81 ); /* VIRTUAL */ + testcase( i==82 ); /* LIMIT */ + testcase( i==83 ); /* WHEN */ + testcase( i==84 ); /* NOTNULL */ + testcase( i==85 ); /* NOT */ + testcase( i==86 ); /* NO */ + testcase( i==87 ); /* NULL */ + testcase( i==88 ); /* WHERE */ + testcase( i==89 ); /* RENAME */ + testcase( i==90 ); /* AFTER */ + testcase( i==91 ); /* REPLACE */ + testcase( i==92 ); /* AND */ + testcase( i==93 ); /* DEFAULT */ + testcase( i==94 ); /* AUTOINCREMENT */ + testcase( i==95 ); /* TO */ + testcase( i==96 ); /* IN */ + testcase( i==97 ); /* CAST */ + testcase( i==98 ); /* COLUMN */ + testcase( i==99 ); /* COMMIT */ + testcase( i==100 ); /* CONFLICT */ + testcase( i==101 ); /* CROSS */ + testcase( i==102 ); /* CURRENT_TIMESTAMP */ + testcase( i==103 ); /* CURRENT_TIME */ + testcase( i==104 ); /* PRIMARY */ + testcase( i==105 ); /* DEFERRED */ + testcase( i==106 ); /* DISTINCT */ + testcase( i==107 ); /* IS */ + testcase( i==108 ); /* DO */ + testcase( i==109 ); /* ORDER */ + testcase( i==110 ); /* RESTRICT */ + testcase( i==111 ); /* DROP */ + testcase( i==112 ); /* FAIL */ + testcase( i==113 ); /* FROM */ + testcase( i==114 ); /* FULL */ + testcase( i==115 ); /* IF */ + testcase( i==116 ); /* ISNULL */ + testcase( i==117 ); /* RIGHT */ + testcase( i==118 ); /* ROLLBACK */ + testcase( i==119 ); /* ROW */ + testcase( i==120 ); /* UNION */ + testcase( i==121 ); /* USING */ + testcase( i==122 ); /* VACUUM */ + testcase( i==123 ); /* VIEW */ + testcase( i==124 ); /* INITIALLY */ + testcase( i==125 ); /* ALL */ + *pType = aKWCode[i]; + break; } } - return TK_ID; + return n; } SQLITE_PRIVATE int sqlite3KeywordCode(const unsigned char *z, int n){ - return keywordCode((char*)z, n); + int id = TK_ID; + keywordCode((char*)z, n, &id); + return id; +} +#define SQLITE_N_KEYWORD 126 +SQLITE_API int sqlite3_keyword_name(int i,const char **pzName,int *pnName){ + if( i<0 || i>=SQLITE_N_KEYWORD ) return SQLITE_ERROR; + *pzName = zKWText + aKWOffset[i]; + *pnName = aKWLen[i]; + return SQLITE_OK; +} +SQLITE_API int sqlite3_keyword_count(void){ return SQLITE_N_KEYWORD; } +SQLITE_API int sqlite3_keyword_check(const char *zName, int nName){ + return TK_ID!=sqlite3KeywordCode((const u8*)zName, nName); } -#define SQLITE_N_KEYWORD 124 /************** End of keywordhash.h *****************************************/ /************** Continuing where we left off in tokenize.c *******************/ @@ -125601,17 +145961,23 @@ SQLITE_PRIVATE const char sqlite3IsEbcdicIdChar[] = { }; #define IdChar(C) (((c=C)>=0x42 && sqlite3IsEbcdicIdChar[c-0x40])) #endif + +/* Make the IdChar function accessible from ctime.c */ +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS SQLITE_PRIVATE int sqlite3IsIdChar(u8 c){ return IdChar(c); } +#endif /* -** Return the length of the token that begins at z[0]. +** Return the length (in bytes) of the token that begins at z[0]. ** Store the token type in *tokenType before returning. */ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ int i, c; - switch( *z ){ - case ' ': case '\t': case '\n': case '\f': case '\r': { + switch( aiClass[*z] ){ /* Switch on the character-class of the first byte + ** of the token. See the comment on the CC_ defines + ** above. */ + case CC_SPACE: { testcase( z[0]==' ' ); testcase( z[0]=='\t' ); testcase( z[0]=='\n' ); @@ -125621,7 +145987,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ *tokenType = TK_SPACE; return i; } - case '-': { + case CC_MINUS: { if( z[1]=='-' ){ for(i=2; (c=z[i])!=0 && c!='\n'; i++){} *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ @@ -125630,27 +145996,27 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ *tokenType = TK_MINUS; return 1; } - case '(': { + case CC_LP: { *tokenType = TK_LP; return 1; } - case ')': { + case CC_RP: { *tokenType = TK_RP; return 1; } - case ';': { + case CC_SEMI: { *tokenType = TK_SEMI; return 1; } - case '+': { + case CC_PLUS: { *tokenType = TK_PLUS; return 1; } - case '*': { + case CC_STAR: { *tokenType = TK_STAR; return 1; } - case '/': { + case CC_SLASH: { if( z[1]!='*' || z[2]==0 ){ *tokenType = TK_SLASH; return 1; @@ -125660,15 +146026,15 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ return i; } - case '%': { + case CC_PERCENT: { *tokenType = TK_REM; return 1; } - case '=': { + case CC_EQ: { *tokenType = TK_EQ; return 1 + (z[1]=='='); } - case '<': { + case CC_LT: { if( (c=z[1])=='=' ){ *tokenType = TK_LE; return 2; @@ -125683,7 +146049,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return 1; } } - case '>': { + case CC_GT: { if( (c=z[1])=='=' ){ *tokenType = TK_GE; return 2; @@ -125695,16 +146061,16 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return 1; } } - case '!': { + case CC_BANG: { if( z[1]!='=' ){ *tokenType = TK_ILLEGAL; - return 2; + return 1; }else{ *tokenType = TK_NE; return 2; } } - case '|': { + case CC_PIPE: { if( z[1]!='|' ){ *tokenType = TK_BITOR; return 1; @@ -125713,21 +146079,19 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return 2; } } - case ',': { + case CC_COMMA: { *tokenType = TK_COMMA; return 1; } - case '&': { + case CC_AND: { *tokenType = TK_BITAND; return 1; } - case '~': { + case CC_TILDA: { *tokenType = TK_BITNOT; return 1; } - case '`': - case '\'': - case '"': { + case CC_QUOTE: { int delim = z[0]; testcase( delim=='`' ); testcase( delim=='\'' ); @@ -125752,7 +146116,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ return i; } } - case '.': { + case CC_DOT: { #ifndef SQLITE_OMIT_FLOATING_POINT if( !sqlite3Isdigit(z[1]) ) #endif @@ -125763,8 +146127,7 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ /* If the next character is a digit, this is a floating point ** number that begins with ".". Fall thru into the next case */ } - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { + case CC_DIGIT: { testcase( z[0]=='0' ); testcase( z[0]=='1' ); testcase( z[0]=='2' ); testcase( z[0]=='3' ); testcase( z[0]=='4' ); testcase( z[0]=='5' ); testcase( z[0]=='6' ); testcase( z[0]=='7' ); testcase( z[0]=='8' ); @@ -125799,22 +146162,18 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ } return i; } - case '[': { + case CC_QUOTE2: { for(i=1, c=z[0]; c!=']' && (c=z[i])!=0; i++){} *tokenType = c==']' ? TK_ID : TK_ILLEGAL; return i; } - case '?': { + case CC_VARNUM: { *tokenType = TK_VARIABLE; for(i=1; sqlite3Isdigit(z[i]); i++){} return i; } -#ifndef SQLITE_OMIT_TCL_VARIABLE - case '$': -#endif - case '@': /* For compatibility with MS SQL Server */ - case '#': - case ':': { + case CC_DOLLAR: + case CC_VARALPHA: { int n = 0; testcase( z[0]=='$' ); testcase( z[0]=='@' ); testcase( z[0]==':' ); testcase( z[0]=='#' ); @@ -125843,8 +146202,20 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ if( n==0 ) *tokenType = TK_ILLEGAL; return i; } + case CC_KYWD: { + for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} + if( IdChar(z[i]) ){ + /* This token started out using characters that can appear in keywords, + ** but z[i] is a character not allowed within keywords, so this must + ** be an identifier instead */ + i++; + break; + } + *tokenType = TK_ID; + return keywordCode((char*)z, i, tokenType); + } + case CC_X: { #ifndef SQLITE_OMIT_BLOB_LITERAL - case 'x': case 'X': { testcase( z[0]=='x' ); testcase( z[0]=='X' ); if( z[1]=='\'' ){ *tokenType = TK_BLOB; @@ -125856,20 +146227,22 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ if( z[i] ) i++; return i; } - /* Otherwise fall through to the next case */ - } #endif + /* If it is not a BLOB literal, then it must be an ID, since no + ** SQL keywords start with the letter 'x'. Fall through */ + } + case CC_ID: { + i = 1; + break; + } default: { - if( !IdChar(*z) ){ - break; - } - for(i=1; IdChar(z[i]); i++){} - *tokenType = keywordCode((char*)z, i); - return i; + *tokenType = TK_ILLEGAL; + return 1; } } - *tokenType = TK_ILLEGAL; - return 1; + while( IdChar(z[i]) ){ i++; } + *tokenType = TK_ID; + return i; } /* @@ -125881,97 +146254,98 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){ */ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ int nErr = 0; /* Number of errors encountered */ - int i; /* Loop counter */ void *pEngine; /* The LEMON-generated LALR(1) parser */ + int n = 0; /* Length of the next token token */ int tokenType; /* type of the next token */ int lastTokenParsed = -1; /* type of the previous token */ - u8 enableLookaside; /* Saved value of db->lookaside.bEnabled */ sqlite3 *db = pParse->db; /* The database connection */ int mxSqlLen; /* Max length of an SQL string */ - - -#ifdef SQLITE_ENABLE_API_ARMOR - if( zSql==0 || pzErrMsg==0 ) return SQLITE_MISUSE_BKPT; +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + yyParser sEngine; /* Space to hold the Lemon-generated Parser object */ #endif + + assert( zSql!=0 ); mxSqlLen = db->aLimit[SQLITE_LIMIT_SQL_LENGTH]; if( db->nVdbeActive==0 ){ db->u1.isInterrupted = 0; } pParse->rc = SQLITE_OK; pParse->zTail = zSql; - i = 0; assert( pzErrMsg!=0 ); - pEngine = sqlite3ParserAlloc(sqlite3Malloc); + /* sqlite3ParserTrace(stdout, "parser: "); */ +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + pEngine = &sEngine; + sqlite3ParserInit(pEngine, pParse); +#else + pEngine = sqlite3ParserAlloc(sqlite3Malloc, pParse); if( pEngine==0 ){ - db->mallocFailed = 1; - return SQLITE_NOMEM; + sqlite3OomFault(db); + return SQLITE_NOMEM_BKPT; } +#endif assert( pParse->pNewTable==0 ); assert( pParse->pNewTrigger==0 ); assert( pParse->nVar==0 ); - assert( pParse->nzVar==0 ); - assert( pParse->azVar==0 ); - enableLookaside = db->lookaside.bEnabled; - if( db->lookaside.pStart ) db->lookaside.bEnabled = 1; - while( !db->mallocFailed && zSql[i]!=0 ){ - assert( i>=0 ); - pParse->sLastToken.z = &zSql[i]; - pParse->sLastToken.n = sqlite3GetToken((unsigned char*)&zSql[i],&tokenType); - i += pParse->sLastToken.n; - if( i>mxSqlLen ){ - pParse->rc = SQLITE_TOOBIG; - break; - } - switch( tokenType ){ - case TK_SPACE: { - if( db->u1.isInterrupted ){ - sqlite3ErrorMsg(pParse, "interrupt"); - pParse->rc = SQLITE_INTERRUPT; - goto abort_parse; - } + assert( pParse->pVList==0 ); + while( 1 ){ + if( zSql[0]!=0 ){ + n = sqlite3GetToken((u8*)zSql, &tokenType); + mxSqlLen -= n; + if( mxSqlLen<0 ){ + pParse->rc = SQLITE_TOOBIG; break; } - case TK_ILLEGAL: { - sqlite3DbFree(db, *pzErrMsg); - *pzErrMsg = sqlite3MPrintf(db, "unrecognized token: \"%T\"", - &pParse->sLastToken); - nErr++; - goto abort_parse; + }else{ + /* Upon reaching the end of input, call the parser two more times + ** with tokens TK_SEMI and 0, in that order. */ + if( lastTokenParsed==TK_SEMI ){ + tokenType = 0; + }else if( lastTokenParsed==0 ){ + break; + }else{ + tokenType = TK_SEMI; } - case TK_SEMI: { - pParse->zTail = &zSql[i]; - /* Fall thru into the default case */ - } - default: { - sqlite3Parser(pEngine, tokenType, pParse->sLastToken, pParse); - lastTokenParsed = tokenType; - if( pParse->rc!=SQLITE_OK ){ - goto abort_parse; - } + n = 0; + } + if( tokenType>=TK_SPACE ){ + assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL ); + if( db->u1.isInterrupted ){ + pParse->rc = SQLITE_INTERRUPT; break; } + if( tokenType==TK_ILLEGAL ){ + sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql); + break; + } + zSql += n; + }else{ + pParse->sLastToken.z = zSql; + pParse->sLastToken.n = n; + sqlite3Parser(pEngine, tokenType, pParse->sLastToken); + lastTokenParsed = tokenType; + zSql += n; + if( pParse->rc!=SQLITE_OK || db->mallocFailed ) break; } } -abort_parse: - if( zSql[i]==0 && nErr==0 && pParse->rc==SQLITE_OK ){ - if( lastTokenParsed!=TK_SEMI ){ - sqlite3Parser(pEngine, TK_SEMI, pParse->sLastToken, pParse); - pParse->zTail = &zSql[i]; - } - sqlite3Parser(pEngine, 0, pParse->sLastToken, pParse); - } + assert( nErr==0 ); + pParse->zTail = zSql; #ifdef YYTRACKMAXSTACKDEPTH - sqlite3StatusSet(SQLITE_STATUS_PARSER_STACK, + sqlite3_mutex_enter(sqlite3MallocMutex()); + sqlite3StatusHighwater(SQLITE_STATUS_PARSER_STACK, sqlite3ParserStackPeak(pEngine) ); + sqlite3_mutex_leave(sqlite3MallocMutex()); #endif /* YYDEBUG */ +#ifdef sqlite3Parser_ENGINEALWAYSONSTACK + sqlite3ParserFinalize(pEngine); +#else sqlite3ParserFree(pEngine, sqlite3_free); - db->lookaside.bEnabled = enableLookaside; +#endif if( db->mallocFailed ){ - pParse->rc = SQLITE_NOMEM; + pParse->rc = SQLITE_NOMEM_BKPT; } if( pParse->rc!=SQLITE_OK && pParse->rc!=SQLITE_DONE && pParse->zErrMsg==0 ){ - sqlite3SetString(&pParse->zErrMsg, db, "%s", sqlite3ErrStr(pParse->rc)); + pParse->zErrMsg = sqlite3MPrintf(db, "%s", sqlite3ErrStr(pParse->rc)); } assert( pzErrMsg!=0 ); if( pParse->zErrMsg ){ @@ -126003,23 +146377,20 @@ abort_parse: sqlite3DeleteTable(db, pParse->pNewTable); } - if( pParse->bFreeWith ) sqlite3WithDelete(db, pParse->pWith); + if( pParse->pWithToFree ) sqlite3WithDelete(db, pParse->pWithToFree); sqlite3DeleteTrigger(db, pParse->pNewTrigger); - for(i=pParse->nzVar-1; i>=0; i--) sqlite3DbFree(db, pParse->azVar[i]); - sqlite3DbFree(db, pParse->azVar); + sqlite3DbFree(db, pParse->pVList); while( pParse->pAinc ){ AutoincInfo *p = pParse->pAinc; pParse->pAinc = p->pNext; - sqlite3DbFree(db, p); + sqlite3DbFreeNN(db, p); } while( pParse->pZombieTab ){ Table *p = pParse->pZombieTab; pParse->pZombieTab = p->pNextZombie; sqlite3DeleteTable(db, p); } - if( nErr>0 && pParse->rc==SQLITE_OK ){ - pParse->rc = SQLITE_ERROR; - } + assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } @@ -126043,6 +146414,7 @@ abort_parse: ** separating it out, the code will be automatically omitted from ** static links that do not use it. */ +/* #include "sqliteInt.h" */ #ifndef SQLITE_OMIT_COMPLETE /* @@ -126295,7 +146667,7 @@ SQLITE_API int sqlite3_complete(const char *zSql){ SQLITE_API int sqlite3_complete16(const void *zSql){ sqlite3_value *pVal; char const *zSql8; - int rc = SQLITE_NOMEM; + int rc; #ifndef SQLITE_OMIT_AUTOINIT rc = sqlite3_initialize(); @@ -126307,10 +146679,10 @@ SQLITE_API int sqlite3_complete16(const void *zSql){ if( zSql8 ){ rc = sqlite3_complete(zSql8); }else{ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } sqlite3ValueFree(pVal); - return sqlite3ApiExit(0, rc); + return rc & 0xff; } #endif /* SQLITE_OMIT_UTF16 */ #endif /* SQLITE_OMIT_COMPLETE */ @@ -126333,6 +146705,7 @@ SQLITE_API int sqlite3_complete16(const void *zSql){ ** other files are for internal use by SQLite and should not be ** accessed by users of the library. */ +/* #include "sqliteInt.h" */ #ifdef SQLITE_ENABLE_FTS3 /************** Include fts3.h in the middle of main.c ***********************/ @@ -126352,6 +146725,7 @@ SQLITE_API int sqlite3_complete16(const void *zSql){ ** This header file is used by programs that want to link against the ** FTS3 library. All it does is declare the sqlite3Fts3Init() interface. */ +/* #include "sqlite3.h" */ #if 0 extern "C" { @@ -126384,6 +146758,11 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db); ** This header file is used by programs that want to link against the ** RTREE library. All it does is declare the sqlite3RtreeInit() interface. */ +/* #include "sqlite3.h" */ + +#ifdef SQLITE_OMIT_VIRTUALTABLE +# undef SQLITE_ENABLE_RTREE +#endif #if 0 extern "C" { @@ -126398,7 +146777,7 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db); /************** End of rtree.h ***********************************************/ /************** Continuing where we left off in main.c ***********************/ #endif -#ifdef SQLITE_ENABLE_ICU +#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) /************** Include sqliteicu.h in the middle of main.c ******************/ /************** Begin file sqliteicu.h ***************************************/ /* @@ -126416,6 +146795,7 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db); ** This header file is used by programs that want to link against the ** ICU extension. All it does is declare the sqlite3IcuInit() interface. */ +/* #include "sqlite3.h" */ #if 0 extern "C" { @@ -126431,6 +146811,15 @@ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db); /************** End of sqliteicu.h *******************************************/ /************** Continuing where we left off in main.c ***********************/ #endif +#ifdef SQLITE_ENABLE_JSON1 +SQLITE_PRIVATE int sqlite3Json1Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_STMTVTAB +SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS5 +SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3*); +#endif #ifndef SQLITE_AMALGAMATION /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant @@ -126444,11 +146833,13 @@ SQLITE_API const char sqlite3_version[] = SQLITE_VERSION; */ SQLITE_API const char *sqlite3_libversion(void){ return sqlite3_version; } -/* IMPLEMENTATION-OF: R-63124-39300 The sqlite3_sourceid() function returns a +/* IMPLEMENTATION-OF: R-25063-23286 The sqlite3_sourceid() function returns a ** pointer to a string constant whose value is the same as the -** SQLITE_SOURCE_ID C preprocessor macro. +** SQLITE_SOURCE_ID C preprocessor macro. Except if SQLite is built using +** an edited copy of the amalgamation, then the last four characters of +** the hash might be different from SQLITE_SOURCE_ID. */ -SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } +/* SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } */ /* IMPLEMENTATION-OF: R-35210-63508 The sqlite3_libversion_number() function ** returns an integer equal to SQLITE_VERSION_NUMBER. @@ -126461,6 +146852,18 @@ SQLITE_API int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } */ SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } +/* +** When compiling the test fixture or with debugging enabled (on Win32), +** this variable being set to non-zero will cause OSTRACE macros to emit +** extra diagnostic information. +*/ +#ifdef SQLITE_HAVE_OS_TRACE +# ifndef SQLITE_DEBUG_OS_TRACE +# define SQLITE_DEBUG_OS_TRACE 0 +# endif + int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE; +#endif + #if !defined(SQLITE_OMIT_TRACE) && defined(SQLITE_ENABLE_IOTRACE) /* ** If the following function pointer is not NULL and if @@ -126468,7 +146871,7 @@ SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } ** I/O active are written using this function. These messages ** are intended for debugging activity only. */ -/* not-private */ void (*sqlite3IoTrace)(const char*, ...) = 0; +SQLITE_API void (SQLITE_CDECL *sqlite3IoTrace)(const char*, ...) = 0; #endif /* @@ -126534,6 +146937,11 @@ SQLITE_API int sqlite3_initialize(void){ } #endif + /* If the following assert() fails on some obscure processor/compiler + ** combination, the work-around is to set the correct pointer + ** size at compile-time using -DSQLITE_PTRSIZE=n compile-time option */ + assert( SQLITE_PTRSIZE==sizeof(char*) ); + /* If SQLite is already completely initialized, then this call ** to sqlite3_initialize() should be a no-op. But the initialization ** must be complete. So isInit must not be set until the very end @@ -126570,7 +146978,7 @@ SQLITE_API int sqlite3_initialize(void){ sqlite3GlobalConfig.pInitMutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); if( sqlite3GlobalConfig.bCoreMutex && !sqlite3GlobalConfig.pInitMutex ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } } } @@ -126601,10 +147009,15 @@ SQLITE_API int sqlite3_initialize(void){ */ sqlite3_mutex_enter(sqlite3GlobalConfig.pInitMutex); if( sqlite3GlobalConfig.isInit==0 && sqlite3GlobalConfig.inProgress==0 ){ - FuncDefHash *pHash = &GLOBAL(FuncDefHash, sqlite3GlobalFunctions); sqlite3GlobalConfig.inProgress = 1; - memset(pHash, 0, sizeof(sqlite3GlobalFunctions)); - sqlite3RegisterGlobalFunctions(); +#ifdef SQLITE_ENABLE_SQLLOG + { + extern void sqlite3_init_sqllog(void); + sqlite3_init_sqllog(); + } +#endif + memset(&sqlite3BuiltinFunctions, 0, sizeof(sqlite3BuiltinFunctions)); + sqlite3RegisterBuiltinFunctions(); if( sqlite3GlobalConfig.isPCacheInit==0 ){ rc = sqlite3PcacheInitialize(); } @@ -126612,6 +147025,11 @@ SQLITE_API int sqlite3_initialize(void){ sqlite3GlobalConfig.isPCacheInit = 1; rc = sqlite3OsInit(); } +#ifdef SQLITE_ENABLE_DESERIALIZE + if( rc==SQLITE_OK ){ + rc = sqlite3MemdbInit(); + } +#endif if( rc==SQLITE_OK ){ sqlite3PCacheBufferSetup( sqlite3GlobalConfig.pPage, sqlite3GlobalConfig.szPage, sqlite3GlobalConfig.nPage); @@ -126644,7 +147062,7 @@ SQLITE_API int sqlite3_initialize(void){ #ifndef NDEBUG #ifndef SQLITE_OMIT_FLOATING_POINT /* This section of code's only "output" is via assert() statements. */ - if ( rc==SQLITE_OK ){ + if( rc==SQLITE_OK ){ u64 x = (((u64)1)<<63)-1; double y; assert(sizeof(x)==8); @@ -126746,26 +147164,28 @@ SQLITE_API int sqlite3_config(int op, ...){ */ #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-54466-46756 */ case SQLITE_CONFIG_SINGLETHREAD: { - /* Disable all mutexing */ - sqlite3GlobalConfig.bCoreMutex = 0; - sqlite3GlobalConfig.bFullMutex = 0; + /* EVIDENCE-OF: R-02748-19096 This option sets the threading mode to + ** Single-thread. */ + sqlite3GlobalConfig.bCoreMutex = 0; /* Disable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ break; } #endif #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-20520-54086 */ case SQLITE_CONFIG_MULTITHREAD: { - /* Disable mutexing of database connections */ - /* Enable mutexing of core data structures */ - sqlite3GlobalConfig.bCoreMutex = 1; - sqlite3GlobalConfig.bFullMutex = 0; + /* EVIDENCE-OF: R-14374-42468 This option sets the threading mode to + ** Multi-thread. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 0; /* Disable mutex on connections */ break; } #endif #if defined(SQLITE_THREADSAFE) && SQLITE_THREADSAFE>0 /* IMP: R-59593-21810 */ case SQLITE_CONFIG_SERIALIZED: { - /* Enable all mutexing */ - sqlite3GlobalConfig.bCoreMutex = 1; - sqlite3GlobalConfig.bFullMutex = 1; + /* EVIDENCE-OF: R-41220-51800 This option sets the threading mode to + ** Serialized. */ + sqlite3GlobalConfig.bCoreMutex = 1; /* Enable mutex on core */ + sqlite3GlobalConfig.bFullMutex = 1; /* Enable mutex on connections */ break; } #endif @@ -126809,20 +147229,15 @@ SQLITE_API int sqlite3_config(int op, ...){ sqlite3GlobalConfig.bMemstat = va_arg(ap, int); break; } - case SQLITE_CONFIG_SCRATCH: { - /* EVIDENCE-OF: R-08404-60887 There are three arguments to - ** SQLITE_CONFIG_SCRATCH: A pointer an 8-byte aligned memory buffer from - ** which the scratch allocations will be drawn, the size of each scratch - ** allocation (sz), and the maximum number of scratch allocations (N). */ - sqlite3GlobalConfig.pScratch = va_arg(ap, void*); - sqlite3GlobalConfig.szScratch = va_arg(ap, int); - sqlite3GlobalConfig.nScratch = va_arg(ap, int); + case SQLITE_CONFIG_SMALL_MALLOC: { + sqlite3GlobalConfig.bSmallMalloc = va_arg(ap, int); break; } case SQLITE_CONFIG_PAGECACHE: { - /* EVIDENCE-OF: R-31408-40510 There are three arguments to - ** SQLITE_CONFIG_PAGECACHE: A pointer to 8-byte aligned memory, the size - ** of each page buffer (sz), and the number of pages (N). */ + /* EVIDENCE-OF: R-18761-36601 There are three arguments to + ** SQLITE_CONFIG_PAGECACHE: A pointer to 8-byte aligned memory (pMem), + ** the size of each page cache line (sz), and the number of cache lines + ** (N). */ sqlite3GlobalConfig.pPage = va_arg(ap, void*); sqlite3GlobalConfig.szPage = va_arg(ap, int); sqlite3GlobalConfig.nPage = va_arg(ap, int); @@ -126877,7 +147292,8 @@ SQLITE_API int sqlite3_config(int op, ...){ case SQLITE_CONFIG_HEAP: { /* EVIDENCE-OF: R-19854-42126 There are three arguments to ** SQLITE_CONFIG_HEAP: An 8-byte aligned pointer to the memory, the - ** number of bytes in the memory buffer, and the minimum allocation size. */ + ** number of bytes in the memory buffer, and the minimum allocation size. + */ sqlite3GlobalConfig.pHeap = va_arg(ap, void*); sqlite3GlobalConfig.nHeap = va_arg(ap, int); sqlite3GlobalConfig.mnReq = va_arg(ap, int); @@ -126982,7 +147398,9 @@ SQLITE_API int sqlite3_config(int op, ...){ ** compile-time maximum mmap size set by the SQLITE_MAX_MMAP_SIZE ** compile-time option. */ - if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ) mxMmap = SQLITE_MAX_MMAP_SIZE; + if( mxMmap<0 || mxMmap>SQLITE_MAX_MMAP_SIZE ){ + mxMmap = SQLITE_MAX_MMAP_SIZE; + } if( szMmap<0 ) szMmap = SQLITE_DEFAULT_MMAP_SIZE; if( szMmap>mxMmap) szMmap = mxMmap; sqlite3GlobalConfig.mxMmap = mxMmap; @@ -127005,6 +147423,22 @@ SQLITE_API int sqlite3_config(int op, ...){ break; } + case SQLITE_CONFIG_STMTJRNL_SPILL: { + sqlite3GlobalConfig.nStmtSpill = va_arg(ap, int); + break; + } + +#ifdef SQLITE_ENABLE_SORTER_REFERENCES + case SQLITE_CONFIG_SORTERREF_SIZE: { + int iVal = va_arg(ap, int); + if( iVal<0 ){ + iVal = SQLITE_DEFAULT_SORTERREF_SIZE; + } + sqlite3GlobalConfig.szSorterRef = (u32)iVal; + break; + } +#endif /* SQLITE_ENABLE_SORTER_REFERENCES */ + default: { rc = SQLITE_ERROR; break; @@ -127026,8 +147460,10 @@ SQLITE_API int sqlite3_config(int op, ...){ ** the lookaside memory. */ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ +#ifndef SQLITE_OMIT_LOOKASIDE void *pStart; - if( db->lookaside.nOut ){ + + if( sqlite3LookasideUsed(db,0)>0 ){ return SQLITE_BUSY; } /* Free any existing lookaside buffer for this handle before @@ -127055,27 +147491,31 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ pStart = pBuf; } db->lookaside.pStart = pStart; + db->lookaside.pInit = 0; db->lookaside.pFree = 0; db->lookaside.sz = (u16)sz; if( pStart ){ int i; LookasideSlot *p; assert( sz > (int)sizeof(LookasideSlot*) ); + db->lookaside.nSlot = cnt; p = (LookasideSlot*)pStart; for(i=cnt-1; i>=0; i--){ - p->pNext = db->lookaside.pFree; - db->lookaside.pFree = p; + p->pNext = db->lookaside.pInit; + db->lookaside.pInit = p; p = (LookasideSlot*)&((u8*)p)[sz]; } db->lookaside.pEnd = p; - db->lookaside.bEnabled = 1; + db->lookaside.bDisable = 0; db->lookaside.bMalloced = pBuf==0 ?1:0; }else{ db->lookaside.pStart = db; db->lookaside.pEnd = db; - db->lookaside.bEnabled = 0; + db->lookaside.bDisable = 1; db->lookaside.bMalloced = 0; + db->lookaside.nSlot = 0; } +#endif /* SQLITE_OMIT_LOOKASIDE */ return SQLITE_OK; } @@ -127116,6 +147556,36 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){ return SQLITE_OK; } +/* +** Flush any dirty pages in the pager-cache for any attached database +** to disk. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3 *db){ + int i; + int rc = SQLITE_OK; + int bSeenBusy = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; +#endif + sqlite3_mutex_enter(db->mutex); + sqlite3BtreeEnterAll(db); + for(i=0; rc==SQLITE_OK && i<db->nDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt && sqlite3BtreeIsInTrans(pBt) ){ + Pager *pPager = sqlite3BtreePager(pBt); + rc = sqlite3PagerFlush(pPager); + if( rc==SQLITE_BUSY ){ + bSeenBusy = 1; + rc = SQLITE_OK; + } + } + } + sqlite3BtreeLeaveAll(db); + sqlite3_mutex_leave(db->mutex); + return ((rc==SQLITE_OK && bSeenBusy) ? SQLITE_BUSY : rc); +} + /* ** Configuration settings for an individual database connection */ @@ -127124,6 +147594,13 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ int rc; va_start(ap, op); switch( op ){ + case SQLITE_DBCONFIG_MAINDBNAME: { + /* IMP: R-06824-28531 */ + /* IMP: R-36257-52125 */ + db->aDb[0].zDbSName = va_arg(ap,char*); + rc = SQLITE_OK; + break; + } case SQLITE_DBCONFIG_LOOKASIDE: { void *pBuf = va_arg(ap, void*); /* IMP: R-26835-10964 */ int sz = va_arg(ap, int); /* IMP: R-47871-25994 */ @@ -127136,8 +147613,14 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ int op; /* The opcode */ u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ } aFlagOp[] = { - { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, - { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, + { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, + { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, + { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, + { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, + { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose }, + { SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_EnableQPSG }, + { SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_TriggerEQP }, + { SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_ResetDatabase }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -127145,7 +147628,7 @@ SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ if( aFlagOp[i].op==op ){ int onoff = va_arg(ap, int); int *pRes = va_arg(ap, int*); - int oldFlags = db->flags; + u32 oldFlags = db->flags; if( onoff>0 ){ db->flags |= aFlagOp[i].mask; }else if( onoff==0 ){ @@ -127194,6 +147677,7 @@ static int binCollFunc( /* EVIDENCE-OF: R-65033-28449 The built-in BINARY collation compares ** strings byte by byte using the memcmp() function from the standard C ** library. */ + assert( pKey1 && pKey2 ); rc = memcmp(pKey1, pKey2, n); if( rc==0 ){ if( padFlag @@ -127248,6 +147732,21 @@ SQLITE_API sqlite_int64 sqlite3_last_insert_rowid(sqlite3 *db){ return db->lastRowid; } +/* +** Set the value returned by the sqlite3_last_insert_rowid() API function. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3 *db, sqlite3_int64 iRowid){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return; + } +#endif + sqlite3_mutex_enter(db->mutex); + db->lastRowid = iRowid; + sqlite3_mutex_leave(db->mutex); +} + /* ** Return the number of changes in the most recent call to sqlite3_exec(). */ @@ -127297,7 +147796,7 @@ SQLITE_PRIVATE void sqlite3CloseSavepoints(sqlite3 *db){ ** with SQLITE_ANY as the encoding. */ static void functionDestroy(sqlite3 *db, FuncDef *p){ - FuncDestructor *pDestructor = p->pDestructor; + FuncDestructor *pDestructor = p->u.pDestructor; if( pDestructor ){ pDestructor->nRef--; if( pDestructor->nRef==0 ){ @@ -127314,17 +147813,23 @@ static void functionDestroy(sqlite3 *db, FuncDef *p){ static void disconnectAllVtab(sqlite3 *db){ #ifndef SQLITE_OMIT_VIRTUALTABLE int i; + HashElem *p; sqlite3BtreeEnterAll(db); for(i=0; i<db->nDb; i++){ Schema *pSchema = db->aDb[i].pSchema; if( db->aDb[i].pSchema ){ - HashElem *p; for(p=sqliteHashFirst(&pSchema->tblHash); p; p=sqliteHashNext(p)){ Table *pTab = (Table *)sqliteHashData(p); if( IsVirtual(pTab) ) sqlite3VtabDisconnect(db, pTab); } } } + for(p=sqliteHashFirst(&db->aModule); p; p=sqliteHashNext(p)){ + Module *pMod = (Module *)sqliteHashData(p); + if( pMod->pEpoTab ){ + sqlite3VtabDisconnect(db, pMod->pEpoTab); + } + } sqlite3VtabUnlockList(db); sqlite3BtreeLeaveAll(db); #else @@ -127360,6 +147865,9 @@ static int sqlite3Close(sqlite3 *db, int forceZombie){ return SQLITE_MISUSE_BKPT; } sqlite3_mutex_enter(db->mutex); + if( db->mTrace & SQLITE_TRACE_CLOSE ){ + db->xTrace(SQLITE_TRACE_CLOSE, db->pTraceArg, db, 0); + } /* Force xDisconnect calls on all virtual tables */ disconnectAllVtab(db); @@ -127473,18 +147981,17 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ */ sqlite3ConnectionClosed(db); - for(j=0; j<ArraySize(db->aFunc.a); j++){ - FuncDef *pNext, *pHash, *p; - for(p=db->aFunc.a[j]; p; p=pHash){ - pHash = p->pHash; - while( p ){ - functionDestroy(db, p); - pNext = p->pNext; - sqlite3DbFree(db, p); - p = pNext; - } - } + for(i=sqliteHashFirst(&db->aFunc); i; i=sqliteHashNext(i)){ + FuncDef *pNext, *p; + p = sqliteHashData(i); + do{ + functionDestroy(db, p); + pNext = p->pNext; + sqlite3DbFree(db, p); + p = pNext; + }while( p ); } + sqlite3HashClear(&db->aFunc); for(i=sqliteHashFirst(&db->aCollSeq); i; i=sqliteHashNext(i)){ CollSeq *pColl = (CollSeq *)sqliteHashData(i); /* Invoke any destructors registered for collation sequence user data. */ @@ -127502,6 +148009,7 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ if( pMod->xDestroy ){ pMod->xDestroy(pMod->pAux); } + sqlite3VtabEponymousTableClear(db, pMod); sqlite3DbFree(db, pMod); } sqlite3HashClear(&db->aModule); @@ -127527,7 +148035,7 @@ SQLITE_PRIVATE void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ sqlite3_mutex_leave(db->mutex); db->magic = SQLITE_MAGIC_CLOSED; sqlite3_mutex_free(db->mutex); - assert( db->lookaside.nOut==0 ); /* Fails on a lookaside memory leak */ + assert( sqlite3LookasideUsed(db,0)==0 ); if( db->lookaside.bMalloced ){ sqlite3_free(db->lookaside.pStart); } @@ -127555,7 +148063,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ ** the database rollback and schema reset, which can cause false ** corruption reports in some cases. */ sqlite3BtreeEnterAll(db); - schemaChange = (db->flags & SQLITE_InternChanges)!=0 && db->init.busy==0; + schemaChange = (db->mDbFlags & DBFLAG_SchemaChange)!=0 && db->init.busy==0; for(i=0; i<db->nDb; i++){ Btree *p = db->aDb[i].pBt; @@ -127569,7 +148077,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ sqlite3VtabRollback(db); sqlite3EndBenignMalloc(); - if( (db->flags&SQLITE_InternChanges)!=0 && db->init.busy==0 ){ + if( (db->mDbFlags&DBFLAG_SchemaChange)!=0 && db->init.busy==0 ){ sqlite3ExpirePreparedStatements(db); sqlite3ResetAllSchemasOfConnection(db); } @@ -127590,7 +148098,7 @@ SQLITE_PRIVATE void sqlite3RollbackAll(sqlite3 *db, int tripCode){ ** Return a static string containing the name corresponding to the error code ** specified in the argument. */ -#if (defined(SQLITE_DEBUG) && SQLITE_OS_WIN) || defined(SQLITE_TEST) +#if defined(SQLITE_NEED_ERR_NAME) SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ const char *zName = 0; int i, origRc = rc; @@ -127610,9 +148118,10 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ case SQLITE_NOMEM: zName = "SQLITE_NOMEM"; break; case SQLITE_READONLY: zName = "SQLITE_READONLY"; break; case SQLITE_READONLY_RECOVERY: zName = "SQLITE_READONLY_RECOVERY"; break; - case SQLITE_READONLY_CANTLOCK: zName = "SQLITE_READONLY_CANTLOCK"; break; + case SQLITE_READONLY_CANTINIT: zName = "SQLITE_READONLY_CANTINIT"; break; case SQLITE_READONLY_ROLLBACK: zName = "SQLITE_READONLY_ROLLBACK"; break; case SQLITE_READONLY_DBMOVED: zName = "SQLITE_READONLY_DBMOVED"; break; + case SQLITE_READONLY_DIRECTORY: zName = "SQLITE_READONLY_DIRECTORY";break; case SQLITE_INTERRUPT: zName = "SQLITE_INTERRUPT"; break; case SQLITE_IOERR: zName = "SQLITE_IOERR"; break; case SQLITE_IOERR_READ: zName = "SQLITE_IOERR_READ"; break; @@ -127702,10 +148211,10 @@ SQLITE_PRIVATE const char *sqlite3ErrName(int rc){ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ static const char* const aMsg[] = { /* SQLITE_OK */ "not an error", - /* SQLITE_ERROR */ "SQL logic error or missing database", + /* SQLITE_ERROR */ "SQL logic error", /* SQLITE_INTERNAL */ 0, /* SQLITE_PERM */ "access permission denied", - /* SQLITE_ABORT */ "callback requested query abort", + /* SQLITE_ABORT */ "query aborted", /* SQLITE_BUSY */ "database is locked", /* SQLITE_LOCKED */ "database table is locked", /* SQLITE_NOMEM */ "out of memory", @@ -127717,17 +148226,23 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ /* SQLITE_FULL */ "database or disk is full", /* SQLITE_CANTOPEN */ "unable to open database file", /* SQLITE_PROTOCOL */ "locking protocol", - /* SQLITE_EMPTY */ "table contains no data", + /* SQLITE_EMPTY */ 0, /* SQLITE_SCHEMA */ "database schema has changed", /* SQLITE_TOOBIG */ "string or blob too big", /* SQLITE_CONSTRAINT */ "constraint failed", /* SQLITE_MISMATCH */ "datatype mismatch", - /* SQLITE_MISUSE */ "library routine called out of sequence", + /* SQLITE_MISUSE */ "bad parameter or other API misuse", +#ifdef SQLITE_DISABLE_LFS /* SQLITE_NOLFS */ "large file support is disabled", +#else + /* SQLITE_NOLFS */ 0, +#endif /* SQLITE_AUTH */ "authorization denied", - /* SQLITE_FORMAT */ "auxiliary database format error", - /* SQLITE_RANGE */ "bind or column index out of range", - /* SQLITE_NOTADB */ "file is encrypted or is not a database", + /* SQLITE_FORMAT */ 0, + /* SQLITE_RANGE */ "column index out of range", + /* SQLITE_NOTADB */ "file is not a database", + /* SQLITE_NOTICE */ "notification message", + /* SQLITE_WARNING */ "warning message", }; const char *zErr = "unknown error"; switch( rc ){ @@ -127735,6 +148250,14 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ zErr = "abort due to ROLLBACK"; break; } + case SQLITE_ROW: { + zErr = "another row available"; + break; + } + case SQLITE_DONE: { + zErr = "no more rows available"; + break; + } default: { rc &= 0xff; if( ALWAYS(rc>=0) && rc<ArraySize(aMsg) && aMsg[rc]!=0 ){ @@ -127751,21 +148274,40 @@ SQLITE_PRIVATE const char *sqlite3ErrStr(int rc){ ** again until a timeout value is reached. The timeout value is ** an integer number of milliseconds passed in as the first ** argument. +** +** Return non-zero to retry the lock. Return zero to stop trying +** and cause SQLite to return SQLITE_BUSY. */ static int sqliteDefaultBusyCallback( - void *ptr, /* Database connection */ - int count /* Number of times table has been busy */ + void *ptr, /* Database connection */ + int count, /* Number of times table has been busy */ + sqlite3_file *pFile /* The file on which the lock occurred */ ){ #if SQLITE_OS_WIN || HAVE_USLEEP + /* This case is for systems that have support for sleeping for fractions of + ** a second. Examples: All windows systems, unix systems with usleep() */ static const u8 delays[] = { 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 }; static const u8 totals[] = { 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 }; # define NDELAY ArraySize(delays) sqlite3 *db = (sqlite3 *)ptr; - int timeout = db->busyTimeout; + int tmout = db->busyTimeout; int delay, prior; +#ifdef SQLITE_ENABLE_SETLK_TIMEOUT + if( sqlite3OsFileControl(pFile,SQLITE_FCNTL_LOCK_TIMEOUT,&tmout)==SQLITE_OK ){ + if( count ){ + tmout = 0; + sqlite3OsFileControl(pFile, SQLITE_FCNTL_LOCK_TIMEOUT, &tmout); + return 0; + }else{ + return 1; + } + } +#else + UNUSED_PARAMETER(pFile); +#endif assert( count>=0 ); if( count < NDELAY ){ delay = delays[count]; @@ -127774,16 +148316,19 @@ static int sqliteDefaultBusyCallback( delay = delays[NDELAY-1]; prior = totals[NDELAY-1] + delay*(count-(NDELAY-1)); } - if( prior + delay > timeout ){ - delay = timeout - prior; + if( prior + delay > tmout ){ + delay = tmout - prior; if( delay<=0 ) return 0; } sqlite3OsSleep(db->pVfs, delay*1000); return 1; #else + /* This case for unix systems that lack usleep() support. Sleeping + ** must be done in increments of whole seconds */ sqlite3 *db = (sqlite3 *)ptr; - int timeout = ((sqlite3 *)ptr)->busyTimeout; - if( (count+1)*1000 > timeout ){ + int tmout = ((sqlite3 *)ptr)->busyTimeout; + UNUSED_PARAMETER(pFile); + if( (count+1)*1000 > tmout ){ return 0; } sqlite3OsSleep(db->pVfs, 1000000); @@ -127794,14 +148339,25 @@ static int sqliteDefaultBusyCallback( /* ** Invoke the given busy handler. ** -** This routine is called when an operation failed with a lock. +** This routine is called when an operation failed to acquire a +** lock on VFS file pFile. +** ** If this routine returns non-zero, the lock is retried. If it ** returns 0, the operation aborts with an SQLITE_BUSY error. */ -SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p){ +SQLITE_PRIVATE int sqlite3InvokeBusyHandler(BusyHandler *p, sqlite3_file *pFile){ int rc; - if( NEVER(p==0) || p->xFunc==0 || p->nBusy<0 ) return 0; - rc = p->xFunc(p->pArg, p->nBusy); + if( p->xBusyHandler==0 || p->nBusy<0 ) return 0; + if( p->bExtraFileArg ){ + /* Add an extra parameter with the pFile pointer to the end of the + ** callback argument list */ + int (*xTra)(void*,int,sqlite3_file*); + xTra = (int(*)(void*,int,sqlite3_file*))p->xBusyHandler; + rc = xTra(p->pBusyArg, p->nBusy, pFile); + }else{ + /* Legacy style busy handler callback */ + rc = p->xBusyHandler(p->pBusyArg, p->nBusy); + } if( rc==0 ){ p->nBusy = -1; }else{ @@ -127820,12 +148376,13 @@ SQLITE_API int sqlite3_busy_handler( void *pArg ){ #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE; + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif sqlite3_mutex_enter(db->mutex); - db->busyHandler.xFunc = xBusy; - db->busyHandler.pArg = pArg; + db->busyHandler.xBusyHandler = xBusy; + db->busyHandler.pBusyArg = pArg; db->busyHandler.nBusy = 0; + db->busyHandler.bExtraFileArg = 0; db->busyTimeout = 0; sqlite3_mutex_leave(db->mutex); return SQLITE_OK; @@ -127873,8 +148430,10 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){ if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif if( ms>0 ){ - sqlite3_busy_handler(db, sqliteDefaultBusyCallback, (void*)db); + sqlite3_busy_handler(db, (int(*)(void*,int))sqliteDefaultBusyCallback, + (void*)db); db->busyTimeout = ms; + db->busyHandler.bExtraFileArg = 1; }else{ sqlite3_busy_handler(db, 0, 0); } @@ -127886,7 +148445,7 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3 *db, int ms){ */ SQLITE_API void sqlite3_interrupt(sqlite3 *db){ #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) ){ + if( !sqlite3SafetyCheckOk(db) && (db==0 || db->magic!=SQLITE_MAGIC_ZOMBIE) ){ (void)SQLITE_MISUSE_BKPT; return; } @@ -127907,7 +148466,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( int nArg, int enc, void *pUserData, - void (*xFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), void (*xStep)(sqlite3_context*,int,sqlite3_value **), void (*xFinal)(sqlite3_context*), FuncDestructor *pDestructor @@ -127918,9 +148477,9 @@ SQLITE_PRIVATE int sqlite3CreateFunc( assert( sqlite3_mutex_held(db->mutex) ); if( zFunctionName==0 || - (xFunc && (xFinal || xStep)) || - (!xFunc && (xFinal && !xStep)) || - (!xFunc && (!xFinal && xStep)) || + (xSFunc && (xFinal || xStep)) || + (!xSFunc && (xFinal && !xStep)) || + (!xSFunc && (!xFinal && xStep)) || (nArg<-1 || nArg>SQLITE_MAX_FUNCTION_ARG) || (255<(nName = sqlite3Strlen30( zFunctionName))) ){ return SQLITE_MISUSE_BKPT; @@ -127943,10 +148502,10 @@ SQLITE_PRIVATE int sqlite3CreateFunc( }else if( enc==SQLITE_ANY ){ int rc; rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF8|extraFlags, - pUserData, xFunc, xStep, xFinal, pDestructor); + pUserData, xSFunc, xStep, xFinal, pDestructor); if( rc==SQLITE_OK ){ rc = sqlite3CreateFunc(db, zFunctionName, nArg, SQLITE_UTF16LE|extraFlags, - pUserData, xFunc, xStep, xFinal, pDestructor); + pUserData, xSFunc, xStep, xFinal, pDestructor); } if( rc!=SQLITE_OK ){ return rc; @@ -127962,7 +148521,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc( ** is being overridden/deleted but there are no active VMs, allow the ** operation to continue but invalidate all precompiled statements. */ - p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 0); + p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 0); if( p && (p->funcFlags & SQLITE_FUNC_ENCMASK)==enc && p->nArg==nArg ){ if( db->nVdbeActive ){ sqlite3ErrorWithMsg(db, SQLITE_BUSY, @@ -127974,10 +148533,10 @@ SQLITE_PRIVATE int sqlite3CreateFunc( } } - p = sqlite3FindFunction(db, zFunctionName, nName, nArg, (u8)enc, 1); + p = sqlite3FindFunction(db, zFunctionName, nArg, (u8)enc, 1); assert(p || db->mallocFailed); if( !p ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } /* If an older version of the function with a configured destructor is @@ -127987,11 +148546,10 @@ SQLITE_PRIVATE int sqlite3CreateFunc( if( pDestructor ){ pDestructor->nRef++; } - p->pDestructor = pDestructor; + p->u.pDestructor = pDestructor; p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; testcase( p->funcFlags & SQLITE_DETERMINISTIC ); - p->xFunc = xFunc; - p->xStep = xStep; + p->xSFunc = xSFunc ? xSFunc : xStep; p->xFinalize = xFinal; p->pUserData = pUserData; p->nArg = (u16)nArg; @@ -128007,11 +148565,11 @@ SQLITE_API int sqlite3_create_function( int nArg, int enc, void *p, - void (*xFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), void (*xStep)(sqlite3_context*,int,sqlite3_value **), void (*xFinal)(sqlite3_context*) ){ - return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xFunc, xStep, + return sqlite3_create_function_v2(db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, 0); } @@ -128021,7 +148579,7 @@ SQLITE_API int sqlite3_create_function_v2( int nArg, int enc, void *p, - void (*xFunc)(sqlite3_context*,int,sqlite3_value **), + void (*xSFunc)(sqlite3_context*,int,sqlite3_value **), void (*xStep)(sqlite3_context*,int,sqlite3_value **), void (*xFinal)(sqlite3_context*), void (*xDestroy)(void *) @@ -128036,19 +148594,21 @@ SQLITE_API int sqlite3_create_function_v2( #endif sqlite3_mutex_enter(db->mutex); if( xDestroy ){ - pArg = (FuncDestructor *)sqlite3DbMallocZero(db, sizeof(FuncDestructor)); + pArg = (FuncDestructor *)sqlite3Malloc(sizeof(FuncDestructor)); if( !pArg ){ + sqlite3OomFault(db); xDestroy(p); goto out; } + pArg->nRef = 0; pArg->xDestroy = xDestroy; pArg->pUserData = p; } - rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xFunc, xStep, xFinal, pArg); + rc = sqlite3CreateFunc(db, zFunc, nArg, enc, p, xSFunc, xStep, xFinal, pArg); if( pArg && pArg->nRef==0 ){ assert( rc!=SQLITE_OK ); xDestroy(p); - sqlite3DbFree(db, pArg); + sqlite3_free(pArg); } out: @@ -128064,7 +148624,7 @@ SQLITE_API int sqlite3_create_function16( int nArg, int eTextRep, void *p, - void (*xFunc)(sqlite3_context*,int,sqlite3_value**), + void (*xSFunc)(sqlite3_context*,int,sqlite3_value**), void (*xStep)(sqlite3_context*,int,sqlite3_value**), void (*xFinal)(sqlite3_context*) ){ @@ -128077,7 +148637,7 @@ SQLITE_API int sqlite3_create_function16( sqlite3_mutex_enter(db->mutex); assert( !db->mallocFailed ); zFunc8 = sqlite3Utf16to8(db, zFunctionName, -1, SQLITE_UTF16NATIVE); - rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xFunc, xStep, xFinal,0); + rc = sqlite3CreateFunc(db, zFunc8, nArg, eTextRep, p, xSFunc,xStep,xFinal,0); sqlite3DbFree(db, zFunc8); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); @@ -128086,6 +148646,28 @@ SQLITE_API int sqlite3_create_function16( #endif +/* +** The following is the implementation of an SQL function that always +** fails with an error message stating that the function is used in the +** wrong context. The sqlite3_overload_function() API might construct +** SQL function that use this routine so that the functions will exist +** for name resolution but are actually overloaded by the xFindFunction +** method of virtual tables. +*/ +static void sqlite3InvalidFunction( + sqlite3_context *context, /* The function calling context */ + int NotUsed, /* Number of arguments to the function */ + sqlite3_value **NotUsed2 /* Value of each argument */ +){ + const char *zName = (const char*)sqlite3_user_data(context); + char *zErr; + UNUSED_PARAMETER2(NotUsed, NotUsed2); + zErr = sqlite3_mprintf( + "unable to use function %s in the requested context", zName); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); +} + /* ** Declare that a function has been overloaded by a virtual table. ** @@ -128103,8 +148685,8 @@ SQLITE_API int sqlite3_overload_function( const char *zName, int nArg ){ - int nName = sqlite3Strlen30(zName); - int rc = SQLITE_OK; + int rc; + char *zCopy; #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) || zName==0 || nArg<-2 ){ @@ -128112,13 +148694,13 @@ SQLITE_API int sqlite3_overload_function( } #endif sqlite3_mutex_enter(db->mutex); - if( sqlite3FindFunction(db, zName, nName, nArg, SQLITE_UTF8, 0)==0 ){ - rc = sqlite3CreateFunc(db, zName, nArg, SQLITE_UTF8, - 0, sqlite3InvalidFunction, 0, 0, 0); - } - rc = sqlite3ApiExit(db, rc); + rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)!=0; sqlite3_mutex_leave(db->mutex); - return rc; + if( rc ) return SQLITE_OK; + zCopy = sqlite3_mprintf(zName); + if( zCopy==0 ) return SQLITE_NOMEM; + return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8, + zCopy, sqlite3InvalidFunction, 0, 0, sqlite3_free); } #ifndef SQLITE_OMIT_TRACE @@ -128130,7 +148712,8 @@ SQLITE_API int sqlite3_overload_function( ** trace is a pointer to a function that is invoked at the start of each ** SQL statement. */ -SQLITE_API void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), void *pArg){ +#ifndef SQLITE_OMIT_DEPRECATED +SQLITE_API void *sqlite3_trace(sqlite3 *db, void(*xTrace)(void*,const char*), void *pArg){ void *pOld; #ifdef SQLITE_ENABLE_API_ARMOR @@ -128141,11 +148724,38 @@ SQLITE_API void *sqlite3_trace(sqlite3 *db, void (*xTrace)(void*,const char*), v #endif sqlite3_mutex_enter(db->mutex); pOld = db->pTraceArg; - db->xTrace = xTrace; + db->mTrace = xTrace ? SQLITE_TRACE_LEGACY : 0; + db->xTrace = (int(*)(u32,void*,void*,void*))xTrace; db->pTraceArg = pArg; sqlite3_mutex_leave(db->mutex); return pOld; } +#endif /* SQLITE_OMIT_DEPRECATED */ + +/* Register a trace callback using the version-2 interface. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3 *db, /* Trace this connection */ + unsigned mTrace, /* Mask of events to be traced */ + int(*xTrace)(unsigned,void*,void*,void*), /* Callback to invoke */ + void *pArg /* Context */ +){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( mTrace==0 ) xTrace = 0; + if( xTrace==0 ) mTrace = 0; + db->mTrace = mTrace; + db->xTrace = xTrace; + db->pTraceArg = pArg; + sqlite3_mutex_leave(db->mutex); + return SQLITE_OK; +} + +#ifndef SQLITE_OMIT_DEPRECATED /* ** Register a profile function. The pArg from the previously registered ** profile function is returned. @@ -128174,6 +148784,7 @@ SQLITE_API void *sqlite3_profile( sqlite3_mutex_leave(db->mutex); return pOld; } +#endif /* SQLITE_OMIT_DEPRECATED */ #endif /* SQLITE_OMIT_TRACE */ /* @@ -128252,6 +148863,27 @@ SQLITE_API void *sqlite3_rollback_hook( return pRet; } +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK +/* +** Register a callback to be invoked each time a row is updated, +** inserted or deleted using this database connection. +*/ +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, /* Attach the hook to this database */ + void(*xCallback)( /* Callback function */ + void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64), + void *pArg /* First callback argument */ +){ + void *pRet; + sqlite3_mutex_enter(db->mutex); + pRet = db->pPreUpdateArg; + db->xPreUpdateCallback = xCallback; + db->pPreUpdateArg = pArg; + sqlite3_mutex_leave(db->mutex); + return pRet; +} +#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ + #ifndef SQLITE_OMIT_WAL /* ** The sqlite3_wal_hook() callback registered by sqlite3_wal_autocheckpoint(). @@ -128377,6 +149009,13 @@ SQLITE_API int sqlite3_wal_checkpoint_v2( sqlite3Error(db, rc); } rc = sqlite3ApiExit(db, rc); + + /* If there are no active statements, clear the interrupt flag at this + ** point. */ + if( db->nVdbeActive==0 ){ + db->u1.isInterrupted = 0; + } + sqlite3_mutex_leave(db->mutex); return rc; #endif @@ -128412,7 +149051,8 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ ** checkpointed. If an error is encountered it is returned immediately - ** no attempt is made to checkpoint any remaining databases. ** -** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART. +** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL, RESTART +** or TRUNCATE. */ SQLITE_PRIVATE int sqlite3Checkpoint(sqlite3 *db, int iDb, int eMode, int *pnLog, int *pnCkpt){ int rc = SQLITE_OK; /* Return code */ @@ -128466,9 +149106,11 @@ SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){ return ( db->temp_store!=1 ); #endif #if SQLITE_TEMP_STORE==3 + UNUSED_PARAMETER(db); return 1; #endif #if SQLITE_TEMP_STORE<1 || SQLITE_TEMP_STORE>3 + UNUSED_PARAMETER(db); return 0; #endif } @@ -128480,14 +149122,14 @@ SQLITE_PRIVATE int sqlite3TempInMemory(const sqlite3 *db){ SQLITE_API const char *sqlite3_errmsg(sqlite3 *db){ const char *z; if( !db ){ - return sqlite3ErrStr(SQLITE_NOMEM); + return sqlite3ErrStr(SQLITE_NOMEM_BKPT); } if( !sqlite3SafetyCheckSickOrOk(db) ){ return sqlite3ErrStr(SQLITE_MISUSE_BKPT); } sqlite3_mutex_enter(db->mutex); if( db->mallocFailed ){ - z = sqlite3ErrStr(SQLITE_NOMEM); + z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); }else{ testcase( db->pErr==0 ); z = (char*)sqlite3_value_text(db->pErr); @@ -128510,12 +149152,9 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){ 'o', 'u', 't', ' ', 'o', 'f', ' ', 'm', 'e', 'm', 'o', 'r', 'y', 0 }; static const u16 misuse[] = { - 'l', 'i', 'b', 'r', 'a', 'r', 'y', ' ', - 'r', 'o', 'u', 't', 'i', 'n', 'e', ' ', - 'c', 'a', 'l', 'l', 'e', 'd', ' ', - 'o', 'u', 't', ' ', - 'o', 'f', ' ', - 's', 'e', 'q', 'u', 'e', 'n', 'c', 'e', 0 + 'b', 'a', 'd', ' ', 'p', 'a', 'r', 'a', 'm', 'e', 't', 'e', 'r', ' ', + 'o', 'r', ' ', 'o', 't', 'h', 'e', 'r', ' ', 'A', 'P', 'I', ' ', + 'm', 'i', 's', 'u', 's', 'e', 0 }; const void *z; @@ -128539,7 +149178,7 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3 *db){ ** be cleared before returning. Do this directly, instead of via ** sqlite3ApiExit(), to avoid setting the database handle error message. */ - db->mallocFailed = 0; + sqlite3OomClear(db); } sqlite3_mutex_leave(db->mutex); return z; @@ -128555,7 +149194,7 @@ SQLITE_API int sqlite3_errcode(sqlite3 *db){ return SQLITE_MISUSE_BKPT; } if( !db || db->mallocFailed ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } return db->errCode & db->errMask; } @@ -128564,10 +149203,13 @@ SQLITE_API int sqlite3_extended_errcode(sqlite3 *db){ return SQLITE_MISUSE_BKPT; } if( !db || db->mallocFailed ){ - return SQLITE_NOMEM; + return SQLITE_NOMEM_BKPT; } return db->errCode; } +SQLITE_API int sqlite3_system_errno(sqlite3 *db){ + return db ? db->iSysErrno : 0; +} /* ** Return a string that describes the kind of error specified in the @@ -128644,7 +149286,7 @@ static int createCollation( } pColl = sqlite3FindCollSeq(db, (u8)enc2, zName, 1); - if( pColl==0 ) return SQLITE_NOMEM; + if( pColl==0 ) return SQLITE_NOMEM_BKPT; pColl->xCmp = xCompare; pColl->pUser = pCtx; pColl->xDel = xDel; @@ -128692,8 +149334,8 @@ static const int aHardLimit[] = { #if SQLITE_MAX_VDBE_OP<40 # error SQLITE_MAX_VDBE_OP must be at least 40 #endif -#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>1000 -# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 1000 +#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>127 +# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 127 #endif #if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>125 # error SQLITE_MAX_ATTACHED must be between 0 and 125 @@ -128815,18 +149457,30 @@ SQLITE_PRIVATE int sqlite3ParseUri( int eState; /* Parser state when parsing URI */ int iIn; /* Input character index */ int iOut = 0; /* Output character index */ - int nByte = nUri+2; /* Bytes of space to allocate */ + u64 nByte = nUri+2; /* Bytes of space to allocate */ /* Make sure the SQLITE_OPEN_URI flag is set to indicate to the VFS xOpen ** method that there may be extra parameters following the file-name. */ flags |= SQLITE_OPEN_URI; for(iIn=0; iIn<nUri; iIn++) nByte += (zUri[iIn]=='&'); - zFile = sqlite3_malloc(nByte); - if( !zFile ) return SQLITE_NOMEM; + zFile = sqlite3_malloc64(nByte); + if( !zFile ) return SQLITE_NOMEM_BKPT; iIn = 5; -#ifndef SQLITE_ALLOW_URI_AUTHORITY +#ifdef SQLITE_ALLOW_URI_AUTHORITY + if( strncmp(zUri+5, "///", 3)==0 ){ + iIn = 7; + /* The following condition causes URIs with five leading / characters + ** like file://///host/path to be converted into UNCs like //host/path. + ** The correct URI for that UNC has only two or four leading / characters + ** file://host/path or file:////host/path. But 5 leading slashes is a + ** common error, we are told, so we handle it as a special case. */ + if( strncmp(zUri+7, "///", 3)==0 ){ iIn++; } + }else if( strncmp(zUri+5, "//localhost/", 12)==0 ){ + iIn = 16; + } +#else /* Discard the scheme and authority segments of the URI. */ if( zUri[5]=='/' && zUri[6]=='/' ){ iIn = 7; @@ -128862,6 +149516,7 @@ SQLITE_PRIVATE int sqlite3ParseUri( assert( octet>=0 && octet<256 ); if( octet==0 ){ +#ifndef SQLITE_ENABLE_URI_00_ERROR /* This branch is taken when "%00" appears within the URI. In this ** case we ignore all text in the remainder of the path, name or ** value currently being parsed. So ignore the current character @@ -128874,6 +149529,12 @@ SQLITE_PRIVATE int sqlite3ParseUri( iIn++; } continue; +#else + /* If ENABLE_URI_00_ERROR is defined, "%00" in a URI is an error. */ + *pzErrMsg = sqlite3_mprintf("unexpected %%00 in uri"); + rc = SQLITE_ERROR; + goto parse_uri_out; +#endif } c = octet; }else if( eState==1 && (c=='&' || c=='=') ){ @@ -128976,9 +149637,11 @@ SQLITE_PRIVATE int sqlite3ParseUri( } }else{ - zFile = sqlite3_malloc(nUri+2); - if( !zFile ) return SQLITE_NOMEM; - memcpy(zFile, zUri, nUri); + zFile = sqlite3_malloc64(nUri+2); + if( !zFile ) return SQLITE_NOMEM_BKPT; + if( nUri ){ + memcpy(zFile, zUri, nUri); + } zFile[nUri] = '\0'; zFile[nUri+1] = '\0'; flags &= ~SQLITE_OPEN_URI; @@ -129026,26 +149689,6 @@ static int openDatabase( if( rc ) return rc; #endif - /* Only allow sensible combinations of bits in the flags argument. - ** Throw an error if any non-sense combination is used. If we - ** do not block illegal combinations here, it could trigger - ** assert() statements in deeper layers. Sensible combinations - ** are: - ** - ** 1: SQLITE_OPEN_READONLY - ** 2: SQLITE_OPEN_READWRITE - ** 6: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE - */ - assert( SQLITE_OPEN_READONLY == 0x01 ); - assert( SQLITE_OPEN_READWRITE == 0x02 ); - assert( SQLITE_OPEN_CREATE == 0x04 ); - testcase( (1<<(flags&7))==0x02 ); /* READONLY */ - testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ - testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ - if( ((1<<(flags&7)) & 0x46)==0 ){ - return SQLITE_MISUSE_BKPT; /* IMP: R-65497-44594 */ - } - if( sqlite3GlobalConfig.bCoreMutex==0 ){ isThreadsafe = 0; }else if( flags & SQLITE_OPEN_NOMUTEX ){ @@ -129055,6 +149698,7 @@ static int openDatabase( }else{ isThreadsafe = sqlite3GlobalConfig.bFullMutex; } + if( flags & SQLITE_OPEN_PRIVATECACHE ){ flags &= ~SQLITE_OPEN_SHAREDCACHE; }else if( sqlite3GlobalConfig.sharedCacheEnabled ){ @@ -129087,13 +149731,20 @@ static int openDatabase( /* Allocate the sqlite data structure */ db = sqlite3MallocZero( sizeof(sqlite3) ); if( db==0 ) goto opendb_out; - if( isThreadsafe ){ + if( isThreadsafe +#ifdef SQLITE_ENABLE_MULTITHREADED_CHECKS + || sqlite3GlobalConfig.bCoreMutex +#endif + ){ db->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_RECURSIVE); if( db->mutex==0 ){ sqlite3_free(db); db = 0; goto opendb_out; } + if( isThreadsafe==0 ){ + sqlite3MutexWarnOnContention(db->mutex); + } } sqlite3_mutex_enter(db->mutex); db->errMask = 0xff; @@ -129113,6 +149764,9 @@ static int openDatabase( #if !defined(SQLITE_DEFAULT_AUTOMATIC_INDEX) || SQLITE_DEFAULT_AUTOMATIC_INDEX | SQLITE_AutoIndex #endif +#if SQLITE_DEFAULT_CKPTFULLFSYNC + | SQLITE_CkptFullFSync +#endif #if SQLITE_DEFAULT_FILE_FORMAT<4 | SQLITE_LegacyFileFmt #endif @@ -129127,6 +149781,15 @@ static int openDatabase( #endif #if defined(SQLITE_REVERSE_UNORDERED_SELECTS) | SQLITE_ReverseOrder +#endif +#if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK) + | SQLITE_CellSizeCk +#endif +#if defined(SQLITE_ENABLE_FTS3_TOKENIZER) + | SQLITE_Fts3Tokenizer +#endif +#if defined(SQLITE_ENABLE_QPSG) + | SQLITE_EnableQPSG #endif ; sqlite3HashInit(&db->aCollSeq); @@ -129141,9 +149804,9 @@ static int openDatabase( ** EVIDENCE-OF: R-52786-44878 SQLite defines three built-in collating ** functions: */ - createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0); - createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0); - createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF8, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16BE, 0, binCollFunc, 0); + createCollation(db, sqlite3StrBINARY, SQLITE_UTF16LE, 0, binCollFunc, 0); createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); if( db->mallocFailed ){ @@ -129152,14 +149815,35 @@ static int openDatabase( /* EVIDENCE-OF: R-08308-17224 The default collating function for all ** strings is BINARY. */ - db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, "BINARY", 0); + db->pDfltColl = sqlite3FindCollSeq(db, SQLITE_UTF8, sqlite3StrBINARY, 0); assert( db->pDfltColl!=0 ); - /* Parse the filename/URI argument. */ + /* Parse the filename/URI argument + ** + ** Only allow sensible combinations of bits in the flags argument. + ** Throw an error if any non-sense combination is used. If we + ** do not block illegal combinations here, it could trigger + ** assert() statements in deeper layers. Sensible combinations + ** are: + ** + ** 1: SQLITE_OPEN_READONLY + ** 2: SQLITE_OPEN_READWRITE + ** 6: SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE + */ db->openFlags = flags; - rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); + assert( SQLITE_OPEN_READONLY == 0x01 ); + assert( SQLITE_OPEN_READWRITE == 0x02 ); + assert( SQLITE_OPEN_CREATE == 0x04 ); + testcase( (1<<(flags&7))==0x02 ); /* READONLY */ + testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ + testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ + if( ((1<<(flags&7)) & 0x46)==0 ){ + rc = SQLITE_MISUSE_BKPT; /* IMP: R-65497-44594 */ + }else{ + rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); + } if( rc!=SQLITE_OK ){ - if( rc==SQLITE_NOMEM ) db->mallocFailed = 1; + if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg); sqlite3_free(zErrMsg); goto opendb_out; @@ -129170,7 +149854,7 @@ static int openDatabase( flags | SQLITE_OPEN_MAIN_DB); if( rc!=SQLITE_OK ){ if( rc==SQLITE_IOERR_NOMEM ){ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } sqlite3Error(db, rc); goto opendb_out; @@ -129181,13 +149865,13 @@ static int openDatabase( sqlite3BtreeLeave(db->aDb[0].pBt); db->aDb[1].pSchema = sqlite3SchemaGet(db, 0); - /* The default safety_level for the main database is 'full'; for the temp - ** database it is 'NONE'. This matches the pager layer defaults. + /* The default safety_level for the main database is FULL; for the temp + ** database it is OFF. This matches the pager layer defaults. */ - db->aDb[0].zName = "main"; - db->aDb[0].safety_level = 3; - db->aDb[1].zName = "temp"; - db->aDb[1].safety_level = 1; + db->aDb[0].zDbSName = "main"; + db->aDb[0].safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; + db->aDb[1].zDbSName = "temp"; + db->aDb[1].safety_level = PAGER_SYNCHRONOUS_OFF; db->magic = SQLITE_MAGIC_OPEN; if( db->mallocFailed ){ @@ -129199,12 +149883,21 @@ static int openDatabase( ** is accessed. */ sqlite3Error(db, SQLITE_OK); - sqlite3RegisterBuiltinFunctions(db); + sqlite3RegisterPerConnectionBuiltinFunctions(db); + rc = sqlite3_errcode(db); + +#ifdef SQLITE_ENABLE_FTS5 + /* Register any built-in FTS5 module before loading the automatic + ** extensions. This allows automatic extensions to register FTS5 + ** tokenizers and auxiliary functions. */ + if( !db->mallocFailed && rc==SQLITE_OK ){ + rc = sqlite3Fts5Init(db); + } +#endif /* Load automatic extensions - extensions that have been registered ** using the sqlite3_automatic_extension() API. */ - rc = sqlite3_errcode(db); if( rc==SQLITE_OK ){ sqlite3AutoLoadExtensions(db); rc = sqlite3_errcode(db); @@ -129227,13 +149920,13 @@ static int openDatabase( } #endif -#ifdef SQLITE_ENABLE_FTS3 +#ifdef SQLITE_ENABLE_FTS3 /* automatically defined by SQLITE_ENABLE_FTS4 */ if( !db->mallocFailed && rc==SQLITE_OK ){ rc = sqlite3Fts3Init(db); } #endif -#ifdef SQLITE_ENABLE_ICU +#if defined(SQLITE_ENABLE_ICU) || defined(SQLITE_ENABLE_ICU_COLLATIONS) if( !db->mallocFailed && rc==SQLITE_OK ){ rc = sqlite3IcuInit(db); } @@ -129245,6 +149938,30 @@ static int openDatabase( } #endif +#ifdef SQLITE_ENABLE_DBPAGE_VTAB + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3DbpageRegister(db); + } +#endif + +#ifdef SQLITE_ENABLE_DBSTAT_VTAB + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3DbstatRegister(db); + } +#endif + +#ifdef SQLITE_ENABLE_JSON1 + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3Json1Init(db); + } +#endif + +#ifdef SQLITE_ENABLE_STMTVTAB + if( !db->mallocFailed && rc==SQLITE_OK){ + rc = sqlite3StmtVtabInit(db); + } +#endif + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking ** mode. Doing nothing at all also makes NORMAL the default. @@ -129264,9 +149981,9 @@ static int openDatabase( sqlite3_wal_autocheckpoint(db, SQLITE_DEFAULT_WAL_AUTOCHECKPOINT); opendb_out: - sqlite3_free(zOpen); if( db ){ - assert( db->mutex!=0 || isThreadsafe==0 || sqlite3GlobalConfig.bFullMutex==0 ); + assert( db->mutex!=0 || isThreadsafe==0 + || sqlite3GlobalConfig.bFullMutex==0 ); sqlite3_mutex_leave(db->mutex); } rc = sqlite3_errcode(db); @@ -129285,7 +150002,25 @@ opendb_out: sqlite3GlobalConfig.xSqllog(pArg, db, zFilename, 0); } #endif - return sqlite3ApiExit(0, rc); +#if defined(SQLITE_HAS_CODEC) + if( rc==SQLITE_OK ){ + const char *zKey; + if( (zKey = sqlite3_uri_parameter(zOpen, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; i<sizeof(zDecoded)*2 && sqlite3Isxdigit(zKey[i]); i++){ + iByte = (iByte<<4) + sqlite3HexToInt(zKey[i]); + if( (i&1)!=0 ) zDecoded[i/2] = iByte; + } + sqlite3_key_v2(db, 0, zDecoded, i/2); + }else if( (zKey = sqlite3_uri_parameter(zOpen, "key"))!=0 ){ + sqlite3_key_v2(db, 0, zKey, sqlite3Strlen30(zKey)); + } + } +#endif + sqlite3_free(zOpen); + return rc & 0xff; } /* @@ -129339,11 +150074,11 @@ SQLITE_API int sqlite3_open16( SCHEMA_ENC(*ppDb) = ENC(*ppDb) = SQLITE_UTF16NATIVE; } }else{ - rc = SQLITE_NOMEM; + rc = SQLITE_NOMEM_BKPT; } sqlite3ValueFree(pVal); - return sqlite3ApiExit(0, rc); + return rc & 0xff; } #endif /* SQLITE_OMIT_UTF16 */ @@ -129484,7 +150219,7 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){ /* ** The following routines are substitutes for constants SQLITE_CORRUPT, -** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_IOERR and possibly other error +** SQLITE_MISUSE, SQLITE_CANTOPEN, SQLITE_NOMEM and possibly other error ** constants. They serve two purposes: ** ** 1. Serve as a convenient place to set a breakpoint in a debugger @@ -129493,28 +150228,39 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3 *db){ ** 2. Invoke sqlite3_log() to provide the source code location where ** a low-level error is first detected. */ +SQLITE_PRIVATE int sqlite3ReportError(int iErr, int lineno, const char *zType){ + sqlite3_log(iErr, "%s at line %d of [%.10s]", + zType, lineno, 20+sqlite3_sourceid()); + return iErr; +} SQLITE_PRIVATE int sqlite3CorruptError(int lineno){ testcase( sqlite3GlobalConfig.xLog!=0 ); - sqlite3_log(SQLITE_CORRUPT, - "database corruption at line %d of [%.10s]", - lineno, 20+sqlite3_sourceid()); - return SQLITE_CORRUPT; + return sqlite3ReportError(SQLITE_CORRUPT, lineno, "database corruption"); } SQLITE_PRIVATE int sqlite3MisuseError(int lineno){ testcase( sqlite3GlobalConfig.xLog!=0 ); - sqlite3_log(SQLITE_MISUSE, - "misuse at line %d of [%.10s]", - lineno, 20+sqlite3_sourceid()); - return SQLITE_MISUSE; + return sqlite3ReportError(SQLITE_MISUSE, lineno, "misuse"); } SQLITE_PRIVATE int sqlite3CantopenError(int lineno){ testcase( sqlite3GlobalConfig.xLog!=0 ); - sqlite3_log(SQLITE_CANTOPEN, - "cannot open file at line %d of [%.10s]", - lineno, 20+sqlite3_sourceid()); - return SQLITE_CANTOPEN; + return sqlite3ReportError(SQLITE_CANTOPEN, lineno, "cannot open file"); } - +#ifdef SQLITE_DEBUG +SQLITE_PRIVATE int sqlite3CorruptPgnoError(int lineno, Pgno pgno){ + char zMsg[100]; + sqlite3_snprintf(sizeof(zMsg), zMsg, "database corruption page %d", pgno); + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_CORRUPT, lineno, zMsg); +} +SQLITE_PRIVATE int sqlite3NomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_NOMEM, lineno, "OOM"); +} +SQLITE_PRIVATE int sqlite3IoerrnomemError(int lineno){ + testcase( sqlite3GlobalConfig.xLog!=0 ); + return sqlite3ReportError(SQLITE_IOERR_NOMEM, lineno, "I/O OOM error"); +} +#endif #ifndef SQLITE_OMIT_DEPRECATED /* @@ -129548,13 +150294,19 @@ SQLITE_API int sqlite3_table_column_metadata( Table *pTab = 0; Column *pCol = 0; int iCol = 0; - char const *zDataType = 0; char const *zCollSeq = 0; int notnull = 0; int primarykey = 0; int autoinc = 0; + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zTableName==0 ){ + return SQLITE_MISUSE_BKPT; + } +#endif + /* Ensure the database schema has been loaded */ sqlite3_mutex_enter(db->mutex); sqlite3BtreeEnterAll(db); @@ -129602,7 +150354,7 @@ SQLITE_API int sqlite3_table_column_metadata( ** explicitly declared column. Copy meta information from *pCol. */ if( pCol ){ - zDataType = pCol->zType; + zDataType = sqlite3ColumnType(pCol,0); zCollSeq = pCol->zColl; notnull = pCol->notNull!=0; primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0; @@ -129612,7 +150364,7 @@ SQLITE_API int sqlite3_table_column_metadata( primarykey = 1; } if( !zCollSeq ){ - zCollSeq = "BINARY"; + zCollSeq = sqlite3StrBINARY; } error_out: @@ -129693,15 +150445,19 @@ SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, vo if( op==SQLITE_FCNTL_FILE_POINTER ){ *(sqlite3_file**)pArg = fd; rc = SQLITE_OK; - }else if( fd->pMethods ){ - rc = sqlite3OsFileControl(fd, op, pArg); + }else if( op==SQLITE_FCNTL_VFS_POINTER ){ + *(sqlite3_vfs**)pArg = sqlite3PagerVfs(pPager); + rc = SQLITE_OK; + }else if( op==SQLITE_FCNTL_JOURNAL_POINTER ){ + *(sqlite3_file**)pArg = sqlite3PagerJrnlFile(pPager); + rc = SQLITE_OK; }else{ - rc = SQLITE_NOTFOUND; + rc = sqlite3OsFileControl(fd, op, pArg); } sqlite3BtreeLeave(pBtree); } sqlite3_mutex_leave(db->mutex); - return rc; + return rc; } /* @@ -129709,7 +150465,9 @@ SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, vo */ SQLITE_API int sqlite3_test_control(int op, ...){ int rc = 0; -#ifndef SQLITE_OMIT_BUILTIN_TEST +#ifdef SQLITE_UNTESTABLE + UNUSED_PARAMETER(op); +#else va_list ap; va_start(ap, op); switch( op ){ @@ -129831,7 +150589,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ case SQLITE_TESTCTRL_ASSERT: { volatile int x = 0; - assert( (x = va_arg(ap,int))!=0 ); + assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 ); rc = x; break; } @@ -129843,7 +150601,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** This action provides a run-time test to see how the ALWAYS and ** NEVER macros were defined at compile-time. ** - ** The return value is ALWAYS(X). + ** The return value is ALWAYS(X) if X is true, or 0 if X is false. ** ** The recommended test is X==2. If the return value is 2, that means ** ALWAYS() and NEVER() are both no-op pass-through macros, which is the @@ -129866,7 +150624,7 @@ SQLITE_API int sqlite3_test_control(int op, ...){ */ case SQLITE_TESTCTRL_ALWAYS: { int x = va_arg(ap,int); - rc = ALWAYS(x); + rc = x ? ALWAYS(x) : 0; break; } @@ -129915,40 +150673,6 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } -#ifdef SQLITE_N_KEYWORD - /* sqlite3_test_control(SQLITE_TESTCTRL_ISKEYWORD, const char *zWord) - ** - ** If zWord is a keyword recognized by the parser, then return the - ** number of keywords. Or if zWord is not a keyword, return 0. - ** - ** This test feature is only available in the amalgamation since - ** the SQLITE_N_KEYWORD macro is not defined in this file if SQLite - ** is built using separate source files. - */ - case SQLITE_TESTCTRL_ISKEYWORD: { - const char *zWord = va_arg(ap, const char*); - int n = sqlite3Strlen30(zWord); - rc = (sqlite3KeywordCode((u8*)zWord, n)!=TK_ID) ? SQLITE_N_KEYWORD : 0; - break; - } -#endif - - /* sqlite3_test_control(SQLITE_TESTCTRL_SCRATCHMALLOC, sz, &pNew, pFree); - ** - ** Pass pFree into sqlite3ScratchFree(). - ** If sz>0 then allocate a scratch buffer into pNew. - */ - case SQLITE_TESTCTRL_SCRATCHMALLOC: { - void *pFree, **ppNew; - int sz; - sz = va_arg(ap, int); - ppNew = va_arg(ap, void**); - pFree = va_arg(ap, void*); - if( sz ) *ppNew = sqlite3ScratchMalloc(sz); - sqlite3ScratchFree(pFree); - break; - } - /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff); ** ** If parameter onoff is non-zero, configure the wrappers so that all @@ -129973,6 +150697,15 @@ SQLITE_API int sqlite3_test_control(int op, ...){ break; } + /* Set the threshold at which OP_Once counters reset back to zero. + ** By default this is 0x7ffffffe (over 2 billion), but that value is + ** too big to test in a reasonable amount of time, so this control is + ** provided to set a small and easily reachable reset value. + */ + case SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD: { + sqlite3GlobalConfig.iOnceResetThreshold = va_arg(ap, int); + break; + } /* sqlite3_test_control(SQLITE_TESTCTRL_VDBE_COVERAGE, xCallback, ptr); ** @@ -130004,9 +150737,54 @@ SQLITE_API int sqlite3_test_control(int op, ...){ if( sqlite3GlobalConfig.isInit==0 ) rc = SQLITE_ERROR; break; } + + /* sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, dbName, onOff, tnum); + ** + ** This test control is used to create imposter tables. "db" is a pointer + ** to the database connection. dbName is the database name (ex: "main" or + ** "temp") which will receive the imposter. "onOff" turns imposter mode on + ** or off. "tnum" is the root page of the b-tree to which the imposter + ** table should connect. + ** + ** Enable imposter mode only when the schema has already been parsed. Then + ** run a single CREATE TABLE statement to construct the imposter table in + ** the parsed schema. Then turn imposter mode back off again. + ** + ** If onOff==0 and tnum>0 then reset the schema for all databases, causing + ** the schema to be reparsed the next time it is needed. This has the + ** effect of erasing all imposter tables. + */ + case SQLITE_TESTCTRL_IMPOSTER: { + sqlite3 *db = va_arg(ap, sqlite3*); + sqlite3_mutex_enter(db->mutex); + db->init.iDb = sqlite3FindDbName(db, va_arg(ap,const char*)); + db->init.busy = db->init.imposterTable = va_arg(ap,int); + db->init.newTnum = va_arg(ap,int); + if( db->init.busy==0 && db->init.newTnum>0 ){ + sqlite3ResetAllSchemasOfConnection(db); + } + sqlite3_mutex_leave(db->mutex); + break; + } + +#if defined(YYCOVERAGE) + /* sqlite3_test_control(SQLITE_TESTCTRL_PARSER_COVERAGE, FILE *out) + ** + ** This test control (only available when SQLite is compiled with + ** -DYYCOVERAGE) writes a report onto "out" that shows all + ** state/lookahead combinations in the parser state machine + ** which are never exercised. If any state is missed, make the + ** return code SQLITE_ERROR. + */ + case SQLITE_TESTCTRL_PARSER_COVERAGE: { + FILE *out = va_arg(ap, FILE*); + if( sqlite3ParserCoverage(out) ) rc = SQLITE_ERROR; + break; + } +#endif /* defined(YYCOVERAGE) */ } va_end(ap); -#endif /* SQLITE_OMIT_BUILTIN_TEST */ +#endif /* SQLITE_UNTESTABLE */ return rc; } @@ -130052,7 +150830,7 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64( ){ const char *z = sqlite3_uri_parameter(zFilename, zParam); sqlite3_int64 v; - if( z && sqlite3DecOrHexToI64(z, &v)==SQLITE_OK ){ + if( z && sqlite3DecOrHexToI64(z, &v)==0 ){ bDflt = v; } return bDflt; @@ -130062,15 +150840,8 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64( ** Return the Btree pointer identified by zDbName. Return NULL if not found. */ SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ - int i; - for(i=0; i<db->nDb; i++){ - if( db->aDb[i].pBt - && (zDbName==0 || sqlite3StrICmp(zDbName, db->aDb[i].zName)==0) - ){ - return db->aDb[i].pBt; - } - } - return 0; + int iDb = zDbName ? sqlite3FindDbName(db, zDbName) : 0; + return iDb<0 ? 0 : db->aDb[iDb].pBt; } /* @@ -130105,6 +150876,173 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ return pBt ? sqlite3BtreeIsReadonly(pBt) : -1; } +#ifdef SQLITE_ENABLE_SNAPSHOT +/* +** Obtain a snapshot handle for the snapshot of database zDb currently +** being read by handle db. +*/ +SQLITE_API int sqlite3_snapshot_get( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot **ppSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + + if( db->autoCommit==0 ){ + int iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotGet(sqlite3BtreePager(pBt), ppSnapshot); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Open a read-transaction on the snapshot idendified by pSnapshot. +*/ +SQLITE_API int sqlite3_snapshot_open( + sqlite3 *db, + const char *zDb, + sqlite3_snapshot *pSnapshot +){ + int rc = SQLITE_ERROR; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + sqlite3_mutex_enter(db->mutex); + if( db->autoCommit==0 ){ + int iDb; + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), pSnapshot); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + sqlite3PagerSnapshotOpen(sqlite3BtreePager(pBt), 0); + } + } + } + } + + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Recover as many snapshots as possible from the wal file associated with +** schema zDb of database db. +*/ +SQLITE_API int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb){ + int rc = SQLITE_ERROR; + int iDb; +#ifndef SQLITE_OMIT_WAL + +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + return SQLITE_MISUSE_BKPT; + } +#endif + + sqlite3_mutex_enter(db->mutex); + iDb = sqlite3FindDbName(db, zDb); + if( iDb==0 || iDb>1 ){ + Btree *pBt = db->aDb[iDb].pBt; + if( 0==sqlite3BtreeIsInReadTrans(pBt) ){ + rc = sqlite3BtreeBeginTrans(pBt, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerSnapshotRecover(sqlite3BtreePager(pBt)); + sqlite3BtreeCommit(pBt); + } + } + } + sqlite3_mutex_leave(db->mutex); +#endif /* SQLITE_OMIT_WAL */ + return rc; +} + +/* +** Free a snapshot handle obtained from sqlite3_snapshot_get(). +*/ +SQLITE_API void sqlite3_snapshot_free(sqlite3_snapshot *pSnapshot){ + sqlite3_free(pSnapshot); +} +#endif /* SQLITE_ENABLE_SNAPSHOT */ + +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS +/* +** Given the name of a compile-time option, return true if that option +** was used and false if not. +** +** The name can optionally begin with "SQLITE_" but the "SQLITE_" prefix +** is not required for a match. +*/ +SQLITE_API int sqlite3_compileoption_used(const char *zOptName){ + int i, n; + int nOpt; + const char **azCompileOpt; + +#if SQLITE_ENABLE_API_ARMOR + if( zOptName==0 ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + + azCompileOpt = sqlite3CompileOptions(&nOpt); + + if( sqlite3StrNICmp(zOptName, "SQLITE_", 7)==0 ) zOptName += 7; + n = sqlite3Strlen30(zOptName); + + /* Since nOpt is normally in single digits, a linear search is + ** adequate. No need for a binary search. */ + for(i=0; i<nOpt; i++){ + if( sqlite3StrNICmp(zOptName, azCompileOpt[i], n)==0 + && sqlite3IsIdChar((unsigned char)azCompileOpt[i][n])==0 + ){ + return 1; + } + } + return 0; +} + +/* +** Return the N-th compile-time option string. If N is out of range, +** return a NULL pointer. +*/ +SQLITE_API const char *sqlite3_compileoption_get(int N){ + int nOpt; + const char **azCompileOpt; + azCompileOpt = sqlite3CompileOptions(&nOpt); + if( N>=0 && N<nOpt ){ + return azCompileOpt[N]; + } + return 0; +} +#endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ + /************** End of main.c ************************************************/ /************** Begin file notify.c ******************************************/ /* @@ -130122,6 +151060,8 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName){ ** This file contains the implementation of the sqlite3_unlock_notify() ** API method and its associated functionality. */ +/* #include "sqliteInt.h" */ +/* #include "btreeInt.h" */ /* Omit this entire file if SQLITE_ENABLE_UNLOCK_NOTIFY is not defined. */ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY @@ -130752,6 +151692,12 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ # define NDEBUG 1 #endif +/* FTS3/FTS4 require virtual tables */ +#ifdef SQLITE_OMIT_VIRTUALTABLE +# undef SQLITE_ENABLE_FTS3 +# undef SQLITE_ENABLE_FTS4 +#endif + /* ** FTS4 is really an extension for FTS3. It is enabled using the ** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also all @@ -130765,9 +151711,11 @@ SQLITE_PRIVATE void sqlite3ConnectionClosed(sqlite3 *db){ /* If not building as part of the core, include sqlite3ext.h. */ #ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ SQLITE_EXTENSION_INIT3 #endif +/* #include "sqlite3.h" */ /************** Include fts3_tokenizer.h in the middle of fts3Int.h **********/ /************** Begin file fts3_tokenizer.h **********************************/ /* @@ -130796,6 +151744,7 @@ SQLITE_EXTENSION_INIT3 ** If tokenizers are to be allowed to call sqlite3_*() functions, then ** we will need a way to register the API consistently. */ +/* #include "sqlite3.h" */ /* ** Structures used by the tokenizer interface. When a new tokenizer @@ -131146,6 +152095,11 @@ SQLITE_PRIVATE Fts3HashElem *sqlite3Fts3HashFindElem(const Fts3Hash *, const voi #ifdef SQLITE_COVERAGE_TEST # define ALWAYS(x) (1) # define NEVER(X) (0) +#elif defined(SQLITE_DEBUG) +# define ALWAYS(x) sqlite3Fts3Always((x)!=0) +# define NEVER(x) sqlite3Fts3Never((x)!=0) +SQLITE_PRIVATE int sqlite3Fts3Always(int b); +SQLITE_PRIVATE int sqlite3Fts3Never(int b); #else # define ALWAYS(x) (x) # define NEVER(x) (x) @@ -131204,6 +152158,8 @@ typedef struct Fts3DeferredToken Fts3DeferredToken; typedef struct Fts3SegReader Fts3SegReader; typedef struct Fts3MultiSegReader Fts3MultiSegReader; +typedef struct MatchinfoBuffer MatchinfoBuffer; + /* ** A connection to a fulltext index is an instance of the following ** structure. The xCreate and xConnect methods create an instance @@ -131229,6 +152185,7 @@ struct Fts3Table { ** statements is run and reset within a single virtual table API call. */ sqlite3_stmt *aStmt[40]; + sqlite3_stmt *pSeekStmt; /* Cache for fts3CursorSeekStmt() */ char *zReadExprlist; char *zWriteExprlist; @@ -131269,6 +152226,7 @@ struct Fts3Table { int nPendingData; /* Current bytes of pending data */ sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */ int iPrevLangid; /* Langid of recently inserted document */ + int bPrevDelete; /* True if last operation was a delete */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) /* State variables used for validating that the transaction control @@ -131297,6 +152255,7 @@ struct Fts3Cursor { i16 eSearch; /* Search strategy (see below) */ u8 isEof; /* True if at End Of Results */ u8 isRequireSeek; /* True if must seek pStmt to %_content row */ + u8 bSeekStmt; /* True if pStmt is a seek */ sqlite3_stmt *pStmt; /* Prepared statement in use by the cursor */ Fts3Expr *pExpr; /* Parsed MATCH query string */ int iLangid; /* Language being queried for */ @@ -131313,9 +152272,7 @@ struct Fts3Cursor { i64 iMinDocid; /* Minimum docid to return */ i64 iMaxDocid; /* Maximum docid to return */ int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */ - u32 *aMatchinfo; /* Information about most recent match */ - int nMatchinfo; /* Number of elements in aMatchinfo[] */ - char *zMatchinfo; /* Matchinfo specification */ + MatchinfoBuffer *pMIBuffer; /* Buffer for matchinfo data */ }; #define FTS3_EVAL_FILTER 0 @@ -131387,6 +152344,11 @@ struct Fts3Phrase { int bIncr; /* True if doclist is loaded incrementally */ int iDoclistToken; + /* Used by sqlite3Fts3EvalPhrasePoslist() if this is a descendent of an + ** OR condition. */ + char *pOrPoslist; + i64 iOrDocid; + /* Variables below this point are populated by fts3_expr.c when parsing ** a MATCH expression. Everything above is part of the evaluation phase. */ @@ -131430,7 +152392,9 @@ struct Fts3Expr { u8 bStart; /* True if iDocid is valid */ u8 bDeferred; /* True if this expression is entirely deferred */ - u32 *aMI; + /* The following are used by the fts3_snippet.c module. */ + int iPhrase; /* Index of this phrase in matchinfo() results */ + u32 *aMI; /* See above */ }; /* @@ -131541,6 +152505,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table*,int,int); ) /* fts3.c */ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char**,const char*,...); SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *, sqlite3_int64); SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *, sqlite_int64 *); SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *, int *); @@ -131550,6 +152515,7 @@ SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,i SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *); SQLITE_PRIVATE int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *); SQLITE_PRIVATE void sqlite3Fts3CreateStatTable(int*, Fts3Table*); +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc); /* fts3_tokenizer.c */ SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *); @@ -131565,6 +152531,7 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet(sqlite3_context *, Fts3Cursor *, const ch const char *, const char *, int, int ); SQLITE_PRIVATE void sqlite3Fts3Matchinfo(sqlite3_context *, Fts3Cursor *, const char *); +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p); /* fts3_expr.c */ SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int, @@ -131572,7 +152539,7 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse(sqlite3_tokenizer *, int, ); SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *); #ifdef SQLITE_TEST -SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db); +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash*); SQLITE_PRIVATE int sqlite3Fts3InitTerm(sqlite3 *db); #endif @@ -131621,7 +152588,9 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsdiacritic(int); /* #include <string.h> */ /* #include <stdarg.h> */ +/* #include "fts3.h" */ #ifndef SQLITE_CORE +/* # include "sqlite3ext.h" */ SQLITE_EXTENSION_INIT1 #endif @@ -131630,6 +152599,13 @@ static int fts3EvalStart(Fts3Cursor *pCsr); static int fts3TermSegReaderCursor( Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **); +#ifndef SQLITE_AMALGAMATION +# if defined(SQLITE_DEBUG) +SQLITE_PRIVATE int sqlite3Fts3Always(int b) { assert( b ); return b; } +SQLITE_PRIVATE int sqlite3Fts3Never(int b) { assert( !b ); return b; } +# endif +#endif + /* ** Write a 64-bit variable-length integer to memory starting at p[0]. ** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. @@ -131659,8 +152635,9 @@ SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ ** Return the number of bytes read, or 0 on error. ** The value is stored in *v. */ -SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *p, sqlite_int64 *v){ - const char *pStart = p; +SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ + const unsigned char *p = (const unsigned char*)pBuf; + const unsigned char *pStart = p; u32 a; u64 b; int shift; @@ -131681,8 +152658,8 @@ SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *p, sqlite_int64 *v){ } /* -** Similar to sqlite3Fts3GetVarint(), except that the output is truncated to a -** 32-bit integer before it is returned. +** Similar to sqlite3Fts3GetVarint(), except that the output is truncated to +** a non-negative 32-bit integer before it is returned. */ SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *p, int *pi){ u32 a; @@ -131698,7 +152675,9 @@ SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *p, int *pi){ GETVARINT_STEP(a, p, 14, 0x3FFF, 0x200000, *pi, 3); GETVARINT_STEP(a, p, 21, 0x1FFFFF, 0x10000000, *pi, 4); a = (a & 0x0FFFFFFF ); - *pi = (int)(a | ((u32)(*p & 0x0F) << 28)); + *pi = (int)(a | ((u32)(*p & 0x07) << 28)); + assert( 0==(a & 0x80000000) ); + assert( *pi>=0 ); return 5; } @@ -131739,7 +152718,7 @@ SQLITE_PRIVATE void sqlite3Fts3Dequote(char *z){ /* If the first byte was a '[', then the close-quote character is a ']' */ if( quote=='[' ) quote = ']'; - while( ALWAYS(z[iIn]) ){ + while( z[iIn] ){ if( z[iIn]==quote ){ if( z[iIn+1]!=quote ) break; z[iOut++] = quote; @@ -131802,6 +152781,7 @@ static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ assert( p->pSegments==0 ); /* Free any prepared statements held */ + sqlite3_finalize(p->pSeekStmt); for(i=0; i<SizeofArray(p->aStmt); i++){ sqlite3_finalize(p->aStmt[i]); } @@ -131818,6 +152798,17 @@ static int fts3DisconnectMethod(sqlite3_vtab *pVtab){ return SQLITE_OK; } +/* +** Write an error message into *pzErr +*/ +SQLITE_PRIVATE void sqlite3Fts3ErrMsg(char **pzErr, const char *zFormat, ...){ + va_list ap; + sqlite3_free(*pzErr); + va_start(ap, zFormat); + *pzErr = sqlite3_vmprintf(zFormat, ap); + va_end(ap); +} + /* ** Construct one or more SQL statements from the format string given ** and then evaluate those statements. The success code is written @@ -132227,11 +153218,16 @@ static char *fts3WriteExprList(Fts3Table *p, const char *zFunc, int *pRc){ ** This function is used when parsing the "prefix=" FTS4 parameter. */ static int fts3GobbleInt(const char **pp, int *pnOut){ + const int MAX_NPREFIX = 10000000; const char *p; /* Iterator pointer */ int nInt = 0; /* Output value */ for(p=*pp; p[0]>='0' && p[0]<='9'; p++){ nInt = nInt * 10 + (p[0] - '0'); + if( nInt>MAX_NPREFIX ){ + nInt = 0; + break; + } } if( p==*pp ) return SQLITE_ERROR; *pnOut = nInt; @@ -132274,7 +153270,6 @@ static int fts3PrefixParameter( aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex); *apIndex = aIndex; - *pnIndex = nIndex; if( !aIndex ){ return SQLITE_NOMEM; } @@ -132284,13 +153279,20 @@ static int fts3PrefixParameter( const char *p = zParam; int i; for(i=1; i<nIndex; i++){ - int nPrefix; + int nPrefix = 0; if( fts3GobbleInt(&p, &nPrefix) ) return SQLITE_ERROR; - aIndex[i].nPrefix = nPrefix; + assert( nPrefix>=0 ); + if( nPrefix==0 ){ + nIndex--; + i--; + }else{ + aIndex[i].nPrefix = nPrefix; + } p++; } } + *pnIndex = nIndex; return SQLITE_OK; } @@ -132325,7 +153327,8 @@ static int fts3ContentColumns( const char *zTbl, /* Name of content table */ const char ***pazCol, /* OUT: Malloc'd array of column names */ int *pnCol, /* OUT: Size of array *pazCol */ - int *pnStr /* OUT: Bytes of string content */ + int *pnStr, /* OUT: Bytes of string content */ + char **pzErr /* OUT: error message */ ){ int rc = SQLITE_OK; /* Return code */ char *zSql; /* "SELECT *" statement on zTbl */ @@ -132336,6 +153339,9 @@ static int fts3ContentColumns( rc = SQLITE_NOMEM; }else{ rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ErrMsg(pzErr, "%s", sqlite3_errmsg(db)); + } } sqlite3_free(zSql); @@ -132414,7 +153420,7 @@ static int fts3InitVtab( const char **aCol; /* Array of column names */ sqlite3_tokenizer *pTokenizer = 0; /* Tokenizer for this table */ - int nIndex; /* Size of aIndex[] array */ + int nIndex = 0; /* Size of aIndex[] array */ struct Fts3Index *aIndex = 0; /* Array of indexes for this table */ /* The results of parsing supported FTS4 key=value options: */ @@ -132501,65 +153507,66 @@ static int fts3InitVtab( break; } } - if( iOpt==SizeofArray(aFts4Opt) ){ - *pzErr = sqlite3_mprintf("unrecognized parameter: %s", z); - rc = SQLITE_ERROR; - }else{ - switch( iOpt ){ - case 0: /* MATCHINFO */ - if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){ - *pzErr = sqlite3_mprintf("unrecognized matchinfo: %s", zVal); - rc = SQLITE_ERROR; - } - bNoDocsize = 1; - break; + switch( iOpt ){ + case 0: /* MATCHINFO */ + if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo: %s", zVal); + rc = SQLITE_ERROR; + } + bNoDocsize = 1; + break; - case 1: /* PREFIX */ - sqlite3_free(zPrefix); - zPrefix = zVal; - zVal = 0; - break; + case 1: /* PREFIX */ + sqlite3_free(zPrefix); + zPrefix = zVal; + zVal = 0; + break; - case 2: /* COMPRESS */ - sqlite3_free(zCompress); - zCompress = zVal; - zVal = 0; - break; + case 2: /* COMPRESS */ + sqlite3_free(zCompress); + zCompress = zVal; + zVal = 0; + break; - case 3: /* UNCOMPRESS */ - sqlite3_free(zUncompress); - zUncompress = zVal; - zVal = 0; - break; + case 3: /* UNCOMPRESS */ + sqlite3_free(zUncompress); + zUncompress = zVal; + zVal = 0; + break; - case 4: /* ORDER */ - if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) - && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) - ){ - *pzErr = sqlite3_mprintf("unrecognized order: %s", zVal); - rc = SQLITE_ERROR; - } - bDescIdx = (zVal[0]=='d' || zVal[0]=='D'); - break; + case 4: /* ORDER */ + if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3)) + && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 4)) + ){ + sqlite3Fts3ErrMsg(pzErr, "unrecognized order: %s", zVal); + rc = SQLITE_ERROR; + } + bDescIdx = (zVal[0]=='d' || zVal[0]=='D'); + break; - case 5: /* CONTENT */ - sqlite3_free(zContent); - zContent = zVal; - zVal = 0; - break; + case 5: /* CONTENT */ + sqlite3_free(zContent); + zContent = zVal; + zVal = 0; + break; - case 6: /* LANGUAGEID */ - assert( iOpt==6 ); - sqlite3_free(zLanguageid); - zLanguageid = zVal; - zVal = 0; - break; + case 6: /* LANGUAGEID */ + assert( iOpt==6 ); + sqlite3_free(zLanguageid); + zLanguageid = zVal; + zVal = 0; + break; - case 7: /* NOTINDEXED */ - azNotindexed[nNotindexed++] = zVal; - zVal = 0; - break; - } + case 7: /* NOTINDEXED */ + azNotindexed[nNotindexed++] = zVal; + zVal = 0; + break; + + default: + assert( iOpt==SizeofArray(aFts4Opt) ); + sqlite3Fts3ErrMsg(pzErr, "unrecognized parameter: %s", z); + rc = SQLITE_ERROR; + break; } sqlite3_free(zVal); } @@ -132587,7 +153594,7 @@ static int fts3InitVtab( if( nCol==0 ){ sqlite3_free((void*)aCol); aCol = 0; - rc = fts3ContentColumns(db, argv[1], zContent, &aCol, &nCol, &nString); + rc = fts3ContentColumns(db, argv[1], zContent,&aCol,&nCol,&nString,pzErr); /* If a languageid= option was specified, remove the language id ** column from the aCol[] array. */ @@ -132622,7 +153629,7 @@ static int fts3InitVtab( rc = fts3PrefixParameter(zPrefix, &nIndex, &aIndex); if( rc==SQLITE_ERROR ){ assert( zPrefix ); - *pzErr = sqlite3_mprintf("error parsing prefix parameter: %s", zPrefix); + sqlite3Fts3ErrMsg(pzErr, "error parsing prefix parameter: %s", zPrefix); } if( rc!=SQLITE_OK ) goto fts3_init_out; @@ -132647,9 +153654,9 @@ static int fts3InitVtab( p->pTokenizer = pTokenizer; p->nMaxPendingData = FTS3_MAX_PENDING_DATA; p->bHasDocsize = (isFts4 && bNoDocsize==0); - p->bHasStat = isFts4; - p->bFts4 = isFts4; - p->bDescIdx = bDescIdx; + p->bHasStat = (u8)isFts4; + p->bFts4 = (u8)isFts4; + p->bDescIdx = (u8)bDescIdx; p->nAutoincrmerge = 0xff; /* 0xff means setting unknown */ p->zContentTbl = zContent; p->zLanguageid = zLanguageid; @@ -132680,7 +153687,9 @@ static int fts3InitVtab( char *z; int n = 0; z = (char *)sqlite3Fts3NextToken(aCol[iCol], &n); - memcpy(zCsr, z, n); + if( n>0 ){ + memcpy(zCsr, z, n); + } zCsr[n] = '\0'; sqlite3Fts3Dequote(zCsr); p->azColumn[iCol] = zCsr; @@ -132704,7 +153713,7 @@ static int fts3InitVtab( } for(i=0; i<nNotindexed; i++){ if( azNotindexed[i] ){ - *pzErr = sqlite3_mprintf("no such column: %s", azNotindexed[i]); + sqlite3Fts3ErrMsg(pzErr, "no such column: %s", azNotindexed[i]); rc = SQLITE_ERROR; } } @@ -132712,7 +153721,7 @@ static int fts3InitVtab( if( rc==SQLITE_OK && (zCompress==0)!=(zUncompress==0) ){ char const *zMiss = (zCompress==0 ? "compress" : "uncompress"); rc = SQLITE_ERROR; - *pzErr = sqlite3_mprintf("missing %s parameter in fts4 constructor", zMiss); + sqlite3Fts3ErrMsg(pzErr, "missing %s parameter in fts4 constructor", zMiss); } p->zReadExprlist = fts3ReadExprList(p, zUncompress, &rc); p->zWriteExprlist = fts3WriteExprList(p, zCompress, &rc); @@ -132801,6 +153810,19 @@ static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ #endif } +/* +** Set the SQLITE_INDEX_SCAN_UNIQUE flag in pIdxInfo->flags. Unless this +** extension is currently being used by a version of SQLite too old to +** support index-info flags. In that case this function is a no-op. +*/ +static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ +#if SQLITE_VERSION_NUMBER>=3008012 + if( sqlite3_libversion_number()>=3008012 ){ + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; + } +#endif +} + /* ** Implementation of the xBestIndex method for FTS3 tables. There ** are three possible strategies, in order of preference: @@ -132891,6 +153913,9 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ } } + /* If using a docid=? or rowid=? strategy, set the UNIQUE flag. */ + if( pInfo->idxNum==FTS3_DOCID_SEARCH ) fts3SetUniqueFlag(pInfo); + iIdx = 1; if( iCons>=0 ){ pInfo->aConstraintUsage[iCons].argvIndex = iIdx++; @@ -132948,6 +153973,39 @@ static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ return SQLITE_OK; } +/* +** Finalize the statement handle at pCsr->pStmt. +** +** Or, if that statement handle is one created by fts3CursorSeekStmt(), +** and the Fts3Table.pSeekStmt slot is currently NULL, save the statement +** pointer there instead of finalizing it. +*/ +static void fts3CursorFinalizeStmt(Fts3Cursor *pCsr){ + if( pCsr->bSeekStmt ){ + Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; + if( p->pSeekStmt==0 ){ + p->pSeekStmt = pCsr->pStmt; + sqlite3_reset(pCsr->pStmt); + pCsr->pStmt = 0; + } + pCsr->bSeekStmt = 0; + } + sqlite3_finalize(pCsr->pStmt); +} + +/* +** Free all resources currently held by the cursor passed as the only +** argument. +*/ +static void fts3ClearCursor(Fts3Cursor *pCsr){ + fts3CursorFinalizeStmt(pCsr); + sqlite3Fts3FreeDeferredTokens(pCsr); + sqlite3_free(pCsr->aDoclist); + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + sqlite3Fts3ExprFree(pCsr->pExpr); + memset(&(&pCsr->base)[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor)); +} + /* ** Close the cursor. For additional information see the documentation ** on the xClose method of the virtual table interface. @@ -132955,11 +154013,7 @@ static int fts3OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){ Fts3Cursor *pCsr = (Fts3Cursor *)pCursor; assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); - sqlite3_finalize(pCsr->pStmt); - sqlite3Fts3ExprFree(pCsr->pExpr); - sqlite3Fts3FreeDeferredTokens(pCsr); - sqlite3_free(pCsr->aDoclist); - sqlite3_free(pCsr->aMatchinfo); + fts3ClearCursor(pCsr); assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); sqlite3_free(pCsr); return SQLITE_OK; @@ -132973,20 +154027,23 @@ static int fts3CloseMethod(sqlite3_vtab_cursor *pCursor){ ** ** (or the equivalent for a content=xxx table) and set pCsr->pStmt to ** it. If an error occurs, return an SQLite error code. -** -** Otherwise, set *ppStmt to point to pCsr->pStmt and return SQLITE_OK. */ -static int fts3CursorSeekStmt(Fts3Cursor *pCsr, sqlite3_stmt **ppStmt){ +static int fts3CursorSeekStmt(Fts3Cursor *pCsr){ int rc = SQLITE_OK; if( pCsr->pStmt==0 ){ Fts3Table *p = (Fts3Table *)pCsr->base.pVtab; char *zSql; - zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist); - if( !zSql ) return SQLITE_NOMEM; - rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0); - sqlite3_free(zSql); + if( p->pSeekStmt ){ + pCsr->pStmt = p->pSeekStmt; + p->pSeekStmt = 0; + }else{ + zSql = sqlite3_mprintf("SELECT %s WHERE rowid = ?", p->zReadExprlist); + if( !zSql ) return SQLITE_NOMEM; + rc = sqlite3_prepare_v3(p->db, zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0); + sqlite3_free(zSql); + } + if( rc==SQLITE_OK ) pCsr->bSeekStmt = 1; } - *ppStmt = pCsr->pStmt; return rc; } @@ -132998,9 +154055,7 @@ static int fts3CursorSeekStmt(Fts3Cursor *pCsr, sqlite3_stmt **ppStmt){ static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){ int rc = SQLITE_OK; if( pCsr->isRequireSeek ){ - sqlite3_stmt *pStmt = 0; - - rc = fts3CursorSeekStmt(pCsr, &pStmt); + rc = fts3CursorSeekStmt(pCsr); if( rc==SQLITE_OK ){ sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId); pCsr->isRequireSeek = 0; @@ -133089,7 +154144,8 @@ static int fts3ScanInteriorNode( isFirstTerm = 0; zCsr += fts3GetVarint32(zCsr, &nSuffix); - if( nPrefix<0 || nSuffix<0 || &zCsr[nSuffix]>zEnd ){ + assert( nPrefix>=0 && nSuffix>=0 ); + if( &zCsr[nSuffix]>zEnd ){ rc = FTS_CORRUPT_VTAB; goto finish_scan; } @@ -133808,26 +154864,33 @@ static int fts3DoclistOrMerge( ** ** The right-hand input doclist is overwritten by this function. */ -static void fts3DoclistPhraseMerge( +static int fts3DoclistPhraseMerge( int bDescDoclist, /* True if arguments are desc */ int nDist, /* Distance from left to right (1=adjacent) */ char *aLeft, int nLeft, /* Left doclist */ - char *aRight, int *pnRight /* IN/OUT: Right/output doclist */ + char **paRight, int *pnRight /* IN/OUT: Right/output doclist */ ){ sqlite3_int64 i1 = 0; sqlite3_int64 i2 = 0; sqlite3_int64 iPrev = 0; + char *aRight = *paRight; char *pEnd1 = &aLeft[nLeft]; char *pEnd2 = &aRight[*pnRight]; char *p1 = aLeft; char *p2 = aRight; char *p; int bFirstOut = 0; - char *aOut = aRight; + char *aOut; assert( nDist>0 ); - + if( bDescDoclist ){ + aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX); + if( aOut==0 ) return SQLITE_NOMEM; + }else{ + aOut = aRight; + } p = aOut; + fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1); fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2); @@ -133856,6 +154919,12 @@ static void fts3DoclistPhraseMerge( } *pnRight = (int)(p - aOut); + if( bDescDoclist ){ + sqlite3_free(aRight); + *paRight = aOut; + } + + return SQLITE_OK; } /* @@ -133886,7 +154955,7 @@ SQLITE_PRIVATE int sqlite3Fts3FirstFilter( fts3ColumnlistCopy(0, &p); } - while( p<pEnd && *p==0x01 ){ + while( p<pEnd ){ sqlite3_int64 iCol; p++; p += sqlite3Fts3GetVarint(p, &iCol); @@ -133980,8 +155049,22 @@ static int fts3TermSelectMerge( ){ if( pTS->aaOutput[0]==0 ){ /* If this is the first term selected, copy the doclist to the output - ** buffer using memcpy(). */ - pTS->aaOutput[0] = sqlite3_malloc(nDoclist); + ** buffer using memcpy(). + ** + ** Add FTS3_VARINT_MAX bytes of unused space to the end of the + ** allocation. This is so as to ensure that the buffer is big enough + ** to hold the current doclist AND'd with any other doclist. If the + ** doclists are stored in order=ASC order, this padding would not be + ** required (since the size of [doclistA AND doclistB] is always less + ** than or equal to the size of [doclistA] in that case). But this is + ** not true for order=DESC. For example, a doclist containing (1, -1) + ** may be smaller than (-1), as in the first example the -1 may be stored + ** as a single-byte delta, whereas in the second it must be stored as a + ** FTS3_VARINT_MAX byte varint. + ** + ** Similar padding is added in the fts3DoclistOrMerge() function. + */ + pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); @@ -134078,7 +155161,7 @@ static int fts3SegReaderCursor( ** calls out here. */ if( iLevel<0 && p->aIndex ){ Fts3SegReader *pSeg = 0; - rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix, &pSeg); + rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix||isScan, &pSeg); if( rc==SQLITE_OK && pSeg ){ rc = fts3SegReaderCursorAppend(pCsr, pSeg); } @@ -134431,11 +155514,7 @@ static int fts3FilterMethod( assert( iIdx==nVal ); /* In case the cursor has been used before, clear it now. */ - sqlite3_finalize(pCsr->pStmt); - sqlite3_free(pCsr->aDoclist); - sqlite3_free(pCsr->aMatchinfo); - sqlite3Fts3ExprFree(pCsr->pExpr); - memset(&pCursor[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor)); + fts3ClearCursor(pCsr); /* Set the lower and upper bounds on docids to return */ pCsr->iMinDocid = fts3DocidRange(pDocidGe, SMALLEST_INT64); @@ -134481,18 +155560,25 @@ static int fts3FilterMethod( ** row by docid. */ if( eSearch==FTS3_FULLSCAN_SEARCH ){ - zSql = sqlite3_mprintf( - "SELECT %s ORDER BY rowid %s", - p->zReadExprlist, (pCsr->bDesc ? "DESC" : "ASC") - ); + if( pDocidGe || pDocidLe ){ + zSql = sqlite3_mprintf( + "SELECT %s WHERE rowid BETWEEN %lld AND %lld ORDER BY rowid %s", + p->zReadExprlist, pCsr->iMinDocid, pCsr->iMaxDocid, + (pCsr->bDesc ? "DESC" : "ASC") + ); + }else{ + zSql = sqlite3_mprintf("SELECT %s ORDER BY rowid %s", + p->zReadExprlist, (pCsr->bDesc ? "DESC" : "ASC") + ); + } if( zSql ){ - rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0); + rc = sqlite3_prepare_v3(p->db,zSql,-1,SQLITE_PREPARE_PERSISTENT,&pCsr->pStmt,0); sqlite3_free(zSql); }else{ rc = SQLITE_NOMEM; } }else if( eSearch==FTS3_DOCID_SEARCH ){ - rc = fts3CursorSeekStmt(pCsr, &pCsr->pStmt); + rc = fts3CursorSeekStmt(pCsr); if( rc==SQLITE_OK ){ rc = sqlite3_bind_value(pCsr->pStmt, 1, pCons); } @@ -134507,7 +155593,12 @@ static int fts3FilterMethod( ** routine to find out if it has reached the end of a result set. */ static int fts3EofMethod(sqlite3_vtab_cursor *pCursor){ - return ((Fts3Cursor *)pCursor)->isEof; + Fts3Cursor *pCsr = (Fts3Cursor*)pCursor; + if( pCsr->isEof ){ + fts3ClearCursor(pCsr); + pCsr->isEof = 1; + } + return pCsr->isEof; } /* @@ -134545,33 +155636,37 @@ static int fts3ColumnMethod( /* The column value supplied by SQLite must be in range. */ assert( iCol>=0 && iCol<=p->nColumn+2 ); - if( iCol==p->nColumn+1 ){ - /* This call is a request for the "docid" column. Since "docid" is an - ** alias for "rowid", use the xRowid() method to obtain the value. - */ - sqlite3_result_int64(pCtx, pCsr->iPrevId); - }else if( iCol==p->nColumn ){ - /* The extra column whose name is the same as the table. - ** Return a blob which is a pointer to the cursor. */ - sqlite3_result_blob(pCtx, &pCsr, sizeof(pCsr), SQLITE_TRANSIENT); - }else if( iCol==p->nColumn+2 && pCsr->pExpr ){ - sqlite3_result_int64(pCtx, pCsr->iLangid); - }else{ - /* The requested column is either a user column (one that contains - ** indexed data), or the language-id column. */ - rc = fts3CursorSeek(0, pCsr); + switch( iCol-p->nColumn ){ + case 0: + /* The special 'table-name' column */ + sqlite3_result_pointer(pCtx, pCsr, "fts3cursor", 0); + break; - if( rc==SQLITE_OK ){ - if( iCol==p->nColumn+2 ){ - int iLangid = 0; - if( p->zLanguageid ){ - iLangid = sqlite3_column_int(pCsr->pStmt, p->nColumn+1); - } - sqlite3_result_int(pCtx, iLangid); - }else if( sqlite3_data_count(pCsr->pStmt)>(iCol+1) ){ + case 1: + /* The docid column */ + sqlite3_result_int64(pCtx, pCsr->iPrevId); + break; + + case 2: + if( pCsr->pExpr ){ + sqlite3_result_int64(pCtx, pCsr->iLangid); + break; + }else if( p->zLanguageid==0 ){ + sqlite3_result_int(pCtx, 0); + break; + }else{ + iCol = p->nColumn; + /* fall-through */ + } + + default: + /* A user column. Or, if this is a full-table scan, possibly the + ** language-id column. Seek the cursor. */ + rc = fts3CursorSeek(0, pCsr); + if( rc==SQLITE_OK && sqlite3_data_count(pCsr->pStmt)-1>iCol ){ sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); } - } + break; } assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 ); @@ -134620,8 +155715,10 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ const u32 nMinMerge = 64; /* Minimum amount of incr-merge work to do */ Fts3Table *p = (Fts3Table*)pVtab; - int rc = sqlite3Fts3PendingTermsFlush(p); + int rc; + i64 iLastRowid = sqlite3_last_insert_rowid(p->db); + rc = sqlite3Fts3PendingTermsFlush(p); if( rc==SQLITE_OK && p->nLeafAdd>(nMinMerge/16) && p->nAutoincrmerge && p->nAutoincrmerge!=0xff @@ -134636,6 +155733,7 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ if( A>(int)nMinMerge ) rc = sqlite3Fts3Incrmerge(p, A, p->nAutoincrmerge); } sqlite3Fts3SegmentsClose(p); + sqlite3_set_last_insert_rowid(p->db, iLastRowid); return rc; } @@ -134648,17 +155746,11 @@ static int fts3SyncMethod(sqlite3_vtab *pVtab){ static int fts3SetHasStat(Fts3Table *p){ int rc = SQLITE_OK; if( p->bHasStat==2 ){ - const char *zFmt ="SELECT 1 FROM %Q.sqlite_master WHERE tbl_name='%q_stat'"; - char *zSql = sqlite3_mprintf(zFmt, p->zDb, p->zName); - if( zSql ){ - sqlite3_stmt *pStmt = 0; - rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); - if( rc==SQLITE_OK ){ - int bHasStat = (sqlite3_step(pStmt)==SQLITE_ROW); - rc = sqlite3_finalize(pStmt); - if( rc==SQLITE_OK ) p->bHasStat = bHasStat; - } - sqlite3_free(zSql); + char *zTbl = sqlite3_mprintf("%s_stat", p->zName); + if( zTbl ){ + int res = sqlite3_table_column_metadata(p->db, p->zDb, zTbl, 0,0,0,0,0,0); + sqlite3_free(zTbl); + p->bHasStat = (res==SQLITE_OK); }else{ rc = SQLITE_NOMEM; } @@ -134720,11 +155812,31 @@ static void fts3ReversePoslist(char *pStart, char **ppPoslist){ char *p = &(*ppPoslist)[-2]; char c = 0; + /* Skip backwards passed any trailing 0x00 bytes added by NearTrim() */ while( p>pStart && (c=*p--)==0 ); + + /* Search backwards for a varint with value zero (the end of the previous + ** poslist). This is an 0x00 byte preceded by some byte that does not + ** have the 0x80 bit set. */ while( p>pStart && (*p & 0x80) | c ){ c = *p--; } - if( p>pStart ){ p = &p[2]; } + assert( p==pStart || c==0 ); + + /* At this point p points to that preceding byte without the 0x80 bit + ** set. So to find the start of the poslist, skip forward 2 bytes then + ** over a varint. + ** + ** Normally. The other case is that p==pStart and the poslist to return + ** is the first in the doclist. In this case do not skip forward 2 bytes. + ** The second part of the if condition (c==0 && *ppPoslist>&p[2]) + ** is required for cases where the first byte of a doclist and the + ** doclist is empty. For example, if the first docid is 10, a doclist + ** that begins with: + ** + ** 0x0A 0x00 <next docid delta varint> + */ + if( p>pStart || (c==0 && *ppPoslist>&p[2]) ){ p = &p[2]; } while( *p++&0x80 ); *ppPoslist = p; } @@ -134745,18 +155857,17 @@ static int fts3FunctionArg( sqlite3_value *pVal, /* argv[0] passed to function */ Fts3Cursor **ppCsr /* OUT: Store cursor handle here */ ){ - Fts3Cursor *pRet; - if( sqlite3_value_type(pVal)!=SQLITE_BLOB - || sqlite3_value_bytes(pVal)!=sizeof(Fts3Cursor *) - ){ + int rc; + *ppCsr = (Fts3Cursor*)sqlite3_value_pointer(pVal, "fts3cursor"); + if( (*ppCsr)!=0 ){ + rc = SQLITE_OK; + }else{ char *zErr = sqlite3_mprintf("illegal first argument to %s", zFunc); sqlite3_result_error(pContext, zErr, -1); sqlite3_free(zErr); - return SQLITE_ERROR; + rc = SQLITE_ERROR; } - memcpy(&pRet, sqlite3_value_blob(pVal), sizeof(Fts3Cursor *)); - *ppCsr = pRet; - return SQLITE_OK; + return rc; } /* @@ -134795,6 +155906,8 @@ static void fts3SnippetFunc( } if( !zEllipsis || !zEnd || !zStart ){ sqlite3_result_error_nomem(pContext); + }else if( nToken==0 ){ + sqlite3_result_text(pContext, "", -1, SQLITE_STATIC); }else if( SQLITE_OK==fts3CursorSeek(pContext, pCsr) ){ sqlite3Fts3Snippet(pContext, pCsr, zStart, zEnd, zEllipsis, iCol, nToken); } @@ -135136,12 +156249,12 @@ SQLITE_PRIVATE int sqlite3Fts3Init(sqlite3 *db){ #ifdef SQLITE_TEST if( rc==SQLITE_OK ){ - rc = sqlite3Fts3ExprInitTestInterface(db); + rc = sqlite3Fts3ExprInitTestInterface(db, pHash); } #endif /* Create the virtual table wrapper around the hash-table and overload - ** the two scalar functions. If this is successful, register the + ** the four scalar functions. If this is successful, register the ** module with sqlite. */ if( SQLITE_OK==rc @@ -135230,14 +156343,17 @@ static void fts3EvalAllocateReaders( ** This function assumes that pList points to a buffer allocated using ** sqlite3_malloc(). This function takes responsibility for eventually ** freeing the buffer. +** +** SQLITE_OK is returned if successful, or SQLITE_NOMEM if an error occurs. */ -static void fts3EvalPhraseMergeToken( +static int fts3EvalPhraseMergeToken( Fts3Table *pTab, /* FTS Table pointer */ Fts3Phrase *p, /* Phrase to merge pList/nList into */ int iToken, /* Token pList/nList corresponds to */ char *pList, /* Pointer to doclist */ int nList /* Number of bytes in pList */ ){ + int rc = SQLITE_OK; assert( iToken!=p->iDoclistToken ); if( pList==0 ){ @@ -135276,13 +156392,16 @@ static void fts3EvalPhraseMergeToken( nDiff = p->iDoclistToken - iToken; } - fts3DoclistPhraseMerge(pTab->bDescIdx, nDiff, pLeft, nLeft, pRight,&nRight); + rc = fts3DoclistPhraseMerge( + pTab->bDescIdx, nDiff, pLeft, nLeft, &pRight, &nRight + ); sqlite3_free(pLeft); p->doclist.aAll = pRight; p->doclist.nAll = nRight; } if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken; + return rc; } /* @@ -135308,7 +156427,7 @@ static int fts3EvalPhraseLoad( char *pThis = 0; rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis); if( rc==SQLITE_OK ){ - fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis); + rc = fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis); } } assert( pToken->pSegcsr==0 ); @@ -135453,7 +156572,6 @@ static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){ int bIncrOk = (bOptOk && pCsr->bDesc==pTab->bDescIdx && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 - && p->nToken<=MAX_INCR_PHRASE_TOKENS && p->nToken>0 #ifdef SQLITE_TEST && pTab->bNoIncrDoclist==0 #endif @@ -135573,6 +156691,7 @@ SQLITE_PRIVATE void sqlite3Fts3DoclistNext( p += sqlite3Fts3GetVarint(p, piDocid); }else{ fts3PoslistCopy(0, &p); + while( p<&aDoclist[nDoclist] && *p==0 ) p++; if( p>=&aDoclist[nDoclist] ){ *pbEof = 1; }else{ @@ -135718,7 +156837,7 @@ static int fts3EvalIncrPhraseNext( ** one incremental token. In which case the bIncr flag is set. */ assert( p->bIncr==1 ); - if( p->nToken==1 && p->bIncr ){ + if( p->nToken==1 ){ rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr, &pDL->iDocid, &pDL->pList, &pDL->nList ); @@ -135850,12 +156969,14 @@ static void fts3EvalStartReaders( ){ if( pExpr && SQLITE_OK==*pRc ){ if( pExpr->eType==FTSQUERY_PHRASE ){ - int i; int nToken = pExpr->pPhrase->nToken; - for(i=0; i<nToken; i++){ - if( pExpr->pPhrase->aToken[i].pDeferred==0 ) break; + if( nToken ){ + int i; + for(i=0; i<nToken; i++){ + if( pExpr->pPhrase->aToken[i].pDeferred==0 ) break; + } + pExpr->bDeferred = (i==nToken); } - pExpr->bDeferred = (i==nToken); *pRc = fts3EvalPhraseStart(pCsr, 1, pExpr->pPhrase); }else{ fts3EvalStartReaders(pCsr, pExpr->pLeft, pRc); @@ -135949,6 +157070,7 @@ static void fts3EvalTokenCosts( ** the number of overflow pages consumed by a record B bytes in size. */ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ + int rc = SQLITE_OK; if( pCsr->nRowAvg==0 ){ /* The average document size, which is required to calculate the cost ** of each doclist, has not yet been determined. Read the required @@ -135961,7 +157083,6 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ ** data stored in all rows of each column of the table, from left ** to right. */ - int rc; Fts3Table *p = (Fts3Table*)pCsr->base.pVtab; sqlite3_stmt *pStmt; sqlite3_int64 nDoc = 0; @@ -135988,11 +157109,10 @@ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){ pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz); assert( pCsr->nRowAvg>0 ); rc = sqlite3_reset(pStmt); - if( rc!=SQLITE_OK ) return rc; } *pnPage = pCsr->nRowAvg; - return SQLITE_OK; + return rc; } /* @@ -136110,9 +157230,13 @@ static int fts3EvalSelectDeferred( char *pList = 0; rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList); assert( rc==SQLITE_OK || pList==0 ); + if( rc==SQLITE_OK ){ + rc = fts3EvalPhraseMergeToken( + pTab, pTC->pPhrase, pTC->iToken,pList,nList + ); + } if( rc==SQLITE_OK ){ int nCount; - fts3EvalPhraseMergeToken(pTab, pTC->pPhrase, pTC->iToken,pList,nList); nCount = fts3DoclistCountDocids( pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll ); @@ -136290,7 +157414,7 @@ static int fts3EvalNearTrim( ** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is ** advanced to point to the next row that matches "x AND y". ** -** See fts3EvalTestDeferredAndNear() for details on testing if a row is +** See sqlite3Fts3EvalTestDeferred() for details on testing if a row is ** really a match, taking into account deferred tokens and NEAR operators. */ static void fts3EvalNextRow( @@ -136337,6 +157461,23 @@ static void fts3EvalNextRow( } pExpr->iDocid = pLeft->iDocid; pExpr->bEof = (pLeft->bEof || pRight->bEof); + if( pExpr->eType==FTSQUERY_NEAR && pExpr->bEof ){ + assert( pRight->eType==FTSQUERY_PHRASE ); + if( pRight->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pRight->pPhrase->doclist; + while( *pRc==SQLITE_OK && pRight->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pRight, pRc); + } + } + if( pLeft->pPhrase && pLeft->pPhrase->doclist.aAll ){ + Fts3Doclist *pDl = &pLeft->pPhrase->doclist; + while( *pRc==SQLITE_OK && pLeft->bEof==0 ){ + memset(pDl->pList, 0, pDl->nList); + fts3EvalNextRow(pCsr, pLeft, pRc); + } + } + } } break; } @@ -136351,7 +157492,7 @@ static void fts3EvalNextRow( if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){ fts3EvalNextRow(pCsr, pLeft, pRc); - }else if( pLeft->bEof || (pRight->bEof==0 && iCmp>0) ){ + }else if( pLeft->bEof || iCmp>0 ){ fts3EvalNextRow(pCsr, pRight, pRc); }else{ fts3EvalNextRow(pCsr, pLeft, pRc); @@ -136443,7 +157584,6 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ */ if( *pRc==SQLITE_OK && pExpr->eType==FTSQUERY_NEAR - && pExpr->bEof==0 && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ Fts3Expr *p; @@ -136452,49 +157592,46 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ /* Allocate temporary working space. */ for(p=pExpr; p->pLeft; p=p->pLeft){ + assert( p->pRight->pPhrase->doclist.nList>0 ); nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - if( nTmp==0 ){ + aTmp = sqlite3_malloc(nTmp*2); + if( !aTmp ){ + *pRc = SQLITE_NOMEM; res = 0; }else{ - aTmp = sqlite3_malloc(nTmp*2); - if( !aTmp ){ - *pRc = SQLITE_NOMEM; - res = 0; - }else{ - char *aPoslist = p->pPhrase->doclist.pList; - int nToken = p->pPhrase->nToken; + char *aPoslist = p->pPhrase->doclist.pList; + int nToken = p->pPhrase->nToken; - for(p=p->pParent;res && p && p->eType==FTSQUERY_NEAR; p=p->pParent){ - Fts3Phrase *pPhrase = p->pRight->pPhrase; - int nNear = p->nNear; - res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); - } - - aPoslist = pExpr->pRight->pPhrase->doclist.pList; - nToken = pExpr->pRight->pPhrase->nToken; - for(p=pExpr->pLeft; p && res; p=p->pLeft){ - int nNear; - Fts3Phrase *pPhrase; - assert( p->pParent && p->pParent->pLeft==p ); - nNear = p->pParent->nNear; - pPhrase = ( - p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase - ); - res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); - } + for(p=p->pParent;res && p && p->eType==FTSQUERY_NEAR; p=p->pParent){ + Fts3Phrase *pPhrase = p->pRight->pPhrase; + int nNear = p->nNear; + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); } - sqlite3_free(aTmp); + aPoslist = pExpr->pRight->pPhrase->doclist.pList; + nToken = pExpr->pRight->pPhrase->nToken; + for(p=pExpr->pLeft; p && res; p=p->pLeft){ + int nNear; + Fts3Phrase *pPhrase; + assert( p->pParent && p->pParent->pLeft==p ); + nNear = p->pParent->nNear; + pPhrase = ( + p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase + ); + res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase); + } } + + sqlite3_free(aTmp); } return res; } /* -** This function is a helper function for fts3EvalTestDeferredAndNear(). +** This function is a helper function for sqlite3Fts3EvalTestDeferred(). ** Assuming no error occurs or has occurred, It returns non-zero if the ** expression passed as the second argument matches the row that pCsr ** currently points to, or zero if it does not. @@ -136615,7 +157752,7 @@ static int fts3EvalTestExpr( ** Or, if no error occurs and it seems the current row does match the FTS ** query, return 0. */ -static int fts3EvalTestDeferredAndNear(Fts3Cursor *pCsr, int *pRc){ +SQLITE_PRIVATE int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc){ int rc = *pRc; int bMiss = 0; if( rc==SQLITE_OK ){ @@ -136662,7 +157799,7 @@ static int fts3EvalNext(Fts3Cursor *pCsr){ pCsr->isRequireSeek = 1; pCsr->isMatchinfoNeeded = 1; pCsr->iPrevId = pExpr->iDocid; - }while( pCsr->isEof==0 && fts3EvalTestDeferredAndNear(pCsr, &rc) ); + }while( pCsr->isEof==0 && sqlite3Fts3EvalTestDeferred(pCsr, &rc) ); } /* Check if the cursor is past the end of the docid range specified @@ -136709,6 +157846,7 @@ static void fts3EvalRestart( } pPhrase->doclist.pNextDocid = 0; pPhrase->doclist.iDocid = 0; + pPhrase->pOrPoslist = 0; } pExpr->iDocid = 0; @@ -136822,7 +157960,7 @@ static int fts3EvalGatherStats( pCsr->iPrevId = pRoot->iDocid; }while( pCsr->isEof==0 && pRoot->eType==FTSQUERY_NEAR - && fts3EvalTestDeferredAndNear(pCsr, &rc) + && sqlite3Fts3EvalTestDeferred(pCsr, &rc) ); if( rc==SQLITE_OK && pCsr->isEof==0 ){ @@ -136847,7 +157985,6 @@ static int fts3EvalGatherStats( fts3EvalNextRow(pCsr, pRoot, &rc); assert( pRoot->bEof==0 ); }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK ); - fts3EvalTestDeferredAndNear(pCsr, &rc); } } return rc; @@ -136954,13 +158091,13 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( iDocid = pExpr->iDocid; pIter = pPhrase->doclist.pList; if( iDocid!=pCsr->iPrevId || pExpr->bEof ){ + int rc = SQLITE_OK; int bDescDoclist = pTab->bDescIdx; /* For DOCID_CMP macro */ - int iMul; /* +1 if csr dir matches index dir, else -1 */ int bOr = 0; - u8 bEof = 0; u8 bTreeEof = 0; Fts3Expr *p; /* Used to iterate from pExpr to root */ Fts3Expr *pNear; /* Most senior NEAR ancestor (or pExpr) */ + int bMatch; /* Check if this phrase descends from an OR expression node. If not, ** return NULL. Otherwise, the entry that corresponds to docid @@ -136979,74 +158116,62 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( ** an incremental phrase. Load the entire doclist for the phrase ** into memory in this case. */ if( pPhrase->bIncr ){ - int rc = SQLITE_OK; - int bEofSave = pExpr->bEof; - fts3EvalRestart(pCsr, pExpr, &rc); - while( rc==SQLITE_OK && !pExpr->bEof ){ - fts3EvalNextRow(pCsr, pExpr, &rc); - if( bEofSave==0 && pExpr->iDocid==iDocid ) break; + int bEofSave = pNear->bEof; + fts3EvalRestart(pCsr, pNear, &rc); + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + if( bEofSave==0 && pNear->iDocid==iDocid ) break; } - pIter = pPhrase->doclist.pList; assert( rc!=SQLITE_OK || pPhrase->bIncr==0 ); - if( rc!=SQLITE_OK ) return rc; } - - iMul = ((pCsr->bDesc==bDescDoclist) ? 1 : -1); - while( bTreeEof==1 - && pNear->bEof==0 - && (DOCID_CMP(pNear->iDocid, pCsr->iPrevId) * iMul)<0 - ){ - int rc = SQLITE_OK; - fts3EvalNextRow(pCsr, pExpr, &rc); - if( rc!=SQLITE_OK ) return rc; - iDocid = pExpr->iDocid; - pIter = pPhrase->doclist.pList; + if( bTreeEof ){ + while( rc==SQLITE_OK && !pNear->bEof ){ + fts3EvalNextRow(pCsr, pNear, &rc); + } } + if( rc!=SQLITE_OK ) return rc; - bEof = (pPhrase->doclist.nAll==0); - assert( bDescDoclist==0 || bDescDoclist==1 ); - assert( pCsr->bDesc==0 || pCsr->bDesc==1 ); + bMatch = 1; + for(p=pNear; p; p=p->pLeft){ + u8 bEof = 0; + Fts3Expr *pTest = p; + Fts3Phrase *pPh; + assert( pTest->eType==FTSQUERY_NEAR || pTest->eType==FTSQUERY_PHRASE ); + if( pTest->eType==FTSQUERY_NEAR ) pTest = pTest->pRight; + assert( pTest->eType==FTSQUERY_PHRASE ); + pPh = pTest->pPhrase; - if( bEof==0 ){ + pIter = pPh->pOrPoslist; + iDocid = pPh->iOrDocid; if( pCsr->bDesc==bDescDoclist ){ - int dummy; - if( pNear->bEof ){ - /* This expression is already at EOF. So position it to point to the - ** last entry in the doclist at pPhrase->doclist.aAll[]. Variable - ** iDocid is already set for this entry, so all that is required is - ** to set pIter to point to the first byte of the last position-list - ** in the doclist. - ** - ** It would also be correct to set pIter and iDocid to zero. In - ** this case, the first call to sqltie3Fts4DoclistPrev() below - ** would also move the iterator to point to the last entry in the - ** doclist. However, this is expensive, as to do so it has to - ** iterate through the entire doclist from start to finish (since - ** it does not know the docid for the last entry). */ - pIter = &pPhrase->doclist.aAll[pPhrase->doclist.nAll-1]; - fts3ReversePoslist(pPhrase->doclist.aAll, &pIter); - } - while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){ - sqlite3Fts3DoclistPrev( - bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll, - &pIter, &iDocid, &dummy, &bEof - ); - } - }else{ - if( pNear->bEof ){ - pIter = 0; - iDocid = 0; - } + bEof = !pPh->doclist.nAll || + (pIter >= (pPh->doclist.aAll + pPh->doclist.nAll)); while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){ sqlite3Fts3DoclistNext( - bDescDoclist, pPhrase->doclist.aAll, pPhrase->doclist.nAll, + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, &pIter, &iDocid, &bEof ); } + }else{ + bEof = !pPh->doclist.nAll || (pIter && pIter<=pPh->doclist.aAll); + while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){ + int dummy; + sqlite3Fts3DoclistPrev( + bDescDoclist, pPh->doclist.aAll, pPh->doclist.nAll, + &pIter, &iDocid, &dummy, &bEof + ); + } } + pPh->pOrPoslist = pIter; + pPh->iOrDocid = iDocid; + if( bEof || iDocid!=pCsr->iPrevId ) bMatch = 0; } - if( bEof || iDocid!=pCsr->iPrevId ) pIter = 0; + if( bMatch ){ + pIter = pPhrase->pOrPoslist; + }else{ + pIter = 0; + } } if( pIter==0 ) return SQLITE_OK; @@ -137058,10 +158183,13 @@ SQLITE_PRIVATE int sqlite3Fts3EvalPhrasePoslist( } while( iThis<iCol ){ fts3ColumnlistCopy(0, &pIter); - if( *pIter==0x00 ) return 0; + if( *pIter==0x00 ) return SQLITE_OK; pIter++; pIter += fts3GetVarint32(pIter, &iThis); } + if( *pIter==0x00 ){ + pIter = 0; + } *ppOut = ((iCol==iThis)?pIter:0); return SQLITE_OK; @@ -137131,6 +158259,7 @@ SQLITE_API int sqlite3_fts3_init( ****************************************************************************** ** */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <string.h> */ @@ -137235,7 +158364,7 @@ static int fts3auxConnectMethod( return SQLITE_OK; bad_args: - *pzErr = sqlite3_mprintf("invalid arguments to fts4aux constructor"); + sqlite3Fts3ErrMsg(pzErr, "invalid arguments to fts4aux constructor"); return SQLITE_ERROR; } @@ -137687,6 +158816,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db){ ** syntax is relatively simple, the whole tokenizer/parser system is ** hand-coded. */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* @@ -138464,125 +159594,151 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ rc = SQLITE_ERROR; } - if( rc==SQLITE_OK && (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ - Fts3Expr **apLeaf; - apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); - if( 0==apLeaf ){ - rc = SQLITE_NOMEM; - }else{ - memset(apLeaf, 0, sizeof(Fts3Expr *) * nMaxDepth); - } - - if( rc==SQLITE_OK ){ - int i; - Fts3Expr *p; - - /* Set $p to point to the left-most leaf in the tree of eType nodes. */ - for(p=pRoot; p->eType==eType; p=p->pLeft){ - assert( p->pParent==0 || p->pParent->pLeft==p ); - assert( p->pLeft && p->pRight ); - } - - /* This loop runs once for each leaf in the tree of eType nodes. */ - while( 1 ){ - int iLvl; - Fts3Expr *pParent = p->pParent; /* Current parent of p */ - - assert( pParent==0 || pParent->pLeft==p ); - p->pParent = 0; - if( pParent ){ - pParent->pLeft = 0; - }else{ - pRoot = 0; - } - rc = fts3ExprBalance(&p, nMaxDepth-1); - if( rc!=SQLITE_OK ) break; - - for(iLvl=0; p && iLvl<nMaxDepth; iLvl++){ - if( apLeaf[iLvl]==0 ){ - apLeaf[iLvl] = p; - p = 0; - }else{ - assert( pFree ); - pFree->pLeft = apLeaf[iLvl]; - pFree->pRight = p; - pFree->pLeft->pParent = pFree; - pFree->pRight->pParent = pFree; - - p = pFree; - pFree = pFree->pParent; - p->pParent = 0; - apLeaf[iLvl] = 0; - } - } - if( p ){ - sqlite3Fts3ExprFree(p); - rc = SQLITE_TOOBIG; - break; - } - - /* If that was the last leaf node, break out of the loop */ - if( pParent==0 ) break; - - /* Set $p to point to the next leaf in the tree of eType nodes */ - for(p=pParent->pRight; p->eType==eType; p=p->pLeft); - - /* Remove pParent from the original tree. */ - assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); - pParent->pRight->pParent = pParent->pParent; - if( pParent->pParent ){ - pParent->pParent->pLeft = pParent->pRight; - }else{ - assert( pParent==pRoot ); - pRoot = pParent->pRight; - } - - /* Link pParent into the free node list. It will be used as an - ** internal node of the new tree. */ - pParent->pParent = pFree; - pFree = pParent; + if( rc==SQLITE_OK ){ + if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ + Fts3Expr **apLeaf; + apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + if( 0==apLeaf ){ + rc = SQLITE_NOMEM; + }else{ + memset(apLeaf, 0, sizeof(Fts3Expr *) * nMaxDepth); } if( rc==SQLITE_OK ){ - p = 0; - for(i=0; i<nMaxDepth; i++){ - if( apLeaf[i] ){ - if( p==0 ){ - p = apLeaf[i]; - p->pParent = 0; + int i; + Fts3Expr *p; + + /* Set $p to point to the left-most leaf in the tree of eType nodes. */ + for(p=pRoot; p->eType==eType; p=p->pLeft){ + assert( p->pParent==0 || p->pParent->pLeft==p ); + assert( p->pLeft && p->pRight ); + } + + /* This loop runs once for each leaf in the tree of eType nodes. */ + while( 1 ){ + int iLvl; + Fts3Expr *pParent = p->pParent; /* Current parent of p */ + + assert( pParent==0 || pParent->pLeft==p ); + p->pParent = 0; + if( pParent ){ + pParent->pLeft = 0; + }else{ + pRoot = 0; + } + rc = fts3ExprBalance(&p, nMaxDepth-1); + if( rc!=SQLITE_OK ) break; + + for(iLvl=0; p && iLvl<nMaxDepth; iLvl++){ + if( apLeaf[iLvl]==0 ){ + apLeaf[iLvl] = p; + p = 0; }else{ - assert( pFree!=0 ); + assert( pFree ); + pFree->pLeft = apLeaf[iLvl]; pFree->pRight = p; - pFree->pLeft = apLeaf[i]; pFree->pLeft->pParent = pFree; pFree->pRight->pParent = pFree; p = pFree; pFree = pFree->pParent; p->pParent = 0; + apLeaf[iLvl] = 0; } } + if( p ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_TOOBIG; + break; + } + + /* If that was the last leaf node, break out of the loop */ + if( pParent==0 ) break; + + /* Set $p to point to the next leaf in the tree of eType nodes */ + for(p=pParent->pRight; p->eType==eType; p=p->pLeft); + + /* Remove pParent from the original tree. */ + assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); + pParent->pRight->pParent = pParent->pParent; + if( pParent->pParent ){ + pParent->pParent->pLeft = pParent->pRight; + }else{ + assert( pParent==pRoot ); + pRoot = pParent->pRight; + } + + /* Link pParent into the free node list. It will be used as an + ** internal node of the new tree. */ + pParent->pParent = pFree; + pFree = pParent; } - pRoot = p; - }else{ - /* An error occurred. Delete the contents of the apLeaf[] array - ** and pFree list. Everything else is cleaned up by the call to - ** sqlite3Fts3ExprFree(pRoot) below. */ - Fts3Expr *pDel; - for(i=0; i<nMaxDepth; i++){ - sqlite3Fts3ExprFree(apLeaf[i]); - } - while( (pDel=pFree)!=0 ){ - pFree = pDel->pParent; - sqlite3_free(pDel); + + if( rc==SQLITE_OK ){ + p = 0; + for(i=0; i<nMaxDepth; i++){ + if( apLeaf[i] ){ + if( p==0 ){ + p = apLeaf[i]; + p->pParent = 0; + }else{ + assert( pFree!=0 ); + pFree->pRight = p; + pFree->pLeft = apLeaf[i]; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + } + } + } + pRoot = p; + }else{ + /* An error occurred. Delete the contents of the apLeaf[] array + ** and pFree list. Everything else is cleaned up by the call to + ** sqlite3Fts3ExprFree(pRoot) below. */ + Fts3Expr *pDel; + for(i=0; i<nMaxDepth; i++){ + sqlite3Fts3ExprFree(apLeaf[i]); + } + while( (pDel=pFree)!=0 ){ + pFree = pDel->pParent; + sqlite3_free(pDel); + } } + + assert( pFree==0 ); + sqlite3_free( apLeaf ); + } + }else if( eType==FTSQUERY_NOT ){ + Fts3Expr *pLeft = pRoot->pLeft; + Fts3Expr *pRight = pRoot->pRight; + + pRoot->pLeft = 0; + pRoot->pRight = 0; + pLeft->pParent = 0; + pRight->pParent = 0; + + rc = fts3ExprBalance(&pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprBalance(&pRight, nMaxDepth-1); } - assert( pFree==0 ); - sqlite3_free( apLeaf ); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRight); + sqlite3Fts3ExprFree(pLeft); + }else{ + assert( pLeft && pRight ); + pRoot->pLeft = pLeft; + pLeft->pParent = pRoot; + pRoot->pRight = pRight; + pRight->pParent = pRoot; + } } } - + if( rc!=SQLITE_OK ){ sqlite3Fts3ExprFree(pRoot); pRoot = 0; @@ -138693,13 +159849,13 @@ SQLITE_PRIVATE int sqlite3Fts3ExprParse( sqlite3Fts3ExprFree(*ppExpr); *ppExpr = 0; if( rc==SQLITE_TOOBIG ){ - *pzErr = sqlite3_mprintf( + sqlite3Fts3ErrMsg(pzErr, "FTS expression tree is too large (maximum depth %d)", SQLITE_FTS3_MAX_EXPR_DEPTH ); rc = SQLITE_ERROR; }else if( rc==SQLITE_ERROR ){ - *pzErr = sqlite3_mprintf("malformed MATCH expression: [%s]", z); + sqlite3Fts3ErrMsg(pzErr, "malformed MATCH expression: [%s]", z); } } @@ -138753,34 +159909,6 @@ SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *pDel){ /* #include <stdio.h> */ -/* -** Function to query the hash-table of tokenizers (see README.tokenizers). -*/ -static int queryTestTokenizer( - sqlite3 *db, - const char *zName, - const sqlite3_tokenizer_module **pp -){ - int rc; - sqlite3_stmt *pStmt; - const char zSql[] = "SELECT fts3_tokenizer(?)"; - - *pp = 0; - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); - if( rc!=SQLITE_OK ){ - return rc; - } - - sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC); - if( SQLITE_ROW==sqlite3_step(pStmt) ){ - if( sqlite3_column_type(pStmt, 0)==SQLITE_BLOB ){ - memcpy((void *)pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp)); - } - } - - return sqlite3_finalize(pStmt); -} - /* ** Return a pointer to a buffer containing a text representation of the ** expression passed as the first argument. The buffer is obtained from @@ -138848,12 +159976,12 @@ static char *exprToString(Fts3Expr *pExpr, char *zBuf){ ** ** SELECT fts3_exprtest('simple', 'Bill col2:Bloggs', 'col1', 'col2'); */ -static void fts3ExprTest( +static void fts3ExprTestCommon( + int bRebalance, sqlite3_context *context, int argc, sqlite3_value **argv ){ - sqlite3_tokenizer_module const *pModule = 0; sqlite3_tokenizer *pTokenizer = 0; int rc; char **azCol = 0; @@ -138863,7 +159991,9 @@ static void fts3ExprTest( int ii; Fts3Expr *pExpr; char *zBuf = 0; - sqlite3 *db = sqlite3_context_db_handle(context); + Fts3Hash *pHash = (Fts3Hash*)sqlite3_user_data(context); + const char *zTokenizer = 0; + char *zErr = 0; if( argc<3 ){ sqlite3_result_error(context, @@ -138872,24 +160002,18 @@ static void fts3ExprTest( return; } - rc = queryTestTokenizer(db, - (const char *)sqlite3_value_text(argv[0]), &pModule); - if( rc==SQLITE_NOMEM ){ - sqlite3_result_error_nomem(context); - goto exprtest_out; - }else if( !pModule ){ - sqlite3_result_error(context, "No such tokenizer module", -1); - goto exprtest_out; + zTokenizer = (const char*)sqlite3_value_text(argv[0]); + rc = sqlite3Fts3InitTokenizer(pHash, zTokenizer, &pTokenizer, &zErr); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_NOMEM ){ + sqlite3_result_error_nomem(context); + }else{ + sqlite3_result_error(context, zErr, -1); + } + sqlite3_free(zErr); + return; } - rc = pModule->xCreate(0, 0, &pTokenizer); - assert( rc==SQLITE_NOMEM || rc==SQLITE_OK ); - if( rc==SQLITE_NOMEM ){ - sqlite3_result_error_nomem(context); - goto exprtest_out; - } - pTokenizer->pModule = pModule; - zExpr = (const char *)sqlite3_value_text(argv[1]); nExpr = sqlite3_value_bytes(argv[1]); nCol = argc-2; @@ -138902,7 +160026,7 @@ static void fts3ExprTest( azCol[ii] = (char *)sqlite3_value_text(argv[ii+2]); } - if( sqlite3_user_data(context) ){ + if( bRebalance ){ char *zDummy = 0; rc = sqlite3Fts3ExprParse( pTokenizer, 0, azCol, 0, nCol, nCol, zExpr, nExpr, &pExpr, &zDummy @@ -138928,23 +160052,38 @@ static void fts3ExprTest( sqlite3Fts3ExprFree(pExpr); exprtest_out: - if( pModule && pTokenizer ){ - rc = pModule->xDestroy(pTokenizer); + if( pTokenizer ){ + rc = pTokenizer->pModule->xDestroy(pTokenizer); } sqlite3_free(azCol); } +static void fts3ExprTest( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3ExprTestCommon(0, context, argc, argv); +} +static void fts3ExprTestRebalance( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + fts3ExprTestCommon(1, context, argc, argv); +} + /* ** Register the query expression parser test function fts3_exprtest() ** with database connection db. */ -SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){ +SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3 *db, Fts3Hash *pHash){ int rc = sqlite3_create_function( - db, "fts3_exprtest", -1, SQLITE_UTF8, 0, fts3ExprTest, 0, 0 + db, "fts3_exprtest", -1, SQLITE_UTF8, (void*)pHash, fts3ExprTest, 0, 0 ); if( rc==SQLITE_OK ){ rc = sqlite3_create_function(db, "fts3_exprtest_rebalance", - -1, SQLITE_UTF8, (void *)1, fts3ExprTest, 0, 0 + -1, SQLITE_UTF8, (void*)pHash, fts3ExprTestRebalance, 0, 0 ); } return rc; @@ -138980,12 +160119,14 @@ SQLITE_PRIVATE int sqlite3Fts3ExprInitTestInterface(sqlite3* db){ ** * The FTS3 module is being built into the core of ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <assert.h> */ /* #include <stdlib.h> */ /* #include <string.h> */ +/* #include "fts3_hash.h" */ /* ** Malloc and Free functions @@ -139363,6 +160504,7 @@ SQLITE_PRIVATE void *sqlite3Fts3HashInsert( ** * The FTS3 module is being built into the core of ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <assert.h> */ @@ -139370,6 +160512,7 @@ SQLITE_PRIVATE void *sqlite3Fts3HashInsert( /* #include <stdio.h> */ /* #include <string.h> */ +/* #include "fts3_tokenizer.h" */ /* ** Class derived from sqlite3_tokenizer @@ -140027,11 +161170,24 @@ SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule( ** * The FTS3 module is being built into the core of ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <assert.h> */ /* #include <string.h> */ +/* +** Return true if the two-argument version of fts3_tokenizer() +** has been activated via a prior call to sqlite3_db_config(db, +** SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, 1, 0); +*/ +static int fts3TokenizerEnabled(sqlite3_context *context){ + sqlite3 *db = sqlite3_context_db_handle(context); + int isEnabled = 0; + sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,-1,&isEnabled); + return isEnabled; +} + /* ** Implementation of the SQL scalar function for accessing the underlying ** hash table. This function may be called as follows: @@ -140052,7 +161208,7 @@ SQLITE_PRIVATE void sqlite3Fts3PorterTokenizerModule( ** is a blob containing the pointer stored as the hash data corresponding ** to string <key-name> (after the hash-table is updated, if applicable). */ -static void scalarFunc( +static void fts3TokenizerFunc( sqlite3_context *context, int argc, sqlite3_value **argv @@ -140070,20 +161226,26 @@ static void scalarFunc( nName = sqlite3_value_bytes(argv[0])+1; if( argc==2 ){ - void *pOld; - int n = sqlite3_value_bytes(argv[1]); - if( n!=sizeof(pPtr) ){ - sqlite3_result_error(context, "argument type mismatch", -1); - return; - } - pPtr = *(void **)sqlite3_value_blob(argv[1]); - pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); - if( pOld==pPtr ){ - sqlite3_result_error(context, "out of memory", -1); + if( fts3TokenizerEnabled(context) ){ + void *pOld; + int n = sqlite3_value_bytes(argv[1]); + if( zName==0 || n!=sizeof(pPtr) ){ + sqlite3_result_error(context, "argument type mismatch", -1); + return; + } + pPtr = *(void **)sqlite3_value_blob(argv[1]); + pOld = sqlite3Fts3HashInsert(pHash, (void *)zName, nName, pPtr); + if( pOld==pPtr ){ + sqlite3_result_error(context, "out of memory", -1); + } + }else{ + sqlite3_result_error(context, "fts3tokenize disabled", -1); return; } }else{ - pPtr = sqlite3Fts3HashFind(pHash, zName, nName); + if( zName ){ + pPtr = sqlite3Fts3HashFind(pHash, zName, nName); + } if( !pPtr ){ char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); sqlite3_result_error(context, zErr, -1); @@ -140091,7 +161253,6 @@ static void scalarFunc( return; } } - sqlite3_result_blob(context, (void *)&pPtr, sizeof(pPtr), SQLITE_TRANSIENT); } @@ -140164,12 +161325,16 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( zEnd = &zCopy[strlen(zCopy)]; z = (char *)sqlite3Fts3NextToken(zCopy, &n); + if( z==0 ){ + assert( n==0 ); + z = zCopy; + } z[n] = '\0'; sqlite3Fts3Dequote(z); m = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash,z,(int)strlen(z)+1); if( !m ){ - *pzErr = sqlite3_mprintf("unknown tokenizer: %s", z); + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", z); rc = SQLITE_ERROR; }else{ char const **aArg = 0; @@ -140192,7 +161357,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( rc = m->xCreate(iArg, aArg, ppTok); assert( rc!=SQLITE_OK || *ppTok ); if( rc!=SQLITE_OK ){ - *pzErr = sqlite3_mprintf("unknown tokenizer"); + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer"); }else{ (*ppTok)->pModule = m; } @@ -140206,7 +161371,11 @@ SQLITE_PRIVATE int sqlite3Fts3InitTokenizer( #ifdef SQLITE_TEST -#include <tcl.h> +#if defined(INCLUDE_SQLITE_TCL_H) +# include "sqlite_tcl.h" +#else +# include "tcl.h" +#endif /* #include <string.h> */ /* @@ -140276,9 +161445,9 @@ static void testFunc( p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); if( !p ){ - char *zErr = sqlite3_mprintf("unknown tokenizer: %s", zName); - sqlite3_result_error(context, zErr, -1); - sqlite3_free(zErr); + char *zErr2 = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3_result_error(context, zErr2, -1); + sqlite3_free(zErr2); return; } @@ -140347,6 +161516,7 @@ int registerTokenizer( return sqlite3_finalize(pStmt); } + static int queryTokenizer( sqlite3 *db, @@ -140417,11 +161587,13 @@ static void intTestFunc( assert( 0==strcmp(sqlite3_errmsg(db), "unknown tokenizer: nosuchtokenizer") ); /* Test the storage function */ - rc = registerTokenizer(db, "nosuchtokenizer", p1); - assert( rc==SQLITE_OK ); - rc = queryTokenizer(db, "nosuchtokenizer", &p2); - assert( rc==SQLITE_OK ); - assert( p2==p1 ); + if( fts3TokenizerEnabled(context) ){ + rc = registerTokenizer(db, "nosuchtokenizer", p1); + assert( rc==SQLITE_OK ); + rc = queryTokenizer(db, "nosuchtokenizer", &p2); + assert( rc==SQLITE_OK ); + assert( p2==p1 ); + } sqlite3_result_text(context, "ok", -1, SQLITE_STATIC); } @@ -140437,7 +161609,7 @@ static void intTestFunc( ** sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1); ** ** This function adds a scalar function (see header comment above -** scalarFunc() in this file for details) and, if ENABLE_TABLE is +** fts3TokenizerFunc() in this file for details) and, if ENABLE_TABLE is ** defined at compilation time, a temporary virtual table (see header ** comment above struct HashTableVtab) to the database schema. Both ** provide read/write access to the contents of *pHash. @@ -140466,10 +161638,10 @@ SQLITE_PRIVATE int sqlite3Fts3InitHashTable( #endif if( SQLITE_OK==rc ){ - rc = sqlite3_create_function(db, zName, 1, any, p, scalarFunc, 0, 0); + rc = sqlite3_create_function(db, zName, 1, any, p, fts3TokenizerFunc, 0, 0); } if( SQLITE_OK==rc ){ - rc = sqlite3_create_function(db, zName, 2, any, p, scalarFunc, 0, 0); + rc = sqlite3_create_function(db, zName, 2, any, p, fts3TokenizerFunc, 0, 0); } #ifdef SQLITE_TEST if( SQLITE_OK==rc ){ @@ -140516,6 +161688,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitHashTable( ** * The FTS3 module is being built into the core of ** SQLite (in which case SQLITE_ENABLE_FTS3 is defined). */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <assert.h> */ @@ -140523,6 +161696,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitHashTable( /* #include <stdio.h> */ /* #include <string.h> */ +/* #include "fts3_tokenizer.h" */ typedef struct simple_tokenizer { sqlite3_tokenizer base; @@ -140767,6 +161941,7 @@ SQLITE_PRIVATE void sqlite3Fts3SimpleTokenizerModule( ** pos: Token offset of token within input. ** */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <string.h> */ @@ -140813,7 +161988,7 @@ static int fts3tokQueryTokenizer( p = (sqlite3_tokenizer_module *)sqlite3Fts3HashFind(pHash, zName, nName+1); if( !p ){ - *pzErr = sqlite3_mprintf("unknown tokenizer: %s", zName); + sqlite3Fts3ErrMsg(pzErr, "unknown tokenizer: %s", zName); return SQLITE_ERROR; } @@ -141202,6 +162377,7 @@ SQLITE_PRIVATE int sqlite3Fts3InitTok(sqlite3 *db, Fts3Hash *pHash){ ** code in fts3.c. */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <string.h> */ @@ -141510,14 +162686,15 @@ static int fts3SqlStmt( /* 25 */ "", /* 26 */ "DELETE FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?", -/* 27 */ "SELECT DISTINCT level / (1024 * ?) FROM %Q.'%q_segdir'", +/* 27 */ "SELECT ? UNION SELECT level / (1024 * ?) FROM %Q.'%q_segdir'", /* This statement is used to determine which level to read the input from ** when performing an incremental merge. It returns the absolute level number ** of the oldest level in the db that contains at least ? segments. Or, ** if no level in the FTS index contains more than ? segments, the statement ** returns zero rows. */ -/* 28 */ "SELECT level FROM %Q.'%q_segdir' GROUP BY level HAVING count(*)>=?" +/* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' " + " GROUP BY level HAVING cnt>=?" " ORDER BY (level %% 1024) ASC LIMIT 1", /* Estimate the upper limit on the number of leaf nodes in a new segment @@ -141590,7 +162767,8 @@ static int fts3SqlStmt( if( !zSql ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, NULL); + rc = sqlite3_prepare_v3(p->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, + &pStmt, NULL); sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); p->aStmt[eStmt] = pStmt; @@ -142044,10 +163222,12 @@ static int fts3PendingTermsAdd( */ static int fts3PendingTermsDocid( Fts3Table *p, /* Full-text table handle */ + int bDelete, /* True if this op is a delete */ int iLangid, /* Language id of row being written */ sqlite_int64 iDocid /* Docid of row being written */ ){ assert( iLangid>=0 ); + assert( bDelete==1 || bDelete==0 ); /* TODO(shess) Explore whether partially flushing the buffer on ** forced-flush would provide better performance. I suspect that if @@ -142055,7 +163235,8 @@ static int fts3PendingTermsDocid( ** buffer was half empty, that would let the less frequent terms ** generate longer doclists. */ - if( iDocid<=p->iPrevDocid + if( iDocid<p->iPrevDocid + || (iDocid==p->iPrevDocid && p->bPrevDelete==0) || p->iPrevLangid!=iLangid || p->nPendingData>p->nMaxPendingData ){ @@ -142064,6 +163245,7 @@ static int fts3PendingTermsDocid( } p->iPrevDocid = iDocid; p->iPrevLangid = iLangid; + p->bPrevDelete = bDelete; return SQLITE_OK; } @@ -142253,7 +163435,8 @@ static void fts3DeleteTerms( if( SQLITE_ROW==sqlite3_step(pSelect) ){ int i; int iLangid = langidFromSelect(p, pSelect); - rc = fts3PendingTermsDocid(p, iLangid, sqlite3_column_int64(pSelect, 0)); + i64 iDocid = sqlite3_column_int64(pSelect, 0); + rc = fts3PendingTermsDocid(p, 1, iLangid, iDocid); for(i=1; rc==SQLITE_OK && i<=p->nColumn; i++){ int iCol = i-1; if( p->abNotindexed[iCol]==0 ){ @@ -142501,14 +163684,19 @@ static int fts3SegReaderNext( if( fts3SegReaderIsPending(pReader) ){ Fts3HashElem *pElem = *(pReader->ppNextElem); - if( pElem==0 ){ - pReader->aNode = 0; - }else{ + sqlite3_free(pReader->aNode); + pReader->aNode = 0; + if( pElem ){ + char *aCopy; PendingList *pList = (PendingList *)fts3HashData(pElem); + int nCopy = pList->nData+1; pReader->zTerm = (char *)fts3HashKey(pElem); pReader->nTerm = fts3HashKeysize(pElem); - pReader->nNode = pReader->nDoclist = pList->nData + 1; - pReader->aNode = pReader->aDoclist = pList->aData; + aCopy = (char*)sqlite3_malloc(nCopy); + if( !aCopy ) return SQLITE_NOMEM; + memcpy(aCopy, pList->aData, nCopy); + pReader->nNode = pReader->nDoclist = nCopy; + pReader->aNode = pReader->aDoclist = aCopy; pReader->ppNextElem++; assert( pReader->aNode ); } @@ -142748,12 +163936,14 @@ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl( ** second argument. */ SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ - if( pReader && !fts3SegReaderIsPending(pReader) ){ - sqlite3_free(pReader->zTerm); + if( pReader ){ + if( !fts3SegReaderIsPending(pReader) ){ + sqlite3_free(pReader->zTerm); + } if( !fts3SegReaderIsRootOnly(pReader) ){ sqlite3_free(pReader->aNode); - sqlite3_blob_close(pReader->pBlob); } + sqlite3_blob_close(pReader->pBlob); } sqlite3_free(pReader); } @@ -142809,7 +163999,10 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( ** an array of pending terms by term. This occurs as part of flushing ** the contents of the pending-terms hash table to the database. */ -static int fts3CompareElemByTerm(const void *lhs, const void *rhs){ +static int SQLITE_CDECL fts3CompareElemByTerm( + const void *lhs, + const void *rhs +){ char *z1 = fts3HashKey(*(Fts3HashElem **)lhs); char *z2 = fts3HashKey(*(Fts3HashElem **)rhs); int n1 = fts3HashKeysize(*(Fts3HashElem **)lhs); @@ -143075,6 +164268,7 @@ static int fts3WriteSegment( sqlite3_bind_blob(pStmt, 2, z, n, SQLITE_STATIC); sqlite3_step(pStmt); rc = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 2); } return rc; } @@ -143131,6 +164325,7 @@ static int fts3WriteSegdir( sqlite3_bind_blob(pStmt, 6, zRoot, nRoot, SQLITE_STATIC); sqlite3_step(pStmt); rc = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 6); } return rc; } @@ -144363,7 +165558,7 @@ static int fts3SegmentMerge( ** segment. The level of the new segment is equal to the numerically ** greatest segment level currently present in the database for this ** index. The idx of the new segment is always 0. */ - if( csr.nSegment==1 ){ + if( csr.nSegment==1 && 0==fts3SegReaderIsPending(csr.apSegment[0]) ){ rc = SQLITE_DONE; goto finished; } @@ -144610,6 +165805,7 @@ static void fts3UpdateDocTotals( sqlite3_bind_blob(pStmt, 2, pBlob, nBlob, SQLITE_STATIC); sqlite3_step(pStmt); *pRC = sqlite3_reset(pStmt); + sqlite3_bind_null(pStmt, 2); sqlite3_free(a); } @@ -144625,7 +165821,8 @@ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); if( rc==SQLITE_OK ){ int rc2; - sqlite3_bind_int(pAllLangid, 1, p->nIndex); + sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); while( sqlite3_step(pAllLangid)==SQLITE_ROW ){ int i; int iLangid = sqlite3_column_int(pAllLangid, 0); @@ -144692,7 +165889,7 @@ static int fts3DoRebuild(Fts3Table *p){ while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ int iCol; int iLangid = langidFromSelect(p, pStmt); - rc = fts3PendingTermsDocid(p, iLangid, sqlite3_column_int64(pStmt, 0)); + rc = fts3PendingTermsDocid(p, 0, iLangid, sqlite3_column_int64(pStmt, 0)); memset(aSz, 0, sizeof(aSz[0]) * (p->nColumn+1)); for(iCol=0; rc==SQLITE_OK && iCol<p->nColumn; iCol++){ if( p->abNotindexed[iCol]==0 ){ @@ -145797,6 +166994,7 @@ static int fts3TruncateSegment( sqlite3_bind_int(pChomp, 4, iIdx); sqlite3_step(pChomp); rc = sqlite3_reset(pChomp); + sqlite3_bind_null(pChomp, 2); } } @@ -145876,6 +167074,7 @@ static int fts3IncrmergeHintStore(Fts3Table *p, Blob *pHint){ sqlite3_bind_blob(pReplace, 2, pHint->a, pHint->n, SQLITE_STATIC); sqlite3_step(pReplace); rc = sqlite3_reset(pReplace); + sqlite3_bind_null(pReplace, 2); } return rc; @@ -145957,7 +167156,7 @@ static int fts3IncrmergeHintPop(Blob *pHint, i64 *piAbsLevel, int *pnInput){ pHint->n = i; i += sqlite3Fts3GetVarint(&pHint->a[i], piAbsLevel); i += fts3GetVarint32(&pHint->a[i], pnInput); - if( i!=nHint ) return SQLITE_CORRUPT_VTAB; + if( i!=nHint ) return FTS_CORRUPT_VTAB; return SQLITE_OK; } @@ -146004,10 +167203,11 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ ** set nSeg to -1. */ rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0); - sqlite3_bind_int(pFindLevel, 1, nMin); + sqlite3_bind_int(pFindLevel, 1, MAX(2, nMin)); if( sqlite3_step(pFindLevel)==SQLITE_ROW ){ iAbsLevel = sqlite3_column_int64(pFindLevel, 0); - nSeg = nMin; + nSeg = sqlite3_column_int(pFindLevel, 1); + assert( nSeg>=2 ); }else{ nSeg = -1; } @@ -146122,11 +167322,14 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ ** Convert the text beginning at *pz into an integer and return ** its value. Advance *pz to point to the first character past ** the integer. +** +** This function used for parameters to merge= and incrmerge= +** commands. */ static int fts3Getint(const char **pz){ const char *z = *pz; int i = 0; - while( (*z)>='0' && (*z)<='9' ) i = 10*i + *(z++) - '0'; + while( (*z)>='0' && (*z)<='9' && i<214748363 ) i = 10*i + *(z++) - '0'; *pz = z; return i; } @@ -146325,7 +167528,8 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); if( rc==SQLITE_OK ){ int rc2; - sqlite3_bind_int(pAllLangid, 1, p->nIndex); + sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); + sqlite3_bind_int(pAllLangid, 2, p->nIndex); while( rc==SQLITE_OK && sqlite3_step(pAllLangid)==SQLITE_ROW ){ int iLangid = sqlite3_column_int(pAllLangid, 0); int i; @@ -146338,7 +167542,6 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ } /* This block calculates the checksum according to the %_content table */ - rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); if( rc==SQLITE_OK ){ sqlite3_tokenizer_module const *pModule = p->pTokenizer->pModule; sqlite3_stmt *pStmt = 0; @@ -146435,7 +167638,7 @@ static int fts3DoIntegrityCheck( int rc; int bOk = 0; rc = fts3IntegrityCheck(p, &bOk); - if( rc==SQLITE_OK && bOk==0 ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_OK && bOk==0 ) rc = FTS_CORRUPT_VTAB; return rc; } @@ -146686,7 +167889,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( ){ Fts3Table *p = (Fts3Table *)pVtab; int rc = SQLITE_OK; /* Return Code */ - int isRemove = 0; /* True for an UPDATE or DELETE */ u32 *aSzIns = 0; /* Sizes of inserted documents */ u32 *aSzDel = 0; /* Sizes of deleted documents */ int nChng = 0; /* Net change in number of documents */ @@ -146784,7 +167986,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){ assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER ); rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel); - isRemove = 1; } /* If this is an INSERT or UPDATE operation, insert the new record. */ @@ -146796,8 +167997,8 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod( rc = FTS_CORRUPT_VTAB; } } - if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){ - rc = fts3PendingTermsDocid(p, iLangid, *pRowid); + if( rc==SQLITE_OK ){ + rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid); } if( rc==SQLITE_OK ){ assert( p->iPrevDocid==*pRowid ); @@ -146858,6 +168059,7 @@ SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ ****************************************************************************** */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <string.h> */ @@ -146873,6 +168075,8 @@ SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){ #define FTS3_MATCHINFO_LENGTH 'l' /* nCol values */ #define FTS3_MATCHINFO_LCS 's' /* nCol values */ #define FTS3_MATCHINFO_HITS 'x' /* 3*nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS 'y' /* nCol*nPhrase values */ +#define FTS3_MATCHINFO_LHITS_BM 'b' /* nCol*nPhrase values */ /* ** The default value for the second argument to matchinfo(). @@ -146934,9 +168138,22 @@ struct MatchInfo { int nCol; /* Number of columns in table */ int nPhrase; /* Number of matchable phrases in query */ sqlite3_int64 nDoc; /* Number of docs in database */ + char flag; u32 *aMatchinfo; /* Pre-allocated buffer */ }; +/* +** An instance of this structure is used to manage a pair of buffers, each +** (nElem * sizeof(u32)) bytes in size. See the MatchinfoBuffer code below +** for details. +*/ +struct MatchinfoBuffer { + u8 aRef[3]; + int nElem; + int bGlobal; /* Set if global data is loaded */ + char *zMatchinfo; + u32 aMatchinfo[1]; +}; /* @@ -146952,6 +168169,97 @@ struct StrBuffer { }; +/************************************************************************* +** Start of MatchinfoBuffer code. +*/ + +/* +** Allocate a two-slot MatchinfoBuffer object. +*/ +static MatchinfoBuffer *fts3MIBufferNew(int nElem, const char *zMatchinfo){ + MatchinfoBuffer *pRet; + int nByte = sizeof(u32) * (2*nElem + 1) + sizeof(MatchinfoBuffer); + int nStr = (int)strlen(zMatchinfo); + + pRet = sqlite3_malloc(nByte + nStr+1); + if( pRet ){ + memset(pRet, 0, nByte); + pRet->aMatchinfo[0] = (u8*)(&pRet->aMatchinfo[1]) - (u8*)pRet; + pRet->aMatchinfo[1+nElem] = pRet->aMatchinfo[0] + sizeof(u32)*(nElem+1); + pRet->nElem = nElem; + pRet->zMatchinfo = ((char*)pRet) + nByte; + memcpy(pRet->zMatchinfo, zMatchinfo, nStr+1); + pRet->aRef[0] = 1; + } + + return pRet; +} + +static void fts3MIBufferFree(void *p){ + MatchinfoBuffer *pBuf = (MatchinfoBuffer*)((u8*)p - ((u32*)p)[-1]); + + assert( (u32*)p==&pBuf->aMatchinfo[1] + || (u32*)p==&pBuf->aMatchinfo[pBuf->nElem+2] + ); + if( (u32*)p==&pBuf->aMatchinfo[1] ){ + pBuf->aRef[1] = 0; + }else{ + pBuf->aRef[2] = 0; + } + + if( pBuf->aRef[0]==0 && pBuf->aRef[1]==0 && pBuf->aRef[2]==0 ){ + sqlite3_free(pBuf); + } +} + +static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ + void (*xRet)(void*) = 0; + u32 *aOut = 0; + + if( p->aRef[1]==0 ){ + p->aRef[1] = 1; + aOut = &p->aMatchinfo[1]; + xRet = fts3MIBufferFree; + } + else if( p->aRef[2]==0 ){ + p->aRef[2] = 1; + aOut = &p->aMatchinfo[p->nElem+2]; + xRet = fts3MIBufferFree; + }else{ + aOut = (u32*)sqlite3_malloc(p->nElem * sizeof(u32)); + if( aOut ){ + xRet = sqlite3_free; + if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); + } + } + + *paOut = aOut; + return xRet; +} + +static void fts3MIBufferSetGlobal(MatchinfoBuffer *p){ + p->bGlobal = 1; + memcpy(&p->aMatchinfo[2+p->nElem], &p->aMatchinfo[1], p->nElem*sizeof(u32)); +} + +/* +** Free a MatchinfoBuffer object allocated using fts3MIBufferNew() +*/ +SQLITE_PRIVATE void sqlite3Fts3MIBufferFree(MatchinfoBuffer *p){ + if( p ){ + assert( p->aRef[0]==1 ); + p->aRef[0] = 0; + if( p->aRef[0]==0 && p->aRef[1]==0 && p->aRef[2]==0 ){ + sqlite3_free(p); + } + } +} + +/* +** End of MatchinfoBuffer code. +*************************************************************************/ + + /* ** This function is used to help iterate through a position-list. A position ** list is a list of unique integers, sorted from smallest to largest. Each @@ -146988,7 +168296,7 @@ static int fts3ExprIterate2( void *pCtx /* Second argument to pass to callback */ ){ int rc; /* Return code */ - int eType = pExpr->eType; /* Type of expression node pExpr */ + int eType = pExpr->eType; /* Type of expression node pExpr */ if( eType!=FTSQUERY_PHRASE ){ assert( pExpr->pLeft && pExpr->pRight ); @@ -147022,6 +168330,7 @@ static int fts3ExprIterate( return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx); } + /* ** This is an fts3ExprIterate() callback used while loading the doclists ** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also @@ -147066,8 +168375,7 @@ static int fts3ExprLoadDoclists( static int fts3ExprPhraseCountCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ (*(int *)ctx)++; - UNUSED_PARAMETER(pExpr); - UNUSED_PARAMETER(iPhrase); + pExpr->iPhrase = iPhrase; return SQLITE_OK; } static int fts3ExprPhraseCount(Fts3Expr *pExpr){ @@ -147288,37 +168596,39 @@ static int fts3BestSnippet( sIter.nSnippet = nSnippet; sIter.nPhrase = nList; sIter.iCurrent = -1; - (void)fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void *)&sIter); + rc = fts3ExprIterate(pCsr->pExpr, fts3SnippetFindPositions, (void*)&sIter); + if( rc==SQLITE_OK ){ - /* Set the *pmSeen output variable. */ - for(i=0; i<nList; i++){ - if( sIter.aPhrase[i].pHead ){ - *pmSeen |= (u64)1 << i; + /* Set the *pmSeen output variable. */ + for(i=0; i<nList; i++){ + if( sIter.aPhrase[i].pHead ){ + *pmSeen |= (u64)1 << i; + } } - } - /* Loop through all candidate snippets. Store the best snippet in - ** *pFragment. Store its associated 'score' in iBestScore. - */ - pFragment->iCol = iCol; - while( !fts3SnippetNextCandidate(&sIter) ){ - int iPos; - int iScore; - u64 mCover; - u64 mHighlight; - fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover, &mHighlight); - assert( iScore>=0 ); - if( iScore>iBestScore ){ - pFragment->iPos = iPos; - pFragment->hlmask = mHighlight; - pFragment->covered = mCover; - iBestScore = iScore; + /* Loop through all candidate snippets. Store the best snippet in + ** *pFragment. Store its associated 'score' in iBestScore. + */ + pFragment->iCol = iCol; + while( !fts3SnippetNextCandidate(&sIter) ){ + int iPos; + int iScore; + u64 mCover; + u64 mHighlite; + fts3SnippetDetails(&sIter, mCovered, &iPos, &iScore, &mCover,&mHighlite); + assert( iScore>=0 ); + if( iScore>iBestScore ){ + pFragment->iPos = iPos; + pFragment->hlmask = mHighlite; + pFragment->covered = mCover; + iBestScore = iScore; + } } - } + *piScore = iBestScore; + } sqlite3_free(sIter.aPhrase); - *piScore = iBestScore; - return SQLITE_OK; + return rc; } @@ -147526,8 +168836,12 @@ static int fts3SnippetText( ** required. They are required if (a) this is not the first fragment, ** or (b) this fragment does not begin at position 0 of its column. */ - if( rc==SQLITE_OK && (iPos>0 || iFragment>0) ){ - rc = fts3StringAppend(pOut, zEllipsis, -1); + if( rc==SQLITE_OK ){ + if( iPos>0 || iFragment>0 ){ + rc = fts3StringAppend(pOut, zEllipsis, -1); + }else if( iBegin ){ + rc = fts3StringAppend(pOut, zDoc, iBegin); + } } if( rc!=SQLITE_OK || iCurrent<iPos ) continue; } @@ -147583,6 +168897,60 @@ static int fts3ColumnlistCount(char **ppCollist){ return nEntry; } +/* +** This function gathers 'y' or 'b' data for a single phrase. +*/ +static void fts3ExprLHits( + Fts3Expr *pExpr, /* Phrase expression node */ + MatchInfo *p /* Matchinfo context */ +){ + Fts3Table *pTab = (Fts3Table *)p->pCursor->base.pVtab; + int iStart; + Fts3Phrase *pPhrase = pExpr->pPhrase; + char *pIter = pPhrase->doclist.pList; + int iCol = 0; + + assert( p->flag==FTS3_MATCHINFO_LHITS_BM || p->flag==FTS3_MATCHINFO_LHITS ); + if( p->flag==FTS3_MATCHINFO_LHITS ){ + iStart = pExpr->iPhrase * p->nCol; + }else{ + iStart = pExpr->iPhrase * ((p->nCol + 31) / 32); + } + + while( 1 ){ + int nHit = fts3ColumnlistCount(&pIter); + if( (pPhrase->iColumn>=pTab->nColumn || pPhrase->iColumn==iCol) ){ + if( p->flag==FTS3_MATCHINFO_LHITS ){ + p->aMatchinfo[iStart + iCol] = (u32)nHit; + }else if( nHit ){ + p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F)); + } + } + assert( *pIter==0x00 || *pIter==0x01 ); + if( *pIter!=0x01 ) break; + pIter++; + pIter += fts3GetVarint32(pIter, &iCol); + } +} + +/* +** Gather the results for matchinfo directives 'y' and 'b'. +*/ +static void fts3ExprLHitGather( + Fts3Expr *pExpr, + MatchInfo *p +){ + assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); + if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ + if( pExpr->pLeft ){ + fts3ExprLHitGather(pExpr->pLeft, p); + fts3ExprLHitGather(pExpr->pRight, p); + }else{ + fts3ExprLHits(pExpr, p); + } + } +} + /* ** fts3ExprIterate() callback used to collect the "global" matchinfo stats ** for a single query. @@ -147661,10 +169029,12 @@ static int fts3MatchinfoCheck( || (cArg==FTS3_MATCHINFO_LENGTH && pTab->bHasDocsize) || (cArg==FTS3_MATCHINFO_LCS) || (cArg==FTS3_MATCHINFO_HITS) + || (cArg==FTS3_MATCHINFO_LHITS) + || (cArg==FTS3_MATCHINFO_LHITS_BM) ){ return SQLITE_OK; } - *pzErr = sqlite3_mprintf("unrecognized matchinfo request: %c", cArg); + sqlite3Fts3ErrMsg(pzErr, "unrecognized matchinfo request: %c", cArg); return SQLITE_ERROR; } @@ -147684,6 +169054,14 @@ static int fts3MatchinfoSize(MatchInfo *pInfo, char cArg){ nVal = pInfo->nCol; break; + case FTS3_MATCHINFO_LHITS: + nVal = pInfo->nCol * pInfo->nPhrase; + break; + + case FTS3_MATCHINFO_LHITS_BM: + nVal = pInfo->nPhrase * ((pInfo->nCol + 31) / 32); + break; + default: assert( cArg==FTS3_MATCHINFO_HITS ); nVal = pInfo->nCol * pInfo->nPhrase * 3; @@ -147878,7 +169256,7 @@ static int fts3MatchinfoValues( sqlite3_stmt *pSelect = 0; for(i=0; rc==SQLITE_OK && zArg[i]; i++){ - + pInfo->flag = zArg[i]; switch( zArg[i] ){ case FTS3_MATCHINFO_NPHRASE: if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nPhrase; @@ -147938,6 +169316,14 @@ static int fts3MatchinfoValues( } break; + case FTS3_MATCHINFO_LHITS_BM: + case FTS3_MATCHINFO_LHITS: { + int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); + memset(pInfo->aMatchinfo, 0, nZero); + fts3ExprLHitGather(pCsr->pExpr, pInfo); + break; + } + default: { Fts3Expr *pExpr; assert( zArg[i]==FTS3_MATCHINFO_HITS ); @@ -147950,6 +169336,7 @@ static int fts3MatchinfoValues( if( rc!=SQLITE_OK ) break; } rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo); + sqlite3Fts3EvalTestDeferred(pCsr, &rc); if( rc!=SQLITE_OK ) break; } (void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo); @@ -147969,7 +169356,8 @@ static int fts3MatchinfoValues( ** Populate pCsr->aMatchinfo[] with data for the current row. The ** 'matchinfo' data is an array of 32-bit unsigned integers (C type u32). */ -static int fts3GetMatchinfo( +static void fts3GetMatchinfo( + sqlite3_context *pCtx, /* Return results here */ Fts3Cursor *pCsr, /* FTS3 Cursor object */ const char *zArg /* Second argument to matchinfo() function */ ){ @@ -147978,6 +169366,9 @@ static int fts3GetMatchinfo( int rc = SQLITE_OK; int bGlobal = 0; /* Collect 'global' stats as well as local */ + u32 *aOut = 0; + void (*xDestroyOut)(void*) = 0; + memset(&sInfo, 0, sizeof(MatchInfo)); sInfo.pCursor = pCsr; sInfo.nCol = pTab->nColumn; @@ -147985,21 +169376,18 @@ static int fts3GetMatchinfo( /* If there is cached matchinfo() data, but the format string for the ** cache does not match the format string for this request, discard ** the cached data. */ - if( pCsr->zMatchinfo && strcmp(pCsr->zMatchinfo, zArg) ){ - assert( pCsr->aMatchinfo ); - sqlite3_free(pCsr->aMatchinfo); - pCsr->zMatchinfo = 0; - pCsr->aMatchinfo = 0; + if( pCsr->pMIBuffer && strcmp(pCsr->pMIBuffer->zMatchinfo, zArg) ){ + sqlite3Fts3MIBufferFree(pCsr->pMIBuffer); + pCsr->pMIBuffer = 0; } - /* If Fts3Cursor.aMatchinfo[] is NULL, then this is the first time the + /* If Fts3Cursor.pMIBuffer is NULL, then this is the first time the ** matchinfo function has been called for this query. In this case ** allocate the array used to accumulate the matchinfo data and ** initialize those elements that are constant for every row. */ - if( pCsr->aMatchinfo==0 ){ + if( pCsr->pMIBuffer==0 ){ int nMatchinfo = 0; /* Number of u32 elements in match-info */ - int nArg; /* Bytes in zArg */ int i; /* Used to iterate through zArg */ /* Determine the number of phrases in the query */ @@ -148008,30 +169396,46 @@ static int fts3GetMatchinfo( /* Determine the number of integers in the buffer returned by this call. */ for(i=0; zArg[i]; i++){ + char *zErr = 0; + if( fts3MatchinfoCheck(pTab, zArg[i], &zErr) ){ + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); + return; + } nMatchinfo += fts3MatchinfoSize(&sInfo, zArg[i]); } /* Allocate space for Fts3Cursor.aMatchinfo[] and Fts3Cursor.zMatchinfo. */ - nArg = (int)strlen(zArg); - pCsr->aMatchinfo = (u32 *)sqlite3_malloc(sizeof(u32)*nMatchinfo + nArg + 1); - if( !pCsr->aMatchinfo ) return SQLITE_NOMEM; + pCsr->pMIBuffer = fts3MIBufferNew(nMatchinfo, zArg); + if( !pCsr->pMIBuffer ) rc = SQLITE_NOMEM; - pCsr->zMatchinfo = (char *)&pCsr->aMatchinfo[nMatchinfo]; - pCsr->nMatchinfo = nMatchinfo; - memcpy(pCsr->zMatchinfo, zArg, nArg+1); - memset(pCsr->aMatchinfo, 0, sizeof(u32)*nMatchinfo); pCsr->isMatchinfoNeeded = 1; bGlobal = 1; } - sInfo.aMatchinfo = pCsr->aMatchinfo; - sInfo.nPhrase = pCsr->nPhrase; - if( pCsr->isMatchinfoNeeded ){ - rc = fts3MatchinfoValues(pCsr, bGlobal, &sInfo, zArg); - pCsr->isMatchinfoNeeded = 0; + if( rc==SQLITE_OK ){ + xDestroyOut = fts3MIBufferAlloc(pCsr->pMIBuffer, &aOut); + if( xDestroyOut==0 ){ + rc = SQLITE_NOMEM; + } } - return rc; + if( rc==SQLITE_OK ){ + sInfo.aMatchinfo = aOut; + sInfo.nPhrase = pCsr->nPhrase; + rc = fts3MatchinfoValues(pCsr, bGlobal, &sInfo, zArg); + if( bGlobal ){ + fts3MIBufferSetGlobal(pCsr->pMIBuffer); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + if( xDestroyOut ) xDestroyOut(aOut); + }else{ + int n = pCsr->pMIBuffer->nElem * sizeof(u32); + sqlite3_result_blob(pCtx, aOut, n, xDestroyOut); + } } /* @@ -148093,7 +169497,7 @@ SQLITE_PRIVATE void sqlite3Fts3Snippet( */ for(iRead=0; iRead<pTab->nColumn; iRead++){ SnippetFragment sF = {0, 0, 0, 0}; - int iS; + int iS = 0; if( iCol>=0 && iRead!=iCol ) continue; /* Find the best snippet of nFToken tokens in column iRead. */ @@ -148237,7 +169641,7 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( */ sCtx.iCol = iCol; sCtx.iTerm = 0; - (void)fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void *)&sCtx); + (void)fts3ExprIterate(pCsr->pExpr, fts3ExprTermOffsetInit, (void*)&sCtx); /* Retreive the text stored in column iCol. If an SQL NULL is stored ** in column iCol, jump immediately to the next iteration of the loop. @@ -148329,19 +169733,9 @@ SQLITE_PRIVATE void sqlite3Fts3Matchinfo( const char *zArg /* Second arg to matchinfo() function */ ){ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab; - int rc; - int i; const char *zFormat; if( zArg ){ - for(i=0; zArg[i]; i++){ - char *zErr = 0; - if( fts3MatchinfoCheck(pTab, zArg[i], &zErr) ){ - sqlite3_result_error(pContext, zErr, -1); - sqlite3_free(zErr); - return; - } - } zFormat = zArg; }else{ zFormat = FTS3_MATCHINFO_DEFAULT; @@ -148350,17 +169744,10 @@ SQLITE_PRIVATE void sqlite3Fts3Matchinfo( if( !pCsr->pExpr ){ sqlite3_result_blob(pContext, "", 0, SQLITE_STATIC); return; - } - - /* Retrieve matchinfo() data. */ - rc = fts3GetMatchinfo(pCsr, zFormat); - sqlite3Fts3SegmentsClose(pTab); - - if( rc!=SQLITE_OK ){ - sqlite3_result_error_code(pContext, rc); }else{ - int n = pCsr->nMatchinfo * sizeof(u32); - sqlite3_result_blob(pContext, pCsr->aMatchinfo, n, SQLITE_TRANSIENT); + /* Retrieve matchinfo() data. */ + fts3GetMatchinfo(pContext, pCsr, zFormat); + sqlite3Fts3SegmentsClose(pTab); } } @@ -148385,6 +169772,7 @@ SQLITE_PRIVATE void sqlite3Fts3Matchinfo( #ifndef SQLITE_DISABLE_FTS3_UNICODE +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) /* #include <assert.h> */ @@ -148392,6 +169780,7 @@ SQLITE_PRIVATE void sqlite3Fts3Matchinfo( /* #include <stdio.h> */ /* #include <string.h> */ +/* #include "fts3_tokenizer.h" */ /* ** The following two macros - READ_UTF8 and WRITE_UTF8 - have been copied @@ -148504,16 +169893,16 @@ static int unicodeAddExceptions( ){ const unsigned char *z = (const unsigned char *)zIn; const unsigned char *zTerm = &z[nIn]; - int iCode; + unsigned int iCode; int nEntry = 0; assert( bAlnum==0 || bAlnum==1 ); while( z<zTerm ){ READ_UTF8(z, zTerm, iCode); - assert( (sqlite3FtsUnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 ); - if( sqlite3FtsUnicodeIsalnum(iCode)!=bAlnum - && sqlite3FtsUnicodeIsdiacritic(iCode)==0 + assert( (sqlite3FtsUnicodeIsalnum((int)iCode) & 0xFFFFFFFE)==0 ); + if( sqlite3FtsUnicodeIsalnum((int)iCode)!=bAlnum + && sqlite3FtsUnicodeIsdiacritic((int)iCode)==0 ){ nEntry++; } @@ -148530,13 +169919,13 @@ static int unicodeAddExceptions( z = (const unsigned char *)zIn; while( z<zTerm ){ READ_UTF8(z, zTerm, iCode); - if( sqlite3FtsUnicodeIsalnum(iCode)!=bAlnum - && sqlite3FtsUnicodeIsdiacritic(iCode)==0 + if( sqlite3FtsUnicodeIsalnum((int)iCode)!=bAlnum + && sqlite3FtsUnicodeIsdiacritic((int)iCode)==0 ){ int i, j; - for(i=0; i<nNew && aNew[i]<iCode; i++); + for(i=0; i<nNew && aNew[i]<(int)iCode; i++); for(j=nNew; j>i; j--) aNew[j] = aNew[j-1]; - aNew[i] = iCode; + aNew[i] = (int)iCode; nNew++; } } @@ -148686,7 +170075,7 @@ static int unicodeNext( ){ unicode_cursor *pCsr = (unicode_cursor *)pC; unicode_tokenizer *p = ((unicode_tokenizer *)pCsr->base.pTokenizer); - int iCode = 0; + unsigned int iCode = 0; char *zOut; const unsigned char *z = &pCsr->aInput[pCsr->iOff]; const unsigned char *zStart = z; @@ -148698,7 +170087,7 @@ static int unicodeNext( ** the input. */ while( z<zTerm ){ READ_UTF8(z, zTerm, iCode); - if( unicodeIsAlnum(p, iCode) ) break; + if( unicodeIsAlnum(p, (int)iCode) ) break; zStart = z; } if( zStart>=zTerm ) return SQLITE_DONE; @@ -148718,7 +170107,7 @@ static int unicodeNext( /* Write the folded case of the last character read to the output */ zEnd = z; - iOut = sqlite3FtsUnicodeFold(iCode, p->bRemoveDiacritic); + iOut = sqlite3FtsUnicodeFold((int)iCode, p->bRemoveDiacritic); if( iOut ){ WRITE_UTF8(zOut, iOut); } @@ -148726,8 +170115,8 @@ static int unicodeNext( /* If the cursor is not at EOF, read the next character */ if( z>=zTerm ) break; READ_UTF8(z, zTerm, iCode); - }while( unicodeIsAlnum(p, iCode) - || sqlite3FtsUnicodeIsdiacritic(iCode) + }while( unicodeIsAlnum(p, (int)iCode) + || sqlite3FtsUnicodeIsdiacritic((int)iCode) ); /* Set the output variables and return. */ @@ -148891,9 +170280,9 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeIsalnum(int c){ 0xFFFFFFFF, 0xFC00FFFF, 0xF8000001, 0xF8000001, }; - if( c<128 ){ - return ( (aAscii[c >> 5] & (1 << (c & 0x001F)))==0 ); - }else if( c<(1<<22) ){ + if( (unsigned int)c<128 ){ + return ( (aAscii[c >> 5] & ((unsigned int)1 << (c & 0x001F)))==0 ); + }else if( (unsigned int)c<(1<<22) ){ unsigned int key = (((unsigned int)c)<<10) | 0x000003FF; int iRes = 0; int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; @@ -149086,16 +170475,17 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ int ret = c; - assert( c>=0 ); assert( sizeof(unsigned short)==2 && sizeof(unsigned char)==1 ); if( c<128 ){ if( c>='A' && c<='Z' ) ret = c + ('a' - 'A'); }else if( c<65536 ){ + const struct TableEntry *p; int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; int iLo = 0; int iRes = -1; + assert( c>aEntry[0].iCode ); while( iHi>=iLo ){ int iTest = (iHi + iLo) / 2; int cmp = (c - aEntry[iTest].iCode); @@ -149106,14 +170496,12 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ iHi = iTest-1; } } - assert( iRes<0 || c>=aEntry[iRes].iCode ); - if( iRes>=0 ){ - const struct TableEntry *p = &aEntry[iRes]; - if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){ - ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF; - assert( ret>0 ); - } + assert( iRes>=0 && c>=aEntry[iRes].iCode ); + p = &aEntry[iRes]; + if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){ + ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF; + assert( ret>0 ); } if( bRemoveDiacritic ) ret = remove_diacritic(ret); @@ -149156,14 +170544,15 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ ** ** CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data BLOB) ** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) -** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER) +** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...) ** ** The data for each node of the r-tree structure is stored in the %_node ** table. For each node that is not the root node of the r-tree, there is ** an entry in the %_parent table associating the node with its parent. ** And for each row of data in the table, there is an entry in the %_rowid ** table that maps from the entries rowid to the id of the node that it -** is stored on. +** is stored on. If the r-tree contains auxiliary columns, those are stored +** on the end of the %_rowid table. ** ** The root node of an r-tree always exists, even if the r-tree table is ** empty. The nodeno of the root node is always 1. All other nodes in the @@ -149184,11 +170573,14 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ ** child page. */ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RTREE) +#if !defined(SQLITE_CORE) \ + || (defined(SQLITE_ENABLE_RTREE) && !defined(SQLITE_OMIT_VIRTUALTABLE)) #ifndef SQLITE_CORE +/* #include "sqlite3ext.h" */ SQLITE_EXTENSION_INIT1 #else +/* #include "sqlite3.h" */ #endif /* #include <string.h> */ @@ -149198,6 +170590,7 @@ SQLITE_PRIVATE int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ #ifndef SQLITE_AMALGAMATION #include "sqlite3rtree.h" typedef sqlite3_int64 i64; +typedef sqlite3_uint64 u64; typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; @@ -149222,6 +170615,9 @@ typedef struct RtreeSearchPoint RtreeSearchPoint; /* The rtree may have between 1 and RTREE_MAX_DIMENSIONS dimensions. */ #define RTREE_MAX_DIMENSIONS 5 +/* Maximum number of auxiliary columns */ +#define RTREE_MAX_AUX_COLUMN 100 + /* Size of hash table Rtree.aHash. This hash table is not expected to ** ever contain very many entries, so a fixed number of buckets is ** used. @@ -149246,13 +170642,19 @@ struct Rtree { sqlite3 *db; /* Host database connection */ int iNodeSize; /* Size in bytes of each node in the node table */ u8 nDim; /* Number of dimensions */ + u8 nDim2; /* Twice the number of dimensions */ u8 eCoordType; /* RTREE_COORD_REAL32 or RTREE_COORD_INT32 */ u8 nBytesPerCell; /* Bytes consumed per cell */ + u8 inWrTrans; /* True if inside write transaction */ + u8 nAux; /* # of auxiliary columns in %_rowid */ int iDepth; /* Current depth of the r-tree structure */ char *zDb; /* Name of database containing r-tree table */ char *zName; /* Name of r-tree table */ - int nBusy; /* Current number of users of this structure */ + u32 nBusy; /* Current number of users of this structure */ i64 nRowEst; /* Estimated number of rows in this table */ + u32 nCursor; /* Number of open cursors */ + u32 nNodeRef; /* Number RtreeNodes with positive nRef */ + char *zReadAuxSql; /* SQL for statement to read aux data */ /* List of nodes removed during a CondenseTree operation. List is ** linked together via the pointer normally used for hash chains - @@ -149262,8 +170664,10 @@ struct Rtree { RtreeNode *pDeleted; int iReinsertHeight; /* Height of sub-trees Reinsert() has run on */ + /* Blob I/O on xxx_node */ + sqlite3_blob *pNodeBlob; + /* Statements to read/write/delete a record from xxx_node */ - sqlite3_stmt *pReadNode; sqlite3_stmt *pWriteNode; sqlite3_stmt *pDeleteNode; @@ -149277,6 +170681,9 @@ struct Rtree { sqlite3_stmt *pWriteParent; sqlite3_stmt *pDeleteParent; + /* Statement for writing to the "aux:" fields, if there are any */ + sqlite3_stmt *pWriteAux; + RtreeNode *aHash[HASHSIZE]; /* Hash table of in-memory nodes. */ }; @@ -149333,7 +170740,7 @@ struct RtreeSearchPoint { ** The smallest possible node-size is (512-64)==448 bytes. And the largest ** supported cell size is 48 bytes (8 byte rowid + ten 4 byte coordinates). ** Therefore all non-root nodes must contain at least 3 entries. Since -** 2^40 is greater than 2^64, an r-tree structure always has a depth of +** 3^40 is greater than 2^64, an r-tree structure always has a depth of ** 40 or less. */ #define RTREE_MAX_DEPTH 40 @@ -149353,6 +170760,7 @@ struct RtreeCursor { sqlite3_vtab_cursor base; /* Base class. Must be first */ u8 atEOF; /* True if at end of search */ u8 bPoint; /* True if sPoint is valid */ + u8 bAuxValid; /* True if pReadAux is valid */ int iStrategy; /* Copy of idxNum search parameter */ int nConstraint; /* Number of entries in aConstraint */ RtreeConstraint *aConstraint; /* Search constraints. */ @@ -149360,6 +170768,7 @@ struct RtreeCursor { int nPoint; /* Number of slots used in aPoint[] */ int mxLevel; /* iLevel value for root of the tree */ RtreeSearchPoint *aPoint; /* Priority queue for search points */ + sqlite3_stmt *pReadAux; /* Statement to read aux-data */ RtreeSearchPoint sPoint; /* Cached next search point */ RtreeNode *aNode[RTREE_CACHE_SZ]; /* Rtree node cache */ u32 anQueue[RTREE_MAX_DEPTH+1]; /* Number of queued entries by iLevel */ @@ -149463,14 +170872,6 @@ struct RtreeGeomCallback { void *pContext; }; - -/* -** Value for the first field of every RtreeMatchArg object. The MATCH -** operator tests that the first field of a blob operand matches this -** value to avoid operating on invalid blobs (which could cause a segfault). -*/ -#define RTREE_GEOMETRY_MAGIC 0x891245AB - /* ** An instance of this structure (in the form of a BLOB) is returned by ** the SQL functions that sqlite3_rtree_geometry_callback() and @@ -149478,9 +170879,10 @@ struct RtreeGeomCallback { ** operand to the MATCH operator of an R-Tree. */ struct RtreeMatchArg { - u32 magic; /* Always RTREE_GEOMETRY_MAGIC */ + u32 iSize; /* Size of this object */ RtreeGeomCallback cb; /* Info about the callback functions */ int nParam; /* Number of parameters to the SQL function */ + sqlite3_value **apSqlParam; /* Original SQL parameter values */ RtreeDValue aParam[1]; /* Values for parameters to the SQL function */ }; @@ -149491,6 +170893,58 @@ struct RtreeMatchArg { # define MIN(x,y) ((x) > (y) ? (y) : (x)) #endif +/* What version of GCC is being used. 0 means GCC is not being used . +** Note that the GCC_VERSION macro will also be set correctly when using +** clang, since clang works hard to be gcc compatible. So the gcc +** optimizations will also work when compiling with clang. +*/ +#ifndef GCC_VERSION +#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) +#else +# define GCC_VERSION 0 +#endif +#endif + +/* The testcase() macro should already be defined in the amalgamation. If +** it is not, make it a no-op. +*/ +#ifndef SQLITE_AMALGAMATION +# define testcase(X) +#endif + +/* +** Macros to determine whether the machine is big or little endian, +** and whether or not that determination is run-time or compile-time. +** +** For best performance, an attempt is made to guess at the byte-order +** using C-preprocessor macros. If that is unsuccessful, or if +** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined +** at run-time. +*/ +#ifndef SQLITE_BYTEORDER +#if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ + defined(__arm__) +# define SQLITE_BYTEORDER 1234 +#elif defined(sparc) || defined(__ppc__) +# define SQLITE_BYTEORDER 4321 +#else +# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ +#endif +#endif + + +/* What version of MSVC is being used. 0 means MSVC is not being used */ +#ifndef MSVC_VERSION +#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) +# define MSVC_VERSION _MSC_VER +#else +# define MSVC_VERSION 0 +#endif +#endif + /* ** Functions to deserialize a 16 bit integer, 32 bit real number and ** 64 bit integer. The deserialized value is returned. @@ -149499,24 +170953,47 @@ static int readInt16(u8 *p){ return (p[0]<<8) + p[1]; } static void readCoord(u8 *p, RtreeCoord *pCoord){ + assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */ +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + pCoord->u = _byteswap_ulong(*(u32*)p); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + pCoord->u = __builtin_bswap32(*(u32*)p); +#elif SQLITE_BYTEORDER==4321 + pCoord->u = *(u32*)p; +#else pCoord->u = ( (((u32)p[0]) << 24) + (((u32)p[1]) << 16) + (((u32)p[2]) << 8) + (((u32)p[3]) << 0) ); +#endif } static i64 readInt64(u8 *p){ - return ( - (((i64)p[0]) << 56) + - (((i64)p[1]) << 48) + - (((i64)p[2]) << 40) + - (((i64)p[3]) << 32) + - (((i64)p[4]) << 24) + - (((i64)p[5]) << 16) + - (((i64)p[6]) << 8) + - (((i64)p[7]) << 0) +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + u64 x; + memcpy(&x, p, 8); + return (i64)_byteswap_uint64(x); +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + u64 x; + memcpy(&x, p, 8); + return (i64)__builtin_bswap64(x); +#elif SQLITE_BYTEORDER==4321 + i64 x; + memcpy(&x, p, 8); + return x; +#else + return (i64)( + (((u64)p[0]) << 56) + + (((u64)p[1]) << 48) + + (((u64)p[2]) << 40) + + (((u64)p[3]) << 32) + + (((u64)p[4]) << 24) + + (((u64)p[5]) << 16) + + (((u64)p[6]) << 8) + + (((u64)p[7]) << 0) ); +#endif } /* @@ -149524,23 +171001,43 @@ static i64 readInt64(u8 *p){ ** 64 bit integer. The value returned is the number of bytes written ** to the argument buffer (always 2, 4 and 8 respectively). */ -static int writeInt16(u8 *p, int i){ +static void writeInt16(u8 *p, int i){ p[0] = (i>> 8)&0xFF; p[1] = (i>> 0)&0xFF; - return 2; } static int writeCoord(u8 *p, RtreeCoord *pCoord){ u32 i; + assert( ((((char*)p) - (char*)0)&3)==0 ); /* p is always 4-byte aligned */ assert( sizeof(RtreeCoord)==4 ); assert( sizeof(u32)==4 ); +#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + i = __builtin_bswap32(pCoord->u); + memcpy(p, &i, 4); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + i = _byteswap_ulong(pCoord->u); + memcpy(p, &i, 4); +#elif SQLITE_BYTEORDER==4321 + i = pCoord->u; + memcpy(p, &i, 4); +#else i = pCoord->u; p[0] = (i>>24)&0xFF; p[1] = (i>>16)&0xFF; p[2] = (i>> 8)&0xFF; p[3] = (i>> 0)&0xFF; +#endif return 4; } static int writeInt64(u8 *p, i64 i){ +#if SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 + i = (i64)__builtin_bswap64((u64)i); + memcpy(p, &i, 8); +#elif SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 + i = (i64)_byteswap_uint64((u64)i); + memcpy(p, &i, 8); +#elif SQLITE_BYTEORDER==4321 + memcpy(p, &i, 8); +#else p[0] = (i>>56)&0xFF; p[1] = (i>>48)&0xFF; p[2] = (i>>40)&0xFF; @@ -149549,6 +171046,7 @@ static int writeInt64(u8 *p, i64 i){ p[5] = (i>>16)&0xFF; p[6] = (i>> 8)&0xFF; p[7] = (i>> 0)&0xFF; +#endif return 8; } @@ -149557,6 +171055,7 @@ static int writeInt64(u8 *p, i64 i){ */ static void nodeReference(RtreeNode *p){ if( p ){ + assert( p->nRef>0 ); p->nRef++; } } @@ -149624,6 +171123,7 @@ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); pNode->zData = (u8 *)&pNode[1]; pNode->nRef = 1; + pRtree->nNodeRef++; pNode->pParent = pParent; pNode->isDirty = 1; nodeReference(pParent); @@ -149631,6 +171131,17 @@ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ return pNode; } +/* +** Clear the Rtree.pNodeBlob object +*/ +static void nodeBlobReset(Rtree *pRtree){ + if( pRtree->pNodeBlob && pRtree->inWrTrans==0 && pRtree->nCursor==0 ){ + sqlite3_blob *pBlob = pRtree->pNodeBlob; + pRtree->pNodeBlob = 0; + sqlite3_blob_close(pBlob); + } +} + /* ** Obtain a reference to an r-tree node. */ @@ -149640,17 +171151,16 @@ static int nodeAcquire( RtreeNode *pParent, /* Either the parent node or NULL */ RtreeNode **ppNode /* OUT: Acquired node */ ){ - int rc; - int rc2 = SQLITE_OK; - RtreeNode *pNode; + int rc = SQLITE_OK; + RtreeNode *pNode = 0; /* Check if the requested node is already in the hash table. If so, ** increase its reference count and return it. */ - if( (pNode = nodeHashLookup(pRtree, iNode)) ){ + if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); if( pParent && !pNode->pParent ){ - nodeReference(pParent); + pParent->nRef++; pNode->pParent = pParent; } pNode->nRef++; @@ -149658,28 +171168,46 @@ static int nodeAcquire( return SQLITE_OK; } - sqlite3_bind_int64(pRtree->pReadNode, 1, iNode); - rc = sqlite3_step(pRtree->pReadNode); - if( rc==SQLITE_ROW ){ - const u8 *zBlob = sqlite3_column_blob(pRtree->pReadNode, 0); - if( pRtree->iNodeSize==sqlite3_column_bytes(pRtree->pReadNode, 0) ){ - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); - if( !pNode ){ - rc2 = SQLITE_NOMEM; - }else{ - pNode->pParent = pParent; - pNode->zData = (u8 *)&pNode[1]; - pNode->nRef = 1; - pNode->iNode = iNode; - pNode->isDirty = 0; - pNode->pNext = 0; - memcpy(pNode->zData, zBlob, pRtree->iNodeSize); - nodeReference(pParent); - } + if( pRtree->pNodeBlob ){ + sqlite3_blob *pBlob = pRtree->pNodeBlob; + pRtree->pNodeBlob = 0; + rc = sqlite3_blob_reopen(pBlob, iNode); + pRtree->pNodeBlob = pBlob; + if( rc ){ + nodeBlobReset(pRtree); + if( rc==SQLITE_NOMEM ) return SQLITE_NOMEM; + } + } + if( pRtree->pNodeBlob==0 ){ + char *zTab = sqlite3_mprintf("%s_node", pRtree->zName); + if( zTab==0 ) return SQLITE_NOMEM; + rc = sqlite3_blob_open(pRtree->db, pRtree->zDb, zTab, "data", iNode, 0, + &pRtree->pNodeBlob); + sqlite3_free(zTab); + } + if( rc ){ + nodeBlobReset(pRtree); + *ppNode = 0; + /* If unable to open an sqlite3_blob on the desired row, that can only + ** be because the shadow tables hold erroneous data. */ + if( rc==SQLITE_ERROR ) rc = SQLITE_CORRUPT_VTAB; + }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ + pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); + if( !pNode ){ + rc = SQLITE_NOMEM; + }else{ + pNode->pParent = pParent; + pNode->zData = (u8 *)&pNode[1]; + pNode->nRef = 1; + pRtree->nNodeRef++; + pNode->iNode = iNode; + pNode->isDirty = 0; + pNode->pNext = 0; + rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, + pRtree->iNodeSize, 0); + nodeReference(pParent); } } - rc = sqlite3_reset(pRtree->pReadNode); - if( rc==SQLITE_OK ) rc = rc2; /* If the root node was just loaded, set pRtree->iDepth to the height ** of the r-tree structure. A height of zero means all data is stored on @@ -149712,7 +171240,10 @@ static int nodeAcquire( } *ppNode = pNode; }else{ - sqlite3_free(pNode); + if( pNode ){ + pRtree->nNodeRef--; + sqlite3_free(pNode); + } *ppNode = 0; } @@ -149731,7 +171262,7 @@ static void nodeOverwriteCell( int ii; u8 *p = &pNode->zData[4 + pRtree->nBytesPerCell*iCell]; p += writeInt64(p, pCell->iRowid); - for(ii=0; ii<(pRtree->nDim*2); ii++){ + for(ii=0; ii<pRtree->nDim2; ii++){ p += writeCoord(p, &pCell->aCoord[ii]); } pNode->isDirty = 1; @@ -149792,6 +171323,7 @@ static int nodeWrite(Rtree *pRtree, RtreeNode *pNode){ sqlite3_step(p); pNode->isDirty = 0; rc = sqlite3_reset(p); + sqlite3_bind_null(p, 2); if( pNode->iNode==0 && rc==SQLITE_OK ){ pNode->iNode = sqlite3_last_insert_rowid(pRtree->db); nodeHashInsert(pRtree, pNode); @@ -149808,8 +171340,10 @@ static int nodeRelease(Rtree *pRtree, RtreeNode *pNode){ int rc = SQLITE_OK; if( pNode ){ assert( pNode->nRef>0 ); + assert( pRtree->nNodeRef>0 ); pNode->nRef--; if( pNode->nRef==0 ){ + pRtree->nNodeRef--; if( pNode->iNode==1 ){ pRtree->iDepth = -1; } @@ -149865,13 +171399,16 @@ static void nodeGetCell( ){ u8 *pData; RtreeCoord *pCoord; - int ii; + int ii = 0; pCell->iRowid = nodeGetRowid(pRtree, pNode, iCell); pData = pNode->zData + (12 + pRtree->nBytesPerCell*iCell); pCoord = pCell->aCoord; - for(ii=0; ii<pRtree->nDim*2; ii++){ - readCoord(&pData[ii*4], &pCoord[ii]); - } + do{ + readCoord(pData, &pCoord[ii]); + readCoord(pData+4, &pCoord[ii+1]); + pData += 8; + ii += 2; + }while( ii<pRtree->nDim2 ); } @@ -149922,7 +171459,10 @@ static void rtreeReference(Rtree *pRtree){ static void rtreeRelease(Rtree *pRtree){ pRtree->nBusy--; if( pRtree->nBusy==0 ){ - sqlite3_finalize(pRtree->pReadNode); + pRtree->inWrTrans = 0; + assert( pRtree->nCursor==0 ); + nodeBlobReset(pRtree); + assert( pRtree->nNodeRef==0 ); sqlite3_finalize(pRtree->pWriteNode); sqlite3_finalize(pRtree->pDeleteNode); sqlite3_finalize(pRtree->pReadRowid); @@ -149931,6 +171471,8 @@ static void rtreeRelease(Rtree *pRtree){ sqlite3_finalize(pRtree->pReadParent); sqlite3_finalize(pRtree->pWriteParent); sqlite3_finalize(pRtree->pDeleteParent); + sqlite3_finalize(pRtree->pWriteAux); + sqlite3_free(pRtree->zReadAuxSql); sqlite3_free(pRtree); } } @@ -149960,6 +171502,7 @@ static int rtreeDestroy(sqlite3_vtab *pVtab){ if( !zCreate ){ rc = SQLITE_NOMEM; }else{ + nodeBlobReset(pRtree); rc = sqlite3_exec(pRtree->db, zCreate, 0, 0, 0); sqlite3_free(zCreate); } @@ -149975,6 +171518,7 @@ static int rtreeDestroy(sqlite3_vtab *pVtab){ */ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ int rc = SQLITE_NOMEM; + Rtree *pRtree = (Rtree *)pVTab; RtreeCursor *pCsr; pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor)); @@ -149982,6 +171526,7 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ memset(pCsr, 0, sizeof(RtreeCursor)); pCsr->base.pVtab = pVTab; rc = SQLITE_OK; + pRtree->nCursor++; } *ppCursor = (sqlite3_vtab_cursor *)pCsr; @@ -150014,10 +171559,14 @@ static int rtreeClose(sqlite3_vtab_cursor *cur){ Rtree *pRtree = (Rtree *)(cur->pVtab); int ii; RtreeCursor *pCsr = (RtreeCursor *)cur; + assert( pRtree->nCursor>0 ); freeCursorConstraints(pCsr); + sqlite3_finalize(pCsr->pReadAux); sqlite3_free(pCsr->aPoint); for(ii=0; ii<RTREE_CACHE_SZ; ii++) nodeRelease(pRtree, pCsr->aNode[ii]); sqlite3_free(pCsr); + pRtree->nCursor--; + nodeBlobReset(pRtree); return SQLITE_OK; } @@ -150040,15 +171589,22 @@ static int rtreeEof(sqlite3_vtab_cursor *cur){ ** false. a[] is the four bytes of the on-disk record to be decoded. ** Store the results in "r". ** -** There are three versions of this macro, one each for little-endian and -** big-endian processors and a third generic implementation. The endian- -** specific implementations are much faster and are preferred if the -** processor endianness is known at compile-time. The SQLITE_BYTEORDER -** macro is part of sqliteInt.h and hence the endian-specific -** implementation will only be used if this module is compiled as part -** of the amalgamation. +** There are five versions of this macro. The last one is generic. The +** other four are various architectures-specific optimizations. */ -#if defined(SQLITE_BYTEORDER) && SQLITE_BYTEORDER==1234 +#if SQLITE_BYTEORDER==1234 && MSVC_VERSION>=1300 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = _byteswap_ulong(*(u32*)a); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==1234 && GCC_VERSION>=4003000 +#define RTREE_DECODE_COORD(eInt, a, r) { \ + RtreeCoord c; /* Coordinate decoded */ \ + c.u = __builtin_bswap32(*(u32*)a); \ + r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ +} +#elif SQLITE_BYTEORDER==1234 #define RTREE_DECODE_COORD(eInt, a, r) { \ RtreeCoord c; /* Coordinate decoded */ \ memcpy(&c.u,a,4); \ @@ -150056,7 +171612,7 @@ static int rtreeEof(sqlite3_vtab_cursor *cur){ ((c.u&0xff)<<24)|((c.u&0xff00)<<8); \ r = eInt ? (sqlite3_rtree_dbl)c.i : (sqlite3_rtree_dbl)c.f; \ } -#elif defined(SQLITE_BYTEORDER) && SQLITE_BYTEORDER==4321 +#elif SQLITE_BYTEORDER==4321 #define RTREE_DECODE_COORD(eInt, a, r) { \ RtreeCoord c; /* Coordinate decoded */ \ memcpy(&c.u,a,4); \ @@ -150083,10 +171639,10 @@ static int rtreeCallbackConstraint( sqlite3_rtree_dbl *prScore, /* OUT: score for the cell */ int *peWithin /* OUT: visibility of the cell */ ){ - int i; /* Loop counter */ sqlite3_rtree_query_info *pInfo = pConstraint->pInfo; /* Callback info */ int nCoord = pInfo->nCoord; /* No. of coordinates */ int rc; /* Callback return code */ + RtreeCoord c; /* Translator union */ sqlite3_rtree_dbl aCoord[RTREE_MAX_DIMENSIONS*2]; /* Decoded coordinates */ assert( pConstraint->op==RTREE_MATCH || pConstraint->op==RTREE_QUERY ); @@ -150096,13 +171652,41 @@ static int rtreeCallbackConstraint( pInfo->iRowid = readInt64(pCellData); } pCellData += 8; - for(i=0; i<nCoord; i++, pCellData += 4){ - RTREE_DECODE_COORD(eInt, pCellData, aCoord[i]); +#ifndef SQLITE_RTREE_INT_ONLY + if( eInt==0 ){ + switch( nCoord ){ + case 10: readCoord(pCellData+36, &c); aCoord[9] = c.f; + readCoord(pCellData+32, &c); aCoord[8] = c.f; + case 8: readCoord(pCellData+28, &c); aCoord[7] = c.f; + readCoord(pCellData+24, &c); aCoord[6] = c.f; + case 6: readCoord(pCellData+20, &c); aCoord[5] = c.f; + readCoord(pCellData+16, &c); aCoord[4] = c.f; + case 4: readCoord(pCellData+12, &c); aCoord[3] = c.f; + readCoord(pCellData+8, &c); aCoord[2] = c.f; + default: readCoord(pCellData+4, &c); aCoord[1] = c.f; + readCoord(pCellData, &c); aCoord[0] = c.f; + } + }else +#endif + { + switch( nCoord ){ + case 10: readCoord(pCellData+36, &c); aCoord[9] = c.i; + readCoord(pCellData+32, &c); aCoord[8] = c.i; + case 8: readCoord(pCellData+28, &c); aCoord[7] = c.i; + readCoord(pCellData+24, &c); aCoord[6] = c.i; + case 6: readCoord(pCellData+20, &c); aCoord[5] = c.i; + readCoord(pCellData+16, &c); aCoord[4] = c.i; + case 4: readCoord(pCellData+12, &c); aCoord[3] = c.i; + readCoord(pCellData+8, &c); aCoord[2] = c.i; + default: readCoord(pCellData+4, &c); aCoord[1] = c.i; + readCoord(pCellData, &c); aCoord[0] = c.i; + } } if( pConstraint->op==RTREE_MATCH ){ + int eWithin = 0; rc = pConstraint->u.xGeom((sqlite3_rtree_geometry*)pInfo, - nCoord, aCoord, &i); - if( i==0 ) *peWithin = NOT_WITHIN; + nCoord, aCoord, &eWithin); + if( eWithin==0 ) *peWithin = NOT_WITHIN; *prScore = RTREE_ZERO; }else{ pInfo->aCoord = aCoord; @@ -150138,6 +171722,7 @@ static void rtreeNonleafConstraint( assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE || p->op==RTREE_GT || p->op==RTREE_EQ ); + assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ switch( p->op ){ case RTREE_LE: case RTREE_LT: @@ -150178,6 +171763,7 @@ static void rtreeLeafConstraint( assert(p->op==RTREE_LE || p->op==RTREE_LT || p->op==RTREE_GE || p->op==RTREE_GT || p->op==RTREE_EQ ); pCellData += 8 + p->iCoord*4; + assert( ((((char*)pCellData) - (char*)0)&3)==0 ); /* 4-byte aligned */ RTREE_DECODE_COORD(eInt, pCellData, xN); switch( p->op ){ case RTREE_LE: if( xN <= p->u.rValue ) return; break; @@ -150246,7 +171832,7 @@ static int rtreeSearchPointCompare( } /* -** Interchange to search points in a cursor. +** Interchange two search points in a cursor. */ static void rtreeSearchPointSwap(RtreeCursor *p, int i, int j){ RtreeSearchPoint t = p->aPoint[i]; @@ -150347,7 +171933,7 @@ static RtreeSearchPoint *rtreeSearchPointNew( if( ii<RTREE_CACHE_SZ ){ assert( pCur->aNode[ii]==0 ); pCur->aNode[ii] = pCur->aNode[0]; - }else{ + }else{ nodeRelease(RTREE_OF_CURSOR(pCur), pCur->aNode[0]); } pCur->aNode[0] = 0; @@ -150494,7 +172080,7 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ if( rScore<RTREE_ZERO ) rScore = RTREE_ZERO; p = rtreeSearchPointNew(pCur, rScore, x.iLevel); if( p==0 ) return SQLITE_NOMEM; - p->eWithin = eWithin; + p->eWithin = (u8)eWithin; p->id = x.id; p->iCell = x.iCell; RTREE_QUEUE_TRACE(pCur, "PUSH-S:"); @@ -150518,6 +172104,10 @@ static int rtreeNext(sqlite3_vtab_cursor *pVtabCursor){ /* Move to the next entry that matches the configured constraints. */ RTREE_QUEUE_TRACE(pCsr, "POP-Nx:"); + if( pCsr->bAuxValid ){ + pCsr->bAuxValid = 0; + sqlite3_reset(pCsr->pReadAux); + } rtreeSearchPointPop(pCsr); rc = rtreeStepToLeaf(pCsr); return rc; @@ -150552,8 +172142,7 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ if( p==0 ) return SQLITE_OK; if( i==0 ){ sqlite3_result_int64(ctx, nodeGetRowid(pRtree, pNode, p->iCell)); - }else{ - if( rc ) return rc; + }else if( i<=pRtree->nDim2 ){ nodeGetCoord(pRtree, pNode, p->iCell, i-1, &c); #ifndef SQLITE_RTREE_INT_ONLY if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ @@ -150564,7 +172153,27 @@ static int rtreeColumn(sqlite3_vtab_cursor *cur, sqlite3_context *ctx, int i){ assert( pRtree->eCoordType==RTREE_COORD_INT32 ); sqlite3_result_int(ctx, c.i); } - } + }else{ + if( !pCsr->bAuxValid ){ + if( pCsr->pReadAux==0 ){ + rc = sqlite3_prepare_v3(pRtree->db, pRtree->zReadAuxSql, -1, 0, + &pCsr->pReadAux, 0); + if( rc ) return rc; + } + sqlite3_bind_int64(pCsr->pReadAux, 1, + nodeGetRowid(pRtree, pNode, p->iCell)); + rc = sqlite3_step(pCsr->pReadAux); + if( rc==SQLITE_ROW ){ + pCsr->bAuxValid = 1; + }else{ + sqlite3_reset(pCsr->pReadAux); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + return rc; + } + } + sqlite3_result_value(ctx, + sqlite3_column_value(pCsr->pReadAux, i - pRtree->nDim2 + 1)); + } return SQLITE_OK; } @@ -150602,37 +172211,21 @@ static int findLeafNode( ** operator. */ static int deserializeGeometry(sqlite3_value *pValue, RtreeConstraint *pCons){ - RtreeMatchArg *pBlob; /* BLOB returned by geometry function */ + RtreeMatchArg *pBlob, *pSrc; /* BLOB returned by geometry function */ sqlite3_rtree_query_info *pInfo; /* Callback information */ - int nBlob; /* Size of the geometry function blob */ - int nExpected; /* Expected size of the BLOB */ - /* Check that value is actually a blob. */ - if( sqlite3_value_type(pValue)!=SQLITE_BLOB ) return SQLITE_ERROR; - - /* Check that the blob is roughly the right size. */ - nBlob = sqlite3_value_bytes(pValue); - if( nBlob<(int)sizeof(RtreeMatchArg) - || ((nBlob-sizeof(RtreeMatchArg))%sizeof(RtreeDValue))!=0 - ){ - return SQLITE_ERROR; - } - - pInfo = (sqlite3_rtree_query_info*)sqlite3_malloc( sizeof(*pInfo)+nBlob ); + pSrc = sqlite3_value_pointer(pValue, "RtreeMatchArg"); + if( pSrc==0 ) return SQLITE_ERROR; + pInfo = (sqlite3_rtree_query_info*) + sqlite3_malloc64( sizeof(*pInfo)+pSrc->iSize ); if( !pInfo ) return SQLITE_NOMEM; memset(pInfo, 0, sizeof(*pInfo)); pBlob = (RtreeMatchArg*)&pInfo[1]; - - memcpy(pBlob, sqlite3_value_blob(pValue), nBlob); - nExpected = (int)(sizeof(RtreeMatchArg) + - (pBlob->nParam-1)*sizeof(RtreeDValue)); - if( pBlob->magic!=RTREE_GEOMETRY_MAGIC || nBlob!=nExpected ){ - sqlite3_free(pInfo); - return SQLITE_ERROR; - } + memcpy(pBlob, pSrc, pSrc->iSize); pInfo->pContext = pBlob->cb.pContext; pInfo->nParam = pBlob->nParam; pInfo->aParam = pBlob->aParam; + pInfo->apSqlParam = pBlob->apSqlParam; if( pBlob->cb.xGeom ){ pCons->u.xGeom = pBlob->cb.xGeom; @@ -150658,20 +172251,23 @@ static int rtreeFilter( int ii; int rc = SQLITE_OK; int iCell = 0; + sqlite3_stmt *pStmt; rtreeReference(pRtree); /* Reset the cursor to the same state as rtreeOpen() leaves it in. */ freeCursorConstraints(pCsr); sqlite3_free(pCsr->aPoint); + pStmt = pCsr->pReadAux; memset(pCsr, 0, sizeof(RtreeCursor)); pCsr->base.pVtab = (sqlite3_vtab*)pRtree; + pCsr->pReadAux = pStmt; pCsr->iStrategy = idxNum; if( idxNum==1 ){ /* Special case - lookup by rowid. */ RtreeNode *pLeaf; /* Leaf on which the required cell resides */ - RtreeSearchPoint *p; /* Search point for the the leaf */ + RtreeSearchPoint *p; /* Search point for the leaf */ i64 iRowid = sqlite3_value_int64(argv[0]); i64 iNode = 0; rc = findLeafNode(pRtree, iRowid, &pLeaf, &iNode); @@ -150682,7 +172278,7 @@ static int rtreeFilter( p->id = iNode; p->eWithin = PARTLY_WITHIN; rc = nodeRowidIndex(pRtree, pLeaf, iRowid, &iCell); - p->iCell = iCell; + p->iCell = (u8)iCell; RTREE_QUEUE_TRACE(pCsr, "PUSH-F1:"); }else{ pCsr->atEOF = 1; @@ -150715,7 +172311,7 @@ static int rtreeFilter( if( rc!=SQLITE_OK ){ break; } - p->pInfo->nCoord = pRtree->nDim*2; + p->pInfo->nCoord = pRtree->nDim2; p->pInfo->anQueue = pCsr->anQueue; p->pInfo->mxLevel = pRtree->iDepth + 1; }else{ @@ -150730,7 +172326,7 @@ static int rtreeFilter( } if( rc==SQLITE_OK ){ RtreeSearchPoint *pNew; - pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, pRtree->iDepth+1); + pNew = rtreeSearchPointNew(pCsr, RTREE_ZERO, (u8)(pRtree->iDepth+1)); if( pNew==0 ) return SQLITE_NOMEM; pNew->id = 1; pNew->iCell = 0; @@ -150748,19 +172344,6 @@ static int rtreeFilter( return rc; } -/* -** Set the pIdxInfo->estimatedRows variable to nRow. Unless this -** extension is currently being used by a version of SQLite too old to -** support estimatedRows. In that case this function is a no-op. -*/ -static void setEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ -#if SQLITE_VERSION_NUMBER>=3008002 - if( sqlite3_libversion_number()>=3008002 ){ - pIdxInfo->estimatedRows = nRow; - } -#endif -} - /* ** Rtree virtual table module xBestIndex method. There are three ** table scan strategies to choose from (in order from most to @@ -150799,17 +172382,30 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ Rtree *pRtree = (Rtree*)tab; int rc = SQLITE_OK; int ii; + int bMatch = 0; /* True if there exists a MATCH constraint */ i64 nRow; /* Estimated rows returned by this scan */ int iIdx = 0; char zIdxStr[RTREE_MAX_DIMENSIONS*8+1]; memset(zIdxStr, 0, sizeof(zIdxStr)); + /* Check if there exists a MATCH constraint - even an unusable one. If there + ** is, do not consider the lookup-by-rowid plan as using such a plan would + ** require the VDBE to evaluate the MATCH constraint, which is not currently + ** possible. */ + for(ii=0; ii<pIdxInfo->nConstraint; ii++){ + if( pIdxInfo->aConstraint[ii].op==SQLITE_INDEX_CONSTRAINT_MATCH ){ + bMatch = 1; + } + } + assert( pIdxInfo->idxStr==0 ); for(ii=0; ii<pIdxInfo->nConstraint && iIdx<(int)(sizeof(zIdxStr)-1); ii++){ struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[ii]; - if( p->usable && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + if( bMatch==0 && p->usable + && p->iColumn==0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ + ){ /* We have an equality constraint on the rowid. Use strategy 1. */ int jj; for(jj=0; jj<ii; jj++){ @@ -150827,11 +172423,15 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ** a single row. */ pIdxInfo->estimatedCost = 30.0; - setEstimatedRows(pIdxInfo, 1); + pIdxInfo->estimatedRows = 1; + pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; return SQLITE_OK; } - if( p->usable && (p->iColumn>0 || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) ){ + if( p->usable + && ((p->iColumn>0 && p->iColumn<=pRtree->nDim2) + || p->op==SQLITE_INDEX_CONSTRAINT_MATCH) + ){ u8 op; switch( p->op ){ case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; @@ -150845,7 +172445,7 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ break; } zIdxStr[iIdx++] = op; - zIdxStr[iIdx++] = p->iColumn - 1 + '0'; + zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); pIdxInfo->aConstraintUsage[ii].omit = 1; } @@ -150857,9 +172457,9 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ return SQLITE_NOMEM; } - nRow = pRtree->nRowEst / (iIdx + 1); + nRow = pRtree->nRowEst >> (iIdx/2); pIdxInfo->estimatedCost = (double)6.0 * (double)nRow; - setEstimatedRows(pIdxInfo, nRow); + pIdxInfo->estimatedRows = nRow; return rc; } @@ -150869,9 +172469,26 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ */ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ RtreeDValue area = (RtreeDValue)1; - int ii; - for(ii=0; ii<(pRtree->nDim*2); ii+=2){ - area = (area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]))); + assert( pRtree->nDim>=1 && pRtree->nDim<=5 ); +#ifndef SQLITE_RTREE_INT_ONLY + if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ + switch( pRtree->nDim ){ + case 5: area = p->aCoord[9].f - p->aCoord[8].f; + case 4: area *= p->aCoord[7].f - p->aCoord[6].f; + case 3: area *= p->aCoord[5].f - p->aCoord[4].f; + case 2: area *= p->aCoord[3].f - p->aCoord[2].f; + default: area *= p->aCoord[1].f - p->aCoord[0].f; + } + }else +#endif + { + switch( pRtree->nDim ){ + case 5: area = p->aCoord[9].i - p->aCoord[8].i; + case 4: area *= p->aCoord[7].i - p->aCoord[6].i; + case 3: area *= p->aCoord[5].i - p->aCoord[4].i; + case 2: area *= p->aCoord[3].i - p->aCoord[2].i; + default: area *= p->aCoord[1].i - p->aCoord[0].i; + } } return area; } @@ -150881,11 +172498,12 @@ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ ** of the objects size in each dimension. */ static RtreeDValue cellMargin(Rtree *pRtree, RtreeCell *p){ - RtreeDValue margin = (RtreeDValue)0; - int ii; - for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + RtreeDValue margin = 0; + int ii = pRtree->nDim2 - 2; + do{ margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii])); - } + ii -= 2; + }while( ii>=0 ); return margin; } @@ -150893,17 +172511,19 @@ static RtreeDValue cellMargin(Rtree *pRtree, RtreeCell *p){ ** Store the union of cells p1 and p2 in p1. */ static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ - int ii; + int ii = 0; if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ - for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + do{ p1->aCoord[ii].f = MIN(p1->aCoord[ii].f, p2->aCoord[ii].f); p1->aCoord[ii+1].f = MAX(p1->aCoord[ii+1].f, p2->aCoord[ii+1].f); - } + ii += 2; + }while( ii<pRtree->nDim2 ); }else{ - for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + do{ p1->aCoord[ii].i = MIN(p1->aCoord[ii].i, p2->aCoord[ii].i); p1->aCoord[ii+1].i = MAX(p1->aCoord[ii+1].i, p2->aCoord[ii+1].i); - } + ii += 2; + }while( ii<pRtree->nDim2 ); } } @@ -150914,7 +172534,7 @@ static void cellUnion(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ static int cellContains(Rtree *pRtree, RtreeCell *p1, RtreeCell *p2){ int ii; int isInt = (pRtree->eCoordType==RTREE_COORD_INT32); - for(ii=0; ii<(pRtree->nDim*2); ii+=2){ + for(ii=0; ii<pRtree->nDim2; ii+=2){ RtreeCoord *a1 = &p1->aCoord[ii]; RtreeCoord *a2 = &p2->aCoord[ii]; if( (!isInt && (a2[0].f<a1[0].f || a2[1].f>a1[1].f)) @@ -150949,7 +172569,7 @@ static RtreeDValue cellOverlap( for(ii=0; ii<nCell; ii++){ int jj; RtreeDValue o = (RtreeDValue)1; - for(jj=0; jj<(pRtree->nDim*2); jj+=2){ + for(jj=0; jj<pRtree->nDim2; jj+=2){ RtreeDValue x1, x2; x1 = MAX(DCOORD(p->aCoord[jj]), DCOORD(aCell[ii].aCoord[jj])); x2 = MIN(DCOORD(p->aCoord[jj+1]), DCOORD(aCell[ii].aCoord[jj+1])); @@ -150978,7 +172598,7 @@ static int ChooseLeaf( ){ int rc; int ii; - RtreeNode *pNode; + RtreeNode *pNode = 0; rc = nodeAcquire(pRtree, 1, 0, &pNode); for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){ @@ -151384,7 +173004,7 @@ static int SplitNode( }else{ pLeft = pNode; pRight = nodeNew(pRtree, pLeft->pParent); - nodeReference(pLeft); + pLeft->nRef++; } if( !pLeft || !pRight ){ @@ -151810,7 +173430,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ int rc; /* Return code */ RtreeNode *pLeaf = 0; /* Leaf node containing record iDelete */ int iCell; /* Index of iDelete cell in pLeaf */ - RtreeNode *pRoot; /* Root node of rtree structure */ + RtreeNode *pRoot = 0; /* Root node of rtree structure */ /* Obtain a reference to the root node to initialize Rtree.iDepth */ @@ -151853,7 +173473,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ */ if( rc==SQLITE_OK && pRtree->iDepth>0 && NCELL(pRoot)==1 ){ int rc2; - RtreeNode *pChild; + RtreeNode *pChild = 0; i64 iChild = nodeGetRowid(pRtree, pRoot, 0); rc = nodeAcquire(pRtree, iChild, pRoot, &pChild); if( rc==SQLITE_OK ){ @@ -151874,6 +173494,7 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ rc = reinsertNodeContent(pRtree, pLeaf); } pRtree->pDeleted = pLeaf->pNext; + pRtree->nNodeRef--; sqlite3_free(pLeaf); } @@ -151916,6 +173537,53 @@ static RtreeValue rtreeValueUp(sqlite3_value *v){ } #endif /* !defined(SQLITE_RTREE_INT_ONLY) */ +/* +** A constraint has failed while inserting a row into an rtree table. +** Assuming no OOM error occurs, this function sets the error message +** (at pRtree->base.zErrMsg) to an appropriate value and returns +** SQLITE_CONSTRAINT. +** +** Parameter iCol is the index of the leftmost column involved in the +** constraint failure. If it is 0, then the constraint that failed is +** the unique constraint on the id column. Otherwise, it is the rtree +** (c1<=c2) constraint on columns iCol and iCol+1 that has failed. +** +** If an OOM occurs, SQLITE_NOMEM is returned instead of SQLITE_CONSTRAINT. +*/ +static int rtreeConstraintError(Rtree *pRtree, int iCol){ + sqlite3_stmt *pStmt = 0; + char *zSql; + int rc; + + assert( iCol==0 || iCol%2 ); + zSql = sqlite3_mprintf("SELECT * FROM %Q.%Q", pRtree->zDb, pRtree->zName); + if( zSql ){ + rc = sqlite3_prepare_v2(pRtree->db, zSql, -1, &pStmt, 0); + }else{ + rc = SQLITE_NOMEM; + } + sqlite3_free(zSql); + + if( rc==SQLITE_OK ){ + if( iCol==0 ){ + const char *zCol = sqlite3_column_name(pStmt, 0); + pRtree->base.zErrMsg = sqlite3_mprintf( + "UNIQUE constraint failed: %s.%s", pRtree->zName, zCol + ); + }else{ + const char *zCol1 = sqlite3_column_name(pStmt, iCol); + const char *zCol2 = sqlite3_column_name(pStmt, iCol+1); + pRtree->base.zErrMsg = sqlite3_mprintf( + "rtree constraint failed: %s.(%s<=%s)", pRtree->zName, zCol1, zCol2 + ); + } + } + + sqlite3_finalize(pStmt); + return (rc==SQLITE_OK ? SQLITE_CONSTRAINT : rc); +} + + /* ** The xUpdate method for rtree module virtual tables. @@ -151923,7 +173591,7 @@ static RtreeValue rtreeValueUp(sqlite3_value *v){ static int rtreeUpdate( sqlite3_vtab *pVtab, int nData, - sqlite3_value **azData, + sqlite3_value **aData, sqlite_int64 *pRowid ){ Rtree *pRtree = (Rtree *)pVtab; @@ -151931,6 +173599,12 @@ static int rtreeUpdate( RtreeCell cell; /* New cell to insert if nData>1 */ int bHaveRowid = 0; /* Set to 1 after new rowid is determined */ + if( pRtree->nNodeRef ){ + /* Unable to write to the btree while another cursor is reading from it, + ** since the write might do a rebalance which would disrupt the read + ** cursor. */ + return SQLITE_LOCKED_VTAB; + } rtreeReference(pRtree); assert(nData>=1); @@ -151949,27 +173623,36 @@ static int rtreeUpdate( */ if( nData>1 ){ int ii; + int nn = nData - 4; + + if( nn > pRtree->nDim2 ) nn = pRtree->nDim2; + /* Populate the cell.aCoord[] array. The first coordinate is aData[3]. + ** + ** NB: nData can only be less than nDim*2+3 if the rtree is mis-declared + ** with "column" that are interpreted as table constraints. + ** Example: CREATE VIRTUAL TABLE bad USING rtree(x,y,CHECK(y>5)); + ** This problem was discovered after years of use, so we silently ignore + ** these kinds of misdeclared tables to avoid breaking any legacy. + */ - /* Populate the cell.aCoord[] array. The first coordinate is azData[3]. */ - assert( nData==(pRtree->nDim*2 + 3) ); #ifndef SQLITE_RTREE_INT_ONLY if( pRtree->eCoordType==RTREE_COORD_REAL32 ){ - for(ii=0; ii<(pRtree->nDim*2); ii+=2){ - cell.aCoord[ii].f = rtreeValueDown(azData[ii+3]); - cell.aCoord[ii+1].f = rtreeValueUp(azData[ii+4]); + for(ii=0; ii<nn; ii+=2){ + cell.aCoord[ii].f = rtreeValueDown(aData[ii+3]); + cell.aCoord[ii+1].f = rtreeValueUp(aData[ii+4]); if( cell.aCoord[ii].f>cell.aCoord[ii+1].f ){ - rc = SQLITE_CONSTRAINT; + rc = rtreeConstraintError(pRtree, ii+1); goto constraint; } } }else #endif { - for(ii=0; ii<(pRtree->nDim*2); ii+=2){ - cell.aCoord[ii].i = sqlite3_value_int(azData[ii+3]); - cell.aCoord[ii+1].i = sqlite3_value_int(azData[ii+4]); + for(ii=0; ii<nn; ii+=2){ + cell.aCoord[ii].i = sqlite3_value_int(aData[ii+3]); + cell.aCoord[ii+1].i = sqlite3_value_int(aData[ii+4]); if( cell.aCoord[ii].i>cell.aCoord[ii+1].i ){ - rc = SQLITE_CONSTRAINT; + rc = rtreeConstraintError(pRtree, ii+1); goto constraint; } } @@ -151977,10 +173660,10 @@ static int rtreeUpdate( /* If a rowid value was supplied, check if it is already present in ** the table. If so, the constraint has failed. */ - if( sqlite3_value_type(azData[2])!=SQLITE_NULL ){ - cell.iRowid = sqlite3_value_int64(azData[2]); - if( sqlite3_value_type(azData[0])==SQLITE_NULL - || sqlite3_value_int64(azData[0])!=cell.iRowid + if( sqlite3_value_type(aData[2])!=SQLITE_NULL ){ + cell.iRowid = sqlite3_value_int64(aData[2]); + if( sqlite3_value_type(aData[0])==SQLITE_NULL + || sqlite3_value_int64(aData[0])!=cell.iRowid ){ int steprc; sqlite3_bind_int64(pRtree->pReadRowid, 1, cell.iRowid); @@ -151990,7 +173673,7 @@ static int rtreeUpdate( if( sqlite3_vtab_on_conflict(pRtree->db)==SQLITE_REPLACE ){ rc = rtreeDeleteRowid(pRtree, cell.iRowid); }else{ - rc = SQLITE_CONSTRAINT; + rc = rtreeConstraintError(pRtree, 0); goto constraint; } } @@ -151999,16 +173682,16 @@ static int rtreeUpdate( } } - /* If azData[0] is not an SQL NULL value, it is the rowid of a + /* If aData[0] is not an SQL NULL value, it is the rowid of a ** record to delete from the r-tree table. The following block does ** just that. */ - if( sqlite3_value_type(azData[0])!=SQLITE_NULL ){ - rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(azData[0])); + if( sqlite3_value_type(aData[0])!=SQLITE_NULL ){ + rc = rtreeDeleteRowid(pRtree, sqlite3_value_int64(aData[0])); } - /* If the azData[] array contains more than one element, elements - ** (azData[2]..azData[argc-1]) contain a new record to insert into + /* If the aData[] array contains more than one element, elements + ** (aData[2]..aData[argc-1]) contain a new record to insert into ** the r-tree structure. */ if( rc==SQLITE_OK && nData>1 ){ @@ -152033,6 +173716,16 @@ static int rtreeUpdate( rc = rc2; } } + if( pRtree->nAux ){ + sqlite3_stmt *pUp = pRtree->pWriteAux; + int jj; + sqlite3_bind_int64(pUp, 1, *pRowid); + for(jj=0; jj<pRtree->nAux; jj++){ + sqlite3_bind_value(pUp, jj+2, aData[pRtree->nDim2+3+jj]); + } + sqlite3_step(pUp); + rc = sqlite3_reset(pUp); + } } constraint: @@ -152040,6 +173733,27 @@ constraint: return rc; } +/* +** Called when a transaction starts. +*/ +static int rtreeBeginTransaction(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + assert( pRtree->inWrTrans==0 ); + pRtree->inWrTrans++; + return SQLITE_OK; +} + +/* +** Called when a transaction completes (either by COMMIT or ROLLBACK). +** The sqlite3_blob object should be released at this point. +*/ +static int rtreeEndTransaction(sqlite3_vtab *pVtab){ + Rtree *pRtree = (Rtree *)pVtab; + pRtree->inWrTrans = 0; + nodeBlobReset(pRtree); + return SQLITE_OK; +} + /* ** The xRename method for rtree module virtual tables. */ @@ -152055,12 +173769,37 @@ static int rtreeRename(sqlite3_vtab *pVtab, const char *zNewName){ , pRtree->zDb, pRtree->zName, zNewName ); if( zSql ){ + nodeBlobReset(pRtree); rc = sqlite3_exec(pRtree->db, zSql, 0, 0, 0); sqlite3_free(zSql); } return rc; } +/* +** The xSavepoint method. +** +** This module does not need to do anything to support savepoints. However, +** it uses this hook to close any open blob handle. This is done because a +** DROP TABLE command - which fortunately always opens a savepoint - cannot +** succeed if there are any open blob handles. i.e. if the blob handle were +** not closed here, the following would fail: +** +** BEGIN; +** INSERT INTO rtree... +** DROP TABLE <tablename>; -- Would fail with SQLITE_LOCKED +** COMMIT; +*/ +static int rtreeSavepoint(sqlite3_vtab *pVtab, int iSavepoint){ + Rtree *pRtree = (Rtree *)pVtab; + int iwt = pRtree->inWrTrans; + UNUSED_PARAMETER(iSavepoint); + pRtree->inWrTrans = 0; + nodeBlobReset(pRtree); + pRtree->inWrTrans = iwt; + return SQLITE_OK; +} + /* ** This function populates the pRtree->nRowEst variable with an estimate ** of the number of rows in the virtual table. If possible, this is based @@ -152073,6 +173812,13 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ int rc; i64 nRow = 0; + rc = sqlite3_table_column_metadata( + db, pRtree->zDb, "sqlite_stat1",0,0,0,0,0,0 + ); + if( rc!=SQLITE_OK ){ + pRtree->nRowEst = RTREE_DEFAULT_ROWEST; + return rc==SQLITE_ERROR ? SQLITE_OK : rc; + } zSql = sqlite3_mprintf(zFmt, pRtree->zDb, pRtree->zName); if( zSql==0 ){ rc = SQLITE_NOMEM; @@ -152099,7 +173845,7 @@ static int rtreeQueryStat1(sqlite3 *db, Rtree *pRtree){ } static sqlite3_module rtreeModule = { - 0, /* iVersion */ + 2, /* iVersion */ rtreeCreate, /* xCreate - create a table */ rtreeConnect, /* xConnect - connect to an existing table */ rtreeBestIndex, /* xBestIndex - Determine search strategy */ @@ -152113,15 +173859,15 @@ static sqlite3_module rtreeModule = { rtreeColumn, /* xColumn - read data */ rtreeRowid, /* xRowid - read data */ rtreeUpdate, /* xUpdate - write data */ - 0, /* xBegin - begin transaction */ - 0, /* xSync - sync transaction */ - 0, /* xCommit - commit transaction */ - 0, /* xRollback - rollback transaction */ + rtreeBeginTransaction, /* xBegin - begin transaction */ + rtreeEndTransaction, /* xSync - sync transaction */ + rtreeEndTransaction, /* xCommit - commit transaction */ + rtreeEndTransaction, /* xRollback - rollback transaction */ 0, /* xFindFunction - function overloading */ rtreeRename, /* xRename - rename the table */ - 0, /* xSavepoint */ + rtreeSavepoint, /* xSavepoint */ 0, /* xRelease */ - 0 /* xRollbackTo */ + 0, /* xRollbackTo */ }; static int rtreeSqlInit( @@ -152133,22 +173879,21 @@ static int rtreeSqlInit( ){ int rc = SQLITE_OK; - #define N_STATEMENT 9 + #define N_STATEMENT 8 static const char *azSql[N_STATEMENT] = { - /* Read and write the xxx_node table */ - "SELECT data FROM '%q'.'%q_node' WHERE nodeno = :1", - "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(:1, :2)", - "DELETE FROM '%q'.'%q_node' WHERE nodeno = :1", + /* Write the xxx_node table */ + "INSERT OR REPLACE INTO '%q'.'%q_node' VALUES(?1, ?2)", + "DELETE FROM '%q'.'%q_node' WHERE nodeno = ?1", /* Read and write the xxx_rowid table */ - "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = :1", - "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(:1, :2)", - "DELETE FROM '%q'.'%q_rowid' WHERE rowid = :1", + "SELECT nodeno FROM '%q'.'%q_rowid' WHERE rowid = ?1", + "INSERT OR REPLACE INTO '%q'.'%q_rowid' VALUES(?1, ?2)", + "DELETE FROM '%q'.'%q_rowid' WHERE rowid = ?1", /* Read and write the xxx_parent table */ - "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = :1", - "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(:1, :2)", - "DELETE FROM '%q'.'%q_parent' WHERE nodeno = :1" + "SELECT parentnode FROM '%q'.'%q_parent' WHERE nodeno = ?1", + "INSERT OR REPLACE INTO '%q'.'%q_parent' VALUES(?1, ?2)", + "DELETE FROM '%q'.'%q_parent' WHERE nodeno = ?1" }; sqlite3_stmt **appStmt[N_STATEMENT]; int i; @@ -152156,14 +173901,25 @@ static int rtreeSqlInit( pRtree->db = db; if( isCreate ){ - char *zCreate = sqlite3_mprintf( -"CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY, data BLOB);" -"CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY, nodeno INTEGER);" -"CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY," - " parentnode INTEGER);" -"INSERT INTO '%q'.'%q_node' VALUES(1, zeroblob(%d))", - zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, zDb, zPrefix, pRtree->iNodeSize - ); + char *zCreate; + sqlite3_str *p = sqlite3_str_new(db); + int ii; + sqlite3_str_appendf(p, + "CREATE TABLE \"%w\".\"%w_rowid\"(rowid INTEGER PRIMARY KEY,nodeno", + zDb, zPrefix); + for(ii=0; ii<pRtree->nAux; ii++){ + sqlite3_str_appendf(p,",a%d",ii); + } + sqlite3_str_appendf(p, + ");CREATE TABLE \"%w\".\"%w_node\"(nodeno INTEGER PRIMARY KEY,data);", + zDb, zPrefix); + sqlite3_str_appendf(p, + "CREATE TABLE \"%w\".\"%w_parent\"(nodeno INTEGER PRIMARY KEY,parentnode);", + zDb, zPrefix); + sqlite3_str_appendf(p, + "INSERT INTO \"%w\".\"%w_node\"VALUES(1,zeroblob(%d))", + zDb, zPrefix, pRtree->iNodeSize); + zCreate = sqlite3_str_finish(p); if( !zCreate ){ return SQLITE_NOMEM; } @@ -152174,26 +173930,62 @@ static int rtreeSqlInit( } } - appStmt[0] = &pRtree->pReadNode; - appStmt[1] = &pRtree->pWriteNode; - appStmt[2] = &pRtree->pDeleteNode; - appStmt[3] = &pRtree->pReadRowid; - appStmt[4] = &pRtree->pWriteRowid; - appStmt[5] = &pRtree->pDeleteRowid; - appStmt[6] = &pRtree->pReadParent; - appStmt[7] = &pRtree->pWriteParent; - appStmt[8] = &pRtree->pDeleteParent; + appStmt[0] = &pRtree->pWriteNode; + appStmt[1] = &pRtree->pDeleteNode; + appStmt[2] = &pRtree->pReadRowid; + appStmt[3] = &pRtree->pWriteRowid; + appStmt[4] = &pRtree->pDeleteRowid; + appStmt[5] = &pRtree->pReadParent; + appStmt[6] = &pRtree->pWriteParent; + appStmt[7] = &pRtree->pDeleteParent; rc = rtreeQueryStat1(db, pRtree); for(i=0; i<N_STATEMENT && rc==SQLITE_OK; i++){ - char *zSql = sqlite3_mprintf(azSql[i], zDb, zPrefix); + char *zSql; + const char *zFormat; + if( i!=3 || pRtree->nAux==0 ){ + zFormat = azSql[i]; + }else { + /* An UPSERT is very slightly slower than REPLACE, but it is needed + ** if there are auxiliary columns */ + zFormat = "INSERT INTO\"%w\".\"%w_rowid\"(rowid,nodeno)VALUES(?1,?2)" + "ON CONFLICT(rowid)DO UPDATE SET nodeno=excluded.nodeno"; + } + zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); if( zSql ){ - rc = sqlite3_prepare_v2(db, zSql, -1, appStmt[i], 0); + rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, + appStmt[i], 0); }else{ rc = SQLITE_NOMEM; } sqlite3_free(zSql); } + if( pRtree->nAux ){ + pRtree->zReadAuxSql = sqlite3_mprintf( + "SELECT * FROM \"%w\".\"%w_rowid\" WHERE rowid=?1", + zDb, zPrefix); + if( pRtree->zReadAuxSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_str *p = sqlite3_str_new(db); + int ii; + char *zSql; + sqlite3_str_appendf(p, "UPDATE \"%w\".\"%w_rowid\"SET ", zDb, zPrefix); + for(ii=0; ii<pRtree->nAux; ii++){ + if( ii ) sqlite3_str_append(p, ",", 1); + sqlite3_str_appendf(p,"a%d=?%d",ii,ii+2); + } + sqlite3_str_appendf(p, " WHERE rowid=?1"); + zSql = sqlite3_str_finish(p); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, + &pRtree->pWriteAux, 0); + sqlite3_free(zSql); + } + } + } return rc; } @@ -152263,6 +174055,10 @@ static int getNodeSize( rc = getIntFromStmt(db, zSql, &pRtree->iNodeSize); if( rc!=SQLITE_OK ){ *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + }else if( pRtree->iNodeSize<(512-64) ){ + rc = SQLITE_CORRUPT_VTAB; + *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", + pRtree->zName); } } @@ -152292,17 +174088,22 @@ static int rtreeInit( int nDb; /* Length of string argv[1] */ int nName; /* Length of string argv[2] */ int eCoordType = (pAux ? RTREE_COORD_INT32 : RTREE_COORD_REAL32); + sqlite3_str *pSql; + char *zSql; + int ii = 4; + int iErr; const char *aErrMsg[] = { 0, /* 0 */ "Wrong number of columns for an rtree table", /* 1 */ "Too few columns for an rtree table", /* 2 */ - "Too many columns for an rtree table" /* 3 */ + "Too many columns for an rtree table", /* 3 */ + "Auxiliary rtree columns must be last" /* 4 */ }; - int iErr = (argc<6) ? 2 : argc>(RTREE_MAX_DIMENSIONS*2+4) ? 3 : argc%2; - if( aErrMsg[iErr] ){ - *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]); + assert( RTREE_MAX_AUX_COLUMN<256 ); /* Aux columns counted by a u8 */ + if( argc>RTREE_MAX_AUX_COLUMN+3 ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[3]); return SQLITE_ERROR; } @@ -152320,52 +174121,73 @@ static int rtreeInit( pRtree->base.pModule = &rtreeModule; pRtree->zDb = (char *)&pRtree[1]; pRtree->zName = &pRtree->zDb[nDb+1]; - pRtree->nDim = (argc-4)/2; - pRtree->nBytesPerCell = 8 + pRtree->nDim*4*2; - pRtree->eCoordType = eCoordType; + pRtree->eCoordType = (u8)eCoordType; memcpy(pRtree->zDb, argv[1], nDb); memcpy(pRtree->zName, argv[2], nName); - /* Figure out the node size to use. */ - rc = getNodeSize(db, pRtree, isCreate, pzErr); /* Create/Connect to the underlying relational database schema. If ** that is successful, call sqlite3_declare_vtab() to configure ** the r-tree table schema. */ - if( rc==SQLITE_OK ){ - if( (rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate)) ){ - *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + pSql = sqlite3_str_new(db); + sqlite3_str_appendf(pSql, "CREATE TABLE x(%s", argv[3]); + for(ii=4; ii<argc; ii++){ + if( argv[ii][0]=='+' ){ + pRtree->nAux++; + sqlite3_str_appendf(pSql, ",%s", argv[ii]+1); + }else if( pRtree->nAux>0 ){ + break; }else{ - char *zSql = sqlite3_mprintf("CREATE TABLE x(%s", argv[3]); - char *zTmp; - int ii; - for(ii=4; zSql && ii<argc; ii++){ - zTmp = zSql; - zSql = sqlite3_mprintf("%s, %s", zTmp, argv[ii]); - sqlite3_free(zTmp); - } - if( zSql ){ - zTmp = zSql; - zSql = sqlite3_mprintf("%s);", zTmp); - sqlite3_free(zTmp); - } - if( !zSql ){ - rc = SQLITE_NOMEM; - }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){ - *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); - } - sqlite3_free(zSql); + pRtree->nDim2++; + sqlite3_str_appendf(pSql, ",%s", argv[ii]); } } - - if( rc==SQLITE_OK ){ - *ppVtab = (sqlite3_vtab *)pRtree; - }else{ - assert( *ppVtab==0 ); - assert( pRtree->nBusy==1 ); - rtreeRelease(pRtree); + sqlite3_str_appendf(pSql, ");"); + zSql = sqlite3_str_finish(pSql); + if( !zSql ){ + rc = SQLITE_NOMEM; + }else if( ii<argc ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[4]); + rc = SQLITE_ERROR; + }else if( SQLITE_OK!=(rc = sqlite3_declare_vtab(db, zSql)) ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); } + sqlite3_free(zSql); + if( rc ) goto rtreeInit_fail; + pRtree->nDim = pRtree->nDim2/2; + if( pRtree->nDim<1 ){ + iErr = 2; + }else if( pRtree->nDim2>RTREE_MAX_DIMENSIONS*2 ){ + iErr = 3; + }else if( pRtree->nDim2 % 2 ){ + iErr = 1; + }else{ + iErr = 0; + } + if( iErr ){ + *pzErr = sqlite3_mprintf("%s", aErrMsg[iErr]); + goto rtreeInit_fail; + } + pRtree->nBytesPerCell = 8 + pRtree->nDim2*4; + + /* Figure out the node size to use. */ + rc = getNodeSize(db, pRtree, isCreate, pzErr); + if( rc ) goto rtreeInit_fail; + rc = rtreeSqlInit(pRtree, db, argv[1], argv[2], isCreate); + if( rc ){ + *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + goto rtreeInit_fail; + } + + *ppVtab = (sqlite3_vtab *)pRtree; + return SQLITE_OK; + +rtreeInit_fail: + if( rc==SQLITE_OK ) rc = SQLITE_ERROR; + assert( *ppVtab==0 ); + assert( pRtree->nBusy==1 ); + rtreeRelease(pRtree); return rc; } @@ -152395,7 +174217,8 @@ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ UNUSED_PARAMETER(nArg); memset(&node, 0, sizeof(RtreeNode)); memset(&tree, 0, sizeof(Rtree)); - tree.nDim = sqlite3_value_int(apArg[0]); + tree.nDim = (u8)sqlite3_value_int(apArg[0]); + tree.nDim2 = tree.nDim*2; tree.nBytesPerCell = 8 + 8 * tree.nDim; node.zData = (u8 *)sqlite3_value_blob(apArg[1]); @@ -152408,7 +174231,7 @@ static void rtreenode(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ nodeGetCell(&tree, &node, ii, &cell); sqlite3_snprintf(512-nCell,&zCell[nCell],"%lld", cell.iRowid); nCell = (int)strlen(zCell); - for(jj=0; jj<tree.nDim*2; jj++){ + for(jj=0; jj<tree.nDim2; jj++){ #ifndef SQLITE_RTREE_INT_ONLY sqlite3_snprintf(512-nCell,&zCell[nCell], " %g", (double)cell.aCoord[jj].f); @@ -152452,6 +174275,474 @@ static void rtreedepth(sqlite3_context *ctx, int nArg, sqlite3_value **apArg){ } } +/* +** Context object passed between the various routines that make up the +** implementation of integrity-check function rtreecheck(). +*/ +typedef struct RtreeCheck RtreeCheck; +struct RtreeCheck { + sqlite3 *db; /* Database handle */ + const char *zDb; /* Database containing rtree table */ + const char *zTab; /* Name of rtree table */ + int bInt; /* True for rtree_i32 table */ + int nDim; /* Number of dimensions for this rtree tbl */ + sqlite3_stmt *pGetNode; /* Statement used to retrieve nodes */ + sqlite3_stmt *aCheckMapping[2]; /* Statements to query %_parent/%_rowid */ + int nLeaf; /* Number of leaf cells in table */ + int nNonLeaf; /* Number of non-leaf cells in table */ + int rc; /* Return code */ + char *zReport; /* Message to report */ + int nErr; /* Number of lines in zReport */ +}; + +#define RTREE_CHECK_MAX_ERROR 100 + +/* +** Reset SQL statement pStmt. If the sqlite3_reset() call returns an error, +** and RtreeCheck.rc==SQLITE_OK, set RtreeCheck.rc to the error code. +*/ +static void rtreeCheckReset(RtreeCheck *pCheck, sqlite3_stmt *pStmt){ + int rc = sqlite3_reset(pStmt); + if( pCheck->rc==SQLITE_OK ) pCheck->rc = rc; +} + +/* +** The second and subsequent arguments to this function are a format string +** and printf style arguments. This function formats the string and attempts +** to compile it as an SQL statement. +** +** If successful, a pointer to the new SQL statement is returned. Otherwise, +** NULL is returned and an error code left in RtreeCheck.rc. +*/ +static sqlite3_stmt *rtreeCheckPrepare( + RtreeCheck *pCheck, /* RtreeCheck object */ + const char *zFmt, ... /* Format string and trailing args */ +){ + va_list ap; + char *z; + sqlite3_stmt *pRet = 0; + + va_start(ap, zFmt); + z = sqlite3_vmprintf(zFmt, ap); + + if( pCheck->rc==SQLITE_OK ){ + if( z==0 ){ + pCheck->rc = SQLITE_NOMEM; + }else{ + pCheck->rc = sqlite3_prepare_v2(pCheck->db, z, -1, &pRet, 0); + } + } + + sqlite3_free(z); + va_end(ap); + return pRet; +} + +/* +** The second and subsequent arguments to this function are a printf() +** style format string and arguments. This function formats the string and +** appends it to the report being accumuated in pCheck. +*/ +static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){ + va_list ap; + va_start(ap, zFmt); + if( pCheck->rc==SQLITE_OK && pCheck->nErr<RTREE_CHECK_MAX_ERROR ){ + char *z = sqlite3_vmprintf(zFmt, ap); + if( z==0 ){ + pCheck->rc = SQLITE_NOMEM; + }else{ + pCheck->zReport = sqlite3_mprintf("%z%s%z", + pCheck->zReport, (pCheck->zReport ? "\n" : ""), z + ); + if( pCheck->zReport==0 ){ + pCheck->rc = SQLITE_NOMEM; + } + } + pCheck->nErr++; + } + va_end(ap); +} + +/* +** This function is a no-op if there is already an error code stored +** in the RtreeCheck object indicated by the first argument. NULL is +** returned in this case. +** +** Otherwise, the contents of rtree table node iNode are loaded from +** the database and copied into a buffer obtained from sqlite3_malloc(). +** If no error occurs, a pointer to the buffer is returned and (*pnNode) +** is set to the size of the buffer in bytes. +** +** Or, if an error does occur, NULL is returned and an error code left +** in the RtreeCheck object. The final value of *pnNode is undefined in +** this case. +*/ +static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ + u8 *pRet = 0; /* Return value */ + + assert( pCheck->rc==SQLITE_OK ); + if( pCheck->pGetNode==0 ){ + pCheck->pGetNode = rtreeCheckPrepare(pCheck, + "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", + pCheck->zDb, pCheck->zTab + ); + } + + if( pCheck->rc==SQLITE_OK ){ + sqlite3_bind_int64(pCheck->pGetNode, 1, iNode); + if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ + int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); + const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); + pRet = sqlite3_malloc(nNode); + if( pRet==0 ){ + pCheck->rc = SQLITE_NOMEM; + }else{ + memcpy(pRet, pNode, nNode); + *pnNode = nNode; + } + } + rtreeCheckReset(pCheck, pCheck->pGetNode); + if( pCheck->rc==SQLITE_OK && pRet==0 ){ + rtreeCheckAppendMsg(pCheck, "Node %lld missing from database", iNode); + } + } + + return pRet; +} + +/* +** This function is used to check that the %_parent (if bLeaf==0) or %_rowid +** (if bLeaf==1) table contains a specified entry. The schemas of the +** two tables are: +** +** CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode INTEGER) +** CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno INTEGER, ...) +** +** In both cases, this function checks that there exists an entry with +** IPK value iKey and the second column set to iVal. +** +*/ +static void rtreeCheckMapping( + RtreeCheck *pCheck, /* RtreeCheck object */ + int bLeaf, /* True for a leaf cell, false for interior */ + i64 iKey, /* Key for mapping */ + i64 iVal /* Expected value for mapping */ +){ + int rc; + sqlite3_stmt *pStmt; + const char *azSql[2] = { + "SELECT parentnode FROM %Q.'%q_parent' WHERE nodeno=?1", + "SELECT nodeno FROM %Q.'%q_rowid' WHERE rowid=?1" + }; + + assert( bLeaf==0 || bLeaf==1 ); + if( pCheck->aCheckMapping[bLeaf]==0 ){ + pCheck->aCheckMapping[bLeaf] = rtreeCheckPrepare(pCheck, + azSql[bLeaf], pCheck->zDb, pCheck->zTab + ); + } + if( pCheck->rc!=SQLITE_OK ) return; + + pStmt = pCheck->aCheckMapping[bLeaf]; + sqlite3_bind_int64(pStmt, 1, iKey); + rc = sqlite3_step(pStmt); + if( rc==SQLITE_DONE ){ + rtreeCheckAppendMsg(pCheck, "Mapping (%lld -> %lld) missing from %s table", + iKey, iVal, (bLeaf ? "%_rowid" : "%_parent") + ); + }else if( rc==SQLITE_ROW ){ + i64 ii = sqlite3_column_int64(pStmt, 0); + if( ii!=iVal ){ + rtreeCheckAppendMsg(pCheck, + "Found (%lld -> %lld) in %s table, expected (%lld -> %lld)", + iKey, ii, (bLeaf ? "%_rowid" : "%_parent"), iKey, iVal + ); + } + } + rtreeCheckReset(pCheck, pStmt); +} + +/* +** Argument pCell points to an array of coordinates stored on an rtree page. +** This function checks that the coordinates are internally consistent (no +** x1>x2 conditions) and adds an error message to the RtreeCheck object +** if they are not. +** +** Additionally, if pParent is not NULL, then it is assumed to point to +** the array of coordinates on the parent page that bound the page +** containing pCell. In this case it is also verified that the two +** sets of coordinates are mutually consistent and an error message added +** to the RtreeCheck object if they are not. +*/ +static void rtreeCheckCellCoord( + RtreeCheck *pCheck, + i64 iNode, /* Node id to use in error messages */ + int iCell, /* Cell number to use in error messages */ + u8 *pCell, /* Pointer to cell coordinates */ + u8 *pParent /* Pointer to parent coordinates */ +){ + RtreeCoord c1, c2; + RtreeCoord p1, p2; + int i; + + for(i=0; i<pCheck->nDim; i++){ + readCoord(&pCell[4*2*i], &c1); + readCoord(&pCell[4*(2*i + 1)], &c2); + + /* printf("%e, %e\n", c1.u.f, c2.u.f); */ + if( pCheck->bInt ? c1.i>c2.i : c1.f>c2.f ){ + rtreeCheckAppendMsg(pCheck, + "Dimension %d of cell %d on node %lld is corrupt", i, iCell, iNode + ); + } + + if( pParent ){ + readCoord(&pParent[4*2*i], &p1); + readCoord(&pParent[4*(2*i + 1)], &p2); + + if( (pCheck->bInt ? c1.i<p1.i : c1.f<p1.f) + || (pCheck->bInt ? c2.i>p2.i : c2.f>p2.f) + ){ + rtreeCheckAppendMsg(pCheck, + "Dimension %d of cell %d on node %lld is corrupt relative to parent" + , i, iCell, iNode + ); + } + } + } +} + +/* +** Run rtreecheck() checks on node iNode, which is at depth iDepth within +** the r-tree structure. Argument aParent points to the array of coordinates +** that bound node iNode on the parent node. +** +** If any problems are discovered, an error message is appended to the +** report accumulated in the RtreeCheck object. +*/ +static void rtreeCheckNode( + RtreeCheck *pCheck, + int iDepth, /* Depth of iNode (0==leaf) */ + u8 *aParent, /* Buffer containing parent coords */ + i64 iNode /* Node to check */ +){ + u8 *aNode = 0; + int nNode = 0; + + assert( iNode==1 || aParent!=0 ); + assert( pCheck->nDim>0 ); + + aNode = rtreeCheckGetNode(pCheck, iNode, &nNode); + if( aNode ){ + if( nNode<4 ){ + rtreeCheckAppendMsg(pCheck, + "Node %lld is too small (%d bytes)", iNode, nNode + ); + }else{ + int nCell; /* Number of cells on page */ + int i; /* Used to iterate through cells */ + if( aParent==0 ){ + iDepth = readInt16(aNode); + if( iDepth>RTREE_MAX_DEPTH ){ + rtreeCheckAppendMsg(pCheck, "Rtree depth out of range (%d)", iDepth); + sqlite3_free(aNode); + return; + } + } + nCell = readInt16(&aNode[2]); + if( (4 + nCell*(8 + pCheck->nDim*2*4))>nNode ){ + rtreeCheckAppendMsg(pCheck, + "Node %lld is too small for cell count of %d (%d bytes)", + iNode, nCell, nNode + ); + }else{ + for(i=0; i<nCell; i++){ + u8 *pCell = &aNode[4 + i*(8 + pCheck->nDim*2*4)]; + i64 iVal = readInt64(pCell); + rtreeCheckCellCoord(pCheck, iNode, i, &pCell[8], aParent); + + if( iDepth>0 ){ + rtreeCheckMapping(pCheck, 0, iVal, iNode); + rtreeCheckNode(pCheck, iDepth-1, &pCell[8], iVal); + pCheck->nNonLeaf++; + }else{ + rtreeCheckMapping(pCheck, 1, iVal, iNode); + pCheck->nLeaf++; + } + } + } + } + sqlite3_free(aNode); + } +} + +/* +** The second argument to this function must be either "_rowid" or +** "_parent". This function checks that the number of entries in the +** %_rowid or %_parent table is exactly nExpect. If not, it adds +** an error message to the report in the RtreeCheck object indicated +** by the first argument. +*/ +static void rtreeCheckCount(RtreeCheck *pCheck, const char *zTbl, i64 nExpect){ + if( pCheck->rc==SQLITE_OK ){ + sqlite3_stmt *pCount; + pCount = rtreeCheckPrepare(pCheck, "SELECT count(*) FROM %Q.'%q%s'", + pCheck->zDb, pCheck->zTab, zTbl + ); + if( pCount ){ + if( sqlite3_step(pCount)==SQLITE_ROW ){ + i64 nActual = sqlite3_column_int64(pCount, 0); + if( nActual!=nExpect ){ + rtreeCheckAppendMsg(pCheck, "Wrong number of entries in %%%s table" + " - expected %lld, actual %lld" , zTbl, nExpect, nActual + ); + } + } + pCheck->rc = sqlite3_finalize(pCount); + } + } +} + +/* +** This function does the bulk of the work for the rtree integrity-check. +** It is called by rtreecheck(), which is the SQL function implementation. +*/ +static int rtreeCheckTable( + sqlite3 *db, /* Database handle to access db through */ + const char *zDb, /* Name of db ("main", "temp" etc.) */ + const char *zTab, /* Name of rtree table to check */ + char **pzReport /* OUT: sqlite3_malloc'd report text */ +){ + RtreeCheck check; /* Common context for various routines */ + sqlite3_stmt *pStmt = 0; /* Used to find column count of rtree table */ + int bEnd = 0; /* True if transaction should be closed */ + int nAux = 0; /* Number of extra columns. */ + + /* Initialize the context object */ + memset(&check, 0, sizeof(check)); + check.db = db; + check.zDb = zDb; + check.zTab = zTab; + + /* If there is not already an open transaction, open one now. This is + ** to ensure that the queries run as part of this integrity-check operate + ** on a consistent snapshot. */ + if( sqlite3_get_autocommit(db) ){ + check.rc = sqlite3_exec(db, "BEGIN", 0, 0, 0); + bEnd = 1; + } + + /* Find the number of auxiliary columns */ + if( check.rc==SQLITE_OK ){ + pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab); + if( pStmt ){ + nAux = sqlite3_column_count(pStmt) - 2; + sqlite3_finalize(pStmt); + } + check.rc = SQLITE_OK; + } + + /* Find number of dimensions in the rtree table. */ + pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.%Q", zDb, zTab); + if( pStmt ){ + int rc; + check.nDim = (sqlite3_column_count(pStmt) - 1 - nAux) / 2; + if( check.nDim<1 ){ + rtreeCheckAppendMsg(&check, "Schema corrupt or not an rtree"); + }else if( SQLITE_ROW==sqlite3_step(pStmt) ){ + check.bInt = (sqlite3_column_type(pStmt, 1)==SQLITE_INTEGER); + } + rc = sqlite3_finalize(pStmt); + if( rc!=SQLITE_CORRUPT ) check.rc = rc; + } + + /* Do the actual integrity-check */ + if( check.nDim>=1 ){ + if( check.rc==SQLITE_OK ){ + rtreeCheckNode(&check, 0, 0, 1); + } + rtreeCheckCount(&check, "_rowid", check.nLeaf); + rtreeCheckCount(&check, "_parent", check.nNonLeaf); + } + + /* Finalize SQL statements used by the integrity-check */ + sqlite3_finalize(check.pGetNode); + sqlite3_finalize(check.aCheckMapping[0]); + sqlite3_finalize(check.aCheckMapping[1]); + + /* If one was opened, close the transaction */ + if( bEnd ){ + int rc = sqlite3_exec(db, "END", 0, 0, 0); + if( check.rc==SQLITE_OK ) check.rc = rc; + } + *pzReport = check.zReport; + return check.rc; +} + +/* +** Usage: +** +** rtreecheck(<rtree-table>); +** rtreecheck(<database>, <rtree-table>); +** +** Invoking this SQL function runs an integrity-check on the named rtree +** table. The integrity-check verifies the following: +** +** 1. For each cell in the r-tree structure (%_node table), that: +** +** a) for each dimension, (coord1 <= coord2). +** +** b) unless the cell is on the root node, that the cell is bounded +** by the parent cell on the parent node. +** +** c) for leaf nodes, that there is an entry in the %_rowid +** table corresponding to the cell's rowid value that +** points to the correct node. +** +** d) for cells on non-leaf nodes, that there is an entry in the +** %_parent table mapping from the cell's child node to the +** node that it resides on. +** +** 2. That there are the same number of entries in the %_rowid table +** as there are leaf cells in the r-tree structure, and that there +** is a leaf cell that corresponds to each entry in the %_rowid table. +** +** 3. That there are the same number of entries in the %_parent table +** as there are non-leaf cells in the r-tree structure, and that +** there is a non-leaf cell that corresponds to each entry in the +** %_parent table. +*/ +static void rtreecheck( + sqlite3_context *ctx, + int nArg, + sqlite3_value **apArg +){ + if( nArg!=1 && nArg!=2 ){ + sqlite3_result_error(ctx, + "wrong number of arguments to function rtreecheck()", -1 + ); + }else{ + int rc; + char *zReport = 0; + const char *zDb = (const char*)sqlite3_value_text(apArg[0]); + const char *zTab; + if( nArg==1 ){ + zTab = zDb; + zDb = "main"; + }else{ + zTab = (const char*)sqlite3_value_text(apArg[1]); + } + rc = rtreeCheckTable(sqlite3_context_db_handle(ctx), zDb, zTab, &zReport); + if( rc==SQLITE_OK ){ + sqlite3_result_text(ctx, zReport ? zReport : "ok", -1, SQLITE_TRANSIENT); + }else{ + sqlite3_result_error_code(ctx, rc); + } + sqlite3_free(zReport); + } +} + + /* ** Register the r-tree module with database handle db. This creates the ** virtual table module "rtree" and the debugging/analysis scalar @@ -152465,6 +174756,9 @@ SQLITE_PRIVATE int sqlite3RtreeInit(sqlite3 *db){ if( rc==SQLITE_OK ){ rc = sqlite3_create_function(db, "rtreedepth", 1, utf8, 0,rtreedepth, 0, 0); } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "rtreecheck", -1, utf8, 0,rtreecheck, 0,0); + } if( rc==SQLITE_OK ){ #ifdef SQLITE_RTREE_INT_ONLY void *c = (void *)RTREE_COORD_INT32; @@ -152494,6 +174788,18 @@ static void rtreeFreeCallback(void *p){ sqlite3_free(p); } +/* +** This routine frees the BLOB that is returned by geomCallback(). +*/ +static void rtreeMatchArgFree(void *pArg){ + int i; + RtreeMatchArg *p = (RtreeMatchArg*)pArg; + for(i=0; i<p->nParam; i++){ + sqlite3_value_free(p->apSqlParam[i]); + } + sqlite3_free(p); +} + /* ** Each call to sqlite3_rtree_geometry_callback() or ** sqlite3_rtree_query_callback() creates an ordinary SQLite @@ -152512,24 +174818,34 @@ static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); RtreeMatchArg *pBlob; int nBlob; + int memErr = 0; - nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue); + nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + + nArg*sizeof(sqlite3_value*); pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob); if( !pBlob ){ sqlite3_result_error_nomem(ctx); }else{ int i; - pBlob->magic = RTREE_GEOMETRY_MAGIC; + pBlob->iSize = nBlob; pBlob->cb = pGeomCtx[0]; + pBlob->apSqlParam = (sqlite3_value**)&pBlob->aParam[nArg]; pBlob->nParam = nArg; for(i=0; i<nArg; i++){ + pBlob->apSqlParam[i] = sqlite3_value_dup(aArg[i]); + if( pBlob->apSqlParam[i]==0 ) memErr = 1; #ifdef SQLITE_RTREE_INT_ONLY pBlob->aParam[i] = sqlite3_value_int64(aArg[i]); #else pBlob->aParam[i] = sqlite3_value_double(aArg[i]); #endif } - sqlite3_result_blob(ctx, pBlob, nBlob, sqlite3_free); + if( memErr ){ + sqlite3_result_error_nomem(ctx); + rtreeMatchArgFree(pBlob); + }else{ + sqlite3_result_pointer(ctx, pBlob, "RtreeMatchArg", rtreeMatchArgFree); + } } } @@ -152629,7 +174945,9 @@ SQLITE_API int sqlite3_rtree_init( ** provide case-independent matching. */ -#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) +#if !defined(SQLITE_CORE) \ + || defined(SQLITE_ENABLE_ICU) \ + || defined(SQLITE_ENABLE_ICU_COLLATIONS) /* Include ICU headers */ #include <unicode/utypes.h> @@ -152640,10 +174958,32 @@ SQLITE_API int sqlite3_rtree_init( /* #include <assert.h> */ #ifndef SQLITE_CORE +/* #include "sqlite3ext.h" */ SQLITE_EXTENSION_INIT1 #else +/* #include "sqlite3.h" */ #endif +/* +** This function is called when an ICU function called from within +** the implementation of an SQL scalar function returns an error. +** +** The scalar function context passed as the first argument is +** loaded with an error message based on the following two args. +*/ +static void icuFunctionError( + sqlite3_context *pCtx, /* SQLite scalar function context */ + const char *zName, /* Name of ICU function that failed */ + UErrorCode e /* Error code returned by ICU function */ +){ + char zBuf[128]; + sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); + zBuf[127] = '\0'; + sqlite3_result_error(pCtx, zBuf, -1); +} + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + /* ** Maximum length (in bytes) of the pattern in a LIKE or GLOB ** operator. @@ -152659,6 +174999,38 @@ static void xFree(void *p){ sqlite3_free(p); } +/* +** This lookup table is used to help decode the first byte of +** a multi-byte UTF8 character. It is copied here from SQLite source +** code file utf8.c. +*/ +static const unsigned char icuUtf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define SQLITE_ICU_READ_UTF8(zIn, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = icuUtf8Trans1[c-0xc0]; \ + while( (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + } + +#define SQLITE_ICU_SKIP_UTF8(zIn) \ + assert( *zIn ); \ + if( *(zIn++)>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){zIn++;} \ + } + + /* ** Compare two UTF-8 strings for equality where the first string is ** a "LIKE" expression. Return true (1) if they are the same and @@ -152669,20 +175041,17 @@ static int icuLikeCompare( const uint8_t *zString, /* The UTF-8 string to compare against */ const UChar32 uEsc /* The escape character */ ){ - static const int MATCH_ONE = (UChar32)'_'; - static const int MATCH_ALL = (UChar32)'%'; - - int iPattern = 0; /* Current byte index in zPattern */ - int iString = 0; /* Current byte index in zString */ + static const uint32_t MATCH_ONE = (uint32_t)'_'; + static const uint32_t MATCH_ALL = (uint32_t)'%'; int prevEscape = 0; /* True if the previous character was uEsc */ - while( zPattern[iPattern]!=0 ){ + while( 1 ){ /* Read (and consume) the next character from the input pattern. */ - UChar32 uPattern; - U8_NEXT_UNSAFE(zPattern, iPattern, uPattern); - assert(uPattern!=0); + uint32_t uPattern; + SQLITE_ICU_READ_UTF8(zPattern, uPattern); + if( uPattern==0 ) break; /* There are now 4 possibilities: ** @@ -152699,39 +175068,39 @@ static int icuLikeCompare( ** MATCH_ALL. For each MATCH_ONE, skip one character in the ** test string. */ - while( (c=zPattern[iPattern]) == MATCH_ALL || c == MATCH_ONE ){ + while( (c=*zPattern) == MATCH_ALL || c == MATCH_ONE ){ if( c==MATCH_ONE ){ - if( zString[iString]==0 ) return 0; - U8_FWD_1_UNSAFE(zString, iString); + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); } - iPattern++; + zPattern++; } - if( zPattern[iPattern]==0 ) return 1; + if( *zPattern==0 ) return 1; - while( zString[iString] ){ - if( icuLikeCompare(&zPattern[iPattern], &zString[iString], uEsc) ){ + while( *zString ){ + if( icuLikeCompare(zPattern, zString, uEsc) ){ return 1; } - U8_FWD_1_UNSAFE(zString, iString); + SQLITE_ICU_SKIP_UTF8(zString); } return 0; }else if( !prevEscape && uPattern==MATCH_ONE ){ /* Case 2. */ - if( zString[iString]==0 ) return 0; - U8_FWD_1_UNSAFE(zString, iString); + if( *zString==0 ) return 0; + SQLITE_ICU_SKIP_UTF8(zString); - }else if( !prevEscape && uPattern==uEsc){ + }else if( !prevEscape && uPattern==(uint32_t)uEsc){ /* Case 3. */ prevEscape = 1; }else{ /* Case 4. */ - UChar32 uString; - U8_NEXT_UNSAFE(zString, iString, uString); - uString = u_foldCase(uString, U_FOLD_CASE_DEFAULT); - uPattern = u_foldCase(uPattern, U_FOLD_CASE_DEFAULT); + uint32_t uString; + SQLITE_ICU_READ_UTF8(zString, uString); + uString = (uint32_t)u_foldCase((UChar32)uString, U_FOLD_CASE_DEFAULT); + uPattern = (uint32_t)u_foldCase((UChar32)uPattern, U_FOLD_CASE_DEFAULT); if( uString!=uPattern ){ return 0; } @@ -152739,7 +175108,7 @@ static int icuLikeCompare( } } - return zString[iString]==0; + return *zString==0; } /* @@ -152794,24 +175163,6 @@ static void icuLikeFunc( } } -/* -** This function is called when an ICU function called from within -** the implementation of an SQL scalar function returns an error. -** -** The scalar function context passed as the first argument is -** loaded with an error message based on the following two args. -*/ -static void icuFunctionError( - sqlite3_context *pCtx, /* SQLite scalar function context */ - const char *zName, /* Name of ICU function that failed */ - UErrorCode e /* Error code returned by ICU function */ -){ - char zBuf[128]; - sqlite3_snprintf(128, zBuf, "ICU error: %s(): %s", zName, u_errorName(e)); - zBuf[127] = '\0'; - sqlite3_result_error(pCtx, zBuf, -1); -} - /* ** Function to delete compiled regexp objects. Registered as ** a destructor function with sqlite3_set_auxdata(). @@ -152919,20 +175270,22 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ ** of upper() or lower(). ** ** lower('I', 'en_us') -> 'i' -** lower('I', 'tr_tr') -> 'ı' (small dotless i) +** lower('I', 'tr_tr') -> '\u131' (small dotless i) ** ** http://www.icu-project.org/userguide/posix.html#case_mappings */ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ - const UChar *zInput; - UChar *zOutput; - int nInput; - int nOutput; - - UErrorCode status = U_ZERO_ERROR; + const UChar *zInput; /* Pointer to input string */ + UChar *zOutput = 0; /* Pointer to output buffer */ + int nInput; /* Size of utf-16 input string in bytes */ + int nOut; /* Size of output buffer in bytes */ + int cnt; + int bToUpper; /* True for toupper(), false for tolower() */ + UErrorCode status; const char *zLocale = 0; assert(nArg==1 || nArg==2); + bToUpper = (sqlite3_user_data(p)!=0); if( nArg==2 ){ zLocale = (const char *)sqlite3_value_text(apArg[1]); } @@ -152941,28 +175294,42 @@ static void icuCaseFunc16(sqlite3_context *p, int nArg, sqlite3_value **apArg){ if( !zInput ){ return; } - nInput = sqlite3_value_bytes16(apArg[0]); - - nOutput = nInput * 2 + 2; - zOutput = sqlite3_malloc(nOutput); - if( !zOutput ){ + nOut = nInput = sqlite3_value_bytes16(apArg[0]); + if( nOut==0 ){ + sqlite3_result_text16(p, "", 0, SQLITE_STATIC); return; } - if( sqlite3_user_data(p) ){ - u_strToUpper(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); - }else{ - u_strToLower(zOutput, nOutput/2, zInput, nInput/2, zLocale, &status); - } + for(cnt=0; cnt<2; cnt++){ + UChar *zNew = sqlite3_realloc(zOutput, nOut); + if( zNew==0 ){ + sqlite3_free(zOutput); + sqlite3_result_error_nomem(p); + return; + } + zOutput = zNew; + status = U_ZERO_ERROR; + if( bToUpper ){ + nOut = 2*u_strToUpper(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + }else{ + nOut = 2*u_strToLower(zOutput,nOut/2,zInput,nInput/2,zLocale,&status); + } - if( !U_SUCCESS(status) ){ - icuFunctionError(p, "u_strToLower()/u_strToUpper", status); + if( U_SUCCESS(status) ){ + sqlite3_result_text16(p, zOutput, nOut, xFree); + }else if( status==U_BUFFER_OVERFLOW_ERROR ){ + assert( cnt==0 ); + continue; + }else{ + icuFunctionError(p, bToUpper ? "u_strToUpper" : "u_strToLower", status); + } return; } - - sqlite3_result_text16(p, zOutput, -1, xFree); + assert( 0 ); /* Unreachable */ } +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */ + /* ** Collation sequence destructor function. The pCtx argument points to ** a UCollator structure previously allocated using ucol_open(). @@ -153021,6 +175388,7 @@ static void icuLoadCollation( int rc; /* Return code from sqlite3_create_collation_x() */ assert(nArg==2); + (void)nArg; /* Unused parameter */ zLocale = (const char *)sqlite3_value_text(apArg[0]); zName = (const char *)sqlite3_value_text(apArg[1]); @@ -153048,38 +175416,37 @@ static void icuLoadCollation( ** Register the ICU extension functions with database db. */ SQLITE_PRIVATE int sqlite3IcuInit(sqlite3 *db){ - struct IcuScalar { + static const struct IcuScalar { const char *zName; /* Function name */ - int nArg; /* Number of arguments */ - int enc; /* Optimal text encoding */ - void *pContext; /* sqlite3_user_data() context */ + unsigned char nArg; /* Number of arguments */ + unsigned short enc; /* Optimal text encoding */ + unsigned char iContext; /* sqlite3_user_data() context */ void (*xFunc)(sqlite3_context*,int,sqlite3_value**); } scalars[] = { - {"regexp", 2, SQLITE_ANY, 0, icuRegexpFunc}, - - {"lower", 1, SQLITE_UTF16, 0, icuCaseFunc16}, - {"lower", 2, SQLITE_UTF16, 0, icuCaseFunc16}, - {"upper", 1, SQLITE_UTF16, (void*)1, icuCaseFunc16}, - {"upper", 2, SQLITE_UTF16, (void*)1, icuCaseFunc16}, - - {"lower", 1, SQLITE_UTF8, 0, icuCaseFunc16}, - {"lower", 2, SQLITE_UTF8, 0, icuCaseFunc16}, - {"upper", 1, SQLITE_UTF8, (void*)1, icuCaseFunc16}, - {"upper", 2, SQLITE_UTF8, (void*)1, icuCaseFunc16}, - - {"like", 2, SQLITE_UTF8, 0, icuLikeFunc}, - {"like", 3, SQLITE_UTF8, 0, icuLikeFunc}, - - {"icu_load_collation", 2, SQLITE_UTF8, (void*)db, icuLoadCollation}, + {"icu_load_collation", 2, SQLITE_UTF8, 1, icuLoadCollation}, +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) + {"regexp", 2, SQLITE_ANY|SQLITE_DETERMINISTIC, 0, icuRegexpFunc}, + {"lower", 1, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF16|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF16|SQLITE_DETERMINISTIC, 1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF16|SQLITE_DETERMINISTIC, 1, icuCaseFunc16}, + {"lower", 1, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"lower", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuCaseFunc16}, + {"upper", 1, SQLITE_UTF8|SQLITE_DETERMINISTIC, 1, icuCaseFunc16}, + {"upper", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 1, icuCaseFunc16}, + {"like", 2, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc}, + {"like", 3, SQLITE_UTF8|SQLITE_DETERMINISTIC, 0, icuLikeFunc}, +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_ICU) */ }; - int rc = SQLITE_OK; int i; - + for(i=0; rc==SQLITE_OK && i<(int)(sizeof(scalars)/sizeof(scalars[0])); i++){ - struct IcuScalar *p = &scalars[i]; + const struct IcuScalar *p = &scalars[i]; rc = sqlite3_create_function( - db, p->zName, p->nArg, p->enc, p->pContext, p->xFunc, 0, 0 + db, p->zName, p->nArg, p->enc, + p->iContext ? (void*)db : (void*)0, + p->xFunc, 0, 0 ); } @@ -153117,11 +175484,13 @@ SQLITE_API int sqlite3_icu_init( ************************************************************************* ** This file implements a tokenizer for fts3 based on the ICU library. */ +/* #include "fts3Int.h" */ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) #ifdef SQLITE_ENABLE_ICU /* #include <assert.h> */ /* #include <string.h> */ +/* #include "fts3_tokenizer.h" */ #include <unicode/ubrk.h> /* #include <unicode/ucol.h> */ @@ -153344,12 +175713,13 @@ static int icuNext( ** The set of routines that implement the simple tokenizer */ static const sqlite3_tokenizer_module icuTokenizerModule = { - 0, /* iVersion */ - icuCreate, /* xCreate */ - icuDestroy, /* xCreate */ - icuOpen, /* xOpen */ - icuClose, /* xClose */ - icuNext, /* xNext */ + 0, /* iVersion */ + icuCreate, /* xCreate */ + icuDestroy, /* xCreate */ + icuOpen, /* xOpen */ + icuClose, /* xClose */ + icuNext, /* xNext */ + 0, /* xLanguageid */ }; /* @@ -153365,3 +175735,36130 @@ SQLITE_PRIVATE void sqlite3Fts3IcuTokenizerModule( #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */ /************** End of fts3_icu.c ********************************************/ +/************** Begin file sqlite3rbu.c **************************************/ +/* +** 2014 August 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** +** OVERVIEW +** +** The RBU extension requires that the RBU update be packaged as an +** SQLite database. The tables it expects to find are described in +** sqlite3rbu.h. Essentially, for each table xyz in the target database +** that the user wishes to write to, a corresponding data_xyz table is +** created in the RBU database and populated with one row for each row to +** update, insert or delete from the target table. +** +** The update proceeds in three stages: +** +** 1) The database is updated. The modified database pages are written +** to a *-oal file. A *-oal file is just like a *-wal file, except +** that it is named "<database>-oal" instead of "<database>-wal". +** Because regular SQLite clients do not look for file named +** "<database>-oal", they go on using the original database in +** rollback mode while the *-oal file is being generated. +** +** During this stage RBU does not update the database by writing +** directly to the target tables. Instead it creates "imposter" +** tables using the SQLITE_TESTCTRL_IMPOSTER interface that it uses +** to update each b-tree individually. All updates required by each +** b-tree are completed before moving on to the next, and all +** updates are done in sorted key order. +** +** 2) The "<database>-oal" file is moved to the equivalent "<database>-wal" +** location using a call to rename(2). Before doing this the RBU +** module takes an EXCLUSIVE lock on the database file, ensuring +** that there are no other active readers. +** +** Once the EXCLUSIVE lock is released, any other database readers +** detect the new *-wal file and read the database in wal mode. At +** this point they see the new version of the database - including +** the updates made as part of the RBU update. +** +** 3) The new *-wal file is checkpointed. This proceeds in the same way +** as a regular database checkpoint, except that a single frame is +** checkpointed each time sqlite3rbu_step() is called. If the RBU +** handle is closed before the entire *-wal file is checkpointed, +** the checkpoint progress is saved in the RBU database and the +** checkpoint can be resumed by another RBU client at some point in +** the future. +** +** POTENTIAL PROBLEMS +** +** The rename() call might not be portable. And RBU is not currently +** syncing the directory after renaming the file. +** +** When state is saved, any commit to the *-oal file and the commit to +** the RBU update database are not atomic. So if the power fails at the +** wrong moment they might get out of sync. As the main database will be +** committed before the RBU update database this will likely either just +** pass unnoticed, or result in SQLITE_CONSTRAINT errors (due to UNIQUE +** constraint violations). +** +** If some client does modify the target database mid RBU update, or some +** other error occurs, the RBU extension will keep throwing errors. It's +** not really clear how to get out of this state. The system could just +** by delete the RBU update database and *-oal file and have the device +** download the update again and start over. +** +** At present, for an UPDATE, both the new.* and old.* records are +** collected in the rbu_xyz table. And for both UPDATEs and DELETEs all +** fields are collected. This means we're probably writing a lot more +** data to disk when saving the state of an ongoing update to the RBU +** update database than is strictly necessary. +** +*/ + +/* #include <assert.h> */ +/* #include <string.h> */ +/* #include <stdio.h> */ + +/* #include "sqlite3.h" */ + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RBU) +/************** Include sqlite3rbu.h in the middle of sqlite3rbu.c ***********/ +/************** Begin file sqlite3rbu.h **************************************/ +/* +** 2014 August 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file contains the public interface for the RBU extension. +*/ + +/* +** SUMMARY +** +** Writing a transaction containing a large number of operations on +** b-tree indexes that are collectively larger than the available cache +** memory can be very inefficient. +** +** The problem is that in order to update a b-tree, the leaf page (at least) +** containing the entry being inserted or deleted must be modified. If the +** working set of leaves is larger than the available cache memory, then a +** single leaf that is modified more than once as part of the transaction +** may be loaded from or written to the persistent media multiple times. +** Additionally, because the index updates are likely to be applied in +** random order, access to pages within the database is also likely to be in +** random order, which is itself quite inefficient. +** +** One way to improve the situation is to sort the operations on each index +** by index key before applying them to the b-tree. This leads to an IO +** pattern that resembles a single linear scan through the index b-tree, +** and all but guarantees each modified leaf page is loaded and stored +** exactly once. SQLite uses this trick to improve the performance of +** CREATE INDEX commands. This extension allows it to be used to improve +** the performance of large transactions on existing databases. +** +** Additionally, this extension allows the work involved in writing the +** large transaction to be broken down into sub-transactions performed +** sequentially by separate processes. This is useful if the system cannot +** guarantee that a single update process will run for long enough to apply +** the entire update, for example because the update is being applied on a +** mobile device that is frequently rebooted. Even after the writer process +** has committed one or more sub-transactions, other database clients continue +** to read from the original database snapshot. In other words, partially +** applied transactions are not visible to other clients. +** +** "RBU" stands for "Resumable Bulk Update". As in a large database update +** transmitted via a wireless network to a mobile device. A transaction +** applied using this extension is hence refered to as an "RBU update". +** +** +** LIMITATIONS +** +** An "RBU update" transaction is subject to the following limitations: +** +** * The transaction must consist of INSERT, UPDATE and DELETE operations +** only. +** +** * INSERT statements may not use any default values. +** +** * UPDATE and DELETE statements must identify their target rows by +** non-NULL PRIMARY KEY values. Rows with NULL values stored in PRIMARY +** KEY fields may not be updated or deleted. If the table being written +** has no PRIMARY KEY, affected rows must be identified by rowid. +** +** * UPDATE statements may not modify PRIMARY KEY columns. +** +** * No triggers will be fired. +** +** * No foreign key violations are detected or reported. +** +** * CHECK constraints are not enforced. +** +** * No constraint handling mode except for "OR ROLLBACK" is supported. +** +** +** PREPARATION +** +** An "RBU update" is stored as a separate SQLite database. A database +** containing an RBU update is an "RBU database". For each table in the +** target database to be updated, the RBU database should contain a table +** named "data_<target name>" containing the same set of columns as the +** target table, and one more - "rbu_control". The data_% table should +** have no PRIMARY KEY or UNIQUE constraints, but each column should have +** the same type as the corresponding column in the target database. +** The "rbu_control" column should have no type at all. For example, if +** the target database contains: +** +** CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c UNIQUE); +** +** Then the RBU database should contain: +** +** CREATE TABLE data_t1(a INTEGER, b TEXT, c, rbu_control); +** +** The order of the columns in the data_% table does not matter. +** +** Instead of a regular table, the RBU database may also contain virtual +** tables or view named using the data_<target> naming scheme. +** +** Instead of the plain data_<target> naming scheme, RBU database tables +** may also be named data<integer>_<target>, where <integer> is any sequence +** of zero or more numeric characters (0-9). This can be significant because +** tables within the RBU database are always processed in order sorted by +** name. By judicious selection of the <integer> portion of the names +** of the RBU tables the user can therefore control the order in which they +** are processed. This can be useful, for example, to ensure that "external +** content" FTS4 tables are updated before their underlying content tables. +** +** If the target database table is a virtual table or a table that has no +** PRIMARY KEY declaration, the data_% table must also contain a column +** named "rbu_rowid". This column is mapped to the tables implicit primary +** key column - "rowid". Virtual tables for which the "rowid" column does +** not function like a primary key value cannot be updated using RBU. For +** example, if the target db contains either of the following: +** +** CREATE VIRTUAL TABLE x1 USING fts3(a, b); +** CREATE TABLE x1(a, b) +** +** then the RBU database should contain: +** +** CREATE TABLE data_x1(a, b, rbu_rowid, rbu_control); +** +** All non-hidden columns (i.e. all columns matched by "SELECT *") of the +** target table must be present in the input table. For virtual tables, +** hidden columns are optional - they are updated by RBU if present in +** the input table, or not otherwise. For example, to write to an fts4 +** table with a hidden languageid column such as: +** +** CREATE VIRTUAL TABLE ft1 USING fts4(a, b, languageid='langid'); +** +** Either of the following input table schemas may be used: +** +** CREATE TABLE data_ft1(a, b, langid, rbu_rowid, rbu_control); +** CREATE TABLE data_ft1(a, b, rbu_rowid, rbu_control); +** +** For each row to INSERT into the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 0. The +** other columns should be set to the values that make up the new record +** to insert. +** +** If the target database table has an INTEGER PRIMARY KEY, it is not +** possible to insert a NULL value into the IPK column. Attempting to +** do so results in an SQLITE_MISMATCH error. +** +** For each row to DELETE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain integer value 1. The +** real primary key values of the row to delete should be stored in the +** corresponding columns of the data_% table. The values stored in the +** other columns are not used. +** +** For each row to UPDATE from the target database as part of the RBU +** update, the corresponding data_% table should contain a single record +** with the "rbu_control" column set to contain a value of type text. +** The real primary key values identifying the row to update should be +** stored in the corresponding columns of the data_% table row, as should +** the new values of all columns being update. The text value in the +** "rbu_control" column must contain the same number of characters as +** there are columns in the target database table, and must consist entirely +** of 'x' and '.' characters (or in some special cases 'd' - see below). For +** each column that is being updated, the corresponding character is set to +** 'x'. For those that remain as they are, the corresponding character of the +** rbu_control value should be set to '.'. For example, given the tables +** above, the update statement: +** +** UPDATE t1 SET c = 'usa' WHERE a = 4; +** +** is represented by the data_t1 row created by: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..x'); +** +** Instead of an 'x' character, characters of the rbu_control value specified +** for UPDATEs may also be set to 'd'. In this case, instead of updating the +** target table with the value stored in the corresponding data_% column, the +** user-defined SQL function "rbu_delta()" is invoked and the result stored in +** the target table column. rbu_delta() is invoked with two arguments - the +** original value currently stored in the target table column and the +** value specified in the data_xxx table. +** +** For example, this row: +** +** INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..d'); +** +** is similar to an UPDATE statement such as: +** +** UPDATE t1 SET c = rbu_delta(c, 'usa') WHERE a = 4; +** +** Finally, if an 'f' character appears in place of a 'd' or 's' in an +** ota_control string, the contents of the data_xxx table column is assumed +** to be a "fossil delta" - a patch to be applied to a blob value in the +** format used by the fossil source-code management system. In this case +** the existing value within the target database table must be of type BLOB. +** It is replaced by the result of applying the specified fossil delta to +** itself. +** +** If the target database table is a virtual table or a table with no PRIMARY +** KEY, the rbu_control value should not include a character corresponding +** to the rbu_rowid value. For example, this: +** +** INSERT INTO data_ft1(a, b, rbu_rowid, rbu_control) +** VALUES(NULL, 'usa', 12, '.x'); +** +** causes a result similar to: +** +** UPDATE ft1 SET b = 'usa' WHERE rowid = 12; +** +** The data_xxx tables themselves should have no PRIMARY KEY declarations. +** However, RBU is more efficient if reading the rows in from each data_xxx +** table in "rowid" order is roughly the same as reading them sorted by +** the PRIMARY KEY of the corresponding target database table. In other +** words, rows should be sorted using the destination table PRIMARY KEY +** fields before they are inserted into the data_xxx tables. +** +** USAGE +** +** The API declared below allows an application to apply an RBU update +** stored on disk to an existing target database. Essentially, the +** application: +** +** 1) Opens an RBU handle using the sqlite3rbu_open() function. +** +** 2) Registers any required virtual table modules with the database +** handle returned by sqlite3rbu_db(). Also, if required, register +** the rbu_delta() implementation. +** +** 3) Calls the sqlite3rbu_step() function one or more times on +** the new handle. Each call to sqlite3rbu_step() performs a single +** b-tree operation, so thousands of calls may be required to apply +** a complete update. +** +** 4) Calls sqlite3rbu_close() to close the RBU update handle. If +** sqlite3rbu_step() has been called enough times to completely +** apply the update to the target database, then the RBU database +** is marked as fully applied. Otherwise, the state of the RBU +** update application is saved in the RBU database for later +** resumption. +** +** See comments below for more detail on APIs. +** +** If an update is only partially applied to the target database by the +** time sqlite3rbu_close() is called, various state information is saved +** within the RBU database. This allows subsequent processes to automatically +** resume the RBU update from where it left off. +** +** To remove all RBU extension state information, returning an RBU database +** to its original contents, it is sufficient to drop all tables that begin +** with the prefix "rbu_" +** +** DATABASE LOCKING +** +** An RBU update may not be applied to a database in WAL mode. Attempting +** to do so is an error (SQLITE_ERROR). +** +** While an RBU handle is open, a SHARED lock may be held on the target +** database file. This means it is possible for other clients to read the +** database, but not to write it. +** +** If an RBU update is started and then suspended before it is completed, +** then an external client writes to the database, then attempting to resume +** the suspended RBU update is also an error (SQLITE_BUSY). +*/ + +#ifndef _SQLITE3RBU_H +#define _SQLITE3RBU_H + +/* #include "sqlite3.h" ** Required for error code definitions ** */ + +#if 0 +extern "C" { +#endif + +typedef struct sqlite3rbu sqlite3rbu; + +/* +** Open an RBU handle. +** +** Argument zTarget is the path to the target database. Argument zRbu is +** the path to the RBU database. Each call to this function must be matched +** by a call to sqlite3rbu_close(). When opening the databases, RBU passes +** the SQLITE_CONFIG_URI flag to sqlite3_open_v2(). So if either zTarget +** or zRbu begin with "file:", it will be interpreted as an SQLite +** database URI, not a regular file name. +** +** If the zState argument is passed a NULL value, the RBU extension stores +** the current state of the update (how many rows have been updated, which +** indexes are yet to be updated etc.) within the RBU database itself. This +** can be convenient, as it means that the RBU application does not need to +** organize removing a separate state file after the update is concluded. +** Or, if zState is non-NULL, it must be a path to a database file in which +** the RBU extension can store the state of the update. +** +** When resuming an RBU update, the zState argument must be passed the same +** value as when the RBU update was started. +** +** Once the RBU update is finished, the RBU extension does not +** automatically remove any zState database file, even if it created it. +** +** By default, RBU uses the default VFS to access the files on disk. To +** use a VFS other than the default, an SQLite "file:" URI containing a +** "vfs=..." option may be passed as the zTarget option. +** +** IMPORTANT NOTE FOR ZIPVFS USERS: The RBU extension works with all of +** SQLite's built-in VFSs, including the multiplexor VFS. However it does +** not work out of the box with zipvfs. Refer to the comment describing +** the zipvfs_create_vfs() API below for details on using RBU with zipvfs. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_open( + const char *zTarget, + const char *zRbu, + const char *zState +); + +/* +** Open an RBU handle to perform an RBU vacuum on database file zTarget. +** An RBU vacuum is similar to SQLite's built-in VACUUM command, except +** that it can be suspended and resumed like an RBU update. +** +** The second argument to this function identifies a database in which +** to store the state of the RBU vacuum operation if it is suspended. The +** first time sqlite3rbu_vacuum() is called, to start an RBU vacuum +** operation, the state database should either not exist or be empty +** (contain no tables). If an RBU vacuum is suspended by calling +** sqlite3rbu_close() on the RBU handle before sqlite3rbu_step() has +** returned SQLITE_DONE, the vacuum state is stored in the state database. +** The vacuum can be resumed by calling this function to open a new RBU +** handle specifying the same target and state databases. +** +** If the second argument passed to this function is NULL, then the +** name of the state database is "<database>-vacuum", where <database> +** is the name of the target database file. In this case, on UNIX, if the +** state database is not already present in the file-system, it is created +** with the same permissions as the target db is made. +** +** This function does not delete the state database after an RBU vacuum +** is completed, even if it created it. However, if the call to +** sqlite3rbu_close() returns any value other than SQLITE_OK, the contents +** of the state tables within the state database are zeroed. This way, +** the next call to sqlite3rbu_vacuum() opens a handle that starts a +** new RBU vacuum operation. +** +** As with sqlite3rbu_open(), Zipvfs users should rever to the comment +** describing the sqlite3rbu_create_vfs() API function below for +** a description of the complications associated with using RBU with +** zipvfs databases. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( + const char *zTarget, + const char *zState +); + +/* +** Configure a limit for the amount of temp space that may be used by +** the RBU handle passed as the first argument. The new limit is specified +** in bytes by the second parameter. If it is positive, the limit is updated. +** If the second parameter to this function is passed zero, then the limit +** is removed entirely. If the second parameter is negative, the limit is +** not modified (this is useful for querying the current limit). +** +** In all cases the returned value is the current limit in bytes (zero +** indicates unlimited). +** +** If the temp space limit is exceeded during operation, an SQLITE_FULL +** error is returned. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size_limit(sqlite3rbu*, sqlite3_int64); + +/* +** Return the current amount of temp file space, in bytes, currently used by +** the RBU handle passed as the only argument. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu*); + +/* +** Internally, each RBU connection uses a separate SQLite database +** connection to access the target and rbu update databases. This +** API allows the application direct access to these database handles. +** +** The first argument passed to this function must be a valid, open, RBU +** handle. The second argument should be passed zero to access the target +** database handle, or non-zero to access the rbu update database handle. +** Accessing the underlying database handles may be useful in the +** following scenarios: +** +** * If any target tables are virtual tables, it may be necessary to +** call sqlite3_create_module() on the target database handle to +** register the required virtual table implementations. +** +** * If the data_xxx tables in the RBU source database are virtual +** tables, the application may need to call sqlite3_create_module() on +** the rbu update db handle to any required virtual table +** implementations. +** +** * If the application uses the "rbu_delta()" feature described above, +** it must use sqlite3_create_function() or similar to register the +** rbu_delta() implementation with the target database handle. +** +** If an error has occurred, either while opening or stepping the RBU object, +** this function may return NULL. The error code and message may be collected +** when sqlite3rbu_close() is called. +** +** Database handles returned by this function remain valid until the next +** call to any sqlite3rbu_xxx() function other than sqlite3rbu_db(). +*/ +SQLITE_API sqlite3 *sqlite3rbu_db(sqlite3rbu*, int bRbu); + +/* +** Do some work towards applying the RBU update to the target db. +** +** Return SQLITE_DONE if the update has been completely applied, or +** SQLITE_OK if no error occurs but there remains work to do to apply +** the RBU update. If an error does occur, some other error code is +** returned. +** +** Once a call to sqlite3rbu_step() has returned a value other than +** SQLITE_OK, all subsequent calls on the same RBU handle are no-ops +** that immediately return the same value. +*/ +SQLITE_API int sqlite3rbu_step(sqlite3rbu *pRbu); + +/* +** Force RBU to save its state to disk. +** +** If a power failure or application crash occurs during an update, following +** system recovery RBU may resume the update from the point at which the state +** was last saved. In other words, from the most recent successful call to +** sqlite3rbu_close() or this function. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *pRbu); + +/* +** Close an RBU handle. +** +** If the RBU update has been completely applied, mark the RBU database +** as fully applied. Otherwise, assuming no error has occurred, save the +** current state of the RBU update appliation to the RBU database. +** +** If an error has already occurred as part of an sqlite3rbu_step() +** or sqlite3rbu_open() call, or if one occurs within this function, an +** SQLite error code is returned. Additionally, if pzErrmsg is not NULL, +** *pzErrmsg may be set to point to a buffer containing a utf-8 formatted +** English language error message. It is the responsibility of the caller to +** eventually free any such buffer using sqlite3_free(). +** +** Otherwise, if no error occurs, this function returns SQLITE_OK if the +** update has been partially applied, or SQLITE_DONE if it has been +** completely applied. +*/ +SQLITE_API int sqlite3rbu_close(sqlite3rbu *pRbu, char **pzErrmsg); + +/* +** Return the total number of key-value operations (inserts, deletes or +** updates) that have been performed on the target database since the +** current RBU update was started. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu); + +/* +** Obtain permyriadage (permyriadage is to 10000 as percentage is to 100) +** progress indications for the two stages of an RBU update. This API may +** be useful for driving GUI progress indicators and similar. +** +** An RBU update is divided into two stages: +** +** * Stage 1, in which changes are accumulated in an oal/wal file, and +** * Stage 2, in which the contents of the wal file are copied into the +** main database. +** +** The update is visible to non-RBU clients during stage 2. During stage 1 +** non-RBU reader clients may see the original database. +** +** If this API is called during stage 2 of the update, output variable +** (*pnOne) is set to 10000 to indicate that stage 1 has finished and (*pnTwo) +** to a value between 0 and 10000 to indicate the permyriadage progress of +** stage 2. A value of 5000 indicates that stage 2 is half finished, +** 9000 indicates that it is 90% finished, and so on. +** +** If this API is called during stage 1 of the update, output variable +** (*pnTwo) is set to 0 to indicate that stage 2 has not yet started. The +** value to which (*pnOne) is set depends on whether or not the RBU +** database contains an "rbu_count" table. The rbu_count table, if it +** exists, must contain the same columns as the following: +** +** CREATE TABLE rbu_count(tbl TEXT PRIMARY KEY, cnt INTEGER) WITHOUT ROWID; +** +** There must be one row in the table for each source (data_xxx) table within +** the RBU database. The 'tbl' column should contain the name of the source +** table. The 'cnt' column should contain the number of rows within the +** source table. +** +** If the rbu_count table is present and populated correctly and this +** API is called during stage 1, the *pnOne output variable is set to the +** permyriadage progress of the same stage. If the rbu_count table does +** not exist, then (*pnOne) is set to -1 during stage 1. If the rbu_count +** table exists but is not correctly populated, the value of the *pnOne +** output variable during stage 1 is undefined. +*/ +SQLITE_API void sqlite3rbu_bp_progress(sqlite3rbu *pRbu, int *pnOne, int*pnTwo); + +/* +** Obtain an indication as to the current stage of an RBU update or vacuum. +** This function always returns one of the SQLITE_RBU_STATE_XXX constants +** defined in this file. Return values should be interpreted as follows: +** +** SQLITE_RBU_STATE_OAL: +** RBU is currently building a *-oal file. The next call to sqlite3rbu_step() +** may either add further data to the *-oal file, or compute data that will +** be added by a subsequent call. +** +** SQLITE_RBU_STATE_MOVE: +** RBU has finished building the *-oal file. The next call to sqlite3rbu_step() +** will move the *-oal file to the equivalent *-wal path. If the current +** operation is an RBU update, then the updated version of the database +** file will become visible to ordinary SQLite clients following the next +** call to sqlite3rbu_step(). +** +** SQLITE_RBU_STATE_CHECKPOINT: +** RBU is currently performing an incremental checkpoint. The next call to +** sqlite3rbu_step() will copy a page of data from the *-wal file into +** the target database file. +** +** SQLITE_RBU_STATE_DONE: +** The RBU operation has finished. Any subsequent calls to sqlite3rbu_step() +** will immediately return SQLITE_DONE. +** +** SQLITE_RBU_STATE_ERROR: +** An error has occurred. Any subsequent calls to sqlite3rbu_step() will +** immediately return the SQLite error code associated with the error. +*/ +#define SQLITE_RBU_STATE_OAL 1 +#define SQLITE_RBU_STATE_MOVE 2 +#define SQLITE_RBU_STATE_CHECKPOINT 3 +#define SQLITE_RBU_STATE_DONE 4 +#define SQLITE_RBU_STATE_ERROR 5 + +SQLITE_API int sqlite3rbu_state(sqlite3rbu *pRbu); + +/* +** Create an RBU VFS named zName that accesses the underlying file-system +** via existing VFS zParent. Or, if the zParent parameter is passed NULL, +** then the new RBU VFS uses the default system VFS to access the file-system. +** The new object is registered as a non-default VFS with SQLite before +** returning. +** +** Part of the RBU implementation uses a custom VFS object. Usually, this +** object is created and deleted automatically by RBU. +** +** The exception is for applications that also use zipvfs. In this case, +** the custom VFS must be explicitly created by the user before the RBU +** handle is opened. The RBU VFS should be installed so that the zipvfs +** VFS uses the RBU VFS, which in turn uses any other VFS layers in use +** (for example multiplexor) to access the file-system. For example, +** to assemble an RBU enabled VFS stack that uses both zipvfs and +** multiplexor (error checking omitted): +** +** // Create a VFS named "multiplex" (not the default). +** sqlite3_multiplex_initialize(0, 0); +** +** // Create an rbu VFS named "rbu" that uses multiplexor. If the +** // second argument were replaced with NULL, the "rbu" VFS would +** // access the file-system via the system default VFS, bypassing the +** // multiplexor. +** sqlite3rbu_create_vfs("rbu", "multiplex"); +** +** // Create a zipvfs VFS named "zipvfs" that uses rbu. +** zipvfs_create_vfs_v3("zipvfs", "rbu", 0, xCompressorAlgorithmDetector); +** +** // Make zipvfs the default VFS. +** sqlite3_vfs_register(sqlite3_vfs_find("zipvfs"), 1); +** +** Because the default VFS created above includes a RBU functionality, it +** may be used by RBU clients. Attempting to use RBU with a zipvfs VFS stack +** that does not include the RBU layer results in an error. +** +** The overhead of adding the "rbu" VFS to the system is negligible for +** non-RBU users. There is no harm in an application accessing the +** file-system via "rbu" all the time, even if it only uses RBU functionality +** occasionally. +*/ +SQLITE_API int sqlite3rbu_create_vfs(const char *zName, const char *zParent); + +/* +** Deregister and destroy an RBU vfs created by an earlier call to +** sqlite3rbu_create_vfs(). +** +** VFS objects are not reference counted. If a VFS object is destroyed +** before all database handles that use it have been closed, the results +** are undefined. +*/ +SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName); + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _SQLITE3RBU_H */ + +/************** End of sqlite3rbu.h ******************************************/ +/************** Continuing where we left off in sqlite3rbu.c *****************/ + +#if defined(_WIN32_WCE) +/* #include "windows.h" */ +#endif + +/* Maximum number of prepared UPDATE statements held by this module */ +#define SQLITE_RBU_UPDATE_CACHESIZE 16 + +/* Delta checksums disabled by default. Compile with -DRBU_ENABLE_DELTA_CKSUM +** to enable checksum verification. +*/ +#ifndef RBU_ENABLE_DELTA_CKSUM +# define RBU_ENABLE_DELTA_CKSUM 0 +#endif + +/* +** Swap two objects of type TYPE. +*/ +#if !defined(SQLITE_AMALGAMATION) +# define SWAP(TYPE,A,B) {TYPE t=A; A=B; B=t;} +#endif + +/* +** The rbu_state table is used to save the state of a partially applied +** update so that it can be resumed later. The table consists of integer +** keys mapped to values as follows: +** +** RBU_STATE_STAGE: +** May be set to integer values 1, 2, 4 or 5. As follows: +** 1: the *-rbu file is currently under construction. +** 2: the *-rbu file has been constructed, but not yet moved +** to the *-wal path. +** 4: the checkpoint is underway. +** 5: the rbu update has been checkpointed. +** +** RBU_STATE_TBL: +** Only valid if STAGE==1. The target database name of the table +** currently being written. +** +** RBU_STATE_IDX: +** Only valid if STAGE==1. The target database name of the index +** currently being written, or NULL if the main table is currently being +** updated. +** +** RBU_STATE_ROW: +** Only valid if STAGE==1. Number of rows already processed for the current +** table/index. +** +** RBU_STATE_PROGRESS: +** Trbul number of sqlite3rbu_step() calls made so far as part of this +** rbu update. +** +** RBU_STATE_CKPT: +** Valid if STAGE==4. The 64-bit checksum associated with the wal-index +** header created by recovering the *-wal file. This is used to detect +** cases when another client appends frames to the *-wal file in the +** middle of an incremental checkpoint (an incremental checkpoint cannot +** be continued if this happens). +** +** RBU_STATE_COOKIE: +** Valid if STAGE==1. The current change-counter cookie value in the +** target db file. +** +** RBU_STATE_OALSZ: +** Valid if STAGE==1. The size in bytes of the *-oal file. +** +** RBU_STATE_DATATBL: +** Only valid if STAGE==1. The RBU database name of the table +** currently being read. +*/ +#define RBU_STATE_STAGE 1 +#define RBU_STATE_TBL 2 +#define RBU_STATE_IDX 3 +#define RBU_STATE_ROW 4 +#define RBU_STATE_PROGRESS 5 +#define RBU_STATE_CKPT 6 +#define RBU_STATE_COOKIE 7 +#define RBU_STATE_OALSZ 8 +#define RBU_STATE_PHASEONESTEP 9 +#define RBU_STATE_DATATBL 10 + +#define RBU_STAGE_OAL 1 +#define RBU_STAGE_MOVE 2 +#define RBU_STAGE_CAPTURE 3 +#define RBU_STAGE_CKPT 4 +#define RBU_STAGE_DONE 5 + + +#define RBU_CREATE_STATE \ + "CREATE TABLE IF NOT EXISTS %s.rbu_state(k INTEGER PRIMARY KEY, v)" + +typedef struct RbuFrame RbuFrame; +typedef struct RbuObjIter RbuObjIter; +typedef struct RbuState RbuState; +typedef struct rbu_vfs rbu_vfs; +typedef struct rbu_file rbu_file; +typedef struct RbuUpdateStmt RbuUpdateStmt; + +#if !defined(SQLITE_AMALGAMATION) +typedef unsigned int u32; +typedef unsigned short u16; +typedef unsigned char u8; +typedef sqlite3_int64 i64; +#endif + +/* +** These values must match the values defined in wal.c for the equivalent +** locks. These are not magic numbers as they are part of the SQLite file +** format. +*/ +#define WAL_LOCK_WRITE 0 +#define WAL_LOCK_CKPT 1 +#define WAL_LOCK_READ0 3 + +#define SQLITE_FCNTL_RBUCNT 5149216 + +/* +** A structure to store values read from the rbu_state table in memory. +*/ +struct RbuState { + int eStage; + char *zTbl; + char *zDataTbl; + char *zIdx; + i64 iWalCksum; + int nRow; + i64 nProgress; + u32 iCookie; + i64 iOalSz; + i64 nPhaseOneStep; +}; + +struct RbuUpdateStmt { + char *zMask; /* Copy of update mask used with pUpdate */ + sqlite3_stmt *pUpdate; /* Last update statement (or NULL) */ + RbuUpdateStmt *pNext; +}; + +/* +** An iterator of this type is used to iterate through all objects in +** the target database that require updating. For each such table, the +** iterator visits, in order: +** +** * the table itself, +** * each index of the table (zero or more points to visit), and +** * a special "cleanup table" state. +** +** abIndexed: +** If the table has no indexes on it, abIndexed is set to NULL. Otherwise, +** it points to an array of flags nTblCol elements in size. The flag is +** set for each column that is either a part of the PK or a part of an +** index. Or clear otherwise. +** +*/ +struct RbuObjIter { + sqlite3_stmt *pTblIter; /* Iterate through tables */ + sqlite3_stmt *pIdxIter; /* Index iterator */ + int nTblCol; /* Size of azTblCol[] array */ + char **azTblCol; /* Array of unquoted target column names */ + char **azTblType; /* Array of target column types */ + int *aiSrcOrder; /* src table col -> target table col */ + u8 *abTblPk; /* Array of flags, set on target PK columns */ + u8 *abNotNull; /* Array of flags, set on NOT NULL columns */ + u8 *abIndexed; /* Array of flags, set on indexed & PK cols */ + int eType; /* Table type - an RBU_PK_XXX value */ + + /* Output variables. zTbl==0 implies EOF. */ + int bCleanup; /* True in "cleanup" state */ + const char *zTbl; /* Name of target db table */ + const char *zDataTbl; /* Name of rbu db table (or null) */ + const char *zIdx; /* Name of target db index (or null) */ + int iTnum; /* Root page of current object */ + int iPkTnum; /* If eType==EXTERNAL, root of PK index */ + int bUnique; /* Current index is unique */ + int nIndex; /* Number of aux. indexes on table zTbl */ + + /* Statements created by rbuObjIterPrepareAll() */ + int nCol; /* Number of columns in current object */ + sqlite3_stmt *pSelect; /* Source data */ + sqlite3_stmt *pInsert; /* Statement for INSERT operations */ + sqlite3_stmt *pDelete; /* Statement for DELETE ops */ + sqlite3_stmt *pTmpInsert; /* Insert into rbu_tmp_$zDataTbl */ + + /* Last UPDATE used (for PK b-tree updates only), or NULL. */ + RbuUpdateStmt *pRbuUpdate; +}; + +/* +** Values for RbuObjIter.eType +** +** 0: Table does not exist (error) +** 1: Table has an implicit rowid. +** 2: Table has an explicit IPK column. +** 3: Table has an external PK index. +** 4: Table is WITHOUT ROWID. +** 5: Table is a virtual table. +*/ +#define RBU_PK_NOTABLE 0 +#define RBU_PK_NONE 1 +#define RBU_PK_IPK 2 +#define RBU_PK_EXTERNAL 3 +#define RBU_PK_WITHOUT_ROWID 4 +#define RBU_PK_VTAB 5 + + +/* +** Within the RBU_STAGE_OAL stage, each call to sqlite3rbu_step() performs +** one of the following operations. +*/ +#define RBU_INSERT 1 /* Insert on a main table b-tree */ +#define RBU_DELETE 2 /* Delete a row from a main table b-tree */ +#define RBU_REPLACE 3 /* Delete and then insert a row */ +#define RBU_IDX_DELETE 4 /* Delete a row from an aux. index b-tree */ +#define RBU_IDX_INSERT 5 /* Insert on an aux. index b-tree */ + +#define RBU_UPDATE 6 /* Update a row in a main table b-tree */ + +/* +** A single step of an incremental checkpoint - frame iWalFrame of the wal +** file should be copied to page iDbPage of the database file. +*/ +struct RbuFrame { + u32 iDbPage; + u32 iWalFrame; +}; + +/* +** RBU handle. +** +** nPhaseOneStep: +** If the RBU database contains an rbu_count table, this value is set to +** a running estimate of the number of b-tree operations required to +** finish populating the *-oal file. This allows the sqlite3_bp_progress() +** API to calculate the permyriadage progress of populating the *-oal file +** using the formula: +** +** permyriadage = (10000 * nProgress) / nPhaseOneStep +** +** nPhaseOneStep is initialized to the sum of: +** +** nRow * (nIndex + 1) +** +** for all source tables in the RBU database, where nRow is the number +** of rows in the source table and nIndex the number of indexes on the +** corresponding target database table. +** +** This estimate is accurate if the RBU update consists entirely of +** INSERT operations. However, it is inaccurate if: +** +** * the RBU update contains any UPDATE operations. If the PK specified +** for an UPDATE operation does not exist in the target table, then +** no b-tree operations are required on index b-trees. Or if the +** specified PK does exist, then (nIndex*2) such operations are +** required (one delete and one insert on each index b-tree). +** +** * the RBU update contains any DELETE operations for which the specified +** PK does not exist. In this case no operations are required on index +** b-trees. +** +** * the RBU update contains REPLACE operations. These are similar to +** UPDATE operations. +** +** nPhaseOneStep is updated to account for the conditions above during the +** first pass of each source table. The updated nPhaseOneStep value is +** stored in the rbu_state table if the RBU update is suspended. +*/ +struct sqlite3rbu { + int eStage; /* Value of RBU_STATE_STAGE field */ + sqlite3 *dbMain; /* target database handle */ + sqlite3 *dbRbu; /* rbu database handle */ + char *zTarget; /* Path to target db */ + char *zRbu; /* Path to rbu db */ + char *zState; /* Path to state db (or NULL if zRbu) */ + char zStateDb[5]; /* Db name for state ("stat" or "main") */ + int rc; /* Value returned by last rbu_step() call */ + char *zErrmsg; /* Error message if rc!=SQLITE_OK */ + int nStep; /* Rows processed for current object */ + int nProgress; /* Rows processed for all objects */ + RbuObjIter objiter; /* Iterator for skipping through tbl/idx */ + const char *zVfsName; /* Name of automatically created rbu vfs */ + rbu_file *pTargetFd; /* File handle open on target db */ + int nPagePerSector; /* Pages per sector for pTargetFd */ + i64 iOalSz; + i64 nPhaseOneStep; + + /* The following state variables are used as part of the incremental + ** checkpoint stage (eStage==RBU_STAGE_CKPT). See comments surrounding + ** function rbuSetupCheckpoint() for details. */ + u32 iMaxFrame; /* Largest iWalFrame value in aFrame[] */ + u32 mLock; + int nFrame; /* Entries in aFrame[] array */ + int nFrameAlloc; /* Allocated size of aFrame[] array */ + RbuFrame *aFrame; + int pgsz; + u8 *aBuf; + i64 iWalCksum; + i64 szTemp; /* Current size of all temp files in use */ + i64 szTempLimit; /* Total size limit for temp files */ + + /* Used in RBU vacuum mode only */ + int nRbu; /* Number of RBU VFS in the stack */ + rbu_file *pRbuFd; /* Fd for main db of dbRbu */ +}; + +/* +** An rbu VFS is implemented using an instance of this structure. +** +** Variable pRbu is only non-NULL for automatically created RBU VFS objects. +** It is NULL for RBU VFS objects created explicitly using +** sqlite3rbu_create_vfs(). It is used to track the total amount of temp +** space used by the RBU handle. +*/ +struct rbu_vfs { + sqlite3_vfs base; /* rbu VFS shim methods */ + sqlite3_vfs *pRealVfs; /* Underlying VFS */ + sqlite3_mutex *mutex; /* Mutex to protect pMain */ + sqlite3rbu *pRbu; /* Owner RBU object */ + rbu_file *pMain; /* Linked list of main db files */ +}; + +/* +** Each file opened by an rbu VFS is represented by an instance of +** the following structure. +** +** If this is a temporary file (pRbu!=0 && flags&DELETE_ON_CLOSE), variable +** "sz" is set to the current size of the database file. +*/ +struct rbu_file { + sqlite3_file base; /* sqlite3_file methods */ + sqlite3_file *pReal; /* Underlying file handle */ + rbu_vfs *pRbuVfs; /* Pointer to the rbu_vfs object */ + sqlite3rbu *pRbu; /* Pointer to rbu object (rbu target only) */ + i64 sz; /* Size of file in bytes (temp only) */ + + int openFlags; /* Flags this file was opened with */ + u32 iCookie; /* Cookie value for main db files */ + u8 iWriteVer; /* "write-version" value for main db files */ + u8 bNolock; /* True to fail EXCLUSIVE locks */ + + int nShm; /* Number of entries in apShm[] array */ + char **apShm; /* Array of mmap'd *-shm regions */ + char *zDel; /* Delete this when closing file */ + + const char *zWal; /* Wal filename for this main db file */ + rbu_file *pWalFd; /* Wal file descriptor for this main db */ + rbu_file *pMainNext; /* Next MAIN_DB file */ +}; + +/* +** True for an RBU vacuum handle, or false otherwise. +*/ +#define rbuIsVacuum(p) ((p)->zTarget==0) + + +/************************************************************************* +** The following three functions, found below: +** +** rbuDeltaGetInt() +** rbuDeltaChecksum() +** rbuDeltaApply() +** +** are lifted from the fossil source code (http://fossil-scm.org). They +** are used to implement the scalar SQL function rbu_fossil_delta(). +*/ + +/* +** Read bytes from *pz and convert them into a positive integer. When +** finished, leave *pz pointing to the first character past the end of +** the integer. The *pLen parameter holds the length of the string +** in *pz and is decremented once for each character in the integer. +*/ +static unsigned int rbuDeltaGetInt(const char **pz, int *pLen){ + static const signed char zValue[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, + -1, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1, + }; + unsigned int v = 0; + int c; + unsigned char *z = (unsigned char*)*pz; + unsigned char *zStart = z; + while( (c = zValue[0x7f&*(z++)])>=0 ){ + v = (v<<6) + c; + } + z--; + *pLen -= z - zStart; + *pz = (char*)z; + return v; +} + +#if RBU_ENABLE_DELTA_CKSUM +/* +** Compute a 32-bit checksum on the N-byte buffer. Return the result. +*/ +static unsigned int rbuDeltaChecksum(const char *zIn, size_t N){ + const unsigned char *z = (const unsigned char *)zIn; + unsigned sum0 = 0; + unsigned sum1 = 0; + unsigned sum2 = 0; + unsigned sum3 = 0; + while(N >= 16){ + sum0 += ((unsigned)z[0] + z[4] + z[8] + z[12]); + sum1 += ((unsigned)z[1] + z[5] + z[9] + z[13]); + sum2 += ((unsigned)z[2] + z[6] + z[10]+ z[14]); + sum3 += ((unsigned)z[3] + z[7] + z[11]+ z[15]); + z += 16; + N -= 16; + } + while(N >= 4){ + sum0 += z[0]; + sum1 += z[1]; + sum2 += z[2]; + sum3 += z[3]; + z += 4; + N -= 4; + } + sum3 += (sum2 << 8) + (sum1 << 16) + (sum0 << 24); + switch(N){ + case 3: sum3 += (z[2] << 8); + case 2: sum3 += (z[1] << 16); + case 1: sum3 += (z[0] << 24); + default: ; + } + return sum3; +} +#endif + +/* +** Apply a delta. +** +** The output buffer should be big enough to hold the whole output +** file and a NUL terminator at the end. The delta_output_size() +** routine will determine this size for you. +** +** The delta string should be null-terminated. But the delta string +** may contain embedded NUL characters (if the input and output are +** binary files) so we also have to pass in the length of the delta in +** the lenDelta parameter. +** +** This function returns the size of the output file in bytes (excluding +** the final NUL terminator character). Except, if the delta string is +** malformed or intended for use with a source file other than zSrc, +** then this routine returns -1. +** +** Refer to the delta_create() documentation above for a description +** of the delta file format. +*/ +static int rbuDeltaApply( + const char *zSrc, /* The source or pattern file */ + int lenSrc, /* Length of the source file */ + const char *zDelta, /* Delta to apply to the pattern */ + int lenDelta, /* Length of the delta */ + char *zOut /* Write the output into this preallocated buffer */ +){ + unsigned int limit; + unsigned int total = 0; +#if RBU_ENABLE_DELTA_CKSUM + char *zOrigOut = zOut; +#endif + + limit = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + zDelta++; lenDelta--; + while( *zDelta && lenDelta>0 ){ + unsigned int cnt, ofst; + cnt = rbuDeltaGetInt(&zDelta, &lenDelta); + switch( zDelta[0] ){ + case '@': { + zDelta++; lenDelta--; + ofst = rbuDeltaGetInt(&zDelta, &lenDelta); + if( lenDelta>0 && zDelta[0]!=',' ){ + /* ERROR: copy command not terminated by ',' */ + return -1; + } + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: copy exceeds output file size */ + return -1; + } + if( (int)(ofst+cnt) > lenSrc ){ + /* ERROR: copy extends past end of input */ + return -1; + } + memcpy(zOut, &zSrc[ofst], cnt); + zOut += cnt; + break; + } + case ':': { + zDelta++; lenDelta--; + total += cnt; + if( total>limit ){ + /* ERROR: insert command gives an output larger than predicted */ + return -1; + } + if( (int)cnt>lenDelta ){ + /* ERROR: insert count exceeds size of delta */ + return -1; + } + memcpy(zOut, zDelta, cnt); + zOut += cnt; + zDelta += cnt; + lenDelta -= cnt; + break; + } + case ';': { + zDelta++; lenDelta--; + zOut[0] = 0; +#if RBU_ENABLE_DELTA_CKSUM + if( cnt!=rbuDeltaChecksum(zOrigOut, total) ){ + /* ERROR: bad checksum */ + return -1; + } +#endif + if( total!=limit ){ + /* ERROR: generated size does not match predicted size */ + return -1; + } + return total; + } + default: { + /* ERROR: unknown delta operator */ + return -1; + } + } + } + /* ERROR: unterminated delta */ + return -1; +} + +static int rbuDeltaOutputSize(const char *zDelta, int lenDelta){ + int size; + size = rbuDeltaGetInt(&zDelta, &lenDelta); + if( *zDelta!='\n' ){ + /* ERROR: size integer not terminated by "\n" */ + return -1; + } + return size; +} + +/* +** End of code taken from fossil. +*************************************************************************/ + +/* +** Implementation of SQL scalar function rbu_fossil_delta(). +** +** This function applies a fossil delta patch to a blob. Exactly two +** arguments must be passed to this function. The first is the blob to +** patch and the second the patch to apply. If no error occurs, this +** function returns the patched blob. +*/ +static void rbuFossilDeltaFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *aDelta; + int nDelta; + const char *aOrig; + int nOrig; + + int nOut; + int nOut2; + char *aOut; + + assert( argc==2 ); + + nOrig = sqlite3_value_bytes(argv[0]); + aOrig = (const char*)sqlite3_value_blob(argv[0]); + nDelta = sqlite3_value_bytes(argv[1]); + aDelta = (const char*)sqlite3_value_blob(argv[1]); + + /* Figure out the size of the output */ + nOut = rbuDeltaOutputSize(aDelta, nDelta); + if( nOut<0 ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + return; + } + + aOut = sqlite3_malloc(nOut+1); + if( aOut==0 ){ + sqlite3_result_error_nomem(context); + }else{ + nOut2 = rbuDeltaApply(aOrig, nOrig, aDelta, nDelta, aOut); + if( nOut2!=nOut ){ + sqlite3_result_error(context, "corrupt fossil delta", -1); + }else{ + sqlite3_result_blob(context, aOut, nOut, sqlite3_free); + } + } +} + + +/* +** Prepare the SQL statement in buffer zSql against database handle db. +** If successful, set *ppStmt to point to the new statement and return +** SQLITE_OK. +** +** Otherwise, if an error does occur, set *ppStmt to NULL and return +** an SQLite error code. Additionally, set output variable *pzErrmsg to +** point to a buffer containing an error message. It is the responsibility +** of the caller to (eventually) free this buffer using sqlite3_free(). +*/ +static int prepareAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + const char *zSql +){ + int rc = sqlite3_prepare_v2(db, zSql, -1, ppStmt, 0); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + *ppStmt = 0; + } + return rc; +} + +/* +** Reset the SQL statement passed as the first argument. Return a copy +** of the value returned by sqlite3_reset(). +** +** If an error has occurred, then set *pzErrmsg to point to a buffer +** containing an error message. It is the responsibility of the caller +** to eventually free this buffer using sqlite3_free(). +*/ +static int resetAndCollectError(sqlite3_stmt *pStmt, char **pzErrmsg){ + int rc = sqlite3_reset(pStmt); + if( rc!=SQLITE_OK ){ + *pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(sqlite3_db_handle(pStmt))); + } + return rc; +} + +/* +** Unless it is NULL, argument zSql points to a buffer allocated using +** sqlite3_malloc containing an SQL statement. This function prepares the SQL +** statement against database db and frees the buffer. If statement +** compilation is successful, *ppStmt is set to point to the new statement +** handle and SQLITE_OK is returned. +** +** Otherwise, if an error occurs, *ppStmt is set to NULL and an error code +** returned. In this case, *pzErrmsg may also be set to point to an error +** message. It is the responsibility of the caller to free this error message +** buffer using sqlite3_free(). +** +** If argument zSql is NULL, this function assumes that an OOM has occurred. +** In this case SQLITE_NOMEM is returned and *ppStmt set to NULL. +*/ +static int prepareFreeAndCollectError( + sqlite3 *db, + sqlite3_stmt **ppStmt, + char **pzErrmsg, + char *zSql +){ + int rc; + assert( *pzErrmsg==0 ); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + *ppStmt = 0; + }else{ + rc = prepareAndCollectError(db, ppStmt, pzErrmsg, zSql); + sqlite3_free(zSql); + } + return rc; +} + +/* +** Free the RbuObjIter.azTblCol[] and RbuObjIter.abTblPk[] arrays allocated +** by an earlier call to rbuObjIterCacheTableInfo(). +*/ +static void rbuObjIterFreeCols(RbuObjIter *pIter){ + int i; + for(i=0; i<pIter->nTblCol; i++){ + sqlite3_free(pIter->azTblCol[i]); + sqlite3_free(pIter->azTblType[i]); + } + sqlite3_free(pIter->azTblCol); + pIter->azTblCol = 0; + pIter->azTblType = 0; + pIter->aiSrcOrder = 0; + pIter->abTblPk = 0; + pIter->abNotNull = 0; + pIter->nTblCol = 0; + pIter->eType = 0; /* Invalid value */ +} + +/* +** Finalize all statements and free all allocations that are specific to +** the current object (table/index pair). +*/ +static void rbuObjIterClearStatements(RbuObjIter *pIter){ + RbuUpdateStmt *pUp; + + sqlite3_finalize(pIter->pSelect); + sqlite3_finalize(pIter->pInsert); + sqlite3_finalize(pIter->pDelete); + sqlite3_finalize(pIter->pTmpInsert); + pUp = pIter->pRbuUpdate; + while( pUp ){ + RbuUpdateStmt *pTmp = pUp->pNext; + sqlite3_finalize(pUp->pUpdate); + sqlite3_free(pUp); + pUp = pTmp; + } + + pIter->pSelect = 0; + pIter->pInsert = 0; + pIter->pDelete = 0; + pIter->pRbuUpdate = 0; + pIter->pTmpInsert = 0; + pIter->nCol = 0; +} + +/* +** Clean up any resources allocated as part of the iterator object passed +** as the only argument. +*/ +static void rbuObjIterFinalize(RbuObjIter *pIter){ + rbuObjIterClearStatements(pIter); + sqlite3_finalize(pIter->pTblIter); + sqlite3_finalize(pIter->pIdxIter); + rbuObjIterFreeCols(pIter); + memset(pIter, 0, sizeof(RbuObjIter)); +} + +/* +** Advance the iterator to the next position. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the next entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){ + int rc = p->rc; + if( rc==SQLITE_OK ){ + + /* Free any SQLite statements used while processing the previous object */ + rbuObjIterClearStatements(pIter); + if( pIter->zIdx==0 ){ + rc = sqlite3_exec(p->dbMain, + "DROP TRIGGER IF EXISTS temp.rbu_insert_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update1_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_update2_tr;" + "DROP TRIGGER IF EXISTS temp.rbu_delete_tr;" + , 0, 0, &p->zErrmsg + ); + } + + if( rc==SQLITE_OK ){ + if( pIter->bCleanup ){ + rbuObjIterFreeCols(pIter); + pIter->bCleanup = 0; + rc = sqlite3_step(pIter->pTblIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pTblIter, &p->zErrmsg); + pIter->zTbl = 0; + }else{ + pIter->zTbl = (const char*)sqlite3_column_text(pIter->pTblIter, 0); + pIter->zDataTbl = (const char*)sqlite3_column_text(pIter->pTblIter,1); + rc = (pIter->zDataTbl && pIter->zTbl) ? SQLITE_OK : SQLITE_NOMEM; + } + }else{ + if( pIter->zIdx==0 ){ + sqlite3_stmt *pIdx = pIter->pIdxIter; + rc = sqlite3_bind_text(pIdx, 1, pIter->zTbl, -1, SQLITE_STATIC); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_step(pIter->pIdxIter); + if( rc!=SQLITE_ROW ){ + rc = resetAndCollectError(pIter->pIdxIter, &p->zErrmsg); + pIter->bCleanup = 1; + pIter->zIdx = 0; + }else{ + pIter->zIdx = (const char*)sqlite3_column_text(pIter->pIdxIter, 0); + pIter->iTnum = sqlite3_column_int(pIter->pIdxIter, 1); + pIter->bUnique = sqlite3_column_int(pIter->pIdxIter, 2); + rc = pIter->zIdx ? SQLITE_OK : SQLITE_NOMEM; + } + } + } + } + } + + if( rc!=SQLITE_OK ){ + rbuObjIterFinalize(pIter); + p->rc = rc; + } + return rc; +} + + +/* +** The implementation of the rbu_target_name() SQL function. This function +** accepts one or two arguments. The first argument is the name of a table - +** the name of a table in the RBU database. The second, if it is present, is 1 +** for a view or 0 for a table. +** +** For a non-vacuum RBU handle, if the table name matches the pattern: +** +** data[0-9]_<name> +** +** where <name> is any sequence of 1 or more characters, <name> is returned. +** Otherwise, if the only argument does not match the above pattern, an SQL +** NULL is returned. +** +** "data_t1" -> "t1" +** "data0123_t2" -> "t2" +** "dataAB_t3" -> NULL +** +** For an rbu vacuum handle, a copy of the first argument is returned if +** the second argument is either missing or 0 (not a view). +*/ +static void rbuTargetNameFunc( + sqlite3_context *pCtx, + int argc, + sqlite3_value **argv +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + const char *zIn; + assert( argc==1 || argc==2 ); + + zIn = (const char*)sqlite3_value_text(argv[0]); + if( zIn ){ + if( rbuIsVacuum(p) ){ + if( argc==1 || 0==sqlite3_value_int(argv[1]) ){ + sqlite3_result_text(pCtx, zIn, -1, SQLITE_STATIC); + } + }else{ + if( strlen(zIn)>4 && memcmp("data", zIn, 4)==0 ){ + int i; + for(i=4; zIn[i]>='0' && zIn[i]<='9'; i++); + if( zIn[i]=='_' && zIn[i+1] ){ + sqlite3_result_text(pCtx, &zIn[i+1], -1, SQLITE_STATIC); + } + } + } + } +} + +/* +** Initialize the iterator structure passed as the second argument. +** +** If no error occurs, SQLITE_OK is returned and the iterator is left +** pointing to the first entry. Otherwise, an error code and message is +** left in the RBU handle passed as the first argument. A copy of the +** error code is returned. +*/ +static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){ + int rc; + memset(pIter, 0, sizeof(RbuObjIter)); + + rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg, + sqlite3_mprintf( + "SELECT rbu_target_name(name, type='view') AS target, name " + "FROM sqlite_master " + "WHERE type IN ('table', 'view') AND target IS NOT NULL " + " %s " + "ORDER BY name" + , rbuIsVacuum(p) ? "AND rootpage!=0 AND rootpage IS NOT NULL" : "")); + + if( rc==SQLITE_OK ){ + rc = prepareAndCollectError(p->dbMain, &pIter->pIdxIter, &p->zErrmsg, + "SELECT name, rootpage, sql IS NULL OR substr(8, 6)=='UNIQUE' " + " FROM main.sqlite_master " + " WHERE type='index' AND tbl_name = ?" + ); + } + + pIter->bCleanup = 1; + p->rc = rc; + return rbuObjIterNext(p, pIter); +} + +/* +** This is a wrapper around "sqlite3_mprintf(zFmt, ...)". If an OOM occurs, +** an error code is stored in the RBU handle passed as the first argument. +** +** If an error has already occurred (p->rc is already set to something other +** than SQLITE_OK), then this function returns NULL without modifying the +** stored error code. In this case it still calls sqlite3_free() on any +** printf() parameters associated with %z conversions. +*/ +static char *rbuMPrintf(sqlite3rbu *p, const char *zFmt, ...){ + char *zSql = 0; + va_list ap; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ) p->rc = SQLITE_NOMEM; + }else{ + sqlite3_free(zSql); + zSql = 0; + } + va_end(ap); + return zSql; +} + +/* +** Argument zFmt is a sqlite3_mprintf() style format string. The trailing +** arguments are the usual subsitution values. This function performs +** the printf() style substitutions and executes the result as an SQL +** statement on the RBU handles database. +** +** If an error occurs, an error code and error message is stored in the +** RBU handle. If an error has already occurred when this function is +** called, it is a no-op. +*/ +static int rbuMPrintfExec(sqlite3rbu *p, sqlite3 *db, const char *zFmt, ...){ + va_list ap; + char *zSql; + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( p->rc==SQLITE_OK ){ + if( zSql==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + p->rc = sqlite3_exec(db, zSql, 0, 0, &p->zErrmsg); + } + } + sqlite3_free(zSql); + va_end(ap); + return p->rc; +} + +/* +** Attempt to allocate and return a pointer to a zeroed block of nByte +** bytes. +** +** If an error (i.e. an OOM condition) occurs, return NULL and leave an +** error code in the rbu handle passed as the first argument. Or, if an +** error has already occurred when this function is called, return NULL +** immediately without attempting the allocation or modifying the stored +** error code. +*/ +static void *rbuMalloc(sqlite3rbu *p, int nByte){ + void *pRet = 0; + if( p->rc==SQLITE_OK ){ + assert( nByte>0 ); + pRet = sqlite3_malloc64(nByte); + if( pRet==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + } + } + return pRet; +} + + +/* +** Allocate and zero the pIter->azTblCol[] and abTblPk[] arrays so that +** there is room for at least nCol elements. If an OOM occurs, store an +** error code in the RBU handle passed as the first argument. +*/ +static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ + int nByte = (2*sizeof(char*) + sizeof(int) + 3*sizeof(u8)) * nCol; + char **azNew; + + azNew = (char**)rbuMalloc(p, nByte); + if( azNew ){ + pIter->azTblCol = azNew; + pIter->azTblType = &azNew[nCol]; + pIter->aiSrcOrder = (int*)&pIter->azTblType[nCol]; + pIter->abTblPk = (u8*)&pIter->aiSrcOrder[nCol]; + pIter->abNotNull = (u8*)&pIter->abTblPk[nCol]; + pIter->abIndexed = (u8*)&pIter->abNotNull[nCol]; + } +} + +/* +** The first argument must be a nul-terminated string. This function +** returns a copy of the string in memory obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free this memory +** using sqlite3_free(). +** +** If an OOM condition is encountered when attempting to allocate memory, +** output variable (*pRc) is set to SQLITE_NOMEM before returning. Otherwise, +** if the allocation succeeds, (*pRc) is left unchanged. +*/ +static char *rbuStrndup(const char *zStr, int *pRc){ + char *zRet = 0; + + assert( *pRc==SQLITE_OK ); + if( zStr ){ + size_t nCopy = strlen(zStr) + 1; + zRet = (char*)sqlite3_malloc64(nCopy); + if( zRet ){ + memcpy(zRet, zStr, nCopy); + }else{ + *pRc = SQLITE_NOMEM; + } + } + + return zRet; +} + +/* +** Finalize the statement passed as the second argument. +** +** If the sqlite3_finalize() call indicates that an error occurs, and the +** rbu handle error code is not already set, set the error code and error +** message accordingly. +*/ +static void rbuFinalize(sqlite3rbu *p, sqlite3_stmt *pStmt){ + sqlite3 *db = sqlite3_db_handle(pStmt); + int rc = sqlite3_finalize(pStmt); + if( p->rc==SQLITE_OK && rc!=SQLITE_OK ){ + p->rc = rc; + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + } +} + +/* Determine the type of a table. +** +** peType is of type (int*), a pointer to an output parameter of type +** (int). This call sets the output parameter as follows, depending +** on the type of the table specified by parameters dbName and zTbl. +** +** RBU_PK_NOTABLE: No such table. +** RBU_PK_NONE: Table has an implicit rowid. +** RBU_PK_IPK: Table has an explicit IPK column. +** RBU_PK_EXTERNAL: Table has an external PK index. +** RBU_PK_WITHOUT_ROWID: Table is WITHOUT ROWID. +** RBU_PK_VTAB: Table is a virtual table. +** +** Argument *piPk is also of type (int*), and also points to an output +** parameter. Unless the table has an external primary key index +** (i.e. unless *peType is set to 3), then *piPk is set to zero. Or, +** if the table does have an external primary key index, then *piPk +** is set to the root page number of the primary key index before +** returning. +** +** ALGORITHM: +** +** if( no entry exists in sqlite_master ){ +** return RBU_PK_NOTABLE +** }else if( sql for the entry starts with "CREATE VIRTUAL" ){ +** return RBU_PK_VTAB +** }else if( "PRAGMA index_list()" for the table contains a "pk" index ){ +** if( the index that is the pk exists in sqlite_master ){ +** *piPK = rootpage of that index. +** return RBU_PK_EXTERNAL +** }else{ +** return RBU_PK_WITHOUT_ROWID +** } +** }else if( "PRAGMA table_info()" lists one or more "pk" columns ){ +** return RBU_PK_IPK +** }else{ +** return RBU_PK_NONE +** } +*/ +static void rbuTableType( + sqlite3rbu *p, + const char *zTab, + int *peType, + int *piTnum, + int *piPk +){ + /* + ** 0) SELECT count(*) FROM sqlite_master where name=%Q AND IsVirtual(%Q) + ** 1) PRAGMA index_list = ? + ** 2) SELECT count(*) FROM sqlite_master where name=%Q + ** 3) PRAGMA table_info = ? + */ + sqlite3_stmt *aStmt[4] = {0, 0, 0, 0}; + + *peType = RBU_PK_NOTABLE; + *piPk = 0; + + assert( p->rc==SQLITE_OK ); + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[0], &p->zErrmsg, + sqlite3_mprintf( + "SELECT (sql LIKE 'create virtual%%'), rootpage" + " FROM sqlite_master" + " WHERE name=%Q", zTab + )); + if( p->rc!=SQLITE_OK || sqlite3_step(aStmt[0])!=SQLITE_ROW ){ + /* Either an error, or no such table. */ + goto rbuTableType_end; + } + if( sqlite3_column_int(aStmt[0], 0) ){ + *peType = RBU_PK_VTAB; /* virtual table */ + goto rbuTableType_end; + } + *piTnum = sqlite3_column_int(aStmt[0], 1); + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[1], &p->zErrmsg, + sqlite3_mprintf("PRAGMA index_list=%Q",zTab) + ); + if( p->rc ) goto rbuTableType_end; + while( sqlite3_step(aStmt[1])==SQLITE_ROW ){ + const u8 *zOrig = sqlite3_column_text(aStmt[1], 3); + const u8 *zIdx = sqlite3_column_text(aStmt[1], 1); + if( zOrig && zIdx && zOrig[0]=='p' ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[2], &p->zErrmsg, + sqlite3_mprintf( + "SELECT rootpage FROM sqlite_master WHERE name = %Q", zIdx + )); + if( p->rc==SQLITE_OK ){ + if( sqlite3_step(aStmt[2])==SQLITE_ROW ){ + *piPk = sqlite3_column_int(aStmt[2], 0); + *peType = RBU_PK_EXTERNAL; + }else{ + *peType = RBU_PK_WITHOUT_ROWID; + } + } + goto rbuTableType_end; + } + } + + p->rc = prepareFreeAndCollectError(p->dbMain, &aStmt[3], &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info=%Q",zTab) + ); + if( p->rc==SQLITE_OK ){ + while( sqlite3_step(aStmt[3])==SQLITE_ROW ){ + if( sqlite3_column_int(aStmt[3],5)>0 ){ + *peType = RBU_PK_IPK; /* explicit IPK column */ + goto rbuTableType_end; + } + } + *peType = RBU_PK_NONE; + } + +rbuTableType_end: { + unsigned int i; + for(i=0; i<sizeof(aStmt)/sizeof(aStmt[0]); i++){ + rbuFinalize(p, aStmt[i]); + } + } +} + +/* +** This is a helper function for rbuObjIterCacheTableInfo(). It populates +** the pIter->abIndexed[] array. +*/ +static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ + sqlite3_stmt *pList = 0; + int bIndex = 0; + + if( p->rc==SQLITE_OK ){ + memcpy(pIter->abIndexed, pIter->abTblPk, sizeof(u8)*pIter->nTblCol); + p->rc = prepareFreeAndCollectError(p->dbMain, &pList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + } + + pIter->nIndex = 0; + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pList) ){ + const char *zIdx = (const char*)sqlite3_column_text(pList, 1); + sqlite3_stmt *pXInfo = 0; + if( zIdx==0 ) break; + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + if( iCid>=0 ) pIter->abIndexed[iCid] = 1; + } + rbuFinalize(p, pXInfo); + bIndex = 1; + pIter->nIndex++; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + /* "PRAGMA index_list" includes the main PK b-tree */ + pIter->nIndex--; + } + + rbuFinalize(p, pList); + if( bIndex==0 ) pIter->abIndexed = 0; +} + + +/* +** If they are not already populated, populate the pIter->azTblCol[], +** pIter->abTblPk[], pIter->nTblCol and pIter->bRowid variables according to +** the table (not index) that the iterator currently points to. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. If +** an error does occur, an error code and error message are also left in +** the RBU handle. +*/ +static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){ + if( pIter->azTblCol==0 ){ + sqlite3_stmt *pStmt = 0; + int nCol = 0; + int i; /* for() loop iterator variable */ + int bRbuRowid = 0; /* If input table has column "rbu_rowid" */ + int iOrder = 0; + int iTnum = 0; + + /* Figure out the type of table this step will deal with. */ + assert( pIter->eType==0 ); + rbuTableType(p, pIter->zTbl, &pIter->eType, &iTnum, &pIter->iPkTnum); + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_NOTABLE ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("no such table: %s", pIter->zTbl); + } + if( p->rc ) return p->rc; + if( pIter->zIdx==0 ) pIter->iTnum = iTnum; + + assert( pIter->eType==RBU_PK_NONE || pIter->eType==RBU_PK_IPK + || pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_WITHOUT_ROWID + || pIter->eType==RBU_PK_VTAB + ); + + /* Populate the azTblCol[] and nTblCol variables based on the columns + ** of the input table. Ignore any input table columns that begin with + ** "rbu_". */ + p->rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT * FROM '%q'", pIter->zDataTbl) + ); + if( p->rc==SQLITE_OK ){ + nCol = sqlite3_column_count(pStmt); + rbuAllocateIterArrays(p, pIter, nCol); + } + for(i=0; p->rc==SQLITE_OK && i<nCol; i++){ + const char *zName = (const char*)sqlite3_column_name(pStmt, i); + if( sqlite3_strnicmp("rbu_", zName, 4) ){ + char *zCopy = rbuStrndup(zName, &p->rc); + pIter->aiSrcOrder[pIter->nTblCol] = pIter->nTblCol; + pIter->azTblCol[pIter->nTblCol++] = zCopy; + } + else if( 0==sqlite3_stricmp("rbu_rowid", zName) ){ + bRbuRowid = 1; + } + } + sqlite3_finalize(pStmt); + pStmt = 0; + + if( p->rc==SQLITE_OK + && rbuIsVacuum(p)==0 + && bRbuRowid!=(pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE) + ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf( + "table %q %s rbu_rowid column", pIter->zDataTbl, + (bRbuRowid ? "may not have" : "requires") + ); + } + + /* Check that all non-HIDDEN columns in the destination table are also + ** present in the input table. Populate the abTblPk[], azTblType[] and + ** aiTblOrder[] arrays at the same time. */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, + sqlite3_mprintf("PRAGMA table_info(%Q)", pIter->zTbl) + ); + } + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + const char *zName = (const char*)sqlite3_column_text(pStmt, 1); + if( zName==0 ) break; /* An OOM - finalize() below returns S_NOMEM */ + for(i=iOrder; i<pIter->nTblCol; i++){ + if( 0==strcmp(zName, pIter->azTblCol[i]) ) break; + } + if( i==pIter->nTblCol ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("column missing from %q: %s", + pIter->zDataTbl, zName + ); + }else{ + int iPk = sqlite3_column_int(pStmt, 5); + int bNotNull = sqlite3_column_int(pStmt, 3); + const char *zType = (const char*)sqlite3_column_text(pStmt, 2); + + if( i!=iOrder ){ + SWAP(int, pIter->aiSrcOrder[i], pIter->aiSrcOrder[iOrder]); + SWAP(char*, pIter->azTblCol[i], pIter->azTblCol[iOrder]); + } + + pIter->azTblType[iOrder] = rbuStrndup(zType, &p->rc); + pIter->abTblPk[iOrder] = (iPk!=0); + pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0); + iOrder++; + } + } + + rbuFinalize(p, pStmt); + rbuObjIterCacheIndexedCols(p, pIter); + assert( pIter->eType!=RBU_PK_VTAB || pIter->abIndexed==0 ); + assert( pIter->eType!=RBU_PK_VTAB || pIter->nIndex==0 ); + } + + return p->rc; +} + +/* +** This function constructs and returns a pointer to a nul-terminated +** string containing some SQL clause or list based on one or more of the +** column names currently stored in the pIter->azTblCol[] array. +*/ +static char *rbuObjIterGetCollist( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter /* Object iterator for column names */ +){ + char *zList = 0; + const char *zSep = ""; + int i; + for(i=0; i<pIter->nTblCol; i++){ + const char *z = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"", zList, zSep, z); + zSep = ", "; + } + return zList; +} + +/* +** This function is used to create a SELECT list (the list of SQL +** expressions that follows a SELECT keyword) for a SELECT statement +** used to read from an data_xxx or rbu_tmp_xxx table while updating the +** index object currently indicated by the iterator object passed as the +** second argument. A "PRAGMA index_xinfo = <idxname>" statement is used +** to obtain the required information. +** +** If the index is of the following form: +** +** CREATE INDEX i1 ON t1(c, b COLLATE nocase); +** +** and "t1" is a table with an explicit INTEGER PRIMARY KEY column +** "ipk", the returned string is: +** +** "`c` COLLATE 'BINARY', `b` COLLATE 'NOCASE', `ipk` COLLATE 'BINARY'" +** +** As well as the returned string, three other malloc'd strings are +** returned via output parameters. As follows: +** +** pzImposterCols: ... +** pzImposterPk: ... +** pzWhere: ... +*/ +static char *rbuObjIterGetIndexCols( + sqlite3rbu *p, /* RBU object */ + RbuObjIter *pIter, /* Object iterator for column names */ + char **pzImposterCols, /* OUT: Columns for imposter table */ + char **pzImposterPk, /* OUT: Imposter PK clause */ + char **pzWhere, /* OUT: WHERE clause */ + int *pnBind /* OUT: Trbul number of columns */ +){ + int rc = p->rc; /* Error code */ + int rc2; /* sqlite3_finalize() return code */ + char *zRet = 0; /* String to return */ + char *zImpCols = 0; /* String to return via *pzImposterCols */ + char *zImpPK = 0; /* String to return via *pzImposterPK */ + char *zWhere = 0; /* String to return via *pzWhere */ + int nBind = 0; /* Value to return via *pnBind */ + const char *zCom = ""; /* Set to ", " later on */ + const char *zAnd = ""; /* Set to " AND " later on */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = ? */ + + if( rc==SQLITE_OK ){ + assert( p->zErrmsg==0 ); + rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx) + ); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + const char *zCol; + const char *zType; + + if( iCid<0 ){ + /* An integer primary key. If the table has an explicit IPK, use + ** its name. Otherwise, use "rbu_rowid". */ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( i<pIter->nTblCol ); + zCol = pIter->azTblCol[i]; + }else if( rbuIsVacuum(p) ){ + zCol = "_rowid_"; + }else{ + zCol = "rbu_rowid"; + } + zType = "INTEGER"; + }else{ + zCol = pIter->azTblCol[iCid]; + zType = pIter->azTblType[iCid]; + } + + zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom, zCol, zCollate); + if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ + const char *zOrder = (bDesc ? " DESC" : ""); + zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", + zImpPK, zCom, nBind, zCol, zOrder + ); + } + zImpCols = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\" %s COLLATE %Q", + zImpCols, zCom, nBind, zCol, zType, zCollate + ); + zWhere = sqlite3_mprintf( + "%z%s\"rbu_imp_%d%w\" IS ?", zWhere, zAnd, nBind, zCol + ); + if( zRet==0 || zImpPK==0 || zImpCols==0 || zWhere==0 ) rc = SQLITE_NOMEM; + zCom = ", "; + zAnd = " AND "; + nBind++; + } + + rc2 = sqlite3_finalize(pXInfo); + if( rc==SQLITE_OK ) rc = rc2; + + if( rc!=SQLITE_OK ){ + sqlite3_free(zRet); + sqlite3_free(zImpCols); + sqlite3_free(zImpPK); + sqlite3_free(zWhere); + zRet = 0; + zImpCols = 0; + zImpPK = 0; + zWhere = 0; + p->rc = rc; + } + + *pzImposterCols = zImpCols; + *pzImposterPk = zImpPK; + *pzWhere = zWhere; + *pnBind = nBind; + return zRet; +} + +/* +** Assuming the current table columns are "a", "b" and "c", and the zObj +** paramter is passed "old", return a string of the form: +** +** "old.a, old.b, old.b" +** +** With the column names escaped. +** +** For tables with implicit rowids - RBU_PK_EXTERNAL and RBU_PK_NONE, append +** the text ", old._rowid_" to the returned value. +*/ +static char *rbuObjIterGetOldlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zObj +){ + char *zList = 0; + if( p->rc==SQLITE_OK && pIter->abIndexed ){ + const char *zS = ""; + int i; + for(i=0; i<pIter->nTblCol; i++){ + if( pIter->abIndexed[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = sqlite3_mprintf("%z%s%s.\"%w\"", zList, zS, zObj, zCol); + }else{ + zList = sqlite3_mprintf("%z%sNULL", zList, zS); + } + zS = ", "; + if( zList==0 ){ + p->rc = SQLITE_NOMEM; + break; + } + } + + /* For a table with implicit rowids, append "old._rowid_" to the list. */ + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "%z, %s._rowid_", zList, zObj); + } + } + return zList; +} + +/* +** Return an expression that can be used in a WHERE clause to match the +** primary key of the current table. For example, if the table is: +** +** CREATE TABLE t1(a, b, c, PRIMARY KEY(b, c)); +** +** Return the string: +** +** "b = ?1 AND c = ?2" +*/ +static char *rbuObjIterGetWhere( + sqlite3rbu *p, + RbuObjIter *pIter +){ + char *zList = 0; + if( pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE ){ + zList = rbuMPrintf(p, "_rowid_ = ?%d", pIter->nTblCol+1); + }else if( pIter->eType==RBU_PK_EXTERNAL ){ + const char *zSep = ""; + int i; + for(i=0; i<pIter->nTblCol; i++){ + if( pIter->abTblPk[i] ){ + zList = rbuMPrintf(p, "%z%sc%d=?%d", zList, zSep, i, i+1); + zSep = " AND "; + } + } + zList = rbuMPrintf(p, + "_rowid_ = (SELECT id FROM rbu_imposter2 WHERE %z)", zList + ); + + }else{ + const char *zSep = ""; + int i; + for(i=0; i<pIter->nTblCol; i++){ + if( pIter->abTblPk[i] ){ + const char *zCol = pIter->azTblCol[i]; + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", zList, zSep, zCol, i+1); + zSep = " AND "; + } + } + } + return zList; +} + +/* +** The SELECT statement iterating through the keys for the current object +** (p->objiter.pSelect) currently points to a valid row. However, there +** is something wrong with the rbu_control value in the rbu_control value +** stored in the (p->nCol+1)'th column. Set the error code and error message +** of the RBU handle to something reflecting this. +*/ +static void rbuBadControlError(sqlite3rbu *p){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid rbu_control value"); +} + + +/* +** Return a nul-terminated string containing the comma separated list of +** assignments that should be included following the "SET" keyword of +** an UPDATE statement used to update the table object that the iterator +** passed as the second argument currently points to if the rbu_control +** column of the data_xxx table entry is set to zMask. +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetSetlist( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zMask +){ + char *zList = 0; + if( p->rc==SQLITE_OK ){ + int i; + + if( (int)strlen(zMask)!=pIter->nTblCol ){ + rbuBadControlError(p); + }else{ + const char *zSep = ""; + for(i=0; i<pIter->nTblCol; i++){ + char c = zMask[pIter->aiSrcOrder[i]]; + if( c=='x' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=?%d", + zList, zSep, pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='d' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + else if( c=='f' ){ + zList = rbuMPrintf(p, "%z%s\"%w\"=rbu_fossil_delta(\"%w\", ?%d)", + zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1 + ); + zSep = ", "; + } + } + } + } + return zList; +} + +/* +** Return a nul-terminated string consisting of nByte comma separated +** "?" expressions. For example, if nByte is 3, return a pointer to +** a buffer containing the string "?,?,?". +** +** The memory for the returned string is obtained from sqlite3_malloc(). +** It is the responsibility of the caller to eventually free it using +** sqlite3_free(). +** +** If an OOM error is encountered when allocating space for the new +** string, an error code is left in the rbu handle passed as the first +** argument and NULL is returned. Or, if an error has already occurred +** when this function is called, NULL is returned immediately, without +** attempting the allocation or modifying the stored error code. +*/ +static char *rbuObjIterGetBindlist(sqlite3rbu *p, int nBind){ + char *zRet = 0; + int nByte = nBind*2 + 1; + + zRet = (char*)rbuMalloc(p, nByte); + if( zRet ){ + int i; + for(i=0; i<nBind; i++){ + zRet[i*2] = '?'; + zRet[i*2+1] = (i+1==nBind) ? '\0' : ','; + } + } + return zRet; +} + +/* +** The iterator currently points to a table (not index) of type +** RBU_PK_WITHOUT_ROWID. This function creates the PRIMARY KEY +** declaration for the corresponding imposter table. For example, +** if the iterator points to a table created as: +** +** CREATE TABLE t1(a, b, c, PRIMARY KEY(b, a DESC)) WITHOUT ROWID +** +** this function returns: +** +** PRIMARY KEY("b", "a" DESC) +*/ +static char *rbuWithoutRowidPK(sqlite3rbu *p, RbuObjIter *pIter){ + char *z = 0; + assert( pIter->zIdx==0 ); + if( p->rc==SQLITE_OK ){ + const char *zSep = "PRIMARY KEY("; + sqlite3_stmt *pXList = 0; /* PRAGMA index_list = (pIter->zTbl) */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA index_xinfo = <pk-index> */ + + p->rc = prepareFreeAndCollectError(p->dbMain, &pXList, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl) + ); + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXList) ){ + const char *zOrig = (const char*)sqlite3_column_text(pXList,3); + if( zOrig && strcmp(zOrig, "pk")==0 ){ + const char *zIdx = (const char*)sqlite3_column_text(pXList,1); + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + break; + } + } + rbuFinalize(p, pXList); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + if( sqlite3_column_int(pXInfo, 5) ){ + /* int iCid = sqlite3_column_int(pXInfo, 0); */ + const char *zCol = (const char*)sqlite3_column_text(pXInfo, 2); + const char *zDesc = sqlite3_column_int(pXInfo, 3) ? " DESC" : ""; + z = rbuMPrintf(p, "%z%s\"%w\"%s", z, zSep, zCol, zDesc); + zSep = ", "; + } + } + z = rbuMPrintf(p, "%z)", z); + rbuFinalize(p, pXInfo); + } + return z; +} + +/* +** This function creates the second imposter table used when writing to +** a table b-tree where the table has an external primary key. If the +** iterator passed as the second argument does not currently point to +** a table (not index) with an external primary key, this function is a +** no-op. +** +** Assuming the iterator does point to a table with an external PK, this +** function creates a WITHOUT ROWID imposter table named "rbu_imposter2" +** used to access that PK index. For example, if the target table is +** declared as follows: +** +** CREATE TABLE t1(a, b TEXT, c REAL, PRIMARY KEY(b, c)); +** +** then the imposter table schema is: +** +** CREATE TABLE rbu_imposter2(c1 TEXT, c2 REAL, id INTEGER) WITHOUT ROWID; +** +*/ +static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_EXTERNAL ){ + int tnum = pIter->iPkTnum; /* Root page of PK index */ + sqlite3_stmt *pQuery = 0; /* SELECT name ... WHERE rootpage = $tnum */ + const char *zIdx = 0; /* Name of PK index */ + sqlite3_stmt *pXInfo = 0; /* PRAGMA main.index_xinfo = $zIdx */ + const char *zComma = ""; + char *zCols = 0; /* Used to build up list of table cols */ + char *zPk = 0; /* Used to build up table PK declaration */ + + /* Figure out the name of the primary key index for the current table. + ** This is needed for the argument to "PRAGMA index_xinfo". Set + ** zIdx to point to a nul-terminated string containing this name. */ + p->rc = prepareAndCollectError(p->dbMain, &pQuery, &p->zErrmsg, + "SELECT name FROM sqlite_master WHERE rootpage = ?" + ); + if( p->rc==SQLITE_OK ){ + sqlite3_bind_int(pQuery, 1, tnum); + if( SQLITE_ROW==sqlite3_step(pQuery) ){ + zIdx = (const char*)sqlite3_column_text(pQuery, 0); + } + } + if( zIdx ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pXInfo, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", zIdx) + ); + } + rbuFinalize(p, pQuery); + + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ + int bKey = sqlite3_column_int(pXInfo, 5); + if( bKey ){ + int iCid = sqlite3_column_int(pXInfo, 1); + int bDesc = sqlite3_column_int(pXInfo, 3); + const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); + zCols = rbuMPrintf(p, "%z%sc%d %s COLLATE %Q", zCols, zComma, + iCid, pIter->azTblType[iCid], zCollate + ); + zPk = rbuMPrintf(p, "%z%sc%d%s", zPk, zComma, iCid, bDesc?" DESC":""); + zComma = ", "; + } + } + zCols = rbuMPrintf(p, "%z, id INTEGER", zCols); + rbuFinalize(p, pXInfo); + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE rbu_imposter2(%z, PRIMARY KEY(%z)) WITHOUT ROWID", + zCols, zPk + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** If an error has already occurred when this function is called, it +** immediately returns zero (without doing any work). Or, if an error +** occurs during the execution of this function, it sets the error code +** in the sqlite3rbu object indicated by the first argument and returns +** zero. +** +** The iterator passed as the second argument is guaranteed to point to +** a table (not an index) when this function is called. This function +** attempts to create any imposter table required to write to the main +** table b-tree of the table before returning. Non-zero is returned if +** an imposter table are created, or zero otherwise. +** +** An imposter table is required in all cases except RBU_PK_VTAB. Only +** virtual tables are written to directly. The imposter table has the +** same schema as the actual target table (less any UNIQUE constraints). +** More precisely, the "same schema" means the same columns, types, +** collation sequences. For tables that do not have an external PRIMARY +** KEY, it also means the same PRIMARY KEY declaration. +*/ +static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){ + if( p->rc==SQLITE_OK && pIter->eType!=RBU_PK_VTAB ){ + int tnum = pIter->iTnum; + const char *zComma = ""; + char *zSql = 0; + int iCol; + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + + for(iCol=0; p->rc==SQLITE_OK && iCol<pIter->nTblCol; iCol++){ + const char *zPk = ""; + const char *zCol = pIter->azTblCol[iCol]; + const char *zColl = 0; + + p->rc = sqlite3_table_column_metadata( + p->dbMain, "main", pIter->zTbl, zCol, 0, &zColl, 0, 0, 0 + ); + + if( pIter->eType==RBU_PK_IPK && pIter->abTblPk[iCol] ){ + /* If the target table column is an "INTEGER PRIMARY KEY", add + ** "PRIMARY KEY" to the imposter table column declaration. */ + zPk = "PRIMARY KEY "; + } + zSql = rbuMPrintf(p, "%z%s\"%w\" %s %sCOLLATE %Q%s", + zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl, + (pIter->abNotNull[iCol] ? " NOT NULL" : "") + ); + zComma = ", "; + } + + if( pIter->eType==RBU_PK_WITHOUT_ROWID ){ + char *zPk = rbuWithoutRowidPK(p, pIter); + if( zPk ){ + zSql = rbuMPrintf(p, "%z, %z", zSql, zPk); + } + } + + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1, tnum); + rbuMPrintfExec(p, p->dbMain, "CREATE TABLE \"rbu_imp_%w\"(%z)%s", + pIter->zTbl, zSql, + (pIter->eType==RBU_PK_WITHOUT_ROWID ? " WITHOUT ROWID" : "") + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + } +} + +/* +** Prepare a statement used to insert rows into the "rbu_tmp_xxx" table. +** Specifically a statement of the form: +** +** INSERT INTO rbu_tmp_xxx VALUES(?, ?, ? ...); +** +** The number of bound variables is equal to the number of columns in +** the target table, plus one (for the rbu_control column), plus one more +** (for the rbu_rowid column) if the target table is an implicit IPK or +** virtual table. +*/ +static void rbuObjIterPrepareTmpInsert( + sqlite3rbu *p, + RbuObjIter *pIter, + const char *zCollist, + const char *zRbuRowid +){ + int bRbuRowid = (pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE); + char *zBind = rbuObjIterGetBindlist(p, pIter->nTblCol + 1 + bRbuRowid); + if( zBind ){ + assert( pIter->pTmpInsert==0 ); + p->rc = prepareFreeAndCollectError( + p->dbRbu, &pIter->pTmpInsert, &p->zErrmsg, sqlite3_mprintf( + "INSERT INTO %s.'rbu_tmp_%q'(rbu_control,%s%s) VALUES(%z)", + p->zStateDb, pIter->zDataTbl, zCollist, zRbuRowid, zBind + )); + } +} + +static void rbuTmpInsertFunc( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + sqlite3rbu *p = sqlite3_user_data(pCtx); + int rc = SQLITE_OK; + int i; + + assert( sqlite3_value_int(apVal[0])!=0 + || p->objiter.eType==RBU_PK_EXTERNAL + || p->objiter.eType==RBU_PK_NONE + ); + if( sqlite3_value_int(apVal[0])!=0 ){ + p->nPhaseOneStep += p->objiter.nIndex; + } + + for(i=0; rc==SQLITE_OK && i<nVal; i++){ + rc = sqlite3_bind_value(p->objiter.pTmpInsert, i+1, apVal[i]); + } + if( rc==SQLITE_OK ){ + sqlite3_step(p->objiter.pTmpInsert); + rc = sqlite3_reset(p->objiter.pTmpInsert); + } + + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + } +} + +/* +** Ensure that the SQLite statement handles required to update the +** target database object currently indicated by the iterator passed +** as the second argument are available. +*/ +static int rbuObjIterPrepareAll( + sqlite3rbu *p, + RbuObjIter *pIter, + int nOffset /* Add "LIMIT -1 OFFSET $nOffset" to SELECT */ +){ + assert( pIter->bCleanup==0 ); + if( pIter->pSelect==0 && rbuObjIterCacheTableInfo(p, pIter)==SQLITE_OK ){ + const int tnum = pIter->iTnum; + char *zCollist = 0; /* List of indexed columns */ + char **pz = &p->zErrmsg; + const char *zIdx = pIter->zIdx; + char *zLimit = 0; + + if( nOffset ){ + zLimit = sqlite3_mprintf(" LIMIT -1 OFFSET %d", nOffset); + if( !zLimit ) p->rc = SQLITE_NOMEM; + } + + if( zIdx ){ + const char *zTbl = pIter->zTbl; + char *zImposterCols = 0; /* Columns for imposter table */ + char *zImposterPK = 0; /* Primary key declaration for imposter */ + char *zWhere = 0; /* WHERE clause on PK columns */ + char *zBind = 0; + int nBind = 0; + + assert( pIter->eType!=RBU_PK_VTAB ); + zCollist = rbuObjIterGetIndexCols( + p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind + ); + zBind = rbuObjIterGetBindlist(p, nBind); + + /* Create the imposter table used to write to this index. */ + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 1,tnum); + rbuMPrintfExec(p, p->dbMain, + "CREATE TABLE \"rbu_imp_%w\"( %s, PRIMARY KEY( %s ) ) WITHOUT ROWID", + zTbl, zImposterCols, zImposterPK + ); + sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 0); + + /* Create the statement to insert index entries */ + pIter->nCol = nBind; + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pInsert, &p->zErrmsg, + sqlite3_mprintf("INSERT INTO \"rbu_imp_%w\" VALUES(%s)", zTbl, zBind) + ); + } + + /* And to delete index entries */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError( + p->dbMain, &pIter->pDelete, &p->zErrmsg, + sqlite3_mprintf("DELETE FROM \"rbu_imp_%w\" WHERE %s", zTbl, zWhere) + ); + } + + /* Create the SELECT statement to read keys in sorted order */ + if( p->rc==SQLITE_OK ){ + char *zSql; + if( rbuIsVacuum(p) ){ + zSql = sqlite3_mprintf( + "SELECT %s, 0 AS rbu_control FROM '%q' ORDER BY %s%s", + zCollist, + pIter->zDataTbl, + zCollist, zLimit + ); + }else + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, + zCollist, zLimit + ); + }else{ + zSql = sqlite3_mprintf( + "SELECT %s, rbu_control FROM %s.'rbu_tmp_%q' " + "UNION ALL " + "SELECT %s, rbu_control FROM '%q' " + "WHERE typeof(rbu_control)='integer' AND rbu_control!=1 " + "ORDER BY %s%s", + zCollist, p->zStateDb, pIter->zDataTbl, + zCollist, pIter->zDataTbl, + zCollist, zLimit + ); + } + p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, zSql); + } + + sqlite3_free(zImposterCols); + sqlite3_free(zImposterPK); + sqlite3_free(zWhere); + sqlite3_free(zBind); + }else{ + int bRbuRowid = (pIter->eType==RBU_PK_VTAB) + ||(pIter->eType==RBU_PK_NONE) + ||(pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)); + const char *zTbl = pIter->zTbl; /* Table this step applies to */ + const char *zWrite; /* Imposter table name */ + + char *zBindings = rbuObjIterGetBindlist(p, pIter->nTblCol + bRbuRowid); + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zOldlist = rbuObjIterGetOldlist(p, pIter, "old"); + char *zNewlist = rbuObjIterGetOldlist(p, pIter, "new"); + + zCollist = rbuObjIterGetCollist(p, pIter); + pIter->nCol = pIter->nTblCol; + + /* Create the imposter table or tables (if required). */ + rbuCreateImposterTable(p, pIter); + rbuCreateImposterTable2(p, pIter); + zWrite = (pIter->eType==RBU_PK_VTAB ? "" : "rbu_imp_"); + + /* Create the INSERT statement to write to the target PK b-tree */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pInsert, pz, + sqlite3_mprintf( + "INSERT INTO \"%s%w\"(%s%s) VALUES(%s)", + zWrite, zTbl, zCollist, (bRbuRowid ? ", _rowid_" : ""), zBindings + ) + ); + } + + /* Create the DELETE statement to write to the target PK b-tree. + ** Because it only performs INSERT operations, this is not required for + ** an rbu vacuum handle. */ + if( rbuIsVacuum(p)==0 && p->rc==SQLITE_OK ){ + p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pDelete, pz, + sqlite3_mprintf( + "DELETE FROM \"%s%w\" WHERE %s", zWrite, zTbl, zWhere + ) + ); + } + + if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ + const char *zRbuRowid = ""; + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + zRbuRowid = ", rbu_rowid"; + } + + /* Create the rbu_tmp_xxx table and the triggers to populate it. */ + rbuMPrintfExec(p, p->dbRbu, + "CREATE TABLE IF NOT EXISTS %s.'rbu_tmp_%q' AS " + "SELECT *%s FROM '%q' WHERE 0;" + , p->zStateDb, pIter->zDataTbl + , (pIter->eType==RBU_PK_EXTERNAL ? ", 0 AS rbu_rowid" : "") + , pIter->zDataTbl + ); + + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_delete_tr BEFORE DELETE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update1_tr BEFORE UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(3, %s);" + "END;" + + "CREATE TEMP TRIGGER rbu_update2_tr AFTER UPDATE ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(4, %s);" + "END;", + zWrite, zTbl, zOldlist, + zWrite, zTbl, zOldlist, + zWrite, zTbl, zNewlist + ); + + if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){ + rbuMPrintfExec(p, p->dbMain, + "CREATE TEMP TRIGGER rbu_insert_tr AFTER INSERT ON \"%s%w\" " + "BEGIN " + " SELECT rbu_tmp_insert(0, %s);" + "END;", + zWrite, zTbl, zNewlist + ); + } + + rbuObjIterPrepareTmpInsert(p, pIter, zCollist, zRbuRowid); + } + + /* Create the SELECT statement to read keys from data_xxx */ + if( p->rc==SQLITE_OK ){ + const char *zRbuRowid = ""; + if( bRbuRowid ){ + zRbuRowid = rbuIsVacuum(p) ? ",_rowid_ " : ",rbu_rowid"; + } + p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz, + sqlite3_mprintf( + "SELECT %s,%s rbu_control%s FROM '%q'%s", + zCollist, + (rbuIsVacuum(p) ? "0 AS " : ""), + zRbuRowid, + pIter->zDataTbl, zLimit + ) + ); + } + + sqlite3_free(zWhere); + sqlite3_free(zOldlist); + sqlite3_free(zNewlist); + sqlite3_free(zBindings); + } + sqlite3_free(zCollist); + sqlite3_free(zLimit); + } + + return p->rc; +} + +/* +** Set output variable *ppStmt to point to an UPDATE statement that may +** be used to update the imposter table for the main table b-tree of the +** table object that pIter currently points to, assuming that the +** rbu_control column of the data_xyz table contains zMask. +** +** If the zMask string does not specify any columns to update, then this +** is not an error. Output variable *ppStmt is set to NULL in this case. +*/ +static int rbuGetUpdateStmt( + sqlite3rbu *p, /* RBU handle */ + RbuObjIter *pIter, /* Object iterator */ + const char *zMask, /* rbu_control value ('x.x.') */ + sqlite3_stmt **ppStmt /* OUT: UPDATE statement handle */ +){ + RbuUpdateStmt **pp; + RbuUpdateStmt *pUp = 0; + int nUp = 0; + + /* In case an error occurs */ + *ppStmt = 0; + + /* Search for an existing statement. If one is found, shift it to the front + ** of the LRU queue and return immediately. Otherwise, leave nUp pointing + ** to the number of statements currently in the cache and pUp to the + ** last object in the list. */ + for(pp=&pIter->pRbuUpdate; *pp; pp=&((*pp)->pNext)){ + pUp = *pp; + if( strcmp(pUp->zMask, zMask)==0 ){ + *pp = pUp->pNext; + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + *ppStmt = pUp->pUpdate; + return SQLITE_OK; + } + nUp++; + } + assert( pUp==0 || pUp->pNext==0 ); + + if( nUp>=SQLITE_RBU_UPDATE_CACHESIZE ){ + for(pp=&pIter->pRbuUpdate; *pp!=pUp; pp=&((*pp)->pNext)); + *pp = 0; + sqlite3_finalize(pUp->pUpdate); + pUp->pUpdate = 0; + }else{ + pUp = (RbuUpdateStmt*)rbuMalloc(p, sizeof(RbuUpdateStmt)+pIter->nTblCol+1); + } + + if( pUp ){ + char *zWhere = rbuObjIterGetWhere(p, pIter); + char *zSet = rbuObjIterGetSetlist(p, pIter, zMask); + char *zUpdate = 0; + + pUp->zMask = (char*)&pUp[1]; + memcpy(pUp->zMask, zMask, pIter->nTblCol); + pUp->pNext = pIter->pRbuUpdate; + pIter->pRbuUpdate = pUp; + + if( zSet ){ + const char *zPrefix = ""; + + if( pIter->eType!=RBU_PK_VTAB ) zPrefix = "rbu_imp_"; + zUpdate = sqlite3_mprintf("UPDATE \"%s%w\" SET %s WHERE %s", + zPrefix, pIter->zTbl, zSet, zWhere + ); + p->rc = prepareFreeAndCollectError( + p->dbMain, &pUp->pUpdate, &p->zErrmsg, zUpdate + ); + *ppStmt = pUp->pUpdate; + } + sqlite3_free(zWhere); + sqlite3_free(zSet); + } + + return p->rc; +} + +static sqlite3 *rbuOpenDbhandle( + sqlite3rbu *p, + const char *zName, + int bUseVfs +){ + sqlite3 *db = 0; + if( p->rc==SQLITE_OK ){ + const int flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_URI; + p->rc = sqlite3_open_v2(zName, &db, flags, bUseVfs ? p->zVfsName : 0); + if( p->rc ){ + p->zErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(db)); + sqlite3_close(db); + db = 0; + } + } + return db; +} + +/* +** Free an RbuState object allocated by rbuLoadState(). +*/ +static void rbuFreeState(RbuState *p){ + if( p ){ + sqlite3_free(p->zTbl); + sqlite3_free(p->zDataTbl); + sqlite3_free(p->zIdx); + sqlite3_free(p); + } +} + +/* +** Allocate an RbuState object and load the contents of the rbu_state +** table into it. Return a pointer to the new object. It is the +** responsibility of the caller to eventually free the object using +** sqlite3_free(). +** +** If an error occurs, leave an error code and message in the rbu handle +** and return NULL. +*/ +static RbuState *rbuLoadState(sqlite3rbu *p){ + RbuState *pRet = 0; + sqlite3_stmt *pStmt = 0; + int rc; + int rc2; + + pRet = (RbuState*)rbuMalloc(p, sizeof(RbuState)); + if( pRet==0 ) return 0; + + rc = prepareFreeAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + sqlite3_mprintf("SELECT k, v FROM %s.rbu_state", p->zStateDb) + ); + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + switch( sqlite3_column_int(pStmt, 0) ){ + case RBU_STATE_STAGE: + pRet->eStage = sqlite3_column_int(pStmt, 1); + if( pRet->eStage!=RBU_STAGE_OAL + && pRet->eStage!=RBU_STAGE_MOVE + && pRet->eStage!=RBU_STAGE_CKPT + ){ + p->rc = SQLITE_CORRUPT; + } + break; + + case RBU_STATE_TBL: + pRet->zTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_IDX: + pRet->zIdx = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + case RBU_STATE_ROW: + pRet->nRow = sqlite3_column_int(pStmt, 1); + break; + + case RBU_STATE_PROGRESS: + pRet->nProgress = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_CKPT: + pRet->iWalCksum = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_COOKIE: + pRet->iCookie = (u32)sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_OALSZ: + pRet->iOalSz = (u32)sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_PHASEONESTEP: + pRet->nPhaseOneStep = sqlite3_column_int64(pStmt, 1); + break; + + case RBU_STATE_DATATBL: + pRet->zDataTbl = rbuStrndup((char*)sqlite3_column_text(pStmt, 1), &rc); + break; + + default: + rc = SQLITE_CORRUPT; + break; + } + } + rc2 = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ) rc = rc2; + + p->rc = rc; + return pRet; +} + + +/* +** Open the database handle and attach the RBU database as "rbu". If an +** error occurs, leave an error code and message in the RBU handle. +*/ +static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ + assert( p->rc || (p->dbMain==0 && p->dbRbu==0) ); + assert( p->rc || rbuIsVacuum(p) || p->zTarget!=0 ); + + /* Open the RBU database */ + p->dbRbu = rbuOpenDbhandle(p, p->zRbu, 1); + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( p->zState==0 ){ + const char *zFile = sqlite3_db_filename(p->dbRbu, "main"); + p->zState = rbuMPrintf(p, "file://%s-vacuum?modeof=%s", zFile, zFile); + } + } + + /* If using separate RBU and state databases, attach the state database to + ** the RBU db handle now. */ + if( p->zState ){ + rbuMPrintfExec(p, p->dbRbu, "ATTACH %Q AS stat", p->zState); + memcpy(p->zStateDb, "stat", 4); + }else{ + memcpy(p->zStateDb, "main", 4); + } + +#if 0 + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + p->rc = sqlite3_exec(p->dbRbu, "BEGIN", 0, 0, 0); + } +#endif + + /* If it has not already been created, create the rbu_state table */ + rbuMPrintfExec(p, p->dbRbu, RBU_CREATE_STATE, p->zStateDb); + +#if 0 + if( rbuIsVacuum(p) ){ + if( p->rc==SQLITE_OK ){ + int rc2; + int bOk = 0; + sqlite3_stmt *pCnt = 0; + p->rc = prepareAndCollectError(p->dbRbu, &pCnt, &p->zErrmsg, + "SELECT count(*) FROM stat.sqlite_master" + ); + if( p->rc==SQLITE_OK + && sqlite3_step(pCnt)==SQLITE_ROW + && 1==sqlite3_column_int(pCnt, 0) + ){ + bOk = 1; + } + rc2 = sqlite3_finalize(pCnt); + if( p->rc==SQLITE_OK ) p->rc = rc2; + + if( p->rc==SQLITE_OK && bOk==0 ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("invalid state database"); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); + } + } + } +#endif + + if( p->rc==SQLITE_OK && rbuIsVacuum(p) ){ + int bOpen = 0; + int rc; + p->nRbu = 0; + p->pRbuFd = 0; + rc = sqlite3_file_control(p->dbRbu, "main", SQLITE_FCNTL_RBUCNT, (void*)p); + if( rc!=SQLITE_NOTFOUND ) p->rc = rc; + if( p->eStage>=RBU_STAGE_MOVE ){ + bOpen = 1; + }else{ + RbuState *pState = rbuLoadState(p); + if( pState ){ + bOpen = (pState->eStage>=RBU_STAGE_MOVE); + rbuFreeState(pState); + } + } + if( bOpen ) p->dbMain = rbuOpenDbhandle(p, p->zRbu, p->nRbu<=1); + } + + p->eStage = 0; + if( p->rc==SQLITE_OK && p->dbMain==0 ){ + if( !rbuIsVacuum(p) ){ + p->dbMain = rbuOpenDbhandle(p, p->zTarget, 1); + }else if( p->pRbuFd->pWalFd ){ + if( pbRetry ){ + p->pRbuFd->bNolock = 0; + sqlite3_close(p->dbRbu); + sqlite3_close(p->dbMain); + p->dbMain = 0; + p->dbRbu = 0; + *pbRetry = 1; + return; + } + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("cannot vacuum wal mode database"); + }else{ + char *zTarget; + char *zExtra = 0; + if( strlen(p->zRbu)>=5 && 0==memcmp("file:", p->zRbu, 5) ){ + zExtra = &p->zRbu[5]; + while( *zExtra ){ + if( *zExtra++=='?' ) break; + } + if( *zExtra=='\0' ) zExtra = 0; + } + + zTarget = sqlite3_mprintf("file:%s-vacuum?rbu_memory=1%s%s", + sqlite3_db_filename(p->dbRbu, "main"), + (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) + ); + + if( zTarget==0 ){ + p->rc = SQLITE_NOMEM; + return; + } + p->dbMain = rbuOpenDbhandle(p, zTarget, p->nRbu<=1); + sqlite3_free(zTarget); + } + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_tmp_insert", -1, SQLITE_UTF8, (void*)p, rbuTmpInsertFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbMain, + "rbu_fossil_delta", 2, SQLITE_UTF8, 0, rbuFossilDeltaFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_create_function(p->dbRbu, + "rbu_target_name", -1, SQLITE_UTF8, (void*)p, rbuTargetNameFunc, 0, 0 + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + rbuMPrintfExec(p, p->dbMain, "SELECT * FROM sqlite_master"); + + /* Mark the database file just opened as an RBU target database. If + ** this call returns SQLITE_NOTFOUND, then the RBU vfs is not in use. + ** This is an error. */ + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_file_control(p->dbMain, "main", SQLITE_FCNTL_RBU, (void*)p); + } + + if( p->rc==SQLITE_NOTFOUND ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("rbu vfs not found"); + } +} + +/* +** This routine is a copy of the sqlite3FileSuffix3() routine from the core. +** It is a no-op unless SQLITE_ENABLE_8_3_NAMES is defined. +** +** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database +** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and +** if filename in z[] has a suffix (a.k.a. "extension") that is longer than +** three characters, then shorten the suffix on z[] to be the last three +** characters of the original suffix. +** +** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always +** do the suffix shortening regardless of URI parameter. +** +** Examples: +** +** test.db-journal => test.nal +** test.db-wal => test.wal +** test.db-shm => test.shm +** test.db-mj7f3319fa => test.9fa +*/ +static void rbuFileSuffix3(const char *zBase, char *z){ +#ifdef SQLITE_ENABLE_8_3_NAMES +#if SQLITE_ENABLE_8_3_NAMES<2 + if( sqlite3_uri_boolean(zBase, "8_3_names", 0) ) +#endif + { + int i, sz; + sz = (int)strlen(z)&0xffffff; + for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} + if( z[i]=='.' && sz>i+4 ) memmove(&z[i+1], &z[sz-3], 4); + } +#endif +} + +/* +** Return the current wal-index header checksum for the target database +** as a 64-bit integer. +** +** The checksum is store in the first page of xShmMap memory as an 8-byte +** blob starting at byte offset 40. +*/ +static i64 rbuShmChecksum(sqlite3rbu *p){ + i64 iRet = 0; + if( p->rc==SQLITE_OK ){ + sqlite3_file *pDb = p->pTargetFd->pReal; + u32 volatile *ptr; + p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, (void volatile**)&ptr); + if( p->rc==SQLITE_OK ){ + iRet = ((i64)ptr[10] << 32) + ptr[11]; + } + } + return iRet; +} + +/* +** This function is called as part of initializing or reinitializing an +** incremental checkpoint. +** +** It populates the sqlite3rbu.aFrame[] array with the set of +** (wal frame -> db page) copy operations required to checkpoint the +** current wal file, and obtains the set of shm locks required to safely +** perform the copy operations directly on the file-system. +** +** If argument pState is not NULL, then the incremental checkpoint is +** being resumed. In this case, if the checksum of the wal-index-header +** following recovery is not the same as the checksum saved in the RbuState +** object, then the rbu handle is set to DONE state. This occurs if some +** other client appends a transaction to the wal file in the middle of +** an incremental checkpoint. +*/ +static void rbuSetupCheckpoint(sqlite3rbu *p, RbuState *pState){ + + /* If pState is NULL, then the wal file may not have been opened and + ** recovered. Running a read-statement here to ensure that doing so + ** does not interfere with the "capture" process below. */ + if( pState==0 ){ + p->eStage = 0; + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbMain, "SELECT * FROM sqlite_master", 0, 0, 0); + } + } + + /* Assuming no error has occurred, run a "restart" checkpoint with the + ** sqlite3rbu.eStage variable set to CAPTURE. This turns on the following + ** special behaviour in the rbu VFS: + ** + ** * If the exclusive shm WRITER or READ0 lock cannot be obtained, + ** the checkpoint fails with SQLITE_BUSY (normally SQLite would + ** proceed with running a passive checkpoint instead of failing). + ** + ** * Attempts to read from the *-wal file or write to the database file + ** do not perform any IO. Instead, the frame/page combinations that + ** would be read/written are recorded in the sqlite3rbu.aFrame[] + ** array. + ** + ** * Calls to xShmLock(UNLOCK) to release the exclusive shm WRITER, + ** READ0 and CHECKPOINT locks taken as part of the checkpoint are + ** no-ops. These locks will not be released until the connection + ** is closed. + ** + ** * Attempting to xSync() the database file causes an SQLITE_INTERNAL + ** error. + ** + ** As a result, unless an error (i.e. OOM or SQLITE_BUSY) occurs, the + ** checkpoint below fails with SQLITE_INTERNAL, and leaves the aFrame[] + ** array populated with a set of (frame -> page) mappings. Because the + ** WRITER, CHECKPOINT and READ0 locks are still held, it is safe to copy + ** data from the wal file into the database file according to the + ** contents of aFrame[]. + */ + if( p->rc==SQLITE_OK ){ + int rc2; + p->eStage = RBU_STAGE_CAPTURE; + rc2 = sqlite3_exec(p->dbMain, "PRAGMA main.wal_checkpoint=restart", 0, 0,0); + if( rc2!=SQLITE_INTERNAL ) p->rc = rc2; + } + + if( p->rc==SQLITE_OK && p->nFrame>0 ){ + p->eStage = RBU_STAGE_CKPT; + p->nStep = (pState ? pState->nRow : 0); + p->aBuf = rbuMalloc(p, p->pgsz); + p->iWalCksum = rbuShmChecksum(p); + } + + if( p->rc==SQLITE_OK ){ + if( p->nFrame==0 || (pState && pState->iWalCksum!=p->iWalCksum) ){ + p->rc = SQLITE_DONE; + p->eStage = RBU_STAGE_DONE; + }else{ + int nSectorSize; + sqlite3_file *pDb = p->pTargetFd->pReal; + sqlite3_file *pWal = p->pTargetFd->pWalFd->pReal; + assert( p->nPagePerSector==0 ); + nSectorSize = pDb->pMethods->xSectorSize(pDb); + if( nSectorSize>p->pgsz ){ + p->nPagePerSector = nSectorSize / p->pgsz; + }else{ + p->nPagePerSector = 1; + } + + /* Call xSync() on the wal file. This causes SQLite to sync the + ** directory in which the target database and the wal file reside, in + ** case it has not been synced since the rename() call in + ** rbuMoveOalFile(). */ + p->rc = pWal->pMethods->xSync(pWal, SQLITE_SYNC_NORMAL); + } + } +} + +/* +** Called when iAmt bytes are read from offset iOff of the wal file while +** the rbu object is in capture mode. Record the frame number of the frame +** being read in the aFrame[] array. +*/ +static int rbuCaptureWalRead(sqlite3rbu *pRbu, i64 iOff, int iAmt){ + const u32 mReq = (1<<WAL_LOCK_WRITE)|(1<<WAL_LOCK_CKPT)|(1<<WAL_LOCK_READ0); + u32 iFrame; + + if( pRbu->mLock!=mReq ){ + pRbu->rc = SQLITE_BUSY; + return SQLITE_INTERNAL; + } + + pRbu->pgsz = iAmt; + if( pRbu->nFrame==pRbu->nFrameAlloc ){ + int nNew = (pRbu->nFrameAlloc ? pRbu->nFrameAlloc : 64) * 2; + RbuFrame *aNew; + aNew = (RbuFrame*)sqlite3_realloc64(pRbu->aFrame, nNew * sizeof(RbuFrame)); + if( aNew==0 ) return SQLITE_NOMEM; + pRbu->aFrame = aNew; + pRbu->nFrameAlloc = nNew; + } + + iFrame = (u32)((iOff-32) / (i64)(iAmt+24)) + 1; + if( pRbu->iMaxFrame<iFrame ) pRbu->iMaxFrame = iFrame; + pRbu->aFrame[pRbu->nFrame].iWalFrame = iFrame; + pRbu->aFrame[pRbu->nFrame].iDbPage = 0; + pRbu->nFrame++; + return SQLITE_OK; +} + +/* +** Called when a page of data is written to offset iOff of the database +** file while the rbu handle is in capture mode. Record the page number +** of the page being written in the aFrame[] array. +*/ +static int rbuCaptureDbWrite(sqlite3rbu *pRbu, i64 iOff){ + pRbu->aFrame[pRbu->nFrame-1].iDbPage = (u32)(iOff / pRbu->pgsz) + 1; + return SQLITE_OK; +} + +/* +** This is called as part of an incremental checkpoint operation. Copy +** a single frame of data from the wal file into the database file, as +** indicated by the RbuFrame object. +*/ +static void rbuCheckpointFrame(sqlite3rbu *p, RbuFrame *pFrame){ + sqlite3_file *pWal = p->pTargetFd->pWalFd->pReal; + sqlite3_file *pDb = p->pTargetFd->pReal; + i64 iOff; + + assert( p->rc==SQLITE_OK ); + iOff = (i64)(pFrame->iWalFrame-1) * (p->pgsz + 24) + 32 + 24; + p->rc = pWal->pMethods->xRead(pWal, p->aBuf, p->pgsz, iOff); + if( p->rc ) return; + + iOff = (i64)(pFrame->iDbPage-1) * p->pgsz; + p->rc = pDb->pMethods->xWrite(pDb, p->aBuf, p->pgsz, iOff); +} + + +/* +** Take an EXCLUSIVE lock on the database file. +*/ +static void rbuLockDatabase(sqlite3rbu *p){ + sqlite3_file *pReal = p->pTargetFd->pReal; + assert( p->rc==SQLITE_OK ); + p->rc = pReal->pMethods->xLock(pReal, SQLITE_LOCK_SHARED); + if( p->rc==SQLITE_OK ){ + p->rc = pReal->pMethods->xLock(pReal, SQLITE_LOCK_EXCLUSIVE); + } +} + +#if defined(_WIN32_WCE) +static LPWSTR rbuWinUtf8ToUnicode(const char *zFilename){ + int nChar; + LPWSTR zWideFilename; + + nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); + if( nChar==0 ){ + return 0; + } + zWideFilename = sqlite3_malloc64( nChar*sizeof(zWideFilename[0]) ); + if( zWideFilename==0 ){ + return 0; + } + memset(zWideFilename, 0, nChar*sizeof(zWideFilename[0])); + nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, + nChar); + if( nChar==0 ){ + sqlite3_free(zWideFilename); + zWideFilename = 0; + } + return zWideFilename; +} +#endif + +/* +** The RBU handle is currently in RBU_STAGE_OAL state, with a SHARED lock +** on the database file. This proc moves the *-oal file to the *-wal path, +** then reopens the database file (this time in vanilla, non-oal, WAL mode). +** If an error occurs, leave an error code and error message in the rbu +** handle. +*/ +static void rbuMoveOalFile(sqlite3rbu *p){ + const char *zBase = sqlite3_db_filename(p->dbMain, "main"); + const char *zMove = zBase; + char *zOal; + char *zWal; + + if( rbuIsVacuum(p) ){ + zMove = sqlite3_db_filename(p->dbRbu, "main"); + } + zOal = sqlite3_mprintf("%s-oal", zMove); + zWal = sqlite3_mprintf("%s-wal", zMove); + + assert( p->eStage==RBU_STAGE_MOVE ); + assert( p->rc==SQLITE_OK && p->zErrmsg==0 ); + if( zWal==0 || zOal==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + /* Move the *-oal file to *-wal. At this point connection p->db is + ** holding a SHARED lock on the target database file (because it is + ** in WAL mode). So no other connection may be writing the db. + ** + ** In order to ensure that there are no database readers, an EXCLUSIVE + ** lock is obtained here before the *-oal is moved to *-wal. + */ + rbuLockDatabase(p); + if( p->rc==SQLITE_OK ){ + rbuFileSuffix3(zBase, zWal); + rbuFileSuffix3(zBase, zOal); + + /* Re-open the databases. */ + rbuObjIterFinalize(&p->objiter); + sqlite3_close(p->dbRbu); + sqlite3_close(p->dbMain); + p->dbMain = 0; + p->dbRbu = 0; + +#if defined(_WIN32_WCE) + { + LPWSTR zWideOal; + LPWSTR zWideWal; + + zWideOal = rbuWinUtf8ToUnicode(zOal); + if( zWideOal ){ + zWideWal = rbuWinUtf8ToUnicode(zWal); + if( zWideWal ){ + if( MoveFileW(zWideOal, zWideWal) ){ + p->rc = SQLITE_OK; + }else{ + p->rc = SQLITE_IOERR; + } + sqlite3_free(zWideWal); + }else{ + p->rc = SQLITE_IOERR_NOMEM; + } + sqlite3_free(zWideOal); + }else{ + p->rc = SQLITE_IOERR_NOMEM; + } + } +#else + p->rc = rename(zOal, zWal) ? SQLITE_IOERR : SQLITE_OK; +#endif + + if( p->rc==SQLITE_OK ){ + rbuOpenDatabase(p, 0); + rbuSetupCheckpoint(p, 0); + } + } + } + + sqlite3_free(zWal); + sqlite3_free(zOal); +} + +/* +** The SELECT statement iterating through the keys for the current object +** (p->objiter.pSelect) currently points to a valid row. This function +** determines the type of operation requested by this row and returns +** one of the following values to indicate the result: +** +** * RBU_INSERT +** * RBU_DELETE +** * RBU_IDX_DELETE +** * RBU_UPDATE +** +** If RBU_UPDATE is returned, then output variable *pzMask is set to +** point to the text value indicating the columns to update. +** +** If the rbu_control field contains an invalid value, an error code and +** message are left in the RBU handle and zero returned. +*/ +static int rbuStepType(sqlite3rbu *p, const char **pzMask){ + int iCol = p->objiter.nCol; /* Index of rbu_control column */ + int res = 0; /* Return value */ + + switch( sqlite3_column_type(p->objiter.pSelect, iCol) ){ + case SQLITE_INTEGER: { + int iVal = sqlite3_column_int(p->objiter.pSelect, iCol); + switch( iVal ){ + case 0: res = RBU_INSERT; break; + case 1: res = RBU_DELETE; break; + case 2: res = RBU_REPLACE; break; + case 3: res = RBU_IDX_DELETE; break; + case 4: res = RBU_IDX_INSERT; break; + } + break; + } + + case SQLITE_TEXT: { + const unsigned char *z = sqlite3_column_text(p->objiter.pSelect, iCol); + if( z==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + *pzMask = (const char*)z; + } + res = RBU_UPDATE; + + break; + } + + default: + break; + } + + if( res==0 ){ + rbuBadControlError(p); + } + return res; +} + +#ifdef SQLITE_DEBUG +/* +** Assert that column iCol of statement pStmt is named zName. +*/ +static void assertColumnName(sqlite3_stmt *pStmt, int iCol, const char *zName){ + const char *zCol = sqlite3_column_name(pStmt, iCol); + assert( 0==sqlite3_stricmp(zName, zCol) ); +} +#else +# define assertColumnName(x,y,z) +#endif + +/* +** Argument eType must be one of RBU_INSERT, RBU_DELETE, RBU_IDX_INSERT or +** RBU_IDX_DELETE. This function performs the work of a single +** sqlite3rbu_step() call for the type of operation specified by eType. +*/ +static void rbuStepOneOp(sqlite3rbu *p, int eType){ + RbuObjIter *pIter = &p->objiter; + sqlite3_value *pVal; + sqlite3_stmt *pWriter; + int i; + + assert( p->rc==SQLITE_OK ); + assert( eType!=RBU_DELETE || pIter->zIdx==0 ); + assert( eType==RBU_DELETE || eType==RBU_IDX_DELETE + || eType==RBU_INSERT || eType==RBU_IDX_INSERT + ); + + /* If this is a delete, decrement nPhaseOneStep by nIndex. If the DELETE + ** statement below does actually delete a row, nPhaseOneStep will be + ** incremented by the same amount when SQL function rbu_tmp_insert() + ** is invoked by the trigger. */ + if( eType==RBU_DELETE ){ + p->nPhaseOneStep -= p->objiter.nIndex; + } + + if( eType==RBU_IDX_DELETE || eType==RBU_DELETE ){ + pWriter = pIter->pDelete; + }else{ + pWriter = pIter->pInsert; + } + + for(i=0; i<pIter->nCol; i++){ + /* If this is an INSERT into a table b-tree and the table has an + ** explicit INTEGER PRIMARY KEY, check that this is not an attempt + ** to write a NULL into the IPK column. That is not permitted. */ + if( eType==RBU_INSERT + && pIter->zIdx==0 && pIter->eType==RBU_PK_IPK && pIter->abTblPk[i] + && sqlite3_column_type(pIter->pSelect, i)==SQLITE_NULL + ){ + p->rc = SQLITE_MISMATCH; + p->zErrmsg = sqlite3_mprintf("datatype mismatch"); + return; + } + + if( eType==RBU_DELETE && pIter->abTblPk[i]==0 ){ + continue; + } + + pVal = sqlite3_column_value(pIter->pSelect, i); + p->rc = sqlite3_bind_value(pWriter, i+1, pVal); + if( p->rc ) return; + } + if( pIter->zIdx==0 ){ + if( pIter->eType==RBU_PK_VTAB + || pIter->eType==RBU_PK_NONE + || (pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p)) + ){ + /* For a virtual table, or a table with no primary key, the + ** SELECT statement is: + ** + ** SELECT <cols>, rbu_control, rbu_rowid FROM .... + ** + ** Hence column_value(pIter->nCol+1). + */ + assertColumnName(pIter->pSelect, pIter->nCol+1, + rbuIsVacuum(p) ? "rowid" : "rbu_rowid" + ); + pVal = sqlite3_column_value(pIter->pSelect, pIter->nCol+1); + p->rc = sqlite3_bind_value(pWriter, pIter->nCol+1, pVal); + } + } + if( p->rc==SQLITE_OK ){ + sqlite3_step(pWriter); + p->rc = resetAndCollectError(pWriter, &p->zErrmsg); + } +} + +/* +** This function does the work for an sqlite3rbu_step() call. +** +** The object-iterator (p->objiter) currently points to a valid object, +** and the input cursor (p->objiter.pSelect) currently points to a valid +** input row. Perform whatever processing is required and return. +** +** If no error occurs, SQLITE_OK is returned. Otherwise, an error code +** and message is left in the RBU handle and a copy of the error code +** returned. +*/ +static int rbuStep(sqlite3rbu *p){ + RbuObjIter *pIter = &p->objiter; + const char *zMask = 0; + int eType = rbuStepType(p, &zMask); + + if( eType ){ + assert( eType==RBU_INSERT || eType==RBU_DELETE + || eType==RBU_REPLACE || eType==RBU_IDX_DELETE + || eType==RBU_IDX_INSERT || eType==RBU_UPDATE + ); + assert( eType!=RBU_UPDATE || pIter->zIdx==0 ); + + if( pIter->zIdx==0 && (eType==RBU_IDX_DELETE || eType==RBU_IDX_INSERT) ){ + rbuBadControlError(p); + } + else if( eType==RBU_REPLACE ){ + if( pIter->zIdx==0 ){ + p->nPhaseOneStep += p->objiter.nIndex; + rbuStepOneOp(p, RBU_DELETE); + } + if( p->rc==SQLITE_OK ) rbuStepOneOp(p, RBU_INSERT); + } + else if( eType!=RBU_UPDATE ){ + rbuStepOneOp(p, eType); + } + else{ + sqlite3_value *pVal; + sqlite3_stmt *pUpdate = 0; + assert( eType==RBU_UPDATE ); + p->nPhaseOneStep -= p->objiter.nIndex; + rbuGetUpdateStmt(p, pIter, zMask, &pUpdate); + if( pUpdate ){ + int i; + for(i=0; p->rc==SQLITE_OK && i<pIter->nCol; i++){ + char c = zMask[pIter->aiSrcOrder[i]]; + pVal = sqlite3_column_value(pIter->pSelect, i); + if( pIter->abTblPk[i] || c!='.' ){ + p->rc = sqlite3_bind_value(pUpdate, i+1, pVal); + } + } + if( p->rc==SQLITE_OK + && (pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE) + ){ + /* Bind the rbu_rowid value to column _rowid_ */ + assertColumnName(pIter->pSelect, pIter->nCol+1, "rbu_rowid"); + pVal = sqlite3_column_value(pIter->pSelect, pIter->nCol+1); + p->rc = sqlite3_bind_value(pUpdate, pIter->nCol+1, pVal); + } + if( p->rc==SQLITE_OK ){ + sqlite3_step(pUpdate); + p->rc = resetAndCollectError(pUpdate, &p->zErrmsg); + } + } + } + } + return p->rc; +} + +/* +** Increment the schema cookie of the main database opened by p->dbMain. +** +** Or, if this is an RBU vacuum, set the schema cookie of the main db +** opened by p->dbMain to one more than the schema cookie of the main +** db opened by p->dbRbu. +*/ +static void rbuIncrSchemaCookie(sqlite3rbu *p){ + if( p->rc==SQLITE_OK ){ + sqlite3 *dbread = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); + int iCookie = 1000000; + sqlite3_stmt *pStmt; + + p->rc = prepareAndCollectError(dbread, &pStmt, &p->zErrmsg, + "PRAGMA schema_version" + ); + if( p->rc==SQLITE_OK ){ + /* Coverage: it may be that this sqlite3_step() cannot fail. There + ** is already a transaction open, so the prepared statement cannot + ** throw an SQLITE_SCHEMA exception. The only database page the + ** statement reads is page 1, which is guaranteed to be in the cache. + ** And no memory allocations are required. */ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + iCookie = sqlite3_column_int(pStmt, 0); + } + rbuFinalize(p, pStmt); + } + if( p->rc==SQLITE_OK ){ + rbuMPrintfExec(p, p->dbMain, "PRAGMA schema_version = %d", iCookie+1); + } + } +} + +/* +** Update the contents of the rbu_state table within the rbu database. The +** value stored in the RBU_STATE_STAGE column is eStage. All other values +** are determined by inspecting the rbu handle passed as the first argument. +*/ +static void rbuSaveState(sqlite3rbu *p, int eStage){ + if( p->rc==SQLITE_OK || p->rc==SQLITE_DONE ){ + sqlite3_stmt *pInsert = 0; + rbu_file *pFd = (rbuIsVacuum(p) ? p->pRbuFd : p->pTargetFd); + int rc; + + assert( p->zErrmsg==0 ); + rc = prepareFreeAndCollectError(p->dbRbu, &pInsert, &p->zErrmsg, + sqlite3_mprintf( + "INSERT OR REPLACE INTO %s.rbu_state(k, v) VALUES " + "(%d, %d), " + "(%d, %Q), " + "(%d, %Q), " + "(%d, %d), " + "(%d, %d), " + "(%d, %lld), " + "(%d, %lld), " + "(%d, %lld), " + "(%d, %lld), " + "(%d, %Q) ", + p->zStateDb, + RBU_STATE_STAGE, eStage, + RBU_STATE_TBL, p->objiter.zTbl, + RBU_STATE_IDX, p->objiter.zIdx, + RBU_STATE_ROW, p->nStep, + RBU_STATE_PROGRESS, p->nProgress, + RBU_STATE_CKPT, p->iWalCksum, + RBU_STATE_COOKIE, (i64)pFd->iCookie, + RBU_STATE_OALSZ, p->iOalSz, + RBU_STATE_PHASEONESTEP, p->nPhaseOneStep, + RBU_STATE_DATATBL, p->objiter.zDataTbl + ) + ); + assert( pInsert==0 || rc==SQLITE_OK ); + + if( rc==SQLITE_OK ){ + sqlite3_step(pInsert); + rc = sqlite3_finalize(pInsert); + } + if( rc!=SQLITE_OK ) p->rc = rc; + } +} + + +/* +** The second argument passed to this function is the name of a PRAGMA +** setting - "page_size", "auto_vacuum", "user_version" or "application_id". +** This function executes the following on sqlite3rbu.dbRbu: +** +** "PRAGMA main.$zPragma" +** +** where $zPragma is the string passed as the second argument, then +** on sqlite3rbu.dbMain: +** +** "PRAGMA main.$zPragma = $val" +** +** where $val is the value returned by the first PRAGMA invocation. +** +** In short, it copies the value of the specified PRAGMA setting from +** dbRbu to dbMain. +*/ +static void rbuCopyPragma(sqlite3rbu *p, const char *zPragma){ + if( p->rc==SQLITE_OK ){ + sqlite3_stmt *pPragma = 0; + p->rc = prepareFreeAndCollectError(p->dbRbu, &pPragma, &p->zErrmsg, + sqlite3_mprintf("PRAGMA main.%s", zPragma) + ); + if( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPragma) ){ + p->rc = rbuMPrintfExec(p, p->dbMain, "PRAGMA main.%s = %d", + zPragma, sqlite3_column_int(pPragma, 0) + ); + } + rbuFinalize(p, pPragma); + } +} + +/* +** The RBU handle passed as the only argument has just been opened and +** the state database is empty. If this RBU handle was opened for an +** RBU vacuum operation, create the schema in the target db. +*/ +static void rbuCreateTargetSchema(sqlite3rbu *p){ + sqlite3_stmt *pSql = 0; + sqlite3_stmt *pInsert = 0; + + assert( rbuIsVacuum(p) ); + p->rc = sqlite3_exec(p->dbMain, "PRAGMA writable_schema=1", 0,0, &p->zErrmsg); + if( p->rc==SQLITE_OK ){ + p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, + "SELECT sql FROM sqlite_master WHERE sql!='' AND rootpage!=0" + " AND name!='sqlite_sequence' " + " ORDER BY type DESC" + ); + } + + while( p->rc==SQLITE_OK && sqlite3_step(pSql)==SQLITE_ROW ){ + const char *zSql = (const char*)sqlite3_column_text(pSql, 0); + p->rc = sqlite3_exec(p->dbMain, zSql, 0, 0, &p->zErrmsg); + } + rbuFinalize(p, pSql); + if( p->rc!=SQLITE_OK ) return; + + if( p->rc==SQLITE_OK ){ + p->rc = prepareAndCollectError(p->dbRbu, &pSql, &p->zErrmsg, + "SELECT * FROM sqlite_master WHERE rootpage=0 OR rootpage IS NULL" + ); + } + + if( p->rc==SQLITE_OK ){ + p->rc = prepareAndCollectError(p->dbMain, &pInsert, &p->zErrmsg, + "INSERT INTO sqlite_master VALUES(?,?,?,?,?)" + ); + } + + while( p->rc==SQLITE_OK && sqlite3_step(pSql)==SQLITE_ROW ){ + int i; + for(i=0; i<5; i++){ + sqlite3_bind_value(pInsert, i+1, sqlite3_column_value(pSql, i)); + } + sqlite3_step(pInsert); + p->rc = sqlite3_reset(pInsert); + } + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbMain, "PRAGMA writable_schema=0",0,0,&p->zErrmsg); + } + + rbuFinalize(p, pSql); + rbuFinalize(p, pInsert); +} + +/* +** Step the RBU object. +*/ +SQLITE_API int sqlite3rbu_step(sqlite3rbu *p){ + if( p ){ + switch( p->eStage ){ + case RBU_STAGE_OAL: { + RbuObjIter *pIter = &p->objiter; + + /* If this is an RBU vacuum operation and the state table was empty + ** when this handle was opened, create the target database schema. */ + if( rbuIsVacuum(p) && p->nProgress==0 && p->rc==SQLITE_OK ){ + rbuCreateTargetSchema(p); + rbuCopyPragma(p, "user_version"); + rbuCopyPragma(p, "application_id"); + } + + while( p->rc==SQLITE_OK && pIter->zTbl ){ + + if( pIter->bCleanup ){ + /* Clean up the rbu_tmp_xxx table for the previous table. It + ** cannot be dropped as there are currently active SQL statements. + ** But the contents can be deleted. */ + if( rbuIsVacuum(p)==0 && pIter->abIndexed ){ + rbuMPrintfExec(p, p->dbRbu, + "DELETE FROM %s.'rbu_tmp_%q'", p->zStateDb, pIter->zDataTbl + ); + } + }else{ + rbuObjIterPrepareAll(p, pIter, 0); + + /* Advance to the next row to process. */ + if( p->rc==SQLITE_OK ){ + int rc = sqlite3_step(pIter->pSelect); + if( rc==SQLITE_ROW ){ + p->nProgress++; + p->nStep++; + return rbuStep(p); + } + p->rc = sqlite3_reset(pIter->pSelect); + p->nStep = 0; + } + } + + rbuObjIterNext(p, pIter); + } + + if( p->rc==SQLITE_OK ){ + assert( pIter->zTbl==0 ); + rbuSaveState(p, RBU_STAGE_MOVE); + rbuIncrSchemaCookie(p); + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbMain, "COMMIT", 0, 0, &p->zErrmsg); + } + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, &p->zErrmsg); + } + p->eStage = RBU_STAGE_MOVE; + } + break; + } + + case RBU_STAGE_MOVE: { + if( p->rc==SQLITE_OK ){ + rbuMoveOalFile(p); + p->nProgress++; + } + break; + } + + case RBU_STAGE_CKPT: { + if( p->rc==SQLITE_OK ){ + if( p->nStep>=p->nFrame ){ + sqlite3_file *pDb = p->pTargetFd->pReal; + + /* Sync the db file */ + p->rc = pDb->pMethods->xSync(pDb, SQLITE_SYNC_NORMAL); + + /* Update nBackfill */ + if( p->rc==SQLITE_OK ){ + void volatile *ptr; + p->rc = pDb->pMethods->xShmMap(pDb, 0, 32*1024, 0, &ptr); + if( p->rc==SQLITE_OK ){ + ((u32 volatile*)ptr)[24] = p->iMaxFrame; + } + } + + if( p->rc==SQLITE_OK ){ + p->eStage = RBU_STAGE_DONE; + p->rc = SQLITE_DONE; + } + }else{ + /* At one point the following block copied a single frame from the + ** wal file to the database file. So that one call to sqlite3rbu_step() + ** checkpointed a single frame. + ** + ** However, if the sector-size is larger than the page-size, and the + ** application calls sqlite3rbu_savestate() or close() immediately + ** after this step, then rbu_step() again, then a power failure occurs, + ** then the database page written here may be damaged. Work around + ** this by checkpointing frames until the next page in the aFrame[] + ** lies on a different disk sector to the current one. */ + u32 iSector; + do{ + RbuFrame *pFrame = &p->aFrame[p->nStep]; + iSector = (pFrame->iDbPage-1) / p->nPagePerSector; + rbuCheckpointFrame(p, pFrame); + p->nStep++; + }while( p->nStep<p->nFrame + && iSector==((p->aFrame[p->nStep].iDbPage-1) / p->nPagePerSector) + && p->rc==SQLITE_OK + ); + } + p->nProgress++; + } + break; + } + + default: + break; + } + return p->rc; + }else{ + return SQLITE_NOMEM; + } +} + +/* +** Compare strings z1 and z2, returning 0 if they are identical, or non-zero +** otherwise. Either or both argument may be NULL. Two NULL values are +** considered equal, and NULL is considered distinct from all other values. +*/ +static int rbuStrCompare(const char *z1, const char *z2){ + if( z1==0 && z2==0 ) return 0; + if( z1==0 || z2==0 ) return 1; + return (sqlite3_stricmp(z1, z2)!=0); +} + +/* +** This function is called as part of sqlite3rbu_open() when initializing +** an rbu handle in OAL stage. If the rbu update has not started (i.e. +** the rbu_state table was empty) it is a no-op. Otherwise, it arranges +** things so that the next call to sqlite3rbu_step() continues on from +** where the previous rbu handle left off. +** +** If an error occurs, an error code and error message are left in the +** rbu handle passed as the first argument. +*/ +static void rbuSetupOal(sqlite3rbu *p, RbuState *pState){ + assert( p->rc==SQLITE_OK ); + if( pState->zTbl ){ + RbuObjIter *pIter = &p->objiter; + int rc = SQLITE_OK; + + while( rc==SQLITE_OK && pIter->zTbl && (pIter->bCleanup + || rbuStrCompare(pIter->zIdx, pState->zIdx) + || (pState->zDataTbl==0 && rbuStrCompare(pIter->zTbl, pState->zTbl)) + || (pState->zDataTbl && rbuStrCompare(pIter->zDataTbl, pState->zDataTbl)) + )){ + rc = rbuObjIterNext(p, pIter); + } + + if( rc==SQLITE_OK && !pIter->zTbl ){ + rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("rbu_state mismatch error"); + } + + if( rc==SQLITE_OK ){ + p->nStep = pState->nRow; + rc = rbuObjIterPrepareAll(p, &p->objiter, p->nStep); + } + + p->rc = rc; + } +} + +/* +** If there is a "*-oal" file in the file-system corresponding to the +** target database in the file-system, delete it. If an error occurs, +** leave an error code and error message in the rbu handle. +*/ +static void rbuDeleteOalFile(sqlite3rbu *p){ + char *zOal = rbuMPrintf(p, "%s-oal", p->zTarget); + if( zOal ){ + sqlite3_vfs *pVfs = sqlite3_vfs_find(0); + assert( pVfs && p->rc==SQLITE_OK && p->zErrmsg==0 ); + pVfs->xDelete(pVfs, zOal, 0); + sqlite3_free(zOal); + } +} + +/* +** Allocate a private rbu VFS for the rbu handle passed as the only +** argument. This VFS will be used unless the call to sqlite3rbu_open() +** specified a URI with a vfs=? option in place of a target database +** file name. +*/ +static void rbuCreateVfs(sqlite3rbu *p){ + int rnd; + char zRnd[64]; + + assert( p->rc==SQLITE_OK ); + sqlite3_randomness(sizeof(int), (void*)&rnd); + sqlite3_snprintf(sizeof(zRnd), zRnd, "rbu_vfs_%d", rnd); + p->rc = sqlite3rbu_create_vfs(zRnd, 0); + if( p->rc==SQLITE_OK ){ + sqlite3_vfs *pVfs = sqlite3_vfs_find(zRnd); + assert( pVfs ); + p->zVfsName = pVfs->zName; + ((rbu_vfs*)pVfs)->pRbu = p; + } +} + +/* +** Destroy the private VFS created for the rbu handle passed as the only +** argument by an earlier call to rbuCreateVfs(). +*/ +static void rbuDeleteVfs(sqlite3rbu *p){ + if( p->zVfsName ){ + sqlite3rbu_destroy_vfs(p->zVfsName); + p->zVfsName = 0; + } +} + +/* +** This user-defined SQL function is invoked with a single argument - the +** name of a table expected to appear in the target database. It returns +** the number of auxilliary indexes on the table. +*/ +static void rbuIndexCntFunc( + sqlite3_context *pCtx, + int nVal, + sqlite3_value **apVal +){ + sqlite3rbu *p = (sqlite3rbu*)sqlite3_user_data(pCtx); + sqlite3_stmt *pStmt = 0; + char *zErrmsg = 0; + int rc; + + assert( nVal==1 ); + + rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &zErrmsg, + sqlite3_mprintf("SELECT count(*) FROM sqlite_master " + "WHERE type='index' AND tbl_name = %Q", sqlite3_value_text(apVal[0])) + ); + if( rc!=SQLITE_OK ){ + sqlite3_result_error(pCtx, zErrmsg, -1); + }else{ + int nIndex = 0; + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + nIndex = sqlite3_column_int(pStmt, 0); + } + rc = sqlite3_finalize(pStmt); + if( rc==SQLITE_OK ){ + sqlite3_result_int(pCtx, nIndex); + }else{ + sqlite3_result_error(pCtx, sqlite3_errmsg(p->dbMain), -1); + } + } + + sqlite3_free(zErrmsg); +} + +/* +** If the RBU database contains the rbu_count table, use it to initialize +** the sqlite3rbu.nPhaseOneStep variable. The schema of the rbu_count table +** is assumed to contain the same columns as: +** +** CREATE TABLE rbu_count(tbl TEXT PRIMARY KEY, cnt INTEGER) WITHOUT ROWID; +** +** There should be one row in the table for each data_xxx table in the +** database. The 'tbl' column should contain the name of a data_xxx table, +** and the cnt column the number of rows it contains. +** +** sqlite3rbu.nPhaseOneStep is initialized to the sum of (1 + nIndex) * cnt +** for all rows in the rbu_count table, where nIndex is the number of +** indexes on the corresponding target database table. +*/ +static void rbuInitPhaseOneSteps(sqlite3rbu *p){ + if( p->rc==SQLITE_OK ){ + sqlite3_stmt *pStmt = 0; + int bExists = 0; /* True if rbu_count exists */ + + p->nPhaseOneStep = -1; + + p->rc = sqlite3_create_function(p->dbRbu, + "rbu_index_cnt", 1, SQLITE_UTF8, (void*)p, rbuIndexCntFunc, 0, 0 + ); + + /* Check for the rbu_count table. If it does not exist, or if an error + ** occurs, nPhaseOneStep will be left set to -1. */ + if( p->rc==SQLITE_OK ){ + p->rc = prepareAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + "SELECT 1 FROM sqlite_master WHERE tbl_name = 'rbu_count'" + ); + } + if( p->rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + bExists = 1; + } + p->rc = sqlite3_finalize(pStmt); + } + + if( p->rc==SQLITE_OK && bExists ){ + p->rc = prepareAndCollectError(p->dbRbu, &pStmt, &p->zErrmsg, + "SELECT sum(cnt * (1 + rbu_index_cnt(rbu_target_name(tbl))))" + "FROM rbu_count" + ); + if( p->rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + p->nPhaseOneStep = sqlite3_column_int64(pStmt, 0); + } + p->rc = sqlite3_finalize(pStmt); + } + } + } +} + + +static sqlite3rbu *openRbuHandle( + const char *zTarget, + const char *zRbu, + const char *zState +){ + sqlite3rbu *p; + size_t nTarget = zTarget ? strlen(zTarget) : 0; + size_t nRbu = strlen(zRbu); + size_t nByte = sizeof(sqlite3rbu) + nTarget+1 + nRbu+1; + + p = (sqlite3rbu*)sqlite3_malloc64(nByte); + if( p ){ + RbuState *pState = 0; + + /* Create the custom VFS. */ + memset(p, 0, sizeof(sqlite3rbu)); + rbuCreateVfs(p); + + /* Open the target, RBU and state databases */ + if( p->rc==SQLITE_OK ){ + char *pCsr = (char*)&p[1]; + int bRetry = 0; + if( zTarget ){ + p->zTarget = pCsr; + memcpy(p->zTarget, zTarget, nTarget+1); + pCsr += nTarget+1; + } + p->zRbu = pCsr; + memcpy(p->zRbu, zRbu, nRbu+1); + pCsr += nRbu+1; + if( zState ){ + p->zState = rbuMPrintf(p, "%s", zState); + } + + /* If the first attempt to open the database file fails and the bRetry + ** flag it set, this means that the db was not opened because it seemed + ** to be a wal-mode db. But, this may have happened due to an earlier + ** RBU vacuum operation leaving an old wal file in the directory. + ** If this is the case, it will have been checkpointed and deleted + ** when the handle was closed and a second attempt to open the + ** database may succeed. */ + rbuOpenDatabase(p, &bRetry); + if( bRetry ){ + rbuOpenDatabase(p, 0); + } + } + + if( p->rc==SQLITE_OK ){ + pState = rbuLoadState(p); + assert( pState || p->rc!=SQLITE_OK ); + if( p->rc==SQLITE_OK ){ + + if( pState->eStage==0 ){ + rbuDeleteOalFile(p); + rbuInitPhaseOneSteps(p); + p->eStage = RBU_STAGE_OAL; + }else{ + p->eStage = pState->eStage; + p->nPhaseOneStep = pState->nPhaseOneStep; + } + p->nProgress = pState->nProgress; + p->iOalSz = pState->iOalSz; + } + } + assert( p->rc!=SQLITE_OK || p->eStage!=0 ); + + if( p->rc==SQLITE_OK && p->pTargetFd->pWalFd ){ + if( p->eStage==RBU_STAGE_OAL ){ + p->rc = SQLITE_ERROR; + p->zErrmsg = sqlite3_mprintf("cannot update wal mode database"); + }else if( p->eStage==RBU_STAGE_MOVE ){ + p->eStage = RBU_STAGE_CKPT; + p->nStep = 0; + } + } + + if( p->rc==SQLITE_OK + && (p->eStage==RBU_STAGE_OAL || p->eStage==RBU_STAGE_MOVE) + && pState->eStage!=0 + ){ + rbu_file *pFd = (rbuIsVacuum(p) ? p->pRbuFd : p->pTargetFd); + if( pFd->iCookie!=pState->iCookie ){ + /* At this point (pTargetFd->iCookie) contains the value of the + ** change-counter cookie (the thing that gets incremented when a + ** transaction is committed in rollback mode) currently stored on + ** page 1 of the database file. */ + p->rc = SQLITE_BUSY; + p->zErrmsg = sqlite3_mprintf("database modified during rbu %s", + (rbuIsVacuum(p) ? "vacuum" : "update") + ); + } + } + + if( p->rc==SQLITE_OK ){ + if( p->eStage==RBU_STAGE_OAL ){ + sqlite3 *db = p->dbMain; + p->rc = sqlite3_exec(p->dbRbu, "BEGIN", 0, 0, &p->zErrmsg); + + /* Point the object iterator at the first object */ + if( p->rc==SQLITE_OK ){ + p->rc = rbuObjIterFirst(p, &p->objiter); + } + + /* If the RBU database contains no data_xxx tables, declare the RBU + ** update finished. */ + if( p->rc==SQLITE_OK && p->objiter.zTbl==0 ){ + p->rc = SQLITE_DONE; + p->eStage = RBU_STAGE_DONE; + }else{ + if( p->rc==SQLITE_OK && pState->eStage==0 && rbuIsVacuum(p) ){ + rbuCopyPragma(p, "page_size"); + rbuCopyPragma(p, "auto_vacuum"); + } + + /* Open transactions both databases. The *-oal file is opened or + ** created at this point. */ + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3_exec(db, "BEGIN IMMEDIATE", 0, 0, &p->zErrmsg); + } + + /* Check if the main database is a zipvfs db. If it is, set the upper + ** level pager to use "journal_mode=off". This prevents it from + ** generating a large journal using a temp file. */ + if( p->rc==SQLITE_OK ){ + int frc = sqlite3_file_control(db, "main", SQLITE_FCNTL_ZIPVFS, 0); + if( frc==SQLITE_OK ){ + p->rc = sqlite3_exec( + db, "PRAGMA journal_mode=off",0,0,&p->zErrmsg); + } + } + + if( p->rc==SQLITE_OK ){ + rbuSetupOal(p, pState); + } + } + }else if( p->eStage==RBU_STAGE_MOVE ){ + /* no-op */ + }else if( p->eStage==RBU_STAGE_CKPT ){ + rbuSetupCheckpoint(p, pState); + }else if( p->eStage==RBU_STAGE_DONE ){ + p->rc = SQLITE_DONE; + }else{ + p->rc = SQLITE_CORRUPT; + } + } + + rbuFreeState(pState); + } + + return p; +} + +/* +** Allocate and return an RBU handle with all fields zeroed except for the +** error code, which is set to SQLITE_MISUSE. +*/ +static sqlite3rbu *rbuMisuseError(void){ + sqlite3rbu *pRet; + pRet = sqlite3_malloc64(sizeof(sqlite3rbu)); + if( pRet ){ + memset(pRet, 0, sizeof(sqlite3rbu)); + pRet->rc = SQLITE_MISUSE; + } + return pRet; +} + +/* +** Open and return a new RBU handle. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_open( + const char *zTarget, + const char *zRbu, + const char *zState +){ + if( zTarget==0 || zRbu==0 ){ return rbuMisuseError(); } + /* TODO: Check that zTarget and zRbu are non-NULL */ + return openRbuHandle(zTarget, zRbu, zState); +} + +/* +** Open a handle to begin or resume an RBU VACUUM operation. +*/ +SQLITE_API sqlite3rbu *sqlite3rbu_vacuum( + const char *zTarget, + const char *zState +){ + if( zTarget==0 ){ return rbuMisuseError(); } + /* TODO: Check that both arguments are non-NULL */ + return openRbuHandle(0, zTarget, zState); +} + +/* +** Return the database handle used by pRbu. +*/ +SQLITE_API sqlite3 *sqlite3rbu_db(sqlite3rbu *pRbu, int bRbu){ + sqlite3 *db = 0; + if( pRbu ){ + db = (bRbu ? pRbu->dbRbu : pRbu->dbMain); + } + return db; +} + + +/* +** If the error code currently stored in the RBU handle is SQLITE_CONSTRAINT, +** then edit any error message string so as to remove all occurrences of +** the pattern "rbu_imp_[0-9]*". +*/ +static void rbuEditErrmsg(sqlite3rbu *p){ + if( p->rc==SQLITE_CONSTRAINT && p->zErrmsg ){ + unsigned int i; + size_t nErrmsg = strlen(p->zErrmsg); + for(i=0; i<(nErrmsg-8); i++){ + if( memcmp(&p->zErrmsg[i], "rbu_imp_", 8)==0 ){ + int nDel = 8; + while( p->zErrmsg[i+nDel]>='0' && p->zErrmsg[i+nDel]<='9' ) nDel++; + memmove(&p->zErrmsg[i], &p->zErrmsg[i+nDel], nErrmsg + 1 - i - nDel); + nErrmsg -= nDel; + } + } + } +} + +/* +** Close the RBU handle. +*/ +SQLITE_API int sqlite3rbu_close(sqlite3rbu *p, char **pzErrmsg){ + int rc; + if( p ){ + + /* Commit the transaction to the *-oal file. */ + if( p->rc==SQLITE_OK && p->eStage==RBU_STAGE_OAL ){ + p->rc = sqlite3_exec(p->dbMain, "COMMIT", 0, 0, &p->zErrmsg); + } + + /* Sync the db file if currently doing an incremental checkpoint */ + if( p->rc==SQLITE_OK && p->eStage==RBU_STAGE_CKPT ){ + sqlite3_file *pDb = p->pTargetFd->pReal; + p->rc = pDb->pMethods->xSync(pDb, SQLITE_SYNC_NORMAL); + } + + rbuSaveState(p, p->eStage); + + if( p->rc==SQLITE_OK && p->eStage==RBU_STAGE_OAL ){ + p->rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, &p->zErrmsg); + } + + /* Close any open statement handles. */ + rbuObjIterFinalize(&p->objiter); + + /* If this is an RBU vacuum handle and the vacuum has either finished + ** successfully or encountered an error, delete the contents of the + ** state table. This causes the next call to sqlite3rbu_vacuum() + ** specifying the current target and state databases to start a new + ** vacuum from scratch. */ + if( rbuIsVacuum(p) && p->rc!=SQLITE_OK && p->dbRbu ){ + int rc2 = sqlite3_exec(p->dbRbu, "DELETE FROM stat.rbu_state", 0, 0, 0); + if( p->rc==SQLITE_DONE && rc2!=SQLITE_OK ) p->rc = rc2; + } + + /* Close the open database handle and VFS object. */ + sqlite3_close(p->dbRbu); + sqlite3_close(p->dbMain); + assert( p->szTemp==0 ); + rbuDeleteVfs(p); + sqlite3_free(p->aBuf); + sqlite3_free(p->aFrame); + + rbuEditErrmsg(p); + rc = p->rc; + if( pzErrmsg ){ + *pzErrmsg = p->zErrmsg; + }else{ + sqlite3_free(p->zErrmsg); + } + sqlite3_free(p->zState); + sqlite3_free(p); + }else{ + rc = SQLITE_NOMEM; + *pzErrmsg = 0; + } + return rc; +} + +/* +** Return the total number of key-value operations (inserts, deletes or +** updates) that have been performed on the target database since the +** current RBU update was started. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_progress(sqlite3rbu *pRbu){ + return pRbu->nProgress; +} + +/* +** Return permyriadage progress indications for the two main stages of +** an RBU update. +*/ +SQLITE_API void sqlite3rbu_bp_progress(sqlite3rbu *p, int *pnOne, int *pnTwo){ + const int MAX_PROGRESS = 10000; + switch( p->eStage ){ + case RBU_STAGE_OAL: + if( p->nPhaseOneStep>0 ){ + *pnOne = (int)(MAX_PROGRESS * (i64)p->nProgress/(i64)p->nPhaseOneStep); + }else{ + *pnOne = -1; + } + *pnTwo = 0; + break; + + case RBU_STAGE_MOVE: + *pnOne = MAX_PROGRESS; + *pnTwo = 0; + break; + + case RBU_STAGE_CKPT: + *pnOne = MAX_PROGRESS; + *pnTwo = (int)(MAX_PROGRESS * (i64)p->nStep / (i64)p->nFrame); + break; + + case RBU_STAGE_DONE: + *pnOne = MAX_PROGRESS; + *pnTwo = MAX_PROGRESS; + break; + + default: + assert( 0 ); + } +} + +/* +** Return the current state of the RBU vacuum or update operation. +*/ +SQLITE_API int sqlite3rbu_state(sqlite3rbu *p){ + int aRes[] = { + 0, SQLITE_RBU_STATE_OAL, SQLITE_RBU_STATE_MOVE, + 0, SQLITE_RBU_STATE_CHECKPOINT, SQLITE_RBU_STATE_DONE + }; + + assert( RBU_STAGE_OAL==1 ); + assert( RBU_STAGE_MOVE==2 ); + assert( RBU_STAGE_CKPT==4 ); + assert( RBU_STAGE_DONE==5 ); + assert( aRes[RBU_STAGE_OAL]==SQLITE_RBU_STATE_OAL ); + assert( aRes[RBU_STAGE_MOVE]==SQLITE_RBU_STATE_MOVE ); + assert( aRes[RBU_STAGE_CKPT]==SQLITE_RBU_STATE_CHECKPOINT ); + assert( aRes[RBU_STAGE_DONE]==SQLITE_RBU_STATE_DONE ); + + if( p->rc!=SQLITE_OK && p->rc!=SQLITE_DONE ){ + return SQLITE_RBU_STATE_ERROR; + }else{ + assert( p->rc!=SQLITE_DONE || p->eStage==RBU_STAGE_DONE ); + assert( p->eStage==RBU_STAGE_OAL + || p->eStage==RBU_STAGE_MOVE + || p->eStage==RBU_STAGE_CKPT + || p->eStage==RBU_STAGE_DONE + ); + return aRes[p->eStage]; + } +} + +SQLITE_API int sqlite3rbu_savestate(sqlite3rbu *p){ + int rc = p->rc; + if( rc==SQLITE_DONE ) return SQLITE_OK; + + assert( p->eStage>=RBU_STAGE_OAL && p->eStage<=RBU_STAGE_DONE ); + if( p->eStage==RBU_STAGE_OAL ){ + assert( rc!=SQLITE_DONE ); + if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "COMMIT", 0, 0, 0); + } + + /* Sync the db file */ + if( rc==SQLITE_OK && p->eStage==RBU_STAGE_CKPT ){ + sqlite3_file *pDb = p->pTargetFd->pReal; + rc = pDb->pMethods->xSync(pDb, SQLITE_SYNC_NORMAL); + } + + p->rc = rc; + rbuSaveState(p, p->eStage); + rc = p->rc; + + if( p->eStage==RBU_STAGE_OAL ){ + assert( rc!=SQLITE_DONE ); + if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); + if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "BEGIN IMMEDIATE", 0, 0, 0); + if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "BEGIN IMMEDIATE", 0, 0,0); + } + + p->rc = rc; + return rc; +} + +/************************************************************************** +** Beginning of RBU VFS shim methods. The VFS shim modifies the behaviour +** of a standard VFS in the following ways: +** +** 1. Whenever the first page of a main database file is read or +** written, the value of the change-counter cookie is stored in +** rbu_file.iCookie. Similarly, the value of the "write-version" +** database header field is stored in rbu_file.iWriteVer. This ensures +** that the values are always trustworthy within an open transaction. +** +** 2. Whenever an SQLITE_OPEN_WAL file is opened, the (rbu_file.pWalFd) +** member variable of the associated database file descriptor is set +** to point to the new file. A mutex protected linked list of all main +** db fds opened using a particular RBU VFS is maintained at +** rbu_vfs.pMain to facilitate this. +** +** 3. Using a new file-control "SQLITE_FCNTL_RBU", a main db rbu_file +** object can be marked as the target database of an RBU update. This +** turns on the following extra special behaviour: +** +** 3a. If xAccess() is called to check if there exists a *-wal file +** associated with an RBU target database currently in RBU_STAGE_OAL +** stage (preparing the *-oal file), the following special handling +** applies: +** +** * if the *-wal file does exist, return SQLITE_CANTOPEN. An RBU +** target database may not be in wal mode already. +** +** * if the *-wal file does not exist, set the output parameter to +** non-zero (to tell SQLite that it does exist) anyway. +** +** Then, when xOpen() is called to open the *-wal file associated with +** the RBU target in RBU_STAGE_OAL stage, instead of opening the *-wal +** file, the rbu vfs opens the corresponding *-oal file instead. +** +** 3b. The *-shm pages returned by xShmMap() for a target db file in +** RBU_STAGE_OAL mode are actually stored in heap memory. This is to +** avoid creating a *-shm file on disk. Additionally, xShmLock() calls +** are no-ops on target database files in RBU_STAGE_OAL mode. This is +** because assert() statements in some VFS implementations fail if +** xShmLock() is called before xShmMap(). +** +** 3c. If an EXCLUSIVE lock is attempted on a target database file in any +** mode except RBU_STAGE_DONE (all work completed and checkpointed), it +** fails with an SQLITE_BUSY error. This is to stop RBU connections +** from automatically checkpointing a *-wal (or *-oal) file from within +** sqlite3_close(). +** +** 3d. In RBU_STAGE_CAPTURE mode, all xRead() calls on the wal file, and +** all xWrite() calls on the target database file perform no IO. +** Instead the frame and page numbers that would be read and written +** are recorded. Additionally, successful attempts to obtain exclusive +** xShmLock() WRITER, CHECKPOINTER and READ0 locks on the target +** database file are recorded. xShmLock() calls to unlock the same +** locks are no-ops (so that once obtained, these locks are never +** relinquished). Finally, calls to xSync() on the target database +** file fail with SQLITE_INTERNAL errors. +*/ + +static void rbuUnlockShm(rbu_file *p){ + assert( p->openFlags & SQLITE_OPEN_MAIN_DB ); + if( p->pRbu ){ + int (*xShmLock)(sqlite3_file*,int,int,int) = p->pReal->pMethods->xShmLock; + int i; + for(i=0; i<SQLITE_SHM_NLOCK;i++){ + if( (1<<i) & p->pRbu->mLock ){ + xShmLock(p->pReal, i, 1, SQLITE_SHM_UNLOCK|SQLITE_SHM_EXCLUSIVE); + } + } + p->pRbu->mLock = 0; + } +} + +/* +*/ +static int rbuUpdateTempSize(rbu_file *pFd, sqlite3_int64 nNew){ + sqlite3rbu *pRbu = pFd->pRbu; + i64 nDiff = nNew - pFd->sz; + pRbu->szTemp += nDiff; + pFd->sz = nNew; + assert( pRbu->szTemp>=0 ); + if( pRbu->szTempLimit && pRbu->szTemp>pRbu->szTempLimit ) return SQLITE_FULL; + return SQLITE_OK; +} + +/* +** Close an rbu file. +*/ +static int rbuVfsClose(sqlite3_file *pFile){ + rbu_file *p = (rbu_file*)pFile; + int rc; + int i; + + /* Free the contents of the apShm[] array. And the array itself. */ + for(i=0; i<p->nShm; i++){ + sqlite3_free(p->apShm[i]); + } + sqlite3_free(p->apShm); + p->apShm = 0; + sqlite3_free(p->zDel); + + if( p->openFlags & SQLITE_OPEN_MAIN_DB ){ + rbu_file **pp; + sqlite3_mutex_enter(p->pRbuVfs->mutex); + for(pp=&p->pRbuVfs->pMain; *pp!=p; pp=&((*pp)->pMainNext)); + *pp = p->pMainNext; + sqlite3_mutex_leave(p->pRbuVfs->mutex); + rbuUnlockShm(p); + p->pReal->pMethods->xShmUnmap(p->pReal, 0); + } + else if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){ + rbuUpdateTempSize(p, 0); + } + + /* Close the underlying file handle */ + rc = p->pReal->pMethods->xClose(p->pReal); + return rc; +} + + +/* +** Read and return an unsigned 32-bit big-endian integer from the buffer +** passed as the only argument. +*/ +static u32 rbuGetU32(u8 *aBuf){ + return ((u32)aBuf[0] << 24) + + ((u32)aBuf[1] << 16) + + ((u32)aBuf[2] << 8) + + ((u32)aBuf[3]); +} + +/* +** Write an unsigned 32-bit value in big-endian format to the supplied +** buffer. +*/ +static void rbuPutU32(u8 *aBuf, u32 iVal){ + aBuf[0] = (iVal >> 24) & 0xFF; + aBuf[1] = (iVal >> 16) & 0xFF; + aBuf[2] = (iVal >> 8) & 0xFF; + aBuf[3] = (iVal >> 0) & 0xFF; +} + +static void rbuPutU16(u8 *aBuf, u16 iVal){ + aBuf[0] = (iVal >> 8) & 0xFF; + aBuf[1] = (iVal >> 0) & 0xFF; +} + +/* +** Read data from an rbuVfs-file. +*/ +static int rbuVfsRead( + sqlite3_file *pFile, + void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + rbu_file *p = (rbu_file*)pFile; + sqlite3rbu *pRbu = p->pRbu; + int rc; + + if( pRbu && pRbu->eStage==RBU_STAGE_CAPTURE ){ + assert( p->openFlags & SQLITE_OPEN_WAL ); + rc = rbuCaptureWalRead(p->pRbu, iOfst, iAmt); + }else{ + if( pRbu && pRbu->eStage==RBU_STAGE_OAL + && (p->openFlags & SQLITE_OPEN_WAL) + && iOfst>=pRbu->iOalSz + ){ + rc = SQLITE_OK; + memset(zBuf, 0, iAmt); + }else{ + rc = p->pReal->pMethods->xRead(p->pReal, zBuf, iAmt, iOfst); +#if 1 + /* If this is being called to read the first page of the target + ** database as part of an rbu vacuum operation, synthesize the + ** contents of the first page if it does not yet exist. Otherwise, + ** SQLite will not check for a *-wal file. */ + if( pRbu && rbuIsVacuum(pRbu) + && rc==SQLITE_IOERR_SHORT_READ && iOfst==0 + && (p->openFlags & SQLITE_OPEN_MAIN_DB) + && pRbu->rc==SQLITE_OK + ){ + sqlite3_file *pFd = (sqlite3_file*)pRbu->pRbuFd; + rc = pFd->pMethods->xRead(pFd, zBuf, iAmt, iOfst); + if( rc==SQLITE_OK ){ + u8 *aBuf = (u8*)zBuf; + u32 iRoot = rbuGetU32(&aBuf[52]) ? 1 : 0; + rbuPutU32(&aBuf[52], iRoot); /* largest root page number */ + rbuPutU32(&aBuf[36], 0); /* number of free pages */ + rbuPutU32(&aBuf[32], 0); /* first page on free list trunk */ + rbuPutU32(&aBuf[28], 1); /* size of db file in pages */ + rbuPutU32(&aBuf[24], pRbu->pRbuFd->iCookie+1); /* Change counter */ + + if( iAmt>100 ){ + memset(&aBuf[100], 0, iAmt-100); + rbuPutU16(&aBuf[105], iAmt & 0xFFFF); + aBuf[100] = 0x0D; + } + } + } +#endif + } + if( rc==SQLITE_OK && iOfst==0 && (p->openFlags & SQLITE_OPEN_MAIN_DB) ){ + /* These look like magic numbers. But they are stable, as they are part + ** of the definition of the SQLite file format, which may not change. */ + u8 *pBuf = (u8*)zBuf; + p->iCookie = rbuGetU32(&pBuf[24]); + p->iWriteVer = pBuf[19]; + } + } + return rc; +} + +/* +** Write data to an rbuVfs-file. +*/ +static int rbuVfsWrite( + sqlite3_file *pFile, + const void *zBuf, + int iAmt, + sqlite_int64 iOfst +){ + rbu_file *p = (rbu_file*)pFile; + sqlite3rbu *pRbu = p->pRbu; + int rc; + + if( pRbu && pRbu->eStage==RBU_STAGE_CAPTURE ){ + assert( p->openFlags & SQLITE_OPEN_MAIN_DB ); + rc = rbuCaptureDbWrite(p->pRbu, iOfst); + }else{ + if( pRbu ){ + if( pRbu->eStage==RBU_STAGE_OAL + && (p->openFlags & SQLITE_OPEN_WAL) + && iOfst>=pRbu->iOalSz + ){ + pRbu->iOalSz = iAmt + iOfst; + }else if( p->openFlags & SQLITE_OPEN_DELETEONCLOSE ){ + i64 szNew = iAmt+iOfst; + if( szNew>p->sz ){ + rc = rbuUpdateTempSize(p, szNew); + if( rc!=SQLITE_OK ) return rc; + } + } + } + rc = p->pReal->pMethods->xWrite(p->pReal, zBuf, iAmt, iOfst); + if( rc==SQLITE_OK && iOfst==0 && (p->openFlags & SQLITE_OPEN_MAIN_DB) ){ + /* These look like magic numbers. But they are stable, as they are part + ** of the definition of the SQLite file format, which may not change. */ + u8 *pBuf = (u8*)zBuf; + p->iCookie = rbuGetU32(&pBuf[24]); + p->iWriteVer = pBuf[19]; + } + } + return rc; +} + +/* +** Truncate an rbuVfs-file. +*/ +static int rbuVfsTruncate(sqlite3_file *pFile, sqlite_int64 size){ + rbu_file *p = (rbu_file*)pFile; + if( (p->openFlags & SQLITE_OPEN_DELETEONCLOSE) && p->pRbu ){ + int rc = rbuUpdateTempSize(p, size); + if( rc!=SQLITE_OK ) return rc; + } + return p->pReal->pMethods->xTruncate(p->pReal, size); +} + +/* +** Sync an rbuVfs-file. +*/ +static int rbuVfsSync(sqlite3_file *pFile, int flags){ + rbu_file *p = (rbu_file *)pFile; + if( p->pRbu && p->pRbu->eStage==RBU_STAGE_CAPTURE ){ + if( p->openFlags & SQLITE_OPEN_MAIN_DB ){ + return SQLITE_INTERNAL; + } + return SQLITE_OK; + } + return p->pReal->pMethods->xSync(p->pReal, flags); +} + +/* +** Return the current file-size of an rbuVfs-file. +*/ +static int rbuVfsFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ + rbu_file *p = (rbu_file *)pFile; + int rc; + rc = p->pReal->pMethods->xFileSize(p->pReal, pSize); + + /* If this is an RBU vacuum operation and this is the target database, + ** pretend that it has at least one page. Otherwise, SQLite will not + ** check for the existance of a *-wal file. rbuVfsRead() contains + ** similar logic. */ + if( rc==SQLITE_OK && *pSize==0 + && p->pRbu && rbuIsVacuum(p->pRbu) + && (p->openFlags & SQLITE_OPEN_MAIN_DB) + ){ + *pSize = 1024; + } + return rc; +} + +/* +** Lock an rbuVfs-file. +*/ +static int rbuVfsLock(sqlite3_file *pFile, int eLock){ + rbu_file *p = (rbu_file*)pFile; + sqlite3rbu *pRbu = p->pRbu; + int rc = SQLITE_OK; + + assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); + if( eLock==SQLITE_LOCK_EXCLUSIVE + && (p->bNolock || (pRbu && pRbu->eStage!=RBU_STAGE_DONE)) + ){ + /* Do not allow EXCLUSIVE locks. Preventing SQLite from taking this + ** prevents it from checkpointing the database from sqlite3_close(). */ + rc = SQLITE_BUSY; + }else{ + rc = p->pReal->pMethods->xLock(p->pReal, eLock); + } + + return rc; +} + +/* +** Unlock an rbuVfs-file. +*/ +static int rbuVfsUnlock(sqlite3_file *pFile, int eLock){ + rbu_file *p = (rbu_file *)pFile; + return p->pReal->pMethods->xUnlock(p->pReal, eLock); +} + +/* +** Check if another file-handle holds a RESERVED lock on an rbuVfs-file. +*/ +static int rbuVfsCheckReservedLock(sqlite3_file *pFile, int *pResOut){ + rbu_file *p = (rbu_file *)pFile; + return p->pReal->pMethods->xCheckReservedLock(p->pReal, pResOut); +} + +/* +** File control method. For custom operations on an rbuVfs-file. +*/ +static int rbuVfsFileControl(sqlite3_file *pFile, int op, void *pArg){ + rbu_file *p = (rbu_file *)pFile; + int (*xControl)(sqlite3_file*,int,void*) = p->pReal->pMethods->xFileControl; + int rc; + + assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) + || p->openFlags & (SQLITE_OPEN_TRANSIENT_DB|SQLITE_OPEN_TEMP_JOURNAL) + ); + if( op==SQLITE_FCNTL_RBU ){ + sqlite3rbu *pRbu = (sqlite3rbu*)pArg; + + /* First try to find another RBU vfs lower down in the vfs stack. If + ** one is found, this vfs will operate in pass-through mode. The lower + ** level vfs will do the special RBU handling. */ + rc = xControl(p->pReal, op, pArg); + + if( rc==SQLITE_NOTFOUND ){ + /* Now search for a zipvfs instance lower down in the VFS stack. If + ** one is found, this is an error. */ + void *dummy = 0; + rc = xControl(p->pReal, SQLITE_FCNTL_ZIPVFS, &dummy); + if( rc==SQLITE_OK ){ + rc = SQLITE_ERROR; + pRbu->zErrmsg = sqlite3_mprintf("rbu/zipvfs setup error"); + }else if( rc==SQLITE_NOTFOUND ){ + pRbu->pTargetFd = p; + p->pRbu = pRbu; + if( p->pWalFd ) p->pWalFd->pRbu = pRbu; + rc = SQLITE_OK; + } + } + return rc; + } + else if( op==SQLITE_FCNTL_RBUCNT ){ + sqlite3rbu *pRbu = (sqlite3rbu*)pArg; + pRbu->nRbu++; + pRbu->pRbuFd = p; + p->bNolock = 1; + } + + rc = xControl(p->pReal, op, pArg); + if( rc==SQLITE_OK && op==SQLITE_FCNTL_VFSNAME ){ + rbu_vfs *pRbuVfs = p->pRbuVfs; + char *zIn = *(char**)pArg; + char *zOut = sqlite3_mprintf("rbu(%s)/%z", pRbuVfs->base.zName, zIn); + *(char**)pArg = zOut; + if( zOut==0 ) rc = SQLITE_NOMEM; + } + + return rc; +} + +/* +** Return the sector-size in bytes for an rbuVfs-file. +*/ +static int rbuVfsSectorSize(sqlite3_file *pFile){ + rbu_file *p = (rbu_file *)pFile; + return p->pReal->pMethods->xSectorSize(p->pReal); +} + +/* +** Return the device characteristic flags supported by an rbuVfs-file. +*/ +static int rbuVfsDeviceCharacteristics(sqlite3_file *pFile){ + rbu_file *p = (rbu_file *)pFile; + return p->pReal->pMethods->xDeviceCharacteristics(p->pReal); +} + +/* +** Take or release a shared-memory lock. +*/ +static int rbuVfsShmLock(sqlite3_file *pFile, int ofst, int n, int flags){ + rbu_file *p = (rbu_file*)pFile; + sqlite3rbu *pRbu = p->pRbu; + int rc = SQLITE_OK; + +#ifdef SQLITE_AMALGAMATION + assert( WAL_CKPT_LOCK==1 ); +#endif + + assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); + if( pRbu && (pRbu->eStage==RBU_STAGE_OAL || pRbu->eStage==RBU_STAGE_MOVE) ){ + /* Magic number 1 is the WAL_CKPT_LOCK lock. Preventing SQLite from + ** taking this lock also prevents any checkpoints from occurring. + ** todo: really, it's not clear why this might occur, as + ** wal_autocheckpoint ought to be turned off. */ + if( ofst==WAL_LOCK_CKPT && n==1 ) rc = SQLITE_BUSY; + }else{ + int bCapture = 0; + if( n==1 && (flags & SQLITE_SHM_EXCLUSIVE) + && pRbu && pRbu->eStage==RBU_STAGE_CAPTURE + && (ofst==WAL_LOCK_WRITE || ofst==WAL_LOCK_CKPT || ofst==WAL_LOCK_READ0) + ){ + bCapture = 1; + } + + if( bCapture==0 || 0==(flags & SQLITE_SHM_UNLOCK) ){ + rc = p->pReal->pMethods->xShmLock(p->pReal, ofst, n, flags); + if( bCapture && rc==SQLITE_OK ){ + pRbu->mLock |= (1 << ofst); + } + } + } + + return rc; +} + +/* +** Obtain a pointer to a mapping of a single 32KiB page of the *-shm file. +*/ +static int rbuVfsShmMap( + sqlite3_file *pFile, + int iRegion, + int szRegion, + int isWrite, + void volatile **pp +){ + rbu_file *p = (rbu_file*)pFile; + int rc = SQLITE_OK; + int eStage = (p->pRbu ? p->pRbu->eStage : 0); + + /* If not in RBU_STAGE_OAL, allow this call to pass through. Or, if this + ** rbu is in the RBU_STAGE_OAL state, use heap memory for *-shm space + ** instead of a file on disk. */ + assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); + if( eStage==RBU_STAGE_OAL || eStage==RBU_STAGE_MOVE ){ + if( iRegion<=p->nShm ){ + int nByte = (iRegion+1) * sizeof(char*); + char **apNew = (char**)sqlite3_realloc64(p->apShm, nByte); + if( apNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(&apNew[p->nShm], 0, sizeof(char*) * (1 + iRegion - p->nShm)); + p->apShm = apNew; + p->nShm = iRegion+1; + } + } + + if( rc==SQLITE_OK && p->apShm[iRegion]==0 ){ + char *pNew = (char*)sqlite3_malloc64(szRegion); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pNew, 0, szRegion); + p->apShm[iRegion] = pNew; + } + } + + if( rc==SQLITE_OK ){ + *pp = p->apShm[iRegion]; + }else{ + *pp = 0; + } + }else{ + assert( p->apShm==0 ); + rc = p->pReal->pMethods->xShmMap(p->pReal, iRegion, szRegion, isWrite, pp); + } + + return rc; +} + +/* +** Memory barrier. +*/ +static void rbuVfsShmBarrier(sqlite3_file *pFile){ + rbu_file *p = (rbu_file *)pFile; + p->pReal->pMethods->xShmBarrier(p->pReal); +} + +/* +** The xShmUnmap method. +*/ +static int rbuVfsShmUnmap(sqlite3_file *pFile, int delFlag){ + rbu_file *p = (rbu_file*)pFile; + int rc = SQLITE_OK; + int eStage = (p->pRbu ? p->pRbu->eStage : 0); + + assert( p->openFlags & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB) ); + if( eStage==RBU_STAGE_OAL || eStage==RBU_STAGE_MOVE ){ + /* no-op */ + }else{ + /* Release the checkpointer and writer locks */ + rbuUnlockShm(p); + rc = p->pReal->pMethods->xShmUnmap(p->pReal, delFlag); + } + return rc; +} + +/* +** Given that zWal points to a buffer containing a wal file name passed to +** either the xOpen() or xAccess() VFS method, return a pointer to the +** file-handle opened by the same database connection on the corresponding +** database file. +*/ +static rbu_file *rbuFindMaindb(rbu_vfs *pRbuVfs, const char *zWal){ + rbu_file *pDb; + sqlite3_mutex_enter(pRbuVfs->mutex); + for(pDb=pRbuVfs->pMain; pDb && pDb->zWal!=zWal; pDb=pDb->pMainNext){} + sqlite3_mutex_leave(pRbuVfs->mutex); + return pDb; +} + +/* +** A main database named zName has just been opened. The following +** function returns a pointer to a buffer owned by SQLite that contains +** the name of the *-wal file this db connection will use. SQLite +** happens to pass a pointer to this buffer when using xAccess() +** or xOpen() to operate on the *-wal file. +*/ +static const char *rbuMainToWal(const char *zName, int flags){ + int n = (int)strlen(zName); + const char *z = &zName[n]; + if( flags & SQLITE_OPEN_URI ){ + int odd = 0; + while( 1 ){ + if( z[0]==0 ){ + odd = 1 - odd; + if( odd && z[1]==0 ) break; + } + z++; + } + z += 2; + }else{ + while( *z==0 ) z++; + } + z += (n + 8 + 1); + return z; +} + +/* +** Open an rbu file handle. +*/ +static int rbuVfsOpen( + sqlite3_vfs *pVfs, + const char *zName, + sqlite3_file *pFile, + int flags, + int *pOutFlags +){ + static sqlite3_io_methods rbuvfs_io_methods = { + 2, /* iVersion */ + rbuVfsClose, /* xClose */ + rbuVfsRead, /* xRead */ + rbuVfsWrite, /* xWrite */ + rbuVfsTruncate, /* xTruncate */ + rbuVfsSync, /* xSync */ + rbuVfsFileSize, /* xFileSize */ + rbuVfsLock, /* xLock */ + rbuVfsUnlock, /* xUnlock */ + rbuVfsCheckReservedLock, /* xCheckReservedLock */ + rbuVfsFileControl, /* xFileControl */ + rbuVfsSectorSize, /* xSectorSize */ + rbuVfsDeviceCharacteristics, /* xDeviceCharacteristics */ + rbuVfsShmMap, /* xShmMap */ + rbuVfsShmLock, /* xShmLock */ + rbuVfsShmBarrier, /* xShmBarrier */ + rbuVfsShmUnmap, /* xShmUnmap */ + 0, 0 /* xFetch, xUnfetch */ + }; + rbu_vfs *pRbuVfs = (rbu_vfs*)pVfs; + sqlite3_vfs *pRealVfs = pRbuVfs->pRealVfs; + rbu_file *pFd = (rbu_file *)pFile; + int rc = SQLITE_OK; + const char *zOpen = zName; + int oflags = flags; + + memset(pFd, 0, sizeof(rbu_file)); + pFd->pReal = (sqlite3_file*)&pFd[1]; + pFd->pRbuVfs = pRbuVfs; + pFd->openFlags = flags; + if( zName ){ + if( flags & SQLITE_OPEN_MAIN_DB ){ + /* A main database has just been opened. The following block sets + ** (pFd->zWal) to point to a buffer owned by SQLite that contains + ** the name of the *-wal file this db connection will use. SQLite + ** happens to pass a pointer to this buffer when using xAccess() + ** or xOpen() to operate on the *-wal file. */ + pFd->zWal = rbuMainToWal(zName, flags); + } + else if( flags & SQLITE_OPEN_WAL ){ + rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName); + if( pDb ){ + if( pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){ + /* This call is to open a *-wal file. Intead, open the *-oal. This + ** code ensures that the string passed to xOpen() is terminated by a + ** pair of '\0' bytes in case the VFS attempts to extract a URI + ** parameter from it. */ + const char *zBase = zName; + size_t nCopy; + char *zCopy; + if( rbuIsVacuum(pDb->pRbu) ){ + zBase = sqlite3_db_filename(pDb->pRbu->dbRbu, "main"); + zBase = rbuMainToWal(zBase, SQLITE_OPEN_URI); + } + nCopy = strlen(zBase); + zCopy = sqlite3_malloc64(nCopy+2); + if( zCopy ){ + memcpy(zCopy, zBase, nCopy); + zCopy[nCopy-3] = 'o'; + zCopy[nCopy] = '\0'; + zCopy[nCopy+1] = '\0'; + zOpen = (const char*)(pFd->zDel = zCopy); + }else{ + rc = SQLITE_NOMEM; + } + pFd->pRbu = pDb->pRbu; + } + pDb->pWalFd = pFd; + } + } + }else{ + pFd->pRbu = pRbuVfs->pRbu; + } + + if( oflags & SQLITE_OPEN_MAIN_DB + && sqlite3_uri_boolean(zName, "rbu_memory", 0) + ){ + assert( oflags & SQLITE_OPEN_MAIN_DB ); + oflags = SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | + SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_DELETEONCLOSE; + zOpen = 0; + } + + if( rc==SQLITE_OK ){ + rc = pRealVfs->xOpen(pRealVfs, zOpen, pFd->pReal, oflags, pOutFlags); + } + if( pFd->pReal->pMethods ){ + /* The xOpen() operation has succeeded. Set the sqlite3_file.pMethods + ** pointer and, if the file is a main database file, link it into the + ** mutex protected linked list of all such files. */ + pFile->pMethods = &rbuvfs_io_methods; + if( flags & SQLITE_OPEN_MAIN_DB ){ + sqlite3_mutex_enter(pRbuVfs->mutex); + pFd->pMainNext = pRbuVfs->pMain; + pRbuVfs->pMain = pFd; + sqlite3_mutex_leave(pRbuVfs->mutex); + } + }else{ + sqlite3_free(pFd->zDel); + } + + return rc; +} + +/* +** Delete the file located at zPath. +*/ +static int rbuVfsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + return pRealVfs->xDelete(pRealVfs, zPath, dirSync); +} + +/* +** Test for access permissions. Return true if the requested permission +** is available, or false otherwise. +*/ +static int rbuVfsAccess( + sqlite3_vfs *pVfs, + const char *zPath, + int flags, + int *pResOut +){ + rbu_vfs *pRbuVfs = (rbu_vfs*)pVfs; + sqlite3_vfs *pRealVfs = pRbuVfs->pRealVfs; + int rc; + + rc = pRealVfs->xAccess(pRealVfs, zPath, flags, pResOut); + + /* If this call is to check if a *-wal file associated with an RBU target + ** database connection exists, and the RBU update is in RBU_STAGE_OAL, + ** the following special handling is activated: + ** + ** a) if the *-wal file does exist, return SQLITE_CANTOPEN. This + ** ensures that the RBU extension never tries to update a database + ** in wal mode, even if the first page of the database file has + ** been damaged. + ** + ** b) if the *-wal file does not exist, claim that it does anyway, + ** causing SQLite to call xOpen() to open it. This call will also + ** be intercepted (see the rbuVfsOpen() function) and the *-oal + ** file opened instead. + */ + if( rc==SQLITE_OK && flags==SQLITE_ACCESS_EXISTS ){ + rbu_file *pDb = rbuFindMaindb(pRbuVfs, zPath); + if( pDb && pDb->pRbu && pDb->pRbu->eStage==RBU_STAGE_OAL ){ + if( *pResOut ){ + rc = SQLITE_CANTOPEN; + }else{ + sqlite3_int64 sz = 0; + rc = rbuVfsFileSize(&pDb->base, &sz); + *pResOut = (sz>0); + } + } + } + + return rc; +} + +/* +** Populate buffer zOut with the full canonical pathname corresponding +** to the pathname in zPath. zOut is guaranteed to point to a buffer +** of at least (DEVSYM_MAX_PATHNAME+1) bytes. +*/ +static int rbuVfsFullPathname( + sqlite3_vfs *pVfs, + const char *zPath, + int nOut, + char *zOut +){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + return pRealVfs->xFullPathname(pRealVfs, zPath, nOut, zOut); +} + +#ifndef SQLITE_OMIT_LOAD_EXTENSION +/* +** Open the dynamic library located at zPath and return a handle. +*/ +static void *rbuVfsDlOpen(sqlite3_vfs *pVfs, const char *zPath){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + return pRealVfs->xDlOpen(pRealVfs, zPath); +} + +/* +** Populate the buffer zErrMsg (size nByte bytes) with a human readable +** utf-8 string describing the most recent error encountered associated +** with dynamic libraries. +*/ +static void rbuVfsDlError(sqlite3_vfs *pVfs, int nByte, char *zErrMsg){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + pRealVfs->xDlError(pRealVfs, nByte, zErrMsg); +} + +/* +** Return a pointer to the symbol zSymbol in the dynamic library pHandle. +*/ +static void (*rbuVfsDlSym( + sqlite3_vfs *pVfs, + void *pArg, + const char *zSym +))(void){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + return pRealVfs->xDlSym(pRealVfs, pArg, zSym); +} + +/* +** Close the dynamic library handle pHandle. +*/ +static void rbuVfsDlClose(sqlite3_vfs *pVfs, void *pHandle){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + pRealVfs->xDlClose(pRealVfs, pHandle); +} +#endif /* SQLITE_OMIT_LOAD_EXTENSION */ + +/* +** Populate the buffer pointed to by zBufOut with nByte bytes of +** random data. +*/ +static int rbuVfsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + return pRealVfs->xRandomness(pRealVfs, nByte, zBufOut); +} + +/* +** Sleep for nMicro microseconds. Return the number of microseconds +** actually slept. +*/ +static int rbuVfsSleep(sqlite3_vfs *pVfs, int nMicro){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + return pRealVfs->xSleep(pRealVfs, nMicro); +} + +/* +** Return the current time as a Julian Day number in *pTimeOut. +*/ +static int rbuVfsCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){ + sqlite3_vfs *pRealVfs = ((rbu_vfs*)pVfs)->pRealVfs; + return pRealVfs->xCurrentTime(pRealVfs, pTimeOut); +} + +/* +** No-op. +*/ +static int rbuVfsGetLastError(sqlite3_vfs *pVfs, int a, char *b){ + return 0; +} + +/* +** Deregister and destroy an RBU vfs created by an earlier call to +** sqlite3rbu_create_vfs(). +*/ +SQLITE_API void sqlite3rbu_destroy_vfs(const char *zName){ + sqlite3_vfs *pVfs = sqlite3_vfs_find(zName); + if( pVfs && pVfs->xOpen==rbuVfsOpen ){ + sqlite3_mutex_free(((rbu_vfs*)pVfs)->mutex); + sqlite3_vfs_unregister(pVfs); + sqlite3_free(pVfs); + } +} + +/* +** Create an RBU VFS named zName that accesses the underlying file-system +** via existing VFS zParent. The new object is registered as a non-default +** VFS with SQLite before returning. +*/ +SQLITE_API int sqlite3rbu_create_vfs(const char *zName, const char *zParent){ + + /* Template for VFS */ + static sqlite3_vfs vfs_template = { + 1, /* iVersion */ + 0, /* szOsFile */ + 0, /* mxPathname */ + 0, /* pNext */ + 0, /* zName */ + 0, /* pAppData */ + rbuVfsOpen, /* xOpen */ + rbuVfsDelete, /* xDelete */ + rbuVfsAccess, /* xAccess */ + rbuVfsFullPathname, /* xFullPathname */ + +#ifndef SQLITE_OMIT_LOAD_EXTENSION + rbuVfsDlOpen, /* xDlOpen */ + rbuVfsDlError, /* xDlError */ + rbuVfsDlSym, /* xDlSym */ + rbuVfsDlClose, /* xDlClose */ +#else + 0, 0, 0, 0, +#endif + + rbuVfsRandomness, /* xRandomness */ + rbuVfsSleep, /* xSleep */ + rbuVfsCurrentTime, /* xCurrentTime */ + rbuVfsGetLastError, /* xGetLastError */ + 0, /* xCurrentTimeInt64 (version 2) */ + 0, 0, 0 /* Unimplemented version 3 methods */ + }; + + rbu_vfs *pNew = 0; /* Newly allocated VFS */ + int rc = SQLITE_OK; + size_t nName; + size_t nByte; + + nName = strlen(zName); + nByte = sizeof(rbu_vfs) + nName + 1; + pNew = (rbu_vfs*)sqlite3_malloc64(nByte); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_vfs *pParent; /* Parent VFS */ + memset(pNew, 0, nByte); + pParent = sqlite3_vfs_find(zParent); + if( pParent==0 ){ + rc = SQLITE_NOTFOUND; + }else{ + char *zSpace; + memcpy(&pNew->base, &vfs_template, sizeof(sqlite3_vfs)); + pNew->base.mxPathname = pParent->mxPathname; + pNew->base.szOsFile = sizeof(rbu_file) + pParent->szOsFile; + pNew->pRealVfs = pParent; + pNew->base.zName = (const char*)(zSpace = (char*)&pNew[1]); + memcpy(zSpace, zName, nName); + + /* Allocate the mutex and register the new VFS (not as the default) */ + pNew->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_RECURSIVE); + if( pNew->mutex==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_vfs_register(&pNew->base, 0); + } + } + + if( rc!=SQLITE_OK ){ + sqlite3_mutex_free(pNew->mutex); + sqlite3_free(pNew); + } + } + + return rc; +} + +/* +** Configure the aggregate temp file size limit for this RBU handle. +*/ +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size_limit(sqlite3rbu *pRbu, sqlite3_int64 n){ + if( n>=0 ){ + pRbu->szTempLimit = n; + } + return pRbu->szTempLimit; +} + +SQLITE_API sqlite3_int64 sqlite3rbu_temp_size(sqlite3rbu *pRbu){ + return pRbu->szTemp; +} + + +/**************************************************************************/ + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RBU) */ + +/************** End of sqlite3rbu.c ******************************************/ +/************** Begin file dbstat.c ******************************************/ +/* +** 2010 July 12 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains an implementation of the "dbstat" virtual table. +** +** The dbstat virtual table is used to extract low-level formatting +** information from an SQLite database in order to implement the +** "sqlite3_analyzer" utility. See the ../tool/spaceanal.tcl script +** for an example implementation. +** +** Additional information is available on the "dbstat.html" page of the +** official SQLite documentation. +*/ + +/* #include "sqliteInt.h" ** Requires access to internal data structures ** */ +#if (defined(SQLITE_ENABLE_DBSTAT_VTAB) || defined(SQLITE_TEST)) \ + && !defined(SQLITE_OMIT_VIRTUALTABLE) + +/* +** Page paths: +** +** The value of the 'path' column describes the path taken from the +** root-node of the b-tree structure to each page. The value of the +** root-node path is '/'. +** +** The value of the path for the left-most child page of the root of +** a b-tree is '/000/'. (Btrees store content ordered from left to right +** so the pages to the left have smaller keys than the pages to the right.) +** The next to left-most child of the root page is +** '/001', and so on, each sibling page identified by a 3-digit hex +** value. The children of the 451st left-most sibling have paths such +** as '/1c2/000/, '/1c2/001/' etc. +** +** Overflow pages are specified by appending a '+' character and a +** six-digit hexadecimal value to the path to the cell they are linked +** from. For example, the three overflow pages in a chain linked from +** the left-most cell of the 450th child of the root page are identified +** by the paths: +** +** '/1c2/000+000000' // First page in overflow chain +** '/1c2/000+000001' // Second page in overflow chain +** '/1c2/000+000002' // Third page in overflow chain +** +** If the paths are sorted using the BINARY collation sequence, then +** the overflow pages associated with a cell will appear earlier in the +** sort-order than its child page: +** +** '/1c2/000/' // Left-most child of 451st child of root +*/ +#define VTAB_SCHEMA \ + "CREATE TABLE xx( " \ + " name TEXT, /* Name of table or index */" \ + " path TEXT, /* Path to page from root */" \ + " pageno INTEGER, /* Page number */" \ + " pagetype TEXT, /* 'internal', 'leaf' or 'overflow' */" \ + " ncell INTEGER, /* Cells on page (0 for overflow) */" \ + " payload INTEGER, /* Bytes of payload on this page */" \ + " unused INTEGER, /* Bytes of unused space on this page */" \ + " mx_payload INTEGER, /* Largest payload size of all cells */" \ + " pgoffset INTEGER, /* Offset of page in file */" \ + " pgsize INTEGER, /* Size of the page */" \ + " schema TEXT HIDDEN /* Database schema being analyzed */" \ + ");" + + +typedef struct StatTable StatTable; +typedef struct StatCursor StatCursor; +typedef struct StatPage StatPage; +typedef struct StatCell StatCell; + +struct StatCell { + int nLocal; /* Bytes of local payload */ + u32 iChildPg; /* Child node (or 0 if this is a leaf) */ + int nOvfl; /* Entries in aOvfl[] */ + u32 *aOvfl; /* Array of overflow page numbers */ + int nLastOvfl; /* Bytes of payload on final overflow page */ + int iOvfl; /* Iterates through aOvfl[] */ +}; + +struct StatPage { + u32 iPgno; + DbPage *pPg; + int iCell; + + char *zPath; /* Path to this page */ + + /* Variables populated by statDecodePage(): */ + u8 flags; /* Copy of flags byte */ + int nCell; /* Number of cells on page */ + int nUnused; /* Number of unused bytes on page */ + StatCell *aCell; /* Array of parsed cells */ + u32 iRightChildPg; /* Right-child page number (or 0) */ + int nMxPayload; /* Largest payload of any cell on this page */ +}; + +struct StatCursor { + sqlite3_vtab_cursor base; + sqlite3_stmt *pStmt; /* Iterates through set of root pages */ + int isEof; /* After pStmt has returned SQLITE_DONE */ + int iDb; /* Schema used for this query */ + + StatPage aPage[32]; + int iPage; /* Current entry in aPage[] */ + + /* Values to return. */ + char *zName; /* Value of 'name' column */ + char *zPath; /* Value of 'path' column */ + u32 iPageno; /* Value of 'pageno' column */ + char *zPagetype; /* Value of 'pagetype' column */ + int nCell; /* Value of 'ncell' column */ + int nPayload; /* Value of 'payload' column */ + int nUnused; /* Value of 'unused' column */ + int nMxPayload; /* Value of 'mx_payload' column */ + i64 iOffset; /* Value of 'pgOffset' column */ + int szPage; /* Value of 'pgSize' column */ +}; + +struct StatTable { + sqlite3_vtab base; + sqlite3 *db; + int iDb; /* Index of database to analyze */ +}; + +#ifndef get2byte +# define get2byte(x) ((x)[0]<<8 | (x)[1]) +#endif + +/* +** Connect to or create a statvfs virtual table. +*/ +static int statConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + StatTable *pTab = 0; + int rc = SQLITE_OK; + int iDb; + + if( argc>=4 ){ + Token nm; + sqlite3TokenInit(&nm, (char*)argv[3]); + iDb = sqlite3FindDb(db, &nm); + if( iDb<0 ){ + *pzErr = sqlite3_mprintf("no such database: %s", argv[3]); + return SQLITE_ERROR; + } + }else{ + iDb = 0; + } + rc = sqlite3_declare_vtab(db, VTAB_SCHEMA); + if( rc==SQLITE_OK ){ + pTab = (StatTable *)sqlite3_malloc64(sizeof(StatTable)); + if( pTab==0 ) rc = SQLITE_NOMEM_BKPT; + } + + assert( rc==SQLITE_OK || pTab==0 ); + if( rc==SQLITE_OK ){ + memset(pTab, 0, sizeof(StatTable)); + pTab->db = db; + pTab->iDb = iDb; + } + + *ppVtab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** Disconnect from or destroy a statvfs virtual table. +*/ +static int statDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** There is no "best-index". This virtual table always does a linear +** scan. However, a schema=? constraint should cause this table to +** operate on a different database schema, so check for it. +** +** idxNum is normally 0, but will be 1 if a schema=? constraint exists. +*/ +static int statBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + int i; + + pIdxInfo->estimatedCost = 1.0e6; /* Initial cost estimate */ + + /* Look for a valid schema=? constraint. If found, change the idxNum to + ** 1 and request the value of that constraint be sent to xFilter. And + ** lower the cost estimate to encourage the constrained version to be + ** used. + */ + for(i=0; i<pIdxInfo->nConstraint; i++){ + if( pIdxInfo->aConstraint[i].usable==0 ) continue; + if( pIdxInfo->aConstraint[i].op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( pIdxInfo->aConstraint[i].iColumn!=10 ) continue; + pIdxInfo->idxNum = 1; + pIdxInfo->estimatedCost = 1.0; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + break; + } + + + /* Records are always returned in ascending order of (name, path). + ** If this will satisfy the client, set the orderByConsumed flag so that + ** SQLite does not do an external sort. + */ + if( ( pIdxInfo->nOrderBy==1 + && pIdxInfo->aOrderBy[0].iColumn==0 + && pIdxInfo->aOrderBy[0].desc==0 + ) || + ( pIdxInfo->nOrderBy==2 + && pIdxInfo->aOrderBy[0].iColumn==0 + && pIdxInfo->aOrderBy[0].desc==0 + && pIdxInfo->aOrderBy[1].iColumn==1 + && pIdxInfo->aOrderBy[1].desc==0 + ) + ){ + pIdxInfo->orderByConsumed = 1; + } + + return SQLITE_OK; +} + +/* +** Open a new statvfs cursor. +*/ +static int statOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + StatTable *pTab = (StatTable *)pVTab; + StatCursor *pCsr; + + pCsr = (StatCursor *)sqlite3_malloc64(sizeof(StatCursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + memset(pCsr, 0, sizeof(StatCursor)); + pCsr->base.pVtab = pVTab; + pCsr->iDb = pTab->iDb; + } + + *ppCursor = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +static void statClearPage(StatPage *p){ + int i; + if( p->aCell ){ + for(i=0; i<p->nCell; i++){ + sqlite3_free(p->aCell[i].aOvfl); + } + sqlite3_free(p->aCell); + } + sqlite3PagerUnref(p->pPg); + sqlite3_free(p->zPath); + memset(p, 0, sizeof(StatPage)); +} + +static void statResetCsr(StatCursor *pCsr){ + int i; + sqlite3_reset(pCsr->pStmt); + for(i=0; i<ArraySize(pCsr->aPage); i++){ + statClearPage(&pCsr->aPage[i]); + } + pCsr->iPage = 0; + sqlite3_free(pCsr->zPath); + pCsr->zPath = 0; + pCsr->isEof = 0; +} + +/* +** Close a statvfs cursor. +*/ +static int statClose(sqlite3_vtab_cursor *pCursor){ + StatCursor *pCsr = (StatCursor *)pCursor; + statResetCsr(pCsr); + sqlite3_finalize(pCsr->pStmt); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +static void getLocalPayload( + int nUsable, /* Usable bytes per page */ + u8 flags, /* Page flags */ + int nTotal, /* Total record (payload) size */ + int *pnLocal /* OUT: Bytes stored locally */ +){ + int nLocal; + int nMinLocal; + int nMaxLocal; + + if( flags==0x0D ){ /* Table leaf node */ + nMinLocal = (nUsable - 12) * 32 / 255 - 23; + nMaxLocal = nUsable - 35; + }else{ /* Index interior and leaf nodes */ + nMinLocal = (nUsable - 12) * 32 / 255 - 23; + nMaxLocal = (nUsable - 12) * 64 / 255 - 23; + } + + nLocal = nMinLocal + (nTotal - nMinLocal) % (nUsable - 4); + if( nLocal>nMaxLocal ) nLocal = nMinLocal; + *pnLocal = nLocal; +} + +static int statDecodePage(Btree *pBt, StatPage *p){ + int nUnused; + int iOff; + int nHdr; + int isLeaf; + int szPage; + + u8 *aData = sqlite3PagerGetData(p->pPg); + u8 *aHdr = &aData[p->iPgno==1 ? 100 : 0]; + + p->flags = aHdr[0]; + p->nCell = get2byte(&aHdr[3]); + p->nMxPayload = 0; + + isLeaf = (p->flags==0x0A || p->flags==0x0D); + nHdr = 12 - isLeaf*4 + (p->iPgno==1)*100; + + nUnused = get2byte(&aHdr[5]) - nHdr - 2*p->nCell; + nUnused += (int)aHdr[7]; + iOff = get2byte(&aHdr[1]); + while( iOff ){ + nUnused += get2byte(&aData[iOff+2]); + iOff = get2byte(&aData[iOff]); + } + p->nUnused = nUnused; + p->iRightChildPg = isLeaf ? 0 : sqlite3Get4byte(&aHdr[8]); + szPage = sqlite3BtreeGetPageSize(pBt); + + if( p->nCell ){ + int i; /* Used to iterate through cells */ + int nUsable; /* Usable bytes per page */ + + sqlite3BtreeEnter(pBt); + nUsable = szPage - sqlite3BtreeGetReserveNoMutex(pBt); + sqlite3BtreeLeave(pBt); + p->aCell = sqlite3_malloc64((p->nCell+1) * sizeof(StatCell)); + if( p->aCell==0 ) return SQLITE_NOMEM_BKPT; + memset(p->aCell, 0, (p->nCell+1) * sizeof(StatCell)); + + for(i=0; i<p->nCell; i++){ + StatCell *pCell = &p->aCell[i]; + + iOff = get2byte(&aData[nHdr+i*2]); + if( !isLeaf ){ + pCell->iChildPg = sqlite3Get4byte(&aData[iOff]); + iOff += 4; + } + if( p->flags==0x05 ){ + /* A table interior node. nPayload==0. */ + }else{ + u32 nPayload; /* Bytes of payload total (local+overflow) */ + int nLocal; /* Bytes of payload stored locally */ + iOff += getVarint32(&aData[iOff], nPayload); + if( p->flags==0x0D ){ + u64 dummy; + iOff += sqlite3GetVarint(&aData[iOff], &dummy); + } + if( nPayload>(u32)p->nMxPayload ) p->nMxPayload = nPayload; + getLocalPayload(nUsable, p->flags, nPayload, &nLocal); + pCell->nLocal = nLocal; + assert( nLocal>=0 ); + assert( nPayload>=(u32)nLocal ); + assert( nLocal<=(nUsable-35) ); + if( nPayload>(u32)nLocal ){ + int j; + int nOvfl = ((nPayload - nLocal) + nUsable-4 - 1) / (nUsable - 4); + pCell->nLastOvfl = (nPayload-nLocal) - (nOvfl-1) * (nUsable-4); + pCell->nOvfl = nOvfl; + pCell->aOvfl = sqlite3_malloc64(sizeof(u32)*nOvfl); + if( pCell->aOvfl==0 ) return SQLITE_NOMEM_BKPT; + pCell->aOvfl[0] = sqlite3Get4byte(&aData[iOff+nLocal]); + for(j=1; j<nOvfl; j++){ + int rc; + u32 iPrev = pCell->aOvfl[j-1]; + DbPage *pPg = 0; + rc = sqlite3PagerGet(sqlite3BtreePager(pBt), iPrev, &pPg, 0); + if( rc!=SQLITE_OK ){ + assert( pPg==0 ); + return rc; + } + pCell->aOvfl[j] = sqlite3Get4byte(sqlite3PagerGetData(pPg)); + sqlite3PagerUnref(pPg); + } + } + } + } + } + + return SQLITE_OK; +} + +/* +** Populate the pCsr->iOffset and pCsr->szPage member variables. Based on +** the current value of pCsr->iPageno. +*/ +static void statSizeAndOffset(StatCursor *pCsr){ + StatTable *pTab = (StatTable *)((sqlite3_vtab_cursor *)pCsr)->pVtab; + Btree *pBt = pTab->db->aDb[pTab->iDb].pBt; + Pager *pPager = sqlite3BtreePager(pBt); + sqlite3_file *fd; + sqlite3_int64 x[2]; + + /* The default page size and offset */ + pCsr->szPage = sqlite3BtreeGetPageSize(pBt); + pCsr->iOffset = (i64)pCsr->szPage * (pCsr->iPageno - 1); + + /* If connected to a ZIPVFS backend, override the page size and + ** offset with actual values obtained from ZIPVFS. + */ + fd = sqlite3PagerFile(pPager); + x[0] = pCsr->iPageno; + if( sqlite3OsFileControl(fd, 230440, &x)==SQLITE_OK ){ + pCsr->iOffset = x[0]; + pCsr->szPage = (int)x[1]; + } +} + +/* +** Move a statvfs cursor to the next entry in the file. +*/ +static int statNext(sqlite3_vtab_cursor *pCursor){ + int rc; + int nPayload; + char *z; + StatCursor *pCsr = (StatCursor *)pCursor; + StatTable *pTab = (StatTable *)pCursor->pVtab; + Btree *pBt = pTab->db->aDb[pCsr->iDb].pBt; + Pager *pPager = sqlite3BtreePager(pBt); + + sqlite3_free(pCsr->zPath); + pCsr->zPath = 0; + +statNextRestart: + if( pCsr->aPage[0].pPg==0 ){ + rc = sqlite3_step(pCsr->pStmt); + if( rc==SQLITE_ROW ){ + int nPage; + u32 iRoot = (u32)sqlite3_column_int64(pCsr->pStmt, 1); + sqlite3PagerPagecount(pPager, &nPage); + if( nPage==0 ){ + pCsr->isEof = 1; + return sqlite3_reset(pCsr->pStmt); + } + rc = sqlite3PagerGet(pPager, iRoot, &pCsr->aPage[0].pPg, 0); + pCsr->aPage[0].iPgno = iRoot; + pCsr->aPage[0].iCell = 0; + pCsr->aPage[0].zPath = z = sqlite3_mprintf("/"); + pCsr->iPage = 0; + if( z==0 ) rc = SQLITE_NOMEM_BKPT; + }else{ + pCsr->isEof = 1; + return sqlite3_reset(pCsr->pStmt); + } + }else{ + + /* Page p itself has already been visited. */ + StatPage *p = &pCsr->aPage[pCsr->iPage]; + + while( p->iCell<p->nCell ){ + StatCell *pCell = &p->aCell[p->iCell]; + if( pCell->iOvfl<pCell->nOvfl ){ + int nUsable; + sqlite3BtreeEnter(pBt); + nUsable = sqlite3BtreeGetPageSize(pBt) - + sqlite3BtreeGetReserveNoMutex(pBt); + sqlite3BtreeLeave(pBt); + pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0); + pCsr->iPageno = pCell->aOvfl[pCell->iOvfl]; + pCsr->zPagetype = "overflow"; + pCsr->nCell = 0; + pCsr->nMxPayload = 0; + pCsr->zPath = z = sqlite3_mprintf( + "%s%.3x+%.6x", p->zPath, p->iCell, pCell->iOvfl + ); + if( pCell->iOvfl<pCell->nOvfl-1 ){ + pCsr->nUnused = 0; + pCsr->nPayload = nUsable - 4; + }else{ + pCsr->nPayload = pCell->nLastOvfl; + pCsr->nUnused = nUsable - 4 - pCsr->nPayload; + } + pCell->iOvfl++; + statSizeAndOffset(pCsr); + return z==0 ? SQLITE_NOMEM_BKPT : SQLITE_OK; + } + if( p->iRightChildPg ) break; + p->iCell++; + } + + if( !p->iRightChildPg || p->iCell>p->nCell ){ + statClearPage(p); + if( pCsr->iPage==0 ) return statNext(pCursor); + pCsr->iPage--; + goto statNextRestart; /* Tail recursion */ + } + pCsr->iPage++; + assert( p==&pCsr->aPage[pCsr->iPage-1] ); + + if( p->iCell==p->nCell ){ + p[1].iPgno = p->iRightChildPg; + }else{ + p[1].iPgno = p->aCell[p->iCell].iChildPg; + } + rc = sqlite3PagerGet(pPager, p[1].iPgno, &p[1].pPg, 0); + p[1].iCell = 0; + p[1].zPath = z = sqlite3_mprintf("%s%.3x/", p->zPath, p->iCell); + p->iCell++; + if( z==0 ) rc = SQLITE_NOMEM_BKPT; + } + + + /* Populate the StatCursor fields with the values to be returned + ** by the xColumn() and xRowid() methods. + */ + if( rc==SQLITE_OK ){ + int i; + StatPage *p = &pCsr->aPage[pCsr->iPage]; + pCsr->zName = (char *)sqlite3_column_text(pCsr->pStmt, 0); + pCsr->iPageno = p->iPgno; + + rc = statDecodePage(pBt, p); + if( rc==SQLITE_OK ){ + statSizeAndOffset(pCsr); + + switch( p->flags ){ + case 0x05: /* table internal */ + case 0x02: /* index internal */ + pCsr->zPagetype = "internal"; + break; + case 0x0D: /* table leaf */ + case 0x0A: /* index leaf */ + pCsr->zPagetype = "leaf"; + break; + default: + pCsr->zPagetype = "corrupted"; + break; + } + pCsr->nCell = p->nCell; + pCsr->nUnused = p->nUnused; + pCsr->nMxPayload = p->nMxPayload; + pCsr->zPath = z = sqlite3_mprintf("%s", p->zPath); + if( z==0 ) rc = SQLITE_NOMEM_BKPT; + nPayload = 0; + for(i=0; i<p->nCell; i++){ + nPayload += p->aCell[i].nLocal; + } + pCsr->nPayload = nPayload; + } + } + + return rc; +} + +static int statEof(sqlite3_vtab_cursor *pCursor){ + StatCursor *pCsr = (StatCursor *)pCursor; + return pCsr->isEof; +} + +static int statFilter( + sqlite3_vtab_cursor *pCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + StatCursor *pCsr = (StatCursor *)pCursor; + StatTable *pTab = (StatTable*)(pCursor->pVtab); + char *zSql; + int rc = SQLITE_OK; + char *zMaster; + + if( idxNum==1 ){ + const char *zDbase = (const char*)sqlite3_value_text(argv[0]); + pCsr->iDb = sqlite3FindDbName(pTab->db, zDbase); + if( pCsr->iDb<0 ){ + sqlite3_free(pCursor->pVtab->zErrMsg); + pCursor->pVtab->zErrMsg = sqlite3_mprintf("no such schema: %s", zDbase); + return pCursor->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM_BKPT; + } + }else{ + pCsr->iDb = pTab->iDb; + } + statResetCsr(pCsr); + sqlite3_finalize(pCsr->pStmt); + pCsr->pStmt = 0; + zMaster = pCsr->iDb==1 ? "sqlite_temp_master" : "sqlite_master"; + zSql = sqlite3_mprintf( + "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type" + " UNION ALL " + "SELECT name, rootpage, type" + " FROM \"%w\".%s WHERE rootpage!=0" + " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName, zMaster); + if( zSql==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pCsr->pStmt, 0); + sqlite3_free(zSql); + } + + if( rc==SQLITE_OK ){ + rc = statNext(pCursor); + } + return rc; +} + +static int statColumn( + sqlite3_vtab_cursor *pCursor, + sqlite3_context *ctx, + int i +){ + StatCursor *pCsr = (StatCursor *)pCursor; + switch( i ){ + case 0: /* name */ + sqlite3_result_text(ctx, pCsr->zName, -1, SQLITE_TRANSIENT); + break; + case 1: /* path */ + sqlite3_result_text(ctx, pCsr->zPath, -1, SQLITE_TRANSIENT); + break; + case 2: /* pageno */ + sqlite3_result_int64(ctx, pCsr->iPageno); + break; + case 3: /* pagetype */ + sqlite3_result_text(ctx, pCsr->zPagetype, -1, SQLITE_STATIC); + break; + case 4: /* ncell */ + sqlite3_result_int(ctx, pCsr->nCell); + break; + case 5: /* payload */ + sqlite3_result_int(ctx, pCsr->nPayload); + break; + case 6: /* unused */ + sqlite3_result_int(ctx, pCsr->nUnused); + break; + case 7: /* mx_payload */ + sqlite3_result_int(ctx, pCsr->nMxPayload); + break; + case 8: /* pgoffset */ + sqlite3_result_int64(ctx, pCsr->iOffset); + break; + case 9: /* pgsize */ + sqlite3_result_int(ctx, pCsr->szPage); + break; + default: { /* schema */ + sqlite3 *db = sqlite3_context_db_handle(ctx); + int iDb = pCsr->iDb; + sqlite3_result_text(ctx, db->aDb[iDb].zDbSName, -1, SQLITE_STATIC); + break; + } + } + return SQLITE_OK; +} + +static int statRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + StatCursor *pCsr = (StatCursor *)pCursor; + *pRowid = pCsr->iPageno; + return SQLITE_OK; +} + +/* +** Invoke this routine to register the "dbstat" virtual table module +*/ +SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3 *db){ + static sqlite3_module dbstat_module = { + 0, /* iVersion */ + statConnect, /* xCreate */ + statConnect, /* xConnect */ + statBestIndex, /* xBestIndex */ + statDisconnect, /* xDisconnect */ + statDisconnect, /* xDestroy */ + statOpen, /* xOpen - open a cursor */ + statClose, /* xClose - close a cursor */ + statFilter, /* xFilter - configure scan constraints */ + statNext, /* xNext - advance a cursor */ + statEof, /* xEof - check for end of scan */ + statColumn, /* xColumn - read data */ + statRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + }; + return sqlite3_create_module(db, "dbstat", &dbstat_module, 0); +} +#elif defined(SQLITE_ENABLE_DBSTAT_VTAB) +SQLITE_PRIVATE int sqlite3DbstatRegister(sqlite3 *db){ return SQLITE_OK; } +#endif /* SQLITE_ENABLE_DBSTAT_VTAB */ + +/************** End of dbstat.c **********************************************/ +/************** Begin file dbpage.c ******************************************/ +/* +** 2017-10-11 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This file contains an implementation of the "sqlite_dbpage" virtual table. +** +** The sqlite_dbpage virtual table is used to read or write whole raw +** pages of the database file. The pager interface is used so that +** uncommitted changes and changes recorded in the WAL file are correctly +** retrieved. +** +** Usage example: +** +** SELECT data FROM sqlite_dbpage('aux1') WHERE pgno=123; +** +** This is an eponymous virtual table so it does not need to be created before +** use. The optional argument to the sqlite_dbpage() table name is the +** schema for the database file that is to be read. The default schema is +** "main". +** +** The data field of sqlite_dbpage table can be updated. The new +** value must be a BLOB which is the correct page size, otherwise the +** update fails. Rows may not be deleted or inserted. +*/ + +/* #include "sqliteInt.h" ** Requires access to internal data structures ** */ +#if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ + && !defined(SQLITE_OMIT_VIRTUALTABLE) + +typedef struct DbpageTable DbpageTable; +typedef struct DbpageCursor DbpageCursor; + +struct DbpageCursor { + sqlite3_vtab_cursor base; /* Base class. Must be first */ + int pgno; /* Current page number */ + int mxPgno; /* Last page to visit on this scan */ + Pager *pPager; /* Pager being read/written */ + DbPage *pPage1; /* Page 1 of the database */ + int iDb; /* Index of database to analyze */ + int szPage; /* Size of each page in bytes */ +}; + +struct DbpageTable { + sqlite3_vtab base; /* Base class. Must be first */ + sqlite3 *db; /* The database */ +}; + +/* Columns */ +#define DBPAGE_COLUMN_PGNO 0 +#define DBPAGE_COLUMN_DATA 1 +#define DBPAGE_COLUMN_SCHEMA 2 + + + +/* +** Connect to or create a dbpagevfs virtual table. +*/ +static int dbpageConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + DbpageTable *pTab = 0; + int rc = SQLITE_OK; + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(pgno INTEGER PRIMARY KEY, data BLOB, schema HIDDEN)"); + if( rc==SQLITE_OK ){ + pTab = (DbpageTable *)sqlite3_malloc64(sizeof(DbpageTable)); + if( pTab==0 ) rc = SQLITE_NOMEM_BKPT; + } + + assert( rc==SQLITE_OK || pTab==0 ); + if( rc==SQLITE_OK ){ + memset(pTab, 0, sizeof(DbpageTable)); + pTab->db = db; + } + + *ppVtab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** Disconnect from or destroy a dbpagevfs virtual table. +*/ +static int dbpageDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** idxNum: +** +** 0 schema=main, full table scan +** 1 schema=main, pgno=?1 +** 2 schema=?1, full table scan +** 3 schema=?1, pgno=?2 +*/ +static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ + int i; + int iPlan = 0; + + /* If there is a schema= constraint, it must be honored. Report a + ** ridiculously large estimated cost if the schema= constraint is + ** unavailable + */ + for(i=0; i<pIdxInfo->nConstraint; i++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[i]; + if( p->iColumn!=DBPAGE_COLUMN_SCHEMA ) continue; + if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( !p->usable ){ + /* No solution. Use the default SQLITE_BIG_DBL cost */ + pIdxInfo->estimatedRows = 0x7fffffff; + return SQLITE_OK; + } + iPlan = 2; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + break; + } + + /* If we reach this point, it means that either there is no schema= + ** constraint (in which case we use the "main" schema) or else the + ** schema constraint was accepted. Lower the estimated cost accordingly + */ + pIdxInfo->estimatedCost = 1.0e6; + + /* Check for constraints against pgno */ + for(i=0; i<pIdxInfo->nConstraint; i++){ + struct sqlite3_index_constraint *p = &pIdxInfo->aConstraint[i]; + if( p->usable && p->iColumn<=0 && p->op==SQLITE_INDEX_CONSTRAINT_EQ ){ + pIdxInfo->estimatedRows = 1; + pIdxInfo->idxFlags = SQLITE_INDEX_SCAN_UNIQUE; + pIdxInfo->estimatedCost = 1.0; + pIdxInfo->aConstraintUsage[i].argvIndex = iPlan ? 2 : 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + iPlan |= 1; + break; + } + } + pIdxInfo->idxNum = iPlan; + + if( pIdxInfo->nOrderBy>=1 + && pIdxInfo->aOrderBy[0].iColumn<=0 + && pIdxInfo->aOrderBy[0].desc==0 + ){ + pIdxInfo->orderByConsumed = 1; + } + return SQLITE_OK; +} + +/* +** Open a new dbpagevfs cursor. +*/ +static int dbpageOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ + DbpageCursor *pCsr; + + pCsr = (DbpageCursor *)sqlite3_malloc64(sizeof(DbpageCursor)); + if( pCsr==0 ){ + return SQLITE_NOMEM_BKPT; + }else{ + memset(pCsr, 0, sizeof(DbpageCursor)); + pCsr->base.pVtab = pVTab; + pCsr->pgno = -1; + } + + *ppCursor = (sqlite3_vtab_cursor *)pCsr; + return SQLITE_OK; +} + +/* +** Close a dbpagevfs cursor. +*/ +static int dbpageClose(sqlite3_vtab_cursor *pCursor){ + DbpageCursor *pCsr = (DbpageCursor *)pCursor; + if( pCsr->pPage1 ) sqlite3PagerUnrefPageOne(pCsr->pPage1); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +/* +** Move a dbpagevfs cursor to the next entry in the file. +*/ +static int dbpageNext(sqlite3_vtab_cursor *pCursor){ + int rc = SQLITE_OK; + DbpageCursor *pCsr = (DbpageCursor *)pCursor; + pCsr->pgno++; + return rc; +} + +static int dbpageEof(sqlite3_vtab_cursor *pCursor){ + DbpageCursor *pCsr = (DbpageCursor *)pCursor; + return pCsr->pgno > pCsr->mxPgno; +} + +/* +** idxNum: +** +** 0 schema=main, full table scan +** 1 schema=main, pgno=?1 +** 2 schema=?1, full table scan +** 3 schema=?1, pgno=?2 +** +** idxStr is not used +*/ +static int dbpageFilter( + sqlite3_vtab_cursor *pCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + DbpageCursor *pCsr = (DbpageCursor *)pCursor; + DbpageTable *pTab = (DbpageTable *)pCursor->pVtab; + int rc; + sqlite3 *db = pTab->db; + Btree *pBt; + + /* Default setting is no rows of result */ + pCsr->pgno = 1; + pCsr->mxPgno = 0; + + if( idxNum & 2 ){ + const char *zSchema; + assert( argc>=1 ); + zSchema = (const char*)sqlite3_value_text(argv[0]); + pCsr->iDb = sqlite3FindDbName(db, zSchema); + if( pCsr->iDb<0 ) return SQLITE_OK; + }else{ + pCsr->iDb = 0; + } + pBt = db->aDb[pCsr->iDb].pBt; + if( pBt==0 ) return SQLITE_OK; + pCsr->pPager = sqlite3BtreePager(pBt); + pCsr->szPage = sqlite3BtreeGetPageSize(pBt); + pCsr->mxPgno = sqlite3BtreeLastPage(pBt); + if( idxNum & 1 ){ + assert( argc>(idxNum>>1) ); + pCsr->pgno = sqlite3_value_int(argv[idxNum>>1]); + if( pCsr->pgno<1 || pCsr->pgno>pCsr->mxPgno ){ + pCsr->pgno = 1; + pCsr->mxPgno = 0; + }else{ + pCsr->mxPgno = pCsr->pgno; + } + }else{ + assert( pCsr->pgno==1 ); + } + if( pCsr->pPage1 ) sqlite3PagerUnrefPageOne(pCsr->pPage1); + rc = sqlite3PagerGet(pCsr->pPager, 1, &pCsr->pPage1, 0); + return rc; +} + +static int dbpageColumn( + sqlite3_vtab_cursor *pCursor, + sqlite3_context *ctx, + int i +){ + DbpageCursor *pCsr = (DbpageCursor *)pCursor; + int rc = SQLITE_OK; + switch( i ){ + case 0: { /* pgno */ + sqlite3_result_int(ctx, pCsr->pgno); + break; + } + case 1: { /* data */ + DbPage *pDbPage = 0; + rc = sqlite3PagerGet(pCsr->pPager, pCsr->pgno, (DbPage**)&pDbPage, 0); + if( rc==SQLITE_OK ){ + sqlite3_result_blob(ctx, sqlite3PagerGetData(pDbPage), pCsr->szPage, + SQLITE_TRANSIENT); + } + sqlite3PagerUnref(pDbPage); + break; + } + default: { /* schema */ + sqlite3 *db = sqlite3_context_db_handle(ctx); + sqlite3_result_text(ctx, db->aDb[pCsr->iDb].zDbSName, -1, SQLITE_STATIC); + break; + } + } + return SQLITE_OK; +} + +static int dbpageRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + DbpageCursor *pCsr = (DbpageCursor *)pCursor; + *pRowid = pCsr->pgno; + return SQLITE_OK; +} + +static int dbpageUpdate( + sqlite3_vtab *pVtab, + int argc, + sqlite3_value **argv, + sqlite_int64 *pRowid +){ + DbpageTable *pTab = (DbpageTable *)pVtab; + Pgno pgno; + DbPage *pDbPage = 0; + int rc = SQLITE_OK; + char *zErr = 0; + const char *zSchema; + int iDb; + Btree *pBt; + Pager *pPager; + int szPage; + + if( argc==1 ){ + zErr = "cannot delete"; + goto update_fail; + } + pgno = sqlite3_value_int(argv[0]); + if( (Pgno)sqlite3_value_int(argv[1])!=pgno ){ + zErr = "cannot insert"; + goto update_fail; + } + zSchema = (const char*)sqlite3_value_text(argv[4]); + iDb = zSchema ? sqlite3FindDbName(pTab->db, zSchema) : -1; + if( iDb<0 ){ + zErr = "no such schema"; + goto update_fail; + } + pBt = pTab->db->aDb[iDb].pBt; + if( pgno<1 || pBt==0 || pgno>(int)sqlite3BtreeLastPage(pBt) ){ + zErr = "bad page number"; + goto update_fail; + } + szPage = sqlite3BtreeGetPageSize(pBt); + if( sqlite3_value_type(argv[3])!=SQLITE_BLOB + || sqlite3_value_bytes(argv[3])!=szPage + ){ + zErr = "bad page value"; + goto update_fail; + } + pPager = sqlite3BtreePager(pBt); + rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pDbPage, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3PagerWrite(pDbPage); + if( rc==SQLITE_OK ){ + memcpy(sqlite3PagerGetData(pDbPage), + sqlite3_value_blob(argv[3]), + szPage); + } + } + sqlite3PagerUnref(pDbPage); + return rc; + +update_fail: + sqlite3_free(pVtab->zErrMsg); + pVtab->zErrMsg = sqlite3_mprintf("%s", zErr); + return SQLITE_ERROR; +} + +/* Since we do not know in advance which database files will be +** written by the sqlite_dbpage virtual table, start a write transaction +** on them all. +*/ +static int dbpageBegin(sqlite3_vtab *pVtab){ + DbpageTable *pTab = (DbpageTable *)pVtab; + sqlite3 *db = pTab->db; + int i; + for(i=0; i<db->nDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ) sqlite3BtreeBeginTrans(pBt, 1); + } + return SQLITE_OK; +} + + +/* +** Invoke this routine to register the "dbpage" virtual table module +*/ +SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){ + static sqlite3_module dbpage_module = { + 0, /* iVersion */ + dbpageConnect, /* xCreate */ + dbpageConnect, /* xConnect */ + dbpageBestIndex, /* xBestIndex */ + dbpageDisconnect, /* xDisconnect */ + dbpageDisconnect, /* xDestroy */ + dbpageOpen, /* xOpen - open a cursor */ + dbpageClose, /* xClose - close a cursor */ + dbpageFilter, /* xFilter - configure scan constraints */ + dbpageNext, /* xNext - advance a cursor */ + dbpageEof, /* xEof - check for end of scan */ + dbpageColumn, /* xColumn - read data */ + dbpageRowid, /* xRowid - read data */ + dbpageUpdate, /* xUpdate */ + dbpageBegin, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ + }; + return sqlite3_create_module(db, "sqlite_dbpage", &dbpage_module, 0); +} +#elif defined(SQLITE_ENABLE_DBPAGE_VTAB) +SQLITE_PRIVATE int sqlite3DbpageRegister(sqlite3 *db){ return SQLITE_OK; } +#endif /* SQLITE_ENABLE_DBSTAT_VTAB */ + +/************** End of dbpage.c **********************************************/ +/************** Begin file sqlite3session.c **********************************/ + +#if defined(SQLITE_ENABLE_SESSION) && defined(SQLITE_ENABLE_PREUPDATE_HOOK) +/* #include "sqlite3session.h" */ +/* #include <assert.h> */ +/* #include <string.h> */ + +#ifndef SQLITE_AMALGAMATION +/* # include "sqliteInt.h" */ +/* # include "vdbeInt.h" */ +#endif + +typedef struct SessionTable SessionTable; +typedef struct SessionChange SessionChange; +typedef struct SessionBuffer SessionBuffer; +typedef struct SessionInput SessionInput; + +/* +** Minimum chunk size used by streaming versions of functions. +*/ +#ifndef SESSIONS_STRM_CHUNK_SIZE +# ifdef SQLITE_TEST +# define SESSIONS_STRM_CHUNK_SIZE 64 +# else +# define SESSIONS_STRM_CHUNK_SIZE 1024 +# endif +#endif + +typedef struct SessionHook SessionHook; +struct SessionHook { + void *pCtx; + int (*xOld)(void*,int,sqlite3_value**); + int (*xNew)(void*,int,sqlite3_value**); + int (*xCount)(void*); + int (*xDepth)(void*); +}; + +/* +** Session handle structure. +*/ +struct sqlite3_session { + sqlite3 *db; /* Database handle session is attached to */ + char *zDb; /* Name of database session is attached to */ + int bEnable; /* True if currently recording */ + int bIndirect; /* True if all changes are indirect */ + int bAutoAttach; /* True to auto-attach tables */ + int rc; /* Non-zero if an error has occurred */ + void *pFilterCtx; /* First argument to pass to xTableFilter */ + int (*xTableFilter)(void *pCtx, const char *zTab); + sqlite3_value *pZeroBlob; /* Value containing X'' */ + sqlite3_session *pNext; /* Next session object on same db. */ + SessionTable *pTable; /* List of attached tables */ + SessionHook hook; /* APIs to grab new and old data with */ +}; + +/* +** Instances of this structure are used to build strings or binary records. +*/ +struct SessionBuffer { + u8 *aBuf; /* Pointer to changeset buffer */ + int nBuf; /* Size of buffer aBuf */ + int nAlloc; /* Size of allocation containing aBuf */ +}; + +/* +** An object of this type is used internally as an abstraction for +** input data. Input data may be supplied either as a single large buffer +** (e.g. sqlite3changeset_start()) or using a stream function (e.g. +** sqlite3changeset_start_strm()). +*/ +struct SessionInput { + int bNoDiscard; /* If true, do not discard in InputBuffer() */ + int iCurrent; /* Offset in aData[] of current change */ + int iNext; /* Offset in aData[] of next change */ + u8 *aData; /* Pointer to buffer containing changeset */ + int nData; /* Number of bytes in aData */ + + SessionBuffer buf; /* Current read buffer */ + int (*xInput)(void*, void*, int*); /* Input stream call (or NULL) */ + void *pIn; /* First argument to xInput */ + int bEof; /* Set to true after xInput finished */ +}; + +/* +** Structure for changeset iterators. +*/ +struct sqlite3_changeset_iter { + SessionInput in; /* Input buffer or stream */ + SessionBuffer tblhdr; /* Buffer to hold apValue/zTab/abPK/ */ + int bPatchset; /* True if this is a patchset */ + int rc; /* Iterator error code */ + sqlite3_stmt *pConflict; /* Points to conflicting row, if any */ + char *zTab; /* Current table */ + int nCol; /* Number of columns in zTab */ + int op; /* Current operation */ + int bIndirect; /* True if current change was indirect */ + u8 *abPK; /* Primary key array */ + sqlite3_value **apValue; /* old.* and new.* values */ +}; + +/* +** Each session object maintains a set of the following structures, one +** for each table the session object is monitoring. The structures are +** stored in a linked list starting at sqlite3_session.pTable. +** +** The keys of the SessionTable.aChange[] hash table are all rows that have +** been modified in any way since the session object was attached to the +** table. +** +** The data associated with each hash-table entry is a structure containing +** a subset of the initial values that the modified row contained at the +** start of the session. Or no initial values if the row was inserted. +*/ +struct SessionTable { + SessionTable *pNext; + char *zName; /* Local name of table */ + int nCol; /* Number of columns in table zName */ + int bStat1; /* True if this is sqlite_stat1 */ + const char **azCol; /* Column names */ + u8 *abPK; /* Array of primary key flags */ + int nEntry; /* Total number of entries in hash table */ + int nChange; /* Size of apChange[] array */ + SessionChange **apChange; /* Hash table buckets */ +}; + +/* +** RECORD FORMAT: +** +** The following record format is similar to (but not compatible with) that +** used in SQLite database files. This format is used as part of the +** change-set binary format, and so must be architecture independent. +** +** Unlike the SQLite database record format, each field is self-contained - +** there is no separation of header and data. Each field begins with a +** single byte describing its type, as follows: +** +** 0x00: Undefined value. +** 0x01: Integer value. +** 0x02: Real value. +** 0x03: Text value. +** 0x04: Blob value. +** 0x05: SQL NULL value. +** +** Note that the above match the definitions of SQLITE_INTEGER, SQLITE_TEXT +** and so on in sqlite3.h. For undefined and NULL values, the field consists +** only of the single type byte. For other types of values, the type byte +** is followed by: +** +** Text values: +** A varint containing the number of bytes in the value (encoded using +** UTF-8). Followed by a buffer containing the UTF-8 representation +** of the text value. There is no nul terminator. +** +** Blob values: +** A varint containing the number of bytes in the value, followed by +** a buffer containing the value itself. +** +** Integer values: +** An 8-byte big-endian integer value. +** +** Real values: +** An 8-byte big-endian IEEE 754-2008 real value. +** +** Varint values are encoded in the same way as varints in the SQLite +** record format. +** +** CHANGESET FORMAT: +** +** A changeset is a collection of DELETE, UPDATE and INSERT operations on +** one or more tables. Operations on a single table are grouped together, +** but may occur in any order (i.e. deletes, updates and inserts are all +** mixed together). +** +** Each group of changes begins with a table header: +** +** 1 byte: Constant 0x54 (capital 'T') +** Varint: Number of columns in the table. +** nCol bytes: 0x01 for PK columns, 0x00 otherwise. +** N bytes: Unqualified table name (encoded using UTF-8). Nul-terminated. +** +** Followed by one or more changes to the table. +** +** 1 byte: Either SQLITE_INSERT (0x12), UPDATE (0x17) or DELETE (0x09). +** 1 byte: The "indirect-change" flag. +** old.* record: (delete and update only) +** new.* record: (insert and update only) +** +** The "old.*" and "new.*" records, if present, are N field records in the +** format described above under "RECORD FORMAT", where N is the number of +** columns in the table. The i'th field of each record is associated with +** the i'th column of the table, counting from left to right in the order +** in which columns were declared in the CREATE TABLE statement. +** +** The new.* record that is part of each INSERT change contains the values +** that make up the new row. Similarly, the old.* record that is part of each +** DELETE change contains the values that made up the row that was deleted +** from the database. In the changeset format, the records that are part +** of INSERT or DELETE changes never contain any undefined (type byte 0x00) +** fields. +** +** Within the old.* record associated with an UPDATE change, all fields +** associated with table columns that are not PRIMARY KEY columns and are +** not modified by the UPDATE change are set to "undefined". Other fields +** are set to the values that made up the row before the UPDATE that the +** change records took place. Within the new.* record, fields associated +** with table columns modified by the UPDATE change contain the new +** values. Fields associated with table columns that are not modified +** are set to "undefined". +** +** PATCHSET FORMAT: +** +** A patchset is also a collection of changes. It is similar to a changeset, +** but leaves undefined those fields that are not useful if no conflict +** resolution is required when applying the changeset. +** +** Each group of changes begins with a table header: +** +** 1 byte: Constant 0x50 (capital 'P') +** Varint: Number of columns in the table. +** nCol bytes: 0x01 for PK columns, 0x00 otherwise. +** N bytes: Unqualified table name (encoded using UTF-8). Nul-terminated. +** +** Followed by one or more changes to the table. +** +** 1 byte: Either SQLITE_INSERT (0x12), UPDATE (0x17) or DELETE (0x09). +** 1 byte: The "indirect-change" flag. +** single record: (PK fields for DELETE, PK and modified fields for UPDATE, +** full record for INSERT). +** +** As in the changeset format, each field of the single record that is part +** of a patchset change is associated with the correspondingly positioned +** table column, counting from left to right within the CREATE TABLE +** statement. +** +** For a DELETE change, all fields within the record except those associated +** with PRIMARY KEY columns are omitted. The PRIMARY KEY fields contain the +** values identifying the row to delete. +** +** For an UPDATE change, all fields except those associated with PRIMARY KEY +** columns and columns that are modified by the UPDATE are set to "undefined". +** PRIMARY KEY fields contain the values identifying the table row to update, +** and fields associated with modified columns contain the new column values. +** +** The records associated with INSERT changes are in the same format as for +** changesets. It is not possible for a record associated with an INSERT +** change to contain a field set to "undefined". +*/ + +/* +** For each row modified during a session, there exists a single instance of +** this structure stored in a SessionTable.aChange[] hash table. +*/ +struct SessionChange { + int op; /* One of UPDATE, DELETE, INSERT */ + int bIndirect; /* True if this change is "indirect" */ + int nRecord; /* Number of bytes in buffer aRecord[] */ + u8 *aRecord; /* Buffer containing old.* record */ + SessionChange *pNext; /* For hash-table collisions */ +}; + +/* +** Write a varint with value iVal into the buffer at aBuf. Return the +** number of bytes written. +*/ +static int sessionVarintPut(u8 *aBuf, int iVal){ + return putVarint32(aBuf, iVal); +} + +/* +** Return the number of bytes required to store value iVal as a varint. +*/ +static int sessionVarintLen(int iVal){ + return sqlite3VarintLen(iVal); +} + +/* +** Read a varint value from aBuf[] into *piVal. Return the number of +** bytes read. +*/ +static int sessionVarintGet(u8 *aBuf, int *piVal){ + return getVarint32(aBuf, *piVal); +} + +/* Load an unaligned and unsigned 32-bit integer */ +#define SESSION_UINT32(x) (((u32)(x)[0]<<24)|((x)[1]<<16)|((x)[2]<<8)|(x)[3]) + +/* +** Read a 64-bit big-endian integer value from buffer aRec[]. Return +** the value read. +*/ +static sqlite3_int64 sessionGetI64(u8 *aRec){ + u64 x = SESSION_UINT32(aRec); + u32 y = SESSION_UINT32(aRec+4); + x = (x<<32) + y; + return (sqlite3_int64)x; +} + +/* +** Write a 64-bit big-endian integer value to the buffer aBuf[]. +*/ +static void sessionPutI64(u8 *aBuf, sqlite3_int64 i){ + aBuf[0] = (i>>56) & 0xFF; + aBuf[1] = (i>>48) & 0xFF; + aBuf[2] = (i>>40) & 0xFF; + aBuf[3] = (i>>32) & 0xFF; + aBuf[4] = (i>>24) & 0xFF; + aBuf[5] = (i>>16) & 0xFF; + aBuf[6] = (i>> 8) & 0xFF; + aBuf[7] = (i>> 0) & 0xFF; +} + +/* +** This function is used to serialize the contents of value pValue (see +** comment titled "RECORD FORMAT" above). +** +** If it is non-NULL, the serialized form of the value is written to +** buffer aBuf. *pnWrite is set to the number of bytes written before +** returning. Or, if aBuf is NULL, the only thing this function does is +** set *pnWrite. +** +** If no error occurs, SQLITE_OK is returned. Or, if an OOM error occurs +** within a call to sqlite3_value_text() (may fail if the db is utf-16)) +** SQLITE_NOMEM is returned. +*/ +static int sessionSerializeValue( + u8 *aBuf, /* If non-NULL, write serialized value here */ + sqlite3_value *pValue, /* Value to serialize */ + int *pnWrite /* IN/OUT: Increment by bytes written */ +){ + int nByte; /* Size of serialized value in bytes */ + + if( pValue ){ + int eType; /* Value type (SQLITE_NULL, TEXT etc.) */ + + eType = sqlite3_value_type(pValue); + if( aBuf ) aBuf[0] = eType; + + switch( eType ){ + case SQLITE_NULL: + nByte = 1; + break; + + case SQLITE_INTEGER: + case SQLITE_FLOAT: + if( aBuf ){ + /* TODO: SQLite does something special to deal with mixed-endian + ** floating point values (e.g. ARM7). This code probably should + ** too. */ + u64 i; + if( eType==SQLITE_INTEGER ){ + i = (u64)sqlite3_value_int64(pValue); + }else{ + double r; + assert( sizeof(double)==8 && sizeof(u64)==8 ); + r = sqlite3_value_double(pValue); + memcpy(&i, &r, 8); + } + sessionPutI64(&aBuf[1], i); + } + nByte = 9; + break; + + default: { + u8 *z; + int n; + int nVarint; + + assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); + if( eType==SQLITE_TEXT ){ + z = (u8 *)sqlite3_value_text(pValue); + }else{ + z = (u8 *)sqlite3_value_blob(pValue); + } + n = sqlite3_value_bytes(pValue); + if( z==0 && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM; + nVarint = sessionVarintLen(n); + + if( aBuf ){ + sessionVarintPut(&aBuf[1], n); + if( n ) memcpy(&aBuf[nVarint + 1], z, n); + } + + nByte = 1 + nVarint + n; + break; + } + } + }else{ + nByte = 1; + if( aBuf ) aBuf[0] = '\0'; + } + + if( pnWrite ) *pnWrite += nByte; + return SQLITE_OK; +} + + +/* +** This macro is used to calculate hash key values for data structures. In +** order to use this macro, the entire data structure must be represented +** as a series of unsigned integers. In order to calculate a hash-key value +** for a data structure represented as three such integers, the macro may +** then be used as follows: +** +** int hash_key_value; +** hash_key_value = HASH_APPEND(0, <value 1>); +** hash_key_value = HASH_APPEND(hash_key_value, <value 2>); +** hash_key_value = HASH_APPEND(hash_key_value, <value 3>); +** +** In practice, the data structures this macro is used for are the primary +** key values of modified rows. +*/ +#define HASH_APPEND(hash, add) ((hash) << 3) ^ (hash) ^ (unsigned int)(add) + +/* +** Append the hash of the 64-bit integer passed as the second argument to the +** hash-key value passed as the first. Return the new hash-key value. +*/ +static unsigned int sessionHashAppendI64(unsigned int h, i64 i){ + h = HASH_APPEND(h, i & 0xFFFFFFFF); + return HASH_APPEND(h, (i>>32)&0xFFFFFFFF); +} + +/* +** Append the hash of the blob passed via the second and third arguments to +** the hash-key value passed as the first. Return the new hash-key value. +*/ +static unsigned int sessionHashAppendBlob(unsigned int h, int n, const u8 *z){ + int i; + for(i=0; i<n; i++) h = HASH_APPEND(h, z[i]); + return h; +} + +/* +** Append the hash of the data type passed as the second argument to the +** hash-key value passed as the first. Return the new hash-key value. +*/ +static unsigned int sessionHashAppendType(unsigned int h, int eType){ + return HASH_APPEND(h, eType); +} + +/* +** This function may only be called from within a pre-update callback. +** It calculates a hash based on the primary key values of the old.* or +** new.* row currently available and, assuming no error occurs, writes it to +** *piHash before returning. If the primary key contains one or more NULL +** values, *pbNullPK is set to true before returning. +** +** If an error occurs, an SQLite error code is returned and the final values +** of *piHash asn *pbNullPK are undefined. Otherwise, SQLITE_OK is returned +** and the output variables are set as described above. +*/ +static int sessionPreupdateHash( + sqlite3_session *pSession, /* Session object that owns pTab */ + SessionTable *pTab, /* Session table handle */ + int bNew, /* True to hash the new.* PK */ + int *piHash, /* OUT: Hash value */ + int *pbNullPK /* OUT: True if there are NULL values in PK */ +){ + unsigned int h = 0; /* Hash value to return */ + int i; /* Used to iterate through columns */ + + assert( *pbNullPK==0 ); + assert( pTab->nCol==pSession->hook.xCount(pSession->hook.pCtx) ); + for(i=0; i<pTab->nCol; i++){ + if( pTab->abPK[i] ){ + int rc; + int eType; + sqlite3_value *pVal; + + if( bNew ){ + rc = pSession->hook.xNew(pSession->hook.pCtx, i, &pVal); + }else{ + rc = pSession->hook.xOld(pSession->hook.pCtx, i, &pVal); + } + if( rc!=SQLITE_OK ) return rc; + + eType = sqlite3_value_type(pVal); + h = sessionHashAppendType(h, eType); + if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + i64 iVal; + if( eType==SQLITE_INTEGER ){ + iVal = sqlite3_value_int64(pVal); + }else{ + double rVal = sqlite3_value_double(pVal); + assert( sizeof(iVal)==8 && sizeof(rVal)==8 ); + memcpy(&iVal, &rVal, 8); + } + h = sessionHashAppendI64(h, iVal); + }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){ + const u8 *z; + int n; + if( eType==SQLITE_TEXT ){ + z = (const u8 *)sqlite3_value_text(pVal); + }else{ + z = (const u8 *)sqlite3_value_blob(pVal); + } + n = sqlite3_value_bytes(pVal); + if( !z && (eType!=SQLITE_BLOB || n>0) ) return SQLITE_NOMEM; + h = sessionHashAppendBlob(h, n, z); + }else{ + assert( eType==SQLITE_NULL ); + assert( pTab->bStat1==0 || i!=1 ); + *pbNullPK = 1; + } + } + } + + *piHash = (h % pTab->nChange); + return SQLITE_OK; +} + +/* +** The buffer that the argument points to contains a serialized SQL value. +** Return the number of bytes of space occupied by the value (including +** the type byte). +*/ +static int sessionSerialLen(u8 *a){ + int e = *a; + int n; + if( e==0 || e==0xFF ) return 1; + if( e==SQLITE_NULL ) return 1; + if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9; + return sessionVarintGet(&a[1], &n) + 1 + n; +} + +/* +** Based on the primary key values stored in change aRecord, calculate a +** hash key. Assume the has table has nBucket buckets. The hash keys +** calculated by this function are compatible with those calculated by +** sessionPreupdateHash(). +** +** The bPkOnly argument is non-zero if the record at aRecord[] is from +** a patchset DELETE. In this case the non-PK fields are omitted entirely. +*/ +static unsigned int sessionChangeHash( + SessionTable *pTab, /* Table handle */ + int bPkOnly, /* Record consists of PK fields only */ + u8 *aRecord, /* Change record */ + int nBucket /* Assume this many buckets in hash table */ +){ + unsigned int h = 0; /* Value to return */ + int i; /* Used to iterate through columns */ + u8 *a = aRecord; /* Used to iterate through change record */ + + for(i=0; i<pTab->nCol; i++){ + int eType = *a; + int isPK = pTab->abPK[i]; + if( bPkOnly && isPK==0 ) continue; + + /* It is not possible for eType to be SQLITE_NULL here. The session + ** module does not record changes for rows with NULL values stored in + ** primary key columns. */ + assert( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT + || eType==SQLITE_TEXT || eType==SQLITE_BLOB + || eType==SQLITE_NULL || eType==0 + ); + assert( !isPK || (eType!=0 && eType!=SQLITE_NULL) ); + + if( isPK ){ + a++; + h = sessionHashAppendType(h, eType); + if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + h = sessionHashAppendI64(h, sessionGetI64(a)); + a += 8; + }else{ + int n; + a += sessionVarintGet(a, &n); + h = sessionHashAppendBlob(h, n, a); + a += n; + } + }else{ + a += sessionSerialLen(a); + } + } + return (h % nBucket); +} + +/* +** Arguments aLeft and aRight are pointers to change records for table pTab. +** This function returns true if the two records apply to the same row (i.e. +** have the same values stored in the primary key columns), or false +** otherwise. +*/ +static int sessionChangeEqual( + SessionTable *pTab, /* Table used for PK definition */ + int bLeftPkOnly, /* True if aLeft[] contains PK fields only */ + u8 *aLeft, /* Change record */ + int bRightPkOnly, /* True if aRight[] contains PK fields only */ + u8 *aRight /* Change record */ +){ + u8 *a1 = aLeft; /* Cursor to iterate through aLeft */ + u8 *a2 = aRight; /* Cursor to iterate through aRight */ + int iCol; /* Used to iterate through table columns */ + + for(iCol=0; iCol<pTab->nCol; iCol++){ + if( pTab->abPK[iCol] ){ + int n1 = sessionSerialLen(a1); + int n2 = sessionSerialLen(a2); + + if( n1!=n2 || memcmp(a1, a2, n1) ){ + return 0; + } + a1 += n1; + a2 += n2; + }else{ + if( bLeftPkOnly==0 ) a1 += sessionSerialLen(a1); + if( bRightPkOnly==0 ) a2 += sessionSerialLen(a2); + } + } + + return 1; +} + +/* +** Arguments aLeft and aRight both point to buffers containing change +** records with nCol columns. This function "merges" the two records into +** a single records which is written to the buffer at *paOut. *paOut is +** then set to point to one byte after the last byte written before +** returning. +** +** The merging of records is done as follows: For each column, if the +** aRight record contains a value for the column, copy the value from +** their. Otherwise, if aLeft contains a value, copy it. If neither +** record contains a value for a given column, then neither does the +** output record. +*/ +static void sessionMergeRecord( + u8 **paOut, + int nCol, + u8 *aLeft, + u8 *aRight +){ + u8 *a1 = aLeft; /* Cursor used to iterate through aLeft */ + u8 *a2 = aRight; /* Cursor used to iterate through aRight */ + u8 *aOut = *paOut; /* Output cursor */ + int iCol; /* Used to iterate from 0 to nCol */ + + for(iCol=0; iCol<nCol; iCol++){ + int n1 = sessionSerialLen(a1); + int n2 = sessionSerialLen(a2); + if( *a2 ){ + memcpy(aOut, a2, n2); + aOut += n2; + }else{ + memcpy(aOut, a1, n1); + aOut += n1; + } + a1 += n1; + a2 += n2; + } + + *paOut = aOut; +} + +/* +** This is a helper function used by sessionMergeUpdate(). +** +** When this function is called, both *paOne and *paTwo point to a value +** within a change record. Before it returns, both have been advanced so +** as to point to the next value in the record. +** +** If, when this function is called, *paTwo points to a valid value (i.e. +** *paTwo[0] is not 0x00 - the "no value" placeholder), a copy of the *paTwo +** pointer is returned and *pnVal is set to the number of bytes in the +** serialized value. Otherwise, a copy of *paOne is returned and *pnVal +** set to the number of bytes in the value at *paOne. If *paOne points +** to the "no value" placeholder, *pnVal is set to 1. In other words: +** +** if( *paTwo is valid ) return *paTwo; +** return *paOne; +** +*/ +static u8 *sessionMergeValue( + u8 **paOne, /* IN/OUT: Left-hand buffer pointer */ + u8 **paTwo, /* IN/OUT: Right-hand buffer pointer */ + int *pnVal /* OUT: Bytes in returned value */ +){ + u8 *a1 = *paOne; + u8 *a2 = *paTwo; + u8 *pRet = 0; + int n1; + + assert( a1 ); + if( a2 ){ + int n2 = sessionSerialLen(a2); + if( *a2 ){ + *pnVal = n2; + pRet = a2; + } + *paTwo = &a2[n2]; + } + + n1 = sessionSerialLen(a1); + if( pRet==0 ){ + *pnVal = n1; + pRet = a1; + } + *paOne = &a1[n1]; + + return pRet; +} + +/* +** This function is used by changeset_concat() to merge two UPDATE changes +** on the same row. +*/ +static int sessionMergeUpdate( + u8 **paOut, /* IN/OUT: Pointer to output buffer */ + SessionTable *pTab, /* Table change pertains to */ + int bPatchset, /* True if records are patchset records */ + u8 *aOldRecord1, /* old.* record for first change */ + u8 *aOldRecord2, /* old.* record for second change */ + u8 *aNewRecord1, /* new.* record for first change */ + u8 *aNewRecord2 /* new.* record for second change */ +){ + u8 *aOld1 = aOldRecord1; + u8 *aOld2 = aOldRecord2; + u8 *aNew1 = aNewRecord1; + u8 *aNew2 = aNewRecord2; + + u8 *aOut = *paOut; + int i; + + if( bPatchset==0 ){ + int bRequired = 0; + + assert( aOldRecord1 && aNewRecord1 ); + + /* Write the old.* vector first. */ + for(i=0; i<pTab->nCol; i++){ + int nOld; + u8 *aOld; + int nNew; + u8 *aNew; + + aOld = sessionMergeValue(&aOld1, &aOld2, &nOld); + aNew = sessionMergeValue(&aNew1, &aNew2, &nNew); + if( pTab->abPK[i] || nOld!=nNew || memcmp(aOld, aNew, nNew) ){ + if( pTab->abPK[i]==0 ) bRequired = 1; + memcpy(aOut, aOld, nOld); + aOut += nOld; + }else{ + *(aOut++) = '\0'; + } + } + + if( !bRequired ) return 0; + } + + /* Write the new.* vector */ + aOld1 = aOldRecord1; + aOld2 = aOldRecord2; + aNew1 = aNewRecord1; + aNew2 = aNewRecord2; + for(i=0; i<pTab->nCol; i++){ + int nOld; + u8 *aOld; + int nNew; + u8 *aNew; + + aOld = sessionMergeValue(&aOld1, &aOld2, &nOld); + aNew = sessionMergeValue(&aNew1, &aNew2, &nNew); + if( bPatchset==0 + && (pTab->abPK[i] || (nOld==nNew && 0==memcmp(aOld, aNew, nNew))) + ){ + *(aOut++) = '\0'; + }else{ + memcpy(aOut, aNew, nNew); + aOut += nNew; + } + } + + *paOut = aOut; + return 1; +} + +/* +** This function is only called from within a pre-update-hook callback. +** It determines if the current pre-update-hook change affects the same row +** as the change stored in argument pChange. If so, it returns true. Otherwise +** if the pre-update-hook does not affect the same row as pChange, it returns +** false. +*/ +static int sessionPreupdateEqual( + sqlite3_session *pSession, /* Session object that owns SessionTable */ + SessionTable *pTab, /* Table associated with change */ + SessionChange *pChange, /* Change to compare to */ + int op /* Current pre-update operation */ +){ + int iCol; /* Used to iterate through columns */ + u8 *a = pChange->aRecord; /* Cursor used to scan change record */ + + assert( op==SQLITE_INSERT || op==SQLITE_UPDATE || op==SQLITE_DELETE ); + for(iCol=0; iCol<pTab->nCol; iCol++){ + if( !pTab->abPK[iCol] ){ + a += sessionSerialLen(a); + }else{ + sqlite3_value *pVal; /* Value returned by preupdate_new/old */ + int rc; /* Error code from preupdate_new/old */ + int eType = *a++; /* Type of value from change record */ + + /* The following calls to preupdate_new() and preupdate_old() can not + ** fail. This is because they cache their return values, and by the + ** time control flows to here they have already been called once from + ** within sessionPreupdateHash(). The first two asserts below verify + ** this (that the method has already been called). */ + if( op==SQLITE_INSERT ){ + /* assert( db->pPreUpdate->pNewUnpacked || db->pPreUpdate->aNew ); */ + rc = pSession->hook.xNew(pSession->hook.pCtx, iCol, &pVal); + }else{ + /* assert( db->pPreUpdate->pUnpacked ); */ + rc = pSession->hook.xOld(pSession->hook.pCtx, iCol, &pVal); + } + assert( rc==SQLITE_OK ); + if( sqlite3_value_type(pVal)!=eType ) return 0; + + /* A SessionChange object never has a NULL value in a PK column */ + assert( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT + || eType==SQLITE_BLOB || eType==SQLITE_TEXT + ); + + if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + i64 iVal = sessionGetI64(a); + a += 8; + if( eType==SQLITE_INTEGER ){ + if( sqlite3_value_int64(pVal)!=iVal ) return 0; + }else{ + double rVal; + assert( sizeof(iVal)==8 && sizeof(rVal)==8 ); + memcpy(&rVal, &iVal, 8); + if( sqlite3_value_double(pVal)!=rVal ) return 0; + } + }else{ + int n; + const u8 *z; + a += sessionVarintGet(a, &n); + if( sqlite3_value_bytes(pVal)!=n ) return 0; + if( eType==SQLITE_TEXT ){ + z = sqlite3_value_text(pVal); + }else{ + z = sqlite3_value_blob(pVal); + } + if( n>0 && memcmp(a, z, n) ) return 0; + a += n; + } + } + } + + return 1; +} + +/* +** If required, grow the hash table used to store changes on table pTab +** (part of the session pSession). If a fatal OOM error occurs, set the +** session object to failed and return SQLITE_ERROR. Otherwise, return +** SQLITE_OK. +** +** It is possible that a non-fatal OOM error occurs in this function. In +** that case the hash-table does not grow, but SQLITE_OK is returned anyway. +** Growing the hash table in this case is a performance optimization only, +** it is not required for correct operation. +*/ +static int sessionGrowHash(int bPatchset, SessionTable *pTab){ + if( pTab->nChange==0 || pTab->nEntry>=(pTab->nChange/2) ){ + int i; + SessionChange **apNew; + int nNew = (pTab->nChange ? pTab->nChange : 128) * 2; + + apNew = (SessionChange **)sqlite3_malloc(sizeof(SessionChange *) * nNew); + if( apNew==0 ){ + if( pTab->nChange==0 ){ + return SQLITE_ERROR; + } + return SQLITE_OK; + } + memset(apNew, 0, sizeof(SessionChange *) * nNew); + + for(i=0; i<pTab->nChange; i++){ + SessionChange *p; + SessionChange *pNext; + for(p=pTab->apChange[i]; p; p=pNext){ + int bPkOnly = (p->op==SQLITE_DELETE && bPatchset); + int iHash = sessionChangeHash(pTab, bPkOnly, p->aRecord, nNew); + pNext = p->pNext; + p->pNext = apNew[iHash]; + apNew[iHash] = p; + } + } + + sqlite3_free(pTab->apChange); + pTab->nChange = nNew; + pTab->apChange = apNew; + } + + return SQLITE_OK; +} + +/* +** This function queries the database for the names of the columns of table +** zThis, in schema zDb. +** +** Otherwise, if they are not NULL, variable *pnCol is set to the number +** of columns in the database table and variable *pzTab is set to point to a +** nul-terminated copy of the table name. *pazCol (if not NULL) is set to +** point to an array of pointers to column names. And *pabPK (again, if not +** NULL) is set to point to an array of booleans - true if the corresponding +** column is part of the primary key. +** +** For example, if the table is declared as: +** +** CREATE TABLE tbl1(w, x, y, z, PRIMARY KEY(w, z)); +** +** Then the four output variables are populated as follows: +** +** *pnCol = 4 +** *pzTab = "tbl1" +** *pazCol = {"w", "x", "y", "z"} +** *pabPK = {1, 0, 0, 1} +** +** All returned buffers are part of the same single allocation, which must +** be freed using sqlite3_free() by the caller +*/ +static int sessionTableInfo( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Name of attached database (e.g. "main") */ + const char *zThis, /* Table name */ + int *pnCol, /* OUT: number of columns */ + const char **pzTab, /* OUT: Copy of zThis */ + const char ***pazCol, /* OUT: Array of column names for table */ + u8 **pabPK /* OUT: Array of booleans - true for PK col */ +){ + char *zPragma; + sqlite3_stmt *pStmt; + int rc; + int nByte; + int nDbCol = 0; + int nThis; + int i; + u8 *pAlloc = 0; + char **azCol = 0; + u8 *abPK = 0; + + assert( pazCol && pabPK ); + + nThis = sqlite3Strlen30(zThis); + if( nThis==12 && 0==sqlite3_stricmp("sqlite_stat1", zThis) ){ + rc = sqlite3_table_column_metadata(db, zDb, zThis, 0, 0, 0, 0, 0, 0); + if( rc==SQLITE_OK ){ + /* For sqlite_stat1, pretend that (tbl,idx) is the PRIMARY KEY. */ + zPragma = sqlite3_mprintf( + "SELECT 0, 'tbl', '', 0, '', 1 UNION ALL " + "SELECT 1, 'idx', '', 0, '', 2 UNION ALL " + "SELECT 2, 'stat', '', 0, '', 0" + ); + }else if( rc==SQLITE_ERROR ){ + zPragma = sqlite3_mprintf(""); + }else{ + return rc; + } + }else{ + zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis); + } + if( !zPragma ) return SQLITE_NOMEM; + + rc = sqlite3_prepare_v2(db, zPragma, -1, &pStmt, 0); + sqlite3_free(zPragma); + if( rc!=SQLITE_OK ) return rc; + + nByte = nThis + 1; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + nByte += sqlite3_column_bytes(pStmt, 1); + nDbCol++; + } + rc = sqlite3_reset(pStmt); + + if( rc==SQLITE_OK ){ + nByte += nDbCol * (sizeof(const char *) + sizeof(u8) + 1); + pAlloc = sqlite3_malloc(nByte); + if( pAlloc==0 ){ + rc = SQLITE_NOMEM; + } + } + if( rc==SQLITE_OK ){ + azCol = (char **)pAlloc; + pAlloc = (u8 *)&azCol[nDbCol]; + abPK = (u8 *)pAlloc; + pAlloc = &abPK[nDbCol]; + if( pzTab ){ + memcpy(pAlloc, zThis, nThis+1); + *pzTab = (char *)pAlloc; + pAlloc += nThis+1; + } + + i = 0; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + int nName = sqlite3_column_bytes(pStmt, 1); + const unsigned char *zName = sqlite3_column_text(pStmt, 1); + if( zName==0 ) break; + memcpy(pAlloc, zName, nName+1); + azCol[i] = (char *)pAlloc; + pAlloc += nName+1; + abPK[i] = sqlite3_column_int(pStmt, 5); + i++; + } + rc = sqlite3_reset(pStmt); + + } + + /* If successful, populate the output variables. Otherwise, zero them and + ** free any allocation made. An error code will be returned in this case. + */ + if( rc==SQLITE_OK ){ + *pazCol = (const char **)azCol; + *pabPK = abPK; + *pnCol = nDbCol; + }else{ + *pazCol = 0; + *pabPK = 0; + *pnCol = 0; + if( pzTab ) *pzTab = 0; + sqlite3_free(azCol); + } + sqlite3_finalize(pStmt); + return rc; +} + +/* +** This function is only called from within a pre-update handler for a +** write to table pTab, part of session pSession. If this is the first +** write to this table, initalize the SessionTable.nCol, azCol[] and +** abPK[] arrays accordingly. +** +** If an error occurs, an error code is stored in sqlite3_session.rc and +** non-zero returned. Or, if no error occurs but the table has no primary +** key, sqlite3_session.rc is left set to SQLITE_OK and non-zero returned to +** indicate that updates on this table should be ignored. SessionTable.abPK +** is set to NULL in this case. +*/ +static int sessionInitTable(sqlite3_session *pSession, SessionTable *pTab){ + if( pTab->nCol==0 ){ + u8 *abPK; + assert( pTab->azCol==0 || pTab->abPK==0 ); + pSession->rc = sessionTableInfo(pSession->db, pSession->zDb, + pTab->zName, &pTab->nCol, 0, &pTab->azCol, &abPK + ); + if( pSession->rc==SQLITE_OK ){ + int i; + for(i=0; i<pTab->nCol; i++){ + if( abPK[i] ){ + pTab->abPK = abPK; + break; + } + } + if( 0==sqlite3_stricmp("sqlite_stat1", pTab->zName) ){ + pTab->bStat1 = 1; + } + } + } + return (pSession->rc || pTab->abPK==0); +} + +/* +** Versions of the four methods in object SessionHook for use with the +** sqlite_stat1 table. The purpose of this is to substitute a zero-length +** blob each time a NULL value is read from the "idx" column of the +** sqlite_stat1 table. +*/ +typedef struct SessionStat1Ctx SessionStat1Ctx; +struct SessionStat1Ctx { + SessionHook hook; + sqlite3_session *pSession; +}; +static int sessionStat1Old(void *pCtx, int iCol, sqlite3_value **ppVal){ + SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx; + sqlite3_value *pVal = 0; + int rc = p->hook.xOld(p->hook.pCtx, iCol, &pVal); + if( rc==SQLITE_OK && iCol==1 && sqlite3_value_type(pVal)==SQLITE_NULL ){ + pVal = p->pSession->pZeroBlob; + } + *ppVal = pVal; + return rc; +} +static int sessionStat1New(void *pCtx, int iCol, sqlite3_value **ppVal){ + SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx; + sqlite3_value *pVal = 0; + int rc = p->hook.xNew(p->hook.pCtx, iCol, &pVal); + if( rc==SQLITE_OK && iCol==1 && sqlite3_value_type(pVal)==SQLITE_NULL ){ + pVal = p->pSession->pZeroBlob; + } + *ppVal = pVal; + return rc; +} +static int sessionStat1Count(void *pCtx){ + SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx; + return p->hook.xCount(p->hook.pCtx); +} +static int sessionStat1Depth(void *pCtx){ + SessionStat1Ctx *p = (SessionStat1Ctx*)pCtx; + return p->hook.xDepth(p->hook.pCtx); +} + + +/* +** This function is only called from with a pre-update-hook reporting a +** change on table pTab (attached to session pSession). The type of change +** (UPDATE, INSERT, DELETE) is specified by the first argument. +** +** Unless one is already present or an error occurs, an entry is added +** to the changed-rows hash table associated with table pTab. +*/ +static void sessionPreupdateOneChange( + int op, /* One of SQLITE_UPDATE, INSERT, DELETE */ + sqlite3_session *pSession, /* Session object pTab is attached to */ + SessionTable *pTab /* Table that change applies to */ +){ + int iHash; + int bNull = 0; + int rc = SQLITE_OK; + SessionStat1Ctx stat1 = {0}; + + if( pSession->rc ) return; + + /* Load table details if required */ + if( sessionInitTable(pSession, pTab) ) return; + + /* Check the number of columns in this xPreUpdate call matches the + ** number of columns in the table. */ + if( pTab->nCol!=pSession->hook.xCount(pSession->hook.pCtx) ){ + pSession->rc = SQLITE_SCHEMA; + return; + } + + /* Grow the hash table if required */ + if( sessionGrowHash(0, pTab) ){ + pSession->rc = SQLITE_NOMEM; + return; + } + + if( pTab->bStat1 ){ + stat1.hook = pSession->hook; + stat1.pSession = pSession; + pSession->hook.pCtx = (void*)&stat1; + pSession->hook.xNew = sessionStat1New; + pSession->hook.xOld = sessionStat1Old; + pSession->hook.xCount = sessionStat1Count; + pSession->hook.xDepth = sessionStat1Depth; + if( pSession->pZeroBlob==0 ){ + sqlite3_value *p = sqlite3ValueNew(0); + if( p==0 ){ + rc = SQLITE_NOMEM; + goto error_out; + } + sqlite3ValueSetStr(p, 0, "", 0, SQLITE_STATIC); + pSession->pZeroBlob = p; + } + } + + /* Calculate the hash-key for this change. If the primary key of the row + ** includes a NULL value, exit early. Such changes are ignored by the + ** session module. */ + rc = sessionPreupdateHash(pSession, pTab, op==SQLITE_INSERT, &iHash, &bNull); + if( rc!=SQLITE_OK ) goto error_out; + + if( bNull==0 ){ + /* Search the hash table for an existing record for this row. */ + SessionChange *pC; + for(pC=pTab->apChange[iHash]; pC; pC=pC->pNext){ + if( sessionPreupdateEqual(pSession, pTab, pC, op) ) break; + } + + if( pC==0 ){ + /* Create a new change object containing all the old values (if + ** this is an SQLITE_UPDATE or SQLITE_DELETE), or just the PK + ** values (if this is an INSERT). */ + SessionChange *pChange; /* New change object */ + int nByte; /* Number of bytes to allocate */ + int i; /* Used to iterate through columns */ + + assert( rc==SQLITE_OK ); + pTab->nEntry++; + + /* Figure out how large an allocation is required */ + nByte = sizeof(SessionChange); + for(i=0; i<pTab->nCol; i++){ + sqlite3_value *p = 0; + if( op!=SQLITE_INSERT ){ + TESTONLY(int trc = ) pSession->hook.xOld(pSession->hook.pCtx, i, &p); + assert( trc==SQLITE_OK ); + }else if( pTab->abPK[i] ){ + TESTONLY(int trc = ) pSession->hook.xNew(pSession->hook.pCtx, i, &p); + assert( trc==SQLITE_OK ); + } + + /* This may fail if SQLite value p contains a utf-16 string that must + ** be converted to utf-8 and an OOM error occurs while doing so. */ + rc = sessionSerializeValue(0, p, &nByte); + if( rc!=SQLITE_OK ) goto error_out; + } + + /* Allocate the change object */ + pChange = (SessionChange *)sqlite3_malloc(nByte); + if( !pChange ){ + rc = SQLITE_NOMEM; + goto error_out; + }else{ + memset(pChange, 0, sizeof(SessionChange)); + pChange->aRecord = (u8 *)&pChange[1]; + } + + /* Populate the change object. None of the preupdate_old(), + ** preupdate_new() or SerializeValue() calls below may fail as all + ** required values and encodings have already been cached in memory. + ** It is not possible for an OOM to occur in this block. */ + nByte = 0; + for(i=0; i<pTab->nCol; i++){ + sqlite3_value *p = 0; + if( op!=SQLITE_INSERT ){ + pSession->hook.xOld(pSession->hook.pCtx, i, &p); + }else if( pTab->abPK[i] ){ + pSession->hook.xNew(pSession->hook.pCtx, i, &p); + } + sessionSerializeValue(&pChange->aRecord[nByte], p, &nByte); + } + + /* Add the change to the hash-table */ + if( pSession->bIndirect || pSession->hook.xDepth(pSession->hook.pCtx) ){ + pChange->bIndirect = 1; + } + pChange->nRecord = nByte; + pChange->op = op; + pChange->pNext = pTab->apChange[iHash]; + pTab->apChange[iHash] = pChange; + + }else if( pC->bIndirect ){ + /* If the existing change is considered "indirect", but this current + ** change is "direct", mark the change object as direct. */ + if( pSession->hook.xDepth(pSession->hook.pCtx)==0 + && pSession->bIndirect==0 + ){ + pC->bIndirect = 0; + } + } + } + + /* If an error has occurred, mark the session object as failed. */ + error_out: + if( pTab->bStat1 ){ + pSession->hook = stat1.hook; + } + if( rc!=SQLITE_OK ){ + pSession->rc = rc; + } +} + +static int sessionFindTable( + sqlite3_session *pSession, + const char *zName, + SessionTable **ppTab +){ + int rc = SQLITE_OK; + int nName = sqlite3Strlen30(zName); + SessionTable *pRet; + + /* Search for an existing table */ + for(pRet=pSession->pTable; pRet; pRet=pRet->pNext){ + if( 0==sqlite3_strnicmp(pRet->zName, zName, nName+1) ) break; + } + + if( pRet==0 && pSession->bAutoAttach ){ + /* If there is a table-filter configured, invoke it. If it returns 0, + ** do not automatically add the new table. */ + if( pSession->xTableFilter==0 + || pSession->xTableFilter(pSession->pFilterCtx, zName) + ){ + rc = sqlite3session_attach(pSession, zName); + if( rc==SQLITE_OK ){ + for(pRet=pSession->pTable; pRet->pNext; pRet=pRet->pNext); + assert( 0==sqlite3_strnicmp(pRet->zName, zName, nName+1) ); + } + } + } + + assert( rc==SQLITE_OK || pRet==0 ); + *ppTab = pRet; + return rc; +} + +/* +** The 'pre-update' hook registered by this module with SQLite databases. +*/ +static void xPreUpdate( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ +){ + sqlite3_session *pSession; + int nDb = sqlite3Strlen30(zDb); + + assert( sqlite3_mutex_held(db->mutex) ); + + for(pSession=(sqlite3_session *)pCtx; pSession; pSession=pSession->pNext){ + SessionTable *pTab; + + /* If this session is attached to a different database ("main", "temp" + ** etc.), or if it is not currently enabled, there is nothing to do. Skip + ** to the next session object attached to this database. */ + if( pSession->bEnable==0 ) continue; + if( pSession->rc ) continue; + if( sqlite3_strnicmp(zDb, pSession->zDb, nDb+1) ) continue; + + pSession->rc = sessionFindTable(pSession, zName, &pTab); + if( pTab ){ + assert( pSession->rc==SQLITE_OK ); + sessionPreupdateOneChange(op, pSession, pTab); + if( op==SQLITE_UPDATE ){ + sessionPreupdateOneChange(SQLITE_INSERT, pSession, pTab); + } + } + } +} + +/* +** The pre-update hook implementations. +*/ +static int sessionPreupdateOld(void *pCtx, int iVal, sqlite3_value **ppVal){ + return sqlite3_preupdate_old((sqlite3*)pCtx, iVal, ppVal); +} +static int sessionPreupdateNew(void *pCtx, int iVal, sqlite3_value **ppVal){ + return sqlite3_preupdate_new((sqlite3*)pCtx, iVal, ppVal); +} +static int sessionPreupdateCount(void *pCtx){ + return sqlite3_preupdate_count((sqlite3*)pCtx); +} +static int sessionPreupdateDepth(void *pCtx){ + return sqlite3_preupdate_depth((sqlite3*)pCtx); +} + +/* +** Install the pre-update hooks on the session object passed as the only +** argument. +*/ +static void sessionPreupdateHooks( + sqlite3_session *pSession +){ + pSession->hook.pCtx = (void*)pSession->db; + pSession->hook.xOld = sessionPreupdateOld; + pSession->hook.xNew = sessionPreupdateNew; + pSession->hook.xCount = sessionPreupdateCount; + pSession->hook.xDepth = sessionPreupdateDepth; +} + +typedef struct SessionDiffCtx SessionDiffCtx; +struct SessionDiffCtx { + sqlite3_stmt *pStmt; + int nOldOff; +}; + +/* +** The diff hook implementations. +*/ +static int sessionDiffOld(void *pCtx, int iVal, sqlite3_value **ppVal){ + SessionDiffCtx *p = (SessionDiffCtx*)pCtx; + *ppVal = sqlite3_column_value(p->pStmt, iVal+p->nOldOff); + return SQLITE_OK; +} +static int sessionDiffNew(void *pCtx, int iVal, sqlite3_value **ppVal){ + SessionDiffCtx *p = (SessionDiffCtx*)pCtx; + *ppVal = sqlite3_column_value(p->pStmt, iVal); + return SQLITE_OK; +} +static int sessionDiffCount(void *pCtx){ + SessionDiffCtx *p = (SessionDiffCtx*)pCtx; + return p->nOldOff ? p->nOldOff : sqlite3_column_count(p->pStmt); +} +static int sessionDiffDepth(void *pCtx){ + return 0; +} + +/* +** Install the diff hooks on the session object passed as the only +** argument. +*/ +static void sessionDiffHooks( + sqlite3_session *pSession, + SessionDiffCtx *pDiffCtx +){ + pSession->hook.pCtx = (void*)pDiffCtx; + pSession->hook.xOld = sessionDiffOld; + pSession->hook.xNew = sessionDiffNew; + pSession->hook.xCount = sessionDiffCount; + pSession->hook.xDepth = sessionDiffDepth; +} + +static char *sessionExprComparePK( + int nCol, + const char *zDb1, const char *zDb2, + const char *zTab, + const char **azCol, u8 *abPK +){ + int i; + const char *zSep = ""; + char *zRet = 0; + + for(i=0; i<nCol; i++){ + if( abPK[i] ){ + zRet = sqlite3_mprintf("%z%s\"%w\".\"%w\".\"%w\"=\"%w\".\"%w\".\"%w\"", + zRet, zSep, zDb1, zTab, azCol[i], zDb2, zTab, azCol[i] + ); + zSep = " AND "; + if( zRet==0 ) break; + } + } + + return zRet; +} + +static char *sessionExprCompareOther( + int nCol, + const char *zDb1, const char *zDb2, + const char *zTab, + const char **azCol, u8 *abPK +){ + int i; + const char *zSep = ""; + char *zRet = 0; + int bHave = 0; + + for(i=0; i<nCol; i++){ + if( abPK[i]==0 ){ + bHave = 1; + zRet = sqlite3_mprintf( + "%z%s\"%w\".\"%w\".\"%w\" IS NOT \"%w\".\"%w\".\"%w\"", + zRet, zSep, zDb1, zTab, azCol[i], zDb2, zTab, azCol[i] + ); + zSep = " OR "; + if( zRet==0 ) break; + } + } + + if( bHave==0 ){ + assert( zRet==0 ); + zRet = sqlite3_mprintf("0"); + } + + return zRet; +} + +static char *sessionSelectFindNew( + int nCol, + const char *zDb1, /* Pick rows in this db only */ + const char *zDb2, /* But not in this one */ + const char *zTbl, /* Table name */ + const char *zExpr +){ + char *zRet = sqlite3_mprintf( + "SELECT * FROM \"%w\".\"%w\" WHERE NOT EXISTS (" + " SELECT 1 FROM \"%w\".\"%w\" WHERE %s" + ")", + zDb1, zTbl, zDb2, zTbl, zExpr + ); + return zRet; +} + +static int sessionDiffFindNew( + int op, + sqlite3_session *pSession, + SessionTable *pTab, + const char *zDb1, + const char *zDb2, + char *zExpr +){ + int rc = SQLITE_OK; + char *zStmt = sessionSelectFindNew(pTab->nCol, zDb1, zDb2, pTab->zName,zExpr); + + if( zStmt==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_stmt *pStmt; + rc = sqlite3_prepare(pSession->db, zStmt, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + SessionDiffCtx *pDiffCtx = (SessionDiffCtx*)pSession->hook.pCtx; + pDiffCtx->pStmt = pStmt; + pDiffCtx->nOldOff = 0; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + sessionPreupdateOneChange(op, pSession, pTab); + } + rc = sqlite3_finalize(pStmt); + } + sqlite3_free(zStmt); + } + + return rc; +} + +static int sessionDiffFindModified( + sqlite3_session *pSession, + SessionTable *pTab, + const char *zFrom, + const char *zExpr +){ + int rc = SQLITE_OK; + + char *zExpr2 = sessionExprCompareOther(pTab->nCol, + pSession->zDb, zFrom, pTab->zName, pTab->azCol, pTab->abPK + ); + if( zExpr2==0 ){ + rc = SQLITE_NOMEM; + }else{ + char *zStmt = sqlite3_mprintf( + "SELECT * FROM \"%w\".\"%w\", \"%w\".\"%w\" WHERE %s AND (%z)", + pSession->zDb, pTab->zName, zFrom, pTab->zName, zExpr, zExpr2 + ); + if( zStmt==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_stmt *pStmt; + rc = sqlite3_prepare(pSession->db, zStmt, -1, &pStmt, 0); + + if( rc==SQLITE_OK ){ + SessionDiffCtx *pDiffCtx = (SessionDiffCtx*)pSession->hook.pCtx; + pDiffCtx->pStmt = pStmt; + pDiffCtx->nOldOff = pTab->nCol; + while( SQLITE_ROW==sqlite3_step(pStmt) ){ + sessionPreupdateOneChange(SQLITE_UPDATE, pSession, pTab); + } + rc = sqlite3_finalize(pStmt); + } + sqlite3_free(zStmt); + } + } + + return rc; +} + +SQLITE_API int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFrom, + const char *zTbl, + char **pzErrMsg +){ + const char *zDb = pSession->zDb; + int rc = pSession->rc; + SessionDiffCtx d; + + memset(&d, 0, sizeof(d)); + sessionDiffHooks(pSession, &d); + + sqlite3_mutex_enter(sqlite3_db_mutex(pSession->db)); + if( pzErrMsg ) *pzErrMsg = 0; + if( rc==SQLITE_OK ){ + char *zExpr = 0; + sqlite3 *db = pSession->db; + SessionTable *pTo; /* Table zTbl */ + + /* Locate and if necessary initialize the target table object */ + rc = sessionFindTable(pSession, zTbl, &pTo); + if( pTo==0 ) goto diff_out; + if( sessionInitTable(pSession, pTo) ){ + rc = pSession->rc; + goto diff_out; + } + + /* Check the table schemas match */ + if( rc==SQLITE_OK ){ + int bHasPk = 0; + int bMismatch = 0; + int nCol; /* Columns in zFrom.zTbl */ + u8 *abPK; + const char **azCol = 0; + rc = sessionTableInfo(db, zFrom, zTbl, &nCol, 0, &azCol, &abPK); + if( rc==SQLITE_OK ){ + if( pTo->nCol!=nCol ){ + bMismatch = 1; + }else{ + int i; + for(i=0; i<nCol; i++){ + if( pTo->abPK[i]!=abPK[i] ) bMismatch = 1; + if( sqlite3_stricmp(azCol[i], pTo->azCol[i]) ) bMismatch = 1; + if( abPK[i] ) bHasPk = 1; + } + } + } + sqlite3_free((char*)azCol); + if( bMismatch ){ + *pzErrMsg = sqlite3_mprintf("table schemas do not match"); + rc = SQLITE_SCHEMA; + } + if( bHasPk==0 ){ + /* Ignore tables with no primary keys */ + goto diff_out; + } + } + + if( rc==SQLITE_OK ){ + zExpr = sessionExprComparePK(pTo->nCol, + zDb, zFrom, pTo->zName, pTo->azCol, pTo->abPK + ); + } + + /* Find new rows */ + if( rc==SQLITE_OK ){ + rc = sessionDiffFindNew(SQLITE_INSERT, pSession, pTo, zDb, zFrom, zExpr); + } + + /* Find old rows */ + if( rc==SQLITE_OK ){ + rc = sessionDiffFindNew(SQLITE_DELETE, pSession, pTo, zFrom, zDb, zExpr); + } + + /* Find modified rows */ + if( rc==SQLITE_OK ){ + rc = sessionDiffFindModified(pSession, pTo, zFrom, zExpr); + } + + sqlite3_free(zExpr); + } + + diff_out: + sessionPreupdateHooks(pSession); + sqlite3_mutex_leave(sqlite3_db_mutex(pSession->db)); + return rc; +} + +/* +** Create a session object. This session object will record changes to +** database zDb attached to connection db. +*/ +SQLITE_API int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +){ + sqlite3_session *pNew; /* Newly allocated session object */ + sqlite3_session *pOld; /* Session object already attached to db */ + int nDb = sqlite3Strlen30(zDb); /* Length of zDb in bytes */ + + /* Zero the output value in case an error occurs. */ + *ppSession = 0; + + /* Allocate and populate the new session object. */ + pNew = (sqlite3_session *)sqlite3_malloc(sizeof(sqlite3_session) + nDb + 1); + if( !pNew ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(sqlite3_session)); + pNew->db = db; + pNew->zDb = (char *)&pNew[1]; + pNew->bEnable = 1; + memcpy(pNew->zDb, zDb, nDb+1); + sessionPreupdateHooks(pNew); + + /* Add the new session object to the linked list of session objects + ** attached to database handle $db. Do this under the cover of the db + ** handle mutex. */ + sqlite3_mutex_enter(sqlite3_db_mutex(db)); + pOld = (sqlite3_session*)sqlite3_preupdate_hook(db, xPreUpdate, (void*)pNew); + pNew->pNext = pOld; + sqlite3_mutex_leave(sqlite3_db_mutex(db)); + + *ppSession = pNew; + return SQLITE_OK; +} + +/* +** Free the list of table objects passed as the first argument. The contents +** of the changed-rows hash tables are also deleted. +*/ +static void sessionDeleteTable(SessionTable *pList){ + SessionTable *pNext; + SessionTable *pTab; + + for(pTab=pList; pTab; pTab=pNext){ + int i; + pNext = pTab->pNext; + for(i=0; i<pTab->nChange; i++){ + SessionChange *p; + SessionChange *pNextChange; + for(p=pTab->apChange[i]; p; p=pNextChange){ + pNextChange = p->pNext; + sqlite3_free(p); + } + } + sqlite3_free((char*)pTab->azCol); /* cast works around VC++ bug */ + sqlite3_free(pTab->apChange); + sqlite3_free(pTab); + } +} + +/* +** Delete a session object previously allocated using sqlite3session_create(). +*/ +SQLITE_API void sqlite3session_delete(sqlite3_session *pSession){ + sqlite3 *db = pSession->db; + sqlite3_session *pHead; + sqlite3_session **pp; + + /* Unlink the session from the linked list of sessions attached to the + ** database handle. Hold the db mutex while doing so. */ + sqlite3_mutex_enter(sqlite3_db_mutex(db)); + pHead = (sqlite3_session*)sqlite3_preupdate_hook(db, 0, 0); + for(pp=&pHead; ALWAYS((*pp)!=0); pp=&((*pp)->pNext)){ + if( (*pp)==pSession ){ + *pp = (*pp)->pNext; + if( pHead ) sqlite3_preupdate_hook(db, xPreUpdate, (void*)pHead); + break; + } + } + sqlite3_mutex_leave(sqlite3_db_mutex(db)); + sqlite3ValueFree(pSession->pZeroBlob); + + /* Delete all attached table objects. And the contents of their + ** associated hash-tables. */ + sessionDeleteTable(pSession->pTable); + + /* Free the session object itself. */ + sqlite3_free(pSession); +} + +/* +** Set a table filter on a Session Object. +*/ +SQLITE_API void sqlite3session_table_filter( + sqlite3_session *pSession, + int(*xFilter)(void*, const char*), + void *pCtx /* First argument passed to xFilter */ +){ + pSession->bAutoAttach = 1; + pSession->pFilterCtx = pCtx; + pSession->xTableFilter = xFilter; +} + +/* +** Attach a table to a session. All subsequent changes made to the table +** while the session object is enabled will be recorded. +** +** Only tables that have a PRIMARY KEY defined may be attached. It does +** not matter if the PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) +** or not. +*/ +SQLITE_API int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zName /* Table name */ +){ + int rc = SQLITE_OK; + sqlite3_mutex_enter(sqlite3_db_mutex(pSession->db)); + + if( !zName ){ + pSession->bAutoAttach = 1; + }else{ + SessionTable *pTab; /* New table object (if required) */ + int nName; /* Number of bytes in string zName */ + + /* First search for an existing entry. If one is found, this call is + ** a no-op. Return early. */ + nName = sqlite3Strlen30(zName); + for(pTab=pSession->pTable; pTab; pTab=pTab->pNext){ + if( 0==sqlite3_strnicmp(pTab->zName, zName, nName+1) ) break; + } + + if( !pTab ){ + /* Allocate new SessionTable object. */ + pTab = (SessionTable *)sqlite3_malloc(sizeof(SessionTable) + nName + 1); + if( !pTab ){ + rc = SQLITE_NOMEM; + }else{ + /* Populate the new SessionTable object and link it into the list. + ** The new object must be linked onto the end of the list, not + ** simply added to the start of it in order to ensure that tables + ** appear in the correct order when a changeset or patchset is + ** eventually generated. */ + SessionTable **ppTab; + memset(pTab, 0, sizeof(SessionTable)); + pTab->zName = (char *)&pTab[1]; + memcpy(pTab->zName, zName, nName+1); + for(ppTab=&pSession->pTable; *ppTab; ppTab=&(*ppTab)->pNext); + *ppTab = pTab; + } + } + } + + sqlite3_mutex_leave(sqlite3_db_mutex(pSession->db)); + return rc; +} + +/* +** Ensure that there is room in the buffer to append nByte bytes of data. +** If not, use sqlite3_realloc() to grow the buffer so that there is. +** +** If successful, return zero. Otherwise, if an OOM condition is encountered, +** set *pRc to SQLITE_NOMEM and return non-zero. +*/ +static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ + if( *pRc==SQLITE_OK && p->nAlloc-p->nBuf<nByte ){ + u8 *aNew; + int nNew = p->nAlloc ? p->nAlloc : 128; + do { + nNew = nNew*2; + }while( nNew<(p->nBuf+nByte) ); + + aNew = (u8 *)sqlite3_realloc(p->aBuf, nNew); + if( 0==aNew ){ + *pRc = SQLITE_NOMEM; + }else{ + p->aBuf = aNew; + p->nAlloc = nNew; + } + } + return (*pRc!=SQLITE_OK); +} + +/* +** Append the value passed as the second argument to the buffer passed +** as the first. +** +** This function is a no-op if *pRc is non-zero when it is called. +** Otherwise, if an error occurs, *pRc is set to an SQLite error code +** before returning. +*/ +static void sessionAppendValue(SessionBuffer *p, sqlite3_value *pVal, int *pRc){ + int rc = *pRc; + if( rc==SQLITE_OK ){ + int nByte = 0; + rc = sessionSerializeValue(0, pVal, &nByte); + sessionBufferGrow(p, nByte, &rc); + if( rc==SQLITE_OK ){ + rc = sessionSerializeValue(&p->aBuf[p->nBuf], pVal, 0); + p->nBuf += nByte; + }else{ + *pRc = rc; + } + } +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a single byte to the buffer. +** +** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before +** returning. +*/ +static void sessionAppendByte(SessionBuffer *p, u8 v, int *pRc){ + if( 0==sessionBufferGrow(p, 1, pRc) ){ + p->aBuf[p->nBuf++] = v; + } +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a single varint to the buffer. +** +** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before +** returning. +*/ +static void sessionAppendVarint(SessionBuffer *p, int v, int *pRc){ + if( 0==sessionBufferGrow(p, 9, pRc) ){ + p->nBuf += sessionVarintPut(&p->aBuf[p->nBuf], v); + } +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a blob of data to the buffer. +** +** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before +** returning. +*/ +static void sessionAppendBlob( + SessionBuffer *p, + const u8 *aBlob, + int nBlob, + int *pRc +){ + if( nBlob>0 && 0==sessionBufferGrow(p, nBlob, pRc) ){ + memcpy(&p->aBuf[p->nBuf], aBlob, nBlob); + p->nBuf += nBlob; + } +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append a string to the buffer. All bytes in the string +** up to (but not including) the nul-terminator are written to the buffer. +** +** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before +** returning. +*/ +static void sessionAppendStr( + SessionBuffer *p, + const char *zStr, + int *pRc +){ + int nStr = sqlite3Strlen30(zStr); + if( 0==sessionBufferGrow(p, nStr, pRc) ){ + memcpy(&p->aBuf[p->nBuf], zStr, nStr); + p->nBuf += nStr; + } +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append the string representation of integer iVal +** to the buffer. No nul-terminator is written. +** +** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before +** returning. +*/ +static void sessionAppendInteger( + SessionBuffer *p, /* Buffer to append to */ + int iVal, /* Value to write the string rep. of */ + int *pRc /* IN/OUT: Error code */ +){ + char aBuf[24]; + sqlite3_snprintf(sizeof(aBuf)-1, aBuf, "%d", iVal); + sessionAppendStr(p, aBuf, pRc); +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwise, append the string zStr enclosed in quotes (") and +** with any embedded quote characters escaped to the buffer. No +** nul-terminator byte is written. +** +** If an OOM condition is encountered, set *pRc to SQLITE_NOMEM before +** returning. +*/ +static void sessionAppendIdent( + SessionBuffer *p, /* Buffer to a append to */ + const char *zStr, /* String to quote, escape and append */ + int *pRc /* IN/OUT: Error code */ +){ + int nStr = sqlite3Strlen30(zStr)*2 + 2 + 1; + if( 0==sessionBufferGrow(p, nStr, pRc) ){ + char *zOut = (char *)&p->aBuf[p->nBuf]; + const char *zIn = zStr; + *zOut++ = '"'; + while( *zIn ){ + if( *zIn=='"' ) *zOut++ = '"'; + *zOut++ = *(zIn++); + } + *zOut++ = '"'; + p->nBuf = (int)((u8 *)zOut - p->aBuf); + } +} + +/* +** This function is a no-op if *pRc is other than SQLITE_OK when it is +** called. Otherwse, it appends the serialized version of the value stored +** in column iCol of the row that SQL statement pStmt currently points +** to to the buffer. +*/ +static void sessionAppendCol( + SessionBuffer *p, /* Buffer to append to */ + sqlite3_stmt *pStmt, /* Handle pointing to row containing value */ + int iCol, /* Column to read value from */ + int *pRc /* IN/OUT: Error code */ +){ + if( *pRc==SQLITE_OK ){ + int eType = sqlite3_column_type(pStmt, iCol); + sessionAppendByte(p, (u8)eType, pRc); + if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + sqlite3_int64 i; + u8 aBuf[8]; + if( eType==SQLITE_INTEGER ){ + i = sqlite3_column_int64(pStmt, iCol); + }else{ + double r = sqlite3_column_double(pStmt, iCol); + memcpy(&i, &r, 8); + } + sessionPutI64(aBuf, i); + sessionAppendBlob(p, aBuf, 8, pRc); + } + if( eType==SQLITE_BLOB || eType==SQLITE_TEXT ){ + u8 *z; + int nByte; + if( eType==SQLITE_BLOB ){ + z = (u8 *)sqlite3_column_blob(pStmt, iCol); + }else{ + z = (u8 *)sqlite3_column_text(pStmt, iCol); + } + nByte = sqlite3_column_bytes(pStmt, iCol); + if( z || (eType==SQLITE_BLOB && nByte==0) ){ + sessionAppendVarint(p, nByte, pRc); + sessionAppendBlob(p, z, nByte, pRc); + }else{ + *pRc = SQLITE_NOMEM; + } + } + } +} + +/* +** +** This function appends an update change to the buffer (see the comments +** under "CHANGESET FORMAT" at the top of the file). An update change +** consists of: +** +** 1 byte: SQLITE_UPDATE (0x17) +** n bytes: old.* record (see RECORD FORMAT) +** m bytes: new.* record (see RECORD FORMAT) +** +** The SessionChange object passed as the third argument contains the +** values that were stored in the row when the session began (the old.* +** values). The statement handle passed as the second argument points +** at the current version of the row (the new.* values). +** +** If all of the old.* values are equal to their corresponding new.* value +** (i.e. nothing has changed), then no data at all is appended to the buffer. +** +** Otherwise, the old.* record contains all primary key values and the +** original values of any fields that have been modified. The new.* record +** contains the new values of only those fields that have been modified. +*/ +static int sessionAppendUpdate( + SessionBuffer *pBuf, /* Buffer to append to */ + int bPatchset, /* True for "patchset", 0 for "changeset" */ + sqlite3_stmt *pStmt, /* Statement handle pointing at new row */ + SessionChange *p, /* Object containing old values */ + u8 *abPK /* Boolean array - true for PK columns */ +){ + int rc = SQLITE_OK; + SessionBuffer buf2 = {0,0,0}; /* Buffer to accumulate new.* record in */ + int bNoop = 1; /* Set to zero if any values are modified */ + int nRewind = pBuf->nBuf; /* Set to zero if any values are modified */ + int i; /* Used to iterate through columns */ + u8 *pCsr = p->aRecord; /* Used to iterate through old.* values */ + + sessionAppendByte(pBuf, SQLITE_UPDATE, &rc); + sessionAppendByte(pBuf, p->bIndirect, &rc); + for(i=0; i<sqlite3_column_count(pStmt); i++){ + int bChanged = 0; + int nAdvance; + int eType = *pCsr; + switch( eType ){ + case SQLITE_NULL: + nAdvance = 1; + if( sqlite3_column_type(pStmt, i)!=SQLITE_NULL ){ + bChanged = 1; + } + break; + + case SQLITE_FLOAT: + case SQLITE_INTEGER: { + nAdvance = 9; + if( eType==sqlite3_column_type(pStmt, i) ){ + sqlite3_int64 iVal = sessionGetI64(&pCsr[1]); + if( eType==SQLITE_INTEGER ){ + if( iVal==sqlite3_column_int64(pStmt, i) ) break; + }else{ + double dVal; + memcpy(&dVal, &iVal, 8); + if( dVal==sqlite3_column_double(pStmt, i) ) break; + } + } + bChanged = 1; + break; + } + + default: { + int n; + int nHdr = 1 + sessionVarintGet(&pCsr[1], &n); + assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); + nAdvance = nHdr + n; + if( eType==sqlite3_column_type(pStmt, i) + && n==sqlite3_column_bytes(pStmt, i) + && (n==0 || 0==memcmp(&pCsr[nHdr], sqlite3_column_blob(pStmt, i), n)) + ){ + break; + } + bChanged = 1; + } + } + + /* If at least one field has been modified, this is not a no-op. */ + if( bChanged ) bNoop = 0; + + /* Add a field to the old.* record. This is omitted if this modules is + ** currently generating a patchset. */ + if( bPatchset==0 ){ + if( bChanged || abPK[i] ){ + sessionAppendBlob(pBuf, pCsr, nAdvance, &rc); + }else{ + sessionAppendByte(pBuf, 0, &rc); + } + } + + /* Add a field to the new.* record. Or the only record if currently + ** generating a patchset. */ + if( bChanged || (bPatchset && abPK[i]) ){ + sessionAppendCol(&buf2, pStmt, i, &rc); + }else{ + sessionAppendByte(&buf2, 0, &rc); + } + + pCsr += nAdvance; + } + + if( bNoop ){ + pBuf->nBuf = nRewind; + }else{ + sessionAppendBlob(pBuf, buf2.aBuf, buf2.nBuf, &rc); + } + sqlite3_free(buf2.aBuf); + + return rc; +} + +/* +** Append a DELETE change to the buffer passed as the first argument. Use +** the changeset format if argument bPatchset is zero, or the patchset +** format otherwise. +*/ +static int sessionAppendDelete( + SessionBuffer *pBuf, /* Buffer to append to */ + int bPatchset, /* True for "patchset", 0 for "changeset" */ + SessionChange *p, /* Object containing old values */ + int nCol, /* Number of columns in table */ + u8 *abPK /* Boolean array - true for PK columns */ +){ + int rc = SQLITE_OK; + + sessionAppendByte(pBuf, SQLITE_DELETE, &rc); + sessionAppendByte(pBuf, p->bIndirect, &rc); + + if( bPatchset==0 ){ + sessionAppendBlob(pBuf, p->aRecord, p->nRecord, &rc); + }else{ + int i; + u8 *a = p->aRecord; + for(i=0; i<nCol; i++){ + u8 *pStart = a; + int eType = *a++; + + switch( eType ){ + case 0: + case SQLITE_NULL: + assert( abPK[i]==0 ); + break; + + case SQLITE_FLOAT: + case SQLITE_INTEGER: + a += 8; + break; + + default: { + int n; + a += sessionVarintGet(a, &n); + a += n; + break; + } + } + if( abPK[i] ){ + sessionAppendBlob(pBuf, pStart, (int)(a-pStart), &rc); + } + } + assert( (a - p->aRecord)==p->nRecord ); + } + + return rc; +} + +/* +** Formulate and prepare a SELECT statement to retrieve a row from table +** zTab in database zDb based on its primary key. i.e. +** +** SELECT * FROM zDb.zTab WHERE pk1 = ? AND pk2 = ? AND ... +*/ +static int sessionSelectStmt( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Database name */ + const char *zTab, /* Table name */ + int nCol, /* Number of columns in table */ + const char **azCol, /* Names of table columns */ + u8 *abPK, /* PRIMARY KEY array */ + sqlite3_stmt **ppStmt /* OUT: Prepared SELECT statement */ +){ + int rc = SQLITE_OK; + char *zSql = 0; + int nSql = -1; + + if( 0==sqlite3_stricmp("sqlite_stat1", zTab) ){ + zSql = sqlite3_mprintf( + "SELECT tbl, ?2, stat FROM %Q.sqlite_stat1 WHERE tbl IS ?1 AND " + "idx IS (CASE WHEN ?2=X'' THEN NULL ELSE ?2 END)", zDb + ); + if( zSql==0 ) rc = SQLITE_NOMEM; + }else{ + int i; + const char *zSep = ""; + SessionBuffer buf = {0, 0, 0}; + + sessionAppendStr(&buf, "SELECT * FROM ", &rc); + sessionAppendIdent(&buf, zDb, &rc); + sessionAppendStr(&buf, ".", &rc); + sessionAppendIdent(&buf, zTab, &rc); + sessionAppendStr(&buf, " WHERE ", &rc); + for(i=0; i<nCol; i++){ + if( abPK[i] ){ + sessionAppendStr(&buf, zSep, &rc); + sessionAppendIdent(&buf, azCol[i], &rc); + sessionAppendStr(&buf, " IS ?", &rc); + sessionAppendInteger(&buf, i+1, &rc); + zSep = " AND "; + } + } + zSql = (char*)buf.aBuf; + nSql = buf.nBuf; + } + + if( rc==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, zSql, nSql, ppStmt, 0); + } + sqlite3_free(zSql); + return rc; +} + +/* +** Bind the PRIMARY KEY values from the change passed in argument pChange +** to the SELECT statement passed as the first argument. The SELECT statement +** is as prepared by function sessionSelectStmt(). +** +** Return SQLITE_OK if all PK values are successfully bound, or an SQLite +** error code (e.g. SQLITE_NOMEM) otherwise. +*/ +static int sessionSelectBind( + sqlite3_stmt *pSelect, /* SELECT from sessionSelectStmt() */ + int nCol, /* Number of columns in table */ + u8 *abPK, /* PRIMARY KEY array */ + SessionChange *pChange /* Change structure */ +){ + int i; + int rc = SQLITE_OK; + u8 *a = pChange->aRecord; + + for(i=0; i<nCol && rc==SQLITE_OK; i++){ + int eType = *a++; + + switch( eType ){ + case 0: + case SQLITE_NULL: + assert( abPK[i]==0 ); + break; + + case SQLITE_INTEGER: { + if( abPK[i] ){ + i64 iVal = sessionGetI64(a); + rc = sqlite3_bind_int64(pSelect, i+1, iVal); + } + a += 8; + break; + } + + case SQLITE_FLOAT: { + if( abPK[i] ){ + double rVal; + i64 iVal = sessionGetI64(a); + memcpy(&rVal, &iVal, 8); + rc = sqlite3_bind_double(pSelect, i+1, rVal); + } + a += 8; + break; + } + + case SQLITE_TEXT: { + int n; + a += sessionVarintGet(a, &n); + if( abPK[i] ){ + rc = sqlite3_bind_text(pSelect, i+1, (char *)a, n, SQLITE_TRANSIENT); + } + a += n; + break; + } + + default: { + int n; + assert( eType==SQLITE_BLOB ); + a += sessionVarintGet(a, &n); + if( abPK[i] ){ + rc = sqlite3_bind_blob(pSelect, i+1, a, n, SQLITE_TRANSIENT); + } + a += n; + break; + } + } + } + + return rc; +} + +/* +** This function is a no-op if *pRc is set to other than SQLITE_OK when it +** is called. Otherwise, append a serialized table header (part of the binary +** changeset format) to buffer *pBuf. If an error occurs, set *pRc to an +** SQLite error code before returning. +*/ +static void sessionAppendTableHdr( + SessionBuffer *pBuf, /* Append header to this buffer */ + int bPatchset, /* Use the patchset format if true */ + SessionTable *pTab, /* Table object to append header for */ + int *pRc /* IN/OUT: Error code */ +){ + /* Write a table header */ + sessionAppendByte(pBuf, (bPatchset ? 'P' : 'T'), pRc); + sessionAppendVarint(pBuf, pTab->nCol, pRc); + sessionAppendBlob(pBuf, pTab->abPK, pTab->nCol, pRc); + sessionAppendBlob(pBuf, (u8 *)pTab->zName, (int)strlen(pTab->zName)+1, pRc); +} + +/* +** Generate either a changeset (if argument bPatchset is zero) or a patchset +** (if it is non-zero) based on the current contents of the session object +** passed as the first argument. +** +** If no error occurs, SQLITE_OK is returned and the new changeset/patchset +** stored in output variables *pnChangeset and *ppChangeset. Or, if an error +** occurs, an SQLite error code is returned and both output variables set +** to 0. +*/ +static int sessionGenerateChangeset( + sqlite3_session *pSession, /* Session object */ + int bPatchset, /* True for patchset, false for changeset */ + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut, /* First argument for xOutput */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +){ + sqlite3 *db = pSession->db; /* Source database handle */ + SessionTable *pTab; /* Used to iterate through attached tables */ + SessionBuffer buf = {0,0,0}; /* Buffer in which to accumlate changeset */ + int rc; /* Return code */ + + assert( xOutput==0 || (pnChangeset==0 && ppChangeset==0 ) ); + + /* Zero the output variables in case an error occurs. If this session + ** object is already in the error state (sqlite3_session.rc != SQLITE_OK), + ** this call will be a no-op. */ + if( xOutput==0 ){ + *pnChangeset = 0; + *ppChangeset = 0; + } + + if( pSession->rc ) return pSession->rc; + rc = sqlite3_exec(pSession->db, "SAVEPOINT changeset", 0, 0, 0); + if( rc!=SQLITE_OK ) return rc; + + sqlite3_mutex_enter(sqlite3_db_mutex(db)); + + for(pTab=pSession->pTable; rc==SQLITE_OK && pTab; pTab=pTab->pNext){ + if( pTab->nEntry ){ + const char *zName = pTab->zName; + int nCol; /* Number of columns in table */ + u8 *abPK; /* Primary key array */ + const char **azCol = 0; /* Table columns */ + int i; /* Used to iterate through hash buckets */ + sqlite3_stmt *pSel = 0; /* SELECT statement to query table pTab */ + int nRewind = buf.nBuf; /* Initial size of write buffer */ + int nNoop; /* Size of buffer after writing tbl header */ + + /* Check the table schema is still Ok. */ + rc = sessionTableInfo(db, pSession->zDb, zName, &nCol, 0, &azCol, &abPK); + if( !rc && (pTab->nCol!=nCol || memcmp(abPK, pTab->abPK, nCol)) ){ + rc = SQLITE_SCHEMA; + } + + /* Write a table header */ + sessionAppendTableHdr(&buf, bPatchset, pTab, &rc); + + /* Build and compile a statement to execute: */ + if( rc==SQLITE_OK ){ + rc = sessionSelectStmt( + db, pSession->zDb, zName, nCol, azCol, abPK, &pSel); + } + + nNoop = buf.nBuf; + for(i=0; i<pTab->nChange && rc==SQLITE_OK; i++){ + SessionChange *p; /* Used to iterate through changes */ + + for(p=pTab->apChange[i]; rc==SQLITE_OK && p; p=p->pNext){ + rc = sessionSelectBind(pSel, nCol, abPK, p); + if( rc!=SQLITE_OK ) continue; + if( sqlite3_step(pSel)==SQLITE_ROW ){ + if( p->op==SQLITE_INSERT ){ + int iCol; + sessionAppendByte(&buf, SQLITE_INSERT, &rc); + sessionAppendByte(&buf, p->bIndirect, &rc); + for(iCol=0; iCol<nCol; iCol++){ + sessionAppendCol(&buf, pSel, iCol, &rc); + } + }else{ + rc = sessionAppendUpdate(&buf, bPatchset, pSel, p, abPK); + } + }else if( p->op!=SQLITE_INSERT ){ + rc = sessionAppendDelete(&buf, bPatchset, p, nCol, abPK); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_reset(pSel); + } + + /* If the buffer is now larger than SESSIONS_STRM_CHUNK_SIZE, pass + ** its contents to the xOutput() callback. */ + if( xOutput + && rc==SQLITE_OK + && buf.nBuf>nNoop + && buf.nBuf>SESSIONS_STRM_CHUNK_SIZE + ){ + rc = xOutput(pOut, (void*)buf.aBuf, buf.nBuf); + nNoop = -1; + buf.nBuf = 0; + } + + } + } + + sqlite3_finalize(pSel); + if( buf.nBuf==nNoop ){ + buf.nBuf = nRewind; + } + sqlite3_free((char*)azCol); /* cast works around VC++ bug */ + } + } + + if( rc==SQLITE_OK ){ + if( xOutput==0 ){ + *pnChangeset = buf.nBuf; + *ppChangeset = buf.aBuf; + buf.aBuf = 0; + }else if( buf.nBuf>0 ){ + rc = xOutput(pOut, (void*)buf.aBuf, buf.nBuf); + } + } + + sqlite3_free(buf.aBuf); + sqlite3_exec(db, "RELEASE changeset", 0, 0, 0); + sqlite3_mutex_leave(sqlite3_db_mutex(db)); + return rc; +} + +/* +** Obtain a changeset object containing all changes recorded by the +** session object passed as the first argument. +** +** It is the responsibility of the caller to eventually free the buffer +** using sqlite3_free(). +*/ +SQLITE_API int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +){ + return sessionGenerateChangeset(pSession, 0, 0, 0, pnChangeset, ppChangeset); +} + +/* +** Streaming version of sqlite3session_changeset(). +*/ +SQLITE_API int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +){ + return sessionGenerateChangeset(pSession, 0, xOutput, pOut, 0, 0); +} + +/* +** Streaming version of sqlite3session_patchset(). +*/ +SQLITE_API int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +){ + return sessionGenerateChangeset(pSession, 1, xOutput, pOut, 0, 0); +} + +/* +** Obtain a patchset object containing all changes recorded by the +** session object passed as the first argument. +** +** It is the responsibility of the caller to eventually free the buffer +** using sqlite3_free(). +*/ +SQLITE_API int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppChangeset */ + void **ppPatchset /* OUT: Buffer containing changeset */ +){ + return sessionGenerateChangeset(pSession, 1, 0, 0, pnPatchset, ppPatchset); +} + +/* +** Enable or disable the session object passed as the first argument. +*/ +SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable){ + int ret; + sqlite3_mutex_enter(sqlite3_db_mutex(pSession->db)); + if( bEnable>=0 ){ + pSession->bEnable = bEnable; + } + ret = pSession->bEnable; + sqlite3_mutex_leave(sqlite3_db_mutex(pSession->db)); + return ret; +} + +/* +** Enable or disable the session object passed as the first argument. +*/ +SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect){ + int ret; + sqlite3_mutex_enter(sqlite3_db_mutex(pSession->db)); + if( bIndirect>=0 ){ + pSession->bIndirect = bIndirect; + } + ret = pSession->bIndirect; + sqlite3_mutex_leave(sqlite3_db_mutex(pSession->db)); + return ret; +} + +/* +** Return true if there have been no changes to monitored tables recorded +** by the session object passed as the only argument. +*/ +SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession){ + int ret = 0; + SessionTable *pTab; + + sqlite3_mutex_enter(sqlite3_db_mutex(pSession->db)); + for(pTab=pSession->pTable; pTab && ret==0; pTab=pTab->pNext){ + ret = (pTab->nEntry>0); + } + sqlite3_mutex_leave(sqlite3_db_mutex(pSession->db)); + + return (ret==0); +} + +/* +** Do the work for either sqlite3changeset_start() or start_strm(). +*/ +static int sessionChangesetStart( + sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int nChangeset, /* Size of buffer pChangeset in bytes */ + void *pChangeset /* Pointer to buffer containing changeset */ +){ + sqlite3_changeset_iter *pRet; /* Iterator to return */ + int nByte; /* Number of bytes to allocate for iterator */ + + assert( xInput==0 || (pChangeset==0 && nChangeset==0) ); + + /* Zero the output variable in case an error occurs. */ + *pp = 0; + + /* Allocate and initialize the iterator structure. */ + nByte = sizeof(sqlite3_changeset_iter); + pRet = (sqlite3_changeset_iter *)sqlite3_malloc(nByte); + if( !pRet ) return SQLITE_NOMEM; + memset(pRet, 0, sizeof(sqlite3_changeset_iter)); + pRet->in.aData = (u8 *)pChangeset; + pRet->in.nData = nChangeset; + pRet->in.xInput = xInput; + pRet->in.pIn = pIn; + pRet->in.bEof = (xInput ? 0 : 1); + + /* Populate the output variable and return success. */ + *pp = pRet; + return SQLITE_OK; +} + +/* +** Create an iterator used to iterate through the contents of a changeset. +*/ +SQLITE_API int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */ + int nChangeset, /* Size of buffer pChangeset in bytes */ + void *pChangeset /* Pointer to buffer containing changeset */ +){ + return sessionChangesetStart(pp, 0, 0, nChangeset, pChangeset); +} + +/* +** Streaming version of sqlite3changeset_start(). +*/ +SQLITE_API int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, /* OUT: Changeset iterator handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +){ + return sessionChangesetStart(pp, xInput, pIn, 0, 0); +} + +/* +** If the SessionInput object passed as the only argument is a streaming +** object and the buffer is full, discard some data to free up space. +*/ +static void sessionDiscardData(SessionInput *pIn){ + if( pIn->xInput && pIn->iNext>=SESSIONS_STRM_CHUNK_SIZE ){ + int nMove = pIn->buf.nBuf - pIn->iNext; + assert( nMove>=0 ); + if( nMove>0 ){ + memmove(pIn->buf.aBuf, &pIn->buf.aBuf[pIn->iNext], nMove); + } + pIn->buf.nBuf -= pIn->iNext; + pIn->iNext = 0; + pIn->nData = pIn->buf.nBuf; + } +} + +/* +** Ensure that there are at least nByte bytes available in the buffer. Or, +** if there are not nByte bytes remaining in the input, that all available +** data is in the buffer. +** +** Return an SQLite error code if an error occurs, or SQLITE_OK otherwise. +*/ +static int sessionInputBuffer(SessionInput *pIn, int nByte){ + int rc = SQLITE_OK; + if( pIn->xInput ){ + while( !pIn->bEof && (pIn->iNext+nByte)>=pIn->nData && rc==SQLITE_OK ){ + int nNew = SESSIONS_STRM_CHUNK_SIZE; + + if( pIn->bNoDiscard==0 ) sessionDiscardData(pIn); + if( SQLITE_OK==sessionBufferGrow(&pIn->buf, nNew, &rc) ){ + rc = pIn->xInput(pIn->pIn, &pIn->buf.aBuf[pIn->buf.nBuf], &nNew); + if( nNew==0 ){ + pIn->bEof = 1; + }else{ + pIn->buf.nBuf += nNew; + } + } + + pIn->aData = pIn->buf.aBuf; + pIn->nData = pIn->buf.nBuf; + } + } + return rc; +} + +/* +** When this function is called, *ppRec points to the start of a record +** that contains nCol values. This function advances the pointer *ppRec +** until it points to the byte immediately following that record. +*/ +static void sessionSkipRecord( + u8 **ppRec, /* IN/OUT: Record pointer */ + int nCol /* Number of values in record */ +){ + u8 *aRec = *ppRec; + int i; + for(i=0; i<nCol; i++){ + int eType = *aRec++; + if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){ + int nByte; + aRec += sessionVarintGet((u8*)aRec, &nByte); + aRec += nByte; + }else if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + aRec += 8; + } + } + + *ppRec = aRec; +} + +/* +** This function sets the value of the sqlite3_value object passed as the +** first argument to a copy of the string or blob held in the aData[] +** buffer. SQLITE_OK is returned if successful, or SQLITE_NOMEM if an OOM +** error occurs. +*/ +static int sessionValueSetStr( + sqlite3_value *pVal, /* Set the value of this object */ + u8 *aData, /* Buffer containing string or blob data */ + int nData, /* Size of buffer aData[] in bytes */ + u8 enc /* String encoding (0 for blobs) */ +){ + /* In theory this code could just pass SQLITE_TRANSIENT as the final + ** argument to sqlite3ValueSetStr() and have the copy created + ** automatically. But doing so makes it difficult to detect any OOM + ** error. Hence the code to create the copy externally. */ + u8 *aCopy = sqlite3_malloc(nData+1); + if( aCopy==0 ) return SQLITE_NOMEM; + memcpy(aCopy, aData, nData); + sqlite3ValueSetStr(pVal, nData, (char*)aCopy, enc, sqlite3_free); + return SQLITE_OK; +} + +/* +** Deserialize a single record from a buffer in memory. See "RECORD FORMAT" +** for details. +** +** When this function is called, *paChange points to the start of the record +** to deserialize. Assuming no error occurs, *paChange is set to point to +** one byte after the end of the same record before this function returns. +** If the argument abPK is NULL, then the record contains nCol values. Or, +** if abPK is other than NULL, then the record contains only the PK fields +** (in other words, it is a patchset DELETE record). +** +** If successful, each element of the apOut[] array (allocated by the caller) +** is set to point to an sqlite3_value object containing the value read +** from the corresponding position in the record. If that value is not +** included in the record (i.e. because the record is part of an UPDATE change +** and the field was not modified), the corresponding element of apOut[] is +** set to NULL. +** +** It is the responsibility of the caller to free all sqlite_value structures +** using sqlite3_free(). +** +** If an error occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +** The apOut[] array may have been partially populated in this case. +*/ +static int sessionReadRecord( + SessionInput *pIn, /* Input data */ + int nCol, /* Number of values in record */ + u8 *abPK, /* Array of primary key flags, or NULL */ + sqlite3_value **apOut /* Write values to this array */ +){ + int i; /* Used to iterate through columns */ + int rc = SQLITE_OK; + + for(i=0; i<nCol && rc==SQLITE_OK; i++){ + int eType = 0; /* Type of value (SQLITE_NULL, TEXT etc.) */ + if( abPK && abPK[i]==0 ) continue; + rc = sessionInputBuffer(pIn, 9); + if( rc==SQLITE_OK ){ + if( pIn->iNext>=pIn->nData ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + eType = pIn->aData[pIn->iNext++]; + assert( apOut[i]==0 ); + if( eType ){ + apOut[i] = sqlite3ValueNew(0); + if( !apOut[i] ) rc = SQLITE_NOMEM; + } + } + } + + if( rc==SQLITE_OK ){ + u8 *aVal = &pIn->aData[pIn->iNext]; + if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){ + int nByte; + pIn->iNext += sessionVarintGet(aVal, &nByte); + rc = sessionInputBuffer(pIn, nByte); + if( rc==SQLITE_OK ){ + if( nByte<0 || nByte>pIn->nData-pIn->iNext ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + u8 enc = (eType==SQLITE_TEXT ? SQLITE_UTF8 : 0); + rc = sessionValueSetStr(apOut[i],&pIn->aData[pIn->iNext],nByte,enc); + pIn->iNext += nByte; + } + } + } + if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + sqlite3_int64 v = sessionGetI64(aVal); + if( eType==SQLITE_INTEGER ){ + sqlite3VdbeMemSetInt64(apOut[i], v); + }else{ + double d; + memcpy(&d, &v, 8); + sqlite3VdbeMemSetDouble(apOut[i], d); + } + pIn->iNext += 8; + } + } + } + + return rc; +} + +/* +** The input pointer currently points to the second byte of a table-header. +** Specifically, to the following: +** +** + number of columns in table (varint) +** + array of PK flags (1 byte per column), +** + table name (nul terminated). +** +** This function ensures that all of the above is present in the input +** buffer (i.e. that it can be accessed without any calls to xInput()). +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code. +** The input pointer is not moved. +*/ +static int sessionChangesetBufferTblhdr(SessionInput *pIn, int *pnByte){ + int rc = SQLITE_OK; + int nCol = 0; + int nRead = 0; + + rc = sessionInputBuffer(pIn, 9); + if( rc==SQLITE_OK ){ + nRead += sessionVarintGet(&pIn->aData[pIn->iNext + nRead], &nCol); + /* The hard upper limit for the number of columns in an SQLite + ** database table is, according to sqliteLimit.h, 32676. So + ** consider any table-header that purports to have more than 65536 + ** columns to be corrupt. This is convenient because otherwise, + ** if the (nCol>65536) condition below were omitted, a sufficiently + ** large value for nCol may cause nRead to wrap around and become + ** negative. Leading to a crash. */ + if( nCol<0 || nCol>65536 ){ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = sessionInputBuffer(pIn, nRead+nCol+100); + nRead += nCol; + } + } + + while( rc==SQLITE_OK ){ + while( (pIn->iNext + nRead)<pIn->nData && pIn->aData[pIn->iNext + nRead] ){ + nRead++; + } + if( (pIn->iNext + nRead)<pIn->nData ) break; + rc = sessionInputBuffer(pIn, nRead + 100); + } + *pnByte = nRead+1; + return rc; +} + +/* +** The input pointer currently points to the first byte of the first field +** of a record consisting of nCol columns. This function ensures the entire +** record is buffered. It does not move the input pointer. +** +** If successful, SQLITE_OK is returned and *pnByte is set to the size of +** the record in bytes. Otherwise, an SQLite error code is returned. The +** final value of *pnByte is undefined in this case. +*/ +static int sessionChangesetBufferRecord( + SessionInput *pIn, /* Input data */ + int nCol, /* Number of columns in record */ + int *pnByte /* OUT: Size of record in bytes */ +){ + int rc = SQLITE_OK; + int nByte = 0; + int i; + for(i=0; rc==SQLITE_OK && i<nCol; i++){ + int eType; + rc = sessionInputBuffer(pIn, nByte + 10); + if( rc==SQLITE_OK ){ + eType = pIn->aData[pIn->iNext + nByte++]; + if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){ + int n; + nByte += sessionVarintGet(&pIn->aData[pIn->iNext+nByte], &n); + nByte += n; + rc = sessionInputBuffer(pIn, nByte); + }else if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){ + nByte += 8; + } + } + } + *pnByte = nByte; + return rc; +} + +/* +** The input pointer currently points to the second byte of a table-header. +** Specifically, to the following: +** +** + number of columns in table (varint) +** + array of PK flags (1 byte per column), +** + table name (nul terminated). +** +** This function decodes the table-header and populates the p->nCol, +** p->zTab and p->abPK[] variables accordingly. The p->apValue[] array is +** also allocated or resized according to the new value of p->nCol. The +** input pointer is left pointing to the byte following the table header. +** +** If successful, SQLITE_OK is returned. Otherwise, an SQLite error code +** is returned and the final values of the various fields enumerated above +** are undefined. +*/ +static int sessionChangesetReadTblhdr(sqlite3_changeset_iter *p){ + int rc; + int nCopy; + assert( p->rc==SQLITE_OK ); + + rc = sessionChangesetBufferTblhdr(&p->in, &nCopy); + if( rc==SQLITE_OK ){ + int nByte; + int nVarint; + nVarint = sessionVarintGet(&p->in.aData[p->in.iNext], &p->nCol); + if( p->nCol>0 ){ + nCopy -= nVarint; + p->in.iNext += nVarint; + nByte = p->nCol * sizeof(sqlite3_value*) * 2 + nCopy; + p->tblhdr.nBuf = 0; + sessionBufferGrow(&p->tblhdr, nByte, &rc); + }else{ + rc = SQLITE_CORRUPT_BKPT; + } + } + + if( rc==SQLITE_OK ){ + int iPK = sizeof(sqlite3_value*)*p->nCol*2; + memset(p->tblhdr.aBuf, 0, iPK); + memcpy(&p->tblhdr.aBuf[iPK], &p->in.aData[p->in.iNext], nCopy); + p->in.iNext += nCopy; + } + + p->apValue = (sqlite3_value**)p->tblhdr.aBuf; + p->abPK = (u8*)&p->apValue[p->nCol*2]; + p->zTab = (char*)&p->abPK[p->nCol]; + return (p->rc = rc); +} + +/* +** Advance the changeset iterator to the next change. +** +** If both paRec and pnRec are NULL, then this function works like the public +** API sqlite3changeset_next(). If SQLITE_ROW is returned, then the +** sqlite3changeset_new() and old() APIs may be used to query for values. +** +** Otherwise, if paRec and pnRec are not NULL, then a pointer to the change +** record is written to *paRec before returning and the number of bytes in +** the record to *pnRec. +** +** Either way, this function returns SQLITE_ROW if the iterator is +** successfully advanced to the next change in the changeset, an SQLite +** error code if an error occurs, or SQLITE_DONE if there are no further +** changes in the changeset. +*/ +static int sessionChangesetNext( + sqlite3_changeset_iter *p, /* Changeset iterator */ + u8 **paRec, /* If non-NULL, store record pointer here */ + int *pnRec, /* If non-NULL, store size of record here */ + int *pbNew /* If non-NULL, true if new table */ +){ + int i; + u8 op; + + assert( (paRec==0 && pnRec==0) || (paRec && pnRec) ); + + /* If the iterator is in the error-state, return immediately. */ + if( p->rc!=SQLITE_OK ) return p->rc; + + /* Free the current contents of p->apValue[], if any. */ + if( p->apValue ){ + for(i=0; i<p->nCol*2; i++){ + sqlite3ValueFree(p->apValue[i]); + } + memset(p->apValue, 0, sizeof(sqlite3_value*)*p->nCol*2); + } + + /* Make sure the buffer contains at least 10 bytes of input data, or all + ** remaining data if there are less than 10 bytes available. This is + ** sufficient either for the 'T' or 'P' byte and the varint that follows + ** it, or for the two single byte values otherwise. */ + p->rc = sessionInputBuffer(&p->in, 2); + if( p->rc!=SQLITE_OK ) return p->rc; + + /* If the iterator is already at the end of the changeset, return DONE. */ + if( p->in.iNext>=p->in.nData ){ + return SQLITE_DONE; + } + + sessionDiscardData(&p->in); + p->in.iCurrent = p->in.iNext; + + op = p->in.aData[p->in.iNext++]; + while( op=='T' || op=='P' ){ + if( pbNew ) *pbNew = 1; + p->bPatchset = (op=='P'); + if( sessionChangesetReadTblhdr(p) ) return p->rc; + if( (p->rc = sessionInputBuffer(&p->in, 2)) ) return p->rc; + p->in.iCurrent = p->in.iNext; + if( p->in.iNext>=p->in.nData ) return SQLITE_DONE; + op = p->in.aData[p->in.iNext++]; + } + + if( p->zTab==0 ){ + /* The first record in the changeset is not a table header. Must be a + ** corrupt changeset. */ + assert( p->in.iNext==1 ); + return (p->rc = SQLITE_CORRUPT_BKPT); + } + + p->op = op; + p->bIndirect = p->in.aData[p->in.iNext++]; + if( p->op!=SQLITE_UPDATE && p->op!=SQLITE_DELETE && p->op!=SQLITE_INSERT ){ + return (p->rc = SQLITE_CORRUPT_BKPT); + } + + if( paRec ){ + int nVal; /* Number of values to buffer */ + if( p->bPatchset==0 && op==SQLITE_UPDATE ){ + nVal = p->nCol * 2; + }else if( p->bPatchset && op==SQLITE_DELETE ){ + nVal = 0; + for(i=0; i<p->nCol; i++) if( p->abPK[i] ) nVal++; + }else{ + nVal = p->nCol; + } + p->rc = sessionChangesetBufferRecord(&p->in, nVal, pnRec); + if( p->rc!=SQLITE_OK ) return p->rc; + *paRec = &p->in.aData[p->in.iNext]; + p->in.iNext += *pnRec; + }else{ + + /* If this is an UPDATE or DELETE, read the old.* record. */ + if( p->op!=SQLITE_INSERT && (p->bPatchset==0 || p->op==SQLITE_DELETE) ){ + u8 *abPK = p->bPatchset ? p->abPK : 0; + p->rc = sessionReadRecord(&p->in, p->nCol, abPK, p->apValue); + if( p->rc!=SQLITE_OK ) return p->rc; + } + + /* If this is an INSERT or UPDATE, read the new.* record. */ + if( p->op!=SQLITE_DELETE ){ + p->rc = sessionReadRecord(&p->in, p->nCol, 0, &p->apValue[p->nCol]); + if( p->rc!=SQLITE_OK ) return p->rc; + } + + if( p->bPatchset && p->op==SQLITE_UPDATE ){ + /* If this is an UPDATE that is part of a patchset, then all PK and + ** modified fields are present in the new.* record. The old.* record + ** is currently completely empty. This block shifts the PK fields from + ** new.* to old.*, to accommodate the code that reads these arrays. */ + for(i=0; i<p->nCol; i++){ + assert( p->apValue[i]==0 ); + if( p->abPK[i] ){ + p->apValue[i] = p->apValue[i+p->nCol]; + if( p->apValue[i]==0 ) return (p->rc = SQLITE_CORRUPT_BKPT); + p->apValue[i+p->nCol] = 0; + } + } + } + } + + return SQLITE_ROW; +} + +/* +** Advance an iterator created by sqlite3changeset_start() to the next +** change in the changeset. This function may return SQLITE_ROW, SQLITE_DONE +** or SQLITE_CORRUPT. +** +** This function may not be called on iterators passed to a conflict handler +** callback by changeset_apply(). +*/ +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *p){ + return sessionChangesetNext(p, 0, 0, 0); +} + +/* +** The following function extracts information on the current change +** from a changeset iterator. It may only be called after changeset_next() +** has returned SQLITE_ROW. +*/ +SQLITE_API int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator handle */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True if change is indirect */ +){ + *pOp = pIter->op; + *pnCol = pIter->nCol; + *pzTab = pIter->zTab; + if( pbIndirect ) *pbIndirect = pIter->bIndirect; + return SQLITE_OK; +} + +/* +** Return information regarding the PRIMARY KEY and number of columns in +** the database table affected by the change that pIter currently points +** to. This function may only be called after changeset_next() returns +** SQLITE_ROW. +*/ +SQLITE_API int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +){ + *pabPK = pIter->abPK; + if( pnCol ) *pnCol = pIter->nCol; + return SQLITE_OK; +} + +/* +** This function may only be called while the iterator is pointing to an +** SQLITE_UPDATE or SQLITE_DELETE change (see sqlite3changeset_op()). +** Otherwise, SQLITE_MISUSE is returned. +** +** It sets *ppValue to point to an sqlite3_value structure containing the +** iVal'th value in the old.* record. Or, if that particular value is not +** included in the record (because the change is an UPDATE and the field +** was not modified and is not a PK column), set *ppValue to NULL. +** +** If value iVal is out-of-range, SQLITE_RANGE is returned and *ppValue is +** not modified. Otherwise, SQLITE_OK. +*/ +SQLITE_API int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Index of old.* value to retrieve */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +){ + if( pIter->op!=SQLITE_UPDATE && pIter->op!=SQLITE_DELETE ){ + return SQLITE_MISUSE; + } + if( iVal<0 || iVal>=pIter->nCol ){ + return SQLITE_RANGE; + } + *ppValue = pIter->apValue[iVal]; + return SQLITE_OK; +} + +/* +** This function may only be called while the iterator is pointing to an +** SQLITE_UPDATE or SQLITE_INSERT change (see sqlite3changeset_op()). +** Otherwise, SQLITE_MISUSE is returned. +** +** It sets *ppValue to point to an sqlite3_value structure containing the +** iVal'th value in the new.* record. Or, if that particular value is not +** included in the record (because the change is an UPDATE and the field +** was not modified), set *ppValue to NULL. +** +** If value iVal is out-of-range, SQLITE_RANGE is returned and *ppValue is +** not modified. Otherwise, SQLITE_OK. +*/ +SQLITE_API int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Index of new.* value to retrieve */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +){ + if( pIter->op!=SQLITE_UPDATE && pIter->op!=SQLITE_INSERT ){ + return SQLITE_MISUSE; + } + if( iVal<0 || iVal>=pIter->nCol ){ + return SQLITE_RANGE; + } + *ppValue = pIter->apValue[pIter->nCol+iVal]; + return SQLITE_OK; +} + +/* +** The following two macros are used internally. They are similar to the +** sqlite3changeset_new() and sqlite3changeset_old() functions, except that +** they omit all error checking and return a pointer to the requested value. +*/ +#define sessionChangesetNew(pIter, iVal) (pIter)->apValue[(pIter)->nCol+(iVal)] +#define sessionChangesetOld(pIter, iVal) (pIter)->apValue[(iVal)] + +/* +** This function may only be called with a changeset iterator that has been +** passed to an SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT +** conflict-handler function. Otherwise, SQLITE_MISUSE is returned. +** +** If successful, *ppValue is set to point to an sqlite3_value structure +** containing the iVal'th value of the conflicting record. +** +** If value iVal is out-of-range or some other error occurs, an SQLite error +** code is returned. Otherwise, SQLITE_OK. +*/ +SQLITE_API int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Index of conflict record value to fetch */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +){ + if( !pIter->pConflict ){ + return SQLITE_MISUSE; + } + if( iVal<0 || iVal>=pIter->nCol ){ + return SQLITE_RANGE; + } + *ppValue = sqlite3_column_value(pIter->pConflict, iVal); + return SQLITE_OK; +} + +/* +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +SQLITE_API int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +){ + if( pIter->pConflict || pIter->apValue ){ + return SQLITE_MISUSE; + } + *pnOut = pIter->nCol; + return SQLITE_OK; +} + + +/* +** Finalize an iterator allocated with sqlite3changeset_start(). +** +** This function may not be called on iterators passed to a conflict handler +** callback by changeset_apply(). +*/ +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *p){ + int rc = SQLITE_OK; + if( p ){ + int i; /* Used to iterate through p->apValue[] */ + rc = p->rc; + if( p->apValue ){ + for(i=0; i<p->nCol*2; i++) sqlite3ValueFree(p->apValue[i]); + } + sqlite3_free(p->tblhdr.aBuf); + sqlite3_free(p->in.buf.aBuf); + sqlite3_free(p); + } + return rc; +} + +static int sessionChangesetInvert( + SessionInput *pInput, /* Input changeset */ + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut, + int *pnInverted, /* OUT: Number of bytes in output changeset */ + void **ppInverted /* OUT: Inverse of pChangeset */ +){ + int rc = SQLITE_OK; /* Return value */ + SessionBuffer sOut; /* Output buffer */ + int nCol = 0; /* Number of cols in current table */ + u8 *abPK = 0; /* PK array for current table */ + sqlite3_value **apVal = 0; /* Space for values for UPDATE inversion */ + SessionBuffer sPK = {0, 0, 0}; /* PK array for current table */ + + /* Initialize the output buffer */ + memset(&sOut, 0, sizeof(SessionBuffer)); + + /* Zero the output variables in case an error occurs. */ + if( ppInverted ){ + *ppInverted = 0; + *pnInverted = 0; + } + + while( 1 ){ + u8 eType; + + /* Test for EOF. */ + if( (rc = sessionInputBuffer(pInput, 2)) ) goto finished_invert; + if( pInput->iNext>=pInput->nData ) break; + eType = pInput->aData[pInput->iNext]; + + switch( eType ){ + case 'T': { + /* A 'table' record consists of: + ** + ** * A constant 'T' character, + ** * Number of columns in said table (a varint), + ** * An array of nCol bytes (sPK), + ** * A nul-terminated table name. + */ + int nByte; + int nVar; + pInput->iNext++; + if( (rc = sessionChangesetBufferTblhdr(pInput, &nByte)) ){ + goto finished_invert; + } + nVar = sessionVarintGet(&pInput->aData[pInput->iNext], &nCol); + sPK.nBuf = 0; + sessionAppendBlob(&sPK, &pInput->aData[pInput->iNext+nVar], nCol, &rc); + sessionAppendByte(&sOut, eType, &rc); + sessionAppendBlob(&sOut, &pInput->aData[pInput->iNext], nByte, &rc); + if( rc ) goto finished_invert; + + pInput->iNext += nByte; + sqlite3_free(apVal); + apVal = 0; + abPK = sPK.aBuf; + break; + } + + case SQLITE_INSERT: + case SQLITE_DELETE: { + int nByte; + int bIndirect = pInput->aData[pInput->iNext+1]; + int eType2 = (eType==SQLITE_DELETE ? SQLITE_INSERT : SQLITE_DELETE); + pInput->iNext += 2; + assert( rc==SQLITE_OK ); + rc = sessionChangesetBufferRecord(pInput, nCol, &nByte); + sessionAppendByte(&sOut, eType2, &rc); + sessionAppendByte(&sOut, bIndirect, &rc); + sessionAppendBlob(&sOut, &pInput->aData[pInput->iNext], nByte, &rc); + pInput->iNext += nByte; + if( rc ) goto finished_invert; + break; + } + + case SQLITE_UPDATE: { + int iCol; + + if( 0==apVal ){ + apVal = (sqlite3_value **)sqlite3_malloc(sizeof(apVal[0])*nCol*2); + if( 0==apVal ){ + rc = SQLITE_NOMEM; + goto finished_invert; + } + memset(apVal, 0, sizeof(apVal[0])*nCol*2); + } + + /* Write the header for the new UPDATE change. Same as the original. */ + sessionAppendByte(&sOut, eType, &rc); + sessionAppendByte(&sOut, pInput->aData[pInput->iNext+1], &rc); + + /* Read the old.* and new.* records for the update change. */ + pInput->iNext += 2; + rc = sessionReadRecord(pInput, nCol, 0, &apVal[0]); + if( rc==SQLITE_OK ){ + rc = sessionReadRecord(pInput, nCol, 0, &apVal[nCol]); + } + + /* Write the new old.* record. Consists of the PK columns from the + ** original old.* record, and the other values from the original + ** new.* record. */ + for(iCol=0; iCol<nCol; iCol++){ + sqlite3_value *pVal = apVal[iCol + (abPK[iCol] ? 0 : nCol)]; + sessionAppendValue(&sOut, pVal, &rc); + } + + /* Write the new new.* record. Consists of a copy of all values + ** from the original old.* record, except for the PK columns, which + ** are set to "undefined". */ + for(iCol=0; iCol<nCol; iCol++){ + sqlite3_value *pVal = (abPK[iCol] ? 0 : apVal[iCol]); + sessionAppendValue(&sOut, pVal, &rc); + } + + for(iCol=0; iCol<nCol*2; iCol++){ + sqlite3ValueFree(apVal[iCol]); + } + memset(apVal, 0, sizeof(apVal[0])*nCol*2); + if( rc!=SQLITE_OK ){ + goto finished_invert; + } + + break; + } + + default: + rc = SQLITE_CORRUPT_BKPT; + goto finished_invert; + } + + assert( rc==SQLITE_OK ); + if( xOutput && sOut.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){ + rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); + sOut.nBuf = 0; + if( rc!=SQLITE_OK ) goto finished_invert; + } + } + + assert( rc==SQLITE_OK ); + if( pnInverted ){ + *pnInverted = sOut.nBuf; + *ppInverted = sOut.aBuf; + sOut.aBuf = 0; + }else if( sOut.nBuf>0 ){ + rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); + } + + finished_invert: + sqlite3_free(sOut.aBuf); + sqlite3_free(apVal); + sqlite3_free(sPK.aBuf); + return rc; +} + + +/* +** Invert a changeset object. +*/ +SQLITE_API int sqlite3changeset_invert( + int nChangeset, /* Number of bytes in input */ + const void *pChangeset, /* Input changeset */ + int *pnInverted, /* OUT: Number of bytes in output changeset */ + void **ppInverted /* OUT: Inverse of pChangeset */ +){ + SessionInput sInput; + + /* Set up the input stream */ + memset(&sInput, 0, sizeof(SessionInput)); + sInput.nData = nChangeset; + sInput.aData = (u8*)pChangeset; + + return sessionChangesetInvert(&sInput, 0, 0, pnInverted, ppInverted); +} + +/* +** Streaming version of sqlite3changeset_invert(). +*/ +SQLITE_API int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +){ + SessionInput sInput; + int rc; + + /* Set up the input stream */ + memset(&sInput, 0, sizeof(SessionInput)); + sInput.xInput = xInput; + sInput.pIn = pIn; + + rc = sessionChangesetInvert(&sInput, xOutput, pOut, 0, 0); + sqlite3_free(sInput.buf.aBuf); + return rc; +} + +typedef struct SessionApplyCtx SessionApplyCtx; +struct SessionApplyCtx { + sqlite3 *db; + sqlite3_stmt *pDelete; /* DELETE statement */ + sqlite3_stmt *pUpdate; /* UPDATE statement */ + sqlite3_stmt *pInsert; /* INSERT statement */ + sqlite3_stmt *pSelect; /* SELECT statement */ + int nCol; /* Size of azCol[] and abPK[] arrays */ + const char **azCol; /* Array of column names */ + u8 *abPK; /* Boolean array - true if column is in PK */ + int bStat1; /* True if table is sqlite_stat1 */ + int bDeferConstraints; /* True to defer constraints */ + SessionBuffer constraints; /* Deferred constraints are stored here */ + SessionBuffer rebase; /* Rebase information (if any) here */ + int bRebaseStarted; /* If table header is already in rebase */ +}; + +/* +** Formulate a statement to DELETE a row from database db. Assuming a table +** structure like this: +** +** CREATE TABLE x(a, b, c, d, PRIMARY KEY(a, c)); +** +** The DELETE statement looks like this: +** +** DELETE FROM x WHERE a = :1 AND c = :3 AND (:5 OR b IS :2 AND d IS :4) +** +** Variable :5 (nCol+1) is a boolean. It should be set to 0 if we require +** matching b and d values, or 1 otherwise. The second case comes up if the +** conflict handler is invoked with NOTFOUND and returns CHANGESET_REPLACE. +** +** If successful, SQLITE_OK is returned and SessionApplyCtx.pDelete is left +** pointing to the prepared version of the SQL statement. +*/ +static int sessionDeleteRow( + sqlite3 *db, /* Database handle */ + const char *zTab, /* Table name */ + SessionApplyCtx *p /* Session changeset-apply context */ +){ + int i; + const char *zSep = ""; + int rc = SQLITE_OK; + SessionBuffer buf = {0, 0, 0}; + int nPk = 0; + + sessionAppendStr(&buf, "DELETE FROM ", &rc); + sessionAppendIdent(&buf, zTab, &rc); + sessionAppendStr(&buf, " WHERE ", &rc); + + for(i=0; i<p->nCol; i++){ + if( p->abPK[i] ){ + nPk++; + sessionAppendStr(&buf, zSep, &rc); + sessionAppendIdent(&buf, p->azCol[i], &rc); + sessionAppendStr(&buf, " = ?", &rc); + sessionAppendInteger(&buf, i+1, &rc); + zSep = " AND "; + } + } + + if( nPk<p->nCol ){ + sessionAppendStr(&buf, " AND (?", &rc); + sessionAppendInteger(&buf, p->nCol+1, &rc); + sessionAppendStr(&buf, " OR ", &rc); + + zSep = ""; + for(i=0; i<p->nCol; i++){ + if( !p->abPK[i] ){ + sessionAppendStr(&buf, zSep, &rc); + sessionAppendIdent(&buf, p->azCol[i], &rc); + sessionAppendStr(&buf, " IS ?", &rc); + sessionAppendInteger(&buf, i+1, &rc); + zSep = "AND "; + } + } + sessionAppendStr(&buf, ")", &rc); + } + + if( rc==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, &p->pDelete, 0); + } + sqlite3_free(buf.aBuf); + + return rc; +} + +/* +** Formulate and prepare a statement to UPDATE a row from database db. +** Assuming a table structure like this: +** +** CREATE TABLE x(a, b, c, d, PRIMARY KEY(a, c)); +** +** The UPDATE statement looks like this: +** +** UPDATE x SET +** a = CASE WHEN ?2 THEN ?3 ELSE a END, +** b = CASE WHEN ?5 THEN ?6 ELSE b END, +** c = CASE WHEN ?8 THEN ?9 ELSE c END, +** d = CASE WHEN ?11 THEN ?12 ELSE d END +** WHERE a = ?1 AND c = ?7 AND (?13 OR +** (?5==0 OR b IS ?4) AND (?11==0 OR d IS ?10) AND +** ) +** +** For each column in the table, there are three variables to bind: +** +** ?(i*3+1) The old.* value of the column, if any. +** ?(i*3+2) A boolean flag indicating that the value is being modified. +** ?(i*3+3) The new.* value of the column, if any. +** +** Also, a boolean flag that, if set to true, causes the statement to update +** a row even if the non-PK values do not match. This is required if the +** conflict-handler is invoked with CHANGESET_DATA and returns +** CHANGESET_REPLACE. This is variable "?(nCol*3+1)". +** +** If successful, SQLITE_OK is returned and SessionApplyCtx.pUpdate is left +** pointing to the prepared version of the SQL statement. +*/ +static int sessionUpdateRow( + sqlite3 *db, /* Database handle */ + const char *zTab, /* Table name */ + SessionApplyCtx *p /* Session changeset-apply context */ +){ + int rc = SQLITE_OK; + int i; + const char *zSep = ""; + SessionBuffer buf = {0, 0, 0}; + + /* Append "UPDATE tbl SET " */ + sessionAppendStr(&buf, "UPDATE ", &rc); + sessionAppendIdent(&buf, zTab, &rc); + sessionAppendStr(&buf, " SET ", &rc); + + /* Append the assignments */ + for(i=0; i<p->nCol; i++){ + sessionAppendStr(&buf, zSep, &rc); + sessionAppendIdent(&buf, p->azCol[i], &rc); + sessionAppendStr(&buf, " = CASE WHEN ?", &rc); + sessionAppendInteger(&buf, i*3+2, &rc); + sessionAppendStr(&buf, " THEN ?", &rc); + sessionAppendInteger(&buf, i*3+3, &rc); + sessionAppendStr(&buf, " ELSE ", &rc); + sessionAppendIdent(&buf, p->azCol[i], &rc); + sessionAppendStr(&buf, " END", &rc); + zSep = ", "; + } + + /* Append the PK part of the WHERE clause */ + sessionAppendStr(&buf, " WHERE ", &rc); + for(i=0; i<p->nCol; i++){ + if( p->abPK[i] ){ + sessionAppendIdent(&buf, p->azCol[i], &rc); + sessionAppendStr(&buf, " = ?", &rc); + sessionAppendInteger(&buf, i*3+1, &rc); + sessionAppendStr(&buf, " AND ", &rc); + } + } + + /* Append the non-PK part of the WHERE clause */ + sessionAppendStr(&buf, " (?", &rc); + sessionAppendInteger(&buf, p->nCol*3+1, &rc); + sessionAppendStr(&buf, " OR 1", &rc); + for(i=0; i<p->nCol; i++){ + if( !p->abPK[i] ){ + sessionAppendStr(&buf, " AND (?", &rc); + sessionAppendInteger(&buf, i*3+2, &rc); + sessionAppendStr(&buf, "=0 OR ", &rc); + sessionAppendIdent(&buf, p->azCol[i], &rc); + sessionAppendStr(&buf, " IS ?", &rc); + sessionAppendInteger(&buf, i*3+1, &rc); + sessionAppendStr(&buf, ")", &rc); + } + } + sessionAppendStr(&buf, ")", &rc); + + if( rc==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, &p->pUpdate, 0); + } + sqlite3_free(buf.aBuf); + + return rc; +} + + +/* +** Formulate and prepare an SQL statement to query table zTab by primary +** key. Assuming the following table structure: +** +** CREATE TABLE x(a, b, c, d, PRIMARY KEY(a, c)); +** +** The SELECT statement looks like this: +** +** SELECT * FROM x WHERE a = ?1 AND c = ?3 +** +** If successful, SQLITE_OK is returned and SessionApplyCtx.pSelect is left +** pointing to the prepared version of the SQL statement. +*/ +static int sessionSelectRow( + sqlite3 *db, /* Database handle */ + const char *zTab, /* Table name */ + SessionApplyCtx *p /* Session changeset-apply context */ +){ + return sessionSelectStmt( + db, "main", zTab, p->nCol, p->azCol, p->abPK, &p->pSelect); +} + +/* +** Formulate and prepare an INSERT statement to add a record to table zTab. +** For example: +** +** INSERT INTO main."zTab" VALUES(?1, ?2, ?3 ...); +** +** If successful, SQLITE_OK is returned and SessionApplyCtx.pInsert is left +** pointing to the prepared version of the SQL statement. +*/ +static int sessionInsertRow( + sqlite3 *db, /* Database handle */ + const char *zTab, /* Table name */ + SessionApplyCtx *p /* Session changeset-apply context */ +){ + int rc = SQLITE_OK; + int i; + SessionBuffer buf = {0, 0, 0}; + + sessionAppendStr(&buf, "INSERT INTO main.", &rc); + sessionAppendIdent(&buf, zTab, &rc); + sessionAppendStr(&buf, "(", &rc); + for(i=0; i<p->nCol; i++){ + if( i!=0 ) sessionAppendStr(&buf, ", ", &rc); + sessionAppendIdent(&buf, p->azCol[i], &rc); + } + + sessionAppendStr(&buf, ") VALUES(?", &rc); + for(i=1; i<p->nCol; i++){ + sessionAppendStr(&buf, ", ?", &rc); + } + sessionAppendStr(&buf, ")", &rc); + + if( rc==SQLITE_OK ){ + rc = sqlite3_prepare_v2(db, (char *)buf.aBuf, buf.nBuf, &p->pInsert, 0); + } + sqlite3_free(buf.aBuf); + return rc; +} + +static int sessionPrepare(sqlite3 *db, sqlite3_stmt **pp, const char *zSql){ + return sqlite3_prepare_v2(db, zSql, -1, pp, 0); +} + +/* +** Prepare statements for applying changes to the sqlite_stat1 table. +** These are similar to those created by sessionSelectRow(), +** sessionInsertRow(), sessionUpdateRow() and sessionDeleteRow() for +** other tables. +*/ +static int sessionStat1Sql(sqlite3 *db, SessionApplyCtx *p){ + int rc = sessionSelectRow(db, "sqlite_stat1", p); + if( rc==SQLITE_OK ){ + rc = sessionPrepare(db, &p->pInsert, + "INSERT INTO main.sqlite_stat1 VALUES(?1, " + "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END, " + "?3)" + ); + } + if( rc==SQLITE_OK ){ + rc = sessionPrepare(db, &p->pUpdate, + "UPDATE main.sqlite_stat1 SET " + "tbl = CASE WHEN ?2 THEN ?3 ELSE tbl END, " + "idx = CASE WHEN ?5 THEN ?6 ELSE idx END, " + "stat = CASE WHEN ?8 THEN ?9 ELSE stat END " + "WHERE tbl=?1 AND idx IS " + "CASE WHEN length(?4)=0 AND typeof(?4)='blob' THEN NULL ELSE ?4 END " + "AND (?10 OR ?8=0 OR stat IS ?7)" + ); + } + if( rc==SQLITE_OK ){ + rc = sessionPrepare(db, &p->pDelete, + "DELETE FROM main.sqlite_stat1 WHERE tbl=?1 AND idx IS " + "CASE WHEN length(?2)=0 AND typeof(?2)='blob' THEN NULL ELSE ?2 END " + "AND (?4 OR stat IS ?3)" + ); + } + return rc; +} + +/* +** A wrapper around sqlite3_bind_value() that detects an extra problem. +** See comments in the body of this function for details. +*/ +static int sessionBindValue( + sqlite3_stmt *pStmt, /* Statement to bind value to */ + int i, /* Parameter number to bind to */ + sqlite3_value *pVal /* Value to bind */ +){ + int eType = sqlite3_value_type(pVal); + /* COVERAGE: The (pVal->z==0) branch is never true using current versions + ** of SQLite. If a malloc fails in an sqlite3_value_xxx() function, either + ** the (pVal->z) variable remains as it was or the type of the value is + ** set to SQLITE_NULL. */ + if( (eType==SQLITE_TEXT || eType==SQLITE_BLOB) && pVal->z==0 ){ + /* This condition occurs when an earlier OOM in a call to + ** sqlite3_value_text() or sqlite3_value_blob() (perhaps from within + ** a conflict-handler) has zeroed the pVal->z pointer. Return NOMEM. */ + return SQLITE_NOMEM; + } + return sqlite3_bind_value(pStmt, i, pVal); +} + +/* +** Iterator pIter must point to an SQLITE_INSERT entry. This function +** transfers new.* values from the current iterator entry to statement +** pStmt. The table being inserted into has nCol columns. +** +** New.* value $i from the iterator is bound to variable ($i+1) of +** statement pStmt. If parameter abPK is NULL, all values from 0 to (nCol-1) +** are transfered to the statement. Otherwise, if abPK is not NULL, it points +** to an array nCol elements in size. In this case only those values for +** which abPK[$i] is true are read from the iterator and bound to the +** statement. +** +** An SQLite error code is returned if an error occurs. Otherwise, SQLITE_OK. +*/ +static int sessionBindRow( + sqlite3_changeset_iter *pIter, /* Iterator to read values from */ + int(*xValue)(sqlite3_changeset_iter *, int, sqlite3_value **), + int nCol, /* Number of columns */ + u8 *abPK, /* If not NULL, bind only if true */ + sqlite3_stmt *pStmt /* Bind values to this statement */ +){ + int i; + int rc = SQLITE_OK; + + /* Neither sqlite3changeset_old or sqlite3changeset_new can fail if the + ** argument iterator points to a suitable entry. Make sure that xValue + ** is one of these to guarantee that it is safe to ignore the return + ** in the code below. */ + assert( xValue==sqlite3changeset_old || xValue==sqlite3changeset_new ); + + for(i=0; rc==SQLITE_OK && i<nCol; i++){ + if( !abPK || abPK[i] ){ + sqlite3_value *pVal; + (void)xValue(pIter, i, &pVal); + if( pVal==0 ){ + /* The value in the changeset was "undefined". This indicates a + ** corrupt changeset blob. */ + rc = SQLITE_CORRUPT_BKPT; + }else{ + rc = sessionBindValue(pStmt, i+1, pVal); + } + } + } + return rc; +} + +/* +** SQL statement pSelect is as generated by the sessionSelectRow() function. +** This function binds the primary key values from the change that changeset +** iterator pIter points to to the SELECT and attempts to seek to the table +** entry. If a row is found, the SELECT statement left pointing at the row +** and SQLITE_ROW is returned. Otherwise, if no row is found and no error +** has occured, the statement is reset and SQLITE_OK is returned. If an +** error occurs, the statement is reset and an SQLite error code is returned. +** +** If this function returns SQLITE_ROW, the caller must eventually reset() +** statement pSelect. If any other value is returned, the statement does +** not require a reset(). +** +** If the iterator currently points to an INSERT record, bind values from the +** new.* record to the SELECT statement. Or, if it points to a DELETE or +** UPDATE, bind values from the old.* record. +*/ +static int sessionSeekToRow( + sqlite3 *db, /* Database handle */ + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + u8 *abPK, /* Primary key flags array */ + sqlite3_stmt *pSelect /* SELECT statement from sessionSelectRow() */ +){ + int rc; /* Return code */ + int nCol; /* Number of columns in table */ + int op; /* Changset operation (SQLITE_UPDATE etc.) */ + const char *zDummy; /* Unused */ + + sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0); + rc = sessionBindRow(pIter, + op==SQLITE_INSERT ? sqlite3changeset_new : sqlite3changeset_old, + nCol, abPK, pSelect + ); + + if( rc==SQLITE_OK ){ + rc = sqlite3_step(pSelect); + if( rc!=SQLITE_ROW ) rc = sqlite3_reset(pSelect); + } + + return rc; +} + +/* +** This function is called from within sqlite3changset_apply_v2() when +** a conflict is encountered and resolved using conflict resolution +** mode eType (either SQLITE_CHANGESET_OMIT or SQLITE_CHANGESET_REPLACE).. +** It adds a conflict resolution record to the buffer in +** SessionApplyCtx.rebase, which will eventually be returned to the caller +** of apply_v2() as the "rebase" buffer. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. +*/ +static int sessionRebaseAdd( + SessionApplyCtx *p, /* Apply context */ + int eType, /* Conflict resolution (OMIT or REPLACE) */ + sqlite3_changeset_iter *pIter /* Iterator pointing at current change */ +){ + int rc = SQLITE_OK; + int i; + int eOp = pIter->op; + if( p->bRebaseStarted==0 ){ + /* Append a table-header to the rebase buffer */ + const char *zTab = pIter->zTab; + sessionAppendByte(&p->rebase, 'T', &rc); + sessionAppendVarint(&p->rebase, p->nCol, &rc); + sessionAppendBlob(&p->rebase, p->abPK, p->nCol, &rc); + sessionAppendBlob(&p->rebase, (u8*)zTab, (int)strlen(zTab)+1, &rc); + p->bRebaseStarted = 1; + } + + assert( eType==SQLITE_CHANGESET_REPLACE||eType==SQLITE_CHANGESET_OMIT ); + assert( eOp==SQLITE_DELETE || eOp==SQLITE_INSERT || eOp==SQLITE_UPDATE ); + + sessionAppendByte(&p->rebase, + (eOp==SQLITE_DELETE ? SQLITE_DELETE : SQLITE_INSERT), &rc + ); + sessionAppendByte(&p->rebase, (eType==SQLITE_CHANGESET_REPLACE), &rc); + for(i=0; i<p->nCol; i++){ + sqlite3_value *pVal = 0; + if( eOp==SQLITE_DELETE || (eOp==SQLITE_UPDATE && p->abPK[i]) ){ + sqlite3changeset_old(pIter, i, &pVal); + }else{ + sqlite3changeset_new(pIter, i, &pVal); + } + sessionAppendValue(&p->rebase, pVal, &rc); + } + + return rc; +} + +/* +** Invoke the conflict handler for the change that the changeset iterator +** currently points to. +** +** Argument eType must be either CHANGESET_DATA or CHANGESET_CONFLICT. +** If argument pbReplace is NULL, then the type of conflict handler invoked +** depends solely on eType, as follows: +** +** eType value Value passed to xConflict +** ------------------------------------------------- +** CHANGESET_DATA CHANGESET_NOTFOUND +** CHANGESET_CONFLICT CHANGESET_CONSTRAINT +** +** Or, if pbReplace is not NULL, then an attempt is made to find an existing +** record with the same primary key as the record about to be deleted, updated +** or inserted. If such a record can be found, it is available to the conflict +** handler as the "conflicting" record. In this case the type of conflict +** handler invoked is as follows: +** +** eType value PK Record found? Value passed to xConflict +** ---------------------------------------------------------------- +** CHANGESET_DATA Yes CHANGESET_DATA +** CHANGESET_DATA No CHANGESET_NOTFOUND +** CHANGESET_CONFLICT Yes CHANGESET_CONFLICT +** CHANGESET_CONFLICT No CHANGESET_CONSTRAINT +** +** If pbReplace is not NULL, and a record with a matching PK is found, and +** the conflict handler function returns SQLITE_CHANGESET_REPLACE, *pbReplace +** is set to non-zero before returning SQLITE_OK. +** +** If the conflict handler returns SQLITE_CHANGESET_ABORT, SQLITE_ABORT is +** returned. Or, if the conflict handler returns an invalid value, +** SQLITE_MISUSE. If the conflict handler returns SQLITE_CHANGESET_OMIT, +** this function returns SQLITE_OK. +*/ +static int sessionConflictHandler( + int eType, /* Either CHANGESET_DATA or CONFLICT */ + SessionApplyCtx *p, /* changeset_apply() context */ + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int(*xConflict)(void *, int, sqlite3_changeset_iter*), + void *pCtx, /* First argument for conflict handler */ + int *pbReplace /* OUT: Set to true if PK row is found */ +){ + int res = 0; /* Value returned by conflict handler */ + int rc; + int nCol; + int op; + const char *zDummy; + + sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0); + + assert( eType==SQLITE_CHANGESET_CONFLICT || eType==SQLITE_CHANGESET_DATA ); + assert( SQLITE_CHANGESET_CONFLICT+1==SQLITE_CHANGESET_CONSTRAINT ); + assert( SQLITE_CHANGESET_DATA+1==SQLITE_CHANGESET_NOTFOUND ); + + /* Bind the new.* PRIMARY KEY values to the SELECT statement. */ + if( pbReplace ){ + rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect); + }else{ + rc = SQLITE_OK; + } + + if( rc==SQLITE_ROW ){ + /* There exists another row with the new.* primary key. */ + pIter->pConflict = p->pSelect; + res = xConflict(pCtx, eType, pIter); + pIter->pConflict = 0; + rc = sqlite3_reset(p->pSelect); + }else if( rc==SQLITE_OK ){ + if( p->bDeferConstraints && eType==SQLITE_CHANGESET_CONFLICT ){ + /* Instead of invoking the conflict handler, append the change blob + ** to the SessionApplyCtx.constraints buffer. */ + u8 *aBlob = &pIter->in.aData[pIter->in.iCurrent]; + int nBlob = pIter->in.iNext - pIter->in.iCurrent; + sessionAppendBlob(&p->constraints, aBlob, nBlob, &rc); + return SQLITE_OK; + }else{ + /* No other row with the new.* primary key. */ + res = xConflict(pCtx, eType+1, pIter); + if( res==SQLITE_CHANGESET_REPLACE ) rc = SQLITE_MISUSE; + } + } + + if( rc==SQLITE_OK ){ + switch( res ){ + case SQLITE_CHANGESET_REPLACE: + assert( pbReplace ); + *pbReplace = 1; + break; + + case SQLITE_CHANGESET_OMIT: + break; + + case SQLITE_CHANGESET_ABORT: + rc = SQLITE_ABORT; + break; + + default: + rc = SQLITE_MISUSE; + break; + } + if( rc==SQLITE_OK ){ + rc = sessionRebaseAdd(p, res, pIter); + } + } + + return rc; +} + +/* +** Attempt to apply the change that the iterator passed as the first argument +** currently points to to the database. If a conflict is encountered, invoke +** the conflict handler callback. +** +** If argument pbRetry is NULL, then ignore any CHANGESET_DATA conflict. If +** one is encountered, update or delete the row with the matching primary key +** instead. Or, if pbRetry is not NULL and a CHANGESET_DATA conflict occurs, +** invoke the conflict handler. If it returns CHANGESET_REPLACE, set *pbRetry +** to true before returning. In this case the caller will invoke this function +** again, this time with pbRetry set to NULL. +** +** If argument pbReplace is NULL and a CHANGESET_CONFLICT conflict is +** encountered invoke the conflict handler with CHANGESET_CONSTRAINT instead. +** Or, if pbReplace is not NULL, invoke it with CHANGESET_CONFLICT. If such +** an invocation returns SQLITE_CHANGESET_REPLACE, set *pbReplace to true +** before retrying. In this case the caller attempts to remove the conflicting +** row before invoking this function again, this time with pbReplace set +** to NULL. +** +** If any conflict handler returns SQLITE_CHANGESET_ABORT, this function +** returns SQLITE_ABORT. Otherwise, if no error occurs, SQLITE_OK is +** returned. +*/ +static int sessionApplyOneOp( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + SessionApplyCtx *p, /* changeset_apply() context */ + int(*xConflict)(void *, int, sqlite3_changeset_iter *), + void *pCtx, /* First argument for the conflict handler */ + int *pbReplace, /* OUT: True to remove PK row and retry */ + int *pbRetry /* OUT: True to retry. */ +){ + const char *zDummy; + int op; + int nCol; + int rc = SQLITE_OK; + + assert( p->pDelete && p->pUpdate && p->pInsert && p->pSelect ); + assert( p->azCol && p->abPK ); + assert( !pbReplace || *pbReplace==0 ); + + sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0); + + if( op==SQLITE_DELETE ){ + + /* Bind values to the DELETE statement. If conflict handling is required, + ** bind values for all columns and set bound variable (nCol+1) to true. + ** Or, if conflict handling is not required, bind just the PK column + ** values and, if it exists, set (nCol+1) to false. Conflict handling + ** is not required if: + ** + ** * this is a patchset, or + ** * (pbRetry==0), or + ** * all columns of the table are PK columns (in this case there is + ** no (nCol+1) variable to bind to). + */ + u8 *abPK = (pIter->bPatchset ? p->abPK : 0); + rc = sessionBindRow(pIter, sqlite3changeset_old, nCol, abPK, p->pDelete); + if( rc==SQLITE_OK && sqlite3_bind_parameter_count(p->pDelete)>nCol ){ + rc = sqlite3_bind_int(p->pDelete, nCol+1, (pbRetry==0 || abPK)); + } + if( rc!=SQLITE_OK ) return rc; + + sqlite3_step(p->pDelete); + rc = sqlite3_reset(p->pDelete); + if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 ){ + rc = sessionConflictHandler( + SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry + ); + }else if( (rc&0xff)==SQLITE_CONSTRAINT ){ + rc = sessionConflictHandler( + SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, 0 + ); + } + + }else if( op==SQLITE_UPDATE ){ + int i; + + /* Bind values to the UPDATE statement. */ + for(i=0; rc==SQLITE_OK && i<nCol; i++){ + sqlite3_value *pOld = sessionChangesetOld(pIter, i); + sqlite3_value *pNew = sessionChangesetNew(pIter, i); + + sqlite3_bind_int(p->pUpdate, i*3+2, !!pNew); + if( pOld ){ + rc = sessionBindValue(p->pUpdate, i*3+1, pOld); + } + if( rc==SQLITE_OK && pNew ){ + rc = sessionBindValue(p->pUpdate, i*3+3, pNew); + } + } + if( rc==SQLITE_OK ){ + sqlite3_bind_int(p->pUpdate, nCol*3+1, pbRetry==0 || pIter->bPatchset); + } + if( rc!=SQLITE_OK ) return rc; + + /* Attempt the UPDATE. In the case of a NOTFOUND or DATA conflict, + ** the result will be SQLITE_OK with 0 rows modified. */ + sqlite3_step(p->pUpdate); + rc = sqlite3_reset(p->pUpdate); + + if( rc==SQLITE_OK && sqlite3_changes(p->db)==0 ){ + /* A NOTFOUND or DATA error. Search the table to see if it contains + ** a row with a matching primary key. If so, this is a DATA conflict. + ** Otherwise, if there is no primary key match, it is a NOTFOUND. */ + + rc = sessionConflictHandler( + SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry + ); + + }else if( (rc&0xff)==SQLITE_CONSTRAINT ){ + /* This is always a CONSTRAINT conflict. */ + rc = sessionConflictHandler( + SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, 0 + ); + } + + }else{ + assert( op==SQLITE_INSERT ); + if( p->bStat1 ){ + /* Check if there is a conflicting row. For sqlite_stat1, this needs + ** to be done using a SELECT, as there is no PRIMARY KEY in the + ** database schema to throw an exception if a duplicate is inserted. */ + rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect); + if( rc==SQLITE_ROW ){ + rc = SQLITE_CONSTRAINT; + sqlite3_reset(p->pSelect); + } + } + + if( rc==SQLITE_OK ){ + rc = sessionBindRow(pIter, sqlite3changeset_new, nCol, 0, p->pInsert); + if( rc!=SQLITE_OK ) return rc; + + sqlite3_step(p->pInsert); + rc = sqlite3_reset(p->pInsert); + } + + if( (rc&0xff)==SQLITE_CONSTRAINT ){ + rc = sessionConflictHandler( + SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, pbReplace + ); + } + } + + return rc; +} + +/* +** Attempt to apply the change that the iterator passed as the first argument +** currently points to to the database. If a conflict is encountered, invoke +** the conflict handler callback. +** +** The difference between this function and sessionApplyOne() is that this +** function handles the case where the conflict-handler is invoked and +** returns SQLITE_CHANGESET_REPLACE - indicating that the change should be +** retried in some manner. +*/ +static int sessionApplyOneWithRetry( + sqlite3 *db, /* Apply change to "main" db of this handle */ + sqlite3_changeset_iter *pIter, /* Changeset iterator to read change from */ + SessionApplyCtx *pApply, /* Apply context */ + int(*xConflict)(void*, int, sqlite3_changeset_iter*), + void *pCtx /* First argument passed to xConflict */ +){ + int bReplace = 0; + int bRetry = 0; + int rc; + + rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, &bReplace, &bRetry); + if( rc==SQLITE_OK ){ + /* If the bRetry flag is set, the change has not been applied due to an + ** SQLITE_CHANGESET_DATA problem (i.e. this is an UPDATE or DELETE and + ** a row with the correct PK is present in the db, but one or more other + ** fields do not contain the expected values) and the conflict handler + ** returned SQLITE_CHANGESET_REPLACE. In this case retry the operation, + ** but pass NULL as the final argument so that sessionApplyOneOp() ignores + ** the SQLITE_CHANGESET_DATA problem. */ + if( bRetry ){ + assert( pIter->op==SQLITE_UPDATE || pIter->op==SQLITE_DELETE ); + rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0); + } + + /* If the bReplace flag is set, the change is an INSERT that has not + ** been performed because the database already contains a row with the + ** specified primary key and the conflict handler returned + ** SQLITE_CHANGESET_REPLACE. In this case remove the conflicting row + ** before reattempting the INSERT. */ + else if( bReplace ){ + assert( pIter->op==SQLITE_INSERT ); + rc = sqlite3_exec(db, "SAVEPOINT replace_op", 0, 0, 0); + if( rc==SQLITE_OK ){ + rc = sessionBindRow(pIter, + sqlite3changeset_new, pApply->nCol, pApply->abPK, pApply->pDelete); + sqlite3_bind_int(pApply->pDelete, pApply->nCol+1, 1); + } + if( rc==SQLITE_OK ){ + sqlite3_step(pApply->pDelete); + rc = sqlite3_reset(pApply->pDelete); + } + if( rc==SQLITE_OK ){ + rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(db, "RELEASE replace_op", 0, 0, 0); + } + } + } + + return rc; +} + +/* +** Retry the changes accumulated in the pApply->constraints buffer. +*/ +static int sessionRetryConstraints( + sqlite3 *db, + int bPatchset, + const char *zTab, + SessionApplyCtx *pApply, + int(*xConflict)(void*, int, sqlite3_changeset_iter*), + void *pCtx /* First argument passed to xConflict */ +){ + int rc = SQLITE_OK; + + while( pApply->constraints.nBuf ){ + sqlite3_changeset_iter *pIter2 = 0; + SessionBuffer cons = pApply->constraints; + memset(&pApply->constraints, 0, sizeof(SessionBuffer)); + + rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf); + if( rc==SQLITE_OK ){ + int nByte = 2*pApply->nCol*sizeof(sqlite3_value*); + int rc2; + pIter2->bPatchset = bPatchset; + pIter2->zTab = (char*)zTab; + pIter2->nCol = pApply->nCol; + pIter2->abPK = pApply->abPK; + sessionBufferGrow(&pIter2->tblhdr, nByte, &rc); + pIter2->apValue = (sqlite3_value**)pIter2->tblhdr.aBuf; + if( rc==SQLITE_OK ) memset(pIter2->apValue, 0, nByte); + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3changeset_next(pIter2) ){ + rc = sessionApplyOneWithRetry(db, pIter2, pApply, xConflict, pCtx); + } + + rc2 = sqlite3changeset_finalize(pIter2); + if( rc==SQLITE_OK ) rc = rc2; + } + assert( pApply->bDeferConstraints || pApply->constraints.nBuf==0 ); + + sqlite3_free(cons.aBuf); + if( rc!=SQLITE_OK ) break; + if( pApply->constraints.nBuf>=cons.nBuf ){ + /* No progress was made on the last round. */ + pApply->bDeferConstraints = 0; + } + } + + return rc; +} + +/* +** Argument pIter is a changeset iterator that has been initialized, but +** not yet passed to sqlite3changeset_next(). This function applies the +** changeset to the main database attached to handle "db". The supplied +** conflict handler callback is invoked to resolve any conflicts encountered +** while applying the change. +*/ +static int sessionChangesetApply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + sqlite3_changeset_iter *pIter, /* Changeset to apply */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of fifth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, /* OUT: Rebase information */ + int flags /* SESSION_APPLY_XXX flags */ +){ + int schemaMismatch = 0; + int rc = SQLITE_OK; /* Return code */ + const char *zTab = 0; /* Name of current table */ + int nTab = 0; /* Result of sqlite3Strlen30(zTab) */ + SessionApplyCtx sApply; /* changeset_apply() context object */ + int bPatchset; + + assert( xConflict!=0 ); + + pIter->in.bNoDiscard = 1; + memset(&sApply, 0, sizeof(sApply)); + sqlite3_mutex_enter(sqlite3_db_mutex(db)); + if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ + rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(db, "PRAGMA defer_foreign_keys = 1", 0, 0, 0); + } + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3changeset_next(pIter) ){ + int nCol; + int op; + const char *zNew; + + sqlite3changeset_op(pIter, &zNew, &nCol, &op, 0); + + if( zTab==0 || sqlite3_strnicmp(zNew, zTab, nTab+1) ){ + u8 *abPK; + + rc = sessionRetryConstraints( + db, pIter->bPatchset, zTab, &sApply, xConflict, pCtx + ); + if( rc!=SQLITE_OK ) break; + + sqlite3_free((char*)sApply.azCol); /* cast works around VC++ bug */ + sqlite3_finalize(sApply.pDelete); + sqlite3_finalize(sApply.pUpdate); + sqlite3_finalize(sApply.pInsert); + sqlite3_finalize(sApply.pSelect); + sApply.db = db; + sApply.pDelete = 0; + sApply.pUpdate = 0; + sApply.pInsert = 0; + sApply.pSelect = 0; + sApply.nCol = 0; + sApply.azCol = 0; + sApply.abPK = 0; + sApply.bStat1 = 0; + sApply.bDeferConstraints = 1; + sApply.bRebaseStarted = 0; + memset(&sApply.constraints, 0, sizeof(SessionBuffer)); + + /* If an xFilter() callback was specified, invoke it now. If the + ** xFilter callback returns zero, skip this table. If it returns + ** non-zero, proceed. */ + schemaMismatch = (xFilter && (0==xFilter(pCtx, zNew))); + if( schemaMismatch ){ + zTab = sqlite3_mprintf("%s", zNew); + if( zTab==0 ){ + rc = SQLITE_NOMEM; + break; + } + nTab = (int)strlen(zTab); + sApply.azCol = (const char **)zTab; + }else{ + int nMinCol = 0; + int i; + + sqlite3changeset_pk(pIter, &abPK, 0); + rc = sessionTableInfo( + db, "main", zNew, &sApply.nCol, &zTab, &sApply.azCol, &sApply.abPK + ); + if( rc!=SQLITE_OK ) break; + for(i=0; i<sApply.nCol; i++){ + if( sApply.abPK[i] ) nMinCol = i+1; + } + + if( sApply.nCol==0 ){ + schemaMismatch = 1; + sqlite3_log(SQLITE_SCHEMA, + "sqlite3changeset_apply(): no such table: %s", zTab + ); + } + else if( sApply.nCol<nCol ){ + schemaMismatch = 1; + sqlite3_log(SQLITE_SCHEMA, + "sqlite3changeset_apply(): table %s has %d columns, " + "expected %d or more", + zTab, sApply.nCol, nCol + ); + } + else if( nCol<nMinCol || memcmp(sApply.abPK, abPK, nCol)!=0 ){ + schemaMismatch = 1; + sqlite3_log(SQLITE_SCHEMA, "sqlite3changeset_apply(): " + "primary key mismatch for table %s", zTab + ); + } + else{ + sApply.nCol = nCol; + if( 0==sqlite3_stricmp(zTab, "sqlite_stat1") ){ + if( (rc = sessionStat1Sql(db, &sApply) ) ){ + break; + } + sApply.bStat1 = 1; + }else{ + if((rc = sessionSelectRow(db, zTab, &sApply)) + || (rc = sessionUpdateRow(db, zTab, &sApply)) + || (rc = sessionDeleteRow(db, zTab, &sApply)) + || (rc = sessionInsertRow(db, zTab, &sApply)) + ){ + break; + } + sApply.bStat1 = 0; + } + } + nTab = sqlite3Strlen30(zTab); + } + } + + /* If there is a schema mismatch on the current table, proceed to the + ** next change. A log message has already been issued. */ + if( schemaMismatch ) continue; + + rc = sessionApplyOneWithRetry(db, pIter, &sApply, xConflict, pCtx); + } + + bPatchset = pIter->bPatchset; + if( rc==SQLITE_OK ){ + rc = sqlite3changeset_finalize(pIter); + }else{ + sqlite3changeset_finalize(pIter); + } + + if( rc==SQLITE_OK ){ + rc = sessionRetryConstraints(db, bPatchset, zTab, &sApply, xConflict, pCtx); + } + + if( rc==SQLITE_OK ){ + int nFk, notUsed; + sqlite3_db_status(db, SQLITE_DBSTATUS_DEFERRED_FKS, &nFk, ¬Used, 0); + if( nFk!=0 ){ + int res = SQLITE_CHANGESET_ABORT; + sqlite3_changeset_iter sIter; + memset(&sIter, 0, sizeof(sIter)); + sIter.nCol = nFk; + res = xConflict(pCtx, SQLITE_CHANGESET_FOREIGN_KEY, &sIter); + if( res!=SQLITE_CHANGESET_OMIT ){ + rc = SQLITE_CONSTRAINT; + } + } + } + sqlite3_exec(db, "PRAGMA defer_foreign_keys = 0", 0, 0, 0); + + if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ + if( rc==SQLITE_OK ){ + rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0); + }else{ + sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0); + sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0); + } + } + + if( rc==SQLITE_OK && bPatchset==0 && ppRebase && pnRebase ){ + *ppRebase = (void*)sApply.rebase.aBuf; + *pnRebase = sApply.rebase.nBuf; + sApply.rebase.aBuf = 0; + } + sqlite3_finalize(sApply.pInsert); + sqlite3_finalize(sApply.pDelete); + sqlite3_finalize(sApply.pUpdate); + sqlite3_finalize(sApply.pSelect); + sqlite3_free((char*)sApply.azCol); /* cast works around VC++ bug */ + sqlite3_free((char*)sApply.constraints.aBuf); + sqlite3_free((char*)sApply.rebase.aBuf); + sqlite3_mutex_leave(sqlite3_db_mutex(db)); + return rc; +} + +/* +** Apply the changeset passed via pChangeset/nChangeset to the main +** database attached to handle "db". +*/ +SQLITE_API int sqlite3changeset_apply_v2( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +){ + sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ + int rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset); + if( rc==SQLITE_OK ){ + rc = sessionChangesetApply( + db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags + ); + } + return rc; +} + +/* +** Apply the changeset passed via pChangeset/nChangeset to the main database +** attached to handle "db". Invoke the supplied conflict handler callback +** to resolve any conflicts encountered while applying the change. +*/ +SQLITE_API int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of fifth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +){ + return sqlite3changeset_apply_v2( + db, nChangeset, pChangeset, xFilter, xConflict, pCtx, 0, 0, 0 + ); +} + +/* +** Apply the changeset passed via xInput/pIn to the main database +** attached to handle "db". Invoke the supplied conflict handler callback +** to resolve any conflicts encountered while applying the change. +*/ +SQLITE_API int sqlite3changeset_apply_v2_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +){ + sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */ + int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn); + if( rc==SQLITE_OK ){ + rc = sessionChangesetApply( + db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags + ); + } + return rc; +} +SQLITE_API int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +){ + return sqlite3changeset_apply_v2_strm( + db, xInput, pIn, xFilter, xConflict, pCtx, 0, 0, 0 + ); +} + +/* +** sqlite3_changegroup handle. +*/ +struct sqlite3_changegroup { + int rc; /* Error code */ + int bPatch; /* True to accumulate patchsets */ + SessionTable *pList; /* List of tables in current patch */ +}; + +/* +** This function is called to merge two changes to the same row together as +** part of an sqlite3changeset_concat() operation. A new change object is +** allocated and a pointer to it stored in *ppNew. +*/ +static int sessionChangeMerge( + SessionTable *pTab, /* Table structure */ + int bRebase, /* True for a rebase hash-table */ + int bPatchset, /* True for patchsets */ + SessionChange *pExist, /* Existing change */ + int op2, /* Second change operation */ + int bIndirect, /* True if second change is indirect */ + u8 *aRec, /* Second change record */ + int nRec, /* Number of bytes in aRec */ + SessionChange **ppNew /* OUT: Merged change */ +){ + SessionChange *pNew = 0; + int rc = SQLITE_OK; + + if( !pExist ){ + pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec); + if( !pNew ){ + return SQLITE_NOMEM; + } + memset(pNew, 0, sizeof(SessionChange)); + pNew->op = op2; + pNew->bIndirect = bIndirect; + pNew->aRecord = (u8*)&pNew[1]; + if( bIndirect==0 || bRebase==0 ){ + pNew->nRecord = nRec; + memcpy(pNew->aRecord, aRec, nRec); + }else{ + int i; + u8 *pIn = aRec; + u8 *pOut = pNew->aRecord; + for(i=0; i<pTab->nCol; i++){ + int nIn = sessionSerialLen(pIn); + if( *pIn==0 ){ + *pOut++ = 0; + }else if( pTab->abPK[i]==0 ){ + *pOut++ = 0xFF; + }else{ + memcpy(pOut, pIn, nIn); + pOut += nIn; + } + pIn += nIn; + } + pNew->nRecord = pOut - pNew->aRecord; + } + }else if( bRebase ){ + if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){ + *ppNew = pExist; + }else{ + int nByte = nRec + pExist->nRecord + sizeof(SessionChange); + pNew = (SessionChange*)sqlite3_malloc(nByte); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + int i; + u8 *a1 = pExist->aRecord; + u8 *a2 = aRec; + u8 *pOut; + + memset(pNew, 0, nByte); + pNew->bIndirect = bIndirect || pExist->bIndirect; + pNew->op = op2; + pOut = pNew->aRecord = (u8*)&pNew[1]; + + for(i=0; i<pTab->nCol; i++){ + int n1 = sessionSerialLen(a1); + int n2 = sessionSerialLen(a2); + if( *a1==0xFF || (pTab->abPK[i]==0 && bIndirect) ){ + *pOut++ = 0xFF; + }else if( *a2==0 ){ + memcpy(pOut, a1, n1); + pOut += n1; + }else{ + memcpy(pOut, a2, n2); + pOut += n2; + } + a1 += n1; + a2 += n2; + } + pNew->nRecord = pOut - pNew->aRecord; + } + sqlite3_free(pExist); + } + }else{ + int op1 = pExist->op; + + /* + ** op1=INSERT, op2=INSERT -> Unsupported. Discard op2. + ** op1=INSERT, op2=UPDATE -> INSERT. + ** op1=INSERT, op2=DELETE -> (none) + ** + ** op1=UPDATE, op2=INSERT -> Unsupported. Discard op2. + ** op1=UPDATE, op2=UPDATE -> UPDATE. + ** op1=UPDATE, op2=DELETE -> DELETE. + ** + ** op1=DELETE, op2=INSERT -> UPDATE. + ** op1=DELETE, op2=UPDATE -> Unsupported. Discard op2. + ** op1=DELETE, op2=DELETE -> Unsupported. Discard op2. + */ + if( (op1==SQLITE_INSERT && op2==SQLITE_INSERT) + || (op1==SQLITE_UPDATE && op2==SQLITE_INSERT) + || (op1==SQLITE_DELETE && op2==SQLITE_UPDATE) + || (op1==SQLITE_DELETE && op2==SQLITE_DELETE) + ){ + pNew = pExist; + }else if( op1==SQLITE_INSERT && op2==SQLITE_DELETE ){ + sqlite3_free(pExist); + assert( pNew==0 ); + }else{ + u8 *aExist = pExist->aRecord; + int nByte; + u8 *aCsr; + + /* Allocate a new SessionChange object. Ensure that the aRecord[] + ** buffer of the new object is large enough to hold any record that + ** may be generated by combining the input records. */ + nByte = sizeof(SessionChange) + pExist->nRecord + nRec; + pNew = (SessionChange *)sqlite3_malloc(nByte); + if( !pNew ){ + sqlite3_free(pExist); + return SQLITE_NOMEM; + } + memset(pNew, 0, sizeof(SessionChange)); + pNew->bIndirect = (bIndirect && pExist->bIndirect); + aCsr = pNew->aRecord = (u8 *)&pNew[1]; + + if( op1==SQLITE_INSERT ){ /* INSERT + UPDATE */ + u8 *a1 = aRec; + assert( op2==SQLITE_UPDATE ); + pNew->op = SQLITE_INSERT; + if( bPatchset==0 ) sessionSkipRecord(&a1, pTab->nCol); + sessionMergeRecord(&aCsr, pTab->nCol, aExist, a1); + }else if( op1==SQLITE_DELETE ){ /* DELETE + INSERT */ + assert( op2==SQLITE_INSERT ); + pNew->op = SQLITE_UPDATE; + if( bPatchset ){ + memcpy(aCsr, aRec, nRec); + aCsr += nRec; + }else{ + if( 0==sessionMergeUpdate(&aCsr, pTab, bPatchset, aExist, 0,aRec,0) ){ + sqlite3_free(pNew); + pNew = 0; + } + } + }else if( op2==SQLITE_UPDATE ){ /* UPDATE + UPDATE */ + u8 *a1 = aExist; + u8 *a2 = aRec; + assert( op1==SQLITE_UPDATE ); + if( bPatchset==0 ){ + sessionSkipRecord(&a1, pTab->nCol); + sessionSkipRecord(&a2, pTab->nCol); + } + pNew->op = SQLITE_UPDATE; + if( 0==sessionMergeUpdate(&aCsr, pTab, bPatchset, aRec, aExist,a1,a2) ){ + sqlite3_free(pNew); + pNew = 0; + } + }else{ /* UPDATE + DELETE */ + assert( op1==SQLITE_UPDATE && op2==SQLITE_DELETE ); + pNew->op = SQLITE_DELETE; + if( bPatchset ){ + memcpy(aCsr, aRec, nRec); + aCsr += nRec; + }else{ + sessionMergeRecord(&aCsr, pTab->nCol, aRec, aExist); + } + } + + if( pNew ){ + pNew->nRecord = (int)(aCsr - pNew->aRecord); + } + sqlite3_free(pExist); + } + } + + *ppNew = pNew; + return rc; +} + +/* +** Add all changes in the changeset traversed by the iterator passed as +** the first argument to the changegroup hash tables. +*/ +static int sessionChangesetToHash( + sqlite3_changeset_iter *pIter, /* Iterator to read from */ + sqlite3_changegroup *pGrp, /* Changegroup object to add changeset to */ + int bRebase /* True if hash table is for rebasing */ +){ + u8 *aRec; + int nRec; + int rc = SQLITE_OK; + SessionTable *pTab = 0; + + while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, 0) ){ + const char *zNew; + int nCol; + int op; + int iHash; + int bIndirect; + SessionChange *pChange; + SessionChange *pExist = 0; + SessionChange **pp; + + if( pGrp->pList==0 ){ + pGrp->bPatch = pIter->bPatchset; + }else if( pIter->bPatchset!=pGrp->bPatch ){ + rc = SQLITE_ERROR; + break; + } + + sqlite3changeset_op(pIter, &zNew, &nCol, &op, &bIndirect); + if( !pTab || sqlite3_stricmp(zNew, pTab->zName) ){ + /* Search the list for a matching table */ + int nNew = (int)strlen(zNew); + u8 *abPK; + + sqlite3changeset_pk(pIter, &abPK, 0); + for(pTab = pGrp->pList; pTab; pTab=pTab->pNext){ + if( 0==sqlite3_strnicmp(pTab->zName, zNew, nNew+1) ) break; + } + if( !pTab ){ + SessionTable **ppTab; + + pTab = sqlite3_malloc(sizeof(SessionTable) + nCol + nNew+1); + if( !pTab ){ + rc = SQLITE_NOMEM; + break; + } + memset(pTab, 0, sizeof(SessionTable)); + pTab->nCol = nCol; + pTab->abPK = (u8*)&pTab[1]; + memcpy(pTab->abPK, abPK, nCol); + pTab->zName = (char*)&pTab->abPK[nCol]; + memcpy(pTab->zName, zNew, nNew+1); + + /* The new object must be linked on to the end of the list, not + ** simply added to the start of it. This is to ensure that the + ** tables within the output of sqlite3changegroup_output() are in + ** the right order. */ + for(ppTab=&pGrp->pList; *ppTab; ppTab=&(*ppTab)->pNext); + *ppTab = pTab; + }else if( pTab->nCol!=nCol || memcmp(pTab->abPK, abPK, nCol) ){ + rc = SQLITE_SCHEMA; + break; + } + } + + if( sessionGrowHash(pIter->bPatchset, pTab) ){ + rc = SQLITE_NOMEM; + break; + } + iHash = sessionChangeHash( + pTab, (pIter->bPatchset && op==SQLITE_DELETE), aRec, pTab->nChange + ); + + /* Search for existing entry. If found, remove it from the hash table. + ** Code below may link it back in. + */ + for(pp=&pTab->apChange[iHash]; *pp; pp=&(*pp)->pNext){ + int bPkOnly1 = 0; + int bPkOnly2 = 0; + if( pIter->bPatchset ){ + bPkOnly1 = (*pp)->op==SQLITE_DELETE; + bPkOnly2 = op==SQLITE_DELETE; + } + if( sessionChangeEqual(pTab, bPkOnly1, (*pp)->aRecord, bPkOnly2, aRec) ){ + pExist = *pp; + *pp = (*pp)->pNext; + pTab->nEntry--; + break; + } + } + + rc = sessionChangeMerge(pTab, bRebase, + pIter->bPatchset, pExist, op, bIndirect, aRec, nRec, &pChange + ); + if( rc ) break; + if( pChange ){ + pChange->pNext = pTab->apChange[iHash]; + pTab->apChange[iHash] = pChange; + pTab->nEntry++; + } + } + + if( rc==SQLITE_OK ) rc = pIter->rc; + return rc; +} + +/* +** Serialize a changeset (or patchset) based on all changesets (or patchsets) +** added to the changegroup object passed as the first argument. +** +** If xOutput is not NULL, then the changeset/patchset is returned to the +** user via one or more calls to xOutput, as with the other streaming +** interfaces. +** +** Or, if xOutput is NULL, then (*ppOut) is populated with a pointer to a +** buffer containing the output changeset before this function returns. In +** this case (*pnOut) is set to the size of the output buffer in bytes. It +** is the responsibility of the caller to free the output buffer using +** sqlite3_free() when it is no longer required. +** +** If successful, SQLITE_OK is returned. Or, if an error occurs, an SQLite +** error code. If an error occurs and xOutput is NULL, (*ppOut) and (*pnOut) +** are both set to 0 before returning. +*/ +static int sessionChangegroupOutput( + sqlite3_changegroup *pGrp, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut, + int *pnOut, + void **ppOut +){ + int rc = SQLITE_OK; + SessionBuffer buf = {0, 0, 0}; + SessionTable *pTab; + assert( xOutput==0 || (ppOut==0 && pnOut==0) ); + + /* Create the serialized output changeset based on the contents of the + ** hash tables attached to the SessionTable objects in list p->pList. + */ + for(pTab=pGrp->pList; rc==SQLITE_OK && pTab; pTab=pTab->pNext){ + int i; + if( pTab->nEntry==0 ) continue; + + sessionAppendTableHdr(&buf, pGrp->bPatch, pTab, &rc); + for(i=0; i<pTab->nChange; i++){ + SessionChange *p; + for(p=pTab->apChange[i]; p; p=p->pNext){ + sessionAppendByte(&buf, p->op, &rc); + sessionAppendByte(&buf, p->bIndirect, &rc); + sessionAppendBlob(&buf, p->aRecord, p->nRecord, &rc); + } + } + + if( rc==SQLITE_OK && xOutput && buf.nBuf>=SESSIONS_STRM_CHUNK_SIZE ){ + rc = xOutput(pOut, buf.aBuf, buf.nBuf); + buf.nBuf = 0; + } + } + + if( rc==SQLITE_OK ){ + if( xOutput ){ + if( buf.nBuf>0 ) rc = xOutput(pOut, buf.aBuf, buf.nBuf); + }else{ + *ppOut = buf.aBuf; + *pnOut = buf.nBuf; + buf.aBuf = 0; + } + } + sqlite3_free(buf.aBuf); + + return rc; +} + +/* +** Allocate a new, empty, sqlite3_changegroup. +*/ +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp){ + int rc = SQLITE_OK; /* Return code */ + sqlite3_changegroup *p; /* New object */ + p = (sqlite3_changegroup*)sqlite3_malloc(sizeof(sqlite3_changegroup)); + if( p==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(p, 0, sizeof(sqlite3_changegroup)); + } + *pp = p; + return rc; +} + +/* +** Add the changeset currently stored in buffer pData, size nData bytes, +** to changeset-group p. +*/ +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup *pGrp, int nData, void *pData){ + sqlite3_changeset_iter *pIter; /* Iterator opened on pData/nData */ + int rc; /* Return code */ + + rc = sqlite3changeset_start(&pIter, nData, pData); + if( rc==SQLITE_OK ){ + rc = sessionChangesetToHash(pIter, pGrp, 0); + } + sqlite3changeset_finalize(pIter); + return rc; +} + +/* +** Obtain a buffer containing a changeset representing the concatenation +** of all changesets added to the group so far. +*/ +SQLITE_API int sqlite3changegroup_output( + sqlite3_changegroup *pGrp, + int *pnData, + void **ppData +){ + return sessionChangegroupOutput(pGrp, 0, 0, pnData, ppData); +} + +/* +** Streaming versions of changegroup_add(). +*/ +SQLITE_API int sqlite3changegroup_add_strm( + sqlite3_changegroup *pGrp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +){ + sqlite3_changeset_iter *pIter; /* Iterator opened on pData/nData */ + int rc; /* Return code */ + + rc = sqlite3changeset_start_strm(&pIter, xInput, pIn); + if( rc==SQLITE_OK ){ + rc = sessionChangesetToHash(pIter, pGrp, 0); + } + sqlite3changeset_finalize(pIter); + return rc; +} + +/* +** Streaming versions of changegroup_output(). +*/ +SQLITE_API int sqlite3changegroup_output_strm( + sqlite3_changegroup *pGrp, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +){ + return sessionChangegroupOutput(pGrp, xOutput, pOut, 0, 0); +} + +/* +** Delete a changegroup object. +*/ +SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup *pGrp){ + if( pGrp ){ + sessionDeleteTable(pGrp->pList); + sqlite3_free(pGrp); + } +} + +/* +** Combine two changesets together. +*/ +SQLITE_API int sqlite3changeset_concat( + int nLeft, /* Number of bytes in lhs input */ + void *pLeft, /* Lhs input changeset */ + int nRight /* Number of bytes in rhs input */, + void *pRight, /* Rhs input changeset */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: changeset (left <concat> right) */ +){ + sqlite3_changegroup *pGrp; + int rc; + + rc = sqlite3changegroup_new(&pGrp); + if( rc==SQLITE_OK ){ + rc = sqlite3changegroup_add(pGrp, nLeft, pLeft); + } + if( rc==SQLITE_OK ){ + rc = sqlite3changegroup_add(pGrp, nRight, pRight); + } + if( rc==SQLITE_OK ){ + rc = sqlite3changegroup_output(pGrp, pnOut, ppOut); + } + sqlite3changegroup_delete(pGrp); + + return rc; +} + +/* +** Streaming version of sqlite3changeset_concat(). +*/ +SQLITE_API int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +){ + sqlite3_changegroup *pGrp; + int rc; + + rc = sqlite3changegroup_new(&pGrp); + if( rc==SQLITE_OK ){ + rc = sqlite3changegroup_add_strm(pGrp, xInputA, pInA); + } + if( rc==SQLITE_OK ){ + rc = sqlite3changegroup_add_strm(pGrp, xInputB, pInB); + } + if( rc==SQLITE_OK ){ + rc = sqlite3changegroup_output_strm(pGrp, xOutput, pOut); + } + sqlite3changegroup_delete(pGrp); + + return rc; +} + +/* +** Changeset rebaser handle. +*/ +struct sqlite3_rebaser { + sqlite3_changegroup grp; /* Hash table */ +}; + +/* +** Buffers a1 and a2 must both contain a sessions module record nCol +** fields in size. This function appends an nCol sessions module +** record to buffer pBuf that is a copy of a1, except that for +** each field that is undefined in a1[], swap in the field from a2[]. +*/ +static void sessionAppendRecordMerge( + SessionBuffer *pBuf, /* Buffer to append to */ + int nCol, /* Number of columns in each record */ + u8 *a1, int n1, /* Record 1 */ + u8 *a2, int n2, /* Record 2 */ + int *pRc /* IN/OUT: error code */ +){ + sessionBufferGrow(pBuf, n1+n2, pRc); + if( *pRc==SQLITE_OK ){ + int i; + u8 *pOut = &pBuf->aBuf[pBuf->nBuf]; + for(i=0; i<nCol; i++){ + int nn1 = sessionSerialLen(a1); + int nn2 = sessionSerialLen(a2); + if( *a1==0 || *a1==0xFF ){ + memcpy(pOut, a2, nn2); + pOut += nn2; + }else{ + memcpy(pOut, a1, nn1); + pOut += nn1; + } + a1 += nn1; + a2 += nn2; + } + + pBuf->nBuf = pOut-pBuf->aBuf; + assert( pBuf->nBuf<=pBuf->nAlloc ); + } +} + +/* +** This function is called when rebasing a local UPDATE change against one +** or more remote UPDATE changes. The aRec/nRec buffer contains the current +** old.* and new.* records for the change. The rebase buffer (a single +** record) is in aChange/nChange. The rebased change is appended to buffer +** pBuf. +** +** Rebasing the UPDATE involves: +** +** * Removing any changes to fields for which the corresponding field +** in the rebase buffer is set to "replaced" (type 0xFF). If this +** means the UPDATE change updates no fields, nothing is appended +** to the output buffer. +** +** * For each field modified by the local change for which the +** corresponding field in the rebase buffer is not "undefined" (0x00) +** or "replaced" (0xFF), the old.* value is replaced by the value +** in the rebase buffer. +*/ +static void sessionAppendPartialUpdate( + SessionBuffer *pBuf, /* Append record here */ + sqlite3_changeset_iter *pIter, /* Iterator pointed at local change */ + u8 *aRec, int nRec, /* Local change */ + u8 *aChange, int nChange, /* Record to rebase against */ + int *pRc /* IN/OUT: Return Code */ +){ + sessionBufferGrow(pBuf, 2+nRec+nChange, pRc); + if( *pRc==SQLITE_OK ){ + int bData = 0; + u8 *pOut = &pBuf->aBuf[pBuf->nBuf]; + int i; + u8 *a1 = aRec; + u8 *a2 = aChange; + + *pOut++ = SQLITE_UPDATE; + *pOut++ = pIter->bIndirect; + for(i=0; i<pIter->nCol; i++){ + int n1 = sessionSerialLen(a1); + int n2 = sessionSerialLen(a2); + if( pIter->abPK[i] || a2[0]==0 ){ + if( !pIter->abPK[i] ) bData = 1; + memcpy(pOut, a1, n1); + pOut += n1; + }else if( a2[0]!=0xFF ){ + bData = 1; + memcpy(pOut, a2, n2); + pOut += n2; + }else{ + *pOut++ = '\0'; + } + a1 += n1; + a2 += n2; + } + if( bData ){ + a2 = aChange; + for(i=0; i<pIter->nCol; i++){ + int n1 = sessionSerialLen(a1); + int n2 = sessionSerialLen(a2); + if( pIter->abPK[i] || a2[0]!=0xFF ){ + memcpy(pOut, a1, n1); + pOut += n1; + }else{ + *pOut++ = '\0'; + } + a1 += n1; + a2 += n2; + } + pBuf->nBuf = (pOut - pBuf->aBuf); + } + } +} + +/* +** pIter is configured to iterate through a changeset. This function rebases +** that changeset according to the current configuration of the rebaser +** object passed as the first argument. If no error occurs and argument xOutput +** is not NULL, then the changeset is returned to the caller by invoking +** xOutput zero or more times and SQLITE_OK returned. Or, if xOutput is NULL, +** then (*ppOut) is set to point to a buffer containing the rebased changeset +** before this function returns. In this case (*pnOut) is set to the size of +** the buffer in bytes. It is the responsibility of the caller to eventually +** free the (*ppOut) buffer using sqlite3_free(). +** +** If an error occurs, an SQLite error code is returned. If ppOut and +** pnOut are not NULL, then the two output parameters are set to 0 before +** returning. +*/ +static int sessionRebase( + sqlite3_rebaser *p, /* Rebaser hash table */ + sqlite3_changeset_iter *pIter, /* Input data */ + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut, /* Context for xOutput callback */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Inverse of pChangeset */ +){ + int rc = SQLITE_OK; + u8 *aRec = 0; + int nRec = 0; + int bNew = 0; + SessionTable *pTab = 0; + SessionBuffer sOut = {0,0,0}; + + while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, &bNew) ){ + SessionChange *pChange = 0; + int bDone = 0; + + if( bNew ){ + const char *zTab = pIter->zTab; + for(pTab=p->grp.pList; pTab; pTab=pTab->pNext){ + if( 0==sqlite3_stricmp(pTab->zName, zTab) ) break; + } + bNew = 0; + + /* A patchset may not be rebased */ + if( pIter->bPatchset ){ + rc = SQLITE_ERROR; + } + + /* Append a table header to the output for this new table */ + sessionAppendByte(&sOut, pIter->bPatchset ? 'P' : 'T', &rc); + sessionAppendVarint(&sOut, pIter->nCol, &rc); + sessionAppendBlob(&sOut, pIter->abPK, pIter->nCol, &rc); + sessionAppendBlob(&sOut,(u8*)pIter->zTab,(int)strlen(pIter->zTab)+1,&rc); + } + + if( pTab && rc==SQLITE_OK ){ + int iHash = sessionChangeHash(pTab, 0, aRec, pTab->nChange); + + for(pChange=pTab->apChange[iHash]; pChange; pChange=pChange->pNext){ + if( sessionChangeEqual(pTab, 0, aRec, 0, pChange->aRecord) ){ + break; + } + } + } + + if( pChange ){ + assert( pChange->op==SQLITE_DELETE || pChange->op==SQLITE_INSERT ); + switch( pIter->op ){ + case SQLITE_INSERT: + if( pChange->op==SQLITE_INSERT ){ + bDone = 1; + if( pChange->bIndirect==0 ){ + sessionAppendByte(&sOut, SQLITE_UPDATE, &rc); + sessionAppendByte(&sOut, pIter->bIndirect, &rc); + sessionAppendBlob(&sOut, pChange->aRecord, pChange->nRecord, &rc); + sessionAppendBlob(&sOut, aRec, nRec, &rc); + } + } + break; + + case SQLITE_UPDATE: + bDone = 1; + if( pChange->op==SQLITE_DELETE ){ + if( pChange->bIndirect==0 ){ + u8 *pCsr = aRec; + sessionSkipRecord(&pCsr, pIter->nCol); + sessionAppendByte(&sOut, SQLITE_INSERT, &rc); + sessionAppendByte(&sOut, pIter->bIndirect, &rc); + sessionAppendRecordMerge(&sOut, pIter->nCol, + pCsr, nRec-(pCsr-aRec), + pChange->aRecord, pChange->nRecord, &rc + ); + } + }else{ + sessionAppendPartialUpdate(&sOut, pIter, + aRec, nRec, pChange->aRecord, pChange->nRecord, &rc + ); + } + break; + + default: + assert( pIter->op==SQLITE_DELETE ); + bDone = 1; + if( pChange->op==SQLITE_INSERT ){ + sessionAppendByte(&sOut, SQLITE_DELETE, &rc); + sessionAppendByte(&sOut, pIter->bIndirect, &rc); + sessionAppendRecordMerge(&sOut, pIter->nCol, + pChange->aRecord, pChange->nRecord, aRec, nRec, &rc + ); + } + break; + } + } + + if( bDone==0 ){ + sessionAppendByte(&sOut, pIter->op, &rc); + sessionAppendByte(&sOut, pIter->bIndirect, &rc); + sessionAppendBlob(&sOut, aRec, nRec, &rc); + } + if( rc==SQLITE_OK && xOutput && sOut.nBuf>SESSIONS_STRM_CHUNK_SIZE ){ + rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); + sOut.nBuf = 0; + } + if( rc ) break; + } + + if( rc!=SQLITE_OK ){ + sqlite3_free(sOut.aBuf); + memset(&sOut, 0, sizeof(sOut)); + } + + if( rc==SQLITE_OK ){ + if( xOutput ){ + if( sOut.nBuf>0 ){ + rc = xOutput(pOut, sOut.aBuf, sOut.nBuf); + } + }else{ + *ppOut = (void*)sOut.aBuf; + *pnOut = sOut.nBuf; + sOut.aBuf = 0; + } + } + sqlite3_free(sOut.aBuf); + return rc; +} + +/* +** Create a new rebaser object. +*/ +SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew){ + int rc = SQLITE_OK; + sqlite3_rebaser *pNew; + + pNew = sqlite3_malloc(sizeof(sqlite3_rebaser)); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pNew, 0, sizeof(sqlite3_rebaser)); + } + *ppNew = pNew; + return rc; +} + +/* +** Call this one or more times to configure a rebaser. +*/ +SQLITE_API int sqlite3rebaser_configure( + sqlite3_rebaser *p, + int nRebase, const void *pRebase +){ + sqlite3_changeset_iter *pIter = 0; /* Iterator opened on pData/nData */ + int rc; /* Return code */ + rc = sqlite3changeset_start(&pIter, nRebase, (void*)pRebase); + if( rc==SQLITE_OK ){ + rc = sessionChangesetToHash(pIter, &p->grp, 1); + } + sqlite3changeset_finalize(pIter); + return rc; +} + +/* +** Rebase a changeset according to current rebaser configuration +*/ +SQLITE_API int sqlite3rebaser_rebase( + sqlite3_rebaser *p, + int nIn, const void *pIn, + int *pnOut, void **ppOut +){ + sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */ + int rc = sqlite3changeset_start(&pIter, nIn, (void*)pIn); + + if( rc==SQLITE_OK ){ + rc = sessionRebase(p, pIter, 0, 0, pnOut, ppOut); + sqlite3changeset_finalize(pIter); + } + + return rc; +} + +/* +** Rebase a changeset according to current rebaser configuration +*/ +SQLITE_API int sqlite3rebaser_rebase_strm( + sqlite3_rebaser *p, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +){ + sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */ + int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn); + + if( rc==SQLITE_OK ){ + rc = sessionRebase(p, pIter, xOutput, pOut, 0, 0); + sqlite3changeset_finalize(pIter); + } + + return rc; +} + +/* +** Destroy a rebaser object +*/ +SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p){ + if( p ){ + sessionDeleteTable(p->grp.pList); + sqlite3_free(p); + } +} + +#endif /* SQLITE_ENABLE_SESSION && SQLITE_ENABLE_PREUPDATE_HOOK */ + +/************** End of sqlite3session.c **************************************/ +/************** Begin file json1.c *******************************************/ +/* +** 2015-08-12 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This SQLite extension implements JSON functions. The interface is +** modeled after MySQL JSON functions: +** +** https://dev.mysql.com/doc/refman/5.7/en/json.html +** +** For the time being, all JSON is stored as pure text. (We might add +** a JSONB type in the future which stores a binary encoding of JSON in +** a BLOB, but there is no support for JSONB in the current implementation. +** This implementation parses JSON text at 250 MB/s, so it is hard to see +** how JSONB might improve on that.) +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) +#if !defined(SQLITEINT_H) +/* #include "sqlite3ext.h" */ +#endif +SQLITE_EXTENSION_INIT1 +/* #include <assert.h> */ +/* #include <string.h> */ +/* #include <stdlib.h> */ +/* #include <stdarg.h> */ + +/* Mark a function parameter as unused, to suppress nuisance compiler +** warnings. */ +#ifndef UNUSED_PARAM +# define UNUSED_PARAM(X) (void)(X) +#endif + +#ifndef LARGEST_INT64 +# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32)) +# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64) +#endif + +/* +** Versions of isspace(), isalnum() and isdigit() to which it is safe +** to pass signed char values. +*/ +#ifdef sqlite3Isdigit + /* Use the SQLite core versions if this routine is part of the + ** SQLite amalgamation */ +# define safe_isdigit(x) sqlite3Isdigit(x) +# define safe_isalnum(x) sqlite3Isalnum(x) +# define safe_isxdigit(x) sqlite3Isxdigit(x) +#else + /* Use the standard library for separate compilation */ +#include <ctype.h> /* amalgamator: keep */ +# define safe_isdigit(x) isdigit((unsigned char)(x)) +# define safe_isalnum(x) isalnum((unsigned char)(x)) +# define safe_isxdigit(x) isxdigit((unsigned char)(x)) +#endif + +/* +** Growing our own isspace() routine this way is twice as fast as +** the library isspace() function, resulting in a 7% overall performance +** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os). +*/ +static const char jsonIsSpace[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define safe_isspace(x) (jsonIsSpace[(unsigned char)x]) + +#ifndef SQLITE_AMALGAMATION + /* Unsigned integer types. These are already defined in the sqliteInt.h, + ** but the definitions need to be repeated for separate compilation. */ + typedef sqlite3_uint64 u64; + typedef unsigned int u32; + typedef unsigned short int u16; + typedef unsigned char u8; +#endif + +/* Objects */ +typedef struct JsonString JsonString; +typedef struct JsonNode JsonNode; +typedef struct JsonParse JsonParse; + +/* An instance of this object represents a JSON string +** under construction. Really, this is a generic string accumulator +** that can be and is used to create strings other than JSON. +*/ +struct JsonString { + sqlite3_context *pCtx; /* Function context - put error messages here */ + char *zBuf; /* Append JSON content here */ + u64 nAlloc; /* Bytes of storage available in zBuf[] */ + u64 nUsed; /* Bytes of zBuf[] currently used */ + u8 bStatic; /* True if zBuf is static space */ + u8 bErr; /* True if an error has been encountered */ + char zSpace[100]; /* Initial static space */ +}; + +/* JSON type values +*/ +#define JSON_NULL 0 +#define JSON_TRUE 1 +#define JSON_FALSE 2 +#define JSON_INT 3 +#define JSON_REAL 4 +#define JSON_STRING 5 +#define JSON_ARRAY 6 +#define JSON_OBJECT 7 + +/* The "subtype" set for JSON values */ +#define JSON_SUBTYPE 74 /* Ascii for "J" */ + +/* +** Names of the various JSON types: +*/ +static const char * const jsonType[] = { + "null", "true", "false", "integer", "real", "text", "array", "object" +}; + +/* Bit values for the JsonNode.jnFlag field +*/ +#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */ +#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */ +#define JNODE_REMOVE 0x04 /* Do not output */ +#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */ +#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */ +#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */ +#define JNODE_LABEL 0x40 /* Is a label of an object */ + + +/* A single node of parsed JSON +*/ +struct JsonNode { + u8 eType; /* One of the JSON_ type values */ + u8 jnFlags; /* JNODE flags */ + u32 n; /* Bytes of content, or number of sub-nodes */ + union { + const char *zJContent; /* Content for INT, REAL, and STRING */ + u32 iAppend; /* More terms for ARRAY and OBJECT */ + u32 iKey; /* Key for ARRAY objects in json_tree() */ + u32 iReplace; /* Replacement content for JNODE_REPLACE */ + JsonNode *pPatch; /* Node chain of patch for JNODE_PATCH */ + } u; +}; + +/* A completely parsed JSON string +*/ +struct JsonParse { + u32 nNode; /* Number of slots of aNode[] used */ + u32 nAlloc; /* Number of slots of aNode[] allocated */ + JsonNode *aNode; /* Array of nodes containing the parse */ + const char *zJson; /* Original JSON string */ + u32 *aUp; /* Index of parent of each node */ + u8 oom; /* Set to true if out of memory */ + u8 nErr; /* Number of errors seen */ + u16 iDepth; /* Nesting depth */ + int nJson; /* Length of the zJson string in bytes */ +}; + +/* +** Maximum nesting depth of JSON for this implementation. +** +** This limit is needed to avoid a stack overflow in the recursive +** descent parser. A depth of 2000 is far deeper than any sane JSON +** should go. +*/ +#define JSON_MAX_DEPTH 2000 + +/************************************************************************** +** Utility routines for dealing with JsonString objects +**************************************************************************/ + +/* Set the JsonString object to an empty string +*/ +static void jsonZero(JsonString *p){ + p->zBuf = p->zSpace; + p->nAlloc = sizeof(p->zSpace); + p->nUsed = 0; + p->bStatic = 1; +} + +/* Initialize the JsonString object +*/ +static void jsonInit(JsonString *p, sqlite3_context *pCtx){ + p->pCtx = pCtx; + p->bErr = 0; + jsonZero(p); +} + + +/* Free all allocated memory and reset the JsonString object back to its +** initial state. +*/ +static void jsonReset(JsonString *p){ + if( !p->bStatic ) sqlite3_free(p->zBuf); + jsonZero(p); +} + + +/* Report an out-of-memory (OOM) condition +*/ +static void jsonOom(JsonString *p){ + p->bErr = 1; + sqlite3_result_error_nomem(p->pCtx); + jsonReset(p); +} + +/* Enlarge pJson->zBuf so that it can hold at least N more bytes. +** Return zero on success. Return non-zero on an OOM error +*/ +static int jsonGrow(JsonString *p, u32 N){ + u64 nTotal = N<p->nAlloc ? p->nAlloc*2 : p->nAlloc+N+10; + char *zNew; + if( p->bStatic ){ + if( p->bErr ) return 1; + zNew = sqlite3_malloc64(nTotal); + if( zNew==0 ){ + jsonOom(p); + return SQLITE_NOMEM; + } + memcpy(zNew, p->zBuf, (size_t)p->nUsed); + p->zBuf = zNew; + p->bStatic = 0; + }else{ + zNew = sqlite3_realloc64(p->zBuf, nTotal); + if( zNew==0 ){ + jsonOom(p); + return SQLITE_NOMEM; + } + p->zBuf = zNew; + } + p->nAlloc = nTotal; + return SQLITE_OK; +} + +/* Append N bytes from zIn onto the end of the JsonString string. +*/ +static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){ + if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return; + memcpy(p->zBuf+p->nUsed, zIn, N); + p->nUsed += N; +} + +/* Append formatted text (not to exceed N bytes) to the JsonString. +*/ +static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){ + va_list ap; + if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return; + va_start(ap, zFormat); + sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap); + va_end(ap); + p->nUsed += (int)strlen(p->zBuf+p->nUsed); +} + +/* Append a single character +*/ +static void jsonAppendChar(JsonString *p, char c){ + if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return; + p->zBuf[p->nUsed++] = c; +} + +/* Append a comma separator to the output buffer, if the previous +** character is not '[' or '{'. +*/ +static void jsonAppendSeparator(JsonString *p){ + char c; + if( p->nUsed==0 ) return; + c = p->zBuf[p->nUsed-1]; + if( c!='[' && c!='{' ) jsonAppendChar(p, ','); +} + +/* Append the N-byte string in zIn to the end of the JsonString string +** under construction. Enclose the string in "..." and escape +** any double-quotes or backslash characters contained within the +** string. +*/ +static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ + u32 i; + if( (N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0 ) return; + p->zBuf[p->nUsed++] = '"'; + for(i=0; i<N; i++){ + unsigned char c = ((unsigned const char*)zIn)[i]; + if( c=='"' || c=='\\' ){ + json_simple_escape: + if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return; + p->zBuf[p->nUsed++] = '\\'; + }else if( c<=0x1f ){ + static const char aSpecial[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + assert( sizeof(aSpecial)==32 ); + assert( aSpecial['\b']=='b' ); + assert( aSpecial['\f']=='f' ); + assert( aSpecial['\n']=='n' ); + assert( aSpecial['\r']=='r' ); + assert( aSpecial['\t']=='t' ); + if( aSpecial[c] ){ + c = aSpecial[c]; + goto json_simple_escape; + } + if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return; + p->zBuf[p->nUsed++] = '\\'; + p->zBuf[p->nUsed++] = 'u'; + p->zBuf[p->nUsed++] = '0'; + p->zBuf[p->nUsed++] = '0'; + p->zBuf[p->nUsed++] = '0' + (c>>4); + c = "0123456789abcdef"[c&0xf]; + } + p->zBuf[p->nUsed++] = c; + } + p->zBuf[p->nUsed++] = '"'; + assert( p->nUsed<p->nAlloc ); +} + +/* +** Append a function parameter value to the JSON string under +** construction. +*/ +static void jsonAppendValue( + JsonString *p, /* Append to this JSON string */ + sqlite3_value *pValue /* Value to append */ +){ + switch( sqlite3_value_type(pValue) ){ + case SQLITE_NULL: { + jsonAppendRaw(p, "null", 4); + break; + } + case SQLITE_INTEGER: + case SQLITE_FLOAT: { + const char *z = (const char*)sqlite3_value_text(pValue); + u32 n = (u32)sqlite3_value_bytes(pValue); + jsonAppendRaw(p, z, n); + break; + } + case SQLITE_TEXT: { + const char *z = (const char*)sqlite3_value_text(pValue); + u32 n = (u32)sqlite3_value_bytes(pValue); + if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){ + jsonAppendRaw(p, z, n); + }else{ + jsonAppendString(p, z, n); + } + break; + } + default: { + if( p->bErr==0 ){ + sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1); + p->bErr = 2; + jsonReset(p); + } + break; + } + } +} + + +/* Make the JSON in p the result of the SQL function. +*/ +static void jsonResult(JsonString *p){ + if( p->bErr==0 ){ + sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed, + p->bStatic ? SQLITE_TRANSIENT : sqlite3_free, + SQLITE_UTF8); + jsonZero(p); + } + assert( p->bStatic ); +} + +/************************************************************************** +** Utility routines for dealing with JsonNode and JsonParse objects +**************************************************************************/ + +/* +** Return the number of consecutive JsonNode slots need to represent +** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and +** OBJECT types, the number might be larger. +** +** Appended elements are not counted. The value returned is the number +** by which the JsonNode counter should increment in order to go to the +** next peer value. +*/ +static u32 jsonNodeSize(JsonNode *pNode){ + return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1; +} + +/* +** Reclaim all memory allocated by a JsonParse object. But do not +** delete the JsonParse object itself. +*/ +static void jsonParseReset(JsonParse *pParse){ + sqlite3_free(pParse->aNode); + pParse->aNode = 0; + pParse->nNode = 0; + pParse->nAlloc = 0; + sqlite3_free(pParse->aUp); + pParse->aUp = 0; +} + +/* +** Free a JsonParse object that was obtained from sqlite3_malloc(). +*/ +static void jsonParseFree(JsonParse *pParse){ + jsonParseReset(pParse); + sqlite3_free(pParse); +} + +/* +** Convert the JsonNode pNode into a pure JSON string and +** append to pOut. Subsubstructure is also included. Return +** the number of JsonNode objects that are encoded. +*/ +static void jsonRenderNode( + JsonNode *pNode, /* The node to render */ + JsonString *pOut, /* Write JSON here */ + sqlite3_value **aReplace /* Replacement values */ +){ + if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){ + if( pNode->jnFlags & JNODE_REPLACE ){ + jsonAppendValue(pOut, aReplace[pNode->u.iReplace]); + return; + } + pNode = pNode->u.pPatch; + } + switch( pNode->eType ){ + default: { + assert( pNode->eType==JSON_NULL ); + jsonAppendRaw(pOut, "null", 4); + break; + } + case JSON_TRUE: { + jsonAppendRaw(pOut, "true", 4); + break; + } + case JSON_FALSE: { + jsonAppendRaw(pOut, "false", 5); + break; + } + case JSON_STRING: { + if( pNode->jnFlags & JNODE_RAW ){ + jsonAppendString(pOut, pNode->u.zJContent, pNode->n); + break; + } + /* Fall through into the next case */ + } + case JSON_REAL: + case JSON_INT: { + jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n); + break; + } + case JSON_ARRAY: { + u32 j = 1; + jsonAppendChar(pOut, '['); + for(;;){ + while( j<=pNode->n ){ + if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){ + jsonAppendSeparator(pOut); + jsonRenderNode(&pNode[j], pOut, aReplace); + } + j += jsonNodeSize(&pNode[j]); + } + if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; + pNode = &pNode[pNode->u.iAppend]; + j = 1; + } + jsonAppendChar(pOut, ']'); + break; + } + case JSON_OBJECT: { + u32 j = 1; + jsonAppendChar(pOut, '{'); + for(;;){ + while( j<=pNode->n ){ + if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){ + jsonAppendSeparator(pOut); + jsonRenderNode(&pNode[j], pOut, aReplace); + jsonAppendChar(pOut, ':'); + jsonRenderNode(&pNode[j+1], pOut, aReplace); + } + j += 1 + jsonNodeSize(&pNode[j+1]); + } + if( (pNode->jnFlags & JNODE_APPEND)==0 ) break; + pNode = &pNode[pNode->u.iAppend]; + j = 1; + } + jsonAppendChar(pOut, '}'); + break; + } + } +} + +/* +** Return a JsonNode and all its descendents as a JSON string. +*/ +static void jsonReturnJson( + JsonNode *pNode, /* Node to return */ + sqlite3_context *pCtx, /* Return value for this function */ + sqlite3_value **aReplace /* Array of replacement values */ +){ + JsonString s; + jsonInit(&s, pCtx); + jsonRenderNode(pNode, &s, aReplace); + jsonResult(&s); + sqlite3_result_subtype(pCtx, JSON_SUBTYPE); +} + +/* +** Make the JsonNode the return value of the function. +*/ +static void jsonReturn( + JsonNode *pNode, /* Node to return */ + sqlite3_context *pCtx, /* Return value for this function */ + sqlite3_value **aReplace /* Array of replacement values */ +){ + switch( pNode->eType ){ + default: { + assert( pNode->eType==JSON_NULL ); + sqlite3_result_null(pCtx); + break; + } + case JSON_TRUE: { + sqlite3_result_int(pCtx, 1); + break; + } + case JSON_FALSE: { + sqlite3_result_int(pCtx, 0); + break; + } + case JSON_INT: { + sqlite3_int64 i = 0; + const char *z = pNode->u.zJContent; + if( z[0]=='-' ){ z++; } + while( z[0]>='0' && z[0]<='9' ){ + unsigned v = *(z++) - '0'; + if( i>=LARGEST_INT64/10 ){ + if( i>LARGEST_INT64/10 ) goto int_as_real; + if( z[0]>='0' && z[0]<='9' ) goto int_as_real; + if( v==9 ) goto int_as_real; + if( v==8 ){ + if( pNode->u.zJContent[0]=='-' ){ + sqlite3_result_int64(pCtx, SMALLEST_INT64); + goto int_done; + }else{ + goto int_as_real; + } + } + } + i = i*10 + v; + } + if( pNode->u.zJContent[0]=='-' ){ i = -i; } + sqlite3_result_int64(pCtx, i); + int_done: + break; + int_as_real: /* fall through to real */; + } + case JSON_REAL: { + double r; +#ifdef SQLITE_AMALGAMATION + const char *z = pNode->u.zJContent; + sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8); +#else + r = strtod(pNode->u.zJContent, 0); +#endif + sqlite3_result_double(pCtx, r); + break; + } + case JSON_STRING: { +#if 0 /* Never happens because JNODE_RAW is only set by json_set(), + ** json_insert() and json_replace() and those routines do not + ** call jsonReturn() */ + if( pNode->jnFlags & JNODE_RAW ){ + sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n, + SQLITE_TRANSIENT); + }else +#endif + assert( (pNode->jnFlags & JNODE_RAW)==0 ); + if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ + /* JSON formatted without any backslash-escapes */ + sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2, + SQLITE_TRANSIENT); + }else{ + /* Translate JSON formatted string into raw text */ + u32 i; + u32 n = pNode->n; + const char *z = pNode->u.zJContent; + char *zOut; + u32 j; + zOut = sqlite3_malloc( n+1 ); + if( zOut==0 ){ + sqlite3_result_error_nomem(pCtx); + break; + } + for(i=1, j=0; i<n-1; i++){ + char c = z[i]; + if( c!='\\' ){ + zOut[j++] = c; + }else{ + c = z[++i]; + if( c=='u' ){ + u32 v = 0, k; + for(k=0; k<4; i++, k++){ + assert( i<n-2 ); + c = z[i+1]; + assert( safe_isxdigit(c) ); + if( c<='9' ) v = v*16 + c - '0'; + else if( c<='F' ) v = v*16 + c - 'A' + 10; + else v = v*16 + c - 'a' + 10; + } + if( v==0 ) break; + if( v<=0x7f ){ + zOut[j++] = (char)v; + }else if( v<=0x7ff ){ + zOut[j++] = (char)(0xc0 | (v>>6)); + zOut[j++] = 0x80 | (v&0x3f); + }else{ + zOut[j++] = (char)(0xe0 | (v>>12)); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + } + }else{ + if( c=='b' ){ + c = '\b'; + }else if( c=='f' ){ + c = '\f'; + }else if( c=='n' ){ + c = '\n'; + }else if( c=='r' ){ + c = '\r'; + }else if( c=='t' ){ + c = '\t'; + } + zOut[j++] = c; + } + } + } + zOut[j] = 0; + sqlite3_result_text(pCtx, zOut, j, sqlite3_free); + } + break; + } + case JSON_ARRAY: + case JSON_OBJECT: { + jsonReturnJson(pNode, pCtx, aReplace); + break; + } + } +} + +/* Forward reference */ +static int jsonParseAddNode(JsonParse*,u32,u32,const char*); + +/* +** A macro to hint to the compiler that a function should not be +** inlined. +*/ +#if defined(__GNUC__) +# define JSON_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER>=1310 +# define JSON_NOINLINE __declspec(noinline) +#else +# define JSON_NOINLINE +#endif + + +static JSON_NOINLINE int jsonParseAddNodeExpand( + JsonParse *pParse, /* Append the node to this object */ + u32 eType, /* Node type */ + u32 n, /* Content size or sub-node count */ + const char *zContent /* Content */ +){ + u32 nNew; + JsonNode *pNew; + assert( pParse->nNode>=pParse->nAlloc ); + if( pParse->oom ) return -1; + nNew = pParse->nAlloc*2 + 10; + pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); + if( pNew==0 ){ + pParse->oom = 1; + return -1; + } + pParse->nAlloc = nNew; + pParse->aNode = pNew; + assert( pParse->nNode<pParse->nAlloc ); + return jsonParseAddNode(pParse, eType, n, zContent); +} + +/* +** Create a new JsonNode instance based on the arguments and append that +** instance to the JsonParse. Return the index in pParse->aNode[] of the +** new node, or -1 if a memory allocation fails. +*/ +static int jsonParseAddNode( + JsonParse *pParse, /* Append the node to this object */ + u32 eType, /* Node type */ + u32 n, /* Content size or sub-node count */ + const char *zContent /* Content */ +){ + JsonNode *p; + if( pParse->nNode>=pParse->nAlloc ){ + return jsonParseAddNodeExpand(pParse, eType, n, zContent); + } + p = &pParse->aNode[pParse->nNode]; + p->eType = (u8)eType; + p->jnFlags = 0; + p->n = n; + p->u.zJContent = zContent; + return pParse->nNode++; +} + +/* +** Return true if z[] begins with 4 (or more) hexadecimal digits +*/ +static int jsonIs4Hex(const char *z){ + int i; + for(i=0; i<4; i++) if( !safe_isxdigit(z[i]) ) return 0; + return 1; +} + +/* +** Parse a single JSON value which begins at pParse->zJson[i]. Return the +** index of the first character past the end of the value parsed. +** +** Return negative for a syntax error. Special cases: return -2 if the +** first non-whitespace character is '}' and return -3 if the first +** non-whitespace character is ']'. +*/ +static int jsonParseValue(JsonParse *pParse, u32 i){ + char c; + u32 j; + int iThis; + int x; + JsonNode *pNode; + const char *z = pParse->zJson; + while( safe_isspace(z[i]) ){ i++; } + if( (c = z[i])=='{' ){ + /* Parse object */ + iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); + if( iThis<0 ) return -1; + for(j=i+1;;j++){ + while( safe_isspace(z[j]) ){ j++; } + if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; + x = jsonParseValue(pParse, j); + if( x<0 ){ + pParse->iDepth--; + if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; + return -1; + } + if( pParse->oom ) return -1; + pNode = &pParse->aNode[pParse->nNode-1]; + if( pNode->eType!=JSON_STRING ) return -1; + pNode->jnFlags |= JNODE_LABEL; + j = x; + while( safe_isspace(z[j]) ){ j++; } + if( z[j]!=':' ) return -1; + j++; + x = jsonParseValue(pParse, j); + pParse->iDepth--; + if( x<0 ) return -1; + j = x; + while( safe_isspace(z[j]) ){ j++; } + c = z[j]; + if( c==',' ) continue; + if( c!='}' ) return -1; + break; + } + pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + return j+1; + }else if( c=='[' ){ + /* Parse array */ + iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); + if( iThis<0 ) return -1; + for(j=i+1;;j++){ + while( safe_isspace(z[j]) ){ j++; } + if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; + x = jsonParseValue(pParse, j); + pParse->iDepth--; + if( x<0 ){ + if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1; + return -1; + } + j = x; + while( safe_isspace(z[j]) ){ j++; } + c = z[j]; + if( c==',' ) continue; + if( c!=']' ) return -1; + break; + } + pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1; + return j+1; + }else if( c=='"' ){ + /* Parse string */ + u8 jnFlags = 0; + j = i+1; + for(;;){ + c = z[j]; + if( (c & ~0x1f)==0 ){ + /* Control characters are not allowed in strings */ + return -1; + } + if( c=='\\' ){ + c = z[++j]; + if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f' + || c=='n' || c=='r' || c=='t' + || (c=='u' && jsonIs4Hex(z+j+1)) ){ + jnFlags = JNODE_ESCAPE; + }else{ + return -1; + } + }else if( c=='"' ){ + break; + } + j++; + } + jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]); + if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags; + return j+1; + }else if( c=='n' + && strncmp(z+i,"null",4)==0 + && !safe_isalnum(z[i+4]) ){ + jsonParseAddNode(pParse, JSON_NULL, 0, 0); + return i+4; + }else if( c=='t' + && strncmp(z+i,"true",4)==0 + && !safe_isalnum(z[i+4]) ){ + jsonParseAddNode(pParse, JSON_TRUE, 0, 0); + return i+4; + }else if( c=='f' + && strncmp(z+i,"false",5)==0 + && !safe_isalnum(z[i+5]) ){ + jsonParseAddNode(pParse, JSON_FALSE, 0, 0); + return i+5; + }else if( c=='-' || (c>='0' && c<='9') ){ + /* Parse number */ + u8 seenDP = 0; + u8 seenE = 0; + assert( '-' < '0' ); + if( c<='0' ){ + j = c=='-' ? i+1 : i; + if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1; + } + j = i+1; + for(;; j++){ + c = z[j]; + if( c>='0' && c<='9' ) continue; + if( c=='.' ){ + if( z[j-1]=='-' ) return -1; + if( seenDP ) return -1; + seenDP = 1; + continue; + } + if( c=='e' || c=='E' ){ + if( z[j-1]<'0' ) return -1; + if( seenE ) return -1; + seenDP = seenE = 1; + c = z[j+1]; + if( c=='+' || c=='-' ){ + j++; + c = z[j+1]; + } + if( c<'0' || c>'9' ) return -1; + continue; + } + break; + } + if( z[j-1]<'0' ) return -1; + jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT, + j - i, &z[i]); + return j; + }else if( c=='}' ){ + return -2; /* End of {...} */ + }else if( c==']' ){ + return -3; /* End of [...] */ + }else if( c==0 ){ + return 0; /* End of file */ + }else{ + return -1; /* Syntax error */ + } +} + +/* +** Parse a complete JSON string. Return 0 on success or non-zero if there +** are any errors. If an error occurs, free all memory associated with +** pParse. +** +** pParse is uninitialized when this routine is called. +*/ +static int jsonParse( + JsonParse *pParse, /* Initialize and fill this JsonParse object */ + sqlite3_context *pCtx, /* Report errors here */ + const char *zJson /* Input JSON text to be parsed */ +){ + int i; + memset(pParse, 0, sizeof(*pParse)); + if( zJson==0 ) return 1; + pParse->zJson = zJson; + i = jsonParseValue(pParse, 0); + if( pParse->oom ) i = -1; + if( i>0 ){ + assert( pParse->iDepth==0 ); + while( safe_isspace(zJson[i]) ) i++; + if( zJson[i] ) i = -1; + } + if( i<=0 ){ + if( pCtx!=0 ){ + if( pParse->oom ){ + sqlite3_result_error_nomem(pCtx); + }else{ + sqlite3_result_error(pCtx, "malformed JSON", -1); + } + } + jsonParseReset(pParse); + return 1; + } + return 0; +} + +/* Mark node i of pParse as being a child of iParent. Call recursively +** to fill in all the descendants of node i. +*/ +static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ + JsonNode *pNode = &pParse->aNode[i]; + u32 j; + pParse->aUp[i] = iParent; + switch( pNode->eType ){ + case JSON_ARRAY: { + for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){ + jsonParseFillInParentage(pParse, i+j, i); + } + break; + } + case JSON_OBJECT: { + for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){ + pParse->aUp[i+j] = i; + jsonParseFillInParentage(pParse, i+j+1, i); + } + break; + } + default: { + break; + } + } +} + +/* +** Compute the parentage of all nodes in a completed parse. +*/ +static int jsonParseFindParents(JsonParse *pParse){ + u32 *aUp; + assert( pParse->aUp==0 ); + aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode ); + if( aUp==0 ){ + pParse->oom = 1; + return SQLITE_NOMEM; + } + jsonParseFillInParentage(pParse, 0, 0); + return SQLITE_OK; +} + +/* +** Magic number used for the JSON parse cache in sqlite3_get_auxdata() +*/ +#define JSON_CACHE_ID (-429938) + +/* +** Obtain a complete parse of the JSON found in the first argument +** of the argv array. Use the sqlite3_get_auxdata() cache for this +** parse if it is available. If the cache is not available or if it +** is no longer valid, parse the JSON again and return the new parse, +** and also register the new parse so that it will be available for +** future sqlite3_get_auxdata() calls. +*/ +static JsonParse *jsonParseCached( + sqlite3_context *pCtx, + sqlite3_value **argv +){ + const char *zJson = (const char*)sqlite3_value_text(argv[0]); + int nJson = sqlite3_value_bytes(argv[0]); + JsonParse *p; + if( zJson==0 ) return 0; + p = (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID); + if( p && p->nJson==nJson && memcmp(p->zJson,zJson,nJson)==0 ){ + p->nErr = 0; + return p; /* The cached entry matches, so return it */ + } + p = sqlite3_malloc( sizeof(*p) + nJson + 1 ); + if( p==0 ){ + sqlite3_result_error_nomem(pCtx); + return 0; + } + memset(p, 0, sizeof(*p)); + p->zJson = (char*)&p[1]; + memcpy((char*)p->zJson, zJson, nJson+1); + if( jsonParse(p, pCtx, p->zJson) ){ + sqlite3_free(p); + return 0; + } + p->nJson = nJson; + sqlite3_set_auxdata(pCtx, JSON_CACHE_ID, p, (void(*)(void*))jsonParseFree); + return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID); +} + +/* +** Compare the OBJECT label at pNode against zKey,nKey. Return true on +** a match. +*/ +static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){ + if( pNode->jnFlags & JNODE_RAW ){ + if( pNode->n!=nKey ) return 0; + return strncmp(pNode->u.zJContent, zKey, nKey)==0; + }else{ + if( pNode->n!=nKey+2 ) return 0; + return strncmp(pNode->u.zJContent+1, zKey, nKey)==0; + } +} + +/* forward declaration */ +static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**); + +/* +** Search along zPath to find the node specified. Return a pointer +** to that node, or NULL if zPath is malformed or if there is no such +** node. +** +** If pApnd!=0, then try to append new nodes to complete zPath if it is +** possible to do so and if no existing node corresponds to zPath. If +** new nodes are appended *pApnd is set to 1. +*/ +static JsonNode *jsonLookupStep( + JsonParse *pParse, /* The JSON to search */ + u32 iRoot, /* Begin the search at this node */ + const char *zPath, /* The path to search */ + int *pApnd, /* Append nodes to complete path if not NULL */ + const char **pzErr /* Make *pzErr point to any syntax error in zPath */ +){ + u32 i, j, nKey; + const char *zKey; + JsonNode *pRoot = &pParse->aNode[iRoot]; + if( zPath[0]==0 ) return pRoot; + if( zPath[0]=='.' ){ + if( pRoot->eType!=JSON_OBJECT ) return 0; + zPath++; + if( zPath[0]=='"' ){ + zKey = zPath + 1; + for(i=1; zPath[i] && zPath[i]!='"'; i++){} + nKey = i-1; + if( zPath[i] ){ + i++; + }else{ + *pzErr = zPath; + return 0; + } + }else{ + zKey = zPath; + for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){} + nKey = i; + } + if( nKey==0 ){ + *pzErr = zPath; + return 0; + } + j = 1; + for(;;){ + while( j<=pRoot->n ){ + if( jsonLabelCompare(pRoot+j, zKey, nKey) ){ + return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr); + } + j++; + j += jsonNodeSize(&pRoot[j]); + } + if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; + iRoot += pRoot->u.iAppend; + pRoot = &pParse->aNode[iRoot]; + j = 1; + } + if( pApnd ){ + u32 iStart, iLabel; + JsonNode *pNode; + iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); + iLabel = jsonParseAddNode(pParse, JSON_STRING, i, zPath); + zPath += i; + pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); + if( pParse->oom ) return 0; + if( pNode ){ + pRoot = &pParse->aNode[iRoot]; + pRoot->u.iAppend = iStart - iRoot; + pRoot->jnFlags |= JNODE_APPEND; + pParse->aNode[iLabel].jnFlags |= JNODE_RAW; + } + return pNode; + } + }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){ + if( pRoot->eType!=JSON_ARRAY ) return 0; + i = 0; + j = 1; + while( safe_isdigit(zPath[j]) ){ + i = i*10 + zPath[j] - '0'; + j++; + } + if( zPath[j]!=']' ){ + *pzErr = zPath; + return 0; + } + zPath += j + 1; + j = 1; + for(;;){ + while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){ + if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--; + j += jsonNodeSize(&pRoot[j]); + } + if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break; + iRoot += pRoot->u.iAppend; + pRoot = &pParse->aNode[iRoot]; + j = 1; + } + if( j<=pRoot->n ){ + return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr); + } + if( i==0 && pApnd ){ + u32 iStart; + JsonNode *pNode; + iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0); + pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr); + if( pParse->oom ) return 0; + if( pNode ){ + pRoot = &pParse->aNode[iRoot]; + pRoot->u.iAppend = iStart - iRoot; + pRoot->jnFlags |= JNODE_APPEND; + } + return pNode; + } + }else{ + *pzErr = zPath; + } + return 0; +} + +/* +** Append content to pParse that will complete zPath. Return a pointer +** to the inserted node, or return NULL if the append fails. +*/ +static JsonNode *jsonLookupAppend( + JsonParse *pParse, /* Append content to the JSON parse */ + const char *zPath, /* Description of content to append */ + int *pApnd, /* Set this flag to 1 */ + const char **pzErr /* Make this point to any syntax error */ +){ + *pApnd = 1; + if( zPath[0]==0 ){ + jsonParseAddNode(pParse, JSON_NULL, 0, 0); + return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1]; + } + if( zPath[0]=='.' ){ + jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); + }else if( strncmp(zPath,"[0]",3)==0 ){ + jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); + }else{ + return 0; + } + if( pParse->oom ) return 0; + return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr); +} + +/* +** Return the text of a syntax error message on a JSON path. Space is +** obtained from sqlite3_malloc(). +*/ +static char *jsonPathSyntaxError(const char *zErr){ + return sqlite3_mprintf("JSON path error near '%q'", zErr); +} + +/* +** Do a node lookup using zPath. Return a pointer to the node on success. +** Return NULL if not found or if there is an error. +** +** On an error, write an error message into pCtx and increment the +** pParse->nErr counter. +** +** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if +** nodes are appended. +*/ +static JsonNode *jsonLookup( + JsonParse *pParse, /* The JSON to search */ + const char *zPath, /* The path to search */ + int *pApnd, /* Append nodes to complete path if not NULL */ + sqlite3_context *pCtx /* Report errors here, if not NULL */ +){ + const char *zErr = 0; + JsonNode *pNode = 0; + char *zMsg; + + if( zPath==0 ) return 0; + if( zPath[0]!='$' ){ + zErr = zPath; + goto lookup_err; + } + zPath++; + pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr); + if( zErr==0 ) return pNode; + +lookup_err: + pParse->nErr++; + assert( zErr!=0 && pCtx!=0 ); + zMsg = jsonPathSyntaxError(zErr); + if( zMsg ){ + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); + }else{ + sqlite3_result_error_nomem(pCtx); + } + return 0; +} + + +/* +** Report the wrong number of arguments for json_insert(), json_replace() +** or json_set(). +*/ +static void jsonWrongNumArgs( + sqlite3_context *pCtx, + const char *zFuncName +){ + char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments", + zFuncName); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); +} + +/* +** Mark all NULL entries in the Object passed in as JNODE_REMOVE. +*/ +static void jsonRemoveAllNulls(JsonNode *pNode){ + int i, n; + assert( pNode->eType==JSON_OBJECT ); + n = pNode->n; + for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){ + switch( pNode[i].eType ){ + case JSON_NULL: + pNode[i].jnFlags |= JNODE_REMOVE; + break; + case JSON_OBJECT: + jsonRemoveAllNulls(&pNode[i]); + break; + } + } +} + + +/**************************************************************************** +** SQL functions used for testing and debugging +****************************************************************************/ + +#ifdef SQLITE_DEBUG +/* +** The json_parse(JSON) function returns a string which describes +** a parse of the JSON provided. Or it returns NULL if JSON is not +** well-formed. +*/ +static void jsonParseFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString s; /* Output string - not real JSON */ + JsonParse x; /* The parse */ + u32 i; + + assert( argc==1 ); + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + jsonParseFindParents(&x); + jsonInit(&s, ctx); + for(i=0; i<x.nNode; i++){ + const char *zType; + if( x.aNode[i].jnFlags & JNODE_LABEL ){ + assert( x.aNode[i].eType==JSON_STRING ); + zType = "label"; + }else{ + zType = jsonType[x.aNode[i].eType]; + } + jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d", + i, zType, x.aNode[i].n, x.aUp[i]); + if( x.aNode[i].u.zJContent!=0 ){ + jsonAppendRaw(&s, " ", 1); + jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n); + } + jsonAppendRaw(&s, "\n", 1); + } + jsonParseReset(&x); + jsonResult(&s); +} + +/* +** The json_test1(JSON) function return true (1) if the input is JSON +** text generated by another json function. It returns (0) if the input +** is not known to be JSON. +*/ +static void jsonTest1Func( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + UNUSED_PARAM(argc); + sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE); +} +#endif /* SQLITE_DEBUG */ + +/**************************************************************************** +** Scalar SQL function implementations +****************************************************************************/ + +/* +** Implementation of the json_QUOTE(VALUE) function. Return a JSON value +** corresponding to the SQL value input. Mostly this means putting +** double-quotes around strings and returning the unquoted string "null" +** when given a NULL input. +*/ +static void jsonQuoteFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString jx; + UNUSED_PARAM(argc); + + jsonInit(&jx, ctx); + jsonAppendValue(&jx, argv[0]); + jsonResult(&jx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} + +/* +** Implementation of the json_array(VALUE,...) function. Return a JSON +** array that contains all values given in arguments. Or if any argument +** is a BLOB, throw an error. +*/ +static void jsonArrayFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + int i; + JsonString jx; + + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '['); + for(i=0; i<argc; i++){ + jsonAppendSeparator(&jx); + jsonAppendValue(&jx, argv[i]); + } + jsonAppendChar(&jx, ']'); + jsonResult(&jx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} + + +/* +** json_array_length(JSON) +** json_array_length(JSON, PATH) +** +** Return the number of elements in the top-level JSON array. +** Return 0 if the input is not a well-formed JSON array. +*/ +static void jsonArrayLengthFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + sqlite3_int64 n = 0; + u32 i; + JsonNode *pNode; + + p = jsonParseCached(ctx, argv); + if( p==0 ) return; + assert( p->nNode ); + if( argc==2 ){ + const char *zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(p, zPath, 0, ctx); + }else{ + pNode = p->aNode; + } + if( pNode==0 ){ + return; + } + if( pNode->eType==JSON_ARRAY ){ + assert( (pNode->jnFlags & JNODE_APPEND)==0 ); + for(i=1; i<=pNode->n; n++){ + i += jsonNodeSize(&pNode[i]); + } + } + sqlite3_result_int64(ctx, n); +} + +/* +** json_extract(JSON, PATH, ...) +** +** Return the element described by PATH. Return NULL if there is no +** PATH element. If there are multiple PATHs, then return a JSON array +** with the result from each path. Throw an error if the JSON or any PATH +** is malformed. +*/ +static void jsonExtractFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse *p; /* The parse */ + JsonNode *pNode; + const char *zPath; + JsonString jx; + int i; + + if( argc<2 ) return; + p = jsonParseCached(ctx, argv); + if( p==0 ) return; + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '['); + for(i=1; i<argc; i++){ + zPath = (const char*)sqlite3_value_text(argv[i]); + pNode = jsonLookup(p, zPath, 0, ctx); + if( p->nErr ) break; + if( argc>2 ){ + jsonAppendSeparator(&jx); + if( pNode ){ + jsonRenderNode(pNode, &jx, 0); + }else{ + jsonAppendRaw(&jx, "null", 4); + } + }else if( pNode ){ + jsonReturn(pNode, ctx, 0); + } + } + if( argc>2 && i==argc ){ + jsonAppendChar(&jx, ']'); + jsonResult(&jx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); + } + jsonReset(&jx); +} + +/* This is the RFC 7396 MergePatch algorithm. +*/ +static JsonNode *jsonMergePatch( + JsonParse *pParse, /* The JSON parser that contains the TARGET */ + u32 iTarget, /* Node of the TARGET in pParse */ + JsonNode *pPatch /* The PATCH */ +){ + u32 i, j; + u32 iRoot; + JsonNode *pTarget; + if( pPatch->eType!=JSON_OBJECT ){ + return pPatch; + } + assert( iTarget>=0 && iTarget<pParse->nNode ); + pTarget = &pParse->aNode[iTarget]; + assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); + if( pTarget->eType!=JSON_OBJECT ){ + jsonRemoveAllNulls(pPatch); + return pPatch; + } + iRoot = iTarget; + for(i=1; i<pPatch->n; i += jsonNodeSize(&pPatch[i+1])+1){ + u32 nKey; + const char *zKey; + assert( pPatch[i].eType==JSON_STRING ); + assert( pPatch[i].jnFlags & JNODE_LABEL ); + nKey = pPatch[i].n; + zKey = pPatch[i].u.zJContent; + assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); + for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){ + assert( pTarget[j].eType==JSON_STRING ); + assert( pTarget[j].jnFlags & JNODE_LABEL ); + assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); + if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){ + if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break; + if( pPatch[i+1].eType==JSON_NULL ){ + pTarget[j+1].jnFlags |= JNODE_REMOVE; + }else{ + JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]); + if( pNew==0 ) return 0; + pTarget = &pParse->aNode[iTarget]; + if( pNew!=&pTarget[j+1] ){ + pTarget[j+1].u.pPatch = pNew; + pTarget[j+1].jnFlags |= JNODE_PATCH; + } + } + break; + } + } + if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){ + int iStart, iPatch; + iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); + jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); + iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0); + if( pParse->oom ) return 0; + jsonRemoveAllNulls(pPatch); + pTarget = &pParse->aNode[iTarget]; + pParse->aNode[iRoot].jnFlags |= JNODE_APPEND; + pParse->aNode[iRoot].u.iAppend = iStart - iRoot; + iRoot = iStart; + pParse->aNode[iPatch].jnFlags |= JNODE_PATCH; + pParse->aNode[iPatch].u.pPatch = &pPatch[i+1]; + } + } + return pTarget; +} + +/* +** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON +** object that is the result of running the RFC 7396 MergePatch() algorithm +** on the two arguments. +*/ +static void jsonPatchFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The JSON that is being patched */ + JsonParse y; /* The patch */ + JsonNode *pResult; /* The result of the merge */ + + UNUSED_PARAM(argc); + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){ + jsonParseReset(&x); + return; + } + pResult = jsonMergePatch(&x, 0, y.aNode); + assert( pResult!=0 || x.oom ); + if( pResult ){ + jsonReturnJson(pResult, ctx, 0); + }else{ + sqlite3_result_error_nomem(ctx); + } + jsonParseReset(&x); + jsonParseReset(&y); +} + + +/* +** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON +** object that contains all name/value given in arguments. Or if any name +** is not a string or if any value is a BLOB, throw an error. +*/ +static void jsonObjectFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + int i; + JsonString jx; + const char *z; + u32 n; + + if( argc&1 ){ + sqlite3_result_error(ctx, "json_object() requires an even number " + "of arguments", -1); + return; + } + jsonInit(&jx, ctx); + jsonAppendChar(&jx, '{'); + for(i=0; i<argc; i+=2){ + if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){ + sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1); + jsonReset(&jx); + return; + } + jsonAppendSeparator(&jx); + z = (const char*)sqlite3_value_text(argv[i]); + n = (u32)sqlite3_value_bytes(argv[i]); + jsonAppendString(&jx, z, n); + jsonAppendChar(&jx, ':'); + jsonAppendValue(&jx, argv[i+1]); + } + jsonAppendChar(&jx, '}'); + jsonResult(&jx); + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} + + +/* +** json_remove(JSON, PATH, ...) +** +** Remove the named elements from JSON and return the result. malformed +** JSON or PATH arguments result in an error. +*/ +static void jsonRemoveFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + JsonNode *pNode; + const char *zPath; + u32 i; + + if( argc<1 ) return; + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + for(i=1; i<(u32)argc; i++){ + zPath = (const char*)sqlite3_value_text(argv[i]); + if( zPath==0 ) goto remove_done; + pNode = jsonLookup(&x, zPath, 0, ctx); + if( x.nErr ) goto remove_done; + if( pNode ) pNode->jnFlags |= JNODE_REMOVE; + } + if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ + jsonReturnJson(x.aNode, ctx, 0); + } +remove_done: + jsonParseReset(&x); +} + +/* +** json_replace(JSON, PATH, VALUE, ...) +** +** Replace the value at PATH with VALUE. If PATH does not already exist, +** this routine is a no-op. If JSON or PATH is malformed, throw an error. +*/ +static void jsonReplaceFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + JsonNode *pNode; + const char *zPath; + u32 i; + + if( argc<1 ) return; + if( (argc&1)==0 ) { + jsonWrongNumArgs(ctx, "replace"); + return; + } + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + pNode = jsonLookup(&x, zPath, 0, ctx); + if( x.nErr ) goto replace_err; + if( pNode ){ + pNode->jnFlags |= (u8)JNODE_REPLACE; + pNode->u.iReplace = i + 1; + } + } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } +replace_err: + jsonParseReset(&x); +} + +/* +** json_set(JSON, PATH, VALUE, ...) +** +** Set the value at PATH to VALUE. Create the PATH if it does not already +** exist. Overwrite existing values that do exist. +** If JSON or PATH is malformed, throw an error. +** +** json_insert(JSON, PATH, VALUE, ...) +** +** Create PATH and initialize it to VALUE. If PATH already exists, this +** routine is a no-op. If JSON or PATH is malformed, throw an error. +*/ +static void jsonSetFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + JsonNode *pNode; + const char *zPath; + u32 i; + int bApnd; + int bIsSet = *(int*)sqlite3_user_data(ctx); + + if( argc<1 ) return; + if( (argc&1)==0 ) { + jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert"); + return; + } + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + bApnd = 0; + pNode = jsonLookup(&x, zPath, &bApnd, ctx); + if( x.oom ){ + sqlite3_result_error_nomem(ctx); + goto jsonSetDone; + }else if( x.nErr ){ + goto jsonSetDone; + }else if( pNode && (bApnd || bIsSet) ){ + pNode->jnFlags |= (u8)JNODE_REPLACE; + pNode->u.iReplace = i + 1; + } + } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } +jsonSetDone: + jsonParseReset(&x); +} + +/* +** json_type(JSON) +** json_type(JSON, PATH) +** +** Return the top-level "type" of a JSON string. Throw an error if +** either the JSON or PATH inputs are not well-formed. +*/ +static void jsonTypeFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + const char *zPath; + JsonNode *pNode; + + if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; + assert( x.nNode ); + if( argc==2 ){ + zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(&x, zPath, 0, ctx); + }else{ + pNode = x.aNode; + } + if( pNode ){ + sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); + } + jsonParseReset(&x); +} + +/* +** json_valid(JSON) +** +** Return 1 if JSON is a well-formed JSON string according to RFC-7159. +** Return 0 otherwise. +*/ +static void jsonValidFunc( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonParse x; /* The parse */ + int rc = 0; + + UNUSED_PARAM(argc); + if( jsonParse(&x, 0, (const char*)sqlite3_value_text(argv[0]))==0 ){ + rc = 1; + } + jsonParseReset(&x); + sqlite3_result_int(ctx, rc); +} + + +/**************************************************************************** +** Aggregate SQL function implementations +****************************************************************************/ +/* +** json_group_array(VALUE) +** +** Return a JSON array composed of all values in the aggregate. +*/ +static void jsonArrayStep( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString *pStr; + UNUSED_PARAM(argc); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); + if( pStr ){ + if( pStr->zBuf==0 ){ + jsonInit(pStr, ctx); + jsonAppendChar(pStr, '['); + }else{ + jsonAppendChar(pStr, ','); + pStr->pCtx = ctx; + } + jsonAppendValue(pStr, argv[0]); + } +} +static void jsonArrayFinal(sqlite3_context *ctx){ + JsonString *pStr; + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); + if( pStr ){ + pStr->pCtx = ctx; + jsonAppendChar(pStr, ']'); + if( pStr->bErr ){ + if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); + assert( pStr->bStatic ); + }else{ + sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed, + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic = 1; + } + }else{ + sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC); + } + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} + +/* +** json_group_obj(NAME,VALUE) +** +** Return a JSON object composed of all names and values in the aggregate. +*/ +static void jsonObjectStep( + sqlite3_context *ctx, + int argc, + sqlite3_value **argv +){ + JsonString *pStr; + const char *z; + u32 n; + UNUSED_PARAM(argc); + pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); + if( pStr ){ + if( pStr->zBuf==0 ){ + jsonInit(pStr, ctx); + jsonAppendChar(pStr, '{'); + }else{ + jsonAppendChar(pStr, ','); + pStr->pCtx = ctx; + } + z = (const char*)sqlite3_value_text(argv[0]); + n = (u32)sqlite3_value_bytes(argv[0]); + jsonAppendString(pStr, z, n); + jsonAppendChar(pStr, ':'); + jsonAppendValue(pStr, argv[1]); + } +} +static void jsonObjectFinal(sqlite3_context *ctx){ + JsonString *pStr; + pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); + if( pStr ){ + jsonAppendChar(pStr, '}'); + if( pStr->bErr ){ + if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); + assert( pStr->bStatic ); + }else{ + sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed, + pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); + pStr->bStatic = 1; + } + }else{ + sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC); + } + sqlite3_result_subtype(ctx, JSON_SUBTYPE); +} + + +#ifndef SQLITE_OMIT_VIRTUALTABLE +/**************************************************************************** +** The json_each virtual table +****************************************************************************/ +typedef struct JsonEachCursor JsonEachCursor; +struct JsonEachCursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + u32 iRowid; /* The rowid */ + u32 iBegin; /* The first node of the scan */ + u32 i; /* Index in sParse.aNode[] of current row */ + u32 iEnd; /* EOF when i equals or exceeds this value */ + u8 eType; /* Type of top-level element */ + u8 bRecursive; /* True for json_tree(). False for json_each() */ + char *zJson; /* Input JSON */ + char *zRoot; /* Path by which to filter zJson */ + JsonParse sParse; /* Parse of the input JSON */ +}; + +/* Constructor for the json_each virtual table */ +static int jsonEachConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + sqlite3_vtab *pNew; + int rc; + +/* Column numbers */ +#define JEACH_KEY 0 +#define JEACH_VALUE 1 +#define JEACH_TYPE 2 +#define JEACH_ATOM 3 +#define JEACH_ID 4 +#define JEACH_PARENT 5 +#define JEACH_FULLKEY 6 +#define JEACH_PATH 7 +#define JEACH_JSON 8 +#define JEACH_ROOT 9 + + UNUSED_PARAM(pzErr); + UNUSED_PARAM(argv); + UNUSED_PARAM(argc); + UNUSED_PARAM(pAux); + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path," + "json HIDDEN,root HIDDEN)"); + if( rc==SQLITE_OK ){ + pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +/* destructor for json_each virtual table */ +static int jsonEachDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* constructor for a JsonEachCursor object for json_each(). */ +static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + JsonEachCursor *pCur; + + UNUSED_PARAM(p); + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* constructor for a JsonEachCursor object for json_tree(). */ +static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + int rc = jsonEachOpenEach(p, ppCursor); + if( rc==SQLITE_OK ){ + JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor; + pCur->bRecursive = 1; + } + return rc; +} + +/* Reset a JsonEachCursor back to its original state. Free any memory +** held. */ +static void jsonEachCursorReset(JsonEachCursor *p){ + sqlite3_free(p->zJson); + sqlite3_free(p->zRoot); + jsonParseReset(&p->sParse); + p->iRowid = 0; + p->i = 0; + p->iEnd = 0; + p->eType = 0; + p->zJson = 0; + p->zRoot = 0; +} + +/* Destructor for a jsonEachCursor object */ +static int jsonEachClose(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + jsonEachCursorReset(p); + sqlite3_free(cur); + return SQLITE_OK; +} + +/* Return TRUE if the jsonEachCursor object has been advanced off the end +** of the JSON object */ +static int jsonEachEof(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + return p->i >= p->iEnd; +} + +/* Advance the cursor to the next element for json_tree() */ +static int jsonEachNext(sqlite3_vtab_cursor *cur){ + JsonEachCursor *p = (JsonEachCursor*)cur; + if( p->bRecursive ){ + if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++; + p->i++; + p->iRowid++; + if( p->i<p->iEnd ){ + u32 iUp = p->sParse.aUp[p->i]; + JsonNode *pUp = &p->sParse.aNode[iUp]; + p->eType = pUp->eType; + if( pUp->eType==JSON_ARRAY ){ + if( iUp==p->i-1 ){ + pUp->u.iKey = 0; + }else{ + pUp->u.iKey++; + } + } + } + }else{ + switch( p->eType ){ + case JSON_ARRAY: { + p->i += jsonNodeSize(&p->sParse.aNode[p->i]); + p->iRowid++; + break; + } + case JSON_OBJECT: { + p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]); + p->iRowid++; + break; + } + default: { + p->i = p->iEnd; + break; + } + } + } + return SQLITE_OK; +} + +/* Append the name of the path for element i to pStr +*/ +static void jsonEachComputePath( + JsonEachCursor *p, /* The cursor */ + JsonString *pStr, /* Write the path here */ + u32 i /* Path to this element */ +){ + JsonNode *pNode, *pUp; + u32 iUp; + if( i==0 ){ + jsonAppendChar(pStr, '$'); + return; + } + iUp = p->sParse.aUp[i]; + jsonEachComputePath(p, pStr, iUp); + pNode = &p->sParse.aNode[i]; + pUp = &p->sParse.aNode[iUp]; + if( pUp->eType==JSON_ARRAY ){ + jsonPrintf(30, pStr, "[%d]", pUp->u.iKey); + }else{ + assert( pUp->eType==JSON_OBJECT ); + if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--; + assert( pNode->eType==JSON_STRING ); + assert( pNode->jnFlags & JNODE_LABEL ); + jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1); + } +} + +/* Return the value of a column */ +static int jsonEachColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + JsonEachCursor *p = (JsonEachCursor*)cur; + JsonNode *pThis = &p->sParse.aNode[p->i]; + switch( i ){ + case JEACH_KEY: { + if( p->i==0 ) break; + if( p->eType==JSON_OBJECT ){ + jsonReturn(pThis, ctx, 0); + }else if( p->eType==JSON_ARRAY ){ + u32 iKey; + if( p->bRecursive ){ + if( p->iRowid==0 ) break; + iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey; + }else{ + iKey = p->iRowid; + } + sqlite3_result_int64(ctx, (sqlite3_int64)iKey); + } + break; + } + case JEACH_VALUE: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + jsonReturn(pThis, ctx, 0); + break; + } + case JEACH_TYPE: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC); + break; + } + case JEACH_ATOM: { + if( pThis->jnFlags & JNODE_LABEL ) pThis++; + if( pThis->eType>=JSON_ARRAY ) break; + jsonReturn(pThis, ctx, 0); + break; + } + case JEACH_ID: { + sqlite3_result_int64(ctx, + (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0)); + break; + } + case JEACH_PARENT: { + if( p->i>p->iBegin && p->bRecursive ){ + sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]); + } + break; + } + case JEACH_FULLKEY: { + JsonString x; + jsonInit(&x, ctx); + if( p->bRecursive ){ + jsonEachComputePath(p, &x, p->i); + }else{ + if( p->zRoot ){ + jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot)); + }else{ + jsonAppendChar(&x, '$'); + } + if( p->eType==JSON_ARRAY ){ + jsonPrintf(30, &x, "[%d]", p->iRowid); + }else if( p->eType==JSON_OBJECT ){ + jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1); + } + } + jsonResult(&x); + break; + } + case JEACH_PATH: { + if( p->bRecursive ){ + JsonString x; + jsonInit(&x, ctx); + jsonEachComputePath(p, &x, p->sParse.aUp[p->i]); + jsonResult(&x); + break; + } + /* For json_each() path and root are the same so fall through + ** into the root case */ + } + default: { + const char *zRoot = p->zRoot; + if( zRoot==0 ) zRoot = "$"; + sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC); + break; + } + case JEACH_JSON: { + assert( i==JEACH_JSON ); + sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC); + break; + } + } + return SQLITE_OK; +} + +/* Return the current rowid value */ +static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + JsonEachCursor *p = (JsonEachCursor*)cur; + *pRowid = p->iRowid; + return SQLITE_OK; +} + +/* The query strategy is to look for an equality constraint on the json +** column. Without such a constraint, the table cannot operate. idxNum is +** 1 if the constraint is found, 3 if the constraint and zRoot are found, +** and 0 otherwise. +*/ +static int jsonEachBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + int i; + int jsonIdx = -1; + int rootIdx = -1; + const struct sqlite3_index_constraint *pConstraint; + + UNUSED_PARAM(tab); + pConstraint = pIdxInfo->aConstraint; + for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ + if( pConstraint->usable==0 ) continue; + if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + switch( pConstraint->iColumn ){ + case JEACH_JSON: jsonIdx = i; break; + case JEACH_ROOT: rootIdx = i; break; + default: /* no-op */ break; + } + } + if( jsonIdx<0 ){ + pIdxInfo->idxNum = 0; + pIdxInfo->estimatedCost = 1e99; + }else{ + pIdxInfo->estimatedCost = 1.0; + pIdxInfo->aConstraintUsage[jsonIdx].argvIndex = 1; + pIdxInfo->aConstraintUsage[jsonIdx].omit = 1; + if( rootIdx<0 ){ + pIdxInfo->idxNum = 1; + }else{ + pIdxInfo->aConstraintUsage[rootIdx].argvIndex = 2; + pIdxInfo->aConstraintUsage[rootIdx].omit = 1; + pIdxInfo->idxNum = 3; + } + } + return SQLITE_OK; +} + +/* Start a search on a new JSON string */ +static int jsonEachFilter( + sqlite3_vtab_cursor *cur, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + JsonEachCursor *p = (JsonEachCursor*)cur; + const char *z; + const char *zRoot = 0; + sqlite3_int64 n; + + UNUSED_PARAM(idxStr); + UNUSED_PARAM(argc); + jsonEachCursorReset(p); + if( idxNum==0 ) return SQLITE_OK; + z = (const char*)sqlite3_value_text(argv[0]); + if( z==0 ) return SQLITE_OK; + n = sqlite3_value_bytes(argv[0]); + p->zJson = sqlite3_malloc64( n+1 ); + if( p->zJson==0 ) return SQLITE_NOMEM; + memcpy(p->zJson, z, (size_t)n+1); + if( jsonParse(&p->sParse, 0, p->zJson) ){ + int rc = SQLITE_NOMEM; + if( p->sParse.oom==0 ){ + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON"); + if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR; + } + jsonEachCursorReset(p); + return rc; + }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){ + jsonEachCursorReset(p); + return SQLITE_NOMEM; + }else{ + JsonNode *pNode = 0; + if( idxNum==3 ){ + const char *zErr = 0; + zRoot = (const char*)sqlite3_value_text(argv[1]); + if( zRoot==0 ) return SQLITE_OK; + n = sqlite3_value_bytes(argv[1]); + p->zRoot = sqlite3_malloc64( n+1 ); + if( p->zRoot==0 ) return SQLITE_NOMEM; + memcpy(p->zRoot, zRoot, (size_t)n+1); + if( zRoot[0]!='$' ){ + zErr = zRoot; + }else{ + pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr); + } + if( zErr ){ + sqlite3_free(cur->pVtab->zErrMsg); + cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr); + jsonEachCursorReset(p); + return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; + }else if( pNode==0 ){ + return SQLITE_OK; + } + }else{ + pNode = p->sParse.aNode; + } + p->iBegin = p->i = (int)(pNode - p->sParse.aNode); + p->eType = pNode->eType; + if( p->eType>=JSON_ARRAY ){ + pNode->u.iKey = 0; + p->iEnd = p->i + pNode->n + 1; + if( p->bRecursive ){ + p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType; + if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){ + p->i--; + } + }else{ + p->i++; + } + }else{ + p->iEnd = p->i+1; + } + } + return SQLITE_OK; +} + +/* The methods of the json_each virtual table */ +static sqlite3_module jsonEachModule = { + 0, /* iVersion */ + 0, /* xCreate */ + jsonEachConnect, /* xConnect */ + jsonEachBestIndex, /* xBestIndex */ + jsonEachDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + jsonEachOpenEach, /* xOpen - open a cursor */ + jsonEachClose, /* xClose - close a cursor */ + jsonEachFilter, /* xFilter - configure scan constraints */ + jsonEachNext, /* xNext - advance a cursor */ + jsonEachEof, /* xEof - check for end of scan */ + jsonEachColumn, /* xColumn - read data */ + jsonEachRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ +}; + +/* The methods of the json_tree virtual table. */ +static sqlite3_module jsonTreeModule = { + 0, /* iVersion */ + 0, /* xCreate */ + jsonEachConnect, /* xConnect */ + jsonEachBestIndex, /* xBestIndex */ + jsonEachDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + jsonEachOpenTree, /* xOpen - open a cursor */ + jsonEachClose, /* xClose - close a cursor */ + jsonEachFilter, /* xFilter - configure scan constraints */ + jsonEachNext, /* xNext - advance a cursor */ + jsonEachEof, /* xEof - check for end of scan */ + jsonEachColumn, /* xColumn - read data */ + jsonEachRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0 /* xRollbackTo */ +}; +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +/**************************************************************************** +** The following routines are the only publically visible identifiers in this +** file. Call the following routines in order to register the various SQL +** functions and the virtual table implemented by this file. +****************************************************************************/ + +SQLITE_PRIVATE int sqlite3Json1Init(sqlite3 *db){ + int rc = SQLITE_OK; + unsigned int i; + static const struct { + const char *zName; + int nArg; + int flag; + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } aFunc[] = { + { "json", 1, 0, jsonRemoveFunc }, + { "json_array", -1, 0, jsonArrayFunc }, + { "json_array_length", 1, 0, jsonArrayLengthFunc }, + { "json_array_length", 2, 0, jsonArrayLengthFunc }, + { "json_extract", -1, 0, jsonExtractFunc }, + { "json_insert", -1, 0, jsonSetFunc }, + { "json_object", -1, 0, jsonObjectFunc }, + { "json_patch", 2, 0, jsonPatchFunc }, + { "json_quote", 1, 0, jsonQuoteFunc }, + { "json_remove", -1, 0, jsonRemoveFunc }, + { "json_replace", -1, 0, jsonReplaceFunc }, + { "json_set", -1, 1, jsonSetFunc }, + { "json_type", 1, 0, jsonTypeFunc }, + { "json_type", 2, 0, jsonTypeFunc }, + { "json_valid", 1, 0, jsonValidFunc }, + +#if SQLITE_DEBUG + /* DEBUG and TESTING functions */ + { "json_parse", 1, 0, jsonParseFunc }, + { "json_test1", 1, 0, jsonTest1Func }, +#endif + }; + static const struct { + const char *zName; + int nArg; + void (*xStep)(sqlite3_context*,int,sqlite3_value**); + void (*xFinal)(sqlite3_context*); + } aAgg[] = { + { "json_group_array", 1, jsonArrayStep, jsonArrayFinal }, + { "json_group_object", 2, jsonObjectStep, jsonObjectFinal }, + }; +#ifndef SQLITE_OMIT_VIRTUALTABLE + static const struct { + const char *zName; + sqlite3_module *pModule; + } aMod[] = { + { "json_each", &jsonEachModule }, + { "json_tree", &jsonTreeModule }, + }; +#endif + for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){ + rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg, + SQLITE_UTF8 | SQLITE_DETERMINISTIC, + (void*)&aFunc[i].flag, + aFunc[i].xFunc, 0, 0); + } + for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){ + rc = sqlite3_create_function(db, aAgg[i].zName, aAgg[i].nArg, + SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0, + 0, aAgg[i].xStep, aAgg[i].xFinal); + } +#ifndef SQLITE_OMIT_VIRTUALTABLE + for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){ + rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0); + } +#endif + return rc; +} + + +#ifndef SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_json_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + return sqlite3Json1Init(db); +} +#endif +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */ + +/************** End of json1.c ***********************************************/ +/************** Begin file fts5.c ********************************************/ + + +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) + +#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) +# define NDEBUG 1 +#endif +#if defined(NDEBUG) && defined(SQLITE_DEBUG) +# undef NDEBUG +#endif + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + +/* #include "sqlite3.h" */ + +#if 0 +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. The exception is if the table was created +** with the offsets=0 option specified. In this case *piOff is always +** set to -1. +** +** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) +** if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension functions +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** of the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, an +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +** <ul><li> <b>FTS5_TOKENIZE_DOCUMENT</b> - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +** <li> <b>FTS5_TOKENIZE_QUERY</b> - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +** <li> <b>(FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX)</b> - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +** <li> <b>FTS5_TOKENIZE_AUX</b> - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +** </ul> +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +** <ol><li> By mapping all synonyms to a single token. In this case, the +** In the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +** <li> By adding multiple synonyms for a single term to the FTS index. +** In this case, when tokenizing query text, the tokenizer may +** provide multiple synonyms for a single term within the document. +** FTS5 then queries the index for each synonym individually. For +** example, faced with the query: +** +** <codeblock> +** ... MATCH 'first place'</codeblock> +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** <codeblock> +** ... MATCH '(first OR 1st) place'</codeblock> +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +** <li> By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entires in the +** FTS index corresponding to both forms of the first token. +** </ol> +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a <i>tflags</i> argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** <codeblock> +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +**</codeblock> +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is subsituted for "1st" by the tokenizer, then the query: +** +** <codeblock> +** ... MATCH '1s*'</codeblock> +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#if 0 +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +*/ +#ifndef _FTS5INT_H +#define _FTS5INT_H + +/* #include "fts5.h" */ +/* #include "sqlite3ext.h" */ +SQLITE_EXTENSION_INIT1 + +/* #include <string.h> */ +/* #include <assert.h> */ + +#ifndef SQLITE_AMALGAMATION + +typedef unsigned char u8; +typedef unsigned int u32; +typedef unsigned short u16; +typedef short i16; +typedef sqlite3_int64 i64; +typedef sqlite3_uint64 u64; + +#ifndef ArraySize +# define ArraySize(x) ((int)(sizeof(x) / sizeof(x[0]))) +#endif + +#define testcase(x) +#define ALWAYS(x) 1 +#define NEVER(x) 0 + +#define MIN(x,y) (((x) < (y)) ? (x) : (y)) +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) + +/* +** Constants for the largest and smallest possible 64-bit signed integers. +*/ +# define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) +# define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) + +#endif + +/* Truncate very long tokens to this many bytes. Hard limit is +** (65536-1-1-4-9)==65521 bytes. The limiting factor is the 16-bit offset +** field that occurs at the start of each leaf page (see fts5_index.c). */ +#define FTS5_MAX_TOKEN_SIZE 32768 + +/* +** Maximum number of prefix indexes on single FTS5 table. This must be +** less than 32. If it is set to anything large than that, an #error +** directive in fts5_index.c will cause the build to fail. +*/ +#define FTS5_MAX_PREFIX_INDEXES 31 + +#define FTS5_DEFAULT_NEARDIST 10 +#define FTS5_DEFAULT_RANK "bm25" + +/* Name of rank and rowid columns */ +#define FTS5_RANK_NAME "rank" +#define FTS5_ROWID_NAME "rowid" + +#ifdef SQLITE_DEBUG +# define FTS5_CORRUPT sqlite3Fts5Corrupt() +static int sqlite3Fts5Corrupt(void); +#else +# define FTS5_CORRUPT SQLITE_CORRUPT_VTAB +#endif + +/* +** The assert_nc() macro is similar to the assert() macro, except that it +** is used for assert() conditions that are true only if it can be +** guranteed that the database is not corrupt. +*/ +#ifdef SQLITE_DEBUG +SQLITE_API extern int sqlite3_fts5_may_be_corrupt; +# define assert_nc(x) assert(sqlite3_fts5_may_be_corrupt || (x)) +#else +# define assert_nc(x) assert(x) +#endif + +/* Mark a function parameter as unused, to suppress nuisance compiler +** warnings. */ +#ifndef UNUSED_PARAM +# define UNUSED_PARAM(X) (void)(X) +#endif + +#ifndef UNUSED_PARAM2 +# define UNUSED_PARAM2(X, Y) (void)(X), (void)(Y) +#endif + +typedef struct Fts5Global Fts5Global; +typedef struct Fts5Colset Fts5Colset; + +/* If a NEAR() clump or phrase may only match a specific set of columns, +** then an object of the following type is used to record the set of columns. +** Each entry in the aiCol[] array is a column that may be matched. +** +** This object is used by fts5_expr.c and fts5_index.c. +*/ +struct Fts5Colset { + int nCol; + int aiCol[1]; +}; + + + +/************************************************************************** +** Interface to code in fts5_config.c. fts5_config.c contains contains code +** to parse the arguments passed to the CREATE VIRTUAL TABLE statement. +*/ + +typedef struct Fts5Config Fts5Config; + +/* +** An instance of the following structure encodes all information that can +** be gleaned from the CREATE VIRTUAL TABLE statement. +** +** And all information loaded from the %_config table. +** +** nAutomerge: +** The minimum number of segments that an auto-merge operation should +** attempt to merge together. A value of 1 sets the object to use the +** compile time default. Zero disables auto-merge altogether. +** +** zContent: +** +** zContentRowid: +** The value of the content_rowid= option, if one was specified. Or +** the string "rowid" otherwise. This text is not quoted - if it is +** used as part of an SQL statement it needs to be quoted appropriately. +** +** zContentExprlist: +** +** pzErrmsg: +** This exists in order to allow the fts5_index.c module to return a +** decent error message if it encounters a file-format version it does +** not understand. +** +** bColumnsize: +** True if the %_docsize table is created. +** +** bPrefixIndex: +** This is only used for debugging. If set to false, any prefix indexes +** are ignored. This value is configured using: +** +** INSERT INTO tbl(tbl, rank) VALUES('prefix-index', $bPrefixIndex); +** +*/ +struct Fts5Config { + sqlite3 *db; /* Database handle */ + char *zDb; /* Database holding FTS index (e.g. "main") */ + char *zName; /* Name of FTS index */ + int nCol; /* Number of columns */ + char **azCol; /* Column names */ + u8 *abUnindexed; /* True for unindexed columns */ + int nPrefix; /* Number of prefix indexes */ + int *aPrefix; /* Sizes in bytes of nPrefix prefix indexes */ + int eContent; /* An FTS5_CONTENT value */ + char *zContent; /* content table */ + char *zContentRowid; /* "content_rowid=" option value */ + int bColumnsize; /* "columnsize=" option value (dflt==1) */ + int eDetail; /* FTS5_DETAIL_XXX value */ + char *zContentExprlist; + Fts5Tokenizer *pTok; + fts5_tokenizer *pTokApi; + + /* Values loaded from the %_config table */ + int iCookie; /* Incremented when %_config is modified */ + int pgsz; /* Approximate page size used in %_data */ + int nAutomerge; /* 'automerge' setting */ + int nCrisisMerge; /* Maximum allowed segments per level */ + int nUsermerge; /* 'usermerge' setting */ + int nHashSize; /* Bytes of memory for in-memory hash */ + char *zRank; /* Name of rank function */ + char *zRankArgs; /* Arguments to rank function */ + + /* If non-NULL, points to sqlite3_vtab.base.zErrmsg. Often NULL. */ + char **pzErrmsg; + +#ifdef SQLITE_DEBUG + int bPrefixIndex; /* True to use prefix-indexes */ +#endif +}; + +/* Current expected value of %_config table 'version' field */ +#define FTS5_CURRENT_VERSION 4 + +#define FTS5_CONTENT_NORMAL 0 +#define FTS5_CONTENT_NONE 1 +#define FTS5_CONTENT_EXTERNAL 2 + +#define FTS5_DETAIL_FULL 0 +#define FTS5_DETAIL_NONE 1 +#define FTS5_DETAIL_COLUMNS 2 + + + +static int sqlite3Fts5ConfigParse( + Fts5Global*, sqlite3*, int, const char **, Fts5Config**, char** +); +static void sqlite3Fts5ConfigFree(Fts5Config*); + +static int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig); + +static int sqlite3Fts5Tokenize( + Fts5Config *pConfig, /* FTS5 Configuration object */ + int flags, /* FTS5_TOKENIZE_* flags */ + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ +); + +static void sqlite3Fts5Dequote(char *z); + +/* Load the contents of the %_config table */ +static int sqlite3Fts5ConfigLoad(Fts5Config*, int); + +/* Set the value of a single config attribute */ +static int sqlite3Fts5ConfigSetValue(Fts5Config*, const char*, sqlite3_value*, int*); + +static int sqlite3Fts5ConfigParseRank(const char*, char**, char**); + +/* +** End of interface to code in fts5_config.c. +**************************************************************************/ + +/************************************************************************** +** Interface to code in fts5_buffer.c. +*/ + +/* +** Buffer object for the incremental building of string data. +*/ +typedef struct Fts5Buffer Fts5Buffer; +struct Fts5Buffer { + u8 *p; + int n; + int nSpace; +}; + +static int sqlite3Fts5BufferSize(int*, Fts5Buffer*, u32); +static void sqlite3Fts5BufferAppendVarint(int*, Fts5Buffer*, i64); +static void sqlite3Fts5BufferAppendBlob(int*, Fts5Buffer*, u32, const u8*); +static void sqlite3Fts5BufferAppendString(int *, Fts5Buffer*, const char*); +static void sqlite3Fts5BufferFree(Fts5Buffer*); +static void sqlite3Fts5BufferZero(Fts5Buffer*); +static void sqlite3Fts5BufferSet(int*, Fts5Buffer*, int, const u8*); +static void sqlite3Fts5BufferAppendPrintf(int *, Fts5Buffer*, char *zFmt, ...); + +static char *sqlite3Fts5Mprintf(int *pRc, const char *zFmt, ...); + +#define fts5BufferZero(x) sqlite3Fts5BufferZero(x) +#define fts5BufferAppendVarint(a,b,c) sqlite3Fts5BufferAppendVarint(a,b,c) +#define fts5BufferFree(a) sqlite3Fts5BufferFree(a) +#define fts5BufferAppendBlob(a,b,c,d) sqlite3Fts5BufferAppendBlob(a,b,c,d) +#define fts5BufferSet(a,b,c,d) sqlite3Fts5BufferSet(a,b,c,d) + +#define fts5BufferGrow(pRc,pBuf,nn) ( \ + (u32)((pBuf)->n) + (u32)(nn) <= (u32)((pBuf)->nSpace) ? 0 : \ + sqlite3Fts5BufferSize((pRc),(pBuf),(nn)+(pBuf)->n) \ +) + +/* Write and decode big-endian 32-bit integer values */ +static void sqlite3Fts5Put32(u8*, int); +static int sqlite3Fts5Get32(const u8*); + +#define FTS5_POS2COLUMN(iPos) (int)(iPos >> 32) +#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0xFFFFFFFF) + +typedef struct Fts5PoslistReader Fts5PoslistReader; +struct Fts5PoslistReader { + /* Variables used only by sqlite3Fts5PoslistIterXXX() functions. */ + const u8 *a; /* Position list to iterate through */ + int n; /* Size of buffer at a[] in bytes */ + int i; /* Current offset in a[] */ + + u8 bFlag; /* For client use (any custom purpose) */ + + /* Output variables */ + u8 bEof; /* Set to true at EOF */ + i64 iPos; /* (iCol<<32) + iPos */ +}; +static int sqlite3Fts5PoslistReaderInit( + const u8 *a, int n, /* Poslist buffer to iterate through */ + Fts5PoslistReader *pIter /* Iterator object to initialize */ +); +static int sqlite3Fts5PoslistReaderNext(Fts5PoslistReader*); + +typedef struct Fts5PoslistWriter Fts5PoslistWriter; +struct Fts5PoslistWriter { + i64 iPrev; +}; +static int sqlite3Fts5PoslistWriterAppend(Fts5Buffer*, Fts5PoslistWriter*, i64); +static void sqlite3Fts5PoslistSafeAppend(Fts5Buffer*, i64*, i64); + +static int sqlite3Fts5PoslistNext64( + const u8 *a, int n, /* Buffer containing poslist */ + int *pi, /* IN/OUT: Offset within a[] */ + i64 *piOff /* IN/OUT: Current offset */ +); + +/* Malloc utility */ +static void *sqlite3Fts5MallocZero(int *pRc, int nByte); +static char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn); + +/* Character set tests (like isspace(), isalpha() etc.) */ +static int sqlite3Fts5IsBareword(char t); + + +/* Bucket of terms object used by the integrity-check in offsets=0 mode. */ +typedef struct Fts5Termset Fts5Termset; +static int sqlite3Fts5TermsetNew(Fts5Termset**); +static int sqlite3Fts5TermsetAdd(Fts5Termset*, int, const char*, int, int *pbPresent); +static void sqlite3Fts5TermsetFree(Fts5Termset*); + +/* +** End of interface to code in fts5_buffer.c. +**************************************************************************/ + +/************************************************************************** +** Interface to code in fts5_index.c. fts5_index.c contains contains code +** to access the data stored in the %_data table. +*/ + +typedef struct Fts5Index Fts5Index; +typedef struct Fts5IndexIter Fts5IndexIter; + +struct Fts5IndexIter { + i64 iRowid; + const u8 *pData; + int nData; + u8 bEof; +}; + +#define sqlite3Fts5IterEof(x) ((x)->bEof) + +/* +** Values used as part of the flags argument passed to IndexQuery(). +*/ +#define FTS5INDEX_QUERY_PREFIX 0x0001 /* Prefix query */ +#define FTS5INDEX_QUERY_DESC 0x0002 /* Docs in descending rowid order */ +#define FTS5INDEX_QUERY_TEST_NOIDX 0x0004 /* Do not use prefix index */ +#define FTS5INDEX_QUERY_SCAN 0x0008 /* Scan query (fts5vocab) */ + +/* The following are used internally by the fts5_index.c module. They are +** defined here only to make it easier to avoid clashes with the flags +** above. */ +#define FTS5INDEX_QUERY_SKIPEMPTY 0x0010 +#define FTS5INDEX_QUERY_NOOUTPUT 0x0020 + +/* +** Create/destroy an Fts5Index object. +*/ +static int sqlite3Fts5IndexOpen(Fts5Config *pConfig, int bCreate, Fts5Index**, char**); +static int sqlite3Fts5IndexClose(Fts5Index *p); + +/* +** Return a simple checksum value based on the arguments. +*/ +static u64 sqlite3Fts5IndexEntryCksum( + i64 iRowid, + int iCol, + int iPos, + int iIdx, + const char *pTerm, + int nTerm +); + +/* +** Argument p points to a buffer containing utf-8 text that is n bytes in +** size. Return the number of bytes in the nChar character prefix of the +** buffer, or 0 if there are less than nChar characters in total. +*/ +static int sqlite3Fts5IndexCharlenToBytelen( + const char *p, + int nByte, + int nChar +); + +/* +** Open a new iterator to iterate though all rowids that match the +** specified token or token prefix. +*/ +static int sqlite3Fts5IndexQuery( + Fts5Index *p, /* FTS index to query */ + const char *pToken, int nToken, /* Token (or prefix) to query for */ + int flags, /* Mask of FTS5INDEX_QUERY_X flags */ + Fts5Colset *pColset, /* Match these columns only */ + Fts5IndexIter **ppIter /* OUT: New iterator object */ +); + +/* +** The various operations on open token or token prefix iterators opened +** using sqlite3Fts5IndexQuery(). +*/ +static int sqlite3Fts5IterNext(Fts5IndexIter*); +static int sqlite3Fts5IterNextFrom(Fts5IndexIter*, i64 iMatch); + +/* +** Close an iterator opened by sqlite3Fts5IndexQuery(). +*/ +static void sqlite3Fts5IterClose(Fts5IndexIter*); + +/* +** This interface is used by the fts5vocab module. +*/ +static const char *sqlite3Fts5IterTerm(Fts5IndexIter*, int*); +static int sqlite3Fts5IterNextScan(Fts5IndexIter*); + + +/* +** Insert or remove data to or from the index. Each time a document is +** added to or removed from the index, this function is called one or more +** times. +** +** For an insert, it must be called once for each token in the new document. +** If the operation is a delete, it must be called (at least) once for each +** unique token in the document with an iCol value less than zero. The iPos +** argument is ignored for a delete. +*/ +static int sqlite3Fts5IndexWrite( + Fts5Index *p, /* Index to write to */ + int iCol, /* Column token appears in (-ve -> delete) */ + int iPos, /* Position of token within column */ + const char *pToken, int nToken /* Token to add or remove to or from index */ +); + +/* +** Indicate that subsequent calls to sqlite3Fts5IndexWrite() pertain to +** document iDocid. +*/ +static int sqlite3Fts5IndexBeginWrite( + Fts5Index *p, /* Index to write to */ + int bDelete, /* True if current operation is a delete */ + i64 iDocid /* Docid to add or remove data from */ +); + +/* +** Flush any data stored in the in-memory hash tables to the database. +** Also close any open blob handles. +*/ +static int sqlite3Fts5IndexSync(Fts5Index *p); + +/* +** Discard any data stored in the in-memory hash tables. Do not write it +** to the database. Additionally, assume that the contents of the %_data +** table may have changed on disk. So any in-memory caches of %_data +** records must be invalidated. +*/ +static int sqlite3Fts5IndexRollback(Fts5Index *p); + +/* +** Get or set the "averages" values. +*/ +static int sqlite3Fts5IndexGetAverages(Fts5Index *p, i64 *pnRow, i64 *anSize); +static int sqlite3Fts5IndexSetAverages(Fts5Index *p, const u8*, int); + +/* +** Functions called by the storage module as part of integrity-check. +*/ +static int sqlite3Fts5IndexIntegrityCheck(Fts5Index*, u64 cksum); + +/* +** Called during virtual module initialization to register UDF +** fts5_decode() with SQLite +*/ +static int sqlite3Fts5IndexInit(sqlite3*); + +static int sqlite3Fts5IndexSetCookie(Fts5Index*, int); + +/* +** Return the total number of entries read from the %_data table by +** this connection since it was created. +*/ +static int sqlite3Fts5IndexReads(Fts5Index *p); + +static int sqlite3Fts5IndexReinit(Fts5Index *p); +static int sqlite3Fts5IndexOptimize(Fts5Index *p); +static int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge); +static int sqlite3Fts5IndexReset(Fts5Index *p); + +static int sqlite3Fts5IndexLoadConfig(Fts5Index *p); + +/* +** End of interface to code in fts5_index.c. +**************************************************************************/ + +/************************************************************************** +** Interface to code in fts5_varint.c. +*/ +static int sqlite3Fts5GetVarint32(const unsigned char *p, u32 *v); +static int sqlite3Fts5GetVarintLen(u32 iVal); +static u8 sqlite3Fts5GetVarint(const unsigned char*, u64*); +static int sqlite3Fts5PutVarint(unsigned char *p, u64 v); + +#define fts5GetVarint32(a,b) sqlite3Fts5GetVarint32(a,(u32*)&b) +#define fts5GetVarint sqlite3Fts5GetVarint + +#define fts5FastGetVarint32(a, iOff, nVal) { \ + nVal = (a)[iOff++]; \ + if( nVal & 0x80 ){ \ + iOff--; \ + iOff += fts5GetVarint32(&(a)[iOff], nVal); \ + } \ +} + + +/* +** End of interface to code in fts5_varint.c. +**************************************************************************/ + + +/************************************************************************** +** Interface to code in fts5.c. +*/ + +static int sqlite3Fts5GetTokenizer( + Fts5Global*, + const char **azArg, + int nArg, + Fts5Tokenizer**, + fts5_tokenizer**, + char **pzErr +); + +static Fts5Index *sqlite3Fts5IndexFromCsrid(Fts5Global*, i64, Fts5Config **); + +/* +** End of interface to code in fts5.c. +**************************************************************************/ + +/************************************************************************** +** Interface to code in fts5_hash.c. +*/ +typedef struct Fts5Hash Fts5Hash; + +/* +** Create a hash table, free a hash table. +*/ +static int sqlite3Fts5HashNew(Fts5Config*, Fts5Hash**, int *pnSize); +static void sqlite3Fts5HashFree(Fts5Hash*); + +static int sqlite3Fts5HashWrite( + Fts5Hash*, + i64 iRowid, /* Rowid for this entry */ + int iCol, /* Column token appears in (-ve -> delete) */ + int iPos, /* Position of token within column */ + char bByte, + const char *pToken, int nToken /* Token to add or remove to or from index */ +); + +/* +** Empty (but do not delete) a hash table. +*/ +static void sqlite3Fts5HashClear(Fts5Hash*); + +static int sqlite3Fts5HashQuery( + Fts5Hash*, /* Hash table to query */ + const char *pTerm, int nTerm, /* Query term */ + const u8 **ppDoclist, /* OUT: Pointer to doclist for pTerm */ + int *pnDoclist /* OUT: Size of doclist in bytes */ +); + +static int sqlite3Fts5HashScanInit( + Fts5Hash*, /* Hash table to query */ + const char *pTerm, int nTerm /* Query prefix */ +); +static void sqlite3Fts5HashScanNext(Fts5Hash*); +static int sqlite3Fts5HashScanEof(Fts5Hash*); +static void sqlite3Fts5HashScanEntry(Fts5Hash *, + const char **pzTerm, /* OUT: term (nul-terminated) */ + const u8 **ppDoclist, /* OUT: pointer to doclist */ + int *pnDoclist /* OUT: size of doclist in bytes */ +); + + +/* +** End of interface to code in fts5_hash.c. +**************************************************************************/ + +/************************************************************************** +** Interface to code in fts5_storage.c. fts5_storage.c contains contains +** code to access the data stored in the %_content and %_docsize tables. +*/ + +#define FTS5_STMT_SCAN_ASC 0 /* SELECT rowid, * FROM ... ORDER BY 1 ASC */ +#define FTS5_STMT_SCAN_DESC 1 /* SELECT rowid, * FROM ... ORDER BY 1 DESC */ +#define FTS5_STMT_LOOKUP 2 /* SELECT rowid, * FROM ... WHERE rowid=? */ + +typedef struct Fts5Storage Fts5Storage; + +static int sqlite3Fts5StorageOpen(Fts5Config*, Fts5Index*, int, Fts5Storage**, char**); +static int sqlite3Fts5StorageClose(Fts5Storage *p); +static int sqlite3Fts5StorageRename(Fts5Storage*, const char *zName); + +static int sqlite3Fts5DropAll(Fts5Config*); +static int sqlite3Fts5CreateTable(Fts5Config*, const char*, const char*, int, char **); + +static int sqlite3Fts5StorageDelete(Fts5Storage *p, i64, sqlite3_value**); +static int sqlite3Fts5StorageContentInsert(Fts5Storage *p, sqlite3_value**, i64*); +static int sqlite3Fts5StorageIndexInsert(Fts5Storage *p, sqlite3_value**, i64); + +static int sqlite3Fts5StorageIntegrity(Fts5Storage *p); + +static int sqlite3Fts5StorageStmt(Fts5Storage *p, int eStmt, sqlite3_stmt**, char**); +static void sqlite3Fts5StorageStmtRelease(Fts5Storage *p, int eStmt, sqlite3_stmt*); + +static int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol); +static int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnAvg); +static int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow); + +static int sqlite3Fts5StorageSync(Fts5Storage *p); +static int sqlite3Fts5StorageRollback(Fts5Storage *p); + +static int sqlite3Fts5StorageConfigValue( + Fts5Storage *p, const char*, sqlite3_value*, int +); + +static int sqlite3Fts5StorageDeleteAll(Fts5Storage *p); +static int sqlite3Fts5StorageRebuild(Fts5Storage *p); +static int sqlite3Fts5StorageOptimize(Fts5Storage *p); +static int sqlite3Fts5StorageMerge(Fts5Storage *p, int nMerge); +static int sqlite3Fts5StorageReset(Fts5Storage *p); + +/* +** End of interface to code in fts5_storage.c. +**************************************************************************/ + + +/************************************************************************** +** Interface to code in fts5_expr.c. +*/ +typedef struct Fts5Expr Fts5Expr; +typedef struct Fts5ExprNode Fts5ExprNode; +typedef struct Fts5Parse Fts5Parse; +typedef struct Fts5Token Fts5Token; +typedef struct Fts5ExprPhrase Fts5ExprPhrase; +typedef struct Fts5ExprNearset Fts5ExprNearset; + +struct Fts5Token { + const char *p; /* Token text (not NULL terminated) */ + int n; /* Size of buffer p in bytes */ +}; + +/* Parse a MATCH expression. */ +static int sqlite3Fts5ExprNew( + Fts5Config *pConfig, + int iCol, /* Column on LHS of MATCH operator */ + const char *zExpr, + Fts5Expr **ppNew, + char **pzErr +); + +/* +** for(rc = sqlite3Fts5ExprFirst(pExpr, pIdx, bDesc); +** rc==SQLITE_OK && 0==sqlite3Fts5ExprEof(pExpr); +** rc = sqlite3Fts5ExprNext(pExpr) +** ){ +** // The document with rowid iRowid matches the expression! +** i64 iRowid = sqlite3Fts5ExprRowid(pExpr); +** } +*/ +static int sqlite3Fts5ExprFirst(Fts5Expr*, Fts5Index *pIdx, i64 iMin, int bDesc); +static int sqlite3Fts5ExprNext(Fts5Expr*, i64 iMax); +static int sqlite3Fts5ExprEof(Fts5Expr*); +static i64 sqlite3Fts5ExprRowid(Fts5Expr*); + +static void sqlite3Fts5ExprFree(Fts5Expr*); + +/* Called during startup to register a UDF with SQLite */ +static int sqlite3Fts5ExprInit(Fts5Global*, sqlite3*); + +static int sqlite3Fts5ExprPhraseCount(Fts5Expr*); +static int sqlite3Fts5ExprPhraseSize(Fts5Expr*, int iPhrase); +static int sqlite3Fts5ExprPoslist(Fts5Expr*, int, const u8 **); + +typedef struct Fts5PoslistPopulator Fts5PoslistPopulator; +static Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr*, int); +static int sqlite3Fts5ExprPopulatePoslists( + Fts5Config*, Fts5Expr*, Fts5PoslistPopulator*, int, const char*, int +); +static void sqlite3Fts5ExprCheckPoslists(Fts5Expr*, i64); + +static int sqlite3Fts5ExprClonePhrase(Fts5Expr*, int, Fts5Expr**); + +static int sqlite3Fts5ExprPhraseCollist(Fts5Expr *, int, const u8 **, int *); + +/******************************************* +** The fts5_expr.c API above this point is used by the other hand-written +** C code in this module. The interfaces below this point are called by +** the parser code in fts5parse.y. */ + +static void sqlite3Fts5ParseError(Fts5Parse *pParse, const char *zFmt, ...); + +static Fts5ExprNode *sqlite3Fts5ParseNode( + Fts5Parse *pParse, + int eType, + Fts5ExprNode *pLeft, + Fts5ExprNode *pRight, + Fts5ExprNearset *pNear +); + +static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( + Fts5Parse *pParse, + Fts5ExprNode *pLeft, + Fts5ExprNode *pRight +); + +static Fts5ExprPhrase *sqlite3Fts5ParseTerm( + Fts5Parse *pParse, + Fts5ExprPhrase *pPhrase, + Fts5Token *pToken, + int bPrefix +); + +static void sqlite3Fts5ParseSetCaret(Fts5ExprPhrase*); + +static Fts5ExprNearset *sqlite3Fts5ParseNearset( + Fts5Parse*, + Fts5ExprNearset*, + Fts5ExprPhrase* +); + +static Fts5Colset *sqlite3Fts5ParseColset( + Fts5Parse*, + Fts5Colset*, + Fts5Token * +); + +static void sqlite3Fts5ParsePhraseFree(Fts5ExprPhrase*); +static void sqlite3Fts5ParseNearsetFree(Fts5ExprNearset*); +static void sqlite3Fts5ParseNodeFree(Fts5ExprNode*); + +static void sqlite3Fts5ParseSetDistance(Fts5Parse*, Fts5ExprNearset*, Fts5Token*); +static void sqlite3Fts5ParseSetColset(Fts5Parse*, Fts5ExprNode*, Fts5Colset*); +static Fts5Colset *sqlite3Fts5ParseColsetInvert(Fts5Parse*, Fts5Colset*); +static void sqlite3Fts5ParseFinished(Fts5Parse *pParse, Fts5ExprNode *p); +static void sqlite3Fts5ParseNear(Fts5Parse *pParse, Fts5Token*); + +/* +** End of interface to code in fts5_expr.c. +**************************************************************************/ + + + +/************************************************************************** +** Interface to code in fts5_aux.c. +*/ + +static int sqlite3Fts5AuxInit(fts5_api*); +/* +** End of interface to code in fts5_aux.c. +**************************************************************************/ + +/************************************************************************** +** Interface to code in fts5_tokenizer.c. +*/ + +static int sqlite3Fts5TokenizerInit(fts5_api*); +/* +** End of interface to code in fts5_tokenizer.c. +**************************************************************************/ + +/************************************************************************** +** Interface to code in fts5_vocab.c. +*/ + +static int sqlite3Fts5VocabInit(Fts5Global*, sqlite3*); + +/* +** End of interface to code in fts5_vocab.c. +**************************************************************************/ + + +/************************************************************************** +** Interface to automatically generated code in fts5_unicode2.c. +*/ +static int sqlite3Fts5UnicodeIsalnum(int c); +static int sqlite3Fts5UnicodeIsdiacritic(int c); +static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic); +/* +** End of interface to code in fts5_unicode2.c. +**************************************************************************/ + +#endif + +#define FTS5_OR 1 +#define FTS5_AND 2 +#define FTS5_NOT 3 +#define FTS5_TERM 4 +#define FTS5_COLON 5 +#define FTS5_MINUS 6 +#define FTS5_LCP 7 +#define FTS5_RCP 8 +#define FTS5_STRING 9 +#define FTS5_LP 10 +#define FTS5_RP 11 +#define FTS5_CARET 12 +#define FTS5_COMMA 13 +#define FTS5_PLUS 14 +#define FTS5_STAR 15 + +/* +** 2000-05-29 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** Driver template for the LEMON parser generator. +** +** The "lemon" program processes an LALR(1) input grammar file, then uses +** this template to construct a parser. The "lemon" program inserts text +** at each "%%" line. Also, any "P-a-r-s-e" identifer prefix (without the +** interstitial "-" characters) contained in this template is changed into +** the value of the %name directive from the grammar. Otherwise, the content +** of this template is copied straight through into the generate parser +** source file. +** +** The following is the concatenation of all %include directives from the +** input grammar file: +*/ +/* #include <stdio.h> */ +/************ Begin %include sections from the grammar ************************/ + +/* #include "fts5Int.h" */ +/* #include "fts5parse.h" */ + +/* +** Disable all error recovery processing in the parser push-down +** automaton. +*/ +#define fts5YYNOERRORRECOVERY 1 + +/* +** Make fts5yytestcase() the same as testcase() +*/ +#define fts5yytestcase(X) testcase(X) + +/* +** Indicate that sqlite3ParserFree() will never be called with a null +** pointer. +*/ +#define fts5YYPARSEFREENOTNULL 1 + +/* +** Alternative datatype for the argument to the malloc() routine passed +** into sqlite3ParserAlloc(). The default is size_t. +*/ +#define fts5YYMALLOCARGTYPE u64 + +/**************** End of %include directives **********************************/ +/* These constants specify the various numeric values for terminal symbols +** in a format understandable to "makeheaders". This section is blank unless +** "lemon" is run with the "-m" command-line option. +***************** Begin makeheaders token definitions *************************/ +/**************** End makeheaders token definitions ***************************/ + +/* The next sections is a series of control #defines. +** various aspects of the generated parser. +** fts5YYCODETYPE is the data type used to store the integer codes +** that represent terminal and non-terminal symbols. +** "unsigned char" is used if there are fewer than +** 256 symbols. Larger types otherwise. +** fts5YYNOCODE is a number of type fts5YYCODETYPE that is not used for +** any terminal or nonterminal symbol. +** fts5YYFALLBACK If defined, this indicates that one or more tokens +** (also known as: "terminal symbols") have fall-back +** values which should be used if the original symbol +** would not parse. This permits keywords to sometimes +** be used as identifiers, for example. +** fts5YYACTIONTYPE is the data type used for "action codes" - numbers +** that indicate what to do in response to the next +** token. +** sqlite3Fts5ParserFTS5TOKENTYPE is the data type used for minor type for terminal +** symbols. Background: A "minor type" is a semantic +** value associated with a terminal or non-terminal +** symbols. For example, for an "ID" terminal symbol, +** the minor type might be the name of the identifier. +** Each non-terminal can have a different minor type. +** Terminal symbols all have the same minor type, though. +** This macros defines the minor type for terminal +** symbols. +** fts5YYMINORTYPE is the data type used for all minor types. +** This is typically a union of many types, one of +** which is sqlite3Fts5ParserFTS5TOKENTYPE. The entry in the union +** for terminal symbols is called "fts5yy0". +** fts5YYSTACKDEPTH is the maximum depth of the parser's stack. If +** zero the stack is dynamically sized using realloc() +** sqlite3Fts5ParserARG_SDECL A static variable declaration for the %extra_argument +** sqlite3Fts5ParserARG_PDECL A parameter declaration for the %extra_argument +** sqlite3Fts5ParserARG_PARAM Code to pass %extra_argument as a subroutine parameter +** sqlite3Fts5ParserARG_STORE Code to store %extra_argument into fts5yypParser +** sqlite3Fts5ParserARG_FETCH Code to extract %extra_argument from fts5yypParser +** sqlite3Fts5ParserCTX_* As sqlite3Fts5ParserARG_ except for %extra_context +** fts5YYERRORSYMBOL is the code number of the error symbol. If not +** defined, then do no error processing. +** fts5YYNSTATE the combined number of states. +** fts5YYNRULE the number of rules in the grammar +** fts5YYNFTS5TOKEN Number of terminal symbols +** fts5YY_MAX_SHIFT Maximum value for shift actions +** fts5YY_MIN_SHIFTREDUCE Minimum value for shift-reduce actions +** fts5YY_MAX_SHIFTREDUCE Maximum value for shift-reduce actions +** fts5YY_ERROR_ACTION The fts5yy_action[] code for syntax error +** fts5YY_ACCEPT_ACTION The fts5yy_action[] code for accept +** fts5YY_NO_ACTION The fts5yy_action[] code for no-op +** fts5YY_MIN_REDUCE Minimum value for reduce actions +** fts5YY_MAX_REDUCE Maximum value for reduce actions +*/ +#ifndef INTERFACE +# define INTERFACE 1 +#endif +/************* Begin control #defines *****************************************/ +#define fts5YYCODETYPE unsigned char +#define fts5YYNOCODE 27 +#define fts5YYACTIONTYPE unsigned char +#define sqlite3Fts5ParserFTS5TOKENTYPE Fts5Token +typedef union { + int fts5yyinit; + sqlite3Fts5ParserFTS5TOKENTYPE fts5yy0; + int fts5yy4; + Fts5Colset* fts5yy11; + Fts5ExprNode* fts5yy24; + Fts5ExprNearset* fts5yy46; + Fts5ExprPhrase* fts5yy53; +} fts5YYMINORTYPE; +#ifndef fts5YYSTACKDEPTH +#define fts5YYSTACKDEPTH 100 +#endif +#define sqlite3Fts5ParserARG_SDECL Fts5Parse *pParse; +#define sqlite3Fts5ParserARG_PDECL ,Fts5Parse *pParse +#define sqlite3Fts5ParserARG_PARAM ,pParse +#define sqlite3Fts5ParserARG_FETCH Fts5Parse *pParse=fts5yypParser->pParse; +#define sqlite3Fts5ParserARG_STORE fts5yypParser->pParse=pParse; +#define sqlite3Fts5ParserCTX_SDECL +#define sqlite3Fts5ParserCTX_PDECL +#define sqlite3Fts5ParserCTX_PARAM +#define sqlite3Fts5ParserCTX_FETCH +#define sqlite3Fts5ParserCTX_STORE +#define fts5YYNSTATE 35 +#define fts5YYNRULE 28 +#define fts5YYNFTS5TOKEN 16 +#define fts5YY_MAX_SHIFT 34 +#define fts5YY_MIN_SHIFTREDUCE 52 +#define fts5YY_MAX_SHIFTREDUCE 79 +#define fts5YY_ERROR_ACTION 80 +#define fts5YY_ACCEPT_ACTION 81 +#define fts5YY_NO_ACTION 82 +#define fts5YY_MIN_REDUCE 83 +#define fts5YY_MAX_REDUCE 110 +/************* End control #defines *******************************************/ + +/* Define the fts5yytestcase() macro to be a no-op if is not already defined +** otherwise. +** +** Applications can choose to define fts5yytestcase() in the %include section +** to a macro that can assist in verifying code coverage. For production +** code the fts5yytestcase() macro should be turned off. But it is useful +** for testing. +*/ +#ifndef fts5yytestcase +# define fts5yytestcase(X) +#endif + + +/* Next are the tables used to determine what action to take based on the +** current state and lookahead token. These tables are used to implement +** functions that take a state number and lookahead value and return an +** action integer. +** +** Suppose the action integer is N. Then the action is determined as +** follows +** +** 0 <= N <= fts5YY_MAX_SHIFT Shift N. That is, push the lookahead +** token onto the stack and goto state N. +** +** N between fts5YY_MIN_SHIFTREDUCE Shift to an arbitrary state then +** and fts5YY_MAX_SHIFTREDUCE reduce by rule N-fts5YY_MIN_SHIFTREDUCE. +** +** N == fts5YY_ERROR_ACTION A syntax error has occurred. +** +** N == fts5YY_ACCEPT_ACTION The parser accepts its input. +** +** N == fts5YY_NO_ACTION No such action. Denotes unused +** slots in the fts5yy_action[] table. +** +** N between fts5YY_MIN_REDUCE Reduce by rule N-fts5YY_MIN_REDUCE +** and fts5YY_MAX_REDUCE +** +** The action table is constructed as a single large table named fts5yy_action[]. +** Given state S and lookahead X, the action is computed as either: +** +** (A) N = fts5yy_action[ fts5yy_shift_ofst[S] + X ] +** (B) N = fts5yy_default[S] +** +** The (A) formula is preferred. The B formula is used instead if +** fts5yy_lookahead[fts5yy_shift_ofst[S]+X] is not equal to X. +** +** The formulas above are for computing the action when the lookahead is +** a terminal symbol. If the lookahead is a non-terminal (as occurs after +** a reduce action) then the fts5yy_reduce_ofst[] array is used in place of +** the fts5yy_shift_ofst[] array. +** +** The following are the tables generated in this section: +** +** fts5yy_action[] A single table containing all actions. +** fts5yy_lookahead[] A table containing the lookahead for each entry in +** fts5yy_action. Used to detect hash collisions. +** fts5yy_shift_ofst[] For each state, the offset into fts5yy_action for +** shifting terminals. +** fts5yy_reduce_ofst[] For each state, the offset into fts5yy_action for +** shifting non-terminals after a reduce. +** fts5yy_default[] Default action for each state. +** +*********** Begin parsing tables **********************************************/ +#define fts5YY_ACTTAB_COUNT (105) +static const fts5YYACTIONTYPE fts5yy_action[] = { + /* 0 */ 81, 20, 96, 6, 28, 99, 98, 26, 26, 18, + /* 10 */ 96, 6, 28, 17, 98, 56, 26, 19, 96, 6, + /* 20 */ 28, 14, 98, 14, 26, 31, 92, 96, 6, 28, + /* 30 */ 108, 98, 25, 26, 21, 96, 6, 28, 78, 98, + /* 40 */ 58, 26, 29, 96, 6, 28, 107, 98, 22, 26, + /* 50 */ 24, 16, 12, 11, 1, 13, 13, 24, 16, 23, + /* 60 */ 11, 33, 34, 13, 97, 8, 27, 32, 98, 7, + /* 70 */ 26, 3, 4, 5, 3, 4, 5, 3, 83, 4, + /* 80 */ 5, 3, 63, 5, 3, 62, 12, 2, 86, 13, + /* 90 */ 9, 30, 10, 10, 54, 57, 75, 78, 78, 53, + /* 100 */ 57, 15, 82, 82, 71, +}; +static const fts5YYCODETYPE fts5yy_lookahead[] = { + /* 0 */ 16, 17, 18, 19, 20, 22, 22, 24, 24, 17, + /* 10 */ 18, 19, 20, 7, 22, 9, 24, 17, 18, 19, + /* 20 */ 20, 9, 22, 9, 24, 13, 17, 18, 19, 20, + /* 30 */ 26, 22, 24, 24, 17, 18, 19, 20, 15, 22, + /* 40 */ 9, 24, 17, 18, 19, 20, 26, 22, 21, 24, + /* 50 */ 6, 7, 9, 9, 10, 12, 12, 6, 7, 21, + /* 60 */ 9, 24, 25, 12, 18, 5, 20, 14, 22, 5, + /* 70 */ 24, 3, 1, 2, 3, 1, 2, 3, 0, 1, + /* 80 */ 2, 3, 11, 2, 3, 11, 9, 10, 5, 12, + /* 90 */ 23, 24, 10, 10, 8, 9, 9, 15, 15, 8, + /* 100 */ 9, 9, 27, 27, 11, 27, 27, 27, 27, 27, + /* 110 */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, + /* 120 */ 27, +}; +#define fts5YY_SHIFT_COUNT (34) +#define fts5YY_SHIFT_MIN (0) +#define fts5YY_SHIFT_MAX (93) +static const unsigned char fts5yy_shift_ofst[] = { + /* 0 */ 44, 44, 44, 44, 44, 44, 51, 77, 43, 12, + /* 10 */ 14, 83, 82, 14, 23, 23, 31, 31, 71, 74, + /* 20 */ 78, 81, 86, 91, 6, 53, 53, 60, 64, 68, + /* 30 */ 53, 87, 92, 53, 93, +}; +#define fts5YY_REDUCE_COUNT (17) +#define fts5YY_REDUCE_MIN (-17) +#define fts5YY_REDUCE_MAX (67) +static const signed char fts5yy_reduce_ofst[] = { + /* 0 */ -16, -8, 0, 9, 17, 25, 46, -17, -17, 37, + /* 10 */ 67, 4, 4, 8, 4, 20, 27, 38, +}; +static const fts5YYACTIONTYPE fts5yy_default[] = { + /* 0 */ 80, 80, 80, 80, 80, 80, 95, 80, 80, 105, + /* 10 */ 80, 110, 110, 80, 110, 110, 80, 80, 80, 80, + /* 20 */ 80, 91, 80, 80, 80, 101, 100, 80, 80, 90, + /* 30 */ 103, 80, 80, 104, 80, +}; +/********** End of lemon-generated parsing tables *****************************/ + +/* The next table maps tokens (terminal symbols) into fallback tokens. +** If a construct like the following: +** +** %fallback ID X Y Z. +** +** appears in the grammar, then ID becomes a fallback token for X, Y, +** and Z. Whenever one of the tokens X, Y, or Z is input to the parser +** but it does not parse, the type of the token is changed to ID and +** the parse is retried before an error is thrown. +** +** This feature can be used, for example, to cause some keywords in a language +** to revert to identifiers if they keyword does not apply in the context where +** it appears. +*/ +#ifdef fts5YYFALLBACK +static const fts5YYCODETYPE fts5yyFallback[] = { +}; +#endif /* fts5YYFALLBACK */ + +/* The following structure represents a single element of the +** parser's stack. Information stored includes: +** +** + The state number for the parser at this level of the stack. +** +** + The value of the token stored at this level of the stack. +** (In other words, the "major" token.) +** +** + The semantic value stored at this level of the stack. This is +** the information used by the action routines in the grammar. +** It is sometimes called the "minor" token. +** +** After the "shift" half of a SHIFTREDUCE action, the stateno field +** actually contains the reduce action for the second half of the +** SHIFTREDUCE. +*/ +struct fts5yyStackEntry { + fts5YYACTIONTYPE stateno; /* The state-number, or reduce action in SHIFTREDUCE */ + fts5YYCODETYPE major; /* The major token value. This is the code + ** number for the token at this stack level */ + fts5YYMINORTYPE minor; /* The user-supplied minor token value. This + ** is the value of the token */ +}; +typedef struct fts5yyStackEntry fts5yyStackEntry; + +/* The state of the parser is completely contained in an instance of +** the following structure */ +struct fts5yyParser { + fts5yyStackEntry *fts5yytos; /* Pointer to top element of the stack */ +#ifdef fts5YYTRACKMAXSTACKDEPTH + int fts5yyhwm; /* High-water mark of the stack */ +#endif +#ifndef fts5YYNOERRORRECOVERY + int fts5yyerrcnt; /* Shifts left before out of the error */ +#endif + sqlite3Fts5ParserARG_SDECL /* A place to hold %extra_argument */ + sqlite3Fts5ParserCTX_SDECL /* A place to hold %extra_context */ +#if fts5YYSTACKDEPTH<=0 + int fts5yystksz; /* Current side of the stack */ + fts5yyStackEntry *fts5yystack; /* The parser's stack */ + fts5yyStackEntry fts5yystk0; /* First stack entry */ +#else + fts5yyStackEntry fts5yystack[fts5YYSTACKDEPTH]; /* The parser's stack */ + fts5yyStackEntry *fts5yystackEnd; /* Last entry in the stack */ +#endif +}; +typedef struct fts5yyParser fts5yyParser; + +#ifndef NDEBUG +/* #include <stdio.h> */ +static FILE *fts5yyTraceFILE = 0; +static char *fts5yyTracePrompt = 0; +#endif /* NDEBUG */ + +#ifndef NDEBUG +/* +** Turn parser tracing on by giving a stream to which to write the trace +** and a prompt to preface each trace message. Tracing is turned off +** by making either argument NULL +** +** Inputs: +** <ul> +** <li> A FILE* to which trace output should be written. +** If NULL, then tracing is turned off. +** <li> A prefix string written at the beginning of every +** line of trace output. If NULL, then tracing is +** turned off. +** </ul> +** +** Outputs: +** None. +*/ +static void sqlite3Fts5ParserTrace(FILE *TraceFILE, char *zTracePrompt){ + fts5yyTraceFILE = TraceFILE; + fts5yyTracePrompt = zTracePrompt; + if( fts5yyTraceFILE==0 ) fts5yyTracePrompt = 0; + else if( fts5yyTracePrompt==0 ) fts5yyTraceFILE = 0; +} +#endif /* NDEBUG */ + +#if defined(fts5YYCOVERAGE) || !defined(NDEBUG) +/* For tracing shifts, the names of all terminals and nonterminals +** are required. The following table supplies these names */ +static const char *const fts5yyTokenName[] = { + /* 0 */ "$", + /* 1 */ "OR", + /* 2 */ "AND", + /* 3 */ "NOT", + /* 4 */ "TERM", + /* 5 */ "COLON", + /* 6 */ "MINUS", + /* 7 */ "LCP", + /* 8 */ "RCP", + /* 9 */ "STRING", + /* 10 */ "LP", + /* 11 */ "RP", + /* 12 */ "CARET", + /* 13 */ "COMMA", + /* 14 */ "PLUS", + /* 15 */ "STAR", + /* 16 */ "input", + /* 17 */ "expr", + /* 18 */ "cnearset", + /* 19 */ "exprlist", + /* 20 */ "colset", + /* 21 */ "colsetlist", + /* 22 */ "nearset", + /* 23 */ "nearphrases", + /* 24 */ "phrase", + /* 25 */ "neardist_opt", + /* 26 */ "star_opt", +}; +#endif /* defined(fts5YYCOVERAGE) || !defined(NDEBUG) */ + +#ifndef NDEBUG +/* For tracing reduce actions, the names of all rules are required. +*/ +static const char *const fts5yyRuleName[] = { + /* 0 */ "input ::= expr", + /* 1 */ "colset ::= MINUS LCP colsetlist RCP", + /* 2 */ "colset ::= LCP colsetlist RCP", + /* 3 */ "colset ::= STRING", + /* 4 */ "colset ::= MINUS STRING", + /* 5 */ "colsetlist ::= colsetlist STRING", + /* 6 */ "colsetlist ::= STRING", + /* 7 */ "expr ::= expr AND expr", + /* 8 */ "expr ::= expr OR expr", + /* 9 */ "expr ::= expr NOT expr", + /* 10 */ "expr ::= colset COLON LP expr RP", + /* 11 */ "expr ::= LP expr RP", + /* 12 */ "expr ::= exprlist", + /* 13 */ "exprlist ::= cnearset", + /* 14 */ "exprlist ::= exprlist cnearset", + /* 15 */ "cnearset ::= nearset", + /* 16 */ "cnearset ::= colset COLON nearset", + /* 17 */ "nearset ::= phrase", + /* 18 */ "nearset ::= CARET phrase", + /* 19 */ "nearset ::= STRING LP nearphrases neardist_opt RP", + /* 20 */ "nearphrases ::= phrase", + /* 21 */ "nearphrases ::= nearphrases phrase", + /* 22 */ "neardist_opt ::=", + /* 23 */ "neardist_opt ::= COMMA STRING", + /* 24 */ "phrase ::= phrase PLUS STRING star_opt", + /* 25 */ "phrase ::= STRING star_opt", + /* 26 */ "star_opt ::= STAR", + /* 27 */ "star_opt ::=", +}; +#endif /* NDEBUG */ + + +#if fts5YYSTACKDEPTH<=0 +/* +** Try to increase the size of the parser stack. Return the number +** of errors. Return 0 on success. +*/ +static int fts5yyGrowStack(fts5yyParser *p){ + int newSize; + int idx; + fts5yyStackEntry *pNew; + + newSize = p->fts5yystksz*2 + 100; + idx = p->fts5yytos ? (int)(p->fts5yytos - p->fts5yystack) : 0; + if( p->fts5yystack==&p->fts5yystk0 ){ + pNew = malloc(newSize*sizeof(pNew[0])); + if( pNew ) pNew[0] = p->fts5yystk0; + }else{ + pNew = realloc(p->fts5yystack, newSize*sizeof(pNew[0])); + } + if( pNew ){ + p->fts5yystack = pNew; + p->fts5yytos = &p->fts5yystack[idx]; +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sStack grows from %d to %d entries.\n", + fts5yyTracePrompt, p->fts5yystksz, newSize); + } +#endif + p->fts5yystksz = newSize; + } + return pNew==0; +} +#endif + +/* Datatype of the argument to the memory allocated passed as the +** second argument to sqlite3Fts5ParserAlloc() below. This can be changed by +** putting an appropriate #define in the %include section of the input +** grammar. +*/ +#ifndef fts5YYMALLOCARGTYPE +# define fts5YYMALLOCARGTYPE size_t +#endif + +/* Initialize a new parser that has already been allocated. +*/ +static void sqlite3Fts5ParserInit(void *fts5yypRawParser sqlite3Fts5ParserCTX_PDECL){ + fts5yyParser *fts5yypParser = (fts5yyParser*)fts5yypRawParser; + sqlite3Fts5ParserCTX_STORE +#ifdef fts5YYTRACKMAXSTACKDEPTH + fts5yypParser->fts5yyhwm = 0; +#endif +#if fts5YYSTACKDEPTH<=0 + fts5yypParser->fts5yytos = NULL; + fts5yypParser->fts5yystack = NULL; + fts5yypParser->fts5yystksz = 0; + if( fts5yyGrowStack(fts5yypParser) ){ + fts5yypParser->fts5yystack = &fts5yypParser->fts5yystk0; + fts5yypParser->fts5yystksz = 1; + } +#endif +#ifndef fts5YYNOERRORRECOVERY + fts5yypParser->fts5yyerrcnt = -1; +#endif + fts5yypParser->fts5yytos = fts5yypParser->fts5yystack; + fts5yypParser->fts5yystack[0].stateno = 0; + fts5yypParser->fts5yystack[0].major = 0; +#if fts5YYSTACKDEPTH>0 + fts5yypParser->fts5yystackEnd = &fts5yypParser->fts5yystack[fts5YYSTACKDEPTH-1]; +#endif +} + +#ifndef sqlite3Fts5Parser_ENGINEALWAYSONSTACK +/* +** This function allocates a new parser. +** The only argument is a pointer to a function which works like +** malloc. +** +** Inputs: +** A pointer to the function used to allocate memory. +** +** Outputs: +** A pointer to a parser. This pointer is used in subsequent calls +** to sqlite3Fts5Parser and sqlite3Fts5ParserFree. +*/ +static void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(fts5YYMALLOCARGTYPE) sqlite3Fts5ParserCTX_PDECL){ + fts5yyParser *fts5yypParser; + fts5yypParser = (fts5yyParser*)(*mallocProc)( (fts5YYMALLOCARGTYPE)sizeof(fts5yyParser) ); + if( fts5yypParser ){ + sqlite3Fts5ParserCTX_STORE + sqlite3Fts5ParserInit(fts5yypParser sqlite3Fts5ParserCTX_PARAM); + } + return (void*)fts5yypParser; +} +#endif /* sqlite3Fts5Parser_ENGINEALWAYSONSTACK */ + + +/* The following function deletes the "minor type" or semantic value +** associated with a symbol. The symbol can be either a terminal +** or nonterminal. "fts5yymajor" is the symbol code, and "fts5yypminor" is +** a pointer to the value to be deleted. The code used to do the +** deletions is derived from the %destructor and/or %token_destructor +** directives of the input grammar. +*/ +static void fts5yy_destructor( + fts5yyParser *fts5yypParser, /* The parser */ + fts5YYCODETYPE fts5yymajor, /* Type code for object to destroy */ + fts5YYMINORTYPE *fts5yypminor /* The object to be destroyed */ +){ + sqlite3Fts5ParserARG_FETCH + sqlite3Fts5ParserCTX_FETCH + switch( fts5yymajor ){ + /* Here is inserted the actions which take place when a + ** terminal or non-terminal is destroyed. This can happen + ** when the symbol is popped from the stack during a + ** reduce or during error processing or when a parser is + ** being destroyed before it is finished parsing. + ** + ** Note: during a reduce, the only symbols destroyed are those + ** which appear on the RHS of the rule, but which are *not* used + ** inside the C code. + */ +/********* Begin destructor definitions ***************************************/ + case 16: /* input */ +{ + (void)pParse; +} + break; + case 17: /* expr */ + case 18: /* cnearset */ + case 19: /* exprlist */ +{ + sqlite3Fts5ParseNodeFree((fts5yypminor->fts5yy24)); +} + break; + case 20: /* colset */ + case 21: /* colsetlist */ +{ + sqlite3_free((fts5yypminor->fts5yy11)); +} + break; + case 22: /* nearset */ + case 23: /* nearphrases */ +{ + sqlite3Fts5ParseNearsetFree((fts5yypminor->fts5yy46)); +} + break; + case 24: /* phrase */ +{ + sqlite3Fts5ParsePhraseFree((fts5yypminor->fts5yy53)); +} + break; +/********* End destructor definitions *****************************************/ + default: break; /* If no destructor action specified: do nothing */ + } +} + +/* +** Pop the parser's stack once. +** +** If there is a destructor routine associated with the token which +** is popped from the stack, then call it. +*/ +static void fts5yy_pop_parser_stack(fts5yyParser *pParser){ + fts5yyStackEntry *fts5yytos; + assert( pParser->fts5yytos!=0 ); + assert( pParser->fts5yytos > pParser->fts5yystack ); + fts5yytos = pParser->fts5yytos--; +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sPopping %s\n", + fts5yyTracePrompt, + fts5yyTokenName[fts5yytos->major]); + } +#endif + fts5yy_destructor(pParser, fts5yytos->major, &fts5yytos->minor); +} + +/* +** Clear all secondary memory allocations from the parser +*/ +static void sqlite3Fts5ParserFinalize(void *p){ + fts5yyParser *pParser = (fts5yyParser*)p; + while( pParser->fts5yytos>pParser->fts5yystack ) fts5yy_pop_parser_stack(pParser); +#if fts5YYSTACKDEPTH<=0 + if( pParser->fts5yystack!=&pParser->fts5yystk0 ) free(pParser->fts5yystack); +#endif +} + +#ifndef sqlite3Fts5Parser_ENGINEALWAYSONSTACK +/* +** Deallocate and destroy a parser. Destructors are called for +** all stack elements before shutting the parser down. +** +** If the fts5YYPARSEFREENEVERNULL macro exists (for example because it +** is defined in a %include section of the input grammar) then it is +** assumed that the input pointer is never NULL. +*/ +static void sqlite3Fts5ParserFree( + void *p, /* The parser to be deleted */ + void (*freeProc)(void*) /* Function used to reclaim memory */ +){ +#ifndef fts5YYPARSEFREENEVERNULL + if( p==0 ) return; +#endif + sqlite3Fts5ParserFinalize(p); + (*freeProc)(p); +} +#endif /* sqlite3Fts5Parser_ENGINEALWAYSONSTACK */ + +/* +** Return the peak depth of the stack for a parser. +*/ +#ifdef fts5YYTRACKMAXSTACKDEPTH +static int sqlite3Fts5ParserStackPeak(void *p){ + fts5yyParser *pParser = (fts5yyParser*)p; + return pParser->fts5yyhwm; +} +#endif + +/* This array of booleans keeps track of the parser statement +** coverage. The element fts5yycoverage[X][Y] is set when the parser +** is in state X and has a lookahead token Y. In a well-tested +** systems, every element of this matrix should end up being set. +*/ +#if defined(fts5YYCOVERAGE) +static unsigned char fts5yycoverage[fts5YYNSTATE][fts5YYNFTS5TOKEN]; +#endif + +/* +** Write into out a description of every state/lookahead combination that +** +** (1) has not been used by the parser, and +** (2) is not a syntax error. +** +** Return the number of missed state/lookahead combinations. +*/ +#if defined(fts5YYCOVERAGE) +static int sqlite3Fts5ParserCoverage(FILE *out){ + int stateno, iLookAhead, i; + int nMissed = 0; + for(stateno=0; stateno<fts5YYNSTATE; stateno++){ + i = fts5yy_shift_ofst[stateno]; + for(iLookAhead=0; iLookAhead<fts5YYNFTS5TOKEN; iLookAhead++){ + if( fts5yy_lookahead[i+iLookAhead]!=iLookAhead ) continue; + if( fts5yycoverage[stateno][iLookAhead]==0 ) nMissed++; + if( out ){ + fprintf(out,"State %d lookahead %s %s\n", stateno, + fts5yyTokenName[iLookAhead], + fts5yycoverage[stateno][iLookAhead] ? "ok" : "missed"); + } + } + } + return nMissed; +} +#endif + +/* +** Find the appropriate action for a parser given the terminal +** look-ahead token iLookAhead. +*/ +static fts5YYACTIONTYPE fts5yy_find_shift_action( + fts5YYCODETYPE iLookAhead, /* The look-ahead token */ + fts5YYACTIONTYPE stateno /* Current state number */ +){ + int i; + + if( stateno>fts5YY_MAX_SHIFT ) return stateno; + assert( stateno <= fts5YY_SHIFT_COUNT ); +#if defined(fts5YYCOVERAGE) + fts5yycoverage[stateno][iLookAhead] = 1; +#endif + do{ + i = fts5yy_shift_ofst[stateno]; + assert( i>=0 ); + assert( i+fts5YYNFTS5TOKEN<=(int)sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0]) ); + assert( iLookAhead!=fts5YYNOCODE ); + assert( iLookAhead < fts5YYNFTS5TOKEN ); + i += iLookAhead; + if( fts5yy_lookahead[i]!=iLookAhead ){ +#ifdef fts5YYFALLBACK + fts5YYCODETYPE iFallback; /* Fallback token */ + if( iLookAhead<sizeof(fts5yyFallback)/sizeof(fts5yyFallback[0]) + && (iFallback = fts5yyFallback[iLookAhead])!=0 ){ +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE, "%sFALLBACK %s => %s\n", + fts5yyTracePrompt, fts5yyTokenName[iLookAhead], fts5yyTokenName[iFallback]); + } +#endif + assert( fts5yyFallback[iFallback]==0 ); /* Fallback loop must terminate */ + iLookAhead = iFallback; + continue; + } +#endif +#ifdef fts5YYWILDCARD + { + int j = i - iLookAhead + fts5YYWILDCARD; + if( +#if fts5YY_SHIFT_MIN+fts5YYWILDCARD<0 + j>=0 && +#endif +#if fts5YY_SHIFT_MAX+fts5YYWILDCARD>=fts5YY_ACTTAB_COUNT + j<fts5YY_ACTTAB_COUNT && +#endif + fts5yy_lookahead[j]==fts5YYWILDCARD && iLookAhead>0 + ){ +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE, "%sWILDCARD %s => %s\n", + fts5yyTracePrompt, fts5yyTokenName[iLookAhead], + fts5yyTokenName[fts5YYWILDCARD]); + } +#endif /* NDEBUG */ + return fts5yy_action[j]; + } + } +#endif /* fts5YYWILDCARD */ + return fts5yy_default[stateno]; + }else{ + return fts5yy_action[i]; + } + }while(1); +} + +/* +** Find the appropriate action for a parser given the non-terminal +** look-ahead token iLookAhead. +*/ +static int fts5yy_find_reduce_action( + fts5YYACTIONTYPE stateno, /* Current state number */ + fts5YYCODETYPE iLookAhead /* The look-ahead token */ +){ + int i; +#ifdef fts5YYERRORSYMBOL + if( stateno>fts5YY_REDUCE_COUNT ){ + return fts5yy_default[stateno]; + } +#else + assert( stateno<=fts5YY_REDUCE_COUNT ); +#endif + i = fts5yy_reduce_ofst[stateno]; + assert( iLookAhead!=fts5YYNOCODE ); + i += iLookAhead; +#ifdef fts5YYERRORSYMBOL + if( i<0 || i>=fts5YY_ACTTAB_COUNT || fts5yy_lookahead[i]!=iLookAhead ){ + return fts5yy_default[stateno]; + } +#else + assert( i>=0 && i<fts5YY_ACTTAB_COUNT ); + assert( fts5yy_lookahead[i]==iLookAhead ); +#endif + return fts5yy_action[i]; +} + +/* +** The following routine is called if the stack overflows. +*/ +static void fts5yyStackOverflow(fts5yyParser *fts5yypParser){ + sqlite3Fts5ParserARG_FETCH + sqlite3Fts5ParserCTX_FETCH +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sStack Overflow!\n",fts5yyTracePrompt); + } +#endif + while( fts5yypParser->fts5yytos>fts5yypParser->fts5yystack ) fts5yy_pop_parser_stack(fts5yypParser); + /* Here code is inserted which will execute if the parser + ** stack every overflows */ +/******** Begin %stack_overflow code ******************************************/ + + sqlite3Fts5ParseError(pParse, "fts5: parser stack overflow"); +/******** End %stack_overflow code ********************************************/ + sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument var */ + sqlite3Fts5ParserCTX_STORE +} + +/* +** Print tracing information for a SHIFT action +*/ +#ifndef NDEBUG +static void fts5yyTraceShift(fts5yyParser *fts5yypParser, int fts5yyNewState, const char *zTag){ + if( fts5yyTraceFILE ){ + if( fts5yyNewState<fts5YYNSTATE ){ + fprintf(fts5yyTraceFILE,"%s%s '%s', go to state %d\n", + fts5yyTracePrompt, zTag, fts5yyTokenName[fts5yypParser->fts5yytos->major], + fts5yyNewState); + }else{ + fprintf(fts5yyTraceFILE,"%s%s '%s', pending reduce %d\n", + fts5yyTracePrompt, zTag, fts5yyTokenName[fts5yypParser->fts5yytos->major], + fts5yyNewState - fts5YY_MIN_REDUCE); + } + } +} +#else +# define fts5yyTraceShift(X,Y,Z) +#endif + +/* +** Perform a shift action. +*/ +static void fts5yy_shift( + fts5yyParser *fts5yypParser, /* The parser to be shifted */ + fts5YYACTIONTYPE fts5yyNewState, /* The new state to shift in */ + fts5YYCODETYPE fts5yyMajor, /* The major token to shift in */ + sqlite3Fts5ParserFTS5TOKENTYPE fts5yyMinor /* The minor token to shift in */ +){ + fts5yyStackEntry *fts5yytos; + fts5yypParser->fts5yytos++; +#ifdef fts5YYTRACKMAXSTACKDEPTH + if( (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack)>fts5yypParser->fts5yyhwm ){ + fts5yypParser->fts5yyhwm++; + assert( fts5yypParser->fts5yyhwm == (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack) ); + } +#endif +#if fts5YYSTACKDEPTH>0 + if( fts5yypParser->fts5yytos>fts5yypParser->fts5yystackEnd ){ + fts5yypParser->fts5yytos--; + fts5yyStackOverflow(fts5yypParser); + return; + } +#else + if( fts5yypParser->fts5yytos>=&fts5yypParser->fts5yystack[fts5yypParser->fts5yystksz] ){ + if( fts5yyGrowStack(fts5yypParser) ){ + fts5yypParser->fts5yytos--; + fts5yyStackOverflow(fts5yypParser); + return; + } + } +#endif + if( fts5yyNewState > fts5YY_MAX_SHIFT ){ + fts5yyNewState += fts5YY_MIN_REDUCE - fts5YY_MIN_SHIFTREDUCE; + } + fts5yytos = fts5yypParser->fts5yytos; + fts5yytos->stateno = fts5yyNewState; + fts5yytos->major = fts5yyMajor; + fts5yytos->minor.fts5yy0 = fts5yyMinor; + fts5yyTraceShift(fts5yypParser, fts5yyNewState, "Shift"); +} + +/* The following table contains information about every rule that +** is used during the reduce. +*/ +static const struct { + fts5YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ + signed char nrhs; /* Negative of the number of RHS symbols in the rule */ +} fts5yyRuleInfo[] = { + { 16, -1 }, /* (0) input ::= expr */ + { 20, -4 }, /* (1) colset ::= MINUS LCP colsetlist RCP */ + { 20, -3 }, /* (2) colset ::= LCP colsetlist RCP */ + { 20, -1 }, /* (3) colset ::= STRING */ + { 20, -2 }, /* (4) colset ::= MINUS STRING */ + { 21, -2 }, /* (5) colsetlist ::= colsetlist STRING */ + { 21, -1 }, /* (6) colsetlist ::= STRING */ + { 17, -3 }, /* (7) expr ::= expr AND expr */ + { 17, -3 }, /* (8) expr ::= expr OR expr */ + { 17, -3 }, /* (9) expr ::= expr NOT expr */ + { 17, -5 }, /* (10) expr ::= colset COLON LP expr RP */ + { 17, -3 }, /* (11) expr ::= LP expr RP */ + { 17, -1 }, /* (12) expr ::= exprlist */ + { 19, -1 }, /* (13) exprlist ::= cnearset */ + { 19, -2 }, /* (14) exprlist ::= exprlist cnearset */ + { 18, -1 }, /* (15) cnearset ::= nearset */ + { 18, -3 }, /* (16) cnearset ::= colset COLON nearset */ + { 22, -1 }, /* (17) nearset ::= phrase */ + { 22, -2 }, /* (18) nearset ::= CARET phrase */ + { 22, -5 }, /* (19) nearset ::= STRING LP nearphrases neardist_opt RP */ + { 23, -1 }, /* (20) nearphrases ::= phrase */ + { 23, -2 }, /* (21) nearphrases ::= nearphrases phrase */ + { 25, 0 }, /* (22) neardist_opt ::= */ + { 25, -2 }, /* (23) neardist_opt ::= COMMA STRING */ + { 24, -4 }, /* (24) phrase ::= phrase PLUS STRING star_opt */ + { 24, -2 }, /* (25) phrase ::= STRING star_opt */ + { 26, -1 }, /* (26) star_opt ::= STAR */ + { 26, 0 }, /* (27) star_opt ::= */ +}; + +static void fts5yy_accept(fts5yyParser*); /* Forward Declaration */ + +/* +** Perform a reduce action and the shift that must immediately +** follow the reduce. +** +** The fts5yyLookahead and fts5yyLookaheadToken parameters provide reduce actions +** access to the lookahead token (if any). The fts5yyLookahead will be fts5YYNOCODE +** if the lookahead token has already been consumed. As this procedure is +** only called from one place, optimizing compilers will in-line it, which +** means that the extra parameters have no performance impact. +*/ +static fts5YYACTIONTYPE fts5yy_reduce( + fts5yyParser *fts5yypParser, /* The parser */ + unsigned int fts5yyruleno, /* Number of the rule by which to reduce */ + int fts5yyLookahead, /* Lookahead token, or fts5YYNOCODE if none */ + sqlite3Fts5ParserFTS5TOKENTYPE fts5yyLookaheadToken /* Value of the lookahead token */ + sqlite3Fts5ParserCTX_PDECL /* %extra_context */ +){ + int fts5yygoto; /* The next state */ + int fts5yyact; /* The next action */ + fts5yyStackEntry *fts5yymsp; /* The top of the parser's stack */ + int fts5yysize; /* Amount to pop the stack */ + sqlite3Fts5ParserARG_FETCH + (void)fts5yyLookahead; + (void)fts5yyLookaheadToken; + fts5yymsp = fts5yypParser->fts5yytos; +#ifndef NDEBUG + if( fts5yyTraceFILE && fts5yyruleno<(int)(sizeof(fts5yyRuleName)/sizeof(fts5yyRuleName[0])) ){ + fts5yysize = fts5yyRuleInfo[fts5yyruleno].nrhs; + if( fts5yysize ){ + fprintf(fts5yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", + fts5yyTracePrompt, + fts5yyruleno, fts5yyRuleName[fts5yyruleno], fts5yymsp[fts5yysize].stateno); + }else{ + fprintf(fts5yyTraceFILE, "%sReduce %d [%s].\n", + fts5yyTracePrompt, fts5yyruleno, fts5yyRuleName[fts5yyruleno]); + } + } +#endif /* NDEBUG */ + + /* Check that the stack is large enough to grow by a single entry + ** if the RHS of the rule is empty. This ensures that there is room + ** enough on the stack to push the LHS value */ + if( fts5yyRuleInfo[fts5yyruleno].nrhs==0 ){ +#ifdef fts5YYTRACKMAXSTACKDEPTH + if( (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack)>fts5yypParser->fts5yyhwm ){ + fts5yypParser->fts5yyhwm++; + assert( fts5yypParser->fts5yyhwm == (int)(fts5yypParser->fts5yytos - fts5yypParser->fts5yystack)); + } +#endif +#if fts5YYSTACKDEPTH>0 + if( fts5yypParser->fts5yytos>=fts5yypParser->fts5yystackEnd ){ + fts5yyStackOverflow(fts5yypParser); + /* The call to fts5yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } +#else + if( fts5yypParser->fts5yytos>=&fts5yypParser->fts5yystack[fts5yypParser->fts5yystksz-1] ){ + if( fts5yyGrowStack(fts5yypParser) ){ + fts5yyStackOverflow(fts5yypParser); + /* The call to fts5yyStackOverflow() above pops the stack until it is + ** empty, causing the main parser loop to exit. So the return value + ** is never used and does not matter. */ + return 0; + } + fts5yymsp = fts5yypParser->fts5yytos; + } +#endif + } + + switch( fts5yyruleno ){ + /* Beginning here are the reduction cases. A typical example + ** follows: + ** case 0: + ** #line <lineno> <grammarfile> + ** { ... } // User supplied code + ** #line <lineno> <thisfile> + ** break; + */ +/********** Begin reduce actions **********************************************/ + fts5YYMINORTYPE fts5yylhsminor; + case 0: /* input ::= expr */ +{ sqlite3Fts5ParseFinished(pParse, fts5yymsp[0].minor.fts5yy24); } + break; + case 1: /* colset ::= MINUS LCP colsetlist RCP */ +{ + fts5yymsp[-3].minor.fts5yy11 = sqlite3Fts5ParseColsetInvert(pParse, fts5yymsp[-1].minor.fts5yy11); +} + break; + case 2: /* colset ::= LCP colsetlist RCP */ +{ fts5yymsp[-2].minor.fts5yy11 = fts5yymsp[-1].minor.fts5yy11; } + break; + case 3: /* colset ::= STRING */ +{ + fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); +} + fts5yymsp[0].minor.fts5yy11 = fts5yylhsminor.fts5yy11; + break; + case 4: /* colset ::= MINUS STRING */ +{ + fts5yymsp[-1].minor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); + fts5yymsp[-1].minor.fts5yy11 = sqlite3Fts5ParseColsetInvert(pParse, fts5yymsp[-1].minor.fts5yy11); +} + break; + case 5: /* colsetlist ::= colsetlist STRING */ +{ + fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, fts5yymsp[-1].minor.fts5yy11, &fts5yymsp[0].minor.fts5yy0); } + fts5yymsp[-1].minor.fts5yy11 = fts5yylhsminor.fts5yy11; + break; + case 6: /* colsetlist ::= STRING */ +{ + fts5yylhsminor.fts5yy11 = sqlite3Fts5ParseColset(pParse, 0, &fts5yymsp[0].minor.fts5yy0); +} + fts5yymsp[0].minor.fts5yy11 = fts5yylhsminor.fts5yy11; + break; + case 7: /* expr ::= expr AND expr */ +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_AND, fts5yymsp[-2].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24, 0); +} + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 8: /* expr ::= expr OR expr */ +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_OR, fts5yymsp[-2].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24, 0); +} + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 9: /* expr ::= expr NOT expr */ +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_NOT, fts5yymsp[-2].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24, 0); +} + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 10: /* expr ::= colset COLON LP expr RP */ +{ + sqlite3Fts5ParseSetColset(pParse, fts5yymsp[-1].minor.fts5yy24, fts5yymsp[-4].minor.fts5yy11); + fts5yylhsminor.fts5yy24 = fts5yymsp[-1].minor.fts5yy24; +} + fts5yymsp[-4].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 11: /* expr ::= LP expr RP */ +{fts5yymsp[-2].minor.fts5yy24 = fts5yymsp[-1].minor.fts5yy24;} + break; + case 12: /* expr ::= exprlist */ + case 13: /* exprlist ::= cnearset */ fts5yytestcase(fts5yyruleno==13); +{fts5yylhsminor.fts5yy24 = fts5yymsp[0].minor.fts5yy24;} + fts5yymsp[0].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 14: /* exprlist ::= exprlist cnearset */ +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseImplicitAnd(pParse, fts5yymsp[-1].minor.fts5yy24, fts5yymsp[0].minor.fts5yy24); +} + fts5yymsp[-1].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 15: /* cnearset ::= nearset */ +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); +} + fts5yymsp[0].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 16: /* cnearset ::= colset COLON nearset */ +{ + fts5yylhsminor.fts5yy24 = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, fts5yymsp[0].minor.fts5yy46); + sqlite3Fts5ParseSetColset(pParse, fts5yylhsminor.fts5yy24, fts5yymsp[-2].minor.fts5yy11); +} + fts5yymsp[-2].minor.fts5yy24 = fts5yylhsminor.fts5yy24; + break; + case 17: /* nearset ::= phrase */ +{ fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); } + fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46; + break; + case 18: /* nearset ::= CARET phrase */ +{ + sqlite3Fts5ParseSetCaret(fts5yymsp[0].minor.fts5yy53); + fts5yymsp[-1].minor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); +} + break; + case 19: /* nearset ::= STRING LP nearphrases neardist_opt RP */ +{ + sqlite3Fts5ParseNear(pParse, &fts5yymsp[-4].minor.fts5yy0); + sqlite3Fts5ParseSetDistance(pParse, fts5yymsp[-2].minor.fts5yy46, &fts5yymsp[-1].minor.fts5yy0); + fts5yylhsminor.fts5yy46 = fts5yymsp[-2].minor.fts5yy46; +} + fts5yymsp[-4].minor.fts5yy46 = fts5yylhsminor.fts5yy46; + break; + case 20: /* nearphrases ::= phrase */ +{ + fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, 0, fts5yymsp[0].minor.fts5yy53); +} + fts5yymsp[0].minor.fts5yy46 = fts5yylhsminor.fts5yy46; + break; + case 21: /* nearphrases ::= nearphrases phrase */ +{ + fts5yylhsminor.fts5yy46 = sqlite3Fts5ParseNearset(pParse, fts5yymsp[-1].minor.fts5yy46, fts5yymsp[0].minor.fts5yy53); +} + fts5yymsp[-1].minor.fts5yy46 = fts5yylhsminor.fts5yy46; + break; + case 22: /* neardist_opt ::= */ +{ fts5yymsp[1].minor.fts5yy0.p = 0; fts5yymsp[1].minor.fts5yy0.n = 0; } + break; + case 23: /* neardist_opt ::= COMMA STRING */ +{ fts5yymsp[-1].minor.fts5yy0 = fts5yymsp[0].minor.fts5yy0; } + break; + case 24: /* phrase ::= phrase PLUS STRING star_opt */ +{ + fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, fts5yymsp[-3].minor.fts5yy53, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4); +} + fts5yymsp[-3].minor.fts5yy53 = fts5yylhsminor.fts5yy53; + break; + case 25: /* phrase ::= STRING star_opt */ +{ + fts5yylhsminor.fts5yy53 = sqlite3Fts5ParseTerm(pParse, 0, &fts5yymsp[-1].minor.fts5yy0, fts5yymsp[0].minor.fts5yy4); +} + fts5yymsp[-1].minor.fts5yy53 = fts5yylhsminor.fts5yy53; + break; + case 26: /* star_opt ::= STAR */ +{ fts5yymsp[0].minor.fts5yy4 = 1; } + break; + case 27: /* star_opt ::= */ +{ fts5yymsp[1].minor.fts5yy4 = 0; } + break; + default: + break; +/********** End reduce actions ************************************************/ + }; + assert( fts5yyruleno<sizeof(fts5yyRuleInfo)/sizeof(fts5yyRuleInfo[0]) ); + fts5yygoto = fts5yyRuleInfo[fts5yyruleno].lhs; + fts5yysize = fts5yyRuleInfo[fts5yyruleno].nrhs; + fts5yyact = fts5yy_find_reduce_action(fts5yymsp[fts5yysize].stateno,(fts5YYCODETYPE)fts5yygoto); + + /* There are no SHIFTREDUCE actions on nonterminals because the table + ** generator has simplified them to pure REDUCE actions. */ + assert( !(fts5yyact>fts5YY_MAX_SHIFT && fts5yyact<=fts5YY_MAX_SHIFTREDUCE) ); + + /* It is not possible for a REDUCE to be followed by an error */ + assert( fts5yyact!=fts5YY_ERROR_ACTION ); + + fts5yymsp += fts5yysize+1; + fts5yypParser->fts5yytos = fts5yymsp; + fts5yymsp->stateno = (fts5YYACTIONTYPE)fts5yyact; + fts5yymsp->major = (fts5YYCODETYPE)fts5yygoto; + fts5yyTraceShift(fts5yypParser, fts5yyact, "... then shift"); + return fts5yyact; +} + +/* +** The following code executes when the parse fails +*/ +#ifndef fts5YYNOERRORRECOVERY +static void fts5yy_parse_failed( + fts5yyParser *fts5yypParser /* The parser */ +){ + sqlite3Fts5ParserARG_FETCH + sqlite3Fts5ParserCTX_FETCH +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sFail!\n",fts5yyTracePrompt); + } +#endif + while( fts5yypParser->fts5yytos>fts5yypParser->fts5yystack ) fts5yy_pop_parser_stack(fts5yypParser); + /* Here code is inserted which will be executed whenever the + ** parser fails */ +/************ Begin %parse_failure code ***************************************/ +/************ End %parse_failure code *****************************************/ + sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3Fts5ParserCTX_STORE +} +#endif /* fts5YYNOERRORRECOVERY */ + +/* +** The following code executes when a syntax error first occurs. +*/ +static void fts5yy_syntax_error( + fts5yyParser *fts5yypParser, /* The parser */ + int fts5yymajor, /* The major type of the error token */ + sqlite3Fts5ParserFTS5TOKENTYPE fts5yyminor /* The minor type of the error token */ +){ + sqlite3Fts5ParserARG_FETCH + sqlite3Fts5ParserCTX_FETCH +#define FTS5TOKEN fts5yyminor +/************ Begin %syntax_error code ****************************************/ + + UNUSED_PARAM(fts5yymajor); /* Silence a compiler warning */ + sqlite3Fts5ParseError( + pParse, "fts5: syntax error near \"%.*s\"",FTS5TOKEN.n,FTS5TOKEN.p + ); +/************ End %syntax_error code ******************************************/ + sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3Fts5ParserCTX_STORE +} + +/* +** The following is executed when the parser accepts +*/ +static void fts5yy_accept( + fts5yyParser *fts5yypParser /* The parser */ +){ + sqlite3Fts5ParserARG_FETCH + sqlite3Fts5ParserCTX_FETCH +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sAccept!\n",fts5yyTracePrompt); + } +#endif +#ifndef fts5YYNOERRORRECOVERY + fts5yypParser->fts5yyerrcnt = -1; +#endif + assert( fts5yypParser->fts5yytos==fts5yypParser->fts5yystack ); + /* Here code is inserted which will be executed whenever the + ** parser accepts */ +/*********** Begin %parse_accept code *****************************************/ +/*********** End %parse_accept code *******************************************/ + sqlite3Fts5ParserARG_STORE /* Suppress warning about unused %extra_argument variable */ + sqlite3Fts5ParserCTX_STORE +} + +/* The main parser program. +** The first argument is a pointer to a structure obtained from +** "sqlite3Fts5ParserAlloc" which describes the current state of the parser. +** The second argument is the major token number. The third is +** the minor token. The fourth optional argument is whatever the +** user wants (and specified in the grammar) and is available for +** use by the action routines. +** +** Inputs: +** <ul> +** <li> A pointer to the parser (an opaque structure.) +** <li> The major token number. +** <li> The minor token number. +** <li> An option argument of a grammar-specified type. +** </ul> +** +** Outputs: +** None. +*/ +static void sqlite3Fts5Parser( + void *fts5yyp, /* The parser */ + int fts5yymajor, /* The major token code number */ + sqlite3Fts5ParserFTS5TOKENTYPE fts5yyminor /* The value for the token */ + sqlite3Fts5ParserARG_PDECL /* Optional %extra_argument parameter */ +){ + fts5YYMINORTYPE fts5yyminorunion; + fts5YYACTIONTYPE fts5yyact; /* The parser action. */ +#if !defined(fts5YYERRORSYMBOL) && !defined(fts5YYNOERRORRECOVERY) + int fts5yyendofinput; /* True if we are at the end of input */ +#endif +#ifdef fts5YYERRORSYMBOL + int fts5yyerrorhit = 0; /* True if fts5yymajor has invoked an error */ +#endif + fts5yyParser *fts5yypParser = (fts5yyParser*)fts5yyp; /* The parser */ + sqlite3Fts5ParserCTX_FETCH + sqlite3Fts5ParserARG_STORE + + assert( fts5yypParser->fts5yytos!=0 ); +#if !defined(fts5YYERRORSYMBOL) && !defined(fts5YYNOERRORRECOVERY) + fts5yyendofinput = (fts5yymajor==0); +#endif + + fts5yyact = fts5yypParser->fts5yytos->stateno; +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + if( fts5yyact < fts5YY_MIN_REDUCE ){ + fprintf(fts5yyTraceFILE,"%sInput '%s' in state %d\n", + fts5yyTracePrompt,fts5yyTokenName[fts5yymajor],fts5yyact); + }else{ + fprintf(fts5yyTraceFILE,"%sInput '%s' with pending reduce %d\n", + fts5yyTracePrompt,fts5yyTokenName[fts5yymajor],fts5yyact-fts5YY_MIN_REDUCE); + } + } +#endif + + do{ + assert( fts5yyact==fts5yypParser->fts5yytos->stateno ); + fts5yyact = fts5yy_find_shift_action(fts5yymajor,fts5yyact); + if( fts5yyact >= fts5YY_MIN_REDUCE ){ + fts5yyact = fts5yy_reduce(fts5yypParser,fts5yyact-fts5YY_MIN_REDUCE,fts5yymajor, + fts5yyminor sqlite3Fts5ParserCTX_PARAM); + }else if( fts5yyact <= fts5YY_MAX_SHIFTREDUCE ){ + fts5yy_shift(fts5yypParser,fts5yyact,fts5yymajor,fts5yyminor); +#ifndef fts5YYNOERRORRECOVERY + fts5yypParser->fts5yyerrcnt--; +#endif + break; + }else if( fts5yyact==fts5YY_ACCEPT_ACTION ){ + fts5yypParser->fts5yytos--; + fts5yy_accept(fts5yypParser); + return; + }else{ + assert( fts5yyact == fts5YY_ERROR_ACTION ); + fts5yyminorunion.fts5yy0 = fts5yyminor; +#ifdef fts5YYERRORSYMBOL + int fts5yymx; +#endif +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sSyntax Error!\n",fts5yyTracePrompt); + } +#endif +#ifdef fts5YYERRORSYMBOL + /* A syntax error has occurred. + ** The response to an error depends upon whether or not the + ** grammar defines an error token "ERROR". + ** + ** This is what we do if the grammar does define ERROR: + ** + ** * Call the %syntax_error function. + ** + ** * Begin popping the stack until we enter a state where + ** it is legal to shift the error symbol, then shift + ** the error symbol. + ** + ** * Set the error count to three. + ** + ** * Begin accepting and shifting new tokens. No new error + ** processing will occur until three tokens have been + ** shifted successfully. + ** + */ + if( fts5yypParser->fts5yyerrcnt<0 ){ + fts5yy_syntax_error(fts5yypParser,fts5yymajor,fts5yyminor); + } + fts5yymx = fts5yypParser->fts5yytos->major; + if( fts5yymx==fts5YYERRORSYMBOL || fts5yyerrorhit ){ +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fprintf(fts5yyTraceFILE,"%sDiscard input token %s\n", + fts5yyTracePrompt,fts5yyTokenName[fts5yymajor]); + } +#endif + fts5yy_destructor(fts5yypParser, (fts5YYCODETYPE)fts5yymajor, &fts5yyminorunion); + fts5yymajor = fts5YYNOCODE; + }else{ + while( fts5yypParser->fts5yytos >= fts5yypParser->fts5yystack + && fts5yymx != fts5YYERRORSYMBOL + && (fts5yyact = fts5yy_find_reduce_action( + fts5yypParser->fts5yytos->stateno, + fts5YYERRORSYMBOL)) >= fts5YY_MIN_REDUCE + ){ + fts5yy_pop_parser_stack(fts5yypParser); + } + if( fts5yypParser->fts5yytos < fts5yypParser->fts5yystack || fts5yymajor==0 ){ + fts5yy_destructor(fts5yypParser,(fts5YYCODETYPE)fts5yymajor,&fts5yyminorunion); + fts5yy_parse_failed(fts5yypParser); +#ifndef fts5YYNOERRORRECOVERY + fts5yypParser->fts5yyerrcnt = -1; +#endif + fts5yymajor = fts5YYNOCODE; + }else if( fts5yymx!=fts5YYERRORSYMBOL ){ + fts5yy_shift(fts5yypParser,fts5yyact,fts5YYERRORSYMBOL,fts5yyminor); + } + } + fts5yypParser->fts5yyerrcnt = 3; + fts5yyerrorhit = 1; + if( fts5yymajor==fts5YYNOCODE ) break; + fts5yyact = fts5yypParser->fts5yytos->stateno; +#elif defined(fts5YYNOERRORRECOVERY) + /* If the fts5YYNOERRORRECOVERY macro is defined, then do not attempt to + ** do any kind of error recovery. Instead, simply invoke the syntax + ** error routine and continue going as if nothing had happened. + ** + ** Applications can set this macro (for example inside %include) if + ** they intend to abandon the parse upon the first syntax error seen. + */ + fts5yy_syntax_error(fts5yypParser,fts5yymajor, fts5yyminor); + fts5yy_destructor(fts5yypParser,(fts5YYCODETYPE)fts5yymajor,&fts5yyminorunion); + break; +#else /* fts5YYERRORSYMBOL is not defined */ + /* This is what we do if the grammar does not define ERROR: + ** + ** * Report an error message, and throw away the input token. + ** + ** * If the input token is $, then fail the parse. + ** + ** As before, subsequent error messages are suppressed until + ** three input tokens have been successfully shifted. + */ + if( fts5yypParser->fts5yyerrcnt<=0 ){ + fts5yy_syntax_error(fts5yypParser,fts5yymajor, fts5yyminor); + } + fts5yypParser->fts5yyerrcnt = 3; + fts5yy_destructor(fts5yypParser,(fts5YYCODETYPE)fts5yymajor,&fts5yyminorunion); + if( fts5yyendofinput ){ + fts5yy_parse_failed(fts5yypParser); +#ifndef fts5YYNOERRORRECOVERY + fts5yypParser->fts5yyerrcnt = -1; +#endif + } + break; +#endif + } + }while( fts5yypParser->fts5yytos>fts5yypParser->fts5yystack ); +#ifndef NDEBUG + if( fts5yyTraceFILE ){ + fts5yyStackEntry *i; + char cDiv = '['; + fprintf(fts5yyTraceFILE,"%sReturn. Stack=",fts5yyTracePrompt); + for(i=&fts5yypParser->fts5yystack[1]; i<=fts5yypParser->fts5yytos; i++){ + fprintf(fts5yyTraceFILE,"%c%s", cDiv, fts5yyTokenName[i->major]); + cDiv = ' '; + } + fprintf(fts5yyTraceFILE,"]\n"); + } +#endif + return; +} + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +*/ + + +/* #include "fts5Int.h" */ +#include <math.h> /* amalgamator: keep */ + +/* +** Object used to iterate through all "coalesced phrase instances" in +** a single column of the current row. If the phrase instances in the +** column being considered do not overlap, this object simply iterates +** through them. Or, if they do overlap (share one or more tokens in +** common), each set of overlapping instances is treated as a single +** match. See documentation for the highlight() auxiliary function for +** details. +** +** Usage is: +** +** for(rc = fts5CInstIterNext(pApi, pFts, iCol, &iter); +** (rc==SQLITE_OK && 0==fts5CInstIterEof(&iter); +** rc = fts5CInstIterNext(&iter) +** ){ +** printf("instance starts at %d, ends at %d\n", iter.iStart, iter.iEnd); +** } +** +*/ +typedef struct CInstIter CInstIter; +struct CInstIter { + const Fts5ExtensionApi *pApi; /* API offered by current FTS version */ + Fts5Context *pFts; /* First arg to pass to pApi functions */ + int iCol; /* Column to search */ + int iInst; /* Next phrase instance index */ + int nInst; /* Total number of phrase instances */ + + /* Output variables */ + int iStart; /* First token in coalesced phrase instance */ + int iEnd; /* Last token in coalesced phrase instance */ +}; + +/* +** Advance the iterator to the next coalesced phrase instance. Return +** an SQLite error code if an error occurs, or SQLITE_OK otherwise. +*/ +static int fts5CInstIterNext(CInstIter *pIter){ + int rc = SQLITE_OK; + pIter->iStart = -1; + pIter->iEnd = -1; + + while( rc==SQLITE_OK && pIter->iInst<pIter->nInst ){ + int ip; int ic; int io; + rc = pIter->pApi->xInst(pIter->pFts, pIter->iInst, &ip, &ic, &io); + if( rc==SQLITE_OK ){ + if( ic==pIter->iCol ){ + int iEnd = io - 1 + pIter->pApi->xPhraseSize(pIter->pFts, ip); + if( pIter->iStart<0 ){ + pIter->iStart = io; + pIter->iEnd = iEnd; + }else if( io<=pIter->iEnd ){ + if( iEnd>pIter->iEnd ) pIter->iEnd = iEnd; + }else{ + break; + } + } + pIter->iInst++; + } + } + + return rc; +} + +/* +** Initialize the iterator object indicated by the final parameter to +** iterate through coalesced phrase instances in column iCol. +*/ +static int fts5CInstIterInit( + const Fts5ExtensionApi *pApi, + Fts5Context *pFts, + int iCol, + CInstIter *pIter +){ + int rc; + + memset(pIter, 0, sizeof(CInstIter)); + pIter->pApi = pApi; + pIter->pFts = pFts; + pIter->iCol = iCol; + rc = pApi->xInstCount(pFts, &pIter->nInst); + + if( rc==SQLITE_OK ){ + rc = fts5CInstIterNext(pIter); + } + + return rc; +} + + + +/************************************************************************* +** Start of highlight() implementation. +*/ +typedef struct HighlightContext HighlightContext; +struct HighlightContext { + CInstIter iter; /* Coalesced Instance Iterator */ + int iPos; /* Current token offset in zIn[] */ + int iRangeStart; /* First token to include */ + int iRangeEnd; /* If non-zero, last token to include */ + const char *zOpen; /* Opening highlight */ + const char *zClose; /* Closing highlight */ + const char *zIn; /* Input text */ + int nIn; /* Size of input text in bytes */ + int iOff; /* Current offset within zIn[] */ + char *zOut; /* Output value */ +}; + +/* +** Append text to the HighlightContext output string - p->zOut. Argument +** z points to a buffer containing n bytes of text to append. If n is +** negative, everything up until the first '\0' is appended to the output. +** +** If *pRc is set to any value other than SQLITE_OK when this function is +** called, it is a no-op. If an error (i.e. an OOM condition) is encountered, +** *pRc is set to an error code before returning. +*/ +static void fts5HighlightAppend( + int *pRc, + HighlightContext *p, + const char *z, int n +){ + if( *pRc==SQLITE_OK ){ + if( n<0 ) n = (int)strlen(z); + p->zOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z); + if( p->zOut==0 ) *pRc = SQLITE_NOMEM; + } +} + +/* +** Tokenizer callback used by implementation of highlight() function. +*/ +static int fts5HighlightCb( + void *pContext, /* Pointer to HighlightContext object */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStartOff, /* Start offset of token */ + int iEndOff /* End offset of token */ +){ + HighlightContext *p = (HighlightContext*)pContext; + int rc = SQLITE_OK; + int iPos; + + UNUSED_PARAM2(pToken, nToken); + + if( tflags & FTS5_TOKEN_COLOCATED ) return SQLITE_OK; + iPos = p->iPos++; + + if( p->iRangeEnd>0 ){ + if( iPos<p->iRangeStart || iPos>p->iRangeEnd ) return SQLITE_OK; + if( p->iRangeStart && iPos==p->iRangeStart ) p->iOff = iStartOff; + } + + if( iPos==p->iter.iStart ){ + fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iStartOff - p->iOff); + fts5HighlightAppend(&rc, p, p->zOpen, -1); + p->iOff = iStartOff; + } + + if( iPos==p->iter.iEnd ){ + if( p->iRangeEnd && p->iter.iStart<p->iRangeStart ){ + fts5HighlightAppend(&rc, p, p->zOpen, -1); + } + fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff); + fts5HighlightAppend(&rc, p, p->zClose, -1); + p->iOff = iEndOff; + if( rc==SQLITE_OK ){ + rc = fts5CInstIterNext(&p->iter); + } + } + + if( p->iRangeEnd>0 && iPos==p->iRangeEnd ){ + fts5HighlightAppend(&rc, p, &p->zIn[p->iOff], iEndOff - p->iOff); + p->iOff = iEndOff; + if( iPos>=p->iter.iStart && iPos<p->iter.iEnd ){ + fts5HighlightAppend(&rc, p, p->zClose, -1); + } + } + + return rc; +} + +/* +** Implementation of highlight() function. +*/ +static void fts5HighlightFunction( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +){ + HighlightContext ctx; + int rc; + int iCol; + + if( nVal!=3 ){ + const char *zErr = "wrong number of arguments to function highlight()"; + sqlite3_result_error(pCtx, zErr, -1); + return; + } + + iCol = sqlite3_value_int(apVal[0]); + memset(&ctx, 0, sizeof(HighlightContext)); + ctx.zOpen = (const char*)sqlite3_value_text(apVal[1]); + ctx.zClose = (const char*)sqlite3_value_text(apVal[2]); + rc = pApi->xColumnText(pFts, iCol, &ctx.zIn, &ctx.nIn); + + if( ctx.zIn ){ + if( rc==SQLITE_OK ){ + rc = fts5CInstIterInit(pApi, pFts, iCol, &ctx.iter); + } + + if( rc==SQLITE_OK ){ + rc = pApi->xTokenize(pFts, ctx.zIn, ctx.nIn, (void*)&ctx,fts5HighlightCb); + } + fts5HighlightAppend(&rc, &ctx, &ctx.zIn[ctx.iOff], ctx.nIn - ctx.iOff); + + if( rc==SQLITE_OK ){ + sqlite3_result_text(pCtx, (const char*)ctx.zOut, -1, SQLITE_TRANSIENT); + } + sqlite3_free(ctx.zOut); + } + if( rc!=SQLITE_OK ){ + sqlite3_result_error_code(pCtx, rc); + } +} +/* +** End of highlight() implementation. +**************************************************************************/ + +/* +** Context object passed to the fts5SentenceFinderCb() function. +*/ +typedef struct Fts5SFinder Fts5SFinder; +struct Fts5SFinder { + int iPos; /* Current token position */ + int nFirstAlloc; /* Allocated size of aFirst[] */ + int nFirst; /* Number of entries in aFirst[] */ + int *aFirst; /* Array of first token in each sentence */ + const char *zDoc; /* Document being tokenized */ +}; + +/* +** Add an entry to the Fts5SFinder.aFirst[] array. Grow the array if +** necessary. Return SQLITE_OK if successful, or SQLITE_NOMEM if an +** error occurs. +*/ +static int fts5SentenceFinderAdd(Fts5SFinder *p, int iAdd){ + if( p->nFirstAlloc==p->nFirst ){ + int nNew = p->nFirstAlloc ? p->nFirstAlloc*2 : 64; + int *aNew; + + aNew = (int*)sqlite3_realloc(p->aFirst, nNew*sizeof(int)); + if( aNew==0 ) return SQLITE_NOMEM; + p->aFirst = aNew; + p->nFirstAlloc = nNew; + } + p->aFirst[p->nFirst++] = iAdd; + return SQLITE_OK; +} + +/* +** This function is an xTokenize() callback used by the auxiliary snippet() +** function. Its job is to identify tokens that are the first in a sentence. +** For each such token, an entry is added to the SFinder.aFirst[] array. +*/ +static int fts5SentenceFinderCb( + void *pContext, /* Pointer to HighlightContext object */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStartOff, /* Start offset of token */ + int iEndOff /* End offset of token */ +){ + int rc = SQLITE_OK; + + UNUSED_PARAM2(pToken, nToken); + UNUSED_PARAM(iEndOff); + + if( (tflags & FTS5_TOKEN_COLOCATED)==0 ){ + Fts5SFinder *p = (Fts5SFinder*)pContext; + if( p->iPos>0 ){ + int i; + char c = 0; + for(i=iStartOff-1; i>=0; i--){ + c = p->zDoc[i]; + if( c!=' ' && c!='\t' && c!='\n' && c!='\r' ) break; + } + if( i!=iStartOff-1 && (c=='.' || c==':') ){ + rc = fts5SentenceFinderAdd(p, p->iPos); + } + }else{ + rc = fts5SentenceFinderAdd(p, 0); + } + p->iPos++; + } + return rc; +} + +static int fts5SnippetScore( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + int nDocsize, /* Size of column in tokens */ + unsigned char *aSeen, /* Array with one element per query phrase */ + int iCol, /* Column to score */ + int iPos, /* Starting offset to score */ + int nToken, /* Max tokens per snippet */ + int *pnScore, /* OUT: Score */ + int *piPos /* OUT: Adjusted offset */ +){ + int rc; + int i; + int ip = 0; + int ic = 0; + int iOff = 0; + int iFirst = -1; + int nInst; + int nScore = 0; + int iLast = 0; + + rc = pApi->xInstCount(pFts, &nInst); + for(i=0; i<nInst && rc==SQLITE_OK; i++){ + rc = pApi->xInst(pFts, i, &ip, &ic, &iOff); + if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOff<(iPos+nToken) ){ + nScore += (aSeen[ip] ? 1 : 1000); + aSeen[ip] = 1; + if( iFirst<0 ) iFirst = iOff; + iLast = iOff + pApi->xPhraseSize(pFts, ip); + } + } + + *pnScore = nScore; + if( piPos ){ + int iAdj = iFirst - (nToken - (iLast-iFirst)) / 2; + if( (iAdj+nToken)>nDocsize ) iAdj = nDocsize - nToken; + if( iAdj<0 ) iAdj = 0; + *piPos = iAdj; + } + + return rc; +} + +/* +** Return the value in pVal interpreted as utf-8 text. Except, if pVal +** contains a NULL value, return a pointer to a static string zero +** bytes in length instead of a NULL pointer. +*/ +static const char *fts5ValueToText(sqlite3_value *pVal){ + const char *zRet = (const char*)sqlite3_value_text(pVal); + return zRet ? zRet : ""; +} + +/* +** Implementation of snippet() function. +*/ +static void fts5SnippetFunction( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +){ + HighlightContext ctx; + int rc = SQLITE_OK; /* Return code */ + int iCol; /* 1st argument to snippet() */ + const char *zEllips; /* 4th argument to snippet() */ + int nToken; /* 5th argument to snippet() */ + int nInst = 0; /* Number of instance matches this row */ + int i; /* Used to iterate through instances */ + int nPhrase; /* Number of phrases in query */ + unsigned char *aSeen; /* Array of "seen instance" flags */ + int iBestCol; /* Column containing best snippet */ + int iBestStart = 0; /* First token of best snippet */ + int nBestScore = 0; /* Score of best snippet */ + int nColSize = 0; /* Total size of iBestCol in tokens */ + Fts5SFinder sFinder; /* Used to find the beginnings of sentences */ + int nCol; + + if( nVal!=5 ){ + const char *zErr = "wrong number of arguments to function snippet()"; + sqlite3_result_error(pCtx, zErr, -1); + return; + } + + nCol = pApi->xColumnCount(pFts); + memset(&ctx, 0, sizeof(HighlightContext)); + iCol = sqlite3_value_int(apVal[0]); + ctx.zOpen = fts5ValueToText(apVal[1]); + ctx.zClose = fts5ValueToText(apVal[2]); + zEllips = fts5ValueToText(apVal[3]); + nToken = sqlite3_value_int(apVal[4]); + + iBestCol = (iCol>=0 ? iCol : 0); + nPhrase = pApi->xPhraseCount(pFts); + aSeen = sqlite3_malloc(nPhrase); + if( aSeen==0 ){ + rc = SQLITE_NOMEM; + } + if( rc==SQLITE_OK ){ + rc = pApi->xInstCount(pFts, &nInst); + } + + memset(&sFinder, 0, sizeof(Fts5SFinder)); + for(i=0; i<nCol; i++){ + if( iCol<0 || iCol==i ){ + int nDoc; + int nDocsize; + int ii; + sFinder.iPos = 0; + sFinder.nFirst = 0; + rc = pApi->xColumnText(pFts, i, &sFinder.zDoc, &nDoc); + if( rc!=SQLITE_OK ) break; + rc = pApi->xTokenize(pFts, + sFinder.zDoc, nDoc, (void*)&sFinder,fts5SentenceFinderCb + ); + if( rc!=SQLITE_OK ) break; + rc = pApi->xColumnSize(pFts, i, &nDocsize); + if( rc!=SQLITE_OK ) break; + + for(ii=0; rc==SQLITE_OK && ii<nInst; ii++){ + int ip, ic, io; + int iAdj; + int nScore; + int jj; + + rc = pApi->xInst(pFts, ii, &ip, &ic, &io); + if( ic!=i || rc!=SQLITE_OK ) continue; + memset(aSeen, 0, nPhrase); + rc = fts5SnippetScore(pApi, pFts, nDocsize, aSeen, i, + io, nToken, &nScore, &iAdj + ); + if( rc==SQLITE_OK && nScore>nBestScore ){ + nBestScore = nScore; + iBestCol = i; + iBestStart = iAdj; + nColSize = nDocsize; + } + + if( rc==SQLITE_OK && sFinder.nFirst && nDocsize>nToken ){ + for(jj=0; jj<(sFinder.nFirst-1); jj++){ + if( sFinder.aFirst[jj+1]>io ) break; + } + + if( sFinder.aFirst[jj]<io ){ + memset(aSeen, 0, nPhrase); + rc = fts5SnippetScore(pApi, pFts, nDocsize, aSeen, i, + sFinder.aFirst[jj], nToken, &nScore, 0 + ); + + nScore += (sFinder.aFirst[jj]==0 ? 120 : 100); + if( rc==SQLITE_OK && nScore>nBestScore ){ + nBestScore = nScore; + iBestCol = i; + iBestStart = sFinder.aFirst[jj]; + nColSize = nDocsize; + } + } + } + } + } + } + + if( rc==SQLITE_OK ){ + rc = pApi->xColumnText(pFts, iBestCol, &ctx.zIn, &ctx.nIn); + } + if( rc==SQLITE_OK && nColSize==0 ){ + rc = pApi->xColumnSize(pFts, iBestCol, &nColSize); + } + if( ctx.zIn ){ + if( rc==SQLITE_OK ){ + rc = fts5CInstIterInit(pApi, pFts, iBestCol, &ctx.iter); + } + + ctx.iRangeStart = iBestStart; + ctx.iRangeEnd = iBestStart + nToken - 1; + + if( iBestStart>0 ){ + fts5HighlightAppend(&rc, &ctx, zEllips, -1); + } + + /* Advance iterator ctx.iter so that it points to the first coalesced + ** phrase instance at or following position iBestStart. */ + while( ctx.iter.iStart>=0 && ctx.iter.iStart<iBestStart && rc==SQLITE_OK ){ + rc = fts5CInstIterNext(&ctx.iter); + } + + if( rc==SQLITE_OK ){ + rc = pApi->xTokenize(pFts, ctx.zIn, ctx.nIn, (void*)&ctx,fts5HighlightCb); + } + if( ctx.iRangeEnd>=(nColSize-1) ){ + fts5HighlightAppend(&rc, &ctx, &ctx.zIn[ctx.iOff], ctx.nIn - ctx.iOff); + }else{ + fts5HighlightAppend(&rc, &ctx, zEllips, -1); + } + } + if( rc==SQLITE_OK ){ + sqlite3_result_text(pCtx, (const char*)ctx.zOut, -1, SQLITE_TRANSIENT); + }else{ + sqlite3_result_error_code(pCtx, rc); + } + sqlite3_free(ctx.zOut); + sqlite3_free(aSeen); + sqlite3_free(sFinder.aFirst); +} + +/************************************************************************/ + +/* +** The first time the bm25() function is called for a query, an instance +** of the following structure is allocated and populated. +*/ +typedef struct Fts5Bm25Data Fts5Bm25Data; +struct Fts5Bm25Data { + int nPhrase; /* Number of phrases in query */ + double avgdl; /* Average number of tokens in each row */ + double *aIDF; /* IDF for each phrase */ + double *aFreq; /* Array used to calculate phrase freq. */ +}; + +/* +** Callback used by fts5Bm25GetData() to count the number of rows in the +** table matched by each individual phrase within the query. +*/ +static int fts5CountCb( + const Fts5ExtensionApi *pApi, + Fts5Context *pFts, + void *pUserData /* Pointer to sqlite3_int64 variable */ +){ + sqlite3_int64 *pn = (sqlite3_int64*)pUserData; + UNUSED_PARAM2(pApi, pFts); + (*pn)++; + return SQLITE_OK; +} + +/* +** Set *ppData to point to the Fts5Bm25Data object for the current query. +** If the object has not already been allocated, allocate and populate it +** now. +*/ +static int fts5Bm25GetData( + const Fts5ExtensionApi *pApi, + Fts5Context *pFts, + Fts5Bm25Data **ppData /* OUT: bm25-data object for this query */ +){ + int rc = SQLITE_OK; /* Return code */ + Fts5Bm25Data *p; /* Object to return */ + + p = pApi->xGetAuxdata(pFts, 0); + if( p==0 ){ + int nPhrase; /* Number of phrases in query */ + sqlite3_int64 nRow = 0; /* Number of rows in table */ + sqlite3_int64 nToken = 0; /* Number of tokens in table */ + int nByte; /* Bytes of space to allocate */ + int i; + + /* Allocate the Fts5Bm25Data object */ + nPhrase = pApi->xPhraseCount(pFts); + nByte = sizeof(Fts5Bm25Data) + nPhrase*2*sizeof(double); + p = (Fts5Bm25Data*)sqlite3_malloc(nByte); + if( p==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(p, 0, nByte); + p->nPhrase = nPhrase; + p->aIDF = (double*)&p[1]; + p->aFreq = &p->aIDF[nPhrase]; + } + + /* Calculate the average document length for this FTS5 table */ + if( rc==SQLITE_OK ) rc = pApi->xRowCount(pFts, &nRow); + if( rc==SQLITE_OK ) rc = pApi->xColumnTotalSize(pFts, -1, &nToken); + if( rc==SQLITE_OK ) p->avgdl = (double)nToken / (double)nRow; + + /* Calculate an IDF for each phrase in the query */ + for(i=0; rc==SQLITE_OK && i<nPhrase; i++){ + sqlite3_int64 nHit = 0; + rc = pApi->xQueryPhrase(pFts, i, (void*)&nHit, fts5CountCb); + if( rc==SQLITE_OK ){ + /* Calculate the IDF (Inverse Document Frequency) for phrase i. + ** This is done using the standard BM25 formula as found on wikipedia: + ** + ** IDF = log( (N - nHit + 0.5) / (nHit + 0.5) ) + ** + ** where "N" is the total number of documents in the set and nHit + ** is the number that contain at least one instance of the phrase + ** under consideration. + ** + ** The problem with this is that if (N < 2*nHit), the IDF is + ** negative. Which is undesirable. So the mimimum allowable IDF is + ** (1e-6) - roughly the same as a term that appears in just over + ** half of set of 5,000,000 documents. */ + double idf = log( (nRow - nHit + 0.5) / (nHit + 0.5) ); + if( idf<=0.0 ) idf = 1e-6; + p->aIDF[i] = idf; + } + } + + if( rc!=SQLITE_OK ){ + sqlite3_free(p); + }else{ + rc = pApi->xSetAuxdata(pFts, p, sqlite3_free); + } + if( rc!=SQLITE_OK ) p = 0; + } + *ppData = p; + return rc; +} + +/* +** Implementation of bm25() function. +*/ +static void fts5Bm25Function( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +){ + const double k1 = 1.2; /* Constant "k1" from BM25 formula */ + const double b = 0.75; /* Constant "b" from BM25 formula */ + int rc = SQLITE_OK; /* Error code */ + double score = 0.0; /* SQL function return value */ + Fts5Bm25Data *pData; /* Values allocated/calculated once only */ + int i; /* Iterator variable */ + int nInst = 0; /* Value returned by xInstCount() */ + double D = 0.0; /* Total number of tokens in row */ + double *aFreq = 0; /* Array of phrase freq. for current row */ + + /* Calculate the phrase frequency (symbol "f(qi,D)" in the documentation) + ** for each phrase in the query for the current row. */ + rc = fts5Bm25GetData(pApi, pFts, &pData); + if( rc==SQLITE_OK ){ + aFreq = pData->aFreq; + memset(aFreq, 0, sizeof(double) * pData->nPhrase); + rc = pApi->xInstCount(pFts, &nInst); + } + for(i=0; rc==SQLITE_OK && i<nInst; i++){ + int ip; int ic; int io; + rc = pApi->xInst(pFts, i, &ip, &ic, &io); + if( rc==SQLITE_OK ){ + double w = (nVal > ic) ? sqlite3_value_double(apVal[ic]) : 1.0; + aFreq[ip] += w; + } + } + + /* Figure out the total size of the current row in tokens. */ + if( rc==SQLITE_OK ){ + int nTok; + rc = pApi->xColumnSize(pFts, -1, &nTok); + D = (double)nTok; + } + + /* Determine the BM25 score for the current row. */ + for(i=0; rc==SQLITE_OK && i<pData->nPhrase; i++){ + score += pData->aIDF[i] * ( + ( aFreq[i] * (k1 + 1.0) ) / + ( aFreq[i] + k1 * (1 - b + b * D / pData->avgdl) ) + ); + } + + /* If no error has occurred, return the calculated score. Otherwise, + ** throw an SQL exception. */ + if( rc==SQLITE_OK ){ + sqlite3_result_double(pCtx, -1.0 * score); + }else{ + sqlite3_result_error_code(pCtx, rc); + } +} + +static int sqlite3Fts5AuxInit(fts5_api *pApi){ + struct Builtin { + const char *zFunc; /* Function name (nul-terminated) */ + void *pUserData; /* User-data pointer */ + fts5_extension_function xFunc;/* Callback function */ + void (*xDestroy)(void*); /* Destructor function */ + } aBuiltin [] = { + { "snippet", 0, fts5SnippetFunction, 0 }, + { "highlight", 0, fts5HighlightFunction, 0 }, + { "bm25", 0, fts5Bm25Function, 0 }, + }; + int rc = SQLITE_OK; /* Return code */ + int i; /* To iterate through builtin functions */ + + for(i=0; rc==SQLITE_OK && i<ArraySize(aBuiltin); i++){ + rc = pApi->xCreateFunction(pApi, + aBuiltin[i].zFunc, + aBuiltin[i].pUserData, + aBuiltin[i].xFunc, + aBuiltin[i].xDestroy + ); + } + + return rc; +} + + + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +*/ + + + +/* #include "fts5Int.h" */ + +static int sqlite3Fts5BufferSize(int *pRc, Fts5Buffer *pBuf, u32 nByte){ + if( (u32)pBuf->nSpace<nByte ){ + u32 nNew = pBuf->nSpace ? pBuf->nSpace : 64; + u8 *pNew; + while( nNew<nByte ){ + nNew = nNew * 2; + } + pNew = sqlite3_realloc(pBuf->p, nNew); + if( pNew==0 ){ + *pRc = SQLITE_NOMEM; + return 1; + }else{ + pBuf->nSpace = nNew; + pBuf->p = pNew; + } + } + return 0; +} + + +/* +** Encode value iVal as an SQLite varint and append it to the buffer object +** pBuf. If an OOM error occurs, set the error code in p. +*/ +static void sqlite3Fts5BufferAppendVarint(int *pRc, Fts5Buffer *pBuf, i64 iVal){ + if( fts5BufferGrow(pRc, pBuf, 9) ) return; + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iVal); +} + +static void sqlite3Fts5Put32(u8 *aBuf, int iVal){ + aBuf[0] = (iVal>>24) & 0x00FF; + aBuf[1] = (iVal>>16) & 0x00FF; + aBuf[2] = (iVal>> 8) & 0x00FF; + aBuf[3] = (iVal>> 0) & 0x00FF; +} + +static int sqlite3Fts5Get32(const u8 *aBuf){ + return (aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8) + aBuf[3]; +} + +/* +** Append buffer nData/pData to buffer pBuf. If an OOM error occurs, set +** the error code in p. If an error has already occurred when this function +** is called, it is a no-op. +*/ +static void sqlite3Fts5BufferAppendBlob( + int *pRc, + Fts5Buffer *pBuf, + u32 nData, + const u8 *pData +){ + assert_nc( *pRc || nData>=0 ); + if( nData ){ + if( fts5BufferGrow(pRc, pBuf, nData) ) return; + memcpy(&pBuf->p[pBuf->n], pData, nData); + pBuf->n += nData; + } +} + +/* +** Append the nul-terminated string zStr to the buffer pBuf. This function +** ensures that the byte following the buffer data is set to 0x00, even +** though this byte is not included in the pBuf->n count. +*/ +static void sqlite3Fts5BufferAppendString( + int *pRc, + Fts5Buffer *pBuf, + const char *zStr +){ + int nStr = (int)strlen(zStr); + sqlite3Fts5BufferAppendBlob(pRc, pBuf, nStr+1, (const u8*)zStr); + pBuf->n--; +} + +/* +** Argument zFmt is a printf() style format string. This function performs +** the printf() style processing, then appends the results to buffer pBuf. +** +** Like sqlite3Fts5BufferAppendString(), this function ensures that the byte +** following the buffer data is set to 0x00, even though this byte is not +** included in the pBuf->n count. +*/ +static void sqlite3Fts5BufferAppendPrintf( + int *pRc, + Fts5Buffer *pBuf, + char *zFmt, ... +){ + if( *pRc==SQLITE_OK ){ + char *zTmp; + va_list ap; + va_start(ap, zFmt); + zTmp = sqlite3_vmprintf(zFmt, ap); + va_end(ap); + + if( zTmp==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + sqlite3Fts5BufferAppendString(pRc, pBuf, zTmp); + sqlite3_free(zTmp); + } + } +} + +static char *sqlite3Fts5Mprintf(int *pRc, const char *zFmt, ...){ + char *zRet = 0; + if( *pRc==SQLITE_OK ){ + va_list ap; + va_start(ap, zFmt); + zRet = sqlite3_vmprintf(zFmt, ap); + va_end(ap); + if( zRet==0 ){ + *pRc = SQLITE_NOMEM; + } + } + return zRet; +} + + +/* +** Free any buffer allocated by pBuf. Zero the structure before returning. +*/ +static void sqlite3Fts5BufferFree(Fts5Buffer *pBuf){ + sqlite3_free(pBuf->p); + memset(pBuf, 0, sizeof(Fts5Buffer)); +} + +/* +** Zero the contents of the buffer object. But do not free the associated +** memory allocation. +*/ +static void sqlite3Fts5BufferZero(Fts5Buffer *pBuf){ + pBuf->n = 0; +} + +/* +** Set the buffer to contain nData/pData. If an OOM error occurs, leave an +** the error code in p. If an error has already occurred when this function +** is called, it is a no-op. +*/ +static void sqlite3Fts5BufferSet( + int *pRc, + Fts5Buffer *pBuf, + int nData, + const u8 *pData +){ + pBuf->n = 0; + sqlite3Fts5BufferAppendBlob(pRc, pBuf, nData, pData); +} + +static int sqlite3Fts5PoslistNext64( + const u8 *a, int n, /* Buffer containing poslist */ + int *pi, /* IN/OUT: Offset within a[] */ + i64 *piOff /* IN/OUT: Current offset */ +){ + int i = *pi; + if( i>=n ){ + /* EOF */ + *piOff = -1; + return 1; + }else{ + i64 iOff = *piOff; + int iVal; + fts5FastGetVarint32(a, i, iVal); + if( iVal==1 ){ + fts5FastGetVarint32(a, i, iVal); + iOff = ((i64)iVal) << 32; + fts5FastGetVarint32(a, i, iVal); + } + *piOff = iOff + (iVal-2); + *pi = i; + return 0; + } +} + + +/* +** Advance the iterator object passed as the only argument. Return true +** if the iterator reaches EOF, or false otherwise. +*/ +static int sqlite3Fts5PoslistReaderNext(Fts5PoslistReader *pIter){ + if( sqlite3Fts5PoslistNext64(pIter->a, pIter->n, &pIter->i, &pIter->iPos) ){ + pIter->bEof = 1; + } + return pIter->bEof; +} + +static int sqlite3Fts5PoslistReaderInit( + const u8 *a, int n, /* Poslist buffer to iterate through */ + Fts5PoslistReader *pIter /* Iterator object to initialize */ +){ + memset(pIter, 0, sizeof(*pIter)); + pIter->a = a; + pIter->n = n; + sqlite3Fts5PoslistReaderNext(pIter); + return pIter->bEof; +} + +/* +** Append position iPos to the position list being accumulated in buffer +** pBuf, which must be already be large enough to hold the new data. +** The previous position written to this list is *piPrev. *piPrev is set +** to iPos before returning. +*/ +static void sqlite3Fts5PoslistSafeAppend( + Fts5Buffer *pBuf, + i64 *piPrev, + i64 iPos +){ + static const i64 colmask = ((i64)(0x7FFFFFFF)) << 32; + if( (iPos & colmask) != (*piPrev & colmask) ){ + pBuf->p[pBuf->n++] = 1; + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos>>32)); + *piPrev = (iPos & colmask); + } + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos-*piPrev)+2); + *piPrev = iPos; +} + +static int sqlite3Fts5PoslistWriterAppend( + Fts5Buffer *pBuf, + Fts5PoslistWriter *pWriter, + i64 iPos +){ + int rc = 0; /* Initialized only to suppress erroneous warning from Clang */ + if( fts5BufferGrow(&rc, pBuf, 5+5+5) ) return rc; + sqlite3Fts5PoslistSafeAppend(pBuf, &pWriter->iPrev, iPos); + return SQLITE_OK; +} + +static void *sqlite3Fts5MallocZero(int *pRc, int nByte){ + void *pRet = 0; + if( *pRc==SQLITE_OK ){ + pRet = sqlite3_malloc(nByte); + if( pRet==0 ){ + if( nByte>0 ) *pRc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + } + } + return pRet; +} + +/* +** Return a nul-terminated copy of the string indicated by pIn. If nIn +** is non-negative, then it is the length of the string in bytes. Otherwise, +** the length of the string is determined using strlen(). +** +** It is the responsibility of the caller to eventually free the returned +** buffer using sqlite3_free(). If an OOM error occurs, NULL is returned. +*/ +static char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn){ + char *zRet = 0; + if( *pRc==SQLITE_OK ){ + if( nIn<0 ){ + nIn = (int)strlen(pIn); + } + zRet = (char*)sqlite3_malloc(nIn+1); + if( zRet ){ + memcpy(zRet, pIn, nIn); + zRet[nIn] = '\0'; + }else{ + *pRc = SQLITE_NOMEM; + } + } + return zRet; +} + + +/* +** Return true if character 't' may be part of an FTS5 bareword, or false +** otherwise. Characters that may be part of barewords: +** +** * All non-ASCII characters, +** * The 52 upper and lower case ASCII characters, and +** * The 10 integer ASCII characters. +** * The underscore character "_" (0x5F). +** * The unicode "subsitute" character (0x1A). +*/ +static int sqlite3Fts5IsBareword(char t){ + u8 aBareword[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 .. 0x0F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* 0x10 .. 0x1F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 .. 0x2F */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0x30 .. 0x3F */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 .. 0x4F */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, /* 0x50 .. 0x5F */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 .. 0x6F */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 /* 0x70 .. 0x7F */ + }; + + return (t & 0x80) || aBareword[(int)t]; +} + + +/************************************************************************* +*/ +typedef struct Fts5TermsetEntry Fts5TermsetEntry; +struct Fts5TermsetEntry { + char *pTerm; + int nTerm; + int iIdx; /* Index (main or aPrefix[] entry) */ + Fts5TermsetEntry *pNext; +}; + +struct Fts5Termset { + Fts5TermsetEntry *apHash[512]; +}; + +static int sqlite3Fts5TermsetNew(Fts5Termset **pp){ + int rc = SQLITE_OK; + *pp = sqlite3Fts5MallocZero(&rc, sizeof(Fts5Termset)); + return rc; +} + +static int sqlite3Fts5TermsetAdd( + Fts5Termset *p, + int iIdx, + const char *pTerm, int nTerm, + int *pbPresent +){ + int rc = SQLITE_OK; + *pbPresent = 0; + if( p ){ + int i; + u32 hash = 13; + Fts5TermsetEntry *pEntry; + + /* Calculate a hash value for this term. This is the same hash checksum + ** used by the fts5_hash.c module. This is not important for correct + ** operation of the module, but is necessary to ensure that some tests + ** designed to produce hash table collisions really do work. */ + for(i=nTerm-1; i>=0; i--){ + hash = (hash << 3) ^ hash ^ pTerm[i]; + } + hash = (hash << 3) ^ hash ^ iIdx; + hash = hash % ArraySize(p->apHash); + + for(pEntry=p->apHash[hash]; pEntry; pEntry=pEntry->pNext){ + if( pEntry->iIdx==iIdx + && pEntry->nTerm==nTerm + && memcmp(pEntry->pTerm, pTerm, nTerm)==0 + ){ + *pbPresent = 1; + break; + } + } + + if( pEntry==0 ){ + pEntry = sqlite3Fts5MallocZero(&rc, sizeof(Fts5TermsetEntry) + nTerm); + if( pEntry ){ + pEntry->pTerm = (char*)&pEntry[1]; + pEntry->nTerm = nTerm; + pEntry->iIdx = iIdx; + memcpy(pEntry->pTerm, pTerm, nTerm); + pEntry->pNext = p->apHash[hash]; + p->apHash[hash] = pEntry; + } + } + } + + return rc; +} + +static void sqlite3Fts5TermsetFree(Fts5Termset *p){ + if( p ){ + u32 i; + for(i=0; i<ArraySize(p->apHash); i++){ + Fts5TermsetEntry *pEntry = p->apHash[i]; + while( pEntry ){ + Fts5TermsetEntry *pDel = pEntry; + pEntry = pEntry->pNext; + sqlite3_free(pDel); + } + } + sqlite3_free(p); + } +} + +/* +** 2014 Jun 09 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is an SQLite module implementing full-text search. +*/ + + +/* #include "fts5Int.h" */ + +#define FTS5_DEFAULT_PAGE_SIZE 4050 +#define FTS5_DEFAULT_AUTOMERGE 4 +#define FTS5_DEFAULT_USERMERGE 4 +#define FTS5_DEFAULT_CRISISMERGE 16 +#define FTS5_DEFAULT_HASHSIZE (1024*1024) + +/* Maximum allowed page size */ +#define FTS5_MAX_PAGE_SIZE (128*1024) + +static int fts5_iswhitespace(char x){ + return (x==' '); +} + +static int fts5_isopenquote(char x){ + return (x=='"' || x=='\'' || x=='[' || x=='`'); +} + +/* +** Argument pIn points to a character that is part of a nul-terminated +** string. Return a pointer to the first character following *pIn in +** the string that is not a white-space character. +*/ +static const char *fts5ConfigSkipWhitespace(const char *pIn){ + const char *p = pIn; + if( p ){ + while( fts5_iswhitespace(*p) ){ p++; } + } + return p; +} + +/* +** Argument pIn points to a character that is part of a nul-terminated +** string. Return a pointer to the first character following *pIn in +** the string that is not a "bareword" character. +*/ +static const char *fts5ConfigSkipBareword(const char *pIn){ + const char *p = pIn; + while ( sqlite3Fts5IsBareword(*p) ) p++; + if( p==pIn ) p = 0; + return p; +} + +static int fts5_isdigit(char a){ + return (a>='0' && a<='9'); +} + + + +static const char *fts5ConfigSkipLiteral(const char *pIn){ + const char *p = pIn; + switch( *p ){ + case 'n': case 'N': + if( sqlite3_strnicmp("null", p, 4)==0 ){ + p = &p[4]; + }else{ + p = 0; + } + break; + + case 'x': case 'X': + p++; + if( *p=='\'' ){ + p++; + while( (*p>='a' && *p<='f') + || (*p>='A' && *p<='F') + || (*p>='0' && *p<='9') + ){ + p++; + } + if( *p=='\'' && 0==((p-pIn)%2) ){ + p++; + }else{ + p = 0; + } + }else{ + p = 0; + } + break; + + case '\'': + p++; + while( p ){ + if( *p=='\'' ){ + p++; + if( *p!='\'' ) break; + } + p++; + if( *p==0 ) p = 0; + } + break; + + default: + /* maybe a number */ + if( *p=='+' || *p=='-' ) p++; + while( fts5_isdigit(*p) ) p++; + + /* At this point, if the literal was an integer, the parse is + ** finished. Or, if it is a floating point value, it may continue + ** with either a decimal point or an 'E' character. */ + if( *p=='.' && fts5_isdigit(p[1]) ){ + p += 2; + while( fts5_isdigit(*p) ) p++; + } + if( p==pIn ) p = 0; + + break; + } + + return p; +} + +/* +** The first character of the string pointed to by argument z is guaranteed +** to be an open-quote character (see function fts5_isopenquote()). +** +** This function searches for the corresponding close-quote character within +** the string and, if found, dequotes the string in place and adds a new +** nul-terminator byte. +** +** If the close-quote is found, the value returned is the byte offset of +** the character immediately following it. Or, if the close-quote is not +** found, -1 is returned. If -1 is returned, the buffer is left in an +** undefined state. +*/ +static int fts5Dequote(char *z){ + char q; + int iIn = 1; + int iOut = 0; + q = z[0]; + + /* Set stack variable q to the close-quote character */ + assert( q=='[' || q=='\'' || q=='"' || q=='`' ); + if( q=='[' ) q = ']'; + + while( ALWAYS(z[iIn]) ){ + if( z[iIn]==q ){ + if( z[iIn+1]!=q ){ + /* Character iIn was the close quote. */ + iIn++; + break; + }else{ + /* Character iIn and iIn+1 form an escaped quote character. Skip + ** the input cursor past both and copy a single quote character + ** to the output buffer. */ + iIn += 2; + z[iOut++] = q; + } + }else{ + z[iOut++] = z[iIn++]; + } + } + + z[iOut] = '\0'; + return iIn; +} + +/* +** Convert an SQL-style quoted string into a normal string by removing +** the quote characters. The conversion is done in-place. If the +** input does not begin with a quote character, then this routine +** is a no-op. +** +** Examples: +** +** "abc" becomes abc +** 'xyz' becomes xyz +** [pqr] becomes pqr +** `mno` becomes mno +*/ +static void sqlite3Fts5Dequote(char *z){ + char quote; /* Quote character (if any ) */ + + assert( 0==fts5_iswhitespace(z[0]) ); + quote = z[0]; + if( quote=='[' || quote=='\'' || quote=='"' || quote=='`' ){ + fts5Dequote(z); + } +} + + +struct Fts5Enum { + const char *zName; + int eVal; +}; +typedef struct Fts5Enum Fts5Enum; + +static int fts5ConfigSetEnum( + const Fts5Enum *aEnum, + const char *zEnum, + int *peVal +){ + int nEnum = (int)strlen(zEnum); + int i; + int iVal = -1; + + for(i=0; aEnum[i].zName; i++){ + if( sqlite3_strnicmp(aEnum[i].zName, zEnum, nEnum)==0 ){ + if( iVal>=0 ) return SQLITE_ERROR; + iVal = aEnum[i].eVal; + } + } + + *peVal = iVal; + return iVal<0 ? SQLITE_ERROR : SQLITE_OK; +} + +/* +** Parse a "special" CREATE VIRTUAL TABLE directive and update +** configuration object pConfig as appropriate. +** +** If successful, object pConfig is updated and SQLITE_OK returned. If +** an error occurs, an SQLite error code is returned and an error message +** may be left in *pzErr. It is the responsibility of the caller to +** eventually free any such error message using sqlite3_free(). +*/ +static int fts5ConfigParseSpecial( + Fts5Global *pGlobal, + Fts5Config *pConfig, /* Configuration object to update */ + const char *zCmd, /* Special command to parse */ + const char *zArg, /* Argument to parse */ + char **pzErr /* OUT: Error message */ +){ + int rc = SQLITE_OK; + int nCmd = (int)strlen(zCmd); + if( sqlite3_strnicmp("prefix", zCmd, nCmd)==0 ){ + const int nByte = sizeof(int) * FTS5_MAX_PREFIX_INDEXES; + const char *p; + int bFirst = 1; + if( pConfig->aPrefix==0 ){ + pConfig->aPrefix = sqlite3Fts5MallocZero(&rc, nByte); + if( rc ) return rc; + } + + p = zArg; + while( 1 ){ + int nPre = 0; + + while( p[0]==' ' ) p++; + if( bFirst==0 && p[0]==',' ){ + p++; + while( p[0]==' ' ) p++; + }else if( p[0]=='\0' ){ + break; + } + if( p[0]<'0' || p[0]>'9' ){ + *pzErr = sqlite3_mprintf("malformed prefix=... directive"); + rc = SQLITE_ERROR; + break; + } + + if( pConfig->nPrefix==FTS5_MAX_PREFIX_INDEXES ){ + *pzErr = sqlite3_mprintf( + "too many prefix indexes (max %d)", FTS5_MAX_PREFIX_INDEXES + ); + rc = SQLITE_ERROR; + break; + } + + while( p[0]>='0' && p[0]<='9' && nPre<1000 ){ + nPre = nPre*10 + (p[0] - '0'); + p++; + } + + if( nPre<=0 || nPre>=1000 ){ + *pzErr = sqlite3_mprintf("prefix length out of range (max 999)"); + rc = SQLITE_ERROR; + break; + } + + pConfig->aPrefix[pConfig->nPrefix] = nPre; + pConfig->nPrefix++; + bFirst = 0; + } + assert( pConfig->nPrefix<=FTS5_MAX_PREFIX_INDEXES ); + return rc; + } + + if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ + const char *p = (const char*)zArg; + int nArg = (int)strlen(zArg) + 1; + char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); + char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); + char *pSpace = pDel; + + if( azArg && pSpace ){ + if( pConfig->pTok ){ + *pzErr = sqlite3_mprintf("multiple tokenize=... directives"); + rc = SQLITE_ERROR; + }else{ + for(nArg=0; p && *p; nArg++){ + const char *p2 = fts5ConfigSkipWhitespace(p); + if( *p2=='\'' ){ + p = fts5ConfigSkipLiteral(p2); + }else{ + p = fts5ConfigSkipBareword(p2); + } + if( p ){ + memcpy(pSpace, p2, p-p2); + azArg[nArg] = pSpace; + sqlite3Fts5Dequote(pSpace); + pSpace += (p - p2) + 1; + p = fts5ConfigSkipWhitespace(p); + } + } + if( p==0 ){ + *pzErr = sqlite3_mprintf("parse error in tokenize directive"); + rc = SQLITE_ERROR; + }else{ + rc = sqlite3Fts5GetTokenizer(pGlobal, + (const char**)azArg, nArg, &pConfig->pTok, &pConfig->pTokApi, + pzErr + ); + } + } + } + + sqlite3_free(azArg); + sqlite3_free(pDel); + return rc; + } + + if( sqlite3_strnicmp("content", zCmd, nCmd)==0 ){ + if( pConfig->eContent!=FTS5_CONTENT_NORMAL ){ + *pzErr = sqlite3_mprintf("multiple content=... directives"); + rc = SQLITE_ERROR; + }else{ + if( zArg[0] ){ + pConfig->eContent = FTS5_CONTENT_EXTERNAL; + pConfig->zContent = sqlite3Fts5Mprintf(&rc, "%Q.%Q", pConfig->zDb,zArg); + }else{ + pConfig->eContent = FTS5_CONTENT_NONE; + } + } + return rc; + } + + if( sqlite3_strnicmp("content_rowid", zCmd, nCmd)==0 ){ + if( pConfig->zContentRowid ){ + *pzErr = sqlite3_mprintf("multiple content_rowid=... directives"); + rc = SQLITE_ERROR; + }else{ + pConfig->zContentRowid = sqlite3Fts5Strndup(&rc, zArg, -1); + } + return rc; + } + + if( sqlite3_strnicmp("columnsize", zCmd, nCmd)==0 ){ + if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1]!='\0' ){ + *pzErr = sqlite3_mprintf("malformed columnsize=... directive"); + rc = SQLITE_ERROR; + }else{ + pConfig->bColumnsize = (zArg[0]=='1'); + } + return rc; + } + + if( sqlite3_strnicmp("detail", zCmd, nCmd)==0 ){ + const Fts5Enum aDetail[] = { + { "none", FTS5_DETAIL_NONE }, + { "full", FTS5_DETAIL_FULL }, + { "columns", FTS5_DETAIL_COLUMNS }, + { 0, 0 } + }; + + if( (rc = fts5ConfigSetEnum(aDetail, zArg, &pConfig->eDetail)) ){ + *pzErr = sqlite3_mprintf("malformed detail=... directive"); + } + return rc; + } + + *pzErr = sqlite3_mprintf("unrecognized option: \"%.*s\"", nCmd, zCmd); + return SQLITE_ERROR; +} + +/* +** Allocate an instance of the default tokenizer ("simple") at +** Fts5Config.pTokenizer. Return SQLITE_OK if successful, or an SQLite error +** code if an error occurs. +*/ +static int fts5ConfigDefaultTokenizer(Fts5Global *pGlobal, Fts5Config *pConfig){ + assert( pConfig->pTok==0 && pConfig->pTokApi==0 ); + return sqlite3Fts5GetTokenizer( + pGlobal, 0, 0, &pConfig->pTok, &pConfig->pTokApi, 0 + ); +} + +/* +** Gobble up the first bareword or quoted word from the input buffer zIn. +** Return a pointer to the character immediately following the last in +** the gobbled word if successful, or a NULL pointer otherwise (failed +** to find close-quote character). +** +** Before returning, set pzOut to point to a new buffer containing a +** nul-terminated, dequoted copy of the gobbled word. If the word was +** quoted, *pbQuoted is also set to 1 before returning. +** +** If *pRc is other than SQLITE_OK when this function is called, it is +** a no-op (NULL is returned). Otherwise, if an OOM occurs within this +** function, *pRc is set to SQLITE_NOMEM before returning. *pRc is *not* +** set if a parse error (failed to find close quote) occurs. +*/ +static const char *fts5ConfigGobbleWord( + int *pRc, /* IN/OUT: Error code */ + const char *zIn, /* Buffer to gobble string/bareword from */ + char **pzOut, /* OUT: malloc'd buffer containing str/bw */ + int *pbQuoted /* OUT: Set to true if dequoting required */ +){ + const char *zRet = 0; + + int nIn = (int)strlen(zIn); + char *zOut = sqlite3_malloc(nIn+1); + + assert( *pRc==SQLITE_OK ); + *pbQuoted = 0; + *pzOut = 0; + + if( zOut==0 ){ + *pRc = SQLITE_NOMEM; + }else{ + memcpy(zOut, zIn, nIn+1); + if( fts5_isopenquote(zOut[0]) ){ + int ii = fts5Dequote(zOut); + zRet = &zIn[ii]; + *pbQuoted = 1; + }else{ + zRet = fts5ConfigSkipBareword(zIn); + if( zRet ){ + zOut[zRet-zIn] = '\0'; + } + } + } + + if( zRet==0 ){ + sqlite3_free(zOut); + }else{ + *pzOut = zOut; + } + + return zRet; +} + +static int fts5ConfigParseColumn( + Fts5Config *p, + char *zCol, + char *zArg, + char **pzErr +){ + int rc = SQLITE_OK; + if( 0==sqlite3_stricmp(zCol, FTS5_RANK_NAME) + || 0==sqlite3_stricmp(zCol, FTS5_ROWID_NAME) + ){ + *pzErr = sqlite3_mprintf("reserved fts5 column name: %s", zCol); + rc = SQLITE_ERROR; + }else if( zArg ){ + if( 0==sqlite3_stricmp(zArg, "unindexed") ){ + p->abUnindexed[p->nCol] = 1; + }else{ + *pzErr = sqlite3_mprintf("unrecognized column option: %s", zArg); + rc = SQLITE_ERROR; + } + } + + p->azCol[p->nCol++] = zCol; + return rc; +} + +/* +** Populate the Fts5Config.zContentExprlist string. +*/ +static int fts5ConfigMakeExprlist(Fts5Config *p){ + int i; + int rc = SQLITE_OK; + Fts5Buffer buf = {0, 0, 0}; + + sqlite3Fts5BufferAppendPrintf(&rc, &buf, "T.%Q", p->zContentRowid); + if( p->eContent!=FTS5_CONTENT_NONE ){ + for(i=0; i<p->nCol; i++){ + if( p->eContent==FTS5_CONTENT_EXTERNAL ){ + sqlite3Fts5BufferAppendPrintf(&rc, &buf, ", T.%Q", p->azCol[i]); + }else{ + sqlite3Fts5BufferAppendPrintf(&rc, &buf, ", T.c%d", i); + } + } + } + + assert( p->zContentExprlist==0 ); + p->zContentExprlist = (char*)buf.p; + return rc; +} + +/* +** Arguments nArg/azArg contain the string arguments passed to the xCreate +** or xConnect method of the virtual table. This function attempts to +** allocate an instance of Fts5Config containing the results of parsing +** those arguments. +** +** If successful, SQLITE_OK is returned and *ppOut is set to point to the +** new Fts5Config object. If an error occurs, an SQLite error code is +** returned, *ppOut is set to NULL and an error message may be left in +** *pzErr. It is the responsibility of the caller to eventually free any +** such error message using sqlite3_free(). +*/ +static int sqlite3Fts5ConfigParse( + Fts5Global *pGlobal, + sqlite3 *db, + int nArg, /* Number of arguments */ + const char **azArg, /* Array of nArg CREATE VIRTUAL TABLE args */ + Fts5Config **ppOut, /* OUT: Results of parse */ + char **pzErr /* OUT: Error message */ +){ + int rc = SQLITE_OK; /* Return code */ + Fts5Config *pRet; /* New object to return */ + int i; + int nByte; + + *ppOut = pRet = (Fts5Config*)sqlite3_malloc(sizeof(Fts5Config)); + if( pRet==0 ) return SQLITE_NOMEM; + memset(pRet, 0, sizeof(Fts5Config)); + pRet->db = db; + pRet->iCookie = -1; + + nByte = nArg * (sizeof(char*) + sizeof(u8)); + pRet->azCol = (char**)sqlite3Fts5MallocZero(&rc, nByte); + pRet->abUnindexed = (u8*)&pRet->azCol[nArg]; + pRet->zDb = sqlite3Fts5Strndup(&rc, azArg[1], -1); + pRet->zName = sqlite3Fts5Strndup(&rc, azArg[2], -1); + pRet->bColumnsize = 1; + pRet->eDetail = FTS5_DETAIL_FULL; +#ifdef SQLITE_DEBUG + pRet->bPrefixIndex = 1; +#endif + if( rc==SQLITE_OK && sqlite3_stricmp(pRet->zName, FTS5_RANK_NAME)==0 ){ + *pzErr = sqlite3_mprintf("reserved fts5 table name: %s", pRet->zName); + rc = SQLITE_ERROR; + } + + for(i=3; rc==SQLITE_OK && i<nArg; i++){ + const char *zOrig = azArg[i]; + const char *z; + char *zOne = 0; + char *zTwo = 0; + int bOption = 0; + int bMustBeCol = 0; + + z = fts5ConfigGobbleWord(&rc, zOrig, &zOne, &bMustBeCol); + z = fts5ConfigSkipWhitespace(z); + if( z && *z=='=' ){ + bOption = 1; + z++; + if( bMustBeCol ) z = 0; + } + z = fts5ConfigSkipWhitespace(z); + if( z && z[0] ){ + int bDummy; + z = fts5ConfigGobbleWord(&rc, z, &zTwo, &bDummy); + if( z && z[0] ) z = 0; + } + + if( rc==SQLITE_OK ){ + if( z==0 ){ + *pzErr = sqlite3_mprintf("parse error in \"%s\"", zOrig); + rc = SQLITE_ERROR; + }else{ + if( bOption ){ + rc = fts5ConfigParseSpecial(pGlobal, pRet, zOne, zTwo?zTwo:"", pzErr); + }else{ + rc = fts5ConfigParseColumn(pRet, zOne, zTwo, pzErr); + zOne = 0; + } + } + } + + sqlite3_free(zOne); + sqlite3_free(zTwo); + } + + /* If a tokenizer= option was successfully parsed, the tokenizer has + ** already been allocated. Otherwise, allocate an instance of the default + ** tokenizer (unicode61) now. */ + if( rc==SQLITE_OK && pRet->pTok==0 ){ + rc = fts5ConfigDefaultTokenizer(pGlobal, pRet); + } + + /* If no zContent option was specified, fill in the default values. */ + if( rc==SQLITE_OK && pRet->zContent==0 ){ + const char *zTail = 0; + assert( pRet->eContent==FTS5_CONTENT_NORMAL + || pRet->eContent==FTS5_CONTENT_NONE + ); + if( pRet->eContent==FTS5_CONTENT_NORMAL ){ + zTail = "content"; + }else if( pRet->bColumnsize ){ + zTail = "docsize"; + } + + if( zTail ){ + pRet->zContent = sqlite3Fts5Mprintf( + &rc, "%Q.'%q_%s'", pRet->zDb, pRet->zName, zTail + ); + } + } + + if( rc==SQLITE_OK && pRet->zContentRowid==0 ){ + pRet->zContentRowid = sqlite3Fts5Strndup(&rc, "rowid", -1); + } + + /* Formulate the zContentExprlist text */ + if( rc==SQLITE_OK ){ + rc = fts5ConfigMakeExprlist(pRet); + } + + if( rc!=SQLITE_OK ){ + sqlite3Fts5ConfigFree(pRet); + *ppOut = 0; + } + return rc; +} + +/* +** Free the configuration object passed as the only argument. +*/ +static void sqlite3Fts5ConfigFree(Fts5Config *pConfig){ + if( pConfig ){ + int i; + if( pConfig->pTok ){ + pConfig->pTokApi->xDelete(pConfig->pTok); + } + sqlite3_free(pConfig->zDb); + sqlite3_free(pConfig->zName); + for(i=0; i<pConfig->nCol; i++){ + sqlite3_free(pConfig->azCol[i]); + } + sqlite3_free(pConfig->azCol); + sqlite3_free(pConfig->aPrefix); + sqlite3_free(pConfig->zRank); + sqlite3_free(pConfig->zRankArgs); + sqlite3_free(pConfig->zContent); + sqlite3_free(pConfig->zContentRowid); + sqlite3_free(pConfig->zContentExprlist); + sqlite3_free(pConfig); + } +} + +/* +** Call sqlite3_declare_vtab() based on the contents of the configuration +** object passed as the only argument. Return SQLITE_OK if successful, or +** an SQLite error code if an error occurs. +*/ +static int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig){ + int i; + int rc = SQLITE_OK; + char *zSql; + + zSql = sqlite3Fts5Mprintf(&rc, "CREATE TABLE x("); + for(i=0; zSql && i<pConfig->nCol; i++){ + const char *zSep = (i==0?"":", "); + zSql = sqlite3Fts5Mprintf(&rc, "%z%s%Q", zSql, zSep, pConfig->azCol[i]); + } + zSql = sqlite3Fts5Mprintf(&rc, "%z, %Q HIDDEN, %s HIDDEN)", + zSql, pConfig->zName, FTS5_RANK_NAME + ); + + assert( zSql || rc==SQLITE_NOMEM ); + if( zSql ){ + rc = sqlite3_declare_vtab(pConfig->db, zSql); + sqlite3_free(zSql); + } + + return rc; +} + +/* +** Tokenize the text passed via the second and third arguments. +** +** The callback is invoked once for each token in the input text. The +** arguments passed to it are, in order: +** +** void *pCtx // Copy of 4th argument to sqlite3Fts5Tokenize() +** const char *pToken // Pointer to buffer containing token +** int nToken // Size of token in bytes +** int iStart // Byte offset of start of token within input text +** int iEnd // Byte offset of end of token within input text +** int iPos // Position of token in input (first token is 0) +** +** If the callback returns a non-zero value the tokenization is abandoned +** and no further callbacks are issued. +** +** This function returns SQLITE_OK if successful or an SQLite error code +** if an error occurs. If the tokenization was abandoned early because +** the callback returned SQLITE_DONE, this is not an error and this function +** still returns SQLITE_OK. Or, if the tokenization was abandoned early +** because the callback returned another non-zero value, it is assumed +** to be an SQLite error code and returned to the caller. +*/ +static int sqlite3Fts5Tokenize( + Fts5Config *pConfig, /* FTS5 Configuration object */ + int flags, /* FTS5_TOKENIZE_* flags */ + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ +){ + if( pText==0 ) return SQLITE_OK; + return pConfig->pTokApi->xTokenize( + pConfig->pTok, pCtx, flags, pText, nText, xToken + ); +} + +/* +** Argument pIn points to the first character in what is expected to be +** a comma-separated list of SQL literals followed by a ')' character. +** If it actually is this, return a pointer to the ')'. Otherwise, return +** NULL to indicate a parse error. +*/ +static const char *fts5ConfigSkipArgs(const char *pIn){ + const char *p = pIn; + + while( 1 ){ + p = fts5ConfigSkipWhitespace(p); + p = fts5ConfigSkipLiteral(p); + p = fts5ConfigSkipWhitespace(p); + if( p==0 || *p==')' ) break; + if( *p!=',' ){ + p = 0; + break; + } + p++; + } + + return p; +} + +/* +** Parameter zIn contains a rank() function specification. The format of +** this is: +** +** + Bareword (function name) +** + Open parenthesis - "(" +** + Zero or more SQL literals in a comma separated list +** + Close parenthesis - ")" +*/ +static int sqlite3Fts5ConfigParseRank( + const char *zIn, /* Input string */ + char **pzRank, /* OUT: Rank function name */ + char **pzRankArgs /* OUT: Rank function arguments */ +){ + const char *p = zIn; + const char *pRank; + char *zRank = 0; + char *zRankArgs = 0; + int rc = SQLITE_OK; + + *pzRank = 0; + *pzRankArgs = 0; + + if( p==0 ){ + rc = SQLITE_ERROR; + }else{ + p = fts5ConfigSkipWhitespace(p); + pRank = p; + p = fts5ConfigSkipBareword(p); + + if( p ){ + zRank = sqlite3Fts5MallocZero(&rc, 1 + p - pRank); + if( zRank ) memcpy(zRank, pRank, p-pRank); + }else{ + rc = SQLITE_ERROR; + } + + if( rc==SQLITE_OK ){ + p = fts5ConfigSkipWhitespace(p); + if( *p!='(' ) rc = SQLITE_ERROR; + p++; + } + if( rc==SQLITE_OK ){ + const char *pArgs; + p = fts5ConfigSkipWhitespace(p); + pArgs = p; + if( *p!=')' ){ + p = fts5ConfigSkipArgs(p); + if( p==0 ){ + rc = SQLITE_ERROR; + }else{ + zRankArgs = sqlite3Fts5MallocZero(&rc, 1 + p - pArgs); + if( zRankArgs ) memcpy(zRankArgs, pArgs, p-pArgs); + } + } + } + } + + if( rc!=SQLITE_OK ){ + sqlite3_free(zRank); + assert( zRankArgs==0 ); + }else{ + *pzRank = zRank; + *pzRankArgs = zRankArgs; + } + return rc; +} + +static int sqlite3Fts5ConfigSetValue( + Fts5Config *pConfig, + const char *zKey, + sqlite3_value *pVal, + int *pbBadkey +){ + int rc = SQLITE_OK; + + if( 0==sqlite3_stricmp(zKey, "pgsz") ){ + int pgsz = 0; + if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ + pgsz = sqlite3_value_int(pVal); + } + if( pgsz<=0 || pgsz>FTS5_MAX_PAGE_SIZE ){ + *pbBadkey = 1; + }else{ + pConfig->pgsz = pgsz; + } + } + + else if( 0==sqlite3_stricmp(zKey, "hashsize") ){ + int nHashSize = -1; + if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ + nHashSize = sqlite3_value_int(pVal); + } + if( nHashSize<=0 ){ + *pbBadkey = 1; + }else{ + pConfig->nHashSize = nHashSize; + } + } + + else if( 0==sqlite3_stricmp(zKey, "automerge") ){ + int nAutomerge = -1; + if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ + nAutomerge = sqlite3_value_int(pVal); + } + if( nAutomerge<0 || nAutomerge>64 ){ + *pbBadkey = 1; + }else{ + if( nAutomerge==1 ) nAutomerge = FTS5_DEFAULT_AUTOMERGE; + pConfig->nAutomerge = nAutomerge; + } + } + + else if( 0==sqlite3_stricmp(zKey, "usermerge") ){ + int nUsermerge = -1; + if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ + nUsermerge = sqlite3_value_int(pVal); + } + if( nUsermerge<2 || nUsermerge>16 ){ + *pbBadkey = 1; + }else{ + pConfig->nUsermerge = nUsermerge; + } + } + + else if( 0==sqlite3_stricmp(zKey, "crisismerge") ){ + int nCrisisMerge = -1; + if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ + nCrisisMerge = sqlite3_value_int(pVal); + } + if( nCrisisMerge<0 ){ + *pbBadkey = 1; + }else{ + if( nCrisisMerge<=1 ) nCrisisMerge = FTS5_DEFAULT_CRISISMERGE; + pConfig->nCrisisMerge = nCrisisMerge; + } + } + + else if( 0==sqlite3_stricmp(zKey, "rank") ){ + const char *zIn = (const char*)sqlite3_value_text(pVal); + char *zRank; + char *zRankArgs; + rc = sqlite3Fts5ConfigParseRank(zIn, &zRank, &zRankArgs); + if( rc==SQLITE_OK ){ + sqlite3_free(pConfig->zRank); + sqlite3_free(pConfig->zRankArgs); + pConfig->zRank = zRank; + pConfig->zRankArgs = zRankArgs; + }else if( rc==SQLITE_ERROR ){ + rc = SQLITE_OK; + *pbBadkey = 1; + } + }else{ + *pbBadkey = 1; + } + return rc; +} + +/* +** Load the contents of the %_config table into memory. +*/ +static int sqlite3Fts5ConfigLoad(Fts5Config *pConfig, int iCookie){ + const char *zSelect = "SELECT k, v FROM %Q.'%q_config'"; + char *zSql; + sqlite3_stmt *p = 0; + int rc = SQLITE_OK; + int iVersion = 0; + + /* Set default values */ + pConfig->pgsz = FTS5_DEFAULT_PAGE_SIZE; + pConfig->nAutomerge = FTS5_DEFAULT_AUTOMERGE; + pConfig->nUsermerge = FTS5_DEFAULT_USERMERGE; + pConfig->nCrisisMerge = FTS5_DEFAULT_CRISISMERGE; + pConfig->nHashSize = FTS5_DEFAULT_HASHSIZE; + + zSql = sqlite3Fts5Mprintf(&rc, zSelect, pConfig->zDb, pConfig->zName); + if( zSql ){ + rc = sqlite3_prepare_v2(pConfig->db, zSql, -1, &p, 0); + sqlite3_free(zSql); + } + + assert( rc==SQLITE_OK || p==0 ); + if( rc==SQLITE_OK ){ + while( SQLITE_ROW==sqlite3_step(p) ){ + const char *zK = (const char*)sqlite3_column_text(p, 0); + sqlite3_value *pVal = sqlite3_column_value(p, 1); + if( 0==sqlite3_stricmp(zK, "version") ){ + iVersion = sqlite3_value_int(pVal); + }else{ + int bDummy = 0; + sqlite3Fts5ConfigSetValue(pConfig, zK, pVal, &bDummy); + } + } + rc = sqlite3_finalize(p); + } + + if( rc==SQLITE_OK && iVersion!=FTS5_CURRENT_VERSION ){ + rc = SQLITE_ERROR; + if( pConfig->pzErrmsg ){ + assert( 0==*pConfig->pzErrmsg ); + *pConfig->pzErrmsg = sqlite3_mprintf( + "invalid fts5 file format (found %d, expected %d) - run 'rebuild'", + iVersion, FTS5_CURRENT_VERSION + ); + } + } + + if( rc==SQLITE_OK ){ + pConfig->iCookie = iCookie; + } + return rc; +} + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +*/ + + + +/* #include "fts5Int.h" */ +/* #include "fts5parse.h" */ + +/* +** All token types in the generated fts5parse.h file are greater than 0. +*/ +#define FTS5_EOF 0 + +#define FTS5_LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) + +typedef struct Fts5ExprTerm Fts5ExprTerm; + +/* +** Functions generated by lemon from fts5parse.y. +*/ +static void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(u64)); +static void sqlite3Fts5ParserFree(void*, void (*freeProc)(void*)); +static void sqlite3Fts5Parser(void*, int, Fts5Token, Fts5Parse*); +#ifndef NDEBUG +/* #include <stdio.h> */ +static void sqlite3Fts5ParserTrace(FILE*, char*); +#endif + + +struct Fts5Expr { + Fts5Index *pIndex; + Fts5Config *pConfig; + Fts5ExprNode *pRoot; + int bDesc; /* Iterate in descending rowid order */ + int nPhrase; /* Number of phrases in expression */ + Fts5ExprPhrase **apExprPhrase; /* Pointers to phrase objects */ +}; + +/* +** eType: +** Expression node type. Always one of: +** +** FTS5_AND (nChild, apChild valid) +** FTS5_OR (nChild, apChild valid) +** FTS5_NOT (nChild, apChild valid) +** FTS5_STRING (pNear valid) +** FTS5_TERM (pNear valid) +*/ +struct Fts5ExprNode { + int eType; /* Node type */ + int bEof; /* True at EOF */ + int bNomatch; /* True if entry is not a match */ + + /* Next method for this node. */ + int (*xNext)(Fts5Expr*, Fts5ExprNode*, int, i64); + + i64 iRowid; /* Current rowid */ + Fts5ExprNearset *pNear; /* For FTS5_STRING - cluster of phrases */ + + /* Child nodes. For a NOT node, this array always contains 2 entries. For + ** AND or OR nodes, it contains 2 or more entries. */ + int nChild; /* Number of child nodes */ + Fts5ExprNode *apChild[1]; /* Array of child nodes */ +}; + +#define Fts5NodeIsString(p) ((p)->eType==FTS5_TERM || (p)->eType==FTS5_STRING) + +/* +** Invoke the xNext method of an Fts5ExprNode object. This macro should be +** used as if it has the same signature as the xNext() methods themselves. +*/ +#define fts5ExprNodeNext(a,b,c,d) (b)->xNext((a), (b), (c), (d)) + +/* +** An instance of the following structure represents a single search term +** or term prefix. +*/ +struct Fts5ExprTerm { + u8 bPrefix; /* True for a prefix term */ + u8 bFirst; /* True if token must be first in column */ + char *zTerm; /* nul-terminated term */ + Fts5IndexIter *pIter; /* Iterator for this term */ + Fts5ExprTerm *pSynonym; /* Pointer to first in list of synonyms */ +}; + +/* +** A phrase. One or more terms that must appear in a contiguous sequence +** within a document for it to match. +*/ +struct Fts5ExprPhrase { + Fts5ExprNode *pNode; /* FTS5_STRING node this phrase is part of */ + Fts5Buffer poslist; /* Current position list */ + int nTerm; /* Number of entries in aTerm[] */ + Fts5ExprTerm aTerm[1]; /* Terms that make up this phrase */ +}; + +/* +** One or more phrases that must appear within a certain token distance of +** each other within each matching document. +*/ +struct Fts5ExprNearset { + int nNear; /* NEAR parameter */ + Fts5Colset *pColset; /* Columns to search (NULL -> all columns) */ + int nPhrase; /* Number of entries in aPhrase[] array */ + Fts5ExprPhrase *apPhrase[1]; /* Array of phrase pointers */ +}; + + +/* +** Parse context. +*/ +struct Fts5Parse { + Fts5Config *pConfig; + char *zErr; + int rc; + int nPhrase; /* Size of apPhrase array */ + Fts5ExprPhrase **apPhrase; /* Array of all phrases */ + Fts5ExprNode *pExpr; /* Result of a successful parse */ +}; + +static void sqlite3Fts5ParseError(Fts5Parse *pParse, const char *zFmt, ...){ + va_list ap; + va_start(ap, zFmt); + if( pParse->rc==SQLITE_OK ){ + pParse->zErr = sqlite3_vmprintf(zFmt, ap); + pParse->rc = SQLITE_ERROR; + } + va_end(ap); +} + +static int fts5ExprIsspace(char t){ + return t==' ' || t=='\t' || t=='\n' || t=='\r'; +} + +/* +** Read the first token from the nul-terminated string at *pz. +*/ +static int fts5ExprGetToken( + Fts5Parse *pParse, + const char **pz, /* IN/OUT: Pointer into buffer */ + Fts5Token *pToken +){ + const char *z = *pz; + int tok; + + /* Skip past any whitespace */ + while( fts5ExprIsspace(*z) ) z++; + + pToken->p = z; + pToken->n = 1; + switch( *z ){ + case '(': tok = FTS5_LP; break; + case ')': tok = FTS5_RP; break; + case '{': tok = FTS5_LCP; break; + case '}': tok = FTS5_RCP; break; + case ':': tok = FTS5_COLON; break; + case ',': tok = FTS5_COMMA; break; + case '+': tok = FTS5_PLUS; break; + case '*': tok = FTS5_STAR; break; + case '-': tok = FTS5_MINUS; break; + case '^': tok = FTS5_CARET; break; + case '\0': tok = FTS5_EOF; break; + + case '"': { + const char *z2; + tok = FTS5_STRING; + + for(z2=&z[1]; 1; z2++){ + if( z2[0]=='"' ){ + z2++; + if( z2[0]!='"' ) break; + } + if( z2[0]=='\0' ){ + sqlite3Fts5ParseError(pParse, "unterminated string"); + return FTS5_EOF; + } + } + pToken->n = (z2 - z); + break; + } + + default: { + const char *z2; + if( sqlite3Fts5IsBareword(z[0])==0 ){ + sqlite3Fts5ParseError(pParse, "fts5: syntax error near \"%.1s\"", z); + return FTS5_EOF; + } + tok = FTS5_STRING; + for(z2=&z[1]; sqlite3Fts5IsBareword(*z2); z2++); + pToken->n = (z2 - z); + if( pToken->n==2 && memcmp(pToken->p, "OR", 2)==0 ) tok = FTS5_OR; + if( pToken->n==3 && memcmp(pToken->p, "NOT", 3)==0 ) tok = FTS5_NOT; + if( pToken->n==3 && memcmp(pToken->p, "AND", 3)==0 ) tok = FTS5_AND; + break; + } + } + + *pz = &pToken->p[pToken->n]; + return tok; +} + +static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc((int)t); } +static void fts5ParseFree(void *p){ sqlite3_free(p); } + +static int sqlite3Fts5ExprNew( + Fts5Config *pConfig, /* FTS5 Configuration */ + int iCol, + const char *zExpr, /* Expression text */ + Fts5Expr **ppNew, + char **pzErr +){ + Fts5Parse sParse; + Fts5Token token; + const char *z = zExpr; + int t; /* Next token type */ + void *pEngine; + Fts5Expr *pNew; + + *ppNew = 0; + *pzErr = 0; + memset(&sParse, 0, sizeof(sParse)); + pEngine = sqlite3Fts5ParserAlloc(fts5ParseAlloc); + if( pEngine==0 ){ return SQLITE_NOMEM; } + sParse.pConfig = pConfig; + + do { + t = fts5ExprGetToken(&sParse, &z, &token); + sqlite3Fts5Parser(pEngine, t, token, &sParse); + }while( sParse.rc==SQLITE_OK && t!=FTS5_EOF ); + sqlite3Fts5ParserFree(pEngine, fts5ParseFree); + + /* If the LHS of the MATCH expression was a user column, apply the + ** implicit column-filter. */ + if( iCol<pConfig->nCol && sParse.pExpr && sParse.rc==SQLITE_OK ){ + int n = sizeof(Fts5Colset); + Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&sParse.rc, n); + if( pColset ){ + pColset->nCol = 1; + pColset->aiCol[0] = iCol; + sqlite3Fts5ParseSetColset(&sParse, sParse.pExpr, pColset); + } + } + + assert( sParse.rc!=SQLITE_OK || sParse.zErr==0 ); + if( sParse.rc==SQLITE_OK ){ + *ppNew = pNew = sqlite3_malloc(sizeof(Fts5Expr)); + if( pNew==0 ){ + sParse.rc = SQLITE_NOMEM; + sqlite3Fts5ParseNodeFree(sParse.pExpr); + }else{ + if( !sParse.pExpr ){ + const int nByte = sizeof(Fts5ExprNode); + pNew->pRoot = (Fts5ExprNode*)sqlite3Fts5MallocZero(&sParse.rc, nByte); + if( pNew->pRoot ){ + pNew->pRoot->bEof = 1; + } + }else{ + pNew->pRoot = sParse.pExpr; + } + pNew->pIndex = 0; + pNew->pConfig = pConfig; + pNew->apExprPhrase = sParse.apPhrase; + pNew->nPhrase = sParse.nPhrase; + sParse.apPhrase = 0; + } + }else{ + sqlite3Fts5ParseNodeFree(sParse.pExpr); + } + + sqlite3_free(sParse.apPhrase); + *pzErr = sParse.zErr; + return sParse.rc; +} + +/* +** Free the expression node object passed as the only argument. +*/ +static void sqlite3Fts5ParseNodeFree(Fts5ExprNode *p){ + if( p ){ + int i; + for(i=0; i<p->nChild; i++){ + sqlite3Fts5ParseNodeFree(p->apChild[i]); + } + sqlite3Fts5ParseNearsetFree(p->pNear); + sqlite3_free(p); + } +} + +/* +** Free the expression object passed as the only argument. +*/ +static void sqlite3Fts5ExprFree(Fts5Expr *p){ + if( p ){ + sqlite3Fts5ParseNodeFree(p->pRoot); + sqlite3_free(p->apExprPhrase); + sqlite3_free(p); + } +} + +/* +** Argument pTerm must be a synonym iterator. Return the current rowid +** that it points to. +*/ +static i64 fts5ExprSynonymRowid(Fts5ExprTerm *pTerm, int bDesc, int *pbEof){ + i64 iRet = 0; + int bRetValid = 0; + Fts5ExprTerm *p; + + assert( pTerm->pSynonym ); + assert( bDesc==0 || bDesc==1 ); + for(p=pTerm; p; p=p->pSynonym){ + if( 0==sqlite3Fts5IterEof(p->pIter) ){ + i64 iRowid = p->pIter->iRowid; + if( bRetValid==0 || (bDesc!=(iRowid<iRet)) ){ + iRet = iRowid; + bRetValid = 1; + } + } + } + + if( pbEof && bRetValid==0 ) *pbEof = 1; + return iRet; +} + +/* +** Argument pTerm must be a synonym iterator. +*/ +static int fts5ExprSynonymList( + Fts5ExprTerm *pTerm, + i64 iRowid, + Fts5Buffer *pBuf, /* Use this buffer for space if required */ + u8 **pa, int *pn +){ + Fts5PoslistReader aStatic[4]; + Fts5PoslistReader *aIter = aStatic; + int nIter = 0; + int nAlloc = 4; + int rc = SQLITE_OK; + Fts5ExprTerm *p; + + assert( pTerm->pSynonym ); + for(p=pTerm; p; p=p->pSynonym){ + Fts5IndexIter *pIter = p->pIter; + if( sqlite3Fts5IterEof(pIter)==0 && pIter->iRowid==iRowid ){ + if( pIter->nData==0 ) continue; + if( nIter==nAlloc ){ + int nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; + Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc(nByte); + if( aNew==0 ){ + rc = SQLITE_NOMEM; + goto synonym_poslist_out; + } + memcpy(aNew, aIter, sizeof(Fts5PoslistReader) * nIter); + nAlloc = nAlloc*2; + if( aIter!=aStatic ) sqlite3_free(aIter); + aIter = aNew; + } + sqlite3Fts5PoslistReaderInit(pIter->pData, pIter->nData, &aIter[nIter]); + assert( aIter[nIter].bEof==0 ); + nIter++; + } + } + + if( nIter==1 ){ + *pa = (u8*)aIter[0].a; + *pn = aIter[0].n; + }else{ + Fts5PoslistWriter writer = {0}; + i64 iPrev = -1; + fts5BufferZero(pBuf); + while( 1 ){ + int i; + i64 iMin = FTS5_LARGEST_INT64; + for(i=0; i<nIter; i++){ + if( aIter[i].bEof==0 ){ + if( aIter[i].iPos==iPrev ){ + if( sqlite3Fts5PoslistReaderNext(&aIter[i]) ) continue; + } + if( aIter[i].iPos<iMin ){ + iMin = aIter[i].iPos; + } + } + } + if( iMin==FTS5_LARGEST_INT64 || rc!=SQLITE_OK ) break; + rc = sqlite3Fts5PoslistWriterAppend(pBuf, &writer, iMin); + iPrev = iMin; + } + if( rc==SQLITE_OK ){ + *pa = pBuf->p; + *pn = pBuf->n; + } + } + + synonym_poslist_out: + if( aIter!=aStatic ) sqlite3_free(aIter); + return rc; +} + + +/* +** All individual term iterators in pPhrase are guaranteed to be valid and +** pointing to the same rowid when this function is called. This function +** checks if the current rowid really is a match, and if so populates +** the pPhrase->poslist buffer accordingly. Output parameter *pbMatch +** is set to true if this is really a match, or false otherwise. +** +** SQLITE_OK is returned if an error occurs, or an SQLite error code +** otherwise. It is not considered an error code if the current rowid is +** not a match. +*/ +static int fts5ExprPhraseIsMatch( + Fts5ExprNode *pNode, /* Node pPhrase belongs to */ + Fts5ExprPhrase *pPhrase, /* Phrase object to initialize */ + int *pbMatch /* OUT: Set to true if really a match */ +){ + Fts5PoslistWriter writer = {0}; + Fts5PoslistReader aStatic[4]; + Fts5PoslistReader *aIter = aStatic; + int i; + int rc = SQLITE_OK; + int bFirst = pPhrase->aTerm[0].bFirst; + + fts5BufferZero(&pPhrase->poslist); + + /* If the aStatic[] array is not large enough, allocate a large array + ** using sqlite3_malloc(). This approach could be improved upon. */ + if( pPhrase->nTerm>ArraySize(aStatic) ){ + int nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; + aIter = (Fts5PoslistReader*)sqlite3_malloc(nByte); + if( !aIter ) return SQLITE_NOMEM; + } + memset(aIter, 0, sizeof(Fts5PoslistReader) * pPhrase->nTerm); + + /* Initialize a term iterator for each term in the phrase */ + for(i=0; i<pPhrase->nTerm; i++){ + Fts5ExprTerm *pTerm = &pPhrase->aTerm[i]; + int n = 0; + int bFlag = 0; + u8 *a = 0; + if( pTerm->pSynonym ){ + Fts5Buffer buf = {0, 0, 0}; + rc = fts5ExprSynonymList(pTerm, pNode->iRowid, &buf, &a, &n); + if( rc ){ + sqlite3_free(a); + goto ismatch_out; + } + if( a==buf.p ) bFlag = 1; + }else{ + a = (u8*)pTerm->pIter->pData; + n = pTerm->pIter->nData; + } + sqlite3Fts5PoslistReaderInit(a, n, &aIter[i]); + aIter[i].bFlag = (u8)bFlag; + if( aIter[i].bEof ) goto ismatch_out; + } + + while( 1 ){ + int bMatch; + i64 iPos = aIter[0].iPos; + do { + bMatch = 1; + for(i=0; i<pPhrase->nTerm; i++){ + Fts5PoslistReader *pPos = &aIter[i]; + i64 iAdj = iPos + i; + if( pPos->iPos!=iAdj ){ + bMatch = 0; + while( pPos->iPos<iAdj ){ + if( sqlite3Fts5PoslistReaderNext(pPos) ) goto ismatch_out; + } + if( pPos->iPos>iAdj ) iPos = pPos->iPos-i; + } + } + }while( bMatch==0 ); + + /* Append position iPos to the output */ + if( bFirst==0 || FTS5_POS2OFFSET(iPos)==0 ){ + rc = sqlite3Fts5PoslistWriterAppend(&pPhrase->poslist, &writer, iPos); + if( rc!=SQLITE_OK ) goto ismatch_out; + } + + for(i=0; i<pPhrase->nTerm; i++){ + if( sqlite3Fts5PoslistReaderNext(&aIter[i]) ) goto ismatch_out; + } + } + + ismatch_out: + *pbMatch = (pPhrase->poslist.n>0); + for(i=0; i<pPhrase->nTerm; i++){ + if( aIter[i].bFlag ) sqlite3_free((u8*)aIter[i].a); + } + if( aIter!=aStatic ) sqlite3_free(aIter); + return rc; +} + +typedef struct Fts5LookaheadReader Fts5LookaheadReader; +struct Fts5LookaheadReader { + const u8 *a; /* Buffer containing position list */ + int n; /* Size of buffer a[] in bytes */ + int i; /* Current offset in position list */ + i64 iPos; /* Current position */ + i64 iLookahead; /* Next position */ +}; + +#define FTS5_LOOKAHEAD_EOF (((i64)1) << 62) + +static int fts5LookaheadReaderNext(Fts5LookaheadReader *p){ + p->iPos = p->iLookahead; + if( sqlite3Fts5PoslistNext64(p->a, p->n, &p->i, &p->iLookahead) ){ + p->iLookahead = FTS5_LOOKAHEAD_EOF; + } + return (p->iPos==FTS5_LOOKAHEAD_EOF); +} + +static int fts5LookaheadReaderInit( + const u8 *a, int n, /* Buffer to read position list from */ + Fts5LookaheadReader *p /* Iterator object to initialize */ +){ + memset(p, 0, sizeof(Fts5LookaheadReader)); + p->a = a; + p->n = n; + fts5LookaheadReaderNext(p); + return fts5LookaheadReaderNext(p); +} + +typedef struct Fts5NearTrimmer Fts5NearTrimmer; +struct Fts5NearTrimmer { + Fts5LookaheadReader reader; /* Input iterator */ + Fts5PoslistWriter writer; /* Writer context */ + Fts5Buffer *pOut; /* Output poslist */ +}; + +/* +** The near-set object passed as the first argument contains more than +** one phrase. All phrases currently point to the same row. The +** Fts5ExprPhrase.poslist buffers are populated accordingly. This function +** tests if the current row contains instances of each phrase sufficiently +** close together to meet the NEAR constraint. Non-zero is returned if it +** does, or zero otherwise. +** +** If in/out parameter (*pRc) is set to other than SQLITE_OK when this +** function is called, it is a no-op. Or, if an error (e.g. SQLITE_NOMEM) +** occurs within this function (*pRc) is set accordingly before returning. +** The return value is undefined in both these cases. +** +** If no error occurs and non-zero (a match) is returned, the position-list +** of each phrase object is edited to contain only those entries that +** meet the constraint before returning. +*/ +static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){ + Fts5NearTrimmer aStatic[4]; + Fts5NearTrimmer *a = aStatic; + Fts5ExprPhrase **apPhrase = pNear->apPhrase; + + int i; + int rc = *pRc; + int bMatch; + + assert( pNear->nPhrase>1 ); + + /* If the aStatic[] array is not large enough, allocate a large array + ** using sqlite3_malloc(). This approach could be improved upon. */ + if( pNear->nPhrase>ArraySize(aStatic) ){ + int nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; + a = (Fts5NearTrimmer*)sqlite3Fts5MallocZero(&rc, nByte); + }else{ + memset(aStatic, 0, sizeof(aStatic)); + } + if( rc!=SQLITE_OK ){ + *pRc = rc; + return 0; + } + + /* Initialize a lookahead iterator for each phrase. After passing the + ** buffer and buffer size to the lookaside-reader init function, zero + ** the phrase poslist buffer. The new poslist for the phrase (containing + ** the same entries as the original with some entries removed on account + ** of the NEAR constraint) is written over the original even as it is + ** being read. This is safe as the entries for the new poslist are a + ** subset of the old, so it is not possible for data yet to be read to + ** be overwritten. */ + for(i=0; i<pNear->nPhrase; i++){ + Fts5Buffer *pPoslist = &apPhrase[i]->poslist; + fts5LookaheadReaderInit(pPoslist->p, pPoslist->n, &a[i].reader); + pPoslist->n = 0; + a[i].pOut = pPoslist; + } + + while( 1 ){ + int iAdv; + i64 iMin; + i64 iMax; + + /* This block advances the phrase iterators until they point to a set of + ** entries that together comprise a match. */ + iMax = a[0].reader.iPos; + do { + bMatch = 1; + for(i=0; i<pNear->nPhrase; i++){ + Fts5LookaheadReader *pPos = &a[i].reader; + iMin = iMax - pNear->apPhrase[i]->nTerm - pNear->nNear; + if( pPos->iPos<iMin || pPos->iPos>iMax ){ + bMatch = 0; + while( pPos->iPos<iMin ){ + if( fts5LookaheadReaderNext(pPos) ) goto ismatch_out; + } + if( pPos->iPos>iMax ) iMax = pPos->iPos; + } + } + }while( bMatch==0 ); + + /* Add an entry to each output position list */ + for(i=0; i<pNear->nPhrase; i++){ + i64 iPos = a[i].reader.iPos; + Fts5PoslistWriter *pWriter = &a[i].writer; + if( a[i].pOut->n==0 || iPos!=pWriter->iPrev ){ + sqlite3Fts5PoslistWriterAppend(a[i].pOut, pWriter, iPos); + } + } + + iAdv = 0; + iMin = a[0].reader.iLookahead; + for(i=0; i<pNear->nPhrase; i++){ + if( a[i].reader.iLookahead < iMin ){ + iMin = a[i].reader.iLookahead; + iAdv = i; + } + } + if( fts5LookaheadReaderNext(&a[iAdv].reader) ) goto ismatch_out; + } + + ismatch_out: { + int bRet = a[0].pOut->n>0; + *pRc = rc; + if( a!=aStatic ) sqlite3_free(a); + return bRet; + } +} + +/* +** Advance iterator pIter until it points to a value equal to or laster +** than the initial value of *piLast. If this means the iterator points +** to a value laster than *piLast, update *piLast to the new lastest value. +** +** If the iterator reaches EOF, set *pbEof to true before returning. If +** an error occurs, set *pRc to an error code. If either *pbEof or *pRc +** are set, return a non-zero value. Otherwise, return zero. +*/ +static int fts5ExprAdvanceto( + Fts5IndexIter *pIter, /* Iterator to advance */ + int bDesc, /* True if iterator is "rowid DESC" */ + i64 *piLast, /* IN/OUT: Lastest rowid seen so far */ + int *pRc, /* OUT: Error code */ + int *pbEof /* OUT: Set to true if EOF */ +){ + i64 iLast = *piLast; + i64 iRowid; + + iRowid = pIter->iRowid; + if( (bDesc==0 && iLast>iRowid) || (bDesc && iLast<iRowid) ){ + int rc = sqlite3Fts5IterNextFrom(pIter, iLast); + if( rc || sqlite3Fts5IterEof(pIter) ){ + *pRc = rc; + *pbEof = 1; + return 1; + } + iRowid = pIter->iRowid; + assert( (bDesc==0 && iRowid>=iLast) || (bDesc==1 && iRowid<=iLast) ); + } + *piLast = iRowid; + + return 0; +} + +static int fts5ExprSynonymAdvanceto( + Fts5ExprTerm *pTerm, /* Term iterator to advance */ + int bDesc, /* True if iterator is "rowid DESC" */ + i64 *piLast, /* IN/OUT: Lastest rowid seen so far */ + int *pRc /* OUT: Error code */ +){ + int rc = SQLITE_OK; + i64 iLast = *piLast; + Fts5ExprTerm *p; + int bEof = 0; + + for(p=pTerm; rc==SQLITE_OK && p; p=p->pSynonym){ + if( sqlite3Fts5IterEof(p->pIter)==0 ){ + i64 iRowid = p->pIter->iRowid; + if( (bDesc==0 && iLast>iRowid) || (bDesc && iLast<iRowid) ){ + rc = sqlite3Fts5IterNextFrom(p->pIter, iLast); + } + } + } + + if( rc!=SQLITE_OK ){ + *pRc = rc; + bEof = 1; + }else{ + *piLast = fts5ExprSynonymRowid(pTerm, bDesc, &bEof); + } + return bEof; +} + + +static int fts5ExprNearTest( + int *pRc, + Fts5Expr *pExpr, /* Expression that pNear is a part of */ + Fts5ExprNode *pNode /* The "NEAR" node (FTS5_STRING) */ +){ + Fts5ExprNearset *pNear = pNode->pNear; + int rc = *pRc; + + if( pExpr->pConfig->eDetail!=FTS5_DETAIL_FULL ){ + Fts5ExprTerm *pTerm; + Fts5ExprPhrase *pPhrase = pNear->apPhrase[0]; + pPhrase->poslist.n = 0; + for(pTerm=&pPhrase->aTerm[0]; pTerm; pTerm=pTerm->pSynonym){ + Fts5IndexIter *pIter = pTerm->pIter; + if( sqlite3Fts5IterEof(pIter)==0 ){ + if( pIter->iRowid==pNode->iRowid && pIter->nData>0 ){ + pPhrase->poslist.n = 1; + } + } + } + return pPhrase->poslist.n; + }else{ + int i; + + /* Check that each phrase in the nearset matches the current row. + ** Populate the pPhrase->poslist buffers at the same time. If any + ** phrase is not a match, break out of the loop early. */ + for(i=0; rc==SQLITE_OK && i<pNear->nPhrase; i++){ + Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; + if( pPhrase->nTerm>1 || pPhrase->aTerm[0].pSynonym + || pNear->pColset || pPhrase->aTerm[0].bFirst + ){ + int bMatch = 0; + rc = fts5ExprPhraseIsMatch(pNode, pPhrase, &bMatch); + if( bMatch==0 ) break; + }else{ + Fts5IndexIter *pIter = pPhrase->aTerm[0].pIter; + fts5BufferSet(&rc, &pPhrase->poslist, pIter->nData, pIter->pData); + } + } + + *pRc = rc; + if( i==pNear->nPhrase && (i==1 || fts5ExprNearIsMatch(pRc, pNear)) ){ + return 1; + } + return 0; + } +} + + +/* +** Initialize all term iterators in the pNear object. If any term is found +** to match no documents at all, return immediately without initializing any +** further iterators. +** +** If an error occurs, return an SQLite error code. Otherwise, return +** SQLITE_OK. It is not considered an error if some term matches zero +** documents. +*/ +static int fts5ExprNearInitAll( + Fts5Expr *pExpr, + Fts5ExprNode *pNode +){ + Fts5ExprNearset *pNear = pNode->pNear; + int i; + + assert( pNode->bNomatch==0 ); + for(i=0; i<pNear->nPhrase; i++){ + Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; + if( pPhrase->nTerm==0 ){ + pNode->bEof = 1; + return SQLITE_OK; + }else{ + int j; + for(j=0; j<pPhrase->nTerm; j++){ + Fts5ExprTerm *pTerm = &pPhrase->aTerm[j]; + Fts5ExprTerm *p; + int bHit = 0; + + for(p=pTerm; p; p=p->pSynonym){ + int rc; + if( p->pIter ){ + sqlite3Fts5IterClose(p->pIter); + p->pIter = 0; + } + rc = sqlite3Fts5IndexQuery( + pExpr->pIndex, p->zTerm, (int)strlen(p->zTerm), + (pTerm->bPrefix ? FTS5INDEX_QUERY_PREFIX : 0) | + (pExpr->bDesc ? FTS5INDEX_QUERY_DESC : 0), + pNear->pColset, + &p->pIter + ); + assert( (rc==SQLITE_OK)==(p->pIter!=0) ); + if( rc!=SQLITE_OK ) return rc; + if( 0==sqlite3Fts5IterEof(p->pIter) ){ + bHit = 1; + } + } + + if( bHit==0 ){ + pNode->bEof = 1; + return SQLITE_OK; + } + } + } + } + + pNode->bEof = 0; + return SQLITE_OK; +} + +/* +** If pExpr is an ASC iterator, this function returns a value with the +** same sign as: +** +** (iLhs - iRhs) +** +** Otherwise, if this is a DESC iterator, the opposite is returned: +** +** (iRhs - iLhs) +*/ +static int fts5RowidCmp( + Fts5Expr *pExpr, + i64 iLhs, + i64 iRhs +){ + assert( pExpr->bDesc==0 || pExpr->bDesc==1 ); + if( pExpr->bDesc==0 ){ + if( iLhs<iRhs ) return -1; + return (iLhs > iRhs); + }else{ + if( iLhs>iRhs ) return -1; + return (iLhs < iRhs); + } +} + +static void fts5ExprSetEof(Fts5ExprNode *pNode){ + int i; + pNode->bEof = 1; + pNode->bNomatch = 0; + for(i=0; i<pNode->nChild; i++){ + fts5ExprSetEof(pNode->apChild[i]); + } +} + +static void fts5ExprNodeZeroPoslist(Fts5ExprNode *pNode){ + if( pNode->eType==FTS5_STRING || pNode->eType==FTS5_TERM ){ + Fts5ExprNearset *pNear = pNode->pNear; + int i; + for(i=0; i<pNear->nPhrase; i++){ + Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; + pPhrase->poslist.n = 0; + } + }else{ + int i; + for(i=0; i<pNode->nChild; i++){ + fts5ExprNodeZeroPoslist(pNode->apChild[i]); + } + } +} + + + +/* +** Compare the values currently indicated by the two nodes as follows: +** +** res = (*p1) - (*p2) +** +** Nodes that point to values that come later in the iteration order are +** considered to be larger. Nodes at EOF are the largest of all. +** +** This means that if the iteration order is ASC, then numerically larger +** rowids are considered larger. Or if it is the default DESC, numerically +** smaller rowids are larger. +*/ +static int fts5NodeCompare( + Fts5Expr *pExpr, + Fts5ExprNode *p1, + Fts5ExprNode *p2 +){ + if( p2->bEof ) return -1; + if( p1->bEof ) return +1; + return fts5RowidCmp(pExpr, p1->iRowid, p2->iRowid); +} + +/* +** All individual term iterators in pNear are guaranteed to be valid when +** this function is called. This function checks if all term iterators +** point to the same rowid, and if not, advances them until they do. +** If an EOF is reached before this happens, *pbEof is set to true before +** returning. +** +** SQLITE_OK is returned if an error occurs, or an SQLite error code +** otherwise. It is not considered an error code if an iterator reaches +** EOF. +*/ +static int fts5ExprNodeTest_STRING( + Fts5Expr *pExpr, /* Expression pPhrase belongs to */ + Fts5ExprNode *pNode +){ + Fts5ExprNearset *pNear = pNode->pNear; + Fts5ExprPhrase *pLeft = pNear->apPhrase[0]; + int rc = SQLITE_OK; + i64 iLast; /* Lastest rowid any iterator points to */ + int i, j; /* Phrase and token index, respectively */ + int bMatch; /* True if all terms are at the same rowid */ + const int bDesc = pExpr->bDesc; + + /* Check that this node should not be FTS5_TERM */ + assert( pNear->nPhrase>1 + || pNear->apPhrase[0]->nTerm>1 + || pNear->apPhrase[0]->aTerm[0].pSynonym + || pNear->apPhrase[0]->aTerm[0].bFirst + ); + + /* Initialize iLast, the "lastest" rowid any iterator points to. If the + ** iterator skips through rowids in the default ascending order, this means + ** the maximum rowid. Or, if the iterator is "ORDER BY rowid DESC", then it + ** means the minimum rowid. */ + if( pLeft->aTerm[0].pSynonym ){ + iLast = fts5ExprSynonymRowid(&pLeft->aTerm[0], bDesc, 0); + }else{ + iLast = pLeft->aTerm[0].pIter->iRowid; + } + + do { + bMatch = 1; + for(i=0; i<pNear->nPhrase; i++){ + Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; + for(j=0; j<pPhrase->nTerm; j++){ + Fts5ExprTerm *pTerm = &pPhrase->aTerm[j]; + if( pTerm->pSynonym ){ + i64 iRowid = fts5ExprSynonymRowid(pTerm, bDesc, 0); + if( iRowid==iLast ) continue; + bMatch = 0; + if( fts5ExprSynonymAdvanceto(pTerm, bDesc, &iLast, &rc) ){ + pNode->bNomatch = 0; + pNode->bEof = 1; + return rc; + } + }else{ + Fts5IndexIter *pIter = pPhrase->aTerm[j].pIter; + if( pIter->iRowid==iLast || pIter->bEof ) continue; + bMatch = 0; + if( fts5ExprAdvanceto(pIter, bDesc, &iLast, &rc, &pNode->bEof) ){ + return rc; + } + } + } + } + }while( bMatch==0 ); + + pNode->iRowid = iLast; + pNode->bNomatch = ((0==fts5ExprNearTest(&rc, pExpr, pNode)) && rc==SQLITE_OK); + assert( pNode->bEof==0 || pNode->bNomatch==0 ); + + return rc; +} + +/* +** Advance the first term iterator in the first phrase of pNear. Set output +** variable *pbEof to true if it reaches EOF or if an error occurs. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. +*/ +static int fts5ExprNodeNext_STRING( + Fts5Expr *pExpr, /* Expression pPhrase belongs to */ + Fts5ExprNode *pNode, /* FTS5_STRING or FTS5_TERM node */ + int bFromValid, + i64 iFrom +){ + Fts5ExprTerm *pTerm = &pNode->pNear->apPhrase[0]->aTerm[0]; + int rc = SQLITE_OK; + + pNode->bNomatch = 0; + if( pTerm->pSynonym ){ + int bEof = 1; + Fts5ExprTerm *p; + + /* Find the firstest rowid any synonym points to. */ + i64 iRowid = fts5ExprSynonymRowid(pTerm, pExpr->bDesc, 0); + + /* Advance each iterator that currently points to iRowid. Or, if iFrom + ** is valid - each iterator that points to a rowid before iFrom. */ + for(p=pTerm; p; p=p->pSynonym){ + if( sqlite3Fts5IterEof(p->pIter)==0 ){ + i64 ii = p->pIter->iRowid; + if( ii==iRowid + || (bFromValid && ii!=iFrom && (ii>iFrom)==pExpr->bDesc) + ){ + if( bFromValid ){ + rc = sqlite3Fts5IterNextFrom(p->pIter, iFrom); + }else{ + rc = sqlite3Fts5IterNext(p->pIter); + } + if( rc!=SQLITE_OK ) break; + if( sqlite3Fts5IterEof(p->pIter)==0 ){ + bEof = 0; + } + }else{ + bEof = 0; + } + } + } + + /* Set the EOF flag if either all synonym iterators are at EOF or an + ** error has occurred. */ + pNode->bEof = (rc || bEof); + }else{ + Fts5IndexIter *pIter = pTerm->pIter; + + assert( Fts5NodeIsString(pNode) ); + if( bFromValid ){ + rc = sqlite3Fts5IterNextFrom(pIter, iFrom); + }else{ + rc = sqlite3Fts5IterNext(pIter); + } + + pNode->bEof = (rc || sqlite3Fts5IterEof(pIter)); + } + + if( pNode->bEof==0 ){ + assert( rc==SQLITE_OK ); + rc = fts5ExprNodeTest_STRING(pExpr, pNode); + } + + return rc; +} + + +static int fts5ExprNodeTest_TERM( + Fts5Expr *pExpr, /* Expression that pNear is a part of */ + Fts5ExprNode *pNode /* The "NEAR" node (FTS5_TERM) */ +){ + /* As this "NEAR" object is actually a single phrase that consists + ** of a single term only, grab pointers into the poslist managed by the + ** fts5_index.c iterator object. This is much faster than synthesizing + ** a new poslist the way we have to for more complicated phrase or NEAR + ** expressions. */ + Fts5ExprPhrase *pPhrase = pNode->pNear->apPhrase[0]; + Fts5IndexIter *pIter = pPhrase->aTerm[0].pIter; + + assert( pNode->eType==FTS5_TERM ); + assert( pNode->pNear->nPhrase==1 && pPhrase->nTerm==1 ); + assert( pPhrase->aTerm[0].pSynonym==0 ); + + pPhrase->poslist.n = pIter->nData; + if( pExpr->pConfig->eDetail==FTS5_DETAIL_FULL ){ + pPhrase->poslist.p = (u8*)pIter->pData; + } + pNode->iRowid = pIter->iRowid; + pNode->bNomatch = (pPhrase->poslist.n==0); + return SQLITE_OK; +} + +/* +** xNext() method for a node of type FTS5_TERM. +*/ +static int fts5ExprNodeNext_TERM( + Fts5Expr *pExpr, + Fts5ExprNode *pNode, + int bFromValid, + i64 iFrom +){ + int rc; + Fts5IndexIter *pIter = pNode->pNear->apPhrase[0]->aTerm[0].pIter; + + assert( pNode->bEof==0 ); + if( bFromValid ){ + rc = sqlite3Fts5IterNextFrom(pIter, iFrom); + }else{ + rc = sqlite3Fts5IterNext(pIter); + } + if( rc==SQLITE_OK && sqlite3Fts5IterEof(pIter)==0 ){ + rc = fts5ExprNodeTest_TERM(pExpr, pNode); + }else{ + pNode->bEof = 1; + pNode->bNomatch = 0; + } + return rc; +} + +static void fts5ExprNodeTest_OR( + Fts5Expr *pExpr, /* Expression of which pNode is a part */ + Fts5ExprNode *pNode /* Expression node to test */ +){ + Fts5ExprNode *pNext = pNode->apChild[0]; + int i; + + for(i=1; i<pNode->nChild; i++){ + Fts5ExprNode *pChild = pNode->apChild[i]; + int cmp = fts5NodeCompare(pExpr, pNext, pChild); + if( cmp>0 || (cmp==0 && pChild->bNomatch==0) ){ + pNext = pChild; + } + } + pNode->iRowid = pNext->iRowid; + pNode->bEof = pNext->bEof; + pNode->bNomatch = pNext->bNomatch; +} + +static int fts5ExprNodeNext_OR( + Fts5Expr *pExpr, + Fts5ExprNode *pNode, + int bFromValid, + i64 iFrom +){ + int i; + i64 iLast = pNode->iRowid; + + for(i=0; i<pNode->nChild; i++){ + Fts5ExprNode *p1 = pNode->apChild[i]; + assert( p1->bEof || fts5RowidCmp(pExpr, p1->iRowid, iLast)>=0 ); + if( p1->bEof==0 ){ + if( (p1->iRowid==iLast) + || (bFromValid && fts5RowidCmp(pExpr, p1->iRowid, iFrom)<0) + ){ + int rc = fts5ExprNodeNext(pExpr, p1, bFromValid, iFrom); + if( rc!=SQLITE_OK ){ + pNode->bNomatch = 0; + return rc; + } + } + } + } + + fts5ExprNodeTest_OR(pExpr, pNode); + return SQLITE_OK; +} + +/* +** Argument pNode is an FTS5_AND node. +*/ +static int fts5ExprNodeTest_AND( + Fts5Expr *pExpr, /* Expression pPhrase belongs to */ + Fts5ExprNode *pAnd /* FTS5_AND node to advance */ +){ + int iChild; + i64 iLast = pAnd->iRowid; + int rc = SQLITE_OK; + int bMatch; + + assert( pAnd->bEof==0 ); + do { + pAnd->bNomatch = 0; + bMatch = 1; + for(iChild=0; iChild<pAnd->nChild; iChild++){ + Fts5ExprNode *pChild = pAnd->apChild[iChild]; + int cmp = fts5RowidCmp(pExpr, iLast, pChild->iRowid); + if( cmp>0 ){ + /* Advance pChild until it points to iLast or laster */ + rc = fts5ExprNodeNext(pExpr, pChild, 1, iLast); + if( rc!=SQLITE_OK ){ + pAnd->bNomatch = 0; + return rc; + } + } + + /* If the child node is now at EOF, so is the parent AND node. Otherwise, + ** the child node is guaranteed to have advanced at least as far as + ** rowid iLast. So if it is not at exactly iLast, pChild->iRowid is the + ** new lastest rowid seen so far. */ + assert( pChild->bEof || fts5RowidCmp(pExpr, iLast, pChild->iRowid)<=0 ); + if( pChild->bEof ){ + fts5ExprSetEof(pAnd); + bMatch = 1; + break; + }else if( iLast!=pChild->iRowid ){ + bMatch = 0; + iLast = pChild->iRowid; + } + + if( pChild->bNomatch ){ + pAnd->bNomatch = 1; + } + } + }while( bMatch==0 ); + + if( pAnd->bNomatch && pAnd!=pExpr->pRoot ){ + fts5ExprNodeZeroPoslist(pAnd); + } + pAnd->iRowid = iLast; + return SQLITE_OK; +} + +static int fts5ExprNodeNext_AND( + Fts5Expr *pExpr, + Fts5ExprNode *pNode, + int bFromValid, + i64 iFrom +){ + int rc = fts5ExprNodeNext(pExpr, pNode->apChild[0], bFromValid, iFrom); + if( rc==SQLITE_OK ){ + rc = fts5ExprNodeTest_AND(pExpr, pNode); + }else{ + pNode->bNomatch = 0; + } + return rc; +} + +static int fts5ExprNodeTest_NOT( + Fts5Expr *pExpr, /* Expression pPhrase belongs to */ + Fts5ExprNode *pNode /* FTS5_NOT node to advance */ +){ + int rc = SQLITE_OK; + Fts5ExprNode *p1 = pNode->apChild[0]; + Fts5ExprNode *p2 = pNode->apChild[1]; + assert( pNode->nChild==2 ); + + while( rc==SQLITE_OK && p1->bEof==0 ){ + int cmp = fts5NodeCompare(pExpr, p1, p2); + if( cmp>0 ){ + rc = fts5ExprNodeNext(pExpr, p2, 1, p1->iRowid); + cmp = fts5NodeCompare(pExpr, p1, p2); + } + assert( rc!=SQLITE_OK || cmp<=0 ); + if( cmp || p2->bNomatch ) break; + rc = fts5ExprNodeNext(pExpr, p1, 0, 0); + } + pNode->bEof = p1->bEof; + pNode->bNomatch = p1->bNomatch; + pNode->iRowid = p1->iRowid; + if( p1->bEof ){ + fts5ExprNodeZeroPoslist(p2); + } + return rc; +} + +static int fts5ExprNodeNext_NOT( + Fts5Expr *pExpr, + Fts5ExprNode *pNode, + int bFromValid, + i64 iFrom +){ + int rc = fts5ExprNodeNext(pExpr, pNode->apChild[0], bFromValid, iFrom); + if( rc==SQLITE_OK ){ + rc = fts5ExprNodeTest_NOT(pExpr, pNode); + } + if( rc!=SQLITE_OK ){ + pNode->bNomatch = 0; + } + return rc; +} + +/* +** If pNode currently points to a match, this function returns SQLITE_OK +** without modifying it. Otherwise, pNode is advanced until it does point +** to a match or EOF is reached. +*/ +static int fts5ExprNodeTest( + Fts5Expr *pExpr, /* Expression of which pNode is a part */ + Fts5ExprNode *pNode /* Expression node to test */ +){ + int rc = SQLITE_OK; + if( pNode->bEof==0 ){ + switch( pNode->eType ){ + + case FTS5_STRING: { + rc = fts5ExprNodeTest_STRING(pExpr, pNode); + break; + } + + case FTS5_TERM: { + rc = fts5ExprNodeTest_TERM(pExpr, pNode); + break; + } + + case FTS5_AND: { + rc = fts5ExprNodeTest_AND(pExpr, pNode); + break; + } + + case FTS5_OR: { + fts5ExprNodeTest_OR(pExpr, pNode); + break; + } + + default: assert( pNode->eType==FTS5_NOT ); { + rc = fts5ExprNodeTest_NOT(pExpr, pNode); + break; + } + } + } + return rc; +} + + +/* +** Set node pNode, which is part of expression pExpr, to point to the first +** match. If there are no matches, set the Node.bEof flag to indicate EOF. +** +** Return an SQLite error code if an error occurs, or SQLITE_OK otherwise. +** It is not an error if there are no matches. +*/ +static int fts5ExprNodeFirst(Fts5Expr *pExpr, Fts5ExprNode *pNode){ + int rc = SQLITE_OK; + pNode->bEof = 0; + pNode->bNomatch = 0; + + if( Fts5NodeIsString(pNode) ){ + /* Initialize all term iterators in the NEAR object. */ + rc = fts5ExprNearInitAll(pExpr, pNode); + }else if( pNode->xNext==0 ){ + pNode->bEof = 1; + }else{ + int i; + int nEof = 0; + for(i=0; i<pNode->nChild && rc==SQLITE_OK; i++){ + Fts5ExprNode *pChild = pNode->apChild[i]; + rc = fts5ExprNodeFirst(pExpr, pNode->apChild[i]); + assert( pChild->bEof==0 || pChild->bEof==1 ); + nEof += pChild->bEof; + } + pNode->iRowid = pNode->apChild[0]->iRowid; + + switch( pNode->eType ){ + case FTS5_AND: + if( nEof>0 ) fts5ExprSetEof(pNode); + break; + + case FTS5_OR: + if( pNode->nChild==nEof ) fts5ExprSetEof(pNode); + break; + + default: + assert( pNode->eType==FTS5_NOT ); + pNode->bEof = pNode->apChild[0]->bEof; + break; + } + } + + if( rc==SQLITE_OK ){ + rc = fts5ExprNodeTest(pExpr, pNode); + } + return rc; +} + + +/* +** Begin iterating through the set of documents in index pIdx matched by +** the MATCH expression passed as the first argument. If the "bDesc" +** parameter is passed a non-zero value, iteration is in descending rowid +** order. Or, if it is zero, in ascending order. +** +** If iterating in ascending rowid order (bDesc==0), the first document +** visited is that with the smallest rowid that is larger than or equal +** to parameter iFirst. Or, if iterating in ascending order (bDesc==1), +** then the first document visited must have a rowid smaller than or +** equal to iFirst. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. It +** is not considered an error if the query does not match any documents. +*/ +static int sqlite3Fts5ExprFirst(Fts5Expr *p, Fts5Index *pIdx, i64 iFirst, int bDesc){ + Fts5ExprNode *pRoot = p->pRoot; + int rc; /* Return code */ + + p->pIndex = pIdx; + p->bDesc = bDesc; + rc = fts5ExprNodeFirst(p, pRoot); + + /* If not at EOF but the current rowid occurs earlier than iFirst in + ** the iteration order, move to document iFirst or later. */ + if( rc==SQLITE_OK + && 0==pRoot->bEof + && fts5RowidCmp(p, pRoot->iRowid, iFirst)<0 + ){ + rc = fts5ExprNodeNext(p, pRoot, 1, iFirst); + } + + /* If the iterator is not at a real match, skip forward until it is. */ + while( pRoot->bNomatch ){ + assert( pRoot->bEof==0 && rc==SQLITE_OK ); + rc = fts5ExprNodeNext(p, pRoot, 0, 0); + } + return rc; +} + +/* +** Move to the next document +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. It +** is not considered an error if the query does not match any documents. +*/ +static int sqlite3Fts5ExprNext(Fts5Expr *p, i64 iLast){ + int rc; + Fts5ExprNode *pRoot = p->pRoot; + assert( pRoot->bEof==0 && pRoot->bNomatch==0 ); + do { + rc = fts5ExprNodeNext(p, pRoot, 0, 0); + assert( pRoot->bNomatch==0 || (rc==SQLITE_OK && pRoot->bEof==0) ); + }while( pRoot->bNomatch ); + if( fts5RowidCmp(p, pRoot->iRowid, iLast)>0 ){ + pRoot->bEof = 1; + } + return rc; +} + +static int sqlite3Fts5ExprEof(Fts5Expr *p){ + return p->pRoot->bEof; +} + +static i64 sqlite3Fts5ExprRowid(Fts5Expr *p){ + return p->pRoot->iRowid; +} + +static int fts5ParseStringFromToken(Fts5Token *pToken, char **pz){ + int rc = SQLITE_OK; + *pz = sqlite3Fts5Strndup(&rc, pToken->p, pToken->n); + return rc; +} + +/* +** Free the phrase object passed as the only argument. +*/ +static void fts5ExprPhraseFree(Fts5ExprPhrase *pPhrase){ + if( pPhrase ){ + int i; + for(i=0; i<pPhrase->nTerm; i++){ + Fts5ExprTerm *pSyn; + Fts5ExprTerm *pNext; + Fts5ExprTerm *pTerm = &pPhrase->aTerm[i]; + sqlite3_free(pTerm->zTerm); + sqlite3Fts5IterClose(pTerm->pIter); + for(pSyn=pTerm->pSynonym; pSyn; pSyn=pNext){ + pNext = pSyn->pSynonym; + sqlite3Fts5IterClose(pSyn->pIter); + fts5BufferFree((Fts5Buffer*)&pSyn[1]); + sqlite3_free(pSyn); + } + } + if( pPhrase->poslist.nSpace>0 ) fts5BufferFree(&pPhrase->poslist); + sqlite3_free(pPhrase); + } +} + +/* +** Set the "bFirst" flag on the first token of the phrase passed as the +** only argument. +*/ +static void sqlite3Fts5ParseSetCaret(Fts5ExprPhrase *pPhrase){ + if( pPhrase && pPhrase->nTerm ){ + pPhrase->aTerm[0].bFirst = 1; + } +} + +/* +** If argument pNear is NULL, then a new Fts5ExprNearset object is allocated +** and populated with pPhrase. Or, if pNear is not NULL, phrase pPhrase is +** appended to it and the results returned. +** +** If an OOM error occurs, both the pNear and pPhrase objects are freed and +** NULL returned. +*/ +static Fts5ExprNearset *sqlite3Fts5ParseNearset( + Fts5Parse *pParse, /* Parse context */ + Fts5ExprNearset *pNear, /* Existing nearset, or NULL */ + Fts5ExprPhrase *pPhrase /* Recently parsed phrase */ +){ + const int SZALLOC = 8; + Fts5ExprNearset *pRet = 0; + + if( pParse->rc==SQLITE_OK ){ + if( pPhrase==0 ){ + return pNear; + } + if( pNear==0 ){ + int nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); + pRet = sqlite3_malloc(nByte); + if( pRet==0 ){ + pParse->rc = SQLITE_NOMEM; + }else{ + memset(pRet, 0, nByte); + } + }else if( (pNear->nPhrase % SZALLOC)==0 ){ + int nNew = pNear->nPhrase + SZALLOC; + int nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + + pRet = (Fts5ExprNearset*)sqlite3_realloc(pNear, nByte); + if( pRet==0 ){ + pParse->rc = SQLITE_NOMEM; + } + }else{ + pRet = pNear; + } + } + + if( pRet==0 ){ + assert( pParse->rc!=SQLITE_OK ); + sqlite3Fts5ParseNearsetFree(pNear); + sqlite3Fts5ParsePhraseFree(pPhrase); + }else{ + if( pRet->nPhrase>0 ){ + Fts5ExprPhrase *pLast = pRet->apPhrase[pRet->nPhrase-1]; + assert( pLast==pParse->apPhrase[pParse->nPhrase-2] ); + if( pPhrase->nTerm==0 ){ + fts5ExprPhraseFree(pPhrase); + pRet->nPhrase--; + pParse->nPhrase--; + pPhrase = pLast; + }else if( pLast->nTerm==0 ){ + fts5ExprPhraseFree(pLast); + pParse->apPhrase[pParse->nPhrase-2] = pPhrase; + pParse->nPhrase--; + pRet->nPhrase--; + } + } + pRet->apPhrase[pRet->nPhrase++] = pPhrase; + } + return pRet; +} + +typedef struct TokenCtx TokenCtx; +struct TokenCtx { + Fts5ExprPhrase *pPhrase; + int rc; +}; + +/* +** Callback for tokenizing terms used by ParseTerm(). +*/ +static int fts5ParseTokenize( + void *pContext, /* Pointer to Fts5InsertCtx object */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Buffer containing token */ + int nToken, /* Size of token in bytes */ + int iUnused1, /* Start offset of token */ + int iUnused2 /* End offset of token */ +){ + int rc = SQLITE_OK; + const int SZALLOC = 8; + TokenCtx *pCtx = (TokenCtx*)pContext; + Fts5ExprPhrase *pPhrase = pCtx->pPhrase; + + UNUSED_PARAM2(iUnused1, iUnused2); + + /* If an error has already occurred, this is a no-op */ + if( pCtx->rc!=SQLITE_OK ) return pCtx->rc; + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; + + if( pPhrase && pPhrase->nTerm>0 && (tflags & FTS5_TOKEN_COLOCATED) ){ + Fts5ExprTerm *pSyn; + int nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; + pSyn = (Fts5ExprTerm*)sqlite3_malloc(nByte); + if( pSyn==0 ){ + rc = SQLITE_NOMEM; + }else{ + memset(pSyn, 0, nByte); + pSyn->zTerm = ((char*)pSyn) + sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer); + memcpy(pSyn->zTerm, pToken, nToken); + pSyn->pSynonym = pPhrase->aTerm[pPhrase->nTerm-1].pSynonym; + pPhrase->aTerm[pPhrase->nTerm-1].pSynonym = pSyn; + } + }else{ + Fts5ExprTerm *pTerm; + if( pPhrase==0 || (pPhrase->nTerm % SZALLOC)==0 ){ + Fts5ExprPhrase *pNew; + int nNew = SZALLOC + (pPhrase ? pPhrase->nTerm : 0); + + pNew = (Fts5ExprPhrase*)sqlite3_realloc(pPhrase, + sizeof(Fts5ExprPhrase) + sizeof(Fts5ExprTerm) * nNew + ); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + if( pPhrase==0 ) memset(pNew, 0, sizeof(Fts5ExprPhrase)); + pCtx->pPhrase = pPhrase = pNew; + pNew->nTerm = nNew - SZALLOC; + } + } + + if( rc==SQLITE_OK ){ + pTerm = &pPhrase->aTerm[pPhrase->nTerm++]; + memset(pTerm, 0, sizeof(Fts5ExprTerm)); + pTerm->zTerm = sqlite3Fts5Strndup(&rc, pToken, nToken); + } + } + + pCtx->rc = rc; + return rc; +} + + +/* +** Free the phrase object passed as the only argument. +*/ +static void sqlite3Fts5ParsePhraseFree(Fts5ExprPhrase *pPhrase){ + fts5ExprPhraseFree(pPhrase); +} + +/* +** Free the phrase object passed as the second argument. +*/ +static void sqlite3Fts5ParseNearsetFree(Fts5ExprNearset *pNear){ + if( pNear ){ + int i; + for(i=0; i<pNear->nPhrase; i++){ + fts5ExprPhraseFree(pNear->apPhrase[i]); + } + sqlite3_free(pNear->pColset); + sqlite3_free(pNear); + } +} + +static void sqlite3Fts5ParseFinished(Fts5Parse *pParse, Fts5ExprNode *p){ + assert( pParse->pExpr==0 ); + pParse->pExpr = p; +} + +/* +** This function is called by the parser to process a string token. The +** string may or may not be quoted. In any case it is tokenized and a +** phrase object consisting of all tokens returned. +*/ +static Fts5ExprPhrase *sqlite3Fts5ParseTerm( + Fts5Parse *pParse, /* Parse context */ + Fts5ExprPhrase *pAppend, /* Phrase to append to */ + Fts5Token *pToken, /* String to tokenize */ + int bPrefix /* True if there is a trailing "*" */ +){ + Fts5Config *pConfig = pParse->pConfig; + TokenCtx sCtx; /* Context object passed to callback */ + int rc; /* Tokenize return code */ + char *z = 0; + + memset(&sCtx, 0, sizeof(TokenCtx)); + sCtx.pPhrase = pAppend; + + rc = fts5ParseStringFromToken(pToken, &z); + if( rc==SQLITE_OK ){ + int flags = FTS5_TOKENIZE_QUERY | (bPrefix ? FTS5_TOKENIZE_PREFIX : 0); + int n; + sqlite3Fts5Dequote(z); + n = (int)strlen(z); + rc = sqlite3Fts5Tokenize(pConfig, flags, z, n, &sCtx, fts5ParseTokenize); + } + sqlite3_free(z); + if( rc || (rc = sCtx.rc) ){ + pParse->rc = rc; + fts5ExprPhraseFree(sCtx.pPhrase); + sCtx.pPhrase = 0; + }else{ + + if( pAppend==0 ){ + if( (pParse->nPhrase % 8)==0 ){ + int nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); + Fts5ExprPhrase **apNew; + apNew = (Fts5ExprPhrase**)sqlite3_realloc(pParse->apPhrase, nByte); + if( apNew==0 ){ + pParse->rc = SQLITE_NOMEM; + fts5ExprPhraseFree(sCtx.pPhrase); + return 0; + } + pParse->apPhrase = apNew; + } + pParse->nPhrase++; + } + + if( sCtx.pPhrase==0 ){ + /* This happens when parsing a token or quoted phrase that contains + ** no token characters at all. (e.g ... MATCH '""'). */ + sCtx.pPhrase = sqlite3Fts5MallocZero(&pParse->rc, sizeof(Fts5ExprPhrase)); + }else if( sCtx.pPhrase->nTerm ){ + sCtx.pPhrase->aTerm[sCtx.pPhrase->nTerm-1].bPrefix = (u8)bPrefix; + } + pParse->apPhrase[pParse->nPhrase-1] = sCtx.pPhrase; + } + + return sCtx.pPhrase; +} + +/* +** Create a new FTS5 expression by cloning phrase iPhrase of the +** expression passed as the second argument. +*/ +static int sqlite3Fts5ExprClonePhrase( + Fts5Expr *pExpr, + int iPhrase, + Fts5Expr **ppNew +){ + int rc = SQLITE_OK; /* Return code */ + Fts5ExprPhrase *pOrig; /* The phrase extracted from pExpr */ + Fts5Expr *pNew = 0; /* Expression to return via *ppNew */ + TokenCtx sCtx = {0,0}; /* Context object for fts5ParseTokenize */ + + pOrig = pExpr->apExprPhrase[iPhrase]; + pNew = (Fts5Expr*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Expr)); + if( rc==SQLITE_OK ){ + pNew->apExprPhrase = (Fts5ExprPhrase**)sqlite3Fts5MallocZero(&rc, + sizeof(Fts5ExprPhrase*)); + } + if( rc==SQLITE_OK ){ + pNew->pRoot = (Fts5ExprNode*)sqlite3Fts5MallocZero(&rc, + sizeof(Fts5ExprNode)); + } + if( rc==SQLITE_OK ){ + pNew->pRoot->pNear = (Fts5ExprNearset*)sqlite3Fts5MallocZero(&rc, + sizeof(Fts5ExprNearset) + sizeof(Fts5ExprPhrase*)); + } + if( rc==SQLITE_OK ){ + Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; + if( pColsetOrig ){ + int nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); + Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); + if( pColset ){ + memcpy(pColset, pColsetOrig, nByte); + } + pNew->pRoot->pNear->pColset = pColset; + } + } + + if( pOrig->nTerm ){ + int i; /* Used to iterate through phrase terms */ + for(i=0; rc==SQLITE_OK && i<pOrig->nTerm; i++){ + int tflags = 0; + Fts5ExprTerm *p; + for(p=&pOrig->aTerm[i]; p && rc==SQLITE_OK; p=p->pSynonym){ + const char *zTerm = p->zTerm; + rc = fts5ParseTokenize((void*)&sCtx, tflags, zTerm, (int)strlen(zTerm), + 0, 0); + tflags = FTS5_TOKEN_COLOCATED; + } + if( rc==SQLITE_OK ){ + sCtx.pPhrase->aTerm[i].bPrefix = pOrig->aTerm[i].bPrefix; + sCtx.pPhrase->aTerm[i].bFirst = pOrig->aTerm[i].bFirst; + } + } + }else{ + /* This happens when parsing a token or quoted phrase that contains + ** no token characters at all. (e.g ... MATCH '""'). */ + sCtx.pPhrase = sqlite3Fts5MallocZero(&rc, sizeof(Fts5ExprPhrase)); + } + + if( rc==SQLITE_OK ){ + /* All the allocations succeeded. Put the expression object together. */ + pNew->pIndex = pExpr->pIndex; + pNew->pConfig = pExpr->pConfig; + pNew->nPhrase = 1; + pNew->apExprPhrase[0] = sCtx.pPhrase; + pNew->pRoot->pNear->apPhrase[0] = sCtx.pPhrase; + pNew->pRoot->pNear->nPhrase = 1; + sCtx.pPhrase->pNode = pNew->pRoot; + + if( pOrig->nTerm==1 + && pOrig->aTerm[0].pSynonym==0 + && pOrig->aTerm[0].bFirst==0 + ){ + pNew->pRoot->eType = FTS5_TERM; + pNew->pRoot->xNext = fts5ExprNodeNext_TERM; + }else{ + pNew->pRoot->eType = FTS5_STRING; + pNew->pRoot->xNext = fts5ExprNodeNext_STRING; + } + }else{ + sqlite3Fts5ExprFree(pNew); + fts5ExprPhraseFree(sCtx.pPhrase); + pNew = 0; + } + + *ppNew = pNew; + return rc; +} + + +/* +** Token pTok has appeared in a MATCH expression where the NEAR operator +** is expected. If token pTok does not contain "NEAR", store an error +** in the pParse object. +*/ +static void sqlite3Fts5ParseNear(Fts5Parse *pParse, Fts5Token *pTok){ + if( pTok->n!=4 || memcmp("NEAR", pTok->p, 4) ){ + sqlite3Fts5ParseError( + pParse, "fts5: syntax error near \"%.*s\"", pTok->n, pTok->p + ); + } +} + +static void sqlite3Fts5ParseSetDistance( + Fts5Parse *pParse, + Fts5ExprNearset *pNear, + Fts5Token *p +){ + if( pNear ){ + int nNear = 0; + int i; + if( p->n ){ + for(i=0; i<p->n; i++){ + char c = (char)p->p[i]; + if( c<'0' || c>'9' ){ + sqlite3Fts5ParseError( + pParse, "expected integer, got \"%.*s\"", p->n, p->p + ); + return; + } + nNear = nNear * 10 + (p->p[i] - '0'); + } + }else{ + nNear = FTS5_DEFAULT_NEARDIST; + } + pNear->nNear = nNear; + } +} + +/* +** The second argument passed to this function may be NULL, or it may be +** an existing Fts5Colset object. This function returns a pointer to +** a new colset object containing the contents of (p) with new value column +** number iCol appended. +** +** If an OOM error occurs, store an error code in pParse and return NULL. +** The old colset object (if any) is not freed in this case. +*/ +static Fts5Colset *fts5ParseColset( + Fts5Parse *pParse, /* Store SQLITE_NOMEM here if required */ + Fts5Colset *p, /* Existing colset object */ + int iCol /* New column to add to colset object */ +){ + int nCol = p ? p->nCol : 0; /* Num. columns already in colset object */ + Fts5Colset *pNew; /* New colset object to return */ + + assert( pParse->rc==SQLITE_OK ); + assert( iCol>=0 && iCol<pParse->pConfig->nCol ); + + pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol); + if( pNew==0 ){ + pParse->rc = SQLITE_NOMEM; + }else{ + int *aiCol = pNew->aiCol; + int i, j; + for(i=0; i<nCol; i++){ + if( aiCol[i]==iCol ) return pNew; + if( aiCol[i]>iCol ) break; + } + for(j=nCol; j>i; j--){ + aiCol[j] = aiCol[j-1]; + } + aiCol[i] = iCol; + pNew->nCol = nCol+1; + +#ifndef NDEBUG + /* Check that the array is in order and contains no duplicate entries. */ + for(i=1; i<pNew->nCol; i++) assert( pNew->aiCol[i]>pNew->aiCol[i-1] ); +#endif + } + + return pNew; +} + +/* +** Allocate and return an Fts5Colset object specifying the inverse of +** the colset passed as the second argument. Free the colset passed +** as the second argument before returning. +*/ +static Fts5Colset *sqlite3Fts5ParseColsetInvert(Fts5Parse *pParse, Fts5Colset *p){ + Fts5Colset *pRet; + int nCol = pParse->pConfig->nCol; + + pRet = (Fts5Colset*)sqlite3Fts5MallocZero(&pParse->rc, + sizeof(Fts5Colset) + sizeof(int)*nCol + ); + if( pRet ){ + int i; + int iOld = 0; + for(i=0; i<nCol; i++){ + if( iOld>=p->nCol || p->aiCol[iOld]!=i ){ + pRet->aiCol[pRet->nCol++] = i; + }else{ + iOld++; + } + } + } + + sqlite3_free(p); + return pRet; +} + +static Fts5Colset *sqlite3Fts5ParseColset( + Fts5Parse *pParse, /* Store SQLITE_NOMEM here if required */ + Fts5Colset *pColset, /* Existing colset object */ + Fts5Token *p +){ + Fts5Colset *pRet = 0; + int iCol; + char *z; /* Dequoted copy of token p */ + + z = sqlite3Fts5Strndup(&pParse->rc, p->p, p->n); + if( pParse->rc==SQLITE_OK ){ + Fts5Config *pConfig = pParse->pConfig; + sqlite3Fts5Dequote(z); + for(iCol=0; iCol<pConfig->nCol; iCol++){ + if( 0==sqlite3_stricmp(pConfig->azCol[iCol], z) ) break; + } + if( iCol==pConfig->nCol ){ + sqlite3Fts5ParseError(pParse, "no such column: %s", z); + }else{ + pRet = fts5ParseColset(pParse, pColset, iCol); + } + sqlite3_free(z); + } + + if( pRet==0 ){ + assert( pParse->rc!=SQLITE_OK ); + sqlite3_free(pColset); + } + + return pRet; +} + +/* +** If argument pOrig is NULL, or if (*pRc) is set to anything other than +** SQLITE_OK when this function is called, NULL is returned. +** +** Otherwise, a copy of (*pOrig) is made into memory obtained from +** sqlite3Fts5MallocZero() and a pointer to it returned. If the allocation +** fails, (*pRc) is set to SQLITE_NOMEM and NULL is returned. +*/ +static Fts5Colset *fts5CloneColset(int *pRc, Fts5Colset *pOrig){ + Fts5Colset *pRet; + if( pOrig ){ + int nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); + pRet = (Fts5Colset*)sqlite3Fts5MallocZero(pRc, nByte); + if( pRet ){ + memcpy(pRet, pOrig, nByte); + } + }else{ + pRet = 0; + } + return pRet; +} + +/* +** Remove from colset pColset any columns that are not also in colset pMerge. +*/ +static void fts5MergeColset(Fts5Colset *pColset, Fts5Colset *pMerge){ + int iIn = 0; /* Next input in pColset */ + int iMerge = 0; /* Next input in pMerge */ + int iOut = 0; /* Next output slot in pColset */ + + while( iIn<pColset->nCol && iMerge<pMerge->nCol ){ + int iDiff = pColset->aiCol[iIn] - pMerge->aiCol[iMerge]; + if( iDiff==0 ){ + pColset->aiCol[iOut++] = pMerge->aiCol[iMerge]; + iMerge++; + iIn++; + }else if( iDiff>0 ){ + iMerge++; + }else{ + iIn++; + } + } + pColset->nCol = iOut; +} + +/* +** Recursively apply colset pColset to expression node pNode and all of +** its decendents. If (*ppFree) is not NULL, it contains a spare copy +** of pColset. This function may use the spare copy and set (*ppFree) to +** zero, or it may create copies of pColset using fts5CloneColset(). +*/ +static void fts5ParseSetColset( + Fts5Parse *pParse, + Fts5ExprNode *pNode, + Fts5Colset *pColset, + Fts5Colset **ppFree +){ + if( pParse->rc==SQLITE_OK ){ + assert( pNode->eType==FTS5_TERM || pNode->eType==FTS5_STRING + || pNode->eType==FTS5_AND || pNode->eType==FTS5_OR + || pNode->eType==FTS5_NOT || pNode->eType==FTS5_EOF + ); + if( pNode->eType==FTS5_STRING || pNode->eType==FTS5_TERM ){ + Fts5ExprNearset *pNear = pNode->pNear; + if( pNear->pColset ){ + fts5MergeColset(pNear->pColset, pColset); + if( pNear->pColset->nCol==0 ){ + pNode->eType = FTS5_EOF; + pNode->xNext = 0; + } + }else if( *ppFree ){ + pNear->pColset = pColset; + *ppFree = 0; + }else{ + pNear->pColset = fts5CloneColset(&pParse->rc, pColset); + } + }else{ + int i; + assert( pNode->eType!=FTS5_EOF || pNode->nChild==0 ); + for(i=0; i<pNode->nChild; i++){ + fts5ParseSetColset(pParse, pNode->apChild[i], pColset, ppFree); + } + } + } +} + +/* +** Apply colset pColset to expression node pExpr and all of its descendents. +*/ +static void sqlite3Fts5ParseSetColset( + Fts5Parse *pParse, + Fts5ExprNode *pExpr, + Fts5Colset *pColset +){ + Fts5Colset *pFree = pColset; + if( pParse->pConfig->eDetail==FTS5_DETAIL_NONE ){ + pParse->rc = SQLITE_ERROR; + pParse->zErr = sqlite3_mprintf( + "fts5: column queries are not supported (detail=none)" + ); + }else{ + fts5ParseSetColset(pParse, pExpr, pColset, &pFree); + } + sqlite3_free(pFree); +} + +static void fts5ExprAssignXNext(Fts5ExprNode *pNode){ + switch( pNode->eType ){ + case FTS5_STRING: { + Fts5ExprNearset *pNear = pNode->pNear; + if( pNear->nPhrase==1 && pNear->apPhrase[0]->nTerm==1 + && pNear->apPhrase[0]->aTerm[0].pSynonym==0 + && pNear->apPhrase[0]->aTerm[0].bFirst==0 + ){ + pNode->eType = FTS5_TERM; + pNode->xNext = fts5ExprNodeNext_TERM; + }else{ + pNode->xNext = fts5ExprNodeNext_STRING; + } + break; + }; + + case FTS5_OR: { + pNode->xNext = fts5ExprNodeNext_OR; + break; + }; + + case FTS5_AND: { + pNode->xNext = fts5ExprNodeNext_AND; + break; + }; + + default: assert( pNode->eType==FTS5_NOT ); { + pNode->xNext = fts5ExprNodeNext_NOT; + break; + }; + } +} + +static void fts5ExprAddChildren(Fts5ExprNode *p, Fts5ExprNode *pSub){ + if( p->eType!=FTS5_NOT && pSub->eType==p->eType ){ + int nByte = sizeof(Fts5ExprNode*) * pSub->nChild; + memcpy(&p->apChild[p->nChild], pSub->apChild, nByte); + p->nChild += pSub->nChild; + sqlite3_free(pSub); + }else{ + p->apChild[p->nChild++] = pSub; + } +} + +/* +** Allocate and return a new expression object. If anything goes wrong (i.e. +** OOM error), leave an error code in pParse and return NULL. +*/ +static Fts5ExprNode *sqlite3Fts5ParseNode( + Fts5Parse *pParse, /* Parse context */ + int eType, /* FTS5_STRING, AND, OR or NOT */ + Fts5ExprNode *pLeft, /* Left hand child expression */ + Fts5ExprNode *pRight, /* Right hand child expression */ + Fts5ExprNearset *pNear /* For STRING expressions, the near cluster */ +){ + Fts5ExprNode *pRet = 0; + + if( pParse->rc==SQLITE_OK ){ + int nChild = 0; /* Number of children of returned node */ + int nByte; /* Bytes of space to allocate for this node */ + + assert( (eType!=FTS5_STRING && !pNear) + || (eType==FTS5_STRING && !pLeft && !pRight) + ); + if( eType==FTS5_STRING && pNear==0 ) return 0; + if( eType!=FTS5_STRING && pLeft==0 ) return pRight; + if( eType!=FTS5_STRING && pRight==0 ) return pLeft; + + if( eType==FTS5_NOT ){ + nChild = 2; + }else if( eType==FTS5_AND || eType==FTS5_OR ){ + nChild = 2; + if( pLeft->eType==eType ) nChild += pLeft->nChild-1; + if( pRight->eType==eType ) nChild += pRight->nChild-1; + } + + nByte = sizeof(Fts5ExprNode) + sizeof(Fts5ExprNode*)*(nChild-1); + pRet = (Fts5ExprNode*)sqlite3Fts5MallocZero(&pParse->rc, nByte); + + if( pRet ){ + pRet->eType = eType; + pRet->pNear = pNear; + fts5ExprAssignXNext(pRet); + if( eType==FTS5_STRING ){ + int iPhrase; + for(iPhrase=0; iPhrase<pNear->nPhrase; iPhrase++){ + pNear->apPhrase[iPhrase]->pNode = pRet; + if( pNear->apPhrase[iPhrase]->nTerm==0 ){ + pRet->xNext = 0; + pRet->eType = FTS5_EOF; + } + } + + if( pParse->pConfig->eDetail!=FTS5_DETAIL_FULL ){ + Fts5ExprPhrase *pPhrase = pNear->apPhrase[0]; + if( pNear->nPhrase!=1 + || pPhrase->nTerm>1 + || (pPhrase->nTerm>0 && pPhrase->aTerm[0].bFirst) + ){ + assert( pParse->rc==SQLITE_OK ); + pParse->rc = SQLITE_ERROR; + assert( pParse->zErr==0 ); + pParse->zErr = sqlite3_mprintf( + "fts5: %s queries are not supported (detail!=full)", + pNear->nPhrase==1 ? "phrase": "NEAR" + ); + sqlite3_free(pRet); + pRet = 0; + } + } + }else{ + fts5ExprAddChildren(pRet, pLeft); + fts5ExprAddChildren(pRet, pRight); + } + } + } + + if( pRet==0 ){ + assert( pParse->rc!=SQLITE_OK ); + sqlite3Fts5ParseNodeFree(pLeft); + sqlite3Fts5ParseNodeFree(pRight); + sqlite3Fts5ParseNearsetFree(pNear); + } + return pRet; +} + +static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( + Fts5Parse *pParse, /* Parse context */ + Fts5ExprNode *pLeft, /* Left hand child expression */ + Fts5ExprNode *pRight /* Right hand child expression */ +){ + Fts5ExprNode *pRet = 0; + Fts5ExprNode *pPrev; + + if( pParse->rc ){ + sqlite3Fts5ParseNodeFree(pLeft); + sqlite3Fts5ParseNodeFree(pRight); + }else{ + + assert( pLeft->eType==FTS5_STRING + || pLeft->eType==FTS5_TERM + || pLeft->eType==FTS5_EOF + || pLeft->eType==FTS5_AND + ); + assert( pRight->eType==FTS5_STRING + || pRight->eType==FTS5_TERM + || pRight->eType==FTS5_EOF + ); + + if( pLeft->eType==FTS5_AND ){ + pPrev = pLeft->apChild[pLeft->nChild-1]; + }else{ + pPrev = pLeft; + } + assert( pPrev->eType==FTS5_STRING + || pPrev->eType==FTS5_TERM + || pPrev->eType==FTS5_EOF + ); + + if( pRight->eType==FTS5_EOF ){ + assert( pParse->apPhrase[pParse->nPhrase-1]==pRight->pNear->apPhrase[0] ); + sqlite3Fts5ParseNodeFree(pRight); + pRet = pLeft; + pParse->nPhrase--; + } + else if( pPrev->eType==FTS5_EOF ){ + Fts5ExprPhrase **ap; + + if( pPrev==pLeft ){ + pRet = pRight; + }else{ + pLeft->apChild[pLeft->nChild-1] = pRight; + pRet = pLeft; + } + + ap = &pParse->apPhrase[pParse->nPhrase-1-pRight->pNear->nPhrase]; + assert( ap[0]==pPrev->pNear->apPhrase[0] ); + memmove(ap, &ap[1], sizeof(Fts5ExprPhrase*)*pRight->pNear->nPhrase); + pParse->nPhrase--; + + sqlite3Fts5ParseNodeFree(pPrev); + } + else{ + pRet = sqlite3Fts5ParseNode(pParse, FTS5_AND, pLeft, pRight, 0); + } + } + + return pRet; +} + +static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ + int nByte = 0; + Fts5ExprTerm *p; + char *zQuoted; + + /* Determine the maximum amount of space required. */ + for(p=pTerm; p; p=p->pSynonym){ + nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2; + } + zQuoted = sqlite3_malloc(nByte); + + if( zQuoted ){ + int i = 0; + for(p=pTerm; p; p=p->pSynonym){ + char *zIn = p->zTerm; + zQuoted[i++] = '"'; + while( *zIn ){ + if( *zIn=='"' ) zQuoted[i++] = '"'; + zQuoted[i++] = *zIn++; + } + zQuoted[i++] = '"'; + if( p->pSynonym ) zQuoted[i++] = '|'; + } + if( pTerm->bPrefix ){ + zQuoted[i++] = ' '; + zQuoted[i++] = '*'; + } + zQuoted[i++] = '\0'; + } + return zQuoted; +} + +static char *fts5PrintfAppend(char *zApp, const char *zFmt, ...){ + char *zNew; + va_list ap; + va_start(ap, zFmt); + zNew = sqlite3_vmprintf(zFmt, ap); + va_end(ap); + if( zApp && zNew ){ + char *zNew2 = sqlite3_mprintf("%s%s", zApp, zNew); + sqlite3_free(zNew); + zNew = zNew2; + } + sqlite3_free(zApp); + return zNew; +} + +/* +** Compose a tcl-readable representation of expression pExpr. Return a +** pointer to a buffer containing that representation. It is the +** responsibility of the caller to at some point free the buffer using +** sqlite3_free(). +*/ +static char *fts5ExprPrintTcl( + Fts5Config *pConfig, + const char *zNearsetCmd, + Fts5ExprNode *pExpr +){ + char *zRet = 0; + if( pExpr->eType==FTS5_STRING || pExpr->eType==FTS5_TERM ){ + Fts5ExprNearset *pNear = pExpr->pNear; + int i; + int iTerm; + + zRet = fts5PrintfAppend(zRet, "%s ", zNearsetCmd); + if( zRet==0 ) return 0; + if( pNear->pColset ){ + int *aiCol = pNear->pColset->aiCol; + int nCol = pNear->pColset->nCol; + if( nCol==1 ){ + zRet = fts5PrintfAppend(zRet, "-col %d ", aiCol[0]); + }else{ + zRet = fts5PrintfAppend(zRet, "-col {%d", aiCol[0]); + for(i=1; i<pNear->pColset->nCol; i++){ + zRet = fts5PrintfAppend(zRet, " %d", aiCol[i]); + } + zRet = fts5PrintfAppend(zRet, "} "); + } + if( zRet==0 ) return 0; + } + + if( pNear->nPhrase>1 ){ + zRet = fts5PrintfAppend(zRet, "-near %d ", pNear->nNear); + if( zRet==0 ) return 0; + } + + zRet = fts5PrintfAppend(zRet, "--"); + if( zRet==0 ) return 0; + + for(i=0; i<pNear->nPhrase; i++){ + Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; + + zRet = fts5PrintfAppend(zRet, " {"); + for(iTerm=0; zRet && iTerm<pPhrase->nTerm; iTerm++){ + char *zTerm = pPhrase->aTerm[iTerm].zTerm; + zRet = fts5PrintfAppend(zRet, "%s%s", iTerm==0?"":" ", zTerm); + if( pPhrase->aTerm[iTerm].bPrefix ){ + zRet = fts5PrintfAppend(zRet, "*"); + } + } + + if( zRet ) zRet = fts5PrintfAppend(zRet, "}"); + if( zRet==0 ) return 0; + } + + }else{ + char const *zOp = 0; + int i; + switch( pExpr->eType ){ + case FTS5_AND: zOp = "AND"; break; + case FTS5_NOT: zOp = "NOT"; break; + default: + assert( pExpr->eType==FTS5_OR ); + zOp = "OR"; + break; + } + + zRet = sqlite3_mprintf("%s", zOp); + for(i=0; zRet && i<pExpr->nChild; i++){ + char *z = fts5ExprPrintTcl(pConfig, zNearsetCmd, pExpr->apChild[i]); + if( !z ){ + sqlite3_free(zRet); + zRet = 0; + }else{ + zRet = fts5PrintfAppend(zRet, " [%z]", z); + } + } + } + + return zRet; +} + +static char *fts5ExprPrint(Fts5Config *pConfig, Fts5ExprNode *pExpr){ + char *zRet = 0; + if( pExpr->eType==0 ){ + return sqlite3_mprintf("\"\""); + }else + if( pExpr->eType==FTS5_STRING || pExpr->eType==FTS5_TERM ){ + Fts5ExprNearset *pNear = pExpr->pNear; + int i; + int iTerm; + + if( pNear->pColset ){ + int iCol = pNear->pColset->aiCol[0]; + zRet = fts5PrintfAppend(zRet, "%s : ", pConfig->azCol[iCol]); + if( zRet==0 ) return 0; + } + + if( pNear->nPhrase>1 ){ + zRet = fts5PrintfAppend(zRet, "NEAR("); + if( zRet==0 ) return 0; + } + + for(i=0; i<pNear->nPhrase; i++){ + Fts5ExprPhrase *pPhrase = pNear->apPhrase[i]; + if( i!=0 ){ + zRet = fts5PrintfAppend(zRet, " "); + if( zRet==0 ) return 0; + } + for(iTerm=0; iTerm<pPhrase->nTerm; iTerm++){ + char *zTerm = fts5ExprTermPrint(&pPhrase->aTerm[iTerm]); + if( zTerm ){ + zRet = fts5PrintfAppend(zRet, "%s%s", iTerm==0?"":" + ", zTerm); + sqlite3_free(zTerm); + } + if( zTerm==0 || zRet==0 ){ + sqlite3_free(zRet); + return 0; + } + } + } + + if( pNear->nPhrase>1 ){ + zRet = fts5PrintfAppend(zRet, ", %d)", pNear->nNear); + if( zRet==0 ) return 0; + } + + }else{ + char const *zOp = 0; + int i; + + switch( pExpr->eType ){ + case FTS5_AND: zOp = " AND "; break; + case FTS5_NOT: zOp = " NOT "; break; + default: + assert( pExpr->eType==FTS5_OR ); + zOp = " OR "; + break; + } + + for(i=0; i<pExpr->nChild; i++){ + char *z = fts5ExprPrint(pConfig, pExpr->apChild[i]); + if( z==0 ){ + sqlite3_free(zRet); + zRet = 0; + }else{ + int e = pExpr->apChild[i]->eType; + int b = (e!=FTS5_STRING && e!=FTS5_TERM && e!=FTS5_EOF); + zRet = fts5PrintfAppend(zRet, "%s%s%z%s", + (i==0 ? "" : zOp), + (b?"(":""), z, (b?")":"") + ); + } + if( zRet==0 ) break; + } + } + + return zRet; +} + +/* +** The implementation of user-defined scalar functions fts5_expr() (bTcl==0) +** and fts5_expr_tcl() (bTcl!=0). +*/ +static void fts5ExprFunction( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apVal, /* Function arguments */ + int bTcl +){ + Fts5Global *pGlobal = (Fts5Global*)sqlite3_user_data(pCtx); + sqlite3 *db = sqlite3_context_db_handle(pCtx); + const char *zExpr = 0; + char *zErr = 0; + Fts5Expr *pExpr = 0; + int rc; + int i; + + const char **azConfig; /* Array of arguments for Fts5Config */ + const char *zNearsetCmd = "nearset"; + int nConfig; /* Size of azConfig[] */ + Fts5Config *pConfig = 0; + int iArg = 1; + + if( nArg<1 ){ + zErr = sqlite3_mprintf("wrong number of arguments to function %s", + bTcl ? "fts5_expr_tcl" : "fts5_expr" + ); + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); + return; + } + + if( bTcl && nArg>1 ){ + zNearsetCmd = (const char*)sqlite3_value_text(apVal[1]); + iArg = 2; + } + + nConfig = 3 + (nArg-iArg); + azConfig = (const char**)sqlite3_malloc(sizeof(char*) * nConfig); + if( azConfig==0 ){ + sqlite3_result_error_nomem(pCtx); + return; + } + azConfig[0] = 0; + azConfig[1] = "main"; + azConfig[2] = "tbl"; + for(i=3; iArg<nArg; iArg++){ + azConfig[i++] = (const char*)sqlite3_value_text(apVal[iArg]); + } + + zExpr = (const char*)sqlite3_value_text(apVal[0]); + + rc = sqlite3Fts5ConfigParse(pGlobal, db, nConfig, azConfig, &pConfig, &zErr); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5ExprNew(pConfig, pConfig->nCol, zExpr, &pExpr, &zErr); + } + if( rc==SQLITE_OK ){ + char *zText; + if( pExpr->pRoot->xNext==0 ){ + zText = sqlite3_mprintf(""); + }else if( bTcl ){ + zText = fts5ExprPrintTcl(pConfig, zNearsetCmd, pExpr->pRoot); + }else{ + zText = fts5ExprPrint(pConfig, pExpr->pRoot); + } + if( zText==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_result_text(pCtx, zText, -1, SQLITE_TRANSIENT); + sqlite3_free(zText); + } + } + + if( rc!=SQLITE_OK ){ + if( zErr ){ + sqlite3_result_error(pCtx, zErr, -1); + sqlite3_free(zErr); + }else{ + sqlite3_result_error_code(pCtx, rc); + } + } + sqlite3_free((void *)azConfig); + sqlite3Fts5ConfigFree(pConfig); + sqlite3Fts5ExprFree(pExpr); +} + +static void fts5ExprFunctionHr( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apVal /* Function arguments */ +){ + fts5ExprFunction(pCtx, nArg, apVal, 0); +} +static void fts5ExprFunctionTcl( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apVal /* Function arguments */ +){ + fts5ExprFunction(pCtx, nArg, apVal, 1); +} + +/* +** The implementation of an SQLite user-defined-function that accepts a +** single integer as an argument. If the integer is an alpha-numeric +** unicode code point, 1 is returned. Otherwise 0. +*/ +static void fts5ExprIsAlnum( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apVal /* Function arguments */ +){ + int iCode; + if( nArg!=1 ){ + sqlite3_result_error(pCtx, + "wrong number of arguments to function fts5_isalnum", -1 + ); + return; + } + iCode = sqlite3_value_int(apVal[0]); + sqlite3_result_int(pCtx, sqlite3Fts5UnicodeIsalnum(iCode)); +} + +static void fts5ExprFold( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apVal /* Function arguments */ +){ + if( nArg!=1 && nArg!=2 ){ + sqlite3_result_error(pCtx, + "wrong number of arguments to function fts5_fold", -1 + ); + }else{ + int iCode; + int bRemoveDiacritics = 0; + iCode = sqlite3_value_int(apVal[0]); + if( nArg==2 ) bRemoveDiacritics = sqlite3_value_int(apVal[1]); + sqlite3_result_int(pCtx, sqlite3Fts5UnicodeFold(iCode, bRemoveDiacritics)); + } +} + +/* +** This is called during initialization to register the fts5_expr() scalar +** UDF with the SQLite handle passed as the only argument. +*/ +static int sqlite3Fts5ExprInit(Fts5Global *pGlobal, sqlite3 *db){ + struct Fts5ExprFunc { + const char *z; + void (*x)(sqlite3_context*,int,sqlite3_value**); + } aFunc[] = { + { "fts5_expr", fts5ExprFunctionHr }, + { "fts5_expr_tcl", fts5ExprFunctionTcl }, + { "fts5_isalnum", fts5ExprIsAlnum }, + { "fts5_fold", fts5ExprFold }, + }; + int i; + int rc = SQLITE_OK; + void *pCtx = (void*)pGlobal; + + for(i=0; rc==SQLITE_OK && i<ArraySize(aFunc); i++){ + struct Fts5ExprFunc *p = &aFunc[i]; + rc = sqlite3_create_function(db, p->z, -1, SQLITE_UTF8, pCtx, p->x, 0, 0); + } + + /* Avoid a warning indicating that sqlite3Fts5ParserTrace() is unused */ +#ifndef NDEBUG + (void)sqlite3Fts5ParserTrace; +#endif + + return rc; +} + +/* +** Return the number of phrases in expression pExpr. +*/ +static int sqlite3Fts5ExprPhraseCount(Fts5Expr *pExpr){ + return (pExpr ? pExpr->nPhrase : 0); +} + +/* +** Return the number of terms in the iPhrase'th phrase in pExpr. +*/ +static int sqlite3Fts5ExprPhraseSize(Fts5Expr *pExpr, int iPhrase){ + if( iPhrase<0 || iPhrase>=pExpr->nPhrase ) return 0; + return pExpr->apExprPhrase[iPhrase]->nTerm; +} + +/* +** This function is used to access the current position list for phrase +** iPhrase. +*/ +static int sqlite3Fts5ExprPoslist(Fts5Expr *pExpr, int iPhrase, const u8 **pa){ + int nRet; + Fts5ExprPhrase *pPhrase = pExpr->apExprPhrase[iPhrase]; + Fts5ExprNode *pNode = pPhrase->pNode; + if( pNode->bEof==0 && pNode->iRowid==pExpr->pRoot->iRowid ){ + *pa = pPhrase->poslist.p; + nRet = pPhrase->poslist.n; + }else{ + *pa = 0; + nRet = 0; + } + return nRet; +} + +struct Fts5PoslistPopulator { + Fts5PoslistWriter writer; + int bOk; /* True if ok to populate */ + int bMiss; +}; + +static Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){ + Fts5PoslistPopulator *pRet; + pRet = sqlite3_malloc(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); + if( pRet ){ + int i; + memset(pRet, 0, sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); + for(i=0; i<pExpr->nPhrase; i++){ + Fts5Buffer *pBuf = &pExpr->apExprPhrase[i]->poslist; + Fts5ExprNode *pNode = pExpr->apExprPhrase[i]->pNode; + assert( pExpr->apExprPhrase[i]->nTerm==1 ); + if( bLive && + (pBuf->n==0 || pNode->iRowid!=pExpr->pRoot->iRowid || pNode->bEof) + ){ + pRet[i].bMiss = 1; + }else{ + pBuf->n = 0; + } + } + } + return pRet; +} + +struct Fts5ExprCtx { + Fts5Expr *pExpr; + Fts5PoslistPopulator *aPopulator; + i64 iOff; +}; +typedef struct Fts5ExprCtx Fts5ExprCtx; + +/* +** TODO: Make this more efficient! +*/ +static int fts5ExprColsetTest(Fts5Colset *pColset, int iCol){ + int i; + for(i=0; i<pColset->nCol; i++){ + if( pColset->aiCol[i]==iCol ) return 1; + } + return 0; +} + +static int fts5ExprPopulatePoslistsCb( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iUnused1, /* Byte offset of token within input text */ + int iUnused2 /* Byte offset of end of token within input text */ +){ + Fts5ExprCtx *p = (Fts5ExprCtx*)pCtx; + Fts5Expr *pExpr = p->pExpr; + int i; + + UNUSED_PARAM2(iUnused1, iUnused2); + + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; + if( (tflags & FTS5_TOKEN_COLOCATED)==0 ) p->iOff++; + for(i=0; i<pExpr->nPhrase; i++){ + Fts5ExprTerm *pTerm; + if( p->aPopulator[i].bOk==0 ) continue; + for(pTerm=&pExpr->apExprPhrase[i]->aTerm[0]; pTerm; pTerm=pTerm->pSynonym){ + int nTerm = (int)strlen(pTerm->zTerm); + if( (nTerm==nToken || (nTerm<nToken && pTerm->bPrefix)) + && memcmp(pTerm->zTerm, pToken, nTerm)==0 + ){ + int rc = sqlite3Fts5PoslistWriterAppend( + &pExpr->apExprPhrase[i]->poslist, &p->aPopulator[i].writer, p->iOff + ); + if( rc ) return rc; + break; + } + } + } + return SQLITE_OK; +} + +static int sqlite3Fts5ExprPopulatePoslists( + Fts5Config *pConfig, + Fts5Expr *pExpr, + Fts5PoslistPopulator *aPopulator, + int iCol, + const char *z, int n +){ + int i; + Fts5ExprCtx sCtx; + sCtx.pExpr = pExpr; + sCtx.aPopulator = aPopulator; + sCtx.iOff = (((i64)iCol) << 32) - 1; + + for(i=0; i<pExpr->nPhrase; i++){ + Fts5ExprNode *pNode = pExpr->apExprPhrase[i]->pNode; + Fts5Colset *pColset = pNode->pNear->pColset; + if( (pColset && 0==fts5ExprColsetTest(pColset, iCol)) + || aPopulator[i].bMiss + ){ + aPopulator[i].bOk = 0; + }else{ + aPopulator[i].bOk = 1; + } + } + + return sqlite3Fts5Tokenize(pConfig, + FTS5_TOKENIZE_DOCUMENT, z, n, (void*)&sCtx, fts5ExprPopulatePoslistsCb + ); +} + +static void fts5ExprClearPoslists(Fts5ExprNode *pNode){ + if( pNode->eType==FTS5_TERM || pNode->eType==FTS5_STRING ){ + pNode->pNear->apPhrase[0]->poslist.n = 0; + }else{ + int i; + for(i=0; i<pNode->nChild; i++){ + fts5ExprClearPoslists(pNode->apChild[i]); + } + } +} + +static int fts5ExprCheckPoslists(Fts5ExprNode *pNode, i64 iRowid){ + pNode->iRowid = iRowid; + pNode->bEof = 0; + switch( pNode->eType ){ + case FTS5_TERM: + case FTS5_STRING: + return (pNode->pNear->apPhrase[0]->poslist.n>0); + + case FTS5_AND: { + int i; + for(i=0; i<pNode->nChild; i++){ + if( fts5ExprCheckPoslists(pNode->apChild[i], iRowid)==0 ){ + fts5ExprClearPoslists(pNode); + return 0; + } + } + break; + } + + case FTS5_OR: { + int i; + int bRet = 0; + for(i=0; i<pNode->nChild; i++){ + if( fts5ExprCheckPoslists(pNode->apChild[i], iRowid) ){ + bRet = 1; + } + } + return bRet; + } + + default: { + assert( pNode->eType==FTS5_NOT ); + if( 0==fts5ExprCheckPoslists(pNode->apChild[0], iRowid) + || 0!=fts5ExprCheckPoslists(pNode->apChild[1], iRowid) + ){ + fts5ExprClearPoslists(pNode); + return 0; + } + break; + } + } + return 1; +} + +static void sqlite3Fts5ExprCheckPoslists(Fts5Expr *pExpr, i64 iRowid){ + fts5ExprCheckPoslists(pExpr->pRoot, iRowid); +} + +/* +** This function is only called for detail=columns tables. +*/ +static int sqlite3Fts5ExprPhraseCollist( + Fts5Expr *pExpr, + int iPhrase, + const u8 **ppCollist, + int *pnCollist +){ + Fts5ExprPhrase *pPhrase = pExpr->apExprPhrase[iPhrase]; + Fts5ExprNode *pNode = pPhrase->pNode; + int rc = SQLITE_OK; + + assert( iPhrase>=0 && iPhrase<pExpr->nPhrase ); + assert( pExpr->pConfig->eDetail==FTS5_DETAIL_COLUMNS ); + + if( pNode->bEof==0 + && pNode->iRowid==pExpr->pRoot->iRowid + && pPhrase->poslist.n>0 + ){ + Fts5ExprTerm *pTerm = &pPhrase->aTerm[0]; + if( pTerm->pSynonym ){ + Fts5Buffer *pBuf = (Fts5Buffer*)&pTerm->pSynonym[1]; + rc = fts5ExprSynonymList( + pTerm, pNode->iRowid, pBuf, (u8**)ppCollist, pnCollist + ); + }else{ + *ppCollist = pPhrase->aTerm[0].pIter->pData; + *pnCollist = pPhrase->aTerm[0].pIter->nData; + } + }else{ + *ppCollist = 0; + *pnCollist = 0; + } + + return rc; +} + + +/* +** 2014 August 11 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +*/ + + + +/* #include "fts5Int.h" */ + +typedef struct Fts5HashEntry Fts5HashEntry; + +/* +** This file contains the implementation of an in-memory hash table used +** to accumuluate "term -> doclist" content before it is flused to a level-0 +** segment. +*/ + + +struct Fts5Hash { + int eDetail; /* Copy of Fts5Config.eDetail */ + int *pnByte; /* Pointer to bytes counter */ + int nEntry; /* Number of entries currently in hash */ + int nSlot; /* Size of aSlot[] array */ + Fts5HashEntry *pScan; /* Current ordered scan item */ + Fts5HashEntry **aSlot; /* Array of hash slots */ +}; + +/* +** Each entry in the hash table is represented by an object of the +** following type. Each object, its key (a nul-terminated string) and +** its current data are stored in a single memory allocation. The +** key immediately follows the object in memory. The position list +** data immediately follows the key data in memory. +** +** The data that follows the key is in a similar, but not identical format +** to the doclist data stored in the database. It is: +** +** * Rowid, as a varint +** * Position list, without 0x00 terminator. +** * Size of previous position list and rowid, as a 4 byte +** big-endian integer. +** +** iRowidOff: +** Offset of last rowid written to data area. Relative to first byte of +** structure. +** +** nData: +** Bytes of data written since iRowidOff. +*/ +struct Fts5HashEntry { + Fts5HashEntry *pHashNext; /* Next hash entry with same hash-key */ + Fts5HashEntry *pScanNext; /* Next entry in sorted order */ + + int nAlloc; /* Total size of allocation */ + int iSzPoslist; /* Offset of space for 4-byte poslist size */ + int nData; /* Total bytes of data (incl. structure) */ + int nKey; /* Length of key in bytes */ + u8 bDel; /* Set delete-flag @ iSzPoslist */ + u8 bContent; /* Set content-flag (detail=none mode) */ + i16 iCol; /* Column of last value written */ + int iPos; /* Position of last value written */ + i64 iRowid; /* Rowid of last value written */ +}; + +/* +** Eqivalent to: +** +** char *fts5EntryKey(Fts5HashEntry *pEntry){ return zKey; } +*/ +#define fts5EntryKey(p) ( ((char *)(&(p)[1])) ) + + +/* +** Allocate a new hash table. +*/ +static int sqlite3Fts5HashNew(Fts5Config *pConfig, Fts5Hash **ppNew, int *pnByte){ + int rc = SQLITE_OK; + Fts5Hash *pNew; + + *ppNew = pNew = (Fts5Hash*)sqlite3_malloc(sizeof(Fts5Hash)); + if( pNew==0 ){ + rc = SQLITE_NOMEM; + }else{ + int nByte; + memset(pNew, 0, sizeof(Fts5Hash)); + pNew->pnByte = pnByte; + pNew->eDetail = pConfig->eDetail; + + pNew->nSlot = 1024; + nByte = sizeof(Fts5HashEntry*) * pNew->nSlot; + pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc(nByte); + if( pNew->aSlot==0 ){ + sqlite3_free(pNew); + *ppNew = 0; + rc = SQLITE_NOMEM; + }else{ + memset(pNew->aSlot, 0, nByte); + } + } + return rc; +} + +/* +** Free a hash table object. +*/ +static void sqlite3Fts5HashFree(Fts5Hash *pHash){ + if( pHash ){ + sqlite3Fts5HashClear(pHash); + sqlite3_free(pHash->aSlot); + sqlite3_free(pHash); + } +} + +/* +** Empty (but do not delete) a hash table. +*/ +static void sqlite3Fts5HashClear(Fts5Hash *pHash){ + int i; + for(i=0; i<pHash->nSlot; i++){ + Fts5HashEntry *pNext; + Fts5HashEntry *pSlot; + for(pSlot=pHash->aSlot[i]; pSlot; pSlot=pNext){ + pNext = pSlot->pHashNext; + sqlite3_free(pSlot); + } + } + memset(pHash->aSlot, 0, pHash->nSlot * sizeof(Fts5HashEntry*)); + pHash->nEntry = 0; +} + +static unsigned int fts5HashKey(int nSlot, const u8 *p, int n){ + int i; + unsigned int h = 13; + for(i=n-1; i>=0; i--){ + h = (h << 3) ^ h ^ p[i]; + } + return (h % nSlot); +} + +static unsigned int fts5HashKey2(int nSlot, u8 b, const u8 *p, int n){ + int i; + unsigned int h = 13; + for(i=n-1; i>=0; i--){ + h = (h << 3) ^ h ^ p[i]; + } + h = (h << 3) ^ h ^ b; + return (h % nSlot); +} + +/* +** Resize the hash table by doubling the number of slots. +*/ +static int fts5HashResize(Fts5Hash *pHash){ + int nNew = pHash->nSlot*2; + int i; + Fts5HashEntry **apNew; + Fts5HashEntry **apOld = pHash->aSlot; + + apNew = (Fts5HashEntry**)sqlite3_malloc(nNew*sizeof(Fts5HashEntry*)); + if( !apNew ) return SQLITE_NOMEM; + memset(apNew, 0, nNew*sizeof(Fts5HashEntry*)); + + for(i=0; i<pHash->nSlot; i++){ + while( apOld[i] ){ + unsigned int iHash; + Fts5HashEntry *p = apOld[i]; + apOld[i] = p->pHashNext; + iHash = fts5HashKey(nNew, (u8*)fts5EntryKey(p), + (int)strlen(fts5EntryKey(p))); + p->pHashNext = apNew[iHash]; + apNew[iHash] = p; + } + } + + sqlite3_free(apOld); + pHash->nSlot = nNew; + pHash->aSlot = apNew; + return SQLITE_OK; +} + +static void fts5HashAddPoslistSize(Fts5Hash *pHash, Fts5HashEntry *p){ + if( p->iSzPoslist ){ + u8 *pPtr = (u8*)p; + if( pHash->eDetail==FTS5_DETAIL_NONE ){ + assert( p->nData==p->iSzPoslist ); + if( p->bDel ){ + pPtr[p->nData++] = 0x00; + if( p->bContent ){ + pPtr[p->nData++] = 0x00; + } + } + }else{ + int nSz = (p->nData - p->iSzPoslist - 1); /* Size in bytes */ + int nPos = nSz*2 + p->bDel; /* Value of nPos field */ + + assert( p->bDel==0 || p->bDel==1 ); + if( nPos<=127 ){ + pPtr[p->iSzPoslist] = (u8)nPos; + }else{ + int nByte = sqlite3Fts5GetVarintLen((u32)nPos); + memmove(&pPtr[p->iSzPoslist + nByte], &pPtr[p->iSzPoslist + 1], nSz); + sqlite3Fts5PutVarint(&pPtr[p->iSzPoslist], nPos); + p->nData += (nByte-1); + } + } + + p->iSzPoslist = 0; + p->bDel = 0; + p->bContent = 0; + } +} + +/* +** Add an entry to the in-memory hash table. The key is the concatenation +** of bByte and (pToken/nToken). The value is (iRowid/iCol/iPos). +** +** (bByte || pToken) -> (iRowid,iCol,iPos) +** +** Or, if iCol is negative, then the value is a delete marker. +*/ +static int sqlite3Fts5HashWrite( + Fts5Hash *pHash, + i64 iRowid, /* Rowid for this entry */ + int iCol, /* Column token appears in (-ve -> delete) */ + int iPos, /* Position of token within column */ + char bByte, /* First byte of token */ + const char *pToken, int nToken /* Token to add or remove to or from index */ +){ + unsigned int iHash; + Fts5HashEntry *p; + u8 *pPtr; + int nIncr = 0; /* Amount to increment (*pHash->pnByte) by */ + int bNew; /* If non-delete entry should be written */ + + bNew = (pHash->eDetail==FTS5_DETAIL_FULL); + + /* Attempt to locate an existing hash entry */ + iHash = fts5HashKey2(pHash->nSlot, (u8)bByte, (const u8*)pToken, nToken); + for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ + char *zKey = fts5EntryKey(p); + if( zKey[0]==bByte + && p->nKey==nToken + && memcmp(&zKey[1], pToken, nToken)==0 + ){ + break; + } + } + + /* If an existing hash entry cannot be found, create a new one. */ + if( p==0 ){ + /* Figure out how much space to allocate */ + char *zKey; + int nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; + if( nByte<128 ) nByte = 128; + + /* Grow the Fts5Hash.aSlot[] array if necessary. */ + if( (pHash->nEntry*2)>=pHash->nSlot ){ + int rc = fts5HashResize(pHash); + if( rc!=SQLITE_OK ) return rc; + iHash = fts5HashKey2(pHash->nSlot, (u8)bByte, (const u8*)pToken, nToken); + } + + /* Allocate new Fts5HashEntry and add it to the hash table. */ + p = (Fts5HashEntry*)sqlite3_malloc(nByte); + if( !p ) return SQLITE_NOMEM; + memset(p, 0, sizeof(Fts5HashEntry)); + p->nAlloc = nByte; + zKey = fts5EntryKey(p); + zKey[0] = bByte; + memcpy(&zKey[1], pToken, nToken); + assert( iHash==fts5HashKey(pHash->nSlot, (u8*)zKey, nToken+1) ); + p->nKey = nToken; + zKey[nToken+1] = '\0'; + p->nData = nToken+1 + 1 + sizeof(Fts5HashEntry); + p->pHashNext = pHash->aSlot[iHash]; + pHash->aSlot[iHash] = p; + pHash->nEntry++; + + /* Add the first rowid field to the hash-entry */ + p->nData += sqlite3Fts5PutVarint(&((u8*)p)[p->nData], iRowid); + p->iRowid = iRowid; + + p->iSzPoslist = p->nData; + if( pHash->eDetail!=FTS5_DETAIL_NONE ){ + p->nData += 1; + p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1); + } + + nIncr += p->nData; + }else{ + + /* Appending to an existing hash-entry. Check that there is enough + ** space to append the largest possible new entry. Worst case scenario + ** is: + ** + ** + 9 bytes for a new rowid, + ** + 4 byte reserved for the "poslist size" varint. + ** + 1 byte for a "new column" byte, + ** + 3 bytes for a new column number (16-bit max) as a varint, + ** + 5 bytes for the new position offset (32-bit max). + */ + if( (p->nAlloc - p->nData) < (9 + 4 + 1 + 3 + 5) ){ + int nNew = p->nAlloc * 2; + Fts5HashEntry *pNew; + Fts5HashEntry **pp; + pNew = (Fts5HashEntry*)sqlite3_realloc(p, nNew); + if( pNew==0 ) return SQLITE_NOMEM; + pNew->nAlloc = nNew; + for(pp=&pHash->aSlot[iHash]; *pp!=p; pp=&(*pp)->pHashNext); + *pp = pNew; + p = pNew; + } + nIncr -= p->nData; + } + assert( (p->nAlloc - p->nData) >= (9 + 4 + 1 + 3 + 5) ); + + pPtr = (u8*)p; + + /* If this is a new rowid, append the 4-byte size field for the previous + ** entry, and the new rowid for this entry. */ + if( iRowid!=p->iRowid ){ + fts5HashAddPoslistSize(pHash, p); + p->nData += sqlite3Fts5PutVarint(&pPtr[p->nData], iRowid - p->iRowid); + p->iRowid = iRowid; + bNew = 1; + p->iSzPoslist = p->nData; + if( pHash->eDetail!=FTS5_DETAIL_NONE ){ + p->nData += 1; + p->iCol = (pHash->eDetail==FTS5_DETAIL_FULL ? 0 : -1); + p->iPos = 0; + } + } + + if( iCol>=0 ){ + if( pHash->eDetail==FTS5_DETAIL_NONE ){ + p->bContent = 1; + }else{ + /* Append a new column value, if necessary */ + assert( iCol>=p->iCol ); + if( iCol!=p->iCol ){ + if( pHash->eDetail==FTS5_DETAIL_FULL ){ + pPtr[p->nData++] = 0x01; + p->nData += sqlite3Fts5PutVarint(&pPtr[p->nData], iCol); + p->iCol = (i16)iCol; + p->iPos = 0; + }else{ + bNew = 1; + p->iCol = (i16)(iPos = iCol); + } + } + + /* Append the new position offset, if necessary */ + if( bNew ){ + p->nData += sqlite3Fts5PutVarint(&pPtr[p->nData], iPos - p->iPos + 2); + p->iPos = iPos; + } + } + }else{ + /* This is a delete. Set the delete flag. */ + p->bDel = 1; + } + + nIncr += p->nData; + *pHash->pnByte += nIncr; + return SQLITE_OK; +} + + +/* +** Arguments pLeft and pRight point to linked-lists of hash-entry objects, +** each sorted in key order. This function merges the two lists into a +** single list and returns a pointer to its first element. +*/ +static Fts5HashEntry *fts5HashEntryMerge( + Fts5HashEntry *pLeft, + Fts5HashEntry *pRight +){ + Fts5HashEntry *p1 = pLeft; + Fts5HashEntry *p2 = pRight; + Fts5HashEntry *pRet = 0; + Fts5HashEntry **ppOut = &pRet; + + while( p1 || p2 ){ + if( p1==0 ){ + *ppOut = p2; + p2 = 0; + }else if( p2==0 ){ + *ppOut = p1; + p1 = 0; + }else{ + int i = 0; + char *zKey1 = fts5EntryKey(p1); + char *zKey2 = fts5EntryKey(p2); + while( zKey1[i]==zKey2[i] ) i++; + + if( ((u8)zKey1[i])>((u8)zKey2[i]) ){ + /* p2 is smaller */ + *ppOut = p2; + ppOut = &p2->pScanNext; + p2 = p2->pScanNext; + }else{ + /* p1 is smaller */ + *ppOut = p1; + ppOut = &p1->pScanNext; + p1 = p1->pScanNext; + } + *ppOut = 0; + } + } + + return pRet; +} + +/* +** Extract all tokens from hash table iHash and link them into a list +** in sorted order. The hash table is cleared before returning. It is +** the responsibility of the caller to free the elements of the returned +** list. +*/ +static int fts5HashEntrySort( + Fts5Hash *pHash, + const char *pTerm, int nTerm, /* Query prefix, if any */ + Fts5HashEntry **ppSorted +){ + const int nMergeSlot = 32; + Fts5HashEntry **ap; + Fts5HashEntry *pList; + int iSlot; + int i; + + *ppSorted = 0; + ap = sqlite3_malloc(sizeof(Fts5HashEntry*) * nMergeSlot); + if( !ap ) return SQLITE_NOMEM; + memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot); + + for(iSlot=0; iSlot<pHash->nSlot; iSlot++){ + Fts5HashEntry *pIter; + for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){ + if( pTerm==0 || 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm) ){ + Fts5HashEntry *pEntry = pIter; + pEntry->pScanNext = 0; + for(i=0; ap[i]; i++){ + pEntry = fts5HashEntryMerge(pEntry, ap[i]); + ap[i] = 0; + } + ap[i] = pEntry; + } + } + } + + pList = 0; + for(i=0; i<nMergeSlot; i++){ + pList = fts5HashEntryMerge(pList, ap[i]); + } + + pHash->nEntry = 0; + sqlite3_free(ap); + *ppSorted = pList; + return SQLITE_OK; +} + +/* +** Query the hash table for a doclist associated with term pTerm/nTerm. +*/ +static int sqlite3Fts5HashQuery( + Fts5Hash *pHash, /* Hash table to query */ + const char *pTerm, int nTerm, /* Query term */ + const u8 **ppDoclist, /* OUT: Pointer to doclist for pTerm */ + int *pnDoclist /* OUT: Size of doclist in bytes */ +){ + unsigned int iHash = fts5HashKey(pHash->nSlot, (const u8*)pTerm, nTerm); + char *zKey = 0; + Fts5HashEntry *p; + + for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ + zKey = fts5EntryKey(p); + if( memcmp(zKey, pTerm, nTerm)==0 && zKey[nTerm]==0 ) break; + } + + if( p ){ + fts5HashAddPoslistSize(pHash, p); + *ppDoclist = (const u8*)&zKey[nTerm+1]; + *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1); + }else{ + *ppDoclist = 0; + *pnDoclist = 0; + } + + return SQLITE_OK; +} + +static int sqlite3Fts5HashScanInit( + Fts5Hash *p, /* Hash table to query */ + const char *pTerm, int nTerm /* Query prefix */ +){ + return fts5HashEntrySort(p, pTerm, nTerm, &p->pScan); +} + +static void sqlite3Fts5HashScanNext(Fts5Hash *p){ + assert( !sqlite3Fts5HashScanEof(p) ); + p->pScan = p->pScan->pScanNext; +} + +static int sqlite3Fts5HashScanEof(Fts5Hash *p){ + return (p->pScan==0); +} + +static void sqlite3Fts5HashScanEntry( + Fts5Hash *pHash, + const char **pzTerm, /* OUT: term (nul-terminated) */ + const u8 **ppDoclist, /* OUT: pointer to doclist */ + int *pnDoclist /* OUT: size of doclist in bytes */ +){ + Fts5HashEntry *p; + if( (p = pHash->pScan) ){ + char *zKey = fts5EntryKey(p); + int nTerm = (int)strlen(zKey); + fts5HashAddPoslistSize(pHash, p); + *pzTerm = zKey; + *ppDoclist = (const u8*)&zKey[nTerm+1]; + *pnDoclist = p->nData - (sizeof(Fts5HashEntry) + nTerm + 1); + }else{ + *pzTerm = 0; + *ppDoclist = 0; + *pnDoclist = 0; + } +} + + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Low level access to the FTS index stored in the database file. The +** routines in this file file implement all read and write access to the +** %_data table. Other parts of the system access this functionality via +** the interface defined in fts5Int.h. +*/ + + +/* #include "fts5Int.h" */ + +/* +** Overview: +** +** The %_data table contains all the FTS indexes for an FTS5 virtual table. +** As well as the main term index, there may be up to 31 prefix indexes. +** The format is similar to FTS3/4, except that: +** +** * all segment b-tree leaf data is stored in fixed size page records +** (e.g. 1000 bytes). A single doclist may span multiple pages. Care is +** taken to ensure it is possible to iterate in either direction through +** the entries in a doclist, or to seek to a specific entry within a +** doclist, without loading it into memory. +** +** * large doclists that span many pages have associated "doclist index" +** records that contain a copy of the first rowid on each page spanned by +** the doclist. This is used to speed up seek operations, and merges of +** large doclists with very small doclists. +** +** * extra fields in the "structure record" record the state of ongoing +** incremental merge operations. +** +*/ + + +#define FTS5_OPT_WORK_UNIT 1000 /* Number of leaf pages per optimize step */ +#define FTS5_WORK_UNIT 64 /* Number of leaf pages in unit of work */ + +#define FTS5_MIN_DLIDX_SIZE 4 /* Add dlidx if this many empty pages */ + +#define FTS5_MAIN_PREFIX '0' + +#if FTS5_MAX_PREFIX_INDEXES > 31 +# error "FTS5_MAX_PREFIX_INDEXES is too large" +#endif + +/* +** Details: +** +** The %_data table managed by this module, +** +** CREATE TABLE %_data(id INTEGER PRIMARY KEY, block BLOB); +** +** , contains the following 5 types of records. See the comments surrounding +** the FTS5_*_ROWID macros below for a description of how %_data rowids are +** assigned to each fo them. +** +** 1. Structure Records: +** +** The set of segments that make up an index - the index structure - are +** recorded in a single record within the %_data table. The record consists +** of a single 32-bit configuration cookie value followed by a list of +** SQLite varints. If the FTS table features more than one index (because +** there are one or more prefix indexes), it is guaranteed that all share +** the same cookie value. +** +** Immediately following the configuration cookie, the record begins with +** three varints: +** +** + number of levels, +** + total number of segments on all levels, +** + value of write counter. +** +** Then, for each level from 0 to nMax: +** +** + number of input segments in ongoing merge. +** + total number of segments in level. +** + for each segment from oldest to newest: +** + segment id (always > 0) +** + first leaf page number (often 1, always greater than 0) +** + final leaf page number +** +** 2. The Averages Record: +** +** A single record within the %_data table. The data is a list of varints. +** The first value is the number of rows in the index. Then, for each column +** from left to right, the total number of tokens in the column for all +** rows of the table. +** +** 3. Segment leaves: +** +** TERM/DOCLIST FORMAT: +** +** Most of each segment leaf is taken up by term/doclist data. The +** general format of term/doclist, starting with the first term +** on the leaf page, is: +** +** varint : size of first term +** blob: first term data +** doclist: first doclist +** zero-or-more { +** varint: number of bytes in common with previous term +** varint: number of bytes of new term data (nNew) +** blob: nNew bytes of new term data +** doclist: next doclist +** } +** +** doclist format: +** +** varint: first rowid +** poslist: first poslist +** zero-or-more { +** varint: rowid delta (always > 0) +** poslist: next poslist +** } +** +** poslist format: +** +** varint: size of poslist in bytes multiplied by 2, not including +** this field. Plus 1 if this entry carries the "delete" flag. +** collist: collist for column 0 +** zero-or-more { +** 0x01 byte +** varint: column number (I) +** collist: collist for column I +** } +** +** collist format: +** +** varint: first offset + 2 +** zero-or-more { +** varint: offset delta + 2 +** } +** +** PAGE FORMAT +** +** Each leaf page begins with a 4-byte header containing 2 16-bit +** unsigned integer fields in big-endian format. They are: +** +** * The byte offset of the first rowid on the page, if it exists +** and occurs before the first term (otherwise 0). +** +** * The byte offset of the start of the page footer. If the page +** footer is 0 bytes in size, then this field is the same as the +** size of the leaf page in bytes. +** +** The page footer consists of a single varint for each term located +** on the page. Each varint is the byte offset of the current term +** within the page, delta-compressed against the previous value. In +** other words, the first varint in the footer is the byte offset of +** the first term, the second is the byte offset of the second less that +** of the first, and so on. +** +** The term/doclist format described above is accurate if the entire +** term/doclist data fits on a single leaf page. If this is not the case, +** the format is changed in two ways: +** +** + if the first rowid on a page occurs before the first term, it +** is stored as a literal value: +** +** varint: first rowid +** +** + the first term on each page is stored in the same way as the +** very first term of the segment: +** +** varint : size of first term +** blob: first term data +** +** 5. Segment doclist indexes: +** +** Doclist indexes are themselves b-trees, however they usually consist of +** a single leaf record only. The format of each doclist index leaf page +** is: +** +** * Flags byte. Bits are: +** 0x01: Clear if leaf is also the root page, otherwise set. +** +** * Page number of fts index leaf page. As a varint. +** +** * First rowid on page indicated by previous field. As a varint. +** +** * A list of varints, one for each subsequent termless page. A +** positive delta if the termless page contains at least one rowid, +** or an 0x00 byte otherwise. +** +** Internal doclist index nodes are: +** +** * Flags byte. Bits are: +** 0x01: Clear for root page, otherwise set. +** +** * Page number of first child page. As a varint. +** +** * Copy of first rowid on page indicated by previous field. As a varint. +** +** * A list of delta-encoded varints - the first rowid on each subsequent +** child page. +** +*/ + +/* +** Rowids for the averages and structure records in the %_data table. +*/ +#define FTS5_AVERAGES_ROWID 1 /* Rowid used for the averages record */ +#define FTS5_STRUCTURE_ROWID 10 /* The structure record */ + +/* +** Macros determining the rowids used by segment leaves and dlidx leaves +** and nodes. All nodes and leaves are stored in the %_data table with large +** positive rowids. +** +** Each segment has a unique non-zero 16-bit id. +** +** The rowid for each segment leaf is found by passing the segment id and +** the leaf page number to the FTS5_SEGMENT_ROWID macro. Leaves are numbered +** sequentially starting from 1. +*/ +#define FTS5_DATA_ID_B 16 /* Max seg id number 65535 */ +#define FTS5_DATA_DLI_B 1 /* Doclist-index flag (1 bit) */ +#define FTS5_DATA_HEIGHT_B 5 /* Max dlidx tree height of 32 */ +#define FTS5_DATA_PAGE_B 31 /* Max page number of 2147483648 */ + +#define fts5_dri(segid, dlidx, height, pgno) ( \ + ((i64)(segid) << (FTS5_DATA_PAGE_B+FTS5_DATA_HEIGHT_B+FTS5_DATA_DLI_B)) + \ + ((i64)(dlidx) << (FTS5_DATA_PAGE_B + FTS5_DATA_HEIGHT_B)) + \ + ((i64)(height) << (FTS5_DATA_PAGE_B)) + \ + ((i64)(pgno)) \ +) + +#define FTS5_SEGMENT_ROWID(segid, pgno) fts5_dri(segid, 0, 0, pgno) +#define FTS5_DLIDX_ROWID(segid, height, pgno) fts5_dri(segid, 1, height, pgno) + +/* +** Maximum segments permitted in a single index +*/ +#define FTS5_MAX_SEGMENT 2000 + +#ifdef SQLITE_DEBUG +static int sqlite3Fts5Corrupt() { return SQLITE_CORRUPT_VTAB; } +#endif + + +/* +** Each time a blob is read from the %_data table, it is padded with this +** many zero bytes. This makes it easier to decode the various record formats +** without overreading if the records are corrupt. +*/ +#define FTS5_DATA_ZERO_PADDING 8 +#define FTS5_DATA_PADDING 20 + +typedef struct Fts5Data Fts5Data; +typedef struct Fts5DlidxIter Fts5DlidxIter; +typedef struct Fts5DlidxLvl Fts5DlidxLvl; +typedef struct Fts5DlidxWriter Fts5DlidxWriter; +typedef struct Fts5Iter Fts5Iter; +typedef struct Fts5PageWriter Fts5PageWriter; +typedef struct Fts5SegIter Fts5SegIter; +typedef struct Fts5DoclistIter Fts5DoclistIter; +typedef struct Fts5SegWriter Fts5SegWriter; +typedef struct Fts5Structure Fts5Structure; +typedef struct Fts5StructureLevel Fts5StructureLevel; +typedef struct Fts5StructureSegment Fts5StructureSegment; + +struct Fts5Data { + u8 *p; /* Pointer to buffer containing record */ + int nn; /* Size of record in bytes */ + int szLeaf; /* Size of leaf without page-index */ +}; + +/* +** One object per %_data table. +*/ +struct Fts5Index { + Fts5Config *pConfig; /* Virtual table configuration */ + char *zDataTbl; /* Name of %_data table */ + int nWorkUnit; /* Leaf pages in a "unit" of work */ + + /* + ** Variables related to the accumulation of tokens and doclists within the + ** in-memory hash tables before they are flushed to disk. + */ + Fts5Hash *pHash; /* Hash table for in-memory data */ + int nPendingData; /* Current bytes of pending data */ + i64 iWriteRowid; /* Rowid for current doc being written */ + int bDelete; /* Current write is a delete */ + + /* Error state. */ + int rc; /* Current error code */ + + /* State used by the fts5DataXXX() functions. */ + sqlite3_blob *pReader; /* RO incr-blob open on %_data table */ + sqlite3_stmt *pWriter; /* "INSERT ... %_data VALUES(?,?)" */ + sqlite3_stmt *pDeleter; /* "DELETE FROM %_data ... id>=? AND id<=?" */ + sqlite3_stmt *pIdxWriter; /* "INSERT ... %_idx VALUES(?,?,?,?)" */ + sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=? */ + sqlite3_stmt *pIdxSelect; + int nRead; /* Total number of blocks read */ + + sqlite3_stmt *pDataVersion; + i64 iStructVersion; /* data_version when pStruct read */ + Fts5Structure *pStruct; /* Current db structure (or NULL) */ +}; + +struct Fts5DoclistIter { + u8 *aEof; /* Pointer to 1 byte past end of doclist */ + + /* Output variables. aPoslist==0 at EOF */ + i64 iRowid; + u8 *aPoslist; + int nPoslist; + int nSize; +}; + +/* +** The contents of the "structure" record for each index are represented +** using an Fts5Structure record in memory. Which uses instances of the +** other Fts5StructureXXX types as components. +*/ +struct Fts5StructureSegment { + int iSegid; /* Segment id */ + int pgnoFirst; /* First leaf page number in segment */ + int pgnoLast; /* Last leaf page number in segment */ +}; +struct Fts5StructureLevel { + int nMerge; /* Number of segments in incr-merge */ + int nSeg; /* Total number of segments on level */ + Fts5StructureSegment *aSeg; /* Array of segments. aSeg[0] is oldest. */ +}; +struct Fts5Structure { + int nRef; /* Object reference count */ + u64 nWriteCounter; /* Total leaves written to level 0 */ + int nSegment; /* Total segments in this structure */ + int nLevel; /* Number of levels in this index */ + Fts5StructureLevel aLevel[1]; /* Array of nLevel level objects */ +}; + +/* +** An object of type Fts5SegWriter is used to write to segments. +*/ +struct Fts5PageWriter { + int pgno; /* Page number for this page */ + int iPrevPgidx; /* Previous value written into pgidx */ + Fts5Buffer buf; /* Buffer containing leaf data */ + Fts5Buffer pgidx; /* Buffer containing page-index */ + Fts5Buffer term; /* Buffer containing previous term on page */ +}; +struct Fts5DlidxWriter { + int pgno; /* Page number for this page */ + int bPrevValid; /* True if iPrev is valid */ + i64 iPrev; /* Previous rowid value written to page */ + Fts5Buffer buf; /* Buffer containing page data */ +}; +struct Fts5SegWriter { + int iSegid; /* Segid to write to */ + Fts5PageWriter writer; /* PageWriter object */ + i64 iPrevRowid; /* Previous rowid written to current leaf */ + u8 bFirstRowidInDoclist; /* True if next rowid is first in doclist */ + u8 bFirstRowidInPage; /* True if next rowid is first in page */ + /* TODO1: Can use (writer.pgidx.n==0) instead of bFirstTermInPage */ + u8 bFirstTermInPage; /* True if next term will be first in leaf */ + int nLeafWritten; /* Number of leaf pages written */ + int nEmpty; /* Number of contiguous term-less nodes */ + + int nDlidx; /* Allocated size of aDlidx[] array */ + Fts5DlidxWriter *aDlidx; /* Array of Fts5DlidxWriter objects */ + + /* Values to insert into the %_idx table */ + Fts5Buffer btterm; /* Next term to insert into %_idx table */ + int iBtPage; /* Page number corresponding to btterm */ +}; + +typedef struct Fts5CResult Fts5CResult; +struct Fts5CResult { + u16 iFirst; /* aSeg[] index of firstest iterator */ + u8 bTermEq; /* True if the terms are equal */ +}; + +/* +** Object for iterating through a single segment, visiting each term/rowid +** pair in the segment. +** +** pSeg: +** The segment to iterate through. +** +** iLeafPgno: +** Current leaf page number within segment. +** +** iLeafOffset: +** Byte offset within the current leaf that is the first byte of the +** position list data (one byte passed the position-list size field). +** rowid field of the current entry. Usually this is the size field of the +** position list data. The exception is if the rowid for the current entry +** is the last thing on the leaf page. +** +** pLeaf: +** Buffer containing current leaf page data. Set to NULL at EOF. +** +** iTermLeafPgno, iTermLeafOffset: +** Leaf page number containing the last term read from the segment. And +** the offset immediately following the term data. +** +** flags: +** Mask of FTS5_SEGITER_XXX values. Interpreted as follows: +** +** FTS5_SEGITER_ONETERM: +** If set, set the iterator to point to EOF after the current doclist +** has been exhausted. Do not proceed to the next term in the segment. +** +** FTS5_SEGITER_REVERSE: +** This flag is only ever set if FTS5_SEGITER_ONETERM is also set. If +** it is set, iterate through rowid in descending order instead of the +** default ascending order. +** +** iRowidOffset/nRowidOffset/aRowidOffset: +** These are used if the FTS5_SEGITER_REVERSE flag is set. +** +** For each rowid on the page corresponding to the current term, the +** corresponding aRowidOffset[] entry is set to the byte offset of the +** start of the "position-list-size" field within the page. +** +** iTermIdx: +** Index of current term on iTermLeafPgno. +*/ +struct Fts5SegIter { + Fts5StructureSegment *pSeg; /* Segment to iterate through */ + int flags; /* Mask of configuration flags */ + int iLeafPgno; /* Current leaf page number */ + Fts5Data *pLeaf; /* Current leaf data */ + Fts5Data *pNextLeaf; /* Leaf page (iLeafPgno+1) */ + int iLeafOffset; /* Byte offset within current leaf */ + + /* Next method */ + void (*xNext)(Fts5Index*, Fts5SegIter*, int*); + + /* The page and offset from which the current term was read. The offset + ** is the offset of the first rowid in the current doclist. */ + int iTermLeafPgno; + int iTermLeafOffset; + + int iPgidxOff; /* Next offset in pgidx */ + int iEndofDoclist; + + /* The following are only used if the FTS5_SEGITER_REVERSE flag is set. */ + int iRowidOffset; /* Current entry in aRowidOffset[] */ + int nRowidOffset; /* Allocated size of aRowidOffset[] array */ + int *aRowidOffset; /* Array of offset to rowid fields */ + + Fts5DlidxIter *pDlidx; /* If there is a doclist-index */ + + /* Variables populated based on current entry. */ + Fts5Buffer term; /* Current term */ + i64 iRowid; /* Current rowid */ + int nPos; /* Number of bytes in current position list */ + u8 bDel; /* True if the delete flag is set */ +}; + +/* +** Argument is a pointer to an Fts5Data structure that contains a +** leaf page. +*/ +#define ASSERT_SZLEAF_OK(x) assert( \ + (x)->szLeaf==(x)->nn || (x)->szLeaf==fts5GetU16(&(x)->p[2]) \ +) + +#define FTS5_SEGITER_ONETERM 0x01 +#define FTS5_SEGITER_REVERSE 0x02 + +/* +** Argument is a pointer to an Fts5Data structure that contains a leaf +** page. This macro evaluates to true if the leaf contains no terms, or +** false if it contains at least one term. +*/ +#define fts5LeafIsTermless(x) ((x)->szLeaf >= (x)->nn) + +#define fts5LeafTermOff(x, i) (fts5GetU16(&(x)->p[(x)->szLeaf + (i)*2])) + +#define fts5LeafFirstRowidOff(x) (fts5GetU16((x)->p)) + +/* +** Object for iterating through the merged results of one or more segments, +** visiting each term/rowid pair in the merged data. +** +** nSeg is always a power of two greater than or equal to the number of +** segments that this object is merging data from. Both the aSeg[] and +** aFirst[] arrays are sized at nSeg entries. The aSeg[] array is padded +** with zeroed objects - these are handled as if they were iterators opened +** on empty segments. +** +** The results of comparing segments aSeg[N] and aSeg[N+1], where N is an +** even number, is stored in aFirst[(nSeg+N)/2]. The "result" of the +** comparison in this context is the index of the iterator that currently +** points to the smaller term/rowid combination. Iterators at EOF are +** considered to be greater than all other iterators. +** +** aFirst[1] contains the index in aSeg[] of the iterator that points to +** the smallest key overall. aFirst[0] is unused. +** +** poslist: +** Used by sqlite3Fts5IterPoslist() when the poslist needs to be buffered. +** There is no way to tell if this is populated or not. +*/ +struct Fts5Iter { + Fts5IndexIter base; /* Base class containing output vars */ + + Fts5Index *pIndex; /* Index that owns this iterator */ + Fts5Structure *pStruct; /* Database structure for this iterator */ + Fts5Buffer poslist; /* Buffer containing current poslist */ + Fts5Colset *pColset; /* Restrict matches to these columns */ + + /* Invoked to set output variables. */ + void (*xSetOutputs)(Fts5Iter*, Fts5SegIter*); + + int nSeg; /* Size of aSeg[] array */ + int bRev; /* True to iterate in reverse order */ + u8 bSkipEmpty; /* True to skip deleted entries */ + + i64 iSwitchRowid; /* Firstest rowid of other than aFirst[1] */ + Fts5CResult *aFirst; /* Current merge state (see above) */ + Fts5SegIter aSeg[1]; /* Array of segment iterators */ +}; + + +/* +** An instance of the following type is used to iterate through the contents +** of a doclist-index record. +** +** pData: +** Record containing the doclist-index data. +** +** bEof: +** Set to true once iterator has reached EOF. +** +** iOff: +** Set to the current offset within record pData. +*/ +struct Fts5DlidxLvl { + Fts5Data *pData; /* Data for current page of this level */ + int iOff; /* Current offset into pData */ + int bEof; /* At EOF already */ + int iFirstOff; /* Used by reverse iterators */ + + /* Output variables */ + int iLeafPgno; /* Page number of current leaf page */ + i64 iRowid; /* First rowid on leaf iLeafPgno */ +}; +struct Fts5DlidxIter { + int nLvl; + int iSegid; + Fts5DlidxLvl aLvl[1]; +}; + +static void fts5PutU16(u8 *aOut, u16 iVal){ + aOut[0] = (iVal>>8); + aOut[1] = (iVal&0xFF); +} + +static u16 fts5GetU16(const u8 *aIn){ + return ((u16)aIn[0] << 8) + aIn[1]; +} + +/* +** Allocate and return a buffer at least nByte bytes in size. +** +** If an OOM error is encountered, return NULL and set the error code in +** the Fts5Index handle passed as the first argument. +*/ +static void *fts5IdxMalloc(Fts5Index *p, int nByte){ + return sqlite3Fts5MallocZero(&p->rc, nByte); +} + +/* +** Compare the contents of the pLeft buffer with the pRight/nRight blob. +** +** Return -ve if pLeft is smaller than pRight, 0 if they are equal or +** +ve if pRight is smaller than pLeft. In other words: +** +** res = *pLeft - *pRight +*/ +#ifdef SQLITE_DEBUG +static int fts5BufferCompareBlob( + Fts5Buffer *pLeft, /* Left hand side of comparison */ + const u8 *pRight, int nRight /* Right hand side of comparison */ +){ + int nCmp = MIN(pLeft->n, nRight); + int res = memcmp(pLeft->p, pRight, nCmp); + return (res==0 ? (pLeft->n - nRight) : res); +} +#endif + +/* +** Compare the contents of the two buffers using memcmp(). If one buffer +** is a prefix of the other, it is considered the lesser. +** +** Return -ve if pLeft is smaller than pRight, 0 if they are equal or +** +ve if pRight is smaller than pLeft. In other words: +** +** res = *pLeft - *pRight +*/ +static int fts5BufferCompare(Fts5Buffer *pLeft, Fts5Buffer *pRight){ + int nCmp = MIN(pLeft->n, pRight->n); + int res = memcmp(pLeft->p, pRight->p, nCmp); + return (res==0 ? (pLeft->n - pRight->n) : res); +} + +static int fts5LeafFirstTermOff(Fts5Data *pLeaf){ + int ret; + fts5GetVarint32(&pLeaf->p[pLeaf->szLeaf], ret); + return ret; +} + +/* +** Close the read-only blob handle, if it is open. +*/ +static void fts5CloseReader(Fts5Index *p){ + if( p->pReader ){ + sqlite3_blob *pReader = p->pReader; + p->pReader = 0; + sqlite3_blob_close(pReader); + } +} + +/* +** Retrieve a record from the %_data table. +** +** If an error occurs, NULL is returned and an error left in the +** Fts5Index object. +*/ +static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ + Fts5Data *pRet = 0; + if( p->rc==SQLITE_OK ){ + int rc = SQLITE_OK; + + if( p->pReader ){ + /* This call may return SQLITE_ABORT if there has been a savepoint + ** rollback since it was last used. In this case a new blob handle + ** is required. */ + sqlite3_blob *pBlob = p->pReader; + p->pReader = 0; + rc = sqlite3_blob_reopen(pBlob, iRowid); + assert( p->pReader==0 ); + p->pReader = pBlob; + if( rc!=SQLITE_OK ){ + fts5CloseReader(p); + } + if( rc==SQLITE_ABORT ) rc = SQLITE_OK; + } + + /* If the blob handle is not open at this point, open it and seek + ** to the requested entry. */ + if( p->pReader==0 && rc==SQLITE_OK ){ + Fts5Config *pConfig = p->pConfig; + rc = sqlite3_blob_open(pConfig->db, + pConfig->zDb, p->zDataTbl, "block", iRowid, 0, &p->pReader + ); + } + + /* If either of the sqlite3_blob_open() or sqlite3_blob_reopen() calls + ** above returned SQLITE_ERROR, return SQLITE_CORRUPT_VTAB instead. + ** All the reasons those functions might return SQLITE_ERROR - missing + ** table, missing row, non-blob/text in block column - indicate + ** backing store corruption. */ + if( rc==SQLITE_ERROR ) rc = FTS5_CORRUPT; + + if( rc==SQLITE_OK ){ + u8 *aOut = 0; /* Read blob data into this buffer */ + int nByte = sqlite3_blob_bytes(p->pReader); + int nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; + pRet = (Fts5Data*)sqlite3_malloc(nAlloc); + if( pRet ){ + pRet->nn = nByte; + aOut = pRet->p = (u8*)&pRet[1]; + }else{ + rc = SQLITE_NOMEM; + } + + if( rc==SQLITE_OK ){ + rc = sqlite3_blob_read(p->pReader, aOut, nByte, 0); + } + if( rc!=SQLITE_OK ){ + sqlite3_free(pRet); + pRet = 0; + }else{ + /* TODO1: Fix this */ + pRet->szLeaf = fts5GetU16(&pRet->p[2]); + } + } + p->rc = rc; + p->nRead++; + } + + assert( (pRet==0)==(p->rc!=SQLITE_OK) ); + return pRet; +} + +/* +** Release a reference to data record returned by an earlier call to +** fts5DataRead(). +*/ +static void fts5DataRelease(Fts5Data *pData){ + sqlite3_free(pData); +} + +static Fts5Data *fts5LeafRead(Fts5Index *p, i64 iRowid){ + Fts5Data *pRet = fts5DataRead(p, iRowid); + if( pRet ){ + if( pRet->szLeaf>pRet->nn ){ + p->rc = FTS5_CORRUPT; + fts5DataRelease(pRet); + pRet = 0; + } + } + return pRet; +} + +static int fts5IndexPrepareStmt( + Fts5Index *p, + sqlite3_stmt **ppStmt, + char *zSql +){ + if( p->rc==SQLITE_OK ){ + if( zSql ){ + p->rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, + SQLITE_PREPARE_PERSISTENT, ppStmt, 0); + }else{ + p->rc = SQLITE_NOMEM; + } + } + sqlite3_free(zSql); + return p->rc; +} + + +/* +** INSERT OR REPLACE a record into the %_data table. +*/ +static void fts5DataWrite(Fts5Index *p, i64 iRowid, const u8 *pData, int nData){ + if( p->rc!=SQLITE_OK ) return; + + if( p->pWriter==0 ){ + Fts5Config *pConfig = p->pConfig; + fts5IndexPrepareStmt(p, &p->pWriter, sqlite3_mprintf( + "REPLACE INTO '%q'.'%q_data'(id, block) VALUES(?,?)", + pConfig->zDb, pConfig->zName + )); + if( p->rc ) return; + } + + sqlite3_bind_int64(p->pWriter, 1, iRowid); + sqlite3_bind_blob(p->pWriter, 2, pData, nData, SQLITE_STATIC); + sqlite3_step(p->pWriter); + p->rc = sqlite3_reset(p->pWriter); + sqlite3_bind_null(p->pWriter, 2); +} + +/* +** Execute the following SQL: +** +** DELETE FROM %_data WHERE id BETWEEN $iFirst AND $iLast +*/ +static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ + if( p->rc!=SQLITE_OK ) return; + + if( p->pDeleter==0 ){ + int rc; + Fts5Config *pConfig = p->pConfig; + char *zSql = sqlite3_mprintf( + "DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?", + pConfig->zDb, pConfig->zName + ); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, + SQLITE_PREPARE_PERSISTENT, &p->pDeleter, 0); + sqlite3_free(zSql); + } + if( rc!=SQLITE_OK ){ + p->rc = rc; + return; + } + } + + sqlite3_bind_int64(p->pDeleter, 1, iFirst); + sqlite3_bind_int64(p->pDeleter, 2, iLast); + sqlite3_step(p->pDeleter); + p->rc = sqlite3_reset(p->pDeleter); +} + +/* +** Remove all records associated with segment iSegid. +*/ +static void fts5DataRemoveSegment(Fts5Index *p, int iSegid){ + i64 iFirst = FTS5_SEGMENT_ROWID(iSegid, 0); + i64 iLast = FTS5_SEGMENT_ROWID(iSegid+1, 0)-1; + fts5DataDelete(p, iFirst, iLast); + if( p->pIdxDeleter==0 ){ + Fts5Config *pConfig = p->pConfig; + fts5IndexPrepareStmt(p, &p->pIdxDeleter, sqlite3_mprintf( + "DELETE FROM '%q'.'%q_idx' WHERE segid=?", + pConfig->zDb, pConfig->zName + )); + } + if( p->rc==SQLITE_OK ){ + sqlite3_bind_int(p->pIdxDeleter, 1, iSegid); + sqlite3_step(p->pIdxDeleter); + p->rc = sqlite3_reset(p->pIdxDeleter); + } +} + +/* +** Release a reference to an Fts5Structure object returned by an earlier +** call to fts5StructureRead() or fts5StructureDecode(). +*/ +static void fts5StructureRelease(Fts5Structure *pStruct){ + if( pStruct && 0>=(--pStruct->nRef) ){ + int i; + assert( pStruct->nRef==0 ); + for(i=0; i<pStruct->nLevel; i++){ + sqlite3_free(pStruct->aLevel[i].aSeg); + } + sqlite3_free(pStruct); + } +} + +static void fts5StructureRef(Fts5Structure *pStruct){ + pStruct->nRef++; +} + +/* +** Deserialize and return the structure record currently stored in serialized +** form within buffer pData/nData. +** +** The Fts5Structure.aLevel[] and each Fts5StructureLevel.aSeg[] array +** are over-allocated by one slot. This allows the structure contents +** to be more easily edited. +** +** If an error occurs, *ppOut is set to NULL and an SQLite error code +** returned. Otherwise, *ppOut is set to point to the new object and +** SQLITE_OK returned. +*/ +static int fts5StructureDecode( + const u8 *pData, /* Buffer containing serialized structure */ + int nData, /* Size of buffer pData in bytes */ + int *piCookie, /* Configuration cookie value */ + Fts5Structure **ppOut /* OUT: Deserialized object */ +){ + int rc = SQLITE_OK; + int i = 0; + int iLvl; + int nLevel = 0; + int nSegment = 0; + int nByte; /* Bytes of space to allocate at pRet */ + Fts5Structure *pRet = 0; /* Structure object to return */ + + /* Grab the cookie value */ + if( piCookie ) *piCookie = sqlite3Fts5Get32(pData); + i = 4; + + /* Read the total number of levels and segments from the start of the + ** structure record. */ + i += fts5GetVarint32(&pData[i], nLevel); + i += fts5GetVarint32(&pData[i], nSegment); + nByte = ( + sizeof(Fts5Structure) + /* Main structure */ + sizeof(Fts5StructureLevel) * (nLevel-1) /* aLevel[] array */ + ); + pRet = (Fts5Structure*)sqlite3Fts5MallocZero(&rc, nByte); + + if( pRet ){ + pRet->nRef = 1; + pRet->nLevel = nLevel; + pRet->nSegment = nSegment; + i += sqlite3Fts5GetVarint(&pData[i], &pRet->nWriteCounter); + + for(iLvl=0; rc==SQLITE_OK && iLvl<nLevel; iLvl++){ + Fts5StructureLevel *pLvl = &pRet->aLevel[iLvl]; + int nTotal = 0; + int iSeg; + + if( i>=nData ){ + rc = FTS5_CORRUPT; + }else{ + i += fts5GetVarint32(&pData[i], pLvl->nMerge); + i += fts5GetVarint32(&pData[i], nTotal); + assert( nTotal>=pLvl->nMerge ); + pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc, + nTotal * sizeof(Fts5StructureSegment) + ); + } + + if( rc==SQLITE_OK ){ + pLvl->nSeg = nTotal; + for(iSeg=0; iSeg<nTotal; iSeg++){ + if( i>=nData ){ + rc = FTS5_CORRUPT; + break; + } + i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].iSegid); + i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoFirst); + i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoLast); + } + } + } + if( rc!=SQLITE_OK ){ + fts5StructureRelease(pRet); + pRet = 0; + } + } + + *ppOut = pRet; + return rc; +} + +/* +** +*/ +static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ + if( *pRc==SQLITE_OK ){ + Fts5Structure *pStruct = *ppStruct; + int nLevel = pStruct->nLevel; + int nByte = ( + sizeof(Fts5Structure) + /* Main structure */ + sizeof(Fts5StructureLevel) * (nLevel+1) /* aLevel[] array */ + ); + + pStruct = sqlite3_realloc(pStruct, nByte); + if( pStruct ){ + memset(&pStruct->aLevel[nLevel], 0, sizeof(Fts5StructureLevel)); + pStruct->nLevel++; + *ppStruct = pStruct; + }else{ + *pRc = SQLITE_NOMEM; + } + } +} + +/* +** Extend level iLvl so that there is room for at least nExtra more +** segments. +*/ +static void fts5StructureExtendLevel( + int *pRc, + Fts5Structure *pStruct, + int iLvl, + int nExtra, + int bInsert +){ + if( *pRc==SQLITE_OK ){ + Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; + Fts5StructureSegment *aNew; + int nByte; + + nByte = (pLvl->nSeg + nExtra) * sizeof(Fts5StructureSegment); + aNew = sqlite3_realloc(pLvl->aSeg, nByte); + if( aNew ){ + if( bInsert==0 ){ + memset(&aNew[pLvl->nSeg], 0, sizeof(Fts5StructureSegment) * nExtra); + }else{ + int nMove = pLvl->nSeg * sizeof(Fts5StructureSegment); + memmove(&aNew[nExtra], aNew, nMove); + memset(aNew, 0, sizeof(Fts5StructureSegment) * nExtra); + } + pLvl->aSeg = aNew; + }else{ + *pRc = SQLITE_NOMEM; + } + } +} + +static Fts5Structure *fts5StructureReadUncached(Fts5Index *p){ + Fts5Structure *pRet = 0; + Fts5Config *pConfig = p->pConfig; + int iCookie; /* Configuration cookie */ + Fts5Data *pData; + + pData = fts5DataRead(p, FTS5_STRUCTURE_ROWID); + if( p->rc==SQLITE_OK ){ + /* TODO: Do we need this if the leaf-index is appended? Probably... */ + memset(&pData->p[pData->nn], 0, FTS5_DATA_PADDING); + p->rc = fts5StructureDecode(pData->p, pData->nn, &iCookie, &pRet); + if( p->rc==SQLITE_OK && pConfig->iCookie!=iCookie ){ + p->rc = sqlite3Fts5ConfigLoad(pConfig, iCookie); + } + fts5DataRelease(pData); + if( p->rc!=SQLITE_OK ){ + fts5StructureRelease(pRet); + pRet = 0; + } + } + + return pRet; +} + +static i64 fts5IndexDataVersion(Fts5Index *p){ + i64 iVersion = 0; + + if( p->rc==SQLITE_OK ){ + if( p->pDataVersion==0 ){ + p->rc = fts5IndexPrepareStmt(p, &p->pDataVersion, + sqlite3_mprintf("PRAGMA %Q.data_version", p->pConfig->zDb) + ); + if( p->rc ) return 0; + } + + if( SQLITE_ROW==sqlite3_step(p->pDataVersion) ){ + iVersion = sqlite3_column_int64(p->pDataVersion, 0); + } + p->rc = sqlite3_reset(p->pDataVersion); + } + + return iVersion; +} + +/* +** Read, deserialize and return the structure record. +** +** The Fts5Structure.aLevel[] and each Fts5StructureLevel.aSeg[] array +** are over-allocated as described for function fts5StructureDecode() +** above. +** +** If an error occurs, NULL is returned and an error code left in the +** Fts5Index handle. If an error has already occurred when this function +** is called, it is a no-op. +*/ +static Fts5Structure *fts5StructureRead(Fts5Index *p){ + + if( p->pStruct==0 ){ + p->iStructVersion = fts5IndexDataVersion(p); + if( p->rc==SQLITE_OK ){ + p->pStruct = fts5StructureReadUncached(p); + } + } + +#if 0 + else{ + Fts5Structure *pTest = fts5StructureReadUncached(p); + if( pTest ){ + int i, j; + assert_nc( p->pStruct->nSegment==pTest->nSegment ); + assert_nc( p->pStruct->nLevel==pTest->nLevel ); + for(i=0; i<pTest->nLevel; i++){ + assert_nc( p->pStruct->aLevel[i].nMerge==pTest->aLevel[i].nMerge ); + assert_nc( p->pStruct->aLevel[i].nSeg==pTest->aLevel[i].nSeg ); + for(j=0; j<pTest->aLevel[i].nSeg; j++){ + Fts5StructureSegment *p1 = &pTest->aLevel[i].aSeg[j]; + Fts5StructureSegment *p2 = &p->pStruct->aLevel[i].aSeg[j]; + assert_nc( p1->iSegid==p2->iSegid ); + assert_nc( p1->pgnoFirst==p2->pgnoFirst ); + assert_nc( p1->pgnoLast==p2->pgnoLast ); + } + } + fts5StructureRelease(pTest); + } + } +#endif + + if( p->rc!=SQLITE_OK ) return 0; + assert( p->iStructVersion!=0 ); + assert( p->pStruct!=0 ); + fts5StructureRef(p->pStruct); + return p->pStruct; +} + +static void fts5StructureInvalidate(Fts5Index *p){ + if( p->pStruct ){ + fts5StructureRelease(p->pStruct); + p->pStruct = 0; + } +} + +/* +** Return the total number of segments in index structure pStruct. This +** function is only ever used as part of assert() conditions. +*/ +#ifdef SQLITE_DEBUG +static int fts5StructureCountSegments(Fts5Structure *pStruct){ + int nSegment = 0; /* Total number of segments */ + if( pStruct ){ + int iLvl; /* Used to iterate through levels */ + for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){ + nSegment += pStruct->aLevel[iLvl].nSeg; + } + } + + return nSegment; +} +#endif + +#define fts5BufferSafeAppendBlob(pBuf, pBlob, nBlob) { \ + assert( (pBuf)->nSpace>=((pBuf)->n+nBlob) ); \ + memcpy(&(pBuf)->p[(pBuf)->n], pBlob, nBlob); \ + (pBuf)->n += nBlob; \ +} + +#define fts5BufferSafeAppendVarint(pBuf, iVal) { \ + (pBuf)->n += sqlite3Fts5PutVarint(&(pBuf)->p[(pBuf)->n], (iVal)); \ + assert( (pBuf)->nSpace>=(pBuf)->n ); \ +} + + +/* +** Serialize and store the "structure" record. +** +** If an error occurs, leave an error code in the Fts5Index object. If an +** error has already occurred, this function is a no-op. +*/ +static void fts5StructureWrite(Fts5Index *p, Fts5Structure *pStruct){ + if( p->rc==SQLITE_OK ){ + Fts5Buffer buf; /* Buffer to serialize record into */ + int iLvl; /* Used to iterate through levels */ + int iCookie; /* Cookie value to store */ + + assert( pStruct->nSegment==fts5StructureCountSegments(pStruct) ); + memset(&buf, 0, sizeof(Fts5Buffer)); + + /* Append the current configuration cookie */ + iCookie = p->pConfig->iCookie; + if( iCookie<0 ) iCookie = 0; + + if( 0==sqlite3Fts5BufferSize(&p->rc, &buf, 4+9+9+9) ){ + sqlite3Fts5Put32(buf.p, iCookie); + buf.n = 4; + fts5BufferSafeAppendVarint(&buf, pStruct->nLevel); + fts5BufferSafeAppendVarint(&buf, pStruct->nSegment); + fts5BufferSafeAppendVarint(&buf, (i64)pStruct->nWriteCounter); + } + + for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){ + int iSeg; /* Used to iterate through segments */ + Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; + fts5BufferAppendVarint(&p->rc, &buf, pLvl->nMerge); + fts5BufferAppendVarint(&p->rc, &buf, pLvl->nSeg); + assert( pLvl->nMerge<=pLvl->nSeg ); + + for(iSeg=0; iSeg<pLvl->nSeg; iSeg++){ + fts5BufferAppendVarint(&p->rc, &buf, pLvl->aSeg[iSeg].iSegid); + fts5BufferAppendVarint(&p->rc, &buf, pLvl->aSeg[iSeg].pgnoFirst); + fts5BufferAppendVarint(&p->rc, &buf, pLvl->aSeg[iSeg].pgnoLast); + } + } + + fts5DataWrite(p, FTS5_STRUCTURE_ROWID, buf.p, buf.n); + fts5BufferFree(&buf); + } +} + +#if 0 +static void fts5DebugStructure(int*,Fts5Buffer*,Fts5Structure*); +static void fts5PrintStructure(const char *zCaption, Fts5Structure *pStruct){ + int rc = SQLITE_OK; + Fts5Buffer buf; + memset(&buf, 0, sizeof(buf)); + fts5DebugStructure(&rc, &buf, pStruct); + fprintf(stdout, "%s: %s\n", zCaption, buf.p); + fflush(stdout); + fts5BufferFree(&buf); +} +#else +# define fts5PrintStructure(x,y) +#endif + +static int fts5SegmentSize(Fts5StructureSegment *pSeg){ + return 1 + pSeg->pgnoLast - pSeg->pgnoFirst; +} + +/* +** Return a copy of index structure pStruct. Except, promote as many +** segments as possible to level iPromote. If an OOM occurs, NULL is +** returned. +*/ +static void fts5StructurePromoteTo( + Fts5Index *p, + int iPromote, + int szPromote, + Fts5Structure *pStruct +){ + int il, is; + Fts5StructureLevel *pOut = &pStruct->aLevel[iPromote]; + + if( pOut->nMerge==0 ){ + for(il=iPromote+1; il<pStruct->nLevel; il++){ + Fts5StructureLevel *pLvl = &pStruct->aLevel[il]; + if( pLvl->nMerge ) return; + for(is=pLvl->nSeg-1; is>=0; is--){ + int sz = fts5SegmentSize(&pLvl->aSeg[is]); + if( sz>szPromote ) return; + fts5StructureExtendLevel(&p->rc, pStruct, iPromote, 1, 1); + if( p->rc ) return; + memcpy(pOut->aSeg, &pLvl->aSeg[is], sizeof(Fts5StructureSegment)); + pOut->nSeg++; + pLvl->nSeg--; + } + } + } +} + +/* +** A new segment has just been written to level iLvl of index structure +** pStruct. This function determines if any segments should be promoted +** as a result. Segments are promoted in two scenarios: +** +** a) If the segment just written is smaller than one or more segments +** within the previous populated level, it is promoted to the previous +** populated level. +** +** b) If the segment just written is larger than the newest segment on +** the next populated level, then that segment, and any other adjacent +** segments that are also smaller than the one just written, are +** promoted. +** +** If one or more segments are promoted, the structure object is updated +** to reflect this. +*/ +static void fts5StructurePromote( + Fts5Index *p, /* FTS5 backend object */ + int iLvl, /* Index level just updated */ + Fts5Structure *pStruct /* Index structure */ +){ + if( p->rc==SQLITE_OK ){ + int iTst; + int iPromote = -1; + int szPromote = 0; /* Promote anything this size or smaller */ + Fts5StructureSegment *pSeg; /* Segment just written */ + int szSeg; /* Size of segment just written */ + int nSeg = pStruct->aLevel[iLvl].nSeg; + + if( nSeg==0 ) return; + pSeg = &pStruct->aLevel[iLvl].aSeg[pStruct->aLevel[iLvl].nSeg-1]; + szSeg = (1 + pSeg->pgnoLast - pSeg->pgnoFirst); + + /* Check for condition (a) */ + for(iTst=iLvl-1; iTst>=0 && pStruct->aLevel[iTst].nSeg==0; iTst--); + if( iTst>=0 ){ + int i; + int szMax = 0; + Fts5StructureLevel *pTst = &pStruct->aLevel[iTst]; + assert( pTst->nMerge==0 ); + for(i=0; i<pTst->nSeg; i++){ + int sz = pTst->aSeg[i].pgnoLast - pTst->aSeg[i].pgnoFirst + 1; + if( sz>szMax ) szMax = sz; + } + if( szMax>=szSeg ){ + /* Condition (a) is true. Promote the newest segment on level + ** iLvl to level iTst. */ + iPromote = iTst; + szPromote = szMax; + } + } + + /* If condition (a) is not met, assume (b) is true. StructurePromoteTo() + ** is a no-op if it is not. */ + if( iPromote<0 ){ + iPromote = iLvl; + szPromote = szSeg; + } + fts5StructurePromoteTo(p, iPromote, szPromote, pStruct); + } +} + + +/* +** Advance the iterator passed as the only argument. If the end of the +** doclist-index page is reached, return non-zero. +*/ +static int fts5DlidxLvlNext(Fts5DlidxLvl *pLvl){ + Fts5Data *pData = pLvl->pData; + + if( pLvl->iOff==0 ){ + assert( pLvl->bEof==0 ); + pLvl->iOff = 1; + pLvl->iOff += fts5GetVarint32(&pData->p[1], pLvl->iLeafPgno); + pLvl->iOff += fts5GetVarint(&pData->p[pLvl->iOff], (u64*)&pLvl->iRowid); + pLvl->iFirstOff = pLvl->iOff; + }else{ + int iOff; + for(iOff=pLvl->iOff; iOff<pData->nn; iOff++){ + if( pData->p[iOff] ) break; + } + + if( iOff<pData->nn ){ + i64 iVal; + pLvl->iLeafPgno += (iOff - pLvl->iOff) + 1; + iOff += fts5GetVarint(&pData->p[iOff], (u64*)&iVal); + pLvl->iRowid += iVal; + pLvl->iOff = iOff; + }else{ + pLvl->bEof = 1; + } + } + + return pLvl->bEof; +} + +/* +** Advance the iterator passed as the only argument. +*/ +static int fts5DlidxIterNextR(Fts5Index *p, Fts5DlidxIter *pIter, int iLvl){ + Fts5DlidxLvl *pLvl = &pIter->aLvl[iLvl]; + + assert( iLvl<pIter->nLvl ); + if( fts5DlidxLvlNext(pLvl) ){ + if( (iLvl+1) < pIter->nLvl ){ + fts5DlidxIterNextR(p, pIter, iLvl+1); + if( pLvl[1].bEof==0 ){ + fts5DataRelease(pLvl->pData); + memset(pLvl, 0, sizeof(Fts5DlidxLvl)); + pLvl->pData = fts5DataRead(p, + FTS5_DLIDX_ROWID(pIter->iSegid, iLvl, pLvl[1].iLeafPgno) + ); + if( pLvl->pData ) fts5DlidxLvlNext(pLvl); + } + } + } + + return pIter->aLvl[0].bEof; +} +static int fts5DlidxIterNext(Fts5Index *p, Fts5DlidxIter *pIter){ + return fts5DlidxIterNextR(p, pIter, 0); +} + +/* +** The iterator passed as the first argument has the following fields set +** as follows. This function sets up the rest of the iterator so that it +** points to the first rowid in the doclist-index. +** +** pData: +** pointer to doclist-index record, +** +** When this function is called pIter->iLeafPgno is the page number the +** doclist is associated with (the one featuring the term). +*/ +static int fts5DlidxIterFirst(Fts5DlidxIter *pIter){ + int i; + for(i=0; i<pIter->nLvl; i++){ + fts5DlidxLvlNext(&pIter->aLvl[i]); + } + return pIter->aLvl[0].bEof; +} + + +static int fts5DlidxIterEof(Fts5Index *p, Fts5DlidxIter *pIter){ + return p->rc!=SQLITE_OK || pIter->aLvl[0].bEof; +} + +static void fts5DlidxIterLast(Fts5Index *p, Fts5DlidxIter *pIter){ + int i; + + /* Advance each level to the last entry on the last page */ + for(i=pIter->nLvl-1; p->rc==SQLITE_OK && i>=0; i--){ + Fts5DlidxLvl *pLvl = &pIter->aLvl[i]; + while( fts5DlidxLvlNext(pLvl)==0 ); + pLvl->bEof = 0; + + if( i>0 ){ + Fts5DlidxLvl *pChild = &pLvl[-1]; + fts5DataRelease(pChild->pData); + memset(pChild, 0, sizeof(Fts5DlidxLvl)); + pChild->pData = fts5DataRead(p, + FTS5_DLIDX_ROWID(pIter->iSegid, i-1, pLvl->iLeafPgno) + ); + } + } +} + +/* +** Move the iterator passed as the only argument to the previous entry. +*/ +static int fts5DlidxLvlPrev(Fts5DlidxLvl *pLvl){ + int iOff = pLvl->iOff; + + assert( pLvl->bEof==0 ); + if( iOff<=pLvl->iFirstOff ){ + pLvl->bEof = 1; + }else{ + u8 *a = pLvl->pData->p; + i64 iVal; + int iLimit; + int ii; + int nZero = 0; + + /* Currently iOff points to the first byte of a varint. This block + ** decrements iOff until it points to the first byte of the previous + ** varint. Taking care not to read any memory locations that occur + ** before the buffer in memory. */ + iLimit = (iOff>9 ? iOff-9 : 0); + for(iOff--; iOff>iLimit; iOff--){ + if( (a[iOff-1] & 0x80)==0 ) break; + } + + fts5GetVarint(&a[iOff], (u64*)&iVal); + pLvl->iRowid -= iVal; + pLvl->iLeafPgno--; + + /* Skip backwards past any 0x00 varints. */ + for(ii=iOff-1; ii>=pLvl->iFirstOff && a[ii]==0x00; ii--){ + nZero++; + } + if( ii>=pLvl->iFirstOff && (a[ii] & 0x80) ){ + /* The byte immediately before the last 0x00 byte has the 0x80 bit + ** set. So the last 0x00 is only a varint 0 if there are 8 more 0x80 + ** bytes before a[ii]. */ + int bZero = 0; /* True if last 0x00 counts */ + if( (ii-8)>=pLvl->iFirstOff ){ + int j; + for(j=1; j<=8 && (a[ii-j] & 0x80); j++); + bZero = (j>8); + } + if( bZero==0 ) nZero--; + } + pLvl->iLeafPgno -= nZero; + pLvl->iOff = iOff - nZero; + } + + return pLvl->bEof; +} + +static int fts5DlidxIterPrevR(Fts5Index *p, Fts5DlidxIter *pIter, int iLvl){ + Fts5DlidxLvl *pLvl = &pIter->aLvl[iLvl]; + + assert( iLvl<pIter->nLvl ); + if( fts5DlidxLvlPrev(pLvl) ){ + if( (iLvl+1) < pIter->nLvl ){ + fts5DlidxIterPrevR(p, pIter, iLvl+1); + if( pLvl[1].bEof==0 ){ + fts5DataRelease(pLvl->pData); + memset(pLvl, 0, sizeof(Fts5DlidxLvl)); + pLvl->pData = fts5DataRead(p, + FTS5_DLIDX_ROWID(pIter->iSegid, iLvl, pLvl[1].iLeafPgno) + ); + if( pLvl->pData ){ + while( fts5DlidxLvlNext(pLvl)==0 ); + pLvl->bEof = 0; + } + } + } + } + + return pIter->aLvl[0].bEof; +} +static int fts5DlidxIterPrev(Fts5Index *p, Fts5DlidxIter *pIter){ + return fts5DlidxIterPrevR(p, pIter, 0); +} + +/* +** Free a doclist-index iterator object allocated by fts5DlidxIterInit(). +*/ +static void fts5DlidxIterFree(Fts5DlidxIter *pIter){ + if( pIter ){ + int i; + for(i=0; i<pIter->nLvl; i++){ + fts5DataRelease(pIter->aLvl[i].pData); + } + sqlite3_free(pIter); + } +} + +static Fts5DlidxIter *fts5DlidxIterInit( + Fts5Index *p, /* Fts5 Backend to iterate within */ + int bRev, /* True for ORDER BY ASC */ + int iSegid, /* Segment id */ + int iLeafPg /* Leaf page number to load dlidx for */ +){ + Fts5DlidxIter *pIter = 0; + int i; + int bDone = 0; + + for(i=0; p->rc==SQLITE_OK && bDone==0; i++){ + int nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); + Fts5DlidxIter *pNew; + + pNew = (Fts5DlidxIter*)sqlite3_realloc(pIter, nByte); + if( pNew==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + i64 iRowid = FTS5_DLIDX_ROWID(iSegid, i, iLeafPg); + Fts5DlidxLvl *pLvl = &pNew->aLvl[i]; + pIter = pNew; + memset(pLvl, 0, sizeof(Fts5DlidxLvl)); + pLvl->pData = fts5DataRead(p, iRowid); + if( pLvl->pData && (pLvl->pData->p[0] & 0x0001)==0 ){ + bDone = 1; + } + pIter->nLvl = i+1; + } + } + + if( p->rc==SQLITE_OK ){ + pIter->iSegid = iSegid; + if( bRev==0 ){ + fts5DlidxIterFirst(pIter); + }else{ + fts5DlidxIterLast(p, pIter); + } + } + + if( p->rc!=SQLITE_OK ){ + fts5DlidxIterFree(pIter); + pIter = 0; + } + + return pIter; +} + +static i64 fts5DlidxIterRowid(Fts5DlidxIter *pIter){ + return pIter->aLvl[0].iRowid; +} +static int fts5DlidxIterPgno(Fts5DlidxIter *pIter){ + return pIter->aLvl[0].iLeafPgno; +} + +/* +** Load the next leaf page into the segment iterator. +*/ +static void fts5SegIterNextPage( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegIter *pIter /* Iterator to advance to next page */ +){ + Fts5Data *pLeaf; + Fts5StructureSegment *pSeg = pIter->pSeg; + fts5DataRelease(pIter->pLeaf); + pIter->iLeafPgno++; + if( pIter->pNextLeaf ){ + pIter->pLeaf = pIter->pNextLeaf; + pIter->pNextLeaf = 0; + }else if( pIter->iLeafPgno<=pSeg->pgnoLast ){ + pIter->pLeaf = fts5LeafRead(p, + FTS5_SEGMENT_ROWID(pSeg->iSegid, pIter->iLeafPgno) + ); + }else{ + pIter->pLeaf = 0; + } + pLeaf = pIter->pLeaf; + + if( pLeaf ){ + pIter->iPgidxOff = pLeaf->szLeaf; + if( fts5LeafIsTermless(pLeaf) ){ + pIter->iEndofDoclist = pLeaf->nn+1; + }else{ + pIter->iPgidxOff += fts5GetVarint32(&pLeaf->p[pIter->iPgidxOff], + pIter->iEndofDoclist + ); + } + } +} + +/* +** Argument p points to a buffer containing a varint to be interpreted as a +** position list size field. Read the varint and return the number of bytes +** read. Before returning, set *pnSz to the number of bytes in the position +** list, and *pbDel to true if the delete flag is set, or false otherwise. +*/ +static int fts5GetPoslistSize(const u8 *p, int *pnSz, int *pbDel){ + int nSz; + int n = 0; + fts5FastGetVarint32(p, n, nSz); + assert_nc( nSz>=0 ); + *pnSz = nSz/2; + *pbDel = nSz & 0x0001; + return n; +} + +/* +** Fts5SegIter.iLeafOffset currently points to the first byte of a +** position-list size field. Read the value of the field and store it +** in the following variables: +** +** Fts5SegIter.nPos +** Fts5SegIter.bDel +** +** Leave Fts5SegIter.iLeafOffset pointing to the first byte of the +** position list content (if any). +*/ +static void fts5SegIterLoadNPos(Fts5Index *p, Fts5SegIter *pIter){ + if( p->rc==SQLITE_OK ){ + int iOff = pIter->iLeafOffset; /* Offset to read at */ + ASSERT_SZLEAF_OK(pIter->pLeaf); + if( p->pConfig->eDetail==FTS5_DETAIL_NONE ){ + int iEod = MIN(pIter->iEndofDoclist, pIter->pLeaf->szLeaf); + pIter->bDel = 0; + pIter->nPos = 1; + if( iOff<iEod && pIter->pLeaf->p[iOff]==0 ){ + pIter->bDel = 1; + iOff++; + if( iOff<iEod && pIter->pLeaf->p[iOff]==0 ){ + pIter->nPos = 1; + iOff++; + }else{ + pIter->nPos = 0; + } + } + }else{ + int nSz; + fts5FastGetVarint32(pIter->pLeaf->p, iOff, nSz); + pIter->bDel = (nSz & 0x0001); + pIter->nPos = nSz>>1; + assert_nc( pIter->nPos>=0 ); + } + pIter->iLeafOffset = iOff; + } +} + +static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){ + u8 *a = pIter->pLeaf->p; /* Buffer to read data from */ + int iOff = pIter->iLeafOffset; + + ASSERT_SZLEAF_OK(pIter->pLeaf); + if( iOff>=pIter->pLeaf->szLeaf ){ + fts5SegIterNextPage(p, pIter); + if( pIter->pLeaf==0 ){ + if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; + return; + } + iOff = 4; + a = pIter->pLeaf->p; + } + iOff += sqlite3Fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid); + pIter->iLeafOffset = iOff; +} + +/* +** Fts5SegIter.iLeafOffset currently points to the first byte of the +** "nSuffix" field of a term. Function parameter nKeep contains the value +** of the "nPrefix" field (if there was one - it is passed 0 if this is +** the first term in the segment). +** +** This function populates: +** +** Fts5SegIter.term +** Fts5SegIter.rowid +** +** accordingly and leaves (Fts5SegIter.iLeafOffset) set to the content of +** the first position list. The position list belonging to document +** (Fts5SegIter.iRowid). +*/ +static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ + u8 *a = pIter->pLeaf->p; /* Buffer to read data from */ + int iOff = pIter->iLeafOffset; /* Offset to read at */ + int nNew; /* Bytes of new data */ + + iOff += fts5GetVarint32(&a[iOff], nNew); + if( iOff+nNew>pIter->pLeaf->nn ){ + p->rc = FTS5_CORRUPT; + return; + } + pIter->term.n = nKeep; + fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]); + iOff += nNew; + pIter->iTermLeafOffset = iOff; + pIter->iTermLeafPgno = pIter->iLeafPgno; + pIter->iLeafOffset = iOff; + + if( pIter->iPgidxOff>=pIter->pLeaf->nn ){ + pIter->iEndofDoclist = pIter->pLeaf->nn+1; + }else{ + int nExtra; + pIter->iPgidxOff += fts5GetVarint32(&a[pIter->iPgidxOff], nExtra); + pIter->iEndofDoclist += nExtra; + } + + fts5SegIterLoadRowid(p, pIter); +} + +static void fts5SegIterNext(Fts5Index*, Fts5SegIter*, int*); +static void fts5SegIterNext_Reverse(Fts5Index*, Fts5SegIter*, int*); +static void fts5SegIterNext_None(Fts5Index*, Fts5SegIter*, int*); + +static void fts5SegIterSetNext(Fts5Index *p, Fts5SegIter *pIter){ + if( pIter->flags & FTS5_SEGITER_REVERSE ){ + pIter->xNext = fts5SegIterNext_Reverse; + }else if( p->pConfig->eDetail==FTS5_DETAIL_NONE ){ + pIter->xNext = fts5SegIterNext_None; + }else{ + pIter->xNext = fts5SegIterNext; + } +} + +/* +** Initialize the iterator object pIter to iterate through the entries in +** segment pSeg. The iterator is left pointing to the first entry when +** this function returns. +** +** If an error occurs, Fts5Index.rc is set to an appropriate error code. If +** an error has already occurred when this function is called, it is a no-op. +*/ +static void fts5SegIterInit( + Fts5Index *p, /* FTS index object */ + Fts5StructureSegment *pSeg, /* Description of segment */ + Fts5SegIter *pIter /* Object to populate */ +){ + if( pSeg->pgnoFirst==0 ){ + /* This happens if the segment is being used as an input to an incremental + ** merge and all data has already been "trimmed". See function + ** fts5TrimSegments() for details. In this case leave the iterator empty. + ** The caller will see the (pIter->pLeaf==0) and assume the iterator is + ** at EOF already. */ + assert( pIter->pLeaf==0 ); + return; + } + + if( p->rc==SQLITE_OK ){ + memset(pIter, 0, sizeof(*pIter)); + fts5SegIterSetNext(p, pIter); + pIter->pSeg = pSeg; + pIter->iLeafPgno = pSeg->pgnoFirst-1; + fts5SegIterNextPage(p, pIter); + } + + if( p->rc==SQLITE_OK ){ + pIter->iLeafOffset = 4; + assert_nc( pIter->pLeaf->nn>4 ); + assert( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); + pIter->iPgidxOff = pIter->pLeaf->szLeaf+1; + fts5SegIterLoadTerm(p, pIter, 0); + fts5SegIterLoadNPos(p, pIter); + } +} + +/* +** This function is only ever called on iterators created by calls to +** Fts5IndexQuery() with the FTS5INDEX_QUERY_DESC flag set. +** +** The iterator is in an unusual state when this function is called: the +** Fts5SegIter.iLeafOffset variable is set to the offset of the start of +** the position-list size field for the first relevant rowid on the page. +** Fts5SegIter.rowid is set, but nPos and bDel are not. +** +** This function advances the iterator so that it points to the last +** relevant rowid on the page and, if necessary, initializes the +** aRowidOffset[] and iRowidOffset variables. At this point the iterator +** is in its regular state - Fts5SegIter.iLeafOffset points to the first +** byte of the position list content associated with said rowid. +*/ +static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){ + int eDetail = p->pConfig->eDetail; + int n = pIter->pLeaf->szLeaf; + int i = pIter->iLeafOffset; + u8 *a = pIter->pLeaf->p; + int iRowidOffset = 0; + + if( n>pIter->iEndofDoclist ){ + n = pIter->iEndofDoclist; + } + + ASSERT_SZLEAF_OK(pIter->pLeaf); + while( 1 ){ + i64 iDelta = 0; + + if( eDetail==FTS5_DETAIL_NONE ){ + /* todo */ + if( i<n && a[i]==0 ){ + i++; + if( i<n && a[i]==0 ) i++; + } + }else{ + int nPos; + int bDummy; + i += fts5GetPoslistSize(&a[i], &nPos, &bDummy); + i += nPos; + } + if( i>=n ) break; + i += fts5GetVarint(&a[i], (u64*)&iDelta); + pIter->iRowid += iDelta; + + /* If necessary, grow the pIter->aRowidOffset[] array. */ + if( iRowidOffset>=pIter->nRowidOffset ){ + int nNew = pIter->nRowidOffset + 8; + int *aNew = (int*)sqlite3_realloc(pIter->aRowidOffset, nNew*sizeof(int)); + if( aNew==0 ){ + p->rc = SQLITE_NOMEM; + break; + } + pIter->aRowidOffset = aNew; + pIter->nRowidOffset = nNew; + } + + pIter->aRowidOffset[iRowidOffset++] = pIter->iLeafOffset; + pIter->iLeafOffset = i; + } + pIter->iRowidOffset = iRowidOffset; + fts5SegIterLoadNPos(p, pIter); +} + +/* +** +*/ +static void fts5SegIterReverseNewPage(Fts5Index *p, Fts5SegIter *pIter){ + assert( pIter->flags & FTS5_SEGITER_REVERSE ); + assert( pIter->flags & FTS5_SEGITER_ONETERM ); + + fts5DataRelease(pIter->pLeaf); + pIter->pLeaf = 0; + while( p->rc==SQLITE_OK && pIter->iLeafPgno>pIter->iTermLeafPgno ){ + Fts5Data *pNew; + pIter->iLeafPgno--; + pNew = fts5DataRead(p, FTS5_SEGMENT_ROWID( + pIter->pSeg->iSegid, pIter->iLeafPgno + )); + if( pNew ){ + /* iTermLeafOffset may be equal to szLeaf if the term is the last + ** thing on the page - i.e. the first rowid is on the following page. + ** In this case leave pIter->pLeaf==0, this iterator is at EOF. */ + if( pIter->iLeafPgno==pIter->iTermLeafPgno ){ + assert( pIter->pLeaf==0 ); + if( pIter->iTermLeafOffset<pNew->szLeaf ){ + pIter->pLeaf = pNew; + pIter->iLeafOffset = pIter->iTermLeafOffset; + } + }else{ + int iRowidOff; + iRowidOff = fts5LeafFirstRowidOff(pNew); + if( iRowidOff ){ + pIter->pLeaf = pNew; + pIter->iLeafOffset = iRowidOff; + } + } + + if( pIter->pLeaf ){ + u8 *a = &pIter->pLeaf->p[pIter->iLeafOffset]; + pIter->iLeafOffset += fts5GetVarint(a, (u64*)&pIter->iRowid); + break; + }else{ + fts5DataRelease(pNew); + } + } + } + + if( pIter->pLeaf ){ + pIter->iEndofDoclist = pIter->pLeaf->nn+1; + fts5SegIterReverseInitPage(p, pIter); + } +} + +/* +** Return true if the iterator passed as the second argument currently +** points to a delete marker. A delete marker is an entry with a 0 byte +** position-list. +*/ +static int fts5MultiIterIsEmpty(Fts5Index *p, Fts5Iter *pIter){ + Fts5SegIter *pSeg = &pIter->aSeg[pIter->aFirst[1].iFirst]; + return (p->rc==SQLITE_OK && pSeg->pLeaf && pSeg->nPos==0); +} + +/* +** Advance iterator pIter to the next entry. +** +** This version of fts5SegIterNext() is only used by reverse iterators. +*/ +static void fts5SegIterNext_Reverse( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegIter *pIter, /* Iterator to advance */ + int *pbUnused /* Unused */ +){ + assert( pIter->flags & FTS5_SEGITER_REVERSE ); + assert( pIter->pNextLeaf==0 ); + UNUSED_PARAM(pbUnused); + + if( pIter->iRowidOffset>0 ){ + u8 *a = pIter->pLeaf->p; + int iOff; + i64 iDelta; + + pIter->iRowidOffset--; + pIter->iLeafOffset = pIter->aRowidOffset[pIter->iRowidOffset]; + fts5SegIterLoadNPos(p, pIter); + iOff = pIter->iLeafOffset; + if( p->pConfig->eDetail!=FTS5_DETAIL_NONE ){ + iOff += pIter->nPos; + } + fts5GetVarint(&a[iOff], (u64*)&iDelta); + pIter->iRowid -= iDelta; + }else{ + fts5SegIterReverseNewPage(p, pIter); + } +} + +/* +** Advance iterator pIter to the next entry. +** +** This version of fts5SegIterNext() is only used if detail=none and the +** iterator is not a reverse direction iterator. +*/ +static void fts5SegIterNext_None( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegIter *pIter, /* Iterator to advance */ + int *pbNewTerm /* OUT: Set for new term */ +){ + int iOff; + + assert( p->rc==SQLITE_OK ); + assert( (pIter->flags & FTS5_SEGITER_REVERSE)==0 ); + assert( p->pConfig->eDetail==FTS5_DETAIL_NONE ); + + ASSERT_SZLEAF_OK(pIter->pLeaf); + iOff = pIter->iLeafOffset; + + /* Next entry is on the next page */ + if( pIter->pSeg && iOff>=pIter->pLeaf->szLeaf ){ + fts5SegIterNextPage(p, pIter); + if( p->rc || pIter->pLeaf==0 ) return; + pIter->iRowid = 0; + iOff = 4; + } + + if( iOff<pIter->iEndofDoclist ){ + /* Next entry is on the current page */ + i64 iDelta; + iOff += sqlite3Fts5GetVarint(&pIter->pLeaf->p[iOff], (u64*)&iDelta); + pIter->iLeafOffset = iOff; + pIter->iRowid += iDelta; + }else if( (pIter->flags & FTS5_SEGITER_ONETERM)==0 ){ + if( pIter->pSeg ){ + int nKeep = 0; + if( iOff!=fts5LeafFirstTermOff(pIter->pLeaf) ){ + iOff += fts5GetVarint32(&pIter->pLeaf->p[iOff], nKeep); + } + pIter->iLeafOffset = iOff; + fts5SegIterLoadTerm(p, pIter, nKeep); + }else{ + const u8 *pList = 0; + const char *zTerm = 0; + int nList; + sqlite3Fts5HashScanNext(p->pHash); + sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &pList, &nList); + if( pList==0 ) goto next_none_eof; + pIter->pLeaf->p = (u8*)pList; + pIter->pLeaf->nn = nList; + pIter->pLeaf->szLeaf = nList; + pIter->iEndofDoclist = nList; + sqlite3Fts5BufferSet(&p->rc,&pIter->term, (int)strlen(zTerm), (u8*)zTerm); + pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid); + } + + if( pbNewTerm ) *pbNewTerm = 1; + }else{ + goto next_none_eof; + } + + fts5SegIterLoadNPos(p, pIter); + + return; + next_none_eof: + fts5DataRelease(pIter->pLeaf); + pIter->pLeaf = 0; +} + + +/* +** Advance iterator pIter to the next entry. +** +** If an error occurs, Fts5Index.rc is set to an appropriate error code. It +** is not considered an error if the iterator reaches EOF. If an error has +** already occurred when this function is called, it is a no-op. +*/ +static void fts5SegIterNext( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegIter *pIter, /* Iterator to advance */ + int *pbNewTerm /* OUT: Set for new term */ +){ + Fts5Data *pLeaf = pIter->pLeaf; + int iOff; + int bNewTerm = 0; + int nKeep = 0; + u8 *a; + int n; + + assert( pbNewTerm==0 || *pbNewTerm==0 ); + assert( p->pConfig->eDetail!=FTS5_DETAIL_NONE ); + + /* Search for the end of the position list within the current page. */ + a = pLeaf->p; + n = pLeaf->szLeaf; + + ASSERT_SZLEAF_OK(pLeaf); + iOff = pIter->iLeafOffset + pIter->nPos; + + if( iOff<n ){ + /* The next entry is on the current page. */ + assert_nc( iOff<=pIter->iEndofDoclist ); + if( iOff>=pIter->iEndofDoclist ){ + bNewTerm = 1; + if( iOff!=fts5LeafFirstTermOff(pLeaf) ){ + iOff += fts5GetVarint32(&a[iOff], nKeep); + } + }else{ + u64 iDelta; + iOff += sqlite3Fts5GetVarint(&a[iOff], &iDelta); + pIter->iRowid += iDelta; + assert_nc( iDelta>0 ); + } + pIter->iLeafOffset = iOff; + + }else if( pIter->pSeg==0 ){ + const u8 *pList = 0; + const char *zTerm = 0; + int nList = 0; + assert( (pIter->flags & FTS5_SEGITER_ONETERM) || pbNewTerm ); + if( 0==(pIter->flags & FTS5_SEGITER_ONETERM) ){ + sqlite3Fts5HashScanNext(p->pHash); + sqlite3Fts5HashScanEntry(p->pHash, &zTerm, &pList, &nList); + } + if( pList==0 ){ + fts5DataRelease(pIter->pLeaf); + pIter->pLeaf = 0; + }else{ + pIter->pLeaf->p = (u8*)pList; + pIter->pLeaf->nn = nList; + pIter->pLeaf->szLeaf = nList; + pIter->iEndofDoclist = nList+1; + sqlite3Fts5BufferSet(&p->rc, &pIter->term, (int)strlen(zTerm), + (u8*)zTerm); + pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid); + *pbNewTerm = 1; + } + }else{ + iOff = 0; + /* Next entry is not on the current page */ + while( iOff==0 ){ + fts5SegIterNextPage(p, pIter); + pLeaf = pIter->pLeaf; + if( pLeaf==0 ) break; + ASSERT_SZLEAF_OK(pLeaf); + if( (iOff = fts5LeafFirstRowidOff(pLeaf)) && iOff<pLeaf->szLeaf ){ + iOff += sqlite3Fts5GetVarint(&pLeaf->p[iOff], (u64*)&pIter->iRowid); + pIter->iLeafOffset = iOff; + + if( pLeaf->nn>pLeaf->szLeaf ){ + pIter->iPgidxOff = pLeaf->szLeaf + fts5GetVarint32( + &pLeaf->p[pLeaf->szLeaf], pIter->iEndofDoclist + ); + } + } + else if( pLeaf->nn>pLeaf->szLeaf ){ + pIter->iPgidxOff = pLeaf->szLeaf + fts5GetVarint32( + &pLeaf->p[pLeaf->szLeaf], iOff + ); + pIter->iLeafOffset = iOff; + pIter->iEndofDoclist = iOff; + bNewTerm = 1; + } + assert_nc( iOff<pLeaf->szLeaf ); + if( iOff>pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + return; + } + } + } + + /* Check if the iterator is now at EOF. If so, return early. */ + if( pIter->pLeaf ){ + if( bNewTerm ){ + if( pIter->flags & FTS5_SEGITER_ONETERM ){ + fts5DataRelease(pIter->pLeaf); + pIter->pLeaf = 0; + }else{ + fts5SegIterLoadTerm(p, pIter, nKeep); + fts5SegIterLoadNPos(p, pIter); + if( pbNewTerm ) *pbNewTerm = 1; + } + }else{ + /* The following could be done by calling fts5SegIterLoadNPos(). But + ** this block is particularly performance critical, so equivalent + ** code is inlined. + ** + ** Later: Switched back to fts5SegIterLoadNPos() because it supports + ** detail=none mode. Not ideal. + */ + int nSz; + assert( p->rc==SQLITE_OK ); + assert( pIter->iLeafOffset<=pIter->pLeaf->nn ); + fts5FastGetVarint32(pIter->pLeaf->p, pIter->iLeafOffset, nSz); + pIter->bDel = (nSz & 0x0001); + pIter->nPos = nSz>>1; + assert_nc( pIter->nPos>=0 ); + } + } +} + +#define SWAPVAL(T, a, b) { T tmp; tmp=a; a=b; b=tmp; } + +#define fts5IndexSkipVarint(a, iOff) { \ + int iEnd = iOff+9; \ + while( (a[iOff++] & 0x80) && iOff<iEnd ); \ +} + +/* +** Iterator pIter currently points to the first rowid in a doclist. This +** function sets the iterator up so that iterates in reverse order through +** the doclist. +*/ +static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){ + Fts5DlidxIter *pDlidx = pIter->pDlidx; + Fts5Data *pLast = 0; + int pgnoLast = 0; + + if( pDlidx ){ + int iSegid = pIter->pSeg->iSegid; + pgnoLast = fts5DlidxIterPgno(pDlidx); + pLast = fts5DataRead(p, FTS5_SEGMENT_ROWID(iSegid, pgnoLast)); + }else{ + Fts5Data *pLeaf = pIter->pLeaf; /* Current leaf data */ + + /* Currently, Fts5SegIter.iLeafOffset points to the first byte of + ** position-list content for the current rowid. Back it up so that it + ** points to the start of the position-list size field. */ + int iPoslist; + if( pIter->iTermLeafPgno==pIter->iLeafPgno ){ + iPoslist = pIter->iTermLeafOffset; + }else{ + iPoslist = 4; + } + fts5IndexSkipVarint(pLeaf->p, iPoslist); + pIter->iLeafOffset = iPoslist; + + /* If this condition is true then the largest rowid for the current + ** term may not be stored on the current page. So search forward to + ** see where said rowid really is. */ + if( pIter->iEndofDoclist>=pLeaf->szLeaf ){ + int pgno; + Fts5StructureSegment *pSeg = pIter->pSeg; + + /* The last rowid in the doclist may not be on the current page. Search + ** forward to find the page containing the last rowid. */ + for(pgno=pIter->iLeafPgno+1; !p->rc && pgno<=pSeg->pgnoLast; pgno++){ + i64 iAbs = FTS5_SEGMENT_ROWID(pSeg->iSegid, pgno); + Fts5Data *pNew = fts5DataRead(p, iAbs); + if( pNew ){ + int iRowid, bTermless; + iRowid = fts5LeafFirstRowidOff(pNew); + bTermless = fts5LeafIsTermless(pNew); + if( iRowid ){ + SWAPVAL(Fts5Data*, pNew, pLast); + pgnoLast = pgno; + } + fts5DataRelease(pNew); + if( bTermless==0 ) break; + } + } + } + } + + /* If pLast is NULL at this point, then the last rowid for this doclist + ** lies on the page currently indicated by the iterator. In this case + ** pIter->iLeafOffset is already set to point to the position-list size + ** field associated with the first relevant rowid on the page. + ** + ** Or, if pLast is non-NULL, then it is the page that contains the last + ** rowid. In this case configure the iterator so that it points to the + ** first rowid on this page. + */ + if( pLast ){ + int iOff; + fts5DataRelease(pIter->pLeaf); + pIter->pLeaf = pLast; + pIter->iLeafPgno = pgnoLast; + iOff = fts5LeafFirstRowidOff(pLast); + iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid); + pIter->iLeafOffset = iOff; + + if( fts5LeafIsTermless(pLast) ){ + pIter->iEndofDoclist = pLast->nn+1; + }else{ + pIter->iEndofDoclist = fts5LeafFirstTermOff(pLast); + } + + } + + fts5SegIterReverseInitPage(p, pIter); +} + +/* +** Iterator pIter currently points to the first rowid of a doclist. +** There is a doclist-index associated with the final term on the current +** page. If the current term is the last term on the page, load the +** doclist-index from disk and initialize an iterator at (pIter->pDlidx). +*/ +static void fts5SegIterLoadDlidx(Fts5Index *p, Fts5SegIter *pIter){ + int iSeg = pIter->pSeg->iSegid; + int bRev = (pIter->flags & FTS5_SEGITER_REVERSE); + Fts5Data *pLeaf = pIter->pLeaf; /* Current leaf data */ + + assert( pIter->flags & FTS5_SEGITER_ONETERM ); + assert( pIter->pDlidx==0 ); + + /* Check if the current doclist ends on this page. If it does, return + ** early without loading the doclist-index (as it belongs to a different + ** term. */ + if( pIter->iTermLeafPgno==pIter->iLeafPgno + && pIter->iEndofDoclist<pLeaf->szLeaf + ){ + return; + } + + pIter->pDlidx = fts5DlidxIterInit(p, bRev, iSeg, pIter->iTermLeafPgno); +} + +/* +** The iterator object passed as the second argument currently contains +** no valid values except for the Fts5SegIter.pLeaf member variable. This +** function searches the leaf page for a term matching (pTerm/nTerm). +** +** If the specified term is found on the page, then the iterator is left +** pointing to it. If argument bGe is zero and the term is not found, +** the iterator is left pointing at EOF. +** +** If bGe is non-zero and the specified term is not found, then the +** iterator is left pointing to the smallest term in the segment that +** is larger than the specified term, even if this term is not on the +** current page. +*/ +static void fts5LeafSeek( + Fts5Index *p, /* Leave any error code here */ + int bGe, /* True for a >= search */ + Fts5SegIter *pIter, /* Iterator to seek */ + const u8 *pTerm, int nTerm /* Term to search for */ +){ + int iOff; + const u8 *a = pIter->pLeaf->p; + int szLeaf = pIter->pLeaf->szLeaf; + int n = pIter->pLeaf->nn; + + int nMatch = 0; + int nKeep = 0; + int nNew = 0; + int iTermOff; + int iPgidx; /* Current offset in pgidx */ + int bEndOfPage = 0; + + assert( p->rc==SQLITE_OK ); + + iPgidx = szLeaf; + iPgidx += fts5GetVarint32(&a[iPgidx], iTermOff); + iOff = iTermOff; + if( iOff>n ){ + p->rc = FTS5_CORRUPT; + return; + } + + while( 1 ){ + + /* Figure out how many new bytes are in this term */ + fts5FastGetVarint32(a, iOff, nNew); + if( nKeep<nMatch ){ + goto search_failed; + } + + assert( nKeep>=nMatch ); + if( nKeep==nMatch ){ + int nCmp; + int i; + nCmp = MIN(nNew, nTerm-nMatch); + for(i=0; i<nCmp; i++){ + if( a[iOff+i]!=pTerm[nMatch+i] ) break; + } + nMatch += i; + + if( nTerm==nMatch ){ + if( i==nNew ){ + goto search_success; + }else{ + goto search_failed; + } + }else if( i<nNew && a[iOff+i]>pTerm[nMatch] ){ + goto search_failed; + } + } + + if( iPgidx>=n ){ + bEndOfPage = 1; + break; + } + + iPgidx += fts5GetVarint32(&a[iPgidx], nKeep); + iTermOff += nKeep; + iOff = iTermOff; + + if( iOff>=n ){ + p->rc = FTS5_CORRUPT; + return; + } + + /* Read the nKeep field of the next term. */ + fts5FastGetVarint32(a, iOff, nKeep); + } + + search_failed: + if( bGe==0 ){ + fts5DataRelease(pIter->pLeaf); + pIter->pLeaf = 0; + return; + }else if( bEndOfPage ){ + do { + fts5SegIterNextPage(p, pIter); + if( pIter->pLeaf==0 ) return; + a = pIter->pLeaf->p; + if( fts5LeafIsTermless(pIter->pLeaf)==0 ){ + iPgidx = pIter->pLeaf->szLeaf; + iPgidx += fts5GetVarint32(&pIter->pLeaf->p[iPgidx], iOff); + if( iOff<4 || iOff>=pIter->pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + }else{ + nKeep = 0; + iTermOff = iOff; + n = pIter->pLeaf->nn; + iOff += fts5GetVarint32(&a[iOff], nNew); + break; + } + } + }while( 1 ); + } + + search_success: + + pIter->iLeafOffset = iOff + nNew; + pIter->iTermLeafOffset = pIter->iLeafOffset; + pIter->iTermLeafPgno = pIter->iLeafPgno; + + fts5BufferSet(&p->rc, &pIter->term, nKeep, pTerm); + fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]); + + if( iPgidx>=n ){ + pIter->iEndofDoclist = pIter->pLeaf->nn+1; + }else{ + int nExtra; + iPgidx += fts5GetVarint32(&a[iPgidx], nExtra); + pIter->iEndofDoclist = iTermOff + nExtra; + } + pIter->iPgidxOff = iPgidx; + + fts5SegIterLoadRowid(p, pIter); + fts5SegIterLoadNPos(p, pIter); +} + +static sqlite3_stmt *fts5IdxSelectStmt(Fts5Index *p){ + if( p->pIdxSelect==0 ){ + Fts5Config *pConfig = p->pConfig; + fts5IndexPrepareStmt(p, &p->pIdxSelect, sqlite3_mprintf( + "SELECT pgno FROM '%q'.'%q_idx' WHERE " + "segid=? AND term<=? ORDER BY term DESC LIMIT 1", + pConfig->zDb, pConfig->zName + )); + } + return p->pIdxSelect; +} + +/* +** Initialize the object pIter to point to term pTerm/nTerm within segment +** pSeg. If there is no such term in the index, the iterator is set to EOF. +** +** If an error occurs, Fts5Index.rc is set to an appropriate error code. If +** an error has already occurred when this function is called, it is a no-op. +*/ +static void fts5SegIterSeekInit( + Fts5Index *p, /* FTS5 backend */ + const u8 *pTerm, int nTerm, /* Term to seek to */ + int flags, /* Mask of FTS5INDEX_XXX flags */ + Fts5StructureSegment *pSeg, /* Description of segment */ + Fts5SegIter *pIter /* Object to populate */ +){ + int iPg = 1; + int bGe = (flags & FTS5INDEX_QUERY_SCAN); + int bDlidx = 0; /* True if there is a doclist-index */ + sqlite3_stmt *pIdxSelect = 0; + + assert( bGe==0 || (flags & FTS5INDEX_QUERY_DESC)==0 ); + assert( pTerm && nTerm ); + memset(pIter, 0, sizeof(*pIter)); + pIter->pSeg = pSeg; + + /* This block sets stack variable iPg to the leaf page number that may + ** contain term (pTerm/nTerm), if it is present in the segment. */ + pIdxSelect = fts5IdxSelectStmt(p); + if( p->rc ) return; + sqlite3_bind_int(pIdxSelect, 1, pSeg->iSegid); + sqlite3_bind_blob(pIdxSelect, 2, pTerm, nTerm, SQLITE_STATIC); + if( SQLITE_ROW==sqlite3_step(pIdxSelect) ){ + i64 val = sqlite3_column_int(pIdxSelect, 0); + iPg = (int)(val>>1); + bDlidx = (val & 0x0001); + } + p->rc = sqlite3_reset(pIdxSelect); + sqlite3_bind_null(pIdxSelect, 2); + + if( iPg<pSeg->pgnoFirst ){ + iPg = pSeg->pgnoFirst; + bDlidx = 0; + } + + pIter->iLeafPgno = iPg - 1; + fts5SegIterNextPage(p, pIter); + + if( pIter->pLeaf ){ + fts5LeafSeek(p, bGe, pIter, pTerm, nTerm); + } + + if( p->rc==SQLITE_OK && bGe==0 ){ + pIter->flags |= FTS5_SEGITER_ONETERM; + if( pIter->pLeaf ){ + if( flags & FTS5INDEX_QUERY_DESC ){ + pIter->flags |= FTS5_SEGITER_REVERSE; + } + if( bDlidx ){ + fts5SegIterLoadDlidx(p, pIter); + } + if( flags & FTS5INDEX_QUERY_DESC ){ + fts5SegIterReverse(p, pIter); + } + } + } + + fts5SegIterSetNext(p, pIter); + + /* Either: + ** + ** 1) an error has occurred, or + ** 2) the iterator points to EOF, or + ** 3) the iterator points to an entry with term (pTerm/nTerm), or + ** 4) the FTS5INDEX_QUERY_SCAN flag was set and the iterator points + ** to an entry with a term greater than or equal to (pTerm/nTerm). + */ + assert( p->rc!=SQLITE_OK /* 1 */ + || pIter->pLeaf==0 /* 2 */ + || fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)==0 /* 3 */ + || (bGe && fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)>0) /* 4 */ + ); +} + +/* +** Initialize the object pIter to point to term pTerm/nTerm within the +** in-memory hash table. If there is no such term in the hash-table, the +** iterator is set to EOF. +** +** If an error occurs, Fts5Index.rc is set to an appropriate error code. If +** an error has already occurred when this function is called, it is a no-op. +*/ +static void fts5SegIterHashInit( + Fts5Index *p, /* FTS5 backend */ + const u8 *pTerm, int nTerm, /* Term to seek to */ + int flags, /* Mask of FTS5INDEX_XXX flags */ + Fts5SegIter *pIter /* Object to populate */ +){ + const u8 *pList = 0; + int nList = 0; + const u8 *z = 0; + int n = 0; + + assert( p->pHash ); + assert( p->rc==SQLITE_OK ); + + if( pTerm==0 || (flags & FTS5INDEX_QUERY_SCAN) ){ + p->rc = sqlite3Fts5HashScanInit(p->pHash, (const char*)pTerm, nTerm); + sqlite3Fts5HashScanEntry(p->pHash, (const char**)&z, &pList, &nList); + n = (z ? (int)strlen((const char*)z) : 0); + }else{ + pIter->flags |= FTS5_SEGITER_ONETERM; + sqlite3Fts5HashQuery(p->pHash, (const char*)pTerm, nTerm, &pList, &nList); + z = pTerm; + n = nTerm; + } + + if( pList ){ + Fts5Data *pLeaf; + sqlite3Fts5BufferSet(&p->rc, &pIter->term, n, z); + pLeaf = fts5IdxMalloc(p, sizeof(Fts5Data)); + if( pLeaf==0 ) return; + pLeaf->p = (u8*)pList; + pLeaf->nn = pLeaf->szLeaf = nList; + pIter->pLeaf = pLeaf; + pIter->iLeafOffset = fts5GetVarint(pLeaf->p, (u64*)&pIter->iRowid); + pIter->iEndofDoclist = pLeaf->nn; + + if( flags & FTS5INDEX_QUERY_DESC ){ + pIter->flags |= FTS5_SEGITER_REVERSE; + fts5SegIterReverseInitPage(p, pIter); + }else{ + fts5SegIterLoadNPos(p, pIter); + } + } + + fts5SegIterSetNext(p, pIter); +} + +/* +** Zero the iterator passed as the only argument. +*/ +static void fts5SegIterClear(Fts5SegIter *pIter){ + fts5BufferFree(&pIter->term); + fts5DataRelease(pIter->pLeaf); + fts5DataRelease(pIter->pNextLeaf); + fts5DlidxIterFree(pIter->pDlidx); + sqlite3_free(pIter->aRowidOffset); + memset(pIter, 0, sizeof(Fts5SegIter)); +} + +#ifdef SQLITE_DEBUG + +/* +** This function is used as part of the big assert() procedure implemented by +** fts5AssertMultiIterSetup(). It ensures that the result currently stored +** in *pRes is the correct result of comparing the current positions of the +** two iterators. +*/ +static void fts5AssertComparisonResult( + Fts5Iter *pIter, + Fts5SegIter *p1, + Fts5SegIter *p2, + Fts5CResult *pRes +){ + int i1 = p1 - pIter->aSeg; + int i2 = p2 - pIter->aSeg; + + if( p1->pLeaf || p2->pLeaf ){ + if( p1->pLeaf==0 ){ + assert( pRes->iFirst==i2 ); + }else if( p2->pLeaf==0 ){ + assert( pRes->iFirst==i1 ); + }else{ + int nMin = MIN(p1->term.n, p2->term.n); + int res = memcmp(p1->term.p, p2->term.p, nMin); + if( res==0 ) res = p1->term.n - p2->term.n; + + if( res==0 ){ + assert( pRes->bTermEq==1 ); + assert( p1->iRowid!=p2->iRowid ); + res = ((p1->iRowid > p2->iRowid)==pIter->bRev) ? -1 : 1; + }else{ + assert( pRes->bTermEq==0 ); + } + + if( res<0 ){ + assert( pRes->iFirst==i1 ); + }else{ + assert( pRes->iFirst==i2 ); + } + } + } +} + +/* +** This function is a no-op unless SQLITE_DEBUG is defined when this module +** is compiled. In that case, this function is essentially an assert() +** statement used to verify that the contents of the pIter->aFirst[] array +** are correct. +*/ +static void fts5AssertMultiIterSetup(Fts5Index *p, Fts5Iter *pIter){ + if( p->rc==SQLITE_OK ){ + Fts5SegIter *pFirst = &pIter->aSeg[ pIter->aFirst[1].iFirst ]; + int i; + + assert( (pFirst->pLeaf==0)==pIter->base.bEof ); + + /* Check that pIter->iSwitchRowid is set correctly. */ + for(i=0; i<pIter->nSeg; i++){ + Fts5SegIter *p1 = &pIter->aSeg[i]; + assert( p1==pFirst + || p1->pLeaf==0 + || fts5BufferCompare(&pFirst->term, &p1->term) + || p1->iRowid==pIter->iSwitchRowid + || (p1->iRowid<pIter->iSwitchRowid)==pIter->bRev + ); + } + + for(i=0; i<pIter->nSeg; i+=2){ + Fts5SegIter *p1 = &pIter->aSeg[i]; + Fts5SegIter *p2 = &pIter->aSeg[i+1]; + Fts5CResult *pRes = &pIter->aFirst[(pIter->nSeg + i) / 2]; + fts5AssertComparisonResult(pIter, p1, p2, pRes); + } + + for(i=1; i<(pIter->nSeg / 2); i+=2){ + Fts5SegIter *p1 = &pIter->aSeg[ pIter->aFirst[i*2].iFirst ]; + Fts5SegIter *p2 = &pIter->aSeg[ pIter->aFirst[i*2+1].iFirst ]; + Fts5CResult *pRes = &pIter->aFirst[i]; + fts5AssertComparisonResult(pIter, p1, p2, pRes); + } + } +} +#else +# define fts5AssertMultiIterSetup(x,y) +#endif + +/* +** Do the comparison necessary to populate pIter->aFirst[iOut]. +** +** If the returned value is non-zero, then it is the index of an entry +** in the pIter->aSeg[] array that is (a) not at EOF, and (b) pointing +** to a key that is a duplicate of another, higher priority, +** segment-iterator in the pSeg->aSeg[] array. +*/ +static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){ + int i1; /* Index of left-hand Fts5SegIter */ + int i2; /* Index of right-hand Fts5SegIter */ + int iRes; + Fts5SegIter *p1; /* Left-hand Fts5SegIter */ + Fts5SegIter *p2; /* Right-hand Fts5SegIter */ + Fts5CResult *pRes = &pIter->aFirst[iOut]; + + assert( iOut<pIter->nSeg && iOut>0 ); + assert( pIter->bRev==0 || pIter->bRev==1 ); + + if( iOut>=(pIter->nSeg/2) ){ + i1 = (iOut - pIter->nSeg/2) * 2; + i2 = i1 + 1; + }else{ + i1 = pIter->aFirst[iOut*2].iFirst; + i2 = pIter->aFirst[iOut*2+1].iFirst; + } + p1 = &pIter->aSeg[i1]; + p2 = &pIter->aSeg[i2]; + + pRes->bTermEq = 0; + if( p1->pLeaf==0 ){ /* If p1 is at EOF */ + iRes = i2; + }else if( p2->pLeaf==0 ){ /* If p2 is at EOF */ + iRes = i1; + }else{ + int res = fts5BufferCompare(&p1->term, &p2->term); + if( res==0 ){ + assert( i2>i1 ); + assert( i2!=0 ); + pRes->bTermEq = 1; + if( p1->iRowid==p2->iRowid ){ + p1->bDel = p2->bDel; + return i2; + } + res = ((p1->iRowid > p2->iRowid)==pIter->bRev) ? -1 : +1; + } + assert( res!=0 ); + if( res<0 ){ + iRes = i1; + }else{ + iRes = i2; + } + } + + pRes->iFirst = (u16)iRes; + return 0; +} + +/* +** Move the seg-iter so that it points to the first rowid on page iLeafPgno. +** It is an error if leaf iLeafPgno does not exist or contains no rowids. +*/ +static void fts5SegIterGotoPage( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegIter *pIter, /* Iterator to advance */ + int iLeafPgno +){ + assert( iLeafPgno>pIter->iLeafPgno ); + + if( iLeafPgno>pIter->pSeg->pgnoLast ){ + p->rc = FTS5_CORRUPT; + }else{ + fts5DataRelease(pIter->pNextLeaf); + pIter->pNextLeaf = 0; + pIter->iLeafPgno = iLeafPgno-1; + fts5SegIterNextPage(p, pIter); + assert( p->rc!=SQLITE_OK || pIter->iLeafPgno==iLeafPgno ); + + if( p->rc==SQLITE_OK ){ + int iOff; + u8 *a = pIter->pLeaf->p; + int n = pIter->pLeaf->szLeaf; + + iOff = fts5LeafFirstRowidOff(pIter->pLeaf); + if( iOff<4 || iOff>=n ){ + p->rc = FTS5_CORRUPT; + }else{ + iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid); + pIter->iLeafOffset = iOff; + fts5SegIterLoadNPos(p, pIter); + } + } + } +} + +/* +** Advance the iterator passed as the second argument until it is at or +** past rowid iFrom. Regardless of the value of iFrom, the iterator is +** always advanced at least once. +*/ +static void fts5SegIterNextFrom( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegIter *pIter, /* Iterator to advance */ + i64 iMatch /* Advance iterator at least this far */ +){ + int bRev = (pIter->flags & FTS5_SEGITER_REVERSE); + Fts5DlidxIter *pDlidx = pIter->pDlidx; + int iLeafPgno = pIter->iLeafPgno; + int bMove = 1; + + assert( pIter->flags & FTS5_SEGITER_ONETERM ); + assert( pIter->pDlidx ); + assert( pIter->pLeaf ); + + if( bRev==0 ){ + while( !fts5DlidxIterEof(p, pDlidx) && iMatch>fts5DlidxIterRowid(pDlidx) ){ + iLeafPgno = fts5DlidxIterPgno(pDlidx); + fts5DlidxIterNext(p, pDlidx); + } + assert_nc( iLeafPgno>=pIter->iLeafPgno || p->rc ); + if( iLeafPgno>pIter->iLeafPgno ){ + fts5SegIterGotoPage(p, pIter, iLeafPgno); + bMove = 0; + } + }else{ + assert( pIter->pNextLeaf==0 ); + assert( iMatch<pIter->iRowid ); + while( !fts5DlidxIterEof(p, pDlidx) && iMatch<fts5DlidxIterRowid(pDlidx) ){ + fts5DlidxIterPrev(p, pDlidx); + } + iLeafPgno = fts5DlidxIterPgno(pDlidx); + + assert( fts5DlidxIterEof(p, pDlidx) || iLeafPgno<=pIter->iLeafPgno ); + + if( iLeafPgno<pIter->iLeafPgno ){ + pIter->iLeafPgno = iLeafPgno+1; + fts5SegIterReverseNewPage(p, pIter); + bMove = 0; + } + } + + do{ + if( bMove && p->rc==SQLITE_OK ) pIter->xNext(p, pIter, 0); + if( pIter->pLeaf==0 ) break; + if( bRev==0 && pIter->iRowid>=iMatch ) break; + if( bRev!=0 && pIter->iRowid<=iMatch ) break; + bMove = 1; + }while( p->rc==SQLITE_OK ); +} + + +/* +** Free the iterator object passed as the second argument. +*/ +static void fts5MultiIterFree(Fts5Iter *pIter){ + if( pIter ){ + int i; + for(i=0; i<pIter->nSeg; i++){ + fts5SegIterClear(&pIter->aSeg[i]); + } + fts5StructureRelease(pIter->pStruct); + fts5BufferFree(&pIter->poslist); + sqlite3_free(pIter); + } +} + +static void fts5MultiIterAdvanced( + Fts5Index *p, /* FTS5 backend to iterate within */ + Fts5Iter *pIter, /* Iterator to update aFirst[] array for */ + int iChanged, /* Index of sub-iterator just advanced */ + int iMinset /* Minimum entry in aFirst[] to set */ +){ + int i; + for(i=(pIter->nSeg+iChanged)/2; i>=iMinset && p->rc==SQLITE_OK; i=i/2){ + int iEq; + if( (iEq = fts5MultiIterDoCompare(pIter, i)) ){ + Fts5SegIter *pSeg = &pIter->aSeg[iEq]; + assert( p->rc==SQLITE_OK ); + pSeg->xNext(p, pSeg, 0); + i = pIter->nSeg + iEq; + } + } +} + +/* +** Sub-iterator iChanged of iterator pIter has just been advanced. It still +** points to the same term though - just a different rowid. This function +** attempts to update the contents of the pIter->aFirst[] accordingly. +** If it does so successfully, 0 is returned. Otherwise 1. +** +** If non-zero is returned, the caller should call fts5MultiIterAdvanced() +** on the iterator instead. That function does the same as this one, except +** that it deals with more complicated cases as well. +*/ +static int fts5MultiIterAdvanceRowid( + Fts5Iter *pIter, /* Iterator to update aFirst[] array for */ + int iChanged, /* Index of sub-iterator just advanced */ + Fts5SegIter **ppFirst +){ + Fts5SegIter *pNew = &pIter->aSeg[iChanged]; + + if( pNew->iRowid==pIter->iSwitchRowid + || (pNew->iRowid<pIter->iSwitchRowid)==pIter->bRev + ){ + int i; + Fts5SegIter *pOther = &pIter->aSeg[iChanged ^ 0x0001]; + pIter->iSwitchRowid = pIter->bRev ? SMALLEST_INT64 : LARGEST_INT64; + for(i=(pIter->nSeg+iChanged)/2; 1; i=i/2){ + Fts5CResult *pRes = &pIter->aFirst[i]; + + assert( pNew->pLeaf ); + assert( pRes->bTermEq==0 || pOther->pLeaf ); + + if( pRes->bTermEq ){ + if( pNew->iRowid==pOther->iRowid ){ + return 1; + }else if( (pOther->iRowid>pNew->iRowid)==pIter->bRev ){ + pIter->iSwitchRowid = pOther->iRowid; + pNew = pOther; + }else if( (pOther->iRowid>pIter->iSwitchRowid)==pIter->bRev ){ + pIter->iSwitchRowid = pOther->iRowid; + } + } + pRes->iFirst = (u16)(pNew - pIter->aSeg); + if( i==1 ) break; + + pOther = &pIter->aSeg[ pIter->aFirst[i ^ 0x0001].iFirst ]; + } + } + + *ppFirst = pNew; + return 0; +} + +/* +** Set the pIter->bEof variable based on the state of the sub-iterators. +*/ +static void fts5MultiIterSetEof(Fts5Iter *pIter){ + Fts5SegIter *pSeg = &pIter->aSeg[ pIter->aFirst[1].iFirst ]; + pIter->base.bEof = pSeg->pLeaf==0; + pIter->iSwitchRowid = pSeg->iRowid; +} + +/* +** Move the iterator to the next entry. +** +** If an error occurs, an error code is left in Fts5Index.rc. It is not +** considered an error if the iterator reaches EOF, or if it is already at +** EOF when this function is called. +*/ +static void fts5MultiIterNext( + Fts5Index *p, + Fts5Iter *pIter, + int bFrom, /* True if argument iFrom is valid */ + i64 iFrom /* Advance at least as far as this */ +){ + int bUseFrom = bFrom; + assert( pIter->base.bEof==0 ); + while( p->rc==SQLITE_OK ){ + int iFirst = pIter->aFirst[1].iFirst; + int bNewTerm = 0; + Fts5SegIter *pSeg = &pIter->aSeg[iFirst]; + assert( p->rc==SQLITE_OK ); + if( bUseFrom && pSeg->pDlidx ){ + fts5SegIterNextFrom(p, pSeg, iFrom); + }else{ + pSeg->xNext(p, pSeg, &bNewTerm); + } + + if( pSeg->pLeaf==0 || bNewTerm + || fts5MultiIterAdvanceRowid(pIter, iFirst, &pSeg) + ){ + fts5MultiIterAdvanced(p, pIter, iFirst, 1); + fts5MultiIterSetEof(pIter); + pSeg = &pIter->aSeg[pIter->aFirst[1].iFirst]; + if( pSeg->pLeaf==0 ) return; + } + + fts5AssertMultiIterSetup(p, pIter); + assert( pSeg==&pIter->aSeg[pIter->aFirst[1].iFirst] && pSeg->pLeaf ); + if( pIter->bSkipEmpty==0 || pSeg->nPos ){ + pIter->xSetOutputs(pIter, pSeg); + return; + } + bUseFrom = 0; + } +} + +static void fts5MultiIterNext2( + Fts5Index *p, + Fts5Iter *pIter, + int *pbNewTerm /* OUT: True if *might* be new term */ +){ + assert( pIter->bSkipEmpty ); + if( p->rc==SQLITE_OK ){ + *pbNewTerm = 0; + do{ + int iFirst = pIter->aFirst[1].iFirst; + Fts5SegIter *pSeg = &pIter->aSeg[iFirst]; + int bNewTerm = 0; + + assert( p->rc==SQLITE_OK ); + pSeg->xNext(p, pSeg, &bNewTerm); + if( pSeg->pLeaf==0 || bNewTerm + || fts5MultiIterAdvanceRowid(pIter, iFirst, &pSeg) + ){ + fts5MultiIterAdvanced(p, pIter, iFirst, 1); + fts5MultiIterSetEof(pIter); + *pbNewTerm = 1; + } + fts5AssertMultiIterSetup(p, pIter); + + }while( fts5MultiIterIsEmpty(p, pIter) ); + } +} + +static void fts5IterSetOutputs_Noop(Fts5Iter *pUnused1, Fts5SegIter *pUnused2){ + UNUSED_PARAM2(pUnused1, pUnused2); +} + +static Fts5Iter *fts5MultiIterAlloc( + Fts5Index *p, /* FTS5 backend to iterate within */ + int nSeg +){ + Fts5Iter *pNew; + int nSlot; /* Power of two >= nSeg */ + + for(nSlot=2; nSlot<nSeg; nSlot=nSlot*2); + pNew = fts5IdxMalloc(p, + sizeof(Fts5Iter) + /* pNew */ + sizeof(Fts5SegIter) * (nSlot-1) + /* pNew->aSeg[] */ + sizeof(Fts5CResult) * nSlot /* pNew->aFirst[] */ + ); + if( pNew ){ + pNew->nSeg = nSlot; + pNew->aFirst = (Fts5CResult*)&pNew->aSeg[nSlot]; + pNew->pIndex = p; + pNew->xSetOutputs = fts5IterSetOutputs_Noop; + } + return pNew; +} + +static void fts5PoslistCallback( + Fts5Index *pUnused, + void *pContext, + const u8 *pChunk, int nChunk +){ + UNUSED_PARAM(pUnused); + assert_nc( nChunk>=0 ); + if( nChunk>0 ){ + fts5BufferSafeAppendBlob((Fts5Buffer*)pContext, pChunk, nChunk); + } +} + +typedef struct PoslistCallbackCtx PoslistCallbackCtx; +struct PoslistCallbackCtx { + Fts5Buffer *pBuf; /* Append to this buffer */ + Fts5Colset *pColset; /* Restrict matches to this column */ + int eState; /* See above */ +}; + +typedef struct PoslistOffsetsCtx PoslistOffsetsCtx; +struct PoslistOffsetsCtx { + Fts5Buffer *pBuf; /* Append to this buffer */ + Fts5Colset *pColset; /* Restrict matches to this column */ + int iRead; + int iWrite; +}; + +/* +** TODO: Make this more efficient! +*/ +static int fts5IndexColsetTest(Fts5Colset *pColset, int iCol){ + int i; + for(i=0; i<pColset->nCol; i++){ + if( pColset->aiCol[i]==iCol ) return 1; + } + return 0; +} + +static void fts5PoslistOffsetsCallback( + Fts5Index *pUnused, + void *pContext, + const u8 *pChunk, int nChunk +){ + PoslistOffsetsCtx *pCtx = (PoslistOffsetsCtx*)pContext; + UNUSED_PARAM(pUnused); + assert_nc( nChunk>=0 ); + if( nChunk>0 ){ + int i = 0; + while( i<nChunk ){ + int iVal; + i += fts5GetVarint32(&pChunk[i], iVal); + iVal += pCtx->iRead - 2; + pCtx->iRead = iVal; + if( fts5IndexColsetTest(pCtx->pColset, iVal) ){ + fts5BufferSafeAppendVarint(pCtx->pBuf, iVal + 2 - pCtx->iWrite); + pCtx->iWrite = iVal; + } + } + } +} + +static void fts5PoslistFilterCallback( + Fts5Index *pUnused, + void *pContext, + const u8 *pChunk, int nChunk +){ + PoslistCallbackCtx *pCtx = (PoslistCallbackCtx*)pContext; + UNUSED_PARAM(pUnused); + assert_nc( nChunk>=0 ); + if( nChunk>0 ){ + /* Search through to find the first varint with value 1. This is the + ** start of the next columns hits. */ + int i = 0; + int iStart = 0; + + if( pCtx->eState==2 ){ + int iCol; + fts5FastGetVarint32(pChunk, i, iCol); + if( fts5IndexColsetTest(pCtx->pColset, iCol) ){ + pCtx->eState = 1; + fts5BufferSafeAppendVarint(pCtx->pBuf, 1); + }else{ + pCtx->eState = 0; + } + } + + do { + while( i<nChunk && pChunk[i]!=0x01 ){ + while( pChunk[i] & 0x80 ) i++; + i++; + } + if( pCtx->eState ){ + fts5BufferSafeAppendBlob(pCtx->pBuf, &pChunk[iStart], i-iStart); + } + if( i<nChunk ){ + int iCol; + iStart = i; + i++; + if( i>=nChunk ){ + pCtx->eState = 2; + }else{ + fts5FastGetVarint32(pChunk, i, iCol); + pCtx->eState = fts5IndexColsetTest(pCtx->pColset, iCol); + if( pCtx->eState ){ + fts5BufferSafeAppendBlob(pCtx->pBuf, &pChunk[iStart], i-iStart); + iStart = i; + } + } + } + }while( i<nChunk ); + } +} + +static void fts5ChunkIterate( + Fts5Index *p, /* Index object */ + Fts5SegIter *pSeg, /* Poslist of this iterator */ + void *pCtx, /* Context pointer for xChunk callback */ + void (*xChunk)(Fts5Index*, void*, const u8*, int) +){ + int nRem = pSeg->nPos; /* Number of bytes still to come */ + Fts5Data *pData = 0; + u8 *pChunk = &pSeg->pLeaf->p[pSeg->iLeafOffset]; + int nChunk = MIN(nRem, pSeg->pLeaf->szLeaf - pSeg->iLeafOffset); + int pgno = pSeg->iLeafPgno; + int pgnoSave = 0; + + /* This function does notmwork with detail=none databases. */ + assert( p->pConfig->eDetail!=FTS5_DETAIL_NONE ); + + if( (pSeg->flags & FTS5_SEGITER_REVERSE)==0 ){ + pgnoSave = pgno+1; + } + + while( 1 ){ + xChunk(p, pCtx, pChunk, nChunk); + nRem -= nChunk; + fts5DataRelease(pData); + if( nRem<=0 ){ + break; + }else{ + pgno++; + pData = fts5LeafRead(p, FTS5_SEGMENT_ROWID(pSeg->pSeg->iSegid, pgno)); + if( pData==0 ) break; + pChunk = &pData->p[4]; + nChunk = MIN(nRem, pData->szLeaf - 4); + if( pgno==pgnoSave ){ + assert( pSeg->pNextLeaf==0 ); + pSeg->pNextLeaf = pData; + pData = 0; + } + } + } +} + +/* +** Iterator pIter currently points to a valid entry (not EOF). This +** function appends the position list data for the current entry to +** buffer pBuf. It does not make a copy of the position-list size +** field. +*/ +static void fts5SegiterPoslist( + Fts5Index *p, + Fts5SegIter *pSeg, + Fts5Colset *pColset, + Fts5Buffer *pBuf +){ + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos) ){ + if( pColset==0 ){ + fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); + }else{ + if( p->pConfig->eDetail==FTS5_DETAIL_FULL ){ + PoslistCallbackCtx sCtx; + sCtx.pBuf = pBuf; + sCtx.pColset = pColset; + sCtx.eState = fts5IndexColsetTest(pColset, 0); + assert( sCtx.eState==0 || sCtx.eState==1 ); + fts5ChunkIterate(p, pSeg, (void*)&sCtx, fts5PoslistFilterCallback); + }else{ + PoslistOffsetsCtx sCtx; + memset(&sCtx, 0, sizeof(sCtx)); + sCtx.pBuf = pBuf; + sCtx.pColset = pColset; + fts5ChunkIterate(p, pSeg, (void*)&sCtx, fts5PoslistOffsetsCallback); + } + } + } +} + +/* +** IN/OUT parameter (*pa) points to a position list n bytes in size. If +** the position list contains entries for column iCol, then (*pa) is set +** to point to the sub-position-list for that column and the number of +** bytes in it returned. Or, if the argument position list does not +** contain any entries for column iCol, return 0. +*/ +static int fts5IndexExtractCol( + const u8 **pa, /* IN/OUT: Pointer to poslist */ + int n, /* IN: Size of poslist in bytes */ + int iCol /* Column to extract from poslist */ +){ + int iCurrent = 0; /* Anything before the first 0x01 is col 0 */ + const u8 *p = *pa; + const u8 *pEnd = &p[n]; /* One byte past end of position list */ + + while( iCol>iCurrent ){ + /* Advance pointer p until it points to pEnd or an 0x01 byte that is + ** not part of a varint. Note that it is not possible for a negative + ** or extremely large varint to occur within an uncorrupted position + ** list. So the last byte of each varint may be assumed to have a clear + ** 0x80 bit. */ + while( *p!=0x01 ){ + while( *p++ & 0x80 ); + if( p>=pEnd ) return 0; + } + *pa = p++; + iCurrent = *p++; + if( iCurrent & 0x80 ){ + p--; + p += fts5GetVarint32(p, iCurrent); + } + } + if( iCol!=iCurrent ) return 0; + + /* Advance pointer p until it points to pEnd or an 0x01 byte that is + ** not part of a varint */ + while( p<pEnd && *p!=0x01 ){ + while( *p++ & 0x80 ); + } + + return p - (*pa); +} + +static void fts5IndexExtractColset( + int *pRc, + Fts5Colset *pColset, /* Colset to filter on */ + const u8 *pPos, int nPos, /* Position list */ + Fts5Buffer *pBuf /* Output buffer */ +){ + if( *pRc==SQLITE_OK ){ + int i; + fts5BufferZero(pBuf); + for(i=0; i<pColset->nCol; i++){ + const u8 *pSub = pPos; + int nSub = fts5IndexExtractCol(&pSub, nPos, pColset->aiCol[i]); + if( nSub ){ + fts5BufferAppendBlob(pRc, pBuf, nSub, pSub); + } + } + } +} + +/* +** xSetOutputs callback used by detail=none tables. +*/ +static void fts5IterSetOutputs_None(Fts5Iter *pIter, Fts5SegIter *pSeg){ + assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_NONE ); + pIter->base.iRowid = pSeg->iRowid; + pIter->base.nData = pSeg->nPos; +} + +/* +** xSetOutputs callback used by detail=full and detail=col tables when no +** column filters are specified. +*/ +static void fts5IterSetOutputs_Nocolset(Fts5Iter *pIter, Fts5SegIter *pSeg){ + pIter->base.iRowid = pSeg->iRowid; + pIter->base.nData = pSeg->nPos; + + assert( pIter->pIndex->pConfig->eDetail!=FTS5_DETAIL_NONE ); + assert( pIter->pColset==0 ); + + if( pSeg->iLeafOffset+pSeg->nPos<=pSeg->pLeaf->szLeaf ){ + /* All data is stored on the current page. Populate the output + ** variables to point into the body of the page object. */ + pIter->base.pData = &pSeg->pLeaf->p[pSeg->iLeafOffset]; + }else{ + /* The data is distributed over two or more pages. Copy it into the + ** Fts5Iter.poslist buffer and then set the output pointer to point + ** to this buffer. */ + fts5BufferZero(&pIter->poslist); + fts5SegiterPoslist(pIter->pIndex, pSeg, 0, &pIter->poslist); + pIter->base.pData = pIter->poslist.p; + } +} + +/* +** xSetOutputs callback used when the Fts5Colset object has nCol==0 (match +** against no columns at all). +*/ +static void fts5IterSetOutputs_ZeroColset(Fts5Iter *pIter, Fts5SegIter *pSeg){ + UNUSED_PARAM(pSeg); + pIter->base.nData = 0; +} + +/* +** xSetOutputs callback used by detail=col when there is a column filter +** and there are 100 or more columns. Also called as a fallback from +** fts5IterSetOutputs_Col100 if the column-list spans more than one page. +*/ +static void fts5IterSetOutputs_Col(Fts5Iter *pIter, Fts5SegIter *pSeg){ + fts5BufferZero(&pIter->poslist); + fts5SegiterPoslist(pIter->pIndex, pSeg, pIter->pColset, &pIter->poslist); + pIter->base.iRowid = pSeg->iRowid; + pIter->base.pData = pIter->poslist.p; + pIter->base.nData = pIter->poslist.n; +} + +/* +** xSetOutputs callback used when: +** +** * detail=col, +** * there is a column filter, and +** * the table contains 100 or fewer columns. +** +** The last point is to ensure all column numbers are stored as +** single-byte varints. +*/ +static void fts5IterSetOutputs_Col100(Fts5Iter *pIter, Fts5SegIter *pSeg){ + + assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_COLUMNS ); + assert( pIter->pColset ); + + if( pSeg->iLeafOffset+pSeg->nPos>pSeg->pLeaf->szLeaf ){ + fts5IterSetOutputs_Col(pIter, pSeg); + }else{ + u8 *a = (u8*)&pSeg->pLeaf->p[pSeg->iLeafOffset]; + u8 *pEnd = (u8*)&a[pSeg->nPos]; + int iPrev = 0; + int *aiCol = pIter->pColset->aiCol; + int *aiColEnd = &aiCol[pIter->pColset->nCol]; + + u8 *aOut = pIter->poslist.p; + int iPrevOut = 0; + + pIter->base.iRowid = pSeg->iRowid; + + while( a<pEnd ){ + iPrev += (int)a++[0] - 2; + while( *aiCol<iPrev ){ + aiCol++; + if( aiCol==aiColEnd ) goto setoutputs_col_out; + } + if( *aiCol==iPrev ){ + *aOut++ = (u8)((iPrev - iPrevOut) + 2); + iPrevOut = iPrev; + } + } + +setoutputs_col_out: + pIter->base.pData = pIter->poslist.p; + pIter->base.nData = aOut - pIter->poslist.p; + } +} + +/* +** xSetOutputs callback used by detail=full when there is a column filter. +*/ +static void fts5IterSetOutputs_Full(Fts5Iter *pIter, Fts5SegIter *pSeg){ + Fts5Colset *pColset = pIter->pColset; + pIter->base.iRowid = pSeg->iRowid; + + assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_FULL ); + assert( pColset ); + + if( pSeg->iLeafOffset+pSeg->nPos<=pSeg->pLeaf->szLeaf ){ + /* All data is stored on the current page. Populate the output + ** variables to point into the body of the page object. */ + const u8 *a = &pSeg->pLeaf->p[pSeg->iLeafOffset]; + if( pColset->nCol==1 ){ + pIter->base.nData = fts5IndexExtractCol(&a, pSeg->nPos,pColset->aiCol[0]); + pIter->base.pData = a; + }else{ + int *pRc = &pIter->pIndex->rc; + fts5BufferZero(&pIter->poslist); + fts5IndexExtractColset(pRc, pColset, a, pSeg->nPos, &pIter->poslist); + pIter->base.pData = pIter->poslist.p; + pIter->base.nData = pIter->poslist.n; + } + }else{ + /* The data is distributed over two or more pages. Copy it into the + ** Fts5Iter.poslist buffer and then set the output pointer to point + ** to this buffer. */ + fts5BufferZero(&pIter->poslist); + fts5SegiterPoslist(pIter->pIndex, pSeg, pColset, &pIter->poslist); + pIter->base.pData = pIter->poslist.p; + pIter->base.nData = pIter->poslist.n; + } +} + +static void fts5IterSetOutputCb(int *pRc, Fts5Iter *pIter){ + if( *pRc==SQLITE_OK ){ + Fts5Config *pConfig = pIter->pIndex->pConfig; + if( pConfig->eDetail==FTS5_DETAIL_NONE ){ + pIter->xSetOutputs = fts5IterSetOutputs_None; + } + + else if( pIter->pColset==0 ){ + pIter->xSetOutputs = fts5IterSetOutputs_Nocolset; + } + + else if( pIter->pColset->nCol==0 ){ + pIter->xSetOutputs = fts5IterSetOutputs_ZeroColset; + } + + else if( pConfig->eDetail==FTS5_DETAIL_FULL ){ + pIter->xSetOutputs = fts5IterSetOutputs_Full; + } + + else{ + assert( pConfig->eDetail==FTS5_DETAIL_COLUMNS ); + if( pConfig->nCol<=100 ){ + pIter->xSetOutputs = fts5IterSetOutputs_Col100; + sqlite3Fts5BufferSize(pRc, &pIter->poslist, pConfig->nCol); + }else{ + pIter->xSetOutputs = fts5IterSetOutputs_Col; + } + } + } +} + + +/* +** Allocate a new Fts5Iter object. +** +** The new object will be used to iterate through data in structure pStruct. +** If iLevel is -ve, then all data in all segments is merged. Or, if iLevel +** is zero or greater, data from the first nSegment segments on level iLevel +** is merged. +** +** The iterator initially points to the first term/rowid entry in the +** iterated data. +*/ +static void fts5MultiIterNew( + Fts5Index *p, /* FTS5 backend to iterate within */ + Fts5Structure *pStruct, /* Structure of specific index */ + int flags, /* FTS5INDEX_QUERY_XXX flags */ + Fts5Colset *pColset, /* Colset to filter on (or NULL) */ + const u8 *pTerm, int nTerm, /* Term to seek to (or NULL/0) */ + int iLevel, /* Level to iterate (-1 for all) */ + int nSegment, /* Number of segments to merge (iLevel>=0) */ + Fts5Iter **ppOut /* New object */ +){ + int nSeg = 0; /* Number of segment-iters in use */ + int iIter = 0; /* */ + int iSeg; /* Used to iterate through segments */ + Fts5StructureLevel *pLvl; + Fts5Iter *pNew; + + assert( (pTerm==0 && nTerm==0) || iLevel<0 ); + + /* Allocate space for the new multi-seg-iterator. */ + if( p->rc==SQLITE_OK ){ + if( iLevel<0 ){ + assert( pStruct->nSegment==fts5StructureCountSegments(pStruct) ); + nSeg = pStruct->nSegment; + nSeg += (p->pHash ? 1 : 0); + }else{ + nSeg = MIN(pStruct->aLevel[iLevel].nSeg, nSegment); + } + } + *ppOut = pNew = fts5MultiIterAlloc(p, nSeg); + if( pNew==0 ) return; + pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); + pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); + pNew->pStruct = pStruct; + pNew->pColset = pColset; + fts5StructureRef(pStruct); + if( (flags & FTS5INDEX_QUERY_NOOUTPUT)==0 ){ + fts5IterSetOutputCb(&p->rc, pNew); + } + + /* Initialize each of the component segment iterators. */ + if( p->rc==SQLITE_OK ){ + if( iLevel<0 ){ + Fts5StructureLevel *pEnd = &pStruct->aLevel[pStruct->nLevel]; + if( p->pHash ){ + /* Add a segment iterator for the current contents of the hash table. */ + Fts5SegIter *pIter = &pNew->aSeg[iIter++]; + fts5SegIterHashInit(p, pTerm, nTerm, flags, pIter); + } + for(pLvl=&pStruct->aLevel[0]; pLvl<pEnd; pLvl++){ + for(iSeg=pLvl->nSeg-1; iSeg>=0; iSeg--){ + Fts5StructureSegment *pSeg = &pLvl->aSeg[iSeg]; + Fts5SegIter *pIter = &pNew->aSeg[iIter++]; + if( pTerm==0 ){ + fts5SegIterInit(p, pSeg, pIter); + }else{ + fts5SegIterSeekInit(p, pTerm, nTerm, flags, pSeg, pIter); + } + } + } + }else{ + pLvl = &pStruct->aLevel[iLevel]; + for(iSeg=nSeg-1; iSeg>=0; iSeg--){ + fts5SegIterInit(p, &pLvl->aSeg[iSeg], &pNew->aSeg[iIter++]); + } + } + assert( iIter==nSeg ); + } + + /* If the above was successful, each component iterators now points + ** to the first entry in its segment. In this case initialize the + ** aFirst[] array. Or, if an error has occurred, free the iterator + ** object and set the output variable to NULL. */ + if( p->rc==SQLITE_OK ){ + for(iIter=pNew->nSeg-1; iIter>0; iIter--){ + int iEq; + if( (iEq = fts5MultiIterDoCompare(pNew, iIter)) ){ + Fts5SegIter *pSeg = &pNew->aSeg[iEq]; + if( p->rc==SQLITE_OK ) pSeg->xNext(p, pSeg, 0); + fts5MultiIterAdvanced(p, pNew, iEq, iIter); + } + } + fts5MultiIterSetEof(pNew); + fts5AssertMultiIterSetup(p, pNew); + + if( pNew->bSkipEmpty && fts5MultiIterIsEmpty(p, pNew) ){ + fts5MultiIterNext(p, pNew, 0, 0); + }else if( pNew->base.bEof==0 ){ + Fts5SegIter *pSeg = &pNew->aSeg[pNew->aFirst[1].iFirst]; + pNew->xSetOutputs(pNew, pSeg); + } + + }else{ + fts5MultiIterFree(pNew); + *ppOut = 0; + } +} + +/* +** Create an Fts5Iter that iterates through the doclist provided +** as the second argument. +*/ +static void fts5MultiIterNew2( + Fts5Index *p, /* FTS5 backend to iterate within */ + Fts5Data *pData, /* Doclist to iterate through */ + int bDesc, /* True for descending rowid order */ + Fts5Iter **ppOut /* New object */ +){ + Fts5Iter *pNew; + pNew = fts5MultiIterAlloc(p, 2); + if( pNew ){ + Fts5SegIter *pIter = &pNew->aSeg[1]; + + pIter->flags = FTS5_SEGITER_ONETERM; + if( pData->szLeaf>0 ){ + pIter->pLeaf = pData; + pIter->iLeafOffset = fts5GetVarint(pData->p, (u64*)&pIter->iRowid); + pIter->iEndofDoclist = pData->nn; + pNew->aFirst[1].iFirst = 1; + if( bDesc ){ + pNew->bRev = 1; + pIter->flags |= FTS5_SEGITER_REVERSE; + fts5SegIterReverseInitPage(p, pIter); + }else{ + fts5SegIterLoadNPos(p, pIter); + } + pData = 0; + }else{ + pNew->base.bEof = 1; + } + fts5SegIterSetNext(p, pIter); + + *ppOut = pNew; + } + + fts5DataRelease(pData); +} + +/* +** Return true if the iterator is at EOF or if an error has occurred. +** False otherwise. +*/ +static int fts5MultiIterEof(Fts5Index *p, Fts5Iter *pIter){ + assert( p->rc + || (pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf==0)==pIter->base.bEof + ); + return (p->rc || pIter->base.bEof); +} + +/* +** Return the rowid of the entry that the iterator currently points +** to. If the iterator points to EOF when this function is called the +** results are undefined. +*/ +static i64 fts5MultiIterRowid(Fts5Iter *pIter){ + assert( pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf ); + return pIter->aSeg[ pIter->aFirst[1].iFirst ].iRowid; +} + +/* +** Move the iterator to the next entry at or following iMatch. +*/ +static void fts5MultiIterNextFrom( + Fts5Index *p, + Fts5Iter *pIter, + i64 iMatch +){ + while( 1 ){ + i64 iRowid; + fts5MultiIterNext(p, pIter, 1, iMatch); + if( fts5MultiIterEof(p, pIter) ) break; + iRowid = fts5MultiIterRowid(pIter); + if( pIter->bRev==0 && iRowid>=iMatch ) break; + if( pIter->bRev!=0 && iRowid<=iMatch ) break; + } +} + +/* +** Return a pointer to a buffer containing the term associated with the +** entry that the iterator currently points to. +*/ +static const u8 *fts5MultiIterTerm(Fts5Iter *pIter, int *pn){ + Fts5SegIter *p = &pIter->aSeg[ pIter->aFirst[1].iFirst ]; + *pn = p->term.n; + return p->term.p; +} + +/* +** Allocate a new segment-id for the structure pStruct. The new segment +** id must be between 1 and 65335 inclusive, and must not be used by +** any currently existing segment. If a free segment id cannot be found, +** SQLITE_FULL is returned. +** +** If an error has already occurred, this function is a no-op. 0 is +** returned in this case. +*/ +static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ + int iSegid = 0; + + if( p->rc==SQLITE_OK ){ + if( pStruct->nSegment>=FTS5_MAX_SEGMENT ){ + p->rc = SQLITE_FULL; + }else{ + /* FTS5_MAX_SEGMENT is currently defined as 2000. So the following + ** array is 63 elements, or 252 bytes, in size. */ + u32 aUsed[(FTS5_MAX_SEGMENT+31) / 32]; + int iLvl, iSeg; + int i; + u32 mask; + memset(aUsed, 0, sizeof(aUsed)); + for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){ + for(iSeg=0; iSeg<pStruct->aLevel[iLvl].nSeg; iSeg++){ + int iId = pStruct->aLevel[iLvl].aSeg[iSeg].iSegid; + if( iId<=FTS5_MAX_SEGMENT ){ + aUsed[(iId-1) / 32] |= 1 << ((iId-1) % 32); + } + } + } + + for(i=0; aUsed[i]==0xFFFFFFFF; i++); + mask = aUsed[i]; + for(iSegid=0; mask & (1 << iSegid); iSegid++); + iSegid += 1 + i*32; + +#ifdef SQLITE_DEBUG + for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){ + for(iSeg=0; iSeg<pStruct->aLevel[iLvl].nSeg; iSeg++){ + assert( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); + } + } + assert( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); + + { + sqlite3_stmt *pIdxSelect = fts5IdxSelectStmt(p); + if( p->rc==SQLITE_OK ){ + u8 aBlob[2] = {0xff, 0xff}; + sqlite3_bind_int(pIdxSelect, 1, iSegid); + sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC); + assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); + p->rc = sqlite3_reset(pIdxSelect); + sqlite3_bind_null(pIdxSelect, 2); + } + } +#endif + } + } + + return iSegid; +} + +/* +** Discard all data currently cached in the hash-tables. +*/ +static void fts5IndexDiscardData(Fts5Index *p){ + assert( p->pHash || p->nPendingData==0 ); + if( p->pHash ){ + sqlite3Fts5HashClear(p->pHash); + p->nPendingData = 0; + } +} + +/* +** Return the size of the prefix, in bytes, that buffer +** (pNew/<length-unknown>) shares with buffer (pOld/nOld). +** +** Buffer (pNew/<length-unknown>) is guaranteed to be greater +** than buffer (pOld/nOld). +*/ +static int fts5PrefixCompress(int nOld, const u8 *pOld, const u8 *pNew){ + int i; + for(i=0; i<nOld; i++){ + if( pOld[i]!=pNew[i] ) break; + } + return i; +} + +static void fts5WriteDlidxClear( + Fts5Index *p, + Fts5SegWriter *pWriter, + int bFlush /* If true, write dlidx to disk */ +){ + int i; + assert( bFlush==0 || (pWriter->nDlidx>0 && pWriter->aDlidx[0].buf.n>0) ); + for(i=0; i<pWriter->nDlidx; i++){ + Fts5DlidxWriter *pDlidx = &pWriter->aDlidx[i]; + if( pDlidx->buf.n==0 ) break; + if( bFlush ){ + assert( pDlidx->pgno!=0 ); + fts5DataWrite(p, + FTS5_DLIDX_ROWID(pWriter->iSegid, i, pDlidx->pgno), + pDlidx->buf.p, pDlidx->buf.n + ); + } + sqlite3Fts5BufferZero(&pDlidx->buf); + pDlidx->bPrevValid = 0; + } +} + +/* +** Grow the pWriter->aDlidx[] array to at least nLvl elements in size. +** Any new array elements are zeroed before returning. +*/ +static int fts5WriteDlidxGrow( + Fts5Index *p, + Fts5SegWriter *pWriter, + int nLvl +){ + if( p->rc==SQLITE_OK && nLvl>=pWriter->nDlidx ){ + Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc( + pWriter->aDlidx, sizeof(Fts5DlidxWriter) * nLvl + ); + if( aDlidx==0 ){ + p->rc = SQLITE_NOMEM; + }else{ + int nByte = sizeof(Fts5DlidxWriter) * (nLvl - pWriter->nDlidx); + memset(&aDlidx[pWriter->nDlidx], 0, nByte); + pWriter->aDlidx = aDlidx; + pWriter->nDlidx = nLvl; + } + } + return p->rc; +} + +/* +** If the current doclist-index accumulating in pWriter->aDlidx[] is large +** enough, flush it to disk and return 1. Otherwise discard it and return +** zero. +*/ +static int fts5WriteFlushDlidx(Fts5Index *p, Fts5SegWriter *pWriter){ + int bFlag = 0; + + /* If there were FTS5_MIN_DLIDX_SIZE or more empty leaf pages written + ** to the database, also write the doclist-index to disk. */ + if( pWriter->aDlidx[0].buf.n>0 && pWriter->nEmpty>=FTS5_MIN_DLIDX_SIZE ){ + bFlag = 1; + } + fts5WriteDlidxClear(p, pWriter, bFlag); + pWriter->nEmpty = 0; + return bFlag; +} + +/* +** This function is called whenever processing of the doclist for the +** last term on leaf page (pWriter->iBtPage) is completed. +** +** The doclist-index for that term is currently stored in-memory within the +** Fts5SegWriter.aDlidx[] array. If it is large enough, this function +** writes it out to disk. Or, if it is too small to bother with, discards +** it. +** +** Fts5SegWriter.btterm currently contains the first term on page iBtPage. +*/ +static void fts5WriteFlushBtree(Fts5Index *p, Fts5SegWriter *pWriter){ + int bFlag; + + assert( pWriter->iBtPage || pWriter->nEmpty==0 ); + if( pWriter->iBtPage==0 ) return; + bFlag = fts5WriteFlushDlidx(p, pWriter); + + if( p->rc==SQLITE_OK ){ + const char *z = (pWriter->btterm.n>0?(const char*)pWriter->btterm.p:""); + /* The following was already done in fts5WriteInit(): */ + /* sqlite3_bind_int(p->pIdxWriter, 1, pWriter->iSegid); */ + sqlite3_bind_blob(p->pIdxWriter, 2, z, pWriter->btterm.n, SQLITE_STATIC); + sqlite3_bind_int64(p->pIdxWriter, 3, bFlag + ((i64)pWriter->iBtPage<<1)); + sqlite3_step(p->pIdxWriter); + p->rc = sqlite3_reset(p->pIdxWriter); + sqlite3_bind_null(p->pIdxWriter, 2); + } + pWriter->iBtPage = 0; +} + +/* +** This is called once for each leaf page except the first that contains +** at least one term. Argument (nTerm/pTerm) is the split-key - a term that +** is larger than all terms written to earlier leaves, and equal to or +** smaller than the first term on the new leaf. +** +** If an error occurs, an error code is left in Fts5Index.rc. If an error +** has already occurred when this function is called, it is a no-op. +*/ +static void fts5WriteBtreeTerm( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegWriter *pWriter, /* Writer object */ + int nTerm, const u8 *pTerm /* First term on new page */ +){ + fts5WriteFlushBtree(p, pWriter); + fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); + pWriter->iBtPage = pWriter->writer.pgno; +} + +/* +** This function is called when flushing a leaf page that contains no +** terms at all to disk. +*/ +static void fts5WriteBtreeNoTerm( + Fts5Index *p, /* FTS5 backend object */ + Fts5SegWriter *pWriter /* Writer object */ +){ + /* If there were no rowids on the leaf page either and the doclist-index + ** has already been started, append an 0x00 byte to it. */ + if( pWriter->bFirstRowidInPage && pWriter->aDlidx[0].buf.n>0 ){ + Fts5DlidxWriter *pDlidx = &pWriter->aDlidx[0]; + assert( pDlidx->bPrevValid ); + sqlite3Fts5BufferAppendVarint(&p->rc, &pDlidx->buf, 0); + } + + /* Increment the "number of sequential leaves without a term" counter. */ + pWriter->nEmpty++; +} + +static i64 fts5DlidxExtractFirstRowid(Fts5Buffer *pBuf){ + i64 iRowid; + int iOff; + + iOff = 1 + fts5GetVarint(&pBuf->p[1], (u64*)&iRowid); + fts5GetVarint(&pBuf->p[iOff], (u64*)&iRowid); + return iRowid; +} + +/* +** Rowid iRowid has just been appended to the current leaf page. It is the +** first on the page. This function appends an appropriate entry to the current +** doclist-index. +*/ +static void fts5WriteDlidxAppend( + Fts5Index *p, + Fts5SegWriter *pWriter, + i64 iRowid +){ + int i; + int bDone = 0; + + for(i=0; p->rc==SQLITE_OK && bDone==0; i++){ + i64 iVal; + Fts5DlidxWriter *pDlidx = &pWriter->aDlidx[i]; + + if( pDlidx->buf.n>=p->pConfig->pgsz ){ + /* The current doclist-index page is full. Write it to disk and push + ** a copy of iRowid (which will become the first rowid on the next + ** doclist-index leaf page) up into the next level of the b-tree + ** hierarchy. If the node being flushed is currently the root node, + ** also push its first rowid upwards. */ + pDlidx->buf.p[0] = 0x01; /* Not the root node */ + fts5DataWrite(p, + FTS5_DLIDX_ROWID(pWriter->iSegid, i, pDlidx->pgno), + pDlidx->buf.p, pDlidx->buf.n + ); + fts5WriteDlidxGrow(p, pWriter, i+2); + pDlidx = &pWriter->aDlidx[i]; + if( p->rc==SQLITE_OK && pDlidx[1].buf.n==0 ){ + i64 iFirst = fts5DlidxExtractFirstRowid(&pDlidx->buf); + + /* This was the root node. Push its first rowid up to the new root. */ + pDlidx[1].pgno = pDlidx->pgno; + sqlite3Fts5BufferAppendVarint(&p->rc, &pDlidx[1].buf, 0); + sqlite3Fts5BufferAppendVarint(&p->rc, &pDlidx[1].buf, pDlidx->pgno); + sqlite3Fts5BufferAppendVarint(&p->rc, &pDlidx[1].buf, iFirst); + pDlidx[1].bPrevValid = 1; + pDlidx[1].iPrev = iFirst; + } + + sqlite3Fts5BufferZero(&pDlidx->buf); + pDlidx->bPrevValid = 0; + pDlidx->pgno++; + }else{ + bDone = 1; + } + + if( pDlidx->bPrevValid ){ + iVal = iRowid - pDlidx->iPrev; + }else{ + i64 iPgno = (i==0 ? pWriter->writer.pgno : pDlidx[-1].pgno); + assert( pDlidx->buf.n==0 ); + sqlite3Fts5BufferAppendVarint(&p->rc, &pDlidx->buf, !bDone); + sqlite3Fts5BufferAppendVarint(&p->rc, &pDlidx->buf, iPgno); + iVal = iRowid; + } + + sqlite3Fts5BufferAppendVarint(&p->rc, &pDlidx->buf, iVal); + pDlidx->bPrevValid = 1; + pDlidx->iPrev = iRowid; + } +} + +static void fts5WriteFlushLeaf(Fts5Index *p, Fts5SegWriter *pWriter){ + static const u8 zero[] = { 0x00, 0x00, 0x00, 0x00 }; + Fts5PageWriter *pPage = &pWriter->writer; + i64 iRowid; + + assert( (pPage->pgidx.n==0)==(pWriter->bFirstTermInPage) ); + + /* Set the szLeaf header field. */ + assert( 0==fts5GetU16(&pPage->buf.p[2]) ); + fts5PutU16(&pPage->buf.p[2], (u16)pPage->buf.n); + + if( pWriter->bFirstTermInPage ){ + /* No term was written to this page. */ + assert( pPage->pgidx.n==0 ); + fts5WriteBtreeNoTerm(p, pWriter); + }else{ + /* Append the pgidx to the page buffer. Set the szLeaf header field. */ + fts5BufferAppendBlob(&p->rc, &pPage->buf, pPage->pgidx.n, pPage->pgidx.p); + } + + /* Write the page out to disk */ + iRowid = FTS5_SEGMENT_ROWID(pWriter->iSegid, pPage->pgno); + fts5DataWrite(p, iRowid, pPage->buf.p, pPage->buf.n); + + /* Initialize the next page. */ + fts5BufferZero(&pPage->buf); + fts5BufferZero(&pPage->pgidx); + fts5BufferAppendBlob(&p->rc, &pPage->buf, 4, zero); + pPage->iPrevPgidx = 0; + pPage->pgno++; + + /* Increase the leaves written counter */ + pWriter->nLeafWritten++; + + /* The new leaf holds no terms or rowids */ + pWriter->bFirstTermInPage = 1; + pWriter->bFirstRowidInPage = 1; +} + +/* +** Append term pTerm/nTerm to the segment being written by the writer passed +** as the second argument. +** +** If an error occurs, set the Fts5Index.rc error code. If an error has +** already occurred, this function is a no-op. +*/ +static void fts5WriteAppendTerm( + Fts5Index *p, + Fts5SegWriter *pWriter, + int nTerm, const u8 *pTerm +){ + int nPrefix; /* Bytes of prefix compression for term */ + Fts5PageWriter *pPage = &pWriter->writer; + Fts5Buffer *pPgidx = &pWriter->writer.pgidx; + + assert( p->rc==SQLITE_OK ); + assert( pPage->buf.n>=4 ); + assert( pPage->buf.n>4 || pWriter->bFirstTermInPage ); + + /* If the current leaf page is full, flush it to disk. */ + if( (pPage->buf.n + pPgidx->n + nTerm + 2)>=p->pConfig->pgsz ){ + if( pPage->buf.n>4 ){ + fts5WriteFlushLeaf(p, pWriter); + } + fts5BufferGrow(&p->rc, &pPage->buf, nTerm+FTS5_DATA_PADDING); + } + + /* TODO1: Updating pgidx here. */ + pPgidx->n += sqlite3Fts5PutVarint( + &pPgidx->p[pPgidx->n], pPage->buf.n - pPage->iPrevPgidx + ); + pPage->iPrevPgidx = pPage->buf.n; +#if 0 + fts5PutU16(&pPgidx->p[pPgidx->n], pPage->buf.n); + pPgidx->n += 2; +#endif + + if( pWriter->bFirstTermInPage ){ + nPrefix = 0; + if( pPage->pgno!=1 ){ + /* This is the first term on a leaf that is not the leftmost leaf in + ** the segment b-tree. In this case it is necessary to add a term to + ** the b-tree hierarchy that is (a) larger than the largest term + ** already written to the segment and (b) smaller than or equal to + ** this term. In other words, a prefix of (pTerm/nTerm) that is one + ** byte longer than the longest prefix (pTerm/nTerm) shares with the + ** previous term. + ** + ** Usually, the previous term is available in pPage->term. The exception + ** is if this is the first term written in an incremental-merge step. + ** In this case the previous term is not available, so just write a + ** copy of (pTerm/nTerm) into the parent node. This is slightly + ** inefficient, but still correct. */ + int n = nTerm; + if( pPage->term.n ){ + n = 1 + fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + } + fts5WriteBtreeTerm(p, pWriter, n, pTerm); + pPage = &pWriter->writer; + } + }else{ + nPrefix = fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + fts5BufferAppendVarint(&p->rc, &pPage->buf, nPrefix); + } + + /* Append the number of bytes of new data, then the term data itself + ** to the page. */ + fts5BufferAppendVarint(&p->rc, &pPage->buf, nTerm - nPrefix); + fts5BufferAppendBlob(&p->rc, &pPage->buf, nTerm - nPrefix, &pTerm[nPrefix]); + + /* Update the Fts5PageWriter.term field. */ + fts5BufferSet(&p->rc, &pPage->term, nTerm, pTerm); + pWriter->bFirstTermInPage = 0; + + pWriter->bFirstRowidInPage = 0; + pWriter->bFirstRowidInDoclist = 1; + + assert( p->rc || (pWriter->nDlidx>0 && pWriter->aDlidx[0].buf.n==0) ); + pWriter->aDlidx[0].pgno = pPage->pgno; +} + +/* +** Append a rowid and position-list size field to the writers output. +*/ +static void fts5WriteAppendRowid( + Fts5Index *p, + Fts5SegWriter *pWriter, + i64 iRowid +){ + if( p->rc==SQLITE_OK ){ + Fts5PageWriter *pPage = &pWriter->writer; + + if( (pPage->buf.n + pPage->pgidx.n)>=p->pConfig->pgsz ){ + fts5WriteFlushLeaf(p, pWriter); + } + + /* If this is to be the first rowid written to the page, set the + ** rowid-pointer in the page-header. Also append a value to the dlidx + ** buffer, in case a doclist-index is required. */ + if( pWriter->bFirstRowidInPage ){ + fts5PutU16(pPage->buf.p, (u16)pPage->buf.n); + fts5WriteDlidxAppend(p, pWriter, iRowid); + } + + /* Write the rowid. */ + if( pWriter->bFirstRowidInDoclist || pWriter->bFirstRowidInPage ){ + fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid); + }else{ + assert( p->rc || iRowid>pWriter->iPrevRowid ); + fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid); + } + pWriter->iPrevRowid = iRowid; + pWriter->bFirstRowidInDoclist = 0; + pWriter->bFirstRowidInPage = 0; + } +} + +static void fts5WriteAppendPoslistData( + Fts5Index *p, + Fts5SegWriter *pWriter, + const u8 *aData, + int nData +){ + Fts5PageWriter *pPage = &pWriter->writer; + const u8 *a = aData; + int n = nData; + + assert( p->pConfig->pgsz>0 ); + while( p->rc==SQLITE_OK + && (pPage->buf.n + pPage->pgidx.n + n)>=p->pConfig->pgsz + ){ + int nReq = p->pConfig->pgsz - pPage->buf.n - pPage->pgidx.n; + int nCopy = 0; + while( nCopy<nReq ){ + i64 dummy; + nCopy += fts5GetVarint(&a[nCopy], (u64*)&dummy); + } + fts5BufferAppendBlob(&p->rc, &pPage->buf, nCopy, a); + a += nCopy; + n -= nCopy; + fts5WriteFlushLeaf(p, pWriter); + } + if( n>0 ){ + fts5BufferAppendBlob(&p->rc, &pPage->buf, n, a); + } +} + +/* +** Flush any data cached by the writer object to the database. Free any +** allocations associated with the writer. +*/ +static void fts5WriteFinish( + Fts5Index *p, + Fts5SegWriter *pWriter, /* Writer object */ + int *pnLeaf /* OUT: Number of leaf pages in b-tree */ +){ + int i; + Fts5PageWriter *pLeaf = &pWriter->writer; + if( p->rc==SQLITE_OK ){ + assert( pLeaf->pgno>=1 ); + if( pLeaf->buf.n>4 ){ + fts5WriteFlushLeaf(p, pWriter); + } + *pnLeaf = pLeaf->pgno-1; + if( pLeaf->pgno>1 ){ + fts5WriteFlushBtree(p, pWriter); + } + } + fts5BufferFree(&pLeaf->term); + fts5BufferFree(&pLeaf->buf); + fts5BufferFree(&pLeaf->pgidx); + fts5BufferFree(&pWriter->btterm); + + for(i=0; i<pWriter->nDlidx; i++){ + sqlite3Fts5BufferFree(&pWriter->aDlidx[i].buf); + } + sqlite3_free(pWriter->aDlidx); +} + +static void fts5WriteInit( + Fts5Index *p, + Fts5SegWriter *pWriter, + int iSegid +){ + const int nBuffer = p->pConfig->pgsz + FTS5_DATA_PADDING; + + memset(pWriter, 0, sizeof(Fts5SegWriter)); + pWriter->iSegid = iSegid; + + fts5WriteDlidxGrow(p, pWriter, 1); + pWriter->writer.pgno = 1; + pWriter->bFirstTermInPage = 1; + pWriter->iBtPage = 1; + + assert( pWriter->writer.buf.n==0 ); + assert( pWriter->writer.pgidx.n==0 ); + + /* Grow the two buffers to pgsz + padding bytes in size. */ + sqlite3Fts5BufferSize(&p->rc, &pWriter->writer.pgidx, nBuffer); + sqlite3Fts5BufferSize(&p->rc, &pWriter->writer.buf, nBuffer); + + if( p->pIdxWriter==0 ){ + Fts5Config *pConfig = p->pConfig; + fts5IndexPrepareStmt(p, &p->pIdxWriter, sqlite3_mprintf( + "INSERT INTO '%q'.'%q_idx'(segid,term,pgno) VALUES(?,?,?)", + pConfig->zDb, pConfig->zName + )); + } + + if( p->rc==SQLITE_OK ){ + /* Initialize the 4-byte leaf-page header to 0x00. */ + memset(pWriter->writer.buf.p, 0, 4); + pWriter->writer.buf.n = 4; + + /* Bind the current output segment id to the index-writer. This is an + ** optimization over binding the same value over and over as rows are + ** inserted into %_idx by the current writer. */ + sqlite3_bind_int(p->pIdxWriter, 1, pWriter->iSegid); + } +} + +/* +** Iterator pIter was used to iterate through the input segments of on an +** incremental merge operation. This function is called if the incremental +** merge step has finished but the input has not been completely exhausted. +*/ +static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ + int i; + Fts5Buffer buf; + memset(&buf, 0, sizeof(Fts5Buffer)); + for(i=0; i<pIter->nSeg; i++){ + Fts5SegIter *pSeg = &pIter->aSeg[i]; + if( pSeg->pSeg==0 ){ + /* no-op */ + }else if( pSeg->pLeaf==0 ){ + /* All keys from this input segment have been transfered to the output. + ** Set both the first and last page-numbers to 0 to indicate that the + ** segment is now empty. */ + pSeg->pSeg->pgnoLast = 0; + pSeg->pSeg->pgnoFirst = 0; + }else{ + int iOff = pSeg->iTermLeafOffset; /* Offset on new first leaf page */ + i64 iLeafRowid; + Fts5Data *pData; + int iId = pSeg->pSeg->iSegid; + u8 aHdr[4] = {0x00, 0x00, 0x00, 0x00}; + + iLeafRowid = FTS5_SEGMENT_ROWID(iId, pSeg->iTermLeafPgno); + pData = fts5DataRead(p, iLeafRowid); + if( pData ){ + fts5BufferZero(&buf); + fts5BufferGrow(&p->rc, &buf, pData->nn); + fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); + fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); + fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff, &pData->p[iOff]); + if( p->rc==SQLITE_OK ){ + /* Set the szLeaf field */ + fts5PutU16(&buf.p[2], (u16)buf.n); + } + + /* Set up the new page-index array */ + fts5BufferAppendVarint(&p->rc, &buf, 4); + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno + && pSeg->iEndofDoclist<pData->szLeaf + ){ + int nDiff = pData->szLeaf - pSeg->iEndofDoclist; + fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); + fts5BufferAppendBlob(&p->rc, &buf, + pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] + ); + } + + fts5DataRelease(pData); + pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; + fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); + fts5DataWrite(p, iLeafRowid, buf.p, buf.n); + } + } + } + fts5BufferFree(&buf); +} + +static void fts5MergeChunkCallback( + Fts5Index *p, + void *pCtx, + const u8 *pChunk, int nChunk +){ + Fts5SegWriter *pWriter = (Fts5SegWriter*)pCtx; + fts5WriteAppendPoslistData(p, pWriter, pChunk, nChunk); +} + +/* +** +*/ +static void fts5IndexMergeLevel( + Fts5Index *p, /* FTS5 backend object */ + Fts5Structure **ppStruct, /* IN/OUT: Stucture of index */ + int iLvl, /* Level to read input from */ + int *pnRem /* Write up to this many output leaves */ +){ + Fts5Structure *pStruct = *ppStruct; + Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; + Fts5StructureLevel *pLvlOut; + Fts5Iter *pIter = 0; /* Iterator to read input data */ + int nRem = pnRem ? *pnRem : 0; /* Output leaf pages left to write */ + int nInput; /* Number of input segments */ + Fts5SegWriter writer; /* Writer object */ + Fts5StructureSegment *pSeg; /* Output segment */ + Fts5Buffer term; + int bOldest; /* True if the output segment is the oldest */ + int eDetail = p->pConfig->eDetail; + const int flags = FTS5INDEX_QUERY_NOOUTPUT; + int bTermWritten = 0; /* True if current term already output */ + + assert( iLvl<pStruct->nLevel ); + assert( pLvl->nMerge<=pLvl->nSeg ); + + memset(&writer, 0, sizeof(Fts5SegWriter)); + memset(&term, 0, sizeof(Fts5Buffer)); + if( pLvl->nMerge ){ + pLvlOut = &pStruct->aLevel[iLvl+1]; + assert( pLvlOut->nSeg>0 ); + nInput = pLvl->nMerge; + pSeg = &pLvlOut->aSeg[pLvlOut->nSeg-1]; + + fts5WriteInit(p, &writer, pSeg->iSegid); + writer.writer.pgno = pSeg->pgnoLast+1; + writer.iBtPage = 0; + }else{ + int iSegid = fts5AllocateSegid(p, pStruct); + + /* Extend the Fts5Structure object as required to ensure the output + ** segment exists. */ + if( iLvl==pStruct->nLevel-1 ){ + fts5StructureAddLevel(&p->rc, ppStruct); + pStruct = *ppStruct; + } + fts5StructureExtendLevel(&p->rc, pStruct, iLvl+1, 1, 0); + if( p->rc ) return; + pLvl = &pStruct->aLevel[iLvl]; + pLvlOut = &pStruct->aLevel[iLvl+1]; + + fts5WriteInit(p, &writer, iSegid); + + /* Add the new segment to the output level */ + pSeg = &pLvlOut->aSeg[pLvlOut->nSeg]; + pLvlOut->nSeg++; + pSeg->pgnoFirst = 1; + pSeg->iSegid = iSegid; + pStruct->nSegment++; + + /* Read input from all segments in the input level */ + nInput = pLvl->nSeg; + } + bOldest = (pLvlOut->nSeg==1 && pStruct->nLevel==iLvl+2); + + assert( iLvl>=0 ); + for(fts5MultiIterNew(p, pStruct, flags, 0, 0, 0, iLvl, nInput, &pIter); + fts5MultiIterEof(p, pIter)==0; + fts5MultiIterNext(p, pIter, 0, 0) + ){ + Fts5SegIter *pSegIter = &pIter->aSeg[ pIter->aFirst[1].iFirst ]; + int nPos; /* position-list size field value */ + int nTerm; + const u8 *pTerm; + + pTerm = fts5MultiIterTerm(pIter, &nTerm); + if( nTerm!=term.n || memcmp(pTerm, term.p, nTerm) ){ + if( pnRem && writer.nLeafWritten>nRem ){ + break; + } + fts5BufferSet(&p->rc, &term, nTerm, pTerm); + bTermWritten =0; + } + + /* Check for key annihilation. */ + if( pSegIter->nPos==0 && (bOldest || pSegIter->bDel==0) ) continue; + + if( p->rc==SQLITE_OK && bTermWritten==0 ){ + /* This is a new term. Append a term to the output segment. */ + fts5WriteAppendTerm(p, &writer, nTerm, pTerm); + bTermWritten = 1; + } + + /* Append the rowid to the output */ + /* WRITEPOSLISTSIZE */ + fts5WriteAppendRowid(p, &writer, fts5MultiIterRowid(pIter)); + + if( eDetail==FTS5_DETAIL_NONE ){ + if( pSegIter->bDel ){ + fts5BufferAppendVarint(&p->rc, &writer.writer.buf, 0); + if( pSegIter->nPos>0 ){ + fts5BufferAppendVarint(&p->rc, &writer.writer.buf, 0); + } + } + }else{ + /* Append the position-list data to the output */ + nPos = pSegIter->nPos*2 + pSegIter->bDel; + fts5BufferAppendVarint(&p->rc, &writer.writer.buf, nPos); + fts5ChunkIterate(p, pSegIter, (void*)&writer, fts5MergeChunkCallback); + } + } + + /* Flush the last leaf page to disk. Set the output segment b-tree height + ** and last leaf page number at the same time. */ + fts5WriteFinish(p, &writer, &pSeg->pgnoLast); + + if( fts5MultiIterEof(p, pIter) ){ + int i; + + /* Remove the redundant segments from the %_data table */ + for(i=0; i<nInput; i++){ + fts5DataRemoveSegment(p, pLvl->aSeg[i].iSegid); + } + + /* Remove the redundant segments from the input level */ + if( pLvl->nSeg!=nInput ){ + int nMove = (pLvl->nSeg - nInput) * sizeof(Fts5StructureSegment); + memmove(pLvl->aSeg, &pLvl->aSeg[nInput], nMove); + } + pStruct->nSegment -= nInput; + pLvl->nSeg -= nInput; + pLvl->nMerge = 0; + if( pSeg->pgnoLast==0 ){ + pLvlOut->nSeg--; + pStruct->nSegment--; + } + }else{ + assert( pSeg->pgnoLast>0 ); + fts5TrimSegments(p, pIter); + pLvl->nMerge = nInput; + } + + fts5MultiIterFree(pIter); + fts5BufferFree(&term); + if( pnRem ) *pnRem -= writer.nLeafWritten; +} + +/* +** Do up to nPg pages of automerge work on the index. +** +** Return true if any changes were actually made, or false otherwise. +*/ +static int fts5IndexMerge( + Fts5Index *p, /* FTS5 backend object */ + Fts5Structure **ppStruct, /* IN/OUT: Current structure of index */ + int nPg, /* Pages of work to do */ + int nMin /* Minimum number of segments to merge */ +){ + int nRem = nPg; + int bRet = 0; + Fts5Structure *pStruct = *ppStruct; + while( nRem>0 && p->rc==SQLITE_OK ){ + int iLvl; /* To iterate through levels */ + int iBestLvl = 0; /* Level offering the most input segments */ + int nBest = 0; /* Number of input segments on best level */ + + /* Set iBestLvl to the level to read input segments from. */ + assert( pStruct->nLevel>0 ); + for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){ + Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; + if( pLvl->nMerge ){ + if( pLvl->nMerge>nBest ){ + iBestLvl = iLvl; + nBest = pLvl->nMerge; + } + break; + } + if( pLvl->nSeg>nBest ){ + nBest = pLvl->nSeg; + iBestLvl = iLvl; + } + } + + /* If nBest is still 0, then the index must be empty. */ +#ifdef SQLITE_DEBUG + for(iLvl=0; nBest==0 && iLvl<pStruct->nLevel; iLvl++){ + assert( pStruct->aLevel[iLvl].nSeg==0 ); + } +#endif + + if( nBest<nMin && pStruct->aLevel[iBestLvl].nMerge==0 ){ + break; + } + bRet = 1; + fts5IndexMergeLevel(p, &pStruct, iBestLvl, &nRem); + if( p->rc==SQLITE_OK && pStruct->aLevel[iBestLvl].nMerge==0 ){ + fts5StructurePromote(p, iBestLvl+1, pStruct); + } + } + *ppStruct = pStruct; + return bRet; +} + +/* +** A total of nLeaf leaf pages of data has just been flushed to a level-0 +** segment. This function updates the write-counter accordingly and, if +** necessary, performs incremental merge work. +** +** If an error occurs, set the Fts5Index.rc error code. If an error has +** already occurred, this function is a no-op. +*/ +static void fts5IndexAutomerge( + Fts5Index *p, /* FTS5 backend object */ + Fts5Structure **ppStruct, /* IN/OUT: Current structure of index */ + int nLeaf /* Number of output leaves just written */ +){ + if( p->rc==SQLITE_OK && p->pConfig->nAutomerge>0 ){ + Fts5Structure *pStruct = *ppStruct; + u64 nWrite; /* Initial value of write-counter */ + int nWork; /* Number of work-quanta to perform */ + int nRem; /* Number of leaf pages left to write */ + + /* Update the write-counter. While doing so, set nWork. */ + nWrite = pStruct->nWriteCounter; + nWork = (int)(((nWrite + nLeaf) / p->nWorkUnit) - (nWrite / p->nWorkUnit)); + pStruct->nWriteCounter += nLeaf; + nRem = (int)(p->nWorkUnit * nWork * pStruct->nLevel); + + fts5IndexMerge(p, ppStruct, nRem, p->pConfig->nAutomerge); + } +} + +static void fts5IndexCrisismerge( + Fts5Index *p, /* FTS5 backend object */ + Fts5Structure **ppStruct /* IN/OUT: Current structure of index */ +){ + const int nCrisis = p->pConfig->nCrisisMerge; + Fts5Structure *pStruct = *ppStruct; + int iLvl = 0; + + assert( p->rc!=SQLITE_OK || pStruct->nLevel>0 ); + while( p->rc==SQLITE_OK && pStruct->aLevel[iLvl].nSeg>=nCrisis ){ + fts5IndexMergeLevel(p, &pStruct, iLvl, 0); + assert( p->rc!=SQLITE_OK || pStruct->nLevel>(iLvl+1) ); + fts5StructurePromote(p, iLvl+1, pStruct); + iLvl++; + } + *ppStruct = pStruct; +} + +static int fts5IndexReturn(Fts5Index *p){ + int rc = p->rc; + p->rc = SQLITE_OK; + return rc; +} + +typedef struct Fts5FlushCtx Fts5FlushCtx; +struct Fts5FlushCtx { + Fts5Index *pIdx; + Fts5SegWriter writer; +}; + +/* +** Buffer aBuf[] contains a list of varints, all small enough to fit +** in a 32-bit integer. Return the size of the largest prefix of this +** list nMax bytes or less in size. +*/ +static int fts5PoslistPrefix(const u8 *aBuf, int nMax){ + int ret; + u32 dummy; + ret = fts5GetVarint32(aBuf, dummy); + if( ret<nMax ){ + while( 1 ){ + int i = fts5GetVarint32(&aBuf[ret], dummy); + if( (ret + i) > nMax ) break; + ret += i; + } + } + return ret; +} + +/* +** Flush the contents of in-memory hash table iHash to a new level-0 +** segment on disk. Also update the corresponding structure record. +** +** If an error occurs, set the Fts5Index.rc error code. If an error has +** already occurred, this function is a no-op. +*/ +static void fts5FlushOneHash(Fts5Index *p){ + Fts5Hash *pHash = p->pHash; + Fts5Structure *pStruct; + int iSegid; + int pgnoLast = 0; /* Last leaf page number in segment */ + + /* Obtain a reference to the index structure and allocate a new segment-id + ** for the new level-0 segment. */ + pStruct = fts5StructureRead(p); + iSegid = fts5AllocateSegid(p, pStruct); + fts5StructureInvalidate(p); + + if( iSegid ){ + const int pgsz = p->pConfig->pgsz; + int eDetail = p->pConfig->eDetail; + Fts5StructureSegment *pSeg; /* New segment within pStruct */ + Fts5Buffer *pBuf; /* Buffer in which to assemble leaf page */ + Fts5Buffer *pPgidx; /* Buffer in which to assemble pgidx */ + + Fts5SegWriter writer; + fts5WriteInit(p, &writer, iSegid); + + pBuf = &writer.writer.buf; + pPgidx = &writer.writer.pgidx; + + /* fts5WriteInit() should have initialized the buffers to (most likely) + ** the maximum space required. */ + assert( p->rc || pBuf->nSpace>=(pgsz + FTS5_DATA_PADDING) ); + assert( p->rc || pPgidx->nSpace>=(pgsz + FTS5_DATA_PADDING) ); + + /* Begin scanning through hash table entries. This loop runs once for each + ** term/doclist currently stored within the hash table. */ + if( p->rc==SQLITE_OK ){ + p->rc = sqlite3Fts5HashScanInit(pHash, 0, 0); + } + while( p->rc==SQLITE_OK && 0==sqlite3Fts5HashScanEof(pHash) ){ + const char *zTerm; /* Buffer containing term */ + const u8 *pDoclist; /* Pointer to doclist for this term */ + int nDoclist; /* Size of doclist in bytes */ + + /* Write the term for this entry to disk. */ + sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); + fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm); + + assert( writer.bFirstRowidInPage==0 ); + if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ + /* The entire doclist will fit on the current leaf. */ + fts5BufferSafeAppendBlob(pBuf, pDoclist, nDoclist); + }else{ + i64 iRowid = 0; + i64 iDelta = 0; + int iOff = 0; + + /* The entire doclist will not fit on this leaf. The following + ** loop iterates through the poslists that make up the current + ** doclist. */ + while( p->rc==SQLITE_OK && iOff<nDoclist ){ + iOff += fts5GetVarint(&pDoclist[iOff], (u64*)&iDelta); + iRowid += iDelta; + + if( writer.bFirstRowidInPage ){ + fts5PutU16(&pBuf->p[0], (u16)pBuf->n); /* first rowid on page */ + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); + writer.bFirstRowidInPage = 0; + fts5WriteDlidxAppend(p, &writer, iRowid); + }else{ + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta); + } + assert( pBuf->n<=pBuf->nSpace ); + + if( eDetail==FTS5_DETAIL_NONE ){ + if( iOff<nDoclist && pDoclist[iOff]==0 ){ + pBuf->p[pBuf->n++] = 0; + iOff++; + if( iOff<nDoclist && pDoclist[iOff]==0 ){ + pBuf->p[pBuf->n++] = 0; + iOff++; + } + } + if( (pBuf->n + pPgidx->n)>=pgsz ){ + fts5WriteFlushLeaf(p, &writer); + } + }else{ + int bDummy; + int nPos; + int nCopy = fts5GetPoslistSize(&pDoclist[iOff], &nPos, &bDummy); + nCopy += nPos; + if( (pBuf->n + pPgidx->n + nCopy) <= pgsz ){ + /* The entire poslist will fit on the current leaf. So copy + ** it in one go. */ + fts5BufferSafeAppendBlob(pBuf, &pDoclist[iOff], nCopy); + }else{ + /* The entire poslist will not fit on this leaf. So it needs + ** to be broken into sections. The only qualification being + ** that each varint must be stored contiguously. */ + const u8 *pPoslist = &pDoclist[iOff]; + int iPos = 0; + while( p->rc==SQLITE_OK ){ + int nSpace = pgsz - pBuf->n - pPgidx->n; + int n = 0; + if( (nCopy - iPos)<=nSpace ){ + n = nCopy - iPos; + }else{ + n = fts5PoslistPrefix(&pPoslist[iPos], nSpace); + } + assert( n>0 ); + fts5BufferSafeAppendBlob(pBuf, &pPoslist[iPos], n); + iPos += n; + if( (pBuf->n + pPgidx->n)>=pgsz ){ + fts5WriteFlushLeaf(p, &writer); + } + if( iPos>=nCopy ) break; + } + } + iOff += nCopy; + } + } + } + + /* TODO2: Doclist terminator written here. */ + /* pBuf->p[pBuf->n++] = '\0'; */ + assert( pBuf->n<=pBuf->nSpace ); + sqlite3Fts5HashScanNext(pHash); + } + sqlite3Fts5HashClear(pHash); + fts5WriteFinish(p, &writer, &pgnoLast); + + /* Update the Fts5Structure. It is written back to the database by the + ** fts5StructureRelease() call below. */ + if( pStruct->nLevel==0 ){ + fts5StructureAddLevel(&p->rc, &pStruct); + } + fts5StructureExtendLevel(&p->rc, pStruct, 0, 1, 0); + if( p->rc==SQLITE_OK ){ + pSeg = &pStruct->aLevel[0].aSeg[ pStruct->aLevel[0].nSeg++ ]; + pSeg->iSegid = iSegid; + pSeg->pgnoFirst = 1; + pSeg->pgnoLast = pgnoLast; + pStruct->nSegment++; + } + fts5StructurePromote(p, 0, pStruct); + } + + fts5IndexAutomerge(p, &pStruct, pgnoLast); + fts5IndexCrisismerge(p, &pStruct); + fts5StructureWrite(p, pStruct); + fts5StructureRelease(pStruct); +} + +/* +** Flush any data stored in the in-memory hash tables to the database. +*/ +static void fts5IndexFlush(Fts5Index *p){ + /* Unless it is empty, flush the hash table to disk */ + if( p->nPendingData ){ + assert( p->pHash ); + p->nPendingData = 0; + fts5FlushOneHash(p); + } +} + +static Fts5Structure *fts5IndexOptimizeStruct( + Fts5Index *p, + Fts5Structure *pStruct +){ + Fts5Structure *pNew = 0; + int nByte = sizeof(Fts5Structure); + int nSeg = pStruct->nSegment; + int i; + + /* Figure out if this structure requires optimization. A structure does + ** not require optimization if either: + ** + ** + it consists of fewer than two segments, or + ** + all segments are on the same level, or + ** + all segments except one are currently inputs to a merge operation. + ** + ** In the first case, return NULL. In the second, increment the ref-count + ** on *pStruct and return a copy of the pointer to it. + */ + if( nSeg<2 ) return 0; + for(i=0; i<pStruct->nLevel; i++){ + int nThis = pStruct->aLevel[i].nSeg; + if( nThis==nSeg || (nThis==nSeg-1 && pStruct->aLevel[i].nMerge==nThis) ){ + fts5StructureRef(pStruct); + return pStruct; + } + assert( pStruct->aLevel[i].nMerge<=nThis ); + } + + nByte += (pStruct->nLevel+1) * sizeof(Fts5StructureLevel); + pNew = (Fts5Structure*)sqlite3Fts5MallocZero(&p->rc, nByte); + + if( pNew ){ + Fts5StructureLevel *pLvl; + nByte = nSeg * sizeof(Fts5StructureSegment); + pNew->nLevel = pStruct->nLevel+1; + pNew->nRef = 1; + pNew->nWriteCounter = pStruct->nWriteCounter; + pLvl = &pNew->aLevel[pStruct->nLevel]; + pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&p->rc, nByte); + if( pLvl->aSeg ){ + int iLvl, iSeg; + int iSegOut = 0; + /* Iterate through all segments, from oldest to newest. Add them to + ** the new Fts5Level object so that pLvl->aSeg[0] is the oldest + ** segment in the data structure. */ + for(iLvl=pStruct->nLevel-1; iLvl>=0; iLvl--){ + for(iSeg=0; iSeg<pStruct->aLevel[iLvl].nSeg; iSeg++){ + pLvl->aSeg[iSegOut] = pStruct->aLevel[iLvl].aSeg[iSeg]; + iSegOut++; + } + } + pNew->nSegment = pLvl->nSeg = nSeg; + }else{ + sqlite3_free(pNew); + pNew = 0; + } + } + + return pNew; +} + +static int sqlite3Fts5IndexOptimize(Fts5Index *p){ + Fts5Structure *pStruct; + Fts5Structure *pNew = 0; + + assert( p->rc==SQLITE_OK ); + fts5IndexFlush(p); + pStruct = fts5StructureRead(p); + fts5StructureInvalidate(p); + + if( pStruct ){ + pNew = fts5IndexOptimizeStruct(p, pStruct); + } + fts5StructureRelease(pStruct); + + assert( pNew==0 || pNew->nSegment>0 ); + if( pNew ){ + int iLvl; + for(iLvl=0; pNew->aLevel[iLvl].nSeg==0; iLvl++){} + while( p->rc==SQLITE_OK && pNew->aLevel[iLvl].nSeg>0 ){ + int nRem = FTS5_OPT_WORK_UNIT; + fts5IndexMergeLevel(p, &pNew, iLvl, &nRem); + } + + fts5StructureWrite(p, pNew); + fts5StructureRelease(pNew); + } + + return fts5IndexReturn(p); +} + +/* +** This is called to implement the special "VALUES('merge', $nMerge)" +** INSERT command. +*/ +static int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge){ + Fts5Structure *pStruct = fts5StructureRead(p); + if( pStruct ){ + int nMin = p->pConfig->nUsermerge; + fts5StructureInvalidate(p); + if( nMerge<0 ){ + Fts5Structure *pNew = fts5IndexOptimizeStruct(p, pStruct); + fts5StructureRelease(pStruct); + pStruct = pNew; + nMin = 2; + nMerge = nMerge*-1; + } + if( pStruct && pStruct->nLevel ){ + if( fts5IndexMerge(p, &pStruct, nMerge, nMin) ){ + fts5StructureWrite(p, pStruct); + } + } + fts5StructureRelease(pStruct); + } + return fts5IndexReturn(p); +} + +static void fts5AppendRowid( + Fts5Index *p, + i64 iDelta, + Fts5Iter *pUnused, + Fts5Buffer *pBuf +){ + UNUSED_PARAM(pUnused); + fts5BufferAppendVarint(&p->rc, pBuf, iDelta); +} + +static void fts5AppendPoslist( + Fts5Index *p, + i64 iDelta, + Fts5Iter *pMulti, + Fts5Buffer *pBuf +){ + int nData = pMulti->base.nData; + assert( nData>0 ); + if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nData+9+9) ){ + fts5BufferSafeAppendVarint(pBuf, iDelta); + fts5BufferSafeAppendVarint(pBuf, nData*2); + fts5BufferSafeAppendBlob(pBuf, pMulti->base.pData, nData); + } +} + + +static void fts5DoclistIterNext(Fts5DoclistIter *pIter){ + u8 *p = pIter->aPoslist + pIter->nSize + pIter->nPoslist; + + assert( pIter->aPoslist ); + if( p>=pIter->aEof ){ + pIter->aPoslist = 0; + }else{ + i64 iDelta; + + p += fts5GetVarint(p, (u64*)&iDelta); + pIter->iRowid += iDelta; + + /* Read position list size */ + if( p[0] & 0x80 ){ + int nPos; + pIter->nSize = fts5GetVarint32(p, nPos); + pIter->nPoslist = (nPos>>1); + }else{ + pIter->nPoslist = ((int)(p[0])) >> 1; + pIter->nSize = 1; + } + + pIter->aPoslist = p; + } +} + +static void fts5DoclistIterInit( + Fts5Buffer *pBuf, + Fts5DoclistIter *pIter +){ + memset(pIter, 0, sizeof(*pIter)); + pIter->aPoslist = pBuf->p; + pIter->aEof = &pBuf->p[pBuf->n]; + fts5DoclistIterNext(pIter); +} + +#if 0 +/* +** Append a doclist to buffer pBuf. +** +** This function assumes that space within the buffer has already been +** allocated. +*/ +static void fts5MergeAppendDocid( + Fts5Buffer *pBuf, /* Buffer to write to */ + i64 *piLastRowid, /* IN/OUT: Previous rowid written (if any) */ + i64 iRowid /* Rowid to append */ +){ + assert( pBuf->n!=0 || (*piLastRowid)==0 ); + fts5BufferSafeAppendVarint(pBuf, iRowid - *piLastRowid); + *piLastRowid = iRowid; +} +#endif + +#define fts5MergeAppendDocid(pBuf, iLastRowid, iRowid) { \ + assert( (pBuf)->n!=0 || (iLastRowid)==0 ); \ + fts5BufferSafeAppendVarint((pBuf), (iRowid) - (iLastRowid)); \ + (iLastRowid) = (iRowid); \ +} + +/* +** Swap the contents of buffer *p1 with that of *p2. +*/ +static void fts5BufferSwap(Fts5Buffer *p1, Fts5Buffer *p2){ + Fts5Buffer tmp = *p1; + *p1 = *p2; + *p2 = tmp; +} + +static void fts5NextRowid(Fts5Buffer *pBuf, int *piOff, i64 *piRowid){ + int i = *piOff; + if( i>=pBuf->n ){ + *piOff = -1; + }else{ + u64 iVal; + *piOff = i + sqlite3Fts5GetVarint(&pBuf->p[i], &iVal); + *piRowid += iVal; + } +} + +/* +** This is the equivalent of fts5MergePrefixLists() for detail=none mode. +** In this case the buffers consist of a delta-encoded list of rowids only. +*/ +static void fts5MergeRowidLists( + Fts5Index *p, /* FTS5 backend object */ + Fts5Buffer *p1, /* First list to merge */ + Fts5Buffer *p2 /* Second list to merge */ +){ + int i1 = 0; + int i2 = 0; + i64 iRowid1 = 0; + i64 iRowid2 = 0; + i64 iOut = 0; + + Fts5Buffer out; + memset(&out, 0, sizeof(out)); + sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n); + if( p->rc ) return; + + fts5NextRowid(p1, &i1, &iRowid1); + fts5NextRowid(p2, &i2, &iRowid2); + while( i1>=0 || i2>=0 ){ + if( i1>=0 && (i2<0 || iRowid1<iRowid2) ){ + assert( iOut==0 || iRowid1>iOut ); + fts5BufferSafeAppendVarint(&out, iRowid1 - iOut); + iOut = iRowid1; + fts5NextRowid(p1, &i1, &iRowid1); + }else{ + assert( iOut==0 || iRowid2>iOut ); + fts5BufferSafeAppendVarint(&out, iRowid2 - iOut); + iOut = iRowid2; + if( i1>=0 && iRowid1==iRowid2 ){ + fts5NextRowid(p1, &i1, &iRowid1); + } + fts5NextRowid(p2, &i2, &iRowid2); + } + } + + fts5BufferSwap(&out, p1); + fts5BufferFree(&out); +} + +/* +** Buffers p1 and p2 contain doclists. This function merges the content +** of the two doclists together and sets buffer p1 to the result before +** returning. +** +** If an error occurs, an error code is left in p->rc. If an error has +** already occurred, this function is a no-op. +*/ +static void fts5MergePrefixLists( + Fts5Index *p, /* FTS5 backend object */ + Fts5Buffer *p1, /* First list to merge */ + Fts5Buffer *p2 /* Second list to merge */ +){ + if( p2->n ){ + i64 iLastRowid = 0; + Fts5DoclistIter i1; + Fts5DoclistIter i2; + Fts5Buffer out = {0, 0, 0}; + Fts5Buffer tmp = {0, 0, 0}; + + /* The maximum size of the output is equal to the sum of the two + ** input sizes + 1 varint (9 bytes). The extra varint is because if the + ** first rowid in one input is a large negative number, and the first in + ** the other a non-negative number, the delta for the non-negative + ** number will be larger on disk than the literal integer value + ** was. */ + if( sqlite3Fts5BufferSize(&p->rc, &out, p1->n + p2->n + 9) ) return; + fts5DoclistIterInit(p1, &i1); + fts5DoclistIterInit(p2, &i2); + + while( 1 ){ + if( i1.iRowid<i2.iRowid ){ + /* Copy entry from i1 */ + fts5MergeAppendDocid(&out, iLastRowid, i1.iRowid); + fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.nPoslist+i1.nSize); + fts5DoclistIterNext(&i1); + if( i1.aPoslist==0 ) break; + } + else if( i2.iRowid!=i1.iRowid ){ + /* Copy entry from i2 */ + fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); + fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.nPoslist+i2.nSize); + fts5DoclistIterNext(&i2); + if( i2.aPoslist==0 ) break; + } + else{ + /* Merge the two position lists. */ + i64 iPos1 = 0; + i64 iPos2 = 0; + int iOff1 = 0; + int iOff2 = 0; + u8 *a1 = &i1.aPoslist[i1.nSize]; + u8 *a2 = &i2.aPoslist[i2.nSize]; + + i64 iPrev = 0; + Fts5PoslistWriter writer; + memset(&writer, 0, sizeof(writer)); + + fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); + fts5BufferZero(&tmp); + sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist); + if( p->rc ) break; + + sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); + sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); + assert( iPos1>=0 && iPos2>=0 ); + + if( iPos1<iPos2 ){ + sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos1); + sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); + }else{ + sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); + sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); + } + + if( iPos1>=0 && iPos2>=0 ){ + while( 1 ){ + if( iPos1<iPos2 ){ + if( iPos1!=iPrev ){ + sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos1); + } + sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); + if( iPos1<0 ) break; + }else{ + assert( iPos2!=iPrev ); + sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); + sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); + if( iPos2<0 ) break; + } + } + } + + if( iPos1>=0 ){ + if( iPos1!=iPrev ){ + sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos1); + } + fts5BufferSafeAppendBlob(&tmp, &a1[iOff1], i1.nPoslist-iOff1); + }else{ + assert( iPos2>=0 && iPos2!=iPrev ); + sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); + fts5BufferSafeAppendBlob(&tmp, &a2[iOff2], i2.nPoslist-iOff2); + } + + /* WRITEPOSLISTSIZE */ + fts5BufferSafeAppendVarint(&out, tmp.n * 2); + fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); + fts5DoclistIterNext(&i1); + fts5DoclistIterNext(&i2); + if( i1.aPoslist==0 || i2.aPoslist==0 ) break; + } + } + + if( i1.aPoslist ){ + fts5MergeAppendDocid(&out, iLastRowid, i1.iRowid); + fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.aEof - i1.aPoslist); + } + else if( i2.aPoslist ){ + fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); + fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.aEof - i2.aPoslist); + } + assert( out.n<=(p1->n+p2->n+9) ); + + fts5BufferSet(&p->rc, p1, out.n, out.p); + fts5BufferFree(&tmp); + fts5BufferFree(&out); + } +} + +static void fts5SetupPrefixIter( + Fts5Index *p, /* Index to read from */ + int bDesc, /* True for "ORDER BY rowid DESC" */ + const u8 *pToken, /* Buffer containing prefix to match */ + int nToken, /* Size of buffer pToken in bytes */ + Fts5Colset *pColset, /* Restrict matches to these columns */ + Fts5Iter **ppIter /* OUT: New iterator */ +){ + Fts5Structure *pStruct; + Fts5Buffer *aBuf; + const int nBuf = 32; + + void (*xMerge)(Fts5Index*, Fts5Buffer*, Fts5Buffer*); + void (*xAppend)(Fts5Index*, i64, Fts5Iter*, Fts5Buffer*); + if( p->pConfig->eDetail==FTS5_DETAIL_NONE ){ + xMerge = fts5MergeRowidLists; + xAppend = fts5AppendRowid; + }else{ + xMerge = fts5MergePrefixLists; + xAppend = fts5AppendPoslist; + } + + aBuf = (Fts5Buffer*)fts5IdxMalloc(p, sizeof(Fts5Buffer)*nBuf); + pStruct = fts5StructureRead(p); + + if( aBuf && pStruct ){ + const int flags = FTS5INDEX_QUERY_SCAN + | FTS5INDEX_QUERY_SKIPEMPTY + | FTS5INDEX_QUERY_NOOUTPUT; + int i; + i64 iLastRowid = 0; + Fts5Iter *p1 = 0; /* Iterator used to gather data from index */ + Fts5Data *pData; + Fts5Buffer doclist; + int bNewTerm = 1; + + memset(&doclist, 0, sizeof(doclist)); + fts5MultiIterNew(p, pStruct, flags, pColset, pToken, nToken, -1, 0, &p1); + fts5IterSetOutputCb(&p->rc, p1); + for( /* no-op */ ; + fts5MultiIterEof(p, p1)==0; + fts5MultiIterNext2(p, p1, &bNewTerm) + ){ + Fts5SegIter *pSeg = &p1->aSeg[ p1->aFirst[1].iFirst ]; + int nTerm = pSeg->term.n; + const u8 *pTerm = pSeg->term.p; + p1->xSetOutputs(p1, pSeg); + + assert_nc( memcmp(pToken, pTerm, MIN(nToken, nTerm))<=0 ); + if( bNewTerm ){ + if( nTerm<nToken || memcmp(pToken, pTerm, nToken) ) break; + } + + if( p1->base.nData==0 ) continue; + + if( p1->base.iRowid<=iLastRowid && doclist.n>0 ){ + for(i=0; p->rc==SQLITE_OK && doclist.n; i++){ + assert( i<nBuf ); + if( aBuf[i].n==0 ){ + fts5BufferSwap(&doclist, &aBuf[i]); + fts5BufferZero(&doclist); + }else{ + xMerge(p, &doclist, &aBuf[i]); + fts5BufferZero(&aBuf[i]); + } + } + iLastRowid = 0; + } + + xAppend(p, p1->base.iRowid-iLastRowid, p1, &doclist); + iLastRowid = p1->base.iRowid; + } + + for(i=0; i<nBuf; i++){ + if( p->rc==SQLITE_OK ){ + xMerge(p, &doclist, &aBuf[i]); + } + fts5BufferFree(&aBuf[i]); + } + fts5MultiIterFree(p1); + + pData = fts5IdxMalloc(p, sizeof(Fts5Data) + doclist.n); + if( pData ){ + pData->p = (u8*)&pData[1]; + pData->nn = pData->szLeaf = doclist.n; + if( doclist.n ) memcpy(pData->p, doclist.p, doclist.n); + fts5MultiIterNew2(p, pData, bDesc, ppIter); + } + fts5BufferFree(&doclist); + } + + fts5StructureRelease(pStruct); + sqlite3_free(aBuf); +} + + +/* +** Indicate that all subsequent calls to sqlite3Fts5IndexWrite() pertain +** to the document with rowid iRowid. +*/ +static int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){ + assert( p->rc==SQLITE_OK ); + + /* Allocate the hash table if it has not already been allocated */ + if( p->pHash==0 ){ + p->rc = sqlite3Fts5HashNew(p->pConfig, &p->pHash, &p->nPendingData); + } + + /* Flush the hash table to disk if required */ + if( iRowid<p->iWriteRowid + || (iRowid==p->iWriteRowid && p->bDelete==0) + || (p->nPendingData > p->pConfig->nHashSize) + ){ + fts5IndexFlush(p); + } + + p->iWriteRowid = iRowid; + p->bDelete = bDelete; + return fts5IndexReturn(p); +} + +/* +** Commit data to disk. +*/ +static int sqlite3Fts5IndexSync(Fts5Index *p){ + assert( p->rc==SQLITE_OK ); + fts5IndexFlush(p); + fts5CloseReader(p); + return fts5IndexReturn(p); +} + +/* +** Discard any data stored in the in-memory hash tables. Do not write it +** to the database. Additionally, assume that the contents of the %_data +** table may have changed on disk. So any in-memory caches of %_data +** records must be invalidated. +*/ +static int sqlite3Fts5IndexRollback(Fts5Index *p){ + fts5CloseReader(p); + fts5IndexDiscardData(p); + fts5StructureInvalidate(p); + /* assert( p->rc==SQLITE_OK ); */ + return SQLITE_OK; +} + +/* +** The %_data table is completely empty when this function is called. This +** function populates it with the initial structure objects for each index, +** and the initial version of the "averages" record (a zero-byte blob). +*/ +static int sqlite3Fts5IndexReinit(Fts5Index *p){ + Fts5Structure s; + fts5StructureInvalidate(p); + memset(&s, 0, sizeof(Fts5Structure)); + fts5DataWrite(p, FTS5_AVERAGES_ROWID, (const u8*)"", 0); + fts5StructureWrite(p, &s); + return fts5IndexReturn(p); +} + +/* +** Open a new Fts5Index handle. If the bCreate argument is true, create +** and initialize the underlying %_data table. +** +** If successful, set *pp to point to the new object and return SQLITE_OK. +** Otherwise, set *pp to NULL and return an SQLite error code. +*/ +static int sqlite3Fts5IndexOpen( + Fts5Config *pConfig, + int bCreate, + Fts5Index **pp, + char **pzErr +){ + int rc = SQLITE_OK; + Fts5Index *p; /* New object */ + + *pp = p = (Fts5Index*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Index)); + if( rc==SQLITE_OK ){ + p->pConfig = pConfig; + p->nWorkUnit = FTS5_WORK_UNIT; + p->zDataTbl = sqlite3Fts5Mprintf(&rc, "%s_data", pConfig->zName); + if( p->zDataTbl && bCreate ){ + rc = sqlite3Fts5CreateTable( + pConfig, "data", "id INTEGER PRIMARY KEY, block BLOB", 0, pzErr + ); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5CreateTable(pConfig, "idx", + "segid, term, pgno, PRIMARY KEY(segid, term)", + 1, pzErr + ); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexReinit(p); + } + } + } + + assert( rc!=SQLITE_OK || p->rc==SQLITE_OK ); + if( rc ){ + sqlite3Fts5IndexClose(p); + *pp = 0; + } + return rc; +} + +/* +** Close a handle opened by an earlier call to sqlite3Fts5IndexOpen(). +*/ +static int sqlite3Fts5IndexClose(Fts5Index *p){ + int rc = SQLITE_OK; + if( p ){ + assert( p->pReader==0 ); + fts5StructureInvalidate(p); + sqlite3_finalize(p->pWriter); + sqlite3_finalize(p->pDeleter); + sqlite3_finalize(p->pIdxWriter); + sqlite3_finalize(p->pIdxDeleter); + sqlite3_finalize(p->pIdxSelect); + sqlite3_finalize(p->pDataVersion); + sqlite3Fts5HashFree(p->pHash); + sqlite3_free(p->zDataTbl); + sqlite3_free(p); + } + return rc; +} + +/* +** Argument p points to a buffer containing utf-8 text that is n bytes in +** size. Return the number of bytes in the nChar character prefix of the +** buffer, or 0 if there are less than nChar characters in total. +*/ +static int sqlite3Fts5IndexCharlenToBytelen( + const char *p, + int nByte, + int nChar +){ + int n = 0; + int i; + for(i=0; i<nChar; i++){ + if( n>=nByte ) return 0; /* Input contains fewer than nChar chars */ + if( (unsigned char)p[n++]>=0xc0 ){ + while( (p[n] & 0xc0)==0x80 ) n++; + } + } + return n; +} + +/* +** pIn is a UTF-8 encoded string, nIn bytes in size. Return the number of +** unicode characters in the string. +*/ +static int fts5IndexCharlen(const char *pIn, int nIn){ + int nChar = 0; + int i = 0; + while( i<nIn ){ + if( (unsigned char)pIn[i++]>=0xc0 ){ + while( i<nIn && (pIn[i] & 0xc0)==0x80 ) i++; + } + nChar++; + } + return nChar; +} + +/* +** Insert or remove data to or from the index. Each time a document is +** added to or removed from the index, this function is called one or more +** times. +** +** For an insert, it must be called once for each token in the new document. +** If the operation is a delete, it must be called (at least) once for each +** unique token in the document with an iCol value less than zero. The iPos +** argument is ignored for a delete. +*/ +static int sqlite3Fts5IndexWrite( + Fts5Index *p, /* Index to write to */ + int iCol, /* Column token appears in (-ve -> delete) */ + int iPos, /* Position of token within column */ + const char *pToken, int nToken /* Token to add or remove to or from index */ +){ + int i; /* Used to iterate through indexes */ + int rc = SQLITE_OK; /* Return code */ + Fts5Config *pConfig = p->pConfig; + + assert( p->rc==SQLITE_OK ); + assert( (iCol<0)==p->bDelete ); + + /* Add the entry to the main terms index. */ + rc = sqlite3Fts5HashWrite( + p->pHash, p->iWriteRowid, iCol, iPos, FTS5_MAIN_PREFIX, pToken, nToken + ); + + for(i=0; i<pConfig->nPrefix && rc==SQLITE_OK; i++){ + const int nChar = pConfig->aPrefix[i]; + int nByte = sqlite3Fts5IndexCharlenToBytelen(pToken, nToken, nChar); + if( nByte ){ + rc = sqlite3Fts5HashWrite(p->pHash, + p->iWriteRowid, iCol, iPos, (char)(FTS5_MAIN_PREFIX+i+1), pToken, + nByte + ); + } + } + + return rc; +} + +/* +** Open a new iterator to iterate though all rowid that match the +** specified token or token prefix. +*/ +static int sqlite3Fts5IndexQuery( + Fts5Index *p, /* FTS index to query */ + const char *pToken, int nToken, /* Token (or prefix) to query for */ + int flags, /* Mask of FTS5INDEX_QUERY_X flags */ + Fts5Colset *pColset, /* Match these columns only */ + Fts5IndexIter **ppIter /* OUT: New iterator object */ +){ + Fts5Config *pConfig = p->pConfig; + Fts5Iter *pRet = 0; + Fts5Buffer buf = {0, 0, 0}; + + /* If the QUERY_SCAN flag is set, all other flags must be clear. */ + assert( (flags & FTS5INDEX_QUERY_SCAN)==0 || flags==FTS5INDEX_QUERY_SCAN ); + + if( sqlite3Fts5BufferSize(&p->rc, &buf, nToken+1)==0 ){ + int iIdx = 0; /* Index to search */ + if( nToken ) memcpy(&buf.p[1], pToken, nToken); + + /* Figure out which index to search and set iIdx accordingly. If this + ** is a prefix query for which there is no prefix index, set iIdx to + ** greater than pConfig->nPrefix to indicate that the query will be + ** satisfied by scanning multiple terms in the main index. + ** + ** If the QUERY_TEST_NOIDX flag was specified, then this must be a + ** prefix-query. Instead of using a prefix-index (if one exists), + ** evaluate the prefix query using the main FTS index. This is used + ** for internal sanity checking by the integrity-check in debug + ** mode only. */ +#ifdef SQLITE_DEBUG + if( pConfig->bPrefixIndex==0 || (flags & FTS5INDEX_QUERY_TEST_NOIDX) ){ + assert( flags & FTS5INDEX_QUERY_PREFIX ); + iIdx = 1+pConfig->nPrefix; + }else +#endif + if( flags & FTS5INDEX_QUERY_PREFIX ){ + int nChar = fts5IndexCharlen(pToken, nToken); + for(iIdx=1; iIdx<=pConfig->nPrefix; iIdx++){ + if( pConfig->aPrefix[iIdx-1]==nChar ) break; + } + } + + if( iIdx<=pConfig->nPrefix ){ + /* Straight index lookup */ + Fts5Structure *pStruct = fts5StructureRead(p); + buf.p[0] = (u8)(FTS5_MAIN_PREFIX + iIdx); + if( pStruct ){ + fts5MultiIterNew(p, pStruct, flags | FTS5INDEX_QUERY_SKIPEMPTY, + pColset, buf.p, nToken+1, -1, 0, &pRet + ); + fts5StructureRelease(pStruct); + } + }else{ + /* Scan multiple terms in the main index */ + int bDesc = (flags & FTS5INDEX_QUERY_DESC)!=0; + buf.p[0] = FTS5_MAIN_PREFIX; + fts5SetupPrefixIter(p, bDesc, buf.p, nToken+1, pColset, &pRet); + assert( p->rc!=SQLITE_OK || pRet->pColset==0 ); + fts5IterSetOutputCb(&p->rc, pRet); + if( p->rc==SQLITE_OK ){ + Fts5SegIter *pSeg = &pRet->aSeg[pRet->aFirst[1].iFirst]; + if( pSeg->pLeaf ) pRet->xSetOutputs(pRet, pSeg); + } + } + + if( p->rc ){ + sqlite3Fts5IterClose((Fts5IndexIter*)pRet); + pRet = 0; + fts5CloseReader(p); + } + + *ppIter = &pRet->base; + sqlite3Fts5BufferFree(&buf); + } + return fts5IndexReturn(p); +} + +/* +** Return true if the iterator passed as the only argument is at EOF. +*/ +/* +** Move to the next matching rowid. +*/ +static int sqlite3Fts5IterNext(Fts5IndexIter *pIndexIter){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + assert( pIter->pIndex->rc==SQLITE_OK ); + fts5MultiIterNext(pIter->pIndex, pIter, 0, 0); + return fts5IndexReturn(pIter->pIndex); +} + +/* +** Move to the next matching term/rowid. Used by the fts5vocab module. +*/ +static int sqlite3Fts5IterNextScan(Fts5IndexIter *pIndexIter){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + Fts5Index *p = pIter->pIndex; + + assert( pIter->pIndex->rc==SQLITE_OK ); + + fts5MultiIterNext(p, pIter, 0, 0); + if( p->rc==SQLITE_OK ){ + Fts5SegIter *pSeg = &pIter->aSeg[ pIter->aFirst[1].iFirst ]; + if( pSeg->pLeaf && pSeg->term.p[0]!=FTS5_MAIN_PREFIX ){ + fts5DataRelease(pSeg->pLeaf); + pSeg->pLeaf = 0; + pIter->base.bEof = 1; + } + } + + return fts5IndexReturn(pIter->pIndex); +} + +/* +** Move to the next matching rowid that occurs at or after iMatch. The +** definition of "at or after" depends on whether this iterator iterates +** in ascending or descending rowid order. +*/ +static int sqlite3Fts5IterNextFrom(Fts5IndexIter *pIndexIter, i64 iMatch){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + fts5MultiIterNextFrom(pIter->pIndex, pIter, iMatch); + return fts5IndexReturn(pIter->pIndex); +} + +/* +** Return the current term. +*/ +static const char *sqlite3Fts5IterTerm(Fts5IndexIter *pIndexIter, int *pn){ + int n; + const char *z = (const char*)fts5MultiIterTerm((Fts5Iter*)pIndexIter, &n); + *pn = n-1; + return &z[1]; +} + +/* +** Close an iterator opened by an earlier call to sqlite3Fts5IndexQuery(). +*/ +static void sqlite3Fts5IterClose(Fts5IndexIter *pIndexIter){ + if( pIndexIter ){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + Fts5Index *pIndex = pIter->pIndex; + fts5MultiIterFree(pIter); + fts5CloseReader(pIndex); + } +} + +/* +** Read and decode the "averages" record from the database. +** +** Parameter anSize must point to an array of size nCol, where nCol is +** the number of user defined columns in the FTS table. +*/ +static int sqlite3Fts5IndexGetAverages(Fts5Index *p, i64 *pnRow, i64 *anSize){ + int nCol = p->pConfig->nCol; + Fts5Data *pData; + + *pnRow = 0; + memset(anSize, 0, sizeof(i64) * nCol); + pData = fts5DataRead(p, FTS5_AVERAGES_ROWID); + if( p->rc==SQLITE_OK && pData->nn ){ + int i = 0; + int iCol; + i += fts5GetVarint(&pData->p[i], (u64*)pnRow); + for(iCol=0; i<pData->nn && iCol<nCol; iCol++){ + i += fts5GetVarint(&pData->p[i], (u64*)&anSize[iCol]); + } + } + + fts5DataRelease(pData); + return fts5IndexReturn(p); +} + +/* +** Replace the current "averages" record with the contents of the buffer +** supplied as the second argument. +*/ +static int sqlite3Fts5IndexSetAverages(Fts5Index *p, const u8 *pData, int nData){ + assert( p->rc==SQLITE_OK ); + fts5DataWrite(p, FTS5_AVERAGES_ROWID, pData, nData); + return fts5IndexReturn(p); +} + +/* +** Return the total number of blocks this module has read from the %_data +** table since it was created. +*/ +static int sqlite3Fts5IndexReads(Fts5Index *p){ + return p->nRead; +} + +/* +** Set the 32-bit cookie value stored at the start of all structure +** records to the value passed as the second argument. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. +*/ +static int sqlite3Fts5IndexSetCookie(Fts5Index *p, int iNew){ + int rc; /* Return code */ + Fts5Config *pConfig = p->pConfig; /* Configuration object */ + u8 aCookie[4]; /* Binary representation of iNew */ + sqlite3_blob *pBlob = 0; + + assert( p->rc==SQLITE_OK ); + sqlite3Fts5Put32(aCookie, iNew); + + rc = sqlite3_blob_open(pConfig->db, pConfig->zDb, p->zDataTbl, + "block", FTS5_STRUCTURE_ROWID, 1, &pBlob + ); + if( rc==SQLITE_OK ){ + sqlite3_blob_write(pBlob, aCookie, 4, 0); + rc = sqlite3_blob_close(pBlob); + } + + return rc; +} + +static int sqlite3Fts5IndexLoadConfig(Fts5Index *p){ + Fts5Structure *pStruct; + pStruct = fts5StructureRead(p); + fts5StructureRelease(pStruct); + return fts5IndexReturn(p); +} + + +/************************************************************************* +************************************************************************** +** Below this point is the implementation of the integrity-check +** functionality. +*/ + +/* +** Return a simple checksum value based on the arguments. +*/ +static u64 sqlite3Fts5IndexEntryCksum( + i64 iRowid, + int iCol, + int iPos, + int iIdx, + const char *pTerm, + int nTerm +){ + int i; + u64 ret = iRowid; + ret += (ret<<3) + iCol; + ret += (ret<<3) + iPos; + if( iIdx>=0 ) ret += (ret<<3) + (FTS5_MAIN_PREFIX + iIdx); + for(i=0; i<nTerm; i++) ret += (ret<<3) + pTerm[i]; + return ret; +} + +#ifdef SQLITE_DEBUG +/* +** This function is purely an internal test. It does not contribute to +** FTS functionality, or even the integrity-check, in any way. +** +** Instead, it tests that the same set of pgno/rowid combinations are +** visited regardless of whether the doclist-index identified by parameters +** iSegid/iLeaf is iterated in forwards or reverse order. +*/ +static void fts5TestDlidxReverse( + Fts5Index *p, + int iSegid, /* Segment id to load from */ + int iLeaf /* Load doclist-index for this leaf */ +){ + Fts5DlidxIter *pDlidx = 0; + u64 cksum1 = 13; + u64 cksum2 = 13; + + for(pDlidx=fts5DlidxIterInit(p, 0, iSegid, iLeaf); + fts5DlidxIterEof(p, pDlidx)==0; + fts5DlidxIterNext(p, pDlidx) + ){ + i64 iRowid = fts5DlidxIterRowid(pDlidx); + int pgno = fts5DlidxIterPgno(pDlidx); + assert( pgno>iLeaf ); + cksum1 += iRowid + ((i64)pgno<<32); + } + fts5DlidxIterFree(pDlidx); + pDlidx = 0; + + for(pDlidx=fts5DlidxIterInit(p, 1, iSegid, iLeaf); + fts5DlidxIterEof(p, pDlidx)==0; + fts5DlidxIterPrev(p, pDlidx) + ){ + i64 iRowid = fts5DlidxIterRowid(pDlidx); + int pgno = fts5DlidxIterPgno(pDlidx); + assert( fts5DlidxIterPgno(pDlidx)>iLeaf ); + cksum2 += iRowid + ((i64)pgno<<32); + } + fts5DlidxIterFree(pDlidx); + pDlidx = 0; + + if( p->rc==SQLITE_OK && cksum1!=cksum2 ) p->rc = FTS5_CORRUPT; +} + +static int fts5QueryCksum( + Fts5Index *p, /* Fts5 index object */ + int iIdx, + const char *z, /* Index key to query for */ + int n, /* Size of index key in bytes */ + int flags, /* Flags for Fts5IndexQuery */ + u64 *pCksum /* IN/OUT: Checksum value */ +){ + int eDetail = p->pConfig->eDetail; + u64 cksum = *pCksum; + Fts5IndexIter *pIter = 0; + int rc = sqlite3Fts5IndexQuery(p, z, n, flags, 0, &pIter); + + while( rc==SQLITE_OK && 0==sqlite3Fts5IterEof(pIter) ){ + i64 rowid = pIter->iRowid; + + if( eDetail==FTS5_DETAIL_NONE ){ + cksum ^= sqlite3Fts5IndexEntryCksum(rowid, 0, 0, iIdx, z, n); + }else{ + Fts5PoslistReader sReader; + for(sqlite3Fts5PoslistReaderInit(pIter->pData, pIter->nData, &sReader); + sReader.bEof==0; + sqlite3Fts5PoslistReaderNext(&sReader) + ){ + int iCol = FTS5_POS2COLUMN(sReader.iPos); + int iOff = FTS5_POS2OFFSET(sReader.iPos); + cksum ^= sqlite3Fts5IndexEntryCksum(rowid, iCol, iOff, iIdx, z, n); + } + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IterNext(pIter); + } + } + sqlite3Fts5IterClose(pIter); + + *pCksum = cksum; + return rc; +} + + +/* +** This function is also purely an internal test. It does not contribute to +** FTS functionality, or even the integrity-check, in any way. +*/ +static void fts5TestTerm( + Fts5Index *p, + Fts5Buffer *pPrev, /* Previous term */ + const char *z, int n, /* Possibly new term to test */ + u64 expected, + u64 *pCksum +){ + int rc = p->rc; + if( pPrev->n==0 ){ + fts5BufferSet(&rc, pPrev, n, (const u8*)z); + }else + if( rc==SQLITE_OK && (pPrev->n!=n || memcmp(pPrev->p, z, n)) ){ + u64 cksum3 = *pCksum; + const char *zTerm = (const char*)&pPrev->p[1]; /* term sans prefix-byte */ + int nTerm = pPrev->n-1; /* Size of zTerm in bytes */ + int iIdx = (pPrev->p[0] - FTS5_MAIN_PREFIX); + int flags = (iIdx==0 ? 0 : FTS5INDEX_QUERY_PREFIX); + u64 ck1 = 0; + u64 ck2 = 0; + + /* Check that the results returned for ASC and DESC queries are + ** the same. If not, call this corruption. */ + rc = fts5QueryCksum(p, iIdx, zTerm, nTerm, flags, &ck1); + if( rc==SQLITE_OK ){ + int f = flags|FTS5INDEX_QUERY_DESC; + rc = fts5QueryCksum(p, iIdx, zTerm, nTerm, f, &ck2); + } + if( rc==SQLITE_OK && ck1!=ck2 ) rc = FTS5_CORRUPT; + + /* If this is a prefix query, check that the results returned if the + ** the index is disabled are the same. In both ASC and DESC order. + ** + ** This check may only be performed if the hash table is empty. This + ** is because the hash table only supports a single scan query at + ** a time, and the multi-iter loop from which this function is called + ** is already performing such a scan. */ + if( p->nPendingData==0 ){ + if( iIdx>0 && rc==SQLITE_OK ){ + int f = flags|FTS5INDEX_QUERY_TEST_NOIDX; + ck2 = 0; + rc = fts5QueryCksum(p, iIdx, zTerm, nTerm, f, &ck2); + if( rc==SQLITE_OK && ck1!=ck2 ) rc = FTS5_CORRUPT; + } + if( iIdx>0 && rc==SQLITE_OK ){ + int f = flags|FTS5INDEX_QUERY_TEST_NOIDX|FTS5INDEX_QUERY_DESC; + ck2 = 0; + rc = fts5QueryCksum(p, iIdx, zTerm, nTerm, f, &ck2); + if( rc==SQLITE_OK && ck1!=ck2 ) rc = FTS5_CORRUPT; + } + } + + cksum3 ^= ck1; + fts5BufferSet(&rc, pPrev, n, (const u8*)z); + + if( rc==SQLITE_OK && cksum3!=expected ){ + rc = FTS5_CORRUPT; + } + *pCksum = cksum3; + } + p->rc = rc; +} + +#else +# define fts5TestDlidxReverse(x,y,z) +# define fts5TestTerm(u,v,w,x,y,z) +#endif + +/* +** Check that: +** +** 1) All leaves of pSeg between iFirst and iLast (inclusive) exist and +** contain zero terms. +** 2) All leaves of pSeg between iNoRowid and iLast (inclusive) exist and +** contain zero rowids. +*/ +static void fts5IndexIntegrityCheckEmpty( + Fts5Index *p, + Fts5StructureSegment *pSeg, /* Segment to check internal consistency */ + int iFirst, + int iNoRowid, + int iLast +){ + int i; + + /* Now check that the iter.nEmpty leaves following the current leaf + ** (a) exist and (b) contain no terms. */ + for(i=iFirst; p->rc==SQLITE_OK && i<=iLast; i++){ + Fts5Data *pLeaf = fts5DataRead(p, FTS5_SEGMENT_ROWID(pSeg->iSegid, i)); + if( pLeaf ){ + if( !fts5LeafIsTermless(pLeaf) ) p->rc = FTS5_CORRUPT; + if( i>=iNoRowid && 0!=fts5LeafFirstRowidOff(pLeaf) ) p->rc = FTS5_CORRUPT; + } + fts5DataRelease(pLeaf); + } +} + +static void fts5IntegrityCheckPgidx(Fts5Index *p, Fts5Data *pLeaf){ + int iTermOff = 0; + int ii; + + Fts5Buffer buf1 = {0,0,0}; + Fts5Buffer buf2 = {0,0,0}; + + ii = pLeaf->szLeaf; + while( ii<pLeaf->nn && p->rc==SQLITE_OK ){ + int res; + int iOff; + int nIncr; + + ii += fts5GetVarint32(&pLeaf->p[ii], nIncr); + iTermOff += nIncr; + iOff = iTermOff; + + if( iOff>=pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + }else if( iTermOff==nIncr ){ + int nByte; + iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte); + if( (iOff+nByte)>pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + }else{ + fts5BufferSet(&p->rc, &buf1, nByte, &pLeaf->p[iOff]); + } + }else{ + int nKeep, nByte; + iOff += fts5GetVarint32(&pLeaf->p[iOff], nKeep); + iOff += fts5GetVarint32(&pLeaf->p[iOff], nByte); + if( nKeep>buf1.n || (iOff+nByte)>pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + }else{ + buf1.n = nKeep; + fts5BufferAppendBlob(&p->rc, &buf1, nByte, &pLeaf->p[iOff]); + } + + if( p->rc==SQLITE_OK ){ + res = fts5BufferCompare(&buf1, &buf2); + if( res<=0 ) p->rc = FTS5_CORRUPT; + } + } + fts5BufferSet(&p->rc, &buf2, buf1.n, buf1.p); + } + + fts5BufferFree(&buf1); + fts5BufferFree(&buf2); +} + +static void fts5IndexIntegrityCheckSegment( + Fts5Index *p, /* FTS5 backend object */ + Fts5StructureSegment *pSeg /* Segment to check internal consistency */ +){ + Fts5Config *pConfig = p->pConfig; + sqlite3_stmt *pStmt = 0; + int rc2; + int iIdxPrevLeaf = pSeg->pgnoFirst-1; + int iDlidxPrevLeaf = pSeg->pgnoLast; + + if( pSeg->pgnoFirst==0 ) return; + + fts5IndexPrepareStmt(p, &pStmt, sqlite3_mprintf( + "SELECT segid, term, (pgno>>1), (pgno&1) FROM %Q.'%q_idx' WHERE segid=%d", + pConfig->zDb, pConfig->zName, pSeg->iSegid + )); + + /* Iterate through the b-tree hierarchy. */ + while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ + i64 iRow; /* Rowid for this leaf */ + Fts5Data *pLeaf; /* Data for this leaf */ + + int nIdxTerm = sqlite3_column_bytes(pStmt, 1); + const char *zIdxTerm = (const char*)sqlite3_column_text(pStmt, 1); + int iIdxLeaf = sqlite3_column_int(pStmt, 2); + int bIdxDlidx = sqlite3_column_int(pStmt, 3); + + /* If the leaf in question has already been trimmed from the segment, + ** ignore this b-tree entry. Otherwise, load it into memory. */ + if( iIdxLeaf<pSeg->pgnoFirst ) continue; + iRow = FTS5_SEGMENT_ROWID(pSeg->iSegid, iIdxLeaf); + pLeaf = fts5LeafRead(p, iRow); + if( pLeaf==0 ) break; + + /* Check that the leaf contains at least one term, and that it is equal + ** to or larger than the split-key in zIdxTerm. Also check that if there + ** is also a rowid pointer within the leaf page header, it points to a + ** location before the term. */ + if( pLeaf->nn<=pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + }else{ + int iOff; /* Offset of first term on leaf */ + int iRowidOff; /* Offset of first rowid on leaf */ + int nTerm; /* Size of term on leaf in bytes */ + int res; /* Comparison of term and split-key */ + + iOff = fts5LeafFirstTermOff(pLeaf); + iRowidOff = fts5LeafFirstRowidOff(pLeaf); + if( iRowidOff>=iOff ){ + p->rc = FTS5_CORRUPT; + }else{ + iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); + res = memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); + if( res==0 ) res = nTerm - nIdxTerm; + if( res<0 ) p->rc = FTS5_CORRUPT; + } + + fts5IntegrityCheckPgidx(p, pLeaf); + } + fts5DataRelease(pLeaf); + if( p->rc ) break; + + /* Now check that the iter.nEmpty leaves following the current leaf + ** (a) exist and (b) contain no terms. */ + fts5IndexIntegrityCheckEmpty( + p, pSeg, iIdxPrevLeaf+1, iDlidxPrevLeaf+1, iIdxLeaf-1 + ); + if( p->rc ) break; + + /* If there is a doclist-index, check that it looks right. */ + if( bIdxDlidx ){ + Fts5DlidxIter *pDlidx = 0; /* For iterating through doclist index */ + int iPrevLeaf = iIdxLeaf; + int iSegid = pSeg->iSegid; + int iPg = 0; + i64 iKey; + + for(pDlidx=fts5DlidxIterInit(p, 0, iSegid, iIdxLeaf); + fts5DlidxIterEof(p, pDlidx)==0; + fts5DlidxIterNext(p, pDlidx) + ){ + + /* Check any rowid-less pages that occur before the current leaf. */ + for(iPg=iPrevLeaf+1; iPg<fts5DlidxIterPgno(pDlidx); iPg++){ + iKey = FTS5_SEGMENT_ROWID(iSegid, iPg); + pLeaf = fts5DataRead(p, iKey); + if( pLeaf ){ + if( fts5LeafFirstRowidOff(pLeaf)!=0 ) p->rc = FTS5_CORRUPT; + fts5DataRelease(pLeaf); + } + } + iPrevLeaf = fts5DlidxIterPgno(pDlidx); + + /* Check that the leaf page indicated by the iterator really does + ** contain the rowid suggested by the same. */ + iKey = FTS5_SEGMENT_ROWID(iSegid, iPrevLeaf); + pLeaf = fts5DataRead(p, iKey); + if( pLeaf ){ + i64 iRowid; + int iRowidOff = fts5LeafFirstRowidOff(pLeaf); + ASSERT_SZLEAF_OK(pLeaf); + if( iRowidOff>=pLeaf->szLeaf ){ + p->rc = FTS5_CORRUPT; + }else{ + fts5GetVarint(&pLeaf->p[iRowidOff], (u64*)&iRowid); + if( iRowid!=fts5DlidxIterRowid(pDlidx) ) p->rc = FTS5_CORRUPT; + } + fts5DataRelease(pLeaf); + } + } + + iDlidxPrevLeaf = iPg; + fts5DlidxIterFree(pDlidx); + fts5TestDlidxReverse(p, iSegid, iIdxLeaf); + }else{ + iDlidxPrevLeaf = pSeg->pgnoLast; + /* TODO: Check there is no doclist index */ + } + + iIdxPrevLeaf = iIdxLeaf; + } + + rc2 = sqlite3_finalize(pStmt); + if( p->rc==SQLITE_OK ) p->rc = rc2; + + /* Page iter.iLeaf must now be the rightmost leaf-page in the segment */ +#if 0 + if( p->rc==SQLITE_OK && iter.iLeaf!=pSeg->pgnoLast ){ + p->rc = FTS5_CORRUPT; + } +#endif +} + + +/* +** Run internal checks to ensure that the FTS index (a) is internally +** consistent and (b) contains entries for which the XOR of the checksums +** as calculated by sqlite3Fts5IndexEntryCksum() is cksum. +** +** Return SQLITE_CORRUPT if any of the internal checks fail, or if the +** checksum does not match. Return SQLITE_OK if all checks pass without +** error, or some other SQLite error code if another error (e.g. OOM) +** occurs. +*/ +static int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){ + int eDetail = p->pConfig->eDetail; + u64 cksum2 = 0; /* Checksum based on contents of indexes */ + Fts5Buffer poslist = {0,0,0}; /* Buffer used to hold a poslist */ + Fts5Iter *pIter; /* Used to iterate through entire index */ + Fts5Structure *pStruct; /* Index structure */ + +#ifdef SQLITE_DEBUG + /* Used by extra internal tests only run if NDEBUG is not defined */ + u64 cksum3 = 0; /* Checksum based on contents of indexes */ + Fts5Buffer term = {0,0,0}; /* Buffer used to hold most recent term */ +#endif + const int flags = FTS5INDEX_QUERY_NOOUTPUT; + + /* Load the FTS index structure */ + pStruct = fts5StructureRead(p); + + /* Check that the internal nodes of each segment match the leaves */ + if( pStruct ){ + int iLvl, iSeg; + for(iLvl=0; iLvl<pStruct->nLevel; iLvl++){ + for(iSeg=0; iSeg<pStruct->aLevel[iLvl].nSeg; iSeg++){ + Fts5StructureSegment *pSeg = &pStruct->aLevel[iLvl].aSeg[iSeg]; + fts5IndexIntegrityCheckSegment(p, pSeg); + } + } + } + + /* The cksum argument passed to this function is a checksum calculated + ** based on all expected entries in the FTS index (including prefix index + ** entries). This block checks that a checksum calculated based on the + ** actual contents of FTS index is identical. + ** + ** Two versions of the same checksum are calculated. The first (stack + ** variable cksum2) based on entries extracted from the full-text index + ** while doing a linear scan of each individual index in turn. + ** + ** As each term visited by the linear scans, a separate query for the + ** same term is performed. cksum3 is calculated based on the entries + ** extracted by these queries. + */ + for(fts5MultiIterNew(p, pStruct, flags, 0, 0, 0, -1, 0, &pIter); + fts5MultiIterEof(p, pIter)==0; + fts5MultiIterNext(p, pIter, 0, 0) + ){ + int n; /* Size of term in bytes */ + i64 iPos = 0; /* Position read from poslist */ + int iOff = 0; /* Offset within poslist */ + i64 iRowid = fts5MultiIterRowid(pIter); + char *z = (char*)fts5MultiIterTerm(pIter, &n); + + /* If this is a new term, query for it. Update cksum3 with the results. */ + fts5TestTerm(p, &term, z, n, cksum2, &cksum3); + + if( eDetail==FTS5_DETAIL_NONE ){ + if( 0==fts5MultiIterIsEmpty(p, pIter) ){ + cksum2 ^= sqlite3Fts5IndexEntryCksum(iRowid, 0, 0, -1, z, n); + } + }else{ + poslist.n = 0; + fts5SegiterPoslist(p, &pIter->aSeg[pIter->aFirst[1].iFirst], 0, &poslist); + while( 0==sqlite3Fts5PoslistNext64(poslist.p, poslist.n, &iOff, &iPos) ){ + int iCol = FTS5_POS2COLUMN(iPos); + int iTokOff = FTS5_POS2OFFSET(iPos); + cksum2 ^= sqlite3Fts5IndexEntryCksum(iRowid, iCol, iTokOff, -1, z, n); + } + } + } + fts5TestTerm(p, &term, 0, 0, cksum2, &cksum3); + + fts5MultiIterFree(pIter); + if( p->rc==SQLITE_OK && cksum!=cksum2 ) p->rc = FTS5_CORRUPT; + + fts5StructureRelease(pStruct); +#ifdef SQLITE_DEBUG + fts5BufferFree(&term); +#endif + fts5BufferFree(&poslist); + return fts5IndexReturn(p); +} + +/************************************************************************* +************************************************************************** +** Below this point is the implementation of the fts5_decode() scalar +** function only. +*/ + +/* +** Decode a segment-data rowid from the %_data table. This function is +** the opposite of macro FTS5_SEGMENT_ROWID(). +*/ +static void fts5DecodeRowid( + i64 iRowid, /* Rowid from %_data table */ + int *piSegid, /* OUT: Segment id */ + int *pbDlidx, /* OUT: Dlidx flag */ + int *piHeight, /* OUT: Height */ + int *piPgno /* OUT: Page number */ +){ + *piPgno = (int)(iRowid & (((i64)1 << FTS5_DATA_PAGE_B) - 1)); + iRowid >>= FTS5_DATA_PAGE_B; + + *piHeight = (int)(iRowid & (((i64)1 << FTS5_DATA_HEIGHT_B) - 1)); + iRowid >>= FTS5_DATA_HEIGHT_B; + + *pbDlidx = (int)(iRowid & 0x0001); + iRowid >>= FTS5_DATA_DLI_B; + + *piSegid = (int)(iRowid & (((i64)1 << FTS5_DATA_ID_B) - 1)); +} + +static void fts5DebugRowid(int *pRc, Fts5Buffer *pBuf, i64 iKey){ + int iSegid, iHeight, iPgno, bDlidx; /* Rowid compenents */ + fts5DecodeRowid(iKey, &iSegid, &bDlidx, &iHeight, &iPgno); + + if( iSegid==0 ){ + if( iKey==FTS5_AVERAGES_ROWID ){ + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "{averages} "); + }else{ + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "{structure}"); + } + } + else{ + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "{%ssegid=%d h=%d pgno=%d}", + bDlidx ? "dlidx " : "", iSegid, iHeight, iPgno + ); + } +} + +static void fts5DebugStructure( + int *pRc, /* IN/OUT: error code */ + Fts5Buffer *pBuf, + Fts5Structure *p +){ + int iLvl, iSeg; /* Iterate through levels, segments */ + + for(iLvl=0; iLvl<p->nLevel; iLvl++){ + Fts5StructureLevel *pLvl = &p->aLevel[iLvl]; + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, + " {lvl=%d nMerge=%d nSeg=%d", iLvl, pLvl->nMerge, pLvl->nSeg + ); + for(iSeg=0; iSeg<pLvl->nSeg; iSeg++){ + Fts5StructureSegment *pSeg = &pLvl->aSeg[iSeg]; + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " {id=%d leaves=%d..%d}", + pSeg->iSegid, pSeg->pgnoFirst, pSeg->pgnoLast + ); + } + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "}"); + } +} + +/* +** This is part of the fts5_decode() debugging aid. +** +** Arguments pBlob/nBlob contain a serialized Fts5Structure object. This +** function appends a human-readable representation of the same object +** to the buffer passed as the second argument. +*/ +static void fts5DecodeStructure( + int *pRc, /* IN/OUT: error code */ + Fts5Buffer *pBuf, + const u8 *pBlob, int nBlob +){ + int rc; /* Return code */ + Fts5Structure *p = 0; /* Decoded structure object */ + + rc = fts5StructureDecode(pBlob, nBlob, 0, &p); + if( rc!=SQLITE_OK ){ + *pRc = rc; + return; + } + + fts5DebugStructure(pRc, pBuf, p); + fts5StructureRelease(p); +} + +/* +** This is part of the fts5_decode() debugging aid. +** +** Arguments pBlob/nBlob contain an "averages" record. This function +** appends a human-readable representation of record to the buffer passed +** as the second argument. +*/ +static void fts5DecodeAverages( + int *pRc, /* IN/OUT: error code */ + Fts5Buffer *pBuf, + const u8 *pBlob, int nBlob +){ + int i = 0; + const char *zSpace = ""; + + while( i<nBlob ){ + u64 iVal; + i += sqlite3Fts5GetVarint(&pBlob[i], &iVal); + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, "%s%d", zSpace, (int)iVal); + zSpace = " "; + } +} + +/* +** Buffer (a/n) is assumed to contain a list of serialized varints. Read +** each varint and append its string representation to buffer pBuf. Return +** after either the input buffer is exhausted or a 0 value is read. +** +** The return value is the number of bytes read from the input buffer. +*/ +static int fts5DecodePoslist(int *pRc, Fts5Buffer *pBuf, const u8 *a, int n){ + int iOff = 0; + while( iOff<n ){ + int iVal; + iOff += fts5GetVarint32(&a[iOff], iVal); + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " %d", iVal); + } + return iOff; +} + +/* +** The start of buffer (a/n) contains the start of a doclist. The doclist +** may or may not finish within the buffer. This function appends a text +** representation of the part of the doclist that is present to buffer +** pBuf. +** +** The return value is the number of bytes read from the input buffer. +*/ +static int fts5DecodeDoclist(int *pRc, Fts5Buffer *pBuf, const u8 *a, int n){ + i64 iDocid = 0; + int iOff = 0; + + if( n>0 ){ + iOff = sqlite3Fts5GetVarint(a, (u64*)&iDocid); + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " id=%lld", iDocid); + } + while( iOff<n ){ + int nPos; + int bDel; + iOff += fts5GetPoslistSize(&a[iOff], &nPos, &bDel); + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " nPos=%d%s", nPos, bDel?"*":""); + iOff += fts5DecodePoslist(pRc, pBuf, &a[iOff], MIN(n-iOff, nPos)); + if( iOff<n ){ + i64 iDelta; + iOff += sqlite3Fts5GetVarint(&a[iOff], (u64*)&iDelta); + iDocid += iDelta; + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " id=%lld", iDocid); + } + } + + return iOff; +} + +/* +** This function is part of the fts5_decode() debugging function. It is +** only ever used with detail=none tables. +** +** Buffer (pData/nData) contains a doclist in the format used by detail=none +** tables. This function appends a human-readable version of that list to +** buffer pBuf. +** +** If *pRc is other than SQLITE_OK when this function is called, it is a +** no-op. If an OOM or other error occurs within this function, *pRc is +** set to an SQLite error code before returning. The final state of buffer +** pBuf is undefined in this case. +*/ +static void fts5DecodeRowidList( + int *pRc, /* IN/OUT: Error code */ + Fts5Buffer *pBuf, /* Buffer to append text to */ + const u8 *pData, int nData /* Data to decode list-of-rowids from */ +){ + int i = 0; + i64 iRowid = 0; + + while( i<nData ){ + const char *zApp = ""; + u64 iVal; + i += sqlite3Fts5GetVarint(&pData[i], &iVal); + iRowid += iVal; + + if( i<nData && pData[i]==0x00 ){ + i++; + if( i<nData && pData[i]==0x00 ){ + i++; + zApp = "+"; + }else{ + zApp = "*"; + } + } + + sqlite3Fts5BufferAppendPrintf(pRc, pBuf, " %lld%s", iRowid, zApp); + } +} + +/* +** The implementation of user-defined scalar function fts5_decode(). +*/ +static void fts5DecodeFunction( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args (always 2) */ + sqlite3_value **apVal /* Function arguments */ +){ + i64 iRowid; /* Rowid for record being decoded */ + int iSegid,iHeight,iPgno,bDlidx;/* Rowid components */ + const u8 *aBlob; int n; /* Record to decode */ + u8 *a = 0; + Fts5Buffer s; /* Build up text to return here */ + int rc = SQLITE_OK; /* Return code */ + int nSpace = 0; + int eDetailNone = (sqlite3_user_data(pCtx)!=0); + + assert( nArg==2 ); + UNUSED_PARAM(nArg); + memset(&s, 0, sizeof(Fts5Buffer)); + iRowid = sqlite3_value_int64(apVal[0]); + + /* Make a copy of the second argument (a blob) in aBlob[]. The aBlob[] + ** copy is followed by FTS5_DATA_ZERO_PADDING 0x00 bytes, which prevents + ** buffer overreads even if the record is corrupt. */ + n = sqlite3_value_bytes(apVal[1]); + aBlob = sqlite3_value_blob(apVal[1]); + nSpace = n + FTS5_DATA_ZERO_PADDING; + a = (u8*)sqlite3Fts5MallocZero(&rc, nSpace); + if( a==0 ) goto decode_out; + memcpy(a, aBlob, n); + + + fts5DecodeRowid(iRowid, &iSegid, &bDlidx, &iHeight, &iPgno); + + fts5DebugRowid(&rc, &s, iRowid); + if( bDlidx ){ + Fts5Data dlidx; + Fts5DlidxLvl lvl; + + dlidx.p = a; + dlidx.nn = n; + + memset(&lvl, 0, sizeof(Fts5DlidxLvl)); + lvl.pData = &dlidx; + lvl.iLeafPgno = iPgno; + + for(fts5DlidxLvlNext(&lvl); lvl.bEof==0; fts5DlidxLvlNext(&lvl)){ + sqlite3Fts5BufferAppendPrintf(&rc, &s, + " %d(%lld)", lvl.iLeafPgno, lvl.iRowid + ); + } + }else if( iSegid==0 ){ + if( iRowid==FTS5_AVERAGES_ROWID ){ + fts5DecodeAverages(&rc, &s, a, n); + }else{ + fts5DecodeStructure(&rc, &s, a, n); + } + }else if( eDetailNone ){ + Fts5Buffer term; /* Current term read from page */ + int szLeaf; + int iPgidxOff = szLeaf = fts5GetU16(&a[2]); + int iTermOff; + int nKeep = 0; + int iOff; + + memset(&term, 0, sizeof(Fts5Buffer)); + + /* Decode any entries that occur before the first term. */ + if( szLeaf<n ){ + iPgidxOff += fts5GetVarint32(&a[iPgidxOff], iTermOff); + }else{ + iTermOff = szLeaf; + } + fts5DecodeRowidList(&rc, &s, &a[4], iTermOff-4); + + iOff = iTermOff; + while( iOff<szLeaf ){ + int nAppend; + + /* Read the term data for the next term*/ + iOff += fts5GetVarint32(&a[iOff], nAppend); + term.n = nKeep; + fts5BufferAppendBlob(&rc, &term, nAppend, &a[iOff]); + sqlite3Fts5BufferAppendPrintf( + &rc, &s, " term=%.*s", term.n, (const char*)term.p + ); + iOff += nAppend; + + /* Figure out where the doclist for this term ends */ + if( iPgidxOff<n ){ + int nIncr; + iPgidxOff += fts5GetVarint32(&a[iPgidxOff], nIncr); + iTermOff += nIncr; + }else{ + iTermOff = szLeaf; + } + + fts5DecodeRowidList(&rc, &s, &a[iOff], iTermOff-iOff); + iOff = iTermOff; + if( iOff<szLeaf ){ + iOff += fts5GetVarint32(&a[iOff], nKeep); + } + } + + fts5BufferFree(&term); + }else{ + Fts5Buffer term; /* Current term read from page */ + int szLeaf; /* Offset of pgidx in a[] */ + int iPgidxOff; + int iPgidxPrev = 0; /* Previous value read from pgidx */ + int iTermOff = 0; + int iRowidOff = 0; + int iOff; + int nDoclist; + + memset(&term, 0, sizeof(Fts5Buffer)); + + if( n<4 ){ + sqlite3Fts5BufferSet(&rc, &s, 7, (const u8*)"corrupt"); + goto decode_out; + }else{ + iRowidOff = fts5GetU16(&a[0]); + iPgidxOff = szLeaf = fts5GetU16(&a[2]); + if( iPgidxOff<n ){ + fts5GetVarint32(&a[iPgidxOff], iTermOff); + } + } + + /* Decode the position list tail at the start of the page */ + if( iRowidOff!=0 ){ + iOff = iRowidOff; + }else if( iTermOff!=0 ){ + iOff = iTermOff; + }else{ + iOff = szLeaf; + } + fts5DecodePoslist(&rc, &s, &a[4], iOff-4); + + /* Decode any more doclist data that appears on the page before the + ** first term. */ + nDoclist = (iTermOff ? iTermOff : szLeaf) - iOff; + fts5DecodeDoclist(&rc, &s, &a[iOff], nDoclist); + + while( iPgidxOff<n ){ + int bFirst = (iPgidxOff==szLeaf); /* True for first term on page */ + int nByte; /* Bytes of data */ + int iEnd; + + iPgidxOff += fts5GetVarint32(&a[iPgidxOff], nByte); + iPgidxPrev += nByte; + iOff = iPgidxPrev; + + if( iPgidxOff<n ){ + fts5GetVarint32(&a[iPgidxOff], nByte); + iEnd = iPgidxPrev + nByte; + }else{ + iEnd = szLeaf; + } + + if( bFirst==0 ){ + iOff += fts5GetVarint32(&a[iOff], nByte); + term.n = nByte; + } + iOff += fts5GetVarint32(&a[iOff], nByte); + fts5BufferAppendBlob(&rc, &term, nByte, &a[iOff]); + iOff += nByte; + + sqlite3Fts5BufferAppendPrintf( + &rc, &s, " term=%.*s", term.n, (const char*)term.p + ); + iOff += fts5DecodeDoclist(&rc, &s, &a[iOff], iEnd-iOff); + } + + fts5BufferFree(&term); + } + + decode_out: + sqlite3_free(a); + if( rc==SQLITE_OK ){ + sqlite3_result_text(pCtx, (const char*)s.p, s.n, SQLITE_TRANSIENT); + }else{ + sqlite3_result_error_code(pCtx, rc); + } + fts5BufferFree(&s); +} + +/* +** The implementation of user-defined scalar function fts5_rowid(). +*/ +static void fts5RowidFunction( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args (always 2) */ + sqlite3_value **apVal /* Function arguments */ +){ + const char *zArg; + if( nArg==0 ){ + sqlite3_result_error(pCtx, "should be: fts5_rowid(subject, ....)", -1); + }else{ + zArg = (const char*)sqlite3_value_text(apVal[0]); + if( 0==sqlite3_stricmp(zArg, "segment") ){ + i64 iRowid; + int segid, pgno; + if( nArg!=3 ){ + sqlite3_result_error(pCtx, + "should be: fts5_rowid('segment', segid, pgno))", -1 + ); + }else{ + segid = sqlite3_value_int(apVal[1]); + pgno = sqlite3_value_int(apVal[2]); + iRowid = FTS5_SEGMENT_ROWID(segid, pgno); + sqlite3_result_int64(pCtx, iRowid); + } + }else{ + sqlite3_result_error(pCtx, + "first arg to fts5_rowid() must be 'segment'" , -1 + ); + } + } +} + +/* +** This is called as part of registering the FTS5 module with database +** connection db. It registers several user-defined scalar functions useful +** with FTS5. +** +** If successful, SQLITE_OK is returned. If an error occurs, some other +** SQLite error code is returned instead. +*/ +static int sqlite3Fts5IndexInit(sqlite3 *db){ + int rc = sqlite3_create_function( + db, "fts5_decode", 2, SQLITE_UTF8, 0, fts5DecodeFunction, 0, 0 + ); + + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function( + db, "fts5_decode_none", 2, + SQLITE_UTF8, (void*)db, fts5DecodeFunction, 0, 0 + ); + } + + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function( + db, "fts5_rowid", -1, SQLITE_UTF8, 0, fts5RowidFunction, 0, 0 + ); + } + return rc; +} + + +static int sqlite3Fts5IndexReset(Fts5Index *p){ + assert( p->pStruct==0 || p->iStructVersion!=0 ); + if( fts5IndexDataVersion(p)!=p->iStructVersion ){ + fts5StructureInvalidate(p); + } + return fts5IndexReturn(p); +} + +/* +** 2014 Jun 09 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is an SQLite module implementing full-text search. +*/ + + +/* #include "fts5Int.h" */ + +/* +** This variable is set to false when running tests for which the on disk +** structures should not be corrupt. Otherwise, true. If it is false, extra +** assert() conditions in the fts5 code are activated - conditions that are +** only true if it is guaranteed that the fts5 database is not corrupt. +*/ +SQLITE_API int sqlite3_fts5_may_be_corrupt = 1; + + +typedef struct Fts5Auxdata Fts5Auxdata; +typedef struct Fts5Auxiliary Fts5Auxiliary; +typedef struct Fts5Cursor Fts5Cursor; +typedef struct Fts5Sorter Fts5Sorter; +typedef struct Fts5Table Fts5Table; +typedef struct Fts5TokenizerModule Fts5TokenizerModule; + +/* +** NOTES ON TRANSACTIONS: +** +** SQLite invokes the following virtual table methods as transactions are +** opened and closed by the user: +** +** xBegin(): Start of a new transaction. +** xSync(): Initial part of two-phase commit. +** xCommit(): Final part of two-phase commit. +** xRollback(): Rollback the transaction. +** +** Anything that is required as part of a commit that may fail is performed +** in the xSync() callback. Current versions of SQLite ignore any errors +** returned by xCommit(). +** +** And as sub-transactions are opened/closed: +** +** xSavepoint(int S): Open savepoint S. +** xRelease(int S): Commit and close savepoint S. +** xRollbackTo(int S): Rollback to start of savepoint S. +** +** During a write-transaction the fts5_index.c module may cache some data +** in-memory. It is flushed to disk whenever xSync(), xRelease() or +** xSavepoint() is called. And discarded whenever xRollback() or xRollbackTo() +** is called. +** +** Additionally, if SQLITE_DEBUG is defined, an instance of the following +** structure is used to record the current transaction state. This information +** is not required, but it is used in the assert() statements executed by +** function fts5CheckTransactionState() (see below). +*/ +struct Fts5TransactionState { + int eState; /* 0==closed, 1==open, 2==synced */ + int iSavepoint; /* Number of open savepoints (0 -> none) */ +}; + +/* +** A single object of this type is allocated when the FTS5 module is +** registered with a database handle. It is used to store pointers to +** all registered FTS5 extensions - tokenizers and auxiliary functions. +*/ +struct Fts5Global { + fts5_api api; /* User visible part of object (see fts5.h) */ + sqlite3 *db; /* Associated database connection */ + i64 iNextId; /* Used to allocate unique cursor ids */ + Fts5Auxiliary *pAux; /* First in list of all aux. functions */ + Fts5TokenizerModule *pTok; /* First in list of all tokenizer modules */ + Fts5TokenizerModule *pDfltTok; /* Default tokenizer module */ + Fts5Cursor *pCsr; /* First in list of all open cursors */ +}; + +/* +** Each auxiliary function registered with the FTS5 module is represented +** by an object of the following type. All such objects are stored as part +** of the Fts5Global.pAux list. +*/ +struct Fts5Auxiliary { + Fts5Global *pGlobal; /* Global context for this function */ + char *zFunc; /* Function name (nul-terminated) */ + void *pUserData; /* User-data pointer */ + fts5_extension_function xFunc; /* Callback function */ + void (*xDestroy)(void*); /* Destructor function */ + Fts5Auxiliary *pNext; /* Next registered auxiliary function */ +}; + +/* +** Each tokenizer module registered with the FTS5 module is represented +** by an object of the following type. All such objects are stored as part +** of the Fts5Global.pTok list. +*/ +struct Fts5TokenizerModule { + char *zName; /* Name of tokenizer */ + void *pUserData; /* User pointer passed to xCreate() */ + fts5_tokenizer x; /* Tokenizer functions */ + void (*xDestroy)(void*); /* Destructor function */ + Fts5TokenizerModule *pNext; /* Next registered tokenizer module */ +}; + +/* +** Virtual-table object. +*/ +struct Fts5Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts5Config *pConfig; /* Virtual table configuration */ + Fts5Index *pIndex; /* Full-text index */ + Fts5Storage *pStorage; /* Document store */ + Fts5Global *pGlobal; /* Global (connection wide) data */ + Fts5Cursor *pSortCsr; /* Sort data from this cursor */ +#ifdef SQLITE_DEBUG + struct Fts5TransactionState ts; +#endif +}; + +struct Fts5MatchPhrase { + Fts5Buffer *pPoslist; /* Pointer to current poslist */ + int nTerm; /* Size of phrase in terms */ +}; + +/* +** pStmt: +** SELECT rowid, <fts> FROM <fts> ORDER BY +rank; +** +** aIdx[]: +** There is one entry in the aIdx[] array for each phrase in the query, +** the value of which is the offset within aPoslist[] following the last +** byte of the position list for the corresponding phrase. +*/ +struct Fts5Sorter { + sqlite3_stmt *pStmt; + i64 iRowid; /* Current rowid */ + const u8 *aPoslist; /* Position lists for current row */ + int nIdx; /* Number of entries in aIdx[] */ + int aIdx[1]; /* Offsets into aPoslist for current row */ +}; + + +/* +** Virtual-table cursor object. +** +** iSpecial: +** If this is a 'special' query (refer to function fts5SpecialMatch()), +** then this variable contains the result of the query. +** +** iFirstRowid, iLastRowid: +** These variables are only used for FTS5_PLAN_MATCH cursors. Assuming the +** cursor iterates in ascending order of rowids, iFirstRowid is the lower +** limit of rowids to return, and iLastRowid the upper. In other words, the +** WHERE clause in the user's query might have been: +** +** <tbl> MATCH <expr> AND rowid BETWEEN $iFirstRowid AND $iLastRowid +** +** If the cursor iterates in descending order of rowid, iFirstRowid +** is the upper limit (i.e. the "first" rowid visited) and iLastRowid +** the lower. +*/ +struct Fts5Cursor { + sqlite3_vtab_cursor base; /* Base class used by SQLite core */ + Fts5Cursor *pNext; /* Next cursor in Fts5Cursor.pCsr list */ + int *aColumnSize; /* Values for xColumnSize() */ + i64 iCsrId; /* Cursor id */ + + /* Zero from this point onwards on cursor reset */ + int ePlan; /* FTS5_PLAN_XXX value */ + int bDesc; /* True for "ORDER BY rowid DESC" queries */ + i64 iFirstRowid; /* Return no rowids earlier than this */ + i64 iLastRowid; /* Return no rowids later than this */ + sqlite3_stmt *pStmt; /* Statement used to read %_content */ + Fts5Expr *pExpr; /* Expression for MATCH queries */ + Fts5Sorter *pSorter; /* Sorter for "ORDER BY rank" queries */ + int csrflags; /* Mask of cursor flags (see below) */ + i64 iSpecial; /* Result of special query */ + + /* "rank" function. Populated on demand from vtab.xColumn(). */ + char *zRank; /* Custom rank function */ + char *zRankArgs; /* Custom rank function args */ + Fts5Auxiliary *pRank; /* Rank callback (or NULL) */ + int nRankArg; /* Number of trailing arguments for rank() */ + sqlite3_value **apRankArg; /* Array of trailing arguments */ + sqlite3_stmt *pRankArgStmt; /* Origin of objects in apRankArg[] */ + + /* Auxiliary data storage */ + Fts5Auxiliary *pAux; /* Currently executing extension function */ + Fts5Auxdata *pAuxdata; /* First in linked list of saved aux-data */ + + /* Cache used by auxiliary functions xInst() and xInstCount() */ + Fts5PoslistReader *aInstIter; /* One for each phrase */ + int nInstAlloc; /* Size of aInst[] array (entries / 3) */ + int nInstCount; /* Number of phrase instances */ + int *aInst; /* 3 integers per phrase instance */ +}; + +/* +** Bits that make up the "idxNum" parameter passed indirectly by +** xBestIndex() to xFilter(). +*/ +#define FTS5_BI_MATCH 0x0001 /* <tbl> MATCH ? */ +#define FTS5_BI_RANK 0x0002 /* rank MATCH ? */ +#define FTS5_BI_ROWID_EQ 0x0004 /* rowid == ? */ +#define FTS5_BI_ROWID_LE 0x0008 /* rowid <= ? */ +#define FTS5_BI_ROWID_GE 0x0010 /* rowid >= ? */ + +#define FTS5_BI_ORDER_RANK 0x0020 +#define FTS5_BI_ORDER_ROWID 0x0040 +#define FTS5_BI_ORDER_DESC 0x0080 + +/* +** Values for Fts5Cursor.csrflags +*/ +#define FTS5CSR_EOF 0x01 +#define FTS5CSR_REQUIRE_CONTENT 0x02 +#define FTS5CSR_REQUIRE_DOCSIZE 0x04 +#define FTS5CSR_REQUIRE_INST 0x08 +#define FTS5CSR_FREE_ZRANK 0x10 +#define FTS5CSR_REQUIRE_RESEEK 0x20 +#define FTS5CSR_REQUIRE_POSLIST 0x40 + +#define BitFlagAllTest(x,y) (((x) & (y))==(y)) +#define BitFlagTest(x,y) (((x) & (y))!=0) + + +/* +** Macros to Set(), Clear() and Test() cursor flags. +*/ +#define CsrFlagSet(pCsr, flag) ((pCsr)->csrflags |= (flag)) +#define CsrFlagClear(pCsr, flag) ((pCsr)->csrflags &= ~(flag)) +#define CsrFlagTest(pCsr, flag) ((pCsr)->csrflags & (flag)) + +struct Fts5Auxdata { + Fts5Auxiliary *pAux; /* Extension to which this belongs */ + void *pPtr; /* Pointer value */ + void(*xDelete)(void*); /* Destructor */ + Fts5Auxdata *pNext; /* Next object in linked list */ +}; + +#ifdef SQLITE_DEBUG +#define FTS5_BEGIN 1 +#define FTS5_SYNC 2 +#define FTS5_COMMIT 3 +#define FTS5_ROLLBACK 4 +#define FTS5_SAVEPOINT 5 +#define FTS5_RELEASE 6 +#define FTS5_ROLLBACKTO 7 +static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ + switch( op ){ + case FTS5_BEGIN: + assert( p->ts.eState==0 ); + p->ts.eState = 1; + p->ts.iSavepoint = -1; + break; + + case FTS5_SYNC: + assert( p->ts.eState==1 ); + p->ts.eState = 2; + break; + + case FTS5_COMMIT: + assert( p->ts.eState==2 ); + p->ts.eState = 0; + break; + + case FTS5_ROLLBACK: + assert( p->ts.eState==1 || p->ts.eState==2 || p->ts.eState==0 ); + p->ts.eState = 0; + break; + + case FTS5_SAVEPOINT: + assert( p->ts.eState==1 ); + assert( iSavepoint>=0 ); + assert( iSavepoint>p->ts.iSavepoint ); + p->ts.iSavepoint = iSavepoint; + break; + + case FTS5_RELEASE: + assert( p->ts.eState==1 ); + assert( iSavepoint>=0 ); + assert( iSavepoint<=p->ts.iSavepoint ); + p->ts.iSavepoint = iSavepoint-1; + break; + + case FTS5_ROLLBACKTO: + assert( p->ts.eState==1 ); + assert( iSavepoint>=0 ); + assert( iSavepoint<=p->ts.iSavepoint ); + p->ts.iSavepoint = iSavepoint; + break; + } +} +#else +# define fts5CheckTransactionState(x,y,z) +#endif + +/* +** Return true if pTab is a contentless table. +*/ +static int fts5IsContentless(Fts5Table *pTab){ + return pTab->pConfig->eContent==FTS5_CONTENT_NONE; +} + +/* +** Delete a virtual table handle allocated by fts5InitVtab(). +*/ +static void fts5FreeVtab(Fts5Table *pTab){ + if( pTab ){ + sqlite3Fts5IndexClose(pTab->pIndex); + sqlite3Fts5StorageClose(pTab->pStorage); + sqlite3Fts5ConfigFree(pTab->pConfig); + sqlite3_free(pTab); + } +} + +/* +** The xDisconnect() virtual table method. +*/ +static int fts5DisconnectMethod(sqlite3_vtab *pVtab){ + fts5FreeVtab((Fts5Table*)pVtab); + return SQLITE_OK; +} + +/* +** The xDestroy() virtual table method. +*/ +static int fts5DestroyMethod(sqlite3_vtab *pVtab){ + Fts5Table *pTab = (Fts5Table*)pVtab; + int rc = sqlite3Fts5DropAll(pTab->pConfig); + if( rc==SQLITE_OK ){ + fts5FreeVtab((Fts5Table*)pVtab); + } + return rc; +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the FTS3 virtual table. +** +** The argv[] array contains the following: +** +** argv[0] -> module name ("fts5") +** argv[1] -> database name +** argv[2] -> table name +** argv[...] -> "column name" and other module argument fields. +*/ +static int fts5InitVtab( + int bCreate, /* True for xCreate, false for xConnect */ + sqlite3 *db, /* The SQLite database connection */ + void *pAux, /* Hash table containing tokenizers */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */ + char **pzErr /* Write any error message here */ +){ + Fts5Global *pGlobal = (Fts5Global*)pAux; + const char **azConfig = (const char**)argv; + int rc = SQLITE_OK; /* Return code */ + Fts5Config *pConfig = 0; /* Results of parsing argc/argv */ + Fts5Table *pTab = 0; /* New virtual table object */ + + /* Allocate the new vtab object and parse the configuration */ + pTab = (Fts5Table*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Table)); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5ConfigParse(pGlobal, db, argc, azConfig, &pConfig, pzErr); + assert( (rc==SQLITE_OK && *pzErr==0) || pConfig==0 ); + } + if( rc==SQLITE_OK ){ + pTab->pConfig = pConfig; + pTab->pGlobal = pGlobal; + } + + /* Open the index sub-system */ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->pIndex, pzErr); + } + + /* Open the storage sub-system */ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageOpen( + pConfig, pTab->pIndex, bCreate, &pTab->pStorage, pzErr + ); + } + + /* Call sqlite3_declare_vtab() */ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5ConfigDeclareVtab(pConfig); + } + + /* Load the initial configuration */ + if( rc==SQLITE_OK ){ + assert( pConfig->pzErrmsg==0 ); + pConfig->pzErrmsg = pzErr; + rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); + sqlite3Fts5IndexRollback(pTab->pIndex); + pConfig->pzErrmsg = 0; + } + + if( rc!=SQLITE_OK ){ + fts5FreeVtab(pTab); + pTab = 0; + }else if( bCreate ){ + fts5CheckTransactionState(pTab, FTS5_BEGIN, 0); + } + *ppVTab = (sqlite3_vtab*)pTab; + return rc; +} + +/* +** The xConnect() and xCreate() methods for the virtual table. All the +** work is done in function fts5InitVtab(). +*/ +static int fts5ConnectMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts5InitVtab(0, db, pAux, argc, argv, ppVtab, pzErr); +} +static int fts5CreateMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts5InitVtab(1, db, pAux, argc, argv, ppVtab, pzErr); +} + +/* +** The different query plans. +*/ +#define FTS5_PLAN_MATCH 1 /* (<tbl> MATCH ?) */ +#define FTS5_PLAN_SOURCE 2 /* A source cursor for SORTED_MATCH */ +#define FTS5_PLAN_SPECIAL 3 /* An internal query */ +#define FTS5_PLAN_SORTED_MATCH 4 /* (<tbl> MATCH ? ORDER BY rank) */ +#define FTS5_PLAN_SCAN 5 /* No usable constraint */ +#define FTS5_PLAN_ROWID 6 /* (rowid = ?) */ + +/* +** Set the SQLITE_INDEX_SCAN_UNIQUE flag in pIdxInfo->flags. Unless this +** extension is currently being used by a version of SQLite too old to +** support index-info flags. In that case this function is a no-op. +*/ +static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ +#if SQLITE_VERSION_NUMBER>=3008012 +#ifndef SQLITE_CORE + if( sqlite3_libversion_number()>=3008012 ) +#endif + { + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; + } +#endif +} + +/* +** Implementation of the xBestIndex method for FTS5 tables. Within the +** WHERE constraint, it searches for the following: +** +** 1. A MATCH constraint against the special column. +** 2. A MATCH constraint against the "rank" column. +** 3. An == constraint against the rowid column. +** 4. A < or <= constraint against the rowid column. +** 5. A > or >= constraint against the rowid column. +** +** Within the ORDER BY, either: +** +** 5. ORDER BY rank [ASC|DESC] +** 6. ORDER BY rowid [ASC|DESC] +** +** Costs are assigned as follows: +** +** a) If an unusable MATCH operator is present in the WHERE clause, the +** cost is unconditionally set to 1e50 (a really big number). +** +** a) If a MATCH operator is present, the cost depends on the other +** constraints also present. As follows: +** +** * No other constraints: cost=1000.0 +** * One rowid range constraint: cost=750.0 +** * Both rowid range constraints: cost=500.0 +** * An == rowid constraint: cost=100.0 +** +** b) Otherwise, if there is no MATCH: +** +** * No other constraints: cost=1000000.0 +** * One rowid range constraint: cost=750000.0 +** * Both rowid range constraints: cost=250000.0 +** * An == rowid constraint: cost=10.0 +** +** Costs are not modified by the ORDER BY clause. +*/ +static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ + Fts5Table *pTab = (Fts5Table*)pVTab; + Fts5Config *pConfig = pTab->pConfig; + const int nCol = pConfig->nCol; + int idxFlags = 0; /* Parameter passed through to xFilter() */ + int bHasMatch; + int iNext; + int i; + + struct Constraint { + int op; /* Mask against sqlite3_index_constraint.op */ + int fts5op; /* FTS5 mask for idxFlags */ + int iCol; /* 0==rowid, 1==tbl, 2==rank */ + int omit; /* True to omit this if found */ + int iConsIndex; /* Index in pInfo->aConstraint[] */ + } aConstraint[] = { + {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, + FTS5_BI_MATCH, 1, 1, -1}, + {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, + FTS5_BI_RANK, 2, 1, -1}, + {SQLITE_INDEX_CONSTRAINT_EQ, FTS5_BI_ROWID_EQ, 0, 0, -1}, + {SQLITE_INDEX_CONSTRAINT_LT|SQLITE_INDEX_CONSTRAINT_LE, + FTS5_BI_ROWID_LE, 0, 0, -1}, + {SQLITE_INDEX_CONSTRAINT_GT|SQLITE_INDEX_CONSTRAINT_GE, + FTS5_BI_ROWID_GE, 0, 0, -1}, + }; + + int aColMap[3]; + aColMap[0] = -1; + aColMap[1] = nCol; + aColMap[2] = nCol+1; + + assert( SQLITE_INDEX_CONSTRAINT_EQ<SQLITE_INDEX_CONSTRAINT_MATCH ); + assert( SQLITE_INDEX_CONSTRAINT_GT<SQLITE_INDEX_CONSTRAINT_MATCH ); + assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH ); + assert( SQLITE_INDEX_CONSTRAINT_GE<SQLITE_INDEX_CONSTRAINT_MATCH ); + assert( SQLITE_INDEX_CONSTRAINT_LE<SQLITE_INDEX_CONSTRAINT_MATCH ); + + /* Set idxFlags flags for all WHERE clause terms that will be used. */ + for(i=0; i<pInfo->nConstraint; i++){ + struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; + int iCol = p->iColumn; + + if( (p->op==SQLITE_INDEX_CONSTRAINT_MATCH && iCol>=0 && iCol<=nCol) + || (p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol==nCol) + ){ + /* A MATCH operator or equivalent */ + if( p->usable ){ + idxFlags = (idxFlags & 0xFFFF) | FTS5_BI_MATCH | (iCol << 16); + aConstraint[0].iConsIndex = i; + }else{ + /* As there exists an unusable MATCH constraint this is an + ** unusable plan. Set a prohibitively high cost. */ + pInfo->estimatedCost = 1e50; + return SQLITE_OK; + } + }else if( p->op<=SQLITE_INDEX_CONSTRAINT_MATCH ){ + int j; + for(j=1; j<ArraySize(aConstraint); j++){ + struct Constraint *pC = &aConstraint[j]; + if( iCol==aColMap[pC->iCol] && (p->op & pC->op) && p->usable ){ + pC->iConsIndex = i; + idxFlags |= pC->fts5op; + } + } + } + } + + /* Set idxFlags flags for the ORDER BY clause */ + if( pInfo->nOrderBy==1 ){ + int iSort = pInfo->aOrderBy[0].iColumn; + if( iSort==(pConfig->nCol+1) && BitFlagTest(idxFlags, FTS5_BI_MATCH) ){ + idxFlags |= FTS5_BI_ORDER_RANK; + }else if( iSort==-1 ){ + idxFlags |= FTS5_BI_ORDER_ROWID; + } + if( BitFlagTest(idxFlags, FTS5_BI_ORDER_RANK|FTS5_BI_ORDER_ROWID) ){ + pInfo->orderByConsumed = 1; + if( pInfo->aOrderBy[0].desc ){ + idxFlags |= FTS5_BI_ORDER_DESC; + } + } + } + + /* Calculate the estimated cost based on the flags set in idxFlags. */ + bHasMatch = BitFlagTest(idxFlags, FTS5_BI_MATCH); + if( BitFlagTest(idxFlags, FTS5_BI_ROWID_EQ) ){ + pInfo->estimatedCost = bHasMatch ? 100.0 : 10.0; + if( bHasMatch==0 ) fts5SetUniqueFlag(pInfo); + }else if( BitFlagAllTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ + pInfo->estimatedCost = bHasMatch ? 500.0 : 250000.0; + }else if( BitFlagTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ + pInfo->estimatedCost = bHasMatch ? 750.0 : 750000.0; + }else{ + pInfo->estimatedCost = bHasMatch ? 1000.0 : 1000000.0; + } + + /* Assign argvIndex values to each constraint in use. */ + iNext = 1; + for(i=0; i<ArraySize(aConstraint); i++){ + struct Constraint *pC = &aConstraint[i]; + if( pC->iConsIndex>=0 ){ + pInfo->aConstraintUsage[pC->iConsIndex].argvIndex = iNext++; + pInfo->aConstraintUsage[pC->iConsIndex].omit = (unsigned char)pC->omit; + } + } + + pInfo->idxNum = idxFlags; + return SQLITE_OK; +} + +static int fts5NewTransaction(Fts5Table *pTab){ + Fts5Cursor *pCsr; + for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ + if( pCsr->base.pVtab==(sqlite3_vtab*)pTab ) return SQLITE_OK; + } + return sqlite3Fts5StorageReset(pTab->pStorage); +} + +/* +** Implementation of xOpen method. +*/ +static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ + Fts5Table *pTab = (Fts5Table*)pVTab; + Fts5Config *pConfig = pTab->pConfig; + Fts5Cursor *pCsr = 0; /* New cursor object */ + int nByte; /* Bytes of space to allocate */ + int rc; /* Return code */ + + rc = fts5NewTransaction(pTab); + if( rc==SQLITE_OK ){ + nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); + pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); + if( pCsr ){ + Fts5Global *pGlobal = pTab->pGlobal; + memset(pCsr, 0, nByte); + pCsr->aColumnSize = (int*)&pCsr[1]; + pCsr->pNext = pGlobal->pCsr; + pGlobal->pCsr = pCsr; + pCsr->iCsrId = ++pGlobal->iNextId; + }else{ + rc = SQLITE_NOMEM; + } + } + *ppCsr = (sqlite3_vtab_cursor*)pCsr; + return rc; +} + +static int fts5StmtType(Fts5Cursor *pCsr){ + if( pCsr->ePlan==FTS5_PLAN_SCAN ){ + return (pCsr->bDesc) ? FTS5_STMT_SCAN_DESC : FTS5_STMT_SCAN_ASC; + } + return FTS5_STMT_LOOKUP; +} + +/* +** This function is called after the cursor passed as the only argument +** is moved to point at a different row. It clears all cached data +** specific to the previous row stored by the cursor object. +*/ +static void fts5CsrNewrow(Fts5Cursor *pCsr){ + CsrFlagSet(pCsr, + FTS5CSR_REQUIRE_CONTENT + | FTS5CSR_REQUIRE_DOCSIZE + | FTS5CSR_REQUIRE_INST + | FTS5CSR_REQUIRE_POSLIST + ); +} + +static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5Auxdata *pData; + Fts5Auxdata *pNext; + + sqlite3_free(pCsr->aInstIter); + sqlite3_free(pCsr->aInst); + if( pCsr->pStmt ){ + int eStmt = fts5StmtType(pCsr); + sqlite3Fts5StorageStmtRelease(pTab->pStorage, eStmt, pCsr->pStmt); + } + if( pCsr->pSorter ){ + Fts5Sorter *pSorter = pCsr->pSorter; + sqlite3_finalize(pSorter->pStmt); + sqlite3_free(pSorter); + } + + if( pCsr->ePlan!=FTS5_PLAN_SOURCE ){ + sqlite3Fts5ExprFree(pCsr->pExpr); + } + + for(pData=pCsr->pAuxdata; pData; pData=pNext){ + pNext = pData->pNext; + if( pData->xDelete ) pData->xDelete(pData->pPtr); + sqlite3_free(pData); + } + + sqlite3_finalize(pCsr->pRankArgStmt); + sqlite3_free(pCsr->apRankArg); + + if( CsrFlagTest(pCsr, FTS5CSR_FREE_ZRANK) ){ + sqlite3_free(pCsr->zRank); + sqlite3_free(pCsr->zRankArgs); + } + + memset(&pCsr->ePlan, 0, sizeof(Fts5Cursor) - ((u8*)&pCsr->ePlan - (u8*)pCsr)); +} + + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fts5CloseMethod(sqlite3_vtab_cursor *pCursor){ + if( pCursor ){ + Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; + Fts5Cursor **pp; + + fts5FreeCursorComponents(pCsr); + /* Remove the cursor from the Fts5Global.pCsr list */ + for(pp=&pTab->pGlobal->pCsr; (*pp)!=pCsr; pp=&(*pp)->pNext); + *pp = pCsr->pNext; + + sqlite3_free(pCsr); + } + return SQLITE_OK; +} + +static int fts5SorterNext(Fts5Cursor *pCsr){ + Fts5Sorter *pSorter = pCsr->pSorter; + int rc; + + rc = sqlite3_step(pSorter->pStmt); + if( rc==SQLITE_DONE ){ + rc = SQLITE_OK; + CsrFlagSet(pCsr, FTS5CSR_EOF); + }else if( rc==SQLITE_ROW ){ + const u8 *a; + const u8 *aBlob; + int nBlob; + int i; + int iOff = 0; + rc = SQLITE_OK; + + pSorter->iRowid = sqlite3_column_int64(pSorter->pStmt, 0); + nBlob = sqlite3_column_bytes(pSorter->pStmt, 1); + aBlob = a = sqlite3_column_blob(pSorter->pStmt, 1); + + /* nBlob==0 in detail=none mode. */ + if( nBlob>0 ){ + for(i=0; i<(pSorter->nIdx-1); i++){ + int iVal; + a += fts5GetVarint32(a, iVal); + iOff += iVal; + pSorter->aIdx[i] = iOff; + } + pSorter->aIdx[i] = &aBlob[nBlob] - a; + pSorter->aPoslist = a; + } + + fts5CsrNewrow(pCsr); + } + + return rc; +} + + +/* +** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors +** open on table pTab. +*/ +static void fts5TripCursors(Fts5Table *pTab){ + Fts5Cursor *pCsr; + for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ + if( pCsr->ePlan==FTS5_PLAN_MATCH + && pCsr->base.pVtab==(sqlite3_vtab*)pTab + ){ + CsrFlagSet(pCsr, FTS5CSR_REQUIRE_RESEEK); + } + } +} + +/* +** If the REQUIRE_RESEEK flag is set on the cursor passed as the first +** argument, close and reopen all Fts5IndexIter iterators that the cursor +** is using. Then attempt to move the cursor to a rowid equal to or laster +** (in the cursors sort order - ASC or DESC) than the current rowid. +** +** If the new rowid is not equal to the old, set output parameter *pbSkip +** to 1 before returning. Otherwise, leave it unchanged. +** +** Return SQLITE_OK if successful or if no reseek was required, or an +** error code if an error occurred. +*/ +static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ + int rc = SQLITE_OK; + assert( *pbSkip==0 ); + if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_RESEEK) ){ + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + int bDesc = pCsr->bDesc; + i64 iRowid = sqlite3Fts5ExprRowid(pCsr->pExpr); + + rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->pIndex, iRowid, bDesc); + if( rc==SQLITE_OK && iRowid!=sqlite3Fts5ExprRowid(pCsr->pExpr) ){ + *pbSkip = 1; + } + + CsrFlagClear(pCsr, FTS5CSR_REQUIRE_RESEEK); + fts5CsrNewrow(pCsr); + if( sqlite3Fts5ExprEof(pCsr->pExpr) ){ + CsrFlagSet(pCsr, FTS5CSR_EOF); + *pbSkip = 1; + } + } + return rc; +} + + +/* +** Advance the cursor to the next row in the table that matches the +** search criteria. +** +** Return SQLITE_OK if nothing goes wrong. SQLITE_OK is returned +** even if we reach end-of-file. The fts5EofMethod() will be called +** subsequently to determine whether or not an EOF was hit. +*/ +static int fts5NextMethod(sqlite3_vtab_cursor *pCursor){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; + int rc; + + assert( (pCsr->ePlan<3)== + (pCsr->ePlan==FTS5_PLAN_MATCH || pCsr->ePlan==FTS5_PLAN_SOURCE) + ); + assert( !CsrFlagTest(pCsr, FTS5CSR_EOF) ); + + if( pCsr->ePlan<3 ){ + int bSkip = 0; + if( (rc = fts5CursorReseek(pCsr, &bSkip)) || bSkip ) return rc; + rc = sqlite3Fts5ExprNext(pCsr->pExpr, pCsr->iLastRowid); + CsrFlagSet(pCsr, sqlite3Fts5ExprEof(pCsr->pExpr)); + fts5CsrNewrow(pCsr); + }else{ + switch( pCsr->ePlan ){ + case FTS5_PLAN_SPECIAL: { + CsrFlagSet(pCsr, FTS5CSR_EOF); + rc = SQLITE_OK; + break; + } + + case FTS5_PLAN_SORTED_MATCH: { + rc = fts5SorterNext(pCsr); + break; + } + + default: + rc = sqlite3_step(pCsr->pStmt); + if( rc!=SQLITE_ROW ){ + CsrFlagSet(pCsr, FTS5CSR_EOF); + rc = sqlite3_reset(pCsr->pStmt); + }else{ + rc = SQLITE_OK; + } + break; + } + } + + return rc; +} + + +static int fts5PrepareStatement( + sqlite3_stmt **ppStmt, + Fts5Config *pConfig, + const char *zFmt, + ... +){ + sqlite3_stmt *pRet = 0; + int rc; + char *zSql; + va_list ap; + + va_start(ap, zFmt); + zSql = sqlite3_vmprintf(zFmt, ap); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, + SQLITE_PREPARE_PERSISTENT, &pRet, 0); + if( rc!=SQLITE_OK ){ + *pConfig->pzErrmsg = sqlite3_mprintf("%s", sqlite3_errmsg(pConfig->db)); + } + sqlite3_free(zSql); + } + + va_end(ap); + *ppStmt = pRet; + return rc; +} + +static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ + Fts5Config *pConfig = pTab->pConfig; + Fts5Sorter *pSorter; + int nPhrase; + int nByte; + int rc; + const char *zRank = pCsr->zRank; + const char *zRankArgs = pCsr->zRankArgs; + + nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); + nByte = sizeof(Fts5Sorter) + sizeof(int) * (nPhrase-1); + pSorter = (Fts5Sorter*)sqlite3_malloc(nByte); + if( pSorter==0 ) return SQLITE_NOMEM; + memset(pSorter, 0, nByte); + pSorter->nIdx = nPhrase; + + /* TODO: It would be better to have some system for reusing statement + ** handles here, rather than preparing a new one for each query. But that + ** is not possible as SQLite reference counts the virtual table objects. + ** And since the statement required here reads from this very virtual + ** table, saving it creates a circular reference. + ** + ** If SQLite a built-in statement cache, this wouldn't be a problem. */ + rc = fts5PrepareStatement(&pSorter->pStmt, pConfig, + "SELECT rowid, rank FROM %Q.%Q ORDER BY %s(%s%s%s) %s", + pConfig->zDb, pConfig->zName, zRank, pConfig->zName, + (zRankArgs ? ", " : ""), + (zRankArgs ? zRankArgs : ""), + bDesc ? "DESC" : "ASC" + ); + + pCsr->pSorter = pSorter; + if( rc==SQLITE_OK ){ + assert( pTab->pSortCsr==0 ); + pTab->pSortCsr = pCsr; + rc = fts5SorterNext(pCsr); + pTab->pSortCsr = 0; + } + + if( rc!=SQLITE_OK ){ + sqlite3_finalize(pSorter->pStmt); + sqlite3_free(pSorter); + pCsr->pSorter = 0; + } + + return rc; +} + +static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ + int rc; + Fts5Expr *pExpr = pCsr->pExpr; + rc = sqlite3Fts5ExprFirst(pExpr, pTab->pIndex, pCsr->iFirstRowid, bDesc); + if( sqlite3Fts5ExprEof(pExpr) ){ + CsrFlagSet(pCsr, FTS5CSR_EOF); + } + fts5CsrNewrow(pCsr); + return rc; +} + +/* +** Process a "special" query. A special query is identified as one with a +** MATCH expression that begins with a '*' character. The remainder of +** the text passed to the MATCH operator are used as the special query +** parameters. +*/ +static int fts5SpecialMatch( + Fts5Table *pTab, + Fts5Cursor *pCsr, + const char *zQuery +){ + int rc = SQLITE_OK; /* Return code */ + const char *z = zQuery; /* Special query text */ + int n; /* Number of bytes in text at z */ + + while( z[0]==' ' ) z++; + for(n=0; z[n] && z[n]!=' '; n++); + + assert( pTab->base.zErrMsg==0 ); + pCsr->ePlan = FTS5_PLAN_SPECIAL; + + if( 0==sqlite3_strnicmp("reads", z, n) ){ + pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->pIndex); + } + else if( 0==sqlite3_strnicmp("id", z, n) ){ + pCsr->iSpecial = pCsr->iCsrId; + } + else{ + /* An unrecognized directive. Return an error message. */ + pTab->base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); + rc = SQLITE_ERROR; + } + + return rc; +} + +/* +** Search for an auxiliary function named zName that can be used with table +** pTab. If one is found, return a pointer to the corresponding Fts5Auxiliary +** structure. Otherwise, if no such function exists, return NULL. +*/ +static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ + Fts5Auxiliary *pAux; + + for(pAux=pTab->pGlobal->pAux; pAux; pAux=pAux->pNext){ + if( sqlite3_stricmp(zName, pAux->zFunc)==0 ) return pAux; + } + + /* No function of the specified name was found. Return 0. */ + return 0; +} + + +static int fts5FindRankFunction(Fts5Cursor *pCsr){ + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->pConfig; + int rc = SQLITE_OK; + Fts5Auxiliary *pAux = 0; + const char *zRank = pCsr->zRank; + const char *zRankArgs = pCsr->zRankArgs; + + if( zRankArgs ){ + char *zSql = sqlite3Fts5Mprintf(&rc, "SELECT %s", zRankArgs); + if( zSql ){ + sqlite3_stmt *pStmt = 0; + rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, + SQLITE_PREPARE_PERSISTENT, &pStmt, 0); + sqlite3_free(zSql); + assert( rc==SQLITE_OK || pCsr->pRankArgStmt==0 ); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pStmt) ){ + int nByte; + pCsr->nRankArg = sqlite3_column_count(pStmt); + nByte = sizeof(sqlite3_value*)*pCsr->nRankArg; + pCsr->apRankArg = (sqlite3_value**)sqlite3Fts5MallocZero(&rc, nByte); + if( rc==SQLITE_OK ){ + int i; + for(i=0; i<pCsr->nRankArg; i++){ + pCsr->apRankArg[i] = sqlite3_column_value(pStmt, i); + } + } + pCsr->pRankArgStmt = pStmt; + }else{ + rc = sqlite3_finalize(pStmt); + assert( rc!=SQLITE_OK ); + } + } + } + } + + if( rc==SQLITE_OK ){ + pAux = fts5FindAuxiliary(pTab, zRank); + if( pAux==0 ){ + assert( pTab->base.zErrMsg==0 ); + pTab->base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); + rc = SQLITE_ERROR; + } + } + + pCsr->pRank = pAux; + return rc; +} + + +static int fts5CursorParseRank( + Fts5Config *pConfig, + Fts5Cursor *pCsr, + sqlite3_value *pRank +){ + int rc = SQLITE_OK; + if( pRank ){ + const char *z = (const char*)sqlite3_value_text(pRank); + char *zRank = 0; + char *zRankArgs = 0; + + if( z==0 ){ + if( sqlite3_value_type(pRank)==SQLITE_NULL ) rc = SQLITE_ERROR; + }else{ + rc = sqlite3Fts5ConfigParseRank(z, &zRank, &zRankArgs); + } + if( rc==SQLITE_OK ){ + pCsr->zRank = zRank; + pCsr->zRankArgs = zRankArgs; + CsrFlagSet(pCsr, FTS5CSR_FREE_ZRANK); + }else if( rc==SQLITE_ERROR ){ + pCsr->base.pVtab->zErrMsg = sqlite3_mprintf( + "parse error in rank function: %s", z + ); + } + }else{ + if( pConfig->zRank ){ + pCsr->zRank = (char*)pConfig->zRank; + pCsr->zRankArgs = (char*)pConfig->zRankArgs; + }else{ + pCsr->zRank = (char*)FTS5_DEFAULT_RANK; + pCsr->zRankArgs = 0; + } + } + return rc; +} + +static i64 fts5GetRowidLimit(sqlite3_value *pVal, i64 iDefault){ + if( pVal ){ + int eType = sqlite3_value_numeric_type(pVal); + if( eType==SQLITE_INTEGER ){ + return sqlite3_value_int64(pVal); + } + } + return iDefault; +} + +/* +** This is the xFilter interface for the virtual table. See +** the virtual table xFilter method documentation for additional +** information. +** +** There are three possible query strategies: +** +** 1. Full-text search using a MATCH operator. +** 2. A by-rowid lookup. +** 3. A full-table scan. +*/ +static int fts5FilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *zUnused, /* Unused */ + int nVal, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->pConfig; + Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; + int rc = SQLITE_OK; /* Error code */ + int iVal = 0; /* Counter for apVal[] */ + int bDesc; /* True if ORDER BY [rank|rowid] DESC */ + int bOrderByRank; /* True if ORDER BY rank */ + sqlite3_value *pMatch = 0; /* <tbl> MATCH ? expression (or NULL) */ + sqlite3_value *pRank = 0; /* rank MATCH ? expression (or NULL) */ + sqlite3_value *pRowidEq = 0; /* rowid = ? expression (or NULL) */ + sqlite3_value *pRowidLe = 0; /* rowid <= ? expression (or NULL) */ + sqlite3_value *pRowidGe = 0; /* rowid >= ? expression (or NULL) */ + int iCol; /* Column on LHS of MATCH operator */ + char **pzErrmsg = pConfig->pzErrmsg; + + UNUSED_PARAM(zUnused); + UNUSED_PARAM(nVal); + + if( pCsr->ePlan ){ + fts5FreeCursorComponents(pCsr); + memset(&pCsr->ePlan, 0, sizeof(Fts5Cursor) - ((u8*)&pCsr->ePlan-(u8*)pCsr)); + } + + assert( pCsr->pStmt==0 ); + assert( pCsr->pExpr==0 ); + assert( pCsr->csrflags==0 ); + assert( pCsr->pRank==0 ); + assert( pCsr->zRank==0 ); + assert( pCsr->zRankArgs==0 ); + + assert( pzErrmsg==0 || pzErrmsg==&pTab->base.zErrMsg ); + pConfig->pzErrmsg = &pTab->base.zErrMsg; + + /* Decode the arguments passed through to this function. + ** + ** Note: The following set of if(...) statements must be in the same + ** order as the corresponding entries in the struct at the top of + ** fts5BestIndexMethod(). */ + if( BitFlagTest(idxNum, FTS5_BI_MATCH) ) pMatch = apVal[iVal++]; + if( BitFlagTest(idxNum, FTS5_BI_RANK) ) pRank = apVal[iVal++]; + if( BitFlagTest(idxNum, FTS5_BI_ROWID_EQ) ) pRowidEq = apVal[iVal++]; + if( BitFlagTest(idxNum, FTS5_BI_ROWID_LE) ) pRowidLe = apVal[iVal++]; + if( BitFlagTest(idxNum, FTS5_BI_ROWID_GE) ) pRowidGe = apVal[iVal++]; + iCol = (idxNum>>16); + assert( iCol>=0 && iCol<=pConfig->nCol ); + assert( iVal==nVal ); + bOrderByRank = ((idxNum & FTS5_BI_ORDER_RANK) ? 1 : 0); + pCsr->bDesc = bDesc = ((idxNum & FTS5_BI_ORDER_DESC) ? 1 : 0); + + /* Set the cursor upper and lower rowid limits. Only some strategies + ** actually use them. This is ok, as the xBestIndex() method leaves the + ** sqlite3_index_constraint.omit flag clear for range constraints + ** on the rowid field. */ + if( pRowidEq ){ + pRowidLe = pRowidGe = pRowidEq; + } + if( bDesc ){ + pCsr->iFirstRowid = fts5GetRowidLimit(pRowidLe, LARGEST_INT64); + pCsr->iLastRowid = fts5GetRowidLimit(pRowidGe, SMALLEST_INT64); + }else{ + pCsr->iLastRowid = fts5GetRowidLimit(pRowidLe, LARGEST_INT64); + pCsr->iFirstRowid = fts5GetRowidLimit(pRowidGe, SMALLEST_INT64); + } + + if( pTab->pSortCsr ){ + /* If pSortCsr is non-NULL, then this call is being made as part of + ** processing for a "... MATCH <expr> ORDER BY rank" query (ePlan is + ** set to FTS5_PLAN_SORTED_MATCH). pSortCsr is the cursor that will + ** return results to the user for this query. The current cursor + ** (pCursor) is used to execute the query issued by function + ** fts5CursorFirstSorted() above. */ + assert( pRowidEq==0 && pRowidLe==0 && pRowidGe==0 && pRank==0 ); + assert( nVal==0 && pMatch==0 && bOrderByRank==0 && bDesc==0 ); + assert( pCsr->iLastRowid==LARGEST_INT64 ); + assert( pCsr->iFirstRowid==SMALLEST_INT64 ); + pCsr->ePlan = FTS5_PLAN_SOURCE; + pCsr->pExpr = pTab->pSortCsr->pExpr; + rc = fts5CursorFirst(pTab, pCsr, bDesc); + }else if( pMatch ){ + const char *zExpr = (const char*)sqlite3_value_text(apVal[0]); + if( zExpr==0 ) zExpr = ""; + + rc = fts5CursorParseRank(pConfig, pCsr, pRank); + if( rc==SQLITE_OK ){ + if( zExpr[0]=='*' ){ + /* The user has issued a query of the form "MATCH '*...'". This + ** indicates that the MATCH expression is not a full text query, + ** but a request for an internal parameter. */ + rc = fts5SpecialMatch(pTab, pCsr, &zExpr[1]); + }else{ + char **pzErr = &pTab->base.zErrMsg; + rc = sqlite3Fts5ExprNew(pConfig, iCol, zExpr, &pCsr->pExpr, pzErr); + if( rc==SQLITE_OK ){ + if( bOrderByRank ){ + pCsr->ePlan = FTS5_PLAN_SORTED_MATCH; + rc = fts5CursorFirstSorted(pTab, pCsr, bDesc); + }else{ + pCsr->ePlan = FTS5_PLAN_MATCH; + rc = fts5CursorFirst(pTab, pCsr, bDesc); + } + } + } + } + }else if( pConfig->zContent==0 ){ + *pConfig->pzErrmsg = sqlite3_mprintf( + "%s: table does not support scanning", pConfig->zName + ); + rc = SQLITE_ERROR; + }else{ + /* This is either a full-table scan (ePlan==FTS5_PLAN_SCAN) or a lookup + ** by rowid (ePlan==FTS5_PLAN_ROWID). */ + pCsr->ePlan = (pRowidEq ? FTS5_PLAN_ROWID : FTS5_PLAN_SCAN); + rc = sqlite3Fts5StorageStmt( + pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->base.zErrMsg + ); + if( rc==SQLITE_OK ){ + if( pCsr->ePlan==FTS5_PLAN_ROWID ){ + sqlite3_bind_value(pCsr->pStmt, 1, apVal[0]); + }else{ + sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iFirstRowid); + sqlite3_bind_int64(pCsr->pStmt, 2, pCsr->iLastRowid); + } + rc = fts5NextMethod(pCursor); + } + } + + pConfig->pzErrmsg = pzErrmsg; + return rc; +} + +/* +** This is the xEof method of the virtual table. SQLite calls this +** routine to find out if it has reached the end of a result set. +*/ +static int fts5EofMethod(sqlite3_vtab_cursor *pCursor){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; + return (CsrFlagTest(pCsr, FTS5CSR_EOF) ? 1 : 0); +} + +/* +** Return the rowid that the cursor currently points to. +*/ +static i64 fts5CursorRowid(Fts5Cursor *pCsr){ + assert( pCsr->ePlan==FTS5_PLAN_MATCH + || pCsr->ePlan==FTS5_PLAN_SORTED_MATCH + || pCsr->ePlan==FTS5_PLAN_SOURCE + ); + if( pCsr->pSorter ){ + return pCsr->pSorter->iRowid; + }else{ + return sqlite3Fts5ExprRowid(pCsr->pExpr); + } +} + +/* +** This is the xRowid method. The SQLite core calls this routine to +** retrieve the rowid for the current row of the result set. fts5 +** exposes %_content.rowid as the rowid for the virtual table. The +** rowid should be written to *pRowid. +*/ +static int fts5RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; + int ePlan = pCsr->ePlan; + + assert( CsrFlagTest(pCsr, FTS5CSR_EOF)==0 ); + switch( ePlan ){ + case FTS5_PLAN_SPECIAL: + *pRowid = 0; + break; + + case FTS5_PLAN_SOURCE: + case FTS5_PLAN_MATCH: + case FTS5_PLAN_SORTED_MATCH: + *pRowid = fts5CursorRowid(pCsr); + break; + + default: + *pRowid = sqlite3_column_int64(pCsr->pStmt, 0); + break; + } + + return SQLITE_OK; +} + +/* +** If the cursor requires seeking (bSeekRequired flag is set), seek it. +** Return SQLITE_OK if no error occurs, or an SQLite error code otherwise. +** +** If argument bErrormsg is true and an error occurs, an error message may +** be left in sqlite3_vtab.zErrMsg. +*/ +static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ + int rc = SQLITE_OK; + + /* If the cursor does not yet have a statement handle, obtain one now. */ + if( pCsr->pStmt==0 ){ + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + int eStmt = fts5StmtType(pCsr); + rc = sqlite3Fts5StorageStmt( + pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->base.zErrMsg:0) + ); + assert( rc!=SQLITE_OK || pTab->base.zErrMsg==0 ); + assert( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ); + } + + if( rc==SQLITE_OK && CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ){ + assert( pCsr->pExpr ); + sqlite3_reset(pCsr->pStmt); + sqlite3_bind_int64(pCsr->pStmt, 1, fts5CursorRowid(pCsr)); + rc = sqlite3_step(pCsr->pStmt); + if( rc==SQLITE_ROW ){ + rc = SQLITE_OK; + CsrFlagClear(pCsr, FTS5CSR_REQUIRE_CONTENT); + }else{ + rc = sqlite3_reset(pCsr->pStmt); + if( rc==SQLITE_OK ){ + rc = FTS5_CORRUPT; + } + } + } + return rc; +} + +static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ + va_list ap; /* ... printf arguments */ + va_start(ap, zFormat); + assert( p->base.zErrMsg==0 ); + p->base.zErrMsg = sqlite3_vmprintf(zFormat, ap); + va_end(ap); +} + +/* +** This function is called to handle an FTS INSERT command. In other words, +** an INSERT statement of the form: +** +** INSERT INTO fts(fts) VALUES($pCmd) +** INSERT INTO fts(fts, rank) VALUES($pCmd, $pVal) +** +** Argument pVal is the value assigned to column "fts" by the INSERT +** statement. This function returns SQLITE_OK if successful, or an SQLite +** error code if an error occurs. +** +** The commands implemented by this function are documented in the "Special +** INSERT Directives" section of the documentation. It should be updated if +** more commands are added to this function. +*/ +static int fts5SpecialInsert( + Fts5Table *pTab, /* Fts5 table object */ + const char *zCmd, /* Text inserted into table-name column */ + sqlite3_value *pVal /* Value inserted into rank column */ +){ + Fts5Config *pConfig = pTab->pConfig; + int rc = SQLITE_OK; + int bError = 0; + + if( 0==sqlite3_stricmp("delete-all", zCmd) ){ + if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + fts5SetVtabError(pTab, + "'delete-all' may only be used with a " + "contentless or external content fts5 table" + ); + rc = SQLITE_ERROR; + }else{ + rc = sqlite3Fts5StorageDeleteAll(pTab->pStorage); + } + }else if( 0==sqlite3_stricmp("rebuild", zCmd) ){ + if( pConfig->eContent==FTS5_CONTENT_NONE ){ + fts5SetVtabError(pTab, + "'rebuild' may not be used with a contentless fts5 table" + ); + rc = SQLITE_ERROR; + }else{ + rc = sqlite3Fts5StorageRebuild(pTab->pStorage); + } + }else if( 0==sqlite3_stricmp("optimize", zCmd) ){ + rc = sqlite3Fts5StorageOptimize(pTab->pStorage); + }else if( 0==sqlite3_stricmp("merge", zCmd) ){ + int nMerge = sqlite3_value_int(pVal); + rc = sqlite3Fts5StorageMerge(pTab->pStorage, nMerge); + }else if( 0==sqlite3_stricmp("integrity-check", zCmd) ){ + rc = sqlite3Fts5StorageIntegrity(pTab->pStorage); +#ifdef SQLITE_DEBUG + }else if( 0==sqlite3_stricmp("prefix-index", zCmd) ){ + pConfig->bPrefixIndex = sqlite3_value_int(pVal); +#endif + }else{ + rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, zCmd, pVal, &bError); + } + if( rc==SQLITE_OK ){ + if( bError ){ + rc = SQLITE_ERROR; + }else{ + rc = sqlite3Fts5StorageConfigValue(pTab->pStorage, zCmd, pVal, 0); + } + } + } + return rc; +} + +static int fts5SpecialDelete( + Fts5Table *pTab, + sqlite3_value **apVal +){ + int rc = SQLITE_OK; + int eType1 = sqlite3_value_type(apVal[1]); + if( eType1==SQLITE_INTEGER ){ + sqlite3_int64 iDel = sqlite3_value_int64(apVal[1]); + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, &apVal[2]); + } + return rc; +} + +static void fts5StorageInsert( + int *pRc, + Fts5Table *pTab, + sqlite3_value **apVal, + i64 *piRowid +){ + int rc = *pRc; + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, piRowid); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *piRowid); + } + *pRc = rc; +} + +/* +** This function is the implementation of the xUpdate callback used by +** FTS3 virtual tables. It is invoked by SQLite each time a row is to be +** inserted, updated or deleted. +** +** A delete specifies a single argument - the rowid of the row to remove. +** +** Update and insert operations pass: +** +** 1. The "old" rowid, or NULL. +** 2. The "new" rowid. +** 3. Values for each of the nCol matchable columns. +** 4. Values for the two hidden columns (<tablename> and "rank"). +*/ +static int fts5UpdateMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nArg, /* Size of argument array */ + sqlite3_value **apVal, /* Array of arguments */ + sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ +){ + Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5Config *pConfig = pTab->pConfig; + int eType0; /* value_type() of apVal[0] */ + int rc = SQLITE_OK; /* Return code */ + + /* A transaction must be open when this is called. */ + assert( pTab->ts.eState==1 ); + + assert( pVtab->zErrMsg==0 ); + assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); + assert( nArg==1 + || sqlite3_value_type(apVal[1])==SQLITE_INTEGER + || sqlite3_value_type(apVal[1])==SQLITE_NULL + ); + assert( pTab->pConfig->pzErrmsg==0 ); + pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + + /* Put any active cursors into REQUIRE_SEEK state. */ + fts5TripCursors(pTab); + + eType0 = sqlite3_value_type(apVal[0]); + if( eType0==SQLITE_NULL + && sqlite3_value_type(apVal[2+pConfig->nCol])!=SQLITE_NULL + ){ + /* A "special" INSERT op. These are handled separately. */ + const char *z = (const char*)sqlite3_value_text(apVal[2+pConfig->nCol]); + if( pConfig->eContent!=FTS5_CONTENT_NORMAL + && 0==sqlite3_stricmp("delete", z) + ){ + rc = fts5SpecialDelete(pTab, apVal); + }else{ + rc = fts5SpecialInsert(pTab, z, apVal[2 + pConfig->nCol + 1]); + } + }else{ + /* A regular INSERT, UPDATE or DELETE statement. The trick here is that + ** any conflict on the rowid value must be detected before any + ** modifications are made to the database file. There are 4 cases: + ** + ** 1) DELETE + ** 2) UPDATE (rowid not modified) + ** 3) UPDATE (rowid modified) + ** 4) INSERT + ** + ** Cases 3 and 4 may violate the rowid constraint. + */ + int eConflict = SQLITE_ABORT; + if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + eConflict = sqlite3_vtab_on_conflict(pConfig->db); + } + + assert( eType0==SQLITE_INTEGER || eType0==SQLITE_NULL ); + assert( nArg!=1 || eType0==SQLITE_INTEGER ); + + /* Filter out attempts to run UPDATE or DELETE on contentless tables. + ** This is not suported. */ + if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ + pTab->base.zErrMsg = sqlite3_mprintf( + "cannot %s contentless fts5 table: %s", + (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName + ); + rc = SQLITE_ERROR; + } + + /* DELETE */ + else if( nArg==1 ){ + i64 iDel = sqlite3_value_int64(apVal[0]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0); + } + + /* INSERT */ + else if( eType0!=SQLITE_INTEGER ){ + /* If this is a REPLACE, first remove the current entry (if any) */ + if( eConflict==SQLITE_REPLACE + && sqlite3_value_type(apVal[1])==SQLITE_INTEGER + ){ + i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + + /* UPDATE */ + else{ + i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ + i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ + if( iOld!=iNew ){ + if( eConflict==SQLITE_REPLACE ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + }else{ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *pRowid); + } + } + }else{ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + } + } + + pTab->pConfig->pzErrmsg = 0; + return rc; +} + +/* +** Implementation of xSync() method. +*/ +static int fts5SyncMethod(sqlite3_vtab *pVtab){ + int rc; + Fts5Table *pTab = (Fts5Table*)pVtab; + fts5CheckTransactionState(pTab, FTS5_SYNC, 0); + pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + fts5TripCursors(pTab); + rc = sqlite3Fts5StorageSync(pTab->pStorage); + pTab->pConfig->pzErrmsg = 0; + return rc; +} + +/* +** Implementation of xBegin() method. +*/ +static int fts5BeginMethod(sqlite3_vtab *pVtab){ + fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_BEGIN, 0); + fts5NewTransaction((Fts5Table*)pVtab); + return SQLITE_OK; +} + +/* +** Implementation of xCommit() method. This is a no-op. The contents of +** the pending-terms hash-table have already been flushed into the database +** by fts5SyncMethod(). +*/ +static int fts5CommitMethod(sqlite3_vtab *pVtab){ + UNUSED_PARAM(pVtab); /* Call below is a no-op for NDEBUG builds */ + fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_COMMIT, 0); + return SQLITE_OK; +} + +/* +** Implementation of xRollback(). Discard the contents of the pending-terms +** hash-table. Any changes made to the database are reverted by SQLite. +*/ +static int fts5RollbackMethod(sqlite3_vtab *pVtab){ + int rc; + Fts5Table *pTab = (Fts5Table*)pVtab; + fts5CheckTransactionState(pTab, FTS5_ROLLBACK, 0); + rc = sqlite3Fts5StorageRollback(pTab->pStorage); + return rc; +} + +static int fts5CsrPoslist(Fts5Cursor*, int, const u8**, int*); + +static void *fts5ApiUserData(Fts5Context *pCtx){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + return pCsr->pAux->pUserData; +} + +static int fts5ApiColumnCount(Fts5Context *pCtx){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + return ((Fts5Table*)(pCsr->base.pVtab))->pConfig->nCol; +} + +static int fts5ApiColumnTotalSize( + Fts5Context *pCtx, + int iCol, + sqlite3_int64 *pnToken +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + return sqlite3Fts5StorageSize(pTab->pStorage, iCol, pnToken); +} + +static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + return sqlite3Fts5StorageRowCount(pTab->pStorage, pnRow); +} + +static int fts5ApiTokenize( + Fts5Context *pCtx, + const char *pText, int nText, + void *pUserData, + int (*xToken)(void*, int, const char*, int, int, int) +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + return sqlite3Fts5Tokenize( + pTab->pConfig, FTS5_TOKENIZE_AUX, pText, nText, pUserData, xToken + ); +} + +static int fts5ApiPhraseCount(Fts5Context *pCtx){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + return sqlite3Fts5ExprPhraseCount(pCsr->pExpr); +} + +static int fts5ApiPhraseSize(Fts5Context *pCtx, int iPhrase){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + return sqlite3Fts5ExprPhraseSize(pCsr->pExpr, iPhrase); +} + +static int fts5ApiColumnText( + Fts5Context *pCtx, + int iCol, + const char **pz, + int *pn +){ + int rc = SQLITE_OK; + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + if( fts5IsContentless((Fts5Table*)(pCsr->base.pVtab)) ){ + *pz = 0; + *pn = 0; + }else{ + rc = fts5SeekCursor(pCsr, 0); + if( rc==SQLITE_OK ){ + *pz = (const char*)sqlite3_column_text(pCsr->pStmt, iCol+1); + *pn = sqlite3_column_bytes(pCsr->pStmt, iCol+1); + } + } + return rc; +} + +static int fts5CsrPoslist( + Fts5Cursor *pCsr, + int iPhrase, + const u8 **pa, + int *pn +){ + Fts5Config *pConfig = ((Fts5Table*)(pCsr->base.pVtab))->pConfig; + int rc = SQLITE_OK; + int bLive = (pCsr->pSorter==0); + + if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_POSLIST) ){ + + if( pConfig->eDetail!=FTS5_DETAIL_FULL ){ + Fts5PoslistPopulator *aPopulator; + int i; + aPopulator = sqlite3Fts5ExprClearPoslists(pCsr->pExpr, bLive); + if( aPopulator==0 ) rc = SQLITE_NOMEM; + for(i=0; i<pConfig->nCol && rc==SQLITE_OK; i++){ + int n; const char *z; + rc = fts5ApiColumnText((Fts5Context*)pCsr, i, &z, &n); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5ExprPopulatePoslists( + pConfig, pCsr->pExpr, aPopulator, i, z, n + ); + } + } + sqlite3_free(aPopulator); + + if( pCsr->pSorter ){ + sqlite3Fts5ExprCheckPoslists(pCsr->pExpr, pCsr->pSorter->iRowid); + } + } + CsrFlagClear(pCsr, FTS5CSR_REQUIRE_POSLIST); + } + + if( pCsr->pSorter && pConfig->eDetail==FTS5_DETAIL_FULL ){ + Fts5Sorter *pSorter = pCsr->pSorter; + int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]); + *pn = pSorter->aIdx[iPhrase] - i1; + *pa = &pSorter->aPoslist[i1]; + }else{ + *pn = sqlite3Fts5ExprPoslist(pCsr->pExpr, iPhrase, pa); + } + + return rc; +} + +/* +** Ensure that the Fts5Cursor.nInstCount and aInst[] variables are populated +** correctly for the current view. Return SQLITE_OK if successful, or an +** SQLite error code otherwise. +*/ +static int fts5CacheInstArray(Fts5Cursor *pCsr){ + int rc = SQLITE_OK; + Fts5PoslistReader *aIter; /* One iterator for each phrase */ + int nIter; /* Number of iterators/phrases */ + + nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); + if( pCsr->aInstIter==0 ){ + int nByte = sizeof(Fts5PoslistReader) * nIter; + pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte); + } + aIter = pCsr->aInstIter; + + if( aIter ){ + int nInst = 0; /* Number instances seen so far */ + int i; + + /* Initialize all iterators */ + for(i=0; i<nIter && rc==SQLITE_OK; i++){ + const u8 *a; + int n; + rc = fts5CsrPoslist(pCsr, i, &a, &n); + if( rc==SQLITE_OK ){ + sqlite3Fts5PoslistReaderInit(a, n, &aIter[i]); + } + } + + if( rc==SQLITE_OK ){ + while( 1 ){ + int *aInst; + int iBest = -1; + for(i=0; i<nIter; i++){ + if( (aIter[i].bEof==0) + && (iBest<0 || aIter[i].iPos<aIter[iBest].iPos) + ){ + iBest = i; + } + } + if( iBest<0 ) break; + + nInst++; + if( nInst>=pCsr->nInstAlloc ){ + pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; + aInst = (int*)sqlite3_realloc( + pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3 + ); + if( aInst ){ + pCsr->aInst = aInst; + }else{ + rc = SQLITE_NOMEM; + break; + } + } + + aInst = &pCsr->aInst[3 * (nInst-1)]; + aInst[0] = iBest; + aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos); + aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos); + sqlite3Fts5PoslistReaderNext(&aIter[iBest]); + } + } + + pCsr->nInstCount = nInst; + CsrFlagClear(pCsr, FTS5CSR_REQUIRE_INST); + } + return rc; +} + +static int fts5ApiInstCount(Fts5Context *pCtx, int *pnInst){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + int rc = SQLITE_OK; + if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST)==0 + || SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) ){ + *pnInst = pCsr->nInstCount; + } + return rc; +} + +static int fts5ApiInst( + Fts5Context *pCtx, + int iIdx, + int *piPhrase, + int *piCol, + int *piOff +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + int rc = SQLITE_OK; + if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_INST)==0 + || SQLITE_OK==(rc = fts5CacheInstArray(pCsr)) + ){ + if( iIdx<0 || iIdx>=pCsr->nInstCount ){ + rc = SQLITE_RANGE; +#if 0 + }else if( fts5IsOffsetless((Fts5Table*)pCsr->base.pVtab) ){ + *piPhrase = pCsr->aInst[iIdx*3]; + *piCol = pCsr->aInst[iIdx*3 + 2]; + *piOff = -1; +#endif + }else{ + *piPhrase = pCsr->aInst[iIdx*3]; + *piCol = pCsr->aInst[iIdx*3 + 1]; + *piOff = pCsr->aInst[iIdx*3 + 2]; + } + } + return rc; +} + +static sqlite3_int64 fts5ApiRowid(Fts5Context *pCtx){ + return fts5CursorRowid((Fts5Cursor*)pCtx); +} + +static int fts5ColumnSizeCb( + void *pContext, /* Pointer to int */ + int tflags, + const char *pUnused, /* Buffer containing token */ + int nUnused, /* Size of token in bytes */ + int iUnused1, /* Start offset of token */ + int iUnused2 /* End offset of token */ +){ + int *pCnt = (int*)pContext; + UNUSED_PARAM2(pUnused, nUnused); + UNUSED_PARAM2(iUnused1, iUnused2); + if( (tflags & FTS5_TOKEN_COLOCATED)==0 ){ + (*pCnt)++; + } + return SQLITE_OK; +} + +static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->pConfig; + int rc = SQLITE_OK; + + if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_DOCSIZE) ){ + if( pConfig->bColumnsize ){ + i64 iRowid = fts5CursorRowid(pCsr); + rc = sqlite3Fts5StorageDocsize(pTab->pStorage, iRowid, pCsr->aColumnSize); + }else if( pConfig->zContent==0 ){ + int i; + for(i=0; i<pConfig->nCol; i++){ + if( pConfig->abUnindexed[i]==0 ){ + pCsr->aColumnSize[i] = -1; + } + } + }else{ + int i; + for(i=0; rc==SQLITE_OK && i<pConfig->nCol; i++){ + if( pConfig->abUnindexed[i]==0 ){ + const char *z; int n; + void *p = (void*)(&pCsr->aColumnSize[i]); + pCsr->aColumnSize[i] = 0; + rc = fts5ApiColumnText(pCtx, i, &z, &n); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5Tokenize( + pConfig, FTS5_TOKENIZE_AUX, z, n, p, fts5ColumnSizeCb + ); + } + } + } + } + CsrFlagClear(pCsr, FTS5CSR_REQUIRE_DOCSIZE); + } + if( iCol<0 ){ + int i; + *pnToken = 0; + for(i=0; i<pConfig->nCol; i++){ + *pnToken += pCsr->aColumnSize[i]; + } + }else if( iCol<pConfig->nCol ){ + *pnToken = pCsr->aColumnSize[iCol]; + }else{ + *pnToken = 0; + rc = SQLITE_RANGE; + } + return rc; +} + +/* +** Implementation of the xSetAuxdata() method. +*/ +static int fts5ApiSetAuxdata( + Fts5Context *pCtx, /* Fts5 context */ + void *pPtr, /* Pointer to save as auxdata */ + void(*xDelete)(void*) /* Destructor for pPtr (or NULL) */ +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Auxdata *pData; + + /* Search through the cursors list of Fts5Auxdata objects for one that + ** corresponds to the currently executing auxiliary function. */ + for(pData=pCsr->pAuxdata; pData; pData=pData->pNext){ + if( pData->pAux==pCsr->pAux ) break; + } + + if( pData ){ + if( pData->xDelete ){ + pData->xDelete(pData->pPtr); + } + }else{ + int rc = SQLITE_OK; + pData = (Fts5Auxdata*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Auxdata)); + if( pData==0 ){ + if( xDelete ) xDelete(pPtr); + return rc; + } + pData->pAux = pCsr->pAux; + pData->pNext = pCsr->pAuxdata; + pCsr->pAuxdata = pData; + } + + pData->xDelete = xDelete; + pData->pPtr = pPtr; + return SQLITE_OK; +} + +static void *fts5ApiGetAuxdata(Fts5Context *pCtx, int bClear){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Auxdata *pData; + void *pRet = 0; + + for(pData=pCsr->pAuxdata; pData; pData=pData->pNext){ + if( pData->pAux==pCsr->pAux ) break; + } + + if( pData ){ + pRet = pData->pPtr; + if( bClear ){ + pData->pPtr = 0; + pData->xDelete = 0; + } + } + + return pRet; +} + +static void fts5ApiPhraseNext( + Fts5Context *pUnused, + Fts5PhraseIter *pIter, + int *piCol, int *piOff +){ + UNUSED_PARAM(pUnused); + if( pIter->a>=pIter->b ){ + *piCol = -1; + *piOff = -1; + }else{ + int iVal; + pIter->a += fts5GetVarint32(pIter->a, iVal); + if( iVal==1 ){ + pIter->a += fts5GetVarint32(pIter->a, iVal); + *piCol = iVal; + *piOff = 0; + pIter->a += fts5GetVarint32(pIter->a, iVal); + } + *piOff += (iVal-2); + } +} + +static int fts5ApiPhraseFirst( + Fts5Context *pCtx, + int iPhrase, + Fts5PhraseIter *pIter, + int *piCol, int *piOff +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + int n; + int rc = fts5CsrPoslist(pCsr, iPhrase, &pIter->a, &n); + if( rc==SQLITE_OK ){ + pIter->b = &pIter->a[n]; + *piCol = 0; + *piOff = 0; + fts5ApiPhraseNext(pCtx, pIter, piCol, piOff); + } + return rc; +} + +static void fts5ApiPhraseNextColumn( + Fts5Context *pCtx, + Fts5PhraseIter *pIter, + int *piCol +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Config *pConfig = ((Fts5Table*)(pCsr->base.pVtab))->pConfig; + + if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ + if( pIter->a>=pIter->b ){ + *piCol = -1; + }else{ + int iIncr; + pIter->a += fts5GetVarint32(&pIter->a[0], iIncr); + *piCol += (iIncr-2); + } + }else{ + while( 1 ){ + int dummy; + if( pIter->a>=pIter->b ){ + *piCol = -1; + return; + } + if( pIter->a[0]==0x01 ) break; + pIter->a += fts5GetVarint32(pIter->a, dummy); + } + pIter->a += 1 + fts5GetVarint32(&pIter->a[1], *piCol); + } +} + +static int fts5ApiPhraseFirstColumn( + Fts5Context *pCtx, + int iPhrase, + Fts5PhraseIter *pIter, + int *piCol +){ + int rc = SQLITE_OK; + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Config *pConfig = ((Fts5Table*)(pCsr->base.pVtab))->pConfig; + + if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ + Fts5Sorter *pSorter = pCsr->pSorter; + int n; + if( pSorter ){ + int i1 = (iPhrase==0 ? 0 : pSorter->aIdx[iPhrase-1]); + n = pSorter->aIdx[iPhrase] - i1; + pIter->a = &pSorter->aPoslist[i1]; + }else{ + rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, iPhrase, &pIter->a, &n); + } + if( rc==SQLITE_OK ){ + pIter->b = &pIter->a[n]; + *piCol = 0; + fts5ApiPhraseNextColumn(pCtx, pIter, piCol); + } + }else{ + int n; + rc = fts5CsrPoslist(pCsr, iPhrase, &pIter->a, &n); + if( rc==SQLITE_OK ){ + pIter->b = &pIter->a[n]; + if( n<=0 ){ + *piCol = -1; + }else if( pIter->a[0]==0x01 ){ + pIter->a += 1 + fts5GetVarint32(&pIter->a[1], *piCol); + }else{ + *piCol = 0; + } + } + } + + return rc; +} + + +static int fts5ApiQueryPhrase(Fts5Context*, int, void*, + int(*)(const Fts5ExtensionApi*, Fts5Context*, void*) +); + +static const Fts5ExtensionApi sFts5Api = { + 2, /* iVersion */ + fts5ApiUserData, + fts5ApiColumnCount, + fts5ApiRowCount, + fts5ApiColumnTotalSize, + fts5ApiTokenize, + fts5ApiPhraseCount, + fts5ApiPhraseSize, + fts5ApiInstCount, + fts5ApiInst, + fts5ApiRowid, + fts5ApiColumnText, + fts5ApiColumnSize, + fts5ApiQueryPhrase, + fts5ApiSetAuxdata, + fts5ApiGetAuxdata, + fts5ApiPhraseFirst, + fts5ApiPhraseNext, + fts5ApiPhraseFirstColumn, + fts5ApiPhraseNextColumn, +}; + +/* +** Implementation of API function xQueryPhrase(). +*/ +static int fts5ApiQueryPhrase( + Fts5Context *pCtx, + int iPhrase, + void *pUserData, + int(*xCallback)(const Fts5ExtensionApi*, Fts5Context*, void*) +){ + Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; + Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + int rc; + Fts5Cursor *pNew = 0; + + rc = fts5OpenMethod(pCsr->base.pVtab, (sqlite3_vtab_cursor**)&pNew); + if( rc==SQLITE_OK ){ + pNew->ePlan = FTS5_PLAN_MATCH; + pNew->iFirstRowid = SMALLEST_INT64; + pNew->iLastRowid = LARGEST_INT64; + pNew->base.pVtab = (sqlite3_vtab*)pTab; + rc = sqlite3Fts5ExprClonePhrase(pCsr->pExpr, iPhrase, &pNew->pExpr); + } + + if( rc==SQLITE_OK ){ + for(rc = fts5CursorFirst(pTab, pNew, 0); + rc==SQLITE_OK && CsrFlagTest(pNew, FTS5CSR_EOF)==0; + rc = fts5NextMethod((sqlite3_vtab_cursor*)pNew) + ){ + rc = xCallback(&sFts5Api, (Fts5Context*)pNew, pUserData); + if( rc!=SQLITE_OK ){ + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + break; + } + } + } + + fts5CloseMethod((sqlite3_vtab_cursor*)pNew); + return rc; +} + +static void fts5ApiInvoke( + Fts5Auxiliary *pAux, + Fts5Cursor *pCsr, + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( pCsr->pAux==0 ); + pCsr->pAux = pAux; + pAux->xFunc(&sFts5Api, (Fts5Context*)pCsr, context, argc, argv); + pCsr->pAux = 0; +} + +static Fts5Cursor *fts5CursorFromCsrid(Fts5Global *pGlobal, i64 iCsrId){ + Fts5Cursor *pCsr; + for(pCsr=pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ + if( pCsr->iCsrId==iCsrId ) break; + } + return pCsr; +} + +static void fts5ApiCallback( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + + Fts5Auxiliary *pAux; + Fts5Cursor *pCsr; + i64 iCsrId; + + assert( argc>=1 ); + pAux = (Fts5Auxiliary*)sqlite3_user_data(context); + iCsrId = sqlite3_value_int64(argv[0]); + + pCsr = fts5CursorFromCsrid(pAux->pGlobal, iCsrId); + if( pCsr==0 ){ + char *zErr = sqlite3_mprintf("no such cursor: %lld", iCsrId); + sqlite3_result_error(context, zErr, -1); + sqlite3_free(zErr); + }else{ + fts5ApiInvoke(pAux, pCsr, context, argc-1, &argv[1]); + } +} + + +/* +** Given cursor id iId, return a pointer to the corresponding Fts5Index +** object. Or NULL If the cursor id does not exist. +** +** If successful, set *ppConfig to point to the associated config object +** before returning. +*/ +static Fts5Index *sqlite3Fts5IndexFromCsrid( + Fts5Global *pGlobal, /* FTS5 global context for db handle */ + i64 iCsrId, /* Id of cursor to find */ + Fts5Config **ppConfig /* OUT: Configuration object */ +){ + Fts5Cursor *pCsr; + Fts5Table *pTab; + + pCsr = fts5CursorFromCsrid(pGlobal, iCsrId); + pTab = (Fts5Table*)pCsr->base.pVtab; + *ppConfig = pTab->pConfig; + + return pTab->pIndex; +} + +/* +** Return a "position-list blob" corresponding to the current position of +** cursor pCsr via sqlite3_result_blob(). A position-list blob contains +** the current position-list for each phrase in the query associated with +** cursor pCsr. +** +** A position-list blob begins with (nPhrase-1) varints, where nPhrase is +** the number of phrases in the query. Following the varints are the +** concatenated position lists for each phrase, in order. +** +** The first varint (if it exists) contains the size of the position list +** for phrase 0. The second (same disclaimer) contains the size of position +** list 1. And so on. There is no size field for the final position list, +** as it can be derived from the total size of the blob. +*/ +static int fts5PoslistBlob(sqlite3_context *pCtx, Fts5Cursor *pCsr){ + int i; + int rc = SQLITE_OK; + int nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); + Fts5Buffer val; + + memset(&val, 0, sizeof(Fts5Buffer)); + switch( ((Fts5Table*)(pCsr->base.pVtab))->pConfig->eDetail ){ + case FTS5_DETAIL_FULL: + + /* Append the varints */ + for(i=0; i<(nPhrase-1); i++){ + const u8 *dummy; + int nByte = sqlite3Fts5ExprPoslist(pCsr->pExpr, i, &dummy); + sqlite3Fts5BufferAppendVarint(&rc, &val, nByte); + } + + /* Append the position lists */ + for(i=0; i<nPhrase; i++){ + const u8 *pPoslist; + int nPoslist; + nPoslist = sqlite3Fts5ExprPoslist(pCsr->pExpr, i, &pPoslist); + sqlite3Fts5BufferAppendBlob(&rc, &val, nPoslist, pPoslist); + } + break; + + case FTS5_DETAIL_COLUMNS: + + /* Append the varints */ + for(i=0; rc==SQLITE_OK && i<(nPhrase-1); i++){ + const u8 *dummy; + int nByte; + rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, i, &dummy, &nByte); + sqlite3Fts5BufferAppendVarint(&rc, &val, nByte); + } + + /* Append the position lists */ + for(i=0; rc==SQLITE_OK && i<nPhrase; i++){ + const u8 *pPoslist; + int nPoslist; + rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, i, &pPoslist, &nPoslist); + sqlite3Fts5BufferAppendBlob(&rc, &val, nPoslist, pPoslist); + } + break; + + default: + break; + } + + sqlite3_result_blob(pCtx, val.p, val.n, sqlite3_free); + return rc; +} + +/* +** This is the xColumn method, called by SQLite to request a value from +** the row that the supplied cursor currently points to. +*/ +static int fts5ColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->pConfig; + Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; + int rc = SQLITE_OK; + + assert( CsrFlagTest(pCsr, FTS5CSR_EOF)==0 ); + + if( pCsr->ePlan==FTS5_PLAN_SPECIAL ){ + if( iCol==pConfig->nCol ){ + sqlite3_result_int64(pCtx, pCsr->iSpecial); + } + }else + + if( iCol==pConfig->nCol ){ + /* User is requesting the value of the special column with the same name + ** as the table. Return the cursor integer id number. This value is only + ** useful in that it may be passed as the first argument to an FTS5 + ** auxiliary function. */ + sqlite3_result_int64(pCtx, pCsr->iCsrId); + }else if( iCol==pConfig->nCol+1 ){ + + /* The value of the "rank" column. */ + if( pCsr->ePlan==FTS5_PLAN_SOURCE ){ + fts5PoslistBlob(pCtx, pCsr); + }else if( + pCsr->ePlan==FTS5_PLAN_MATCH + || pCsr->ePlan==FTS5_PLAN_SORTED_MATCH + ){ + if( pCsr->pRank || SQLITE_OK==(rc = fts5FindRankFunction(pCsr)) ){ + fts5ApiInvoke(pCsr->pRank, pCsr, pCtx, pCsr->nRankArg, pCsr->apRankArg); + } + } + }else if( !fts5IsContentless(pTab) ){ + rc = fts5SeekCursor(pCsr, 1); + if( rc==SQLITE_OK ){ + sqlite3_result_value(pCtx, sqlite3_column_value(pCsr->pStmt, iCol+1)); + } + } + return rc; +} + + +/* +** This routine implements the xFindFunction method for the FTS3 +** virtual table. +*/ +static int fts5FindFunctionMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + int nUnused, /* Number of SQL function arguments */ + const char *zName, /* Name of SQL function */ + void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ + void **ppArg /* OUT: User data for *pxFunc */ +){ + Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5Auxiliary *pAux; + + UNUSED_PARAM(nUnused); + pAux = fts5FindAuxiliary(pTab, zName); + if( pAux ){ + *pxFunc = fts5ApiCallback; + *ppArg = (void*)pAux; + return 1; + } + + /* No function of the specified name was found. Return 0. */ + return 0; +} + +/* +** Implementation of FTS5 xRename method. Rename an fts5 table. +*/ +static int fts5RenameMethod( + sqlite3_vtab *pVtab, /* Virtual table handle */ + const char *zName /* New name of table */ +){ + Fts5Table *pTab = (Fts5Table*)pVtab; + return sqlite3Fts5StorageRename(pTab->pStorage, zName); +} + +/* +** The xSavepoint() method. +** +** Flush the contents of the pending-terms table to disk. +*/ +static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ + Fts5Table *pTab = (Fts5Table*)pVtab; + UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ + fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint); + fts5TripCursors(pTab); + return sqlite3Fts5StorageSync(pTab->pStorage); +} + +/* +** The xRelease() method. +** +** This is a no-op. +*/ +static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ + Fts5Table *pTab = (Fts5Table*)pVtab; + UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ + fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint); + fts5TripCursors(pTab); + return sqlite3Fts5StorageSync(pTab->pStorage); +} + +/* +** The xRollbackTo() method. +** +** Discard the contents of the pending terms table. +*/ +static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ + Fts5Table *pTab = (Fts5Table*)pVtab; + UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ + fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint); + fts5TripCursors(pTab); + return sqlite3Fts5StorageRollback(pTab->pStorage); +} + +/* +** Register a new auxiliary function with global context pGlobal. +*/ +static int fts5CreateAux( + fts5_api *pApi, /* Global context (one per db handle) */ + const char *zName, /* Name of new function */ + void *pUserData, /* User data for aux. function */ + fts5_extension_function xFunc, /* Aux. function implementation */ + void(*xDestroy)(void*) /* Destructor for pUserData */ +){ + Fts5Global *pGlobal = (Fts5Global*)pApi; + int rc = sqlite3_overload_function(pGlobal->db, zName, -1); + if( rc==SQLITE_OK ){ + Fts5Auxiliary *pAux; + int nName; /* Size of zName in bytes, including \0 */ + int nByte; /* Bytes of space to allocate */ + + nName = (int)strlen(zName) + 1; + nByte = sizeof(Fts5Auxiliary) + nName; + pAux = (Fts5Auxiliary*)sqlite3_malloc(nByte); + if( pAux ){ + memset(pAux, 0, nByte); + pAux->zFunc = (char*)&pAux[1]; + memcpy(pAux->zFunc, zName, nName); + pAux->pGlobal = pGlobal; + pAux->pUserData = pUserData; + pAux->xFunc = xFunc; + pAux->xDestroy = xDestroy; + pAux->pNext = pGlobal->pAux; + pGlobal->pAux = pAux; + }else{ + rc = SQLITE_NOMEM; + } + } + + return rc; +} + +/* +** Register a new tokenizer. This is the implementation of the +** fts5_api.xCreateTokenizer() method. +*/ +static int fts5CreateTokenizer( + fts5_api *pApi, /* Global context (one per db handle) */ + const char *zName, /* Name of new function */ + void *pUserData, /* User data for aux. function */ + fts5_tokenizer *pTokenizer, /* Tokenizer implementation */ + void(*xDestroy)(void*) /* Destructor for pUserData */ +){ + Fts5Global *pGlobal = (Fts5Global*)pApi; + Fts5TokenizerModule *pNew; + int nName; /* Size of zName and its \0 terminator */ + int nByte; /* Bytes of space to allocate */ + int rc = SQLITE_OK; + + nName = (int)strlen(zName) + 1; + nByte = sizeof(Fts5TokenizerModule) + nName; + pNew = (Fts5TokenizerModule*)sqlite3_malloc(nByte); + if( pNew ){ + memset(pNew, 0, nByte); + pNew->zName = (char*)&pNew[1]; + memcpy(pNew->zName, zName, nName); + pNew->pUserData = pUserData; + pNew->x = *pTokenizer; + pNew->xDestroy = xDestroy; + pNew->pNext = pGlobal->pTok; + pGlobal->pTok = pNew; + if( pNew->pNext==0 ){ + pGlobal->pDfltTok = pNew; + } + }else{ + rc = SQLITE_NOMEM; + } + + return rc; +} + +static Fts5TokenizerModule *fts5LocateTokenizer( + Fts5Global *pGlobal, + const char *zName +){ + Fts5TokenizerModule *pMod = 0; + + if( zName==0 ){ + pMod = pGlobal->pDfltTok; + }else{ + for(pMod=pGlobal->pTok; pMod; pMod=pMod->pNext){ + if( sqlite3_stricmp(zName, pMod->zName)==0 ) break; + } + } + + return pMod; +} + +/* +** Find a tokenizer. This is the implementation of the +** fts5_api.xFindTokenizer() method. +*/ +static int fts5FindTokenizer( + fts5_api *pApi, /* Global context (one per db handle) */ + const char *zName, /* Name of new function */ + void **ppUserData, + fts5_tokenizer *pTokenizer /* Populate this object */ +){ + int rc = SQLITE_OK; + Fts5TokenizerModule *pMod; + + pMod = fts5LocateTokenizer((Fts5Global*)pApi, zName); + if( pMod ){ + *pTokenizer = pMod->x; + *ppUserData = pMod->pUserData; + }else{ + memset(pTokenizer, 0, sizeof(fts5_tokenizer)); + rc = SQLITE_ERROR; + } + + return rc; +} + +static int sqlite3Fts5GetTokenizer( + Fts5Global *pGlobal, + const char **azArg, + int nArg, + Fts5Tokenizer **ppTok, + fts5_tokenizer **ppTokApi, + char **pzErr +){ + Fts5TokenizerModule *pMod; + int rc = SQLITE_OK; + + pMod = fts5LocateTokenizer(pGlobal, nArg==0 ? 0 : azArg[0]); + if( pMod==0 ){ + assert( nArg>0 ); + rc = SQLITE_ERROR; + *pzErr = sqlite3_mprintf("no such tokenizer: %s", azArg[0]); + }else{ + rc = pMod->x.xCreate(pMod->pUserData, &azArg[1], (nArg?nArg-1:0), ppTok); + *ppTokApi = &pMod->x; + if( rc!=SQLITE_OK && pzErr ){ + *pzErr = sqlite3_mprintf("error in tokenizer constructor"); + } + } + + if( rc!=SQLITE_OK ){ + *ppTokApi = 0; + *ppTok = 0; + } + + return rc; +} + +static void fts5ModuleDestroy(void *pCtx){ + Fts5TokenizerModule *pTok, *pNextTok; + Fts5Auxiliary *pAux, *pNextAux; + Fts5Global *pGlobal = (Fts5Global*)pCtx; + + for(pAux=pGlobal->pAux; pAux; pAux=pNextAux){ + pNextAux = pAux->pNext; + if( pAux->xDestroy ) pAux->xDestroy(pAux->pUserData); + sqlite3_free(pAux); + } + + for(pTok=pGlobal->pTok; pTok; pTok=pNextTok){ + pNextTok = pTok->pNext; + if( pTok->xDestroy ) pTok->xDestroy(pTok->pUserData); + sqlite3_free(pTok); + } + + sqlite3_free(pGlobal); +} + +static void fts5Fts5Func( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apArg /* Function arguments */ +){ + Fts5Global *pGlobal = (Fts5Global*)sqlite3_user_data(pCtx); + fts5_api **ppApi; + UNUSED_PARAM(nArg); + assert( nArg==1 ); + ppApi = (fts5_api**)sqlite3_value_pointer(apArg[0], "fts5_api_ptr"); + if( ppApi ) *ppApi = &pGlobal->api; +} + +/* +** Implementation of fts5_source_id() function. +*/ +static void fts5SourceIdFunc( + sqlite3_context *pCtx, /* Function call context */ + int nArg, /* Number of args */ + sqlite3_value **apUnused /* Function arguments */ +){ + assert( nArg==0 ); + UNUSED_PARAM2(nArg, apUnused); + sqlite3_result_text(pCtx, "fts5: 2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca", -1, SQLITE_TRANSIENT); +} + +static int fts5Init(sqlite3 *db){ + static const sqlite3_module fts5Mod = { + /* iVersion */ 2, + /* xCreate */ fts5CreateMethod, + /* xConnect */ fts5ConnectMethod, + /* xBestIndex */ fts5BestIndexMethod, + /* xDisconnect */ fts5DisconnectMethod, + /* xDestroy */ fts5DestroyMethod, + /* xOpen */ fts5OpenMethod, + /* xClose */ fts5CloseMethod, + /* xFilter */ fts5FilterMethod, + /* xNext */ fts5NextMethod, + /* xEof */ fts5EofMethod, + /* xColumn */ fts5ColumnMethod, + /* xRowid */ fts5RowidMethod, + /* xUpdate */ fts5UpdateMethod, + /* xBegin */ fts5BeginMethod, + /* xSync */ fts5SyncMethod, + /* xCommit */ fts5CommitMethod, + /* xRollback */ fts5RollbackMethod, + /* xFindFunction */ fts5FindFunctionMethod, + /* xRename */ fts5RenameMethod, + /* xSavepoint */ fts5SavepointMethod, + /* xRelease */ fts5ReleaseMethod, + /* xRollbackTo */ fts5RollbackToMethod, + }; + + int rc; + Fts5Global *pGlobal = 0; + + pGlobal = (Fts5Global*)sqlite3_malloc(sizeof(Fts5Global)); + if( pGlobal==0 ){ + rc = SQLITE_NOMEM; + }else{ + void *p = (void*)pGlobal; + memset(pGlobal, 0, sizeof(Fts5Global)); + pGlobal->db = db; + pGlobal->api.iVersion = 2; + pGlobal->api.xCreateFunction = fts5CreateAux; + pGlobal->api.xCreateTokenizer = fts5CreateTokenizer; + pGlobal->api.xFindTokenizer = fts5FindTokenizer; + rc = sqlite3_create_module_v2(db, "fts5", &fts5Mod, p, fts5ModuleDestroy); + if( rc==SQLITE_OK ) rc = sqlite3Fts5IndexInit(db); + if( rc==SQLITE_OK ) rc = sqlite3Fts5ExprInit(pGlobal, db); + if( rc==SQLITE_OK ) rc = sqlite3Fts5AuxInit(&pGlobal->api); + if( rc==SQLITE_OK ) rc = sqlite3Fts5TokenizerInit(&pGlobal->api); + if( rc==SQLITE_OK ) rc = sqlite3Fts5VocabInit(pGlobal, db); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function( + db, "fts5", 1, SQLITE_UTF8, p, fts5Fts5Func, 0, 0 + ); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function( + db, "fts5_source_id", 0, SQLITE_UTF8, p, fts5SourceIdFunc, 0, 0 + ); + } + } + + /* If SQLITE_FTS5_ENABLE_TEST_MI is defined, assume that the file + ** fts5_test_mi.c is compiled and linked into the executable. And call + ** its entry point to enable the matchinfo() demo. */ +#ifdef SQLITE_FTS5_ENABLE_TEST_MI + if( rc==SQLITE_OK ){ + extern int sqlite3Fts5TestRegisterMatchinfo(sqlite3*); + rc = sqlite3Fts5TestRegisterMatchinfo(db); + } +#endif + + return rc; +} + +/* +** The following functions are used to register the module with SQLite. If +** this module is being built as part of the SQLite core (SQLITE_CORE is +** defined), then sqlite3_open() will call sqlite3Fts5Init() directly. +** +** Or, if this module is being built as a loadable extension, +** sqlite3Fts5Init() is omitted and the two standard entry points +** sqlite3_fts_init() and sqlite3_fts5_init() defined instead. +*/ +#ifndef SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_fts_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + return fts5Init(db); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_fts5_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + return fts5Init(db); +} +#else +SQLITE_PRIVATE int sqlite3Fts5Init(sqlite3 *db){ + return fts5Init(db); +} +#endif + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +*/ + + + +/* #include "fts5Int.h" */ + +struct Fts5Storage { + Fts5Config *pConfig; + Fts5Index *pIndex; + int bTotalsValid; /* True if nTotalRow/aTotalSize[] are valid */ + i64 nTotalRow; /* Total number of rows in FTS table */ + i64 *aTotalSize; /* Total sizes of each column */ + sqlite3_stmt *aStmt[11]; +}; + + +#if FTS5_STMT_SCAN_ASC!=0 +# error "FTS5_STMT_SCAN_ASC mismatch" +#endif +#if FTS5_STMT_SCAN_DESC!=1 +# error "FTS5_STMT_SCAN_DESC mismatch" +#endif +#if FTS5_STMT_LOOKUP!=2 +# error "FTS5_STMT_LOOKUP mismatch" +#endif + +#define FTS5_STMT_INSERT_CONTENT 3 +#define FTS5_STMT_REPLACE_CONTENT 4 +#define FTS5_STMT_DELETE_CONTENT 5 +#define FTS5_STMT_REPLACE_DOCSIZE 6 +#define FTS5_STMT_DELETE_DOCSIZE 7 +#define FTS5_STMT_LOOKUP_DOCSIZE 8 +#define FTS5_STMT_REPLACE_CONFIG 9 +#define FTS5_STMT_SCAN 10 + +/* +** Prepare the two insert statements - Fts5Storage.pInsertContent and +** Fts5Storage.pInsertDocsize - if they have not already been prepared. +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. +*/ +static int fts5StorageGetStmt( + Fts5Storage *p, /* Storage handle */ + int eStmt, /* FTS5_STMT_XXX constant */ + sqlite3_stmt **ppStmt, /* OUT: Prepared statement handle */ + char **pzErrMsg /* OUT: Error message (if any) */ +){ + int rc = SQLITE_OK; + + /* If there is no %_docsize table, there should be no requests for + ** statements to operate on it. */ + assert( p->pConfig->bColumnsize || ( + eStmt!=FTS5_STMT_REPLACE_DOCSIZE + && eStmt!=FTS5_STMT_DELETE_DOCSIZE + && eStmt!=FTS5_STMT_LOOKUP_DOCSIZE + )); + + assert( eStmt>=0 && eStmt<ArraySize(p->aStmt) ); + if( p->aStmt[eStmt]==0 ){ + const char *azStmt[] = { + "SELECT %s FROM %s T WHERE T.%Q >= ? AND T.%Q <= ? ORDER BY T.%Q ASC", + "SELECT %s FROM %s T WHERE T.%Q <= ? AND T.%Q >= ? ORDER BY T.%Q DESC", + "SELECT %s FROM %s T WHERE T.%Q=?", /* LOOKUP */ + + "INSERT INTO %Q.'%q_content' VALUES(%s)", /* INSERT_CONTENT */ + "REPLACE INTO %Q.'%q_content' VALUES(%s)", /* REPLACE_CONTENT */ + "DELETE FROM %Q.'%q_content' WHERE id=?", /* DELETE_CONTENT */ + "REPLACE INTO %Q.'%q_docsize' VALUES(?,?)", /* REPLACE_DOCSIZE */ + "DELETE FROM %Q.'%q_docsize' WHERE id=?", /* DELETE_DOCSIZE */ + + "SELECT sz FROM %Q.'%q_docsize' WHERE id=?", /* LOOKUP_DOCSIZE */ + + "REPLACE INTO %Q.'%q_config' VALUES(?,?)", /* REPLACE_CONFIG */ + "SELECT %s FROM %s AS T", /* SCAN */ + }; + Fts5Config *pC = p->pConfig; + char *zSql = 0; + + switch( eStmt ){ + case FTS5_STMT_SCAN: + zSql = sqlite3_mprintf(azStmt[eStmt], + pC->zContentExprlist, pC->zContent + ); + break; + + case FTS5_STMT_SCAN_ASC: + case FTS5_STMT_SCAN_DESC: + zSql = sqlite3_mprintf(azStmt[eStmt], pC->zContentExprlist, + pC->zContent, pC->zContentRowid, pC->zContentRowid, + pC->zContentRowid + ); + break; + + case FTS5_STMT_LOOKUP: + zSql = sqlite3_mprintf(azStmt[eStmt], + pC->zContentExprlist, pC->zContent, pC->zContentRowid + ); + break; + + case FTS5_STMT_INSERT_CONTENT: + case FTS5_STMT_REPLACE_CONTENT: { + int nCol = pC->nCol + 1; + char *zBind; + int i; + + zBind = sqlite3_malloc(1 + nCol*2); + if( zBind ){ + for(i=0; i<nCol; i++){ + zBind[i*2] = '?'; + zBind[i*2 + 1] = ','; + } + zBind[i*2-1] = '\0'; + zSql = sqlite3_mprintf(azStmt[eStmt], pC->zDb, pC->zName, zBind); + sqlite3_free(zBind); + } + break; + } + + default: + zSql = sqlite3_mprintf(azStmt[eStmt], pC->zDb, pC->zName); + break; + } + + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_prepare_v3(pC->db, zSql, -1, + SQLITE_PREPARE_PERSISTENT, &p->aStmt[eStmt], 0); + sqlite3_free(zSql); + if( rc!=SQLITE_OK && pzErrMsg ){ + *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); + } + } + } + + *ppStmt = p->aStmt[eStmt]; + sqlite3_reset(*ppStmt); + return rc; +} + + +static int fts5ExecPrintf( + sqlite3 *db, + char **pzErr, + const char *zFormat, + ... +){ + int rc; + va_list ap; /* ... printf arguments */ + char *zSql; + + va_start(ap, zFormat); + zSql = sqlite3_vmprintf(zFormat, ap); + + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + rc = sqlite3_exec(db, zSql, 0, 0, pzErr); + sqlite3_free(zSql); + } + + va_end(ap); + return rc; +} + +/* +** Drop all shadow tables. Return SQLITE_OK if successful or an SQLite error +** code otherwise. +*/ +static int sqlite3Fts5DropAll(Fts5Config *pConfig){ + int rc = fts5ExecPrintf(pConfig->db, 0, + "DROP TABLE IF EXISTS %Q.'%q_data';" + "DROP TABLE IF EXISTS %Q.'%q_idx';" + "DROP TABLE IF EXISTS %Q.'%q_config';", + pConfig->zDb, pConfig->zName, + pConfig->zDb, pConfig->zName, + pConfig->zDb, pConfig->zName + ); + if( rc==SQLITE_OK && pConfig->bColumnsize ){ + rc = fts5ExecPrintf(pConfig->db, 0, + "DROP TABLE IF EXISTS %Q.'%q_docsize';", + pConfig->zDb, pConfig->zName + ); + } + if( rc==SQLITE_OK && pConfig->eContent==FTS5_CONTENT_NORMAL ){ + rc = fts5ExecPrintf(pConfig->db, 0, + "DROP TABLE IF EXISTS %Q.'%q_content';", + pConfig->zDb, pConfig->zName + ); + } + return rc; +} + +static void fts5StorageRenameOne( + Fts5Config *pConfig, /* Current FTS5 configuration */ + int *pRc, /* IN/OUT: Error code */ + const char *zTail, /* Tail of table name e.g. "data", "config" */ + const char *zName /* New name of FTS5 table */ +){ + if( *pRc==SQLITE_OK ){ + *pRc = fts5ExecPrintf(pConfig->db, 0, + "ALTER TABLE %Q.'%q_%s' RENAME TO '%q_%s';", + pConfig->zDb, pConfig->zName, zTail, zName, zTail + ); + } +} + +static int sqlite3Fts5StorageRename(Fts5Storage *pStorage, const char *zName){ + Fts5Config *pConfig = pStorage->pConfig; + int rc = sqlite3Fts5StorageSync(pStorage); + + fts5StorageRenameOne(pConfig, &rc, "data", zName); + fts5StorageRenameOne(pConfig, &rc, "idx", zName); + fts5StorageRenameOne(pConfig, &rc, "config", zName); + if( pConfig->bColumnsize ){ + fts5StorageRenameOne(pConfig, &rc, "docsize", zName); + } + if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + fts5StorageRenameOne(pConfig, &rc, "content", zName); + } + return rc; +} + +/* +** Create the shadow table named zPost, with definition zDefn. Return +** SQLITE_OK if successful, or an SQLite error code otherwise. +*/ +static int sqlite3Fts5CreateTable( + Fts5Config *pConfig, /* FTS5 configuration */ + const char *zPost, /* Shadow table to create (e.g. "content") */ + const char *zDefn, /* Columns etc. for shadow table */ + int bWithout, /* True for without rowid */ + char **pzErr /* OUT: Error message */ +){ + int rc; + char *zErr = 0; + + rc = fts5ExecPrintf(pConfig->db, &zErr, "CREATE TABLE %Q.'%q_%q'(%s)%s", + pConfig->zDb, pConfig->zName, zPost, zDefn, +#ifndef SQLITE_FTS5_NO_WITHOUT_ROWID + bWithout?" WITHOUT ROWID": +#endif + "" + ); + if( zErr ){ + *pzErr = sqlite3_mprintf( + "fts5: error creating shadow table %q_%s: %s", + pConfig->zName, zPost, zErr + ); + sqlite3_free(zErr); + } + + return rc; +} + +/* +** Open a new Fts5Index handle. If the bCreate argument is true, create +** and initialize the underlying tables +** +** If successful, set *pp to point to the new object and return SQLITE_OK. +** Otherwise, set *pp to NULL and return an SQLite error code. +*/ +static int sqlite3Fts5StorageOpen( + Fts5Config *pConfig, + Fts5Index *pIndex, + int bCreate, + Fts5Storage **pp, + char **pzErr /* OUT: Error message */ +){ + int rc = SQLITE_OK; + Fts5Storage *p; /* New object */ + int nByte; /* Bytes of space to allocate */ + + nByte = sizeof(Fts5Storage) /* Fts5Storage object */ + + pConfig->nCol * sizeof(i64); /* Fts5Storage.aTotalSize[] */ + *pp = p = (Fts5Storage*)sqlite3_malloc(nByte); + if( !p ) return SQLITE_NOMEM; + + memset(p, 0, nByte); + p->aTotalSize = (i64*)&p[1]; + p->pConfig = pConfig; + p->pIndex = pIndex; + + if( bCreate ){ + if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + int nDefn = 32 + pConfig->nCol*10; + char *zDefn = sqlite3_malloc(32 + pConfig->nCol * 10); + if( zDefn==0 ){ + rc = SQLITE_NOMEM; + }else{ + int i; + int iOff; + sqlite3_snprintf(nDefn, zDefn, "id INTEGER PRIMARY KEY"); + iOff = (int)strlen(zDefn); + for(i=0; i<pConfig->nCol; i++){ + sqlite3_snprintf(nDefn-iOff, &zDefn[iOff], ", c%d", i); + iOff += (int)strlen(&zDefn[iOff]); + } + rc = sqlite3Fts5CreateTable(pConfig, "content", zDefn, 0, pzErr); + } + sqlite3_free(zDefn); + } + + if( rc==SQLITE_OK && pConfig->bColumnsize ){ + rc = sqlite3Fts5CreateTable( + pConfig, "docsize", "id INTEGER PRIMARY KEY, sz BLOB", 0, pzErr + ); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5CreateTable( + pConfig, "config", "k PRIMARY KEY, v", 1, pzErr + ); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageConfigValue(p, "version", 0, FTS5_CURRENT_VERSION); + } + } + + if( rc ){ + sqlite3Fts5StorageClose(p); + *pp = 0; + } + return rc; +} + +/* +** Close a handle opened by an earlier call to sqlite3Fts5StorageOpen(). +*/ +static int sqlite3Fts5StorageClose(Fts5Storage *p){ + int rc = SQLITE_OK; + if( p ){ + int i; + + /* Finalize all SQL statements */ + for(i=0; i<ArraySize(p->aStmt); i++){ + sqlite3_finalize(p->aStmt[i]); + } + + sqlite3_free(p); + } + return rc; +} + +typedef struct Fts5InsertCtx Fts5InsertCtx; +struct Fts5InsertCtx { + Fts5Storage *pStorage; + int iCol; + int szCol; /* Size of column value in tokens */ +}; + +/* +** Tokenization callback used when inserting tokens into the FTS index. +*/ +static int fts5StorageInsertCallback( + void *pContext, /* Pointer to Fts5InsertCtx object */ + int tflags, + const char *pToken, /* Buffer containing token */ + int nToken, /* Size of token in bytes */ + int iUnused1, /* Start offset of token */ + int iUnused2 /* End offset of token */ +){ + Fts5InsertCtx *pCtx = (Fts5InsertCtx*)pContext; + Fts5Index *pIdx = pCtx->pStorage->pIndex; + UNUSED_PARAM2(iUnused1, iUnused2); + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; + if( (tflags & FTS5_TOKEN_COLOCATED)==0 || pCtx->szCol==0 ){ + pCtx->szCol++; + } + return sqlite3Fts5IndexWrite(pIdx, pCtx->iCol, pCtx->szCol-1, pToken, nToken); +} + +/* +** If a row with rowid iDel is present in the %_content table, add the +** delete-markers to the FTS index necessary to delete it. Do not actually +** remove the %_content row at this time though. +*/ +static int fts5StorageDeleteFromIndex( + Fts5Storage *p, + i64 iDel, + sqlite3_value **apVal +){ + Fts5Config *pConfig = p->pConfig; + sqlite3_stmt *pSeek = 0; /* SELECT to read row iDel from %_data */ + int rc; /* Return code */ + int rc2; /* sqlite3_reset() return code */ + int iCol; + Fts5InsertCtx ctx; + + if( apVal==0 ){ + rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP, &pSeek, 0); + if( rc!=SQLITE_OK ) return rc; + sqlite3_bind_int64(pSeek, 1, iDel); + if( sqlite3_step(pSeek)!=SQLITE_ROW ){ + return sqlite3_reset(pSeek); + } + } + + ctx.pStorage = p; + ctx.iCol = -1; + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 1, iDel); + for(iCol=1; rc==SQLITE_OK && iCol<=pConfig->nCol; iCol++){ + if( pConfig->abUnindexed[iCol-1]==0 ){ + const char *zText; + int nText; + if( pSeek ){ + zText = (const char*)sqlite3_column_text(pSeek, iCol); + nText = sqlite3_column_bytes(pSeek, iCol); + }else{ + zText = (const char*)sqlite3_value_text(apVal[iCol-1]); + nText = sqlite3_value_bytes(apVal[iCol-1]); + } + ctx.szCol = 0; + rc = sqlite3Fts5Tokenize(pConfig, FTS5_TOKENIZE_DOCUMENT, + zText, nText, (void*)&ctx, fts5StorageInsertCallback + ); + p->aTotalSize[iCol-1] -= (i64)ctx.szCol; + } + } + p->nTotalRow--; + + rc2 = sqlite3_reset(pSeek); + if( rc==SQLITE_OK ) rc = rc2; + return rc; +} + + +/* +** Insert a record into the %_docsize table. Specifically, do: +** +** INSERT OR REPLACE INTO %_docsize(id, sz) VALUES(iRowid, pBuf); +** +** If there is no %_docsize table (as happens if the columnsize=0 option +** is specified when the FTS5 table is created), this function is a no-op. +*/ +static int fts5StorageInsertDocsize( + Fts5Storage *p, /* Storage module to write to */ + i64 iRowid, /* id value */ + Fts5Buffer *pBuf /* sz value */ +){ + int rc = SQLITE_OK; + if( p->pConfig->bColumnsize ){ + sqlite3_stmt *pReplace = 0; + rc = fts5StorageGetStmt(p, FTS5_STMT_REPLACE_DOCSIZE, &pReplace, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pReplace, 1, iRowid); + sqlite3_bind_blob(pReplace, 2, pBuf->p, pBuf->n, SQLITE_STATIC); + sqlite3_step(pReplace); + rc = sqlite3_reset(pReplace); + sqlite3_bind_null(pReplace, 2); + } + } + return rc; +} + +/* +** Load the contents of the "averages" record from disk into the +** p->nTotalRow and p->aTotalSize[] variables. If successful, and if +** argument bCache is true, set the p->bTotalsValid flag to indicate +** that the contents of aTotalSize[] and nTotalRow are valid until +** further notice. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. +*/ +static int fts5StorageLoadTotals(Fts5Storage *p, int bCache){ + int rc = SQLITE_OK; + if( p->bTotalsValid==0 ){ + rc = sqlite3Fts5IndexGetAverages(p->pIndex, &p->nTotalRow, p->aTotalSize); + p->bTotalsValid = bCache; + } + return rc; +} + +/* +** Store the current contents of the p->nTotalRow and p->aTotalSize[] +** variables in the "averages" record on disk. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** occurs. +*/ +static int fts5StorageSaveTotals(Fts5Storage *p){ + int nCol = p->pConfig->nCol; + int i; + Fts5Buffer buf; + int rc = SQLITE_OK; + memset(&buf, 0, sizeof(buf)); + + sqlite3Fts5BufferAppendVarint(&rc, &buf, p->nTotalRow); + for(i=0; i<nCol; i++){ + sqlite3Fts5BufferAppendVarint(&rc, &buf, p->aTotalSize[i]); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexSetAverages(p->pIndex, buf.p, buf.n); + } + sqlite3_free(buf.p); + + return rc; +} + +/* +** Remove a row from the FTS table. +*/ +static int sqlite3Fts5StorageDelete(Fts5Storage *p, i64 iDel, sqlite3_value **apVal){ + Fts5Config *pConfig = p->pConfig; + int rc; + sqlite3_stmt *pDel = 0; + + assert( pConfig->eContent!=FTS5_CONTENT_NORMAL || apVal==0 ); + rc = fts5StorageLoadTotals(p, 1); + + /* Delete the index records */ + if( rc==SQLITE_OK ){ + rc = fts5StorageDeleteFromIndex(p, iDel, apVal); + } + + /* Delete the %_docsize record */ + if( rc==SQLITE_OK && pConfig->bColumnsize ){ + rc = fts5StorageGetStmt(p, FTS5_STMT_DELETE_DOCSIZE, &pDel, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDel, 1, iDel); + sqlite3_step(pDel); + rc = sqlite3_reset(pDel); + } + } + + /* Delete the %_content record */ + if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ + if( rc==SQLITE_OK ){ + rc = fts5StorageGetStmt(p, FTS5_STMT_DELETE_CONTENT, &pDel, 0); + } + if( rc==SQLITE_OK ){ + sqlite3_bind_int64(pDel, 1, iDel); + sqlite3_step(pDel); + rc = sqlite3_reset(pDel); + } + } + + return rc; +} + +/* +** Delete all entries in the FTS5 index. +*/ +static int sqlite3Fts5StorageDeleteAll(Fts5Storage *p){ + Fts5Config *pConfig = p->pConfig; + int rc; + + /* Delete the contents of the %_data and %_docsize tables. */ + rc = fts5ExecPrintf(pConfig->db, 0, + "DELETE FROM %Q.'%q_data';" + "DELETE FROM %Q.'%q_idx';", + pConfig->zDb, pConfig->zName, + pConfig->zDb, pConfig->zName + ); + if( rc==SQLITE_OK && pConfig->bColumnsize ){ + rc = fts5ExecPrintf(pConfig->db, 0, + "DELETE FROM %Q.'%q_docsize';", + pConfig->zDb, pConfig->zName + ); + } + + /* Reinitialize the %_data table. This call creates the initial structure + ** and averages records. */ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexReinit(p->pIndex); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageConfigValue(p, "version", 0, FTS5_CURRENT_VERSION); + } + return rc; +} + +static int sqlite3Fts5StorageRebuild(Fts5Storage *p){ + Fts5Buffer buf = {0,0,0}; + Fts5Config *pConfig = p->pConfig; + sqlite3_stmt *pScan = 0; + Fts5InsertCtx ctx; + int rc; + + memset(&ctx, 0, sizeof(Fts5InsertCtx)); + ctx.pStorage = p; + rc = sqlite3Fts5StorageDeleteAll(p); + if( rc==SQLITE_OK ){ + rc = fts5StorageLoadTotals(p, 1); + } + + if( rc==SQLITE_OK ){ + rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN, &pScan, 0); + } + + while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pScan) ){ + i64 iRowid = sqlite3_column_int64(pScan, 0); + + sqlite3Fts5BufferZero(&buf); + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 0, iRowid); + for(ctx.iCol=0; rc==SQLITE_OK && ctx.iCol<pConfig->nCol; ctx.iCol++){ + ctx.szCol = 0; + if( pConfig->abUnindexed[ctx.iCol]==0 ){ + rc = sqlite3Fts5Tokenize(pConfig, + FTS5_TOKENIZE_DOCUMENT, + (const char*)sqlite3_column_text(pScan, ctx.iCol+1), + sqlite3_column_bytes(pScan, ctx.iCol+1), + (void*)&ctx, + fts5StorageInsertCallback + ); + } + sqlite3Fts5BufferAppendVarint(&rc, &buf, ctx.szCol); + p->aTotalSize[ctx.iCol] += (i64)ctx.szCol; + } + p->nTotalRow++; + + if( rc==SQLITE_OK ){ + rc = fts5StorageInsertDocsize(p, iRowid, &buf); + } + } + sqlite3_free(buf.p); + + /* Write the averages record */ + if( rc==SQLITE_OK ){ + rc = fts5StorageSaveTotals(p); + } + return rc; +} + +static int sqlite3Fts5StorageOptimize(Fts5Storage *p){ + return sqlite3Fts5IndexOptimize(p->pIndex); +} + +static int sqlite3Fts5StorageMerge(Fts5Storage *p, int nMerge){ + return sqlite3Fts5IndexMerge(p->pIndex, nMerge); +} + +static int sqlite3Fts5StorageReset(Fts5Storage *p){ + return sqlite3Fts5IndexReset(p->pIndex); +} + +/* +** Allocate a new rowid. This is used for "external content" tables when +** a NULL value is inserted into the rowid column. The new rowid is allocated +** by inserting a dummy row into the %_docsize table. The dummy will be +** overwritten later. +** +** If the %_docsize table does not exist, SQLITE_MISMATCH is returned. In +** this case the user is required to provide a rowid explicitly. +*/ +static int fts5StorageNewRowid(Fts5Storage *p, i64 *piRowid){ + int rc = SQLITE_MISMATCH; + if( p->pConfig->bColumnsize ){ + sqlite3_stmt *pReplace = 0; + rc = fts5StorageGetStmt(p, FTS5_STMT_REPLACE_DOCSIZE, &pReplace, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_null(pReplace, 1); + sqlite3_bind_null(pReplace, 2); + sqlite3_step(pReplace); + rc = sqlite3_reset(pReplace); + } + if( rc==SQLITE_OK ){ + *piRowid = sqlite3_last_insert_rowid(p->pConfig->db); + } + } + return rc; +} + +/* +** Insert a new row into the FTS content table. +*/ +static int sqlite3Fts5StorageContentInsert( + Fts5Storage *p, + sqlite3_value **apVal, + i64 *piRowid +){ + Fts5Config *pConfig = p->pConfig; + int rc = SQLITE_OK; + + /* Insert the new row into the %_content table. */ + if( pConfig->eContent!=FTS5_CONTENT_NORMAL ){ + if( sqlite3_value_type(apVal[1])==SQLITE_INTEGER ){ + *piRowid = sqlite3_value_int64(apVal[1]); + }else{ + rc = fts5StorageNewRowid(p, piRowid); + } + }else{ + sqlite3_stmt *pInsert = 0; /* Statement to write %_content table */ + int i; /* Counter variable */ + rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0); + for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){ + rc = sqlite3_bind_value(pInsert, i, apVal[i]); + } + if( rc==SQLITE_OK ){ + sqlite3_step(pInsert); + rc = sqlite3_reset(pInsert); + } + *piRowid = sqlite3_last_insert_rowid(pConfig->db); + } + + return rc; +} + +/* +** Insert new entries into the FTS index and %_docsize table. +*/ +static int sqlite3Fts5StorageIndexInsert( + Fts5Storage *p, + sqlite3_value **apVal, + i64 iRowid +){ + Fts5Config *pConfig = p->pConfig; + int rc = SQLITE_OK; /* Return code */ + Fts5InsertCtx ctx; /* Tokenization callback context object */ + Fts5Buffer buf; /* Buffer used to build up %_docsize blob */ + + memset(&buf, 0, sizeof(Fts5Buffer)); + ctx.pStorage = p; + rc = fts5StorageLoadTotals(p, 1); + + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 0, iRowid); + } + for(ctx.iCol=0; rc==SQLITE_OK && ctx.iCol<pConfig->nCol; ctx.iCol++){ + ctx.szCol = 0; + if( pConfig->abUnindexed[ctx.iCol]==0 ){ + rc = sqlite3Fts5Tokenize(pConfig, + FTS5_TOKENIZE_DOCUMENT, + (const char*)sqlite3_value_text(apVal[ctx.iCol+2]), + sqlite3_value_bytes(apVal[ctx.iCol+2]), + (void*)&ctx, + fts5StorageInsertCallback + ); + } + sqlite3Fts5BufferAppendVarint(&rc, &buf, ctx.szCol); + p->aTotalSize[ctx.iCol] += (i64)ctx.szCol; + } + p->nTotalRow++; + + /* Write the %_docsize record */ + if( rc==SQLITE_OK ){ + rc = fts5StorageInsertDocsize(p, iRowid, &buf); + } + sqlite3_free(buf.p); + + return rc; +} + +static int fts5StorageCount(Fts5Storage *p, const char *zSuffix, i64 *pnRow){ + Fts5Config *pConfig = p->pConfig; + char *zSql; + int rc; + + zSql = sqlite3_mprintf("SELECT count(*) FROM %Q.'%q_%s'", + pConfig->zDb, pConfig->zName, zSuffix + ); + if( zSql==0 ){ + rc = SQLITE_NOMEM; + }else{ + sqlite3_stmt *pCnt = 0; + rc = sqlite3_prepare_v2(pConfig->db, zSql, -1, &pCnt, 0); + if( rc==SQLITE_OK ){ + if( SQLITE_ROW==sqlite3_step(pCnt) ){ + *pnRow = sqlite3_column_int64(pCnt, 0); + } + rc = sqlite3_finalize(pCnt); + } + } + + sqlite3_free(zSql); + return rc; +} + +/* +** Context object used by sqlite3Fts5StorageIntegrity(). +*/ +typedef struct Fts5IntegrityCtx Fts5IntegrityCtx; +struct Fts5IntegrityCtx { + i64 iRowid; + int iCol; + int szCol; + u64 cksum; + Fts5Termset *pTermset; + Fts5Config *pConfig; +}; + + +/* +** Tokenization callback used by integrity check. +*/ +static int fts5StorageIntegrityCallback( + void *pContext, /* Pointer to Fts5IntegrityCtx object */ + int tflags, + const char *pToken, /* Buffer containing token */ + int nToken, /* Size of token in bytes */ + int iUnused1, /* Start offset of token */ + int iUnused2 /* End offset of token */ +){ + Fts5IntegrityCtx *pCtx = (Fts5IntegrityCtx*)pContext; + Fts5Termset *pTermset = pCtx->pTermset; + int bPresent; + int ii; + int rc = SQLITE_OK; + int iPos; + int iCol; + + UNUSED_PARAM2(iUnused1, iUnused2); + if( nToken>FTS5_MAX_TOKEN_SIZE ) nToken = FTS5_MAX_TOKEN_SIZE; + + if( (tflags & FTS5_TOKEN_COLOCATED)==0 || pCtx->szCol==0 ){ + pCtx->szCol++; + } + + switch( pCtx->pConfig->eDetail ){ + case FTS5_DETAIL_FULL: + iPos = pCtx->szCol-1; + iCol = pCtx->iCol; + break; + + case FTS5_DETAIL_COLUMNS: + iPos = pCtx->iCol; + iCol = 0; + break; + + default: + assert( pCtx->pConfig->eDetail==FTS5_DETAIL_NONE ); + iPos = 0; + iCol = 0; + break; + } + + rc = sqlite3Fts5TermsetAdd(pTermset, 0, pToken, nToken, &bPresent); + if( rc==SQLITE_OK && bPresent==0 ){ + pCtx->cksum ^= sqlite3Fts5IndexEntryCksum( + pCtx->iRowid, iCol, iPos, 0, pToken, nToken + ); + } + + for(ii=0; rc==SQLITE_OK && ii<pCtx->pConfig->nPrefix; ii++){ + const int nChar = pCtx->pConfig->aPrefix[ii]; + int nByte = sqlite3Fts5IndexCharlenToBytelen(pToken, nToken, nChar); + if( nByte ){ + rc = sqlite3Fts5TermsetAdd(pTermset, ii+1, pToken, nByte, &bPresent); + if( bPresent==0 ){ + pCtx->cksum ^= sqlite3Fts5IndexEntryCksum( + pCtx->iRowid, iCol, iPos, ii+1, pToken, nByte + ); + } + } + } + + return rc; +} + +/* +** Check that the contents of the FTS index match that of the %_content +** table. Return SQLITE_OK if they do, or SQLITE_CORRUPT if not. Return +** some other SQLite error code if an error occurs while attempting to +** determine this. +*/ +static int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ + Fts5Config *pConfig = p->pConfig; + int rc; /* Return code */ + int *aColSize; /* Array of size pConfig->nCol */ + i64 *aTotalSize; /* Array of size pConfig->nCol */ + Fts5IntegrityCtx ctx; + sqlite3_stmt *pScan; + + memset(&ctx, 0, sizeof(Fts5IntegrityCtx)); + ctx.pConfig = p->pConfig; + aTotalSize = (i64*)sqlite3_malloc(pConfig->nCol * (sizeof(int)+sizeof(i64))); + if( !aTotalSize ) return SQLITE_NOMEM; + aColSize = (int*)&aTotalSize[pConfig->nCol]; + memset(aTotalSize, 0, sizeof(i64) * pConfig->nCol); + + /* Generate the expected index checksum based on the contents of the + ** %_content table. This block stores the checksum in ctx.cksum. */ + rc = fts5StorageGetStmt(p, FTS5_STMT_SCAN, &pScan, 0); + if( rc==SQLITE_OK ){ + int rc2; + while( SQLITE_ROW==sqlite3_step(pScan) ){ + int i; + ctx.iRowid = sqlite3_column_int64(pScan, 0); + ctx.szCol = 0; + if( pConfig->bColumnsize ){ + rc = sqlite3Fts5StorageDocsize(p, ctx.iRowid, aColSize); + } + if( rc==SQLITE_OK && pConfig->eDetail==FTS5_DETAIL_NONE ){ + rc = sqlite3Fts5TermsetNew(&ctx.pTermset); + } + for(i=0; rc==SQLITE_OK && i<pConfig->nCol; i++){ + if( pConfig->abUnindexed[i] ) continue; + ctx.iCol = i; + ctx.szCol = 0; + if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ + rc = sqlite3Fts5TermsetNew(&ctx.pTermset); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5Tokenize(pConfig, + FTS5_TOKENIZE_DOCUMENT, + (const char*)sqlite3_column_text(pScan, i+1), + sqlite3_column_bytes(pScan, i+1), + (void*)&ctx, + fts5StorageIntegrityCallback + ); + } + if( rc==SQLITE_OK && pConfig->bColumnsize && ctx.szCol!=aColSize[i] ){ + rc = FTS5_CORRUPT; + } + aTotalSize[i] += ctx.szCol; + if( pConfig->eDetail==FTS5_DETAIL_COLUMNS ){ + sqlite3Fts5TermsetFree(ctx.pTermset); + ctx.pTermset = 0; + } + } + sqlite3Fts5TermsetFree(ctx.pTermset); + ctx.pTermset = 0; + + if( rc!=SQLITE_OK ) break; + } + rc2 = sqlite3_reset(pScan); + if( rc==SQLITE_OK ) rc = rc2; + } + + /* Test that the "totals" (sometimes called "averages") record looks Ok */ + if( rc==SQLITE_OK ){ + int i; + rc = fts5StorageLoadTotals(p, 0); + for(i=0; rc==SQLITE_OK && i<pConfig->nCol; i++){ + if( p->aTotalSize[i]!=aTotalSize[i] ) rc = FTS5_CORRUPT; + } + } + + /* Check that the %_docsize and %_content tables contain the expected + ** number of rows. */ + if( rc==SQLITE_OK && pConfig->eContent==FTS5_CONTENT_NORMAL ){ + i64 nRow = 0; + rc = fts5StorageCount(p, "content", &nRow); + if( rc==SQLITE_OK && nRow!=p->nTotalRow ) rc = FTS5_CORRUPT; + } + if( rc==SQLITE_OK && pConfig->bColumnsize ){ + i64 nRow = 0; + rc = fts5StorageCount(p, "docsize", &nRow); + if( rc==SQLITE_OK && nRow!=p->nTotalRow ) rc = FTS5_CORRUPT; + } + + /* Pass the expected checksum down to the FTS index module. It will + ** verify, amongst other things, that it matches the checksum generated by + ** inspecting the index itself. */ + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexIntegrityCheck(p->pIndex, ctx.cksum); + } + + sqlite3_free(aTotalSize); + return rc; +} + +/* +** Obtain an SQLite statement handle that may be used to read data from the +** %_content table. +*/ +static int sqlite3Fts5StorageStmt( + Fts5Storage *p, + int eStmt, + sqlite3_stmt **pp, + char **pzErrMsg +){ + int rc; + assert( eStmt==FTS5_STMT_SCAN_ASC + || eStmt==FTS5_STMT_SCAN_DESC + || eStmt==FTS5_STMT_LOOKUP + ); + rc = fts5StorageGetStmt(p, eStmt, pp, pzErrMsg); + if( rc==SQLITE_OK ){ + assert( p->aStmt[eStmt]==*pp ); + p->aStmt[eStmt] = 0; + } + return rc; +} + +/* +** Release an SQLite statement handle obtained via an earlier call to +** sqlite3Fts5StorageStmt(). The eStmt parameter passed to this function +** must match that passed to the sqlite3Fts5StorageStmt() call. +*/ +static void sqlite3Fts5StorageStmtRelease( + Fts5Storage *p, + int eStmt, + sqlite3_stmt *pStmt +){ + assert( eStmt==FTS5_STMT_SCAN_ASC + || eStmt==FTS5_STMT_SCAN_DESC + || eStmt==FTS5_STMT_LOOKUP + ); + if( p->aStmt[eStmt]==0 ){ + sqlite3_reset(pStmt); + p->aStmt[eStmt] = pStmt; + }else{ + sqlite3_finalize(pStmt); + } +} + +static int fts5StorageDecodeSizeArray( + int *aCol, int nCol, /* Array to populate */ + const u8 *aBlob, int nBlob /* Record to read varints from */ +){ + int i; + int iOff = 0; + for(i=0; i<nCol; i++){ + if( iOff>=nBlob ) return 1; + iOff += fts5GetVarint32(&aBlob[iOff], aCol[i]); + } + return (iOff!=nBlob); +} + +/* +** Argument aCol points to an array of integers containing one entry for +** each table column. This function reads the %_docsize record for the +** specified rowid and populates aCol[] with the results. +** +** An SQLite error code is returned if an error occurs, or SQLITE_OK +** otherwise. +*/ +static int sqlite3Fts5StorageDocsize(Fts5Storage *p, i64 iRowid, int *aCol){ + int nCol = p->pConfig->nCol; /* Number of user columns in table */ + sqlite3_stmt *pLookup = 0; /* Statement to query %_docsize */ + int rc; /* Return Code */ + + assert( p->pConfig->bColumnsize ); + rc = fts5StorageGetStmt(p, FTS5_STMT_LOOKUP_DOCSIZE, &pLookup, 0); + if( rc==SQLITE_OK ){ + int bCorrupt = 1; + sqlite3_bind_int64(pLookup, 1, iRowid); + if( SQLITE_ROW==sqlite3_step(pLookup) ){ + const u8 *aBlob = sqlite3_column_blob(pLookup, 0); + int nBlob = sqlite3_column_bytes(pLookup, 0); + if( 0==fts5StorageDecodeSizeArray(aCol, nCol, aBlob, nBlob) ){ + bCorrupt = 0; + } + } + rc = sqlite3_reset(pLookup); + if( bCorrupt && rc==SQLITE_OK ){ + rc = FTS5_CORRUPT; + } + } + + return rc; +} + +static int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnToken){ + int rc = fts5StorageLoadTotals(p, 0); + if( rc==SQLITE_OK ){ + *pnToken = 0; + if( iCol<0 ){ + int i; + for(i=0; i<p->pConfig->nCol; i++){ + *pnToken += p->aTotalSize[i]; + } + }else if( iCol<p->pConfig->nCol ){ + *pnToken = p->aTotalSize[iCol]; + }else{ + rc = SQLITE_RANGE; + } + } + return rc; +} + +static int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){ + int rc = fts5StorageLoadTotals(p, 0); + if( rc==SQLITE_OK ){ + *pnRow = p->nTotalRow; + } + return rc; +} + +/* +** Flush any data currently held in-memory to disk. +*/ +static int sqlite3Fts5StorageSync(Fts5Storage *p){ + int rc = SQLITE_OK; + i64 iLastRowid = sqlite3_last_insert_rowid(p->pConfig->db); + if( p->bTotalsValid ){ + rc = fts5StorageSaveTotals(p); + p->bTotalsValid = 0; + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexSync(p->pIndex); + } + sqlite3_set_last_insert_rowid(p->pConfig->db, iLastRowid); + return rc; +} + +static int sqlite3Fts5StorageRollback(Fts5Storage *p){ + p->bTotalsValid = 0; + return sqlite3Fts5IndexRollback(p->pIndex); +} + +static int sqlite3Fts5StorageConfigValue( + Fts5Storage *p, + const char *z, + sqlite3_value *pVal, + int iVal +){ + sqlite3_stmt *pReplace = 0; + int rc = fts5StorageGetStmt(p, FTS5_STMT_REPLACE_CONFIG, &pReplace, 0); + if( rc==SQLITE_OK ){ + sqlite3_bind_text(pReplace, 1, z, -1, SQLITE_STATIC); + if( pVal ){ + sqlite3_bind_value(pReplace, 2, pVal); + }else{ + sqlite3_bind_int(pReplace, 2, iVal); + } + sqlite3_step(pReplace); + rc = sqlite3_reset(pReplace); + sqlite3_bind_null(pReplace, 1); + } + if( rc==SQLITE_OK && pVal ){ + int iNew = p->pConfig->iCookie + 1; + rc = sqlite3Fts5IndexSetCookie(p->pIndex, iNew); + if( rc==SQLITE_OK ){ + p->pConfig->iCookie = iNew; + } + } + return rc; +} + +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +*/ + + +/* #include "fts5Int.h" */ + +/************************************************************************** +** Start of ascii tokenizer implementation. +*/ + +/* +** For tokenizers with no "unicode" modifier, the set of token characters +** is the same as the set of ASCII range alphanumeric characters. +*/ +static unsigned char aAsciiTokenChar[128] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00..0x0F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10..0x1F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20..0x2F */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0x30..0x3F */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40..0x4F */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 0x50..0x5F */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60..0x6F */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, /* 0x70..0x7F */ +}; + +typedef struct AsciiTokenizer AsciiTokenizer; +struct AsciiTokenizer { + unsigned char aTokenChar[128]; +}; + +static void fts5AsciiAddExceptions( + AsciiTokenizer *p, + const char *zArg, + int bTokenChars +){ + int i; + for(i=0; zArg[i]; i++){ + if( (zArg[i] & 0x80)==0 ){ + p->aTokenChar[(int)zArg[i]] = (unsigned char)bTokenChars; + } + } +} + +/* +** Delete a "ascii" tokenizer. +*/ +static void fts5AsciiDelete(Fts5Tokenizer *p){ + sqlite3_free(p); +} + +/* +** Create an "ascii" tokenizer. +*/ +static int fts5AsciiCreate( + void *pUnused, + const char **azArg, int nArg, + Fts5Tokenizer **ppOut +){ + int rc = SQLITE_OK; + AsciiTokenizer *p = 0; + UNUSED_PARAM(pUnused); + if( nArg%2 ){ + rc = SQLITE_ERROR; + }else{ + p = sqlite3_malloc(sizeof(AsciiTokenizer)); + if( p==0 ){ + rc = SQLITE_NOMEM; + }else{ + int i; + memset(p, 0, sizeof(AsciiTokenizer)); + memcpy(p->aTokenChar, aAsciiTokenChar, sizeof(aAsciiTokenChar)); + for(i=0; rc==SQLITE_OK && i<nArg; i+=2){ + const char *zArg = azArg[i+1]; + if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){ + fts5AsciiAddExceptions(p, zArg, 1); + }else + if( 0==sqlite3_stricmp(azArg[i], "separators") ){ + fts5AsciiAddExceptions(p, zArg, 0); + }else{ + rc = SQLITE_ERROR; + } + } + if( rc!=SQLITE_OK ){ + fts5AsciiDelete((Fts5Tokenizer*)p); + p = 0; + } + } + } + + *ppOut = (Fts5Tokenizer*)p; + return rc; +} + + +static void asciiFold(char *aOut, const char *aIn, int nByte){ + int i; + for(i=0; i<nByte; i++){ + char c = aIn[i]; + if( c>='A' && c<='Z' ) c += 32; + aOut[i] = c; + } +} + +/* +** Tokenize some text using the ascii tokenizer. +*/ +static int fts5AsciiTokenize( + Fts5Tokenizer *pTokenizer, + void *pCtx, + int iUnused, + const char *pText, int nText, + int (*xToken)(void*, int, const char*, int nToken, int iStart, int iEnd) +){ + AsciiTokenizer *p = (AsciiTokenizer*)pTokenizer; + int rc = SQLITE_OK; + int ie; + int is = 0; + + char aFold[64]; + int nFold = sizeof(aFold); + char *pFold = aFold; + unsigned char *a = p->aTokenChar; + + UNUSED_PARAM(iUnused); + + while( is<nText && rc==SQLITE_OK ){ + int nByte; + + /* Skip any leading divider characters. */ + while( is<nText && ((pText[is]&0x80)==0 && a[(int)pText[is]]==0) ){ + is++; + } + if( is==nText ) break; + + /* Count the token characters */ + ie = is+1; + while( ie<nText && ((pText[ie]&0x80) || a[(int)pText[ie]] ) ){ + ie++; + } + + /* Fold to lower case */ + nByte = ie-is; + if( nByte>nFold ){ + if( pFold!=aFold ) sqlite3_free(pFold); + pFold = sqlite3_malloc(nByte*2); + if( pFold==0 ){ + rc = SQLITE_NOMEM; + break; + } + nFold = nByte*2; + } + asciiFold(pFold, &pText[is], nByte); + + /* Invoke the token callback */ + rc = xToken(pCtx, 0, pFold, nByte, is, ie); + is = ie+1; + } + + if( pFold!=aFold ) sqlite3_free(pFold); + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + return rc; +} + +/************************************************************************** +** Start of unicode61 tokenizer implementation. +*/ + + +/* +** The following two macros - READ_UTF8 and WRITE_UTF8 - have been copied +** from the sqlite3 source file utf.c. If this file is compiled as part +** of the amalgamation, they are not required. +*/ +#ifndef SQLITE_AMALGAMATION + +static const unsigned char sqlite3Utf8Trans1[] = { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00, +}; + +#define READ_UTF8(zIn, zTerm, c) \ + c = *(zIn++); \ + if( c>=0xc0 ){ \ + c = sqlite3Utf8Trans1[c-0xc0]; \ + while( zIn!=zTerm && (*zIn & 0xc0)==0x80 ){ \ + c = (c<<6) + (0x3f & *(zIn++)); \ + } \ + if( c<0x80 \ + || (c&0xFFFFF800)==0xD800 \ + || (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \ + } + + +#define WRITE_UTF8(zOut, c) { \ + if( c<0x00080 ){ \ + *zOut++ = (unsigned char)(c&0xFF); \ + } \ + else if( c<0x00800 ){ \ + *zOut++ = 0xC0 + (unsigned char)((c>>6)&0x1F); \ + *zOut++ = 0x80 + (unsigned char)(c & 0x3F); \ + } \ + else if( c<0x10000 ){ \ + *zOut++ = 0xE0 + (unsigned char)((c>>12)&0x0F); \ + *zOut++ = 0x80 + (unsigned char)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (unsigned char)(c & 0x3F); \ + }else{ \ + *zOut++ = 0xF0 + (unsigned char)((c>>18) & 0x07); \ + *zOut++ = 0x80 + (unsigned char)((c>>12) & 0x3F); \ + *zOut++ = 0x80 + (unsigned char)((c>>6) & 0x3F); \ + *zOut++ = 0x80 + (unsigned char)(c & 0x3F); \ + } \ +} + +#endif /* ifndef SQLITE_AMALGAMATION */ + +typedef struct Unicode61Tokenizer Unicode61Tokenizer; +struct Unicode61Tokenizer { + unsigned char aTokenChar[128]; /* ASCII range token characters */ + char *aFold; /* Buffer to fold text into */ + int nFold; /* Size of aFold[] in bytes */ + int bRemoveDiacritic; /* True if remove_diacritics=1 is set */ + int nException; + int *aiException; +}; + +static int fts5UnicodeAddExceptions( + Unicode61Tokenizer *p, /* Tokenizer object */ + const char *z, /* Characters to treat as exceptions */ + int bTokenChars /* 1 for 'tokenchars', 0 for 'separators' */ +){ + int rc = SQLITE_OK; + int n = (int)strlen(z); + int *aNew; + + if( n>0 ){ + aNew = (int*)sqlite3_realloc(p->aiException, (n+p->nException)*sizeof(int)); + if( aNew ){ + int nNew = p->nException; + const unsigned char *zCsr = (const unsigned char*)z; + const unsigned char *zTerm = (const unsigned char*)&z[n]; + while( zCsr<zTerm ){ + int iCode; + int bToken; + READ_UTF8(zCsr, zTerm, iCode); + if( iCode<128 ){ + p->aTokenChar[iCode] = (unsigned char)bTokenChars; + }else{ + bToken = sqlite3Fts5UnicodeIsalnum(iCode); + assert( (bToken==0 || bToken==1) ); + assert( (bTokenChars==0 || bTokenChars==1) ); + if( bToken!=bTokenChars && sqlite3Fts5UnicodeIsdiacritic(iCode)==0 ){ + int i; + for(i=0; i<nNew; i++){ + if( aNew[i]>iCode ) break; + } + memmove(&aNew[i+1], &aNew[i], (nNew-i)*sizeof(int)); + aNew[i] = iCode; + nNew++; + } + } + } + p->aiException = aNew; + p->nException = nNew; + }else{ + rc = SQLITE_NOMEM; + } + } + + return rc; +} + +/* +** Return true if the p->aiException[] array contains the value iCode. +*/ +static int fts5UnicodeIsException(Unicode61Tokenizer *p, int iCode){ + if( p->nException>0 ){ + int *a = p->aiException; + int iLo = 0; + int iHi = p->nException-1; + + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( iCode==a[iTest] ){ + return 1; + }else if( iCode>a[iTest] ){ + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + } + + return 0; +} + +/* +** Delete a "unicode61" tokenizer. +*/ +static void fts5UnicodeDelete(Fts5Tokenizer *pTok){ + if( pTok ){ + Unicode61Tokenizer *p = (Unicode61Tokenizer*)pTok; + sqlite3_free(p->aiException); + sqlite3_free(p->aFold); + sqlite3_free(p); + } + return; +} + +/* +** Create a "unicode61" tokenizer. +*/ +static int fts5UnicodeCreate( + void *pUnused, + const char **azArg, int nArg, + Fts5Tokenizer **ppOut +){ + int rc = SQLITE_OK; /* Return code */ + Unicode61Tokenizer *p = 0; /* New tokenizer object */ + + UNUSED_PARAM(pUnused); + + if( nArg%2 ){ + rc = SQLITE_ERROR; + }else{ + p = (Unicode61Tokenizer*)sqlite3_malloc(sizeof(Unicode61Tokenizer)); + if( p ){ + int i; + memset(p, 0, sizeof(Unicode61Tokenizer)); + memcpy(p->aTokenChar, aAsciiTokenChar, sizeof(aAsciiTokenChar)); + p->bRemoveDiacritic = 1; + p->nFold = 64; + p->aFold = sqlite3_malloc(p->nFold * sizeof(char)); + if( p->aFold==0 ){ + rc = SQLITE_NOMEM; + } + for(i=0; rc==SQLITE_OK && i<nArg; i+=2){ + const char *zArg = azArg[i+1]; + if( 0==sqlite3_stricmp(azArg[i], "remove_diacritics") ){ + if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1] ){ + rc = SQLITE_ERROR; + } + p->bRemoveDiacritic = (zArg[0]=='1'); + }else + if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){ + rc = fts5UnicodeAddExceptions(p, zArg, 1); + }else + if( 0==sqlite3_stricmp(azArg[i], "separators") ){ + rc = fts5UnicodeAddExceptions(p, zArg, 0); + }else{ + rc = SQLITE_ERROR; + } + } + }else{ + rc = SQLITE_NOMEM; + } + if( rc!=SQLITE_OK ){ + fts5UnicodeDelete((Fts5Tokenizer*)p); + p = 0; + } + *ppOut = (Fts5Tokenizer*)p; + } + return rc; +} + +/* +** Return true if, for the purposes of tokenizing with the tokenizer +** passed as the first argument, codepoint iCode is considered a token +** character (not a separator). +*/ +static int fts5UnicodeIsAlnum(Unicode61Tokenizer *p, int iCode){ + assert( (sqlite3Fts5UnicodeIsalnum(iCode) & 0xFFFFFFFE)==0 ); + return sqlite3Fts5UnicodeIsalnum(iCode) ^ fts5UnicodeIsException(p, iCode); +} + +static int fts5UnicodeTokenize( + Fts5Tokenizer *pTokenizer, + void *pCtx, + int iUnused, + const char *pText, int nText, + int (*xToken)(void*, int, const char*, int nToken, int iStart, int iEnd) +){ + Unicode61Tokenizer *p = (Unicode61Tokenizer*)pTokenizer; + int rc = SQLITE_OK; + unsigned char *a = p->aTokenChar; + + unsigned char *zTerm = (unsigned char*)&pText[nText]; + unsigned char *zCsr = (unsigned char *)pText; + + /* Output buffer */ + char *aFold = p->aFold; + int nFold = p->nFold; + const char *pEnd = &aFold[nFold-6]; + + UNUSED_PARAM(iUnused); + + /* Each iteration of this loop gobbles up a contiguous run of separators, + ** then the next token. */ + while( rc==SQLITE_OK ){ + int iCode; /* non-ASCII codepoint read from input */ + char *zOut = aFold; + int is; + int ie; + + /* Skip any separator characters. */ + while( 1 ){ + if( zCsr>=zTerm ) goto tokenize_done; + if( *zCsr & 0x80 ) { + /* A character outside of the ascii range. Skip past it if it is + ** a separator character. Or break out of the loop if it is not. */ + is = zCsr - (unsigned char*)pText; + READ_UTF8(zCsr, zTerm, iCode); + if( fts5UnicodeIsAlnum(p, iCode) ){ + goto non_ascii_tokenchar; + } + }else{ + if( a[*zCsr] ){ + is = zCsr - (unsigned char*)pText; + goto ascii_tokenchar; + } + zCsr++; + } + } + + /* Run through the tokenchars. Fold them into the output buffer along + ** the way. */ + while( zCsr<zTerm ){ + + /* Grow the output buffer so that there is sufficient space to fit the + ** largest possible utf-8 character. */ + if( zOut>pEnd ){ + aFold = sqlite3_malloc(nFold*2); + if( aFold==0 ){ + rc = SQLITE_NOMEM; + goto tokenize_done; + } + zOut = &aFold[zOut - p->aFold]; + memcpy(aFold, p->aFold, nFold); + sqlite3_free(p->aFold); + p->aFold = aFold; + p->nFold = nFold = nFold*2; + pEnd = &aFold[nFold-6]; + } + + if( *zCsr & 0x80 ){ + /* An non-ascii-range character. Fold it into the output buffer if + ** it is a token character, or break out of the loop if it is not. */ + READ_UTF8(zCsr, zTerm, iCode); + if( fts5UnicodeIsAlnum(p,iCode)||sqlite3Fts5UnicodeIsdiacritic(iCode) ){ + non_ascii_tokenchar: + iCode = sqlite3Fts5UnicodeFold(iCode, p->bRemoveDiacritic); + if( iCode ) WRITE_UTF8(zOut, iCode); + }else{ + break; + } + }else if( a[*zCsr]==0 ){ + /* An ascii-range separator character. End of token. */ + break; + }else{ + ascii_tokenchar: + if( *zCsr>='A' && *zCsr<='Z' ){ + *zOut++ = *zCsr + 32; + }else{ + *zOut++ = *zCsr; + } + zCsr++; + } + ie = zCsr - (unsigned char*)pText; + } + + /* Invoke the token callback */ + rc = xToken(pCtx, 0, aFold, zOut-aFold, is, ie); + } + + tokenize_done: + if( rc==SQLITE_DONE ) rc = SQLITE_OK; + return rc; +} + +/************************************************************************** +** Start of porter stemmer implementation. +*/ + +/* Any tokens larger than this (in bytes) are passed through without +** stemming. */ +#define FTS5_PORTER_MAX_TOKEN 64 + +typedef struct PorterTokenizer PorterTokenizer; +struct PorterTokenizer { + fts5_tokenizer tokenizer; /* Parent tokenizer module */ + Fts5Tokenizer *pTokenizer; /* Parent tokenizer instance */ + char aBuf[FTS5_PORTER_MAX_TOKEN + 64]; +}; + +/* +** Delete a "porter" tokenizer. +*/ +static void fts5PorterDelete(Fts5Tokenizer *pTok){ + if( pTok ){ + PorterTokenizer *p = (PorterTokenizer*)pTok; + if( p->pTokenizer ){ + p->tokenizer.xDelete(p->pTokenizer); + } + sqlite3_free(p); + } +} + +/* +** Create a "porter" tokenizer. +*/ +static int fts5PorterCreate( + void *pCtx, + const char **azArg, int nArg, + Fts5Tokenizer **ppOut +){ + fts5_api *pApi = (fts5_api*)pCtx; + int rc = SQLITE_OK; + PorterTokenizer *pRet; + void *pUserdata = 0; + const char *zBase = "unicode61"; + + if( nArg>0 ){ + zBase = azArg[0]; + } + + pRet = (PorterTokenizer*)sqlite3_malloc(sizeof(PorterTokenizer)); + if( pRet ){ + memset(pRet, 0, sizeof(PorterTokenizer)); + rc = pApi->xFindTokenizer(pApi, zBase, &pUserdata, &pRet->tokenizer); + }else{ + rc = SQLITE_NOMEM; + } + if( rc==SQLITE_OK ){ + int nArg2 = (nArg>0 ? nArg-1 : 0); + const char **azArg2 = (nArg2 ? &azArg[1] : 0); + rc = pRet->tokenizer.xCreate(pUserdata, azArg2, nArg2, &pRet->pTokenizer); + } + + if( rc!=SQLITE_OK ){ + fts5PorterDelete((Fts5Tokenizer*)pRet); + pRet = 0; + } + *ppOut = (Fts5Tokenizer*)pRet; + return rc; +} + +typedef struct PorterContext PorterContext; +struct PorterContext { + void *pCtx; + int (*xToken)(void*, int, const char*, int, int, int); + char *aBuf; +}; + +typedef struct PorterRule PorterRule; +struct PorterRule { + const char *zSuffix; + int nSuffix; + int (*xCond)(char *zStem, int nStem); + const char *zOutput; + int nOutput; +}; + +#if 0 +static int fts5PorterApply(char *aBuf, int *pnBuf, PorterRule *aRule){ + int ret = -1; + int nBuf = *pnBuf; + PorterRule *p; + + for(p=aRule; p->zSuffix; p++){ + assert( strlen(p->zSuffix)==p->nSuffix ); + assert( strlen(p->zOutput)==p->nOutput ); + if( nBuf<p->nSuffix ) continue; + if( 0==memcmp(&aBuf[nBuf - p->nSuffix], p->zSuffix, p->nSuffix) ) break; + } + + if( p->zSuffix ){ + int nStem = nBuf - p->nSuffix; + if( p->xCond==0 || p->xCond(aBuf, nStem) ){ + memcpy(&aBuf[nStem], p->zOutput, p->nOutput); + *pnBuf = nStem + p->nOutput; + ret = p - aRule; + } + } + + return ret; +} +#endif + +static int fts5PorterIsVowel(char c, int bYIsVowel){ + return ( + c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || (bYIsVowel && c=='y') + ); +} + +static int fts5PorterGobbleVC(char *zStem, int nStem, int bPrevCons){ + int i; + int bCons = bPrevCons; + + /* Scan for a vowel */ + for(i=0; i<nStem; i++){ + if( 0==(bCons = !fts5PorterIsVowel(zStem[i], bCons)) ) break; + } + + /* Scan for a consonent */ + for(i++; i<nStem; i++){ + if( (bCons = !fts5PorterIsVowel(zStem[i], bCons)) ) return i+1; + } + return 0; +} + +/* porter rule condition: (m > 0) */ +static int fts5Porter_MGt0(char *zStem, int nStem){ + return !!fts5PorterGobbleVC(zStem, nStem, 0); +} + +/* porter rule condition: (m > 1) */ +static int fts5Porter_MGt1(char *zStem, int nStem){ + int n; + n = fts5PorterGobbleVC(zStem, nStem, 0); + if( n && fts5PorterGobbleVC(&zStem[n], nStem-n, 1) ){ + return 1; + } + return 0; +} + +/* porter rule condition: (m = 1) */ +static int fts5Porter_MEq1(char *zStem, int nStem){ + int n; + n = fts5PorterGobbleVC(zStem, nStem, 0); + if( n && 0==fts5PorterGobbleVC(&zStem[n], nStem-n, 1) ){ + return 1; + } + return 0; +} + +/* porter rule condition: (*o) */ +static int fts5Porter_Ostar(char *zStem, int nStem){ + if( zStem[nStem-1]=='w' || zStem[nStem-1]=='x' || zStem[nStem-1]=='y' ){ + return 0; + }else{ + int i; + int mask = 0; + int bCons = 0; + for(i=0; i<nStem; i++){ + bCons = !fts5PorterIsVowel(zStem[i], bCons); + assert( bCons==0 || bCons==1 ); + mask = (mask << 1) + bCons; + } + return ((mask & 0x0007)==0x0005); + } +} + +/* porter rule condition: (m > 1 and (*S or *T)) */ +static int fts5Porter_MGt1_and_S_or_T(char *zStem, int nStem){ + assert( nStem>0 ); + return (zStem[nStem-1]=='s' || zStem[nStem-1]=='t') + && fts5Porter_MGt1(zStem, nStem); +} + +/* porter rule condition: (*v*) */ +static int fts5Porter_Vowel(char *zStem, int nStem){ + int i; + for(i=0; i<nStem; i++){ + if( fts5PorterIsVowel(zStem[i], i>0) ){ + return 1; + } + } + return 0; +} + + +/************************************************************************** +*************************************************************************** +** GENERATED CODE STARTS HERE (mkportersteps.tcl) +*/ + +static int fts5PorterStep4(char *aBuf, int *pnBuf){ + int ret = 0; + int nBuf = *pnBuf; + switch( aBuf[nBuf-2] ){ + + case 'a': + if( nBuf>2 && 0==memcmp("al", &aBuf[nBuf-2], 2) ){ + if( fts5Porter_MGt1(aBuf, nBuf-2) ){ + *pnBuf = nBuf - 2; + } + } + break; + + case 'c': + if( nBuf>4 && 0==memcmp("ance", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt1(aBuf, nBuf-4) ){ + *pnBuf = nBuf - 4; + } + }else if( nBuf>4 && 0==memcmp("ence", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt1(aBuf, nBuf-4) ){ + *pnBuf = nBuf - 4; + } + } + break; + + case 'e': + if( nBuf>2 && 0==memcmp("er", &aBuf[nBuf-2], 2) ){ + if( fts5Porter_MGt1(aBuf, nBuf-2) ){ + *pnBuf = nBuf - 2; + } + } + break; + + case 'i': + if( nBuf>2 && 0==memcmp("ic", &aBuf[nBuf-2], 2) ){ + if( fts5Porter_MGt1(aBuf, nBuf-2) ){ + *pnBuf = nBuf - 2; + } + } + break; + + case 'l': + if( nBuf>4 && 0==memcmp("able", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt1(aBuf, nBuf-4) ){ + *pnBuf = nBuf - 4; + } + }else if( nBuf>4 && 0==memcmp("ible", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt1(aBuf, nBuf-4) ){ + *pnBuf = nBuf - 4; + } + } + break; + + case 'n': + if( nBuf>3 && 0==memcmp("ant", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + }else if( nBuf>5 && 0==memcmp("ement", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt1(aBuf, nBuf-5) ){ + *pnBuf = nBuf - 5; + } + }else if( nBuf>4 && 0==memcmp("ment", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt1(aBuf, nBuf-4) ){ + *pnBuf = nBuf - 4; + } + }else if( nBuf>3 && 0==memcmp("ent", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + } + break; + + case 'o': + if( nBuf>3 && 0==memcmp("ion", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1_and_S_or_T(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + }else if( nBuf>2 && 0==memcmp("ou", &aBuf[nBuf-2], 2) ){ + if( fts5Porter_MGt1(aBuf, nBuf-2) ){ + *pnBuf = nBuf - 2; + } + } + break; + + case 's': + if( nBuf>3 && 0==memcmp("ism", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + } + break; + + case 't': + if( nBuf>3 && 0==memcmp("ate", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + }else if( nBuf>3 && 0==memcmp("iti", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + } + break; + + case 'u': + if( nBuf>3 && 0==memcmp("ous", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + } + break; + + case 'v': + if( nBuf>3 && 0==memcmp("ive", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + } + break; + + case 'z': + if( nBuf>3 && 0==memcmp("ize", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt1(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + } + break; + + } + return ret; +} + + +static int fts5PorterStep1B2(char *aBuf, int *pnBuf){ + int ret = 0; + int nBuf = *pnBuf; + switch( aBuf[nBuf-2] ){ + + case 'a': + if( nBuf>2 && 0==memcmp("at", &aBuf[nBuf-2], 2) ){ + memcpy(&aBuf[nBuf-2], "ate", 3); + *pnBuf = nBuf - 2 + 3; + ret = 1; + } + break; + + case 'b': + if( nBuf>2 && 0==memcmp("bl", &aBuf[nBuf-2], 2) ){ + memcpy(&aBuf[nBuf-2], "ble", 3); + *pnBuf = nBuf - 2 + 3; + ret = 1; + } + break; + + case 'i': + if( nBuf>2 && 0==memcmp("iz", &aBuf[nBuf-2], 2) ){ + memcpy(&aBuf[nBuf-2], "ize", 3); + *pnBuf = nBuf - 2 + 3; + ret = 1; + } + break; + + } + return ret; +} + + +static int fts5PorterStep2(char *aBuf, int *pnBuf){ + int ret = 0; + int nBuf = *pnBuf; + switch( aBuf[nBuf-2] ){ + + case 'a': + if( nBuf>7 && 0==memcmp("ational", &aBuf[nBuf-7], 7) ){ + if( fts5Porter_MGt0(aBuf, nBuf-7) ){ + memcpy(&aBuf[nBuf-7], "ate", 3); + *pnBuf = nBuf - 7 + 3; + } + }else if( nBuf>6 && 0==memcmp("tional", &aBuf[nBuf-6], 6) ){ + if( fts5Porter_MGt0(aBuf, nBuf-6) ){ + memcpy(&aBuf[nBuf-6], "tion", 4); + *pnBuf = nBuf - 6 + 4; + } + } + break; + + case 'c': + if( nBuf>4 && 0==memcmp("enci", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + memcpy(&aBuf[nBuf-4], "ence", 4); + *pnBuf = nBuf - 4 + 4; + } + }else if( nBuf>4 && 0==memcmp("anci", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + memcpy(&aBuf[nBuf-4], "ance", 4); + *pnBuf = nBuf - 4 + 4; + } + } + break; + + case 'e': + if( nBuf>4 && 0==memcmp("izer", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + memcpy(&aBuf[nBuf-4], "ize", 3); + *pnBuf = nBuf - 4 + 3; + } + } + break; + + case 'g': + if( nBuf>4 && 0==memcmp("logi", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + memcpy(&aBuf[nBuf-4], "log", 3); + *pnBuf = nBuf - 4 + 3; + } + } + break; + + case 'l': + if( nBuf>3 && 0==memcmp("bli", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt0(aBuf, nBuf-3) ){ + memcpy(&aBuf[nBuf-3], "ble", 3); + *pnBuf = nBuf - 3 + 3; + } + }else if( nBuf>4 && 0==memcmp("alli", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + memcpy(&aBuf[nBuf-4], "al", 2); + *pnBuf = nBuf - 4 + 2; + } + }else if( nBuf>5 && 0==memcmp("entli", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "ent", 3); + *pnBuf = nBuf - 5 + 3; + } + }else if( nBuf>3 && 0==memcmp("eli", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt0(aBuf, nBuf-3) ){ + memcpy(&aBuf[nBuf-3], "e", 1); + *pnBuf = nBuf - 3 + 1; + } + }else if( nBuf>5 && 0==memcmp("ousli", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "ous", 3); + *pnBuf = nBuf - 5 + 3; + } + } + break; + + case 'o': + if( nBuf>7 && 0==memcmp("ization", &aBuf[nBuf-7], 7) ){ + if( fts5Porter_MGt0(aBuf, nBuf-7) ){ + memcpy(&aBuf[nBuf-7], "ize", 3); + *pnBuf = nBuf - 7 + 3; + } + }else if( nBuf>5 && 0==memcmp("ation", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "ate", 3); + *pnBuf = nBuf - 5 + 3; + } + }else if( nBuf>4 && 0==memcmp("ator", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + memcpy(&aBuf[nBuf-4], "ate", 3); + *pnBuf = nBuf - 4 + 3; + } + } + break; + + case 's': + if( nBuf>5 && 0==memcmp("alism", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "al", 2); + *pnBuf = nBuf - 5 + 2; + } + }else if( nBuf>7 && 0==memcmp("iveness", &aBuf[nBuf-7], 7) ){ + if( fts5Porter_MGt0(aBuf, nBuf-7) ){ + memcpy(&aBuf[nBuf-7], "ive", 3); + *pnBuf = nBuf - 7 + 3; + } + }else if( nBuf>7 && 0==memcmp("fulness", &aBuf[nBuf-7], 7) ){ + if( fts5Porter_MGt0(aBuf, nBuf-7) ){ + memcpy(&aBuf[nBuf-7], "ful", 3); + *pnBuf = nBuf - 7 + 3; + } + }else if( nBuf>7 && 0==memcmp("ousness", &aBuf[nBuf-7], 7) ){ + if( fts5Porter_MGt0(aBuf, nBuf-7) ){ + memcpy(&aBuf[nBuf-7], "ous", 3); + *pnBuf = nBuf - 7 + 3; + } + } + break; + + case 't': + if( nBuf>5 && 0==memcmp("aliti", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "al", 2); + *pnBuf = nBuf - 5 + 2; + } + }else if( nBuf>5 && 0==memcmp("iviti", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "ive", 3); + *pnBuf = nBuf - 5 + 3; + } + }else if( nBuf>6 && 0==memcmp("biliti", &aBuf[nBuf-6], 6) ){ + if( fts5Porter_MGt0(aBuf, nBuf-6) ){ + memcpy(&aBuf[nBuf-6], "ble", 3); + *pnBuf = nBuf - 6 + 3; + } + } + break; + + } + return ret; +} + + +static int fts5PorterStep3(char *aBuf, int *pnBuf){ + int ret = 0; + int nBuf = *pnBuf; + switch( aBuf[nBuf-2] ){ + + case 'a': + if( nBuf>4 && 0==memcmp("ical", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + memcpy(&aBuf[nBuf-4], "ic", 2); + *pnBuf = nBuf - 4 + 2; + } + } + break; + + case 's': + if( nBuf>4 && 0==memcmp("ness", &aBuf[nBuf-4], 4) ){ + if( fts5Porter_MGt0(aBuf, nBuf-4) ){ + *pnBuf = nBuf - 4; + } + } + break; + + case 't': + if( nBuf>5 && 0==memcmp("icate", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "ic", 2); + *pnBuf = nBuf - 5 + 2; + } + }else if( nBuf>5 && 0==memcmp("iciti", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "ic", 2); + *pnBuf = nBuf - 5 + 2; + } + } + break; + + case 'u': + if( nBuf>3 && 0==memcmp("ful", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt0(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + } + } + break; + + case 'v': + if( nBuf>5 && 0==memcmp("ative", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + *pnBuf = nBuf - 5; + } + } + break; + + case 'z': + if( nBuf>5 && 0==memcmp("alize", &aBuf[nBuf-5], 5) ){ + if( fts5Porter_MGt0(aBuf, nBuf-5) ){ + memcpy(&aBuf[nBuf-5], "al", 2); + *pnBuf = nBuf - 5 + 2; + } + } + break; + + } + return ret; +} + + +static int fts5PorterStep1B(char *aBuf, int *pnBuf){ + int ret = 0; + int nBuf = *pnBuf; + switch( aBuf[nBuf-2] ){ + + case 'e': + if( nBuf>3 && 0==memcmp("eed", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_MGt0(aBuf, nBuf-3) ){ + memcpy(&aBuf[nBuf-3], "ee", 2); + *pnBuf = nBuf - 3 + 2; + } + }else if( nBuf>2 && 0==memcmp("ed", &aBuf[nBuf-2], 2) ){ + if( fts5Porter_Vowel(aBuf, nBuf-2) ){ + *pnBuf = nBuf - 2; + ret = 1; + } + } + break; + + case 'n': + if( nBuf>3 && 0==memcmp("ing", &aBuf[nBuf-3], 3) ){ + if( fts5Porter_Vowel(aBuf, nBuf-3) ){ + *pnBuf = nBuf - 3; + ret = 1; + } + } + break; + + } + return ret; +} + +/* +** GENERATED CODE ENDS HERE (mkportersteps.tcl) +*************************************************************************** +**************************************************************************/ + +static void fts5PorterStep1A(char *aBuf, int *pnBuf){ + int nBuf = *pnBuf; + if( aBuf[nBuf-1]=='s' ){ + if( aBuf[nBuf-2]=='e' ){ + if( (nBuf>4 && aBuf[nBuf-4]=='s' && aBuf[nBuf-3]=='s') + || (nBuf>3 && aBuf[nBuf-3]=='i' ) + ){ + *pnBuf = nBuf-2; + }else{ + *pnBuf = nBuf-1; + } + } + else if( aBuf[nBuf-2]!='s' ){ + *pnBuf = nBuf-1; + } + } +} + +static int fts5PorterCb( + void *pCtx, + int tflags, + const char *pToken, + int nToken, + int iStart, + int iEnd +){ + PorterContext *p = (PorterContext*)pCtx; + + char *aBuf; + int nBuf; + + if( nToken>FTS5_PORTER_MAX_TOKEN || nToken<3 ) goto pass_through; + aBuf = p->aBuf; + nBuf = nToken; + memcpy(aBuf, pToken, nBuf); + + /* Step 1. */ + fts5PorterStep1A(aBuf, &nBuf); + if( fts5PorterStep1B(aBuf, &nBuf) ){ + if( fts5PorterStep1B2(aBuf, &nBuf)==0 ){ + char c = aBuf[nBuf-1]; + if( fts5PorterIsVowel(c, 0)==0 + && c!='l' && c!='s' && c!='z' && c==aBuf[nBuf-2] + ){ + nBuf--; + }else if( fts5Porter_MEq1(aBuf, nBuf) && fts5Porter_Ostar(aBuf, nBuf) ){ + aBuf[nBuf++] = 'e'; + } + } + } + + /* Step 1C. */ + if( aBuf[nBuf-1]=='y' && fts5Porter_Vowel(aBuf, nBuf-1) ){ + aBuf[nBuf-1] = 'i'; + } + + /* Steps 2 through 4. */ + fts5PorterStep2(aBuf, &nBuf); + fts5PorterStep3(aBuf, &nBuf); + fts5PorterStep4(aBuf, &nBuf); + + /* Step 5a. */ + assert( nBuf>0 ); + if( aBuf[nBuf-1]=='e' ){ + if( fts5Porter_MGt1(aBuf, nBuf-1) + || (fts5Porter_MEq1(aBuf, nBuf-1) && !fts5Porter_Ostar(aBuf, nBuf-1)) + ){ + nBuf--; + } + } + + /* Step 5b. */ + if( nBuf>1 && aBuf[nBuf-1]=='l' + && aBuf[nBuf-2]=='l' && fts5Porter_MGt1(aBuf, nBuf-1) + ){ + nBuf--; + } + + return p->xToken(p->pCtx, tflags, aBuf, nBuf, iStart, iEnd); + + pass_through: + return p->xToken(p->pCtx, tflags, pToken, nToken, iStart, iEnd); +} + +/* +** Tokenize using the porter tokenizer. +*/ +static int fts5PorterTokenize( + Fts5Tokenizer *pTokenizer, + void *pCtx, + int flags, + const char *pText, int nText, + int (*xToken)(void*, int, const char*, int nToken, int iStart, int iEnd) +){ + PorterTokenizer *p = (PorterTokenizer*)pTokenizer; + PorterContext sCtx; + sCtx.xToken = xToken; + sCtx.pCtx = pCtx; + sCtx.aBuf = p->aBuf; + return p->tokenizer.xTokenize( + p->pTokenizer, (void*)&sCtx, flags, pText, nText, fts5PorterCb + ); +} + +/* +** Register all built-in tokenizers with FTS5. +*/ +static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ + struct BuiltinTokenizer { + const char *zName; + fts5_tokenizer x; + } aBuiltin[] = { + { "unicode61", {fts5UnicodeCreate, fts5UnicodeDelete, fts5UnicodeTokenize}}, + { "ascii", {fts5AsciiCreate, fts5AsciiDelete, fts5AsciiTokenize }}, + { "porter", {fts5PorterCreate, fts5PorterDelete, fts5PorterTokenize }}, + }; + + int rc = SQLITE_OK; /* Return code */ + int i; /* To iterate through builtin functions */ + + for(i=0; rc==SQLITE_OK && i<ArraySize(aBuiltin); i++){ + rc = pApi->xCreateTokenizer(pApi, + aBuiltin[i].zName, + (void*)pApi, + &aBuiltin[i].x, + 0 + ); + } + + return rc; +} + + + +/* +** 2012 May 25 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +*/ + +/* +** DO NOT EDIT THIS MACHINE GENERATED FILE. +*/ + + +/* #include <assert.h> */ + +/* +** Return true if the argument corresponds to a unicode codepoint +** classified as either a letter or a number. Otherwise false. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +static int sqlite3Fts5UnicodeIsalnum(int c){ + /* Each unsigned integer in the following array corresponds to a contiguous + ** range of unicode codepoints that are not either letters or numbers (i.e. + ** codepoints for which this function should return 0). + ** + ** The most significant 22 bits in each 32-bit value contain the first + ** codepoint in the range. The least significant 10 bits are used to store + ** the size of the range (always at least 1). In other words, the value + ** ((C<<22) + N) represents a range of N codepoints starting with codepoint + ** C. It is not possible to represent a range larger than 1023 codepoints + ** using this format. + */ + static const unsigned int aEntry[] = { + 0x00000030, 0x0000E807, 0x00016C06, 0x0001EC2F, 0x0002AC07, + 0x0002D001, 0x0002D803, 0x0002EC01, 0x0002FC01, 0x00035C01, + 0x0003DC01, 0x000B0804, 0x000B480E, 0x000B9407, 0x000BB401, + 0x000BBC81, 0x000DD401, 0x000DF801, 0x000E1002, 0x000E1C01, + 0x000FD801, 0x00120808, 0x00156806, 0x00162402, 0x00163C01, + 0x00164437, 0x0017CC02, 0x00180005, 0x00181816, 0x00187802, + 0x00192C15, 0x0019A804, 0x0019C001, 0x001B5001, 0x001B580F, + 0x001B9C07, 0x001BF402, 0x001C000E, 0x001C3C01, 0x001C4401, + 0x001CC01B, 0x001E980B, 0x001FAC09, 0x001FD804, 0x00205804, + 0x00206C09, 0x00209403, 0x0020A405, 0x0020C00F, 0x00216403, + 0x00217801, 0x0023901B, 0x00240004, 0x0024E803, 0x0024F812, + 0x00254407, 0x00258804, 0x0025C001, 0x00260403, 0x0026F001, + 0x0026F807, 0x00271C02, 0x00272C03, 0x00275C01, 0x00278802, + 0x0027C802, 0x0027E802, 0x00280403, 0x0028F001, 0x0028F805, + 0x00291C02, 0x00292C03, 0x00294401, 0x0029C002, 0x0029D401, + 0x002A0403, 0x002AF001, 0x002AF808, 0x002B1C03, 0x002B2C03, + 0x002B8802, 0x002BC002, 0x002C0403, 0x002CF001, 0x002CF807, + 0x002D1C02, 0x002D2C03, 0x002D5802, 0x002D8802, 0x002DC001, + 0x002E0801, 0x002EF805, 0x002F1803, 0x002F2804, 0x002F5C01, + 0x002FCC08, 0x00300403, 0x0030F807, 0x00311803, 0x00312804, + 0x00315402, 0x00318802, 0x0031FC01, 0x00320802, 0x0032F001, + 0x0032F807, 0x00331803, 0x00332804, 0x00335402, 0x00338802, + 0x00340802, 0x0034F807, 0x00351803, 0x00352804, 0x00355C01, + 0x00358802, 0x0035E401, 0x00360802, 0x00372801, 0x00373C06, + 0x00375801, 0x00376008, 0x0037C803, 0x0038C401, 0x0038D007, + 0x0038FC01, 0x00391C09, 0x00396802, 0x003AC401, 0x003AD006, + 0x003AEC02, 0x003B2006, 0x003C041F, 0x003CD00C, 0x003DC417, + 0x003E340B, 0x003E6424, 0x003EF80F, 0x003F380D, 0x0040AC14, + 0x00412806, 0x00415804, 0x00417803, 0x00418803, 0x00419C07, + 0x0041C404, 0x0042080C, 0x00423C01, 0x00426806, 0x0043EC01, + 0x004D740C, 0x004E400A, 0x00500001, 0x0059B402, 0x005A0001, + 0x005A6C02, 0x005BAC03, 0x005C4803, 0x005CC805, 0x005D4802, + 0x005DC802, 0x005ED023, 0x005F6004, 0x005F7401, 0x0060000F, + 0x0062A401, 0x0064800C, 0x0064C00C, 0x00650001, 0x00651002, + 0x0066C011, 0x00672002, 0x00677822, 0x00685C05, 0x00687802, + 0x0069540A, 0x0069801D, 0x0069FC01, 0x006A8007, 0x006AA006, + 0x006C0005, 0x006CD011, 0x006D6823, 0x006E0003, 0x006E840D, + 0x006F980E, 0x006FF004, 0x00709014, 0x0070EC05, 0x0071F802, + 0x00730008, 0x00734019, 0x0073B401, 0x0073C803, 0x00770027, + 0x0077F004, 0x007EF401, 0x007EFC03, 0x007F3403, 0x007F7403, + 0x007FB403, 0x007FF402, 0x00800065, 0x0081A806, 0x0081E805, + 0x00822805, 0x0082801A, 0x00834021, 0x00840002, 0x00840C04, + 0x00842002, 0x00845001, 0x00845803, 0x00847806, 0x00849401, + 0x00849C01, 0x0084A401, 0x0084B801, 0x0084E802, 0x00850005, + 0x00852804, 0x00853C01, 0x00864264, 0x00900027, 0x0091000B, + 0x0092704E, 0x00940200, 0x009C0475, 0x009E53B9, 0x00AD400A, + 0x00B39406, 0x00B3BC03, 0x00B3E404, 0x00B3F802, 0x00B5C001, + 0x00B5FC01, 0x00B7804F, 0x00B8C00C, 0x00BA001A, 0x00BA6C59, + 0x00BC00D6, 0x00BFC00C, 0x00C00005, 0x00C02019, 0x00C0A807, + 0x00C0D802, 0x00C0F403, 0x00C26404, 0x00C28001, 0x00C3EC01, + 0x00C64002, 0x00C6580A, 0x00C70024, 0x00C8001F, 0x00C8A81E, + 0x00C94001, 0x00C98020, 0x00CA2827, 0x00CB003F, 0x00CC0100, + 0x01370040, 0x02924037, 0x0293F802, 0x02983403, 0x0299BC10, + 0x029A7C01, 0x029BC008, 0x029C0017, 0x029C8002, 0x029E2402, + 0x02A00801, 0x02A01801, 0x02A02C01, 0x02A08C09, 0x02A0D804, + 0x02A1D004, 0x02A20002, 0x02A2D011, 0x02A33802, 0x02A38012, + 0x02A3E003, 0x02A4980A, 0x02A51C0D, 0x02A57C01, 0x02A60004, + 0x02A6CC1B, 0x02A77802, 0x02A8A40E, 0x02A90C01, 0x02A93002, + 0x02A97004, 0x02A9DC03, 0x02A9EC01, 0x02AAC001, 0x02AAC803, + 0x02AADC02, 0x02AAF802, 0x02AB0401, 0x02AB7802, 0x02ABAC07, + 0x02ABD402, 0x02AF8C0B, 0x03600001, 0x036DFC02, 0x036FFC02, + 0x037FFC01, 0x03EC7801, 0x03ECA401, 0x03EEC810, 0x03F4F802, + 0x03F7F002, 0x03F8001A, 0x03F88007, 0x03F8C023, 0x03F95013, + 0x03F9A004, 0x03FBFC01, 0x03FC040F, 0x03FC6807, 0x03FCEC06, + 0x03FD6C0B, 0x03FF8007, 0x03FFA007, 0x03FFE405, 0x04040003, + 0x0404DC09, 0x0405E411, 0x0406400C, 0x0407402E, 0x040E7C01, + 0x040F4001, 0x04215C01, 0x04247C01, 0x0424FC01, 0x04280403, + 0x04281402, 0x04283004, 0x0428E003, 0x0428FC01, 0x04294009, + 0x0429FC01, 0x042CE407, 0x04400003, 0x0440E016, 0x04420003, + 0x0442C012, 0x04440003, 0x04449C0E, 0x04450004, 0x04460003, + 0x0446CC0E, 0x04471404, 0x045AAC0D, 0x0491C004, 0x05BD442E, + 0x05BE3C04, 0x074000F6, 0x07440027, 0x0744A4B5, 0x07480046, + 0x074C0057, 0x075B0401, 0x075B6C01, 0x075BEC01, 0x075C5401, + 0x075CD401, 0x075D3C01, 0x075DBC01, 0x075E2401, 0x075EA401, + 0x075F0C01, 0x07BBC002, 0x07C0002C, 0x07C0C064, 0x07C2800F, + 0x07C2C40E, 0x07C3040F, 0x07C3440F, 0x07C4401F, 0x07C4C03C, + 0x07C5C02B, 0x07C7981D, 0x07C8402B, 0x07C90009, 0x07C94002, + 0x07CC0021, 0x07CCC006, 0x07CCDC46, 0x07CE0014, 0x07CE8025, + 0x07CF1805, 0x07CF8011, 0x07D0003F, 0x07D10001, 0x07D108B6, + 0x07D3E404, 0x07D4003E, 0x07D50004, 0x07D54018, 0x07D7EC46, + 0x07D9140B, 0x07DA0046, 0x07DC0074, 0x38000401, 0x38008060, + 0x380400F0, + }; + static const unsigned int aAscii[4] = { + 0xFFFFFFFF, 0xFC00FFFF, 0xF8000001, 0xF8000001, + }; + + if( (unsigned int)c<128 ){ + return ( (aAscii[c >> 5] & (1 << (c & 0x001F)))==0 ); + }else if( (unsigned int)c<(1<<22) ){ + unsigned int key = (((unsigned int)c)<<10) | 0x000003FF; + int iRes = 0; + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aEntry[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( aEntry[0]<key ); + assert( key>=aEntry[iRes] ); + return (((unsigned int)c) >= ((aEntry[iRes]>>10) + (aEntry[iRes]&0x3FF))); + } + return 1; +} + + +/* +** If the argument is a codepoint corresponding to a lowercase letter +** in the ASCII range with a diacritic added, return the codepoint +** of the ASCII letter only. For example, if passed 235 - "LATIN +** SMALL LETTER E WITH DIAERESIS" - return 65 ("LATIN SMALL LETTER +** E"). The resuls of passing a codepoint that corresponds to an +** uppercase letter are undefined. +*/ +static int fts5_remove_diacritic(int c){ + unsigned short aDia[] = { + 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, + 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, + 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, + 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, + 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, + 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, + 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, + 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, + 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, + 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, + 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, + 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, + 62924, 63050, 63082, 63274, 63390, + }; + char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', + 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', + 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', + 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', + 'e', 'i', 'o', 'u', 'y', + }; + + unsigned int key = (((unsigned int)c)<<3) | 0x00000007; + int iRes = 0; + int iHi = sizeof(aDia)/sizeof(aDia[0]) - 1; + int iLo = 0; + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + if( key >= aDia[iTest] ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + assert( key>=aDia[iRes] ); + return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); +} + + +/* +** Return true if the argument interpreted as a unicode codepoint +** is a diacritical modifier character. +*/ +static int sqlite3Fts5UnicodeIsdiacritic(int c){ + unsigned int mask0 = 0x08029FDF; + unsigned int mask1 = 0x000361F8; + if( c<768 || c>817 ) return 0; + return (c < 768+32) ? + (mask0 & (1 << (c-768))) : + (mask1 & (1 << (c-768-32))); +} + + +/* +** Interpret the argument as a unicode codepoint. If the codepoint +** is an upper case character that has a lower case equivalent, +** return the codepoint corresponding to the lower case version. +** Otherwise, return a copy of the argument. +** +** The results are undefined if the value passed to this function +** is less than zero. +*/ +static int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ + /* Each entry in the following array defines a rule for folding a range + ** of codepoints to lower case. The rule applies to a range of nRange + ** codepoints starting at codepoint iCode. + ** + ** If the least significant bit in flags is clear, then the rule applies + ** to all nRange codepoints (i.e. all nRange codepoints are upper case and + ** need to be folded). Or, if it is set, then the rule only applies to + ** every second codepoint in the range, starting with codepoint C. + ** + ** The 7 most significant bits in flags are an index into the aiOff[] + ** array. If a specific codepoint C does require folding, then its lower + ** case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF). + ** + ** The contents of this array are generated by parsing the CaseFolding.txt + ** file distributed as part of the "Unicode Character Database". See + ** http://www.unicode.org for details. + */ + static const struct TableEntry { + unsigned short iCode; + unsigned char flags; + unsigned char nRange; + } aEntry[] = { + {65, 14, 26}, {181, 64, 1}, {192, 14, 23}, + {216, 14, 7}, {256, 1, 48}, {306, 1, 6}, + {313, 1, 16}, {330, 1, 46}, {376, 116, 1}, + {377, 1, 6}, {383, 104, 1}, {385, 50, 1}, + {386, 1, 4}, {390, 44, 1}, {391, 0, 1}, + {393, 42, 2}, {395, 0, 1}, {398, 32, 1}, + {399, 38, 1}, {400, 40, 1}, {401, 0, 1}, + {403, 42, 1}, {404, 46, 1}, {406, 52, 1}, + {407, 48, 1}, {408, 0, 1}, {412, 52, 1}, + {413, 54, 1}, {415, 56, 1}, {416, 1, 6}, + {422, 60, 1}, {423, 0, 1}, {425, 60, 1}, + {428, 0, 1}, {430, 60, 1}, {431, 0, 1}, + {433, 58, 2}, {435, 1, 4}, {439, 62, 1}, + {440, 0, 1}, {444, 0, 1}, {452, 2, 1}, + {453, 0, 1}, {455, 2, 1}, {456, 0, 1}, + {458, 2, 1}, {459, 1, 18}, {478, 1, 18}, + {497, 2, 1}, {498, 1, 4}, {502, 122, 1}, + {503, 134, 1}, {504, 1, 40}, {544, 110, 1}, + {546, 1, 18}, {570, 70, 1}, {571, 0, 1}, + {573, 108, 1}, {574, 68, 1}, {577, 0, 1}, + {579, 106, 1}, {580, 28, 1}, {581, 30, 1}, + {582, 1, 10}, {837, 36, 1}, {880, 1, 4}, + {886, 0, 1}, {902, 18, 1}, {904, 16, 3}, + {908, 26, 1}, {910, 24, 2}, {913, 14, 17}, + {931, 14, 9}, {962, 0, 1}, {975, 4, 1}, + {976, 140, 1}, {977, 142, 1}, {981, 146, 1}, + {982, 144, 1}, {984, 1, 24}, {1008, 136, 1}, + {1009, 138, 1}, {1012, 130, 1}, {1013, 128, 1}, + {1015, 0, 1}, {1017, 152, 1}, {1018, 0, 1}, + {1021, 110, 3}, {1024, 34, 16}, {1040, 14, 32}, + {1120, 1, 34}, {1162, 1, 54}, {1216, 6, 1}, + {1217, 1, 14}, {1232, 1, 88}, {1329, 22, 38}, + {4256, 66, 38}, {4295, 66, 1}, {4301, 66, 1}, + {7680, 1, 150}, {7835, 132, 1}, {7838, 96, 1}, + {7840, 1, 96}, {7944, 150, 8}, {7960, 150, 6}, + {7976, 150, 8}, {7992, 150, 8}, {8008, 150, 6}, + {8025, 151, 8}, {8040, 150, 8}, {8072, 150, 8}, + {8088, 150, 8}, {8104, 150, 8}, {8120, 150, 2}, + {8122, 126, 2}, {8124, 148, 1}, {8126, 100, 1}, + {8136, 124, 4}, {8140, 148, 1}, {8152, 150, 2}, + {8154, 120, 2}, {8168, 150, 2}, {8170, 118, 2}, + {8172, 152, 1}, {8184, 112, 2}, {8186, 114, 2}, + {8188, 148, 1}, {8486, 98, 1}, {8490, 92, 1}, + {8491, 94, 1}, {8498, 12, 1}, {8544, 8, 16}, + {8579, 0, 1}, {9398, 10, 26}, {11264, 22, 47}, + {11360, 0, 1}, {11362, 88, 1}, {11363, 102, 1}, + {11364, 90, 1}, {11367, 1, 6}, {11373, 84, 1}, + {11374, 86, 1}, {11375, 80, 1}, {11376, 82, 1}, + {11378, 0, 1}, {11381, 0, 1}, {11390, 78, 2}, + {11392, 1, 100}, {11499, 1, 4}, {11506, 0, 1}, + {42560, 1, 46}, {42624, 1, 24}, {42786, 1, 14}, + {42802, 1, 62}, {42873, 1, 4}, {42877, 76, 1}, + {42878, 1, 10}, {42891, 0, 1}, {42893, 74, 1}, + {42896, 1, 4}, {42912, 1, 10}, {42922, 72, 1}, + {65313, 14, 26}, + }; + static const unsigned short aiOff[] = { + 1, 2, 8, 15, 16, 26, 28, 32, + 37, 38, 40, 48, 63, 64, 69, 71, + 79, 80, 116, 202, 203, 205, 206, 207, + 209, 210, 211, 213, 214, 217, 218, 219, + 775, 7264, 10792, 10795, 23228, 23256, 30204, 54721, + 54753, 54754, 54756, 54787, 54793, 54809, 57153, 57274, + 57921, 58019, 58363, 61722, 65268, 65341, 65373, 65406, + 65408, 65410, 65415, 65424, 65436, 65439, 65450, 65462, + 65472, 65476, 65478, 65480, 65482, 65488, 65506, 65511, + 65514, 65521, 65527, 65528, 65529, + }; + + int ret = c; + + assert( sizeof(unsigned short)==2 && sizeof(unsigned char)==1 ); + + if( c<128 ){ + if( c>='A' && c<='Z' ) ret = c + ('a' - 'A'); + }else if( c<65536 ){ + const struct TableEntry *p; + int iHi = sizeof(aEntry)/sizeof(aEntry[0]) - 1; + int iLo = 0; + int iRes = -1; + + assert( c>aEntry[0].iCode ); + while( iHi>=iLo ){ + int iTest = (iHi + iLo) / 2; + int cmp = (c - aEntry[iTest].iCode); + if( cmp>=0 ){ + iRes = iTest; + iLo = iTest+1; + }else{ + iHi = iTest-1; + } + } + + assert( iRes>=0 && c>=aEntry[iRes].iCode ); + p = &aEntry[iRes]; + if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){ + ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF; + assert( ret>0 ); + } + + if( bRemoveDiacritic ) ret = fts5_remove_diacritic(ret); + } + + else if( c>=66560 && c<66600 ){ + ret = c + 40; + } + + return ret; +} + +/* +** 2015 May 30 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Routines for varint serialization and deserialization. +*/ + + +/* #include "fts5Int.h" */ + +/* +** This is a copy of the sqlite3GetVarint32() routine from the SQLite core. +** Except, this version does handle the single byte case that the core +** version depends on being handled before its function is called. +*/ +static int sqlite3Fts5GetVarint32(const unsigned char *p, u32 *v){ + u32 a,b; + + /* The 1-byte case. Overwhelmingly the most common. */ + a = *p; + /* a: p0 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 0 and 127 */ + *v = a; + return 1; + } + + /* The 2-byte case */ + p++; + b = *p; + /* b: p1 (unmasked) */ + if (!(b&0x80)) + { + /* Values between 128 and 16383 */ + a &= 0x7f; + a = a<<7; + *v = a | b; + return 2; + } + + /* The 3-byte case */ + p++; + a = a<<14; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + /* Values between 16384 and 2097151 */ + a &= (0x7f<<14)|(0x7f); + b &= 0x7f; + b = b<<7; + *v = a | b; + return 3; + } + + /* A 32-bit varint is used to store size information in btrees. + ** Objects are rarely larger than 2MiB limit of a 3-byte varint. + ** A 3-byte varint is sufficient, for example, to record the size + ** of a 1048569-byte BLOB or string. + ** + ** We only unroll the first 1-, 2-, and 3- byte cases. The very + ** rare larger cases can be handled by the slower 64-bit varint + ** routine. + */ + { + u64 v64; + u8 n; + p -= 2; + n = sqlite3Fts5GetVarint(p, &v64); + *v = (u32)v64; + assert( n>3 && n<=9 ); + return n; + } +} + + +/* +** Bitmasks used by sqlite3GetVarint(). These precomputed constants +** are defined here rather than simply putting the constant expressions +** inline in order to work around bugs in the RVT compiler. +** +** SLOT_2_0 A mask for (0x7f<<14) | 0x7f +** +** SLOT_4_2_0 A mask for (0x7f<<28) | SLOT_2_0 +*/ +#define SLOT_2_0 0x001fc07f +#define SLOT_4_2_0 0xf01fc07f + +/* +** Read a 64-bit variable-length integer from memory starting at p[0]. +** Return the number of bytes read. The value is stored in *v. +*/ +static u8 sqlite3Fts5GetVarint(const unsigned char *p, u64 *v){ + u32 a,b,s; + + a = *p; + /* a: p0 (unmasked) */ + if (!(a&0x80)) + { + *v = a; + return 1; + } + + p++; + b = *p; + /* b: p1 (unmasked) */ + if (!(b&0x80)) + { + a &= 0x7f; + a = a<<7; + a |= b; + *v = a; + return 2; + } + + /* Verify that constants are precomputed correctly */ + assert( SLOT_2_0 == ((0x7f<<14) | (0x7f)) ); + assert( SLOT_4_2_0 == ((0xfU<<28) | (0x7f<<14) | (0x7f)) ); + + p++; + a = a<<14; + a |= *p; + /* a: p0<<14 | p2 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_2_0; + b &= 0x7f; + b = b<<7; + a |= b; + *v = a; + return 3; + } + + /* CSE1 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p1<<14 | p3 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_2_0; + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + *v = a; + return 4; + } + + /* a: p0<<14 | p2 (masked) */ + /* b: p1<<14 | p3 (unmasked) */ + /* 1:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + /* moved CSE1 up */ + /* a &= (0x7f<<14)|(0x7f); */ + b &= SLOT_2_0; + s = a; + /* s: p0<<14 | p2 (masked) */ + + p++; + a = a<<14; + a |= *p; + /* a: p0<<28 | p2<<14 | p4 (unmasked) */ + if (!(a&0x80)) + { + /* we can skip these cause they were (effectively) done above in calc'ing s */ + /* a &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + /* b &= (0x7f<<14)|(0x7f); */ + b = b<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 5; + } + + /* 2:save off p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + s = s<<7; + s |= b; + /* s: p0<<21 | p1<<14 | p2<<7 | p3 (masked) */ + + p++; + b = b<<14; + b |= *p; + /* b: p1<<28 | p3<<14 | p5 (unmasked) */ + if (!(b&0x80)) + { + /* we can skip this cause it was (effectively) done above in calc'ing s */ + /* b &= (0x7f<<28)|(0x7f<<14)|(0x7f); */ + a &= SLOT_2_0; + a = a<<7; + a |= b; + s = s>>18; + *v = ((u64)s)<<32 | a; + return 6; + } + + p++; + a = a<<14; + a |= *p; + /* a: p2<<28 | p4<<14 | p6 (unmasked) */ + if (!(a&0x80)) + { + a &= SLOT_4_2_0; + b &= SLOT_2_0; + b = b<<7; + a |= b; + s = s>>11; + *v = ((u64)s)<<32 | a; + return 7; + } + + /* CSE2 from below */ + a &= SLOT_2_0; + p++; + b = b<<14; + b |= *p; + /* b: p3<<28 | p5<<14 | p7 (unmasked) */ + if (!(b&0x80)) + { + b &= SLOT_4_2_0; + /* moved CSE2 up */ + /* a &= (0x7f<<14)|(0x7f); */ + a = a<<7; + a |= b; + s = s>>4; + *v = ((u64)s)<<32 | a; + return 8; + } + + p++; + a = a<<15; + a |= *p; + /* a: p4<<29 | p6<<15 | p8 (unmasked) */ + + /* moved CSE2 up */ + /* a &= (0x7f<<29)|(0x7f<<15)|(0xff); */ + b &= SLOT_2_0; + b = b<<8; + a |= b; + + s = s<<4; + b = p[-4]; + b &= 0x7f; + b = b>>3; + s |= b; + + *v = ((u64)s)<<32 | a; + + return 9; +} + +/* +** The variable-length integer encoding is as follows: +** +** KEY: +** A = 0xxxxxxx 7 bits of data and one flag bit +** B = 1xxxxxxx 7 bits of data and one flag bit +** C = xxxxxxxx 8 bits of data +** +** 7 bits - A +** 14 bits - BA +** 21 bits - BBA +** 28 bits - BBBA +** 35 bits - BBBBA +** 42 bits - BBBBBA +** 49 bits - BBBBBBA +** 56 bits - BBBBBBBA +** 64 bits - BBBBBBBBC +*/ + +#ifdef SQLITE_NOINLINE +# define FTS5_NOINLINE SQLITE_NOINLINE +#else +# define FTS5_NOINLINE +#endif + +/* +** Write a 64-bit variable-length integer to memory starting at p[0]. +** The length of data write will be between 1 and 9 bytes. The number +** of bytes written is returned. +** +** A variable-length integer consists of the lower 7 bits of each byte +** for all bytes that have the 8th bit set and one byte with the 8th +** bit clear. Except, if we get to the 9th byte, it stores the full +** 8 bits and is the last byte. +*/ +static int FTS5_NOINLINE fts5PutVarint64(unsigned char *p, u64 v){ + int i, j, n; + u8 buf[10]; + if( v & (((u64)0xff000000)<<32) ){ + p[8] = (u8)v; + v >>= 8; + for(i=7; i>=0; i--){ + p[i] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + } + return 9; + } + n = 0; + do{ + buf[n++] = (u8)((v & 0x7f) | 0x80); + v >>= 7; + }while( v!=0 ); + buf[0] &= 0x7f; + assert( n<=9 ); + for(i=0, j=n-1; j>=0; j--, i++){ + p[i] = buf[j]; + } + return n; +} + +static int sqlite3Fts5PutVarint(unsigned char *p, u64 v){ + if( v<=0x7f ){ + p[0] = v&0x7f; + return 1; + } + if( v<=0x3fff ){ + p[0] = ((v>>7)&0x7f)|0x80; + p[1] = v&0x7f; + return 2; + } + return fts5PutVarint64(p,v); +} + + +static int sqlite3Fts5GetVarintLen(u32 iVal){ +#if 0 + if( iVal<(1 << 7 ) ) return 1; +#endif + assert( iVal>=(1 << 7) ); + if( iVal<(1 << 14) ) return 2; + if( iVal<(1 << 21) ) return 3; + if( iVal<(1 << 28) ) return 4; + return 5; +} + + +/* +** 2015 May 08 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This is an SQLite virtual table module implementing direct access to an +** existing FTS5 index. The module may create several different types of +** tables: +** +** col: +** CREATE TABLE vocab(term, col, doc, cnt, PRIMARY KEY(term, col)); +** +** One row for each term/column combination. The value of $doc is set to +** the number of fts5 rows that contain at least one instance of term +** $term within column $col. Field $cnt is set to the total number of +** instances of term $term in column $col (in any row of the fts5 table). +** +** row: +** CREATE TABLE vocab(term, doc, cnt, PRIMARY KEY(term)); +** +** One row for each term in the database. The value of $doc is set to +** the number of fts5 rows that contain at least one instance of term +** $term. Field $cnt is set to the total number of instances of term +** $term in the database. +** +** instance: +** CREATE TABLE vocab(term, doc, col, offset, PRIMARY KEY(<all-fields>)); +** +** One row for each term instance in the database. +*/ + + +/* #include "fts5Int.h" */ + + +typedef struct Fts5VocabTable Fts5VocabTable; +typedef struct Fts5VocabCursor Fts5VocabCursor; + +struct Fts5VocabTable { + sqlite3_vtab base; + char *zFts5Tbl; /* Name of fts5 table */ + char *zFts5Db; /* Db containing fts5 table */ + sqlite3 *db; /* Database handle */ + Fts5Global *pGlobal; /* FTS5 global object for this database */ + int eType; /* FTS5_VOCAB_COL, ROW or INSTANCE */ +}; + +struct Fts5VocabCursor { + sqlite3_vtab_cursor base; + sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ + Fts5Index *pIndex; /* Associated FTS5 index */ + + int bEof; /* True if this cursor is at EOF */ + Fts5IndexIter *pIter; /* Term/rowid iterator object */ + + int nLeTerm; /* Size of zLeTerm in bytes */ + char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ + + /* These are used by 'col' tables only */ + Fts5Config *pConfig; /* Fts5 table configuration */ + int iCol; + i64 *aCnt; + i64 *aDoc; + + /* Output values used by all tables. */ + i64 rowid; /* This table's current rowid value */ + Fts5Buffer term; /* Current value of 'term' column */ + + /* Output values Used by 'instance' tables only */ + i64 iInstPos; + int iInstOff; +}; + +#define FTS5_VOCAB_COL 0 +#define FTS5_VOCAB_ROW 1 +#define FTS5_VOCAB_INSTANCE 2 + +#define FTS5_VOCAB_COL_SCHEMA "term, col, doc, cnt" +#define FTS5_VOCAB_ROW_SCHEMA "term, doc, cnt" +#define FTS5_VOCAB_INST_SCHEMA "term, doc, col, offset" + +/* +** Bits for the mask used as the idxNum value by xBestIndex/xFilter. +*/ +#define FTS5_VOCAB_TERM_EQ 0x01 +#define FTS5_VOCAB_TERM_GE 0x02 +#define FTS5_VOCAB_TERM_LE 0x04 + + +/* +** Translate a string containing an fts5vocab table type to an +** FTS5_VOCAB_XXX constant. If successful, set *peType to the output +** value and return SQLITE_OK. Otherwise, set *pzErr to an error message +** and return SQLITE_ERROR. +*/ +static int fts5VocabTableType(const char *zType, char **pzErr, int *peType){ + int rc = SQLITE_OK; + char *zCopy = sqlite3Fts5Strndup(&rc, zType, -1); + if( rc==SQLITE_OK ){ + sqlite3Fts5Dequote(zCopy); + if( sqlite3_stricmp(zCopy, "col")==0 ){ + *peType = FTS5_VOCAB_COL; + }else + + if( sqlite3_stricmp(zCopy, "row")==0 ){ + *peType = FTS5_VOCAB_ROW; + }else + if( sqlite3_stricmp(zCopy, "instance")==0 ){ + *peType = FTS5_VOCAB_INSTANCE; + }else + { + *pzErr = sqlite3_mprintf("fts5vocab: unknown table type: %Q", zCopy); + rc = SQLITE_ERROR; + } + sqlite3_free(zCopy); + } + + return rc; +} + + +/* +** The xDisconnect() virtual table method. +*/ +static int fts5VocabDisconnectMethod(sqlite3_vtab *pVtab){ + Fts5VocabTable *pTab = (Fts5VocabTable*)pVtab; + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* +** The xDestroy() virtual table method. +*/ +static int fts5VocabDestroyMethod(sqlite3_vtab *pVtab){ + Fts5VocabTable *pTab = (Fts5VocabTable*)pVtab; + sqlite3_free(pTab); + return SQLITE_OK; +} + +/* +** This function is the implementation of both the xConnect and xCreate +** methods of the FTS3 virtual table. +** +** The argv[] array contains the following: +** +** argv[0] -> module name ("fts5vocab") +** argv[1] -> database name +** argv[2] -> table name +** +** then: +** +** argv[3] -> name of fts5 table +** argv[4] -> type of fts5vocab table +** +** or, for tables in the TEMP schema only. +** +** argv[3] -> name of fts5 tables database +** argv[4] -> name of fts5 table +** argv[5] -> type of fts5vocab table +*/ +static int fts5VocabInitVtab( + sqlite3 *db, /* The SQLite database connection */ + void *pAux, /* Pointer to Fts5Global object */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVTab, /* Write the resulting vtab structure here */ + char **pzErr /* Write any error message here */ +){ + const char *azSchema[] = { + "CREATE TABlE vocab(" FTS5_VOCAB_COL_SCHEMA ")", + "CREATE TABlE vocab(" FTS5_VOCAB_ROW_SCHEMA ")", + "CREATE TABlE vocab(" FTS5_VOCAB_INST_SCHEMA ")" + }; + + Fts5VocabTable *pRet = 0; + int rc = SQLITE_OK; /* Return code */ + int bDb; + + bDb = (argc==6 && strlen(argv[1])==4 && memcmp("temp", argv[1], 4)==0); + + if( argc!=5 && bDb==0 ){ + *pzErr = sqlite3_mprintf("wrong number of vtable arguments"); + rc = SQLITE_ERROR; + }else{ + int nByte; /* Bytes of space to allocate */ + const char *zDb = bDb ? argv[3] : argv[1]; + const char *zTab = bDb ? argv[4] : argv[3]; + const char *zType = bDb ? argv[5] : argv[4]; + int nDb = (int)strlen(zDb)+1; + int nTab = (int)strlen(zTab)+1; + int eType = 0; + + rc = fts5VocabTableType(zType, pzErr, &eType); + if( rc==SQLITE_OK ){ + assert( eType>=0 && eType<ArraySize(azSchema) ); + rc = sqlite3_declare_vtab(db, azSchema[eType]); + } + + nByte = sizeof(Fts5VocabTable) + nDb + nTab; + pRet = sqlite3Fts5MallocZero(&rc, nByte); + if( pRet ){ + pRet->pGlobal = (Fts5Global*)pAux; + pRet->eType = eType; + pRet->db = db; + pRet->zFts5Tbl = (char*)&pRet[1]; + pRet->zFts5Db = &pRet->zFts5Tbl[nTab]; + memcpy(pRet->zFts5Tbl, zTab, nTab); + memcpy(pRet->zFts5Db, zDb, nDb); + sqlite3Fts5Dequote(pRet->zFts5Tbl); + sqlite3Fts5Dequote(pRet->zFts5Db); + } + } + + *ppVTab = (sqlite3_vtab*)pRet; + return rc; +} + + +/* +** The xConnect() and xCreate() methods for the virtual table. All the +** work is done in function fts5VocabInitVtab(). +*/ +static int fts5VocabConnectMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts5VocabInitVtab(db, pAux, argc, argv, ppVtab, pzErr); +} +static int fts5VocabCreateMethod( + sqlite3 *db, /* Database connection */ + void *pAux, /* Pointer to tokenizer hash table */ + int argc, /* Number of elements in argv array */ + const char * const *argv, /* xCreate/xConnect argument array */ + sqlite3_vtab **ppVtab, /* OUT: New sqlite3_vtab object */ + char **pzErr /* OUT: sqlite3_malloc'd error message */ +){ + return fts5VocabInitVtab(db, pAux, argc, argv, ppVtab, pzErr); +} + +/* +** Implementation of the xBestIndex method. +** +** Only constraints of the form: +** +** term <= ? +** term == ? +** term >= ? +** +** are interpreted. Less-than and less-than-or-equal are treated +** identically, as are greater-than and greater-than-or-equal. +*/ +static int fts5VocabBestIndexMethod( + sqlite3_vtab *pUnused, + sqlite3_index_info *pInfo +){ + int i; + int iTermEq = -1; + int iTermGe = -1; + int iTermLe = -1; + int idxNum = 0; + int nArg = 0; + + UNUSED_PARAM(pUnused); + + for(i=0; i<pInfo->nConstraint; i++){ + struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; + if( p->usable==0 ) continue; + if( p->iColumn==0 ){ /* term column */ + if( p->op==SQLITE_INDEX_CONSTRAINT_EQ ) iTermEq = i; + if( p->op==SQLITE_INDEX_CONSTRAINT_LE ) iTermLe = i; + if( p->op==SQLITE_INDEX_CONSTRAINT_LT ) iTermLe = i; + if( p->op==SQLITE_INDEX_CONSTRAINT_GE ) iTermGe = i; + if( p->op==SQLITE_INDEX_CONSTRAINT_GT ) iTermGe = i; + } + } + + if( iTermEq>=0 ){ + idxNum |= FTS5_VOCAB_TERM_EQ; + pInfo->aConstraintUsage[iTermEq].argvIndex = ++nArg; + pInfo->estimatedCost = 100; + }else{ + pInfo->estimatedCost = 1000000; + if( iTermGe>=0 ){ + idxNum |= FTS5_VOCAB_TERM_GE; + pInfo->aConstraintUsage[iTermGe].argvIndex = ++nArg; + pInfo->estimatedCost = pInfo->estimatedCost / 2; + } + if( iTermLe>=0 ){ + idxNum |= FTS5_VOCAB_TERM_LE; + pInfo->aConstraintUsage[iTermLe].argvIndex = ++nArg; + pInfo->estimatedCost = pInfo->estimatedCost / 2; + } + } + + /* This virtual table always delivers results in ascending order of + ** the "term" column (column 0). So if the user has requested this + ** specifically - "ORDER BY term" or "ORDER BY term ASC" - set the + ** sqlite3_index_info.orderByConsumed flag to tell the core the results + ** are already in sorted order. */ + if( pInfo->nOrderBy==1 + && pInfo->aOrderBy[0].iColumn==0 + && pInfo->aOrderBy[0].desc==0 + ){ + pInfo->orderByConsumed = 1; + } + + pInfo->idxNum = idxNum; + return SQLITE_OK; +} + +/* +** Implementation of xOpen method. +*/ +static int fts5VocabOpenMethod( + sqlite3_vtab *pVTab, + sqlite3_vtab_cursor **ppCsr +){ + Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; + Fts5Index *pIndex = 0; + Fts5Config *pConfig = 0; + Fts5VocabCursor *pCsr = 0; + int rc = SQLITE_OK; + sqlite3_stmt *pStmt = 0; + char *zSql = 0; + + zSql = sqlite3Fts5Mprintf(&rc, + "SELECT t.%Q FROM %Q.%Q AS t WHERE t.%Q MATCH '*id'", + pTab->zFts5Tbl, pTab->zFts5Db, pTab->zFts5Tbl, pTab->zFts5Tbl + ); + if( zSql ){ + rc = sqlite3_prepare_v2(pTab->db, zSql, -1, &pStmt, 0); + } + sqlite3_free(zSql); + assert( rc==SQLITE_OK || pStmt==0 ); + if( rc==SQLITE_ERROR ) rc = SQLITE_OK; + + if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ + i64 iId = sqlite3_column_int64(pStmt, 0); + pIndex = sqlite3Fts5IndexFromCsrid(pTab->pGlobal, iId, &pConfig); + } + + if( rc==SQLITE_OK && pIndex==0 ){ + rc = sqlite3_finalize(pStmt); + pStmt = 0; + if( rc==SQLITE_OK ){ + pVTab->zErrMsg = sqlite3_mprintf( + "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl + ); + rc = SQLITE_ERROR; + } + } + + if( rc==SQLITE_OK ){ + int nByte = pConfig->nCol * sizeof(i64) * 2 + sizeof(Fts5VocabCursor); + pCsr = (Fts5VocabCursor*)sqlite3Fts5MallocZero(&rc, nByte); + } + + if( pCsr ){ + pCsr->pIndex = pIndex; + pCsr->pStmt = pStmt; + pCsr->pConfig = pConfig; + pCsr->aCnt = (i64*)&pCsr[1]; + pCsr->aDoc = &pCsr->aCnt[pConfig->nCol]; + }else{ + sqlite3_finalize(pStmt); + } + + *ppCsr = (sqlite3_vtab_cursor*)pCsr; + return rc; +} + +static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ + pCsr->rowid = 0; + sqlite3Fts5IterClose(pCsr->pIter); + pCsr->pIter = 0; + sqlite3_free(pCsr->zLeTerm); + pCsr->nLeTerm = -1; + pCsr->zLeTerm = 0; +} + +/* +** Close the cursor. For additional information see the documentation +** on the xClose method of the virtual table interface. +*/ +static int fts5VocabCloseMethod(sqlite3_vtab_cursor *pCursor){ + Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; + fts5VocabResetCursor(pCsr); + sqlite3Fts5BufferFree(&pCsr->term); + sqlite3_finalize(pCsr->pStmt); + sqlite3_free(pCsr); + return SQLITE_OK; +} + +static int fts5VocabInstanceNewTerm(Fts5VocabCursor *pCsr){ + int rc = SQLITE_OK; + + if( sqlite3Fts5IterEof(pCsr->pIter) ){ + pCsr->bEof = 1; + }else{ + const char *zTerm; + int nTerm; + zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + if( pCsr->nLeTerm>=0 ){ + int nCmp = MIN(nTerm, pCsr->nLeTerm); + int bCmp = memcmp(pCsr->zLeTerm, zTerm, nCmp); + if( bCmp<0 || (bCmp==0 && pCsr->nLeTerm<nTerm) ){ + pCsr->bEof = 1; + } + } + + sqlite3Fts5BufferSet(&rc, &pCsr->term, nTerm, (const u8*)zTerm); + } + return rc; +} + +static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ + int eDetail = pCsr->pConfig->eDetail; + int rc = SQLITE_OK; + Fts5IndexIter *pIter = pCsr->pIter; + i64 *pp = &pCsr->iInstPos; + int *po = &pCsr->iInstOff; + + while( eDetail==FTS5_DETAIL_NONE + || sqlite3Fts5PoslistNext64(pIter->pData, pIter->nData, po, pp) + ){ + pCsr->iInstPos = 0; + pCsr->iInstOff = 0; + + rc = sqlite3Fts5IterNextScan(pCsr->pIter); + if( rc==SQLITE_OK ){ + rc = fts5VocabInstanceNewTerm(pCsr); + if( eDetail==FTS5_DETAIL_NONE ) break; + } + if( rc ){ + pCsr->bEof = 1; + break; + } + } + + return rc; +} + +/* +** Advance the cursor to the next row in the table. +*/ +static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ + Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; + Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; + int rc = SQLITE_OK; + int nCol = pCsr->pConfig->nCol; + + pCsr->rowid++; + + if( pTab->eType==FTS5_VOCAB_INSTANCE ){ + return fts5VocabInstanceNext(pCsr); + } + + if( pTab->eType==FTS5_VOCAB_COL ){ + for(pCsr->iCol++; pCsr->iCol<nCol; pCsr->iCol++){ + if( pCsr->aDoc[pCsr->iCol] ) break; + } + } + + if( pTab->eType!=FTS5_VOCAB_COL || pCsr->iCol>=nCol ){ + if( sqlite3Fts5IterEof(pCsr->pIter) ){ + pCsr->bEof = 1; + }else{ + const char *zTerm; + int nTerm; + + zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + if( pCsr->nLeTerm>=0 ){ + int nCmp = MIN(nTerm, pCsr->nLeTerm); + int bCmp = memcmp(pCsr->zLeTerm, zTerm, nCmp); + if( bCmp<0 || (bCmp==0 && pCsr->nLeTerm<nTerm) ){ + pCsr->bEof = 1; + return SQLITE_OK; + } + } + + sqlite3Fts5BufferSet(&rc, &pCsr->term, nTerm, (const u8*)zTerm); + memset(pCsr->aCnt, 0, nCol * sizeof(i64)); + memset(pCsr->aDoc, 0, nCol * sizeof(i64)); + pCsr->iCol = 0; + + assert( pTab->eType==FTS5_VOCAB_COL || pTab->eType==FTS5_VOCAB_ROW ); + while( rc==SQLITE_OK ){ + int eDetail = pCsr->pConfig->eDetail; + const u8 *pPos; int nPos; /* Position list */ + i64 iPos = 0; /* 64-bit position read from poslist */ + int iOff = 0; /* Current offset within position list */ + + pPos = pCsr->pIter->pData; + nPos = pCsr->pIter->nData; + + switch( pTab->eType ){ + case FTS5_VOCAB_ROW: + if( eDetail==FTS5_DETAIL_FULL ){ + while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ + pCsr->aCnt[0]++; + } + } + pCsr->aDoc[0]++; + break; + + case FTS5_VOCAB_COL: + if( eDetail==FTS5_DETAIL_FULL ){ + int iCol = -1; + while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ + int ii = FTS5_POS2COLUMN(iPos); + pCsr->aCnt[ii]++; + if( iCol!=ii ){ + if( ii>=nCol ){ + rc = FTS5_CORRUPT; + break; + } + pCsr->aDoc[ii]++; + iCol = ii; + } + } + }else if( eDetail==FTS5_DETAIL_COLUMNS ){ + while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff,&iPos) ){ + assert_nc( iPos>=0 && iPos<nCol ); + if( iPos>=nCol ){ + rc = FTS5_CORRUPT; + break; + } + pCsr->aDoc[iPos]++; + } + }else{ + assert( eDetail==FTS5_DETAIL_NONE ); + pCsr->aDoc[0]++; + } + break; + + default: + assert( pTab->eType==FTS5_VOCAB_INSTANCE ); + break; + } + + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IterNextScan(pCsr->pIter); + } + if( pTab->eType==FTS5_VOCAB_INSTANCE ) break; + + if( rc==SQLITE_OK ){ + zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + if( nTerm!=pCsr->term.n || memcmp(zTerm, pCsr->term.p, nTerm) ){ + break; + } + if( sqlite3Fts5IterEof(pCsr->pIter) ) break; + } + } + } + } + + if( rc==SQLITE_OK && pCsr->bEof==0 && pTab->eType==FTS5_VOCAB_COL ){ + while( pCsr->aDoc[pCsr->iCol]==0 ) pCsr->iCol++; + assert( pCsr->iCol<pCsr->pConfig->nCol ); + } + return rc; +} + +/* +** This is the xFilter implementation for the virtual table. +*/ +static int fts5VocabFilterMethod( + sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ + int idxNum, /* Strategy index */ + const char *zUnused, /* Unused */ + int nUnused, /* Number of elements in apVal */ + sqlite3_value **apVal /* Arguments for the indexing scheme */ +){ + Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; + Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; + int eType = pTab->eType; + int rc = SQLITE_OK; + + int iVal = 0; + int f = FTS5INDEX_QUERY_SCAN; + const char *zTerm = 0; + int nTerm = 0; + + sqlite3_value *pEq = 0; + sqlite3_value *pGe = 0; + sqlite3_value *pLe = 0; + + UNUSED_PARAM2(zUnused, nUnused); + + fts5VocabResetCursor(pCsr); + if( idxNum & FTS5_VOCAB_TERM_EQ ) pEq = apVal[iVal++]; + if( idxNum & FTS5_VOCAB_TERM_GE ) pGe = apVal[iVal++]; + if( idxNum & FTS5_VOCAB_TERM_LE ) pLe = apVal[iVal++]; + + if( pEq ){ + zTerm = (const char *)sqlite3_value_text(pEq); + nTerm = sqlite3_value_bytes(pEq); + f = 0; + }else{ + if( pGe ){ + zTerm = (const char *)sqlite3_value_text(pGe); + nTerm = sqlite3_value_bytes(pGe); + } + if( pLe ){ + const char *zCopy = (const char *)sqlite3_value_text(pLe); + pCsr->nLeTerm = sqlite3_value_bytes(pLe); + pCsr->zLeTerm = sqlite3_malloc(pCsr->nLeTerm+1); + if( pCsr->zLeTerm==0 ){ + rc = SQLITE_NOMEM; + }else{ + memcpy(pCsr->zLeTerm, zCopy, pCsr->nLeTerm+1); + } + } + } + + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5IndexQuery(pCsr->pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); + } + if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ + rc = fts5VocabInstanceNewTerm(pCsr); + } + if( rc==SQLITE_OK + && !pCsr->bEof + && (eType!=FTS5_VOCAB_INSTANCE || pCsr->pConfig->eDetail!=FTS5_DETAIL_NONE) + ){ + rc = fts5VocabNextMethod(pCursor); + } + + return rc; +} + +/* +** This is the xEof method of the virtual table. SQLite calls this +** routine to find out if it has reached the end of a result set. +*/ +static int fts5VocabEofMethod(sqlite3_vtab_cursor *pCursor){ + Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; + return pCsr->bEof; +} + +static int fts5VocabColumnMethod( + sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */ + sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ + int iCol /* Index of column to read value from */ +){ + Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; + int eDetail = pCsr->pConfig->eDetail; + int eType = ((Fts5VocabTable*)(pCursor->pVtab))->eType; + i64 iVal = 0; + + if( iCol==0 ){ + sqlite3_result_text( + pCtx, (const char*)pCsr->term.p, pCsr->term.n, SQLITE_TRANSIENT + ); + }else if( eType==FTS5_VOCAB_COL ){ + assert( iCol==1 || iCol==2 || iCol==3 ); + if( iCol==1 ){ + if( eDetail!=FTS5_DETAIL_NONE ){ + const char *z = pCsr->pConfig->azCol[pCsr->iCol]; + sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); + } + }else if( iCol==2 ){ + iVal = pCsr->aDoc[pCsr->iCol]; + }else{ + iVal = pCsr->aCnt[pCsr->iCol]; + } + }else if( eType==FTS5_VOCAB_ROW ){ + assert( iCol==1 || iCol==2 ); + if( iCol==1 ){ + iVal = pCsr->aDoc[0]; + }else{ + iVal = pCsr->aCnt[0]; + } + }else{ + assert( eType==FTS5_VOCAB_INSTANCE ); + switch( iCol ){ + case 1: + sqlite3_result_int64(pCtx, pCsr->pIter->iRowid); + break; + case 2: { + int ii = -1; + if( eDetail==FTS5_DETAIL_FULL ){ + ii = FTS5_POS2COLUMN(pCsr->iInstPos); + }else if( eDetail==FTS5_DETAIL_COLUMNS ){ + ii = (int)pCsr->iInstPos; + } + if( ii>=0 && ii<pCsr->pConfig->nCol ){ + const char *z = pCsr->pConfig->azCol[ii]; + sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); + } + break; + } + default: { + assert( iCol==3 ); + if( eDetail==FTS5_DETAIL_FULL ){ + int ii = FTS5_POS2OFFSET(pCsr->iInstPos); + sqlite3_result_int(pCtx, ii); + } + break; + } + } + } + + if( iVal>0 ) sqlite3_result_int64(pCtx, iVal); + return SQLITE_OK; +} + +/* +** This is the xRowid method. The SQLite core calls this routine to +** retrieve the rowid for the current row of the result set. The +** rowid should be written to *pRowid. +*/ +static int fts5VocabRowidMethod( + sqlite3_vtab_cursor *pCursor, + sqlite_int64 *pRowid +){ + Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; + *pRowid = pCsr->rowid; + return SQLITE_OK; +} + +static int sqlite3Fts5VocabInit(Fts5Global *pGlobal, sqlite3 *db){ + static const sqlite3_module fts5Vocab = { + /* iVersion */ 2, + /* xCreate */ fts5VocabCreateMethod, + /* xConnect */ fts5VocabConnectMethod, + /* xBestIndex */ fts5VocabBestIndexMethod, + /* xDisconnect */ fts5VocabDisconnectMethod, + /* xDestroy */ fts5VocabDestroyMethod, + /* xOpen */ fts5VocabOpenMethod, + /* xClose */ fts5VocabCloseMethod, + /* xFilter */ fts5VocabFilterMethod, + /* xNext */ fts5VocabNextMethod, + /* xEof */ fts5VocabEofMethod, + /* xColumn */ fts5VocabColumnMethod, + /* xRowid */ fts5VocabRowidMethod, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindFunction */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + }; + void *p = (void*)pGlobal; + + return sqlite3_create_module_v2(db, "fts5vocab", &fts5Vocab, p, 0); +} + + + + + +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */ + +/************** End of fts5.c ************************************************/ +/************** Begin file stmt.c ********************************************/ +/* +** 2017-05-31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file demonstrates an eponymous virtual table that returns information +** about all prepared statements for the database connection. +** +** Usage example: +** +** .load ./stmt +** .mode line +** .header on +** SELECT * FROM stmt; +*/ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) +#if !defined(SQLITEINT_H) +/* #include "sqlite3ext.h" */ +#endif +SQLITE_EXTENSION_INIT1 +/* #include <assert.h> */ +/* #include <string.h> */ + +#ifndef SQLITE_OMIT_VIRTUALTABLE + +/* stmt_vtab is a subclass of sqlite3_vtab which will +** serve as the underlying representation of a stmt virtual table +*/ +typedef struct stmt_vtab stmt_vtab; +struct stmt_vtab { + sqlite3_vtab base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this stmt vtab */ +}; + +/* stmt_cursor is a subclass of sqlite3_vtab_cursor which will +** serve as the underlying representation of a cursor that scans +** over rows of the result +*/ +typedef struct stmt_cursor stmt_cursor; +struct stmt_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3 *db; /* Database connection for this cursor */ + sqlite3_stmt *pStmt; /* Statement cursor is currently pointing at */ + sqlite3_int64 iRowid; /* The rowid */ +}; + +/* +** The stmtConnect() method is invoked to create a new +** stmt_vtab that describes the stmt virtual table. +** +** Think of this routine as the constructor for stmt_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the stmt_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against stmt will look like. +*/ +static int stmtConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + stmt_vtab *pNew; + int rc; + +/* Column numbers */ +#define STMT_COLUMN_SQL 0 /* SQL for the statement */ +#define STMT_COLUMN_NCOL 1 /* Number of result columns */ +#define STMT_COLUMN_RO 2 /* True if read-only */ +#define STMT_COLUMN_BUSY 3 /* True if currently busy */ +#define STMT_COLUMN_NSCAN 4 /* SQLITE_STMTSTATUS_FULLSCAN_STEP */ +#define STMT_COLUMN_NSORT 5 /* SQLITE_STMTSTATUS_SORT */ +#define STMT_COLUMN_NAIDX 6 /* SQLITE_STMTSTATUS_AUTOINDEX */ +#define STMT_COLUMN_NSTEP 7 /* SQLITE_STMTSTATUS_VM_STEP */ +#define STMT_COLUMN_REPREP 8 /* SQLITE_STMTSTATUS_REPREPARE */ +#define STMT_COLUMN_RUN 9 /* SQLITE_STMTSTATUS_RUN */ +#define STMT_COLUMN_MEM 10 /* SQLITE_STMTSTATUS_MEMUSED */ + + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE x(sql,ncol,ro,busy,nscan,nsort,naidx,nstep," + "reprep,run,mem)"); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + pNew->db = db; + } + return rc; +} + +/* +** This method is the destructor for stmt_cursor objects. +*/ +static int stmtDisconnect(sqlite3_vtab *pVtab){ + sqlite3_free(pVtab); + return SQLITE_OK; +} + +/* +** Constructor for a new stmt_cursor object. +*/ +static int stmtOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + stmt_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + pCur->db = ((stmt_vtab*)p)->db; + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a stmt_cursor. +*/ +static int stmtClose(sqlite3_vtab_cursor *cur){ + sqlite3_free(cur); + return SQLITE_OK; +} + + +/* +** Advance a stmt_cursor to its next row of output. +*/ +static int stmtNext(sqlite3_vtab_cursor *cur){ + stmt_cursor *pCur = (stmt_cursor*)cur; + pCur->iRowid++; + pCur->pStmt = sqlite3_next_stmt(pCur->db, pCur->pStmt); + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the stmt_cursor +** is currently pointing. +*/ +static int stmtColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + stmt_cursor *pCur = (stmt_cursor*)cur; + switch( i ){ + case STMT_COLUMN_SQL: { + sqlite3_result_text(ctx, sqlite3_sql(pCur->pStmt), -1, SQLITE_TRANSIENT); + break; + } + case STMT_COLUMN_NCOL: { + sqlite3_result_int(ctx, sqlite3_column_count(pCur->pStmt)); + break; + } + case STMT_COLUMN_RO: { + sqlite3_result_int(ctx, sqlite3_stmt_readonly(pCur->pStmt)); + break; + } + case STMT_COLUMN_BUSY: { + sqlite3_result_int(ctx, sqlite3_stmt_busy(pCur->pStmt)); + break; + } + case STMT_COLUMN_MEM: { + i = SQLITE_STMTSTATUS_MEMUSED + + STMT_COLUMN_NSCAN - SQLITE_STMTSTATUS_FULLSCAN_STEP; + /* Fall thru */ + } + case STMT_COLUMN_NSCAN: + case STMT_COLUMN_NSORT: + case STMT_COLUMN_NAIDX: + case STMT_COLUMN_NSTEP: + case STMT_COLUMN_REPREP: + case STMT_COLUMN_RUN: { + sqlite3_result_int(ctx, sqlite3_stmt_status(pCur->pStmt, + i-STMT_COLUMN_NSCAN+SQLITE_STMTSTATUS_FULLSCAN_STEP, 0)); + break; + } + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int stmtRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + stmt_cursor *pCur = (stmt_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int stmtEof(sqlite3_vtab_cursor *cur){ + stmt_cursor *pCur = (stmt_cursor*)cur; + return pCur->pStmt==0; +} + +/* +** This method is called to "rewind" the stmt_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to stmtColumn() or stmtRowid() or +** stmtEof(). +*/ +static int stmtFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + stmt_cursor *pCur = (stmt_cursor *)pVtabCursor; + pCur->pStmt = 0; + pCur->iRowid = 0; + return stmtNext(pVtabCursor); +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the stmt virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int stmtBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + pIdxInfo->estimatedCost = (double)500; + pIdxInfo->estimatedRows = 500; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** stmt virtual table. +*/ +static sqlite3_module stmtModule = { + 0, /* iVersion */ + 0, /* xCreate */ + stmtConnect, /* xConnect */ + stmtBestIndex, /* xBestIndex */ + stmtDisconnect, /* xDisconnect */ + 0, /* xDestroy */ + stmtOpen, /* xOpen - open a cursor */ + stmtClose, /* xClose - close a cursor */ + stmtFilter, /* xFilter - configure scan constraints */ + stmtNext, /* xNext - advance a cursor */ + stmtEof, /* xEof - check for end of scan */ + stmtColumn, /* xColumn - read data */ + stmtRowid, /* xRowid - read data */ + 0, /* xUpdate */ + 0, /* xBegin */ + 0, /* xSync */ + 0, /* xCommit */ + 0, /* xRollback */ + 0, /* xFindMethod */ + 0, /* xRename */ + 0, /* xSavepoint */ + 0, /* xRelease */ + 0, /* xRollbackTo */ +}; + +#endif /* SQLITE_OMIT_VIRTUALTABLE */ + +SQLITE_PRIVATE int sqlite3StmtVtabInit(sqlite3 *db){ + int rc = SQLITE_OK; +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3_create_module(db, "sqlite_stmt", &stmtModule, 0); +#endif + return rc; +} + +#ifndef SQLITE_CORE +#ifdef _WIN32 +__declspec(dllexport) +#endif +SQLITE_API int sqlite3_stmt_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); +#ifndef SQLITE_OMIT_VIRTUALTABLE + rc = sqlite3StmtVtabInit(db); +#endif + return rc; +} +#endif /* SQLITE_CORE */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */ + +/************** End of stmt.c ************************************************/ +#if __LINE__!=211858 +#undef SQLITE_SOURCE_ID +#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199aalt2" +#endif +/* Return the source-id for this library */ +SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } +/************************** End of sqlite3.c ******************************/ diff --git a/third_party/sqlite/sqlite3.h b/third_party/sqlite/sqlite3.h index bd64ec82..94c05138 100644 --- a/third_party/sqlite/sqlite3.h +++ b/third_party/sqlite/sqlite3.h @@ -1,5 +1,5 @@ /* -** 2001 September 15 +** 2001-09-15 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -23,16 +23,16 @@ ** ** The official C-language API documentation for SQLite is derived ** from comments in this file. This file is the authoritative source -** on how SQLite interfaces are suppose to operate. +** on how SQLite interfaces are supposed to operate. ** ** The name of this file under configuration management is "sqlite.h.in". ** The makefile makes some minor changes to this file (such as inserting ** the version number) and changes its name to "sqlite3.h" as ** part of the build process. */ -#ifndef _SQLITE3_H_ -#define _SQLITE3_H_ -#include <stdarg.h> /* Needed for the definition of va_list */ +#ifndef SQLITE3_H +#define SQLITE3_H +#include <stdarg.h> /* Needed for the definition of va_list */ /* ** Make sure we can call this stuff from C++. @@ -43,16 +43,29 @@ extern "C" { /* -** Add the ability to override 'extern' +** Provide the ability to override linkage features of the interface. */ #ifndef SQLITE_EXTERN # define SQLITE_EXTERN extern #endif - #ifndef SQLITE_API # define SQLITE_API #endif - +#ifndef SQLITE_CDECL +# define SQLITE_CDECL +#endif +#ifndef SQLITE_APICALL +# define SQLITE_APICALL +#endif +#ifndef SQLITE_STDCALL +# define SQLITE_STDCALL SQLITE_APICALL +#endif +#ifndef SQLITE_CALLBACK +# define SQLITE_CALLBACK +#endif +#ifndef SQLITE_SYSAPI +# define SQLITE_SYSAPI +#endif /* ** These no-op macros are used in front of interfaces to mark those @@ -95,37 +108,40 @@ extern "C" { ** be held constant and Z will be incremented or else Y will be incremented ** and Z will be reset to zero. ** -** Since version 3.6.18, SQLite source code has been stored in the +** Since [version 3.6.18] ([dateof:3.6.18]), +** SQLite source code has been stored in the ** <a href="http://www.fossil-scm.org/">Fossil configuration management ** system</a>. ^The SQLITE_SOURCE_ID macro evaluates to ** a string which identifies a particular check-in of SQLite ** within its configuration management system. ^The SQLITE_SOURCE_ID -** string contains the date and time of the check-in (UTC) and an SHA1 -** hash of the entire source tree. +** string contains the date and time of the check-in (UTC) and a SHA1 +** or SHA3-256 hash of the entire source tree. If the source code has +** been edited in any way since it was last checked in, then the last +** four hexadecimal digits of the hash may be modified. ** ** See also: [sqlite3_libversion()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.8.8.2" -#define SQLITE_VERSION_NUMBER 3008008 -#define SQLITE_SOURCE_ID "2015-01-30 14:30:45 7757fc721220e136620a89c9d28247f28bbbc098" +#define SQLITE_VERSION "3.24.0" +#define SQLITE_VERSION_NUMBER 3024000 +#define SQLITE_SOURCE_ID "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca" /* ** CAPI3REF: Run-Time Library Version Numbers -** KEYWORDS: sqlite3_version, sqlite3_sourceid +** KEYWORDS: sqlite3_version sqlite3_sourceid ** ** These interfaces provide the same information as the [SQLITE_VERSION], ** [SQLITE_VERSION_NUMBER], and [SQLITE_SOURCE_ID] C preprocessor macros ** but are associated with the library instead of the header file. ^(Cautious ** programmers might include assert() statements in their application to ** verify that values returned by these interfaces match the macros in -** the header, and thus insure that the application is +** the header, and thus ensure that the application is ** compiled with matching library and header files. ** ** <blockquote><pre> ** assert( sqlite3_libversion_number()==SQLITE_VERSION_NUMBER ); -** assert( strcmp(sqlite3_sourceid(),SQLITE_SOURCE_ID)==0 ); +** assert( strncmp(sqlite3_sourceid(),SQLITE_SOURCE_ID,80)==0 ); ** assert( strcmp(sqlite3_libversion(),SQLITE_VERSION)==0 ); ** </pre></blockquote>)^ ** @@ -135,9 +151,11 @@ extern "C" { ** function is provided for use in DLLs since DLL users usually do not have ** direct access to string constants within the DLL. ^The ** sqlite3_libversion_number() function returns an integer equal to -** [SQLITE_VERSION_NUMBER]. ^The sqlite3_sourceid() function returns +** [SQLITE_VERSION_NUMBER]. ^(The sqlite3_sourceid() function returns ** a pointer to a string constant whose value is the same as the -** [SQLITE_SOURCE_ID] C preprocessor macro. +** [SQLITE_SOURCE_ID] C preprocessor macro. Except if SQLite is built +** using an edited copy of [the amalgamation], then the last four characters +** of the hash might be different from [SQLITE_SOURCE_ID].)^ ** ** See also: [sqlite_version()] and [sqlite_source_id()]. */ @@ -245,7 +263,11 @@ typedef struct sqlite3 sqlite3; */ #ifdef SQLITE_INT64_TYPE typedef SQLITE_INT64_TYPE sqlite_int64; - typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# ifdef SQLITE_UINT64_TYPE + typedef SQLITE_UINT64_TYPE sqlite_uint64; +# else + typedef unsigned SQLITE_INT64_TYPE sqlite_uint64; +# endif #elif defined(_MSC_VER) || defined(__BORLANDC__) typedef __int64 sqlite_int64; typedef unsigned __int64 sqlite_uint64; @@ -266,6 +288,7 @@ typedef sqlite_uint64 sqlite3_uint64; /* ** CAPI3REF: Closing A Database Connection +** DESTRUCTOR: sqlite3 ** ** ^The sqlite3_close() and sqlite3_close_v2() routines are destructors ** for the [sqlite3] object. @@ -317,6 +340,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); /* ** CAPI3REF: One-Step Query Execution Interface +** METHOD: sqlite3 ** ** The sqlite3_exec() interface is a convenience wrapper around ** [sqlite3_prepare_v2()], [sqlite3_step()], and [sqlite3_finalize()], @@ -341,7 +365,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** from [sqlite3_malloc()] and passed back through the 5th parameter. ** To avoid memory leaks, the application should invoke [sqlite3_free()] ** on error message strings returned through the 5th parameter of -** of sqlite3_exec() after the error message string is no longer needed. +** sqlite3_exec() after the error message string is no longer needed. ** ^If the 5th parameter to sqlite3_exec() is not NULL and no errors ** occur, then sqlite3_exec() sets the pointer in its 5th parameter to ** NULL before returning. @@ -368,7 +392,7 @@ typedef int (*sqlite3_callback)(void*,int,char**, char**); ** Restrictions: ** ** <ul> -** <li> The application must insure that the 1st parameter to sqlite3_exec() +** <li> The application must ensure that the 1st parameter to sqlite3_exec() ** is a valid and open [database connection]. ** <li> The application must not close the [database connection] specified by ** the 1st parameter to sqlite3_exec() while sqlite3_exec() is running. @@ -397,7 +421,7 @@ SQLITE_API int sqlite3_exec( */ #define SQLITE_OK 0 /* Successful result */ /* beginning-of-error-codes */ -#define SQLITE_ERROR 1 /* SQL error or missing database */ +#define SQLITE_ERROR 1 /* Generic error */ #define SQLITE_INTERNAL 2 /* Internal logic error in SQLite */ #define SQLITE_PERM 3 /* Access permission denied */ #define SQLITE_ABORT 4 /* Callback routine requested an abort */ @@ -412,7 +436,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_FULL 13 /* Insertion failed because database is full */ #define SQLITE_CANTOPEN 14 /* Unable to open the database file */ #define SQLITE_PROTOCOL 15 /* Database lock protocol error */ -#define SQLITE_EMPTY 16 /* Database is empty */ +#define SQLITE_EMPTY 16 /* Internal use only */ #define SQLITE_SCHEMA 17 /* The database schema changed */ #define SQLITE_TOOBIG 18 /* String or BLOB exceeds size limit */ #define SQLITE_CONSTRAINT 19 /* Abort due to constraint violation */ @@ -420,7 +444,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_MISUSE 21 /* Library used incorrectly */ #define SQLITE_NOLFS 22 /* Uses OS features not supported on host */ #define SQLITE_AUTH 23 /* Authorization denied */ -#define SQLITE_FORMAT 24 /* Auxiliary database format error */ +#define SQLITE_FORMAT 24 /* Not used */ #define SQLITE_RANGE 25 /* 2nd parameter to sqlite3_bind out of range */ #define SQLITE_NOTADB 26 /* File opened that is not a database file */ #define SQLITE_NOTICE 27 /* Notifications from sqlite3_log() */ @@ -437,7 +461,8 @@ SQLITE_API int sqlite3_exec( ** [result codes]. However, experience has shown that many of ** these result codes are too coarse-grained. They do not provide as ** much information about problems as programmers might like. In an effort to -** address this, newer versions of SQLite (version 3.3.8 and later) include +** address this, newer versions of SQLite (version 3.3.8 [dateof:3.3.8] +** and later) include ** support for additional result codes that provide more detailed information ** about errors. These [extended result codes] are enabled or disabled ** on a per database connection basis using the @@ -445,6 +470,8 @@ SQLITE_API int sqlite3_exec( ** the most recent error can be obtained using ** [sqlite3_extended_errcode()]. */ +#define SQLITE_ERROR_MISSING_COLLSEQ (SQLITE_ERROR | (1<<8)) +#define SQLITE_ERROR_RETRY (SQLITE_ERROR | (2<<8)) #define SQLITE_IOERR_READ (SQLITE_IOERR | (1<<8)) #define SQLITE_IOERR_SHORT_READ (SQLITE_IOERR | (2<<8)) #define SQLITE_IOERR_WRITE (SQLITE_IOERR | (3<<8)) @@ -471,7 +498,13 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOERR_MMAP (SQLITE_IOERR | (24<<8)) #define SQLITE_IOERR_GETTEMPPATH (SQLITE_IOERR | (25<<8)) #define SQLITE_IOERR_CONVPATH (SQLITE_IOERR | (26<<8)) +#define SQLITE_IOERR_VNODE (SQLITE_IOERR | (27<<8)) +#define SQLITE_IOERR_AUTH (SQLITE_IOERR | (28<<8)) +#define SQLITE_IOERR_BEGIN_ATOMIC (SQLITE_IOERR | (29<<8)) +#define SQLITE_IOERR_COMMIT_ATOMIC (SQLITE_IOERR | (30<<8)) +#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8)) #define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8)) +#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8)) #define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8)) #define SQLITE_BUSY_SNAPSHOT (SQLITE_BUSY | (2<<8)) #define SQLITE_CANTOPEN_NOTEMPDIR (SQLITE_CANTOPEN | (1<<8)) @@ -479,10 +512,13 @@ SQLITE_API int sqlite3_exec( #define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8)) #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) +#define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8)) #define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8)) #define SQLITE_READONLY_ROLLBACK (SQLITE_READONLY | (3<<8)) #define SQLITE_READONLY_DBMOVED (SQLITE_READONLY | (4<<8)) +#define SQLITE_READONLY_CANTINIT (SQLITE_READONLY | (5<<8)) +#define SQLITE_READONLY_DIRECTORY (SQLITE_READONLY | (6<<8)) #define SQLITE_ABORT_ROLLBACK (SQLITE_ABORT | (2<<8)) #define SQLITE_CONSTRAINT_CHECK (SQLITE_CONSTRAINT | (1<<8)) #define SQLITE_CONSTRAINT_COMMITHOOK (SQLITE_CONSTRAINT | (2<<8)) @@ -498,6 +534,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_NOTICE_RECOVER_ROLLBACK (SQLITE_NOTICE | (2<<8)) #define SQLITE_WARNING_AUTOINDEX (SQLITE_WARNING | (1<<8)) #define SQLITE_AUTH_USER (SQLITE_AUTH | (1<<8)) +#define SQLITE_OK_LOAD_PERMANENTLY (SQLITE_OK | (1<<8)) /* ** CAPI3REF: Flags For File Open Operations @@ -552,10 +589,15 @@ SQLITE_API int sqlite3_exec( ** file that were written at the application level might have changed ** and that adjacent bytes, even bytes within the same sector are ** guaranteed to be unchanged. The SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN -** flag indicate that a file cannot be deleted when open. The +** flag indicates that a file cannot be deleted when open. The ** SQLITE_IOCAP_IMMUTABLE flag indicates that the file is on ** read-only media and cannot be changed even by processes with ** elevated privileges. +** +** The SQLITE_IOCAP_BATCH_ATOMIC property means that the underlying +** filesystem supports doing multiple write operations atomically when those +** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and +** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -571,6 +613,7 @@ SQLITE_API int sqlite3_exec( #define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 +#define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 /* ** CAPI3REF: File Locking Levels @@ -702,6 +745,10 @@ struct sqlite3_file { ** <li> [SQLITE_IOCAP_ATOMIC64K] ** <li> [SQLITE_IOCAP_SAFE_APPEND] ** <li> [SQLITE_IOCAP_SEQUENTIAL] +** <li> [SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN] +** <li> [SQLITE_IOCAP_POWERSAFE_OVERWRITE] +** <li> [SQLITE_IOCAP_IMMUTABLE] +** <li> [SQLITE_IOCAP_BATCH_ATOMIC] ** </ul> ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of @@ -756,14 +803,16 @@ struct sqlite3_io_methods { ** of the [sqlite3_io_methods] object and for the [sqlite3_file_control()] ** interface. ** +** <ul> +** <li>[[SQLITE_FCNTL_LOCKSTATE]] ** The [SQLITE_FCNTL_LOCKSTATE] opcode is used for debugging. This ** opcode causes the xFileControl method to write the current state of ** the lock (one of [SQLITE_LOCK_NONE], [SQLITE_LOCK_SHARED], ** [SQLITE_LOCK_RESERVED], [SQLITE_LOCK_PENDING], or [SQLITE_LOCK_EXCLUSIVE]) ** into an integer that the pArg argument points to. This capability -** is used during testing and only needs to be supported when SQLITE_TEST -** is defined. -** <ul> +** is used during testing and is only available when the SQLITE_TEST +** compile-time option is used. +** ** <li>[[SQLITE_FCNTL_SIZE_HINT]] ** The [SQLITE_FCNTL_SIZE_HINT] opcode is used by SQLite to give the VFS ** layer a hint of how large the database file will grow to be during the @@ -784,8 +833,13 @@ struct sqlite3_io_methods { ** <li>[[SQLITE_FCNTL_FILE_POINTER]] ** The [SQLITE_FCNTL_FILE_POINTER] opcode is used to obtain a pointer ** to the [sqlite3_file] object associated with a particular database -** connection. See the [sqlite3_file_control()] documentation for -** additional information. +** connection. See also [SQLITE_FCNTL_JOURNAL_POINTER]. +** +** <li>[[SQLITE_FCNTL_JOURNAL_POINTER]] +** The [SQLITE_FCNTL_JOURNAL_POINTER] opcode is used to obtain a pointer +** to the [sqlite3_file] object associated with the journal file (either +** the [rollback journal] or the [write-ahead log]) for a particular database +** connection. See also [SQLITE_FCNTL_FILE_POINTER]. ** ** <li>[[SQLITE_FCNTL_SYNC_OMITTED]] ** No longer in use. @@ -823,7 +877,7 @@ struct sqlite3_io_methods { ** opcode allows these two values (10 retries and 25 milliseconds of delay) ** to be adjusted. The values are changed for all database connections ** within the same process. The argument is a pointer to an array of two -** integers where the first integer i the new retry count and the second +** integers where the first integer is the new retry count and the second ** integer is the delay. If either integer is negative, then the setting ** is not changed but instead the prior value of that setting is written ** into the array entry, allowing the current retry settings to be @@ -872,6 +926,15 @@ struct sqlite3_io_methods { ** pointer in case this file-control is not implemented. This file-control ** is intended for diagnostic use only. ** +** <li>[[SQLITE_FCNTL_VFS_POINTER]] +** ^The [SQLITE_FCNTL_VFS_POINTER] opcode finds a pointer to the top-level +** [VFSes] currently in use. ^(The argument X in +** sqlite3_file_control(db,SQLITE_FCNTL_VFS_POINTER,X) must be +** of type "[sqlite3_vfs] **". This opcodes will set *X +** to a pointer to the top-level VFS.)^ +** ^When there are multiple VFS shims in the stack, this opcode finds the +** upper-most shim only. +** ** <li>[[SQLITE_FCNTL_PRAGMA]] ** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA] ** file control is sent to the open [sqlite3_file] object corresponding @@ -888,7 +951,9 @@ struct sqlite3_io_methods { ** [PRAGMA] processing continues. ^If the [SQLITE_FCNTL_PRAGMA] ** file control returns [SQLITE_OK], then the parser assumes that the ** VFS has handled the PRAGMA itself and the parser generates a no-op -** prepared statement. ^If the [SQLITE_FCNTL_PRAGMA] file control returns +** prepared statement if result string is NULL, or that returns a copy +** of the result string if the string is non-NULL. +** ^If the [SQLITE_FCNTL_PRAGMA] file control returns ** any result code other than [SQLITE_OK] or [SQLITE_NOTFOUND], that means ** that the VFS encountered an error while handling the [PRAGMA] and the ** compilation of the PRAGMA fails with an error. ^The [SQLITE_FCNTL_PRAGMA] @@ -940,18 +1005,79 @@ struct sqlite3_io_methods { ** on whether or not the file has been renamed, moved, or deleted since it ** was first opened. ** +** <li>[[SQLITE_FCNTL_WIN32_GET_HANDLE]] +** The [SQLITE_FCNTL_WIN32_GET_HANDLE] opcode can be used to obtain the +** underlying native file handle associated with a file handle. This file +** control interprets its argument as a pointer to a native file handle and +** writes the resulting value there. +** ** <li>[[SQLITE_FCNTL_WIN32_SET_HANDLE]] ** The [SQLITE_FCNTL_WIN32_SET_HANDLE] opcode is used for debugging. This ** opcode causes the xFileControl method to swap the file handle with the one ** pointed to by the pArg argument. This capability is used during testing ** and only needs to be supported when SQLITE_TEST is defined. ** +** <li>[[SQLITE_FCNTL_WAL_BLOCK]] +** The [SQLITE_FCNTL_WAL_BLOCK] is a signal to the VFS layer that it might +** be advantageous to block on the next WAL lock if the lock is not immediately +** available. The WAL subsystem issues this signal during rare +** circumstances in order to fix a problem with priority inversion. +** Applications should <em>not</em> use this file-control. +** +** <li>[[SQLITE_FCNTL_ZIPVFS]] +** The [SQLITE_FCNTL_ZIPVFS] opcode is implemented by zipvfs only. All other +** VFS should return SQLITE_NOTFOUND for this opcode. +** +** <li>[[SQLITE_FCNTL_RBU]] +** The [SQLITE_FCNTL_RBU] opcode is implemented by the special VFS used by +** the RBU extension only. All other VFS should return SQLITE_NOTFOUND for +** this opcode. +** +** <li>[[SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]] +** If the [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] opcode returns SQLITE_OK, then +** the file descriptor is placed in "batch write mode", which +** means all subsequent write operations will be deferred and done +** atomically at the next [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. Systems +** that do not support batch atomic writes will return SQLITE_NOTFOUND. +** ^Following a successful SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and prior to +** the closing [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] or +** [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE], SQLite will make +** no VFS interface calls on the same [sqlite3_file] file descriptor +** except for calls to the xWrite method and the xFileControl method +** with [SQLITE_FCNTL_SIZE_HINT]. +** +** <li>[[SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be performed atomically. +** This file control returns [SQLITE_OK] if and only if the writes were +** all performed successfully and have been committed to persistent storage. +** ^Regardless of whether or not it is successful, this file control takes +** the file descriptor out of batch write mode so that all subsequent +** write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_COMMIT_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +** <li>[[SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE]] +** The [SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE] opcode causes all write +** operations since the previous successful call to +** [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] to be rolled back. +** ^This file control takes the file descriptor out of batch write mode +** so that all subsequent write operations are independent. +** ^SQLite will never invoke SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE without +** a prior successful call to [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE]. +** +** <li>[[SQLITE_FCNTL_LOCK_TIMEOUT]] +** The [SQLITE_FCNTL_LOCK_TIMEOUT] opcode causes attempts to obtain +** a file lock using the xLock or xShmLock methods of the VFS to wait +** for up to M milliseconds before failing, where M is the single +** unsigned integer parameter. ** </ul> */ #define SQLITE_FCNTL_LOCKSTATE 1 -#define SQLITE_GET_LOCKPROXYFILE 2 -#define SQLITE_SET_LOCKPROXYFILE 3 -#define SQLITE_LAST_ERRNO 4 +#define SQLITE_FCNTL_GET_LOCKPROXYFILE 2 +#define SQLITE_FCNTL_SET_LOCKPROXYFILE 3 +#define SQLITE_FCNTL_LAST_ERRNO 4 #define SQLITE_FCNTL_SIZE_HINT 5 #define SQLITE_FCNTL_CHUNK_SIZE 6 #define SQLITE_FCNTL_FILE_POINTER 7 @@ -970,6 +1096,23 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_SYNC 21 #define SQLITE_FCNTL_COMMIT_PHASETWO 22 #define SQLITE_FCNTL_WIN32_SET_HANDLE 23 +#define SQLITE_FCNTL_WAL_BLOCK 24 +#define SQLITE_FCNTL_ZIPVFS 25 +#define SQLITE_FCNTL_RBU 26 +#define SQLITE_FCNTL_VFS_POINTER 27 +#define SQLITE_FCNTL_JOURNAL_POINTER 28 +#define SQLITE_FCNTL_WIN32_GET_HANDLE 29 +#define SQLITE_FCNTL_PDB 30 +#define SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31 +#define SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32 +#define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 +#define SQLITE_FCNTL_LOCK_TIMEOUT 34 + +/* deprecated names */ +#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE +#define SQLITE_SET_LOCKPROXYFILE SQLITE_FCNTL_SET_LOCKPROXYFILE +#define SQLITE_LAST_ERRNO SQLITE_FCNTL_LAST_ERRNO + /* ** CAPI3REF: Mutex Handle @@ -983,6 +1126,16 @@ struct sqlite3_io_methods { */ typedef struct sqlite3_mutex sqlite3_mutex; +/* +** CAPI3REF: Loadable Extension Thunk +** +** A pointer to the opaque sqlite3_api_routines structure is passed as +** the third parameter to entry points of [loadable extensions]. This +** structure must be typedefed in order to work around compiler warnings +** on some platforms. +*/ +typedef struct sqlite3_api_routines sqlite3_api_routines; + /* ** CAPI3REF: OS Interface Object ** @@ -991,12 +1144,18 @@ typedef struct sqlite3_mutex sqlite3_mutex; ** in the name of the object stands for "virtual file system". See ** the [VFS | VFS documentation] for further information. ** -** The value of the iVersion field is initially 1 but may be larger in -** future versions of SQLite. Additional fields may be appended to this -** object when the iVersion value is increased. Note that the structure -** of the sqlite3_vfs object changes in the transaction between -** SQLite version 3.5.9 and 3.6.0 and yet the iVersion field was not -** modified. +** The VFS interface is sometimes extended by adding new methods onto +** the end. Each time such an extension occurs, the iVersion field +** is incremented. The iVersion value started out as 1 in +** SQLite [version 3.5.0] on [dateof:3.5.0], then increased to 2 +** with SQLite [version 3.7.0] on [dateof:3.7.0], and then increased +** to 3 with SQLite [version 3.7.6] on [dateof:3.7.6]. Additional fields +** may be appended to the sqlite3_vfs object and the iVersion value +** may increase again in future versions of SQLite. +** Note that the structure +** of the sqlite3_vfs object changes in the transition from +** SQLite [version 3.5.9] to [version 3.6.0] on [dateof:3.6.0] +** and yet the iVersion field was not modified. ** ** The szOsFile field is the size of the subclassed [sqlite3_file] ** structure used by this VFS. mxPathname is the maximum length of @@ -1176,7 +1335,7 @@ struct sqlite3_vfs { const char *(*xNextSystemCall)(sqlite3_vfs*, const char *zName); /* ** The methods above are in versions 1 through 3 of the sqlite_vfs object. - ** New fields may be appended in figure versions. The iVersion + ** New fields may be appended in future versions. The iVersion ** value will increment whenever this happens. */ }; @@ -1332,9 +1491,11 @@ SQLITE_API int sqlite3_os_end(void); ** applications and so this routine is usually not necessary. It is ** provided to support rare applications with unusual needs. ** -** The sqlite3_config() interface is not threadsafe. The application -** must insure that no other SQLite interfaces are invoked by other -** threads while sqlite3_config() is running. Furthermore, sqlite3_config() +** <b>The sqlite3_config() interface is not threadsafe. The application +** must ensure that no other SQLite interfaces are invoked by other +** threads while sqlite3_config() is running.</b> +** +** The sqlite3_config() interface ** may only be invoked prior to library initialization using ** [sqlite3_initialize()] or after shutdown by [sqlite3_shutdown()]. ** ^If sqlite3_config() is called after [sqlite3_initialize()] and before @@ -1356,6 +1517,7 @@ SQLITE_API int sqlite3_config(int, ...); /* ** CAPI3REF: Configure database connections +** METHOD: sqlite3 ** ** The sqlite3_db_config() interface is used to make configuration ** changes to a [database connection]. The interface is similar to @@ -1521,6 +1683,16 @@ struct sqlite3_mem_methods { ** routines with a wrapper that simulations memory allocation failure or ** tracks memory usage, for example. </dd> ** +** [[SQLITE_CONFIG_SMALL_MALLOC]] <dt>SQLITE_CONFIG_SMALL_MALLOC</dt> +** <dd> ^The SQLITE_CONFIG_SMALL_MALLOC option takes single argument of +** type int, interpreted as a boolean, which if true provides a hint to +** SQLite that it should avoid large memory allocations if possible. +** SQLite will run faster if it is free to make large memory allocations, +** but some application might prefer to run slower in exchange for +** guarantees about memory fragmentation that are possible if large +** allocations are avoided. This hint is normally off. +** </dd> +** ** [[SQLITE_CONFIG_MEMSTATUS]] <dt>SQLITE_CONFIG_MEMSTATUS</dt> ** <dd> ^The SQLITE_CONFIG_MEMSTATUS option takes single argument of type int, ** interpreted as a boolean, which enables or disables the collection of @@ -1530,7 +1702,7 @@ struct sqlite3_mem_methods { ** <li> [sqlite3_memory_used()] ** <li> [sqlite3_memory_highwater()] ** <li> [sqlite3_soft_heap_limit64()] -** <li> [sqlite3_status()] +** <li> [sqlite3_status64()] ** </ul>)^ ** ^Memory allocation statistics are enabled by default unless SQLite is ** compiled with [SQLITE_DEFAULT_MEMSTATUS]=0 in which case memory @@ -1538,57 +1710,43 @@ struct sqlite3_mem_methods { ** </dd> ** ** [[SQLITE_CONFIG_SCRATCH]] <dt>SQLITE_CONFIG_SCRATCH</dt> -** <dd> ^The SQLITE_CONFIG_SCRATCH option specifies a static memory buffer -** that SQLite can use for scratch memory. ^(There are three arguments -** to SQLITE_CONFIG_SCRATCH: A pointer an 8-byte -** aligned memory buffer from which the scratch allocations will be -** drawn, the size of each scratch allocation (sz), -** and the maximum number of scratch allocations (N).)^ -** The first argument must be a pointer to an 8-byte aligned buffer -** of at least sz*N bytes of memory. -** ^SQLite will not use more than one scratch buffers per thread. -** ^SQLite will never request a scratch buffer that is more than 6 -** times the database page size. -** ^If SQLite needs needs additional -** scratch memory beyond what is provided by this configuration option, then -** [sqlite3_malloc()] will be used to obtain the memory needed.<p> -** ^When the application provides any amount of scratch memory using -** SQLITE_CONFIG_SCRATCH, SQLite avoids unnecessary large -** [sqlite3_malloc|heap allocations]. -** This can help [Robson proof|prevent memory allocation failures] due to heap -** fragmentation in low-memory embedded systems. +** <dd> The SQLITE_CONFIG_SCRATCH option is no longer used. ** </dd> ** ** [[SQLITE_CONFIG_PAGECACHE]] <dt>SQLITE_CONFIG_PAGECACHE</dt> -** <dd> ^The SQLITE_CONFIG_PAGECACHE option specifies a static memory buffer +** <dd> ^The SQLITE_CONFIG_PAGECACHE option specifies a memory pool ** that SQLite can use for the database page cache with the default page ** cache implementation. -** This configuration should not be used if an application-define page -** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2] -** configuration option. +** This configuration option is a no-op if an application-define page +** cache implementation is loaded using the [SQLITE_CONFIG_PCACHE2]. ** ^There are three arguments to SQLITE_CONFIG_PAGECACHE: A pointer to -** 8-byte aligned -** memory, the size of each page buffer (sz), and the number of pages (N). +** 8-byte aligned memory (pMem), the size of each page cache line (sz), +** and the number of cache lines (N). ** The sz argument should be the size of the largest database page ** (a power of two between 512 and 65536) plus some extra bytes for each ** page header. ^The number of extra bytes needed by the page header -** can be determined using the [SQLITE_CONFIG_PCACHE_HDRSZ] option -** to [sqlite3_config()]. +** can be determined using [SQLITE_CONFIG_PCACHE_HDRSZ]. ** ^It is harmless, apart from the wasted memory, -** for the sz parameter to be larger than necessary. The first -** argument should pointer to an 8-byte aligned block of memory that -** is at least sz*N bytes of memory, otherwise subsequent behavior is -** undefined. -** ^SQLite will use the memory provided by the first argument to satisfy its -** memory needs for the first N pages that it adds to cache. ^If additional -** page cache memory is needed beyond what is provided by this option, then -** SQLite goes to [sqlite3_malloc()] for the additional storage space.</dd> +** for the sz parameter to be larger than necessary. The pMem +** argument must be either a NULL pointer or a pointer to an 8-byte +** aligned block of memory of at least sz*N bytes, otherwise +** subsequent behavior is undefined. +** ^When pMem is not NULL, SQLite will strive to use the memory provided +** to satisfy page cache needs, falling back to [sqlite3_malloc()] if +** a page cache line is larger than sz bytes or if all of the pMem buffer +** is exhausted. +** ^If pMem is NULL and N is non-zero, then each database connection +** does an initial bulk allocation for page cache memory +** from [sqlite3_malloc()] sufficient for N cache lines if N is positive or +** of -1024*N bytes if N is negative, . ^If additional +** page cache memory is needed beyond what is provided by the initial +** allocation, then SQLite goes to [sqlite3_malloc()] separately for each +** additional cache line. </dd> ** ** [[SQLITE_CONFIG_HEAP]] <dt>SQLITE_CONFIG_HEAP</dt> ** <dd> ^The SQLITE_CONFIG_HEAP option specifies a static memory buffer ** that SQLite will use for all of its dynamic memory allocation needs -** beyond those provided for by [SQLITE_CONFIG_SCRATCH] and -** [SQLITE_CONFIG_PAGECACHE]. +** beyond those provided for by [SQLITE_CONFIG_PAGECACHE]. ** ^The SQLITE_CONFIG_HEAP option is only available if SQLite is compiled ** with either [SQLITE_ENABLE_MEMSYS3] or [SQLITE_ENABLE_MEMSYS5] and returns ** [SQLITE_ERROR] if invoked otherwise. @@ -1741,7 +1899,6 @@ struct sqlite3_mem_methods { ** compiled for Windows with the [SQLITE_WIN32_MALLOC] pre-processor macro ** defined. ^SQLITE_CONFIG_WIN32_HEAPSIZE takes a 32-bit unsigned integer value ** that specifies the maximum size of the created heap. -** </dl> ** ** [[SQLITE_CONFIG_PCACHE_HDRSZ]] ** <dt>SQLITE_CONFIG_PCACHE_HDRSZ @@ -1761,6 +1918,36 @@ struct sqlite3_mem_methods { ** is enabled (using the [PRAGMA threads] command) and the amount of content ** to be sorted exceeds the page size times the minimum of the ** [PRAGMA cache_size] setting and this value. +** +** [[SQLITE_CONFIG_STMTJRNL_SPILL]] +** <dt>SQLITE_CONFIG_STMTJRNL_SPILL +** <dd>^The SQLITE_CONFIG_STMTJRNL_SPILL option takes a single parameter which +** becomes the [statement journal] spill-to-disk threshold. +** [Statement journals] are held in memory until their size (in bytes) +** exceeds this threshold, at which point they are written to disk. +** Or if the threshold is -1, statement journals are always held +** exclusively in memory. +** Since many statement journals never become large, setting the spill +** threshold to a value such as 64KiB can greatly reduce the amount of +** I/O required to support statement rollback. +** The default value for this setting is controlled by the +** [SQLITE_STMTJRNL_SPILL] compile-time option. +** +** [[SQLITE_CONFIG_SORTERREF_SIZE]] +** <dt>SQLITE_CONFIG_SORTERREF_SIZE +** <dd>The SQLITE_CONFIG_SORTERREF_SIZE option accepts a single parameter +** of type (int) - the new value of the sorter-reference size threshold. +** Usually, when SQLite uses an external sort to order records according +** to an ORDER BY clause, all fields required by the caller are present in the +** sorted records. However, if SQLite determines based on the declared type +** of a table column that its values are likely to be very large - larger +** than the configured sorter-reference size threshold - then a reference +** is stored in each sorted record and the required column values loaded +** from the database as records are returned in sorted order. The default +** value for this option is to never use this optimization. Specifying a +** negative value for this option restores the default behaviour. +** This option is only available if SQLite is compiled with the +** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. ** </dl> */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -1768,7 +1955,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_SERIALIZED 3 /* nil */ #define SQLITE_CONFIG_MALLOC 4 /* sqlite3_mem_methods* */ #define SQLITE_CONFIG_GETMALLOC 5 /* sqlite3_mem_methods* */ -#define SQLITE_CONFIG_SCRATCH 6 /* void*, int sz, int N */ +#define SQLITE_CONFIG_SCRATCH 6 /* No longer used */ #define SQLITE_CONFIG_PAGECACHE 7 /* void*, int sz, int N */ #define SQLITE_CONFIG_HEAP 8 /* void*, int nByte, int min */ #define SQLITE_CONFIG_MEMSTATUS 9 /* boolean */ @@ -1788,6 +1975,9 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_WIN32_HEAPSIZE 23 /* int nByte */ #define SQLITE_CONFIG_PCACHE_HDRSZ 24 /* int *psz */ #define SQLITE_CONFIG_PMASZ 25 /* unsigned int szPma */ +#define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ +#define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ +#define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ /* ** CAPI3REF: Database Connection Configuration Options @@ -1845,15 +2035,117 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the trigger setting is not reported back. </dd> ** +** <dt>SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</dt> +** <dd> ^This option is used to enable or disable the two-argument +** version of the [fts3_tokenizer()] function which is part of the +** [FTS3] full-text search engine extension. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable fts3_tokenizer() or +** positive to enable fts3_tokenizer() or negative to leave the setting +** unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether fts3_tokenizer is disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the new setting is not reported back. </dd> +** +** <dt>SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION</dt> +** <dd> ^This option is used to enable or disable the [sqlite3_load_extension()] +** interface independently of the [load_extension()] SQL function. +** The [sqlite3_enable_load_extension()] API enables or disables both the +** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. +** There should be two additional arguments. +** When the first argument to this interface is 1, then only the C-API is +** enabled and the SQL function remains disabled. If the first argument to +** this interface is 0, then both the C-API and the SQL function are disabled. +** If the first argument is -1, then no changes are made to state of either the +** C-API or the SQL function. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether [sqlite3_load_extension()] interface +** is disabled or enabled following this call. The second parameter may +** be a NULL pointer, in which case the new setting is not reported back. +** </dd> +** +** <dt>SQLITE_DBCONFIG_MAINDBNAME</dt> +** <dd> ^This option is used to change the name of the "main" database +** schema. ^The sole argument is a pointer to a constant UTF8 string +** which will become the new schema name in place of "main". ^SQLite +** does not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into this DBCONFIG option is unchanged +** until after the database connection closes. +** </dd> +** +** <dt>SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</dt> +** <dd> Usually, when a database in wal mode is closed or detached from a +** database handle, SQLite checks if this will mean that there are now no +** connections at all to the database. If so, it performs a checkpoint +** operation before closing the connection. This option may be used to +** override this behaviour. The first parameter passed to this operation +** is an integer - positive to disable checkpoints-on-close, or zero (the +** default) to enable them, and negative to leave the setting unchanged. +** The second parameter is a pointer to an integer +** into which is written 0 or 1 to indicate whether checkpoints-on-close +** have been disabled - 0 if they are not disabled, 1 if they are. +** </dd> +** +** <dt>SQLITE_DBCONFIG_ENABLE_QPSG</dt> +** <dd>^(The SQLITE_DBCONFIG_ENABLE_QPSG option activates or deactivates +** the [query planner stability guarantee] (QPSG). When the QPSG is active, +** a single SQL query statement will always use the same algorithm regardless +** of values of [bound parameters].)^ The QPSG disables some query optimizations +** that look at the values of bound parameters, which can make some queries +** slower. But the QPSG has the advantage of more predictable behavior. With +** the QPSG active, SQLite will always use the same query plan in the field as +** was used during testing in the lab. +** The first argument to this setting is an integer which is 0 to disable +** the QPSG, positive to enable QPSG, or negative to leave the setting +** unchanged. The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether the QPSG is disabled or enabled +** following this call. +** </dd> +** +** <dt>SQLITE_DBCONFIG_TRIGGER_EQP</dt> +** <dd> By default, the output of EXPLAIN QUERY PLAN commands does not +** include output for any operations performed by trigger programs. This +** option is used to set or clear (the default) a flag that governs this +** behavior. The first parameter passed to this operation is an integer - +** positive to enable output for trigger programs, or zero to disable it, +** or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which is written +** 0 or 1 to indicate whether output-for-triggers has been disabled - 0 if +** it is not disabled, 1 if it is. +** </dd> +** +** <dt>SQLITE_DBCONFIG_RESET_DATABASE</dt> +** <dd> Set the SQLITE_DBCONFIG_RESET_DATABASE flag and then run +** [VACUUM] in order to reset a database back to an empty database +** with no schema and no content. The following process works even for +** a badly corrupted database file: +** <ol> +** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0); +** <li> [sqlite3_exec](db, "[VACUUM]", 0, 0, 0); +** <li> sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 0, 0); +** </ol> +** Because resetting a database is destructive and irreversible, the +** process requires the use of this obscure API and multiple steps to help +** ensure that it does not happen by accident. +** </dd> ** </dl> */ -#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ -#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ -#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ - +#define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ +#define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ +#define SQLITE_DBCONFIG_ENABLE_FKEY 1002 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_TRIGGER 1003 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005 /* int int* */ +#define SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_QPSG 1007 /* int int* */ +#define SQLITE_DBCONFIG_TRIGGER_EQP 1008 /* int int* */ +#define SQLITE_DBCONFIG_RESET_DATABASE 1009 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1009 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes +** METHOD: sqlite3 ** ** ^The sqlite3_extended_result_codes() routine enables or disables the ** [extended result codes] feature of SQLite. ^The extended result @@ -1863,6 +2155,7 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); /* ** CAPI3REF: Last Insert Rowid +** METHOD: sqlite3 ** ** ^Each entry in most SQLite tables (except for [WITHOUT ROWID] tables) ** has a unique 64-bit signed @@ -1872,20 +2165,30 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); ** the table has a column of type [INTEGER PRIMARY KEY] then that column ** is another alias for the rowid. ** -** ^The sqlite3_last_insert_rowid(D) interface returns the [rowid] of the -** most recent successful [INSERT] into a rowid table or [virtual table] -** on database connection D. -** ^Inserts into [WITHOUT ROWID] tables are not recorded. -** ^If no successful [INSERT]s into rowid tables -** have ever occurred on the database connection D, -** then sqlite3_last_insert_rowid(D) returns zero. +** ^The sqlite3_last_insert_rowid(D) interface usually returns the [rowid] of +** the most recent successful [INSERT] into a rowid table or [virtual table] +** on database connection D. ^Inserts into [WITHOUT ROWID] tables are not +** recorded. ^If no successful [INSERT]s into rowid tables have ever occurred +** on the database connection D, then sqlite3_last_insert_rowid(D) returns +** zero. ** -** ^(If an [INSERT] occurs within a trigger or within a [virtual table] -** method, then this routine will return the [rowid] of the inserted -** row as long as the trigger or virtual table method is running. -** But once the trigger or virtual table method ends, the value returned -** by this routine reverts to what it was before the trigger or virtual -** table method began.)^ +** As well as being set automatically as rows are inserted into database +** tables, the value returned by this function may be set explicitly by +** [sqlite3_set_last_insert_rowid()] +** +** Some virtual table implementations may INSERT rows into rowid tables as +** part of committing a transaction (e.g. to flush data accumulated in memory +** to disk). In this case subsequent calls to this function return the rowid +** associated with these internal INSERT operations, which leads to +** unintuitive results. Virtual table implementations that do write to rowid +** tables in this way can avoid this problem by restoring the original +** rowid value using [sqlite3_set_last_insert_rowid()] before returning +** control to the user. +** +** ^(If an [INSERT] occurs within a trigger then this routine will +** return the [rowid] of the inserted row as long as the trigger is +** running. Once the trigger program ends, the value returned +** by this routine reverts to what it was before the trigger was fired.)^ ** ** ^An [INSERT] that fails due to a constraint violation is not a ** successful [INSERT] and does not change the value returned by this @@ -1912,8 +2215,19 @@ SQLITE_API int sqlite3_extended_result_codes(sqlite3*, int onoff); */ SQLITE_API sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*); +/* +** CAPI3REF: Set the Last Insert Rowid value. +** METHOD: sqlite3 +** +** The sqlite3_set_last_insert_rowid(D, R) method allows the application to +** set the value returned by calling sqlite3_last_insert_rowid(D) to R +** without inserting a row into the database. +*/ +SQLITE_API void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); + /* ** CAPI3REF: Count The Number Of Rows Modified +** METHOD: sqlite3 ** ** ^This function returns the number of rows modified, inserted or ** deleted by the most recently completed INSERT, UPDATE or DELETE @@ -1966,6 +2280,7 @@ SQLITE_API int sqlite3_changes(sqlite3*); /* ** CAPI3REF: Total Number Of Rows Modified +** METHOD: sqlite3 ** ** ^This function returns the total number of rows inserted, modified or ** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed @@ -1989,6 +2304,7 @@ SQLITE_API int sqlite3_total_changes(sqlite3*); /* ** CAPI3REF: Interrupt A Long-Running Query +** METHOD: sqlite3 ** ** ^This function causes any pending database operation to abort and ** return at its earliest opportunity. This routine is typically @@ -2020,9 +2336,6 @@ SQLITE_API int sqlite3_total_changes(sqlite3*); ** ^A call to sqlite3_interrupt(D) that occurs when there are no running ** SQL statements is a no-op and has no effect on SQL statements ** that are started after the sqlite3_interrupt() call returns. -** -** If the database connection closes while [sqlite3_interrupt()] -** is running then bad things will likely happen. */ SQLITE_API void sqlite3_interrupt(sqlite3*); @@ -2065,6 +2378,7 @@ SQLITE_API int sqlite3_complete16(const void *sql); /* ** CAPI3REF: Register A Callback To Handle SQLITE_BUSY Errors ** KEYWORDS: {busy-handler callback} {busy handler} +** METHOD: sqlite3 ** ** ^The sqlite3_busy_handler(D,X,P) routine sets a callback function X ** that might be invoked with argument P whenever @@ -2120,10 +2434,11 @@ SQLITE_API int sqlite3_complete16(const void *sql); ** A busy handler must not close the database connection ** or [prepared statement] that invoked the busy handler. */ -SQLITE_API int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*); +SQLITE_API int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*); /* ** CAPI3REF: Set A Busy Timeout +** METHOD: sqlite3 ** ** ^This routine sets a [sqlite3_busy_handler | busy handler] that sleeps ** for a specified amount of time when a table is locked. ^The handler @@ -2146,6 +2461,7 @@ SQLITE_API int sqlite3_busy_timeout(sqlite3*, int ms); /* ** CAPI3REF: Convenience Routines For Running Queries +** METHOD: sqlite3 ** ** This is a legacy interface that is preserved for backwards compatibility. ** Use of this interface is not recommended. @@ -2231,12 +2547,16 @@ SQLITE_API void sqlite3_free_table(char **result); ** ** These routines are work-alikes of the "printf()" family of functions ** from the standard C library. +** These routines understand most of the common formatting options from +** the standard library printf() +** plus some additional non-standard formats ([%q], [%Q], [%w], and [%z]). +** See the [built-in printf()] documentation for details. ** ** ^The sqlite3_mprintf() and sqlite3_vmprintf() routines write their -** results into memory obtained from [sqlite3_malloc()]. +** results into memory obtained from [sqlite3_malloc64()]. ** The strings returned by these two routines should be ** released by [sqlite3_free()]. ^Both routines return a -** NULL pointer if [sqlite3_malloc()] is unable to allocate enough +** NULL pointer if [sqlite3_malloc64()] is unable to allocate enough ** memory to hold the resulting string. ** ** ^(The sqlite3_snprintf() routine is similar to "snprintf()" from @@ -2260,65 +2580,7 @@ SQLITE_API void sqlite3_free_table(char **result); ** ** ^The sqlite3_vsnprintf() routine is a varargs version of sqlite3_snprintf(). ** -** These routines all implement some additional formatting -** options that are useful for constructing SQL statements. -** All of the usual printf() formatting options apply. In addition, there -** is are "%q", "%Q", and "%z" options. -** -** ^(The %q option works like %s in that it substitutes a nul-terminated -** string from the argument list. But %q also doubles every '\'' character. -** %q is designed for use inside a string literal.)^ By doubling each '\'' -** character it escapes that character and allows it to be inserted into -** the string. -** -** For example, assume the string variable zText contains text as follows: -** -** <blockquote><pre> -** char *zText = "It's a happy day!"; -** </pre></blockquote> -** -** One can use this text in an SQL statement as follows: -** -** <blockquote><pre> -** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES('%q')", zText); -** sqlite3_exec(db, zSQL, 0, 0, 0); -** sqlite3_free(zSQL); -** </pre></blockquote> -** -** Because the %q format string is used, the '\'' character in zText -** is escaped and the SQL generated is as follows: -** -** <blockquote><pre> -** INSERT INTO table1 VALUES('It''s a happy day!') -** </pre></blockquote> -** -** This is correct. Had we used %s instead of %q, the generated SQL -** would have looked like this: -** -** <blockquote><pre> -** INSERT INTO table1 VALUES('It's a happy day!'); -** </pre></blockquote> -** -** This second example is an SQL syntax error. As a general rule you should -** always use %q instead of %s when inserting text into a string literal. -** -** ^(The %Q option works like %q except it also adds single quotes around -** the outside of the total string. Additionally, if the parameter in the -** argument list is a NULL pointer, %Q substitutes the text "NULL" (without -** single quotes).)^ So, for example, one could say: -** -** <blockquote><pre> -** char *zSQL = sqlite3_mprintf("INSERT INTO table VALUES(%Q)", zText); -** sqlite3_exec(db, zSQL, 0, 0, 0); -** sqlite3_free(zSQL); -** </pre></blockquote> -** -** The code above will render a correct SQL statement in the zSQL -** variable even if the zText variable is a NULL pointer. -** -** ^(The "%z" formatting option works like "%s" but with the -** addition that after the string has been read and copied into -** the result, [sqlite3_free()] is called on the input string.)^ +** See also: [built-in printf()], [printf() SQL function] */ SQLITE_API char *sqlite3_mprintf(const char*,...); SQLITE_API char *sqlite3_vmprintf(const char*, va_list); @@ -2471,12 +2733,15 @@ SQLITE_API void sqlite3_randomness(int N, void *P); /* ** CAPI3REF: Compile-Time Authorization Callbacks +** METHOD: sqlite3 +** KEYWORDS: {authorizer callback} ** ** ^This routine registers an authorizer callback with a particular ** [database connection], supplied in the first argument. ** ^The authorizer callback is invoked as SQL statements are being compiled ** by [sqlite3_prepare()] or its variants [sqlite3_prepare_v2()], -** [sqlite3_prepare16()] and [sqlite3_prepare16_v2()]. ^At various +** [sqlite3_prepare_v3()], [sqlite3_prepare16()], [sqlite3_prepare16_v2()], +** and [sqlite3_prepare16_v3()]. ^At various ** points during the compilation process, as logic is being created ** to perform various actions, the authorizer callback is invoked to ** see if those actions are allowed. ^The authorizer callback should @@ -2498,8 +2763,10 @@ SQLITE_API void sqlite3_randomness(int N, void *P); ** parameter to the sqlite3_set_authorizer() interface. ^The second parameter ** to the callback is an integer [SQLITE_COPY | action code] that specifies ** the particular action to be authorized. ^The third through sixth parameters -** to the callback are zero-terminated strings that contain additional -** details about the action to be authorized. +** to the callback are either NULL pointers or zero-terminated strings +** that contain additional details about the action to be authorized. +** Applications must always be prepared to encounter a NULL pointer in any +** of the third through the sixth parameters of the authorization callback. ** ** ^If the action code is [SQLITE_READ] ** and the callback returns [SQLITE_IGNORE] then the @@ -2508,6 +2775,10 @@ SQLITE_API void sqlite3_randomness(int N, void *P); ** been read if [SQLITE_OK] had been returned. The [SQLITE_IGNORE] ** return can be used to deny an untrusted user access to individual ** columns of a table. +** ^When a table is referenced by a [SELECT] but no column values are +** extracted from that table (for example in a query like +** "SELECT count(*) FROM tab") then the [SQLITE_READ] authorizer callback +** is invoked once for that table with a column name that is an empty string. ** ^If the action code is [SQLITE_DELETE] and the callback returns ** [SQLITE_IGNORE] then the [DELETE] operation proceeds but the ** [truncate optimization] is disabled and all rows are deleted individually. @@ -2627,6 +2898,10 @@ SQLITE_API int sqlite3_set_authorizer( /* ** CAPI3REF: Tracing And Profiling Functions +** METHOD: sqlite3 +** +** These routines are deprecated. Use the [sqlite3_trace_v2()] interface +** instead of the routines described here. ** ** These routines register callback functions that can be used for ** tracing and profiling the execution of SQL statements. @@ -2653,12 +2928,107 @@ SQLITE_API int sqlite3_set_authorizer( ** sqlite3_profile() function is considered experimental and is ** subject to change in future versions of SQLite. */ -SQLITE_API void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); -SQLITE_API SQLITE_EXPERIMENTAL void *sqlite3_profile(sqlite3*, +SQLITE_API SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, + void(*xTrace)(void*,const char*), void*); +SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*, void(*xProfile)(void*,const char*,sqlite3_uint64), void*); +/* +** CAPI3REF: SQL Trace Event Codes +** KEYWORDS: SQLITE_TRACE +** +** These constants identify classes of events that can be monitored +** using the [sqlite3_trace_v2()] tracing logic. The M argument +** to [sqlite3_trace_v2(D,M,X,P)] is an OR-ed combination of one or more of +** the following constants. ^The first argument to the trace callback +** is one of the following constants. +** +** New tracing constants may be added in future releases. +** +** ^A trace callback has four arguments: xCallback(T,C,P,X). +** ^The T argument is one of the integer type codes above. +** ^The C argument is a copy of the context pointer passed in as the +** fourth argument to [sqlite3_trace_v2()]. +** The P and X arguments are pointers whose meanings depend on T. +** +** <dl> +** [[SQLITE_TRACE_STMT]] <dt>SQLITE_TRACE_STMT</dt> +** <dd>^An SQLITE_TRACE_STMT callback is invoked when a prepared statement +** first begins running and possibly at other times during the +** execution of the prepared statement, such as at the start of each +** trigger subprogram. ^The P argument is a pointer to the +** [prepared statement]. ^The X argument is a pointer to a string which +** is the unexpanded SQL text of the prepared statement or an SQL comment +** that indicates the invocation of a trigger. ^The callback can compute +** the same text that would have been returned by the legacy [sqlite3_trace()] +** interface by using the X argument when X begins with "--" and invoking +** [sqlite3_expanded_sql(P)] otherwise. +** +** [[SQLITE_TRACE_PROFILE]] <dt>SQLITE_TRACE_PROFILE</dt> +** <dd>^An SQLITE_TRACE_PROFILE callback provides approximately the same +** information as is provided by the [sqlite3_profile()] callback. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument points to a 64-bit integer which is the estimated of +** the number of nanosecond that the prepared statement took to run. +** ^The SQLITE_TRACE_PROFILE callback is invoked when the statement finishes. +** +** [[SQLITE_TRACE_ROW]] <dt>SQLITE_TRACE_ROW</dt> +** <dd>^An SQLITE_TRACE_ROW callback is invoked whenever a prepared +** statement generates a single row of result. +** ^The P argument is a pointer to the [prepared statement] and the +** X argument is unused. +** +** [[SQLITE_TRACE_CLOSE]] <dt>SQLITE_TRACE_CLOSE</dt> +** <dd>^An SQLITE_TRACE_CLOSE callback is invoked when a database +** connection closes. +** ^The P argument is a pointer to the [database connection] object +** and the X argument is unused. +** </dl> +*/ +#define SQLITE_TRACE_STMT 0x01 +#define SQLITE_TRACE_PROFILE 0x02 +#define SQLITE_TRACE_ROW 0x04 +#define SQLITE_TRACE_CLOSE 0x08 + +/* +** CAPI3REF: SQL Trace Hook +** METHOD: sqlite3 +** +** ^The sqlite3_trace_v2(D,M,X,P) interface registers a trace callback +** function X against [database connection] D, using property mask M +** and context pointer P. ^If the X callback is +** NULL or if the M mask is zero, then tracing is disabled. The +** M argument should be the bitwise OR-ed combination of +** zero or more [SQLITE_TRACE] constants. +** +** ^Each call to either sqlite3_trace() or sqlite3_trace_v2() overrides +** (cancels) any prior calls to sqlite3_trace() or sqlite3_trace_v2(). +** +** ^The X callback is invoked whenever any of the events identified by +** mask M occur. ^The integer return value from the callback is currently +** ignored, though this may change in future releases. Callback +** implementations should return zero to ensure future compatibility. +** +** ^A trace callback is invoked with four arguments: callback(T,C,P,X). +** ^The T argument is one of the [SQLITE_TRACE] +** constants to indicate why the callback was invoked. +** ^The C argument is a copy of the context pointer. +** The P and X arguments are pointers whose meanings depend on T. +** +** The sqlite3_trace_v2() interface is intended to replace the legacy +** interfaces [sqlite3_trace()] and [sqlite3_profile()], both of which +** are deprecated. +*/ +SQLITE_API int sqlite3_trace_v2( + sqlite3*, + unsigned uMask, + int(*xCallback)(unsigned,void*,void*,void*), + void *pCtx +); + /* ** CAPI3REF: Query Progress Callbacks +** METHOD: sqlite3 ** ** ^The sqlite3_progress_handler(D,N,X,P) interface causes the callback ** function X to be invoked periodically during long running calls to @@ -2692,6 +3062,7 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); /* ** CAPI3REF: Opening A New Database Connection +** CONSTRUCTOR: sqlite3 ** ** ^These routines open an SQLite database file as specified by the ** filename argument. ^The filename argument is interpreted as UTF-8 for @@ -2777,10 +3148,10 @@ SQLITE_API void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ^If [URI filename] interpretation is enabled, and the filename argument ** begins with "file:", then the filename is interpreted as a URI. ^URI ** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is -** set in the fourth argument to sqlite3_open_v2(), or if it has +** set in the third argument to sqlite3_open_v2(), or if it has ** been enabled globally using the [SQLITE_CONFIG_URI] option with the ** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option. -** As of SQLite version 3.7.7, URI filename interpretation is turned off +** URI filename interpretation is turned off ** by default, but future releases of SQLite might enable URI filename ** interpretation by default. See "[URI filenames]" for additional ** information. @@ -2977,12 +3348,15 @@ SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int /* ** CAPI3REF: Error Codes And Messages +** METHOD: sqlite3 ** -** ^The sqlite3_errcode() interface returns the numeric [result code] or -** [extended result code] for the most recent failed sqlite3_* API call -** associated with a [database connection]. If a prior API call failed -** but the most recent API call succeeded, the return value from -** sqlite3_errcode() is undefined. ^The sqlite3_extended_errcode() +** ^If the most recent sqlite3_* API call associated with +** [database connection] D failed, then the sqlite3_errcode(D) interface +** returns the numeric [result code] or [extended result code] for that +** API call. +** If the most recent API call was successful, +** then the return value from sqlite3_errcode() is undefined. +** ^The sqlite3_extended_errcode() ** interface is the same except that it always returns the ** [extended result code] even when extended result codes are ** disabled. @@ -3020,33 +3394,34 @@ SQLITE_API const void *sqlite3_errmsg16(sqlite3*); SQLITE_API const char *sqlite3_errstr(int); /* -** CAPI3REF: SQL Statement Object +** CAPI3REF: Prepared Statement Object ** KEYWORDS: {prepared statement} {prepared statements} ** -** An instance of this object represents a single SQL statement. -** This object is variously known as a "prepared statement" or a -** "compiled SQL statement" or simply as a "statement". +** An instance of this object represents a single SQL statement that +** has been compiled into binary form and is ready to be evaluated. ** -** The life of a statement object goes something like this: +** Think of each SQL statement as a separate computer program. The +** original SQL text is source code. A prepared statement object +** is the compiled object code. All SQL must be converted into a +** prepared statement before it can be run. +** +** The life-cycle of a prepared statement object usually goes like this: ** ** <ol> -** <li> Create the object using [sqlite3_prepare_v2()] or a related -** function. -** <li> Bind values to [host parameters] using the sqlite3_bind_*() +** <li> Create the prepared statement object using [sqlite3_prepare_v2()]. +** <li> Bind values to [parameters] using the sqlite3_bind_*() ** interfaces. ** <li> Run the SQL by calling [sqlite3_step()] one or more times. -** <li> Reset the statement using [sqlite3_reset()] then go back +** <li> Reset the prepared statement using [sqlite3_reset()] then go back ** to step 2. Do this zero or more times. ** <li> Destroy the object using [sqlite3_finalize()]. ** </ol> -** -** Refer to documentation on individual methods above for additional -** information. */ typedef struct sqlite3_stmt sqlite3_stmt; /* ** CAPI3REF: Run-time Limits +** METHOD: sqlite3 ** ** ^(This interface allows the size of various constructs to be limited ** on a connection by connection basis. The first parameter is the @@ -3115,9 +3490,9 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** ** [[SQLITE_LIMIT_VDBE_OP]] ^(<dt>SQLITE_LIMIT_VDBE_OP</dt> ** <dd>The maximum number of instructions in a virtual machine program -** used to implement an SQL statement. This limit is not currently -** enforced, though that might be added in some future release of -** SQLite.</dd>)^ +** used to implement an SQL statement. If [sqlite3_prepare_v2()] or +** the equivalent tries to allocate space for more than this many opcodes +** in a single prepared statement, an SQLITE_NOMEM error is returned.</dd>)^ ** ** [[SQLITE_LIMIT_FUNCTION_ARG]] ^(<dt>SQLITE_LIMIT_FUNCTION_ARG</dt> ** <dd>The maximum number of arguments on a function.</dd>)^ @@ -3155,32 +3530,68 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); #define SQLITE_LIMIT_TRIGGER_DEPTH 10 #define SQLITE_LIMIT_WORKER_THREADS 11 +/* +** CAPI3REF: Prepare Flags +** +** These constants define various flags that can be passed into +** "prepFlags" parameter of the [sqlite3_prepare_v3()] and +** [sqlite3_prepare16_v3()] interfaces. +** +** New flags may be added in future releases of SQLite. +** +** <dl> +** [[SQLITE_PREPARE_PERSISTENT]] ^(<dt>SQLITE_PREPARE_PERSISTENT</dt> +** <dd>The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner +** that the prepared statement will be retained for a long time and +** probably reused many times.)^ ^Without this flag, [sqlite3_prepare_v3()] +** and [sqlite3_prepare16_v3()] assume that the prepared statement will +** be used just once or at most a few times and then destroyed using +** [sqlite3_finalize()] relatively soon. The current implementation acts +** on this hint by avoiding the use of [lookaside memory] so as not to +** deplete the limited store of lookaside memory. Future versions of +** SQLite may act on this hint differently. +** </dl> +*/ +#define SQLITE_PREPARE_PERSISTENT 0x01 + /* ** CAPI3REF: Compiling An SQL Statement ** KEYWORDS: {SQL statement compiler} +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_stmt ** -** To execute an SQL query, it must first be compiled into a byte-code -** program using one of these routines. +** To execute an SQL statement, it must first be compiled into a byte-code +** program using one of these routines. Or, in other words, these routines +** are constructors for the [prepared statement] object. +** +** The preferred routine to use is [sqlite3_prepare_v2()]. The +** [sqlite3_prepare()] interface is legacy and should be avoided. +** [sqlite3_prepare_v3()] has an extra "prepFlags" option that is used +** for special purposes. +** +** The use of the UTF-8 interfaces is preferred, as SQLite currently +** does all parsing using UTF-8. The UTF-16 interfaces are provided +** as a convenience. The UTF-16 interfaces work by converting the +** input text into UTF-8, then invoking the corresponding UTF-8 interface. ** ** The first argument, "db", is a [database connection] obtained from a ** prior successful call to [sqlite3_open()], [sqlite3_open_v2()] or ** [sqlite3_open16()]. The database connection must not have been closed. ** ** The second argument, "zSql", is the statement to be compiled, encoded -** as either UTF-8 or UTF-16. The sqlite3_prepare() and sqlite3_prepare_v2() -** interfaces use UTF-8, and sqlite3_prepare16() and sqlite3_prepare16_v2() -** use UTF-16. +** as either UTF-8 or UTF-16. The sqlite3_prepare(), sqlite3_prepare_v2(), +** and sqlite3_prepare_v3() +** interfaces use UTF-8, and sqlite3_prepare16(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() use UTF-16. ** -** ^If the nByte argument is less than zero, then zSql is read up to the -** first zero terminator. ^If nByte is non-negative, then it is the maximum -** number of bytes read from zSql. ^When nByte is non-negative, the -** zSql string ends at either the first '\000' or '\u0000' character or -** the nByte-th byte, whichever comes first. If the caller knows -** that the supplied string is nul-terminated, then there is a small -** performance advantage to be gained by passing an nByte parameter that -** is equal to the number of bytes in the input string <i>including</i> -** the nul-terminator bytes as this saves SQLite from having to -** make a copy of the input string. +** ^If the nByte argument is negative, then zSql is read up to the +** first zero terminator. ^If nByte is positive, then it is the +** number of bytes read from zSql. ^If nByte is zero, then no prepared +** statement is generated. +** If the caller knows that the supplied string is nul-terminated, then +** there is a small performance advantage to passing an nByte parameter that +** is the number of bytes in the input string <i>including</i> +** the nul-terminator. ** ** ^If pzTail is not NULL then *pzTail is made to point to the first byte ** past the end of the first SQL statement in zSql. These routines only @@ -3198,10 +3609,11 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** ^On success, the sqlite3_prepare() family of routines return [SQLITE_OK]; ** otherwise an [error code] is returned. ** -** The sqlite3_prepare_v2() and sqlite3_prepare16_v2() interfaces are -** recommended for all new programs. The two older interfaces are retained -** for backwards compatibility, but their use is discouraged. -** ^In the "v2" interfaces, the prepared statement +** The sqlite3_prepare_v2(), sqlite3_prepare_v3(), sqlite3_prepare16_v2(), +** and sqlite3_prepare16_v3() interfaces are recommended for all new programs. +** The older interfaces (sqlite3_prepare() and sqlite3_prepare16()) +** are retained for backwards compatibility, but their use is discouraged. +** ^In the "vX" interfaces, the prepared statement ** that is returned (the [sqlite3_stmt] object) contains a copy of the ** original SQL text. This causes the [sqlite3_step()] interface to ** behave differently in three ways: @@ -3235,6 +3647,12 @@ SQLITE_API int sqlite3_limit(sqlite3*, int id, int newVal); ** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. ** </li> ** </ol> +** +** <p>^sqlite3_prepare_v3() differs from sqlite3_prepare_v2() only in having +** the extra prepFlags parameter, which is a bit array consisting of zero or +** more of the [SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_*] flags. ^The +** sqlite3_prepare_v2() interface works exactly the same as +** sqlite3_prepare_v3() with a zero prepFlags parameter. */ SQLITE_API int sqlite3_prepare( sqlite3 *db, /* Database handle */ @@ -3250,6 +3668,14 @@ SQLITE_API int sqlite3_prepare_v2( sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const char **pzTail /* OUT: Pointer to unused portion of zSql */ ); +SQLITE_API int sqlite3_prepare_v3( + sqlite3 *db, /* Database handle */ + const char *zSql, /* SQL statement, UTF-8 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const char **pzTail /* OUT: Pointer to unused portion of zSql */ +); SQLITE_API int sqlite3_prepare16( sqlite3 *db, /* Database handle */ const void *zSql, /* SQL statement, UTF-16 encoded */ @@ -3264,18 +3690,53 @@ SQLITE_API int sqlite3_prepare16_v2( sqlite3_stmt **ppStmt, /* OUT: Statement handle */ const void **pzTail /* OUT: Pointer to unused portion of zSql */ ); +SQLITE_API int sqlite3_prepare16_v3( + sqlite3 *db, /* Database handle */ + const void *zSql, /* SQL statement, UTF-16 encoded */ + int nByte, /* Maximum length of zSql in bytes. */ + unsigned int prepFlags, /* Zero or more SQLITE_PREPARE_ flags */ + sqlite3_stmt **ppStmt, /* OUT: Statement handle */ + const void **pzTail /* OUT: Pointer to unused portion of zSql */ +); /* ** CAPI3REF: Retrieving Statement SQL +** METHOD: sqlite3_stmt ** -** ^This interface can be used to retrieve a saved copy of the original -** SQL text used to create a [prepared statement] if that statement was -** compiled using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()]. +** ^The sqlite3_sql(P) interface returns a pointer to a copy of the UTF-8 +** SQL text used to create [prepared statement] P if P was +** created by [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. +** ^The sqlite3_expanded_sql(P) interface returns a pointer to a UTF-8 +** string containing the SQL text of prepared statement P with +** [bound parameters] expanded. +** +** ^(For example, if a prepared statement is created using the SQL +** text "SELECT $abc,:xyz" and if parameter $abc is bound to integer 2345 +** and parameter :xyz is unbound, then sqlite3_sql() will return +** the original string, "SELECT $abc,:xyz" but sqlite3_expanded_sql() +** will return "SELECT 2345,NULL".)^ +** +** ^The sqlite3_expanded_sql() interface returns NULL if insufficient memory +** is available to hold the result, or if the result would exceed the +** the maximum string length determined by the [SQLITE_LIMIT_LENGTH]. +** +** ^The [SQLITE_TRACE_SIZE_LIMIT] compile-time option limits the size of +** bound parameter expansions. ^The [SQLITE_OMIT_TRACE] compile-time +** option causes sqlite3_expanded_sql() to always return NULL. +** +** ^The string returned by sqlite3_sql(P) is managed by SQLite and is +** automatically freed when the prepared statement is finalized. +** ^The string returned by sqlite3_expanded_sql(P), on the other hand, +** is obtained from [sqlite3_malloc()] and must be free by the application +** by passing it to [sqlite3_free()]. */ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); +SQLITE_API char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); /* ** CAPI3REF: Determine If An SQL Statement Writes The Database +** METHOD: sqlite3_stmt ** ** ^The sqlite3_stmt_readonly(X) interface returns true (non-zero) if ** and only if the [prepared statement] X makes no direct changes to @@ -3302,15 +3763,21 @@ SQLITE_API const char *sqlite3_sql(sqlite3_stmt *pStmt); ** sqlite3_stmt_readonly() to return true since, while those statements ** change the configuration of a database connection, they do not make ** changes to the content of the database files on disk. +** ^The sqlite3_stmt_readonly() interface returns true for [BEGIN] since +** [BEGIN] merely sets internal flags, but the [BEGIN|BEGIN IMMEDIATE] and +** [BEGIN|BEGIN EXCLUSIVE] commands do touch the database and so +** sqlite3_stmt_readonly() returns false for those commands. */ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); /* ** CAPI3REF: Determine If A Prepared Statement Has Been Reset +** METHOD: sqlite3_stmt ** ** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the ** [prepared statement] S has been stepped at least once using -** [sqlite3_step(S)] but has not run to completion and/or has not +** [sqlite3_step(S)] but has neither run to completion (returned +** [SQLITE_DONE] from [sqlite3_step(S)]) nor ** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) ** interface returns false if S is a NULL pointer. If S is not a ** NULL pointer and is not a pointer to a valid [prepared statement] @@ -3337,7 +3804,9 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** Some interfaces require a protected sqlite3_value. Other interfaces ** will accept either a protected or an unprotected sqlite3_value. ** Every interface that accepts sqlite3_value arguments specifies -** whether or not it requires a protected sqlite3_value. +** whether or not it requires a protected sqlite3_value. The +** [sqlite3_value_dup()] interface can be used to construct a new +** protected sqlite3_value from an unprotected sqlite3_value. ** ** The terms "protected" and "unprotected" refer to whether or not ** a mutex is held. An internal mutex is held for a protected @@ -3356,12 +3825,13 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); ** implementation of [application-defined SQL functions] are protected. ** ^The sqlite3_value object returned by ** [sqlite3_column_value()] is unprotected. -** Unprotected sqlite3_value objects may only be used with -** [sqlite3_result_value()] and [sqlite3_bind_value()]. +** Unprotected sqlite3_value objects may only be used as arguments +** to [sqlite3_result_value()], [sqlite3_bind_value()], and +** [sqlite3_value_dup()]. ** The [sqlite3_value_blob | sqlite3_value_type()] family of ** interfaces require protected sqlite3_value objects. */ -typedef struct Mem sqlite3_value; +typedef struct sqlite3_value sqlite3_value; /* ** CAPI3REF: SQL Function Context Object @@ -3381,6 +3851,7 @@ typedef struct sqlite3_context sqlite3_context; ** CAPI3REF: Binding Values To Prepared Statements ** KEYWORDS: {host parameter} {host parameters} {host parameter name} ** KEYWORDS: {SQL parameter} {SQL parameters} {parameter binding} +** METHOD: sqlite3_stmt ** ** ^(In the SQL statement text input to [sqlite3_prepare_v2()] and its variants, ** literals may be replaced by a [parameter] that matches one of following @@ -3462,6 +3933,15 @@ typedef struct sqlite3_context sqlite3_context; ** [sqlite3_blob_open | incremental BLOB I/O] routines. ** ^A negative value for the zeroblob results in a zero-length BLOB. ** +** ^The sqlite3_bind_pointer(S,I,P,T,D) routine causes the I-th parameter in +** [prepared statement] S to have an SQL value of NULL, but to also be +** associated with the pointer P of type T. ^D is either a NULL pointer or +** a pointer to a destructor function for P. ^SQLite will invoke the +** destructor D with a single argument of P when it is finished using +** P. The T parameter should be a static string, preferably a string +** literal. The sqlite3_bind_pointer() routine is part of the +** [pointer passing interface] added for SQLite 3.20.0. +** ** ^If any of the sqlite3_bind_*() routines are called with a NULL pointer ** for the [prepared statement] or with a prepared statement for which ** [sqlite3_step()] has been called more recently than [sqlite3_reset()], @@ -3495,10 +3975,13 @@ SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*) SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64, void(*)(void*), unsigned char encoding); SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*); +SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, const char*,void(*)(void*)); SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n); +SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); /* ** CAPI3REF: Number Of SQL Parameters +** METHOD: sqlite3_stmt ** ** ^This routine can be used to find the number of [SQL parameters] ** in a [prepared statement]. SQL parameters are tokens of the @@ -3519,6 +4002,7 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); /* ** CAPI3REF: Name Of A Host Parameter +** METHOD: sqlite3_stmt ** ** ^The sqlite3_bind_parameter_name(P,N) interface returns ** the name of the N-th [SQL parameter] in the [prepared statement] P. @@ -3535,8 +4019,8 @@ SQLITE_API int sqlite3_bind_parameter_count(sqlite3_stmt*); ** ^If the value N is out of range or if the N-th parameter is ** nameless, then NULL is returned. ^The returned string is ** always in UTF-8 encoding even if the named parameter was -** originally specified as UTF-16 in [sqlite3_prepare16()] or -** [sqlite3_prepare16_v2()]. +** originally specified as UTF-16 in [sqlite3_prepare16()], +** [sqlite3_prepare16_v2()], or [sqlite3_prepare16_v3()]. ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and @@ -3546,22 +4030,25 @@ SQLITE_API const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); /* ** CAPI3REF: Index Of A Parameter With A Given Name +** METHOD: sqlite3_stmt ** ** ^Return the index of an SQL parameter given its name. ^The ** index value returned is suitable for use as the second ** parameter to [sqlite3_bind_blob|sqlite3_bind()]. ^A zero ** is returned if no matching parameter is found. ^The parameter ** name must be given in UTF-8 even if the original statement -** was prepared from UTF-16 text using [sqlite3_prepare16_v2()]. +** was prepared from UTF-16 text using [sqlite3_prepare16_v2()] or +** [sqlite3_prepare16_v3()]. ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. +** [sqlite3_bind_parameter_name()]. */ SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); /* ** CAPI3REF: Reset All Bindings On A Prepared Statement +** METHOD: sqlite3_stmt ** ** ^Contrary to the intuition of many, [sqlite3_reset()] does not reset ** the [sqlite3_bind_blob | bindings] on a [prepared statement]. @@ -3571,10 +4058,15 @@ SQLITE_API int sqlite3_clear_bindings(sqlite3_stmt*); /* ** CAPI3REF: Number Of Columns In A Result Set +** METHOD: sqlite3_stmt ** ** ^Return the number of columns in the result set returned by the -** [prepared statement]. ^This routine returns 0 if pStmt is an SQL -** statement that does not return data (for example an [UPDATE]). +** [prepared statement]. ^If this routine returns 0, that means the +** [prepared statement] returns no data (for example an [UPDATE]). +** ^However, just because this routine returns a positive number does not +** mean that one or more rows of data will be returned. ^A SELECT statement +** will always have a positive sqlite3_column_count() but depending on the +** WHERE clause constraints and the table content, it might return no rows. ** ** See also: [sqlite3_data_count()] */ @@ -3582,6 +4074,7 @@ SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); /* ** CAPI3REF: Column Names In A Result Set +** METHOD: sqlite3_stmt ** ** ^These routines return the name assigned to a particular column ** in the result set of a [SELECT] statement. ^The sqlite3_column_name() @@ -3611,6 +4104,7 @@ SQLITE_API const void *sqlite3_column_name16(sqlite3_stmt*, int N); /* ** CAPI3REF: Source Of Data In A Query Result +** METHOD: sqlite3_stmt ** ** ^These routines provide a means to determine the database, table, and ** table column that is the origin of a particular result column in @@ -3663,6 +4157,7 @@ SQLITE_API const void *sqlite3_column_origin_name16(sqlite3_stmt*,int); /* ** CAPI3REF: Declared Datatype Of A Query Result +** METHOD: sqlite3_stmt ** ** ^(The first parameter is a [prepared statement]. ** If this statement is a [SELECT] statement and the Nth column of the @@ -3695,17 +4190,20 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); /* ** CAPI3REF: Evaluate An SQL Statement +** METHOD: sqlite3_stmt ** -** After a [prepared statement] has been prepared using either -** [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] or one of the legacy +** After a [prepared statement] has been prepared using any of +** [sqlite3_prepare_v2()], [sqlite3_prepare_v3()], [sqlite3_prepare16_v2()], +** or [sqlite3_prepare16_v3()] or one of the legacy ** interfaces [sqlite3_prepare()] or [sqlite3_prepare16()], this function ** must be called one or more times to evaluate the statement. ** ** The details of the behavior of the sqlite3_step() interface depend -** on whether the statement was prepared using the newer "v2" interface -** [sqlite3_prepare_v2()] and [sqlite3_prepare16_v2()] or the older legacy -** interface [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the -** new "v2" interface is recommended for new applications but the legacy +** on whether the statement was prepared using the newer "vX" interfaces +** [sqlite3_prepare_v3()], [sqlite3_prepare_v2()], [sqlite3_prepare16_v3()], +** [sqlite3_prepare16_v2()] or the older legacy +** interfaces [sqlite3_prepare()] and [sqlite3_prepare16()]. The use of the +** new "vX" interface is recommended for new applications but the legacy ** interface will continue to be supported. ** ** ^In the legacy interface, the return value will be either [SQLITE_BUSY], @@ -3751,7 +4249,8 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** other than [SQLITE_ROW] before any subsequent invocation of ** sqlite3_step(). Failure to reset the prepared statement using ** [sqlite3_reset()] would result in an [SQLITE_MISUSE] return from -** sqlite3_step(). But after version 3.6.23.1, sqlite3_step() began +** sqlite3_step(). But after [version 3.6.23.1] ([dateof:3.6.23.1], +** sqlite3_step() began ** calling [sqlite3_reset()] automatically in this circumstance rather ** than returning [SQLITE_MISUSE]. This is not considered a compatibility ** break because any application that ever receives an SQLITE_MISUSE error @@ -3765,15 +4264,17 @@ SQLITE_API const void *sqlite3_column_decltype16(sqlite3_stmt*,int); ** specific [error codes] that better describes the error. ** We admit that this is a goofy design. The problem has been fixed ** with the "v2" interface. If you prepare all of your SQL statements -** using either [sqlite3_prepare_v2()] or [sqlite3_prepare16_v2()] instead +** using [sqlite3_prepare_v3()] or [sqlite3_prepare_v2()] +** or [sqlite3_prepare16_v2()] or [sqlite3_prepare16_v3()] instead ** of the legacy [sqlite3_prepare()] and [sqlite3_prepare16()] interfaces, ** then the more specific [error codes] are returned directly -** by sqlite3_step(). The use of the "v2" interface is recommended. +** by sqlite3_step(). The use of the "vX" interfaces is recommended. */ SQLITE_API int sqlite3_step(sqlite3_stmt*); /* ** CAPI3REF: Number of columns in a result set +** METHOD: sqlite3_stmt ** ** ^The sqlite3_data_count(P) interface returns the number of columns in the ** current row of the result set of [prepared statement] P. @@ -3827,8 +4328,29 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); /* ** CAPI3REF: Result Values From A Query ** KEYWORDS: {column access functions} +** METHOD: sqlite3_stmt ** -** These routines form the "result set" interface. +** <b>Summary:</b> +** <blockquote><table border=0 cellpadding=0 cellspacing=0> +** <tr><td><b>sqlite3_column_blob</b><td>→<td>BLOB result +** <tr><td><b>sqlite3_column_double</b><td>→<td>REAL result +** <tr><td><b>sqlite3_column_int</b><td>→<td>32-bit INTEGER result +** <tr><td><b>sqlite3_column_int64</b><td>→<td>64-bit INTEGER result +** <tr><td><b>sqlite3_column_text</b><td>→<td>UTF-8 TEXT result +** <tr><td><b>sqlite3_column_text16</b><td>→<td>UTF-16 TEXT result +** <tr><td><b>sqlite3_column_value</b><td>→<td>The result as an +** [sqlite3_value|unprotected sqlite3_value] object. +** <tr><td> <td> <td>  +** <tr><td><b>sqlite3_column_bytes</b><td>→<td>Size of a BLOB +** or a UTF-8 TEXT result in bytes +** <tr><td><b>sqlite3_column_bytes16  </b> +** <td>→  <td>Size of UTF-16 +** TEXT in bytes +** <tr><td><b>sqlite3_column_type</b><td>→<td>Default +** datatype of the result +** </table></blockquote> +** +** <b>Details:</b> ** ** ^These routines return information about a single column of the current ** result row of a query. ^In every case the first argument is a pointer @@ -3851,16 +4373,29 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** are called from a different thread while any of these routines ** are pending, then the results are undefined. ** +** The first six interfaces (_blob, _double, _int, _int64, _text, and _text16) +** each return the value of a result column in a specific data format. If +** the result column is not initially in the requested format (for example, +** if the query returns an integer but the sqlite3_column_text() interface +** is used to extract the value) then an automatic type conversion is performed. +** ** ^The sqlite3_column_type() routine returns the ** [SQLITE_INTEGER | datatype code] for the initial data type ** of the result column. ^The returned value is one of [SQLITE_INTEGER], -** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. The value -** returned by sqlite3_column_type() is only meaningful if no type -** conversions have occurred as described below. After a type conversion, -** the value returned by sqlite3_column_type() is undefined. Future +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL]. +** The return value of sqlite3_column_type() can be used to decide which +** of the first six interface should be used to extract the column value. +** The value returned by sqlite3_column_type() is only meaningful if no +** automatic type conversions have occurred for the value in question. +** After a type conversion, the result of calling sqlite3_column_type() +** is undefined, though harmless. Future ** versions of SQLite may change the behavior of sqlite3_column_type() ** following a type conversion. ** +** If the result is a BLOB or a TEXT string, then the sqlite3_column_bytes() +** or sqlite3_column_bytes16() interfaces can be used to determine the size +** of that BLOB or string. +** ** ^If the result is a BLOB or UTF-8 string then the sqlite3_column_bytes() ** routine returns the number of bytes in that BLOB or string. ** ^If the result is a UTF-16 string, then sqlite3_column_bytes() converts @@ -3889,16 +4424,21 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** even empty strings, are always zero-terminated. ^The return ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. ** -** ^The object returned by [sqlite3_column_value()] is an -** [unprotected sqlite3_value] object. An unprotected sqlite3_value object -** may only be used with [sqlite3_bind_value()] and [sqlite3_result_value()]. +** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an +** [unprotected sqlite3_value] object. In a multithreaded environment, +** an unprotected sqlite3_value object may only be used safely with +** [sqlite3_bind_value()] and [sqlite3_result_value()]. ** If the [unprotected sqlite3_value] object returned by ** [sqlite3_column_value()] is used in any other way, including calls ** to routines like [sqlite3_value_int()], [sqlite3_value_text()], -** or [sqlite3_value_bytes()], then the behavior is undefined. +** or [sqlite3_value_bytes()], the behavior is not threadsafe. +** Hence, the sqlite3_column_value() interface +** is normally only useful within the implementation of +** [application-defined SQL functions] or [virtual tables], not within +** top-level application code. ** -** These routines attempt to convert the value where appropriate. ^For -** example, if the internal representation is FLOAT and a text result +** The these routines may attempt to convert the datatype of the result. +** ^For example, if the internal representation is FLOAT and a text result ** is requested, [sqlite3_snprintf()] is used internally to perform the ** conversion automatically. ^(The following table details the conversions ** that are applied: @@ -3926,12 +4466,6 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** </table> ** </blockquote>)^ ** -** The table above makes reference to standard C library functions atoi() -** and atof(). SQLite does not really use these functions. It has its -** own equivalent internal routines. The atoi() and atof() names are -** used in the table for brevity and because they are familiar to most -** C programmers. -** ** Note that when type conversions occur, pointers returned by prior ** calls to sqlite3_column_blob(), sqlite3_column_text(), and/or ** sqlite3_column_text16() may be invalidated. @@ -3956,7 +4490,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** of conversion are done in place when it is possible, but sometimes they ** are not possible and in those cases prior pointers are invalidated. ** -** The safest and easiest to remember policy is to invoke these routines +** The safest policy is to invoke these routines ** in one of the following ways: ** ** <ul> @@ -3976,7 +4510,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** ^The pointers returned are valid until a type conversion occurs as ** described above, or until [sqlite3_step()] or [sqlite3_reset()] or ** [sqlite3_finalize()] is called. ^The memory space used to hold strings -** and BLOBs is freed automatically. Do <b>not</b> pass the pointers returned +** and BLOBs is freed automatically. Do not pass the pointers returned ** from [sqlite3_column_blob()], [sqlite3_column_text()], etc. into ** [sqlite3_free()]. ** @@ -3987,18 +4521,19 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt); ** [SQLITE_NOMEM].)^ */ SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol); SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol); SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol); SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol); SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol); -SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); +SQLITE_API int sqlite3_column_type(sqlite3_stmt*, int iCol); /* ** CAPI3REF: Destroy A Prepared Statement Object +** DESTRUCTOR: sqlite3_stmt ** ** ^The sqlite3_finalize() function is called to delete a [prepared statement]. ** ^If the most recent evaluation of the statement encountered no errors @@ -4026,6 +4561,7 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); /* ** CAPI3REF: Reset A Prepared Statement Object +** METHOD: sqlite3_stmt ** ** The sqlite3_reset() function is called to reset a [prepared statement] ** object back to its initial state, ready to be re-executed. @@ -4055,6 +4591,7 @@ SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); ** KEYWORDS: {function creation routines} ** KEYWORDS: {application-defined SQL function} ** KEYWORDS: {application-defined SQL functions} +** METHOD: sqlite3 ** ** ^These functions (collectively known as "function creation routines") ** are used to add SQL functions or aggregates or to redefine the behavior @@ -4209,8 +4746,8 @@ SQLITE_API int sqlite3_create_function_v2( ** These functions are [deprecated]. In order to maintain ** backwards compatibility with older code, these functions continue ** to be supported. However, new applications should avoid -** the use of these functions. To help encourage people to avoid -** using these functions, we are not going to tell you what they do. +** the use of these functions. To encourage programmers to avoid +** these functions, we will not explain what they do. */ #ifndef SQLITE_OMIT_DEPRECATED SQLITE_API SQLITE_DEPRECATED int sqlite3_aggregate_count(sqlite3_context*); @@ -4223,23 +4760,46 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 #endif /* -** CAPI3REF: Obtaining SQL Function Parameter Values +** CAPI3REF: Obtaining SQL Values +** METHOD: sqlite3_value ** -** The C-language implementation of SQL functions and aggregates uses -** this set of interface routines to access the parameter values on -** the function or aggregate. +** <b>Summary:</b> +** <blockquote><table border=0 cellpadding=0 cellspacing=0> +** <tr><td><b>sqlite3_value_blob</b><td>→<td>BLOB value +** <tr><td><b>sqlite3_value_double</b><td>→<td>REAL value +** <tr><td><b>sqlite3_value_int</b><td>→<td>32-bit INTEGER value +** <tr><td><b>sqlite3_value_int64</b><td>→<td>64-bit INTEGER value +** <tr><td><b>sqlite3_value_pointer</b><td>→<td>Pointer value +** <tr><td><b>sqlite3_value_text</b><td>→<td>UTF-8 TEXT value +** <tr><td><b>sqlite3_value_text16</b><td>→<td>UTF-16 TEXT value in +** the native byteorder +** <tr><td><b>sqlite3_value_text16be</b><td>→<td>UTF-16be TEXT value +** <tr><td><b>sqlite3_value_text16le</b><td>→<td>UTF-16le TEXT value +** <tr><td> <td> <td>  +** <tr><td><b>sqlite3_value_bytes</b><td>→<td>Size of a BLOB +** or a UTF-8 TEXT in bytes +** <tr><td><b>sqlite3_value_bytes16  </b> +** <td>→  <td>Size of UTF-16 +** TEXT in bytes +** <tr><td><b>sqlite3_value_type</b><td>→<td>Default +** datatype of the value +** <tr><td><b>sqlite3_value_numeric_type  </b> +** <td>→  <td>Best numeric datatype of the value +** <tr><td><b>sqlite3_value_nochange  </b> +** <td>→  <td>True if the column is unchanged in an UPDATE +** against a virtual table. +** </table></blockquote> ** -** The xFunc (for scalar functions) or xStep (for aggregates) parameters -** to [sqlite3_create_function()] and [sqlite3_create_function16()] -** define callbacks that implement the SQL functions and aggregates. -** The 3rd parameter to these callbacks is an array of pointers to -** [protected sqlite3_value] objects. There is one [sqlite3_value] object for -** each parameter to the SQL function. These routines are used to -** extract values from the [sqlite3_value] objects. +** <b>Details:</b> +** +** These routines extract type, size, and content information from +** [protected sqlite3_value] objects. Protected sqlite3_value objects +** are used to pass parameter information into implementation of +** [application-defined SQL functions] and [virtual tables]. ** ** These routines work only with [protected sqlite3_value] objects. ** Any attempt to use these routines on an [unprotected sqlite3_value] -** object results in undefined behavior. +** is not threadsafe. ** ** ^These routines work just like the corresponding [column access functions] ** except that these routines take a single [protected sqlite3_value] object @@ -4250,6 +4810,24 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** sqlite3_value_text16be() and sqlite3_value_text16le() interfaces ** extract UTF-16 strings as big-endian and little-endian respectively. ** +** ^If [sqlite3_value] object V was initialized +** using [sqlite3_bind_pointer(S,I,P,X,D)] or [sqlite3_result_pointer(C,P,X,D)] +** and if X and Y are strings that compare equal according to strcmp(X,Y), +** then sqlite3_value_pointer(V,Y) will return the pointer P. ^Otherwise, +** sqlite3_value_pointer(V,Y) returns a NULL. The sqlite3_bind_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** +** ^(The sqlite3_value_type(V) interface returns the +** [SQLITE_INTEGER | datatype code] for the initial datatype of the +** [sqlite3_value] object V. The returned value is one of [SQLITE_INTEGER], +** [SQLITE_FLOAT], [SQLITE_TEXT], [SQLITE_BLOB], or [SQLITE_NULL].)^ +** Other interfaces might change the datatype for an sqlite3_value object. +** For example, if the datatype is initially SQLITE_INTEGER and +** sqlite3_value_text(V) is called to extract a text value for that +** integer, then subsequent calls to sqlite3_value_type(V) might return +** SQLITE_TEXT. Whether or not a persistent internal datatype conversion +** occurs is undefined and may change from one release of SQLite to the next. +** ** ^(The sqlite3_value_numeric_type() interface attempts to apply ** numeric affinity to the value. This means that an attempt is ** made to convert the value to an integer or floating point. If @@ -4258,6 +4836,19 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** then the conversion is performed. Otherwise no conversion occurs. ** The [SQLITE_INTEGER | datatype] after conversion is returned.)^ ** +** ^Within the [xUpdate] method of a [virtual table], the +** sqlite3_value_nochange(X) interface returns true if and only if +** the column corresponding to X is unchanged by the UPDATE operation +** that the xUpdate method call was invoked to implement and if +** and the prior [xColumn] method call that was invoked to extracted +** the value for that column returned without setting a result (probably +** because it queried [sqlite3_vtab_nochange()] and found that the column +** was unchanging). ^Within an [xUpdate] method, any value for which +** sqlite3_value_nochange(X) is true will in all other respects appear +** to be a NULL value. If sqlite3_value_nochange(X) is invoked anywhere other +** than within an [xUpdate] method call for an UPDATE statement, then +** the return value is arbitrary and meaningless. +** ** Please pay particular attention to the fact that the pointer returned ** from [sqlite3_value_blob()], [sqlite3_value_text()], or ** [sqlite3_value_text16()] can be invalidated by a subsequent call to @@ -4268,20 +4859,52 @@ SQLITE_API SQLITE_DEPRECATED int sqlite3_memory_alarm(void(*)(void*,sqlite3_int6 ** the SQL function that supplied the [sqlite3_value*] parameters. */ SQLITE_API const void *sqlite3_value_blob(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes(sqlite3_value*); -SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); SQLITE_API double sqlite3_value_double(sqlite3_value*); SQLITE_API int sqlite3_value_int(sqlite3_value*); SQLITE_API sqlite3_int64 sqlite3_value_int64(sqlite3_value*); +SQLITE_API void *sqlite3_value_pointer(sqlite3_value*, const char*); SQLITE_API const unsigned char *sqlite3_value_text(sqlite3_value*); SQLITE_API const void *sqlite3_value_text16(sqlite3_value*); SQLITE_API const void *sqlite3_value_text16le(sqlite3_value*); SQLITE_API const void *sqlite3_value_text16be(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes(sqlite3_value*); +SQLITE_API int sqlite3_value_bytes16(sqlite3_value*); SQLITE_API int sqlite3_value_type(sqlite3_value*); SQLITE_API int sqlite3_value_numeric_type(sqlite3_value*); +SQLITE_API int sqlite3_value_nochange(sqlite3_value*); + +/* +** CAPI3REF: Finding The Subtype Of SQL Values +** METHOD: sqlite3_value +** +** The sqlite3_value_subtype(V) function returns the subtype for +** an [application-defined SQL function] argument V. The subtype +** information can be used to pass a limited amount of context from +** one SQL function to another. Use the [sqlite3_result_subtype()] +** routine to set the subtype for the return value of an SQL function. +*/ +SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); + +/* +** CAPI3REF: Copy And Free SQL Values +** METHOD: sqlite3_value +** +** ^The sqlite3_value_dup(V) interface makes a copy of the [sqlite3_value] +** object D and returns a pointer to that copy. ^The [sqlite3_value] returned +** is a [protected sqlite3_value] object even if the input is not. +** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a +** memory allocation fails. +** +** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object +** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer +** then sqlite3_value_free(V) is a harmless no-op. +*/ +SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value*); +SQLITE_API void sqlite3_value_free(sqlite3_value*); /* ** CAPI3REF: Obtain Aggregate Function Context +** METHOD: sqlite3_context ** ** Implementations of aggregate SQL functions use this ** routine to allocate memory for storing their state. @@ -4326,6 +4949,7 @@ SQLITE_API void *sqlite3_aggregate_context(sqlite3_context*, int nBytes); /* ** CAPI3REF: User Data For Functions +** METHOD: sqlite3_context ** ** ^The sqlite3_user_data() interface returns a copy of ** the pointer that was the pUserData parameter (the 5th parameter) @@ -4340,6 +4964,7 @@ SQLITE_API void *sqlite3_user_data(sqlite3_context*); /* ** CAPI3REF: Database Connection For Functions +** METHOD: sqlite3_context ** ** ^The sqlite3_context_db_handle() interface returns a copy of ** the pointer to the [database connection] (the 1st parameter) @@ -4351,6 +4976,7 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); /* ** CAPI3REF: Function Auxiliary Data +** METHOD: sqlite3_context ** ** These functions may be used by (non-aggregate) SQL functions to ** associate metadata with argument values. If the same value is passed to @@ -4363,10 +4989,11 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** the compiled regular expression can be reused on multiple ** invocations of the same function. ** -** ^The sqlite3_get_auxdata() interface returns a pointer to the metadata -** associated by the sqlite3_set_auxdata() function with the Nth argument -** value to the application-defined function. ^If there is no metadata -** associated with the function argument, this sqlite3_get_auxdata() interface +** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata +** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument +** value to the application-defined function. ^N is zero for the left-most +** function argument. ^If there is no metadata +** associated with the function argument, the sqlite3_get_auxdata(C,N) interface ** returns a NULL pointer. ** ** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th @@ -4378,12 +5005,13 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** SQLite will invoke the destructor function X with parameter P exactly ** once, when the metadata is discarded. ** SQLite is free to discard the metadata at any time, including: <ul> -** <li> when the corresponding function parameter changes, or -** <li> when [sqlite3_reset()] or [sqlite3_finalize()] is called for the -** SQL statement, or -** <li> when sqlite3_set_auxdata() is invoked again on the same parameter, or -** <li> during the original sqlite3_set_auxdata() call when a memory -** allocation error occurs. </ul>)^ +** <li> ^(when the corresponding function parameter changes)^, or +** <li> ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the +** SQL statement)^, or +** <li> ^(when sqlite3_set_auxdata() is invoked again on the same +** parameter)^, or +** <li> ^(during the original sqlite3_set_auxdata() call when a memory +** allocation error occurs.)^ </ul> ** ** Note the last bullet in particular. The destructor X in ** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the @@ -4396,6 +5024,10 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); ** function parameters that are compile-time constants, including literal ** values and [parameters] and expressions composed from the same.)^ ** +** The value of the N parameter to these interfaces should be non-negative. +** Future enhancements may make use of negative N values to define new +** kinds of function caching behavior. +** ** These routines must be called from the same thread in which ** the SQL function is running. */ @@ -4423,6 +5055,7 @@ typedef void (*sqlite3_destructor_type)(void*); /* ** CAPI3REF: Setting The Result Of An SQL Function +** METHOD: sqlite3_context ** ** These routines are used by the xFunc or xFinal callbacks that ** implement SQL functions and aggregates. See @@ -4438,9 +5071,9 @@ typedef void (*sqlite3_destructor_type)(void*); ** to by the second parameter and which is N bytes long where N is the ** third parameter. ** -** ^The sqlite3_result_zeroblob() interfaces set the result of -** the application-defined function to be a BLOB containing all zero -** bytes and N bytes in size, where N is the value of the 2nd parameter. +** ^The sqlite3_result_zeroblob(C,N) and sqlite3_result_zeroblob64(C,N) +** interfaces set the result of the application-defined function to be +** a BLOB containing all zero bytes and N bytes in size. ** ** ^The sqlite3_result_double() interface sets the result from ** an application-defined function to be a floating point value specified @@ -4518,11 +5151,11 @@ typedef void (*sqlite3_destructor_type)(void*); ** when it has finished using that result. ** ^If the 4th parameter to the sqlite3_result_text* interfaces ** or sqlite3_result_blob is the special constant SQLITE_TRANSIENT -** then SQLite makes a copy of the result into space obtained from +** then SQLite makes a copy of the result into space obtained ** from [sqlite3_malloc()] before it returns. ** ** ^The sqlite3_result_value() interface sets the result of -** the application-defined function to be a copy the +** the application-defined function to be a copy of the ** [unprotected sqlite3_value] object specified by the 2nd parameter. ^The ** sqlite3_result_value() interface makes a copy of the [sqlite3_value] ** so that the [sqlite3_value] specified in the parameter may change or @@ -4531,6 +5164,17 @@ typedef void (*sqlite3_destructor_type)(void*); ** [unprotected sqlite3_value] object is required, so either ** kind of [sqlite3_value] object can be used with this interface. ** +** ^The sqlite3_result_pointer(C,P,T,D) interface sets the result to an +** SQL NULL value, just like [sqlite3_result_null(C)], except that it +** also associates the host-language pointer P or type T with that +** NULL value such that the pointer can be retrieved within an +** [application-defined SQL function] using [sqlite3_value_pointer()]. +** ^If the D parameter is not NULL, then it is a pointer to a destructor +** for the P parameter. ^SQLite invokes D with P as its only argument +** when SQLite is finished with P. The T parameter should be a static +** string and preferably a string literal. The sqlite3_result_pointer() +** routine is part of the [pointer passing interface] added for SQLite 3.20.0. +** ** If these routines are called from within the different thread ** than the one containing the application-defined function that received ** the [sqlite3_context] pointer, the results are undefined. @@ -4554,10 +5198,28 @@ SQLITE_API void sqlite3_result_text16(sqlite3_context*, const void*, int, void(* SQLITE_API void sqlite3_result_text16le(sqlite3_context*, const void*, int,void(*)(void*)); SQLITE_API void sqlite3_result_text16be(sqlite3_context*, const void*, int,void(*)(void*)); SQLITE_API void sqlite3_result_value(sqlite3_context*, sqlite3_value*); +SQLITE_API void sqlite3_result_pointer(sqlite3_context*, void*,const char*,void(*)(void*)); SQLITE_API void sqlite3_result_zeroblob(sqlite3_context*, int n); +SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n); + + +/* +** CAPI3REF: Setting The Subtype Of An SQL Function +** METHOD: sqlite3_context +** +** The sqlite3_result_subtype(C,T) function causes the subtype of +** the result from the [application-defined SQL function] with +** [sqlite3_context] C to be the value T. Only the lower 8 bits +** of the subtype T are preserved in current versions of SQLite; +** higher order bits are discarded. +** The number of subtype bytes preserved by SQLite might increase +** in future releases of SQLite. +*/ +SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int); /* ** CAPI3REF: Define New Collating Sequences +** METHOD: sqlite3 ** ** ^These functions add, remove, or modify a [collation] associated ** with the [database connection] specified as the first argument. @@ -4660,6 +5322,7 @@ SQLITE_API int sqlite3_create_collation16( /* ** CAPI3REF: Collation Needed Callbacks +** METHOD: sqlite3 ** ** ^To avoid having to register all collation sequences before a database ** can be used, a single callback function may be registered with the @@ -4864,9 +5527,45 @@ SQLITE_API SQLITE_EXTERN char *sqlite3_temp_directory; */ SQLITE_API SQLITE_EXTERN char *sqlite3_data_directory; +/* +** CAPI3REF: Win32 Specific Interface +** +** These interfaces are available only on Windows. The +** [sqlite3_win32_set_directory] interface is used to set the value associated +** with the [sqlite3_temp_directory] or [sqlite3_data_directory] variable, to +** zValue, depending on the value of the type parameter. The zValue parameter +** should be NULL to cause the previous value to be freed via [sqlite3_free]; +** a non-NULL value will be copied into memory obtained from [sqlite3_malloc] +** prior to being used. The [sqlite3_win32_set_directory] interface returns +** [SQLITE_OK] to indicate success, [SQLITE_ERROR] if the type is unsupported, +** or [SQLITE_NOMEM] if memory could not be allocated. The value of the +** [sqlite3_data_directory] variable is intended to act as a replacement for +** the current directory on the sub-platforms of Win32 where that concept is +** not present, e.g. WinRT and UWP. The [sqlite3_win32_set_directory8] and +** [sqlite3_win32_set_directory16] interfaces behave exactly the same as the +** sqlite3_win32_set_directory interface except the string parameter must be +** UTF-8 or UTF-16, respectively. +*/ +SQLITE_API int sqlite3_win32_set_directory( + unsigned long type, /* Identifier for directory being set or reset */ + void *zValue /* New value for directory being set or reset */ +); +SQLITE_API int sqlite3_win32_set_directory8(unsigned long type, const char *zValue); +SQLITE_API int sqlite3_win32_set_directory16(unsigned long type, const void *zValue); + +/* +** CAPI3REF: Win32 Directory Types +** +** These macros are only available on Windows. They define the allowed values +** for the type argument to the [sqlite3_win32_set_directory] interface. +*/ +#define SQLITE_WIN32_DATA_DIRECTORY_TYPE 1 +#define SQLITE_WIN32_TEMP_DIRECTORY_TYPE 2 + /* ** CAPI3REF: Test For Auto-Commit Mode ** KEYWORDS: {autocommit mode} +** METHOD: sqlite3 ** ** ^The sqlite3_get_autocommit() interface returns non-zero or ** zero if the given database connection is or is not in autocommit mode, @@ -4889,6 +5588,7 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*); /* ** CAPI3REF: Find The Database Handle Of A Prepared Statement +** METHOD: sqlite3_stmt ** ** ^The sqlite3_db_handle interface returns the [database connection] handle ** to which a [prepared statement] belongs. ^The [database connection] @@ -4901,6 +5601,7 @@ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); /* ** CAPI3REF: Return The Filename For A Database Connection +** METHOD: sqlite3 ** ** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename ** associated with database N of connection D. ^The main database file @@ -4917,6 +5618,7 @@ SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); /* ** CAPI3REF: Determine if a database is read-only +** METHOD: sqlite3 ** ** ^The sqlite3_db_readonly(D,N) interface returns 1 if the database N ** of connection D is read-only, 0 if it is read/write, or -1 if N is not @@ -4926,6 +5628,7 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); /* ** CAPI3REF: Find the next prepared statement +** METHOD: sqlite3 ** ** ^This interface returns a pointer to the next [prepared statement] after ** pStmt associated with the [database connection] pDb. ^If pStmt is NULL @@ -4941,6 +5644,7 @@ SQLITE_API sqlite3_stmt *sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt); /* ** CAPI3REF: Commit And Rollback Notification Callbacks +** METHOD: sqlite3 ** ** ^The sqlite3_commit_hook() interface registers a callback ** function to be invoked whenever a transaction is [COMMIT | committed]. @@ -4990,11 +5694,12 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); /* ** CAPI3REF: Data Change Notification Callbacks +** METHOD: sqlite3 ** ** ^The sqlite3_update_hook() interface registers a callback function ** with the [database connection] identified by the first argument ** to be invoked whenever a row is updated, inserted or deleted in -** a rowid table. +** a [rowid table]. ** ^Any callback set by a previous call to this function ** for the same database connection is overridden. ** @@ -5015,7 +5720,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** ^The update hook is not invoked when [WITHOUT ROWID] tables are modified. ** ** ^In the current implementation, the update hook -** is not invoked when duplication rows are deleted because of an +** is not invoked when conflicting rows are deleted because of an ** [ON CONFLICT | ON CONFLICT REPLACE] clause. ^Nor is the update hook ** invoked when rows are deleted using the [truncate optimization]. ** The exceptions defined in this paragraph might change in a future @@ -5033,8 +5738,8 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); ** on the same [database connection] D, or NULL for ** the first call on D. ** -** See also the [sqlite3_commit_hook()] and [sqlite3_rollback_hook()] -** interfaces. +** See also the [sqlite3_commit_hook()], [sqlite3_rollback_hook()], +** and [sqlite3_preupdate_hook()] interfaces. */ SQLITE_API void *sqlite3_update_hook( sqlite3*, @@ -5051,7 +5756,8 @@ SQLITE_API void *sqlite3_update_hook( ** and disabled if the argument is false.)^ ** ** ^Cache sharing is enabled and disabled for an entire process. -** This is a change as of SQLite version 3.5.0. In prior versions of SQLite, +** This is a change as of SQLite [version 3.5.0] ([dateof:3.5.0]). +** In prior versions of SQLite, ** sharing was enabled or disabled for each thread separately. ** ** ^(The cache sharing mode set by this interface effects all subsequent @@ -5066,6 +5772,11 @@ SQLITE_API void *sqlite3_update_hook( ** future releases of SQLite. Applications that care about shared ** cache setting should set it explicitly. ** +** Note: This method is disabled on MacOS X 10.7 and iOS version 5.0 +** and will always return SQLITE_MISUSE. On those systems, +** shared cache mode should be enabled per-database connection via +** [sqlite3_open_v2()] with [SQLITE_OPEN_SHAREDCACHE]. +** ** This interface is threadsafe on processors where writing a ** 32-bit integer is atomic. ** @@ -5091,6 +5802,7 @@ SQLITE_API int sqlite3_release_memory(int); /* ** CAPI3REF: Free Memory Used By A Database Connection +** METHOD: sqlite3 ** ** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap ** memory as possible from database connection D. Unlike the @@ -5139,7 +5851,8 @@ SQLITE_API int sqlite3_db_release_memory(sqlite3*); ** from the heap. ** </ul>)^ ** -** Beginning with SQLite version 3.7.3, the soft heap limit is enforced +** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), +** the soft heap limit is enforced ** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] ** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], ** the soft heap limit is enforced on every memory allocation. Without @@ -5168,6 +5881,7 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); /* ** CAPI3REF: Extract Metadata About A Column Of A Table +** METHOD: sqlite3 ** ** ^(The sqlite3_table_column_metadata(X,D,T,C,....) routine returns ** information about column C of table T in database D @@ -5177,9 +5891,11 @@ SQLITE_API SQLITE_DEPRECATED void sqlite3_soft_heap_limit(int N); ** column exists. ^The sqlite3_table_column_metadata() interface returns ** SQLITE_ERROR and if the specified column does not exist. ** ^If the column-name parameter to sqlite3_table_column_metadata() is a -** NULL pointer, then this routine simply checks for the existance of the +** NULL pointer, then this routine simply checks for the existence of the ** table and returns SQLITE_OK if the table exists and SQLITE_ERROR if it -** does not. +** does not. If the table name parameter T in a call to +** sqlite3_table_column_metadata(X,D,T,C,...) is NULL then the result is +** undefined behavior. ** ** ^The column is identified by the second, third and fourth parameters to ** this function. ^(The second parameter is either the name of the database @@ -5246,6 +5962,7 @@ SQLITE_API int sqlite3_table_column_metadata( /* ** CAPI3REF: Load An Extension +** METHOD: sqlite3 ** ** ^This interface loads an SQLite extension library from the named file. ** @@ -5273,9 +5990,18 @@ SQLITE_API int sqlite3_table_column_metadata( ** should free this memory by calling [sqlite3_free()]. ** ** ^Extension loading must be enabled using -** [sqlite3_enable_load_extension()] prior to calling this API, +** [sqlite3_enable_load_extension()] or +** [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],1,NULL) +** prior to calling this API, ** otherwise an error will be returned. ** +** <b>Security warning:</b> It is recommended that the +** [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method be used to enable only this +** interface. The use of the [sqlite3_enable_load_extension()] interface +** should be avoided. This will keep the SQL function [load_extension()] +** disabled and prevent SQL injections from giving attackers +** access to extension loading capabilities. +** ** See also the [load_extension() SQL function]. */ SQLITE_API int sqlite3_load_extension( @@ -5287,6 +6013,7 @@ SQLITE_API int sqlite3_load_extension( /* ** CAPI3REF: Enable Or Disable Extension Loading +** METHOD: sqlite3 ** ** ^So as not to open security holes in older applications that are ** unprepared to deal with [extension loading], and as a means of disabling @@ -5297,6 +6024,17 @@ SQLITE_API int sqlite3_load_extension( ** ^Call the sqlite3_enable_load_extension() routine with onoff==1 ** to turn extension loading on and call it with onoff==0 to turn ** it back off again. +** +** ^This interface enables or disables both the C-API +** [sqlite3_load_extension()] and the SQL function [load_extension()]. +** ^(Use [sqlite3_db_config](db,[SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION],..) +** to enable or disable only the C-API.)^ +** +** <b>Security warning:</b> It is recommended that extension loading +** be disabled using the [SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION] method +** rather than this interface, so the [load_extension()] SQL function +** remains disabled. This will prevent SQL injections from giving attackers +** access to extension loading capabilities. */ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); @@ -5310,7 +6048,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); ** ** ^(Even though the function prototype shows that xEntryPoint() takes ** no arguments and returns void, SQLite invokes xEntryPoint() with three -** arguments and expects and integer result as if the signature of the +** arguments and expects an integer result as if the signature of the ** entry point where as follows: ** ** <blockquote><pre> @@ -5336,7 +6074,7 @@ SQLITE_API int sqlite3_enable_load_extension(sqlite3 *db, int onoff); ** See also: [sqlite3_reset_auto_extension()] ** and [sqlite3_cancel_auto_extension()] */ -SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); +SQLITE_API int sqlite3_auto_extension(void(*xEntryPoint)(void)); /* ** CAPI3REF: Cancel Automatic Extension Loading @@ -5348,7 +6086,7 @@ SQLITE_API int sqlite3_auto_extension(void (*xEntryPoint)(void)); ** unregistered and it returns 0 if X was not on the list of initialization ** routines. */ -SQLITE_API int sqlite3_cancel_auto_extension(void (*xEntryPoint)(void)); +SQLITE_API int sqlite3_cancel_auto_extension(void(*xEntryPoint)(void)); /* ** CAPI3REF: Reset Automatic Extension Loading @@ -5458,6 +6196,17 @@ struct sqlite3_module { ** ^Information about the ORDER BY clause is stored in aOrderBy[]. ** ^Each term of aOrderBy records a column of the ORDER BY clause. ** +** The colUsed field indicates which columns of the virtual table may be +** required by the current scan. Virtual table columns are numbered from +** zero in the order in which they appear within the CREATE TABLE statement +** passed to sqlite3_declare_vtab(). For the first 63 columns (columns 0-62), +** the corresponding bit is set within the colUsed mask if the column may be +** required by SQLite. If the table has at least 64 columns and any column +** to the right of the first 63 is required, then bit 63 of colUsed is also +** set. In other words, column iCol may be required if the expression +** (colUsed & ((sqlite3_uint64)1 << (iCol>=63 ? 63 : iCol))) evaluates to +** non-zero. +** ** The [xBestIndex] method must fill aConstraintUsage[] with information ** about what parameters to pass to xFilter. ^If argvIndex>0 then ** the right-hand side of the corresponding aConstraint[] is evaluated @@ -5483,19 +6232,39 @@ struct sqlite3_module { ** ^The estimatedRows value is an estimate of the number of rows that ** will be returned by the strategy. ** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** ** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info -** structure for SQLite version 3.8.2. If a virtual table extension is +** structure for SQLite [version 3.8.2] ([dateof:3.8.2]). +** If a virtual table extension is ** used with an SQLite version earlier than 3.8.2, the results of attempting ** to read or write the estimatedRows field are undefined (but are likely ** to included crashing the application). The estimatedRows field should ** therefore only be used if [sqlite3_libversion_number()] returns a -** value greater than or equal to 3008002. +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for [version 3.9.0] ([dateof:3.9.0]). +** It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3009000. */ struct sqlite3_index_info { /* Inputs */ int nConstraint; /* Number of entries in aConstraint */ struct sqlite3_index_constraint { - int iColumn; /* Column on left-hand side of constraint */ + int iColumn; /* Column constrained. -1 for ROWID */ unsigned char op; /* Constraint operator */ unsigned char usable; /* True if this constraint is usable */ int iTermOffset; /* Used internally - xBestIndex should ignore */ @@ -5517,8 +6286,21 @@ struct sqlite3_index_info { double estimatedCost; /* Estimated cost of using this index */ /* Fields below are only available in SQLite 3.8.2 and later */ sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.9.0 and later */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + /* Fields below are only available in SQLite 3.10.0 and later */ + sqlite3_uint64 colUsed; /* Input: Mask of columns used by statement */ }; +/* +** CAPI3REF: Virtual Table Scan Flags +** +** Virtual table implementations are allowed to set the +** [sqlite3_index_info].idxFlags field to some combination of +** these bits. +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + /* ** CAPI3REF: Virtual Table Constraint Operator Codes ** @@ -5527,15 +6309,24 @@ struct sqlite3_index_info { ** an operator that is part of a constraint term in the wHERE clause of ** a query that uses a [virtual table]. */ -#define SQLITE_INDEX_CONSTRAINT_EQ 2 -#define SQLITE_INDEX_CONSTRAINT_GT 4 -#define SQLITE_INDEX_CONSTRAINT_LE 8 -#define SQLITE_INDEX_CONSTRAINT_LT 16 -#define SQLITE_INDEX_CONSTRAINT_GE 32 -#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_EQ 2 +#define SQLITE_INDEX_CONSTRAINT_GT 4 +#define SQLITE_INDEX_CONSTRAINT_LE 8 +#define SQLITE_INDEX_CONSTRAINT_LT 16 +#define SQLITE_INDEX_CONSTRAINT_GE 32 +#define SQLITE_INDEX_CONSTRAINT_MATCH 64 +#define SQLITE_INDEX_CONSTRAINT_LIKE 65 +#define SQLITE_INDEX_CONSTRAINT_GLOB 66 +#define SQLITE_INDEX_CONSTRAINT_REGEXP 67 +#define SQLITE_INDEX_CONSTRAINT_NE 68 +#define SQLITE_INDEX_CONSTRAINT_ISNOT 69 +#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 +#define SQLITE_INDEX_CONSTRAINT_ISNULL 71 +#define SQLITE_INDEX_CONSTRAINT_IS 72 /* ** CAPI3REF: Register A Virtual Table Implementation +** METHOD: sqlite3 ** ** ^These routines are used to register a new [virtual table module] name. ** ^Module names must be registered before @@ -5593,7 +6384,7 @@ SQLITE_API int sqlite3_create_module_v2( */ struct sqlite3_vtab { const sqlite3_module *pModule; /* The module for this virtual table */ - int nRef; /* NO LONGER USED */ + int nRef; /* Number of open cursors */ char *zErrMsg; /* Error message from sqlite3_mprintf() */ /* Virtual table implementations will typically add additional fields */ }; @@ -5632,6 +6423,7 @@ SQLITE_API int sqlite3_declare_vtab(sqlite3*, const char *zSQL); /* ** CAPI3REF: Overload A Function For A Virtual Table +** METHOD: sqlite3 ** ** ^(Virtual tables can provide alternative implementations of functions ** using the [xFindFunction] method of the [virtual table module]. @@ -5674,6 +6466,8 @@ typedef struct sqlite3_blob sqlite3_blob; /* ** CAPI3REF: Open A BLOB For Incremental I/O +** METHOD: sqlite3 +** CONSTRUCTOR: sqlite3_blob ** ** ^(This interfaces opens a [BLOB handle | handle] to the BLOB located ** in row iRow, column zColumn, table zTable in database zDb; @@ -5719,6 +6513,12 @@ typedef struct sqlite3_blob sqlite3_blob; ** [database connection] error code and message accessible via ** [sqlite3_errcode()] and [sqlite3_errmsg()] and related functions. ** +** A BLOB referenced by sqlite3_blob_open() may be read using the +** [sqlite3_blob_read()] interface and modified by using +** [sqlite3_blob_write()]. The [BLOB handle] can be moved to a +** different row of the same table using the [sqlite3_blob_reopen()] +** interface. However, the column, table, or database of a [BLOB handle] +** cannot be changed after the [BLOB handle] is opened. ** ** ^(If the row that a BLOB handle points to is modified by an ** [UPDATE], [DELETE], or by [ON CONFLICT] side-effects @@ -5742,6 +6542,10 @@ typedef struct sqlite3_blob sqlite3_blob; ** ** To avoid a resource leak, every open [BLOB handle] should eventually ** be released by a call to [sqlite3_blob_close()]. +** +** See also: [sqlite3_blob_close()], +** [sqlite3_blob_reopen()], [sqlite3_blob_read()], +** [sqlite3_blob_bytes()], [sqlite3_blob_write()]. */ SQLITE_API int sqlite3_blob_open( sqlite3*, @@ -5755,12 +6559,13 @@ SQLITE_API int sqlite3_blob_open( /* ** CAPI3REF: Move a BLOB Handle to a New Row +** METHOD: sqlite3_blob ** -** ^This function is used to move an existing blob handle so that it points +** ^This function is used to move an existing [BLOB handle] so that it points ** to a different row of the same database table. ^The new row is identified ** by the rowid value passed as the second argument. Only the row can be ** changed. ^The database, table and column on which the blob handle is open -** remain the same. Moving an existing blob handle to a new row can be +** remain the same. Moving an existing [BLOB handle] to a new row is ** faster than closing the existing handle and opening a new one. ** ** ^(The new row must meet the same criteria as for [sqlite3_blob_open()] - @@ -5775,10 +6580,11 @@ SQLITE_API int sqlite3_blob_open( ** ** ^This function sets the database handle error code and message. */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); +SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); /* ** CAPI3REF: Close A BLOB Handle +** DESTRUCTOR: sqlite3_blob ** ** ^This function closes an open [BLOB handle]. ^(The BLOB handle is closed ** unconditionally. Even if this routine returns an error code, the @@ -5801,6 +6607,7 @@ SQLITE_API int sqlite3_blob_close(sqlite3_blob *); /* ** CAPI3REF: Return The Size Of An Open BLOB +** METHOD: sqlite3_blob ** ** ^Returns the size in bytes of the BLOB accessible via the ** successfully opened [BLOB handle] in its only argument. ^The @@ -5816,6 +6623,7 @@ SQLITE_API int sqlite3_blob_bytes(sqlite3_blob *); /* ** CAPI3REF: Read Data From A BLOB Incrementally +** METHOD: sqlite3_blob ** ** ^(This function is used to read data from an open [BLOB handle] into a ** caller-supplied buffer. N bytes of data are copied into buffer Z @@ -5844,6 +6652,7 @@ SQLITE_API int sqlite3_blob_read(sqlite3_blob *, void *Z, int N, int iOffset); /* ** CAPI3REF: Write Data Into A BLOB Incrementally +** METHOD: sqlite3_blob ** ** ^(This function is used to write data into an open [BLOB handle] from a ** caller-supplied buffer. N bytes of data are copied from the buffer Z @@ -5967,6 +6776,9 @@ SQLITE_API int sqlite3_vfs_unregister(sqlite3_vfs*); ** <li> SQLITE_MUTEX_STATIC_APP1 ** <li> SQLITE_MUTEX_STATIC_APP2 ** <li> SQLITE_MUTEX_STATIC_APP3 +** <li> SQLITE_MUTEX_STATIC_VFS1 +** <li> SQLITE_MUTEX_STATIC_VFS2 +** <li> SQLITE_MUTEX_STATIC_VFS3 ** </ul> ** ** ^The first two constants (SQLITE_MUTEX_FAST and SQLITE_MUTEX_RECURSIVE) @@ -6161,16 +6973,20 @@ SQLITE_API int sqlite3_mutex_notheld(sqlite3_mutex*); #define SQLITE_MUTEX_STATIC_MEM 3 /* sqlite3_malloc() */ #define SQLITE_MUTEX_STATIC_MEM2 4 /* NOT USED */ #define SQLITE_MUTEX_STATIC_OPEN 4 /* sqlite3BtreeOpen() */ -#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_random() */ +#define SQLITE_MUTEX_STATIC_PRNG 5 /* sqlite3_randomness() */ #define SQLITE_MUTEX_STATIC_LRU 6 /* lru page list */ #define SQLITE_MUTEX_STATIC_LRU2 7 /* NOT USED */ #define SQLITE_MUTEX_STATIC_PMEM 7 /* sqlite3PageMalloc() */ #define SQLITE_MUTEX_STATIC_APP1 8 /* For use by application */ #define SQLITE_MUTEX_STATIC_APP2 9 /* For use by application */ #define SQLITE_MUTEX_STATIC_APP3 10 /* For use by application */ +#define SQLITE_MUTEX_STATIC_VFS1 11 /* For use by built-in VFS */ +#define SQLITE_MUTEX_STATIC_VFS2 12 /* For use by extension VFS */ +#define SQLITE_MUTEX_STATIC_VFS3 13 /* For use by application VFS */ /* ** CAPI3REF: Retrieve the mutex for a database connection +** METHOD: sqlite3 ** ** ^This interface returns a pointer the [sqlite3_mutex] object that ** serializes access to the [database connection] given in the argument @@ -6182,6 +6998,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); /* ** CAPI3REF: Low-Level Control Of Database Files +** METHOD: sqlite3 ** ** ^The [sqlite3_file_control()] interface makes a direct call to the ** xFileControl method for the [sqlite3_io_methods] object associated @@ -6196,9 +7013,9 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); ** the xFileControl method. ^The return value of the xFileControl ** method becomes the return value of this routine. ** -** ^The SQLITE_FCNTL_FILE_POINTER value for the op parameter causes +** ^The [SQLITE_FCNTL_FILE_POINTER] value for the op parameter causes ** a pointer to the underlying [sqlite3_file] object to be written into -** the space pointed to by the 4th parameter. ^The SQLITE_FCNTL_FILE_POINTER +** the space pointed to by the 4th parameter. ^The [SQLITE_FCNTL_FILE_POINTER] ** case is a short-circuit path which does not actually invoke the ** underlying sqlite3_io_methods.xFileControl method. ** @@ -6210,7 +7027,7 @@ SQLITE_API sqlite3_mutex *sqlite3_db_mutex(sqlite3*); ** an incorrect zDbName and an SQLITE_ERROR return from the underlying ** xFileControl method. ** -** See also: [SQLITE_FCNTL_LOCKSTATE] +** See also: [file control opcodes] */ SQLITE_API int sqlite3_file_control(sqlite3*, const char *zDbName, int op, void*); @@ -6256,21 +7073,207 @@ SQLITE_API int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_ALWAYS 13 #define SQLITE_TESTCTRL_RESERVE 14 #define SQLITE_TESTCTRL_OPTIMIZATIONS 15 -#define SQLITE_TESTCTRL_ISKEYWORD 16 -#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 +#define SQLITE_TESTCTRL_ISKEYWORD 16 /* NOT USED */ +#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 /* NOT USED */ #define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 #define SQLITE_TESTCTRL_EXPLAIN_STMT 19 /* NOT USED */ +#define SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD 19 #define SQLITE_TESTCTRL_NEVER_CORRUPT 20 #define SQLITE_TESTCTRL_VDBE_COVERAGE 21 #define SQLITE_TESTCTRL_BYTEORDER 22 #define SQLITE_TESTCTRL_ISINIT 23 #define SQLITE_TESTCTRL_SORTER_MMAP 24 -#define SQLITE_TESTCTRL_LAST 24 +#define SQLITE_TESTCTRL_IMPOSTER 25 +#define SQLITE_TESTCTRL_PARSER_COVERAGE 26 +#define SQLITE_TESTCTRL_LAST 26 /* Largest TESTCTRL */ + +/* +** CAPI3REF: SQL Keyword Checking +** +** These routines provide access to the set of SQL language keywords +** recognized by SQLite. Applications can uses these routines to determine +** whether or not a specific identifier needs to be escaped (for example, +** by enclosing in double-quotes) so as not to confuse the parser. +** +** The sqlite3_keyword_count() interface returns the number of distinct +** keywords understood by SQLite. +** +** The sqlite3_keyword_name(N,Z,L) interface finds the N-th keyword and +** makes *Z point to that keyword expressed as UTF8 and writes the number +** of bytes in the keyword into *L. The string that *Z points to is not +** zero-terminated. The sqlite3_keyword_name(N,Z,L) routine returns +** SQLITE_OK if N is within bounds and SQLITE_ERROR if not. If either Z +** or L are NULL or invalid pointers then calls to +** sqlite3_keyword_name(N,Z,L) result in undefined behavior. +** +** The sqlite3_keyword_check(Z,L) interface checks to see whether or not +** the L-byte UTF8 identifier that Z points to is a keyword, returning non-zero +** if it is and zero if not. +** +** The parser used by SQLite is forgiving. It is often possible to use +** a keyword as an identifier as long as such use does not result in a +** parsing ambiguity. For example, the statement +** "CREATE TABLE BEGIN(REPLACE,PRAGMA,END);" is accepted by SQLite, and +** creates a new table named "BEGIN" with three columns named +** "REPLACE", "PRAGMA", and "END". Nevertheless, best practice is to avoid +** using keywords as identifiers. Common techniques used to avoid keyword +** name collisions include: +** <ul> +** <li> Put all identifier names inside double-quotes. This is the official +** SQL way to escape identifier names. +** <li> Put identifier names inside [...]. This is not standard SQL, +** but it is what SQL Server does and so lots of programmers use this +** technique. +** <li> Begin every identifier with the letter "Z" as no SQL keywords start +** with "Z". +** <li> Include a digit somewhere in every identifier name. +** </ul> +** +** Note that the number of keywords understood by SQLite can depend on +** compile-time options. For example, "VACUUM" is not a keyword if +** SQLite is compiled with the [-DSQLITE_OMIT_VACUUM] option. Also, +** new keywords may be added to future releases of SQLite. +*/ +SQLITE_API int sqlite3_keyword_count(void); +SQLITE_API int sqlite3_keyword_name(int,const char**,int*); +SQLITE_API int sqlite3_keyword_check(const char*,int); + +/* +** CAPI3REF: Dynamic String Object +** KEYWORDS: {dynamic string} +** +** An instance of the sqlite3_str object contains a dynamically-sized +** string under construction. +** +** The lifecycle of an sqlite3_str object is as follows: +** <ol> +** <li> ^The sqlite3_str object is created using [sqlite3_str_new()]. +** <li> ^Text is appended to the sqlite3_str object using various +** methods, such as [sqlite3_str_appendf()]. +** <li> ^The sqlite3_str object is destroyed and the string it created +** is returned using the [sqlite3_str_finish()] interface. +** </ol> +*/ +typedef struct sqlite3_str sqlite3_str; + +/* +** CAPI3REF: Create A New Dynamic String Object +** CONSTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_new(D)] interface allocates and initializes +** a new [sqlite3_str] object. To avoid memory leaks, the object returned by +** [sqlite3_str_new()] must be freed by a subsequent call to +** [sqlite3_str_finish(X)]. +** +** ^The [sqlite3_str_new(D)] interface always returns a pointer to a +** valid [sqlite3_str] object, though in the event of an out-of-memory +** error the returned object might be a special singleton that will +** silently reject new text, always return SQLITE_NOMEM from +** [sqlite3_str_errcode()], always return 0 for +** [sqlite3_str_length()], and always return NULL from +** [sqlite3_str_finish(X)]. It is always safe to use the value +** returned by [sqlite3_str_new(D)] as the sqlite3_str parameter +** to any of the other [sqlite3_str] methods. +** +** The D parameter to [sqlite3_str_new(D)] may be NULL. If the +** D parameter in [sqlite3_str_new(D)] is not NULL, then the maximum +** length of the string contained in the [sqlite3_str] object will be +** the value set for [sqlite3_limit](D,[SQLITE_LIMIT_LENGTH]) instead +** of [SQLITE_MAX_LENGTH]. +*/ +SQLITE_API sqlite3_str *sqlite3_str_new(sqlite3*); + +/* +** CAPI3REF: Finalize A Dynamic String +** DESTRUCTOR: sqlite3_str +** +** ^The [sqlite3_str_finish(X)] interface destroys the sqlite3_str object X +** and returns a pointer to a memory buffer obtained from [sqlite3_malloc64()] +** that contains the constructed string. The calling application should +** pass the returned value to [sqlite3_free()] to avoid a memory leak. +** ^The [sqlite3_str_finish(X)] interface may return a NULL pointer if any +** errors were encountered during construction of the string. ^The +** [sqlite3_str_finish(X)] interface will also return a NULL pointer if the +** string in [sqlite3_str] object X is zero bytes long. +*/ +SQLITE_API char *sqlite3_str_finish(sqlite3_str*); + +/* +** CAPI3REF: Add Content To A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces add content to an sqlite3_str object previously obtained +** from [sqlite3_str_new()]. +** +** ^The [sqlite3_str_appendf(X,F,...)] and +** [sqlite3_str_vappendf(X,F,V)] interfaces uses the [built-in printf] +** functionality of SQLite to append formatted text onto the end of +** [sqlite3_str] object X. +** +** ^The [sqlite3_str_append(X,S,N)] method appends exactly N bytes from string S +** onto the end of the [sqlite3_str] object X. N must be non-negative. +** S must contain at least N non-zero bytes of content. To append a +** zero-terminated string in its entirety, use the [sqlite3_str_appendall()] +** method instead. +** +** ^The [sqlite3_str_appendall(X,S)] method appends the complete content of +** zero-terminated string S onto the end of [sqlite3_str] object X. +** +** ^The [sqlite3_str_appendchar(X,N,C)] method appends N copies of the +** single-byte character C onto the end of [sqlite3_str] object X. +** ^This method can be used, for example, to add whitespace indentation. +** +** ^The [sqlite3_str_reset(X)] method resets the string under construction +** inside [sqlite3_str] object X back to zero bytes in length. +** +** These methods do not return a result code. ^If an error occurs, that fact +** is recorded in the [sqlite3_str] object and can be recovered by a +** subsequent call to [sqlite3_str_errcode(X)]. +*/ +SQLITE_API void sqlite3_str_appendf(sqlite3_str*, const char *zFormat, ...); +SQLITE_API void sqlite3_str_vappendf(sqlite3_str*, const char *zFormat, va_list); +SQLITE_API void sqlite3_str_append(sqlite3_str*, const char *zIn, int N); +SQLITE_API void sqlite3_str_appendall(sqlite3_str*, const char *zIn); +SQLITE_API void sqlite3_str_appendchar(sqlite3_str*, int N, char C); +SQLITE_API void sqlite3_str_reset(sqlite3_str*); + +/* +** CAPI3REF: Status Of A Dynamic String +** METHOD: sqlite3_str +** +** These interfaces return the current status of an [sqlite3_str] object. +** +** ^If any prior errors have occurred while constructing the dynamic string +** in sqlite3_str X, then the [sqlite3_str_errcode(X)] method will return +** an appropriate error code. ^The [sqlite3_str_errcode(X)] method returns +** [SQLITE_NOMEM] following any out-of-memory error, or +** [SQLITE_TOOBIG] if the size of the dynamic string exceeds +** [SQLITE_MAX_LENGTH], or [SQLITE_OK] if there have been no errors. +** +** ^The [sqlite3_str_length(X)] method returns the current length, in bytes, +** of the dynamic string under construction in [sqlite3_str] object X. +** ^The length returned by [sqlite3_str_length(X)] does not include the +** zero-termination byte. +** +** ^The [sqlite3_str_value(X)] method returns a pointer to the current +** content of the dynamic string under construction in X. The value +** returned by [sqlite3_str_value(X)] is managed by the sqlite3_str object X +** and might be freed or altered by any subsequent method on the same +** [sqlite3_str] object. Applications must not used the pointer returned +** [sqlite3_str_value(X)] after any subsequent method call on the same +** object. ^Applications may change the content of the string returned +** by [sqlite3_str_value(X)] as long as they do not write into any bytes +** outside the range of 0 to [sqlite3_str_length(X)] and do not read or +** write any byte after any subsequent sqlite3_str method call. +*/ +SQLITE_API int sqlite3_str_errcode(sqlite3_str*); +SQLITE_API int sqlite3_str_length(sqlite3_str*); +SQLITE_API char *sqlite3_str_value(sqlite3_str*); /* ** CAPI3REF: SQLite Runtime Status ** -** ^This interface is used to retrieve runtime status information +** ^These interfaces are used to retrieve runtime status information ** about the performance of SQLite, and optionally to reset various ** highwater marks. ^The first argument is an integer code for ** the specific parameter to measure. ^(Recognized integer codes @@ -6284,19 +7287,22 @@ SQLITE_API int sqlite3_test_control(int op, ...); ** ^(Other parameters record only the highwater mark and not the current ** value. For these latter parameters nothing is written into *pCurrent.)^ ** -** ^The sqlite3_status() routine returns SQLITE_OK on success and a -** non-zero [error code] on failure. +** ^The sqlite3_status() and sqlite3_status64() routines return +** SQLITE_OK on success and a non-zero [error code] on failure. ** -** This routine is threadsafe but is not atomic. This routine can be -** called while other threads are running the same or different SQLite -** interfaces. However the values returned in *pCurrent and -** *pHighwater reflect the status of SQLite at different points in time -** and it is possible that another thread might change the parameter -** in between the times when *pCurrent and *pHighwater are written. +** If either the current value or the highwater mark is too large to +** be represented by a 32-bit integer, then the values returned by +** sqlite3_status() are undefined. ** ** See also: [sqlite3_db_status()] */ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetFlag); +SQLITE_API int sqlite3_status64( + int op, + sqlite3_int64 *pCurrent, + sqlite3_int64 *pHighwater, + int resetFlag +); /* @@ -6311,8 +7317,7 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF ** <dd>This parameter is the current amount of memory checked out ** using [sqlite3_malloc()], either directly or indirectly. The ** figure includes calls made to [sqlite3_malloc()] by the application -** and internal memory usage by the SQLite library. Scratch memory -** controlled by [SQLITE_CONFIG_SCRATCH] and auxiliary page-cache +** and internal memory usage by the SQLite library. Auxiliary page-cache ** memory controlled by [SQLITE_CONFIG_PAGECACHE] is not included in ** this parameter. The amount returned is the sum of the allocation ** sizes as reported by the xSize method in [sqlite3_mem_methods].</dd>)^ @@ -6350,32 +7355,18 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF ** *pHighwater parameter to [sqlite3_status()] is of interest. ** The value written into the *pCurrent parameter is undefined.</dd>)^ ** -** [[SQLITE_STATUS_SCRATCH_USED]] ^(<dt>SQLITE_STATUS_SCRATCH_USED</dt> -** <dd>This parameter returns the number of allocations used out of the -** [scratch memory allocator] configured using -** [SQLITE_CONFIG_SCRATCH]. The value returned is in allocations, not -** in bytes. Since a single thread may only have one scratch allocation -** outstanding at time, this parameter also reports the number of threads -** using scratch memory at the same time.</dd>)^ +** [[SQLITE_STATUS_SCRATCH_USED]] <dt>SQLITE_STATUS_SCRATCH_USED</dt> +** <dd>No longer used.</dd> ** ** [[SQLITE_STATUS_SCRATCH_OVERFLOW]] ^(<dt>SQLITE_STATUS_SCRATCH_OVERFLOW</dt> -** <dd>This parameter returns the number of bytes of scratch memory -** allocation which could not be satisfied by the [SQLITE_CONFIG_SCRATCH] -** buffer and where forced to overflow to [sqlite3_malloc()]. The values -** returned include overflows because the requested allocation was too -** larger (that is, because the requested allocation was larger than the -** "sz" parameter to [SQLITE_CONFIG_SCRATCH]) and because no scratch buffer -** slots were available. -** </dd>)^ +** <dd>No longer used.</dd> ** -** [[SQLITE_STATUS_SCRATCH_SIZE]] ^(<dt>SQLITE_STATUS_SCRATCH_SIZE</dt> -** <dd>This parameter records the largest memory allocation request -** handed to [scratch memory allocator]. Only the value returned in the -** *pHighwater parameter to [sqlite3_status()] is of interest. -** The value written into the *pCurrent parameter is undefined.</dd>)^ +** [[SQLITE_STATUS_SCRATCH_SIZE]] <dt>SQLITE_STATUS_SCRATCH_SIZE</dt> +** <dd>No longer used.</dd> ** ** [[SQLITE_STATUS_PARSER_STACK]] ^(<dt>SQLITE_STATUS_PARSER_STACK</dt> -** <dd>This parameter records the deepest parser stack. It is only +** <dd>The *pHighwater parameter records the deepest parser stack. +** The *pCurrent value is undefined. The *pHighwater value is only ** meaningful if SQLite is compiled with [YYTRACKMAXSTACKDEPTH].</dd>)^ ** </dl> ** @@ -6384,16 +7375,17 @@ SQLITE_API int sqlite3_status(int op, int *pCurrent, int *pHighwater, int resetF #define SQLITE_STATUS_MEMORY_USED 0 #define SQLITE_STATUS_PAGECACHE_USED 1 #define SQLITE_STATUS_PAGECACHE_OVERFLOW 2 -#define SQLITE_STATUS_SCRATCH_USED 3 -#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 +#define SQLITE_STATUS_SCRATCH_USED 3 /* NOT USED */ +#define SQLITE_STATUS_SCRATCH_OVERFLOW 4 /* NOT USED */ #define SQLITE_STATUS_MALLOC_SIZE 5 #define SQLITE_STATUS_PARSER_STACK 6 #define SQLITE_STATUS_PAGECACHE_SIZE 7 -#define SQLITE_STATUS_SCRATCH_SIZE 8 +#define SQLITE_STATUS_SCRATCH_SIZE 8 /* NOT USED */ #define SQLITE_STATUS_MALLOC_COUNT 9 /* ** CAPI3REF: Database Connection Status +** METHOD: sqlite3 ** ** ^This interface is used to retrieve runtime status information ** about a single [database connection]. ^The first argument is the @@ -6460,6 +7452,18 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** memory used by all pager caches associated with the database connection.)^ ** ^The highwater mark associated with SQLITE_DBSTATUS_CACHE_USED is always 0. ** +** [[SQLITE_DBSTATUS_CACHE_USED_SHARED]] +** ^(<dt>SQLITE_DBSTATUS_CACHE_USED_SHARED</dt> +** <dd>This parameter is similar to DBSTATUS_CACHE_USED, except that if a +** pager cache is shared between two or more connections the bytes of heap +** memory used by that pager cache is divided evenly between the attached +** connections.)^ In other words, if none of the pager caches associated +** with the database connection are shared, this request returns the same +** value as DBSTATUS_CACHE_USED. Or, if one or more or the pager caches are +** shared, the value returned by this call will be smaller than that returned +** by DBSTATUS_CACHE_USED. ^The highwater mark associated with +** SQLITE_DBSTATUS_CACHE_USED_SHARED is always 0. +** ** [[SQLITE_DBSTATUS_SCHEMA_USED]] ^(<dt>SQLITE_DBSTATUS_SCHEMA_USED</dt> ** <dd>This parameter returns the approximate number of bytes of heap ** memory used to store the schema for all databases associated @@ -6499,6 +7503,15 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r ** highwater mark associated with SQLITE_DBSTATUS_CACHE_WRITE is always 0. ** </dd> ** +** [[SQLITE_DBSTATUS_CACHE_SPILL]] ^(<dt>SQLITE_DBSTATUS_CACHE_SPILL</dt> +** <dd>This parameter returns the number of dirty cache entries that have +** been written to disk in the middle of a transaction due to the page +** cache overflowing. Transactions are more efficient if they are written +** to disk all at once. When pages spill mid-transaction, that introduces +** additional overhead. This parameter can be used help identify +** inefficiencies that can be resolve by increasing the cache size. +** </dd> +** ** [[SQLITE_DBSTATUS_DEFERRED_FKS]] ^(<dt>SQLITE_DBSTATUS_DEFERRED_FKS</dt> ** <dd>This parameter returns zero for the current value if and only if ** all foreign key constraints (deferred or immediate) have been @@ -6517,11 +7530,14 @@ SQLITE_API int sqlite3_db_status(sqlite3*, int op, int *pCur, int *pHiwtr, int r #define SQLITE_DBSTATUS_CACHE_MISS 8 #define SQLITE_DBSTATUS_CACHE_WRITE 9 #define SQLITE_DBSTATUS_DEFERRED_FKS 10 -#define SQLITE_DBSTATUS_MAX 10 /* Largest defined DBSTATUS */ +#define SQLITE_DBSTATUS_CACHE_USED_SHARED 11 +#define SQLITE_DBSTATUS_CACHE_SPILL 12 +#define SQLITE_DBSTATUS_MAX 12 /* Largest defined DBSTATUS */ /* ** CAPI3REF: Prepared Statement Status +** METHOD: sqlite3_stmt ** ** ^(Each prepared statement maintains various ** [SQLITE_STMTSTATUS counters] that measure the number @@ -6579,6 +7595,24 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); ** used as a proxy for the total work done by the prepared statement. ** If the number of virtual machine operations exceeds 2147483647 ** then the value returned by this statement status code is undefined. +** +** [[SQLITE_STMTSTATUS_REPREPARE]] <dt>SQLITE_STMTSTATUS_REPREPARE</dt> +** <dd>^This is the number of times that the prepare statement has been +** automatically regenerated due to schema changes or change to +** [bound parameters] that might affect the query plan. +** +** [[SQLITE_STMTSTATUS_RUN]] <dt>SQLITE_STMTSTATUS_RUN</dt> +** <dd>^This is the number of times that the prepared statement has +** been run. A single "run" for the purposes of this counter is one +** or more calls to [sqlite3_step()] followed by a call to [sqlite3_reset()]. +** The counter is incremented on the first [sqlite3_step()] call of each +** cycle. +** +** [[SQLITE_STMTSTATUS_MEMUSED]] <dt>SQLITE_STMTSTATUS_MEMUSED</dt> +** <dd>^This is the approximate number of bytes of heap memory +** used to store the prepared statement. ^This value is not actually +** a counter, and so the resetFlg parameter to sqlite3_stmt_status() +** is ignored when the opcode is SQLITE_STMTSTATUS_MEMUSED. ** </dd> ** </dl> */ @@ -6586,6 +7620,9 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); #define SQLITE_STMTSTATUS_SORT 2 #define SQLITE_STMTSTATUS_AUTOINDEX 3 #define SQLITE_STMTSTATUS_VM_STEP 4 +#define SQLITE_STMTSTATUS_REPREPARE 5 +#define SQLITE_STMTSTATUS_RUN 6 +#define SQLITE_STMTSTATUS_MEMUSED 99 /* ** CAPI3REF: Custom Page Cache Object @@ -6870,7 +7907,7 @@ typedef struct sqlite3_backup sqlite3_backup; ** must be different or else sqlite3_backup_init(D,N,S,M) will fail with ** an error. ** -** ^A call to sqlite3_backup_init() will fail, returning SQLITE_ERROR, if +** ^A call to sqlite3_backup_init() will fail, returning NULL, if ** there is already a read or read-write transaction open on the ** destination database. ** @@ -6966,20 +8003,20 @@ typedef struct sqlite3_backup sqlite3_backup; ** is not a permanent error and does not affect the return value of ** sqlite3_backup_finish(). ** -** [[sqlite3_backup__remaining()]] [[sqlite3_backup_pagecount()]] +** [[sqlite3_backup_remaining()]] [[sqlite3_backup_pagecount()]] ** <b>sqlite3_backup_remaining() and sqlite3_backup_pagecount()</b> ** -** ^Each call to sqlite3_backup_step() sets two values inside -** the [sqlite3_backup] object: the number of pages still to be backed -** up and the total number of pages in the source database file. -** The sqlite3_backup_remaining() and sqlite3_backup_pagecount() interfaces -** retrieve these two values, respectively. -** -** ^The values returned by these functions are only updated by -** sqlite3_backup_step(). ^If the source database is modified during a backup -** operation, then the values are not updated to account for any extra -** pages that need to be updated or the size of the source database file -** changing. +** ^The sqlite3_backup_remaining() routine returns the number of pages still +** to be backed up at the conclusion of the most recent sqlite3_backup_step(). +** ^The sqlite3_backup_pagecount() routine returns the total number of pages +** in the source database at the conclusion of the most recent +** sqlite3_backup_step(). +** ^(The values returned by these functions are only updated by +** sqlite3_backup_step(). If the source database is modified in a way that +** changes the size of the source database or the number of pages remaining, +** those changes are not reflected in the output of sqlite3_backup_pagecount() +** and sqlite3_backup_remaining() until after the next +** sqlite3_backup_step().)^ ** ** <b>Concurrent Usage of Database Handles</b> ** @@ -7025,6 +8062,7 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); /* ** CAPI3REF: Unlock Notification +** METHOD: sqlite3 ** ** ^When running in shared-cache mode, a database operation may fail with ** an [SQLITE_LOCKED] error if the required locks on the shared-cache or @@ -7158,18 +8196,43 @@ SQLITE_API int sqlite3_strnicmp(const char *, const char *, int); /* ** CAPI3REF: String Globbing * -** ^The [sqlite3_strglob(P,X)] interface returns zero if string X matches -** the glob pattern P, and it returns non-zero if string X does not match -** the glob pattern P. ^The definition of glob pattern matching used in +** ^The [sqlite3_strglob(P,X)] interface returns zero if and only if +** string X matches the [GLOB] pattern P. +** ^The definition of [GLOB] pattern matching used in ** [sqlite3_strglob(P,X)] is the same as for the "X GLOB P" operator in the -** SQL dialect used by SQLite. ^The sqlite3_strglob(P,X) function is case -** sensitive. +** SQL dialect understood by SQLite. ^The [sqlite3_strglob(P,X)] function +** is case sensitive. ** ** Note that this routine returns zero on a match and non-zero if the strings ** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strlike()]. */ SQLITE_API int sqlite3_strglob(const char *zGlob, const char *zStr); +/* +** CAPI3REF: String LIKE Matching +* +** ^The [sqlite3_strlike(P,X,E)] interface returns zero if and only if +** string X matches the [LIKE] pattern P with escape character E. +** ^The definition of [LIKE] pattern matching used in +** [sqlite3_strlike(P,X,E)] is the same as for the "X LIKE P ESCAPE E" +** operator in the SQL dialect understood by SQLite. ^For "X LIKE P" without +** the ESCAPE clause, set the E parameter of [sqlite3_strlike(P,X,E)] to 0. +** ^As with the LIKE operator, the [sqlite3_strlike(P,X,E)] function is case +** insensitive - equivalent upper and lower case ASCII characters match +** one another. +** +** ^The [sqlite3_strlike(P,X,E)] function matches Unicode characters, though +** only ASCII characters are case folded. +** +** Note that this routine returns zero on a match and non-zero if the strings +** do not match, the same as [sqlite3_stricmp()] and [sqlite3_strnicmp()]. +** +** See also: [sqlite3_strglob()]. +*/ +SQLITE_API int sqlite3_strlike(const char *zGlob, const char *zStr, unsigned int cEsc); + /* ** CAPI3REF: Error Logging Interface ** @@ -7195,6 +8258,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); /* ** CAPI3REF: Write-Ahead Log Commit Hook +** METHOD: sqlite3 ** ** ^The [sqlite3_wal_hook()] function is used to register a callback that ** is invoked each time data is committed to a database in wal mode. @@ -7224,7 +8288,7 @@ SQLITE_API void sqlite3_log(int iErrCode, const char *zFormat, ...); ** previously registered write-ahead log callback. ^Note that the ** [sqlite3_wal_autocheckpoint()] interface and the ** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will -** those overwrite any prior [sqlite3_wal_hook()] settings. +** overwrite any prior [sqlite3_wal_hook()] settings. */ SQLITE_API void *sqlite3_wal_hook( sqlite3*, @@ -7234,6 +8298,7 @@ SQLITE_API void *sqlite3_wal_hook( /* ** CAPI3REF: Configure an auto-checkpoint +** METHOD: sqlite3 ** ** ^The [sqlite3_wal_autocheckpoint(D,N)] is a wrapper around ** [sqlite3_wal_hook()] that causes any database on [database connection] D @@ -7264,6 +8329,7 @@ SQLITE_API int sqlite3_wal_autocheckpoint(sqlite3 *db, int N); /* ** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 ** ** ^(The sqlite3_wal_checkpoint(D,X) is equivalent to ** [sqlite3_wal_checkpoint_v2](D,X,[SQLITE_CHECKPOINT_PASSIVE],0,0).)^ @@ -7285,6 +8351,7 @@ SQLITE_API int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb); /* ** CAPI3REF: Checkpoint a database +** METHOD: sqlite3 ** ** ^(The sqlite3_wal_checkpoint_v2(D,X,M,L,C) interface runs a checkpoint ** operation on database X of [database connection] D in mode M. Status @@ -7465,6 +8532,40 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...); */ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); +/* +** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE +** +** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn] +** method of a [virtual table], then it returns true if and only if the +** column is being fetched as part of an UPDATE operation during which the +** column value will not change. Applications might use this to substitute +** a return value that is less expensive to compute and that the corresponding +** [xUpdate] method understands as a "no-change" value. +** +** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that +** the column is not changed by the UPDATE statement, then the xColumn +** method can optionally return without setting a result, without calling +** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces]. +** In that case, [sqlite3_value_nochange(X)] will return true for the +** same column in the [xUpdate] method. +*/ +SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); + +/* +** CAPI3REF: Determine The Collation For a Virtual Table Constraint +** +** This function may only be called from within a call to the [xBestIndex] +** method of a [virtual table]. +** +** The first argument must be the sqlite3_index_info object that is the +** first parameter to the xBestIndex() method. The second argument must be +** an index into the aConstraint[] array belonging to the sqlite3_index_info +** structure passed to xBestIndex. This function returns a pointer to a buffer +** containing the name of the collation sequence for the corresponding +** constraint. +*/ +SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); + /* ** CAPI3REF: Conflict resolution modes ** KEYWORDS: {conflict resolution mode} @@ -7539,6 +8640,7 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); /* ** CAPI3REF: Prepared Statement Scan Status +** METHOD: sqlite3_stmt ** ** This interface returns information about the predicted and measured ** performance for pStmt. Advanced applications can use this @@ -7567,7 +8669,7 @@ SQLITE_API int sqlite3_vtab_on_conflict(sqlite3 *); ** ** See also: [sqlite3_stmt_scanstatus_reset()] */ -SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_scanstatus( +SQLITE_API int sqlite3_stmt_scanstatus( sqlite3_stmt *pStmt, /* Prepared statement for which info desired */ int idx, /* Index of loop to report on */ int iScanStatusOp, /* Information desired. SQLITE_SCANSTAT_* */ @@ -7576,14 +8678,461 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_stmt_scanstatus( /* ** CAPI3REF: Zero Scan-Status Counters +** METHOD: sqlite3_stmt ** ** ^Zero all [sqlite3_stmt_scanstatus()] related event counters. ** ** This API is only available if the library is built with pre-processor ** symbol [SQLITE_ENABLE_STMT_SCANSTATUS] defined. */ -SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); +SQLITE_API void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*); +/* +** CAPI3REF: Flush caches to disk mid-transaction +** +** ^If a write-transaction is open on [database connection] D when the +** [sqlite3_db_cacheflush(D)] interface invoked, any dirty +** pages in the pager-cache that are not currently in use are written out +** to disk. A dirty page may be in use if a database cursor created by an +** active SQL statement is reading from it, or if it is page 1 of a database +** file (page 1 is always "in use"). ^The [sqlite3_db_cacheflush(D)] +** interface flushes caches for all schemas - "main", "temp", and +** any [attached] databases. +** +** ^If this function needs to obtain extra database locks before dirty pages +** can be flushed to disk, it does so. ^If those locks cannot be obtained +** immediately and there is a busy-handler callback configured, it is invoked +** in the usual manner. ^If the required lock still cannot be obtained, then +** the database is skipped and an attempt made to flush any dirty pages +** belonging to the next (if any) database. ^If any databases are skipped +** because locks cannot be obtained, but no other error occurs, this +** function returns SQLITE_BUSY. +** +** ^If any other error occurs while flushing dirty pages to disk (for +** example an IO error or out-of-memory condition), then processing is +** abandoned and an SQLite [error code] is returned to the caller immediately. +** +** ^Otherwise, if no error occurs, [sqlite3_db_cacheflush()] returns SQLITE_OK. +** +** ^This function does not set the database handle error code or message +** returned by the [sqlite3_errcode()] and [sqlite3_errmsg()] functions. +*/ +SQLITE_API int sqlite3_db_cacheflush(sqlite3*); + +/* +** CAPI3REF: The pre-update hook. +** +** ^These interfaces are only available if SQLite is compiled using the +** [SQLITE_ENABLE_PREUPDATE_HOOK] compile-time option. +** +** ^The [sqlite3_preupdate_hook()] interface registers a callback function +** that is invoked prior to each [INSERT], [UPDATE], and [DELETE] operation +** on a database table. +** ^At most one preupdate hook may be registered at a time on a single +** [database connection]; each call to [sqlite3_preupdate_hook()] overrides +** the previous setting. +** ^The preupdate hook is disabled by invoking [sqlite3_preupdate_hook()] +** with a NULL pointer as the second parameter. +** ^The third parameter to [sqlite3_preupdate_hook()] is passed through as +** the first parameter to callbacks. +** +** ^The preupdate hook only fires for changes to real database tables; the +** preupdate hook is not invoked for changes to [virtual tables] or to +** system tables like sqlite_master or sqlite_stat1. +** +** ^The second parameter to the preupdate callback is a pointer to +** the [database connection] that registered the preupdate hook. +** ^The third parameter to the preupdate callback is one of the constants +** [SQLITE_INSERT], [SQLITE_DELETE], or [SQLITE_UPDATE] to identify the +** kind of update operation that is about to occur. +** ^(The fourth parameter to the preupdate callback is the name of the +** database within the database connection that is being modified. This +** will be "main" for the main database or "temp" for TEMP tables or +** the name given after the AS keyword in the [ATTACH] statement for attached +** databases.)^ +** ^The fifth parameter to the preupdate callback is the name of the +** table that is being modified. +** +** For an UPDATE or DELETE operation on a [rowid table], the sixth +** parameter passed to the preupdate callback is the initial [rowid] of the +** row being modified or deleted. For an INSERT operation on a rowid table, +** or any operation on a WITHOUT ROWID table, the value of the sixth +** parameter is undefined. For an INSERT or UPDATE on a rowid table the +** seventh parameter is the final rowid value of the row being inserted +** or updated. The value of the seventh parameter passed to the callback +** function is not defined for operations on WITHOUT ROWID tables, or for +** INSERT operations on rowid tables. +** +** The [sqlite3_preupdate_old()], [sqlite3_preupdate_new()], +** [sqlite3_preupdate_count()], and [sqlite3_preupdate_depth()] interfaces +** provide additional information about a preupdate event. These routines +** may only be called from within a preupdate callback. Invoking any of +** these routines from outside of a preupdate callback or with a +** [database connection] pointer that is different from the one supplied +** to the preupdate callback results in undefined and probably undesirable +** behavior. +** +** ^The [sqlite3_preupdate_count(D)] interface returns the number of columns +** in the row that is being inserted, updated, or deleted. +** +** ^The [sqlite3_preupdate_old(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row before it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_UPDATE and SQLITE_DELETE +** preupdate callbacks; if it is used by an SQLITE_INSERT callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_new(D,N,P)] interface writes into P a pointer to +** a [protected sqlite3_value] that contains the value of the Nth column of +** the table row after it is updated. The N parameter must be between 0 +** and one less than the number of columns or the behavior will be +** undefined. This must only be used within SQLITE_INSERT and SQLITE_UPDATE +** preupdate callbacks; if it is used by an SQLITE_DELETE callback then the +** behavior is undefined. The [sqlite3_value] that P points to +** will be destroyed when the preupdate callback returns. +** +** ^The [sqlite3_preupdate_depth(D)] interface returns 0 if the preupdate +** callback was invoked as a result of a direct insert, update, or delete +** operation; or 1 for inserts, updates, or deletes invoked by top-level +** triggers; or 2 for changes resulting from triggers called by top-level +** triggers; and so forth. +** +** See also: [sqlite3_update_hook()] +*/ +#if defined(SQLITE_ENABLE_PREUPDATE_HOOK) +SQLITE_API void *sqlite3_preupdate_hook( + sqlite3 *db, + void(*xPreUpdate)( + void *pCtx, /* Copy of third arg to preupdate_hook() */ + sqlite3 *db, /* Database handle */ + int op, /* SQLITE_UPDATE, DELETE or INSERT */ + char const *zDb, /* Database name */ + char const *zName, /* Table name */ + sqlite3_int64 iKey1, /* Rowid of row about to be deleted/updated */ + sqlite3_int64 iKey2 /* New rowid value (for a rowid UPDATE) */ + ), + void* +); +SQLITE_API int sqlite3_preupdate_old(sqlite3 *, int, sqlite3_value **); +SQLITE_API int sqlite3_preupdate_count(sqlite3 *); +SQLITE_API int sqlite3_preupdate_depth(sqlite3 *); +SQLITE_API int sqlite3_preupdate_new(sqlite3 *, int, sqlite3_value **); +#endif + +/* +** CAPI3REF: Low-level system error code +** +** ^Attempt to return the underlying operating system error code or error +** number that caused the most recent I/O error or failure to open a file. +** The return value is OS-dependent. For example, on unix systems, after +** [sqlite3_open_v2()] returns [SQLITE_CANTOPEN], this interface could be +** called to get back the underlying "errno" that caused the problem, such +** as ENOSPC, EAUTH, EISDIR, and so forth. +*/ +SQLITE_API int sqlite3_system_errno(sqlite3*); + +/* +** CAPI3REF: Database Snapshot +** KEYWORDS: {snapshot} {sqlite3_snapshot} +** EXPERIMENTAL +** +** An instance of the snapshot object records the state of a [WAL mode] +** database for some specific point in history. +** +** In [WAL mode], multiple [database connections] that are open on the +** same database file can each be reading a different historical version +** of the database file. When a [database connection] begins a read +** transaction, that connection sees an unchanging copy of the database +** as it existed for the point in time when the transaction first started. +** Subsequent changes to the database from other connections are not seen +** by the reader until a new read transaction is started. +** +** The sqlite3_snapshot object records state information about an historical +** version of the database file so that it is possible to later open a new read +** transaction that sees that historical version of the database rather than +** the most recent version. +** +** The constructor for this object is [sqlite3_snapshot_get()]. The +** [sqlite3_snapshot_open()] method causes a fresh read transaction to refer +** to an historical snapshot (if possible). The destructor for +** sqlite3_snapshot objects is [sqlite3_snapshot_free()]. +*/ +typedef struct sqlite3_snapshot { + unsigned char hidden[48]; +} sqlite3_snapshot; + +/* +** CAPI3REF: Record A Database Snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_get(D,S,P)] interface attempts to make a +** new [sqlite3_snapshot] object that records the current state of +** schema S in database connection D. ^On success, the +** [sqlite3_snapshot_get(D,S,P)] interface writes a pointer to the newly +** created [sqlite3_snapshot] object into *P and returns SQLITE_OK. +** If there is not already a read-transaction open on schema S when +** this function is called, one is opened automatically. +** +** The following must be true for this function to succeed. If any of +** the following statements are false when sqlite3_snapshot_get() is +** called, SQLITE_ERROR is returned. The final value of *P is undefined +** in this case. +** +** <ul> +** <li> The database handle must be in [autocommit mode]. +** +** <li> Schema S of [database connection] D must be a [WAL mode] database. +** +** <li> There must not be a write transaction open on schema S of database +** connection D. +** +** <li> One or more transactions must have been written to the current wal +** file since it was created on disk (by any connection). This means +** that a snapshot cannot be taken on a wal mode database with no wal +** file immediately after it is first opened. At least one transaction +** must be written to it first. +** </ul> +** +** This function may also return SQLITE_NOMEM. If it is called with the +** database handle in autocommit mode but fails for some other reason, +** whether or not a read transaction is opened on schema S is undefined. +** +** The [sqlite3_snapshot] object returned from a successful call to +** [sqlite3_snapshot_get()] must be freed using [sqlite3_snapshot_free()] +** to avoid a memory leak. +** +** The [sqlite3_snapshot_get()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_get( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot **ppSnapshot +); + +/* +** CAPI3REF: Start a read transaction on an historical snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_open(D,S,P)] interface starts a +** read transaction for schema S of +** [database connection] D such that the read transaction +** refers to historical [snapshot] P, rather than the most +** recent change to the database. +** ^The [sqlite3_snapshot_open()] interface returns SQLITE_OK on success +** or an appropriate [error code] if it fails. +** +** ^In order to succeed, a call to [sqlite3_snapshot_open(D,S,P)] must be +** the first operation following the [BEGIN] that takes the schema S +** out of [autocommit mode]. +** ^In other words, schema S must not currently be in +** a transaction for [sqlite3_snapshot_open(D,S,P)] to work, but the +** database connection D must be out of [autocommit mode]. +** ^A [snapshot] will fail to open if it has been overwritten by a +** [checkpoint]. +** ^(A call to [sqlite3_snapshot_open(D,S,P)] will fail if the +** database connection D does not know that the database file for +** schema S is in [WAL mode]. A database connection might not know +** that the database file is in [WAL mode] if there has been no prior +** I/O on that database connection, or if the database entered [WAL mode] +** after the most recent I/O on the database connection.)^ +** (Hint: Run "[PRAGMA application_id]" against a newly opened +** database connection in order to make it ready to use snapshots.) +** +** The [sqlite3_snapshot_open()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_open( + sqlite3 *db, + const char *zSchema, + sqlite3_snapshot *pSnapshot +); + +/* +** CAPI3REF: Destroy a snapshot +** EXPERIMENTAL +** +** ^The [sqlite3_snapshot_free(P)] interface destroys [sqlite3_snapshot] P. +** The application must eventually free every [sqlite3_snapshot] object +** using this routine to avoid a memory leak. +** +** The [sqlite3_snapshot_free()] interface is only available when the +** SQLITE_ENABLE_SNAPSHOT compile-time option is used. +*/ +SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_snapshot_free(sqlite3_snapshot*); + +/* +** CAPI3REF: Compare the ages of two snapshot handles. +** EXPERIMENTAL +** +** The sqlite3_snapshot_cmp(P1, P2) interface is used to compare the ages +** of two valid snapshot handles. +** +** If the two snapshot handles are not associated with the same database +** file, the result of the comparison is undefined. +** +** Additionally, the result of the comparison is only valid if both of the +** snapshot handles were obtained by calling sqlite3_snapshot_get() since the +** last time the wal file was deleted. The wal file is deleted when the +** database is changed back to rollback mode or when the number of database +** clients drops to zero. If either snapshot handle was obtained before the +** wal file was last deleted, the value returned by this function +** is undefined. +** +** Otherwise, this API returns a negative value if P1 refers to an older +** snapshot than P2, zero if the two handles refer to the same database +** snapshot, and a positive value if P1 is a newer snapshot than P2. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_cmp( + sqlite3_snapshot *p1, + sqlite3_snapshot *p2 +); + +/* +** CAPI3REF: Recover snapshots from a wal file +** EXPERIMENTAL +** +** If all connections disconnect from a database file but do not perform +** a checkpoint, the existing wal file is opened along with the database +** file the next time the database is opened. At this point it is only +** possible to successfully call sqlite3_snapshot_open() to open the most +** recent snapshot of the database (the one at the head of the wal file), +** even though the wal file may contain other valid snapshots for which +** clients have sqlite3_snapshot handles. +** +** This function attempts to scan the wal file associated with database zDb +** of database handle db and make all valid snapshots available to +** sqlite3_snapshot_open(). It is an error if there is already a read +** transaction open on the database, or if the database is not a wal mode +** database. +** +** SQLITE_OK is returned if successful, or an SQLite error code otherwise. +*/ +SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); + +/* +** CAPI3REF: Serialize a database +** +** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory +** that is a serialization of the S database on [database connection] D. +** If P is not a NULL pointer, then the size of the database in bytes +** is written into *P. +** +** For an ordinary on-disk database file, the serialization is just a +** copy of the disk file. For an in-memory database or a "TEMP" database, +** the serialization is the same sequence of bytes which would be written +** to disk if that database where backed up to disk. +** +** The usual case is that sqlite3_serialize() copies the serialization of +** the database into memory obtained from [sqlite3_malloc64()] and returns +** a pointer to that memory. The caller is responsible for freeing the +** returned value to avoid a memory leak. However, if the F argument +** contains the SQLITE_SERIALIZE_NOCOPY bit, then no memory allocations +** are made, and the sqlite3_serialize() function will return a pointer +** to the contiguous memory representation of the database that SQLite +** is currently using for that database, or NULL if the no such contiguous +** memory representation of the database exists. A contiguous memory +** representation of the database will usually only exist if there has +** been a prior call to [sqlite3_deserialize(D,S,...)] with the same +** values of D and S. +** The size of the database is written into *P even if the +** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy +** of the database exists. +** +** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the +** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory +** allocation error occurs. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_DESERIALIZE] option. +*/ +SQLITE_API unsigned char *sqlite3_serialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */ + sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */ + unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_serialize +** +** Zero or more of the following constants can be OR-ed together for +** the F argument to [sqlite3_serialize(D,S,P,F)]. +** +** SQLITE_SERIALIZE_NOCOPY means that [sqlite3_serialize()] will return +** a pointer to contiguous in-memory database that it is currently using, +** without making a copy of the database. If SQLite is not currently using +** a contiguous in-memory database, then this option causes +** [sqlite3_serialize()] to return a NULL pointer. SQLite will only be +** using a contiguous in-memory database if it has been initialized by a +** prior call to [sqlite3_deserialize()]. +*/ +#define SQLITE_SERIALIZE_NOCOPY 0x001 /* Do no memory allocations */ + +/* +** CAPI3REF: Deserialize a database +** +** The sqlite3_deserialize(D,S,P,N,M,F) interface causes the +** [database connection] D to disconnect from database S and then +** reopen S as an in-memory database based on the serialization contained +** in P. The serialized database P is N bytes in size. M is the size of +** the buffer P, which might be larger than N. If M is larger than N, and +** the SQLITE_DESERIALIZE_READONLY bit is not set in F, then SQLite is +** permitted to add content to the in-memory database as long as the total +** size does not exceed M bytes. +** +** If the SQLITE_DESERIALIZE_FREEONCLOSE bit is set in F, then SQLite will +** invoke sqlite3_free() on the serialization buffer when the database +** connection closes. If the SQLITE_DESERIALIZE_RESIZEABLE bit is set, then +** SQLite will try to increase the buffer size using sqlite3_realloc64() +** if writes on the database cause it to grow larger than M bytes. +** +** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the +** database is currently in a read transaction or is involved in a backup +** operation. +** +** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the +** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then +** [sqlite3_free()] is invoked on argument P prior to returning. +** +** This interface is only available if SQLite is compiled with the +** [SQLITE_ENABLE_DESERIALIZE] option. +*/ +SQLITE_API int sqlite3_deserialize( + sqlite3 *db, /* The database connection */ + const char *zSchema, /* Which DB to reopen with the deserialization */ + unsigned char *pData, /* The serialized database content */ + sqlite3_int64 szDb, /* Number bytes in the deserialization */ + sqlite3_int64 szBuf, /* Total size of buffer pData[] */ + unsigned mFlags /* Zero or more SQLITE_DESERIALIZE_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3_deserialize() +** +** The following are allowed values for 6th argument (the F argument) to +** the [sqlite3_deserialize(D,S,P,N,M,F)] interface. +** +** The SQLITE_DESERIALIZE_FREEONCLOSE means that the database serialization +** in the P argument is held in memory obtained from [sqlite3_malloc64()] +** and that SQLite should take ownership of this memory and automatically +** free it when it has finished using it. Without this flag, the caller +** is resposible for freeing any dynamically allocated memory. +** +** The SQLITE_DESERIALIZE_RESIZEABLE flag means that SQLite is allowed to +** grow the size of the database using calls to [sqlite3_realloc64()]. This +** flag should only be used if SQLITE_DESERIALIZE_FREEONCLOSE is also used. +** Without this flag, the deserialized database cannot increase in size beyond +** the number of bytes specified by the M parameter. +** +** The SQLITE_DESERIALIZE_READONLY flag means that the deserialized database +** should be treated as read-only. +*/ +#define SQLITE_DESERIALIZE_FREEONCLOSE 1 /* Call sqlite3_free() on close */ +#define SQLITE_DESERIALIZE_RESIZEABLE 2 /* Resize using sqlite3_realloc64() */ +#define SQLITE_DESERIALIZE_READONLY 4 /* Database is read-only */ /* ** Undo the hack that converts floating point types to integer for @@ -7596,8 +9145,9 @@ SQLITE_API SQLITE_EXPERIMENTAL void sqlite3_stmt_scanstatus_reset(sqlite3_stmt*) #ifdef __cplusplus } /* End of the 'extern "C"' block */ #endif -#endif /* _SQLITE3_H_ */ +#endif /* SQLITE3_H */ +/******** Begin file sqlite3rtree.h *********/ /* ** 2010 August 30 ** @@ -7697,6 +9247,8 @@ struct sqlite3_rtree_query_info { int eParentWithin; /* Visibility of parent node */ int eWithin; /* OUT: Visiblity */ sqlite3_rtree_dbl rScore; /* OUT: Write the score here */ + /* The following fields are only available in 3.8.11 and later */ + sqlite3_value **apSqlParam; /* Original SQL values of parameters */ }; /* @@ -7713,3 +9265,2170 @@ struct sqlite3_rtree_query_info { #endif /* ifndef _SQLITE3RTREE_H_ */ +/******** End of sqlite3rtree.h *********/ +/******** Begin file sqlite3session.h *********/ + +#if !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) +#define __SQLITESESSION_H_ 1 + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +extern "C" { +#endif + + +/* +** CAPI3REF: Session Object Handle +** +** An instance of this object is a [session] that can be used to +** record changes to a database. +*/ +typedef struct sqlite3_session sqlite3_session; + +/* +** CAPI3REF: Changeset Iterator Handle +** +** An instance of this object acts as a cursor for iterating +** over the elements of a [changeset] or [patchset]. +*/ +typedef struct sqlite3_changeset_iter sqlite3_changeset_iter; + +/* +** CAPI3REF: Create A New Session Object +** CONSTRUCTOR: sqlite3_session +** +** Create a new session object attached to database handle db. If successful, +** a pointer to the new object is written to *ppSession and SQLITE_OK is +** returned. If an error occurs, *ppSession is set to NULL and an SQLite +** error code (e.g. SQLITE_NOMEM) is returned. +** +** It is possible to create multiple session objects attached to a single +** database handle. +** +** Session objects created using this function should be deleted using the +** [sqlite3session_delete()] function before the database handle that they +** are attached to is itself closed. If the database handle is closed before +** the session object is deleted, then the results of calling any session +** module function, including [sqlite3session_delete()] on the session object +** are undefined. +** +** Because the session module uses the [sqlite3_preupdate_hook()] API, it +** is not possible for an application to register a pre-update hook on a +** database handle that has one or more session objects attached. Nor is +** it possible to create a session object attached to a database handle for +** which a pre-update hook is already defined. The results of attempting +** either of these things are undefined. +** +** The session object will be used to create changesets for tables in +** database zDb, where zDb is either "main", or "temp", or the name of an +** attached database. It is not an error if database zDb is not attached +** to the database when the session object is created. +*/ +SQLITE_API int sqlite3session_create( + sqlite3 *db, /* Database handle */ + const char *zDb, /* Name of db (e.g. "main") */ + sqlite3_session **ppSession /* OUT: New session object */ +); + +/* +** CAPI3REF: Delete A Session Object +** DESTRUCTOR: sqlite3_session +** +** Delete a session object previously allocated using +** [sqlite3session_create()]. Once a session object has been deleted, the +** results of attempting to use pSession with any other session module +** function are undefined. +** +** Session objects must be deleted before the database handle to which they +** are attached is closed. Refer to the documentation for +** [sqlite3session_create()] for details. +*/ +SQLITE_API void sqlite3session_delete(sqlite3_session *pSession); + + +/* +** CAPI3REF: Enable Or Disable A Session Object +** METHOD: sqlite3_session +** +** Enable or disable the recording of changes by a session object. When +** enabled, a session object records changes made to the database. When +** disabled - it does not. A newly created session object is enabled. +** Refer to the documentation for [sqlite3session_changeset()] for further +** details regarding how enabling and disabling a session object affects +** the eventual changesets. +** +** Passing zero to this function disables the session. Passing a value +** greater than zero enables it. Passing a value less than zero is a +** no-op, and may be used to query the current state of the session. +** +** The return value indicates the final state of the session object: 0 if +** the session is disabled, or 1 if it is enabled. +*/ +SQLITE_API int sqlite3session_enable(sqlite3_session *pSession, int bEnable); + +/* +** CAPI3REF: Set Or Clear the Indirect Change Flag +** METHOD: sqlite3_session +** +** Each change recorded by a session object is marked as either direct or +** indirect. A change is marked as indirect if either: +** +** <ul> +** <li> The session object "indirect" flag is set when the change is +** made, or +** <li> The change is made by an SQL trigger or foreign key action +** instead of directly as a result of a users SQL statement. +** </ul> +** +** If a single row is affected by more than one operation within a session, +** then the change is considered indirect if all operations meet the criteria +** for an indirect change above, or direct otherwise. +** +** This function is used to set, clear or query the session object indirect +** flag. If the second argument passed to this function is zero, then the +** indirect flag is cleared. If it is greater than zero, the indirect flag +** is set. Passing a value less than zero does not modify the current value +** of the indirect flag, and may be used to query the current state of the +** indirect flag for the specified session object. +** +** The return value indicates the final state of the indirect flag: 0 if +** it is clear, or 1 if it is set. +*/ +SQLITE_API int sqlite3session_indirect(sqlite3_session *pSession, int bIndirect); + +/* +** CAPI3REF: Attach A Table To A Session Object +** METHOD: sqlite3_session +** +** If argument zTab is not NULL, then it is the name of a table to attach +** to the session object passed as the first argument. All subsequent changes +** made to the table while the session object is enabled will be recorded. See +** documentation for [sqlite3session_changeset()] for further details. +** +** Or, if argument zTab is NULL, then changes are recorded for all tables +** in the database. If additional tables are added to the database (by +** executing "CREATE TABLE" statements) after this call is made, changes for +** the new tables are also recorded. +** +** Changes can only be recorded for tables that have a PRIMARY KEY explicitly +** defined as part of their CREATE TABLE statement. It does not matter if the +** PRIMARY KEY is an "INTEGER PRIMARY KEY" (rowid alias) or not. The PRIMARY +** KEY may consist of a single column, or may be a composite key. +** +** It is not an error if the named table does not exist in the database. Nor +** is it an error if the named table does not have a PRIMARY KEY. However, +** no changes will be recorded in either of these scenarios. +** +** Changes are not recorded for individual rows that have NULL values stored +** in one or more of their PRIMARY KEY columns. +** +** SQLITE_OK is returned if the call completes without error. Or, if an error +** occurs, an SQLite error code (e.g. SQLITE_NOMEM) is returned. +** +** <h3>Special sqlite_stat1 Handling</h3> +** +** As of SQLite version 3.22.0, the "sqlite_stat1" table is an exception to +** some of the rules above. In SQLite, the schema of sqlite_stat1 is: +** <pre> +**   CREATE TABLE sqlite_stat1(tbl,idx,stat) +** </pre> +** +** Even though sqlite_stat1 does not have a PRIMARY KEY, changes are +** recorded for it as if the PRIMARY KEY is (tbl,idx). Additionally, changes +** are recorded for rows for which (idx IS NULL) is true. However, for such +** rows a zero-length blob (SQL value X'') is stored in the changeset or +** patchset instead of a NULL value. This allows such changesets to be +** manipulated by legacy implementations of sqlite3changeset_invert(), +** concat() and similar. +** +** The sqlite3changeset_apply() function automatically converts the +** zero-length blob back to a NULL value when updating the sqlite_stat1 +** table. However, if the application calls sqlite3changeset_new(), +** sqlite3changeset_old() or sqlite3changeset_conflict on a changeset +** iterator directly (including on a changeset iterator passed to a +** conflict-handler callback) then the X'' value is returned. The application +** must translate X'' to NULL itself if required. +** +** Legacy (older than 3.22.0) versions of the sessions module cannot capture +** changes made to the sqlite_stat1 table. Legacy versions of the +** sqlite3changeset_apply() function silently ignore any modifications to the +** sqlite_stat1 table that are part of a changeset or patchset. +*/ +SQLITE_API int sqlite3session_attach( + sqlite3_session *pSession, /* Session object */ + const char *zTab /* Table name */ +); + +/* +** CAPI3REF: Set a table filter on a Session Object. +** METHOD: sqlite3_session +** +** The second argument (xFilter) is the "filter callback". For changes to rows +** in tables that are not attached to the Session object, the filter is called +** to determine whether changes to the table's rows should be tracked or not. +** If xFilter returns 0, changes is not tracked. Note that once a table is +** attached, xFilter will not be called again. +*/ +SQLITE_API void sqlite3session_table_filter( + sqlite3_session *pSession, /* Session object */ + int(*xFilter)( + void *pCtx, /* Copy of third arg to _filter_table() */ + const char *zTab /* Table name */ + ), + void *pCtx /* First argument passed to xFilter */ +); + +/* +** CAPI3REF: Generate A Changeset From A Session Object +** METHOD: sqlite3_session +** +** Obtain a changeset containing changes to the tables attached to the +** session object passed as the first argument. If successful, +** set *ppChangeset to point to a buffer containing the changeset +** and *pnChangeset to the size of the changeset in bytes before returning +** SQLITE_OK. If an error occurs, set both *ppChangeset and *pnChangeset to +** zero and return an SQLite error code. +** +** A changeset consists of zero or more INSERT, UPDATE and/or DELETE changes, +** each representing a change to a single row of an attached table. An INSERT +** change contains the values of each field of a new database row. A DELETE +** contains the original values of each field of a deleted database row. An +** UPDATE change contains the original values of each field of an updated +** database row along with the updated values for each updated non-primary-key +** column. It is not possible for an UPDATE change to represent a change that +** modifies the values of primary key columns. If such a change is made, it +** is represented in a changeset as a DELETE followed by an INSERT. +** +** Changes are not recorded for rows that have NULL values stored in one or +** more of their PRIMARY KEY columns. If such a row is inserted or deleted, +** no corresponding change is present in the changesets returned by this +** function. If an existing row with one or more NULL values stored in +** PRIMARY KEY columns is updated so that all PRIMARY KEY columns are non-NULL, +** only an INSERT is appears in the changeset. Similarly, if an existing row +** with non-NULL PRIMARY KEY values is updated so that one or more of its +** PRIMARY KEY columns are set to NULL, the resulting changeset contains a +** DELETE change only. +** +** The contents of a changeset may be traversed using an iterator created +** using the [sqlite3changeset_start()] API. A changeset may be applied to +** a database with a compatible schema using the [sqlite3changeset_apply()] +** API. +** +** Within a changeset generated by this function, all changes related to a +** single table are grouped together. In other words, when iterating through +** a changeset or when applying a changeset to a database, all changes related +** to a single table are processed before moving on to the next table. Tables +** are sorted in the same order in which they were attached (or auto-attached) +** to the sqlite3_session object. The order in which the changes related to +** a single table are stored is undefined. +** +** Following a successful call to this function, it is the responsibility of +** the caller to eventually free the buffer that *ppChangeset points to using +** [sqlite3_free()]. +** +** <h3>Changeset Generation</h3> +** +** Once a table has been attached to a session object, the session object +** records the primary key values of all new rows inserted into the table. +** It also records the original primary key and other column values of any +** deleted or updated rows. For each unique primary key value, data is only +** recorded once - the first time a row with said primary key is inserted, +** updated or deleted in the lifetime of the session. +** +** There is one exception to the previous paragraph: when a row is inserted, +** updated or deleted, if one or more of its primary key columns contain a +** NULL value, no record of the change is made. +** +** The session object therefore accumulates two types of records - those +** that consist of primary key values only (created when the user inserts +** a new record) and those that consist of the primary key values and the +** original values of other table columns (created when the users deletes +** or updates a record). +** +** When this function is called, the requested changeset is created using +** both the accumulated records and the current contents of the database +** file. Specifically: +** +** <ul> +** <li> For each record generated by an insert, the database is queried +** for a row with a matching primary key. If one is found, an INSERT +** change is added to the changeset. If no such row is found, no change +** is added to the changeset. +** +** <li> For each record generated by an update or delete, the database is +** queried for a row with a matching primary key. If such a row is +** found and one or more of the non-primary key fields have been +** modified from their original values, an UPDATE change is added to +** the changeset. Or, if no such row is found in the table, a DELETE +** change is added to the changeset. If there is a row with a matching +** primary key in the database, but all fields contain their original +** values, no change is added to the changeset. +** </ul> +** +** This means, amongst other things, that if a row is inserted and then later +** deleted while a session object is active, neither the insert nor the delete +** will be present in the changeset. Or if a row is deleted and then later a +** row with the same primary key values inserted while a session object is +** active, the resulting changeset will contain an UPDATE change instead of +** a DELETE and an INSERT. +** +** When a session object is disabled (see the [sqlite3session_enable()] API), +** it does not accumulate records when rows are inserted, updated or deleted. +** This may appear to have some counter-intuitive effects if a single row +** is written to more than once during a session. For example, if a row +** is inserted while a session object is enabled, then later deleted while +** the same session object is disabled, no INSERT record will appear in the +** changeset, even though the delete took place while the session was disabled. +** Or, if one field of a row is updated while a session is disabled, and +** another field of the same row is updated while the session is enabled, the +** resulting changeset will contain an UPDATE change that updates both fields. +*/ +SQLITE_API int sqlite3session_changeset( + sqlite3_session *pSession, /* Session object */ + int *pnChangeset, /* OUT: Size of buffer at *ppChangeset */ + void **ppChangeset /* OUT: Buffer containing changeset */ +); + +/* +** CAPI3REF: Load The Difference Between Tables Into A Session +** METHOD: sqlite3_session +** +** If it is not already attached to the session object passed as the first +** argument, this function attaches table zTbl in the same manner as the +** [sqlite3session_attach()] function. If zTbl does not exist, or if it +** does not have a primary key, this function is a no-op (but does not return +** an error). +** +** Argument zFromDb must be the name of a database ("main", "temp" etc.) +** attached to the same database handle as the session object that contains +** a table compatible with the table attached to the session by this function. +** A table is considered compatible if it: +** +** <ul> +** <li> Has the same name, +** <li> Has the same set of columns declared in the same order, and +** <li> Has the same PRIMARY KEY definition. +** </ul> +** +** If the tables are not compatible, SQLITE_SCHEMA is returned. If the tables +** are compatible but do not have any PRIMARY KEY columns, it is not an error +** but no changes are added to the session object. As with other session +** APIs, tables without PRIMARY KEYs are simply ignored. +** +** This function adds a set of changes to the session object that could be +** used to update the table in database zFrom (call this the "from-table") +** so that its content is the same as the table attached to the session +** object (call this the "to-table"). Specifically: +** +** <ul> +** <li> For each row (primary key) that exists in the to-table but not in +** the from-table, an INSERT record is added to the session object. +** +** <li> For each row (primary key) that exists in the to-table but not in +** the from-table, a DELETE record is added to the session object. +** +** <li> For each row (primary key) that exists in both tables, but features +** different non-PK values in each, an UPDATE record is added to the +** session. +** </ul> +** +** To clarify, if this function is called and then a changeset constructed +** using [sqlite3session_changeset()], then after applying that changeset to +** database zFrom the contents of the two compatible tables would be +** identical. +** +** It an error if database zFrom does not exist or does not contain the +** required compatible table. +** +** If the operation successful, SQLITE_OK is returned. Otherwise, an SQLite +** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg +** may be set to point to a buffer containing an English language error +** message. It is the responsibility of the caller to free this buffer using +** sqlite3_free(). +*/ +SQLITE_API int sqlite3session_diff( + sqlite3_session *pSession, + const char *zFromDb, + const char *zTbl, + char **pzErrMsg +); + + +/* +** CAPI3REF: Generate A Patchset From A Session Object +** METHOD: sqlite3_session +** +** The differences between a patchset and a changeset are that: +** +** <ul> +** <li> DELETE records consist of the primary key fields only. The +** original values of other fields are omitted. +** <li> The original values of any modified fields are omitted from +** UPDATE records. +** </ul> +** +** A patchset blob may be used with up to date versions of all +** sqlite3changeset_xxx API functions except for sqlite3changeset_invert(), +** which returns SQLITE_CORRUPT if it is passed a patchset. Similarly, +** attempting to use a patchset blob with old versions of the +** sqlite3changeset_xxx APIs also provokes an SQLITE_CORRUPT error. +** +** Because the non-primary key "old.*" fields are omitted, no +** SQLITE_CHANGESET_DATA conflicts can be detected or reported if a patchset +** is passed to the sqlite3changeset_apply() API. Other conflict types work +** in the same way as for changesets. +** +** Changes within a patchset are ordered in the same way as for changesets +** generated by the sqlite3session_changeset() function (i.e. all changes for +** a single table are grouped together, tables appear in the order in which +** they were attached to the session object). +*/ +SQLITE_API int sqlite3session_patchset( + sqlite3_session *pSession, /* Session object */ + int *pnPatchset, /* OUT: Size of buffer at *ppPatchset */ + void **ppPatchset /* OUT: Buffer containing patchset */ +); + +/* +** CAPI3REF: Test if a changeset has recorded any changes. +** +** Return non-zero if no changes to attached tables have been recorded by +** the session object passed as the first argument. Otherwise, if one or +** more changes have been recorded, return zero. +** +** Even if this function returns zero, it is possible that calling +** [sqlite3session_changeset()] on the session handle may still return a +** changeset that contains no changes. This can happen when a row in +** an attached table is modified and then later on the original values +** are restored. However, if this function returns non-zero, then it is +** guaranteed that a call to sqlite3session_changeset() will return a +** changeset containing zero changes. +*/ +SQLITE_API int sqlite3session_isempty(sqlite3_session *pSession); + +/* +** CAPI3REF: Create An Iterator To Traverse A Changeset +** CONSTRUCTOR: sqlite3_changeset_iter +** +** Create an iterator used to iterate through the contents of a changeset. +** If successful, *pp is set to point to the iterator handle and SQLITE_OK +** is returned. Otherwise, if an error occurs, *pp is set to zero and an +** SQLite error code is returned. +** +** The following functions can be used to advance and query a changeset +** iterator created by this function: +** +** <ul> +** <li> [sqlite3changeset_next()] +** <li> [sqlite3changeset_op()] +** <li> [sqlite3changeset_new()] +** <li> [sqlite3changeset_old()] +** </ul> +** +** It is the responsibility of the caller to eventually destroy the iterator +** by passing it to [sqlite3changeset_finalize()]. The buffer containing the +** changeset (pChangeset) must remain valid until after the iterator is +** destroyed. +** +** Assuming the changeset blob was created by one of the +** [sqlite3session_changeset()], [sqlite3changeset_concat()] or +** [sqlite3changeset_invert()] functions, all changes within the changeset +** that apply to a single table are grouped together. This means that when +** an application iterates through a changeset using an iterator created by +** this function, all changes that relate to a single table are visited +** consecutively. There is no chance that the iterator will visit a change +** the applies to table X, then one for table Y, and then later on visit +** another change for table X. +*/ +SQLITE_API int sqlite3changeset_start( + sqlite3_changeset_iter **pp, /* OUT: New changeset iterator handle */ + int nChangeset, /* Size of changeset blob in bytes */ + void *pChangeset /* Pointer to blob containing changeset */ +); + + +/* +** CAPI3REF: Advance A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function may only be used with iterators created by function +** [sqlite3changeset_start()]. If it is called on an iterator passed to +** a conflict-handler callback by [sqlite3changeset_apply()], SQLITE_MISUSE +** is returned and the call has no effect. +** +** Immediately after an iterator is created by sqlite3changeset_start(), it +** does not point to any change in the changeset. Assuming the changeset +** is not empty, the first call to this function advances the iterator to +** point to the first change in the changeset. Each subsequent call advances +** the iterator to point to the next change in the changeset (if any). If +** no error occurs and the iterator points to a valid change after a call +** to sqlite3changeset_next() has advanced it, SQLITE_ROW is returned. +** Otherwise, if all changes in the changeset have already been visited, +** SQLITE_DONE is returned. +** +** If an error occurs, an SQLite error code is returned. Possible error +** codes include SQLITE_CORRUPT (if the changeset buffer is corrupt) or +** SQLITE_NOMEM. +*/ +SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Obtain The Current Operation From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this +** is not the case, this function returns [SQLITE_MISUSE]. +** +** If argument pzTab is not NULL, then *pzTab is set to point to a +** nul-terminated utf-8 encoded string containing the name of the table +** affected by the current change. The buffer remains valid until either +** sqlite3changeset_next() is called on the iterator or until the +** conflict-handler function returns. If pnCol is not NULL, then *pnCol is +** set to the number of columns in the table affected by the change. If +** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** is an indirect change, or false (0) otherwise. See the documentation for +** [sqlite3session_indirect()] for a description of direct and indirect +** changes. Finally, if pOp is not NULL, then *pOp is set to one of +** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the +** type of change that the iterator currently points to. +** +** If no error occurs, SQLITE_OK is returned. If an error does occur, an +** SQLite error code is returned. The values of the output variables may not +** be trusted in this case. +*/ +SQLITE_API int sqlite3changeset_op( + sqlite3_changeset_iter *pIter, /* Iterator object */ + const char **pzTab, /* OUT: Pointer to table name */ + int *pnCol, /* OUT: Number of columns in table */ + int *pOp, /* OUT: SQLITE_INSERT, DELETE or UPDATE */ + int *pbIndirect /* OUT: True for an 'indirect' change */ +); + +/* +** CAPI3REF: Obtain The Primary Key Definition Of A Table +** METHOD: sqlite3_changeset_iter +** +** For each modified table, a changeset includes the following: +** +** <ul> +** <li> The number of columns in the table, and +** <li> Which of those columns make up the tables PRIMARY KEY. +** </ul> +** +** This function is used to find which columns comprise the PRIMARY KEY of +** the table modified by the change that iterator pIter currently points to. +** If successful, *pabPK is set to point to an array of nCol entries, where +** nCol is the number of columns in the table. Elements of *pabPK are set to +** 0x01 if the corresponding column is part of the tables primary key, or +** 0x00 if it is not. +** +** If argument pnCol is not NULL, then *pnCol is set to the number of columns +** in the table. +** +** If this function is called when the iterator does not point to a valid +** entry, SQLITE_MISUSE is returned and the output variables zeroed. Otherwise, +** SQLITE_OK is returned and the output variables populated as described +** above. +*/ +SQLITE_API int sqlite3changeset_pk( + sqlite3_changeset_iter *pIter, /* Iterator object */ + unsigned char **pabPK, /* OUT: Array of boolean - true for PK cols */ + int *pnCol /* OUT: Number of entries in output array */ +); + +/* +** CAPI3REF: Obtain old.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_DELETE] or [SQLITE_UPDATE]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** original row values stored as part of the UPDATE or DELETE change and +** returns SQLITE_OK. The name of the function comes from the fact that this +** is similar to the "old.*" columns available to update or delete triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_old( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Old value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain new.* Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** The pIter argument passed to this function may either be an iterator +** passed to a conflict-handler by [sqlite3changeset_apply()], or an iterator +** created by [sqlite3changeset_start()]. In the latter case, the most recent +** call to [sqlite3changeset_next()] must have returned SQLITE_ROW. +** Furthermore, it may only be called if the type of change that the iterator +** currently points to is either [SQLITE_UPDATE] or [SQLITE_INSERT]. Otherwise, +** this function returns [SQLITE_MISUSE] and sets *ppValue to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the vector of +** new row values stored as part of the UPDATE or INSERT change and +** returns SQLITE_OK. If the change is an UPDATE and does not include +** a new value for the requested column, *ppValue is set to NULL and +** SQLITE_OK returned. The name of the function comes from the fact that +** this is similar to the "new.*" columns available to update or delete +** triggers. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_new( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: New value (or NULL pointer) */ +); + +/* +** CAPI3REF: Obtain Conflicting Row Values From A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function should only be used with iterator objects passed to a +** conflict-handler callback by [sqlite3changeset_apply()] with either +** [SQLITE_CHANGESET_DATA] or [SQLITE_CHANGESET_CONFLICT]. If this function +** is called on any other iterator, [SQLITE_MISUSE] is returned and *ppValue +** is set to NULL. +** +** Argument iVal must be greater than or equal to 0, and less than the number +** of columns in the table affected by the current change. Otherwise, +** [SQLITE_RANGE] is returned and *ppValue is set to NULL. +** +** If successful, this function sets *ppValue to point to a protected +** sqlite3_value object containing the iVal'th value from the +** "conflicting row" associated with the current conflict-handler callback +** and returns SQLITE_OK. +** +** If some other error occurs (e.g. an OOM condition), an SQLite error code +** is returned and *ppValue is set to NULL. +*/ +SQLITE_API int sqlite3changeset_conflict( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int iVal, /* Column number */ + sqlite3_value **ppValue /* OUT: Value from conflicting row */ +); + +/* +** CAPI3REF: Determine The Number Of Foreign Key Constraint Violations +** METHOD: sqlite3_changeset_iter +** +** This function may only be called with an iterator passed to an +** SQLITE_CHANGESET_FOREIGN_KEY conflict handler callback. In this case +** it sets the output variable to the total number of known foreign key +** violations in the destination database and returns SQLITE_OK. +** +** In all other cases this function returns SQLITE_MISUSE. +*/ +SQLITE_API int sqlite3changeset_fk_conflicts( + sqlite3_changeset_iter *pIter, /* Changeset iterator */ + int *pnOut /* OUT: Number of FK violations */ +); + + +/* +** CAPI3REF: Finalize A Changeset Iterator +** METHOD: sqlite3_changeset_iter +** +** This function is used to finalize an iterator allocated with +** [sqlite3changeset_start()]. +** +** This function should only be called on iterators created using the +** [sqlite3changeset_start()] function. If an application calls this +** function with an iterator passed to a conflict-handler by +** [sqlite3changeset_apply()], [SQLITE_MISUSE] is immediately returned and the +** call has no effect. +** +** If an error was encountered within a call to an sqlite3changeset_xxx() +** function (for example an [SQLITE_CORRUPT] in [sqlite3changeset_next()] or an +** [SQLITE_NOMEM] in [sqlite3changeset_new()]) then an error code corresponding +** to that error is returned by this function. Otherwise, SQLITE_OK is +** returned. This is to allow the following pattern (pseudo-code): +** +** <pre> +** sqlite3changeset_start(); +** while( SQLITE_ROW==sqlite3changeset_next() ){ +** // Do something with change. +** } +** rc = sqlite3changeset_finalize(); +** if( rc!=SQLITE_OK ){ +** // An error has occurred +** } +** </pre> +*/ +SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter); + +/* +** CAPI3REF: Invert A Changeset +** +** This function is used to "invert" a changeset object. Applying an inverted +** changeset to a database reverses the effects of applying the uninverted +** changeset. Specifically: +** +** <ul> +** <li> Each DELETE change is changed to an INSERT, and +** <li> Each INSERT change is changed to a DELETE, and +** <li> For each UPDATE change, the old.* and new.* values are exchanged. +** </ul> +** +** This function does not change the order in which changes appear within +** the changeset. It merely reverses the sense of each individual change. +** +** If successful, a pointer to a buffer containing the inverted changeset +** is stored in *ppOut, the size of the same buffer is stored in *pnOut, and +** SQLITE_OK is returned. If an error occurs, both *pnOut and *ppOut are +** zeroed and an SQLite error code returned. +** +** It is the responsibility of the caller to eventually call sqlite3_free() +** on the *ppOut pointer to free the buffer allocation following a successful +** call to this function. +** +** WARNING/TODO: This function currently assumes that the input is a valid +** changeset. If it is not, the results are undefined. +*/ +SQLITE_API int sqlite3changeset_invert( + int nIn, const void *pIn, /* Input changeset */ + int *pnOut, void **ppOut /* OUT: Inverse of input */ +); + +/* +** CAPI3REF: Concatenate Two Changeset Objects +** +** This function is used to concatenate two changesets, A and B, into a +** single changeset. The result is a changeset equivalent to applying +** changeset A followed by changeset B. +** +** This function combines the two input changesets using an +** sqlite3_changegroup object. Calling it produces similar results as the +** following code fragment: +** +** <pre> +** sqlite3_changegroup *pGrp; +** rc = sqlite3_changegroup_new(&pGrp); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nA, pA); +** if( rc==SQLITE_OK ) rc = sqlite3changegroup_add(pGrp, nB, pB); +** if( rc==SQLITE_OK ){ +** rc = sqlite3changegroup_output(pGrp, pnOut, ppOut); +** }else{ +** *ppOut = 0; +** *pnOut = 0; +** } +** </pre> +** +** Refer to the sqlite3_changegroup documentation below for details. +*/ +SQLITE_API int sqlite3changeset_concat( + int nA, /* Number of bytes in buffer pA */ + void *pA, /* Pointer to buffer containing changeset A */ + int nB, /* Number of bytes in buffer pB */ + void *pB, /* Pointer to buffer containing changeset B */ + int *pnOut, /* OUT: Number of bytes in output changeset */ + void **ppOut /* OUT: Buffer containing output changeset */ +); + + +/* +** CAPI3REF: Changegroup Handle +** +** A changegroup is an object used to combine two or more +** [changesets] or [patchsets] +*/ +typedef struct sqlite3_changegroup sqlite3_changegroup; + +/* +** CAPI3REF: Create A New Changegroup Object +** CONSTRUCTOR: sqlite3_changegroup +** +** An sqlite3_changegroup object is used to combine two or more changesets +** (or patchsets) into a single changeset (or patchset). A single changegroup +** object may combine changesets or patchsets, but not both. The output is +** always in the same format as the input. +** +** If successful, this function returns SQLITE_OK and populates (*pp) with +** a pointer to a new sqlite3_changegroup object before returning. The caller +** should eventually free the returned object using a call to +** sqlite3changegroup_delete(). If an error occurs, an SQLite error code +** (i.e. SQLITE_NOMEM) is returned and *pp is set to NULL. +** +** The usual usage pattern for an sqlite3_changegroup object is as follows: +** +** <ul> +** <li> It is created using a call to sqlite3changegroup_new(). +** +** <li> Zero or more changesets (or patchsets) are added to the object +** by calling sqlite3changegroup_add(). +** +** <li> The result of combining all input changesets together is obtained +** by the application via a call to sqlite3changegroup_output(). +** +** <li> The object is deleted using a call to sqlite3changegroup_delete(). +** </ul> +** +** Any number of calls to add() and output() may be made between the calls to +** new() and delete(), and in any order. +** +** As well as the regular sqlite3changegroup_add() and +** sqlite3changegroup_output() functions, also available are the streaming +** versions sqlite3changegroup_add_strm() and sqlite3changegroup_output_strm(). +*/ +SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); + +/* +** CAPI3REF: Add A Changeset To A Changegroup +** METHOD: sqlite3_changegroup +** +** Add all changes within the changeset (or patchset) in buffer pData (size +** nData bytes) to the changegroup. +** +** If the buffer contains a patchset, then all prior calls to this function +** on the same changegroup object must also have specified patchsets. Or, if +** the buffer contains a changeset, so must have the earlier calls to this +** function. Otherwise, SQLITE_ERROR is returned and no changes are added +** to the changegroup. +** +** Rows within the changeset and changegroup are identified by the values in +** their PRIMARY KEY columns. A change in the changeset is considered to +** apply to the same row as a change already present in the changegroup if +** the two rows have the same primary key. +** +** Changes to rows that do not already appear in the changegroup are +** simply copied into it. Or, if both the new changeset and the changegroup +** contain changes that apply to a single row, the final contents of the +** changegroup depends on the type of each change, as follows: +** +** <table border=1 style="margin-left:8ex;margin-right:8ex"> +** <tr><th style="white-space:pre">Existing Change </th> +** <th style="white-space:pre">New Change </th> +** <th>Output Change +** <tr><td>INSERT <td>INSERT <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** <tr><td>INSERT <td>UPDATE <td> +** The INSERT change remains in the changegroup. The values in the +** INSERT change are modified as if the row was inserted by the +** existing change and then updated according to the new change. +** <tr><td>INSERT <td>DELETE <td> +** The existing INSERT is removed from the changegroup. The DELETE is +** not added. +** <tr><td>UPDATE <td>INSERT <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** <tr><td>UPDATE <td>UPDATE <td> +** The existing UPDATE remains within the changegroup. It is amended +** so that the accompanying values are as if the row was updated once +** by the existing change and then again by the new change. +** <tr><td>UPDATE <td>DELETE <td> +** The existing UPDATE is replaced by the new DELETE within the +** changegroup. +** <tr><td>DELETE <td>INSERT <td> +** If one or more of the column values in the row inserted by the +** new change differ from those in the row deleted by the existing +** change, the existing DELETE is replaced by an UPDATE within the +** changegroup. Otherwise, if the inserted row is exactly the same +** as the deleted row, the existing DELETE is simply discarded. +** <tr><td>DELETE <td>UPDATE <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** <tr><td>DELETE <td>DELETE <td> +** The new change is ignored. This case does not occur if the new +** changeset was recorded immediately after the changesets already +** added to the changegroup. +** </table> +** +** If the new changeset contains changes to a table that is already present +** in the changegroup, then the number of columns and the position of the +** primary key columns for the table must be consistent. If this is not the +** case, this function fails with SQLITE_SCHEMA. If the input changeset +** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is +** returned. Or, if an out-of-memory condition occurs during processing, this +** function returns SQLITE_NOMEM. In all cases, if an error occurs the +** final contents of the changegroup is undefined. +** +** If no error occurs, SQLITE_OK is returned. +*/ +SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); + +/* +** CAPI3REF: Obtain A Composite Changeset From A Changegroup +** METHOD: sqlite3_changegroup +** +** Obtain a buffer containing a changeset (or patchset) representing the +** current contents of the changegroup. If the inputs to the changegroup +** were themselves changesets, the output is a changeset. Or, if the +** inputs were patchsets, the output is also a patchset. +** +** As with the output of the sqlite3session_changeset() and +** sqlite3session_patchset() functions, all changes related to a single +** table are grouped together in the output of this function. Tables appear +** in the same order as for the very first changeset added to the changegroup. +** If the second or subsequent changesets added to the changegroup contain +** changes for tables that do not appear in the first changeset, they are +** appended onto the end of the output changeset, again in the order in +** which they are first encountered. +** +** If an error occurs, an SQLite error code is returned and the output +** variables (*pnData) and (*ppData) are set to 0. Otherwise, SQLITE_OK +** is returned and the output variables are set to the size of and a +** pointer to the output buffer, respectively. In this case it is the +** responsibility of the caller to eventually free the buffer using a +** call to sqlite3_free(). +*/ +SQLITE_API int sqlite3changegroup_output( + sqlite3_changegroup*, + int *pnData, /* OUT: Size of output buffer in bytes */ + void **ppData /* OUT: Pointer to output buffer */ +); + +/* +** CAPI3REF: Delete A Changegroup Object +** DESTRUCTOR: sqlite3_changegroup +*/ +SQLITE_API void sqlite3changegroup_delete(sqlite3_changegroup*); + +/* +** CAPI3REF: Apply A Changeset To A Database +** +** Apply a changeset or patchset to a database. These functions attempt to +** update the "main" database attached to handle db with the changes found in +** the changeset passed via the second and third arguments. +** +** The fourth argument (xFilter) passed to these functions is the "filter +** callback". If it is not NULL, then for each table affected by at least one +** change in the changeset, the filter callback is invoked with +** the table name as the second argument, and a copy of the context pointer +** passed as the sixth argument as the first. If the "filter callback" +** returns zero, then no attempt is made to apply any changes to the table. +** Otherwise, if the return value is non-zero or the xFilter argument to +** is NULL, all changes related to the table are attempted. +** +** For each table that is not excluded by the filter callback, this function +** tests that the target database contains a compatible table. A table is +** considered compatible if all of the following are true: +** +** <ul> +** <li> The table has the same name as the name recorded in the +** changeset, and +** <li> The table has at least as many columns as recorded in the +** changeset, and +** <li> The table has primary key columns in the same position as +** recorded in the changeset. +** </ul> +** +** If there is no compatible table, it is not an error, but none of the +** changes associated with the table are applied. A warning message is issued +** via the sqlite3_log() mechanism with the error code SQLITE_SCHEMA. At most +** one such warning is issued for each table in the changeset. +** +** For each change for which there is a compatible table, an attempt is made +** to modify the table contents according to the UPDATE, INSERT or DELETE +** change. If a change cannot be applied cleanly, the conflict handler +** function passed as the fifth argument to sqlite3changeset_apply() may be +** invoked. A description of exactly when the conflict handler is invoked for +** each type of change is below. +** +** Unlike the xFilter argument, xConflict may not be passed NULL. The results +** of passing anything other than a valid function pointer as the xConflict +** argument are undefined. +** +** Each time the conflict handler function is invoked, it must return one +** of [SQLITE_CHANGESET_OMIT], [SQLITE_CHANGESET_ABORT] or +** [SQLITE_CHANGESET_REPLACE]. SQLITE_CHANGESET_REPLACE may only be returned +** if the second argument passed to the conflict handler is either +** SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If the conflict-handler +** returns an illegal value, any changes already made are rolled back and +** the call to sqlite3changeset_apply() returns SQLITE_MISUSE. Different +** actions are taken by sqlite3changeset_apply() depending on the value +** returned by each invocation of the conflict-handler function. Refer to +** the documentation for the three +** [SQLITE_CHANGESET_OMIT|available return values] for details. +** +** <dl> +** <dt>DELETE Changes<dd> +** For each DELETE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all non-primary key columns also match the values stored in +** the changeset the row is deleted from the target database. +** +** If a row with matching primary key values is found, but one or more of +** the non-primary key fields contains a value different from the original +** row value stored in the changeset, the conflict-handler function is +** invoked with [SQLITE_CHANGESET_DATA] as the second argument. If the +** database table has more columns than are recorded in the changeset, +** only the values of those non-primary key fields are compared against +** the current database contents - any trailing database table columns +** are ignored. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the DELETE operation is attempted, but SQLite returns SQLITE_CONSTRAINT +** (which can only happen if a foreign key constraint is violated), the +** conflict-handler function is invoked with [SQLITE_CHANGESET_CONSTRAINT] +** passed as the second argument. This includes the case where the DELETE +** operation is attempted because an earlier call to the conflict handler +** function returned [SQLITE_CHANGESET_REPLACE]. +** +** <dt>INSERT Changes<dd> +** For each INSERT change, an attempt is made to insert the new row into +** the database. If the changeset row contains fewer fields than the +** database table, the trailing fields are populated with their default +** values. +** +** If the attempt to insert the row fails because the database already +** contains a row with the same primary key values, the conflict handler +** function is invoked with the second argument set to +** [SQLITE_CHANGESET_CONFLICT]. +** +** If the attempt to insert the row fails because of some other constraint +** violation (e.g. NOT NULL or UNIQUE), the conflict handler function is +** invoked with the second argument set to [SQLITE_CHANGESET_CONSTRAINT]. +** This includes the case where the INSERT operation is re-attempted because +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** +** <dt>UPDATE Changes<dd> +** For each UPDATE change, the function checks if the target database +** contains a row with the same primary key value (or values) as the +** original row values stored in the changeset. If it does, and the values +** stored in all modified non-primary key columns also match the values +** stored in the changeset the row is updated within the target database. +** +** If a row with matching primary key values is found, but one or more of +** the modified non-primary key fields contains a value different from an +** original row value stored in the changeset, the conflict-handler function +** is invoked with [SQLITE_CHANGESET_DATA] as the second argument. Since +** UPDATE changes only contain values for non-primary key fields that are +** to be modified, only those fields need to match the original values to +** avoid the SQLITE_CHANGESET_DATA conflict-handler callback. +** +** If no row with matching primary key values is found in the database, +** the conflict-handler function is invoked with [SQLITE_CHANGESET_NOTFOUND] +** passed as the second argument. +** +** If the UPDATE operation is attempted, but SQLite returns +** SQLITE_CONSTRAINT, the conflict-handler function is invoked with +** [SQLITE_CHANGESET_CONSTRAINT] passed as the second argument. +** This includes the case where the UPDATE operation is attempted after +** an earlier call to the conflict handler function returned +** [SQLITE_CHANGESET_REPLACE]. +** </dl> +** +** It is safe to execute SQL statements, including those that write to the +** table that the callback related to, from within the xConflict callback. +** This can be used to further customize the applications conflict +** resolution strategy. +** +** All changes made by these functions are enclosed in a savepoint transaction. +** If any other error (aside from a constraint failure when attempting to +** write to the target database) occurs, then the savepoint transaction is +** rolled back, restoring the target database to its original state, and an +** SQLite error code returned. +** +** If the output parameters (ppRebase) and (pnRebase) are non-NULL and +** the input is a changeset (not a patchset), then sqlite3changeset_apply_v2() +** may set (*ppRebase) to point to a "rebase" that may be used with the +** sqlite3_rebaser APIs buffer before returning. In this case (*pnRebase) +** is set to the size of the buffer in bytes. It is the responsibility of the +** caller to eventually free any such buffer using sqlite3_free(). The buffer +** is only allocated and populated if one or more conflicts were encountered +** while applying the patchset. See comments surrounding the sqlite3_rebaser +** APIs for further details. +** +** The behavior of sqlite3changeset_apply_v2() and its streaming equivalent +** may be modified by passing a combination of +** [SQLITE_CHANGESETAPPLY_NOSAVEPOINT | supported flags] as the 9th parameter. +** +** Note that the sqlite3changeset_apply_v2() API is still <b>experimental</b> +** and therefore subject to change. +*/ +SQLITE_API int sqlite3changeset_apply( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int nChangeset, /* Size of changeset in bytes */ + void *pChangeset, /* Changeset blob */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, /* OUT: Rebase data */ + int flags /* Combination of SESSION_APPLY_* flags */ +); + +/* +** CAPI3REF: Flags for sqlite3changeset_apply_v2 +** +** The following flags may passed via the 9th parameter to +** [sqlite3changeset_apply_v2] and [sqlite3changeset_apply_v2_strm]: +** +** <dl> +** <dt>SQLITE_CHANGESETAPPLY_NOSAVEPOINT <dd> +** Usually, the sessions module encloses all operations performed by +** a single call to apply_v2() or apply_v2_strm() in a [SAVEPOINT]. The +** SAVEPOINT is committed if the changeset or patchset is successfully +** applied, or rolled back if an error occurs. Specifying this flag +** causes the sessions module to omit this savepoint. In this case, if the +** caller has an open transaction or savepoint when apply_v2() is called, +** it may revert the partially applied changeset by rolling it back. +*/ +#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001 + +/* +** CAPI3REF: Constants Passed To The Conflict Handler +** +** Values that may be passed as the second argument to a conflict-handler. +** +** <dl> +** <dt>SQLITE_CHANGESET_DATA<dd> +** The conflict handler is invoked with CHANGESET_DATA as the second argument +** when processing a DELETE or UPDATE change if a row with the required +** PRIMARY KEY fields is present in the database, but one or more other +** (non primary-key) fields modified by the update do not contain the +** expected "before" values. +** +** The conflicting row, in this case, is the database row with the matching +** primary key. +** +** <dt>SQLITE_CHANGESET_NOTFOUND<dd> +** The conflict handler is invoked with CHANGESET_NOTFOUND as the second +** argument when processing a DELETE or UPDATE change if a row with the +** required PRIMARY KEY fields is not present in the database. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +** <dt>SQLITE_CHANGESET_CONFLICT<dd> +** CHANGESET_CONFLICT is passed as the second argument to the conflict +** handler while processing an INSERT change if the operation would result +** in duplicate primary key values. +** +** The conflicting row in this case is the database row with the matching +** primary key. +** +** <dt>SQLITE_CHANGESET_FOREIGN_KEY<dd> +** If foreign key handling is enabled, and applying a changeset leaves the +** database in a state containing foreign key violations, the conflict +** handler is invoked with CHANGESET_FOREIGN_KEY as the second argument +** exactly once before the changeset is committed. If the conflict handler +** returns CHANGESET_OMIT, the changes, including those that caused the +** foreign key constraint violation, are committed. Or, if it returns +** CHANGESET_ABORT, the changeset is rolled back. +** +** No current or conflicting row information is provided. The only function +** it is possible to call on the supplied sqlite3_changeset_iter handle +** is sqlite3changeset_fk_conflicts(). +** +** <dt>SQLITE_CHANGESET_CONSTRAINT<dd> +** If any other constraint violation occurs while applying a change (i.e. +** a UNIQUE, CHECK or NOT NULL constraint), the conflict handler is +** invoked with CHANGESET_CONSTRAINT as the second argument. +** +** There is no conflicting row in this case. The results of invoking the +** sqlite3changeset_conflict() API are undefined. +** +** </dl> +*/ +#define SQLITE_CHANGESET_DATA 1 +#define SQLITE_CHANGESET_NOTFOUND 2 +#define SQLITE_CHANGESET_CONFLICT 3 +#define SQLITE_CHANGESET_CONSTRAINT 4 +#define SQLITE_CHANGESET_FOREIGN_KEY 5 + +/* +** CAPI3REF: Constants Returned By The Conflict Handler +** +** A conflict handler callback must return one of the following three values. +** +** <dl> +** <dt>SQLITE_CHANGESET_OMIT<dd> +** If a conflict handler returns this value no special action is taken. The +** change that caused the conflict is not applied. The session module +** continues to the next change in the changeset. +** +** <dt>SQLITE_CHANGESET_REPLACE<dd> +** This value may only be returned if the second argument to the conflict +** handler was SQLITE_CHANGESET_DATA or SQLITE_CHANGESET_CONFLICT. If this +** is not the case, any changes applied so far are rolled back and the +** call to sqlite3changeset_apply() returns SQLITE_MISUSE. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_DATA conflict +** handler, then the conflicting row is either updated or deleted, depending +** on the type of change. +** +** If CHANGESET_REPLACE is returned by an SQLITE_CHANGESET_CONFLICT conflict +** handler, then the conflicting row is removed from the database and a +** second attempt to apply the change is made. If this second attempt fails, +** the original row is restored to the database before continuing. +** +** <dt>SQLITE_CHANGESET_ABORT<dd> +** If this value is returned, any changes applied so far are rolled back +** and the call to sqlite3changeset_apply() returns SQLITE_ABORT. +** </dl> +*/ +#define SQLITE_CHANGESET_OMIT 0 +#define SQLITE_CHANGESET_REPLACE 1 +#define SQLITE_CHANGESET_ABORT 2 + +/* +** CAPI3REF: Rebasing changesets +** EXPERIMENTAL +** +** Suppose there is a site hosting a database in state S0. And that +** modifications are made that move that database to state S1 and a +** changeset recorded (the "local" changeset). Then, a changeset based +** on S0 is received from another site (the "remote" changeset) and +** applied to the database. The database is then in state +** (S1+"remote"), where the exact state depends on any conflict +** resolution decisions (OMIT or REPLACE) made while applying "remote". +** Rebasing a changeset is to update it to take those conflict +** resolution decisions into account, so that the same conflicts +** do not have to be resolved elsewhere in the network. +** +** For example, if both the local and remote changesets contain an +** INSERT of the same key on "CREATE TABLE t1(a PRIMARY KEY, b)": +** +** local: INSERT INTO t1 VALUES(1, 'v1'); +** remote: INSERT INTO t1 VALUES(1, 'v2'); +** +** and the conflict resolution is REPLACE, then the INSERT change is +** removed from the local changeset (it was overridden). Or, if the +** conflict resolution was "OMIT", then the local changeset is modified +** to instead contain: +** +** UPDATE t1 SET b = 'v2' WHERE a=1; +** +** Changes within the local changeset are rebased as follows: +** +** <dl> +** <dt>Local INSERT<dd> +** This may only conflict with a remote INSERT. If the conflict +** resolution was OMIT, then add an UPDATE change to the rebased +** changeset. Or, if the conflict resolution was REPLACE, add +** nothing to the rebased changeset. +** +** <dt>Local DELETE<dd> +** This may conflict with a remote UPDATE or DELETE. In both cases the +** only possible resolution is OMIT. If the remote operation was a +** DELETE, then add no change to the rebased changeset. If the remote +** operation was an UPDATE, then the old.* fields of change are updated +** to reflect the new.* values in the UPDATE. +** +** <dt>Local UPDATE<dd> +** This may conflict with a remote UPDATE or DELETE. If it conflicts +** with a DELETE, and the conflict resolution was OMIT, then the update +** is changed into an INSERT. Any undefined values in the new.* record +** from the update change are filled in using the old.* values from +** the conflicting DELETE. Or, if the conflict resolution was REPLACE, +** the UPDATE change is simply omitted from the rebased changeset. +** +** If conflict is with a remote UPDATE and the resolution is OMIT, then +** the old.* values are rebased using the new.* values in the remote +** change. Or, if the resolution is REPLACE, then the change is copied +** into the rebased changeset with updates to columns also updated by +** the conflicting remote UPDATE removed. If this means no columns would +** be updated, the change is omitted. +** </dl> +** +** A local change may be rebased against multiple remote changes +** simultaneously. If a single key is modified by multiple remote +** changesets, they are combined as follows before the local changeset +** is rebased: +** +** <ul> +** <li> If there has been one or more REPLACE resolutions on a +** key, it is rebased according to a REPLACE. +** +** <li> If there have been no REPLACE resolutions on a key, then +** the local changeset is rebased according to the most recent +** of the OMIT resolutions. +** </ul> +** +** Note that conflict resolutions from multiple remote changesets are +** combined on a per-field basis, not per-row. This means that in the +** case of multiple remote UPDATE operations, some fields of a single +** local change may be rebased for REPLACE while others are rebased for +** OMIT. +** +** In order to rebase a local changeset, the remote changeset must first +** be applied to the local database using sqlite3changeset_apply_v2() and +** the buffer of rebase information captured. Then: +** +** <ol> +** <li> An sqlite3_rebaser object is created by calling +** sqlite3rebaser_create(). +** <li> The new object is configured with the rebase buffer obtained from +** sqlite3changeset_apply_v2() by calling sqlite3rebaser_configure(). +** If the local changeset is to be rebased against multiple remote +** changesets, then sqlite3rebaser_configure() should be called +** multiple times, in the same order that the multiple +** sqlite3changeset_apply_v2() calls were made. +** <li> Each local changeset is rebased by calling sqlite3rebaser_rebase(). +** <li> The sqlite3_rebaser object is deleted by calling +** sqlite3rebaser_delete(). +** </ol> +*/ +typedef struct sqlite3_rebaser sqlite3_rebaser; + +/* +** CAPI3REF: Create a changeset rebaser object. +** EXPERIMENTAL +** +** Allocate a new changeset rebaser object. If successful, set (*ppNew) to +** point to the new object and return SQLITE_OK. Otherwise, if an error +** occurs, return an SQLite error code (e.g. SQLITE_NOMEM) and set (*ppNew) +** to NULL. +*/ +SQLITE_API int sqlite3rebaser_create(sqlite3_rebaser **ppNew); + +/* +** CAPI3REF: Configure a changeset rebaser object. +** EXPERIMENTAL +** +** Configure the changeset rebaser object to rebase changesets according +** to the conflict resolutions described by buffer pRebase (size nRebase +** bytes), which must have been obtained from a previous call to +** sqlite3changeset_apply_v2(). +*/ +SQLITE_API int sqlite3rebaser_configure( + sqlite3_rebaser*, + int nRebase, const void *pRebase +); + +/* +** CAPI3REF: Rebase a changeset +** EXPERIMENTAL +** +** Argument pIn must point to a buffer containing a changeset nIn bytes +** in size. This function allocates and populates a buffer with a copy +** of the changeset rebased rebased according to the configuration of the +** rebaser object passed as the first argument. If successful, (*ppOut) +** is set to point to the new buffer containing the rebased changset and +** (*pnOut) to its size in bytes and SQLITE_OK returned. It is the +** responsibility of the caller to eventually free the new buffer using +** sqlite3_free(). Otherwise, if an error occurs, (*ppOut) and (*pnOut) +** are set to zero and an SQLite error code returned. +*/ +SQLITE_API int sqlite3rebaser_rebase( + sqlite3_rebaser*, + int nIn, const void *pIn, + int *pnOut, void **ppOut +); + +/* +** CAPI3REF: Delete a changeset rebaser object. +** EXPERIMENTAL +** +** Delete the changeset rebaser object and all associated resources. There +** should be one call to this function for each successful invocation +** of sqlite3rebaser_create(). +*/ +SQLITE_API void sqlite3rebaser_delete(sqlite3_rebaser *p); + +/* +** CAPI3REF: Streaming Versions of API functions. +** +** The six streaming API xxx_strm() functions serve similar purposes to the +** corresponding non-streaming API functions: +** +** <table border=1 style="margin-left:8ex;margin-right:8ex"> +** <tr><th>Streaming function<th>Non-streaming equivalent</th> +** <tr><td>sqlite3changeset_apply_strm<td>[sqlite3changeset_apply] +** <tr><td>sqlite3changeset_apply_strm_v2<td>[sqlite3changeset_apply_v2] +** <tr><td>sqlite3changeset_concat_strm<td>[sqlite3changeset_concat] +** <tr><td>sqlite3changeset_invert_strm<td>[sqlite3changeset_invert] +** <tr><td>sqlite3changeset_start_strm<td>[sqlite3changeset_start] +** <tr><td>sqlite3session_changeset_strm<td>[sqlite3session_changeset] +** <tr><td>sqlite3session_patchset_strm<td>[sqlite3session_patchset] +** </table> +** +** Non-streaming functions that accept changesets (or patchsets) as input +** require that the entire changeset be stored in a single buffer in memory. +** Similarly, those that return a changeset or patchset do so by returning +** a pointer to a single large buffer allocated using sqlite3_malloc(). +** Normally this is convenient. However, if an application running in a +** low-memory environment is required to handle very large changesets, the +** large contiguous memory allocations required can become onerous. +** +** In order to avoid this problem, instead of a single large buffer, input +** is passed to a streaming API functions by way of a callback function that +** the sessions module invokes to incrementally request input data as it is +** required. In all cases, a pair of API function parameters such as +** +** <pre> +**   int nChangeset, +**   void *pChangeset, +** </pre> +** +** Is replaced by: +** +** <pre> +**   int (*xInput)(void *pIn, void *pData, int *pnData), +**   void *pIn, +** </pre> +** +** Each time the xInput callback is invoked by the sessions module, the first +** argument passed is a copy of the supplied pIn context pointer. The second +** argument, pData, points to a buffer (*pnData) bytes in size. Assuming no +** error occurs the xInput method should copy up to (*pnData) bytes of data +** into the buffer and set (*pnData) to the actual number of bytes copied +** before returning SQLITE_OK. If the input is completely exhausted, (*pnData) +** should be set to zero to indicate this. Or, if an error occurs, an SQLite +** error code should be returned. In all cases, if an xInput callback returns +** an error, all processing is abandoned and the streaming API function +** returns a copy of the error code to the caller. +** +** In the case of sqlite3changeset_start_strm(), the xInput callback may be +** invoked by the sessions module at any point during the lifetime of the +** iterator. If such an xInput callback returns an error, the iterator enters +** an error state, whereby all subsequent calls to iterator functions +** immediately fail with the same error code as returned by xInput. +** +** Similarly, streaming API functions that return changesets (or patchsets) +** return them in chunks by way of a callback function instead of via a +** pointer to a single large buffer. In this case, a pair of parameters such +** as: +** +** <pre> +**   int *pnChangeset, +**   void **ppChangeset, +** </pre> +** +** Is replaced by: +** +** <pre> +**   int (*xOutput)(void *pOut, const void *pData, int nData), +**   void *pOut +** </pre> +** +** The xOutput callback is invoked zero or more times to return data to +** the application. The first parameter passed to each call is a copy of the +** pOut pointer supplied by the application. The second parameter, pData, +** points to a buffer nData bytes in size containing the chunk of output +** data being returned. If the xOutput callback successfully processes the +** supplied data, it should return SQLITE_OK to indicate success. Otherwise, +** it should return some other SQLite error code. In this case processing +** is immediately abandoned and the streaming API function returns a copy +** of the xOutput error code to the application. +** +** The sessions module never invokes an xOutput callback with the third +** parameter set to a value less than or equal to zero. Other than this, +** no guarantees are made as to the size of the chunks of data returned. +*/ +SQLITE_API int sqlite3changeset_apply_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx /* First argument passed to xConflict */ +); +SQLITE_API int sqlite3changeset_apply_v2_strm( + sqlite3 *db, /* Apply change to "main" db of this handle */ + int (*xInput)(void *pIn, void *pData, int *pnData), /* Input function */ + void *pIn, /* First arg for xInput */ + int(*xFilter)( + void *pCtx, /* Copy of sixth arg to _apply() */ + const char *zTab /* Table name */ + ), + int(*xConflict)( + void *pCtx, /* Copy of sixth arg to _apply() */ + int eConflict, /* DATA, MISSING, CONFLICT, CONSTRAINT */ + sqlite3_changeset_iter *p /* Handle describing change and conflict */ + ), + void *pCtx, /* First argument passed to xConflict */ + void **ppRebase, int *pnRebase, + int flags +); +SQLITE_API int sqlite3changeset_concat_strm( + int (*xInputA)(void *pIn, void *pData, int *pnData), + void *pInA, + int (*xInputB)(void *pIn, void *pData, int *pnData), + void *pInB, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_invert_strm( + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changeset_start_strm( + sqlite3_changeset_iter **pp, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3session_changeset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3session_patchset_strm( + sqlite3_session *pSession, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3changegroup_add_strm(sqlite3_changegroup*, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn +); +SQLITE_API int sqlite3changegroup_output_strm(sqlite3_changegroup*, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); +SQLITE_API int sqlite3rebaser_rebase_strm( + sqlite3_rebaser *pRebaser, + int (*xInput)(void *pIn, void *pData, int *pnData), + void *pIn, + int (*xOutput)(void *pOut, const void *pData, int nData), + void *pOut +); + + +/* +** Make sure we can call this stuff from C++. +*/ +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__SQLITESESSION_H_) && defined(SQLITE_ENABLE_SESSION) */ + +/******** End of sqlite3session.h *********/ +/******** Begin file fts5.h *********/ +/* +** 2014 May 31 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** Interfaces to extend FTS5. Using the interfaces defined in this file, +** FTS5 may be extended with: +** +** * custom tokenizers, and +** * custom auxiliary functions. +*/ + + +#ifndef _FTS5_H +#define _FTS5_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************* +** CUSTOM AUXILIARY FUNCTIONS +** +** Virtual table implementations may overload SQL functions by implementing +** the sqlite3_module.xFindFunction() method. +*/ + +typedef struct Fts5ExtensionApi Fts5ExtensionApi; +typedef struct Fts5Context Fts5Context; +typedef struct Fts5PhraseIter Fts5PhraseIter; + +typedef void (*fts5_extension_function)( + const Fts5ExtensionApi *pApi, /* API offered by current FTS version */ + Fts5Context *pFts, /* First arg to pass to pApi functions */ + sqlite3_context *pCtx, /* Context for returning result/error */ + int nVal, /* Number of values in apVal[] array */ + sqlite3_value **apVal /* Array of trailing arguments */ +); + +struct Fts5PhraseIter { + const unsigned char *a; + const unsigned char *b; +}; + +/* +** EXTENSION API FUNCTIONS +** +** xUserData(pFts): +** Return a copy of the context pointer the extension function was +** registered with. +** +** xColumnTotalSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the FTS5 table. Or, if iCol is +** non-negative but less than the number of columns in the table, return +** the total number of tokens in column iCol, considering all rows in +** the FTS5 table. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** xColumnCount(pFts): +** Return the number of columns in the table. +** +** xColumnSize(pFts, iCol, pnToken): +** If parameter iCol is less than zero, set output variable *pnToken +** to the total number of tokens in the current row. Or, if iCol is +** non-negative but less than the number of columns in the table, set +** *pnToken to the number of tokens in column iCol of the current row. +** +** If parameter iCol is greater than or equal to the number of columns +** in the table, SQLITE_RANGE is returned. Or, if an error occurs (e.g. +** an OOM condition or IO error), an appropriate SQLite error code is +** returned. +** +** This function may be quite inefficient if used with an FTS5 table +** created with the "columnsize=0" option. +** +** xColumnText: +** This function attempts to retrieve the text of column iCol of the +** current document. If successful, (*pz) is set to point to a buffer +** containing the text in utf-8 encoding, (*pn) is set to the size in bytes +** (not characters) of the buffer and SQLITE_OK is returned. Otherwise, +** if an error occurs, an SQLite error code is returned and the final values +** of (*pz) and (*pn) are undefined. +** +** xPhraseCount: +** Returns the number of phrases in the current query expression. +** +** xPhraseSize: +** Returns the number of tokens in phrase iPhrase of the query. Phrases +** are numbered starting from zero. +** +** xInstCount: +** Set *pnInst to the total number of occurrences of all phrases within +** the query within the current row. Return SQLITE_OK if successful, or +** an error code (i.e. SQLITE_NOMEM) if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always returns 0. +** +** xInst: +** Query for the details of phrase match iIdx within the current row. +** Phrase matches are numbered starting from zero, so the iIdx argument +** should be greater than or equal to zero and smaller than the value +** output by xInstCount(). +** +** Usually, output parameter *piPhrase is set to the phrase number, *piCol +** to the column in which it occurs and *piOff the token offset of the +** first token of the phrase. The exception is if the table was created +** with the offsets=0 option specified. In this case *piOff is always +** set to -1. +** +** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) +** if an error occurs. +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. +** +** xRowid: +** Returns the rowid of the current row. +** +** xTokenize: +** Tokenize text using the tokenizer belonging to the FTS5 table. +** +** xQueryPhrase(pFts5, iPhrase, pUserData, xCallback): +** This API function is used to query the FTS table for phrase iPhrase +** of the current query. Specifically, a query equivalent to: +** +** ... FROM ftstable WHERE ftstable MATCH $p ORDER BY rowid +** +** with $p set to a phrase equivalent to the phrase iPhrase of the +** current query is executed. Any column filter that applies to +** phrase iPhrase of the current query is included in $p. For each +** row visited, the callback function passed as the fourth argument +** is invoked. The context and API objects passed to the callback +** function may be used to access the properties of each matched row. +** Invoking Api.xUserData() returns a copy of the pointer passed as +** the third argument to pUserData. +** +** If the callback function returns any value other than SQLITE_OK, the +** query is abandoned and the xQueryPhrase function returns immediately. +** If the returned value is SQLITE_DONE, xQueryPhrase returns SQLITE_OK. +** Otherwise, the error code is propagated upwards. +** +** If the query runs to completion without incident, SQLITE_OK is returned. +** Or, if some error occurs before the query completes or is aborted by +** the callback, an SQLite error code is returned. +** +** +** xSetAuxdata(pFts5, pAux, xDelete) +** +** Save the pointer passed as the second argument as the extension functions +** "auxiliary data". The pointer may then be retrieved by the current or any +** future invocation of the same fts5 extension function made as part of +** of the same MATCH query using the xGetAuxdata() API. +** +** Each extension function is allocated a single auxiliary data slot for +** each FTS query (MATCH expression). If the extension function is invoked +** more than once for a single FTS query, then all invocations share a +** single auxiliary data context. +** +** If there is already an auxiliary data pointer when this function is +** invoked, then it is replaced by the new pointer. If an xDelete callback +** was specified along with the original pointer, it is invoked at this +** point. +** +** The xDelete callback, if one is specified, is also invoked on the +** auxiliary data pointer after the FTS5 query has finished. +** +** If an error (e.g. an OOM condition) occurs within this function, an +** the auxiliary data is set to NULL and an error code returned. If the +** xDelete parameter was not NULL, it is invoked on the auxiliary data +** pointer before returning. +** +** +** xGetAuxdata(pFts5, bClear) +** +** Returns the current auxiliary data pointer for the fts5 extension +** function. See the xSetAuxdata() method for details. +** +** If the bClear argument is non-zero, then the auxiliary data is cleared +** (set to NULL) before this function returns. In this case the xDelete, +** if any, is not invoked. +** +** +** xRowCount(pFts5, pnRow) +** +** This function is used to retrieve the total number of rows in the table. +** In other words, the same value that would be returned by: +** +** SELECT count(*) FROM ftstable; +** +** xPhraseFirst() +** This function is used, along with type Fts5PhraseIter and the xPhraseNext +** method, to iterate through all instances of a single query phrase within +** the current row. This is the same information as is accessible via the +** xInstCount/xInst APIs. While the xInstCount/xInst APIs are more convenient +** to use, this API may be faster under some circumstances. To iterate +** through instances of phrase iPhrase, use the following code: +** +** Fts5PhraseIter iter; +** int iCol, iOff; +** for(pApi->xPhraseFirst(pFts, iPhrase, &iter, &iCol, &iOff); +** iCol>=0; +** pApi->xPhraseNext(pFts, &iter, &iCol, &iOff) +** ){ +** // An instance of phrase iPhrase at offset iOff of column iCol +** } +** +** The Fts5PhraseIter structure is defined above. Applications should not +** modify this structure directly - it should only be used as shown above +** with the xPhraseFirst() and xPhraseNext() API methods (and by +** xPhraseFirstColumn() and xPhraseNextColumn() as illustrated below). +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" or "detail=column" option. If the FTS5 table is created +** with either "detail=none" or "detail=column" and "content=" option +** (i.e. if it is a contentless table), then this API always iterates +** through an empty set (all calls to xPhraseFirst() set iCol to -1). +** +** xPhraseNext() +** See xPhraseFirst above. +** +** xPhraseFirstColumn() +** This function and xPhraseNextColumn() are similar to the xPhraseFirst() +** and xPhraseNext() APIs described above. The difference is that instead +** of iterating through all instances of a phrase in the current row, these +** APIs are used to iterate through the set of columns in the current row +** that contain one or more instances of a specified phrase. For example: +** +** Fts5PhraseIter iter; +** int iCol; +** for(pApi->xPhraseFirstColumn(pFts, iPhrase, &iter, &iCol); +** iCol>=0; +** pApi->xPhraseNextColumn(pFts, &iter, &iCol) +** ){ +** // Column iCol contains at least one instance of phrase iPhrase +** } +** +** This API can be quite slow if used with an FTS5 table created with the +** "detail=none" option. If the FTS5 table is created with either +** "detail=none" "content=" option (i.e. if it is a contentless table), +** then this API always iterates through an empty set (all calls to +** xPhraseFirstColumn() set iCol to -1). +** +** The information accessed using this API and its companion +** xPhraseFirstColumn() may also be obtained using xPhraseFirst/xPhraseNext +** (or xInst/xInstCount). The chief advantage of this API is that it is +** significantly more efficient than those alternatives when used with +** "detail=column" tables. +** +** xPhraseNextColumn() +** See xPhraseFirstColumn above. +*/ +struct Fts5ExtensionApi { + int iVersion; /* Currently always set to 3 */ + + void *(*xUserData)(Fts5Context*); + + int (*xColumnCount)(Fts5Context*); + int (*xRowCount)(Fts5Context*, sqlite3_int64 *pnRow); + int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *pnToken); + + int (*xTokenize)(Fts5Context*, + const char *pText, int nText, /* Text to tokenize */ + void *pCtx, /* Context passed to xToken() */ + int (*xToken)(void*, int, const char*, int, int, int) /* Callback */ + ); + + int (*xPhraseCount)(Fts5Context*); + int (*xPhraseSize)(Fts5Context*, int iPhrase); + + int (*xInstCount)(Fts5Context*, int *pnInst); + int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff); + + sqlite3_int64 (*xRowid)(Fts5Context*); + int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn); + int (*xColumnSize)(Fts5Context*, int iCol, int *pnToken); + + int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData, + int(*)(const Fts5ExtensionApi*,Fts5Context*,void*) + ); + int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*)); + void *(*xGetAuxdata)(Fts5Context*, int bClear); + + int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*); + void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff); + + int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*); + void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol); +}; + +/* +** CUSTOM AUXILIARY FUNCTIONS +*************************************************************************/ + +/************************************************************************* +** CUSTOM TOKENIZERS +** +** Applications may also register custom tokenizer types. A tokenizer +** is registered by providing fts5 with a populated instance of the +** following structure. All structure methods must be defined, setting +** any member of the fts5_tokenizer struct to NULL leads to undefined +** behaviour. The structure methods are expected to function as follows: +** +** xCreate: +** This function is used to allocate and initialize a tokenizer instance. +** A tokenizer instance is required to actually tokenize text. +** +** The first argument passed to this function is a copy of the (void*) +** pointer provided by the application when the fts5_tokenizer object +** was registered with FTS5 (the third argument to xCreateTokenizer()). +** The second and third arguments are an array of nul-terminated strings +** containing the tokenizer arguments, if any, specified following the +** tokenizer name as part of the CREATE VIRTUAL TABLE statement used +** to create the FTS5 table. +** +** The final argument is an output variable. If successful, (*ppOut) +** should be set to point to the new tokenizer handle and SQLITE_OK +** returned. If an error occurs, some value other than SQLITE_OK should +** be returned. In this case, fts5 assumes that the final value of *ppOut +** is undefined. +** +** xDelete: +** This function is invoked to delete a tokenizer handle previously +** allocated using xCreate(). Fts5 guarantees that this function will +** be invoked exactly once for each successful call to xCreate(). +** +** xTokenize: +** This function is expected to tokenize the nText byte string indicated +** by argument pText. pText may or may not be nul-terminated. The first +** argument passed to this function is a pointer to an Fts5Tokenizer object +** returned by an earlier call to xCreate(). +** +** The second argument indicates the reason that FTS5 is requesting +** tokenization of the supplied text. This is always one of the following +** four values: +** +** <ul><li> <b>FTS5_TOKENIZE_DOCUMENT</b> - A document is being inserted into +** or removed from the FTS table. The tokenizer is being invoked to +** determine the set of tokens to add to (or delete from) the +** FTS index. +** +** <li> <b>FTS5_TOKENIZE_QUERY</b> - A MATCH query is being executed +** against the FTS index. The tokenizer is being called to tokenize +** a bareword or quoted string specified as part of the query. +** +** <li> <b>(FTS5_TOKENIZE_QUERY | FTS5_TOKENIZE_PREFIX)</b> - Same as +** FTS5_TOKENIZE_QUERY, except that the bareword or quoted string is +** followed by a "*" character, indicating that the last token +** returned by the tokenizer will be treated as a token prefix. +** +** <li> <b>FTS5_TOKENIZE_AUX</b> - The tokenizer is being invoked to +** satisfy an fts5_api.xTokenize() request made by an auxiliary +** function. Or an fts5_api.xColumnSize() request made by the same +** on a columnsize=0 database. +** </ul> +** +** For each token in the input string, the supplied callback xToken() must +** be invoked. The first argument to it should be a copy of the pointer +** passed as the second argument to xTokenize(). The third and fourth +** arguments are a pointer to a buffer containing the token text, and the +** size of the token in bytes. The 4th and 5th arguments are the byte offsets +** of the first byte of and first byte immediately following the text from +** which the token is derived within the input. +** +** The second argument passed to the xToken() callback ("tflags") should +** normally be set to 0. The exception is if the tokenizer supports +** synonyms. In this case see the discussion below for details. +** +** FTS5 assumes the xToken() callback is invoked for each token in the +** order that they occur within the input text. +** +** If an xToken() callback returns any value other than SQLITE_OK, then +** the tokenization should be abandoned and the xTokenize() method should +** immediately return a copy of the xToken() return value. Or, if the +** input buffer is exhausted, xTokenize() should return SQLITE_OK. Finally, +** if an error occurs with the xTokenize() implementation itself, it +** may abandon the tokenization and return any error code other than +** SQLITE_OK or SQLITE_DONE. +** +** SYNONYM SUPPORT +** +** Custom tokenizers may also support synonyms. Consider a case in which a +** user wishes to query for a phrase such as "first place". Using the +** built-in tokenizers, the FTS5 query 'first + place' will match instances +** of "first place" within the document set, but not alternative forms +** such as "1st place". In some applications, it would be better to match +** all instances of "first place" or "1st place" regardless of which form +** the user specified in the MATCH query text. +** +** There are several ways to approach this in FTS5: +** +** <ol><li> By mapping all synonyms to a single token. In this case, the +** In the above example, this means that the tokenizer returns the +** same token for inputs "first" and "1st". Say that token is in +** fact "first", so that when the user inserts the document "I won +** 1st place" entries are added to the index for tokens "i", "won", +** "first" and "place". If the user then queries for '1st + place', +** the tokenizer substitutes "first" for "1st" and the query works +** as expected. +** +** <li> By adding multiple synonyms for a single term to the FTS index. +** In this case, when tokenizing query text, the tokenizer may +** provide multiple synonyms for a single term within the document. +** FTS5 then queries the index for each synonym individually. For +** example, faced with the query: +** +** <codeblock> +** ... MATCH 'first place'</codeblock> +** +** the tokenizer offers both "1st" and "first" as synonyms for the +** first token in the MATCH query and FTS5 effectively runs a query +** similar to: +** +** <codeblock> +** ... MATCH '(first OR 1st) place'</codeblock> +** +** except that, for the purposes of auxiliary functions, the query +** still appears to contain just two phrases - "(first OR 1st)" +** being treated as a single phrase. +** +** <li> By adding multiple synonyms for a single term to the FTS index. +** Using this method, when tokenizing document text, the tokenizer +** provides multiple synonyms for each token. So that when a +** document such as "I won first place" is tokenized, entries are +** added to the FTS index for "i", "won", "first", "1st" and +** "place". +** +** This way, even if the tokenizer does not provide synonyms +** when tokenizing query text (it should not - to do would be +** inefficient), it doesn't matter if the user queries for +** 'first + place' or '1st + place', as there are entires in the +** FTS index corresponding to both forms of the first token. +** </ol> +** +** Whether it is parsing document or query text, any call to xToken that +** specifies a <i>tflags</i> argument with the FTS5_TOKEN_COLOCATED bit +** is considered to supply a synonym for the previous token. For example, +** when parsing the document "I won first place", a tokenizer that supports +** synonyms would call xToken() 5 times, as follows: +** +** <codeblock> +** xToken(pCtx, 0, "i", 1, 0, 1); +** xToken(pCtx, 0, "won", 3, 2, 5); +** xToken(pCtx, 0, "first", 5, 6, 11); +** xToken(pCtx, FTS5_TOKEN_COLOCATED, "1st", 3, 6, 11); +** xToken(pCtx, 0, "place", 5, 12, 17); +**</codeblock> +** +** It is an error to specify the FTS5_TOKEN_COLOCATED flag the first time +** xToken() is called. Multiple synonyms may be specified for a single token +** by making multiple calls to xToken(FTS5_TOKEN_COLOCATED) in sequence. +** There is no limit to the number of synonyms that may be provided for a +** single token. +** +** In many cases, method (1) above is the best approach. It does not add +** extra data to the FTS index or require FTS5 to query for multiple terms, +** so it is efficient in terms of disk space and query speed. However, it +** does not support prefix queries very well. If, as suggested above, the +** token "first" is subsituted for "1st" by the tokenizer, then the query: +** +** <codeblock> +** ... MATCH '1s*'</codeblock> +** +** will not match documents that contain the token "1st" (as the tokenizer +** will probably not map "1s" to any prefix of "first"). +** +** For full prefix support, method (3) may be preferred. In this case, +** because the index contains entries for both "first" and "1st", prefix +** queries such as 'fi*' or '1s*' will match correctly. However, because +** extra entries are added to the FTS index, this method uses more space +** within the database. +** +** Method (2) offers a midpoint between (1) and (3). Using this method, +** a query such as '1s*' will match documents that contain the literal +** token "1st", but not "first" (assuming the tokenizer is not able to +** provide synonyms for prefixes). However, a non-prefix query like '1st' +** will match against "1st" and "first". This method does not require +** extra disk space, as no extra entries are added to the FTS index. +** On the other hand, it may require more CPU cycles to run MATCH queries, +** as separate queries of the FTS index are required for each synonym. +** +** When using methods (2) or (3), it is important that the tokenizer only +** provide synonyms when tokenizing document text (method (2)) or query +** text (method (3)), not both. Doing so will not cause any errors, but is +** inefficient. +*/ +typedef struct Fts5Tokenizer Fts5Tokenizer; +typedef struct fts5_tokenizer fts5_tokenizer; +struct fts5_tokenizer { + int (*xCreate)(void*, const char **azArg, int nArg, Fts5Tokenizer **ppOut); + void (*xDelete)(Fts5Tokenizer*); + int (*xTokenize)(Fts5Tokenizer*, + void *pCtx, + int flags, /* Mask of FTS5_TOKENIZE_* flags */ + const char *pText, int nText, + int (*xToken)( + void *pCtx, /* Copy of 2nd argument to xTokenize() */ + int tflags, /* Mask of FTS5_TOKEN_* flags */ + const char *pToken, /* Pointer to buffer containing token */ + int nToken, /* Size of token in bytes */ + int iStart, /* Byte offset of token within input text */ + int iEnd /* Byte offset of end of token within input text */ + ) + ); +}; + +/* Flags that may be passed as the third argument to xTokenize() */ +#define FTS5_TOKENIZE_QUERY 0x0001 +#define FTS5_TOKENIZE_PREFIX 0x0002 +#define FTS5_TOKENIZE_DOCUMENT 0x0004 +#define FTS5_TOKENIZE_AUX 0x0008 + +/* Flags that may be passed by the tokenizer implementation back to FTS5 +** as the third argument to the supplied xToken callback. */ +#define FTS5_TOKEN_COLOCATED 0x0001 /* Same position as prev. token */ + +/* +** END OF CUSTOM TOKENIZERS +*************************************************************************/ + +/************************************************************************* +** FTS5 EXTENSION REGISTRATION API +*/ +typedef struct fts5_api fts5_api; +struct fts5_api { + int iVersion; /* Currently always set to 2 */ + + /* Create a new tokenizer */ + int (*xCreateTokenizer)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_tokenizer *pTokenizer, + void (*xDestroy)(void*) + ); + + /* Find an existing tokenizer */ + int (*xFindTokenizer)( + fts5_api *pApi, + const char *zName, + void **ppContext, + fts5_tokenizer *pTokenizer + ); + + /* Create a new auxiliary function */ + int (*xCreateFunction)( + fts5_api *pApi, + const char *zName, + void *pContext, + fts5_extension_function xFunction, + void (*xDestroy)(void*) + ); +}; + +/* +** END OF REGISTRATION API +*************************************************************************/ + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* _FTS5_H */ + +/******** End of fts5.h *********/ From 56e8dcf3d583ac506ac297fa141f56589fffe9fa Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 27 Aug 2018 21:35:24 +0200 Subject: [PATCH 40/98] Update Zlib to v1.2.11 (#527) * Update Zlib to v1.2.10 * Adjust config for linux/mac --- third_party/zlib/AMBuilder | 5 + third_party/zlib/adler32.c | 21 +- third_party/zlib/compress.c | 42 +- third_party/zlib/crc32.c | 41 +- third_party/zlib/deflate.c | 860 ++++++++++++++++++++++-------------- third_party/zlib/deflate.h | 35 +- third_party/zlib/gzguts.h | 25 +- third_party/zlib/gzlib.c | 31 +- third_party/zlib/gzread.c | 158 +++++-- third_party/zlib/gzwrite.c | 334 ++++++++------ third_party/zlib/infback.c | 4 +- third_party/zlib/inffast.c | 85 ++-- third_party/zlib/inflate.c | 123 ++++-- third_party/zlib/inflate.h | 11 +- third_party/zlib/inftrees.c | 26 +- third_party/zlib/trees.c | 99 ++--- third_party/zlib/uncompr.c | 114 +++-- third_party/zlib/zconf.h | 41 +- third_party/zlib/zlib.h | 444 ++++++++++++------- third_party/zlib/zutil.c | 49 +- third_party/zlib/zutil.h | 52 ++- 21 files changed, 1611 insertions(+), 989 deletions(-) diff --git a/third_party/zlib/AMBuilder b/third_party/zlib/AMBuilder index cfef2b9e..02a9175b 100644 --- a/third_party/zlib/AMBuilder +++ b/third_party/zlib/AMBuilder @@ -3,6 +3,11 @@ import os, platform lib = builder.compiler.StaticLibrary('zlib') +if builder.target_platform is 'linux' or builder.target_platform is 'mac': + lib.compiler.defines += [ + 'HAVE_UNISTD_H' + ] + lib.compiler.includes += [ os.path.join(builder.sourcePath, 'third_party', 'zlib'), ] diff --git a/third_party/zlib/adler32.c b/third_party/zlib/adler32.c index a868f073..d0be4380 100644 --- a/third_party/zlib/adler32.c +++ b/third_party/zlib/adler32.c @@ -1,5 +1,5 @@ /* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2011 Mark Adler + * Copyright (C) 1995-2011, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -7,11 +7,9 @@ #include "zutil.h" -#define local static - local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); -#define BASE 65521 /* largest prime smaller than 65536 */ +#define BASE 65521U /* largest prime smaller than 65536 */ #define NMAX 5552 /* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ @@ -62,10 +60,10 @@ local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2)); #endif /* ========================================================================= */ -uLong ZEXPORT adler32(adler, buf, len) +uLong ZEXPORT adler32_z(adler, buf, len) uLong adler; const Bytef *buf; - uInt len; + z_size_t len; { unsigned long sum2; unsigned n; @@ -132,6 +130,15 @@ uLong ZEXPORT adler32(adler, buf, len) return adler | (sum2 << 16); } +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + return adler32_z(adler, buf, len); +} + /* ========================================================================= */ local uLong adler32_combine_(adler1, adler2, len2) uLong adler1; @@ -156,7 +163,7 @@ local uLong adler32_combine_(adler1, adler2, len2) sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; if (sum1 >= BASE) sum1 -= BASE; if (sum1 >= BASE) sum1 -= BASE; - if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1); if (sum2 >= BASE) sum2 -= BASE; return sum1 | (sum2 << 16); } diff --git a/third_party/zlib/compress.c b/third_party/zlib/compress.c index 6e976267..e2db404a 100644 --- a/third_party/zlib/compress.c +++ b/third_party/zlib/compress.c @@ -1,5 +1,5 @@ /* compress.c -- compress a memory buffer - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -28,16 +28,11 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) { z_stream stream; int err; + const uInt max = (uInt)-1; + uLong left; - stream.next_in = (z_const Bytef *)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + left = *destLen; + *destLen = 0; stream.zalloc = (alloc_func)0; stream.zfree = (free_func)0; @@ -46,15 +41,26 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) err = deflateInit(&stream, level); if (err != Z_OK) return err; - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; + stream.next_out = dest; + stream.avail_out = 0; + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; - err = deflateEnd(&stream); - return err; + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen; + sourceLen -= stream.avail_in; + } + err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH); + } while (err == Z_OK); + + *destLen = stream.total_out; + deflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : err; } /* =========================================================================== diff --git a/third_party/zlib/crc32.c b/third_party/zlib/crc32.c index 979a7190..9580440c 100644 --- a/third_party/zlib/crc32.c +++ b/third_party/zlib/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler + * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster @@ -30,17 +30,15 @@ #include "zutil.h" /* for STDC and FAR definitions */ -#define local static - /* Definitions for doing the crc four data bytes at a time. */ #if !defined(NOBYFOUR) && defined(Z_U4) # define BYFOUR #endif #ifdef BYFOUR local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); + const unsigned char FAR *, z_size_t)); local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); + const unsigned char FAR *, z_size_t)); # define TBLS 8 #else # define TBLS 1 @@ -201,10 +199,10 @@ const z_crc_t FAR * ZEXPORT get_crc_table() #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 /* ========================================================================= */ -unsigned long ZEXPORT crc32(crc, buf, len) +unsigned long ZEXPORT crc32_z(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - uInt len; + z_size_t len; { if (buf == Z_NULL) return 0UL; @@ -235,8 +233,29 @@ unsigned long ZEXPORT crc32(crc, buf, len) return crc ^ 0xffffffffUL; } +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + uInt len; +{ + return crc32_z(crc, buf, len); +} + #ifdef BYFOUR +/* + This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit + integer pointer type. This violates the strict aliasing rule, where a + compiler can assume, for optimization purposes, that two pointers to + fundamentally different types won't ever point to the same memory. This can + manifest as a problem only if one of the pointers is written to. This code + only reads from those pointers. So long as this code remains isolated in + this compilation unit, there won't be a problem. For this reason, this code + should not be copied and pasted into a compilation unit in which other code + writes to the buffer that is passed to these routines. + */ + /* ========================================================================= */ #define DOLIT4 c ^= *buf4++; \ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ @@ -247,7 +266,7 @@ unsigned long ZEXPORT crc32(crc, buf, len) local unsigned long crc32_little(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - unsigned len; + z_size_t len; { register z_crc_t c; register const z_crc_t FAR *buf4; @@ -278,7 +297,7 @@ local unsigned long crc32_little(crc, buf, len) } /* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ +#define DOBIG4 c ^= *buf4++; \ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 @@ -287,7 +306,7 @@ local unsigned long crc32_little(crc, buf, len) local unsigned long crc32_big(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - unsigned len; + z_size_t len; { register z_crc_t c; register const z_crc_t FAR *buf4; @@ -300,7 +319,6 @@ local unsigned long crc32_big(crc, buf, len) } buf4 = (const z_crc_t FAR *)(const void FAR *)buf; - buf4--; while (len >= 32) { DOBIG32; len -= 32; @@ -309,7 +327,6 @@ local unsigned long crc32_big(crc, buf, len) DOBIG4; len -= 4; } - buf4++; buf = (const unsigned char FAR *)buf4; if (len) do { diff --git a/third_party/zlib/deflate.c b/third_party/zlib/deflate.c index 69695770..1ec76144 100644 --- a/third_party/zlib/deflate.c +++ b/third_party/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler "; + " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -73,6 +73,8 @@ typedef enum { typedef block_state (*compress_func) OF((deflate_state *s, int flush)); /* Compression function. Returns the block state after the call. */ +local int deflateStateCheck OF((z_streamp strm)); +local void slide_hash OF((deflate_state *s)); local void fill_window OF((deflate_state *s)); local block_state deflate_stored OF((deflate_state *s, int flush)); local block_state deflate_fast OF((deflate_state *s, int flush)); @@ -84,15 +86,16 @@ local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); #ifdef ASMV +# pragma message("Assembler code may have bugs -- use at your own risk") void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif -#ifdef DEBUG +#ifdef ZLIB_DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, int length)); #endif @@ -148,21 +151,14 @@ local const config configuration_table[10] = { * meaning. */ -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - /* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */ -#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0)) +#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0)) /* =========================================================================== * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. + * IN assertion: all calls to UPDATE_HASH are made with consecutive input + * characters, so that a running hash key can be computed from the previous + * key instead of complete recalculation each time. */ #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) @@ -173,9 +169,9 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ * the previous length of the hash chain. * If this file is compiled with -DFASTEST, the compression level is forced * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). */ #ifdef FASTEST #define INSERT_STRING(s, str, match_head) \ @@ -197,6 +193,37 @@ struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ s->head[s->hash_size-1] = NIL; \ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +local void slide_hash(s) + deflate_state *s; +{ + unsigned n, m; + Posf *p; + uInt wsize = s->w_size; + + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + } while (--n); + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m - wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif +} + /* ========================================================================= */ int ZEXPORT deflateInit_(strm, level, version, stream_size) z_streamp strm; @@ -270,7 +297,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, #endif if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { + strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) { return Z_STREAM_ERROR; } if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ @@ -278,14 +305,15 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, if (s == Z_NULL) return Z_MEM_ERROR; strm->state = (struct internal_state FAR *)s; s->strm = strm; + s->status = INIT_STATE; /* to pass state test in deflateReset() */ s->wrap = wrap; s->gzhead = Z_NULL; - s->w_bits = windowBits; + s->w_bits = (uInt)windowBits; s->w_size = 1 << s->w_bits; s->w_mask = s->w_size - 1; - s->hash_bits = memLevel + 7; + s->hash_bits = (uInt)memLevel + 7; s->hash_size = 1 << s->hash_bits; s->hash_mask = s->hash_size - 1; s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); @@ -319,6 +347,31 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, return deflateReset(strm); } +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +local int deflateStateCheck (strm) + z_streamp strm; +{ + deflate_state *s; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + s = strm->state; + if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE && +#ifdef GZIP + s->status != GZIP_STATE && +#endif + s->status != EXTRA_STATE && + s->status != NAME_STATE && + s->status != COMMENT_STATE && + s->status != HCRC_STATE && + s->status != BUSY_STATE && + s->status != FINISH_STATE)) + return 1; + return 0; +} + /* ========================================================================= */ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) z_streamp strm; @@ -331,7 +384,7 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) unsigned avail; z_const unsigned char *next; - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL) + if (deflateStateCheck(strm) || dictionary == Z_NULL) return Z_STREAM_ERROR; s = strm->state; wrap = s->wrap; @@ -388,14 +441,35 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) return Z_OK; } +/* ========================================================================= */ +int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength) + z_streamp strm; + Bytef *dictionary; + uInt *dictLength; +{ + deflate_state *s; + uInt len; + + if (deflateStateCheck(strm)) + return Z_STREAM_ERROR; + s = strm->state; + len = s->strstart + s->lookahead; + if (len > s->w_size) + len = s->w_size; + if (dictionary != Z_NULL && len) + zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len); + if (dictLength != Z_NULL) + *dictLength = len; + return Z_OK; +} + /* ========================================================================= */ int ZEXPORT deflateResetKeep (strm) z_streamp strm; { deflate_state *s; - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + if (deflateStateCheck(strm)) { return Z_STREAM_ERROR; } @@ -410,7 +484,11 @@ int ZEXPORT deflateResetKeep (strm) if (s->wrap < 0) { s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; + s->status = +#ifdef GZIP + s->wrap == 2 ? GZIP_STATE : +#endif + s->wrap ? INIT_STATE : BUSY_STATE; strm->adler = #ifdef GZIP s->wrap == 2 ? crc32(0L, Z_NULL, 0) : @@ -440,8 +518,8 @@ int ZEXPORT deflateSetHeader (strm, head) z_streamp strm; gz_headerp head; { - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; + if (deflateStateCheck(strm) || strm->state->wrap != 2) + return Z_STREAM_ERROR; strm->state->gzhead = head; return Z_OK; } @@ -452,7 +530,7 @@ int ZEXPORT deflatePending (strm, pending, bits) int *bits; z_streamp strm; { - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; if (pending != Z_NULL) *pending = strm->state->pending; if (bits != Z_NULL) @@ -469,7 +547,7 @@ int ZEXPORT deflatePrime (strm, bits, value) deflate_state *s; int put; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3)) return Z_BUF_ERROR; @@ -494,9 +572,8 @@ int ZEXPORT deflateParams(strm, level, strategy) { deflate_state *s; compress_func func; - int err = Z_OK; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; #ifdef FASTEST @@ -510,13 +587,22 @@ int ZEXPORT deflateParams(strm, level, strategy) func = configuration_table[s->level].func; if ((strategy != s->strategy || func != configuration_table[level].func) && - strm->total_in != 0) { + s->high_water) { /* Flush the last buffer: */ - err = deflate(strm, Z_BLOCK); - if (err == Z_BUF_ERROR && s->pending == 0) - err = Z_OK; + int err = deflate(strm, Z_BLOCK); + if (err == Z_STREAM_ERROR) + return err; + if (strm->avail_out == 0) + return Z_BUF_ERROR; } if (s->level != level) { + if (s->level == 0 && s->matches != 0) { + if (s->matches == 1) + slide_hash(s); + else + CLEAR_HASH(s); + s->matches = 0; + } s->level = level; s->max_lazy_match = configuration_table[level].max_lazy; s->good_match = configuration_table[level].good_length; @@ -524,7 +610,7 @@ int ZEXPORT deflateParams(strm, level, strategy) s->max_chain_length = configuration_table[level].max_chain; } s->strategy = strategy; - return err; + return Z_OK; } /* ========================================================================= */ @@ -537,12 +623,12 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) { deflate_state *s; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; + s->good_match = (uInt)good_length; + s->max_lazy_match = (uInt)max_lazy; s->nice_match = nice_length; - s->max_chain_length = max_chain; + s->max_chain_length = (uInt)max_chain; return Z_OK; } @@ -569,14 +655,13 @@ uLong ZEXPORT deflateBound(strm, sourceLen) { deflate_state *s; uLong complen, wraplen; - Bytef *str; /* conservative upper bound for compressed data */ complen = sourceLen + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; /* if can't get parameters, return conservative bound plus zlib wrapper */ - if (strm == Z_NULL || strm->state == Z_NULL) + if (deflateStateCheck(strm)) return complen + 6; /* compute wrapper length */ @@ -588,9 +673,11 @@ uLong ZEXPORT deflateBound(strm, sourceLen) case 1: /* zlib wrapper */ wraplen = 6 + (s->strstart ? 4 : 0); break; +#ifdef GZIP case 2: /* gzip wrapper */ wraplen = 18; if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + Bytef *str; if (s->gzhead->extra != Z_NULL) wraplen += 2 + s->gzhead->extra_len; str = s->gzhead->name; @@ -607,6 +694,7 @@ uLong ZEXPORT deflateBound(strm, sourceLen) wraplen += 2; } break; +#endif default: /* for compiler happiness */ wraplen = 6; } @@ -634,10 +722,10 @@ local void putShortMSB (s, b) } /* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). */ local void flush_pending(strm) z_streamp strm; @@ -654,13 +742,23 @@ local void flush_pending(strm) strm->next_out += len; s->pending_out += len; strm->total_out += len; - strm->avail_out -= len; - s->pending -= len; + strm->avail_out -= len; + s->pending -= len; if (s->pending == 0) { s->pending_out = s->pending_buf; } } +/* =========================================================================== + * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1]. + */ +#define HCRC_UPDATE(beg) \ + do { \ + if (s->gzhead->hcrc && s->pending > (beg)) \ + strm->adler = crc32(strm->adler, s->pending_buf + (beg), \ + s->pending - (beg)); \ + } while (0) + /* ========================================================================= */ int ZEXPORT deflate (strm, flush) z_streamp strm; @@ -669,203 +767,21 @@ int ZEXPORT deflate (strm, flush) int old_flush; /* value of flush param for previous deflate call */ deflate_state *s; - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_BLOCK || flush < 0) { + if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || + (strm->avail_in != 0 && strm->next_in == Z_NULL) || (s->status == FINISH_STATE && flush != Z_FINISH)) { ERR_RETURN(strm, Z_STREAM_ERROR); } if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - s->strm = strm; /* just in case */ old_flush = s->last_flush; s->last_flush = flush; - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == Z_NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != Z_NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != Z_NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - /* Flush as much pending output as possible */ if (s->pending != 0) { flush_pending(strm); @@ -894,15 +810,197 @@ int ZEXPORT deflate (strm, flush) ERR_RETURN(strm, Z_BUF_ERROR); } + /* Write the header */ + if (s->status == INIT_STATE) { + /* zlib header */ + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#ifdef GZIP + if (s->status == GZIP_STATE) { + /* gzip header */ + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == Z_NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != Z_NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex; + while (s->pending + left > s->pending_buf_size) { + uInt copy = s->pending_buf_size - s->pending; + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, copy); + s->pending = s->pending_buf_size; + HCRC_UPDATE(beg); + s->gzindex += copy; + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + left -= copy; + } + zmemcpy(s->pending_buf + s->pending, + s->gzhead->extra + s->gzindex, left); + s->pending += left; + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + s->gzindex = 0; + } + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != Z_NULL) { + ulg beg = s->pending; /* start of bytes to update crc */ + int val; + do { + if (s->pending == s->pending_buf_size) { + HCRC_UPDATE(beg); + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + beg = 0; + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + HCRC_UPDATE(beg); + } + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) { + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + } + s->status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s->pending != 0) { + s->last_flush = -1; + return Z_OK; + } + } +#endif + /* Start a new block or continue the current one. */ if (strm->avail_in != 0 || s->lookahead != 0 || (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; - bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : - (s->strategy == Z_RLE ? deflate_rle(s, flush) : - (*(configuration_table[s->level].func))(s, flush)); + bstate = s->level == 0 ? deflate_stored(s, flush) : + s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; @@ -944,7 +1042,6 @@ int ZEXPORT deflate (strm, flush) } } } - Assert(strm->avail_out > 0, "bug2"); if (flush != Z_FINISH) return Z_OK; if (s->wrap <= 0) return Z_STREAM_END; @@ -981,18 +1078,9 @@ int ZEXPORT deflateEnd (strm) { int status; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (deflateStateCheck(strm)) return Z_STREAM_ERROR; status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } /* Deallocate in reverse order of allocations: */ TRY_FREE(strm, strm->state->pending_buf); @@ -1023,7 +1111,7 @@ int ZEXPORT deflateCopy (dest, source) ushf *overlay; - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + if (deflateStateCheck(source) || dest == Z_NULL) { return Z_STREAM_ERROR; } @@ -1073,7 +1161,7 @@ int ZEXPORT deflateCopy (dest, source) * allocating a large strm->next_in buffer and copying from it. * (See also flush_pending()). */ -local int read_buf(strm, buf, size) +local unsigned read_buf(strm, buf, size) z_streamp strm; Bytef *buf; unsigned size; @@ -1097,7 +1185,7 @@ local int read_buf(strm, buf, size) strm->next_in += len; strm->total_in += len; - return (int)len; + return len; } /* =========================================================================== @@ -1151,9 +1239,9 @@ local uInt longest_match(s, cur_match) { unsigned chain_length = s->max_chain_length;/* max hash chain length */ register Bytef *scan = s->window + s->strstart; /* current string */ - register Bytef *match; /* matched string */ + register Bytef *match; /* matched string */ register int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ + int best_len = (int)s->prev_length; /* best match length so far */ int nice_match = s->nice_match; /* stop if match long enough */ IPos limit = s->strstart > (IPos)MAX_DIST(s) ? s->strstart - (IPos)MAX_DIST(s) : NIL; @@ -1188,7 +1276,7 @@ local uInt longest_match(s, cur_match) /* Do not look for matches beyond the end of the input. This is necessary * to make deflate deterministic. */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead; Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); @@ -1349,7 +1437,11 @@ local uInt longest_match(s, cur_match) #endif /* FASTEST */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG + +#define EQUAL 0 +/* result of memcmp for equal strings */ + /* =========================================================================== * Check that the match at match_start is indeed a match. */ @@ -1375,7 +1467,7 @@ local void check_match(s, start, match, length) } #else # define check_match(s, start, match, length) -#endif /* DEBUG */ +#endif /* ZLIB_DEBUG */ /* =========================================================================== * Fill the window when the lookahead becomes insufficient. @@ -1390,8 +1482,7 @@ local void check_match(s, start, match, length) local void fill_window(s) deflate_state *s; { - register unsigned n, m; - register Posf *p; + unsigned n; unsigned more; /* Amount of free space at the end of the window. */ uInt wsize = s->w_size; @@ -1418,35 +1509,11 @@ local void fill_window(s) */ if (s->strstart >= wsize+MAX_DIST(s)) { - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more); s->match_start -= wsize; s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif + slide_hash(s); more += wsize; } if (s->strm->avail_in == 0) break; @@ -1552,70 +1619,199 @@ local void fill_window(s) if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } +/* Maximum stored block length in deflate format (not including header). */ +#define MAX_STORED 65535 + +/* Minimum of a and b. */ +#define MIN(a, b) ((a) > (b) ? (b) : (a)) + /* =========================================================================== * Copy without compression as much as possible from the input stream, return * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. */ local block_state deflate_stored(s, flush) deflate_state *s; int flush; { - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. */ - ulg max_block_size = 0xffff; - ulg max_start; + unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size); - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + unsigned len, left, have, last = 0; + unsigned used = s->strm->avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); + len = MAX_STORED; /* maximum deflate stored block length */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + if (s->strm->avail_out < have) /* need room for header */ + break; + /* maximum stored block length that will fit in avail_out: */ + have = s->strm->avail_out - have; + left = s->strstart - s->block_start; /* bytes left in window */ + if (len > (ulg)left + s->strm->avail_in) + len = left + s->strm->avail_in; /* limit len to the input */ + if (len > have) + len = have; /* limit len to the output */ + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len == 0 && flush != Z_FINISH) || + flush == Z_NO_FLUSH || + len != left + s->strm->avail_in)) + break; + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0; + _tr_stored_block(s, (char *)0, 0L, last); + + /* Replace the lengths in the dummy stored block with len. */ + s->pending_buf[s->pending - 4] = len; + s->pending_buf[s->pending - 3] = len >> 8; + s->pending_buf[s->pending - 2] = ~len; + s->pending_buf[s->pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s->strm); + +#ifdef ZLIB_DEBUG + /* Update debugging counts for the data about to be copied. */ + s->compressed_len += len << 3; + s->bits_sent += len << 3; +#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + if (left > len) + left = len; + zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s->strm->next_out += left; + s->strm->avail_out -= left; + s->strm->total_out += left; + s->block_start += left; + len -= left; } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s->strm, s->strm->next_out, len); + s->strm->next_out += len; + s->strm->avail_out -= len; + s->strm->total_out += len; + } + } while (last == 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s->strm->avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s->w_size) { /* supplant the previous history */ + s->matches = 2; /* clear hash */ + zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s->strstart = s->w_size; + } + else { + if (s->window_size - s->strstart <= used) { + /* Slide the window down. */ + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + } + zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s->strstart += used; + } + s->block_start = s->strstart; + s->insert += MIN(used, s->w_size - s->insert); } - s->insert = 0; - if (flush == Z_FINISH) { - FLUSH_BLOCK(s, 1); + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* If the last block was written to next_out, then done. */ + if (last) return finish_done; + + /* If flushing and all input has been consumed, then done. */ + if (flush != Z_NO_FLUSH && flush != Z_FINISH && + s->strm->avail_in == 0 && (long)s->strstart == s->block_start) + return block_done; + + /* Fill the window with any remaining input. */ + have = s->window_size - s->strstart - 1; + if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) { + /* Slide the window down. */ + s->block_start -= s->w_size; + s->strstart -= s->w_size; + zmemcpy(s->window, s->window + s->w_size, s->strstart); + if (s->matches < 2) + s->matches++; /* add a pending slide_hash() */ + have += s->w_size; /* more space now */ } - if ((long)s->strstart > s->block_start) - FLUSH_BLOCK(s, 0); - return block_done; + if (have > s->strm->avail_in) + have = s->strm->avail_in; + if (have) { + read_buf(s->strm, s->window + s->strstart, have); + s->strstart += have; + } + if (s->high_water < s->strstart) + s->high_water = s->strstart; + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s->bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = MIN(s->pending_buf_size - have, MAX_STORED); + min_block = MIN(have, s->w_size); + left = s->strstart - s->block_start; + if (left >= min_block || + ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH && + s->strm->avail_in == 0 && left <= have)) { + len = MIN(left, have); + last = flush == Z_FINISH && s->strm->avail_in == 0 && + len == left ? 1 : 0; + _tr_stored_block(s, (charf *)s->window + s->block_start, len, last); + s->block_start += len; + flush_pending(s->strm); + } + + /* We've done all we can with the available input and output. */ + return last ? finish_started : need_more; } /* =========================================================================== @@ -1892,7 +2088,7 @@ local block_state deflate_rle(s, flush) prev == *++scan && prev == *++scan && prev == *++scan && prev == *++scan && scan < strend); - s->match_length = MAX_MATCH - (int)(strend - scan); + s->match_length = MAX_MATCH - (uInt)(strend - scan); if (s->match_length > s->lookahead) s->match_length = s->lookahead; } diff --git a/third_party/zlib/deflate.h b/third_party/zlib/deflate.h index ce0299ed..23ecdd31 100644 --- a/third_party/zlib/deflate.h +++ b/third_party/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2012 Jean-loup Gailly + * Copyright (C) 1995-2016 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -51,13 +51,16 @@ #define Buf_size 16 /* size of bit buffer in bi_buf */ -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 +#define INIT_STATE 42 /* zlib header -> BUSY_STATE */ +#ifdef GZIP +# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */ +#endif +#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */ +#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */ +#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */ +#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */ +#define BUSY_STATE 113 /* deflate -> FINISH_STATE */ +#define FINISH_STATE 666 /* stream complete */ /* Stream status */ @@ -83,7 +86,7 @@ typedef struct static_tree_desc_s static_tree_desc; typedef struct tree_desc_s { ct_data *dyn_tree; /* the dynamic tree */ int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ + const static_tree_desc *stat_desc; /* the corresponding static tree */ } FAR tree_desc; typedef ush Pos; @@ -100,10 +103,10 @@ typedef struct internal_state { Bytef *pending_buf; /* output still pending */ ulg pending_buf_size; /* size of pending_buf */ Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ + ulg pending; /* nb of bytes in the pending buffer */ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ + ulg gzindex; /* where in extra, name, or comment */ Byte method; /* can only be DEFLATED */ int last_flush; /* value of flush param for previous deflate call */ @@ -249,7 +252,7 @@ typedef struct internal_state { uInt matches; /* number of string matches in current block */ uInt insert; /* bytes at end of window left to insert */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG ulg compressed_len; /* total bit length of compressed file mod 2^32 */ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ #endif @@ -275,7 +278,7 @@ typedef struct internal_state { /* Output a byte on the stream. * IN assertion: there is enough room in pending_buf. */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} +#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);} #define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) @@ -309,7 +312,7 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, * used. */ -#ifndef DEBUG +#ifndef ZLIB_DEBUG /* Inline versions of _tr_tally for speed: */ #if defined(GEN_TREES_H) || !defined(STDC) @@ -328,8 +331,8 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf, flush = (s->last_lit == s->lit_bufsize-1); \ } # define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ + { uch len = (uch)(length); \ + ush dist = (ush)(distance); \ s->d_buf[s->last_lit] = dist; \ s->l_buf[s->last_lit++] = len; \ dist--; \ diff --git a/third_party/zlib/gzguts.h b/third_party/zlib/gzguts.h index 1296e524..990a4d25 100644 --- a/third_party/zlib/gzguts.h +++ b/third_party/zlib/gzguts.h @@ -1,5 +1,5 @@ /* gzguts.h -- zlib internal header definitions for gz* operations - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -25,18 +25,24 @@ # include <stdlib.h> # include <limits.h> #endif + +#ifndef _POSIX_SOURCE +# define _POSIX_SOURCE +#endif #include <fcntl.h> #ifdef _WIN32 # include <stddef.h> -#else -# include <unistd.h> #endif #if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) # include <io.h> #endif +#if defined(_WIN32) || defined(__CYGWIN__) +# define WIDECHAR +#endif + #ifdef WINAPI_FAMILY # define open _open # define read _read @@ -97,18 +103,19 @@ # endif #endif -/* unlike snprintf (which is required in C99, yet still not supported by - Microsoft more than a decade later!), _snprintf does not guarantee null - termination of the result -- however this is only used in gzlib.c where +/* unlike snprintf (which is required in C99), _snprintf does not guarantee + null termination of the result -- however this is only used in gzlib.c where the result is assured to fit in the space provided */ -#ifdef _MSC_VER +#if defined(_MSC_VER) && _MSC_VER < 1900 # define snprintf _snprintf #endif #ifndef local # define local static #endif -/* compile with -Dlocal if your debugger can't find static symbols */ +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ /* gz* functions always use library allocation functions */ #ifndef STDC @@ -172,7 +179,7 @@ typedef struct { char *path; /* path or fd for error messages */ unsigned size; /* buffer size, zero if not allocated yet */ unsigned want; /* requested buffer size, default is GZBUFSIZE */ - unsigned char *in; /* input buffer */ + unsigned char *in; /* input buffer (double-sized when writing) */ unsigned char *out; /* output buffer (double-sized when reading) */ int direct; /* 0 if processing gzip, 1 if transparent */ /* just for reading */ diff --git a/third_party/zlib/gzlib.c b/third_party/zlib/gzlib.c index fae202ef..4105e6af 100644 --- a/third_party/zlib/gzlib.c +++ b/third_party/zlib/gzlib.c @@ -1,11 +1,11 @@ /* gzlib.c -- zlib functions common to reading and writing gzip files - * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ #include "gzguts.h" -#if defined(_WIN32) && !defined(__BORLANDC__) +#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__) # define LSEEK _lseeki64 #else #if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 @@ -94,7 +94,7 @@ local gzFile gz_open(path, fd, mode) const char *mode; { gz_statep state; - size_t len; + z_size_t len; int oflag; #ifdef O_CLOEXEC int cloexec = 0; @@ -188,10 +188,10 @@ local gzFile gz_open(path, fd, mode) } /* save the path name for error messages */ -#ifdef _WIN32 +#ifdef WIDECHAR if (fd == -2) { len = wcstombs(NULL, path, 0); - if (len == (size_t)-1) + if (len == (z_size_t)-1) len = 0; } else @@ -202,7 +202,7 @@ local gzFile gz_open(path, fd, mode) free(state); return NULL; } -#ifdef _WIN32 +#ifdef WIDECHAR if (fd == -2) if (len) wcstombs(state->path, path, len + 1); @@ -211,7 +211,7 @@ local gzFile gz_open(path, fd, mode) else #endif #if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(state->path, len + 1, "%s", (const char *)path); + (void)snprintf(state->path, len + 1, "%s", (const char *)path); #else strcpy(state->path, path); #endif @@ -239,7 +239,7 @@ local gzFile gz_open(path, fd, mode) /* open the file with the appropriate flags (or just use fd) */ state->fd = fd > -1 ? fd : ( -#ifdef _WIN32 +#ifdef WIDECHAR fd == -2 ? _wopen(path, oflag, 0666) : #endif open((const char *)path, oflag, 0666)); @@ -248,8 +248,10 @@ local gzFile gz_open(path, fd, mode) free(state); return NULL; } - if (state->mode == GZ_APPEND) + if (state->mode == GZ_APPEND) { + LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */ state->mode = GZ_WRITE; /* simplify later checks */ + } /* save the current position for rewinding (only if reading) */ if (state->mode == GZ_READ) { @@ -291,7 +293,7 @@ gzFile ZEXPORT gzdopen(fd, mode) if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL) return NULL; #if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */ + (void)snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); #else sprintf(path, "<fd:%d>", fd); /* for debugging */ #endif @@ -301,7 +303,7 @@ gzFile ZEXPORT gzdopen(fd, mode) } /* -- see zlib.h -- */ -#ifdef _WIN32 +#ifdef WIDECHAR gzFile ZEXPORT gzopen_w(path, mode) const wchar_t *path; const char *mode; @@ -329,6 +331,8 @@ int ZEXPORT gzbuffer(file, size) return -1; /* check and set requested size */ + if ((size << 1) < size) + return -1; /* need to be able to double it */ if (size < 2) size = 2; /* need two bytes to check magic header */ state->want = size; @@ -604,14 +608,13 @@ void ZLIB_INTERNAL gz_error(state, err, msg) return; } #if !defined(NO_snprintf) && !defined(NO_vsnprintf) - snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, - "%s%s%s", state->path, ": ", msg); + (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3, + "%s%s%s", state->path, ": ", msg); #else strcpy(state->msg, state->path); strcat(state->msg, ": "); strcat(state->msg, msg); #endif - return; } #ifndef INT_MAX diff --git a/third_party/zlib/gzread.c b/third_party/zlib/gzread.c index bf4538eb..956b91ea 100644 --- a/third_party/zlib/gzread.c +++ b/third_party/zlib/gzread.c @@ -1,5 +1,5 @@ /* gzread.c -- zlib functions for reading gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -12,6 +12,7 @@ local int gz_look OF((gz_statep)); local int gz_decomp OF((gz_statep)); local int gz_fetch OF((gz_statep)); local int gz_skip OF((gz_statep, z_off64_t)); +local z_size_t gz_read OF((gz_statep, voidp, z_size_t)); /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from state->fd, and update state->eof, state->err, and state->msg as appropriate. @@ -24,13 +25,17 @@ local int gz_load(state, buf, len, have) unsigned *have; { int ret; + unsigned get, max = ((unsigned)-1 >> 2) + 1; *have = 0; do { - ret = read(state->fd, buf + *have, len - *have); + get = len - *have; + if (get > max) + get = max; + ret = read(state->fd, buf + *have, get); if (ret <= 0) break; - *have += ret; + *have += (unsigned)ret; } while (*have < len); if (ret < 0) { gz_error(state, Z_ERRNO, zstrerror()); @@ -94,10 +99,8 @@ local int gz_look(state) state->in = (unsigned char *)malloc(state->want); state->out = (unsigned char *)malloc(state->want << 1); if (state->in == NULL || state->out == NULL) { - if (state->out != NULL) - free(state->out); - if (state->in != NULL) - free(state->in); + free(state->out); + free(state->in); gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } @@ -284,33 +287,17 @@ local int gz_skip(state, len) return 0; } -/* -- see zlib.h -- */ -int ZEXPORT gzread(file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - unsigned got, n; +/* Read len bytes into buf from file, or less than len up to the end of the + input. Return the number of bytes read. If zero is returned, either the + end of file was reached, or there was an error. state->err must be + consulted in that case to determine which. */ +local z_size_t gz_read(state, buf, len) gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return -1; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're reading and that there's no (serious) error */ - if (state->mode != GZ_READ || - (state->err != Z_OK && state->err != Z_BUF_ERROR)) - return -1; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return -1; - } + voidp buf; + z_size_t len; +{ + z_size_t got; + unsigned n; /* if len is zero, avoid unnecessary operations */ if (len == 0) @@ -320,32 +307,38 @@ int ZEXPORT gzread(file, buf, len) if (state->seek) { state->seek = 0; if (gz_skip(state, state->skip) == -1) - return -1; + return 0; } /* get len bytes to buf, or less than len if at the end */ got = 0; do { + /* set n to the maximum amount of len that fits in an unsigned int */ + n = -1; + if (n > len) + n = len; + /* first just try copying data from the output buffer */ if (state->x.have) { - n = state->x.have > len ? len : state->x.have; + if (state->x.have < n) + n = state->x.have; memcpy(buf, state->x.next, n); state->x.next += n; state->x.have -= n; } /* output buffer empty -- return if we're at the end of the input */ - else if (state->eof && strm->avail_in == 0) { + else if (state->eof && state->strm.avail_in == 0) { state->past = 1; /* tried to read past end */ break; } /* need output data -- for small len or new stream load up our output buffer */ - else if (state->how == LOOK || len < (state->size << 1)) { + else if (state->how == LOOK || n < (state->size << 1)) { /* get more output, looking for header if required */ if (gz_fetch(state) == -1) - return -1; + return 0; continue; /* no progress yet -- go back to copy above */ /* the copy above assures that we will leave with space in the output buffer, allowing at least one gzungetc() to succeed */ @@ -353,16 +346,16 @@ int ZEXPORT gzread(file, buf, len) /* large len -- read directly into user buffer */ else if (state->how == COPY) { /* read directly */ - if (gz_load(state, (unsigned char *)buf, len, &n) == -1) - return -1; + if (gz_load(state, (unsigned char *)buf, n, &n) == -1) + return 0; } /* large len -- decompress directly into user buffer */ else { /* state->how == GZIP */ - strm->avail_out = len; - strm->next_out = (unsigned char *)buf; + state->strm.avail_out = n; + state->strm.next_out = (unsigned char *)buf; if (gz_decomp(state) == -1) - return -1; + return 0; n = state->x.have; state->x.have = 0; } @@ -374,8 +367,75 @@ int ZEXPORT gzread(file, buf, len) state->x.pos += n; } while (len); - /* return number of bytes read into user buffer (will fit in int) */ - return (int)got; + /* return number of bytes read into user buffer */ + return got; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzread(file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return -1; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in an int"); + return -1; + } + + /* read len or fewer bytes to buf */ + len = gz_read(state, buf, len); + + /* check for an error */ + if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR) + return -1; + + /* return the number of bytes read (this is assured to fit in an int) */ + return (int)len; +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfread(buf, size, nitems, file) + voidp buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're reading and that there's no (serious) error */ + if (state->mode != GZ_READ || + (state->err != Z_OK && state->err != Z_BUF_ERROR)) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* read len or fewer bytes to buf, return the number of full items read */ + return len ? gz_read(state, buf, len) / size : 0; } /* -- see zlib.h -- */ @@ -408,8 +468,8 @@ int ZEXPORT gzgetc(file) return *(state->x.next)++; } - /* nothing there -- try gzread() */ - ret = gzread(file, buf, 1); + /* nothing there -- try gz_read() */ + ret = gz_read(state, buf, 1); return ret < 1 ? -1 : buf[0]; } @@ -451,7 +511,7 @@ int ZEXPORT gzungetc(c, file) if (state->x.have == 0) { state->x.have = 1; state->x.next = state->out + (state->size << 1) - 1; - state->x.next[0] = c; + state->x.next[0] = (unsigned char)c; state->x.pos--; state->past = 0; return c; @@ -473,7 +533,7 @@ int ZEXPORT gzungetc(c, file) } state->x.have++; state->x.next--; - state->x.next[0] = c; + state->x.next[0] = (unsigned char)c; state->x.pos--; state->past = 0; return c; diff --git a/third_party/zlib/gzwrite.c b/third_party/zlib/gzwrite.c index aa767fbf..c7b5651d 100644 --- a/third_party/zlib/gzwrite.c +++ b/third_party/zlib/gzwrite.c @@ -1,5 +1,5 @@ /* gzwrite.c -- zlib functions for writing gzip files - * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler + * Copyright (C) 2004-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,17 +9,19 @@ local int gz_init OF((gz_statep)); local int gz_comp OF((gz_statep, int)); local int gz_zero OF((gz_statep, z_off64_t)); +local z_size_t gz_write OF((gz_statep, voidpc, z_size_t)); /* Initialize state for writing a gzip file. Mark initialization by setting - state->size to non-zero. Return -1 on failure or 0 on success. */ + state->size to non-zero. Return -1 on a memory allocation failure, or 0 on + success. */ local int gz_init(state) gz_statep state; { int ret; z_streamp strm = &(state->strm); - /* allocate input buffer */ - state->in = (unsigned char *)malloc(state->want); + /* allocate input buffer (double size for gzprintf) */ + state->in = (unsigned char *)malloc(state->want << 1); if (state->in == NULL) { gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; @@ -47,6 +49,7 @@ local int gz_init(state) gz_error(state, Z_MEM_ERROR, "out of memory"); return -1; } + strm->next_in = NULL; } /* mark state as initialized */ @@ -62,17 +65,17 @@ local int gz_init(state) } /* Compress whatever is at avail_in and next_in and write to the output file. - Return -1 if there is an error writing to the output file, otherwise 0. - flush is assumed to be a valid deflate() flush value. If flush is Z_FINISH, - then the deflate() state is reset to start a new gzip stream. If gz->direct - is true, then simply write to the output file without compressing, and - ignore flush. */ + Return -1 if there is an error writing to the output file or if gz_init() + fails to allocate memory, otherwise 0. flush is assumed to be a valid + deflate() flush value. If flush is Z_FINISH, then the deflate() state is + reset to start a new gzip stream. If gz->direct is true, then simply write + to the output file without compressing, and ignore flush. */ local int gz_comp(state, flush) gz_statep state; int flush; { - int ret, got; - unsigned have; + int ret, writ; + unsigned have, put, max = ((unsigned)-1 >> 2) + 1; z_streamp strm = &(state->strm); /* allocate memory if this is the first time through */ @@ -81,12 +84,16 @@ local int gz_comp(state, flush) /* write directly if requested */ if (state->direct) { - got = write(state->fd, strm->next_in, strm->avail_in); - if (got < 0 || (unsigned)got != strm->avail_in) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; + while (strm->avail_in) { + put = strm->avail_in > max ? max : strm->avail_in; + writ = write(state->fd, strm->next_in, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + strm->avail_in -= (unsigned)writ; + strm->next_in += writ; } - strm->avail_in = 0; return 0; } @@ -97,17 +104,21 @@ local int gz_comp(state, flush) doing Z_FINISH then don't write until we get to Z_STREAM_END */ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH && (flush != Z_FINISH || ret == Z_STREAM_END))) { - have = (unsigned)(strm->next_out - state->x.next); - if (have && ((got = write(state->fd, state->x.next, have)) < 0 || - (unsigned)got != have)) { - gz_error(state, Z_ERRNO, zstrerror()); - return -1; + while (strm->next_out > state->x.next) { + put = strm->next_out - state->x.next > (int)max ? max : + (unsigned)(strm->next_out - state->x.next); + writ = write(state->fd, state->x.next, put); + if (writ < 0) { + gz_error(state, Z_ERRNO, zstrerror()); + return -1; + } + state->x.next += writ; } if (strm->avail_out == 0) { strm->avail_out = state->size; strm->next_out = state->out; + state->x.next = state->out; } - state->x.next = strm->next_out; } /* compress */ @@ -129,7 +140,8 @@ local int gz_comp(state, flush) return 0; } -/* Compress len zeros to output. Return -1 on error, 0 on success. */ +/* Compress len zeros to output. Return -1 on a write error or memory + allocation failure by gz_comp(), or 0 on success. */ local int gz_zero(state, len) gz_statep state; z_off64_t len; @@ -161,32 +173,14 @@ local int gz_zero(state, len) return 0; } -/* -- see zlib.h -- */ -int ZEXPORT gzwrite(file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - unsigned put = len; +/* Write len bytes from buf to file. Return the number of bytes written. If + the returned value is less than len, then there was an error. */ +local z_size_t gz_write(state, buf, len) gz_statep state; - z_streamp strm; - - /* get internal structure */ - if (file == NULL) - return 0; - state = (gz_statep)file; - strm = &(state->strm); - - /* check that we're writing and that there's no error */ - if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; - - /* since an int is returned, make sure len fits in one, otherwise return - with an error (this avoids the flaw in the interface) */ - if ((int)len < 0) { - gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); - return 0; - } + voidpc buf; + z_size_t len; +{ + z_size_t put = len; /* if len is zero, avoid unnecessary operations */ if (len == 0) @@ -209,14 +203,15 @@ int ZEXPORT gzwrite(file, buf, len) do { unsigned have, copy; - if (strm->avail_in == 0) - strm->next_in = state->in; - have = (unsigned)((strm->next_in + strm->avail_in) - state->in); + if (state->strm.avail_in == 0) + state->strm.next_in = state->in; + have = (unsigned)((state->strm.next_in + state->strm.avail_in) - + state->in); copy = state->size - have; if (copy > len) copy = len; memcpy(state->in + have, buf, copy); - strm->avail_in += copy; + state->strm.avail_in += copy; state->x.pos += copy; buf = (const char *)buf + copy; len -= copy; @@ -226,19 +221,83 @@ int ZEXPORT gzwrite(file, buf, len) } else { /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) + if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1) return 0; /* directly compress user buffer to file */ - strm->avail_in = len; - strm->next_in = (z_const Bytef *)buf; - state->x.pos += len; - if (gz_comp(state, Z_NO_FLUSH) == -1) - return 0; + state->strm.next_in = (z_const Bytef *)buf; + do { + unsigned n = (unsigned)-1; + if (n > len) + n = len; + state->strm.avail_in = n; + state->x.pos += n; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return 0; + len -= n; + } while (len); } - /* input was all buffered or compressed (put will fit in int) */ - return (int)put; + /* input was all buffered or compressed */ + return put; +} + +/* -- see zlib.h -- */ +int ZEXPORT gzwrite(file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* since an int is returned, make sure len fits in one, otherwise return + with an error (this avoids a flaw in the interface) */ + if ((int)len < 0) { + gz_error(state, Z_DATA_ERROR, "requested length does not fit in int"); + return 0; + } + + /* write len bytes from buf (the return value will fit in an int) */ + return (int)gz_write(state, buf, len); +} + +/* -- see zlib.h -- */ +z_size_t ZEXPORT gzfwrite(buf, size, nitems, file) + voidpc buf; + z_size_t size; + z_size_t nitems; + gzFile file; +{ + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return 0; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return 0; + + /* compute bytes to read -- error on overflow */ + len = nitems * size; + if (size && len / size != nitems) { + gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t"); + return 0; + } + + /* write len bytes to buf, return the number of full items written */ + return len ? gz_write(state, buf, len) / size : 0; } /* -- see zlib.h -- */ @@ -275,7 +334,7 @@ int ZEXPORT gzputc(file, c) strm->next_in = state->in; have = (unsigned)((strm->next_in + strm->avail_in) - state->in); if (have < state->size) { - state->in[have] = c; + state->in[have] = (unsigned char)c; strm->avail_in++; state->x.pos++; return c & 0xff; @@ -283,8 +342,8 @@ int ZEXPORT gzputc(file, c) } /* no room in buffer or not initialized, use gz_write() */ - buf[0] = c; - if (gzwrite(file, buf, 1) != 1) + buf[0] = (unsigned char)c; + if (gz_write(state, buf, 1) != 1) return -1; return c & 0xff; } @@ -295,11 +354,21 @@ int ZEXPORT gzputs(file, str) const char *str; { int ret; - unsigned len; + z_size_t len; + gz_statep state; + + /* get internal structure */ + if (file == NULL) + return -1; + state = (gz_statep)file; + + /* check that we're writing and that there's no error */ + if (state->mode != GZ_WRITE || state->err != Z_OK) + return -1; /* write string */ - len = (unsigned)strlen(str); - ret = gzwrite(file, str, len); + len = strlen(str); + ret = gz_write(state, str, len); return ret == 0 && len != 0 ? -1 : ret; } @@ -309,63 +378,73 @@ int ZEXPORT gzputs(file, str) /* -- see zlib.h -- */ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va) { - int size, len; + int len; + unsigned left; + char *next; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) - return -1; + return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; + return Z_STREAM_ERROR; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) - return 0; + return state->err; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return 0; + return state->err; } - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in); + next[state->size - 1] = 0; #ifdef NO_vsnprintf # ifdef HAS_vsprintf_void - (void)vsprintf((char *)(state->in), format, va); - for (len = 0; len < size; len++) - if (state->in[len] == 0) break; + (void)vsprintf(next, format, va); + for (len = 0; len < state->size; len++) + if (next[len] == 0) break; # else - len = vsprintf((char *)(state->in), format, va); + len = vsprintf(next, format, va); # endif #else # ifdef HAS_vsnprintf_void - (void)vsnprintf((char *)(state->in), size, format, va); - len = strlen((char *)(state->in)); + (void)vsnprintf(next, state->size, format, va); + len = strlen(next); # else - len = vsnprintf((char *)(state->in), size, format, va); + len = vsnprintf(next, state->size, format, va); # endif #endif /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0) return 0; - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; + /* update buffer and position, compress first half if past that */ + strm->avail_in += (unsigned)len; state->x.pos += len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } return len; } @@ -390,73 +469,82 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; { - int size, len; + unsigned len, left; + char *next; gz_statep state; z_streamp strm; /* get internal structure */ if (file == NULL) - return -1; + return Z_STREAM_ERROR; state = (gz_statep)file; strm = &(state->strm); /* check that can really pass pointer in ints */ if (sizeof(int) != sizeof(void *)) - return 0; + return Z_STREAM_ERROR; /* check that we're writing and that there's no error */ if (state->mode != GZ_WRITE || state->err != Z_OK) - return 0; + return Z_STREAM_ERROR; /* make sure we have some buffer space */ if (state->size == 0 && gz_init(state) == -1) - return 0; + return state->error; /* check for seek request */ if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return 0; + return state->error; } - /* consume whatever's left in the input buffer */ - if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1) - return 0; - - /* do the printf() into the input buffer, put length in len */ - size = (int)(state->size); - state->in[size - 1] = 0; + /* do the printf() into the input buffer, put length in len -- the input + buffer is double-sized just for this function, so there is guaranteed to + be state->size bytes available after the current contents */ + if (strm->avail_in == 0) + strm->next_in = state->in; + next = (char *)(strm->next_in + strm->avail_in); + next[state->size - 1] = 0; #ifdef NO_snprintf # ifdef HAS_sprintf_void - sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, + a13, a14, a15, a16, a17, a18, a19, a20); for (len = 0; len < size; len++) - if (state->in[len] == 0) break; + if (next[len] == 0) + break; # else - len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, + a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #else # ifdef HAS_snprintf_void - snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen((char *)(state->in)); + snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, + a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(next); # else - len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, - a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, - a19, a20); + len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); # endif #endif /* check that printf() results fit in buffer */ - if (len <= 0 || len >= (int)size || state->in[size - 1] != 0) + if (len == 0 || len >= state->size || next[state->size - 1] != 0) return 0; - /* update buffer and position, defer compression until needed */ - strm->avail_in = (unsigned)len; - strm->next_in = state->in; + /* update buffer and position, compress first half if past that */ + strm->avail_in += len; state->x.pos += len; - return len; + if (strm->avail_in >= state->size) { + left = strm->avail_in - state->size; + strm->avail_in = state->size; + if (gz_comp(state, Z_NO_FLUSH) == -1) + return state->err; + memcpy(state->in, state->in + state->size, left); + strm->next_in = state->in; + strm->avail_in = left; + } + return (int)len; } #endif @@ -470,7 +558,7 @@ int ZEXPORT gzflush(file, flush) /* get internal structure */ if (file == NULL) - return -1; + return Z_STREAM_ERROR; state = (gz_statep)file; /* check that we're writing and that there's no error */ @@ -485,11 +573,11 @@ int ZEXPORT gzflush(file, flush) if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return -1; + return state->err; } /* compress remaining data with requested flush */ - gz_comp(state, flush); + (void)gz_comp(state, flush); return state->err; } @@ -520,13 +608,13 @@ int ZEXPORT gzsetparams(file, level, strategy) if (state->seek) { state->seek = 0; if (gz_zero(state, state->skip) == -1) - return -1; + return state->err; } /* change compression parameters for subsequent input */ if (state->size) { /* flush previous input with previous parameters before changing */ - if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1) + if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1) return state->err; deflateParams(strm, level, strategy); } diff --git a/third_party/zlib/infback.c b/third_party/zlib/infback.c index f3833c2e..59679ecb 100644 --- a/third_party/zlib/infback.c +++ b/third_party/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2011 Mark Adler + * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -61,7 +61,7 @@ int stream_size; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; state->dmax = 32768U; - state->wbits = windowBits; + state->wbits = (uInt)windowBits; state->wsize = 1U << windowBits; state->window = window; state->wnext = 0; diff --git a/third_party/zlib/inffast.c b/third_party/zlib/inffast.c index bda59ceb..0dbd1dbc 100644 --- a/third_party/zlib/inffast.c +++ b/third_party/zlib/inffast.c @@ -1,5 +1,5 @@ /* inffast.c -- fast decoding - * Copyright (C) 1995-2008, 2010, 2013 Mark Adler + * Copyright (C) 1995-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -8,26 +8,9 @@ #include "inflate.h" #include "inffast.h" -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ +#ifdef ASMINF +# pragma message("Assembler code may have bugs -- use at your own risk") #else -# define OFF 1 -# define PUP(a) *++(a) -#endif /* Decode literal, length, and distance codes and write out the resulting @@ -96,9 +79,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ /* copy state to local variables */ state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; + in = strm->next_in; last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; + out = strm->next_out; beg = out - (start - strm->avail_out); end = out + (strm->avail_out - 257); #ifdef INFLATE_STRICT @@ -119,9 +102,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ input data or output space */ do { if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } here = lcode[hold & lmask]; @@ -134,14 +117,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : "inflate: literal 0x%02x\n", here.val)); - PUP(out) = (unsigned char)(here.val); + *out++ = (unsigned char)(here.val); } else if (op & 16) { /* length base */ len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } len += (unsigned)hold & ((1U << op) - 1); @@ -150,9 +133,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } Tracevv((stderr, "inflate: length %u\n", len)); if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } here = dcode[hold & dmask]; @@ -165,10 +148,10 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; + hold += (unsigned long)(*in++) << bits; bits += 8; } } @@ -196,30 +179,30 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR if (len <= op - whave) { do { - PUP(out) = 0; + *out++ = 0; } while (--len); continue; } len -= op - whave; do { - PUP(out) = 0; + *out++ = 0; } while (--op > whave); if (op == 0) { from = out - dist; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--len); continue; } #endif } - from = window - OFF; + from = window; if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } @@ -230,14 +213,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ if (op < len) { /* some from end of window */ len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); - from = window - OFF; + from = window; if (wnext < len) { /* some from start of window */ op = wnext; len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } @@ -248,35 +231,35 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ if (op < len) { /* some from window */ len -= op; do { - PUP(out) = PUP(from); + *out++ = *from++; } while (--op); from = out - dist; /* rest from output */ } } while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; len -= 3; } if (len) { - PUP(out) = PUP(from); + *out++ = *from++; if (len > 1) - PUP(out) = PUP(from); + *out++ = *from++; } } else { from = out - dist; /* copy direct from output */ do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); + *out++ = *from++; + *out++ = *from++; + *out++ = *from++; len -= 3; } while (len > 2); if (len) { - PUP(out) = PUP(from); + *out++ = *from++; if (len > 1) - PUP(out) = PUP(from); + *out++ = *from++; } } } @@ -313,8 +296,8 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold &= (1U << bits) - 1; /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; + strm->next_in = in; + strm->next_out = out; strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); strm->avail_out = (unsigned)(out < end ? 257 + (end - out) : 257 - (out - end)); diff --git a/third_party/zlib/inflate.c b/third_party/zlib/inflate.c index 2f78dc49..ac333e8c 100644 --- a/third_party/zlib/inflate.c +++ b/third_party/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2012 Mark Adler + * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -92,6 +92,7 @@ #endif /* function prototypes */ +local int inflateStateCheck OF((z_streamp strm)); local void fixedtables OF((struct inflate_state FAR *state)); local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, unsigned copy)); @@ -101,12 +102,26 @@ local int updatewindow OF((z_streamp strm, const unsigned char FAR *end, local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf, unsigned len)); +local int inflateStateCheck(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) + return 1; + state = (struct inflate_state FAR *)strm->state; + if (state == Z_NULL || state->strm != strm || + state->mode < HEAD || state->mode > SYNC) + return 1; + return 0; +} + int ZEXPORT inflateResetKeep(strm) z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; strm->total_in = strm->total_out = state->total = 0; strm->msg = Z_NULL; @@ -131,7 +146,7 @@ z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; state->wsize = 0; state->whave = 0; @@ -147,7 +162,7 @@ int windowBits; struct inflate_state FAR *state; /* get the state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* extract wrap request from windowBits parameter */ @@ -156,7 +171,7 @@ int windowBits; windowBits = -windowBits; } else { - wrap = (windowBits >> 4) + 1; + wrap = (windowBits >> 4) + 5; #ifdef GUNZIP if (windowBits < 48) windowBits &= 15; @@ -210,7 +225,9 @@ int stream_size; if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; + state->strm = strm; state->window = Z_NULL; + state->mode = HEAD; /* to pass state test in inflateReset2() */ ret = inflateReset2(strm, windowBits); if (ret != Z_OK) { ZFREE(strm, state); @@ -234,17 +251,17 @@ int value; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (bits < 0) { state->hold = 0; state->bits = 0; return Z_OK; } - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; + state->hold += (unsigned)value << state->bits; + state->bits += (uInt)bits; return Z_OK; } @@ -625,7 +642,7 @@ int flush; static const unsigned short order[19] = /* permutation of code lengths */ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + if (inflateStateCheck(strm) || strm->next_out == Z_NULL || (strm->next_in == Z_NULL && strm->avail_in != 0)) return Z_STREAM_ERROR; @@ -645,6 +662,8 @@ int flush; NEEDBITS(16); #ifdef GUNZIP if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + if (state->wbits == 0) + state->wbits = 15; state->check = crc32(0L, Z_NULL, 0); CRC2(state->check, hold); INITBITS(); @@ -672,7 +691,7 @@ int flush; len = BITS(4) + 8; if (state->wbits == 0) state->wbits = len; - else if (len > state->wbits) { + if (len > 15 || len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; @@ -699,14 +718,16 @@ int flush; } if (state->head != Z_NULL) state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); INITBITS(); state->mode = TIME; case TIME: NEEDBITS(32); if (state->head != Z_NULL) state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC4(state->check, hold); INITBITS(); state->mode = OS; case OS: @@ -715,7 +736,8 @@ int flush; state->head->xflags = (int)(hold & 0xff); state->head->os = (int)(hold >> 8); } - if (state->flags & 0x0200) CRC2(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); INITBITS(); state->mode = EXLEN; case EXLEN: @@ -724,7 +746,8 @@ int flush; state->length = (unsigned)(hold); if (state->head != Z_NULL) state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); + if ((state->flags & 0x0200) && (state->wrap & 4)) + CRC2(state->check, hold); INITBITS(); } else if (state->head != Z_NULL) @@ -742,7 +765,7 @@ int flush; len + copy > state->head->extra_max ? state->head->extra_max - len : copy); } - if (state->flags & 0x0200) + if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; @@ -761,9 +784,9 @@ int flush; if (state->head != Z_NULL && state->head->name != Z_NULL && state->length < state->head->name_max) - state->head->name[state->length++] = len; + state->head->name[state->length++] = (Bytef)len; } while (len && copy < have); - if (state->flags & 0x0200) + if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; @@ -782,9 +805,9 @@ int flush; if (state->head != Z_NULL && state->head->comment != Z_NULL && state->length < state->head->comm_max) - state->head->comment[state->length++] = len; + state->head->comment[state->length++] = (Bytef)len; } while (len && copy < have); - if (state->flags & 0x0200) + if ((state->flags & 0x0200) && (state->wrap & 4)) state->check = crc32(state->check, next, copy); have -= copy; next += copy; @@ -796,7 +819,7 @@ int flush; case HCRC: if (state->flags & 0x0200) { NEEDBITS(16); - if (hold != (state->check & 0xffff)) { + if ((state->wrap & 4) && hold != (state->check & 0xffff)) { strm->msg = (char *)"header crc mismatch"; state->mode = BAD; break; @@ -1177,11 +1200,11 @@ int flush; out -= left; strm->total_out += out; state->total += out; - if (out) + if ((state->wrap & 4) && out) strm->adler = state->check = UPDATE(state->check, put - out, out); out = left; - if (( + if ((state->wrap & 4) && ( #ifdef GUNZIP state->flags ? hold : #endif @@ -1240,10 +1263,10 @@ int flush; strm->total_in += in; strm->total_out += out; state->total += out; - if (state->wrap && out) + if ((state->wrap & 4) && out) strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + + strm->data_type = (int)state->bits + (state->last ? 64 : 0) + (state->mode == TYPE ? 128 : 0) + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) @@ -1255,7 +1278,7 @@ int ZEXPORT inflateEnd(strm) z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->window != Z_NULL) ZFREE(strm, state->window); @@ -1273,7 +1296,7 @@ uInt *dictLength; struct inflate_state FAR *state; /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; /* copy dictionary */ @@ -1298,7 +1321,7 @@ uInt dictLength; int ret; /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (state->wrap != 0 && state->mode != DICT) return Z_STREAM_ERROR; @@ -1330,7 +1353,7 @@ gz_headerp head; struct inflate_state FAR *state; /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; @@ -1383,7 +1406,7 @@ z_streamp strm; struct inflate_state FAR *state; /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; @@ -1430,7 +1453,7 @@ z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; return state->mode == STORED && state->bits == 0; } @@ -1445,8 +1468,7 @@ z_streamp source; unsigned wsize; /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + if (inflateStateCheck(source) || dest == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)source->state; @@ -1467,6 +1489,7 @@ z_streamp source; /* copy state */ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream)); zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state)); + copy->strm = dest; if (state->lencode >= state->codes && state->lencode <= state->codes + ENOUGH - 1) { copy->lencode = copy->codes + (state->lencode - state->codes); @@ -1488,25 +1511,51 @@ int subvert; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - state->sane = !subvert; #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + state->sane = !subvert; return Z_OK; #else + (void)subvert; state->sane = 1; return Z_DATA_ERROR; #endif } +int ZEXPORT inflateValidate(strm, check) +z_streamp strm; +int check; +{ + struct inflate_state FAR *state; + + if (inflateStateCheck(strm)) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (check) + state->wrap |= 4; + else + state->wrap &= ~4; + return Z_OK; +} + long ZEXPORT inflateMark(strm) z_streamp strm; { struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL) return -1UL << 16; + if (inflateStateCheck(strm)) + return -(1L << 16); state = (struct inflate_state FAR *)strm->state; - return ((long)(state->back) << 16) + + return (long)(((unsigned long)((long)state->back)) << 16) + (state->mode == COPY ? state->length : (state->mode == MATCH ? state->was - state->length : 0)); } + +unsigned long ZEXPORT inflateCodesUsed(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (inflateStateCheck(strm)) return (unsigned long)-1; + state = (struct inflate_state FAR *)strm->state; + return (unsigned long)(state->next - state->codes); +} diff --git a/third_party/zlib/inflate.h b/third_party/zlib/inflate.h index 95f4986d..a46cce6b 100644 --- a/third_party/zlib/inflate.h +++ b/third_party/zlib/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2009 Mark Adler + * Copyright (C) 1995-2016 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -18,7 +18,7 @@ /* Possible inflate modes between inflate() calls */ typedef enum { - HEAD, /* i: waiting for magic header */ + HEAD = 16180, /* i: waiting for magic header */ FLAGS, /* i: waiting for method and flags (gzip) */ TIME, /* i: waiting for modification time (gzip) */ OS, /* i: waiting for extra flags and operating system (gzip) */ @@ -77,11 +77,14 @@ typedef enum { CHECK -> LENGTH -> DONE */ -/* state maintained between inflate() calls. Approximately 10K bytes. */ +/* State maintained between inflate() calls -- approximately 7K bytes, not + including the allocated sliding window, which is up to 32K bytes. */ struct inflate_state { + z_streamp strm; /* pointer back to this zlib stream */ inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ int havedict; /* true if dictionary provided */ int flags; /* gzip header method and flags (0 if zlib) */ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ diff --git a/third_party/zlib/inftrees.c b/third_party/zlib/inftrees.c index 44d89cf2..2ea08fc1 100644 --- a/third_party/zlib/inftrees.c +++ b/third_party/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2013 Mark Adler + * Copyright (C) 1995-2017 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.8 Copyright 1995-2013 Mark Adler "; + " inflate 1.2.11 Copyright 1995-2017 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -54,7 +54,7 @@ unsigned short FAR *work; code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ + unsigned match; /* use base and extra for symbol >= match */ unsigned short count[MAXBITS+1]; /* number of codes of each length */ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ static const unsigned short lbase[31] = { /* Length codes 257..285 base */ @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -181,19 +181,17 @@ unsigned short FAR *work; switch (type) { case CODES: base = extra = work; /* dummy value--not used */ - end = 19; + match = 20; break; case LENS: base = lbase; - base -= 257; extra = lext; - extra -= 257; - end = 256; + match = 257; break; - default: /* DISTS */ + default: /* DISTS */ base = dbase; extra = dext; - end = -1; + match = 0; } /* initialize state for loop */ @@ -216,13 +214,13 @@ unsigned short FAR *work; for (;;) { /* create table entry */ here.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { + if (work[sym] + 1U < match) { here.op = (unsigned char)0; here.val = work[sym]; } - else if ((int)(work[sym]) > end) { - here.op = (unsigned char)(extra[work[sym]]); - here.val = base[work[sym]]; + else if (work[sym] >= match) { + here.op = (unsigned char)(extra[work[sym] - match]); + here.val = base[work[sym] - match]; } else { here.op = (unsigned char)(32 + 64); /* end of block */ diff --git a/third_party/zlib/trees.c b/third_party/zlib/trees.c index 1fd7759e..50cf4b45 100644 --- a/third_party/zlib/trees.c +++ b/third_party/zlib/trees.c @@ -1,5 +1,5 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2012 Jean-loup Gailly + * Copyright (C) 1995-2017 Jean-loup Gailly * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -36,7 +36,7 @@ #include "deflate.h" -#ifdef DEBUG +#ifdef ZLIB_DEBUG # include <ctype.h> #endif @@ -122,13 +122,13 @@ struct static_tree_desc_s { int max_length; /* max bit length for the codes */ }; -local static_tree_desc static_l_desc = +local const static_tree_desc static_l_desc = {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; -local static_tree_desc static_d_desc = +local const static_tree_desc static_d_desc = {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; -local static_tree_desc static_bl_desc = +local const static_tree_desc static_bl_desc = {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; /* =========================================================================== @@ -152,18 +152,16 @@ local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); #ifdef GEN_TREES_H local void gen_trees_header OF((void)); #endif -#ifndef DEBUG +#ifndef ZLIB_DEBUG # define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) /* Send a code of the given tree. c and tree must not have side effects */ -#else /* DEBUG */ +#else /* !ZLIB_DEBUG */ # define send_code(s, c, tree) \ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ send_bits(s, tree[c].Code, tree[c].Len); } @@ -182,7 +180,7 @@ local void gen_trees_header OF((void)); * Send a value on a given number of bits. * IN assertion: length <= 16 and value fits in length bits. */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG local void send_bits OF((deflate_state *s, int value, int length)); local void send_bits(s, value, length) @@ -208,12 +206,12 @@ local void send_bits(s, value, length) s->bi_valid += length; } } -#else /* !DEBUG */ +#else /* !ZLIB_DEBUG */ #define send_bits(s, value, length) \ { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ + int val = (int)value;\ s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ @@ -223,7 +221,7 @@ local void send_bits(s, value, length) s->bi_valid += len;\ }\ } -#endif /* DEBUG */ +#endif /* ZLIB_DEBUG */ /* the arguments must not have side effects */ @@ -317,7 +315,7 @@ local void tr_static_init() * Genererate the file trees.h describing the static trees. */ #ifdef GEN_TREES_H -# ifndef DEBUG +# ifndef ZLIB_DEBUG # include <stdio.h> # endif @@ -394,7 +392,7 @@ void ZLIB_INTERNAL _tr_init(s) s->bi_buf = 0; s->bi_valid = 0; -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len = 0L; s->bits_sent = 0L; #endif @@ -522,12 +520,12 @@ local void gen_bitlen(s, desc) xbits = 0; if (n >= base) xbits = extra[n-base]; f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + s->opt_len += (ulg)f * (unsigned)(bits + xbits); + if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits); } if (overflow == 0) return; - Trace((stderr,"\nbit length overflow\n")); + Tracev((stderr,"\nbit length overflow\n")); /* This happens for example on obj2 and pic of the Calgary corpus */ /* Find the first bit length which could increase: */ @@ -554,9 +552,8 @@ local void gen_bitlen(s, desc) m = s->heap[--h]; if (m > max_code) continue; if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; + Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq; tree[m].Len = (ush)bits; } n--; @@ -578,7 +575,7 @@ local void gen_codes (tree, max_code, bl_count) ushf *bl_count; /* number of codes at each bit length */ { ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ + unsigned code = 0; /* running code value */ int bits; /* bit index */ int n; /* code index */ @@ -586,7 +583,8 @@ local void gen_codes (tree, max_code, bl_count) * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; + code = (code + bl_count[bits-1]) << 1; + next_code[bits] = (ush)code; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. @@ -599,7 +597,7 @@ local void gen_codes (tree, max_code, bl_count) int len = tree[n].Len; if (len == 0) continue; /* Now reverse the bits */ - tree[n].Code = bi_reverse(next_code[len]++, len); + tree[n].Code = (ush)bi_reverse(next_code[len]++, len); Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); @@ -821,7 +819,7 @@ local int build_bl_tree(s) if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; } /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; + s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4; Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", s->opt_len, s->static_len)); @@ -869,11 +867,17 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) int last; /* one if this is the last block for a file */ { send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ -#ifdef DEBUG + bi_windup(s); /* align on byte boundary */ + put_short(s, (ush)stored_len); + put_short(s, (ush)~stored_len); + zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len); + s->pending += stored_len; +#ifdef ZLIB_DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; + s->bits_sent += 2*16; + s->bits_sent += stored_len<<3; #endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ } /* =========================================================================== @@ -894,7 +898,7 @@ void ZLIB_INTERNAL _tr_align(s) { send_bits(s, STATIC_TREES<<1, 3); send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ #endif bi_flush(s); @@ -902,7 +906,7 @@ void ZLIB_INTERNAL _tr_align(s) /* =========================================================================== * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. + * trees or store, and write out the encoded block. */ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) deflate_state *s; @@ -974,7 +978,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (const ct_data *)static_ltree, (const ct_data *)static_dtree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 3 + s->static_len; #endif } else { @@ -983,7 +987,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) max_blindex+1); compress_block(s, (const ct_data *)s->dyn_ltree, (const ct_data *)s->dyn_dtree); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 3 + s->opt_len; #endif } @@ -995,7 +999,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) if (last) { bi_windup(s); -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } @@ -1090,7 +1094,7 @@ local void compress_block(s, ltree, dtree) send_code(s, code, dtree); /* send the distance code */ extra = extra_dbits[code]; if (extra != 0) { - dist -= base_dist[code]; + dist -= (unsigned)base_dist[code]; send_bits(s, dist, extra); /* send the extra distance bits */ } } /* literal or match pair ? */ @@ -1193,34 +1197,7 @@ local void bi_windup(s) } s->bi_buf = 0; s->bi_valid = 0; -#ifdef DEBUG +#ifdef ZLIB_DEBUG s->bits_sent = (s->bits_sent+7) & ~7; #endif } - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(s, buf, len, header) - deflate_state *s; - charf *buf; /* the input data */ - unsigned len; /* its length */ - int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/third_party/zlib/uncompr.c b/third_party/zlib/uncompr.c index 242e9493..f03a1a86 100644 --- a/third_party/zlib/uncompr.c +++ b/third_party/zlib/uncompr.c @@ -1,5 +1,5 @@ /* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. + * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,51 +9,85 @@ #include "zlib.h" /* =========================================================================== - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. + Decompresses the source buffer into the destination buffer. *sourceLen is + the byte length of the source buffer. Upon entry, *destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, + *destLen is the size of the decompressed data and *sourceLen is the number + of source bytes consumed. Upon return, source + *sourceLen points to the + first unused input byte. - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, or + Z_DATA_ERROR if the input data was corrupted, including if the input data is + an incomplete zlib stream. */ +int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong *sourceLen; +{ + z_stream stream; + int err; + const uInt max = (uInt)-1; + uLong len, left; + Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ + + len = *sourceLen; + if (*destLen) { + left = *destLen; + *destLen = 0; + } + else { + left = 1; + dest = buf; + } + + stream.next_in = (z_const Bytef *)source; + stream.avail_in = 0; + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + stream.next_out = dest; + stream.avail_out = 0; + + do { + if (stream.avail_out == 0) { + stream.avail_out = left > (uLong)max ? max : (uInt)left; + left -= stream.avail_out; + } + if (stream.avail_in == 0) { + stream.avail_in = len > (uLong)max ? max : (uInt)len; + len -= stream.avail_in; + } + err = inflate(&stream, Z_NO_FLUSH); + } while (err == Z_OK); + + *sourceLen -= len + stream.avail_in; + if (dest != buf) + *destLen = stream.total_out; + else if (stream.total_out && err == Z_BUF_ERROR) + left = 1; + + inflateEnd(&stream); + return err == Z_STREAM_END ? Z_OK : + err == Z_NEED_DICT ? Z_DATA_ERROR : + err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : + err; +} + int ZEXPORT uncompress (dest, destLen, source, sourceLen) Bytef *dest; uLongf *destLen; const Bytef *source; uLong sourceLen; { - z_stream stream; - int err; - - stream.next_in = (z_const Bytef *)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) - return Z_DATA_ERROR; - return err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; + return uncompress2(dest, destLen, source, &sourceLen); } diff --git a/third_party/zlib/zconf.h b/third_party/zlib/zconf.h index 9987a775..5e1d68a0 100644 --- a/third_party/zlib/zconf.h +++ b/third_party/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2013 Jean-loup Gailly. + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -17,7 +17,7 @@ #ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ # define Z_PREFIX_SET -/* all linked symbols */ +/* all linked symbols and init macros */ # define _dist_code z__dist_code # define _length_code z__length_code # define _tr_align z__tr_align @@ -29,6 +29,7 @@ # define adler32 z_adler32 # define adler32_combine z_adler32_combine # define adler32_combine64 z_adler32_combine64 +# define adler32_z z_adler32_z # ifndef Z_SOLO # define compress z_compress # define compress2 z_compress2 @@ -37,10 +38,14 @@ # define crc32 z_crc32 # define crc32_combine z_crc32_combine # define crc32_combine64 z_crc32_combine64 +# define crc32_z z_crc32_z # define deflate z_deflate # define deflateBound z_deflateBound # define deflateCopy z_deflateCopy # define deflateEnd z_deflateEnd +# define deflateGetDictionary z_deflateGetDictionary +# define deflateInit z_deflateInit +# define deflateInit2 z_deflateInit2 # define deflateInit2_ z_deflateInit2_ # define deflateInit_ z_deflateInit_ # define deflateParams z_deflateParams @@ -67,6 +72,8 @@ # define gzeof z_gzeof # define gzerror z_gzerror # define gzflush z_gzflush +# define gzfread z_gzfread +# define gzfwrite z_gzfwrite # define gzgetc z_gzgetc # define gzgetc_ z_gzgetc_ # define gzgets z_gzgets @@ -78,7 +85,6 @@ # define gzopen_w z_gzopen_w # endif # define gzprintf z_gzprintf -# define gzvprintf z_gzvprintf # define gzputc z_gzputc # define gzputs z_gzputs # define gzread z_gzread @@ -89,32 +95,39 @@ # define gztell z_gztell # define gztell64 z_gztell64 # define gzungetc z_gzungetc +# define gzvprintf z_gzvprintf # define gzwrite z_gzwrite # endif # define inflate z_inflate # define inflateBack z_inflateBack # define inflateBackEnd z_inflateBackEnd +# define inflateBackInit z_inflateBackInit # define inflateBackInit_ z_inflateBackInit_ +# define inflateCodesUsed z_inflateCodesUsed # define inflateCopy z_inflateCopy # define inflateEnd z_inflateEnd +# define inflateGetDictionary z_inflateGetDictionary # define inflateGetHeader z_inflateGetHeader +# define inflateInit z_inflateInit +# define inflateInit2 z_inflateInit2 # define inflateInit2_ z_inflateInit2_ # define inflateInit_ z_inflateInit_ # define inflateMark z_inflateMark # define inflatePrime z_inflatePrime # define inflateReset z_inflateReset # define inflateReset2 z_inflateReset2 +# define inflateResetKeep z_inflateResetKeep # define inflateSetDictionary z_inflateSetDictionary -# define inflateGetDictionary z_inflateGetDictionary # define inflateSync z_inflateSync # define inflateSyncPoint z_inflateSyncPoint # define inflateUndermine z_inflateUndermine -# define inflateResetKeep z_inflateResetKeep +# define inflateValidate z_inflateValidate # define inflate_copyright z_inflate_copyright # define inflate_fast z_inflate_fast # define inflate_table z_inflate_table # ifndef Z_SOLO # define uncompress z_uncompress +# define uncompress2 z_uncompress2 # endif # define zError z_zError # ifndef Z_SOLO @@ -224,9 +237,19 @@ # define z_const #endif -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL +#ifdef Z_SOLO + typedef unsigned long z_size_t; +#else +# define z_longlong long long +# if defined(NO_SIZE_T) + typedef unsigned NO_SIZE_T z_size_t; +# elif defined(STDC) +# include <stddef.h> + typedef size_t z_size_t; +# else + typedef unsigned long z_size_t; +# endif +# undef z_longlong #endif /* Maximum value for memLevel in deflateInit2 */ @@ -256,7 +279,7 @@ Of course this will generally degrade compression (there's no free lunch). The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes + that is, 32K for windowBits=15 (default value) plus about 7 kilobytes for small objects. */ diff --git a/third_party/zlib/zlib.h b/third_party/zlib/zlib.h index 3e0c7672..f09cdaf1 100644 --- a/third_party/zlib/zlib.h +++ b/third_party/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.8, April 28th, 2013 + version 1.2.11, January 15th, 2017 - Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages @@ -37,11 +37,11 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.8" -#define ZLIB_VERNUM 0x1280 +#define ZLIB_VERSION "1.2.11" +#define ZLIB_VERNUM 0x12b0 #define ZLIB_VER_MAJOR 1 #define ZLIB_VER_MINOR 2 -#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_REVISION 11 #define ZLIB_VER_SUBREVISION 0 /* @@ -65,7 +65,8 @@ extern "C" { with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - This library can optionally read and write gzip streams in memory as well. + This library can optionally read and write gzip and raw deflate streams in + memory as well. The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- @@ -74,7 +75,7 @@ extern "C" { The library does not install any signal handler. The decoder checks the consistency of the compressed data, so the library should never crash - even in case of corrupted input. + even in the case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); @@ -87,7 +88,7 @@ typedef struct z_stream_s { uInt avail_in; /* number of bytes available at next_in */ uLong total_in; /* total number of input bytes read so far */ - Bytef *next_out; /* next output byte should be put there */ + Bytef *next_out; /* next output byte will go here */ uInt avail_out; /* remaining free space at next_out */ uLong total_out; /* total number of bytes output so far */ @@ -98,8 +99,9 @@ typedef struct z_stream_s { free_func zfree; /* used to free the internal state */ voidpf opaque; /* private data object passed to zalloc and zfree */ - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ + int data_type; /* best guess about the data type: binary or text + for deflate, or the decoding state for inflate */ + uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */ uLong reserved; /* reserved for future use */ } z_stream; @@ -142,7 +144,9 @@ typedef gz_header FAR *gz_headerp; zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. + thread safe. In that case, zlib is thread-safe. When zalloc and zfree are + Z_NULL on entry to the initialization function, they are set to internal + routines that use the standard library functions malloc() and free(). On 16-bit systems, the functions zalloc and zfree must be able to allocate exactly 65536 bytes, but will not be required to allocate more than this if @@ -155,7 +159,7 @@ typedef gz_header FAR *gz_headerp; The fields total_in and total_out can be used for statistics or progress reports. After compression, total_in holds the total size of the - uncompressed data and may be saved for use in the decompressor (particularly + uncompressed data and may be saved for use by the decompressor (particularly if the decompressor wants to decompress everything in a single step). */ @@ -200,7 +204,7 @@ typedef gz_header FAR *gz_headerp; #define Z_TEXT 1 #define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ #define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ +/* Possible values of the data_type field for deflate() */ #define Z_DEFLATED 8 /* The deflate compression method (the only one supported in this version) */ @@ -258,11 +262,11 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - - Provide more output starting at next_out and update next_out and avail_out + - Generate more output starting at next_out and update next_out and avail_out accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). Some - output may be provided even if flush is not set. + should be set only when necessary. Some output may be provided even if + flush is zero. Before the call of deflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more @@ -271,7 +275,9 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK and with zero avail_out, it must be called again after making room in the output - buffer because there might be more output pending. + buffer because there might be more output pending. See deflatePending(), + which can be used if desired to determine whether or not there is more ouput + in that case. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to decide how much data to accumulate before producing output, in order to @@ -292,8 +298,8 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. This completes the current deflate block and follows it with an empty fixed codes block that is 10 bits long. This assures that enough bytes are output - in order for the decompressor to finish the block before the empty fixed code - block. + in order for the decompressor to finish the block before the empty fixed + codes block. If flush is set to Z_BLOCK, a deflate block is completed and emitted, as for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to @@ -319,34 +325,38 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); If the parameter flush is set to Z_FINISH, pending input is processed, pending output is flushed and deflate returns with Z_STREAM_END if there was - enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the stream - are deflateReset or deflateEnd. + enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this + function must be called again with Z_FINISH and more output space (updated + avail_out) but no more input data, until it returns with Z_STREAM_END or an + error. After deflate has returned Z_STREAM_END, the only possible operations + on the stream are deflateReset or deflateEnd. - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least the - value returned by deflateBound (see below). Then deflate is guaranteed to - return Z_STREAM_END. If not enough output space is provided, deflate will - not return Z_STREAM_END, and it must be called again as described above. + Z_FINISH can be used in the first deflate call after deflateInit if all the + compression is to be done in a single step. In order to complete in one + call, avail_out must be at least the value returned by deflateBound (see + below). Then deflate is guaranteed to return Z_STREAM_END. If not enough + output space is provided, deflate will not return Z_STREAM_END, and it must + be called again as described above. - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). + deflate() sets strm->adler to the Adler-32 checksum of all input read + so far (that is, total_in bytes). If a gzip stream is being generated, then + strm->adler will be the CRC-32 checksum of the input read so far. (See + deflateInit2 below.) deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect the - compression algorithm in any manner. + the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is + considered binary. This field is only for information purposes and does not + affect the compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. + if next_in or next_out was Z_NULL or the state was inadvertently written over + by the application), or Z_BUF_ERROR if no progress is possible (for example + avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and + deflate() can be called again with more input and more output space to + continue compressing. */ @@ -369,23 +379,21 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the - exact value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. + the caller. In the current version of inflate, the provided input is not + read or consumed. The allocation of a sliding window will be deferred to + the first call of inflate (if the decompression does not complete on the + first call). If zalloc and zfree are set to Z_NULL, inflateInit updates + them to use default allocation functions. inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the version assumed by the caller, or Z_STREAM_ERROR if the parameters are invalid, such as a null pointer to the structure. msg is set to null if - there is no error message. inflateInit does not perform any decompression - apart from possibly reading the zlib header if present: actual decompression - will be done by inflate(). (So next_in and avail_in may be modified, but - next_out and avail_out are unused and unchanged.) The current implementation - of inflateInit() does not process any header information -- that is deferred - until inflate() is called. + there is no error message. inflateInit does not perform any decompression. + Actual decompression will be done by inflate(). So next_in, and avail_in, + next_out, and avail_out are unused and unchanged. The current + implementation of inflateInit() does not process any header information -- + that is deferred until inflate() is called. */ @@ -401,17 +409,20 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); - Decompress more input starting at next_in and update next_in and avail_in accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing will - resume at this point for the next call of inflate(). + enough room in the output buffer), then next_in and avail_in are updated + accordingly, and processing will resume at this point for the next call of + inflate(). - - Provide more output starting at next_out and update next_out and avail_out + - Generate more output starting at next_out and update next_out and avail_out accordingly. inflate() provides as much output as possible, until there is no more input data or no more space in the output buffer (see below about the flush parameter). Before the call of inflate(), the application should ensure that at least one of the actions is possible, by providing more input and/or consuming more - output, and updating the next_* and avail_* values accordingly. The + output, and updating the next_* and avail_* values accordingly. If the + caller of inflate() does not provide both available input and available + output space, it is possible that there will be no progress made. The application can consume the uncompressed output when it wants, for example when the output buffer is full (avail_out == 0), or after each call of inflate(). If inflate returns Z_OK and with zero avail_out, it must be @@ -428,7 +439,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the + To assist in this, on return inflate() always sets strm->data_type to the number of unused bits in the last byte taken from strm->next_in, plus 64 if inflate() is currently decoding the last block in the deflate stream, plus 128 if inflate() returned immediately after decoding an end-of-block code or @@ -454,7 +465,7 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); this case all pending input is processed and all pending output is flushed; avail_out must be large enough to hold all of the uncompressed data for the operation to complete. (The size of the uncompressed data may have been - saved by the compressor for this purpose.) The use of Z_FINISH is not + saved by the compressor for this purpose.) The use of Z_FINISH is not required to perform an inflation in one step. However it may be used to inform inflate that a faster approach can be used for the single inflate() call. Z_FINISH also informs inflate to not maintain a sliding window if the @@ -476,32 +487,33 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the Adler-32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 + below. At the end of the stream, inflate() checks that its computed Adler-32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. inflate() can decompress and check either zlib-wrapped or gzip-wrapped deflate data. The header type is detected automatically, if requested when initializing with inflateInit2(). Any information contained in the gzip - header is not retained, so applications that need that information should - instead use raw inflate, see inflateInit2() below, or inflateBack() and - perform their own processing of the gzip header and trailer. When processing + header is not retained unless inflateGetHeader() is used. When processing gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output - producted so far. The CRC-32 is checked against the gzip trailer. + produced so far. The CRC-32 is checked against the gzip trailer, as is the + uncompressed length, modulo 2^32. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has been reached and all uncompressed output has been produced, Z_NEED_DICT if a preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + value, in which case strm->msg points to a string with a more specific + error), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL, or the state was inadvertently written over + by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR + if no progress was possible or if there was not enough room in the output + buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to continue decompressing. If Z_DATA_ERROR is returned, the application may then call inflateSync() to look for a good compression block if a partial - recovery of the data is desired. + recovery of the data is to be attempted. */ @@ -511,9 +523,8 @@ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); This function discards any unprocessed input and does not flush any pending output. - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). + inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state + was inconsistent. */ @@ -544,16 +555,29 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. + For the current implementation of deflate(), a windowBits value of 8 (a + window size of 256 bytes) is not supported. As a result, a request for 8 + will result in 9 (a 512-byte window). In that case, providing 8 to + inflateInit2() will result in an error when the zlib header with 9 is + checked against the initialization of inflate(). The remedy is to not use 8 + with deflateInit2() with this initialization, or at least in that case use 9 + with inflateInit2(). + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. + with no zlib header or trailer, and will not compute a check value. windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper. The gzip header will have no file name, no extra data, no comment, no modification time (set to zero), no - header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. + header crc, and the operating system will be set to the appropriate value, + if the operating system was determined at compile time. If a gzip stream is + being written, strm->adler is a CRC-32 instead of an Adler-32. + + For raw deflate or gzip encoding, a request for a 256-byte window is + rejected as invalid, since only the zlib header provides a means of + transmitting the window size to the decompressor. The memLevel parameter specifies how much memory should be allocated for the internal compression state. memLevel=1 uses minimum memory but is @@ -614,12 +638,12 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, addition, the current implementation of deflate will use at most the window size minus 262 bytes of the provided dictionary. - Upon return of this function, strm->adler is set to the adler32 value + Upon return of this function, strm->adler is set to the Adler-32 value of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value + which dictionary has been used by the compressor. (The Adler-32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. + Adler-32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is @@ -628,6 +652,28 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, not perform any compression: this will be done by deflate(). */ +ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by deflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If deflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + deflateGetDictionary() may return a length less than the window size, even + when more than the window size in input has been provided. It may return up + to 258 bytes less in that case, due to how zlib's implementation of deflate + manages the sliding window and lookahead for matches, where matches can be + up to 258 bytes long. If the application needs the last window-size bytes of + input, then that would need to be saved by the application outside of zlib. + + deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, z_streamp source)); /* @@ -648,10 +694,10 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. The - stream will keep the same compression level and any other attributes that - may have been set by deflateInit2. + This function is equivalent to deflateEnd followed by deflateInit, but + does not free and reallocate the internal compression state. The stream + will leave the compression level and any other attributes that may have been + set unchanged. deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL). @@ -662,20 +708,36 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, int strategy)); /* Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be + interpretation of level and strategy is as in deflateInit2(). This can be used to switch between compression and straight copy of the input data, or to switch to a different kind of input data requiring a different strategy. - If the compression level is changed, the input available so far is - compressed with the old level (and may be flushed); the new level will take - effect only at the next call of deflate(). + If the compression approach (which is a function of the level) or the + strategy is changed, and if any input has been consumed in a previous + deflate() call, then the input available so far is compressed with the old + level and strategy using deflate(strm, Z_BLOCK). There are three approaches + for the compression levels 0, 1..3, and 4..9 respectively. The new level + and strategy will take effect at the next call of deflate(). - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to be - compressed and flushed. In particular, strm->avail_out must be non-zero. + If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does + not have enough output space to complete, then the parameter change will not + take effect. In this case, deflateParams() can be called again with the + same parameters and more output space to try again. - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if - strm->avail_out was zero. + In order to assure a change in the parameters on the first try, the + deflate stream should be flushed using deflate() with Z_BLOCK or other flush + request until strm.avail_out is not zero, before calling deflateParams(). + Then no more input data should be provided before the deflateParams() call. + If this is done, the old level and strategy will be applied to the data + compressed before deflateParams(), and the new level and strategy will be + applied to the the data compressed after deflateParams(). + + deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream + state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if + there was not enough output space to complete the compression of the + available input data before a change in the strategy or approach. Note that + in the case of a Z_BUF_ERROR, the parameters are not changed. A return + value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be + retried with more output space. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, @@ -793,7 +855,7 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, is for use with other formats that use the deflate compressed data format such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to + recommended that a check value such as an Adler-32 or a CRC-32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. @@ -802,7 +864,10 @@ ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a - crc32 instead of an adler32. + CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see + below), inflate() will not automatically decode concatenated gzip streams. + inflate() will return Z_STREAM_END at the end of the gzip stream. The state + would need to be reset to continue decoding a subsequent gzip stream. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the @@ -823,7 +888,7 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, Initializes the decompression dictionary from the given uncompressed byte sequence. This function must be called immediately after a call of inflate, if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. + can be determined from the Adler-32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called at any time to set the dictionary. If the provided dictionary is smaller than the @@ -834,7 +899,7 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not + expected one (incorrect Adler-32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ @@ -892,7 +957,7 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. The + but does not free and reallocate the internal decompression state. The stream will keep attributes that may have been set by inflateInit2. inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source @@ -904,7 +969,9 @@ ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, /* This function is the same as inflateReset, but it also permits changing the wrap and window size requests. The windowBits parameter is interpreted - the same as it is for inflateInit2. + the same as it is for inflateInit2. If the window size is changed, then the + memory allocated for the window is freed, and the window will be reallocated + by inflate() if needed. inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent (such as zalloc or state being Z_NULL), or if @@ -956,7 +1023,7 @@ ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); location in the input stream can be determined from avail_in and data_type as noted in the description for the Z_BLOCK flush parameter for inflate. - inflateMark returns the value noted above or -1 << 16 if the provided + inflateMark returns the value noted above, or -65536 if the provided source stream state was inconsistent. */ @@ -1048,9 +1115,9 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the header and process the trailer on its own, hence this routine expects only - the raw deflate stream to decompress. This is different from the normal - behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. + the raw deflate stream to decompress. This is different from the default + behavior of inflate(), which expects a zlib header and trailer around the + deflate stream. inflateBack() uses two subroutines supplied by the caller that are then called by inflateBack() for input and output. inflateBack() calls those @@ -1059,12 +1126,12 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, parameters and return types are defined above in the in_func and out_func typedefs. inflateBack() will call in(in_desc, &buf) which should return the number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to + there is no input available, in() must return zero -- buf is ignored in that + case -- and inflateBack() will return a buffer error. inflateBack() will + call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. + out() should return zero on success, or non-zero on failure. If out() + returns non-zero, inflateBack() will return with an error. Neither in() nor + out() are permitted to change the contents of the window provided to inflateBackInit(), which is also the buffer that out() uses to write from. The length written by out() will be at most the window size. Any non-zero amount of input may be provided by in(). @@ -1092,7 +1159,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, using strm->next_in which will be Z_NULL only if in() returned an error. If strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning non-zero. (in() will always be called before out(), so strm->next_in is - assured to be defined if out() returns non-zero.) Note that inflateBack() + assured to be defined if out() returns non-zero.) Note that inflateBack() cannot return Z_OK. */ @@ -1114,7 +1181,7 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); 7.6: size of z_off_t Compiler, assembler, and debug options: - 8: DEBUG + 8: ZLIB_DEBUG 9: ASMV or ASMINF -- use ASM code 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention 11: 0 (reserved) @@ -1164,7 +1231,8 @@ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, the byte length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. + compressed data. compress() is equivalent to compress2() with a level + parameter of Z_DEFAULT_COMPRESSION. compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output @@ -1180,7 +1248,7 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. + compressed data. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer, @@ -1203,7 +1271,7 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, uncompressed data. (The size of the uncompressed data must have been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen - is the actual size of the uncompressed buffer. + is the actual size of the uncompressed data. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output @@ -1212,6 +1280,14 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, buffer with the uncompressed data up to that point. */ +ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong *sourceLen)); +/* + Same as uncompress, except that sourceLen is a pointer, where the + length of the source is *sourceLen. On return, *sourceLen is the number of + source bytes consumed. +*/ + /* gzip file access functions */ /* @@ -1290,10 +1366,9 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); default buffer size is 8192 bytes. This function must be called after gzopen() or gzdopen(), and before any other calls that read or write the file. The buffer memory allocation is always deferred to the first read or - write. Two buffers are allocated, either both of the specified size when - writing, or one of the specified size and the other twice that size when - reading. A larger buffer size of, for example, 64K or 128K bytes will - noticeably increase the speed of decompression (reading). + write. Three times that size in buffer space is allocated. A larger buffer + size of, for example, 64K or 128K bytes will noticeably increase the speed + of decompression (reading). The new buffer size also affects the maximum length for gzprintf(). @@ -1304,10 +1379,12 @@ ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. + of deflateInit2 for the meaning of these parameters. Previously provided + data is flushed before the parameter change. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. + gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not + opened for writing, Z_ERRNO if there is an error writing the flushed data, + or Z_MEM_ERROR if there is a memory allocation error. */ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); @@ -1335,7 +1412,35 @@ ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); case. gzread returns the number of uncompressed bytes actually read, less than - len for end of file, or -1 for error. + len for end of file, or -1 for error. If len is too large to fit in an int, + then nothing is read, -1 is returned, and the error state is set to + Z_STREAM_ERROR. +*/ + +ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems, + gzFile file)); +/* + Read up to nitems items of size size from file to buf, otherwise operating + as gzread() does. This duplicates the interface of stdio's fread(), with + size_t request and return types. If the library defines size_t, then + z_size_t is identical to size_t. If not, then z_size_t is an unsigned + integer type that can contain a pointer. + + gzfread() returns the number of full items read of size size, or zero if + the end of the file was reached and a full item could not be read, or if + there was an error. gzerror() must be consulted if zero is returned in + order to determine if there was an error. If the multiplication of size and + nitems overflows, i.e. the product does not fit in a z_size_t, then nothing + is read, zero is returned, and the error state is set to Z_STREAM_ERROR. + + In the event that the end of file is reached and only a partial item is + available at the end, i.e. the remaining uncompressed data length is not a + multiple of size, then the final partial item is nevetheless read into buf + and the end-of-file flag is set. The length of the partial item read is not + provided, but could be inferred from the result of gztell(). This behavior + is the same as the behavior of fread() implementations in common libraries, + but it prevents the direct use of gzfread() to read a concurrently written + file, reseting and retrying on end-of-file, when size is not 1. */ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, @@ -1346,19 +1451,33 @@ ZEXTERN int ZEXPORT gzwrite OF((gzFile file, error. */ +ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size, + z_size_t nitems, gzFile file)); +/* + gzfwrite() writes nitems items of size size from buf to file, duplicating + the interface of stdio's fwrite(), with size_t request and return types. If + the library defines size_t, then z_size_t is identical to size_t. If not, + then z_size_t is an unsigned integer type that can contain a pointer. + + gzfwrite() returns the number of full items written of size size, or zero + if there was an error. If the multiplication of size and nitems overflows, + i.e. the product does not fit in a z_size_t, then nothing is written, zero + is returned, and the error state is set to Z_STREAM_ERROR. +*/ + ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); /* Converts, formats, and writes the arguments to the compressed file under control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written, or 0 in case of error. The number of - uncompressed bytes written is limited to 8191, or one less than the buffer - size given to gzbuffer(). The caller should assure that this limit is not - exceeded. If it is exceeded, then gzprintf() will return an error (0) with - nothing written. In this case, there may also be a buffer overflow with - unpredictable consequences, which is possible only if zlib was compiled with - the insecure functions sprintf() or vsprintf() because the secure snprintf() - or vsnprintf() functions were not available. This can be determined using - zlibCompileFlags(). + uncompressed bytes actually written, or a negative zlib error code in case + of error. The number of uncompressed bytes written is limited to 8191, or + one less than the buffer size given to gzbuffer(). The caller should assure + that this limit is not exceeded. If it is exceeded, then gzprintf() will + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. + This can be determined using zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); @@ -1418,7 +1537,7 @@ ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); If the flush parameter is Z_FINISH, the remaining data is written and the gzip stream is completed in the output. If gzwrite() is called again, a new gzip stream will be started in the output. gzread() is able to read such - concatented gzip streams. + concatenated gzip streams. gzflush should be called only when strictly necessary because it will degrade compression if called too often. @@ -1572,7 +1691,7 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); return the updated checksum. If buf is Z_NULL, this function returns the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed much faster. Usage example: @@ -1585,6 +1704,12 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ +ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as adler32(), but with a size_t length. +*/ + /* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); @@ -1614,6 +1739,12 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ +ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf, + z_size_t len)); +/* + Same as crc32(), but with a size_t length. +*/ + /* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); @@ -1644,19 +1775,35 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ - (int)sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, (int)sizeof(z_stream)) +#ifdef Z_PREFIX_SET +# define z_deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define z_inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define z_inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#else +# define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +# define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +# define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) +#endif #ifndef Z_SOLO @@ -1676,10 +1823,10 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ #ifdef Z_PREFIX_SET # undef z_gzgetc # define z_gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) #else # define gzgetc(g) \ - ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g)) #endif /* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or @@ -1737,19 +1884,16 @@ ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ #endif /* !Z_SOLO */ -/* hack for buggy compilers */ -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; -#endif - /* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int)); +ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp)); ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); -#if defined(_WIN32) && !defined(Z_SOLO) +#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO) ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, const char *mode)); #endif diff --git a/third_party/zlib/zutil.c b/third_party/zlib/zutil.c index 23d2ebef..a76c6b0c 100644 --- a/third_party/zlib/zutil.c +++ b/third_party/zlib/zutil.c @@ -1,5 +1,5 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly. + * Copyright (C) 1995-2017 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -10,21 +10,18 @@ # include "gzguts.h" #endif -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - z_const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; + (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */ + (z_const char *)"stream end", /* Z_STREAM_END 1 */ + (z_const char *)"", /* Z_OK 0 */ + (z_const char *)"file error", /* Z_ERRNO (-1) */ + (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */ + (z_const char *)"data error", /* Z_DATA_ERROR (-3) */ + (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */ + (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */ + (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */ + (z_const char *)"" +}; const char * ZEXPORT zlibVersion() @@ -61,7 +58,7 @@ uLong ZEXPORT zlibCompileFlags() case 8: flags += 2 << 6; break; default: flags += 3 << 6; } -#ifdef DEBUG +#ifdef ZLIB_DEBUG flags += 1 << 8; #endif #if defined(ASMV) || defined(ASMINF) @@ -115,8 +112,8 @@ uLong ZEXPORT zlibCompileFlags() return flags; } -#ifdef DEBUG - +#ifdef ZLIB_DEBUG +#include <stdlib.h> # ifndef verbose # define verbose 0 # endif @@ -219,9 +216,11 @@ local ptr_table table[MAX_PTR]; voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) { - voidpf buf = opaque; /* just to make some compilers happy */ + voidpf buf; ulg bsize = (ulg)items*size; + (void)opaque; + /* If we allocate less than 65520 bytes, we assume that farmalloc * will return a usable pointer which doesn't have to be normalized. */ @@ -244,6 +243,9 @@ voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size) void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { int n; + + (void)opaque; + if (*(ush*)&ptr != 0) { /* object < 64K */ farfree(ptr); return; @@ -259,7 +261,6 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) next_ptr--; return; } - ptr = opaque; /* just to make some compilers happy */ Assert(0, "zcfree: ptr not found"); } @@ -278,13 +279,13 @@ void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size) { - if (opaque) opaque = 0; /* to make compiler happy */ + (void)opaque; return _halloc((long)items, size); } void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr) { - if (opaque) opaque = 0; /* to make compiler happy */ + (void)opaque; _hfree(ptr); } @@ -306,7 +307,7 @@ voidpf ZLIB_INTERNAL zcalloc (opaque, items, size) unsigned items; unsigned size; { - if (opaque) items += size - size; /* make compiler happy */ + (void)opaque; return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : (voidpf)calloc(items, size); } @@ -315,8 +316,8 @@ void ZLIB_INTERNAL zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { + (void)opaque; free(ptr); - if (opaque) return; /* make compiler happy */ } #endif /* MY_ZCALLOC */ diff --git a/third_party/zlib/zutil.h b/third_party/zlib/zutil.h index 24ab06b1..b079ea6a 100644 --- a/third_party/zlib/zutil.h +++ b/third_party/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2013 Jean-loup Gailly. + * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -36,7 +36,9 @@ #ifndef local # define local static #endif -/* compile with -Dlocal if your debugger can't find static symbols */ +/* since "static" is used to mean two completely different things in C, we + define "local" for the non-static meaning of "static", for readability + (compile with -Dlocal if your debugger can't find static symbols) */ typedef unsigned char uch; typedef uch FAR uchf; @@ -98,28 +100,38 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif #ifdef AMIGA -# define OS_CODE 0x01 +# define OS_CODE 1 #endif #if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 +# define OS_CODE 2 # define F_OPEN(name, mode) \ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") #endif +#ifdef __370__ +# if __TARGET_LIB__ < 0x20000000 +# define OS_CODE 4 +# elif __TARGET_LIB__ < 0x40000000 +# define OS_CODE 11 +# else +# define OS_CODE 8 +# endif +#endif + #if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 +# define OS_CODE 5 #endif #ifdef OS2 -# define OS_CODE 0x06 +# define OS_CODE 6 # if defined(M_I86) && !defined(Z_SOLO) # include <malloc.h> # endif #endif #if defined(MACOS) || defined(TARGET_OS_MAC) -# define OS_CODE 0x07 +# define OS_CODE 7 # ifndef Z_SOLO # if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os # include <unix.h> /* for fdopen */ @@ -131,18 +143,24 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif -#ifdef TOPS20 -# define OS_CODE 0x0a +#ifdef __acorn +# define OS_CODE 13 #endif -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif +#if defined(WIN32) && !defined(__CYGWIN__) +# define OS_CODE 10 #endif -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f +#ifdef _BEOS_ +# define OS_CODE 16 +#endif + +#ifdef __TOS_OS400__ +# define OS_CODE 18 +#endif + +#ifdef __APPLE__ +# define OS_CODE 19 #endif #if defined(_BEOS_) || defined(RISCOS) @@ -177,7 +195,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ /* common defaults */ #ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ +# define OS_CODE 3 /* assume Unix */ #endif #ifndef F_OPEN @@ -216,7 +234,7 @@ extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif /* Diagnostic functions */ -#ifdef DEBUG +#ifdef ZLIB_DEBUG # include <stdio.h> extern int ZLIB_INTERNAL z_verbose; extern void ZLIB_INTERNAL z_error OF((char *m)); From 189f16fcc45e8190bcc0b134f3faf20fc2e7567c Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Thu, 30 Aug 2018 18:41:49 +0200 Subject: [PATCH 41/98] Add stat constants in plugins (#522) * Add stat constants in plugins * Add missing include in dodstats.sma * Fix misplaced HIT_RIGHTLEG constant --- plugins/cstrike/csstats.sma | 4 +- plugins/cstrike/stats_logging.sma | 6 +- plugins/cstrike/statsx.sma | 173 ++++++++++++++---------------- plugins/dod/dodstats.sma | 11 +- plugins/dod/stats.sma | 66 ++++++------ plugins/dod/stats_logging.sma | 6 +- plugins/tfc/stats.sma | 50 ++++----- plugins/tfc/stats_logging.sma | 6 +- plugins/tfc/tfcstats.sma | 4 +- plugins/ts/stats.sma | 50 ++++----- plugins/ts/stats_logging.sma | 10 +- plugins/ts/tsstats.sma | 4 +- 12 files changed, 191 insertions(+), 199 deletions(-) diff --git a/plugins/cstrike/csstats.sma b/plugins/cstrike/csstats.sma index 5c5cf4f2..904b68ac 100755 --- a/plugins/cstrike/csstats.sma +++ b/plugins/cstrike/csstats.sma @@ -33,5 +33,5 @@ * Returning cellmin as value in get_score function * makes that rank won't be saved. */ -public get_score(stats[11], body[8]) - return stats[0] - stats[1] - stats[3] // kills - deaths - teamkills +public get_score(stats[11], body[MAX_BODYHITS]) + return stats[STATSX_KILLS] - stats[STATSX_DEATHS] - stats[STATSX_TEAMKILLS] // kills - deaths - teamkills diff --git a/plugins/cstrike/stats_logging.sma b/plugins/cstrike/stats_logging.sma index 02c5bbeb..44241512 100755 --- a/plugins/cstrike/stats_logging.sma +++ b/plugins/cstrike/stats_logging.sma @@ -37,7 +37,7 @@ public client_disconnected(id) remove_task(id) - new szTeam[16], szName[MAX_NAME_LENGTH], szAuthid[32], iStats[8], iHits[8], szWeapon[24] + new szTeam[16], szName[MAX_NAME_LENGTH], szAuthid[32], iStats[STATSX_MAX_STATS], iHits[MAX_BODYHITS], szWeapon[24] new iUserid = get_user_userid(id) new _max = xmod_get_maxweapons() @@ -52,9 +52,9 @@ public client_disconnected(id) xmod_get_wpnname(i, szWeapon, charsmax(szWeapon)) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats^" (weapon ^"%s^") (shots ^"%d^") (hits ^"%d^") (kills ^"%d^") (headshots ^"%d^") (tks ^"%d^") (damage ^"%d^") (deaths ^"%d^")", - szName, iUserid, szAuthid, szTeam, szWeapon, iStats[4], iStats[5], iStats[0], iStats[2], iStats[3], iStats[6], iStats[1]) + szName, iUserid, szAuthid, szTeam, szWeapon, iStats[STATSX_SHOTS], iStats[STATSX_HITS], iStats[STATSX_KILLS], iStats[STATSX_HEADSHOTS], iStats[STATSX_TEAMKILLS], iStats[STATSX_DAMAGE], iStats[STATSX_DEATHS]) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats2^" (weapon ^"%s^") (head ^"%d^") (chest ^"%d^") (stomach ^"%d^") (leftarm ^"%d^") (rightarm ^"%d^") (leftleg ^"%d^") (rightleg ^"%d^")", - szName, iUserid, szAuthid, szTeam, szWeapon, iHits[1], iHits[2], iHits[3], iHits[4], iHits[5], iHits[6], iHits[7]) + szName, iUserid, szAuthid, szTeam, szWeapon, iHits[HIT_HEAD], iHits[HIT_CHEST], iHits[HIT_STOMACH], iHits[HIT_LEFTARM], iHits[HIT_RIGHTARM], iHits[HIT_LEFTLEG], iHits[HIT_RIGHTLEG]) } } diff --git a/plugins/cstrike/statsx.sma b/plugins/cstrike/statsx.sma index bfe8e433..f8a2df71 100755 --- a/plugins/cstrike/statsx.sma +++ b/plugins/cstrike/statsx.sma @@ -78,17 +78,8 @@ public SpecRankInfo = 0 // displays rank info when spectating #define MAX_TEXT_LENGTH 255 #define MAX_BUFFER_LENGTH 2047 -// User stats parms id -#define STATS_KILLS 0 -#define STATS_DEATHS 1 -#define STATS_HS 2 -#define STATS_TKS 3 -#define STATS_SHOTS 4 -#define STATS_HITS 5 -#define STATS_DAMAGE 6 - // Global player flags. -new BODY_PART[8][] = +new BODY_PART[MAX_BODYHITS][] = { "WHOLEBODY", "HEAD", @@ -140,14 +131,14 @@ new g_pHudFreezeLimit = 0 new Float:g_fStartGame = 0.0 new g_izTeamScore[MAX_TEAMS] = {0, ...} new g_izTeamEventScore[MAX_TEAMS] = {0, ...} -new g_izTeamRndStats[MAX_TEAMS][8] -new g_izTeamGameStats[MAX_TEAMS][8] +new g_izTeamRndStats[MAX_TEAMS][STATSX_MAX_STATS] +new g_izTeamGameStats[MAX_TEAMS][STATSX_MAX_STATS] new g_izUserUserID[MAX_PLAYERS + 1] = {0, ...} new g_izUserAttackerDistance[MAX_PLAYERS + 1] = {0, ...} new g_izUserVictimDistance[MAX_PLAYERS + 1][MAX_PLAYERS + 1] new g_izUserRndName[MAX_PLAYERS + 1][MAX_NAME_LENGTH] -new g_izUserRndStats[MAX_PLAYERS + 1][8] -new g_izUserGameStats[MAX_PLAYERS + 1][8] +new g_izUserRndStats[MAX_PLAYERS + 1][STATSX_MAX_STATS] +new g_izUserGameStats[MAX_PLAYERS + 1][STATSX_MAX_STATS] // Common buffer to improve performance, as Small always zero-initializes all vars new g_sBuffer[MAX_BUFFER_LENGTH + 1] = "" @@ -291,14 +282,14 @@ public cmdHudTest(id) #endif // Stats formulas -Float:accuracy(izStats[8]) +Float:accuracy(izStats[STATSX_MAX_STATS]) { - return izStats[STATS_SHOTS] ? (100.0 * float(izStats[STATS_HITS]) / float(izStats[STATS_SHOTS])) : (0.0); + return izStats[STATSX_SHOTS] ? (100.0 * float(izStats[STATSX_HITS]) / float(izStats[STATSX_SHOTS])) : (0.0); } -Float:effec(izStats[8]) +Float:effec(izStats[STATSX_MAX_STATS]) { - return izStats[STATS_KILLS] ? (100.0 * float(izStats[STATS_KILLS]) / float(izStats[STATS_KILLS] + izStats[STATS_DEATHS])) : (0.0); + return izStats[STATSX_KILLS] ? (100.0 * float(izStats[STATSX_KILLS]) / float(izStats[STATSX_KILLS] + izStats[STATSX_DEATHS])) : (0.0); } // Distance formula (metric) @@ -332,7 +323,7 @@ get_config_cvars() // Get and format attackers header and list. get_attackers(id, sBuffer[MAX_BUFFER_LENGTH + 1]) { - new izStats[8], izBody[8] + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS] new iAttacker new iFound, iLen @@ -342,13 +333,13 @@ get_attackers(id, sBuffer[MAX_BUFFER_LENGTH + 1]) // Get and format header. Add killing attacker statistics if user is dead. // Make sure shots is greater than zero or division by zero will occur. // To print a '%', 4 of them must done in a row. - izStats[STATS_SHOTS] = 0 + izStats[STATSX_SHOTS] = 0 iAttacker = g_izKilled[id][KILLED_KILLER_ID] if (iAttacker) get_user_astats(id, iAttacker, izStats, izBody) - if (izStats[STATS_SHOTS] && ShowFullStats) + if (izStats[STATSX_SHOTS] && ShowFullStats) { get_user_name(iAttacker, t_sName, charsmax(t_sName)) iLen = formatex(sBuffer, charsmax(sBuffer), "%L -- %s -- %0.2f%% %L:^n", id, "ATTACKERS", t_sName, accuracy(izStats), id, "ACC") @@ -364,20 +355,20 @@ get_attackers(id, sBuffer[MAX_BUFFER_LENGTH + 1]) iFound = 1 get_user_name(iAttacker, t_sName, charsmax(t_sName)) - if (izStats[STATS_KILLS]) + if (izStats[STATSX_KILLS]) { if (!ShowDistHS) - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S", - izStats[STATS_DAMAGE], id, "DMG", t_sWpn) - else if (izStats[STATS_HS]) - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S", - izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id])) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", + izStats[STATSX_DAMAGE], id, "DMG", t_sWpn) + else if (izStats[STATSX_HEADSHOTS]) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", + izStats[STATSX_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id])) else - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S", - izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id])) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", + izStats[STATSX_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id])) } else - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG") + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", izStats[STATSX_DAMAGE], id, "DMG") } } @@ -390,7 +381,7 @@ get_attackers(id, sBuffer[MAX_BUFFER_LENGTH + 1]) // Get and format victims header and list get_victims(id, sBuffer[MAX_BUFFER_LENGTH + 1]) { - new izStats[8], izBody[8] + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS] new iVictim new iFound, iLen @@ -400,10 +391,10 @@ get_victims(id, sBuffer[MAX_BUFFER_LENGTH + 1]) // Get and format header. // Make sure shots is greater than zero or division by zero will occur. // To print a '%', 4 of them must done in a row. - izStats[STATS_SHOTS] = 0 + izStats[STATSX_SHOTS] = 0 get_user_vstats(id, 0, izStats, izBody) - if (izStats[STATS_SHOTS]) + if (izStats[STATSX_SHOTS]) iLen = formatex(sBuffer, charsmax(sBuffer), "%L -- %0.2f%% %L:^n", id, "VICTIMS", accuracy(izStats), id, "ACC") else iLen = formatex(sBuffer, charsmax(sBuffer), "%L:^n", id, "VICTIMS") @@ -415,20 +406,20 @@ get_victims(id, sBuffer[MAX_BUFFER_LENGTH + 1]) iFound = 1 get_user_name(iVictim, t_sName, charsmax(t_sName)) - if (izStats[STATS_DEATHS]) + if (izStats[STATSX_DEATHS]) { if (!ShowDistHS) - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S", - izStats[STATS_DAMAGE], id, "DMG", t_sWpn) - else if (izStats[STATS_HS]) - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S", - izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim])) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", + izStats[STATSX_DAMAGE], id, "DMG", t_sWpn) + else if (izStats[STATSX_HEADSHOTS]) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", + izStats[STATSX_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim])) else - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S", - izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim])) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", + izStats[STATSX_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim])) } else - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG") + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATSX_HITS], id, "HIT_S", izStats[STATSX_DAMAGE], id, "DMG") } } @@ -448,23 +439,23 @@ get_kill_info(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1]) if (iKiller && iKiller != id) { - new izAStats[8], izABody[8], izVStats[8], iaVBody[8] + new izAStats[STATSX_MAX_STATS], izABody[MAX_BODYHITS], izVStats[STATSX_MAX_STATS], iaVBody[MAX_BODYHITS] iFound = 1 get_user_name(iKiller, t_sName, charsmax(t_sName)) - izAStats[STATS_HITS] = 0 - izAStats[STATS_DAMAGE] = 0 + izAStats[STATSX_HITS] = 0 + izAStats[STATSX_DAMAGE] = 0 t_sWpn[0] = 0 get_user_astats(id, iKiller, izAStats, izABody, t_sWpn, charsmax(t_sWpn)) - izVStats[STATS_HITS] = 0 - izVStats[STATS_DAMAGE] = 0 + izVStats[STATSX_HITS] = 0 + izVStats[STATSX_DAMAGE] = 0 get_user_vstats(id, iKiller, izVStats, iaVBody) iLen = formatex(sBuffer, charsmax(sBuffer), "%L^n", id, "KILLED_YOU_DIST", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id])) - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L^n", id, "DID_DMG_HITS", izAStats[STATS_DAMAGE], izAStats[STATS_HITS], g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR]) - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L^n", id, "YOU_DID_DMG", izVStats[STATS_DAMAGE], izVStats[STATS_HITS]) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L^n", id, "DID_DMG_HITS", izAStats[STATSX_DAMAGE], izAStats[STATSX_HITS], g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR]) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L^n", id, "YOU_DID_DMG", izVStats[STATSX_DAMAGE], izVStats[STATSX_HITS]) } return iFound @@ -482,11 +473,11 @@ add_most_disruptive(id, sBuffer[MAX_BUFFER_LENGTH + 1]) // Find player. for (iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { - if (g_izUserRndStats[iPlayer][STATS_DAMAGE] >= iMaxDamage && (g_izUserRndStats[iPlayer][STATS_DAMAGE] > iMaxDamage || g_izUserRndStats[iPlayer][STATS_HS] > iMaxHeadShots)) + if (g_izUserRndStats[iPlayer][STATSX_DAMAGE] >= iMaxDamage && (g_izUserRndStats[iPlayer][STATSX_DAMAGE] > iMaxDamage || g_izUserRndStats[iPlayer][STATSX_HEADSHOTS] > iMaxHeadShots)) { iMaxDamageId = iPlayer - iMaxDamage = g_izUserRndStats[iPlayer][STATS_DAMAGE] - iMaxHeadShots = g_izUserRndStats[iPlayer][STATS_HS] + iMaxDamage = g_izUserRndStats[iPlayer][STATSX_DAMAGE] + iMaxHeadShots = g_izUserRndStats[iPlayer][STATSX_HEADSHOTS] } } @@ -499,7 +490,7 @@ add_most_disruptive(id, sBuffer[MAX_BUFFER_LENGTH + 1]) new Float:fRndAcc = accuracy(g_izUserRndStats[iPlayer]) formatex(t_sText, charsmax(t_sText), "%L: %s^n%d %L / %d %L -- %0.2f%% %L / %0.2f%% %L^n", id, "MOST_DMG", g_izUserRndName[iPlayer], - g_izUserRndStats[iPlayer][STATS_HITS], id, "HIT_S", iMaxDamage, id, "DMG", fGameEff, id, "EFF", fRndAcc, id, "ACC") + g_izUserRndStats[iPlayer][STATSX_HITS], id, "HIT_S", iMaxDamage, id, "DMG", fGameEff, id, "EFF", fRndAcc, id, "ACC") add(sBuffer, charsmax(sBuffer), t_sText) } @@ -518,11 +509,11 @@ add_best_score(id, sBuffer[MAX_BUFFER_LENGTH + 1]) // Find player for (iPlayer = 1; iPlayer <= MaxClients; iPlayer++) { - if (g_izUserRndStats[iPlayer][STATS_KILLS] >= iMaxKills && (g_izUserRndStats[iPlayer][STATS_KILLS] > iMaxKills || g_izUserRndStats[iPlayer][STATS_HS] > iMaxHeadShots)) + if (g_izUserRndStats[iPlayer][STATSX_KILLS] >= iMaxKills && (g_izUserRndStats[iPlayer][STATSX_KILLS] > iMaxKills || g_izUserRndStats[iPlayer][STATSX_HEADSHOTS] > iMaxHeadShots)) { iMaxKillsId = iPlayer - iMaxKills = g_izUserRndStats[iPlayer][STATS_KILLS] - iMaxHeadShots = g_izUserRndStats[iPlayer][STATS_HS] + iMaxKills = g_izUserRndStats[iPlayer][STATSX_KILLS] + iMaxHeadShots = g_izUserRndStats[iPlayer][STATSX_HEADSHOTS] } } @@ -582,8 +573,8 @@ save_team_chatscore(id, sBuffer[MAX_TEXT_LENGTH + 1]) // Get and format total stats. add_total_stats(id, sBuffer[MAX_BUFFER_LENGTH + 1]) { - formatex(t_sText, charsmax(t_sText), "%L: %d %L / %d hs -- %d %L / %d %L^n", id, "TOTAL", g_izUserRndStats[0][STATS_KILLS], id, "KILL_S", - g_izUserRndStats[0][STATS_HS], g_izUserRndStats[0][STATS_HITS], id, "HITS", g_izUserRndStats[0][STATS_SHOTS], id, "SHOT_S") + formatex(t_sText, charsmax(t_sText), "%L: %d %L / %d hs -- %d %L / %d %L^n", id, "TOTAL", g_izUserRndStats[0][STATSX_KILLS], id, "KILL_S", + g_izUserRndStats[0][STATSX_HEADSHOTS], g_izUserRndStats[0][STATSX_HITS], id, "HITS", g_izUserRndStats[0][STATSX_SHOTS], id, "SHOT_S") add(sBuffer, charsmax(sBuffer), t_sText) } @@ -594,12 +585,12 @@ add_attacker_hits(id, iAttacker, sBuffer[MAX_BUFFER_LENGTH + 1]) if (iAttacker && iAttacker != id) { - new izStats[8], izBody[8], iLen + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS], iLen - izStats[STATS_HITS] = 0 + izStats[STATSX_HITS] = 0 get_user_astats(id, iAttacker, izStats, izBody) - if (izStats[STATS_HITS]) + if (izStats[STATSX_HITS]) { iFound = 1 iLen = strlen(sBuffer) @@ -627,18 +618,18 @@ format_kill_ainfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1]) if (iKiller && iKiller != id) { - new izStats[8], izBody[8] + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS] new iLen iFound = 1 get_user_name(iKiller, t_sName, charsmax(t_sName)) - izStats[STATS_HITS] = 0 + izStats[STATSX_HITS] = 0 get_user_astats(id, iKiller, izStats, izBody, t_sWpn, charsmax(t_sWpn)) iLen = formatex(sBuffer, charsmax(sBuffer), "%L (%dhp, %dap) >>", id, "KILLED_BY_WITH", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id]), g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR]) - if (izStats[STATS_HITS]) + if (izStats[STATSX_HITS]) { for (new i = 1; i < sizeof(izBody); i++) { @@ -661,24 +652,24 @@ format_kill_ainfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1]) format_kill_vinfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1]) { new iFound = 0 - new izStats[8] - new izBody[8] + new izStats[STATSX_MAX_STATS] + new izBody[MAX_BODYHITS] new iLen - izStats[STATS_HITS] = 0 - izStats[STATS_DAMAGE] = 0 + izStats[STATSX_HITS] = 0 + izStats[STATSX_DAMAGE] = 0 get_user_vstats(id, iKiller, izStats, izBody) if (iKiller && iKiller != id) { iFound = 1 get_user_name(iKiller, t_sName, charsmax(t_sName)) - iLen = formatex(sBuffer, charsmax(sBuffer), "%L >>", id, "YOU_HIT", t_sName, izStats[STATS_HITS], izStats[STATS_DAMAGE]) + iLen = formatex(sBuffer, charsmax(sBuffer), "%L >>", id, "YOU_HIT", t_sName, izStats[STATSX_HITS], izStats[STATSX_DAMAGE]) } else - iLen = formatex(sBuffer, charsmax(sBuffer), "%L >>", id, "LAST_RES", izStats[STATS_HITS], izStats[STATS_DAMAGE]) + iLen = formatex(sBuffer, charsmax(sBuffer), "%L >>", id, "LAST_RES", izStats[STATSX_HITS], izStats[STATSX_DAMAGE]) - if (izStats[STATS_HITS]) + if (izStats[STATSX_HITS]) { for (new i = 1; i < sizeof(izBody); i++) { @@ -698,7 +689,7 @@ format_kill_vinfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1]) format_top15(id, sBuffer[MAX_BUFFER_LENGTH + 1]) { new iMax = get_statsnum() - new izStats[8], izBody[8] + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS] new iLen = 0 if (iMax > 15) @@ -724,16 +715,16 @@ format_top15(id, sBuffer[MAX_BUFFER_LENGTH + 1]) get_stats(i, izStats, izBody, t_sName, charsmax(t_sName)) replace_string(t_sName, charsmax(t_sName), "<", "[") replace_string(t_sName, charsmax(t_sName), ">", "]") - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%2d %-22.22s %6d %6d %6d %6d %4d %3.0f%% %3.0f%%^n", i + 1, t_sName, izStats[STATS_KILLS], - izStats[STATS_DEATHS], izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_HS], effec(izStats), accuracy(izStats)) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%2d %-22.22s %6d %6d %6d %6d %4d %3.0f%% %3.0f%%^n", i + 1, t_sName, izStats[STATSX_KILLS], + izStats[STATSX_DEATHS], izStats[STATSX_HITS], izStats[STATSX_SHOTS], izStats[STATSX_HEADSHOTS], effec(izStats), accuracy(izStats)) } } // Get and format rank stats. format_rankstats(id, sBuffer[MAX_BUFFER_LENGTH + 1], iMyId = 0) { - new izStats[8] = {0, ...} - new izBody[8] + new izStats[STATSX_MAX_STATS] = {0, ...} + new izBody[MAX_BODYHITS] new iRankPos, iLen new lKills[16], lDeaths[16], lHits[16], lShots[16], lDamage[16], lEff[16], lAcc[16] @@ -752,10 +743,10 @@ format_rankstats(id, sBuffer[MAX_BUFFER_LENGTH + 1], iMyId = 0) iLen = formatex(sBuffer, charsmax(sBuffer), "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>") iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L %L^n^n", id, (!iMyId || iMyId == id) ? "YOUR" : "PLAYERS", id, "RANK_IS", iRankPos, get_statsnum()) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%6s: %d (%d with hs)^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %0.2f%%^n%6s: %0.2f%%^n^n", - lKills, izStats[STATS_KILLS], izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS], - lDamage, izStats[STATS_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats)) + lKills, izStats[STATSX_KILLS], izStats[STATSX_HEADSHOTS], lDeaths, izStats[STATSX_DEATHS], lHits, izStats[STATSX_HITS], lShots, izStats[STATSX_SHOTS], + lDamage, izStats[STATSX_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats)) - new L_BODY_PART[8][32] + new L_BODY_PART[MAX_BODYHITS][32] for (new i = 1; i < sizeof(L_BODY_PART); i++) { @@ -763,15 +754,15 @@ format_rankstats(id, sBuffer[MAX_BUFFER_LENGTH + 1], iMyId = 0) } iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%10s:^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d", "HITS", - L_BODY_PART[1], izBody[1], L_BODY_PART[2], izBody[2], L_BODY_PART[3], izBody[3], L_BODY_PART[4], izBody[4], L_BODY_PART[5], - izBody[5], L_BODY_PART[6], izBody[6], L_BODY_PART[7], izBody[7]) + L_BODY_PART[HIT_HEAD], izBody[HIT_HEAD], L_BODY_PART[HIT_CHEST], izBody[HIT_CHEST], L_BODY_PART[HIT_STOMACH], izBody[HIT_STOMACH], L_BODY_PART[HIT_LEFTARM], izBody[HIT_LEFTARM], L_BODY_PART[HIT_RIGHTARM], + izBody[HIT_RIGHTARM], L_BODY_PART[HIT_LEFTLEG], izBody[HIT_LEFTLEG], L_BODY_PART[HIT_RIGHTLEG], izBody[HIT_RIGHTLEG]) } // Get and format stats. format_stats(id, sBuffer[MAX_BUFFER_LENGTH + 1]) { - new izStats[8] = {0, ...} - new izBody[8] + new izStats[STATSX_MAX_STATS] = {0, ...} + new izBody[MAX_BODYHITS] new iWeapon, iLen new lKills[16], lDeaths[16], lHits[16], lShots[16], lDamage[16], lEff[16], lAcc[16], lWeapon[16] @@ -791,8 +782,8 @@ format_stats(id, sBuffer[MAX_BUFFER_LENGTH + 1]) iLen = formatex(sBuffer, charsmax(sBuffer), "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>") iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%6s: %d (%d with hs)^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %0.2f%%^n%6s: %0.2f%%^n^n", - lKills, izStats[STATS_KILLS], izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS], - lDamage, izStats[STATS_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats)) + lKills, izStats[STATSX_KILLS], izStats[STATSX_HEADSHOTS], lDeaths, izStats[STATSX_DEATHS], lHits, izStats[STATSX_HITS], lShots, izStats[STATSX_SHOTS], + lDamage, izStats[STATSX_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats)) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%-12.12s %6s %6s %6s %6s %6s %4s^n", lWeapon, lKills, lDeaths, lHits, lShots, lDamage, lAcc) for (iWeapon = 1; iWeapon < xmod_get_maxweapons() && charsmax(sBuffer) - iLen > 0 ; iWeapon++) @@ -800,8 +791,8 @@ format_stats(id, sBuffer[MAX_BUFFER_LENGTH + 1]) if (get_user_wstats(id, iWeapon, izStats, izBody)) { xmod_get_wpnname(iWeapon, t_sWpn, charsmax(t_sWpn)) - iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%-12.12s %6d %6d %6d %6d %6d %3.0f%%^n", t_sWpn, izStats[STATS_KILLS], izStats[STATS_DEATHS], - izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_DAMAGE], accuracy(izStats)) + iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%-12.12s %6d %6d %6d %6d %6d %3.0f%%^n", t_sWpn, izStats[STATSX_KILLS], izStats[STATSX_DEATHS], + izStats[STATSX_HITS], izStats[STATSX_SHOTS], izStats[STATSX_DAMAGE], accuracy(izStats)) } } } @@ -1045,7 +1036,7 @@ public cmdRank(id) return PLUGIN_HANDLED } - new izStats[8], izBody[8] + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS] new iRankPos, iRankMax new Float:fEff, Float:fAcc @@ -1055,7 +1046,7 @@ public cmdRank(id) fEff = effec(izStats) fAcc = accuracy(izStats) - client_print(id, print_chat, "* %L", id, "YOUR_RANK_IS", iRankPos, iRankMax, izStats[STATS_KILLS], izStats[STATS_HITS], fEff, fAcc) + client_print(id, print_chat, "* %L", id, "YOUR_RANK_IS", iRankPos, iRankMax, izStats[STATSX_KILLS], izStats[STATSX_HITS], fEff, fAcc) return PLUGIN_CONTINUE } @@ -1443,7 +1434,7 @@ kill_stats(id) g_fzShowUserStatsTime[id] = get_gametime() // Add user death stats to user round stats - new izStats[8], izBody[8] + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS] new iTeam, i new iKiller @@ -1651,7 +1642,7 @@ public eventShowRank(id) if (is_user_connected(iPlayer)) { - new izStats[8], izBody[8] + new izStats[STATSX_MAX_STATS], izBody[MAX_BODYHITS] new iRankPos, iRankMax get_user_name(iPlayer, t_sName, charsmax(t_sName)) diff --git a/plugins/dod/dodstats.sma b/plugins/dod/dodstats.sma index ebc94f21..aeaa4404 100755 --- a/plugins/dod/dodstats.sma +++ b/plugins/dod/dodstats.sma @@ -28,13 +28,14 @@ */ #include <amxmodx> +#include <dodx> -#define KILLS stats[0] -#define DEATHS stats[1] -#define TK stats[3] -#define SCORE stats[7] +#define KILLS stats[DODX_KILLS] +#define DEATHS stats[DODX_DEATHS] +#define TK stats[DODX_TEAMKILLS] +#define SCORE stats[DODX_POINTS] -public get_score(stats[9],body[8]){ +public get_score(stats[DODX_MAX_STATS],body[MAX_BODYHITS]){ if (!DEATHS) DEATHS = 1 diff --git a/plugins/dod/stats.sma b/plugins/dod/stats.sma index 79aee492..e1796240 100755 --- a/plugins/dod/stats.sma +++ b/plugins/dod/stats.sma @@ -86,7 +86,7 @@ new g_center1_sync new g_center2_sync new g_left_sync -new g_bodyParts[8][] = { +new g_bodyParts[MAX_BODYHITS][] = { "WHOLEBODY", "HEAD", "CHEST", @@ -294,19 +294,19 @@ public cmdStats(id){ /* build list of attackers */ getAttackers(id) { - new name[MAX_NAME_LENGTH],wpn[32], stats[9],body[8],found=0 + new name[MAX_NAME_LENGTH],wpn[32], stats[DODX_MAX_STATS],body[MAX_BODYHITS],found=0 new pos = format(g_Buffer,charsmax(g_Buffer),"%L^n",id,"ATTACKERS") for(new a = 1; a <= MaxClients; ++a){ if(get_user_astats(id,a,stats,body,wpn,charsmax(wpn))) { found = 1 - if (stats[0]) + if (stats[DODX_KILLS]) format(wpn,charsmax(wpn)," -- %s",wpn) else wpn[0] = 0 get_user_name(a,name,charsmax(name)) - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d %L / %d %L%s^n",name,stats[6],id,"DMG",stats[5],id,"HIT_S",wpn) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d %L / %d %L%s^n",name,stats[DODX_DAMAGE],id,"DMG",stats[DODX_HITS],id,"HIT_S",wpn) } } return found @@ -315,18 +315,18 @@ getAttackers(id) { /* build list of victims */ getVictims(id) { - new name[MAX_NAME_LENGTH],wpn[32], stats[9],body[8],found=0 + new name[MAX_NAME_LENGTH],wpn[32], stats[DODX_MAX_STATS],body[MAX_BODYHITS],found=0 new pos = format(g_Buffer,charsmax(g_Buffer),"%L^n",id,"VICTIMS") for(new a = 1; a <= MaxClients; ++a){ if(get_user_vstats(id,a,stats,body,wpn,charsmax(wpn))) { found = 1 - if (stats[1]) + if (stats[DODX_DEATHS]) format(wpn,charsmax(wpn)," -- %s",wpn) else wpn[0] = 0 get_user_name(a,name,charsmax(name)) - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d %L / %d %L%s^n",name,stats[6],id,"DMG",stats[5],id,"HITS",wpn) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d %L / %d %L%s^n",name,stats[DODX_DAMAGE],id,"DMG",stats[DODX_HITS],id,"HITS",wpn) } } return found @@ -334,7 +334,7 @@ getVictims(id) { /* build list of hita for AV List */ getHits(id,killer) { - new stats[9], body[8], pos = 0 + new stats[DODX_MAX_STATS], body[MAX_BODYHITS], pos = 0 g_Buffer[0] = 0 get_user_astats(id,killer,stats,body) for(new a = 1; a < sizeof(body); ++a) @@ -344,7 +344,7 @@ getHits(id,killer) { /* build list of hits for say hp */ getMyHits(id,killed) { - new name[MAX_NAME_LENGTH], stats[9], body[8], found = 0 + new name[MAX_NAME_LENGTH], stats[DODX_MAX_STATS], body[MAX_BODYHITS], found = 0 get_user_name(killed,name,charsmax(name)) new pos = format(g_Buffer,charsmax(g_Buffer),"%L",id,"YOU_HIT",name) get_user_vstats(id,killed,stats,body) @@ -367,13 +367,13 @@ public cmdKiller(id) { return PLUGIN_HANDLED } if (g_Killers[id][0]) { - new name[MAX_NAME_LENGTH], stats[9], body[8], wpn[32], mstats[9], mbody[8] + new name[MAX_NAME_LENGTH], stats[DODX_MAX_STATS], body[MAX_BODYHITS], wpn[32], mstats[DODX_MAX_STATS], mbody[MAX_BODYHITS] get_user_name(g_Killers[id][0],name,charsmax(name)) get_user_astats(id,g_Killers[id][0],stats,body,wpn,charsmax(wpn)) get_user_vstats(id,g_Killers[id][0],mstats,mbody) client_print(id,print_chat,"%L",id,"KILL_INFO1", name,wpn,float(g_Killers[id][2]) * 0.0254 ) - client_print(id,print_chat,"%L",id,"KILL_INFO2", stats[6],stats[5], g_Killers[id][1] ) - client_print(id,print_chat,"%L",id,"KILL_INFO3", mstats[6], mstats[5] ) + client_print(id,print_chat,"%L",id,"KILL_INFO2", stats[DODX_DAMAGE],stats[DODX_HITS], g_Killers[id][1] ) + client_print(id,print_chat,"%L",id,"KILL_INFO3", mstats[DODX_DAMAGE], mstats[DODX_HITS] ) if (getMyHits(id,g_Killers[id][0])) client_print(id,print_chat,"%L",id,"KILL_INFO4",g_Buffer) } @@ -479,7 +479,7 @@ public round_end(){ if ( !EndRoundStats ) return PLUGIN_CONTINUE - new g_Buffer2[1024], len, players[MAX_PLAYERS], pnum, stats[9],bodyhits[8] + new g_Buffer2[1024], len, players[MAX_PLAYERS], pnum, stats[DODX_MAX_STATS],bodyhits[MAX_BODYHITS] get_players( players , pnum ) @@ -488,25 +488,25 @@ public round_end(){ for(new i = 0; i < pnum; ++i){ get_user_rstats( players[i],stats, bodyhits ) - if ( stats[7] > score ){ + if ( stats[DODX_POINTS] > score ){ who1 = players[i] - score = stats[7] + score = stats[DODX_POINTS] } } for(new i = 0; i < pnum; ++i){ get_user_rstats( players[i],stats, bodyhits ) - if ( stats[0] > kills ){ + if ( stats[DODX_KILLS] > kills ){ who2 = players[i] - kills = stats[0] - hs = stats[2] + kills = stats[DODX_KILLS] + hs = stats[DODX_HEADSHOTS] } } for(new i = 0; i < pnum; ++i){ get_user_rstats( players[i],stats, bodyhits ) - if ( stats[6] > damage ){ + if ( stats[DODX_DAMAGE] > damage ){ who3 = players[i] - hits = stats[5] - damage = stats[6] + hits = stats[DODX_HITS] + damage = stats[DODX_DAMAGE] } } @@ -632,15 +632,15 @@ public client_death(killer,victim,wpnindex,hitplace,TK) if ( ShowKiller && !(!get_cvar_num("dodstats_rankbots") && (is_user_bot(killer) || is_user_bot(victim))) ){ - new stats[9], body[8], wpn[32], mstats[9], mbody[8] + new stats[DODX_MAX_STATS], body[MAX_BODYHITS], wpn[32], mstats[DODX_MAX_STATS], mbody[MAX_BODYHITS] get_user_astats(victim,killer,stats,body,wpn,charsmax(wpn)) get_user_vstats(victim,killer,mstats,mbody) set_hudmessage(220,80,0,0.05,0.15,0, statstime, 12.0, 1.0, 2.0, -1) getHits(victim,killer) show_hudmessage(victim,"%L%L%L%L",victim,"KILL_INFO1",killer_name,wpn,float(g_Killers[victim][2]) * 0.0254, - /*2*/ victim,"KILL_INFO2",stats[6],stats[5],g_Killers[victim][1], - /*3*/ victim,"KILL_INFO3",mstats[6],mstats[5], + /*2*/ victim,"KILL_INFO2",stats[DODX_DAMAGE],stats[DODX_HITS],g_Killers[victim][1], + /*3*/ victim,"KILL_INFO3",mstats[DODX_DAMAGE],mstats[DODX_HITS], /*4*/ victim,"KILL_INFO4",g_Buffer ) } @@ -919,7 +919,7 @@ public cmdStatsMe(id){ } displayStats_steam(id,dest) { - new name[MAX_NAME_LENGTH], stats[9], body[8] + new name[MAX_NAME_LENGTH], stats[DODX_MAX_STATS], body[MAX_BODYHITS] get_user_wstats(id,0,stats,body) new pos = copy(g_Buffer,charsmax(g_Buffer),"<html><head><meta charset=utf-8><style type=^"text/css^">pre{color:#FFB000;}body{background:Black;margin-left:8px;margin-top:0px; color:#FFB000;}</style></head><pre><body>") @@ -927,7 +927,7 @@ displayStats_steam(id,dest) { dest,"M_KILLS",dest,"M_DEATHS",dest,"M_SCORE",dest,"M_TKS",dest,"M_HITS",dest,"M_SHOTS",dest,"M_HS") pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"<tr><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td></tr></table><br><br><br>", - stats[0],stats[1],stats[7],stats[3],stats[5],stats[4],stats[2]) + stats[DODX_KILLS],stats[DODX_DEATHS],stats[DODX_POINTS],stats[DODX_TEAMKILLS],stats[DODX_HITS],stats[DODX_SHOTS],stats[DODX_HEADSHOTS]) pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"<table><tr><td>%L</td><td>%L</td><td>%L</td><td>%L</td><td>%L</td><td>%L<td></tr>", dest,"M_WEAPON",dest,"M_SHOTS",dest,"M_HITS",dest,"M_DAMAGE",dest,"M_KILLS",dest,"M_DEATHS") @@ -935,10 +935,10 @@ displayStats_steam(id,dest) { for(new a = 1; a < DODMAX_WEAPONS; ++a) { if (get_user_wstats(id,a,stats,body)){ if ( xmod_is_melee_wpn(a) ) - stats[4] = -1; + stats[DODX_SHOTS] = -1; xmod_get_wpnname(a,name,charsmax(name)) pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"<tr><td>%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td></tr>^n", - name,stats[4],stats[5],stats[6],stats[0],stats[1]) + name,stats[DODX_SHOTS],stats[DODX_HITS],stats[DODX_DAMAGE],stats[DODX_KILLS],stats[DODX_DEATHS]) } } copy(g_Buffer[pos],charsmax(g_Buffer)-pos,"</table></pre></body></html>") @@ -958,7 +958,7 @@ public cmdRank(id){ } displayRank_steam(id,dest) { - new name[MAX_NAME_LENGTH], stats[9], body[8] + new name[MAX_NAME_LENGTH], stats[DODX_MAX_STATS], body[MAX_BODYHITS] new rank_pos = get_user_stats(id,stats,body) new pos = copy(g_Buffer,charsmax(g_Buffer),"<html><head><meta charset=utf-8><style type=^"text/css^">pre{color:#FFB000;}body{background:Black;margin-left:8px;margin-top:0px;color:#FFB000;}</style></head><pre><body>") @@ -968,9 +968,9 @@ displayRank_steam(id,dest) { pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos, "<tr><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td></tr></table><br><br>", - stats[0],stats[1],stats[7],stats[3],stats[5],stats[4],stats[2]) + stats[DODX_KILLS],stats[DODX_DEATHS],stats[DODX_POINTS],stats[DODX_TEAMKILLS],stats[DODX_HITS],stats[DODX_SHOTS],stats[DODX_HEADSHOTS]) - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%L^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n",dest,"M_HITS",dest,g_bodyParts[1],body[1],dest,g_bodyParts[2],body[2],dest,g_bodyParts[3],body[3],dest,g_bodyParts[4],body[4],dest,g_bodyParts[5],body[5],dest,g_bodyParts[6],body[6],dest,g_bodyParts[7],body[7]) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%L^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n%L: %d^n",dest,"M_HITS",dest,g_bodyParts[HIT_HEAD],body[HIT_HEAD],dest,g_bodyParts[HIT_CHEST],body[HIT_CHEST],dest,g_bodyParts[HIT_STOMACH],body[HIT_STOMACH],dest,g_bodyParts[HIT_LEFTARM],body[HIT_LEFTARM],dest,g_bodyParts[HIT_RIGHTARM],body[HIT_RIGHTARM],dest,g_bodyParts[HIT_LEFTLEG],body[HIT_LEFTLEG],dest,g_bodyParts[HIT_RIGHTLEG],body[HIT_RIGHTLEG]) pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%L <b>%d</b> %L <b>%d</b>",dest,(id==dest)?"M_YOUR_RANK_IS":"M_THEIR_RANK_IS", rank_pos,dest,"M_OF",get_statsnum()) @@ -997,7 +997,7 @@ public cmdTop15(id) { /* get top 15 */ getTop15_steam(id){ - new stats[9], body[8], name[MAX_NAME_LENGTH] + new stats[DODX_MAX_STATS], body[MAX_BODYHITS], name[MAX_NAME_LENGTH] new pos = copy(g_Buffer,charsmax(g_Buffer),"<html><head><meta charset=utf-8><style type=^"text/css^">pre{color:#FFB000;}body{background:Black;margin-left:8px;margin-top:0px;color:#FFB000;}</style></head><pre><body>") @@ -1012,7 +1012,7 @@ getTop15_steam(id){ replace_all(name, charsmax(name), "<", "[") replace_all(name, charsmax(name), ">", "]") pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"<tr><td>%d.</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td></tr>^n", - a+1,name,stats[0],stats[1],stats[7],stats[3],stats[5],stats[4],stats[2]) + a+1,name,stats[DODX_KILLS],stats[DODX_DEATHS],stats[DODX_POINTS],stats[DODX_TEAMKILLS],stats[DODX_HITS],stats[DODX_SHOTS],stats[DODX_HEADSHOTS]) } pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"</table></pre></body></html>") diff --git a/plugins/dod/stats_logging.sma b/plugins/dod/stats_logging.sma index 8e6bc071..e1b322b3 100755 --- a/plugins/dod/stats_logging.sma +++ b/plugins/dod/stats_logging.sma @@ -24,7 +24,7 @@ public plugin_init() public client_disconnected(id) { if ( is_user_bot( id ) || !is_user_connected(id) || !isDSMActive() ) return PLUGIN_CONTINUE remove_task( id ) - new szTeam[16],szName[MAX_NAME_LENGTH],szAuthid[32], iStats[9], iHits[8], szWeapon[16] + new szTeam[16],szName[MAX_NAME_LENGTH],szAuthid[32], iStats[DODX_MAX_STATS], iHits[MAX_BODYHITS], szWeapon[16] new iUserid = get_user_userid( id ) get_user_info(id,"team", szTeam, charsmax(szTeam) ) szTeam[0] -= 32; @@ -34,9 +34,9 @@ public client_disconnected(id) { if( get_user_wstats( id , i ,iStats , iHits ) ) { xmod_get_wpnlogname( i , szWeapon , charsmax(szWeapon) ) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats^" (weapon ^"%s^") (shots ^"%d^") (hits ^"%d^") (kills ^"%d^") (headshots ^"%d^") (tks ^"%d^") (damage ^"%d^") (deaths ^"%d^") (score ^"%d^")", - szName,iUserid,szAuthid,szTeam,szWeapon,iStats[4],iStats[5],iStats[0], iStats[2],iStats[3],iStats[6],iStats[1],iStats[7]) + szName,iUserid,szAuthid,szTeam,szWeapon,iStats[DODX_SHOTS],iStats[DODX_HITS],iStats[DODX_KILLS], iStats[DODX_HEADSHOTS],iStats[DODX_TEAMKILLS],iStats[DODX_DAMAGE],iStats[DODX_DEATHS],iStats[DODX_POINTS]) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats2^" (weapon ^"%s^") (head ^"%d^") (chest ^"%d^") (stomach ^"%d^") (leftarm ^"%d^") (rightarm ^"%d^") (leftleg ^"%d^") (rightleg ^"%d^")", - szName,iUserid,szAuthid,szTeam,szWeapon,iHits[1],iHits[2],iHits[3], iHits[4],iHits[5],iHits[6],iHits[7]) + szName,iUserid,szAuthid,szTeam,szWeapon,iHits[HIT_HEAD],iHits[HIT_CHEST],iHits[HIT_STOMACH], iHits[HIT_LEFTARM],iHits[HIT_RIGHTARM],iHits[HIT_LEFTLEG],iHits[HIT_RIGHTLEG]) } } new iTime = get_user_time( id , 1 ) diff --git a/plugins/tfc/stats.sma b/plugins/tfc/stats.sma index ad4b4122..cfbb3cf3 100755 --- a/plugins/tfc/stats.sma +++ b/plugins/tfc/stats.sma @@ -75,7 +75,7 @@ new g_center2_sync new g_left_sync new g_damage_sync -new g_bodyParts[8][] = { +new g_bodyParts[MAX_BODYHITS][] = { "whole body", "head", "chest", @@ -220,18 +220,18 @@ public cmdStatsMe(id){ } displayStats(id,dest) { - new name[32], stats[8], body[8] + new name[32], stats[STATSX_MAX_STATS], body[MAX_BODYHITS] get_user_wstats(id,0,stats,body) new pos = format(g_Buffer,charsmax(g_Buffer),"Kills: %d^nDeaths: %d^nTKs: %d^nDamage: %d^nHits: %d^nShots: %d^n^n", - stats[0],stats[1],stats[3],stats[6],stats[5],stats[4]) + stats[STATSX_KILLS],stats[STATSX_DEATHS],stats[STATSX_TEAMKILLS],stats[STATSX_DAMAGE],stats[STATSX_HITS],stats[STATSX_SHOTS]) new a for( a = 1; a < TFCMAX_WEAPONS; a++) { if (get_user_wstats(id,a,stats,body)){ if ( xmod_is_melee_wpn(a) ) - stats[4] = -1; + stats[STATSX_SHOTS] = -1; xmod_get_wpnname(a,name,charsmax(name)) pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s shots: %d hits: %d damage: %d kills: %d deaths: %d^n", - name,stats[4],stats[5],stats[6],stats[0],stats[1]) + name,stats[STATSX_SHOTS],stats[STATSX_HITS],stats[STATSX_DAMAGE],stats[STATSX_KILLS],stats[STATSX_DEATHS]) } } get_user_name(id,name,charsmax(name)) @@ -248,13 +248,13 @@ public cmdRank(id){ } displayRank(id,dest) { - new name[MAX_NAME_LENGTH], stats[8], body[8] + new name[MAX_NAME_LENGTH], stats[STATSX_MAX_STATS], body[MAX_BODYHITS] new rank_pos = get_user_stats(id,stats,body) new pos = format(g_Buffer,charsmax(g_Buffer),"Kills: %d^nDeaths: %d^nTKs: %d^nDamage: %d^nHits: %d^nShots: %d^n^n", - stats[0],stats[1],stats[3],stats[6],stats[5],stats[4]) + stats[STATSX_KILLS],stats[STATSX_DEATHS],stats[STATSX_TEAMKILLS],stats[STATSX_DAMAGE],stats[STATSX_HITS],stats[STATSX_SHOTS]) pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"Hits:^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n^n", - g_bodyParts[1],body[1],g_bodyParts[2],body[2],g_bodyParts[3],body[3], g_bodyParts[4],body[4], - g_bodyParts[5],body[5],g_bodyParts[6],body[6],g_bodyParts[7],body[7]) + g_bodyParts[HIT_HEAD],body[HIT_HEAD],g_bodyParts[HIT_CHEST],body[HIT_CHEST],g_bodyParts[HIT_STOMACH],body[HIT_STOMACH], g_bodyParts[HIT_LEFTARM],body[HIT_LEFTARM], + g_bodyParts[HIT_RIGHTARM],body[HIT_RIGHTARM],g_bodyParts[HIT_LEFTLEG],body[HIT_LEFTLEG],g_bodyParts[HIT_RIGHTLEG],body[HIT_RIGHTLEG]) format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s rank is %d of %d",(id==dest)?"Your":"His", rank_pos,get_statsnum()) get_user_name(id,name,charsmax(name)) show_motd(dest,g_Buffer,name) @@ -272,7 +272,7 @@ public cmdTop15(id) { /* get top 15 */ getTop15(){ - new stats[8], body[8], name[MAX_NAME_LENGTH] + new stats[STATSX_MAX_STATS], body[MAX_BODYHITS], name[MAX_NAME_LENGTH] new pos = copy(g_Buffer,charsmax(g_Buffer),"# nick kills/deaths TKs hits/shots/headshots^n") new imax = get_statsnum() if (imax > 15) imax = 15 @@ -280,7 +280,7 @@ getTop15(){ get_stats(a,stats,body,name,charsmax(name)) replace_all(name, charsmax(name), "<", "[") replace_all(name, charsmax(name), ">", "]") - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%2d. %-28.27s %d/%d %d %d/%d/%d^n",a+1,name,stats[0],stats[1],stats[3],stats[5],stats[4],stats[2]) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%2d. %-28.27s %d/%d %d %d/%d/%d^n",a+1,name,stats[STATSX_KILLS],stats[STATSX_DEATHS],stats[STATSX_TEAMKILLS],stats[STATSX_HITS],stats[STATSX_SHOTS],stats[STATSX_HEADSHOTS]) } } @@ -318,18 +318,18 @@ public cmdStats(id){ /* build list of attackers */ getAttackers(id) { - new name[MAX_NAME_LENGTH],wpn[32], stats[8],body[8],found=0 + new name[MAX_NAME_LENGTH],wpn[32], stats[STATSX_MAX_STATS],body[MAX_BODYHITS],found=0 new pos = copy(g_Buffer,charsmax(g_Buffer),"Attackers:^n") for(new a = 1; a <= MaxClients; ++a){ if(get_user_astats(id,a,stats,body,wpn,charsmax(wpn))){ found = 1 - if (stats[0]) + if (stats[STATSX_KILLS]) format(wpn,charsmax(wpn)," -- %s",wpn) else wpn[0] = 0 get_user_name(a,name,charsmax(name)) - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[6],stats[5],wpn) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[STATSX_DAMAGE],stats[STATSX_HITS],wpn) } } return found @@ -338,17 +338,17 @@ getAttackers(id) { /* build list of victims */ getVictims(id) { - new name[MAX_NAME_LENGTH],wpn[32], stats[8],body[8],found=0 + new name[MAX_NAME_LENGTH],wpn[32], stats[STATSX_MAX_STATS],body[MAX_BODYHITS],found=0 new pos = copy(g_Buffer,charsmax(g_Buffer),"Victims:^n") for(new a = 1; a <= MaxClients; ++a){ if(get_user_vstats(id,a,stats,body,wpn,charsmax(wpn))){ found = 1 - if (stats[1]) + if (stats[STATSX_DEATHS]) format(wpn,charsmax(wpn)," -- %s",wpn) else wpn[0] = 0 get_user_name(a,name,charsmax(name)) - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[6],stats[5],wpn) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[STATSX_DAMAGE],stats[STATSX_HITS],wpn) } } return found @@ -356,7 +356,7 @@ getVictims(id) { /* build list of hita for AV List */ getHits(id,killer) { - new stats[8], body[8], pos = 0 + new stats[STATSX_MAX_STATS], body[MAX_BODYHITS], pos = 0 g_Buffer[0] = 0 get_user_astats(id,killer,stats,body) for(new a = 1; a < sizeof(body); ++a) @@ -367,7 +367,7 @@ getHits(id,killer) { /* build list of hits for say hp */ getMyHits(id,killed) { - new name[MAX_NAME_LENGTH], stats[8], body[8], found = 0 + new name[MAX_NAME_LENGTH], stats[STATSX_MAX_STATS], body[MAX_BODYHITS], found = 0 get_user_name(killed,name,charsmax(name)) new pos = format(g_Buffer,charsmax(g_Buffer),"You hit %s in:",name) get_user_vstats(id,killed,stats,body) @@ -390,14 +390,14 @@ public cmdKiller(id) { return PLUGIN_HANDLED } if (g_Killers[id][0]) { - new name[MAX_NAME_LENGTH], stats[8], body[8], wpn[32], mstats[8], mbody[8] + new name[MAX_NAME_LENGTH], stats[STATSX_MAX_STATS], body[MAX_BODYHITS], wpn[32], mstats[STATSX_MAX_STATS], mbody[MAX_BODYHITS] get_user_name(g_Killers[id][0],name,charsmax(name)) get_user_astats(id,g_Killers[id][0],stats,body,wpn,charsmax(wpn)) client_print(id,print_chat,"%s killed you with %s from distance of %.2f meters", name,wpn,float(g_Killers[id][3]) * 0.0254 ) client_print(id,print_chat,"He did %d damage to you with %d hit%s and still had %dhp and %dap", - stats[6],stats[5],(stats[5]==1)?"":"s" , g_Killers[id][1],g_Killers[id][2] ) + stats[STATSX_DAMAGE],stats[STATSX_HITS],(stats[STATSX_HITS]==1)?"":"s" , g_Killers[id][1],g_Killers[id][2] ) if ( get_user_vstats(id,g_Killers[id][0],mstats,mbody) ) { - client_print(id,print_chat,"You did %d damage to him with %d hit%s",mstats[6], mstats[5],(mstats[5]==1)?"":"s" ) + client_print(id,print_chat,"You did %d damage to him with %d hit%s",mstats[STATSX_DAMAGE], mstats[STATSX_HITS],(mstats[STATSX_HITS]==1)?"":"s" ) getMyHits(id,g_Killers[id][0]) client_print(id,print_chat, "%s", g_Buffer) } @@ -527,15 +527,15 @@ public client_death(killer,victim,wpnindex,hitplace,TK){ if ( ShowKiller && !(!get_cvar_num("tfcstats_rankbots") && (is_user_bot(killer) || is_user_bot(killer))) ){ - new stats[8], body[8], wpn[32], mstats[8], mbody[8] + new stats[STATSX_MAX_STATS], body[MAX_BODYHITS], wpn[32], mstats[STATSX_MAX_STATS], mbody[MAX_BODYHITS] get_user_astats(victim,killer,stats,body,wpn,charsmax(wpn)) get_user_vstats(victim,killer,mstats,mbody) set_hudmessage(220,80,0,0.05,0.15,0, statstime, 12.0, 1.0, 2.0, -1) getHits(victim,killer) show_hudmessage(victim,"%s killed you with %s^nfrom distance of %.2f meters.^nHe did %d damage to you with %d hit(s)^nand still has %dhp and %dap.^nYou did %d damage to him with %d hit(s).^nHe hits you in:^n%s", - killer_name,wpn,float(g_Killers[victim][3]) * 0.0254, stats[6],stats[5], - g_Killers[victim][1],g_Killers[victim][2], mstats[6],mstats[5],g_Buffer ) + killer_name,wpn,float(g_Killers[victim][3]) * 0.0254, stats[STATSX_DAMAGE],stats[STATSX_HITS], + g_Killers[victim][1],g_Killers[victim][2], mstats[STATSX_DAMAGE],mstats[STATSX_HITS],g_Buffer ) } if ( KillerHp ){ diff --git a/plugins/tfc/stats_logging.sma b/plugins/tfc/stats_logging.sma index e844803d..e28850b6 100755 --- a/plugins/tfc/stats_logging.sma +++ b/plugins/tfc/stats_logging.sma @@ -23,7 +23,7 @@ public plugin_init() public client_disconnected(id) { if ( is_user_bot( id ) ) return PLUGIN_CONTINUE remove_task( id ) - new szTeam[16],szName[MAX_NAME_LENGTH],szAuthid[32], iStats[8], iHits[8], szWeapon[24] + new szTeam[16],szName[MAX_NAME_LENGTH],szAuthid[32], iStats[STATSX_MAX_STATS], iHits[MAX_BODYHITS], szWeapon[24] new iUserid = get_user_userid( id ) get_user_team(id, szTeam, charsmax(szTeam) ) get_user_name(id, szName , charsmax(szName) ) @@ -33,9 +33,9 @@ public client_disconnected(id) { xmod_get_wpnlogname( i , szWeapon , charsmax(szWeapon) ) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats^" (weapon ^"%s^") (shots ^"%d^") (hits ^"%d^") (kills ^"%d^") (headshots ^"%d^") (tks ^"%d^") (damage ^"%d^") (deaths ^"%d^")", - szName,iUserid,szAuthid,szTeam,szWeapon,iStats[4],iStats[5],iStats[0], iStats[2],iStats[3],iStats[6],iStats[1]) + szName,iUserid,szAuthid,szTeam,szWeapon,iStats[STATSX_SHOTS],iStats[STATSX_HITS],iStats[STATSX_KILLS], iStats[STATSX_HEADSHOTS],iStats[STATSX_TEAMKILLS],iStats[STATSX_DAMAGE],iStats[STATSX_DEATHS]) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats2^" (weapon ^"%s^") (head ^"%d^") (chest ^"%d^") (stomach ^"%d^") (leftarm ^"%d^") (rightarm ^"%d^") (leftleg ^"%d^") (rightleg ^"%d^")", - szName,iUserid,szAuthid,szTeam,szWeapon,iHits[1],iHits[2],iHits[3], iHits[4],iHits[5],iHits[6],iHits[7]) + szName,iUserid,szAuthid,szTeam,szWeapon,iHits[HIT_HEAD],iHits[HIT_CHEST],iHits[HIT_STOMACH], iHits[HIT_LEFTARM],iHits[HIT_RIGHTARM],iHits[HIT_LEFTLEG],iHits[HIT_RIGHTLEG]) } } new iTime = get_user_time( id , 1 ) diff --git a/plugins/tfc/tfcstats.sma b/plugins/tfc/tfcstats.sma index 5dc4d980..2f7083fd 100755 --- a/plugins/tfc/tfcstats.sma +++ b/plugins/tfc/tfcstats.sma @@ -28,7 +28,7 @@ #include <amxmodx> -public get_score(stats[8],body[8]) +public get_score(stats[STATSX_MAX_STATS],body[MAX_BODYHITS]) { - return stats[0] - stats[1] /* kills - deaths */ + return stats[STATSX_KILLS] - stats[STATSX_DEATHS] /* kills - deaths */ } diff --git a/plugins/ts/stats.sma b/plugins/ts/stats.sma index 2209d4a7..6dfe0891 100755 --- a/plugins/ts/stats.sma +++ b/plugins/ts/stats.sma @@ -67,7 +67,7 @@ new Float:g_DeathStats[MAX_PLAYERS + 1] new g_center1_sync new g_damage_sync -new g_bodyParts[8][] = {"whole body","head","chest","stomach","left arm","right arm","left leg","right leg"} +new g_bodyParts[MAX_BODYHITS][] = {"whole body","head","chest","stomach","left arm","right arm","left leg","right leg"} new g_HeMessages[4][] = { "%s sends a little gift to %s", @@ -165,17 +165,17 @@ public cmdStatsMe(id){ } public displayStats(id,dest) { - new name[32], stats[8], body[8] + new name[32], stats[STATSX_MAX_STATS], body[MAX_BODYHITS] get_user_wstats(id,0,stats,body) new pos = format(g_Buffer,charsmax(g_Buffer),"Kills: %d^nDeaths: %d^nTKs: %d^nDamage: %d^nHits: %d^nShots: %d^n^n", - stats[0],stats[1],stats[3],stats[6],stats[5],stats[4]) + stats[STATSX_KILLS],stats[STATSX_DEATHS],stats[STATSX_TEAMKILLS],stats[STATSX_DAMAGE],stats[STATSX_HITS],stats[STATSX_SHOTS]) for(new a = 1; a < TSMAX_WEAPONS; ++a) { if (get_user_wstats(id,a,stats,body)){ if ( xmod_is_melee_wpn(a) ) - stats[4] = -1; + stats[STATSX_SHOTS] = -1; xmod_get_wpnname(a,name,charsmax(name)) pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s shots: %d hits: %d damage: %d kills: %d deaths: %d^n", - name,stats[4],stats[5],stats[6],stats[0],stats[1]) + name,stats[STATSX_SHOTS],stats[STATSX_HITS],stats[STATSX_DAMAGE],stats[STATSX_KILLS],stats[STATSX_DEATHS]) } } get_user_name(id,name,charsmax(name)) @@ -193,13 +193,13 @@ public cmdRank(id){ } displayRank(id,dest) { - new name[MAX_NAME_LENGTH], stats[8], body[8] + new name[MAX_NAME_LENGTH], stats[STATSX_MAX_STATS], body[MAX_BODYHITS] new rank_pos = get_user_stats(id,stats,body) new pos = format(g_Buffer,charsmax(g_Buffer),"Kills: %d^nDeaths: %d^nTKs: %d^nDamage: %d^nHits: %d^nShots: %d^n^n", - stats[0],stats[1],stats[3],stats[6],stats[5],stats[4]) + stats[STATSX_KILLS],stats[STATSX_DEATHS],stats[STATSX_TEAMKILLS],stats[STATSX_DAMAGE],stats[STATSX_HITS],stats[STATSX_SHOTS]) pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"Hits:^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n%s: %d^n^n", - g_bodyParts[1],body[1],g_bodyParts[2],body[2],g_bodyParts[3],body[3], g_bodyParts[4],body[4], - g_bodyParts[5],body[5],g_bodyParts[6],body[6],g_bodyParts[7],body[7]) + g_bodyParts[HIT_HEAD],body[HIT_HEAD],g_bodyParts[HIT_CHEST],body[HIT_CHEST],g_bodyParts[HIT_STOMACH],body[HIT_STOMACH], g_bodyParts[HIT_LEFTARM],body[HIT_LEFTARM], + g_bodyParts[HIT_RIGHTARM],body[HIT_RIGHTARM],g_bodyParts[HIT_LEFTLEG],body[HIT_LEFTLEG],g_bodyParts[HIT_RIGHTLEG],body[HIT_RIGHTLEG]) format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s rank is %d of %d",(id==dest)?"Your":"His", rank_pos,get_statsnum()) get_user_name(id,name,charsmax(name)) show_motd(dest,g_Buffer,name) @@ -217,7 +217,7 @@ public cmdTop15(id) { /* get top 15 */ getTop15(){ - new stats[8], body[8], name[MAX_NAME_LENGTH] + new stats[STATSX_MAX_STATS], body[MAX_BODYHITS], name[MAX_NAME_LENGTH] new pos = copy(g_Buffer,charsmax(g_Buffer),"# nick kills/deaths TKs hits/shots/headshots^n") new imax = get_statsnum() if (imax > 15) imax = 15 @@ -225,7 +225,7 @@ getTop15(){ get_stats(a,stats,body,name,charsmax(name)) replace_all(name, charsmax(name), "<", "[") replace_all(name, charsmax(name), ">", "]") - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%2d. %-28.27s %d/%d %d %d/%d/%d^n",a+1,name,stats[0],stats[1],stats[3],stats[5],stats[4],stats[2]) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%2d. %-28.27s %d/%d %d %d/%d/%d^n",a+1,name,stats[STATSX_KILLS],stats[STATSX_DEATHS],stats[STATSX_TEAMKILLS],stats[STATSX_HITS],stats[STATSX_SHOTS],stats[STATSX_HEADSHOTS]) } } @@ -260,17 +260,17 @@ public cmdStats(id){ /* build list of attackers */ getAttackers(id) { - new name[MAX_NAME_LENGTH],wpn[32], stats[8],body[8],found=0 + new name[MAX_NAME_LENGTH],wpn[32], stats[STATSX_MAX_STATS],body[MAX_BODYHITS],found=0 new pos = copy(g_Buffer,charsmax(g_Buffer),"Attackers:^n") for(new a = 1; a <= MaxClients; ++a){ if(get_user_astats(id,a,stats,body,wpn,charsmax(wpn))){ found = 1 - if (stats[0]) + if (stats[STATSX_KILLS]) format(wpn,charsmax(wpn)," -- %s",wpn) else wpn[0] = 0 get_user_name(a,name,charsmax(name)) - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[6],stats[5],wpn) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[STATSX_DAMAGE],stats[STATSX_HITS],wpn) } } return found @@ -278,17 +278,17 @@ getAttackers(id) { /* build list of victims */ getVictims(id) { - new name[MAX_NAME_LENGTH],wpn[32], stats[8],body[8],found=0 + new name[MAX_NAME_LENGTH],wpn[32], stats[STATSX_MAX_STATS],body[MAX_BODYHITS],found=0 new pos = copy(g_Buffer,charsmax(g_Buffer),"Victims:^n") for(new a = 1; a <= MaxClients; ++a){ if(get_user_vstats(id,a,stats,body,wpn,charsmax(wpn))){ found = 1 - if (stats[1]) + if (stats[STATSX_DEATHS]) format(wpn,charsmax(wpn)," -- %s",wpn) else wpn[0] = 0 get_user_name(a,name,charsmax(name)) - pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[6],stats[5],wpn) + pos += format(g_Buffer[pos],charsmax(g_Buffer)-pos,"%s -- %d dmg / %d hit(s)%s^n",name,stats[STATSX_DAMAGE],stats[STATSX_HITS],wpn) } } return found @@ -296,7 +296,7 @@ getVictims(id) { /* build list of hita for AV List */ getHits(id,killer) { - new stats[8], body[8], pos = 0 + new stats[STATSX_MAX_STATS], body[MAX_BODYHITS], pos = 0 g_Buffer[0] = 0 get_user_astats(id,killer,stats,body) for(new a = 1; a < sizeof(body); ++a) @@ -307,7 +307,7 @@ getHits(id,killer) { /* build list of hits for say hp */ getMyHits(id,killed) { - new name[MAX_NAME_LENGTH], stats[8], body[8], found = 0 + new name[MAX_NAME_LENGTH], stats[STATSX_MAX_STATS], body[MAX_BODYHITS], found = 0 get_user_name(killed,name,charsmax(name)) new pos = format(g_Buffer,charsmax(g_Buffer),"You hit %s in:",name) get_user_vstats(id,killed,stats,body) @@ -450,15 +450,15 @@ public client_death(killer,victim,wpnindex,hitplace,TK){ DisplayKillInfo(victim){ if ( ShowKiller ){ - new name[MAX_NAME_LENGTH], stats[8], body[8], wpn[32], mstats[8], mbody[8] + new name[MAX_NAME_LENGTH], stats[STATSX_MAX_STATS], body[MAX_BODYHITS], wpn[32], mstats[STATSX_MAX_STATS], mbody[MAX_BODYHITS] get_user_name(g_Killers[victim][0],name,charsmax(name)) get_user_astats(victim,g_Killers[victim][0],stats,body,wpn,charsmax(wpn)) get_user_vstats(victim,g_Killers[victim][0],mstats,mbody) set_hudmessage(220,80,0,0.05,0.15,0, 6.0, 12.0, 1.0, 2.0, -1) getHits(victim,g_Killers[victim][0]) show_hudmessage(victim,"%s killed you with %s^nfrom distance of %.2f meters.^nHe did %d damage to you with %d hit(s)^nand still has %dhp.^nYou did %d damage to him with %d hit(s).^nHe hits you in:^n%s", - name,wpn,float(g_Killers[victim][2]) * 0.0254, stats[6],stats[5], - g_Killers[victim][1], mstats[6],mstats[5],g_Buffer ) + name,wpn,float(g_Killers[victim][2]) * 0.0254, stats[STATSX_DAMAGE],stats[STATSX_HITS], + g_Killers[victim][1], mstats[STATSX_DAMAGE],mstats[STATSX_HITS],g_Buffer ) } } @@ -503,14 +503,14 @@ public cmdKiller(id) { return PLUGIN_HANDLED } if (g_Killers[id][0]) { - new name[MAX_NAME_LENGTH], stats[8], body[8], wpn[32], mstats[8], mbody[8] + new name[MAX_NAME_LENGTH], stats[STATSX_MAX_STATS], body[MAX_BODYHITS], wpn[32], mstats[STATSX_MAX_STATS], mbody[MAX_BODYHITS] get_user_name(g_Killers[id][0],name,charsmax(name)) get_user_astats(id,g_Killers[id][0],stats,body,wpn,charsmax(wpn)) get_user_vstats(id,g_Killers[id][0],mstats,mbody) client_print(id,print_chat,"%s killed you with %s from distance of %.2f meters", name,wpn,float(g_Killers[id][2]) * 0.0254 ) client_print(id,print_chat,"He did %d damage to you with %d hit(s) and still had %dhp", - stats[6],stats[5], g_Killers[id][1] ) - client_print(id,print_chat,"You did %d damage to him with %d hit(s)",mstats[6], mstats[5] ) + stats[STATSX_DAMAGE],stats[STATSX_HITS], g_Killers[id][1] ) + client_print(id,print_chat,"You did %d damage to him with %d hit(s)",mstats[STATSX_DAMAGE], mstats[STATSX_HITS] ) if (getMyHits(id,g_Killers[id][0])) client_print(id,print_chat, "%s", g_Buffer) } else { diff --git a/plugins/ts/stats_logging.sma b/plugins/ts/stats_logging.sma index bb8b651e..34381b02 100755 --- a/plugins/ts/stats_logging.sma +++ b/plugins/ts/stats_logging.sma @@ -25,7 +25,7 @@ public plugin_init() public client_disconnected(id) { if ( is_user_bot( id ) ) return PLUGIN_CONTINUE remove_task( id ) - new szTeam[16],szName[MAX_NAME_LENGTH],szAuthid[32], iStats[8], iHits[8], szWeapon[16] + new szTeam[16],szName[MAX_NAME_LENGTH],szAuthid[32], iStats[STATSX_MAX_STATS], iHits[MAX_BODYHITS], szWeapon[16] new iUserid = get_user_userid( id ) // team @@ -37,12 +37,12 @@ public client_disconnected(id) { if( get_user_wstats( id , i ,iStats , iHits ) ) { xmod_get_wpnlogname( i , szWeapon , charsmax(szWeapon) ) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats^" (weapon ^"%s^") (shots ^"%d^") (hits ^"%d^") (kills ^"%d^") (headshots ^"%d^") (tks ^"%d^") (damage ^"%d^") (deaths ^"%d^")", - szName,iUserid,szAuthid,szTeam,szWeapon,iStats[4],iStats[5],iStats[0], - iStats[2],iStats[3],iStats[6],iStats[1]) + szName,iUserid,szAuthid,szTeam,szWeapon,iStats[STATSX_SHOTS],iStats[STATSX_HITS],iStats[STATSX_KILLS], + iStats[STATSX_HEADSHOTS],iStats[STATSX_TEAMKILLS],iStats[STATSX_DAMAGE],iStats[STATSX_DEATHS]) log_message("^"%s<%d><%s><%s>^" triggered ^"weaponstats2^" (weapon ^"%s^") (head ^"%d^") (chest ^"%d^") (stomach ^"%d^") (leftarm ^"%d^") (rightarm ^"%d^") (leftleg ^"%d^") (rightleg ^"%d^")", - szName,iUserid,szAuthid,szTeam,szWeapon,iHits[1],iHits[2],iHits[3], - iHits[4],iHits[5],iHits[6],iHits[7]) + szName,iUserid,szAuthid,szTeam,szWeapon,iHits[HIT_HEAD],iHits[HIT_CHEST],iHits[HIT_STOMACH], + iHits[HIT_LEFTARM],iHits[HIT_RIGHTARM],iHits[HIT_LEFTLEG],iHits[HIT_RIGHTLEG]) } } new iTime = get_user_time( id , 1 ) diff --git a/plugins/ts/tsstats.sma b/plugins/ts/tsstats.sma index f60dadd5..91151f10 100755 --- a/plugins/ts/tsstats.sma +++ b/plugins/ts/tsstats.sma @@ -28,7 +28,7 @@ #include <amxmodx> -public get_score(stats[8],body[8]) +public get_score(stats[STATSX_MAX_STATS],body[MAX_BODYHITS]) { - return stats[0] - stats[1] - stats[3] /* kills - deaths - TKs */ + return stats[STATSX_KILLS] - stats[STATSX_DEATHS] - stats[STATSX_TEAMKILLS] /* kills - deaths - TKs */ } From 76378fd5d0083986bf1328cd3b9afdd8c885c9b5 Mon Sep 17 00:00:00 2001 From: justgo97 <hamdi2050@live.com> Date: Thu, 30 Aug 2018 17:43:05 +0100 Subject: [PATCH 42/98] Add get_playersnum_ex (#517) * Allow get_players to get the players num only * used empty brackets instead of zero * Add get_playersnum_ex stock to amxmisc.inc * Added missing empty brackets * Remove brackets from get_players * Fixed a typo in function description * Change letters to flags in get_playersnum_ex description --- plugins/include/amxmisc.inc | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/plugins/include/amxmisc.inc b/plugins/include/amxmisc.inc index 772b7f00..96fb92a8 100755 --- a/plugins/include/amxmisc.inc +++ b/plugins/include/amxmisc.inc @@ -863,9 +863,37 @@ stock set_task_ex(Float:time, const function[], id = 0, const any:parameter[] = * * @noreturn */ -stock get_players_ex(players[MAX_PLAYERS], &num, GetPlayersFlags:flags = GetPlayers_None, const team[] = "") +stock get_players_ex(players[MAX_PLAYERS] = {}, &num, GetPlayersFlags:flags = GetPlayers_None, const team[] = "") { new strFlags[10]; get_flags(_:flags, strFlags, charsmax(strFlags)); get_players(players, num, strFlags, team); } + +/** + * Returns the number of clients on the server that match the specified flags. + * + * @note Example retrieving all alive CTs: + * new AliveCt = get_playersnum_ex(GetPlayers_ExcludeDead | GetPlayers_MatchTeam, "CT") + * + * @param flags Optional filtering flags (enum GetPlayersFlags); valid flags are: + * GetPlayers_None - No filter (Default) + * GetPlayers_ExcludeDead - do not include dead clients + * GetPlayers_ExcludeAlive - do not include alive clients + * GetPlayers_ExcludeBots - do not include bots + * GetPlayers_ExcludeHuman - do not include human clients + * GetPlayers_MatchTeam - match with team + * GetPlayers_MatchNameSubstring - match with part of name + * GetPlayers_CaseInsensitive - match case insensitive + * GetPlayers_ExcludeHLTV - do not include HLTV proxies + * GetPlayers_IncludeConnecting - include connecting clients + * @param team String to match against if the GetPlayers_MatchTeam or GetPlayers_MatchNameSubstring flag is specified + * + * @return Number of clients on the server that match the specified flags + */ +stock get_playersnum_ex(GetPlayersFlags:flags = GetPlayers_None, const team[] = "") +{ + new PlayersNum; + get_players_ex(_, PlayersNum, flags, team); + return PlayersNum; +} From 6e9947b64faabc5d1c0b3cfac626021e8ed48fd9 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Thu, 30 Aug 2018 18:49:42 +0200 Subject: [PATCH 43/98] Sanitize load_amxscript() and add load_amxscript_ex/MF_LoadAmxScriptEx() requiring error max length (#530) * Add a saner version of load_amxscript and use SafeStrcpy/Sprintf * Reflect the change in core * Add LoadAmxScriptEx API function * Reflect the change in CSX * Reflect the change in DodX * Reflect the change in TFCX * Reflect the change in TSX * Add few comments --- amxmodx/CPlugin.cpp | 10 +++--- amxmodx/CPlugin.h | 4 +-- amxmodx/amxmodx.h | 1 + amxmodx/modules.cpp | 58 +++++++++++++++++++------------ modules/cstrike/csx/CRank.cpp | 4 +-- modules/cstrike/csx/CRank.h | 2 +- modules/cstrike/csx/meta_api.cpp | 2 +- modules/dod/dodx/CRank.cpp | 4 +-- modules/dod/dodx/CRank.h | 2 +- modules/dod/dodx/moduleconfig.cpp | 2 +- modules/tfcx/CRank.cpp | 4 +-- modules/tfcx/CRank.h | 2 +- modules/tfcx/moduleconfig.cpp | 2 +- modules/ts/tsx/CRank.cpp | 4 +-- modules/ts/tsx/CRank.h | 2 +- modules/ts/tsx/moduleconfig.cpp | 2 +- public/sdk/amxxmodule.cpp | 5 ++- public/sdk/amxxmodule.h | 3 ++ 18 files changed, 66 insertions(+), 47 deletions(-) diff --git a/amxmodx/CPlugin.cpp b/amxmodx/CPlugin.cpp index 34731d49..eee6d6e6 100755 --- a/amxmodx/CPlugin.cpp +++ b/amxmodx/CPlugin.cpp @@ -18,14 +18,14 @@ extern const char *no_function; -CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error, int debug) +CPluginMngr::CPlugin* CPluginMngr::loadPlugin(const char* path, const char* name, char* error, size_t maxLength, int debug) { CPlugin** a = &head; while (*a) a = &(*a)->next; - *a = new CPlugin(pCounter++, path, name, error, debug); + *a = new CPlugin(pCounter++, path, name, error, maxLength, debug); return (*a); } @@ -137,7 +137,7 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn) continue; } - CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, debugFlag); + CPlugin* plugin = loadPlugin(pluginsDir, pluginName, error, sizeof(error), debugFlag); if (plugin->getStatusCode() == ps_bad_load) { @@ -267,7 +267,7 @@ const char* CPluginMngr::CPlugin::getStatus() const return "error"; } -CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int d) : name(n), title(n), m_pNullStringOfs(nullptr), m_pNullVectorOfs(nullptr) +CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, size_t m, int d) : name(n), title(n), m_pNullStringOfs(nullptr), m_pNullVectorOfs(nullptr) { const char* unk = "unknown"; @@ -280,7 +280,7 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int char* path = build_pathname_r(file, sizeof(file), "%s/%s", p, n); code = 0; memset(&amx, 0, sizeof(AMX)); - int err = load_amxscript(&amx, &code, path, e, d); + int err = load_amxscript_ex(&amx, &code, path, e, m, d); if (err == AMX_ERR_NONE) { diff --git a/amxmodx/CPlugin.h b/amxmodx/CPlugin.h index 791c3a4c..849ce4ca 100755 --- a/amxmodx/CPlugin.h +++ b/amxmodx/CPlugin.h @@ -66,7 +66,7 @@ public: CPlugin* next; int id; - CPlugin(int i, const char* p, const char* n, char* e, int d); + CPlugin(int i, const char* p, const char* n, char* e, size_t m, int d); ~CPlugin(); bool m_Debug; @@ -122,7 +122,7 @@ public: // Interface - CPlugin* loadPlugin(const char* path, const char* name, char* error, int debug); + CPlugin* loadPlugin(const char* path, const char* name, char* error, size_t maxLength, int debug); void unloadPlugin(CPlugin** a); int loadPluginsFromFile(const char* filename, bool warn=true); diff --git a/amxmodx/amxmodx.h b/amxmodx/amxmodx.h index 58d0c32a..7216793a 100755 --- a/amxmodx/amxmodx.h +++ b/amxmodx/amxmodx.h @@ -284,6 +284,7 @@ extern "C" size_t get_amxstring_r(AMX *amx, cell amx_addr, char *destination, in int amxstring_len(cell* cstr); int load_amxscript(AMX* amx, void** program, const char* path, char error[64], int debug); +int load_amxscript_ex(AMX* amx, void** program, const char* path, char *error, size_t maxLength, int debug); int set_amxnatives(AMX* amx, char error[64]); int set_amxstring(AMX *amx, cell amx_addr, const char *source, int max); int set_amxstring_simple(cell *dest, const char *source, int max); diff --git a/amxmodx/modules.cpp b/amxmodx/modules.cpp index 2fe002d6..4f1e5fe3 100755 --- a/amxmodx/modules.cpp +++ b/amxmodx/modules.cpp @@ -108,7 +108,7 @@ static binlogfuncs_t logfuncs = }; #endif -int load_amxscript(AMX *amx, void **program, const char *filename, char error[64], int debug) +int load_amxscript_internal(AMX *amx, void **program, const char *filename, char *error, size_t maxLength, int debug) { *error = 0; size_t bufSize; @@ -127,7 +127,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 if (!*program) { - strcpy(error, "Failed to allocate memory"); + ke::SafeStrcpy(error, maxLength, "Failed to allocate memory"); return (amx->error = AMX_ERR_MEMORY); } @@ -140,31 +140,31 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 case CAmxxReader::Err_None: break; case CAmxxReader::Err_FileOpen: - strcpy(error, "Plugin file open error"); + ke::SafeStrcpy(error, maxLength, "Plugin file open error"); return (amx->error = AMX_ERR_NOTFOUND); case CAmxxReader::Err_FileRead: - strcpy(error, "Plugin file read error"); + ke::SafeStrcpy(error, maxLength, "Plugin file read error"); return (amx->error = AMX_ERR_NOTFOUND); case CAmxxReader::Err_InvalidParam: - strcpy(error, "Internal error: Invalid parameter"); + ke::SafeStrcpy(error, maxLength, "Internal error: Invalid parameter"); return (amx->error = AMX_ERR_NOTFOUND); case CAmxxReader::Err_FileInvalid: - strcpy(error, "Invalid Plugin"); + ke::SafeStrcpy(error, maxLength, "Invalid Plugin"); return (amx->error = AMX_ERR_FORMAT); case CAmxxReader::Err_SectionNotFound: - strcpy(error, "Searched section not found (.amxx)"); + ke::SafeStrcpy(error, maxLength, "Searched section not found (.amxx)"); return (amx->error = AMX_ERR_NOTFOUND); case CAmxxReader::Err_DecompressorInit: - strcpy(error, "Decompressor initialization failed"); + ke::SafeStrcpy(error, maxLength, "Decompressor initialization failed"); return (amx->error = AMX_ERR_INIT); case CAmxxReader::Err_Decompress: - strcpy(error, "Internal error: Decompress"); + ke::SafeStrcpy(error, maxLength, "Internal error: Decompress"); return (amx->error = AMX_ERR_NOTFOUND); case CAmxxReader::Err_OldFile: - strcpy(error, "Plugin uses deprecated format. Update compiler"); + ke::SafeStrcpy(error, maxLength, "Plugin uses deprecated format. Update compiler"); return (amx->error = AMX_ERR_FORMAT); default: - strcpy(error, "Unknown error"); + ke::SafeStrcpy(error, maxLength, "Unknown error"); return (amx->error = AMX_ERR_NOTFOUND); } } else { @@ -178,7 +178,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 if (magic != AMX_MAGIC) { - strcpy(error, "Invalid Plugin"); + ke::SafeStrcpy(error, maxLength, "Invalid Plugin"); return (amx->error = AMX_ERR_FORMAT); } @@ -191,7 +191,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 { if ((hdr->file_version < CUR_FILE_VERSION)) { - sprintf(error, "Plugin needs newer debug version info"); + ke::SafeStrcpy(error, maxLength, "Plugin needs newer debug version info"); return (amx->error = AMX_ERR_VERSION); } else if ((hdr->flags & AMX_FLAG_DEBUG) != 0) @@ -209,13 +209,13 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 { dbg_FreeInfo(pDbg); delete pDbg; - sprintf(error, "Debug loading error %d", err); + ke::SafeSprintf(error, maxLength, "Debug loading error %d", err); return (amx->error = AMX_ERR_INIT); } amx->flags |= AMX_FLAG_DEBUG; } else { - sprintf(error, "Plugin not compiled with debug option"); + ke::SafeStrcpy(error, maxLength, "Plugin not compiled with debug option"); return (amx->error = AMX_ERR_INIT); } } else { @@ -238,7 +238,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 delete pDbg; } - sprintf(error, "Load error %d (invalid file format or version)", err); + ke::SafeSprintf(error, maxLength, "Load error %d (invalid file format or version)", err); return (amx->error = AMX_ERR_INIT); } @@ -276,7 +276,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 { delete[] np; delete[] rt; - strcpy(error, "Failed to initialize JIT'd plugin"); + ke::SafeStrcpy(error, maxLength, "Failed to initialize JIT'd plugin"); return (amx->error = AMX_ERR_INIT); } @@ -307,14 +307,14 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 if (*program == 0) { - strcpy(error, "Failed to allocate memory"); + ke::SafeStrcpy(error, maxLength, "Failed to allocate memory"); return (amx->error = AMX_ERR_MEMORY); } } else { delete[] np; delete[] rt; - sprintf(error, "Failed to initialize plugin (%d)", err); + ke::SafeSprintf(error, maxLength, "Failed to initialize plugin (%d)", err); return (amx->error = AMX_ERR_INIT_JIT); } @@ -325,7 +325,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 if (!script) { - ke::SafeSprintf(error, 64, "Failed to allocate memory for script"); + ke::SafeStrcpy(error, maxLength, "Failed to allocate memory for script"); return (amx->error = AMX_ERR_MEMORY); } @@ -341,7 +341,7 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 { if (amx_Register(amx, core_Natives, -1) != AMX_ERR_NONE) { - sprintf(error, "Plugin uses an unknown function (name \"%s\") - check your modules.ini.", no_function); + ke::SafeSprintf(error, maxLength, "Plugin uses an unknown function (name \"%s\") - check your modules.ini.", no_function); return (amx->error = AMX_ERR_NOTFOUND); } } else { @@ -352,6 +352,17 @@ int load_amxscript(AMX *amx, void **program, const char *filename, char error[64 return (amx->error = AMX_ERR_NONE); } +int load_amxscript_ex(AMX *amx, void **program, const char *filename, char *error, size_t maxLength, int debug) +{ + return load_amxscript_internal(amx, program, filename, error, maxLength, debug); +} + +// Deprecated. Use load_amxscript_ex() or MF_LoadAmxScriptEx() for modules. This function is kept to maintain backward compatibility. +int load_amxscript(AMX *amx, void **program, const char *filename, char error[64], int debug) +{ + return load_amxscript_internal(amx, program, filename, error, 64 /* error max length */, debug); +} + const char *StrCaseStr(const char *as, const char *bs) { static char a[256]; @@ -1759,9 +1770,10 @@ void Module_CacheFunctions() REGISTER_FUNC("GetAmxScriptName", MNF_GetAmxScriptName) REGISTER_FUNC("FindAmxScriptByName", MNF_FindAmxScriptByName) REGISTER_FUNC("FindAmxScriptByAmx", MNF_FindAmxScriptByAmx) - REGISTER_FUNC("LoadAmxScript", load_amxscript) + REGISTER_FUNC("LoadAmxScript", load_amxscript) // Deprecated. Please use LoadAmxScriptEx instead. + REGISTER_FUNC("LoadAmxScriptEx", load_amxscript_ex) REGISTER_FUNC("UnloadAmxScript", unload_amxscript) - + // String / mem in amx scripts support REGISTER_FUNC("SetAmxString", set_amxstring) REGISTER_FUNC("SetAmxStringUTF8Char", set_amxstring_utf8_char) diff --git a/modules/cstrike/csx/CRank.cpp b/modules/cstrike/csx/CRank.cpp index b05bccfe..433b581b 100644 --- a/modules/cstrike/csx/CRank.cpp +++ b/modules/cstrike/csx/CRank.cpp @@ -139,9 +139,9 @@ void RankSystem::clear(){ -bool RankSystem::loadCalc(const char* filename, char* error) +bool RankSystem::loadCalc(const char* filename, char* error, size_t maxLength) { - if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error,0)!=AMX_ERR_NONE)|| + if ((MF_LoadAmxScriptEx(&calc.amx,&calc.code,filename, error, maxLength, 0)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 11 , &calc.amxAddr1, &calc.physAddr1)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr2, &calc.physAddr2)!=AMX_ERR_NONE)|| (MF_AmxFindPublic(&calc.amx,"get_score",&calc.func)!=AMX_ERR_NONE)){ diff --git a/modules/cstrike/csx/CRank.h b/modules/cstrike/csx/CRank.h index ec5e8248..af076612 100644 --- a/modules/cstrike/csx/CRank.h +++ b/modules/cstrike/csx/CRank.h @@ -110,7 +110,7 @@ public: void saveRank( const char* filename ); void loadRank( const char* filename ); RankStats* findEntryInRank(const char* unique, const char* name, bool isip=false); - bool loadCalc(const char* filename, char* error); + bool loadCalc(const char* filename, char* error, size_t maxLength); inline int getRankNum( ) const { return rankNum; } void clear(); void unloadCalc(); diff --git a/modules/cstrike/csx/meta_api.cpp b/modules/cstrike/csx/meta_api.cpp index f438d84f..ca0ff231 100644 --- a/modules/cstrike/csx/meta_api.cpp +++ b/modules/cstrike/csx/meta_api.cpp @@ -421,7 +421,7 @@ void OnAmxxAttach(){ if ( path && *path ) { char error[128]; - g_rank.loadCalc( MF_BuildPathname("%s",path) , error ); + g_rank.loadCalc( MF_BuildPathname("%s",path) , error, sizeof(error)); } if ( !g_rank.begin() ) diff --git a/modules/dod/dodx/CRank.cpp b/modules/dod/dodx/CRank.cpp index 8a5b7462..e8f49272 100644 --- a/modules/dod/dodx/CRank.cpp +++ b/modules/dod/dodx/CRank.cpp @@ -128,9 +128,9 @@ void RankSystem::clear(){ } } -bool RankSystem::loadCalc(const char* filename, char* error) +bool RankSystem::loadCalc(const char* filename, char* error, size_t maxLength) { - if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error,0)!=AMX_ERR_NONE)|| + if ((MF_LoadAmxScriptEx(&calc.amx,&calc.code,filename, error, maxLength, 0)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr1, &calc.physAddr1)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr2, &calc.physAddr2)!=AMX_ERR_NONE)|| (MF_AmxFindPublic(&calc.amx,"get_score",&calc.func)!=AMX_ERR_NONE)){ diff --git a/modules/dod/dodx/CRank.h b/modules/dod/dodx/CRank.h index f354eedc..265f6eb1 100644 --- a/modules/dod/dodx/CRank.h +++ b/modules/dod/dodx/CRank.h @@ -104,7 +104,7 @@ public: void saveRank( const char* filename ); void loadRank( const char* filename ); RankStats* findEntryInRank(const char* unique, const char* name , bool isip = false); - bool loadCalc(const char* filename, char* error); + bool loadCalc(const char* filename, char* error, size_t maxLength); inline int getRankNum( ) const { return rankNum; } void clear(); void unloadCalc(); diff --git a/modules/dod/dodx/moduleconfig.cpp b/modules/dod/dodx/moduleconfig.cpp index ffa0e2e8..00606bfb 100644 --- a/modules/dod/dodx/moduleconfig.cpp +++ b/modules/dod/dodx/moduleconfig.cpp @@ -471,7 +471,7 @@ void OnAmxxAttach() if ( path && *path ) { char error[128]; - g_rank.loadCalc( MF_BuildPathname("%s",path) , error ); + g_rank.loadCalc( MF_BuildPathname("%s",path) , error, sizeof(error)); } if ( !g_rank.begin() ) diff --git a/modules/tfcx/CRank.cpp b/modules/tfcx/CRank.cpp index 5276bcec..6c0a6fd5 100644 --- a/modules/tfcx/CRank.cpp +++ b/modules/tfcx/CRank.cpp @@ -127,9 +127,9 @@ void RankSystem::clear(){ } } -bool RankSystem::loadCalc(const char* filename, char* error) +bool RankSystem::loadCalc(const char* filename, char* error, size_t maxLength) { - if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error,0)!=AMX_ERR_NONE)|| + if ((MF_LoadAmxScriptEx(&calc.amx,&calc.code,filename, error, maxLength, 0)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr1, &calc.physAddr1)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr2, &calc.physAddr2)!=AMX_ERR_NONE)|| (MF_AmxFindPublic(&calc.amx,"get_score",&calc.func)!=AMX_ERR_NONE)){ diff --git a/modules/tfcx/CRank.h b/modules/tfcx/CRank.h index 575e9d42..737cc310 100644 --- a/modules/tfcx/CRank.h +++ b/modules/tfcx/CRank.h @@ -102,7 +102,7 @@ public: void saveRank( const char* filename ); void loadRank( const char* filename ); RankStats* findEntryInRank(const char* unique, const char* name , bool isip = false); - bool loadCalc(const char* filename, char* error); + bool loadCalc(const char* filename, char* error, size_t maxLength); inline int getRankNum( ) const { return rankNum; } void clear(); void unloadCalc(); diff --git a/modules/tfcx/moduleconfig.cpp b/modules/tfcx/moduleconfig.cpp index 0fff9b90..0b8bd5dd 100644 --- a/modules/tfcx/moduleconfig.cpp +++ b/modules/tfcx/moduleconfig.cpp @@ -330,7 +330,7 @@ void OnAmxxAttach() { if ( path && *path ) { char error[128]; - g_rank.loadCalc( MF_BuildPathname("%s",path) , error ); + g_rank.loadCalc( MF_BuildPathname("%s",path), error, sizeof(error)); } if ( !g_rank.begin() ) { diff --git a/modules/ts/tsx/CRank.cpp b/modules/ts/tsx/CRank.cpp index 0a439788..2cb8603e 100644 --- a/modules/ts/tsx/CRank.cpp +++ b/modules/ts/tsx/CRank.cpp @@ -127,9 +127,9 @@ void RankSystem::clear(){ } } -bool RankSystem::loadCalc(const char* filename, char* error) +bool RankSystem::loadCalc(const char* filename, char* error, size_t maxLength) { - if ((MF_LoadAmxScript(&calc.amx,&calc.code,filename,error,0)!=AMX_ERR_NONE)|| + if ((MF_LoadAmxScriptEx(&calc.amx,&calc.code,filename, error, maxLength, 0)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr1, &calc.physAddr1)!=AMX_ERR_NONE)|| (MF_AmxAllot(&calc.amx, 8 , &calc.amxAddr2, &calc.physAddr2)!=AMX_ERR_NONE)|| (MF_AmxFindPublic(&calc.amx,"get_score",&calc.func)!=AMX_ERR_NONE)){ diff --git a/modules/ts/tsx/CRank.h b/modules/ts/tsx/CRank.h index 149796b0..b6cc3ac1 100644 --- a/modules/ts/tsx/CRank.h +++ b/modules/ts/tsx/CRank.h @@ -102,7 +102,7 @@ public: void saveRank( const char* filename ); void loadRank( const char* filename ); RankStats* findEntryInRank(const char* unique, const char* name , bool isip = false ); - bool loadCalc(const char* filename, char* error); + bool loadCalc(const char* filename, char* error, size_t maxLength); inline int getRankNum( ) const { return rankNum; } void clear(); void unloadCalc(); diff --git a/modules/ts/tsx/moduleconfig.cpp b/modules/ts/tsx/moduleconfig.cpp index 158d1789..3beb8323 100644 --- a/modules/ts/tsx/moduleconfig.cpp +++ b/modules/ts/tsx/moduleconfig.cpp @@ -344,7 +344,7 @@ void OnAmxxAttach() if ( path && *path ) { char error[128]; - g_rank.loadCalc( MF_BuildPathname("%s",path) , error ); + g_rank.loadCalc( MF_BuildPathname("%s",path), error, sizeof(error)); } if ( !g_rank.begin() ) { diff --git a/public/sdk/amxxmodule.cpp b/public/sdk/amxxmodule.cpp index c01a0268..1be7b24b 100644 --- a/public/sdk/amxxmodule.cpp +++ b/public/sdk/amxxmodule.cpp @@ -2399,6 +2399,7 @@ PFN_AMX_EXECV g_fn_AmxExecv; PFN_AMX_ALLOT g_fn_AmxAllot; PFN_AMX_FINDPUBLIC g_fn_AmxFindPublic; PFN_LOAD_AMXSCRIPT g_fn_LoadAmxScript; +PFN_LOAD_AMXSCRIPT_EX g_fn_LoadAmxScriptEx; PFN_UNLOAD_AMXSCRIPT g_fn_UnloadAmxScript; PFN_REAL_TO_CELL g_fn_RealToCell; PFN_CELL_TO_REAL g_fn_CellToReal; @@ -2491,7 +2492,8 @@ C_DLLEXPORT int AMXX_Attach(PFN_REQ_FNPTR reqFnptrFunc) REQFUNC("GetAmxScript", g_fn_GetAmxScript, PFN_GET_AMXSCRIPT); REQFUNC("FindAmxScriptByAmx", g_fn_FindAmxScriptByAmx, PFN_FIND_AMXSCRIPT_BYAMX); REQFUNC("FindAmxScriptByName", g_fn_FindAmxScriptByName, PFN_FIND_AMXSCRIPT_BYNAME); - REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT); + REQFUNC("LoadAmxScript", g_fn_LoadAmxScript, PFN_LOAD_AMXSCRIPT); // Deprecated. Please use LoadAmxScriptEx instead. + REQFUNC("LoadAmxScriptEx", g_fn_LoadAmxScriptEx, PFN_LOAD_AMXSCRIPT_EX); REQFUNC("UnloadAmxScript", g_fn_UnloadAmxScript, PFN_UNLOAD_AMXSCRIPT); REQFUNC("GetAmxScriptName", g_fn_GetAmxScriptName, PFN_GET_AMXSCRIPTNAME); @@ -2695,6 +2697,7 @@ void ValidateMacros_DontCallThis_Smiley() MF_AmxFindPublic(0, 0, 0); MF_AmxAllot(0, 0, 0, 0); MF_LoadAmxScript(0, 0, 0, 0, 0); + MF_LoadAmxScriptEx(0, 0, 0, 0, 0, 0); MF_UnloadAmxScript(0, 0); MF_RegisterSPForward(0, 0, 0, 0, 0, 0); MF_RegisterSPForwardByName(0, 0, 0, 0, 0, 0); diff --git a/public/sdk/amxxmodule.h b/public/sdk/amxxmodule.h index bdcddde4..ea635af0 100644 --- a/public/sdk/amxxmodule.h +++ b/public/sdk/amxxmodule.h @@ -2199,6 +2199,7 @@ typedef int (*PFN_AMX_ALLOT) (AMX* /*amx*/, int /*length*/, cell* /*amx_ad typedef int (*PFN_AMX_FINDPUBLIC) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_AMX_FINDNATIVE) (AMX* /*amx*/, const char* /*func name*/, int* /*index*/); typedef int (*PFN_LOAD_AMXSCRIPT) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char[64] /*error info*/, int /* debug */); +typedef int (*PFN_LOAD_AMXSCRIPT_EX) (AMX* /*amx*/, void** /*code*/, const char* /*path*/, char* /*error info*/, size_t /* max length */, int /* debug */); typedef int (*PFN_UNLOAD_AMXSCRIPT) (AMX* /*amx*/,void** /*code*/); typedef cell (*PFN_REAL_TO_CELL) (REAL /*x*/); typedef REAL (*PFN_CELL_TO_REAL) (cell /*x*/); @@ -2274,6 +2275,7 @@ extern PFN_AMX_EXEC g_fn_AmxExec; extern PFN_AMX_ALLOT g_fn_AmxAllot; extern PFN_AMX_FINDPUBLIC g_fn_AmxFindPublic; extern PFN_LOAD_AMXSCRIPT g_fn_LoadAmxScript; +extern PFN_LOAD_AMXSCRIPT_EX g_fn_LoadAmxScriptEx; extern PFN_UNLOAD_AMXSCRIPT g_fn_UnloadAmxScript; extern PFN_REAL_TO_CELL g_fn_RealToCell; extern PFN_CELL_TO_REAL g_fn_CellToReal; @@ -2437,6 +2439,7 @@ void MF_LogError(AMX *amx, int err, const char *fmt, ...); #define MF_AmxAllot g_fn_AmxAllot #define MF_AmxFindNative g_fn_AmxFindNative #define MF_LoadAmxScript g_fn_LoadAmxScript +#define MF_LoadAmxScriptEx g_fn_LoadAmxScriptEx #define MF_UnloadAmxScript g_fn_UnloadAmxScript #define MF_MergeDefinitionFile g_fn_MergeDefinition_File #define amx_ctof g_fn_CellToReal From 1a2dd9e7eaeefa4726a5813f31a4672279163599 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Thu, 30 Aug 2018 19:16:19 +0200 Subject: [PATCH 44/98] Update Fun module (#421) * Fun: Replace ENTINDEX with TypeConversion for consistency * Fun: Add a class wrapping player's data * Fun: Make TraceLine a post forward Reason: as it is it breaks plugins hooking TraceLine because of the original game call is being superceded and other modules can't catch it. It looks like it's this way from the very start fun module has been introduced 13 years ago before. Fakemeta module comes a little later. * Fun: Clean up code * Fun: Toggle PlayerPreThink forward on demand * Fun: Toggle TraceLine forward on demand * Fun: Add HITZONE* constants for use with set/get_user_hitzone() * Fun: Refactor a litte the player class * Fun: Clean up a little more * Fun: Fix typo in set_user_hitzones from previous commit --- modules/fun/fun.cpp | 799 +++++++++++++++---------------------- modules/fun/fun.h | 174 +++++++- modules/fun/moduleconfig.h | 6 +- plugins/include/fun.inc | 29 +- 4 files changed, 514 insertions(+), 494 deletions(-) diff --git a/modules/fun/fun.cpp b/modules/fun/fun.cpp index 44e42790..33a1e377 100644 --- a/modules/fun/fun.cpp +++ b/modules/fun/fun.cpp @@ -11,590 +11,464 @@ // Fun Module // -#include <string.h> #include "fun.h" #include <HLTypeConversion.h> -/* - JGHG says: - - Ok this is what I use below, it may probably not be right with all natives etc but I try to maintain this style to natives. - Note that this is still very much subject to change, regarding return values etc! - (Ok I haven't checked all natives that they comply with this yet, this is just a model I'm working on and which I might implement soon.) - - static cell AMX_NATIVE_CALL nativename(AMX *amx, cell *params) // nativename(argument1, argument2); = 2 params - { - // Description what this native does. <--- Description what this native does - // params[1] = argument1 <--- Description of each argument, so we don't have to allocate new variables and can - // params[2] = argument2 <--- use the ones in params[n] directly, to save some time. - - // Check receiver and sender validity. <--- Check ents, maybe need to do this better and more proper later? - CHECK_PLAYER(params[1]) - CHECK_PLAYER(params[2]) - - // Get * pointer. - edict_t *pPlayer = MF_GetPlayerEdict(params[1]); <--- Players require a different function than INDEXENT because of an HLSDK bug - - return 1 <--- If native succeeded, return 1, if the native isn't supposed to return a specific value. - Note: Should be able to do: if (thenative()) and it should return false when it fails, and true when succeeds... is -1 treated as false, or is 0 a must? - } -*/ - -char g_bodyhits[33][33]; // where can the guy in the first dimension hit the people in the 2nd dimension? :-) -bool g_silent[33]; // used for set_user_footsteps() - HLTypeConversion TypeConversion; +CPlayers Players; -// ######## Utils: -void FUNUTIL_ResetPlayer(int index) +// native get_client_listen(receiver, sender) +static cell AMX_NATIVE_CALL get_client_listening(AMX *amx, cell *params) { - //MF_PrintSrvConsole("Resetting player index %d! maxclients: %d\n", index, gpGlobals->maxClients); - for (int i = 1; i <= gpGlobals->maxClients; i++) { - g_bodyhits[index][i] = (char)((1<<HITGROUP_GENERIC) | - (1<<HITGROUP_HEAD) | - (1<<HITGROUP_CHEST) | - (1<<HITGROUP_STOMACH) | - (1<<HITGROUP_LEFTARM) | - (1<<HITGROUP_RIGHTARM)| - (1<<HITGROUP_LEFTLEG) | - (1<<HITGROUP_RIGHTLEG)); - } - // Reset silent slippers - g_silent[index] = false; + enum args { arg_count, arg_receiver, arg_sender }; + + CHECK_PLAYER(params[arg_receiver]); + CHECK_PLAYER(params[arg_sender]); + + return GETCLIENTLISTENING(params[arg_receiver], params[arg_sender]); } -// ######## Natives: -static cell AMX_NATIVE_CALL get_client_listening(AMX *amx, cell *params) // get_client_listening(receiver, sender); = 2 params +// native set_client_listen(receiver, sender, listen) +static cell AMX_NATIVE_CALL set_client_listening(AMX *amx, cell *params) { - // Gets who can listen to who. - // params[1] = receiver - // params[2] = sender + enum args { arg_count, arg_receiver, arg_sender, arg_listen }; - // Check receiver and sender validity. - CHECK_PLAYER(params[1]); - CHECK_PLAYER(params[2]); + CHECK_PLAYER(params[arg_receiver]); + CHECK_PLAYER(params[arg_sender]); - // GET- AND SETCLIENTLISTENING returns "qboolean", an int, probably 0 or 1... - return GETCLIENTLISTENING(params[1], params[2]); + return SETCLIENTLISTENING(params[arg_receiver], params[arg_sender], params[arg_listen]); } -static cell AMX_NATIVE_CALL set_client_listening(AMX *amx, cell *params) // set_client_listening(receiver, sender, listen); = 3 params +// native set_user_godmode(index, godmode = 0) +static cell AMX_NATIVE_CALL set_user_godmode(AMX *amx, cell *params) { - // Sets who can listen to who. - // params[1] = receiver - // params[2] = sender - // params[3] = listen + enum args { arg_count, arg_user, arg_godmode }; - // Check receiver and sender validity. - CHECK_PLAYER(params[1]); - CHECK_PLAYER(params[2]); + CHECK_PLAYER(params[arg_user]); - // Make a check on params[3] here later, and call run time error when it's wrong. - // To do: find out the possible values to set (0, 1?) + const auto pPlayer = TypeConversion.id_to_edict(params[arg_user]); - // GET- AND SETCLIENTLISTENING returns "qboolean", an int, probably 0 or 1... - return SETCLIENTLISTENING(params[1], params[2], params[3]); -} - -static cell AMX_NATIVE_CALL set_user_godmode(AMX *amx, cell *params) // set_user_godmode(index, godmode = 0); = 2 params -{ - /* Sets player godmode. If you want to disable godmode set only first parameter. */ - // params[1] = index - // params[2] = godmode = 0 - - // Check index. - CHECK_PLAYER(params[1]); - - // Get player pointer. - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); - - if (params[2] == 1) { - // Enable godmode - pPlayer->v.takedamage = 0.0; // 0.0, the player doesn't seem to be able to get hurt. - } - else { - // Disable godmode - pPlayer->v.takedamage = 2.0; // 2.0 seems to be standard value? - } + pPlayer->v.takedamage = params[arg_godmode] != 0 ? DAMAGE_NO : DAMAGE_AIM; return 1; } -static cell AMX_NATIVE_CALL get_user_godmode(AMX *amx, cell *params) // get_user_godmode(index); = 1 param +// native get_user_godmode(index) +static cell AMX_NATIVE_CALL get_user_godmode(AMX *amx, cell *params) { - /* Returns 1 if godmode is set. */ - // params[1] = index + enum args { arg_count, arg_user }; - // Check index. - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_user]); - // Get player pointer. - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + const auto pPlayer = TypeConversion.id_to_edict(params[arg_user]); - int godmode = 0; - - if (pPlayer->v.takedamage == 0.0) { - // God mode is enabled - godmode = 1; - } - - return godmode; + return pPlayer->v.takedamage == DAMAGE_NO; } -static cell AMX_NATIVE_CALL give_item(AMX *amx, cell *params) // native give_item(index, const item[]); = 2 params +// native give_item(index, const item[]) +static cell AMX_NATIVE_CALL give_item(AMX *amx, cell *params) { - /* Gives item to player, name of item can start - * with weapon_, ammo_ and item_. This event - * is announced with proper message to all players. */ - // params[1] = index - // params[2] = item... + enum args { arg_count, arg_index, arg_item }; - // Check index. - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_index]); - // Get player pointer. - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + auto itemLength = 0; + const auto item = MF_GetAmxString(amx, params[arg_item], 1, &itemLength); - // Create item entity pointer - edict_t *pItemEntity; - - // Make an "intstring" out of 2nd parameter - int length; - const char *szItem = MF_GetAmxString(amx, params[2], 1, &length); - - //check for valid item - if (strncmp(szItem, "weapon_", 7) && - strncmp(szItem, "ammo_", 5) && - strncmp(szItem, "item_", 5) && - strncmp(szItem, "tf_weapon_", 10) - ) { + if (!itemLength + ||(strncmp(item, "weapon_", 7) != 0 + && strncmp(item, "ammo_", 5) != 0 + && strncmp(item, "item_", 5) != 0 + && strncmp(item, "tf_weapon_", 10) != 0)) + { return 0; } - //string_t item = MAKE_STRING(szItem); - string_t item = ALLOC_STRING(szItem); // Using MAKE_STRING makes "item" contents get lost when we leave this scope! ALLOC_STRING seems to allocate properly... - // Create the entity, returns to pointer - pItemEntity = CREATE_NAMED_ENTITY(item); + auto pEntity = CREATE_NAMED_ENTITY(ALLOC_STRING(item)); - if (FNullEnt(pItemEntity)) { - MF_LogError(amx, AMX_ERR_NATIVE, "Item \"%s\" failed to create", szItem); + if (FNullEnt(pEntity)) + { + MF_LogError(amx, AMX_ERR_NATIVE, "Item \"%s\" failed to create", item); return 0; } - //VARS(pItemEntity)->origin = VARS(pPlayer)->origin; // nice to do VARS(ent)->origin instead of ent->v.origin? :-I - //I'm not sure, normally I use macros too =P - pItemEntity->v.origin = pPlayer->v.origin; - pItemEntity->v.spawnflags |= SF_NORESPAWN; //SF_NORESPAWN; + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); - MDLL_Spawn(pItemEntity); + pEntity->v.origin = pPlayer->v.origin; + pEntity->v.spawnflags |= SF_NORESPAWN; - int save = pItemEntity->v.solid; + MDLL_Spawn(pEntity); - MDLL_Touch(pItemEntity, ENT(pPlayer)); + const auto oldSolid = pEntity->v.solid; - //The problem with the original give_item was the - // item was not removed. I had tried this but it - // did not work. OLO's implementation is better. - /* - int iEnt = ENTINDEX(pItemEntity->v.owner); - if (iEnt > 32 || iEnt <1 ) { - MDLL_Think(pItemEntity); - }*/ + MDLL_Touch(pEntity, pPlayer); - if (pItemEntity->v.solid == save) { - REMOVE_ENTITY(pItemEntity); - //the function did not fail - we're just deleting the item + if (pEntity->v.solid == oldSolid) + { + REMOVE_ENTITY(pEntity); // The function did not fail - we're just deleting the item return -1; } - return ENTINDEX(pItemEntity); + return TypeConversion.edict_to_id(pEntity); } -static cell AMX_NATIVE_CALL spawn(AMX *amx, cell *params) // spawn(id) = 1 param +// native spawn(index) +static cell AMX_NATIVE_CALL spawn(AMX *amx, cell *params) { - // Spawns an entity, this can be a user/player -> spawns at spawnpoints, or created entities seems to need this as a final "kick" into the game? :-) - // params[1] = entity to spawn + enum args { arg_count, arg_index }; - CHECK_ENTITY(params[1]); + CHECK_ENTITY(params[arg_index]); - edict_t *pEnt = TypeConversion.id_to_edict(params[1]); + const auto pEntity = TypeConversion.id_to_edict(params[arg_index]); - MDLL_Spawn(pEnt); + MDLL_Spawn(pEntity); return 1; } -static cell AMX_NATIVE_CALL set_user_health(AMX *amx, cell *params) // set_user_health(index, health); = 2 arguments +// native set_user_health(index, health) +static cell AMX_NATIVE_CALL set_user_health(AMX *amx, cell *params) { - // Sets user health. If health is 0 and below, also kill... - // params[1] = index - // params[2] = health + enum args { arg_count, arg_index, arg_health }; - // Check index - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_index]); - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); + const auto health = float(params[arg_health]); - // Kill if health too low. - if (params[2] > 0) - pPlayer->v.health = float(params[2]); + if (health > 0.0f) + { + pPlayer->v.health = health; + } else + { MDLL_ClientKill(pPlayer); + } return 1; } -static cell AMX_NATIVE_CALL set_user_frags(AMX *amx, cell *params) // set_user_frags(index, frags); = 2 arguments +// native set_user_frags(index, frags) +static cell AMX_NATIVE_CALL set_user_frags(AMX *amx, cell *params) { - // Sets user frags. - // params[1] = index - // params[2] = frags + enum args { arg_count, arg_index, arg_frags }; - // Check index - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_index]); - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); - pPlayer->v.frags = params[2]; + pPlayer->v.frags = float(params[arg_frags]); return 1; } -static cell AMX_NATIVE_CALL set_user_armor(AMX *amx, cell *params) // set_user_armor(index, armor); = 2 arguments +// native set_user_armor(index, armor) +static cell AMX_NATIVE_CALL set_user_armor(AMX *amx, cell *params) { - // Sets user armor. - // params[1] = index - // params[2] = armor + enum args { arg_count, arg_index, arg_armor }; - // Check index - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_index]); - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); - pPlayer->v.armorvalue = params[2]; + pPlayer->v.armorvalue = float(params[arg_armor]); return 1; } -static cell AMX_NATIVE_CALL set_user_origin(AMX *amx, cell *params) // set_user_origin(index, origin[3]); = 2 arguments +// native set_user_origin(index, const origin[3]) +static cell AMX_NATIVE_CALL set_user_origin(AMX *amx, cell *params) { - // Sets user origin. - // params[1] = index - // params[2] = origin + enum args { arg_count, arg_index, arg_origin }; - // Check index - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_index]); - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); - - cell *newVectorCell = MF_GetAmxAddr(amx, params[2]); + auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); + const auto pVector = MF_GetAmxAddr(amx, params[arg_origin]); SET_SIZE(pPlayer, pPlayer->v.mins, pPlayer->v.maxs); - SET_ORIGIN(pPlayer, Vector((float)newVectorCell[0], (float)newVectorCell[1], (float)newVectorCell[2])); - - return 1; -} - -static cell AMX_NATIVE_CALL set_user_rendering(AMX *amx, cell *params) // set_user_rendering(index, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16); = 7 arguments -{ - // Sets user rendering. - // params[1] = index - // params[2] = fx - // params[3] = r - // params[4] = g - // params[5] = b - // params[6] = render - // params[7] = amount - - // Check index - CHECK_PLAYER(params[1]); - - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); - - pPlayer->v.renderfx = params[2]; - Vector newVector = Vector(float(params[3]), float(params[4]), float(params[5])); - pPlayer->v.rendercolor = newVector; - pPlayer->v.rendermode = params[6]; - pPlayer->v.renderamt = params[7]; - - return 1; -} - -static cell AMX_NATIVE_CALL get_user_rendering(AMX *amx, cell *params) // get_user_rendering(index, &fx = kRenderFxNone, &r = 0, &g = 0, &b = 0, &render = kRenderNormal, &amount = 0); = 7 arguments -{ - // Gets user rendering. - // params[1] = index - // params[2] = fx - // params[3] = r - // params[4] = g - // params[5] = b - // params[6] = render - // params[7] = amount - - // Check index - CHECK_PLAYER(params[1]); - - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); - - *MF_GetAmxAddr(amx, params[2]) = pPlayer->v.renderfx; - *MF_GetAmxAddr(amx, params[3]) = pPlayer->v.rendercolor[0]; - *MF_GetAmxAddr(amx, params[4]) = pPlayer->v.rendercolor[1]; - *MF_GetAmxAddr(amx, params[5]) = pPlayer->v.rendercolor[2]; - *MF_GetAmxAddr(amx, params[6]) = pPlayer->v.rendermode; - *MF_GetAmxAddr(amx, params[7]) = pPlayer->v.renderamt; - - return 1; -} - -static cell AMX_NATIVE_CALL set_user_maxspeed(AMX *amx, cell *params) // set_user_maxspeed(index, Float:speed = -1.0) = 2 arguments -{ - // Sets user maxspeed. - // params[1] = index - // params[2] = speed (should be -1.0 if not specified) (JGHG: unspecified parameters seems to always be -1.0!) - - REAL fNewSpeed = amx_ctof(params[2]); - - // Check index - CHECK_PLAYER(params[1]); - - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); - - SETCLIENTMAXSPEED(pPlayer, fNewSpeed); - pPlayer->v.maxspeed = fNewSpeed; + SET_ORIGIN(pPlayer, Vector(float(pVector[0]), float(pVector[1]), float(pVector[2]))); return 1; } -static cell AMX_NATIVE_CALL get_user_maxspeed(AMX *amx, cell *params) // Float:get_user_maxspeed(index) = 1 argument +// native set_user_rendering(index, fx = kRenderFxNone, r = 0, g = 0, b = 0, render = kRenderNormal, amount = 0) +static cell AMX_NATIVE_CALL set_user_rendering(AMX *amx, cell *params) { - // Gets user maxspeed. - // params[1] = index + enum args { arg_count, arg_index, arg_fx, arg_red, arg_green, arg_blue, arg_render, arg_amount }; - // Check index - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_index]); - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); + + pPlayer->v.renderfx = params[arg_fx]; + pPlayer->v.rendercolor = Vector(float(params[arg_red]), float(params[arg_green]), float(params[arg_blue])); + pPlayer->v.rendermode = params[arg_render]; + pPlayer->v.renderamt = float(params[arg_amount]); + + return 1; +} + +// get_user_rendering(index, &fx = kRenderFxNone, &r = 0, &g = 0, &b = 0, &render = kRenderNormal, &amount = 0); +static cell AMX_NATIVE_CALL get_user_rendering(AMX *amx, cell *params) +{ + enum args { arg_count, arg_index, arg_fx, arg_red, arg_green, arg_blue, arg_render, arg_amount }; + + CHECK_PLAYER(params[arg_index]); + + auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); + + *MF_GetAmxAddr(amx, params[arg_fx]) = pPlayer->v.renderfx; + *MF_GetAmxAddr(amx, params[arg_red]) = pPlayer->v.rendercolor[0]; + *MF_GetAmxAddr(amx, params[arg_green]) = pPlayer->v.rendercolor[1]; + *MF_GetAmxAddr(amx, params[arg_blue]) = pPlayer->v.rendercolor[2]; + *MF_GetAmxAddr(amx, params[arg_render]) = pPlayer->v.rendermode; + *MF_GetAmxAddr(amx, params[arg_amount]) = pPlayer->v.renderamt; + + return 1; +} + +// native set_user_maxspeed(index, Float:speed = -1.0) +static cell AMX_NATIVE_CALL set_user_maxspeed(AMX *amx, cell *params) +{ + enum args { arg_count, arg_index, arg_speed }; + + CHECK_PLAYER(params[arg_index]); + + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); + const auto newSpeed = amx_ctof(params[arg_speed]); + + SETCLIENTMAXSPEED(pPlayer, newSpeed); + pPlayer->v.maxspeed = newSpeed; + + return 1; +} + +// native Float:get_user_maxspeed(index) +static cell AMX_NATIVE_CALL get_user_maxspeed(AMX *amx, cell *params) +{ + enum args { arg_count, arg_index }; + + CHECK_PLAYER(params[arg_index]); + + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); return amx_ftoc(pPlayer->v.maxspeed); } -static cell AMX_NATIVE_CALL set_user_gravity(AMX *amx, cell *params) // set_user_gravity(index, Float:gravity = 1.0) = 2 arguments +// native set_user_gravity(index, Float:gravity = 1.0) +static cell AMX_NATIVE_CALL set_user_gravity(AMX *amx, cell *params) { - // Sets user gravity. - // params[1] = index - // params[2] = gravity (=-1.0) - // Check index - CHECK_PLAYER(params[1]); + enum args { arg_count, arg_index, arg_gravity }; - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + CHECK_PLAYER(params[arg_index]); - pPlayer->v.gravity = amx_ctof(params[2]); + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); + + pPlayer->v.gravity = amx_ctof(params[arg_gravity]); return 1; } -static cell AMX_NATIVE_CALL get_user_gravity(AMX *amx, cell *params) // Float:get_user_gravity(index) = 1 argument +// native Float:get_user_gravity(index) +static cell AMX_NATIVE_CALL get_user_gravity(AMX *amx, cell *params) { - // Gets user gravity. - // params[1] = index + enum args { arg_count, arg_index }; - // Check index - CHECK_PLAYER(params[1]); + CHECK_PLAYER(params[arg_index]); - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); - return amx_ftoc(pPlayer->v.gravity); + return amx_ftoc(pPlayer->v.gravity); } -static cell AMX_NATIVE_CALL set_user_hitzones(AMX *amx, cell *params) // set_user_hitzones(index = 0, target = 0, body = 255); = 3 arguments +// native set_user_hitzones(index = 0, target = 0, body = HITZONES_DEFAULT) +static cell AMX_NATIVE_CALL set_user_hitzones(AMX *amx, cell *params) { - // Sets user hitzones. - // params[1] = the one(s) who shoot(s), shooter - int shooter = params[1]; + enum args { arg_count, arg_attacker, arg_target, arg_hitzones }; - // params[2] = the one getting hit - int gettingHit = params[2]; + const int attacker = params[arg_attacker]; + const int target = params[arg_target]; + const int hitzones = params[arg_hitzones]; - // params[3] = specified hit zones - int hitzones = params[3]; - - //set_user_hitzones(id, 0, 0) // Makes ID not able to shoot EVERYONE - id can shoot on 0 (all) at 0 - //set_user_hitzones(0, id, 0) // Makes EVERYONE not able to shoot ID - 0 (all) can shoot id at 0 - if (shooter == 0 && gettingHit == 0) { - for (int i = 1; i <= gpGlobals->maxClients; i++) { - for (int j = 1; j <= gpGlobals->maxClients; j++) { - g_bodyhits[i][j] = hitzones; - } - //g_zones_toHit[i] = hitzones; - //g_zones_getHit[i] = hitzones; - } + if (attacker == 0 && target == 0) + { + Players.SetEveryoneBodyHits(hitzones); } - else if (shooter == 0 && gettingHit != 0) { - // "All" shooters, target (gettingHit) should be existing player id - CHECK_PLAYER(gettingHit); - // Where can all hit gettingHit? - for (int i = 1; i <= gpGlobals->maxClients; i++) - g_bodyhits[i][gettingHit] = hitzones; + else if (attacker == 0 && target != 0) + { + CHECK_PLAYER(target); + + Players.SetAttackersBodyHits(target, hitzones); } - else if (shooter != 0 && gettingHit == 0) { - // Shooter can hit all in bodyparts. - CHECK_PLAYER(shooter); - for (int i = 1; i <= gpGlobals->maxClients; i++) - g_bodyhits[shooter][i] = hitzones; + else if (attacker != 0 && target == 0) + { + CHECK_PLAYER(attacker); + + Players.SetTargetsBodyHits(attacker, hitzones); } - else { - // Specified, where can player A hit player B? - CHECK_PLAYER(shooter); - CHECK_PLAYER(gettingHit); - g_bodyhits[shooter][gettingHit] = hitzones; - } - - return 1; -} - -static cell AMX_NATIVE_CALL get_user_hitzones(AMX *amx, cell *params) // get_user_hitzones(index, target); = 2 arguments -{ - int shooter = params[1]; - CHECK_PLAYER(shooter); - int target = params[2]; - CHECK_PLAYER(target); - return g_bodyhits[shooter][target]; -} - -static cell AMX_NATIVE_CALL set_user_noclip(AMX *amx, cell *params) // set_user_noclip(index, noclip = 0); = 2 arguments -{ - // Sets user to no clipping mode. - // params[1] = index - // params[2] = no clip or not... - - // Check index - CHECK_PLAYER(params[1]); - - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); - - if (params[2] == 1) - pPlayer->v.movetype = MOVETYPE_NOCLIP; else - pPlayer->v.movetype = MOVETYPE_WALK; + { + CHECK_PLAYER(attacker); + CHECK_PLAYER(target); + + Players.SetBodyHits(attacker, target, hitzones); + } + + g_pengfuncsTable_Post->pfnTraceLine = Players.HaveBodyHits() ? TraceLine_Post : nullptr; return 1; } -static cell AMX_NATIVE_CALL get_user_noclip(AMX *amx, cell *params) // get_user_noclip(index); = 1 argument +// native get_user_hitzones(index, target) +static cell AMX_NATIVE_CALL get_user_hitzones(AMX *amx, cell *params) { - // Gets user noclip. - // params[1] = index + enum args { arg_count, arg_attacker, arg_target }; - // Check index - CHECK_PLAYER(params[1]); + const auto attacker = params[arg_attacker]; - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + CHECK_PLAYER(attacker); + + const auto target = params[arg_target]; + + CHECK_PLAYER(target); + + return Players[attacker].GetBodyHits(target); +} + +// native set_user_noclip(index, noclip = 0) +static cell AMX_NATIVE_CALL set_user_noclip(AMX *amx, cell *params) +{ + enum args { arg_count, arg_index, arg_noclip }; + + CHECK_PLAYER(params[arg_index]); + + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); + + pPlayer->v.movetype = params[arg_noclip] != 0 ? MOVETYPE_NOCLIP : MOVETYPE_WALK; + + return 1; +} + +// native get_user_noclip(index) +static cell AMX_NATIVE_CALL get_user_noclip(AMX *amx, cell *params) +{ + enum args { arg_count, arg_index }; + + CHECK_PLAYER(params[arg_index]); + + const auto pPlayer = TypeConversion.id_to_edict(params[arg_index]); return pPlayer->v.movetype == MOVETYPE_NOCLIP; } -// JustinHoMi made this one originally -static cell AMX_NATIVE_CALL set_user_footsteps(AMX *amx, cell *params) // set_user_footsteps(id, set = 1); = 2 params +// native set_user_footsteps(id, set = 1) +static cell AMX_NATIVE_CALL set_user_footsteps(AMX *amx, cell *params) { - // Gives player silent footsteps. - // if set=0 it will return footsteps to normal - // params[1] = index of player - // params[2] = 0 = normal footstep sound, 1 = silent slippers + enum args { arg_count, arg_index, arg_footsteps }; - // Check index - CHECK_PLAYER(params[1]); + const auto index = params[arg_index]; - // Fetch player pointer - edict_t *pPlayer = TypeConversion.id_to_edict(params[1]); + CHECK_PLAYER(index); - if (params[2]) { + const auto pPlayer = TypeConversion.id_to_edict(index); + + if (params[arg_footsteps] != 0) + { pPlayer->v.flTimeStepSound = 999; - g_silent[params[1]] = true; + Players[index].SetSilentFootsteps(true); + + g_pFunctionTable->pfnPlayerPreThink = PlayerPreThink; } - else { + else + { pPlayer->v.flTimeStepSound = STANDARDTIMESTEPSOUND; - g_silent[params[1]] = false; + Players[index].SetSilentFootsteps(false); + + if (g_pFunctionTable->pfnPlayerPreThink && !Players.HaveSilentFootsteps()) + { + g_pFunctionTable->pfnPlayerPreThink = nullptr; + } } return 1; } +// native get_user_footsteps(index) static cell AMX_NATIVE_CALL get_user_footsteps(AMX *amx, cell *params) { - CHECK_PLAYER(params[1]); + enum args { arg_count, arg_index }; - return g_silent[params[1]]; + const auto index = params[arg_index]; + + CHECK_PLAYER(index); + + return Players[index].HasSilentFootsteps(); } -// SidLuke -static cell AMX_NATIVE_CALL strip_user_weapons(AMX *amx, cell *params) // index +// native strip_user_weapons(index) +static cell AMX_NATIVE_CALL strip_user_weapons(AMX *amx, cell *params) { - CHECK_PLAYER(params[1]); + enum args { arg_count, arg_index }; - edict_t* pPlayer = TypeConversion.id_to_edict(params[1]); + const auto index = params[arg_index]; - string_t item = MAKE_STRING("player_weaponstrip"); - edict_t *pent = CREATE_NAMED_ENTITY(item); + CHECK_PLAYER(index); - if (FNullEnt(pent)) + const auto pPlayer = TypeConversion.id_to_edict(index); + const auto pEntity = CREATE_NAMED_ENTITY(MAKE_STRING("player_weaponstrip")); + + if (FNullEnt(pEntity)) { return 0; } - MDLL_Spawn(pent); - MDLL_Use(pent, pPlayer); - REMOVE_ENTITY(pent); + MDLL_Spawn(pEntity); + MDLL_Use(pEntity, pPlayer); + REMOVE_ENTITY(pEntity); - *reinterpret_cast<int *>(MF_PlayerPropAddr(params[1], Player_CurrentWeapon)) = 0; + *reinterpret_cast<int *>(MF_PlayerPropAddr(index, Player_CurrentWeapon)) = 0; return 1; } -AMX_NATIVE_INFO fun_Exports[] = { - {"get_client_listen", get_client_listening}, - {"set_client_listen", set_client_listening}, - {"set_user_godmode", set_user_godmode}, - {"get_user_godmode", get_user_godmode}, - {"set_user_health", set_user_health}, - {"give_item", give_item}, - {"spawn", spawn}, - {"set_user_frags", set_user_frags}, - {"set_user_armor", set_user_armor}, - {"set_user_origin", set_user_origin}, - {"set_user_rendering", set_user_rendering}, - {"get_user_rendering", get_user_rendering}, - {"set_user_maxspeed", set_user_maxspeed}, - {"get_user_maxspeed", get_user_maxspeed}, - {"set_user_gravity", set_user_gravity}, - {"get_user_gravity", get_user_gravity}, - {"get_user_footsteps", get_user_footsteps}, - {"set_user_hitzones", set_user_hitzones}, - {"get_user_hitzones", get_user_hitzones}, - {"set_user_noclip", set_user_noclip}, - {"get_user_noclip", get_user_noclip}, - {"set_user_footsteps", set_user_footsteps}, - {"strip_user_weapons", strip_user_weapons}, - /////////////////// <--- 19 chars max in current small version - {NULL, NULL} + +AMX_NATIVE_INFO fun_Exports[] = +{ + { "get_client_listen" , get_client_listening }, + { "set_client_listen" , set_client_listening }, + { "set_user_godmode" , set_user_godmode }, + { "get_user_godmode" , get_user_godmode }, + { "set_user_health" , set_user_health }, + { "give_item" , give_item }, + { "spawn" , spawn }, + { "set_user_frags" , set_user_frags }, + { "set_user_armor" , set_user_armor }, + { "set_user_origin" , set_user_origin }, + { "set_user_rendering", set_user_rendering }, + { "get_user_rendering", get_user_rendering }, + { "set_user_maxspeed" , set_user_maxspeed }, + { "get_user_maxspeed" , get_user_maxspeed }, + { "set_user_gravity" , set_user_gravity }, + { "get_user_gravity" , get_user_gravity }, + { "get_user_footsteps", get_user_footsteps }, + { "set_user_hitzones" , set_user_hitzones }, + { "get_user_hitzones" , get_user_hitzones }, + { "set_user_noclip" , set_user_noclip }, + { "get_user_noclip" , get_user_noclip }, + { "set_user_footsteps", set_user_footsteps }, + { "strip_user_weapons", strip_user_weapons }, + { nullptr , nullptr } }; -/******************************************************************************************/ + void PlayerPreThink(edict_t *pEntity) { - if (g_silent[ENTINDEX(pEntity)]) { - pEntity->v.flTimeStepSound = 999; + const auto index = TypeConversion.edict_to_id(pEntity); + + if (Players[index].HasSilentFootsteps()) + { + pEntity->v.flTimeStepSound = 999; RETURN_META(MRES_HANDLED); } @@ -603,76 +477,51 @@ void PlayerPreThink(edict_t *pEntity) int ClientConnect(edict_t *pPlayer, const char *pszName, const char *pszAddress, char szRejectReason[128]) { - // Reset stuff: - FUNUTIL_ResetPlayer(ENTINDEX(pPlayer)); + const auto index = TypeConversion.edict_to_id(pPlayer); + + Players[index].Clear(); RETURN_META_VALUE(MRES_IGNORED, 0); } -void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *shooter, TraceResult *ptr) { - TRACE_LINE(v1, v2, fNoMonsters, shooter, ptr); - if ( ptr->pHit && (ptr->pHit->v.flags& (FL_CLIENT | FL_FAKECLIENT)) - && shooter && (shooter->v.flags & (FL_CLIENT | FL_FAKECLIENT)) ) { - int shooterIndex = ENTINDEX(shooter); - if ( !(g_bodyhits[shooterIndex][ENTINDEX(ptr->pHit)] & (1<<ptr->iHitgroup)) ) +void TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t *shooter, TraceResult *ptr) +{ + if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT)) + && shooter && (shooter->v.flags & (FL_CLIENT | FL_FAKECLIENT)) ) + { + const auto shooterIndex = TypeConversion.edict_to_id(shooter); + const auto targetIndex = TypeConversion.edict_to_id(ptr->pHit); + + if (!(Players[shooterIndex].GetBodyHits(targetIndex) & (1 << ptr->iHitgroup))) + { ptr->flFraction = 1.0; + RETURN_META(MRES_HANDLED); + } } - RETURN_META(MRES_SUPERCEDE); + + RETURN_META(MRES_IGNORED); } -//int g_hitIndex, g_canTargetGetHit, g_canShooterHitThere; -//void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *shooter, TraceResult *ptr) { -// if (!pentToSkip || (pentToSkip->v.flags & (FL_CLIENT | FL_FAKECLIENT)) == false || pentToSkip->v.deadflag != DEAD_NO) -// RETURN_META(MRES_IGNORED); -// -// TRACE_LINE(v1, v2, fNoMonsters, shooter, ptr); // Filter shooter -// -// if (!ptr->pHit || (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT)) == false ) -// RETURN_META(MRES_SUPERCEDE); -// -// g_hitIndex = ENTINDEX(ptr->pHit); -// //bool blocked = false; -// g_canTargetGetHit = g_zones_getHit[g_hitIndex] & (1 << ptr->iHitgroup); -// g_canShooterHitThere = g_zones_toHit[ENTINDEX(shooter)] & (1 << ptr->iHitgroup); -// -// if (!g_canTargetGetHit || !g_canShooterHitThere) { -// ptr->flFraction = 1.0; // set to not hit anything (1.0 = shot doesn't hit anything) -// //blocked = true; -// } -// /* -// if (blocked) { -// MF_PrintSrvConsole("%s was blocked from hitting %s: %d and %d\n", MF_GetPlayerName(ENTINDEX(pentToSkip)), MF_GetPlayerName(hitIndex), canTargetGetHit, canShooterHitThere); -// } -// else { -// MF_PrintSrvConsole("%s was NOT blocked from hitting %s: %d and %d\n", MF_GetPlayerName(ENTINDEX(pentToSkip)), MF_GetPlayerName(hitIndex), canTargetGetHit, canShooterHitThere); -// } -// */ -// -// RETURN_META(MRES_SUPERCEDE); -//} - void OnAmxxAttach() { MF_AddNatives(fun_Exports); } -// The content of OnPluginsLoaded() was moved from OnAmxxAttach with AMXx 1.5 because for some reason gpGlobals->maxClients wasn't -// initialized to its proper value until some time after OnAmxxAttach(). In OnAmxxAttach() it always showed 0. /JGHG -void OnPluginsLoaded() { - // Reset stuff - hopefully this should - for (int i = 1; i <= gpGlobals->maxClients; i++) { - // Reset all hitzones - FUNUTIL_ResetPlayer(i); - } +void OnPluginsLoaded() +{ + Players.Clear(); TypeConversion.init(); + + g_pFunctionTable->pfnPlayerPreThink = nullptr; + g_pengfuncsTable_Post->pfnTraceLine = nullptr; } -/* -void ClientConnectFakeBot(int index) + +void ServerDeactivate() { - FUNUTIL_ResetPlayer(index); - //MF_Log("A bot connects, forwarded to fun! The bot is %d!", index); - //CPlayer* player; + g_pFunctionTable->pfnPlayerPreThink = nullptr; + g_pengfuncsTable_Post->pfnTraceLine = nullptr; + + RETURN_META(MRES_IGNORED); } -*/ diff --git a/modules/fun/fun.h b/modules/fun/fun.h index 7b9f4fdc..75e391b1 100644 --- a/modules/fun/fun.h +++ b/modules/fun/fun.h @@ -11,7 +11,9 @@ // Fun Module // -#include "amxxmodule.h" +#pragma once + +#include <amxxmodule.h> // Fun-specific defines below #define GETCLIENTLISTENING (*g_engfuncs.pfnVoice_GetClientListening) @@ -29,19 +31,181 @@ #define HITGROUP_RIGHTARM 5 // 32 #define HITGROUP_LEFTLEG 6 // 64 #define HITGROUP_RIGHTLEG 7 // 128 +#define HITGROUP_MAX 8 + +extern DLL_FUNCTIONS *g_pFunctionTable; +extern enginefuncs_t *g_pengfuncsTable_Post; + +void PlayerPreThink(edict_t *pEntity); +void TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t *shooter, TraceResult *ptr); + +static const auto kHitGroupsBits = (1 << HITGROUP_MAX) - 1; +static const auto kMaxClients = 32u; + +class CPlayer +{ + public: + + CPlayer() + { + Clear(); + } + + public: + + bool HasBodyHits() const + { + for (auto i = 1; i <= gpGlobals->maxClients; ++i) + { + if (GetBodyHits(i) != kHitGroupsBits) + { + return true; + } + } + + return false; + } + + int GetBodyHits(const int other) const + { + return bodyHits_[other]; + } + + void SetBodyHits(const int other, const int flags) + { + bodyHits_[other] = flags; + } + + void SetBodyHits(const int flags) + { + memset(bodyHits_, flags, sizeof bodyHits_); + } + + public: + + bool HasSilentFootsteps() const + { + return silentFootsteps_; + } + + void SetSilentFootsteps(const bool state) + { + silentFootsteps_ = state; + } + + public: + + void Clear() + { + SetBodyHits(kHitGroupsBits); + SetSilentFootsteps(false); + } + + private: + + int bodyHits_[kMaxClients + 1] {}; + bool silentFootsteps_ {}; +}; + +class CPlayers +{ + using Internal = CPlayer; + + public: + + bool HaveBodyHits() const + { + for (auto i = 1; i <= gpGlobals->maxClients; ++i) + { + if (players_[i].HasBodyHits()) + { + return true; + } + } + + return false; + } + + void SetBodyHits(const int attacker, const int target, const int flags) + { + players_[attacker].SetBodyHits(target, flags); + } + + void SetTargetsBodyHits(const int attacker, const int flags) + { + players_[attacker].SetBodyHits(flags); + } + + void SetAttackersBodyHits(const int target, const int flags) + { + for (auto i = 1; i <= gpGlobals->maxClients; ++i) + { + players_[i].SetBodyHits(target, flags); + } + } + + void SetEveryoneBodyHits(const int flags) + { + for (auto i = 1; i <= gpGlobals->maxClients; ++i) + { + players_[i].SetBodyHits(flags); + } + } + + public: + + bool HaveSilentFootsteps() const + { + for (auto i = 1; i <= gpGlobals->maxClients; ++i) + { + if (players_[i].HasSilentFootsteps()) + { + return true; + } + } + + return false; + } + + public: + + void Clear() + { + for (auto i = 1; i <= gpGlobals->maxClients; ++i) + { + players_[i].Clear(); + } + } + + public: + + Internal& operator [](const size_t index) + { + return players_[index]; + } + + const Internal& operator [](const size_t index) const + { + return players_[index]; + } + + private: + + Internal players_[kMaxClients + 1]; +}; #define CHECK_ENTITY(x) \ - if (x < 0 || x > gpGlobals->maxEntities) { \ + if ((x) < 0 || (x) > gpGlobals->maxEntities) { \ MF_LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", x); \ return 0; \ } else { \ - if (x <= gpGlobals->maxClients) { \ + if ((x) <= gpGlobals->maxClients) { \ if (!MF_IsPlayerIngame(x)) { \ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid player %d (not in-game)", x); \ return 0; \ } \ } else { \ - if (x != 0 && FNullEnt(TypeConversion.id_to_edict(x))) { \ + if ((x) != 0 && FNullEnt(TypeConversion.id_to_edict(x))) { \ MF_LogError(amx, AMX_ERR_NATIVE, "Invalid entity %d", x); \ return 0; \ } \ @@ -49,7 +213,7 @@ } #define CHECK_PLAYER(x) \ - if (x < 1 || x > gpGlobals->maxClients) { \ + if ((x) < 1 || (x) > gpGlobals->maxClients) { \ MF_LogError(amx, AMX_ERR_NATIVE, "Player out of range (%d)", x); \ return 0; \ } else { \ diff --git a/modules/fun/moduleconfig.h b/modules/fun/moduleconfig.h index 06c8b963..292fb31d 100644 --- a/modules/fun/moduleconfig.h +++ b/modules/fun/moduleconfig.h @@ -119,8 +119,8 @@ // #define FN_ClientCommand ClientCommand /* pfnClientCommand() (wd) Player has sent a command (typed or from a bind) */ // #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */ // #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */ -// #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */ -#define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */ +#define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */ +// #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */ // #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */ // #define FN_StartFrame StartFrame /* pfnStartFrame() */ // #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */ @@ -232,7 +232,7 @@ // #define FN_SetOrigin SetOrigin // #define FN_EmitSound EmitSound // #define FN_EmitAmbientSound EmitAmbientSound -#define FN_TraceLine TraceLine +// #define FN_TraceLine TraceLine // #define FN_TraceToss TraceToss // #define FN_TraceMonsterHull TraceMonsterHull // #define FN_TraceHull TraceHull diff --git a/plugins/include/fun.inc b/plugins/include/fun.inc index a68213a8..f9deff44 100755 --- a/plugins/include/fun.inc +++ b/plugins/include/fun.inc @@ -21,6 +21,21 @@ #pragma loadlib fun #endif + +/** + * Parts of body for hits, for use with set_user_hitzones(). + */ +const HITZONE_GENERIC = (1 << HIT_GENERIC); // 1 +const HITZONE_HEAD = (1 << HIT_HEAD); // 2 +const HITZONE_CHEST = (1 << HIT_CHEST); // 4 +const HITZONE_STOMATCH = (1 << HIT_STOMATCH); // 8 +const HITZONE_LEFTARM = (1 << HIT_LEFTARM); // 16 +const HITZONE_RIGHTARM = (1 << HIT_RIGHTARM); // 32 +const HITZONE_LEFTLEG = (1 << HIT_LEFTLEG); // 64 +const HITZONE_RIGHTLEG = (1 << HIT_RIGHTLEG); // 128 +const HITZONES_DEFAULT = HITZONE_GENERIC | HITZONE_HEAD | HITZONE_CHEST | HITZONE_STOMATCH | + HITZONE_LEFTARM | HITZONE_RIGHTARM | HITZONE_LEFTLEG | HITZONE_RIGHTLEG; // 255 + /** * Tells whether receiver hears sender via voice communication. * @@ -169,26 +184,18 @@ native give_item(index, const item[]); * * @param index Client index * @param target The target player - * @param body A bitsum of the body parts that can/can't be shot: - * 1 - generic - * 2 - head - * 4 - chest - * 8 - stomach - * 16 - left arm - * 32 - right arm - * 64 - left leg - * 128 - right leg + * @param body A bitsum of the body parts that can/can't be shot. See HITZONE* constants. * * @noreturn * @error If player is not connected or not within the range * of 1 to MaxClients. */ -native set_user_hitzones(index = 0, target = 0, body = 255); +native set_user_hitzones(index = 0, target = 0, body = HITZONES_DEFAULT); /** * Gets the set of hit zone "rules" between @index and @target players. * - * @note For the body part bitsum take a look at the set_user_hitzones() native. + * @note For the body part bitsum, see HITZONE* constants. * * @param index Client index * @param target The target player From 879b061bc835ec1ed1a43855a74b54b2f4ab370a Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Thu, 30 Aug 2018 20:26:39 +0200 Subject: [PATCH 45/98] Make the "body" param in get_user_aiming() optional (#532) * Make the body param optional * Add HIT_ constant note --- plugins/include/amxmodx.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index a60bd0ad..98630819 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -1010,6 +1010,7 @@ native get_user_attacker(index, ...); * * @note If the trace does not hit a client, id and body will be set to 0. * @note If the trace hits nothing within the specified distance, 0 is returned. + * @note For a list of possible body hitplaces see the HIT_* constants in amxconst.inc. * * @param index Client index to trace aim from * @param id Variable to store hit client index (if applicable) @@ -1020,7 +1021,7 @@ native get_user_attacker(index, ...); * @error If the client index is not within the range of 1 to * MaxClients, an error will be thrown. */ -native Float:get_user_aiming(index, &id, &body, dist = 9999); +native Float:get_user_aiming(index, &id, &body = HIT_GENERIC, dist = 9999); /** * Returns the client's frags. From e0ca2c967cf6df7e87eb637a59ce4ed09f567dad Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 1 Sep 2018 12:30:12 +0200 Subject: [PATCH 46/98] Fix a windows compilation warning in socket module (#538) --- modules/sockets/sockets.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/sockets/sockets.cpp b/modules/sockets/sockets.cpp index 7b3ed877..16b26b0d 100644 --- a/modules/sockets/sockets.cpp +++ b/modules/sockets/sockets.cpp @@ -15,8 +15,8 @@ #include <amtl/am-string.h> #ifdef _WIN32 - #include <winsock2.h> - #include <ws2tcpip.h> + #include <WinSock2.h> + #include <WS2tcpip.h> #undef errno #undef close @@ -24,6 +24,9 @@ #define errno WSAGetLastError() #define close(sockfd) closesocket(sockfd) + #undef EINPROGRESS + #undef EWOULDBLOCK + #define EINPROGRESS WSAEINPROGRESS #define EWOULDBLOCK WSAEWOULDBLOCK #else From 8c0f97d6bbf7290641eb7c49c4f7f2c4cf322610 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 1 Sep 2018 18:51:14 +0200 Subject: [PATCH 47/98] Fix typo in fun include (#541) --- plugins/include/fun.inc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/include/fun.inc b/plugins/include/fun.inc index f9deff44..0dd35ebc 100755 --- a/plugins/include/fun.inc +++ b/plugins/include/fun.inc @@ -28,12 +28,12 @@ const HITZONE_GENERIC = (1 << HIT_GENERIC); // 1 const HITZONE_HEAD = (1 << HIT_HEAD); // 2 const HITZONE_CHEST = (1 << HIT_CHEST); // 4 -const HITZONE_STOMATCH = (1 << HIT_STOMATCH); // 8 +const HITZONE_STOMACH = (1 << HIT_STOMACH); // 8 const HITZONE_LEFTARM = (1 << HIT_LEFTARM); // 16 const HITZONE_RIGHTARM = (1 << HIT_RIGHTARM); // 32 const HITZONE_LEFTLEG = (1 << HIT_LEFTLEG); // 64 const HITZONE_RIGHTLEG = (1 << HIT_RIGHTLEG); // 128 -const HITZONES_DEFAULT = HITZONE_GENERIC | HITZONE_HEAD | HITZONE_CHEST | HITZONE_STOMATCH | +const HITZONES_DEFAULT = HITZONE_GENERIC | HITZONE_HEAD | HITZONE_CHEST | HITZONE_STOMACH | HITZONE_LEFTARM | HITZONE_RIGHTARM | HITZONE_LEFTLEG | HITZONE_RIGHTLEG; // 255 /** From 736efdb370c1a52f37030edc481787169dd63a7c Mon Sep 17 00:00:00 2001 From: Arkshine <github@arkshine.me> Date: Sun, 2 Sep 2018 13:12:59 +0200 Subject: [PATCH 48/98] Adjust version --- product.version | 2 +- public/amxmodx_version.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/product.version b/product.version index 2e20c4ca..b57588e5 100644 --- a/product.version +++ b/product.version @@ -1 +1 @@ -1.8.3-dev +1.9.0-dev diff --git a/public/amxmodx_version.h b/public/amxmodx_version.h index d8fde6a4..04d9e1d0 100644 --- a/public/amxmodx_version.h +++ b/public/amxmodx_version.h @@ -21,13 +21,13 @@ #define AMXX_BUILD_LOCAL_REV "0" #define AMXX_BUILD_CSET "0" #define AMXX_BUILD_MAJOR "1" - #define AMXX_BUILD_MINOR "8" - #define AMXX_BUILD_RELEASE "3" + #define AMXX_BUILD_MINOR "9" + #define AMXX_BUILD_RELEASE "0" #define AMXX_BUILD_UNIQUEID AMXX_BUILD_LOCAL_REV ":" AMXX_BUILD_CSET #define AMXX_VERSION_STRING AMXX_BUILD_MAJOR "." AMXX_BUILD_MINOR "." AMXX_BUILD_RELEASE "-" AMXX_BUILD_TAG - #define AMXX_VERSION_FILE 1,8,3,0 + #define AMXX_VERSION_FILE 1,9,0,0 #endif #define AMXX_BUILD_TIMESTAMP __DATE__ " " __TIME__ From 80cf45d234b213e14a84aa4de1c6f31e6226e541 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sun, 2 Sep 2018 20:34:40 +0200 Subject: [PATCH 49/98] Adjust version for manual build and update VS projects (#543) --- amxmodx/msvc12/amxmodx_mm.vcxproj | 5 ++++- amxmodx/version.rc | 16 +++++----------- compiler/amxxpc/amxxpc.vcxproj | 11 +++++------ modules/cstrike/cstrike/msvc12/cstrike.vcxproj | 6 ++++++ .../cstrike/msvc12/cstrike.vcxproj.filters | 8 ++++++++ modules/cstrike/csx/msvc12/csx.vcxproj | 8 +++++++- modules/cstrike/csx/msvc12/csx.vcxproj.filters | 8 ++++++++ modules/dod/dodfun/msvc12/dodfun.vcxproj | 8 +++++++- modules/dod/dodfun/msvc12/dodfun.vcxproj.filters | 8 ++++++++ modules/dod/dodx/msvc12/dodx.vcxproj | 8 +++++++- modules/dod/dodx/msvc12/dodx.vcxproj.filters | 8 ++++++++ modules/engine/msvc12/engine.vcxproj | 8 +++++++- modules/engine/msvc12/engine.vcxproj.filters | 8 ++++++++ modules/fakemeta/msvc12/fakemeta.vcxproj | 6 ++++++ modules/fakemeta/msvc12/fakemeta.vcxproj.filters | 8 ++++++++ modules/fun/fun.h | 2 +- modules/fun/msvc12/fun.vcxproj | 10 ++++++++-- modules/fun/msvc12/fun.vcxproj.filters | 8 ++++++++ modules/geoip/msvc12/geoip.vcxproj | 6 ++++++ modules/geoip/msvc12/geoip.vcxproj.filters | 8 ++++++++ modules/hamsandwich/msvc12/hamsandwich.vcxproj | 8 +++++++- .../msvc12/hamsandwich.vcxproj.filters | 8 ++++++++ modules/json/msvc12/json.vcxproj | 6 ++++++ modules/json/msvc12/json.vcxproj.filters | 8 ++++++++ modules/mysqlx/msvc12/mysqlx.vcxproj | 12 ++++++++++-- modules/mysqlx/msvc12/mysqlx.vcxproj.filters | 8 ++++++++ modules/ns/msvc12/ns.vcxproj | 8 +++++++- modules/ns/msvc12/ns.vcxproj.filters | 8 ++++++++ modules/nvault/msvc12/nvault.vcxproj | 6 ++++++ modules/nvault/msvc12/nvault.vcxproj.filters | 8 ++++++++ modules/regex/msvc12/regex.vcxproj | 6 ++++++ modules/regex/msvc12/regex.vcxproj.filters | 8 ++++++++ modules/sockets/msvc12/sockets.vcxproj | 6 ++++++ modules/sockets/msvc12/sockets.vcxproj.filters | 8 ++++++++ modules/sqlite/msvc12/sqlite.vcxproj | 8 +++++++- modules/sqlite/msvc12/sqlite.vcxproj.filters | 8 ++++++++ modules/tfcx/msvc12/tfcx.vcxproj | 8 +++++++- modules/tfcx/msvc12/tfcx.vcxproj.filters | 8 ++++++++ modules/ts/tsfun/msvc12/tsfun.vcxproj | 6 ++++++ modules/ts/tsfun/msvc12/tsfun.vcxproj.filters | 8 ++++++++ modules/ts/tsx/msvc12/tsx.vcxproj | 8 +++++++- modules/ts/tsx/msvc12/tsx.vcxproj.filters | 8 ++++++++ plugins/include/amxmodx_version.inc | 6 +++--- 43 files changed, 299 insertions(+), 35 deletions(-) diff --git a/amxmodx/msvc12/amxmodx_mm.vcxproj b/amxmodx/msvc12/amxmodx_mm.vcxproj index e1675884..80fb9367 100644 --- a/amxmodx/msvc12/amxmodx_mm.vcxproj +++ b/amxmodx/msvc12/amxmodx_mm.vcxproj @@ -446,7 +446,10 @@ md -p JIT 2>NUL <ClInclude Include="..\..\public\sdk\moduleconfig.h" /> </ItemGroup> <ItemGroup> - <ResourceCompile Include="..\version.rc" /> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='JITDebug|Win32'">../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='JITRelease|Win32'">../../public;</AdditionalIncludeDirectories> + </ResourceCompile> </ItemGroup> <ItemGroup> <None Include="..\..\plugins\include\cellstack.inc" /> diff --git a/amxmodx/version.rc b/amxmodx/version.rc index 96b2228f..de953efa 100755 --- a/amxmodx/version.rc +++ b/amxmodx/version.rc @@ -6,13 +6,7 @@ // Generated from the TEXTINCLUDE 2 resource. // #include <winresrc.h> -#if defined AMBUILD -# include <amxmodx_version.h> -#else -# define SVN_VERSION_DWORD 1, 8, 3, 0 -# define SVN_VERSION_STRING "dev-local" -# define SVN_VERSION SVN_VERSION_STRING -#endif +#include <amxmodx_version.h> ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS @@ -32,8 +26,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // VS_VERSION_INFO VERSIONINFO - FILEVERSION SVN_VERSION_DWORD - PRODUCTVERSION SVN_VERSION_DWORD + FILEVERSION AMXX_VERSION_FILE + PRODUCTVERSION AMXX_VERSION_FILE FILEFLAGSMASK 0x17L #ifdef _DEBUG FILEFLAGS 0x1L @@ -50,12 +44,12 @@ BEGIN BEGIN VALUE "Comments", "AMX Mod X" VALUE "FileDescription", "AMX Mod X" - VALUE "FileVersion", SVN_VERSION_STRING + VALUE "FileVersion", AMXX_VERSION_STRING VALUE "InternalName", "amxmodx" VALUE "LegalCopyright", "Copyright (c) 2004-2015, AMX Mod X Dev Team" VALUE "OriginalFilename", "amxmodx_mm.dll" VALUE "ProductName", "AMX Mod X" - VALUE "ProductVersion", SVN_VERSION + VALUE "ProductVersion", AMXX_VERSION_STRING END END BLOCK "VarFileInfo" diff --git a/compiler/amxxpc/amxxpc.vcxproj b/compiler/amxxpc/amxxpc.vcxproj index 6d25c7a1..a9061c7f 100644 --- a/compiler/amxxpc/amxxpc.vcxproj +++ b/compiler/amxxpc/amxxpc.vcxproj @@ -55,29 +55,28 @@ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE; AMX_ANSIONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>_MBCS;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE; AMX_ANSIONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions> <MinimalRebuild>true</MinimalRebuild> - <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeTypeInfo>false</RuntimeTypeInfo> <PrecompiledHeader> </PrecompiledHeader> <WarningLevel>Level3</WarningLevel> - <DebugInformationFormat>EditAndContinue</DebugInformationFormat> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <AdditionalIncludeDirectories>..\..\public;..\..\third_party;..\..\third_party\zlib;..\..\amxmodx\;C:\Program Files (x86)\Visual Leak Detector\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> <GenerateDebugInformation>true</GenerateDebugInformation> - <ProgramDatabaseFile>$(OutDir)amxxpc.pdb</ProgramDatabaseFile> <SubSystem>Console</SubSystem> <TargetMachine>MachineX86</TargetMachine> - <IgnoreSpecificDefaultLibraries>LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> + <IgnoreSpecificDefaultLibraries> + </IgnoreSpecificDefaultLibraries> </Link> </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> - <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE; AMX_ANSIONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>_MBCS;WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE; AMX_ANSIONLY;%(PreprocessorDefinitions)</PreprocessorDefinitions> <RuntimeLibrary>MultiThreaded</RuntimeLibrary> <StructMemberAlignment>Default</StructMemberAlignment> <RuntimeTypeInfo>false</RuntimeTypeInfo> diff --git a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj index 91f3b0ab..f26b3ce7 100644 --- a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj +++ b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj @@ -194,6 +194,12 @@ <None Include="..\..\..\..\plugins\include\cstrike.inc" /> <None Include="..\..\..\..\plugins\include\cstrike_const.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters index 3d023ab5..9db0f2ba 100644 --- a/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters +++ b/modules/cstrike/cstrike/msvc12/cstrike.vcxproj.filters @@ -42,6 +42,9 @@ <Filter Include="ReSDK\cstrike\API"> <UniqueIdentifier>{67de85cb-b8e7-4cd6-b8cf-2ff7ed540c2b}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{1b196636-b242-45a8-ad14-3fb21eb799f7}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CstrikeHacks.cpp"> @@ -181,4 +184,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/cstrike/csx/msvc12/csx.vcxproj b/modules/cstrike/csx/msvc12/csx.vcxproj index 2badf907..baf4c398 100644 --- a/modules/cstrike/csx/msvc12/csx.vcxproj +++ b/modules/cstrike/csx/msvc12/csx.vcxproj @@ -163,7 +163,13 @@ <None Include="..\..\..\plugins\include\csstats_const.inc" /> <None Include="..\..\..\plugins\include\csx.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/cstrike/csx/msvc12/csx.vcxproj.filters b/modules/cstrike/csx/msvc12/csx.vcxproj.filters index cc5eab35..cc0710c6 100644 --- a/modules/cstrike/csx/msvc12/csx.vcxproj.filters +++ b/modules/cstrike/csx/msvc12/csx.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{3f559917-fcbd-4cd3-8136-8a7a769af465}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{95e872b8-d195-4d02-8a88-aed2894c54fe}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CMisc.cpp"> @@ -67,4 +70,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/dod/dodfun/msvc12/dodfun.vcxproj b/modules/dod/dodfun/msvc12/dodfun.vcxproj index cd252817..5c66baf0 100644 --- a/modules/dod/dodfun/msvc12/dodfun.vcxproj +++ b/modules/dod/dodfun/msvc12/dodfun.vcxproj @@ -161,7 +161,13 @@ <None Include="..\..\..\..\plugins\include\dodconst.inc" /> <None Include="..\..\..\..\plugins\include\dodfun.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/dod/dodfun/msvc12/dodfun.vcxproj.filters b/modules/dod/dodfun/msvc12/dodfun.vcxproj.filters index b13a9b2c..285863b7 100644 --- a/modules/dod/dodfun/msvc12/dodfun.vcxproj.filters +++ b/modules/dod/dodfun/msvc12/dodfun.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{2deb0e1f-fb04-4734-ae4a-39fa3d4eab86}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{1441a5c1-9b0c-4dc7-b898-7236588e5f98}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CMisc.cpp"> @@ -64,4 +67,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/dod/dodx/msvc12/dodx.vcxproj b/modules/dod/dodx/msvc12/dodx.vcxproj index b8134d69..2101f2c0 100644 --- a/modules/dod/dodx/msvc12/dodx.vcxproj +++ b/modules/dod/dodx/msvc12/dodx.vcxproj @@ -164,7 +164,13 @@ <None Include="..\..\..\..\plugins\include\dodstats.inc" /> <None Include="..\..\..\..\plugins\include\dodx.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/dod/dodx/msvc12/dodx.vcxproj.filters b/modules/dod/dodx/msvc12/dodx.vcxproj.filters index 0052797e..644229de 100644 --- a/modules/dod/dodx/msvc12/dodx.vcxproj.filters +++ b/modules/dod/dodx/msvc12/dodx.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{d13b95f6-bd1e-4c68-a7f1-57e4f39ffde3}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{0f02323b-c637-4625-aa3c-03f1424de34c}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CMisc.cpp"> @@ -73,4 +76,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/engine/msvc12/engine.vcxproj b/modules/engine/msvc12/engine.vcxproj index 3ebf1a59..cc214aa7 100644 --- a/modules/engine/msvc12/engine.vcxproj +++ b/modules/engine/msvc12/engine.vcxproj @@ -130,7 +130,13 @@ <None Include="..\..\..\plugins\include\engine_stocks.inc" /> <None Include="..\..\..\plugins\include\hlsdk_const.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/engine/msvc12/engine.vcxproj.filters b/modules/engine/msvc12/engine.vcxproj.filters index 29888fb8..d79bc1d6 100644 --- a/modules/engine/msvc12/engine.vcxproj.filters +++ b/modules/engine/msvc12/engine.vcxproj.filters @@ -27,6 +27,9 @@ <Filter Include="Memtools\CDetour\asm"> <UniqueIdentifier>{6c2c3c74-4dc3-45bf-b3a5-6224971eee69}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{766da9da-a13a-4f01-a886-570fc28772a6}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\amxxapi.cpp"> @@ -103,4 +106,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/fakemeta/msvc12/fakemeta.vcxproj b/modules/fakemeta/msvc12/fakemeta.vcxproj index 3cf5703f..2798db0b 100644 --- a/modules/fakemeta/msvc12/fakemeta.vcxproj +++ b/modules/fakemeta/msvc12/fakemeta.vcxproj @@ -148,6 +148,12 @@ <None Include="..\..\..\plugins\include\fakemeta_stocks.inc" /> <None Include="..\..\..\plugins\include\hlsdk_const.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/fakemeta/msvc12/fakemeta.vcxproj.filters b/modules/fakemeta/msvc12/fakemeta.vcxproj.filters index bc479670..859e079d 100644 --- a/modules/fakemeta/msvc12/fakemeta.vcxproj.filters +++ b/modules/fakemeta/msvc12/fakemeta.vcxproj.filters @@ -48,6 +48,9 @@ <Filter Include="ReSDK\cstrike\API"> <UniqueIdentifier>{2800175e-06bf-42bf-b3c1-f86561471531}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{c5065ec5-3262-49dd-825b-2cf3956e79ac}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\fakemeta_amxx.cpp"> @@ -186,4 +189,9 @@ <Filter>PEV</Filter> </CustomBuildStep> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/fun/fun.h b/modules/fun/fun.h index 75e391b1..014591de 100644 --- a/modules/fun/fun.h +++ b/modules/fun/fun.h @@ -103,7 +103,7 @@ class CPlayer private: - int bodyHits_[kMaxClients + 1] {}; + int bodyHits_[kMaxClients + 1]; bool silentFootsteps_ {}; }; diff --git a/modules/fun/msvc12/fun.vcxproj b/modules/fun/msvc12/fun.vcxproj index fd1cea2c..7791b435 100644 --- a/modules/fun/msvc12/fun.vcxproj +++ b/modules/fun/msvc12/fun.vcxproj @@ -19,7 +19,7 @@ <ConfigurationType>DynamicLibrary</ConfigurationType> <UseOfMfc>false</UseOfMfc> <CharacterSet>MultiByte</CharacterSet> - <PlatformToolset>v120_xp</PlatformToolset> + <PlatformToolset>v140_xp</PlatformToolset> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <ConfigurationType>DynamicLibrary</ConfigurationType> @@ -159,7 +159,13 @@ <ItemGroup> <None Include="..\..\..\plugins\include\fun.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/fun/msvc12/fun.vcxproj.filters b/modules/fun/msvc12/fun.vcxproj.filters index a4b5a414..eb94e2da 100644 --- a/modules/fun/msvc12/fun.vcxproj.filters +++ b/modules/fun/msvc12/fun.vcxproj.filters @@ -21,6 +21,9 @@ <Filter Include="Memtools"> <UniqueIdentifier>{d2522a66-df9f-49c8-9f74-ee3738ae3d98}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{200a07a6-c1a4-4ad1-bda3-3fb5ea7c106a}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\fun.cpp"> @@ -55,4 +58,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/geoip/msvc12/geoip.vcxproj b/modules/geoip/msvc12/geoip.vcxproj index e23c0fb0..b86a84f5 100644 --- a/modules/geoip/msvc12/geoip.vcxproj +++ b/modules/geoip/msvc12/geoip.vcxproj @@ -123,6 +123,12 @@ <ItemGroup> <None Include="..\..\..\plugins\include\geoip.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/geoip/msvc12/geoip.vcxproj.filters b/modules/geoip/msvc12/geoip.vcxproj.filters index 6836a135..e1a731d7 100644 --- a/modules/geoip/msvc12/geoip.vcxproj.filters +++ b/modules/geoip/msvc12/geoip.vcxproj.filters @@ -21,6 +21,9 @@ <Filter Include="GeoIP2"> <UniqueIdentifier>{0bd4b9fb-f847-4fe5-af3e-9000fc854c5c}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{cfe982b9-749c-4d98-ac7b-207290a68c7e}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\geoip_util.cpp"> @@ -76,4 +79,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/hamsandwich/msvc12/hamsandwich.vcxproj b/modules/hamsandwich/msvc12/hamsandwich.vcxproj index 1df330f9..5fba745b 100644 --- a/modules/hamsandwich/msvc12/hamsandwich.vcxproj +++ b/modules/hamsandwich/msvc12/hamsandwich.vcxproj @@ -139,7 +139,13 @@ <None Include="..\..\..\plugins\include\ham_const.inc" /> <None Include="..\..\..\plugins\include\hamsandwich.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/hamsandwich/msvc12/hamsandwich.vcxproj.filters b/modules/hamsandwich/msvc12/hamsandwich.vcxproj.filters index c453c475..5036ee1e 100644 --- a/modules/hamsandwich/msvc12/hamsandwich.vcxproj.filters +++ b/modules/hamsandwich/msvc12/hamsandwich.vcxproj.filters @@ -33,6 +33,9 @@ <Filter Include="Memtools"> <UniqueIdentifier>{c26eb07d-14b7-49e9-9122-6b7f5a711ecf}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{ce1c1544-036d-4339-918f-a716641a3b4f}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\call_funcs.cpp"> @@ -130,4 +133,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/json/msvc12/json.vcxproj b/modules/json/msvc12/json.vcxproj index a6d0c836..ab84c8b6 100644 --- a/modules/json/msvc12/json.vcxproj +++ b/modules/json/msvc12/json.vcxproj @@ -114,6 +114,12 @@ <ItemGroup> <None Include="..\..\..\plugins\include\json.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/json/msvc12/json.vcxproj.filters b/modules/json/msvc12/json.vcxproj.filters index 8c67d724..bd530d20 100644 --- a/modules/json/msvc12/json.vcxproj.filters +++ b/modules/json/msvc12/json.vcxproj.filters @@ -22,6 +22,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{aaebd544-6579-4a7e-9c6b-2ccc3c0280be}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{50d2c03b-6783-40f5-8cb5-78ca29e9cfdc}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\JsonMngr.cpp"> @@ -59,4 +62,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/mysqlx/msvc12/mysqlx.vcxproj b/modules/mysqlx/msvc12/mysqlx.vcxproj index ea8581b7..c875f1e7 100644 --- a/modules/mysqlx/msvc12/mysqlx.vcxproj +++ b/modules/mysqlx/msvc12/mysqlx.vcxproj @@ -91,7 +91,7 @@ </ClCompile> <Link> <AdditionalDependencies>ws2_32.lib;..\..\..\..\mysql-5.5\lib\mysqlclient.lib;%(AdditionalDependencies)</AdditionalDependencies> - <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> + <IgnoreSpecificDefaultLibraries>LIBCMT;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <GenerateDebugInformation>true</GenerateDebugInformation> <SubSystem>Windows</SubSystem> <OptimizeReferences>true</OptimizeReferences> @@ -100,6 +100,8 @@ <TargetMachine>MachineX86</TargetMachine> <SpecifySectionAttributes>.data,RW</SpecifySectionAttributes> <AdditionalOptions>/EXPORT:GiveFnptrsToDll=_GiveFnptrsToDll@8,@1 %(AdditionalOptions)</AdditionalOptions> + <ProgramDatabaseFile>$(OutDir)mysql2.pdb</ProgramDatabaseFile> + <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers> </Link> </ItemDefinitionGroup> <ItemGroup> @@ -209,7 +211,13 @@ <ItemGroup> <None Include="..\..\..\plugins\include\sqlx.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/mysqlx/msvc12/mysqlx.vcxproj.filters b/modules/mysqlx/msvc12/mysqlx.vcxproj.filters index 92502344..2bbffbc6 100644 --- a/modules/mysqlx/msvc12/mysqlx.vcxproj.filters +++ b/modules/mysqlx/msvc12/mysqlx.vcxproj.filters @@ -42,6 +42,9 @@ <Filter Include="Third Party\Zlib"> <UniqueIdentifier>{557b0e54-eb0e-488f-b8bc-3cee3f8ddfba}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{746bb65b-17aa-4f58-8afc-0cfff3799bb7}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\basic_sql.cpp"> @@ -217,4 +220,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/ns/msvc12/ns.vcxproj b/modules/ns/msvc12/ns.vcxproj index 92eb2f3c..613cf0d2 100644 --- a/modules/ns/msvc12/ns.vcxproj +++ b/modules/ns/msvc12/ns.vcxproj @@ -184,7 +184,13 @@ <ClInclude Include="..\..\..\public\sdk\amxxmodule.h" /> <ClInclude Include="..\moduleconfig.h" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/ns/msvc12/ns.vcxproj.filters b/modules/ns/msvc12/ns.vcxproj.filters index 0c46780d..ec38d5ee 100644 --- a/modules/ns/msvc12/ns.vcxproj.filters +++ b/modules/ns/msvc12/ns.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Module SDK\SDK Base"> <UniqueIdentifier>{28f804b5-b177-4048-b0c6-36ba103593b9}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{4cc1fba9-04e0-4d8b-973a-e14073a505de}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\amxxapi.cpp"> @@ -119,4 +122,9 @@ <Filter>Module SDK</Filter> </ClInclude> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/nvault/msvc12/nvault.vcxproj b/modules/nvault/msvc12/nvault.vcxproj index 9b11484f..0d6c76e9 100644 --- a/modules/nvault/msvc12/nvault.vcxproj +++ b/modules/nvault/msvc12/nvault.vcxproj @@ -118,6 +118,12 @@ <ItemGroup> <None Include="..\..\..\plugins\include\nvault.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/nvault/msvc12/nvault.vcxproj.filters b/modules/nvault/msvc12/nvault.vcxproj.filters index a0b3e0b4..aada0fbf 100644 --- a/modules/nvault/msvc12/nvault.vcxproj.filters +++ b/modules/nvault/msvc12/nvault.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{4722a41b-9bbc-4c55-b0da-315b9f16f618}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{9c53c0aa-9c17-4dce-a6c0-6f1e0675766d}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\amxxapi.cpp"> @@ -67,4 +70,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/regex/msvc12/regex.vcxproj b/modules/regex/msvc12/regex.vcxproj index c003b909..5547acbb 100644 --- a/modules/regex/msvc12/regex.vcxproj +++ b/modules/regex/msvc12/regex.vcxproj @@ -114,6 +114,12 @@ <ItemGroup> <None Include="..\..\..\plugins\include\regex.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/regex/msvc12/regex.vcxproj.filters b/modules/regex/msvc12/regex.vcxproj.filters index eca67379..e952dd6a 100644 --- a/modules/regex/msvc12/regex.vcxproj.filters +++ b/modules/regex/msvc12/regex.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{c5722376-8e24-440a-9f13-023f19099b30}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{2e1aa30c-3176-440f-a39c-3733f9f8d503}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CRegEx.cpp"> @@ -55,4 +58,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/sockets/msvc12/sockets.vcxproj b/modules/sockets/msvc12/sockets.vcxproj index 8920980e..110a7bba 100644 --- a/modules/sockets/msvc12/sockets.vcxproj +++ b/modules/sockets/msvc12/sockets.vcxproj @@ -108,6 +108,12 @@ <ItemGroup> <None Include="..\..\..\plugins\include\sockets.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/sockets/msvc12/sockets.vcxproj.filters b/modules/sockets/msvc12/sockets.vcxproj.filters index 8582b30b..9dee420b 100644 --- a/modules/sockets/msvc12/sockets.vcxproj.filters +++ b/modules/sockets/msvc12/sockets.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{ffbc64d0-627e-4b7b-851d-f0c0cb9030ed}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{ea476f56-a723-4227-b805-64745134c852}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\sockets.cpp"> @@ -40,4 +43,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/sqlite/msvc12/sqlite.vcxproj b/modules/sqlite/msvc12/sqlite.vcxproj index 86742fed..b19e8a29 100644 --- a/modules/sqlite/msvc12/sqlite.vcxproj +++ b/modules/sqlite/msvc12/sqlite.vcxproj @@ -149,7 +149,13 @@ <ItemGroup> <None Include="..\..\..\plugins\include\sqlx.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/sqlite/msvc12/sqlite.vcxproj.filters b/modules/sqlite/msvc12/sqlite.vcxproj.filters index c2e957b4..1f9952cd 100644 --- a/modules/sqlite/msvc12/sqlite.vcxproj.filters +++ b/modules/sqlite/msvc12/sqlite.vcxproj.filters @@ -39,6 +39,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{e0a36119-bb5b-4f07-9e0e-80f9aa7a7d21}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{9595267e-27de-4ad9-b2cd-ecd10c9513ae}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\basic_sql.cpp"> @@ -145,4 +148,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/tfcx/msvc12/tfcx.vcxproj b/modules/tfcx/msvc12/tfcx.vcxproj index efd0a97d..b7c54bc4 100644 --- a/modules/tfcx/msvc12/tfcx.vcxproj +++ b/modules/tfcx/msvc12/tfcx.vcxproj @@ -164,7 +164,13 @@ <None Include="..\..\..\plugins\include\tfcstats.inc" /> <None Include="..\..\..\plugins\include\tfcx.inc" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/tfcx/msvc12/tfcx.vcxproj.filters b/modules/tfcx/msvc12/tfcx.vcxproj.filters index d1eb4e85..186af755 100644 --- a/modules/tfcx/msvc12/tfcx.vcxproj.filters +++ b/modules/tfcx/msvc12/tfcx.vcxproj.filters @@ -18,6 +18,9 @@ <Filter Include="Pawn Includes"> <UniqueIdentifier>{be880015-6e29-4a0b-8301-e79f2e8231f6}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{8da747a0-926a-4603-9877-c9324c6c7c8d}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CMisc.cpp"> @@ -73,4 +76,9 @@ <Filter>Pawn Includes</Filter> </None> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/ts/tsfun/msvc12/tsfun.vcxproj b/modules/ts/tsfun/msvc12/tsfun.vcxproj index 05972e4d..97707b41 100644 --- a/modules/ts/tsfun/msvc12/tsfun.vcxproj +++ b/modules/ts/tsfun/msvc12/tsfun.vcxproj @@ -144,6 +144,12 @@ <ItemGroup> <ClCompile Include="..\..\..\..\public\sdk\amxxmodule.cpp" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> diff --git a/modules/ts/tsfun/msvc12/tsfun.vcxproj.filters b/modules/ts/tsfun/msvc12/tsfun.vcxproj.filters index 9373be25..6f69a4b5 100644 --- a/modules/ts/tsfun/msvc12/tsfun.vcxproj.filters +++ b/modules/ts/tsfun/msvc12/tsfun.vcxproj.filters @@ -11,6 +11,9 @@ <Filter Include="Module SDK\SDK Base"> <UniqueIdentifier>{cfef04ba-c30c-466a-93ca-94ebda8e8c7e}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{7050bcc2-ace8-46a1-95cc-bf360fdb28eb}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClInclude Include="..\moduleconfig.h"> @@ -25,4 +28,9 @@ <Filter>Module SDK\SDK Base</Filter> </ClCompile> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/modules/ts/tsx/msvc12/tsx.vcxproj b/modules/ts/tsx/msvc12/tsx.vcxproj index c8b47ce6..f1082a95 100644 --- a/modules/ts/tsx/msvc12/tsx.vcxproj +++ b/modules/ts/tsx/msvc12/tsx.vcxproj @@ -160,7 +160,13 @@ <ClInclude Include="..\..\..\..\public\sdk\amxxmodule.h" /> <ClInclude Include="..\moduleconfig.h" /> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">../../../../public;</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">../../../../public;</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> </ImportGroup> -</Project> +</Project> \ No newline at end of file diff --git a/modules/ts/tsx/msvc12/tsx.vcxproj.filters b/modules/ts/tsx/msvc12/tsx.vcxproj.filters index ec2078af..676d3cf6 100644 --- a/modules/ts/tsx/msvc12/tsx.vcxproj.filters +++ b/modules/ts/tsx/msvc12/tsx.vcxproj.filters @@ -15,6 +15,9 @@ <Filter Include="Module SDK\Base SDK"> <UniqueIdentifier>{bb25b7bf-a54d-448d-998f-a5278f379fe8}</UniqueIdentifier> </Filter> + <Filter Include="Resource Files"> + <UniqueIdentifier>{668912fb-d2b2-4cbe-b395-aa45a9663ee2}</UniqueIdentifier> + </Filter> </ItemGroup> <ItemGroup> <ClCompile Include="..\CMisc.cpp"> @@ -62,4 +65,9 @@ <Filter>Module SDK</Filter> </ClInclude> </ItemGroup> + <ItemGroup> + <ResourceCompile Include="..\version.rc"> + <Filter>Resource Files</Filter> + </ResourceCompile> + </ItemGroup> </Project> \ No newline at end of file diff --git a/plugins/include/amxmodx_version.inc b/plugins/include/amxmodx_version.inc index 7d9c502a..eb2215dd 100644 --- a/plugins/include/amxmodx_version.inc +++ b/plugins/include/amxmodx_version.inc @@ -12,6 +12,6 @@ #endif #define _amxmodx_version_included -#define AMXX_VERSION 1.83 -#define AMXX_VERSION_NUM 183 -stock const AMXX_VERSION_STR[] = "1.8.3-manual"; +#define AMXX_VERSION 1.9.0 +#define AMXX_VERSION_NUM 190 +stock const AMXX_VERSION_STR[] = "1.9.0-manual"; From 76e92ae3a12dc02921e0674374120eedf5efcb33 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sun, 2 Sep 2018 20:35:42 +0200 Subject: [PATCH 50/98] Add CONTRIBUTING and ISSUE_TEMPLATE (#534) --- .github/CONTRIBUTING.md | 74 +++++++++++++++++++++++++++++++++++++++ .github/ISSUE_TEMPLATE.md | 25 +++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..56b8ee27 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,74 @@ +# Contributing to AMX Mod X + +## Issue reports + +Please consider the following guidelines when reporting an issue. + +#### Not for general support +This is not the right place to get help with using or installing AMX Mod X, or for issues with specific, third-party AMX Mod X plugins or extensions. + +For help with AMX Mod X, please consult the [AlliedModders forums](https://forums.alliedmods.net/forumdisplay.php?f=3). Similarly, for assistance with, or to report issues with, third-party AMX Mod X plugins or extensions, you should post in the existing thread for that plugin or extension on the [AlliedModders forums](https://forums.alliedmods.net/forumdisplay.php?f=3). + +#### Details, details, details +Provide as much detail as possible when reporting an issue. + +For bugs or other undesired behavior, answers to the following questions are a great start: +* What is the issue? +* What behavior are you expecting instead? +* On what operating system is the game server running? +* What game is the game server running? +* What exact versions (full x.y.z.a version number) of Metamod and AMX Mod X are installed on the game server? +* What is the specific, shortest path to reproducing this issue? If this issue can be reproduced with plugin code, please try to shorten it to the minimum required to trigger the problem. + +If this is a feature request, the following are helpful. Generally, not all will apply, but whatever you can answer ahead of time will shorten back and forth conversation. +* What is your end goal, or what are you trying to accomplish? +* Why is this necessary, or what benefit do you see with it? +* Will this be useful to others? + +#### Issues with security implications +Please report any security bugs to [security@alliedmods.net](mailto:security@alliedmods.net) rather than to this public issue tracker. + +#### We're only human +Please keep in mind that we maintain this project in our spare time, at no cost. There is no SLA, and you are not owed a response or a fix. + +#### Conduct +Please refer to the [AlliedModders forum rules.](https://forums.alliedmods.net/misc.php?do=showrules) + +## Pull Requests + +Firstly, thank you for considering contributing changes to the project! + +However, if this is anything more than a small fix such as a gamedata update, a glaring code flaw, or a simple typo in a file like this one, please file an issue first so that it can be discussed, unless you have already spoken to multiple members of the development team about it on IRC or the AlliedModders forums. + +We don't like to have to reject pull requests, so we want to avoid those scenarios. We wouldn't want you to feel like you wasted your time writing something only for us to shoot it down. + +#### Rejection +*Copied from Phabricator's [Contributing Code guidelines](https://secure.phabricator.com/book/phabcontrib/article/contributing_code/#rejecting-patches), as we largely feel the same way about this.* + +> If you send us a patch without coordinating it with us first, it will probably be immediately rejected, or sit in limbo for a long time and eventually be rejected. The reasons we do this vary from patch to patch, but some of the most common reasons are: +> +> **Unjustifiable Costs**: We support code in the upstream forever. Support is enormously expensive and takes up a huge amount of our time. The cost to support a change over its lifetime is often 10x or 100x or 1000x greater than the cost to write the first version of it. Many uncoordinated patches we receive are "white elephants", which would cost much more to maintain than the value they provide. +> +> As an author, it may look like you're giving us free work and we're rejecting it as too expensive, but this viewpoint doesn't align with the reality of a large project which is actively supported by a small, experienced team. Writing code is cheap; maintaining it is expensive. +> +> By coordinating with us first, you can make sure the patch is something we consider valuable enough to put long-term support resources behind, and that you're building it in a way that we're comfortable taking over. +> +> **Not a Good Fit**: Many patches aren't good fits for the upstream: they implement features we simply don't want. You can find more information in Contributing Feature Requests. Coordinating with us first helps make sure we're on the same page and interested in a feature. +> +> The most common type of patch along these lines is a patch which adds new configuration options. We consider additional configuration options to have an exceptionally high lifetime support cost and are very unlikely to accept them. Coordinate with us first. +> +> **Not a Priority**: If you send us a patch against something which isn't a priority, we probably won't have time to look at it. We don't give special treatment to low-priority issues just because there's code written: we'd still be spending time on something lower-priority when we could be spending it on something higher-priority instead. +> +> If you coordinate with us first, you can make sure your patch is in an area of the codebase that we can prioritize. +> +> **Overly Ambitious Patches**: Sometimes we'll get huge patches from new contributors. These can have a lot of fundamental problems and require a huge amount of our time to review and correct. If you're interested in contributing, you'll have more success if you start small and learn as you go. +> +> We can help you break a large change into smaller pieces and learn how the codebase works as you proceed through the implementation, but only if you coordinate with us first. +> +> **Generality**: We often receive several feature requests which ask for similar features, and can come up with a general approach which covers all of the use cases. If you send us a patch for your use case only, the approach may be too specific. When a cleaner and more general approach is available, we usually prefer to pursue it. +> +> By coordinating with us first, we can make you aware of similar use cases and opportunities to generalize an approach. These changes are often small, but can have a big impact on how useful a piece of code is. +> +> **Infrastructure and Sequencing**: Sometimes patches are written against a piece of infrastructure with major planned changes. We don't want to accept these because they'll make the infrastructure changes more difficult to implement. +> +> Coordinate with us first to make sure a change doesn't need to wait on other pieces of infrastructure. We can help you identify technical blockers and possibly guide you through resolving them if you're interested. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 00000000..222dec0a --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,25 @@ +# Help us help you + - [ ] I have checked that my issue [doesn't exist yet](https://github.com/alliedmodders/amxmodx/issues). + - [ ] I have tried my absolute best to reduce the problem-space and have provided the absolute smallest test-case possible. + - [ ] I can always reproduce the issue with the provided description below. + +# Environment + * Operating System version: + * Game/AppID (with version if applicable): + * Current AMX Mod X version: + * Current Metamod version: + - [ ] I have updated AMX Mod X to the [latest version](https://www.amxmodx.org/downloads.php) and it still happens. + - [ ] I have updated AMX Mod X to the [latest snapshot](https://www.amxmodx.org/snapshots.php) and it still happens. + - [ ] I have updated Metamod to the [latest version](https://www.amxmodx.org/downloads.php) and it still happens. + +# Description + + +# Problematic Code (or Steps to Reproduce) + ```PAWN + // TODO(you): code here to reproduce the problem + ``` + +# Logs +* Please attach in separate files: game output, library logs, kernel logs, and any other supporting information. +* In case of a crash, please attach minidump or dump analyze output. From c6c4e79b96c5f5b64767da7e8ba9fd3541984450 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 3 Sep 2018 18:39:08 +0200 Subject: [PATCH 51/98] Don't reset m_iMenu if player is not fully joined (#537) --- amxmodx/amxmodx.cpp | 10 +++++++++- amxmodx/newmenus.cpp | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index ac6d79dc..1bc7c532 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -1278,8 +1278,16 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ if (g_bmod_cstrike) { + enum JoinState { Joined = 0 }; + enum MenuState { Menu_OFF = 0, Menu_ChooseTeam = 1, Menu_ChooseAppearance = 3 }; + + GET_OFFSET("CBasePlayer", m_iJoiningState); GET_OFFSET("CBasePlayer", m_iMenu); - set_pdata<int>(pPlayer->pEdict, m_iMenu, 0); + + if (get_pdata<int>(pPlayer->pEdict, m_iJoiningState) == Joined || (get_pdata<int>(pPlayer->pEdict, m_iMenu) != Menu_ChooseTeam && get_pdata<int>(pPlayer->pEdict, m_iMenu) != Menu_ChooseAppearance)) + { + set_pdata<int>(pPlayer->pEdict, m_iMenu, Menu_OFF); + } } return 0; diff --git a/amxmodx/newmenus.cpp b/amxmodx/newmenus.cpp index b16b9b57..9e07d356 100755 --- a/amxmodx/newmenus.cpp +++ b/amxmodx/newmenus.cpp @@ -825,8 +825,16 @@ static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params) if (g_bmod_cstrike) { + enum JoinState { Joined = 0 }; + enum MenuState { Menu_OFF = 0, Menu_ChooseTeam = 1, Menu_ChooseAppearance = 3 }; + + GET_OFFSET("CBasePlayer", m_iJoiningState); GET_OFFSET("CBasePlayer", m_iMenu); - set_pdata<int>(pPlayer->pEdict, m_iMenu, 0); + + if (get_pdata<int>(pPlayer->pEdict, m_iJoiningState) == Joined || (get_pdata<int>(pPlayer->pEdict, m_iMenu) != Menu_ChooseTeam && get_pdata<int>(pPlayer->pEdict, m_iMenu) != Menu_ChooseAppearance)) + { + set_pdata<int>(pPlayer->pEdict, m_iMenu, Menu_OFF); + } } int time = -1; From c16bd47b30318c469c96e9c019fdcd21be35e382 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 3 Sep 2018 18:49:49 +0200 Subject: [PATCH 52/98] Remove GetModelCollisionBox, SetModelCollisionBox and SetModelBoundingBox natives (#536) --- modules/fakemeta/misc.cpp | 107 ----------------------------------- plugins/include/fakemeta.inc | 42 -------------- 2 files changed, 149 deletions(-) diff --git a/modules/fakemeta/misc.cpp b/modules/fakemeta/misc.cpp index c6022444..4a3f5a5e 100644 --- a/modules/fakemeta/misc.cpp +++ b/modules/fakemeta/misc.cpp @@ -149,42 +149,6 @@ enum Model_CurrentSequence = -1, }; -// GetModelCollisionBox( index, Float:mins[3], Float:maxs[3] ); -static cell AMX_NATIVE_CALL GetModelCollisionBox(AMX *amx, cell *params) -{ - int entityIndex = params[1]; - - CHECK_ENTITY(entityIndex); - - edict_t *pEdict = TypeConversion.id_to_edict(entityIndex); - - if (!FNullEnt(pEdict)) - { - studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pEdict)); - - if (!pStudiohdr) - { - MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity."); - return 0; - } - - cell *cmins = MF_GetAmxAddr(amx, params[2]); - cell *cmaxs = MF_GetAmxAddr(amx, params[3]); - - cmins[0] = amx_ftoc(pStudiohdr->bbmin.x); - cmins[1] = amx_ftoc(pStudiohdr->bbmin.y); - cmins[2] = amx_ftoc(pStudiohdr->bbmin.z); - - cmaxs[0] = amx_ftoc(pStudiohdr->bbmax.x); - cmaxs[1] = amx_ftoc(pStudiohdr->bbmax.y); - cmaxs[2] = amx_ftoc(pStudiohdr->bbmax.z); - - return 1; - } - - return 0; -}; - // GetModelBoundingBox( index, Float:mins[3], Float:maxs[3], sequence = Model_DefaultSize ); static cell AMX_NATIVE_CALL GetModelBoundingBox(AMX *amx, cell *params) { @@ -242,82 +206,11 @@ static cell AMX_NATIVE_CALL GetModelBoundingBox(AMX *amx, cell *params) return 0; }; -// SetModelCollisionBox( index ); -static cell AMX_NATIVE_CALL SetModelCollisionBox(AMX *amx, cell *params) -{ - int entityIndex = params[1]; - - CHECK_ENTITY(entityIndex); - - edict_t *pentModel = TypeConversion.id_to_edict(entityIndex); - - if (!FNullEnt(pentModel)) - { - studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pentModel)); - - if (!pStudiohdr) - { - MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity."); - return 0; - } - - SET_SIZE(pentModel, pStudiohdr->bbmin, pStudiohdr->bbmax); - - return 1; - } - - return 0; -}; - -// SetModelBoudingBox( index, sequence = Model_DefaultSize ); -static cell AMX_NATIVE_CALL SetModelBoundingBox(AMX *amx, cell *params) -{ - int entityIndex = params[1]; - - CHECK_ENTITY(entityIndex); - - edict_t *pentModel = TypeConversion.id_to_edict(entityIndex); - - if (!FNullEnt(pentModel)) - { - studiohdr_t *pStudiohdr = static_cast<studiohdr_t*>(GET_MODEL_PTR(pentModel)); - - if (!pStudiohdr) - { - MF_LogError(amx, AMX_ERR_NATIVE, "Could not find the model pointer for the entity."); - return 0; - } - - int sequence = params[2]; - - if (sequence <= Model_DefaultSize) - { - SET_SIZE(pentModel, pStudiohdr->min, pStudiohdr->max); - } - else - { - if (sequence <= Model_CurrentSequence || sequence >= pStudiohdr->numseq) - sequence = pentModel->v.sequence; - - mstudioseqdesc_t *pSeqdesc; - pSeqdesc = (mstudioseqdesc_t*)((byte*)pStudiohdr + pStudiohdr->seqindex); - - SET_SIZE(pentModel, pSeqdesc[sequence].bbmin, pSeqdesc[sequence].bbmax); - - return 1; - } - } - - return 0; -} AMX_NATIVE_INFO misc_natives[] = { { "copy_infokey_buffer", copy_infokey_buffer }, { "lookup_sequence", lookup_sequence }, { "set_controller", set_controller }, - { "GetModelCollisionBox", GetModelCollisionBox }, - { "SetModelCollisionBox", SetModelCollisionBox }, { "GetModelBoundingBox", GetModelBoundingBox }, - { "SetModelBoundingBox", SetModelBoundingBox }, {NULL, NULL}, }; diff --git a/plugins/include/fakemeta.inc b/plugins/include/fakemeta.inc index 8c04f8e1..35171a84 100755 --- a/plugins/include/fakemeta.inc +++ b/plugins/include/fakemeta.inc @@ -1108,32 +1108,6 @@ enum Model_CurrentSequence = -1, }; -/** - * Gets size of the entity models collision box. - * - * @param entity The entity index to use. - * @param mins The local negative collision box distance. - * @param maxs The local positive collision box distance. - * - * @return 1 on success, 0 on faillure. - * - * @error Invalid entity. - * Invalid model pointer. - */ -native GetModelCollisionBox(entity, Float:mins[3], Float:maxs[3]); - -/** - * Sets entity size to the models collision box. - * - * @param entity The entity index to set the value on. - * - * @return 1 on success, 0 on faillure. - * - * @error Invalid entity. - * Invalid model pointer. - */ -native SetModelCollisionBox(entity); - /** * Gets size of a model bounding box. * @@ -1151,19 +1125,3 @@ native SetModelCollisionBox(entity); * Invalid model pointer. */ native GetModelBoundingBox(entity, Float:mins[3], Float:maxs[3], sequence = Model_DefaultSize); - -/** - * Sets size to a model bounding box. - * - * @param entity The entity index to set the value on. - * @param sequence The sequence to apply. - * Model_DefaultSize sets size of ideal movement hull. - * Model_CurrentSequence sets size of the current sequence. - * Values >= 0 will specify which sequence to use. - * - * @return 1 on success, 0 on faillure. - * - * @error Invalid entity. - * Invalid model pointer. - */ -native SetModelBoundingBox(index, sequence = Model_DefaultSize); From 582df637ce756d1e54c5e69775dba41bf6b98f0b Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Mon, 3 Sep 2018 21:28:28 +0200 Subject: [PATCH 53/98] Compiler: Add __FILE__, remove __BINARY_PATH__ and rename __BINARY_NAME__ to __BINARY__ (#546) * Compiler: Add __FILE__ and remove __BINARY_PATH__ constants * Compiler: Rename __BINARY_NAME__ to __BINARY__ --- compiler/libpc300/sc.h | 4 ++++ compiler/libpc300/sc1.c | 44 +++++++++++++++++++++++++++++++++++++---- compiler/libpc300/sc2.c | 16 ++++++++++++++- 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/compiler/libpc300/sc.h b/compiler/libpc300/sc.h index f0881bde..0f8b3212 100755 --- a/compiler/libpc300/sc.h +++ b/compiler/libpc300/sc.h @@ -521,6 +521,10 @@ SC_FUNC symbol *add_constant(char *name,cell val,int vclass,int tag); SC_FUNC void exporttag(int tag); SC_FUNC void sc_attachdocumentation(symbol *sym); SC_FUNC int get_actual_compound(symbol *sym); +#if !defined NO_DEFINE +SC_FUNC void inst_file_name(char* filename, int strip_path); +#endif + /* function prototypes in SC2.C */ #define PUSHSTK_P(v) { stkitem s_; s_.pv=(v); pushstk(s_); } diff --git a/compiler/libpc300/sc1.c b/compiler/libpc300/sc1.c index 4f37770f..8f5936c9 100755 --- a/compiler/libpc300/sc1.c +++ b/compiler/libpc300/sc1.c @@ -408,11 +408,47 @@ void inst_datetime_defines() insert_subst("__TIME__", ltime, 8); } +void inst_file_name(char *file, int strip_path) +{ + char newname[_MAX_PATH]; + char *fileptr; + + fileptr = NULL; + + if (strip_path) { + size_t i, len; + int slashchar; + + len = strlen(file); + for (i = len - 1; i < len; i--) + { + slashchar = file[i] == '/'; + #if defined WIN32 || defined _WIN32 + slashchar = slashchar || file[i] == '\\'; + #endif + if (slashchar) + { + fileptr = &file[i + 1]; + break; + } + } + } + + if (fileptr == NULL) { + fileptr = file; + } + + snprintf(newname, sizeof(newname), "\"%s\"", fileptr); + + insert_subst("__FILE__", newname, 8); +} + + static void inst_binary_name(char *binfname) { size_t i, len; char *binptr; - char newpath[512], newname[512]; + char newname[_MAX_PATH]; int slashchar; binptr = NULL; @@ -435,11 +471,9 @@ static void inst_binary_name(char *binfname) binptr = binfname; } - snprintf(newpath, sizeof(newpath), "\"%s\"", binfname); snprintf(newname, sizeof(newname), "\"%s\"", binptr); - insert_subst("__BINARY_PATH__", newpath, 15); - insert_subst("__BINARY_NAME__", newname, 15); + insert_subst("__BINARY__", newname, 10); } /* "main" of the compiler @@ -598,6 +632,7 @@ int pc_compile(int argc, char *argv[]) delete_substtable(); inst_datetime_defines(); inst_binary_name(binfname); + inst_file_name(inpfname, TRUE); #endif resetglobals(); sc_ctrlchar=sc_ctrlchar_org; @@ -663,6 +698,7 @@ int pc_compile(int argc, char *argv[]) delete_substtable(); inst_datetime_defines(); inst_binary_name(binfname); + inst_file_name(inpfname, TRUE); #endif resetglobals(); sc_ctrlchar=sc_ctrlchar_org; diff --git a/compiler/libpc300/sc2.c b/compiler/libpc300/sc2.c index 90bc1c27..5bd3735b 100755 --- a/compiler/libpc300/sc2.c +++ b/compiler/libpc300/sc2.c @@ -270,6 +270,11 @@ static void doinclude(int silent) result=plungefile(name,(c!='>'),TRUE); if (!result && !silent) error(100,name); /* cannot read from ... (fatal error) */ +#if !defined NO_DEFINE + if (result) { + inst_file_name(name, FALSE); + } +#endif } /* readline @@ -324,6 +329,9 @@ static void readline(unsigned char *line) inpf=(FILE *)POPSTK_P(); insert_dbgfile(inpfname); setfiledirect(inpfname); +#if !defined NO_DEFINE + inst_file_name(inpfname, TRUE); +#endif assert(sc_status==statFIRST || strcmp(get_inputfile(fcurrent),inpfname)==0); listline=-1; /* force a #line directive when changing the file */ } /* if */ @@ -972,8 +980,14 @@ static int command(void) if (strlen(pathname)>0) { free(inpfname); inpfname=duplicatestring(pathname); - if (inpfname==NULL) + if (inpfname==NULL) { error(103); /* insufficient memory */ + } +#if !defined NO_DEFINE + else { + inst_file_name(inpfname, TRUE); + } +#endif } /* if */ } /* if */ check_empty(lptr); From 0894027cb5adde91d4ff869d61e887f7e414fa7e Mon Sep 17 00:00:00 2001 From: voed <iwmyc@ex.ua> Date: Tue, 4 Sep 2018 20:31:23 +0300 Subject: [PATCH 54/98] Updated readme (#539) * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Fixes after review * New snapshots link * Le perfectionnisme --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6a4af833..2db3f813 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,22 @@ -AMX Mod X -========= -AMX Mod X - Half-Life 1 Scripting and Server Administration +<p align="center"> + <img src="https://github.com/alliedmodders/amxmodx/blob/master/editor/studio/AMXXLarge.bmp"/> +</p> + +**AMX Mod X** is a [Metamod](https://github.com/jkivilin/metamod-p) plugin for [Half-Life 1](https://github.com/ValveSoftware/halflife). It provides comprehensive scripting for the game engine and its mods. Scripts can intercept network messages, log events, commands, client commands, set cvars, modify entities, and more. AMX Mod X also has a system for extending native scripting through modules, leading to outside support for things like MySQL and Sockets. General ------- -- [AMXX website](http://www.amxmodx.org/) +- [AMXX website](https://amxmodx.org/) - [Forum](https://forums.alliedmods.net/forumdisplay.php?f=3): Discussion forum including plugin/extension development - [General documentation](https://wiki.alliedmods.net/Category:Documentation_%28AMX_Mod_X%29): Miscellaneous information about AMXX -- [Latest release](http://www.amxmodx.org/downloads.php): The latest stable AMXX release -- [Build snapshots](http://www.amxmodx.org/snapshots.php): Builds of recent development versions +- [Latest release](https://amxmodx.org/downloads.php): The latest stable AMXX release +- [Build snapshots](https://www.amxmodx.org/downloads-new.php): Builds of recent development versions Development ----------- -- [Issue tracker](https://bugs.alliedmods.net): Issues that require back and forth communication +- [Issue tracker](https://github.com/alliedmodders/amxmodx/issues): Issues that require back and forth communication +- [Issue archive](https://bugs.alliedmods.net/describecomponents.cgi?product=AMX%20Mod%20X): Old issue tracker (read-only) - [Building AMXX](https://wiki.alliedmods.net/Building_AMX_Mod_X): Instructions on how to build AMXX itself using [AMBuild](https://github.com/alliedmodders/ambuild) - [AMX Mod X API](https://amxmodx.org/api/): AMX Mod X API reference generated from include files - [AMXX scripting](https://wiki.alliedmods.net/Category:Scripting_(AMX_Mod_X)): Pawn examples and introduction to the language From 99ebd626537924de1475c138f6d3bb6935410c0f Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Thu, 6 Sep 2018 17:09:10 +0200 Subject: [PATCH 55/98] Update Hamsandwich for Sven Coop 5.17 (#452) * Remove dropped functions * Update existing offsets * Add some logic to prevent the use of removed functions. * Add Ham_SC_AddPoints and Ham_SC_AddPointsToTeam * Add Ham_SC_GiveAmmo * Add Ham_SC_FVisibleFromPos * Fix an old typos with CanPlaySentence for all mods * Add Ham_SC_CanPlaySequence * Add Ham_SC_PlayScriptSentence * Add Ham_SC_StartPlayerFollowing * Fix CanPlaySequence hamdata.ini (SC) * Add Ham_SC_StopPlayerFollowing * Fix handlers from previous commits * Add Ham_SC_PreSpawn * Add Ham_SC_PostSpawn * Add Ham_SC_OnKeyValueUpdate * Add Ham_SC_SetClassification * Add Ham_SC_MyCustomPointer and Ham_SC_MyItemPointer * Add Ham_SC_IsSneaking * Add Ham_SC_IsAlive * Add Ham_SC_IsBSPModel * Add Ham_SC_ReflectGauss * Add Ham_SC_HasTarget * Add Ham_SC_IsInWorld * Add Ham_SC_IsPlayer * Add Ham_SC_IsNetClient * Add Ham_SC_IsBreakable * Fix Ham_SC_IsMonster, Ham_SC_IsPointEntity, Ham_SC_IsMachine and Ham_SC_CriticakRemove handlers * Add Ham_SC_OnControls * Fix Ham_SC_TakeHealth and Ham_SC_TakeArmor handlers * Add Ham_SC_IsTriggered * Add Ham_SC_RemovePlayerItem * Fix typo * Fix Ham_SC_IsMoving handler * Add Ham_SC_SUB_UseTargets * Ham_SC_IsLockedByMaster * Add Ham_SC_FBecomeProne * Fix Ham_SC_FVisible handler * Add Ham_SC_FVecVisible * Fix Ham_SC_FVisibleFromPos handler * Fix Ham_SC_IsFacing handler * Add Ham_SC_SetPlayerAlly * Add Ham_SC_OnSetOriginByMap * Add Ham_SC_IsRevivable * Add Ham_SC_BeginRevive and Ham_SC_EndRevive * Update offsets based on SvenCoop v5.17 * Add Ham_SC_Item_CanCollect and Ham_SC_Item_Collect * Add Ham_SC_Item_AddToPlayer * Add Ham_SC_Item_AddDuplicate * Add Ham_SC_Item_AddAmmoFromItem * Add Ham_SC_Item_GetItemInfo * Add Ham_SC_Item_CanDeploy, Ham_SC_Item_Deploy and Ham_SC_Item_CanHolster * Add Ham_SC_Item_UpdateClientData * Add Ham_SC_Item_GetRespawnTime * Add Ham_SC_Item_CanHaveDuplicates * Add Ham_SC_Weapon_ExtractAmmoFromItem * Add Ham_SC_Weapon_GetAmmo1Drop and Ham_SC_Weapon_GetAmmo2Drop * Add Ham_SC_Weapon_FinishReload and Ham_SC_Weapon_ShouldReload * Fix Ham_SC_IsMultiplayer, Ham_SC_FRunfuncs and Ham_SC_FCanRun handlers * Add Ham_SC_Weapon_AddWeapon, _PlayEmptySound, _IsUsable, _ShouldWeaponIdle and _UseDecrement * Add Ham_SC_Item_GetPickupSound * Add Ham_SC_Item_InactiveItemPreFrame and Ham_SC_Item_InactiveItemPostFrame * Add Ham_SC_Item_DetachFromPlayer * Fix Ham_SC_Player_IsConnected handler * Add Ham_SC_Player_EnteredObserver, Ham_SC_Player_LeftObserver and Ham_SC_Player_IsObserver * Fix sc_postpawn typo (should be sc_postspawn) * Add few more assert --- configs/hamdata.ini | 1039 ++++++++++++------------ modules/hamsandwich/amxx_api.cpp | 4 + modules/hamsandwich/call_funcs.cpp | 325 +++++++- modules/hamsandwich/call_funcs.h | 32 + modules/hamsandwich/ham_const.h | 71 +- modules/hamsandwich/ham_utils.h | 9 +- modules/hamsandwich/hook_callbacks.cpp | 519 ++++++++++++ modules/hamsandwich/hook_callbacks.h | 79 ++ modules/hamsandwich/hook_create.cpp | 86 ++ modules/hamsandwich/hook_create.h | 32 + modules/hamsandwich/hook_native.cpp | 119 ++- modules/hamsandwich/hooklist.h | 1 + plugins/include/ham_const.inc | 631 +++++++++++++- 13 files changed, 2388 insertions(+), 559 deletions(-) diff --git a/configs/hamdata.ini b/configs/hamdata.ini index c6702c24..05a44691 100644 --- a/configs/hamdata.ini +++ b/configs/hamdata.ini @@ -517,7 +517,7 @@ checkmeleeattack2 86 schedulechange 92 canplaysequence 93 - canplaysentence 94 + canplaysentence2 94 playsentence 95 playscriptedsentence 96 sentencestop 97 @@ -702,7 +702,7 @@ checkmeleeattack2 86 schedulechange 92 canplaysequence 93 - canplaysentence 94 + canplaysentence2 94 playsentence 95 playscriptedsentence 96 sentencestop 97 @@ -888,7 +888,7 @@ checkmeleeattack2 86 schedulechange 92 canplaysequence 93 - canplaysentence 94 + canplaysentence2 94 playsentence 95 playscriptedsentence 96 sentencestop 97 @@ -1072,7 +1072,7 @@ checkmeleeattack2 88 schedulechange 94 canplaysequence 95 - canplaysentence 96 + canplaysentence2 96 playsentence 97 playscriptedsentence 98 sentencestop 99 @@ -1240,7 +1240,7 @@ checkmeleeattack2 87 schedulechange 93 canplaysequence 94 - canplaysentence 95 + canplaysentence2 95 playsentence 96 playscriptedsentence 97 sentencestop 98 @@ -1409,7 +1409,7 @@ checkmeleeattack2 87 schedulechange 93 canplaysequence 94 - canplaysentence 95 + canplaysentence2 95 playsentence 96 playscriptedsentence 97 sentencestop 98 @@ -2068,512 +2068,555 @@ ts_weapon_alternateattack 95 @end -; Sven-Coop 4.8 +; Sven-Coop 5.17 @section svencoop linux pev 4 base 0x0 - spawn 0 - precache 1 - keyvalue 2 - objectcaps 6 - activate 7 - setobjectcollisionbox 8 - irelationship 10 - classify 11 - deathnotice 12 - traceattack 13 - takedamage 14 - killed 17 - bloodcolor 18 - tracebleed 19 - istriggered 20 - mymonsterpointer 21 - mysquadmonsterpointer 22 - gettogglestate 23 - addpoints 24 - addpointstoteam 25 - addplayeritem 26 - removeplayeritem 27 - getdelay 29 - ismoving 30 - overridereset 31 - damagedecal 32 - settogglestate 33 - startsneaking 34 - stopsneaking 35 - oncontrols 36 - issneaking 37 - isalive 38 - isbspmodel 39 - reflectgauss 40 - hastarget 41 - isinworld 42 - isplayer 44 - isnetclient 46 - teamid 49 - getnexttarget 51 - think 52 - touch 53 - use 54 - blocked 55 - respawn 57 - updateowner 58 - fbecomeprone 59 - center 60 - eyeposition 61 - earposition 62 - bodytarget 63 - illumination 64 - fvecvisible 66 + spawn 1 + precache 3 + keyvalue 4 + objectcaps 9 + activate 10 + setobjectcollisionbox 11 + irelationship 14 + classify 15 + deathnotice 16 + traceattack 17 + takedamage 18 + killed 21 + bloodcolor 22 + tracebleed 23 + mymonsterpointer 25 + mysquadmonsterpointer 26 + gettogglestate 29 + addplayeritem 32 + getdelay 35 + overridereset 37 + damagedecal 38 + settogglestate 39 + startsneaking 40 + stopsneaking 41 + teamid 55 + getnexttarget 57 + think 58 + touch 59 + use 60 + blocked 61 + respawn 63 + updateowner 66 + fbecomeprone 67 + center 68 + eyeposition 69 + earposition 70 + bodytarget 71 + illumination 72 - look 77 - runai 78 - changeyaw 80 - monsterthink 81 - monsterinit 83 - monsterinitdead 84 - becomedead 85 - bestvisibleenemy 88 - finviewcone 89 - fvecinviewcone 90 - checklocalmove 91 - move 92 - moveexecute 93 - shouldadvanceroute 94 - getstoppedactivity 95 - stop 96 - checkrangeattack1 97 - checkrangeattack2 99 - checkmeleeattack1 101 - checkmeleeattack2 103 - schedulechange 111 - canplaysequence 112 - canplaysentence 113 - playsentence 114 - playscriptedsentence 115 - sentencestop 116 - getidealstate 117 - setactivity 118 - reportaistate 120 - checkenemy 121 - setyawspeed 124 - buildnearestroute 125 - findcover 126 - coverradius 131 - fcancheckattacks 132 - checkammo 134 - ignoreconditions 135 - fvalidatehinttype 136 - fcanactiveidle 137 - isoundmask 138 - hearingsensitivity 141 - barnaclevictimbitten 142 - barnaclevictimreleased 143 - preschedulethink 150 - getdeathactivity 151 - gibmonster 152 - hashumangibs 154 - hasaliengibs 155 - fademonster 156 - deathsound 159 - alertsound 160 - idlesound 161 - painsound 162 - stopfollowing 163 + look 100 + runai 101 + changeyaw 104 + monsterthink 106 + monsterinit 107 + monsterinitdead 108 + becomedead 109 + bestvisibleenemy 112 + finviewcone 113 + fvecinviewcone 114 + checklocalmove 115 + move 116 + moveexecute 117 + shouldadvanceroute 118 + getstoppedactivity 119 + stop 120 + checkrangeattack1 121 + checkrangeattack2 123 + checkmeleeattack1 125 + checkmeleeattack2 127 + schedulechange 135 + playsentence 138 + sentencestop 140 + getidealstate 141 + setactivity 142 + reportaistate 144 + checkenemy 145 + setyawspeed 148 + buildnearestroute 149 + findcover 150 + coverradius 155 + fcancheckattacks 156 + checkammo 158 + ignoreconditions 159 + fvalidatehinttype 160 + fcanactiveidle 161 + isoundmask 162 + hearingsensitivity 165 + barnaclevictimbitten 166 + barnaclevictimreleased 167 + preschedulethink 174 + getdeathactivity 175 + gibmonster 176 + hashumangibs 178 + hasaliengibs 179 + fademonster 180 + deathsound 184 + alertsound 185 + idlesound 186 + painsound 187 - player_getgunposition 157 - player_jump 179 - player_duck 180 - player_prethink 181 - player_postthink 182 - player_updateclientdata 184 - player_impulsecommands 185 + player_getgunposition 181 + player_jump 208 + player_duck 209 + player_prethink 210 + player_postthink 211 + player_updateclientdata 216 + player_impulsecommands 217 - item_addtoplayer 77 - item_addduplicate 78 - item_getiteminfo 80 - item_candeploy 81 - item_deploy 82 - item_canholster 83 - item_holster 84 - item_updateiteminfo 85 - item_preframe 86 - item_postframe 87 - item_drop 88 - item_kill 89 - item_attachtoplayer 90 - item_primaryammoindex 91 - item_secondaryammoindex 92 - item_updateclientdata 93 - item_getweaponptr 94 - item_itemslot 95 + item_holster 118 + item_updateiteminfo 119 + item_preframe 120 + item_postframe 121 + item_drop 132 + item_kill 102 + item_attachtoplayer 124 + item_primaryammoindex 126 + item_secondaryammoindex 127 + item_getweaponptr 129 + item_itemslot 130 - weapon_extractammo 96 - weapon_extractclipammo 97 - weapon_addweapon 98 - weapon_playemptysound 99 - weapon_resetemptysound 100 - weapon_sendweaponanim 101 - weapon_isusable 103 - weapon_primaryattack 104 - weapon_secondaryattack 105 - weapon_reload 107 - weapon_weaponidle 108 - weapon_retireweapon 109 - weapon_shouldweaponidle 110 - weapon_usedecrement 111 + weapon_extractammo 135 + weapon_extractclipammo 136 + weapon_resetemptysound 141 + weapon_sendweaponanim 142 + weapon_primaryattack 145 + weapon_secondaryattack 146 + weapon_reload 148 + weapon_weaponidle 151 + weapon_retireweapon 152 - sc_getclassification 9 - sc_takehealth 15 - sc_takearmor 16 - sc_giveammo 28 - sc_ismonster 43 - sc_isphysx 45 - sc_ispointentity 47 - sc_ismachine 48 - sc_criticalremove 50 - sc_updateonremove 56 - sc_fvisible 65 - sc_fvisiblefrompos 67 - sc_isfacing 68 - sc_getpointsfordamage 69 - sc_getdamagepoints 70 - sc_oncreate 73 - sc_ondestroy 74 - sc_isvalidentity 75 - sc_shouldfadeondeath 79 - sc_setupfriendly 80 - sc_revivethink 85 - sc_revive 86 - sc_startmonster 87 - sc_checkrangeattack1_move 98 - sc_checkrangeattack2_move 100 - sc_checkmeleeattack1_move 102 - sc_checkmeleeattack2_move 104 - sc_checktankusage 105 - sc_setgaitactivity 119 - sc_ftriangulate 122 - sc_ftriangulateextension 123 - sc_findcovergrenade 127 - sc_findcoverdistance 128 - sc_findattackpoint 129 - sc_fvalidatecover 130 - sc_checkattacker 133 - sc_nofriendlyfire1 144 - sc_nofriendlyfire2 145 - sc_nofriendlyfire3 146 - sc_nofriendlyfiretopos 147 - sc_fvisiblegunpos 148 - sc_finbulletcone 149 - sc_callgibmonster 153 - sc_checktimebaseddamage 157 - sc_ismoving 158 - sc_isplayerfollowing 164 - sc_startplayerfollowing 165 - sc_stopplayerfollowing 166 - sc_usesound 167 - sc_unusesound 168 - sc_ridemonster 169 - sc_checkandapplygenericattacks 170 - sc_checkscared 171 - sc_checkcreaturedanger 172 - sc_checkfalldamage 173 - sc_checkrevival 174 - sc_mediccallsound 175 + sc_prespawn 0 + sc_postspawn 2 + sc_onkeyvalueupdate 6 + sc_getclassification 12 + sc_setclassification 13 + sc_takehealth 19 + sc_takearmor 20 + sc_istriggered 24 + sc_mycustompointer 27 + sc_myitempointer 28 + sc_addpoints 30 + sc_addpointstoteam 31 + sc_removeplayeritem 33 + sc_giveammo 34 + sc_ismoving 36 + sc_oncontrols 42 + sc_issneaking 43 + sc_isalive 44 + sc_isbspmodel 45 + sc_reflectgauss 46 + sc_hastarget 47 + sc_isinworld 48 + sc_ismonster 49 + sc_isplayer 50 + sc_isnetclient 51 + sc_ispointentity 52 + sc_isbreakable 53 + sc_ismachine 54 + sc_criticalremove 56 + sc_updateonremove 62 + sc_subusetargets 64 + sc_islockedbymaster 65 + sc_fbecomeprone 67 + sc_fvisible 73 + sc_fvecvisible 74 + sc_fvisiblefrompos 75 + sc_isfacing 76 + sc_getpointsfordamage 77 + sc_getdamagepoints 78 + sc_setplayerally 79 + sc_oncreate 82 + sc_ondestroy 83 + sc_onsetoriginbymap 84 + sc_isrevivable 85 + sc_beginrevive 86 + sc_endrevive 87 + sc_shouldfadeondeath 103 + sc_setupfriendly 105 + sc_revive 110 + sc_startmonster 111 + sc_checkrangeattack1_move 122 + sc_checkrangeattack2_move 124 + sc_checkmeleeattack1_move 126 + sc_checkmeleeattack2_move 128 + sc_checktankusage 129 + sc_canplaysequence 136 + sc_canplaysentence2 137 + sc_playscriptedsentence 139 + sc_setgaitactivity 143 + sc_ftriangulate 145 + sc_ftriangulateextension 147 + sc_findcovergrenade 151 + sc_findcoverdistance 152 + sc_findattackpoint 153 + sc_fvalidatecover 154 + sc_checkattacker 157 + sc_nofriendlyfire1 168 + sc_nofriendlyfire2 169 + sc_nofriendlyfire3 170 + sc_nofriendlyfiretopos 171 + sc_fvisiblegunpos 172 + sc_finbulletcone 173 + sc_callgibmonster 177 + sc_checktimebaseddamage 182 + sc_isplayerfollowing 189 + sc_startplayerfollowing 193 + sc_stopplayerfollowing 194 + sc_usesound 196 + sc_unusesound 197 + sc_ridemonster 198 + sc_checkandapplygenericattacks 19ç + sc_checkscared 200 + sc_checkcreaturedanger 201 + sc_checkfalldamage 202 + sc_checkrevival 203 + sc_mediccallsound 206 - sc_player_menuinputperformed 176 - sc_player_ismenuinputdone 177 - sc_player_specialspawn 178 - sc_player_isconnected 182 - sc_player_isvalidinfoentity 186 - sc_player_levelend 187 - sc_player_votestarted 188 - sc_player_canstartnextvote 189 - sc_player_vote 190 - sc_player_hasvoted 191 - sc_player_resetvote 192 - sc_player_lastvoteinput 193 - sc_player_initvote 194 - sc_player_timetostartnextvote 195 - sc_player_resetview 196 - sc_player_getlogfrequency 197 - sc_player_logplayerstats 198 - sc_player_disablecollisionwithplayer 199 - sc_player_enablecollisionwithplayer 200 - sc_player_cantouchplayer 201 + sc_player_specialspawn 207 + sc_player_enteredobserver 212 + sc_player_leftobserver 213 + sc_player_isobserver 214 + sc_player_isconnected 215 + sc_player_isvalidinfoentity 218 + sc_player_levelend 219 + sc_player_votestarted 220 + sc_player_canstartnextvote 221 + sc_player_vote 222 + sc_player_hasvoted 223 + sc_player_resetvote 224 + sc_player_lastvoteinput 225 + sc_player_initvote 226 + sc_player_timetostartnextvote 227 + sc_player_resetview 228 + sc_player_getlogfrequency 229 + sc_player_logplayerstats 230 - sc_item_materialize 79 + sc_item_materialize 100 + sc_item_cancollect 105 + sc_item_collect 106 + sc_item_addtoplayer 110 + sc_item_addduplicate 111 + sc_item_addammofromitem 112 + sc_item_getpickupsound 113 + sc_item_getiteminfo 114 + sc_item_candeploy 115 + sc_item_deploy 116 + sc_item_canholster 117 + sc_item_inactiveitempreframe 122 + sc_item_inactiveitempostframe 123 + sc_item_detachfromplayer 125 + sc_item_updateclientdata 128 + sc_item_getrespawntime 131 + sc_item_canhaveduplicates 133 - sc_weapon_bulletaccuracy 102 - sc_weapon_tertiaryattack 106 - sc_weapon_burstsupplement 112 - sc_weapon_getp_model 113 - sc_weapon_getw_model 114 - sc_weapon_getv_model 115 - sc_weapon_precachecustommodels 116 - sc_weapon_ismultiplayer 117 - sc_weapon_frunfuncs 118 - sc_weapon_setfov 119 - sc_weapon_fcanrun 120 - sc_weapon_customdecrement 121 - sc_weapon_setv_model 122 - sc_weapon_setp_model 123 - sc_weapon_changeweaponskin 124 + sc_weapon_extractammofromitem 134 + sc_weapon_addweapon 137 + sc_weapon_getammo1drop 138 + sc_weapon_getammo2drop 139 + sc_weapon_playemptysound 140 + sc_weapon_bulletaccuracy 143 + sc_weapon_isusable 144 + sc_weapon_tertiaryattack 147 + sc_weapon_finishreload 149 + sc_weapon_shouldreload 150 + sc_weapon_shouldweaponidle 153 + sc_weapon_usedecrement 154 + sc_weapon_burstsupplement 155 + sc_weapon_getp_model 156 + sc_weapon_getw_model 157 + sc_weapon_getv_model 158 + sc_weapon_precachecustommodels 159 + sc_weapon_ismultiplayer 162 + sc_weapon_frunfuncs 163 + sc_weapon_setfov 164 + sc_weapon_fcanrun 165 + sc_weapon_customdecrement 166 + sc_weapon_setv_model 167 + sc_weapon_setp_model 168 + sc_weapon_changeweaponskin 169 @end -; Sven-Coop 4.8 +; Sven-Coop 5.17 @section svencoop windows pev 4 base 0x0 - spawn 0 - precache 1 - keyvalue 2 - objectcaps 6 - activate 7 - setobjectcollisionbox 8 - irelationship 10 - classify 11 - deathnotice 12 - traceattack 13 - takedamage 14 - killed 17 - bloodcolor 18 - tracebleed 19 - istriggered 20 - mymonsterpointer 21 - mysquadmonsterpointer 22 - gettogglestate 23 - addpoints 24 - addpointstoteam 25 - addplayeritem 26 - removeplayeritem 27 - getdelay 29 - ismoving 30 - overridereset 31 - damagedecal 32 - settogglestate 33 - startsneaking 34 - stopsneaking 35 - oncontrols 36 - issneaking 37 - isalive 38 - isbspmodel 39 - reflectgauss 40 - hastarget 41 - isinworld 42 - isplayer 44 - isnetclient 46 - teamid 49 - getnexttarget 51 - think 52 - touch 53 - use 54 - blocked 55 - respawn 57 - updateowner 58 - fbecomeprone 59 - center 60 - eyeposition 61 - earposition 62 - bodytarget 63 - illumination 64 - fvecvisible 65 + spawn 1 + precache 3 + keyvalue 4 + objectcaps 9 + activate 10 + setobjectcollisionbox 11 + irelationship 14 + classify 15 + deathnotice 16 + traceattack 17 + takedamage 18 + killed 21 + bloodcolor 22 + tracebleed 23 + mymonsterpointer 25 + mysquadmonsterpointer 26 + gettogglestate 29 + addplayeritem 32 + getdelay 35 + overridereset 37 + damagedecal 38 + settogglestate 39 + startsneaking 40 + stopsneaking 41 + teamid 55 + getnexttarget 57 + think 58 + touch 59 + use 60 + blocked 61 + respawn 63 + updateowner 66 + center 68 + eyeposition 69 + earposition 70 + bodytarget 71 + illumination 72 - look 76 - runai 77 - changeyaw 79 - monsterthink 80 - monsterinit 82 - monsterinitdead 83 - becomedead 84 - bestvisibleenemy 87 - finviewcone 88 - fvecinviewcone 89 - checklocalmove 90 - move 91 - moveexecute 92 - shouldadvanceroute 93 - getstoppedactivity 94 - stop 95 - checkrangeattack1 96 - checkrangeattack2 98 - checkmeleeattack1 100 - checkmeleeattack2 102 - schedulechange 110 - canplaysequence 111 - canplaysentence 112 - playsentence 113 - playscriptedsentence 114 - sentencestop 115 - getidealstate 116 - setactivity 117 - reportaistate 119 - checkenemy 120 - setyawspeed 123 - buildnearestroute 124 - findcover 125 - coverradius 130 - fcancheckattacks 131 - checkammo 133 - ignoreconditions 134 - fvalidatehinttype 135 - fcanactiveidle 136 - isoundmask 137 - hearingsensitivity 140 - barnaclevictimbitten 141 - barnaclevictimreleased 142 - preschedulethink 149 - getdeathactivity 150 - gibmonster 151 - hashumangibs 153 - hasaliengibs 154 - fademonster 155 - deathsound 158 - alertsound 159 - idlesound 160 - painsound 161 - stopfollowing 162 + look 99 + runai 100 + changeyaw 103 + monsterthink 105 + monsterinit 106 + monsterinitdead 107 + becomedead 108 + bestvisibleenemy 110 + finviewcone 113 + fvecinviewcone 112 + checklocalmove 114 + move 115 + moveexecute 116 + shouldadvanceroute 117 + getstoppedactivity 118 + stop 119 + checkrangeattack1 120 + checkrangeattack2 122 + checkmeleeattack1 124 + checkmeleeattack2 126 + schedulechange 134 + playsentence 137 + sentencestop 139 + getidealstate 140 + setactivity 141 + reportaistate 143 + checkenemy 144 + setyawspeed 147 + buildnearestroute 148 + findcover 149 + coverradius 154 + fcancheckattacks 155 + checkammo 157 + ignoreconditions 158 + fvalidatehinttype 159 + fcanactiveidle 160 + isoundmask 161 + hearingsensitivity 164 + barnaclevictimbitten 165 + barnaclevictimreleased 166 + preschedulethink 173 + getdeathactivity 174 + gibmonster 175 + hashumangibs 177 + hasaliengibs 178 + fademonster 179 + deathsound 183 + alertsound 184 + idlesound 185 + painsound 186 - player_getgunposition 156 - player_jump 178 - player_duck 179 - player_prethink 180 - player_postthink 181 - player_updateclientdata 183 - player_impulsecommands 184 + player_getgunposition 180 + player_jump 207 + player_duck 208 + player_prethink 209 + player_postthink 210 + player_updateclientdata 215 + player_impulsecommands 216 - item_addtoplayer 76 - item_addduplicate 77 - item_getiteminfo 79 - item_candeploy 80 - item_deploy 81 - item_canholster 82 - item_holster 83 - item_updateiteminfo 84 - item_preframe 85 - item_postframe 86 - item_drop 87 - item_kill 88 - item_attachtoplayer 89 - item_primaryammoindex 90 - item_secondaryammoindex 91 - item_updateclientdata 92 - item_getweaponptr 93 - item_itemslot 94 + item_holster 117 + item_updateiteminfo 118 + item_preframe 119 + item_postframe 120 + item_drop 131 + item_kill 101 + item_attachtoplayer 123 + item_primaryammoindex 125 + item_secondaryammoindex 126 + item_getweaponptr 128 + item_itemslot 129 - weapon_extractammo 95 - weapon_extractclipammo 96 - weapon_addweapon 97 - weapon_playemptysound 98 - weapon_resetemptysound 99 - weapon_sendweaponanim 100 - weapon_isusable 102 - weapon_primaryattack 103 - weapon_secondaryattack 104 - weapon_reload 106 - weapon_weaponidle 107 - weapon_retireweapon 108 - weapon_shouldweaponidle 109 - weapon_usedecrement 110 + weapon_extractammo 134 + weapon_extractclipammo 135 + weapon_resetemptysound 140 + weapon_sendweaponanim 141 + weapon_primaryattack 144 + weapon_secondaryattack 145 + weapon_reload 147 + weapon_weaponidle 150 + weapon_retireweapon 151 - sc_getclassification 9 - sc_takehealth 15 - sc_takearmor 16 - sc_giveammo 28 - sc_ismonster 43 - sc_isphysx 45 - sc_ispointentity 47 - sc_ismachine 48 - sc_criticalremove 50 - sc_updateonremove 56 - sc_fvisible 66 - sc_fvisiblefrompos 67 - sc_isfacing 68 - sc_getpointsfordamage 69 - sc_getdamagepoints 70 - sc_oncreate 72 - sc_ondestroy 73 - sc_isvalidentity 74 - sc_shouldfadeondeath 78 - sc_setupfriendly 79 - sc_revivethink 84 - sc_revive 85 - sc_startmonster 86 - sc_checkrangeattack1_move 97 - sc_checkrangeattack2_move 99 - sc_checkmeleeattack1_move 101 - sc_checkmeleeattack2_move 103 - sc_checktankusage 104 - sc_setgaitactivity 118 - sc_ftriangulate 121 - sc_ftriangulateextension 122 - sc_findcovergrenade 126 - sc_findcoverdistance 127 - sc_findattackpoint 128 - sc_fvalidatecover 129 - sc_checkattacker 132 - sc_nofriendlyfire1 145 - sc_nofriendlyfire2 144 - sc_nofriendlyfire3 143 - sc_nofriendlyfiretopos 146 - sc_fvisiblegunpos 147 - sc_finbulletcone 148 - sc_callgibmonster 152 - sc_checktimebaseddamage 156 - sc_ismoving 157 - sc_isplayerfollowing 163 - sc_startplayerfollowing 164 - sc_stopplayerfollowing 165 - sc_usesound 166 - sc_unusesound 167 - sc_ridemonster 168 - sc_checkandapplygenericattacks 169 - sc_checkscared 170 - sc_checkcreaturedanger 171 - sc_checkfalldamage 172 - sc_checkrevival 173 - sc_mediccallsound 174 + sc_prespawn 0 + sc_postspawn 2 + sc_onkeyvalueupdate 6 + sc_getclassification 12 + sc_setclassification 13 + sc_takehealth 19 + sc_takearmor 20 + sc_istriggered 24 + sc_mycustompointer 27 + sc_myitempointer 28 + sc_addpoints 30 + sc_addpointstoteam 31 + sc_removeplayeritem 33 + sc_giveammo 34 + sc_ismoving 36 + sc_oncontrols 42 + sc_issneaking 43 + sc_isalive 44 + sc_isbspmodel 45 + sc_reflectgauss 46 + sc_hastarget 47 + sc_isinworld 48 + sc_ismonster 49 + sc_isplayer 50 + sc_isnetclient 51 + sc_ispointentity 52 + sc_isbreakable 53 + sc_ismachine 54 + sc_criticalremove 56 + sc_updateonremove 62 + sc_subusetargets 64 + sc_islockedbymaster 65 + sc_fbecomeprone 67 + sc_fvecvisible 73 + sc_fvisible 74 + sc_fvisiblefrompos 75 + sc_isfacing 76 + sc_getpointsfordamage 77 + sc_getdamagepoints 78 + sc_setplayerally 79 + sc_oncreate 81 + sc_ondestroy 82 + sc_onsetoriginbymap 83 + sc_isrevivable 84 + sc_beginrevive 85 + sc_endrevive 86 + sc_shouldfadeondeath 102 + sc_setupfriendly 104 + sc_revive 109 + sc_startmonster 110 + sc_checkrangeattack1_move 121 + sc_checkrangeattack2_move 123 + sc_checkmeleeattack1_move 125 + sc_checkmeleeattack2_move 127 + sc_checktankusage 128 + sc_canplaysequence 135 + sc_canplaysentence2 136 + sc_playscriptedsentence 138 + sc_setgaitactivity 142 + sc_ftriangulate 145 + sc_ftriangulateextension 146 + sc_findcovergrenade 150 + sc_findcoverdistance 151 + sc_findattackpoint 152 + sc_fvalidatecover 153 + sc_checkattacker 156 + sc_nofriendlyfire1 169 + sc_nofriendlyfire2 168 + sc_nofriendlyfire3 167 + sc_nofriendlyfiretopos 170 + sc_fvisiblegunpos 171 + sc_finbulletcone 172 + sc_callgibmonster 176 + sc_checktimebaseddamage 181 + sc_isplayerfollowing 188 + sc_startplayerfollowing 192 + sc_stopplayerfollowing 193 + sc_usesound 195 + sc_unusesound 196 + sc_ridemonster 197 + sc_checkandapplygenericattacks 198 + sc_checkscared 199 + sc_checkcreaturedanger 200 + sc_checkfalldamage 201 + sc_checkrevival 202 + sc_mediccallsound 205 - sc_player_menuinputperformed 175 - sc_player_ismenuinputdone 176 - sc_player_specialspawn 177 - sc_player_isconnected 181 - sc_player_isvalidinfoentity 185 - sc_player_levelend 186 - sc_player_votestarted 187 - sc_player_canstartnextvote 188 - sc_player_vote 189 - sc_player_hasvoted 190 - sc_player_resetvote 191 - sc_player_lastvoteinput 192 - sc_player_initvote 193 - sc_player_timetostartnextvote 194 - sc_player_resetview 195 - sc_player_getlogfrequency 196 - sc_player_logplayerstats 197 - sc_player_disablecollisionwithplayer 198 - sc_player_enablecollisionwithplayer 199 - sc_player_cantouchplayer 200 + sc_player_specialspawn 206 + sc_player_enteredobserver 211 + sc_player_leftobserver 212 + sc_player_isobserver 213 + sc_player_isconnected 214 + sc_player_isvalidinfoentity 217 + sc_player_levelend 218 + sc_player_votestarted 219 + sc_player_canstartnextvote 220 + sc_player_vote 221 + sc_player_hasvoted 222 + sc_player_resetvote 223 + sc_player_lastvoteinput 224 + sc_player_initvote 225 + sc_player_timetostartnextvote 226 + sc_player_resetview 227 + sc_player_getlogfrequency 228 + sc_player_logplayerstats 229 - sc_item_materialize 78 + sc_item_materialize 99 + sc_item_cancollect 104 + sc_item_collect 105 + sc_item_addtoplayer 109 + sc_item_addduplicate 110 + sc_item_addammofromitem 111 + sc_item_getpickupsound 112 + sc_item_getiteminfo 113 + sc_item_candeploy 114 + sc_item_deploy 115 + sc_item_canholster 116 + sc_item_inactiveitempreframe 121 + sc_item_inactiveitempostframe 122 + sc_item_detachfromplayer 125 + sc_item_updateclientdata 127 + sc_item_getrespawntime 130 + sc_item_canhaveduplicates 132 - sc_weapon_bulletaccuracy 101 - sc_weapon_tertiaryattack 105 - sc_weapon_burstsupplement 111 - sc_weapon_getp_model 112 - sc_weapon_getw_model 113 - sc_weapon_getv_model 114 - sc_weapon_precachecustommodels 115 - sc_weapon_ismultiplayer 116 - sc_weapon_frunfuncs 117 - sc_weapon_setfov 118 - sc_weapon_fcanrun 119 - sc_weapon_customdecrement 120 - sc_weapon_setv_model 121 - sc_weapon_setp_model 122 - sc_weapon_changeweaponskin 123 + sc_weapon_extractammofromitem 133 + sc_weapon_addweapon 136 + sc_weapon_getammo1drop 137 + sc_weapon_getammo2drop 138 + sc_weapon_playemptysound 139 + sc_weapon_bulletaccuracy 142 + sc_weapon_isusable 143 + sc_weapon_tertiaryattack 146 + sc_weapon_finishreload 148 + sc_weapon_shouldreload 149 + sc_weapon_shouldweaponidle 152 + sc_weapon_usedecrement 153 + sc_weapon_burstsupplement 154 + sc_weapon_getp_model 155 + sc_weapon_getw_model 156 + sc_weapon_getv_model 157 + sc_weapon_precachecustommodels 158 + sc_weapon_ismultiplayer 161 + sc_weapon_frunfuncs 162 + sc_weapon_setfov 163 + sc_weapon_fcanrun 164 + sc_weapon_customdecrement 165 + sc_weapon_setv_model 166 + sc_weapon_setp_model 167 + sc_weapon_changeweaponskin 168 @end ; Earth's Special Forces 1.2.3 @@ -2660,7 +2703,7 @@ checkmeleeattack2 81 schedulechange 87 canplaysequence 88 - canplaysentence 89 + canplaysentence2 89 playsentence 90 playscriptedsentence 91 sentencestop 92 @@ -2817,7 +2860,7 @@ checkmeleeattack2 79 schedulechange 85 canplaysequence 86 - canplaysentence 87 + canplaysentence2 87 playsentence 88 playscriptedsentence 89 sentencestop 90 @@ -2975,7 +3018,7 @@ checkmeleeattack2 85 schedulechange 91 canplaysequence 92 - canplaysentence 93 + canplaysentence2 93 playsentence 94 playscriptedsentence 95 sentencestop 96 @@ -3214,7 +3257,7 @@ checkmeleeattack2 85 schedulechange 91 canplaysequence 92 - canplaysentence 93 + canplaysentence2 93 playsentence 94 playscriptedsentence 95 sentencestop 96 @@ -3454,7 +3497,7 @@ checkmeleeattack2 80 schedulechange 86 canplaysequence 87 - canplaysentence 88 + canplaysentence2 88 playsentence 89 playscriptedsentence 90 sentencestop 91 @@ -3615,7 +3658,7 @@ checkmeleeattack2 80 schedulechange 86 canplaysequence 87 - canplaysentence 88 + canplaysentence2 88 playsentence 89 playscriptedsentence 90 sentencestop 91 @@ -3777,7 +3820,7 @@ checkmeleeattack2 80 schedulechange 86 canplaysequence 87 - canplaysentence 88 + canplaysentence2 88 playsentence 89 playscriptedsentence 90 sentencestop 91 @@ -3939,7 +3982,7 @@ checkmeleeattack2 82 schedulechange 88 canplaysequence 89 - canplaysentence 90 + canplaysentence2 90 playsentence 91 playscriptedsentence 92 sentencestop 93 @@ -4104,7 +4147,7 @@ checkmeleeattack2 82 schedulechange 88 canplaysequence 89 - canplaysentence 90 + canplaysentence2 90 playsentence 91 playscriptedsentence 92 sentencestop 93 @@ -4269,7 +4312,7 @@ checkmeleeattack2 82 schedulechange 88 canplaysequence 89 - canplaysentence 90 + canplaysentence2 90 playsentence 91 playscriptedsentence 92 sentencestop 93 @@ -4434,7 +4477,7 @@ checkmeleeattack2 84 schedulechange 90 canplaysequence 91 - canplaysentence 92 + canplaysentence2 92 playsentence 93 playscriptedsentence 94 sentencestop 95 @@ -4596,7 +4639,7 @@ checkmeleeattack2 82 schedulechange 88 canplaysequence 89 - canplaysentence 90 + canplaysentence2 90 playsentence 91 playscriptedsentence 92 sentencestop 93 diff --git a/modules/hamsandwich/amxx_api.cpp b/modules/hamsandwich/amxx_api.cpp index fc11c972..0cd66d3a 100644 --- a/modules/hamsandwich/amxx_api.cpp +++ b/modules/hamsandwich/amxx_api.cpp @@ -63,6 +63,10 @@ void OnAmxxAttach(void) assert(strcmp(hooklist[Ham_SC_Weapon_ChangeWeaponSkin].name, "sc_weapon_changeweaponskin")==0); assert(strcmp(hooklist[Ham_Item_GetItemInfo].name, "item_getiteminfo") == 0); + assert(strcmp(hooklist[Ham_SC_Item_AddToPlayer].name, "sc_item_addtoplayer") == 0); + assert(strcmp(hooklist[Ham_SC_Weapon_ExtractAmmoFromItem].name, "sc_weapon_extractammofromitem") == 0); + assert(strcmp(hooklist[Ham_SC_Player_EnteredObserver].name, "sc_player_enteredobserver") == 0); + MF_AddNatives(pdata_natives_safe); if (ReadConfig() > 0) diff --git a/modules/hamsandwich/call_funcs.cpp b/modules/hamsandwich/call_funcs.cpp index f180573a..d3ed798f 100644 --- a/modules/hamsandwich/call_funcs.cpp +++ b/modules/hamsandwich/call_funcs.cpp @@ -173,7 +173,22 @@ cell Call_Int_Float_Int_Int(AMX *amx, cell *params) return reinterpret_cast<int (*)(void *, float, int, int)>(__func)(pv, f3, i4, i5); #endif } - + +cell Call_Bool_Float_Int_Int(AMX *amx, cell *params) +{ + SETUP(3); + + float f3 = amx_ctof(*MF_GetAmxAddr(amx, params[3])); + int i4 = *MF_GetAmxAddr(amx, params[4]); + int i5 = *MF_GetAmxAddr(amx, params[5]); + +#if defined(_WIN32) + return reinterpret_cast<bool(__fastcall *)(void*, int, float, int, int)>(__func)(pv, 0, f3, i4, i5) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool(*)(void *, float, int, int)>(__func)(pv, f3, i4, i5) ? TRUE : FALSE; +#endif +} + cell Call_Void_Entvar_Int(AMX *amx, cell *params) { SETUP(2); @@ -248,6 +263,36 @@ cell Call_Void_Int_Int(AMX *amx, cell *params) return 1; } +cell Call_Void_Int_Bool(AMX *amx, cell *params) +{ + SETUP(2); + + int i3 = *MF_GetAmxAddr(amx, params[3]); + bool i4 = *MF_GetAmxAddr(amx, params[4]) != 0; + +#if defined(_WIN32) + reinterpret_cast<void(__fastcall *)(void*, int, int, bool)>(__func)(pv, 0, i3, i4); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<void(*)(void *, int, bool)>(__func)(pv, i3, i4); +#endif + return 1; +} + +cell Call_Void_Bool_Bool(AMX *amx, cell *params) +{ + SETUP(2); + + bool i3 = *MF_GetAmxAddr(amx, params[3]) != 0; + bool i4 = *MF_GetAmxAddr(amx, params[4]) != 0; + +#if defined(_WIN32) + reinterpret_cast<void(__fastcall *)(void*, int, bool, bool)>(__func)(pv, 0, i3, i4); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<void(*)(void *, bool, bool)>(__func)(pv, i3, i4); +#endif + return 1; +} + cell Call_Int_Int_Str_Int(AMX *amx, cell *params) { SETUP(3); @@ -279,6 +324,22 @@ cell Call_Int_Int_Str_Int_Int(AMX *amx, cell *params) #endif } +cell Call_Int_Int_Str_Int_Bool(AMX *amx, cell *params) +{ + SETUP(4); + + int i3 = *MF_GetAmxAddr(amx, params[3]); + char *sz4 = MF_GetAmxString(amx, params[4], 0, NULL); + int i5 = *MF_GetAmxAddr(amx, params[5]); + bool i6 = *MF_GetAmxAddr(amx, params[6]) != 0; + +#if defined(_WIN32) + return reinterpret_cast<int(__fastcall *)(void*, int, int, const char *, int, bool)>(__func)(pv, 0, i3, sz4, i5, i6); +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<int(*)(void *, int, const char *, int, bool)>(__func)(pv, i3, sz4, i5, i6); +#endif +} + cell Call_Int_Int(AMX *amx, cell *params) { SETUP(1); @@ -292,6 +353,19 @@ cell Call_Int_Int(AMX *amx, cell *params) #endif } +cell Call_Bool_Bool(AMX *amx, cell *params) +{ + SETUP(1); + + bool i3 = *MF_GetAmxAddr(amx, params[3]) != 0; + +#if defined(_WIN32) + return reinterpret_cast<bool (__fastcall *)(void*, int, bool)>(__func)(pv, 0, i3) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool (*)(void *, bool)>(__func)(pv, i3) ? TRUE : FALSE; +#endif +} + cell Call_Int_Entvar(AMX *amx, cell *params) { SETUP(1); @@ -591,6 +665,29 @@ cell Call_Int_pVector(AMX *amx, cell *params) return ret; } +cell Call_Bool_pVector(AMX *amx, cell *params) +{ + SETUP(1); + + Vector v3; + float *fl3 = (float *)MF_GetAmxAddr(amx, params[3]); + v3.x = fl3[0]; + v3.y = fl3[1]; + v3.z = fl3[2]; + +#if defined(_WIN32) + bool ret = reinterpret_cast<bool(__fastcall *)(void *, int, Vector*)>(__func)(pv, 0, &v3); +#elif defined(__linux__) || defined(__APPLE__) + bool ret = reinterpret_cast<bool(*)(void *, Vector*)>(__func)(pv, &v3); +#endif + + fl3[0] = v3.x; + fl3[1] = v3.y; + fl3[2] = v3.z; + + return ret ? TRUE : FALSE; +} + cell Call_Void_Entvar_Float_Float(AMX *amx, cell *params) { SETUP(3); @@ -683,6 +780,24 @@ cell Call_Int_ItemInfo(AMX *amx, cell *params) #endif } +cell Call_Bool_ItemInfo(AMX *amx, cell *params) +{ + SETUP(1); + + void *ptr = reinterpret_cast<void *>(*MF_GetAmxAddr(amx, params[3])); + + if (!ptr) + { + MF_LogError(amx, AMX_ERR_NATIVE, "Null ItemInfo handle!"); + return 0; + } +#if defined(_WIN32) + return reinterpret_cast<bool(__fastcall *)(void*, int, void *)>(__func)(pv, 0, ptr) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool(*)(void *, void *)>(__func)(pv, ptr) ? TRUE : FALSE; +#endif +} + cell Call_Float_Void(AMX *amx, cell *params) { SETUP(1); @@ -844,6 +959,34 @@ cell Call_Int_Int_Int(AMX *amx, cell *params) #endif } +cell Call_Bool_Bool_Int(AMX *amx, cell *params) +{ + SETUP(2); + + bool i3 = *MF_GetAmxAddr(amx, params[3]) != 0; + int i4 = *MF_GetAmxAddr(amx, params[4]); + +#if defined(_WIN32) + return reinterpret_cast<bool (__fastcall *)(void*, int, bool, int)>(__func)(pv, 0, i3, i4) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool (*)(void *, bool, int)>(__func)(pv, i3, i4) ? TRUE : FALSE; +#endif +} + +cell Call_Int_Bool_Int(AMX *amx, cell *params) +{ + SETUP(2); + + bool i3 = *MF_GetAmxAddr(amx, params[3]) != 0; + int i4 = *MF_GetAmxAddr(amx, params[4]); + +#if defined(_WIN32) + return reinterpret_cast<int(__fastcall *)(void*, int, bool, int)>(__func)(pv, 0, i3, i4); +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<int(*)(void *, bool, int)>(__func)(pv, i3, i4); +#endif +} + cell Call_Void_Str_Float_Float_Float(AMX *amx, cell *params) { SETUP(4); @@ -886,6 +1029,30 @@ cell Call_Void_Str_Float_Float_Float_Int_Cbase(AMX *amx, cell *params) return 1; } +cell Call_Void_Str_Float_Float_Float_Bool_Cbase(AMX *amx, cell *params) +{ + SETUP(6); + + char *sz3=MF_GetAmxString(amx, params[3], 0, NULL); + float f4=amx_ctof(*MF_GetAmxAddr(amx, params[4])); + float f5=amx_ctof(*MF_GetAmxAddr(amx, params[5])); + float f6=amx_ctof(*MF_GetAmxAddr(amx, params[6])); + bool i7=*MF_GetAmxAddr(amx, params[7]) != 0; + int id8=*MF_GetAmxAddr(amx, params[8]); + + CHECK_ENTITY(id8); + + void *p8 = TypeConversion.id_to_cbase(id8); + +#if defined(_WIN32) + reinterpret_cast<void (__fastcall *)(void*, int, const char *, float, float, float, bool, void *)>(__func)(pv, 0, sz3, f4, f5, f6, i7, p8); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<void (*)(void *, const char *, float, float, float, bool, void *)>(__func)(pv, sz3, f4, f5, f6, i7, p8); +#endif + + return 1; +} + cell Call_Int_Vector_Vector_Float_Float(AMX *amx, cell *params) { SETUP(4); @@ -1143,6 +1310,24 @@ cell Call_Void_Str_Int(AMX *amx, cell *params) return 1; } +cell Call_Bool_Cbase_Int(AMX *amx, cell *params) +{ + SETUP(2); + + int id3 = *MF_GetAmxAddr(amx, params[3]); + CHECK_ENTITY(id3); + + void *p8 = TypeConversion.id_to_cbase(id3); + + int i4 = *MF_GetAmxAddr(amx, params[4]); + +#if defined(_WIN32) + return reinterpret_cast<bool(__fastcall *)(void*, int, void *, int)>(__func)(pv, 0, p8, i4) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool(*)(void *, void *, int)>(__func)(pv, p8, i4) ? TRUE : FALSE; +#endif +} + cell Call_Void_Cbase_Int(AMX *amx, cell *params) { SETUP(2); @@ -1163,6 +1348,27 @@ cell Call_Void_Cbase_Int(AMX *amx, cell *params) return 1; } +cell Call_Void_Cbase_Int_Float(AMX *amx, cell *params) +{ + SETUP(3); + + int id3 = *MF_GetAmxAddr(amx, params[3]); + CHECK_ENTITY(id3); + + void *p8 = TypeConversion.id_to_cbase(id3); + + int i4 = *MF_GetAmxAddr(amx, params[4]); + float f5 = amx_ctof(*MF_GetAmxAddr(amx, params[5])); + +#if defined(_WIN32) + reinterpret_cast<void(__fastcall *)(void*, int, void *, int, float)>(__func)(pv, 0, p8, i4, f5); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<void(*)(void *, void *, int, float)>(__func)(pv, p8, i4, f5); +#endif + + return 1; +} + cell Call_Void_Str(AMX *amx, cell *params) { SETUP(1); @@ -1401,7 +1607,7 @@ cell Call_Int_Cbase_Bool(AMX *amx, cell *params) void *pv1 = TypeConversion.id_to_cbase(id3); - bool b4=*MF_GetAmxAddr(amx, params[4]) ? true : false; + bool b4= *MF_GetAmxAddr(amx, params[4]) != 0; #if defined(_WIN32) return reinterpret_cast<int (__fastcall *)(void*, int, void *, bool)>(__func)(pv, 0, pv1, b4); @@ -1410,6 +1616,25 @@ cell Call_Int_Cbase_Bool(AMX *amx, cell *params) #endif } +cell Call_Bool_Cbase_Bool(AMX *amx, cell *params) +{ + SETUP(2); + + int id3 = *MF_GetAmxAddr(amx, params[3]); + + CHECK_ENTITY(id3); + + void *pv1 = TypeConversion.id_to_cbase(id3); + + bool b4 = *MF_GetAmxAddr(amx, params[4]) != 0; + +#if defined(_WIN32) + return reinterpret_cast<bool(__fastcall *)(void*, int, void *, bool)>(__func)(pv, 0, pv1, b4) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool(*)(void *, void *, bool)>(__func)(pv, pv1, b4) ? TRUE : FALSE; +#endif +} + cell Call_Int_Vector_Vector(AMX *amx, cell *params) { SETUP(2); @@ -1434,6 +1659,54 @@ cell Call_Int_Vector_Vector(AMX *amx, cell *params) #endif } +cell Call_Int_pVector_pVector(AMX *amx, cell *params) +{ + SETUP(2); + + Vector v3; + Vector v4; + + float *fl3 = (float *)MF_GetAmxAddr(amx, params[3]); + v3.x = fl3[0]; + v3.y = fl3[1]; + v3.z = fl3[2]; + + float *fl4 = (float *)MF_GetAmxAddr(amx, params[4]); + v4.x = fl4[0]; + v4.y = fl4[1]; + v4.z = fl4[2]; + +#if defined(_WIN32) + return reinterpret_cast<int(__fastcall *)(void *, int, Vector *, Vector *)>(__func)(pv, 0, &v3, &v4); +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<int(*)(void *, Vector *, Vector *)>(__func)(pv, &v3, &v4); +#endif +} + +cell Call_Bool_pVector_pVector(AMX *amx, cell *params) +{ + SETUP(2); + + Vector v3; + Vector v4; + + float *fl3 = (float *)MF_GetAmxAddr(amx, params[3]); + v3.x = fl3[0]; + v3.y = fl3[1]; + v3.z = fl3[2]; + + float *fl4 = (float *)MF_GetAmxAddr(amx, params[4]); + v4.x = fl4[0]; + v4.y = fl4[1]; + v4.z = fl4[2]; + +#if defined(_WIN32) + return reinterpret_cast<bool(__fastcall *)(void *, int, Vector *, Vector *)>(__func)(pv, 0, &v3, &v4) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool(*)(void *, Vector *, Vector *)>(__func)(pv, &v3, &v4) ? TRUE : FALSE; +#endif +} + cell Call_Int_Entvar_Float(AMX *amx, cell *params) { SETUP(2); @@ -1453,6 +1726,25 @@ cell Call_Int_Entvar_Float(AMX *amx, cell *params) #endif } +cell Call_Bool_Entvar_Float(AMX *amx, cell *params) +{ + SETUP(2); + + int id3 = *MF_GetAmxAddr(amx, params[3]); + + CHECK_ENTITY(id3); + + entvars_t *ev3 = TypeConversion.id_to_entvars(id3); + + float f4 = amx_ctof(*MF_GetAmxAddr(amx, params[4])); + +#if defined(_WIN32) + return reinterpret_cast<bool(__fastcall *)(void *, int, entvars_t *, float)>(__func)(pv, 0, ev3, f4) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool(*)(void *, entvars_t *, float)>(__func)(pv, ev3, f4) ? TRUE : FALSE; +#endif +} + cell Call_Float_Float(AMX *amx, cell *params) { SETUP(2); @@ -1497,9 +1789,9 @@ cell Call_Bool_Void(AMX *amx, cell *params) SETUP(0); #if defined(_WIN32) - return reinterpret_cast<bool (__fastcall *)(void*, int)>(__func)(pv, 0); + return reinterpret_cast<bool (__fastcall *)(void*, int)>(__func)(pv, 0) ? TRUE : FALSE; #elif defined(__linux__) || defined(__APPLE__) - return reinterpret_cast<bool (*)(void *)>(__func)(pv); + return reinterpret_cast<bool (*)(void *)>(__func)(pv) ? TRUE : FALSE; #endif } @@ -1665,9 +1957,9 @@ cell Call_Bool_Cbase(AMX *amx, cell *params) void *pv1 = TypeConversion.id_to_cbase(id3); #if defined(_WIN32) - return reinterpret_cast<bool (__fastcall *)(void*, int, void*)>(__func)(pv, 0, pv1); + return reinterpret_cast<bool (__fastcall *)(void*, int, void*)>(__func)(pv, 0, pv1) ? TRUE : FALSE; #elif defined(__linux__) || defined(__APPLE__) - return reinterpret_cast<bool (*)(void *, void*)>(__func)(pv, pv1); + return reinterpret_cast<bool (*)(void *, void*)>(__func)(pv, pv1) ? TRUE : FALSE; #endif } @@ -1678,9 +1970,24 @@ cell Call_Bool_Int(AMX *amx, cell *params) int id3=*MF_GetAmxAddr(amx, params[3]); #if defined(_WIN32) - return reinterpret_cast<bool (__fastcall *)(void*, int, int)>(__func)(pv, 0, id3); + return reinterpret_cast<bool (__fastcall *)(void*, int, int)>(__func)(pv, 0, id3) ? TRUE : FALSE; #elif defined(__linux__) || defined(__APPLE__) - return reinterpret_cast<bool (*)(void *, int)>(__func)(pv, id3); + return reinterpret_cast<bool (*)(void *, int)>(__func)(pv, id3) ? TRUE : FALSE; +#endif +} + +cell Call_Bool_Entvar(AMX *amx, cell *params) +{ + SETUP(1); + + int id3 = *MF_GetAmxAddr(amx, params[3]); + CHECK_ENTITY(id3); + entvars_t *ev3 = TypeConversion.id_to_entvars(id3); + +#if defined(_WIN32) + return reinterpret_cast<bool(__fastcall *)(void*, int, void*)>(__func)(pv, 0, ev3) ? TRUE : FALSE; +#elif defined(__linux__) || defined(__APPLE__) + return reinterpret_cast<bool(*)(void *, void*)>(__func)(pv, ev3) ? TRUE : FALSE; #endif } @@ -1711,7 +2018,7 @@ cell Call_Void_Cbase_Bool(AMX *amx, cell *params) CHECK_ENTITY(id3); void *p8 = TypeConversion.id_to_cbase(id3); - bool b4 = *MF_GetAmxAddr(amx, params[4]) ? true : false; + bool b4 = *MF_GetAmxAddr(amx, params[4]) != 0; #if defined(_WIN32) reinterpret_cast<void (__fastcall *)(void*, int, void *, bool)>(__func)(pv, 0, p8, b4); diff --git a/modules/hamsandwich/call_funcs.h b/modules/hamsandwich/call_funcs.h index 0b492a9c..b252632f 100644 --- a/modules/hamsandwich/call_funcs.h +++ b/modules/hamsandwich/call_funcs.h @@ -27,6 +27,8 @@ cell Call_Int_Float_Int(AMX *amx, cell *params); cell Call_Int_Float_Int_Int(AMX *amx, cell *params); +cell Call_Bool_Float_Int_Int(AMX *amx, cell *params); + cell Call_Void_Entvar_Int(AMX *amx, cell *params); cell Call_Void_Entvar_Entvar_Int(AMX *amx, cell *params); @@ -35,12 +37,20 @@ cell Call_Int_Cbase(AMX *amx, cell *params); cell Call_Void_Int_Int(AMX *amx, cell *params); +cell Call_Void_Int_Bool(AMX *amx, cell *params); + +cell Call_Void_Bool_Bool(AMX *amx, cell *params); + cell Call_Int_Int_Str_Int(AMX *amx, cell *params); cell Call_Int_Int_Str_Int_Int(AMX *amx, cell *params); +cell Call_Int_Int_Str_Int_Bool(AMX *amx, cell *params); + cell Call_Int_Int(AMX *amx, cell *params); +cell Call_Bool_Bool(AMX *amx, cell *params); + cell Call_Int_Entvar(AMX *amx, cell *params); cell Call_Int_Entvar_Entvar_Float_Int(AMX *amx, cell *params); @@ -67,6 +77,8 @@ cell Call_Vector_pVector(AMX *amx, cell *params); cell Call_Int_pVector(AMX *amx, cell *params); +cell Call_Bool_pVector(AMX *amx, cell *params); + cell Call_Void_Entvar_Float_Float(AMX *amx, cell *params); cell Call_Void_pFloat_pFloat(AMX *amx, cell *params); @@ -77,6 +89,8 @@ cell Call_Void_Int_Int_Int(AMX *amx, cell *params); cell Call_Int_ItemInfo(AMX *amx, cell *params); +cell Call_Bool_ItemInfo(AMX *amx, cell *params); + cell Call_Float_Void(AMX *amx, cell *params); cell Call_Void_Float_Int(AMX* amx, cell* params); @@ -99,10 +113,14 @@ cell Call_Int_Float(AMX *amx, cell *params); cell Call_Int_Int_Int(AMX *amx, cell *params); +cell Call_Bool_Bool_Int(AMX *amx, cell *params); + cell Call_Void_Str_Float_Float_Float(AMX *amx, cell *params); cell Call_Void_Str_Float_Float_Float_Int_Cbase(AMX *amx, cell *params); +cell Call_Void_Str_Float_Float_Float_Bool_Cbase(AMX *amx, cell *params); + cell Call_Int_Vector_Vector_Float_Float(AMX *amx, cell *params); cell Call_Int_Short(AMX *amx, cell *params); @@ -129,8 +147,12 @@ cell Call_Int_Int_Int_Float_Int(AMX* amx, cell* params); cell Call_Void_Str_Int(AMX* amx, cell* params); +cell Call_Bool_Cbase_Int(AMX* amx, cell* params); + cell Call_Void_Cbase_Int(AMX* amx, cell* params); +cell Call_Void_Cbase_Int_Float(AMX* amx, cell* params); + cell Call_Void_Str(AMX* amx, cell* params); cell Call_Void_Vector(AMX* amx, cell* params); @@ -151,10 +173,18 @@ cell Call_Int_pVector_pVector_Float_Cbase_pVector(AMX* amx, cell* params); cell Call_Int_Cbase_Bool(AMX* amx, cell* params); +cell Call_Bool_Cbase_Bool(AMX* amx, cell* params); + cell Call_Int_Vector_Vector(AMX *amx, cell *params); +cell Call_Int_pVector_pVector(AMX *amx, cell *params); + +cell Call_Bool_pVector_pVector(AMX *amx, cell *params); + cell Call_Int_Entvar_Float(AMX *amx, cell *params); +cell Call_Bool_Entvar_Float(AMX *amx, cell *params); + cell Call_Float_Float(AMX* amx, cell* params); cell Call_Void_Entvar_Entvar_Float(AMX *amx, cell *params); @@ -173,6 +203,8 @@ cell Call_Void_Bool(AMX *amx, cell *params); cell Call_Bool_Cbase(AMX *amx, cell *params); +cell Call_Bool_Entvar(AMX *amx, cell *params); + cell Call_Bool_Int(AMX *amx, cell *params); cell Call_Void_Cbase_Float(AMX* amx, cell* params); diff --git a/modules/hamsandwich/ham_const.h b/modules/hamsandwich/ham_const.h index e196dd7c..ee6ca006 100644 --- a/modules/hamsandwich/ham_const.h +++ b/modules/hamsandwich/ham_const.h @@ -203,7 +203,7 @@ enum Ham_CheckMeleeAttack2, Ham_ScheduleChange, Ham_CanPlaySequence, - Ham_CanPlaySentence, + Ham_CanPlaySentence2, Ham_PlaySentence, Ham_PlayScriptedSentence, Ham_SentenceStop, @@ -484,6 +484,72 @@ enum Ham_Item_GetItemInfo, + // + // New addition - 20117 + // + + Ham_SC_PreSpawn, + Ham_SC_PostSpawn, + Ham_SC_OnKeyValueUpdate, + Ham_SC_SetClassification, + Ham_SC_IsTriggered, + Ham_SC_MyCustomPointer, + Ham_SC_MyItemPointer, + Ham_SC_AddPoints, + Ham_SC_AddPointsToTeam, + Ham_SC_RemovePlayerItem, + Ham_SC_OnControls, + Ham_SC_IsSneaking, + Ham_SC_IsAlive, + Ham_SC_IsBSPModel, + Ham_SC_ReflectGauss, + Ham_SC_HasTarget, + Ham_SC_IsInWorld, + Ham_SC_IsPlayer, + Ham_SC_IsNetClient, + Ham_SC_IsBreakable, + Ham_SC_SUB_UseTargets, + Ham_SC_IsLockedByMaster, + Ham_SC_FBecomeProne, + Ham_SC_FVecVisible, + Ham_SC_SetPlayerAlly, + Ham_SC_OnSetOriginByMap, + Ham_SC_IsRevivable, + Ham_SC_BeginRevive, + Ham_SC_EndRevive, + Ham_SC_CanPlaySequence, + Ham_SC_CanPlaySentence2, + Ham_SC_PlayScriptedSentence, + Ham_SC_Item_AddToPlayer, + Ham_SC_Item_AddDuplicate, + Ham_SC_Item_AddAmmoFromItem, + Ham_SC_Item_GetPickupSound, + Ham_SC_Item_CanCollect, + Ham_SC_Item_Collect, + Ham_SC_Item_GetItemInfo, + Ham_SC_Item_CanDeploy, + Ham_SC_Item_Deploy, + Ham_SC_Item_CanHolster, + Ham_SC_Item_InactiveItemPreFrame, + Ham_SC_Item_InactiveItemPostFrame, + Ham_SC_Item_DetachFromPlayer, + Ham_SC_Item_UpdateClientData, + Ham_SC_Item_GetRespawnTime, + Ham_SC_Item_CanHaveDuplicates, + Ham_SC_Weapon_ExtractAmmoFromItem, + Ham_SC_Weapon_AddWeapon, + Ham_SC_Weapon_GetAmmo1Drop, + Ham_SC_Weapon_GetAmmo2Drop, + Ham_SC_Weapon_PlayEmptySound, + Ham_SC_Weapon_IsUsable, + Ham_SC_Weapon_FinishReload, + Ham_SC_Weapon_ShouldReload, + Ham_SC_Weapon_ShouldWeaponIdle, + Ham_SC_Weapon_UseDecrement, + Ham_SC_Player_EnteredObserver, + Ham_SC_Player_LeftObserver, + Ham_SC_Player_IsObserver, + HAM_LAST_ENTRY_DONT_USE_ME_LOL }; @@ -493,7 +559,8 @@ enum HAM_INVALID_FUNC, // The function is not valid HAM_FUNC_NOT_CONFIGURED, // This function is not configured in hamdata.ini - + HAM_FUNC_NOT_AVAILABLE, // This function is not more available in the mod + HAM_ERR_END }; diff --git a/modules/hamsandwich/ham_utils.h b/modules/hamsandwich/ham_utils.h index a30f415f..82877a97 100644 --- a/modules/hamsandwich/ham_utils.h +++ b/modules/hamsandwich/ham_utils.h @@ -24,7 +24,12 @@ extern HLTypeConversion TypeConversion; if (x < 0 || x >= HAM_LAST_ENTRY_DONT_USE_ME_LOL) { \ char msg[1024]; \ ke::SafeSprintf(msg, sizeof(msg), "Function out of bounds. Got: %d Max: %d", x, HAM_LAST_ENTRY_DONT_USE_ME_LOL - 1); \ - FailPlugin(amx, x, HAM_INVALID_FUNC, msg); \ + FailPlugin(amx, x, HAM_INVALID_FUNC, msg); \ + return 0; \ + } else if (hooklist[x].isremoved) { \ + char msg[1024]; \ + ke::SafeSprintf(msg, sizeof(msg), "Function %s is no more available in the mod.", hooklist[x].name); \ + FailPlugin(amx, x, HAM_FUNC_NOT_AVAILABLE, msg); \ return 0; \ } else if (hooklist[x].isset == 0) { \ char msg[1024]; \ @@ -34,6 +39,8 @@ extern HLTypeConversion TypeConversion; } + + #define CHECK_ENTITY(x) \ if (x < 0 || x > gpGlobals->maxEntities) { \ MF_LogError(amx, AMX_ERR_NATIVE, "Entity out of range (%d)", x); \ diff --git a/modules/hamsandwich/hook_callbacks.cpp b/modules/hamsandwich/hook_callbacks.cpp index 59588adf..9ba1dab9 100644 --- a/modules/hamsandwich/hook_callbacks.cpp +++ b/modules/hamsandwich/hook_callbacks.cpp @@ -313,6 +313,39 @@ int Hook_Int_Float_Int_Int(Hook *hook, void *pthis, float f1, int i1, int i2) return ret; } +bool Hook_Bool_Float_Int_Int(Hook *hook, void *pthis, float f1, int i1, int i2) +{ + bool ret = false; + bool origret = false; + + PUSH_BOOL() + + MAKE_VECTOR() + + P_FLOAT(f1) + P_INT(i1) + P_INT(i2) + + PRE_START() + , f1, i1, i2 + PRE_END() + +#if defined(_WIN32) + origret=reinterpret_cast<bool (__fastcall*)(void*, int, float, int, int)>(hook->func)(pthis, 0, f1, i1, i2); +#elif defined(__linux__) || defined(__APPLE__) + origret=reinterpret_cast<bool (*)(void*, float, int, int)>(hook->func)(pthis, f1, i1, i2); +#endif + + POST_START() + , f1, i1, i2 + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + + return ret; +} void Hook_Void_Entvar_Int(Hook *hook, void *pthis, entvars_t *ev1, int i1) { PUSH_VOID() @@ -429,6 +462,58 @@ void Hook_Void_Int_Int(Hook *hook, void *pthis, int i1, int i2) POP() } +void Hook_Void_Int_Bool(Hook *hook, void *pthis, int i1, bool i2) +{ + PUSH_VOID() + + MAKE_VECTOR() + + P_INT(i1) + P_BOOL(i2) + + PRE_START() + , i1, i2 + PRE_END() +#if defined(_WIN32) + reinterpret_cast<void(__fastcall*)(void*, int, int, bool)>(hook->func)(pthis, 0, i1, i2); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<void(*)(void*, int, bool)>(hook->func)(pthis, i1, i2); +#endif + + POST_START() + , i1, i2 + POST_END() + + KILL_VECTOR() + POP() +} + +void Hook_Void_Bool_Bool(Hook *hook, void *pthis, bool i1, bool i2) +{ + PUSH_VOID() + + MAKE_VECTOR() + + P_BOOL(i1) + P_BOOL(i2) + + PRE_START() + , i1, i2 + PRE_END() +#if defined(_WIN32) + reinterpret_cast<void(__fastcall*)(void*, int, bool, bool)>(hook->func)(pthis, 0, i1, i2); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<void(*)(void*, bool, bool)>(hook->func)(pthis, i1, i2); +#endif + + POST_START() + , i1, i2 + POST_END() + + KILL_VECTOR() + POP() +} + int Hook_Int_Int_Str_Int(Hook *hook, void *pthis, int i1, const char *sz1, int i2) { int ret=0; @@ -500,6 +585,42 @@ int Hook_Int_Int_Str_Int_Int(Hook *hook, void *pthis, int i1, const char *sz1, i return ret; } +int Hook_Int_Int_Str_Int_Bool(Hook *hook, void *pthis, int i1, const char *sz1, int i2, bool i3) +{ + int ret = 0; + int origret = 0; + ke::AString a; + + PUSH_INT() + + a = sz1; + + MAKE_VECTOR() + + P_INT(i1) + P_STR(a) + P_INT(i2) + P_BOOL(i3) + + PRE_START() + , i1, a.chars(), i2, i3 + PRE_END() +#if defined(_WIN32) + origret = reinterpret_cast<int(__fastcall*)(void*, int, int, const char *, int, bool)>(hook->func)(pthis, 0, i1, a.chars(), i2, i3); +#elif defined(__linux__) || defined(__APPLE__) + origret = reinterpret_cast<int(*)(void*, int, const char *, int, bool)>(hook->func)(pthis, i1, a.chars(), i2, i3); +#endif + + POST_START() + , i1, a.chars(), i2, i3 + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + return ret; +} + int Hook_Int_Int(Hook *hook, void *pthis, int i1) { int ret=0; @@ -531,6 +652,38 @@ int Hook_Int_Int(Hook *hook, void *pthis, int i1) return ret; } +bool Hook_Bool_Bool(Hook *hook, void *pthis, bool i1) +{ + bool ret = false; + bool origret = false; + + PUSH_BOOL() + MAKE_VECTOR() + + P_BOOL(i1) + + PRE_START() + ,i1 + PRE_END() + +#if defined(_WIN32) + origret = reinterpret_cast<bool (__fastcall*)(void*, int, bool)>(hook->func)(pthis, 0, i1); +#elif defined(__linux__) || defined(__APPLE__) + origret = reinterpret_cast<bool (*)(void*, bool)>(hook->func)(pthis, i1); +#endif + + POST_START() + ,i1 + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + + return ret; +} + + int Hook_Int_Entvar(Hook *hook, void *pthis, entvars_t *ev1) { int ret=0; @@ -973,6 +1126,36 @@ int Hook_Int_pVector(Hook *hook, void *pthis, Vector *v1) return ret; } +bool Hook_Bool_pVector(Hook *hook, void *pthis, Vector *v1) +{ + bool ret = false; + bool origret = false; + + PUSH_BOOL() + + MAKE_VECTOR() + P_PTRVECTOR(v1) + + PRE_START() + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v1), 3, false) + PRE_END() + +#if defined(_WIN32) + origret = reinterpret_cast<bool(__fastcall*)(void*, int, Vector *)>(hook->func)(pthis, 0, v1); +#elif defined(__linux__) || defined(__APPLE__) + origret = reinterpret_cast<bool(*)(void*, Vector *)>(hook->func)(pthis, v1); +#endif + + POST_START() + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v1), 3, false) + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + return ret; +} + void Hook_Void_Entvar_Float_Float(Hook *hook, void *pthis, entvars_t *ev1, float f1, float f2) { PUSH_VOID() @@ -1080,6 +1263,7 @@ void Hook_Void_Int_Int_Int(Hook *hook, void *pthis, int i1, int i2, int i3) KILL_VECTOR() POP() } + int Hook_Int_ItemInfo(Hook *hook, void *pthis, void *iteminfo) { int ret = 0; @@ -1111,6 +1295,38 @@ int Hook_Int_ItemInfo(Hook *hook, void *pthis, void *iteminfo) return ret; } +bool Hook_Bool_ItemInfo(Hook *hook, void *pthis, void *iteminfo) +{ + bool ret = false; + bool origret = false; + + PUSH_BOOL() + + MAKE_VECTOR() + + P_ITEMINFO(iteminfo) + + PRE_START() + ,iteminfo + PRE_END() +#if defined(_WIN32) + origret = reinterpret_cast<bool (__fastcall*)(void*, int, void *)>(hook->func)(pthis, 0, iteminfo); +#elif defined(__linux__) || defined(__APPLE__) + origret = reinterpret_cast<bool (*)(void*, void *)>(hook->func)(pthis, iteminfo); +#endif + + POST_START() + ,iteminfo + POST_END() + + KILL_VECTOR() + POP() + + CHECK_RETURN() + + return ret; +} + float Hook_Float_Void(Hook *hook, void *pthis) { float ret=0.0; @@ -1410,6 +1626,39 @@ int Hook_Int_Int_Int(Hook *hook, void *pthis, int i1, int i2) return ret; } +bool Hook_Bool_Bool_Int(Hook *hook, void *pthis, bool i1, int i2) +{ + bool ret = false; + bool origret = false; + + PUSH_BOOL() + + MAKE_VECTOR() + + P_BOOL(i1) + P_INT(i2) + + PRE_START() + ,i1, i2 + PRE_END() + +#if defined(_WIN32) + origret = reinterpret_cast<bool (__fastcall*)(void*, int, bool, int)>(hook->func)(pthis, 0, i1, i2); +#elif defined(__linux__) || defined(__APPLE__) + origret = reinterpret_cast<bool (*)(void*, bool, int)>(hook->func)(pthis, i1, i2); +#endif + + POST_START() + ,i1, i2 + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + + return ret; +} + void Hook_Void_Str_Float_Float_Float(Hook *hook, void *pthis, const char *sz1, float f1, float f2, float f3) { ke::AString a; @@ -1479,6 +1728,42 @@ void Hook_Void_Str_Float_Float_Float_Int_Cbase(Hook *hook, void *pthis, const ch POP() } +void Hook_Void_Str_Float_Float_Float_Bool_Cbase(Hook *hook, void *pthis, const char *sz1, float f1, float f2, float f3, bool i1, void *cb) +{ + ke::AString a; + + PUSH_VOID() + + a = sz1; + int iEnt=TypeConversion.cbase_to_id(cb); + + MAKE_VECTOR() + + P_STR(a) + P_FLOAT(f1) + P_FLOAT(f2) + P_FLOAT(f3) + P_BOOL(i1) + P_CBASE(cb, iEnt) + + PRE_START() + ,a.chars(), f1, f2, f3, i1, iEnt + PRE_END() + +#if defined(_WIN32) + reinterpret_cast<int (__fastcall*)(void*, int, const char *, float, float, float, bool, void *)>(hook->func)(pthis, 0, a.chars(), f1, f2, f3, i1, cb); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<int (*)(void*, const char *, float, float, float, bool, void *)>(hook->func)(pthis, a.chars(), f1, f2, f3, i1, cb); +#endif + + POST_START() + ,a.chars(), f1, f2, f3, i1, iEnt + POST_END() + + KILL_VECTOR() + POP() +} + int Hook_Int_Vector_Vector_Float_Float(Hook *hook, void *pthis, Vector v1, Vector v2, float f1, float f2) { int ret=0; @@ -1907,6 +2192,42 @@ void Hook_Void_Str_Int(Hook *hook, void *pthis, const char *sz1, int i2) POP() } +bool Hook_Bool_Cbase_Int(Hook *hook, void *pthis, void *p1, int i1) +{ + bool ret = false; + bool origret = false; + + PUSH_BOOL() + + int iEnt =TypeConversion.cbase_to_id(p1); + + MAKE_VECTOR() + + P_CBASE(p1, iEnt) + P_INT(i1) + + PRE_START() + , iEnt, i1 + PRE_END() + +#if defined(_WIN32) + origret = reinterpret_cast<bool (__fastcall*)(void*, int, void *, int)>(hook->func)(pthis, 0, p1, i1); +#elif defined(__linux__) || defined(__APPLE__) + origret = reinterpret_cast<bool (*)(void*, void *, int)>(hook->func)(pthis, p1, i1); +#endif + + POST_START() + , iEnt, i1 + POST_END() + + KILL_VECTOR() + POP() + + CHECK_RETURN() + + return ret; +} + void Hook_Void_Cbase_Int(Hook *hook, void *pthis, void *p1, int i1) { PUSH_VOID() @@ -1935,6 +2256,35 @@ void Hook_Void_Cbase_Int(Hook *hook, void *pthis, void *p1, int i1) POP() } +void Hook_Void_Cbase_Int_Float(Hook *hook, void *pthis, void *p1, int i1, float f1) +{ + PUSH_VOID() + int iEnt = TypeConversion.cbase_to_id(p1); + + MAKE_VECTOR() + + P_CBASE(p1, iEnt) + P_INT(i1) + P_FLOAT(f1) + + PRE_START() + , iEnt, i1, f1 + PRE_END() + +#if defined(_WIN32) + reinterpret_cast<void(__fastcall*)(void*, int, void *, int, float)>(hook->func)(pthis, 0, p1, i1, f1); +#elif defined(__linux__) || defined(__APPLE__) + reinterpret_cast<void(*)(void*, void *, int, float)>(hook->func)(pthis, p1, i1, f1); +#endif + + POST_START() + , iEnt, i1, f1 + POST_END() + + KILL_VECTOR() + POP() +} + void Hook_Void_Str(Hook *hook, void *pthis, const char *sz1) { ke::AString a; @@ -2274,6 +2624,39 @@ int Hook_Int_Cbase_Bool(Hook *hook, void *pthis, void *cb1, bool b1) return ret; } +bool Hook_Bool_Cbase_Bool(Hook *hook, void *pthis, void *cb1, bool b1) +{ + bool ret=false; + bool origret=false; + + PUSH_BOOL() + + int i1=TypeConversion.cbase_to_id(cb1); + + MAKE_VECTOR() + + P_CBASE(cb1, i1) + P_BOOL(b1) + + PRE_START() + , i1, b1 + PRE_END() +#if defined(_WIN32) + origret=reinterpret_cast<bool (__fastcall*)(void*, int, void *, bool)>(hook->func)(pthis, 0, cb1, b1); +#elif defined(__linux__) || defined(__APPLE__) + origret=reinterpret_cast<bool (*)(void*, void *, bool)>(hook->func)(pthis, cb1, b1); +#endif + + POST_START() + , i1, b1 + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + return ret; +} + int Hook_Int_Vector_Vector(Hook *hook, void *pthis, Vector v1, Vector v2) { int ret=0; @@ -2309,6 +2692,76 @@ int Hook_Int_Vector_Vector(Hook *hook, void *pthis, Vector v1, Vector v2) return ret; } +int Hook_Int_pVector_pVector(Hook *hook, void *pthis, Vector *v1, Vector *v2) +{ + int ret=0; + int origret=0; + + PUSH_INT() + + MAKE_VECTOR() + + P_PTRVECTOR(v1) + P_PTRVECTOR(v2) + + PRE_START() + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v1), 3, false) + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v2), 3, false) + PRE_END() + +#if defined(_WIN32) + origret=reinterpret_cast<int (__fastcall*)(void*, int, Vector*, Vector*)>(hook->func)(pthis, 0, v1, v2); +#elif defined(__linux__) || defined(__APPLE__) + origret=reinterpret_cast<int (*)(void*, Vector*, Vector*)>(hook->func)(pthis, v1, v2); +#endif + + POST_START() + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v1), 3, false) + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v2), 3, false) + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + + return ret; +} + +bool Hook_Bool_pVector_pVector(Hook *hook, void *pthis, Vector *v1, Vector *v2) +{ + bool ret=false; + bool origret=false; + + PUSH_BOOL() + + MAKE_VECTOR() + + P_PTRVECTOR(v1) + P_PTRVECTOR(v2) + + PRE_START() + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v1), 3, false) + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v2), 3, false) + PRE_END() + +#if defined(_WIN32) + origret=reinterpret_cast<bool (__fastcall*)(void*, int, Vector*, Vector*)>(hook->func)(pthis, 0, v1, v2); +#elif defined(__linux__) || defined(__APPLE__) + origret=reinterpret_cast<bool (*)(void*, Vector*, Vector*)>(hook->func)(pthis, v1, v2); +#endif + + POST_START() + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v1), 3, false) + , MF_PrepareCellArrayA(reinterpret_cast<cell *>(v2), 3, false) + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + + return ret; +} + int Hook_Int_Entvar_Float(Hook *hook, void *pthis, entvars_t *ev1, float f1) { int ret=0; @@ -2341,6 +2794,38 @@ int Hook_Int_Entvar_Float(Hook *hook, void *pthis, entvars_t *ev1, float f1) return ret; } +bool Hook_Bool_Entvar_Float(Hook *hook, void *pthis, entvars_t *ev1, float f1) +{ + bool ret=false; + bool origret=false; + + PUSH_BOOL() + int i1=TypeConversion.entvars_to_id(ev1); + + MAKE_VECTOR() + P_ENTVAR(ev1, i1) + P_FLOAT(f1) + + PRE_START() + ,i1, f1 + PRE_END() + +#if defined(_WIN32) + origret=reinterpret_cast<bool(__fastcall*)(void*, int, entvars_t *, float)>(hook->func)(pthis, 0, ev1, f1); +#elif defined(__linux__) || defined(__APPLE__) + origret=reinterpret_cast<bool(*)(void*, entvars_t *, float)>(hook->func)(pthis, ev1, f1); +#endif + + POST_START() + , i1, f1 + POST_END() + + KILL_VECTOR() + POP() + CHECK_RETURN() + return ret; +} + float Hook_Float_Float(Hook *hook, void *pthis, float f1) { float ret=0.0; @@ -2643,6 +3128,40 @@ bool Hook_Bool_Cbase(Hook *hook, void *pthis, void *cb) return ret; } +bool Hook_Bool_Entvar(Hook *hook, void *pthis, entvars_t *ev1) +{ + bool ret = 0; + bool origret = 0; + + PUSH_BOOL() + + int e1 = TypeConversion.entvars_to_id(ev1); + + MAKE_VECTOR() + + P_ENTVAR(ev1, e1) + + PRE_START() + , e1 + PRE_END() + +#if defined(_WIN32) + origret = reinterpret_cast<bool(__fastcall*)(void*, int, entvars_t*)>(hook->func)(pthis, 0, ev1); +#elif defined(__linux__) || defined(__APPLE__) + origret = reinterpret_cast<bool(*)(void*, entvars_t*)>(hook->func)(pthis, ev1); +#endif + + POST_START() + , e1 + POST_END() + + KILL_VECTOR() + POP() + + CHECK_RETURN() + return ret; +} + bool Hook_Bool_Int(Hook *hook, void *pthis, int i1) { bool ret=0; diff --git a/modules/hamsandwich/hook_callbacks.h b/modules/hamsandwich/hook_callbacks.h index c50f4f8e..097d1445 100644 --- a/modules/hamsandwich/hook_callbacks.h +++ b/modules/hamsandwich/hook_callbacks.h @@ -50,6 +50,11 @@ const bool RB_Int_Float_Int_Int = false; const int PC_Int_Float_Int_Int = 3; int Hook_Int_Float_Int_Int(Hook *hook, void *pthis, float f1, int i1, int i2); +const bool RT_Bool_Float_Int_Int = false; +const bool RB_Bool_Float_Int_Int = false; +const int PC_Bool_Float_Int_Int = 3; +bool Hook_Bool_Float_Int_Int(Hook *hook, void *pthis, float f1, int i1, int i2); + const bool RT_Void_Entvar_Int = true; const bool RB_Void_Entvar_Int = false; const int PC_Void_Entvar_Int = 2; @@ -70,6 +75,16 @@ const bool RB_Void_Int_Int = false; const int PC_Void_Int_Int = 2; void Hook_Void_Int_Int(Hook *hook, void *pthis, int i1, int i2); +const bool RT_Void_Int_Bool = true; +const bool RB_Void_Int_Bool = false; +const int PC_Void_Int_Bool = 2; +void Hook_Void_Int_Bool(Hook *hook, void *pthis, int i1, bool i2); + +const bool RT_Void_Bool_Bool = true; +const bool RB_Void_Bool_Bool = false; +const int PC_Void_Bool_Bool = 2; +void Hook_Void_Bool_Bool(Hook *hook, void *pthis, bool i1, bool i2); + const bool RT_Int_Int_Str_Int = false; const bool RB_Int_Int_Str_Int = false; const int PC_Int_Int_Str_Int = 3; @@ -81,11 +96,21 @@ const bool RB_Int_Int_Str_Int_Int = false; const int PC_Int_Int_Str_Int_Int = 4; int Hook_Int_Int_Str_Int_Int(Hook *hook, void *pthis, int i1, const char *sz1, int i2, int i3); +const bool RT_Int_Int_Str_Int_Bool = false; +const bool RB_Int_Int_Str_Int_Bool = false; +const int PC_Int_Int_Str_Int_Bool = 4; +int Hook_Int_Int_Str_Int_Bool(Hook *hook, void *pthis, int i1, const char *sz1, int i2, bool i3); + const bool RT_Int_Int = false; const bool RB_Int_Int = false; const int PC_Int_Int = 1; int Hook_Int_Int(Hook *hook, void *pthis, int i1); +const bool RT_Bool_Bool = false; +const bool RB_Bool_Bool = false; +const int PC_Bool_Bool = 1; +bool Hook_Bool_Bool(Hook *hook, void *pthis, bool i1); + const bool RT_Int_Entvar = false; const bool RB_Int_Entvar = false; const int PC_Int_Entvar = 1; @@ -177,6 +202,11 @@ const bool RB_Int_pVector = false; const int PC_Int_pVector = 1; int Hook_Int_pVector(Hook *hook, void *pthis, Vector *v1); +const bool RT_Bool_pVector = false; +const bool RB_Bool_pVector = false; +const int PC_Bool_pVector = 1; +bool Hook_Bool_pVector(Hook *hook, void *pthis, Vector *v1); + const bool RT_Void_Entvar_Float_Float = true; const bool RB_Void_Entvar_Float_Float = false; const int PC_Void_Entvar_Float_Float = 3; @@ -203,6 +233,10 @@ const bool RB_Int_ItemInfo = false; const int PC_Int_ItemInfo = 1; int Hook_Int_ItemInfo(Hook *hook, void *pthis, void *iteminfo); +const bool RT_Bool_ItemInfo = false; +const bool RB_Bool_ItemInfo = false; +const int PC_Bool_ItemInfo = 1; +bool Hook_Bool_ItemInfo(Hook *hook, void *pthis, void *iteminfo); const bool RT_Float_Void = false; const bool RB_Float_Void = false; @@ -263,6 +297,11 @@ const bool RB_Int_Int_Int = false; const int PC_Int_Int_Int = 2; int Hook_Int_Int_Int(Hook *hook, void *pthis, int i1, int i2); +const bool RT_Bool_Bool_Int = false; +const bool RB_Bool_Bool_Int = false; +const int PC_Bool_Bool_Int = 2; +bool Hook_Bool_Bool_Int(Hook *hook, void *pthis, bool i1, int i2); + const bool RT_Void_Str_Float_Float_Float = true; const bool RB_Void_Str_Float_Float_Float = false; const int PC_Void_Str_Float_Float_Float = 4; @@ -273,6 +312,11 @@ const bool RB_Void_Str_Float_Float_Float_Int_Cbase = false; const int PC_Void_Str_Float_Float_Float_Int_Cbase = 6; void Hook_Void_Str_Float_Float_Float_Int_Cbase(Hook *hook, void *pthis, const char *sz1, float f1, float f2, float f3, int i1, void *cb); +const bool RT_Void_Str_Float_Float_Float_Bool_Cbase = true; +const bool RB_Void_Str_Float_Float_Float_Bool_Cbase = false; +const int PC_Void_Str_Float_Float_Float_Bool_Cbase = 6; +void Hook_Void_Str_Float_Float_Float_Bool_Cbase(Hook *hook, void *pthis, const char *sz1, float f1, float f2, float f3, bool i1, void *cb); + const bool RT_Int_Vector_Vector_Float_Float= false; const bool RB_Int_Vector_Vector_Float_Float = false; const int PC_Int_Vector_Vector_Float_Float = 8; @@ -346,11 +390,21 @@ const bool RB_Void_Str_Int = false; const int PC_Void_Str_Int = 2; void Hook_Void_Str_Int(Hook *hook, void *pthis, const char *sz1, int i2); +const bool RT_Bool_Cbase_Int = false; +const bool RB_Bool_Cbase_Int = false; +const int PC_Bool_Cbase_Int = 2; +bool Hook_Bool_Cbase_Int(Hook *hook, void *pthis, void *p1, int i1); + const bool RT_Void_Cbase_Int = true; const bool RB_Void_Cbase_Int = false; const int PC_Void_Cbase_Int = 2; void Hook_Void_Cbase_Int(Hook *hook, void *pthis, void *p1, int i1); +const bool RT_Void_Cbase_Int_Float = true; +const bool RB_Void_Cbase_Int_Float = false; +const int PC_Void_Cbase_Int_Float = 3; +void Hook_Void_Cbase_Int_Float(Hook *hook, void *pthis, void *p1, int i1, float f1); + const bool RT_Void_Str = true; const bool RB_Void_Str = false; const int PC_Void_Str = 1; @@ -401,16 +455,36 @@ const bool RB_Int_Cbase_Bool = false; const int PC_Int_Cbase_Bool = 2; int Hook_Int_Cbase_Bool(Hook *hook, void *pthis, void *cb1, bool b1); +const bool RT_Bool_Cbase_Bool = false; +const bool RB_Bool_Cbase_Bool = false; +const int PC_Bool_Cbase_Bool = 2; +bool Hook_Bool_Cbase_Bool(Hook *hook, void *pthis, void *cb1, bool b1); + const bool RT_Int_Vector_Vector = false; const bool RB_Int_Vector_Vector = false; const int PC_Int_Vector_Vector = 6; int Hook_Int_Vector_Vector(Hook *hook, void *pthis, Vector v1, Vector v2); +const bool RT_Int_pVector_pVector = false; +const bool RB_Int_pVector_pVector = false; +const int PC_Int_pVector_pVector = 3; +int Hook_Int_pVector_pVector(Hook *hook, void *pthis, Vector *v1, Vector *v2); + +const bool RT_Bool_pVector_pVector = false; +const bool RB_Bool_pVector_pVector = false; +const int PC_Bool_pVector_pVector = 3; +bool Hook_Bool_pVector_pVector(Hook *hook, void *pthis, Vector *v1, Vector *v2); + const bool RT_Int_Entvar_Float = false; const bool RB_Int_Entvar_Float = false; const int PC_Int_Entvar_Float = 2; int Hook_Int_Entvar_Float(Hook *hook, void *pthis, entvars_t *ev1, float f1); +const bool RT_Bool_Entvar_Float = false; +const bool RB_Bool_Entvar_Float = false; +const int PC_Bool_Entvar_Float = 2; +bool Hook_Bool_Entvar_Float(Hook *hook, void *pthis, entvars_t *ev1, float f1); + const bool RT_Float_Float = false; const bool RB_Float_Float = false; const int PC_Float_Float = 1; @@ -456,6 +530,11 @@ const bool RB_Bool_Cbase = false; const int PC_Bool_Cbase = 1; bool Hook_Bool_Cbase(Hook *hook, void *pthis, void *cb); +const bool RT_Bool_Entvar = false; +const bool RB_Bool_Entvar = false; +const int PC_Bool_Entvar = 1; +bool Hook_Bool_Entvar(Hook *hook, void *pthis, entvars_t *ev1); + const bool RT_Bool_Int = false; const bool RB_Bool_Int = false; const int PC_Bool_Int = 1; diff --git a/modules/hamsandwich/hook_create.cpp b/modules/hamsandwich/hook_create.cpp index d2ab0061..53942a21 100644 --- a/modules/hamsandwich/hook_create.cpp +++ b/modules/hamsandwich/hook_create.cpp @@ -43,6 +43,11 @@ int Create_Int_Float_Int_Int(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_FLOAT, FP_CELL, FP_CELL, FP_DONE); } +int Create_Bool_Float_Int_Int(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_FLOAT, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Void_Entvar_Int(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); @@ -63,6 +68,16 @@ int Create_Void_Int_Int(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); } +int Create_Void_Int_Bool(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); +} + +int Create_Void_Bool_Bool(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Int_Int_Str_Int(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_STRING, FP_CELL, FP_DONE); @@ -73,11 +88,21 @@ int Create_Int_Int_Str_Int_Int(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_DONE); } +int Create_Int_Int_Str_Int_Bool(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_DONE); + +} int Create_Int_Int(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); } +int Create_Bool_Bool(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Int_Entvar(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); @@ -143,6 +168,11 @@ int Create_Int_pVector(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_DONE); } +int Create_Bool_pVector(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_DONE); +} + int Create_Void_Entvar_Float_Float(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_FLOAT, FP_FLOAT, FP_DONE); @@ -168,6 +198,11 @@ int Create_Int_ItemInfo(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); } +int Create_Bool_ItemInfo(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Float_Void(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_DONE); @@ -223,6 +258,11 @@ int Create_Int_Int_Int(AMX* amx, const char* func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); } +int Create_Bool_Bool_Int(AMX* amx, const char* func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Void_Str_Float_Float_Float(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_STRING, FP_FLOAT, FP_FLOAT, FP_FLOAT, FP_DONE); @@ -233,6 +273,11 @@ int Create_Void_Str_Float_Float_Float_Int_Cbase(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_STRING, FP_FLOAT, FP_FLOAT, FP_FLOAT, FP_CELL, FP_CELL, FP_DONE); } +int Create_Void_Str_Float_Float_Float_Bool_Cbase(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_STRING, FP_FLOAT, FP_FLOAT, FP_FLOAT, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Int_Vector_Vector_Float_Float(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_ARRAY, FP_FLOAT, FP_FLOAT, FP_DONE); @@ -298,16 +343,27 @@ int Create_Void_Str_Int(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_STRING, FP_CELL, FP_DONE); } +int Create_Bool_Cbase_Int(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Void_Cbase_Int(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); } +int Create_Void_Cbase_Int_Float(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Void_Str(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_STRING, FP_DONE); } + int Create_Void_Vector(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_DONE); @@ -338,6 +394,11 @@ int Create_Int_pVector_pVector_Cbase_pFloat(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_ARRAY, FP_CELL, FP_FLOAT, FP_DONE); } +int Create_Bool_pVector_pVector_Cbase_pFloat(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_ARRAY, FP_CELL, FP_FLOAT, FP_DONE); +} + int Create_Void_Cbase_pVector_Float(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_ARRAY, FP_FLOAT, FP_DONE); @@ -353,16 +414,36 @@ int Create_Int_Cbase_Bool(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); } +int Create_Bool_Cbase_Bool(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Int_Vector_Vector(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE); } +int Create_Int_pVector_pVector(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE); +} + +int Create_Bool_pVector_pVector(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_ARRAY, FP_ARRAY, FP_DONE); +} + int Create_Int_Entvar_Float(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_FLOAT, FP_DONE); } +int Create_Bool_Entvar_Float(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_FLOAT, FP_DONE); +} + int Create_Float_Float(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_FLOAT, FP_DONE); @@ -408,6 +489,11 @@ int Create_Bool_Cbase(AMX *amx, const char *func) return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); } +int Create_Bool_Entvar(AMX *amx, const char *func) +{ + return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); +} + int Create_Bool_Int(AMX *amx, const char *func) { return MF_RegisterSPForwardByName(amx, func, FP_CELL, FP_CELL, FP_DONE); diff --git a/modules/hamsandwich/hook_create.h b/modules/hamsandwich/hook_create.h index 9bdd24ca..b9579d9d 100644 --- a/modules/hamsandwich/hook_create.h +++ b/modules/hamsandwich/hook_create.h @@ -27,6 +27,8 @@ int Create_Int_Float_Int(AMX *amx, const char *func); int Create_Int_Float_Int_Int(AMX *amx, const char *func); +int Create_Bool_Float_Int_Int(AMX *amx, const char *func); + int Create_Void_Entvar_Int(AMX *amx, const char *func); int Create_Void_Entvar_Entvar_Int(AMX *amx, const char *func); @@ -35,12 +37,20 @@ int Create_Int_Cbase(AMX *amx, const char *func); int Create_Void_Int_Int(AMX *amx, const char *func); +int Create_Void_Int_Bool(AMX *amx, const char *func); + +int Create_Void_Bool_Bool(AMX *amx, const char *func); + int Create_Int_Int_Str_Int(AMX *amx, const char *func); int Create_Int_Int_Str_Int_Int(AMX *amx, const char *func); +int Create_Int_Int_Str_Int_Bool(AMX *amx, const char *func); + int Create_Int_Int(AMX *amx, const char *func); +int Create_Bool_Bool(AMX *amx, const char *func); + int Create_Int_Entvar(AMX *amx, const char *func); int Create_Int_Entvar_Entvar_Float_Int(AMX *amx, const char *func); @@ -67,6 +77,8 @@ int Create_Vector_pVector(AMX *amx, const char *func); int Create_Int_pVector(AMX *amx, const char *func); +int Create_Bool_pVector(AMX *amx, const char *func); + int Create_Void_Entvar_Float_Float(AMX *amx, const char *func); int Create_Void_pFloat_pFloat(AMX *amx, const char *func); @@ -77,6 +89,8 @@ int Create_Void_Int_Int_Int(AMX *amx, const char *func); int Create_Int_ItemInfo(AMX *amx, const char *func); +int Create_Bool_ItemInfo(AMX *amx, const char *func); + int Create_Float_Void(AMX *amx, const char *func); int Create_Float_Int(AMX *amx, const char *func); @@ -99,10 +113,14 @@ int Create_Int_Float(AMX* amx, const char* func); int Create_Int_Int_Int(AMX* amx, const char* func); +int Create_Bool_Bool_Int(AMX* amx, const char* func); + int Create_Void_Str_Float_Float_Float(AMX* amx, const char* func); int Create_Void_Str_Float_Float_Float_Int_Cbase(AMX *amx, const char *func); +int Create_Void_Str_Float_Float_Float_Bool_Cbase(AMX *amx, const char *func); + int Create_Int_Vector_Vector_Float_Float(AMX *amx, const char *func); int Create_Int_Short(AMX* amx, const char* func); @@ -129,8 +147,12 @@ int Create_Int_Int_Int_Float_Int(AMX *amx, const char *func); int Create_Void_Str_Int(AMX *amx, const char *func); +int Create_Bool_Cbase_Int(AMX *amx, const char *func); + int Create_Void_Cbase_Int(AMX *amx, const char *func); +int Create_Void_Cbase_Int_Float(AMX *amx, const char *func); + int Create_Void_Str(AMX *amx, const char *func); int Create_Void_Vector(AMX *amx, const char *func); @@ -151,10 +173,18 @@ int Create_Int_pVector_pVector_Float_Cbase_pVector(AMX *amx, const char *func); int Create_Int_Cbase_Bool(AMX *amx, const char *func); +int Create_Bool_Cbase_Bool(AMX *amx, const char *func); + int Create_Int_Vector_Vector(AMX *amx, const char *func); +int Create_Int_pVector_pVector(AMX *amx, const char *func); + +int Create_Bool_pVector_pVector(AMX *amx, const char *func); + int Create_Int_Entvar_Float(AMX *amx, const char *func); +int Create_Bool_Entvar_Float(AMX *amx, const char *func); + int Create_Float_Float(AMX *amx, const char *func); int Create_Void_Entvar_Entvar_Float(AMX *amx, const char *func); @@ -173,6 +203,8 @@ int Create_Void_Bool(AMX *amx, const char *func); int Create_Bool_Cbase(AMX *amx, const char *func); +int Create_Bool_Entvar(AMX *amx, const char *func); + int Create_Bool_Int(AMX *amx, const char *func); int Create_Void_Cbase_Float(AMX *amx, const char *func); diff --git a/modules/hamsandwich/hook_native.cpp b/modules/hamsandwich/hook_native.cpp index c88c364f..2fc197bf 100644 --- a/modules/hamsandwich/hook_native.cpp +++ b/modules/hamsandwich/hook_native.cpp @@ -37,7 +37,8 @@ bool gDoForwards=true; ke::Vector<Hook *> hooks[HAM_LAST_ENTRY_DONT_USE_ME_LOL]; CHamSpecialBotHandler SpecialbotHandler; -#define V(__KEYNAME, __STUFF__) 0, 0, __KEYNAME, RT_##__STUFF__, RB_##__STUFF__, PC_##__STUFF__, reinterpret_cast<void *>(Hook_##__STUFF__), Create_##__STUFF__, Call_##__STUFF__ +#define V(__KEYNAME, __STUFF__) 0, 0, __KEYNAME, false, RT_##__STUFF__, RB_##__STUFF__, PC_##__STUFF__, reinterpret_cast<void *>(Hook_##__STUFF__), Create_##__STUFF__, Call_##__STUFF__ +#define V_REMOVED(__KEYNAME) 0, 0, __KEYNAME, true, RT_Void_Void, RB_Void_Void, PC_Void_Void, nullptr, 0, 0 hook_t hooklist[] = { @@ -229,7 +230,7 @@ hook_t hooklist[] = { V("checkmeleeattack2", Int_Float_Float) }, { V("schedulechange", Void_Void) }, { V("canplaysequence", Int_Int_Int) }, - { V("canplaysentence", Int_Int) }, + { V("canplaysentence2", Int_Int) }, { V("playsentence", Void_Str_Float_Float_Float) }, { V("playscriptedsentence", Void_Str_Float_Float_Float_Int_Cbase) }, { V("sentencestop", Void_Void) }, @@ -401,23 +402,23 @@ hook_t hooklist[] = /* Sven co-op */ { V("sc_getclassification", Int_Int) }, - { V("sc_ismonster", Int_Void) }, - { V("sc_isphysx", Int_Void) }, - { V("sc_ispointentity", Int_Void) }, - { V("sc_ismachine", Int_Void) }, - { V("sc_criticalremove", Int_Void) }, + { V("sc_ismonster", Bool_Void) }, + { V_REMOVED("sc_isphysx") }, + { V("sc_ispointentity", Bool_Void) }, + { V("sc_ismachine", Bool_Void) }, + { V("sc_criticalremove", Bool_Void) }, { V("sc_updateonremove", Void_Void) }, - { V("sc_fvisible", Int_Cbase_Bool) }, - { V("sc_fvisiblefrompos", Int_Vector_Vector) }, - { V("sc_isfacing", Int_Entvar_Float) }, + { V("sc_fvisible", Bool_Cbase_Bool) }, + { V("sc_fvisiblefrompos", Bool_pVector_pVector) }, + { V("sc_isfacing", Bool_Entvar_Float) }, { V("sc_getpointsfordamage", Float_Float) }, { V("sc_getdamagepoints", Void_Entvar_Entvar_Float) }, { V("sc_oncreate", Void_Void) }, { V("sc_ondestroy", Void_Void) }, - { V("sc_isvalidentity", Bool_Void) }, + { V_REMOVED("sc_isvalidentity") }, { V("sc_shouldfadeondeath", Int_Void) }, { V("sc_setupfriendly", Void_Void) }, - { V("sc_revivethink", Void_Void) }, + { V_REMOVED("sc_revivethink") }, { V("sc_revive", Void_Void) }, { V("sc_startmonster", Void_Void) }, { V("sc_checkrangeattack1_move",Int_Float_Float) }, @@ -440,10 +441,10 @@ hook_t hooklist[] = { V("sc_finbulletcone", Int_Cbase_pVector) }, { V("sc_callgibmonster", Void_Void) }, { V("sc_checktimebaseddamage", Void_Void) }, - { V("sc_ismoving", Int_Void) }, + { V("sc_ismoving", Bool_Void) }, { V("sc_isplayerfollowing", Int_Void) }, - { V("sc_startplayerfollowing", Void_Cbase) }, - { V("sc_stopplayerfollowing", Void_Int) }, + { V("sc_startplayerfollowing", Void_Cbase_Bool) }, + { V("sc_stopplayerfollowing", Void_Bool_Bool) }, { V("sc_usesound", Void_Void) }, { V("sc_unusesound", Void_Void) }, { V("sc_ridemonster", Void_Cbase) }, @@ -454,8 +455,8 @@ hook_t hooklist[] = { V("sc_checkrevival", Void_Void) }, { V("sc_mediccallsound", Void_Void) }, - { V("sc_player_menuinputperformed", Void_Bool) }, - { V("sc_player_ismenuinputdone",Bool_Void) }, + { V_REMOVED("sc_player_menuinputperformed") }, + { V_REMOVED("sc_player_ismenuinputdone") }, { V("sc_player_specialspawn", Void_Void) }, { V("sc_player_isvalidinfoentity", Bool_Void) }, { V("sc_player_levelend", Void_Void) }, @@ -470,9 +471,9 @@ hook_t hooklist[] = { V("sc_player_resetview", Void_Void) }, { V("sc_player_getlogfrequency",Float_Void) }, { V("sc_player_logplayerstats", Bool_Void) }, - { V("sc_player_disablecollisionwithplayer", Void_Cbase_Float) }, - { V("sc_player_enablecollisionwithplayer", Void_Cbase_Bool) }, - { V("sc_player_cantouchplayer", Bool_Cbase) }, + { V_REMOVED("sc_player_disablecollisionwithplayer") }, + { V_REMOVED("sc_player_enablecollisionwithplayer") }, + { V_REMOVED("sc_player_cantouchplayer") }, { V("sc_item_materialize", Void_Void) }, @@ -483,10 +484,10 @@ hook_t hooklist[] = { V("sc_weapon_getw_model", Str_Str) }, { V("sc_weapon_getv_model", Str_Str) }, { V("sc_weapon_precachecustommodels", Void_Void) }, - { V("sc_weapon_ismultiplayer", Int_Void) }, - { V("sc_weapon_frunfuncs", Int_Void) }, + { V("sc_weapon_ismultiplayer", Bool_Void) }, + { V("sc_weapon_frunfuncs", Bool_Void) }, { V("sc_weapon_setfov", Void_Int) }, - { V("sc_weapon_fcanrun", Int_Void) }, + { V("sc_weapon_fcanrun", Bool_Void) }, { V("sc_weapon_customdecrement",Void_Float) }, { V("sc_weapon_setv_model", Void_Str) }, { V("sc_weapon_setp_model", Void_Str) }, @@ -499,11 +500,11 @@ hook_t hooklist[] = { V("tfc_weapon_sendweaponanim", Void_Int_Int) }, { V("tfc_weapon_getnextattackdelay", Float_Float) }, - { V("sc_takehealth",Int_Float_Int_Int) }, - { V("sc_takearmor", Int_Float_Int_Int) }, - { V("sc_giveammo", Int_Int_Str_Int_Int) }, + { V("sc_takehealth",Bool_Float_Int_Int) }, + { V("sc_takearmor", Bool_Float_Int_Int) }, + { V("sc_giveammo", Int_Int_Str_Int_Bool) }, { V("sc_checkattacker", Int_Cbase) }, - { V("sc_player_isconnected", Int_Void) }, + { V("sc_player_isconnected", Bool_Void) }, { V("dod_weapon_sendweaponanim", Void_Int_Int) }, @@ -514,7 +515,69 @@ hook_t hooklist[] = { V("ts_weapon_alternateattack", Void_Void) }, - { V("item_getiteminfo", Int_ItemInfo) } + { V("item_getiteminfo", Int_ItemInfo) }, + + { V("sc_prespawn", Void_Void) }, + { V("sc_postspawn", Void_Void) }, + { V("sc_onkeyvalueupdate", Void_Str) }, + { V("sc_setclassification", Void_Int) }, + { V("sc_istriggered", Bool_Void) }, + { V("sc_mycustompointer", Cbase_Void) }, + { V("sc_myitempointer", Cbase_Void) }, + { V("sc_addpoints", Void_Int_Bool) }, + { V("sc_addpointstoteam", Void_Int_Bool) }, + { V("sc_removeplayeritem", Bool_Cbase) }, + { V("sc_oncontrols", Bool_Entvar) }, + { V("sc_issneaking", Bool_Void) }, + { V("sc_isalive", Bool_Void) }, + { V("sc_isbspmodel", Bool_Void) }, + { V("sc_reflectgauss", Bool_Void) }, + { V("sc_hastarget", Bool_Int) }, + { V("sc_isinworld", Bool_Void) }, + { V("sc_isplayer", Bool_Void) }, + { V("sc_isnetclient", Bool_Void) }, + { V("sc_isbreakable", Bool_Void) }, + { V("sc_subusetargets", Void_Cbase_Int_Float) }, + { V("sc_islockedbymaster", Bool_Void) }, + { V("sc_fbecomeprone", Bool_Cbase) }, + { V("sc_fvecvisible", Bool_pVector) }, + { V("sc_setplayerally", Void_Bool) }, + { V("sc_onsetoriginbymap", Void_Void) }, + { V("sc_isrevivable", Bool_Void) }, + { V("sc_beginrevive", Void_Float) }, + { V("sc_endrevive", Void_Float) }, + { V("sc_canplaysequence", Bool_Bool_Int) }, + { V("sc_canplaysentence2", Bool_Bool) }, + { V("sc_playscriptedsentence", Void_Str_Float_Float_Float_Bool_Cbase) }, + { V("sc_item_addtoplayer", Bool_Cbase) }, + { V("sc_item_addduplicate", Bool_Cbase) }, + { V("sc_item_addammofromitem", Bool_Cbase) }, + { V("sc_item_getpickupsound", Str_Void) }, + { V("sc_item_cancollect", Bool_Cbase_Int) }, + { V("sc_item_collect", Void_Cbase_Int) }, + { V("sc_item_getiteminfo", Bool_ItemInfo) }, + { V("sc_item_candeploy", Bool_Void) }, + { V("sc_item_deploy", Bool_Void) }, + { V("sc_item_canholster", Bool_Void) }, + { V("sc_item_inactiveitempreframe", Void_Void) }, + { V("sc_item_inactiveitempostframe",Void_Void) }, + { V("sc_item_detachfromplayer", Void_Void) }, + { V("sc_item_updateclientdata", Bool_Cbase) }, + { V("sc_item_getrespawntime", Float_Void) }, + { V("sc_item_canhaveduplicates",Bool_Void) }, + { V("sc_weapon_extractammofromitem",Bool_Cbase) }, + { V("sc_weapon_addweapon", Bool_Void) }, + { V("sc_weapon_getammo1drop", Int_Void) }, + { V("sc_weapon_getammo2drop", Int_Void) }, + { V("sc_weapon_playemptysound", Bool_Void) }, + { V("sc_weapon_isusable", Bool_Void) }, + { V("sc_weapon_finishreload", Void_Void) }, + { V("sc_weapon_shouldreload", Bool_Void) }, + { V("sc_weapon_shouldweaponidle",Bool_Void) }, + { V("sc_weapon_usedecrement", Bool_Void) }, + { V("sc_player_enteredobserver",Void_Void) }, + { V("sc_player_leftobserver", Void_Void) }, + { V("sc_player_isobserver", Bool_Void) }, }; diff --git a/modules/hamsandwich/hooklist.h b/modules/hamsandwich/hooklist.h index a4b07fb7..bc48aa0e 100644 --- a/modules/hamsandwich/hooklist.h +++ b/modules/hamsandwich/hooklist.h @@ -19,6 +19,7 @@ typedef struct hook_s int isset; // whether or not this hook is registered with hamdata int vtid; // vtable index of this function const char *name; // name used in the keys + bool isremoved; // whether or not this function is no more available in the mod bool isvoid; // whether or not the target trampoline uses voids bool needsretbuf; // whether or not a pointer to a memory buffer is needed to store a return value int paramcount; // how many parameters are in the func diff --git a/plugins/include/ham_const.inc b/plugins/include/ham_const.inc index b7564fca..3d656c2f 100644 --- a/plugins/include/ham_const.inc +++ b/plugins/include/ham_const.inc @@ -174,7 +174,9 @@ enum Ham /** * Description: Returns whether an entity is activated. * This function is not supported by Day Of Defeat. - * This function has different version for Team Fortress Classic, see Ham_TFC_IsTriggered instead. + * This function has different version for the following mods: + * Team Fortress Classic, see Ham_TFC_IsTriggered instead. + * Sven-Coop 5.0+, see Ham_SC_IsTriggered instead. * Forward params: function(this, idActivator); * Return type: Integer. * Execute params: ExecuteHam(Ham_IsTriggered, this, idActivator); @@ -207,7 +209,9 @@ enum Ham /** * Description: Typically adds points to the entity. - * This function is not supported by Team Fortress Classic mod. + * This function is not supported for the following mods: + * Team Fortress Classic. + * Sven-Coop 5.0-, see Ham_SC_AddPoints instead. * Forward params: function(this, points, bool:cangonegative); * Return type: None. * Execute params: ExecuteHam(Ham_AddPoints, this, points, bool:cangonegative); @@ -216,7 +220,9 @@ enum Ham /** * Description: Typically adds points to everybody on the entity's team. - * This function is not supported by Team Fortress Classic mod. + * This function is not supported for the following mods: + * Team Fortress Classic. + * Sven-Coop 5.0-, see Ham_SC_AddPointsToTeam instead. * Forward params: function(this, points, bool:cangonegative); * Return type: None. * Execute params: ExecuteHam(Ham_AddPointsToTeam, this, points, bool:cangonegative); @@ -233,7 +239,8 @@ enum Ham /** * Description: Removes an item to the player's inventory. - * Forward params: function(this, idother); + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_RemovePlayerItem instead. * Return type: Integer. * Execute params: ExecuteHam(Ham_RemovePlayerItem, this, idother); */ @@ -261,6 +268,8 @@ enum Ham /** * Description: Whether or not the entity is moving. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_IsMoving instead. * Forward params: function(this); * Return type: Integer. * Execute params: ExecuteHam(Ham_IsMoving, this); @@ -309,6 +318,8 @@ enum Ham /** * Description: Not entirely sure. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_OnControls instead. * Forward params: function(this, idOn) * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_OnControls, this, idOn); @@ -317,6 +328,8 @@ enum Ham /** * Description: Whether or not the entity is sneaking. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_IsSneaking instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_IsSneaking, this); @@ -325,6 +338,8 @@ enum Ham /** * Description: Whether or not the entity is alive. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_IsAlive instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_IsAlive, this); @@ -333,6 +348,8 @@ enum Ham /** * Description: Whether or not the entity uses a BSP model. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_IsBSPModel instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_IsBSPModel, this); @@ -341,6 +358,8 @@ enum Ham /** * Description: Whether or not the entity can reflect gauss shots.. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_ReflectGauss instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_ReflectGauss, this); @@ -352,7 +371,8 @@ enum Ham * Note the strindex parameter is a string passed that has been allocated by the engine. * Use fakemeta's EngFunc_SzFromIndex to convert to a normal string, or fakemeta's * EngFunc_AllocString to create a new string. - * Forward params: function(this, strindex). + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_HasTarget instead. * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_HasTarget, this, strindex); */ @@ -360,6 +380,8 @@ enum Ham /** * Description: Whether or not the entity is in the world. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_IsInWorld instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_IsInWorld, this); @@ -368,6 +390,8 @@ enum Ham /** * Description: Whether or not the entity is a player. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_IsPlayer instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_IsPlayer, this); @@ -376,6 +400,8 @@ enum Ham /** * Description: Whether or not the entity is a net client. + * This function is not supported for the following mods: + * Sven-Coop 5.0+, see Ham_SC_IsNetClient instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_IsNetClient, this); @@ -449,6 +475,8 @@ enum Ham /** * Description: Normally called whenever a barnacle grabs the entity. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_FBecomeProne instead. * Forward params: function(this); * Return type: Integer. * Execute params: ExecuteHam(Ham_FBecomeProne, this); @@ -497,6 +525,8 @@ enum Ham /** * Description: Returns true if a line can be traced from the caller's eyes to the target. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_FVisible instead. * Forward params: function(this, idOther); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_FVisible, this, idOther); @@ -505,6 +535,8 @@ enum Ham /** * Description: Returns true if a line can be traced from the caller's eyes to given vector. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_FVecVisible instead. * Forward params: function(this, const Float:origin[3]); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_FVecVisible, this, const Float:origin[3]); @@ -590,6 +622,8 @@ enum Ham /** * Description: Adds the item to the player. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Item_AddToPlayer instead. * Forward params: function(this, idPlayer); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Item_AddToPlayer, this, idPlayer); @@ -598,6 +632,8 @@ enum Ham /** * Description: Unsure. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Item_AddDuplicate instead. * Forward params: function(this, idOriginal); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Item_AddDuplicate, this, idOriginal); @@ -606,6 +642,8 @@ enum Ham /** * Description: Whether or not this entity can be deployed. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Item_CanDeploy instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Item_CanDeploy, this); @@ -614,6 +652,8 @@ enum Ham /** * Description: Deploys the entity (usually a weapon). + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Item_Deploy instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Item_Deploy, this); @@ -622,6 +662,8 @@ enum Ham /** * Description: Whether or not the entity can be holstered. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Item_CanHolster instead. * Forward params: function(this); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Item_CanHolster, this); @@ -702,6 +744,8 @@ enum Ham /** * Description: Updates item data for the client. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Item_UpdateClientData instead. * Forward params: function(this, idPlayer) * Return type: Integer. * Execute params: ExecuteHam(Ham_Item_UpdateClientData, this, idPlayer); @@ -750,6 +794,8 @@ enum Ham /** * Description: Unsure. * This function is not supported in Earth's Special Forces mod. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Weapon_AddWeapon instead. * Forward params: function(this) * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Weapon_AddWeapon, this); @@ -758,6 +804,8 @@ enum Ham /** * Description: Plays the weapon's empty sound. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Weapon_PlayEmptySound instead. * Forward params: function(this) * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Weapon_PlayEmptySound, this); @@ -787,6 +835,8 @@ enum Ham /** * Description: Whether or not the weapon is usable (has ammo, etc.) * This function is not supported in Earth's Special Forces mod. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Weapon_IsUsable instead. * Forward params: function(this) * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Weapon_IsUsable, this) @@ -836,6 +886,8 @@ enum Ham /** * Description: Whether or not the weapon should idle. + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Weapon_ShouldWeaponIdle instead. * Forward params: function(this) * Return type: Integer (boolean). * Execute Params: ExecuteHam(Ham_Weapon_ShouldWeaponIdle, this) @@ -845,7 +897,8 @@ enum Ham /** * Description: Unsure. * This function is not supported by Team Fortress Classic. - * Forward params: function(this) + * This function has different version for the following mods: + * Sven-Coop 5.0+, see Ham_SC_Weapon_UseDecrement instead. * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_Weapon_UseDecrement, this); */ @@ -1446,6 +1499,8 @@ enum Ham * trying to possess it. If DisregardState is set, the monster will be sucked into the script * no matter what state it is in. ONLY Scripted AI ents should allow this. * This function is not supported by Counter-Strike, The Specialists and Natural Selection mods. + * This function has different versions for the following mod: + * Sven Coop: see Ham_SC_CanPlaySequence * Forward params: function(this, bool:disregardState, interruptLevel); * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_CanPlaySequence, this, bool:disregardState, interruptLevel); @@ -1455,11 +1510,13 @@ enum Ham /** * Description: - * This function is not supported by Counter-Strike, The Specialists and Natural Selection mods. + * This function has different versions for the following mod: + * Sven Coop: see Ham_SC_CanPlaySentence2 * Forward params: function(this, bool:disregardState); * Return type: Integer (boolean). - * Execute params: ExecuteHam(Ham_CanPlaySentence, this, bool:disregardState); + * Execute params: ExecuteHam(Ham_CanPlaySentence2, this, bool:disregardState); */ - Ham_CanPlaySentence, + Ham_CanPlaySentence2, /** * Description: - @@ -1473,6 +1530,7 @@ enum Ham /** * Description: - * This function is not supported by Counter-Strike, The Specialists and Natural Selection mods. + * This function has different version for Sven Coop, see Ham_SC_PlayScriptedSentence instead. * Forward params: function(this, const sentence[], Float:duration, Float:volume, Float:attenuation, bool:concurrent, idListener); * Return type: None. * Execute params: ExecuteHam(Ham_PlayScriptedSentence, this, const sentence[], Float:duration, Float:volume, Float:attenuation, bool:concurrent, idListener); @@ -2891,7 +2949,8 @@ enum Ham Ham_SC_IsMonster, /** - * Description: Whether entity uses PhysX feature. + * Description: (!) This function is no more available in the mod. + * Whether entity uses PhysX feature. * Forward params: function(this) * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_SC_IsPhysX, this) @@ -2992,7 +3051,8 @@ enum Ham Ham_SC_OnDestroy, /** - * Description: Returns false if the entity is somehow invalid. + * Description: (!) This function is no more available in the mod. + * Returns false if the entity is somehow invalid. * Forward params: function(this) * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_SC_IsValidEntity, this) @@ -3016,7 +3076,8 @@ enum Ham Ham_SC_SetupFriendly, /** - * Description: Tries to revive a monster. + * Description: (!) This function is no more available in the mod. + * Tries to revive a monster. * Forward params: function(this) * Return type: None. * Execute params: ExecuteHam(Ham_SC_ReviveThink, this) @@ -3224,17 +3285,17 @@ enum Ham /** * Description: - - * Forward params: function(this, idleader) + * Forward params: function(this, idleader, bool:noSound) * Return type: None. - * Execute params: ExecuteHam(Ham_SC_StartPlayerFollowing, this, idleader) + * Execute params: ExecuteHam(Ham_SC_StartPlayerFollowing, this, idleader, bool:noSound) */ Ham_SC_StartPlayerFollowing, /** * Description: - - * Forward params: function(this, bool:clearSchedule) + * Forward params: function(this, bool:clearSchedule, bool:noSound) * Return type: None. - * Execute params: ExecuteHam(Ham_SC_StopPlayerFollowing, this, bool:clearSchedule) + * Execute params: ExecuteHam(Ham_SC_StopPlayerFollowing, this, bool:clearSchedule, bool:noSound) */ Ham_SC_StopPlayerFollowing, @@ -3303,7 +3364,7 @@ enum Ham Ham_SC_CheckRevival, /** - * Description: - + * Description: (!) This function is no more available in the mod. * Forward params: function(this) * Return type: None. * Execute params: ExecuteHam(Ham_SC_MedicCallSound, this) @@ -3312,10 +3373,10 @@ enum Ham /** - * Description: - + * Description: (!) This function is no more available in the mod. * Forward params: function(this) * Return type: None. - * Execute params: ExecuteHam(Ham_SC_MedicCallSound, this) + * Execute params: ExecuteHam(Ham_SC_Player_MenuInputPerformed, this) */ Ham_SC_Player_MenuInputPerformed, @@ -3440,7 +3501,7 @@ enum Ham Ham_SC_Player_LogPlayerStats, /** - * Description: - + * Description: (!) This function is no more available in the mod. * Forward params: function(this, idPlayer, Float:time) * Return type: None. * Execute params: ExecuteHam(Ham_SC_Player_DisableCollision, this, idPlayer, Float:time) @@ -3448,7 +3509,7 @@ enum Ham Ham_SC_Player_DisableCollisionWithPlayer, /** - * Description: - + * Description: (!) This function is no more available in the mod. * Forward params: function(this, idPlayer, bool:testIntersection) * Return type: None. * Execute params: ExecuteHam(Ham_SC_Player_EnableCollision, this, idPlayer, bool:testIntersection) @@ -3456,7 +3517,7 @@ enum Ham Ham_SC_Player_EnableCollisionWithPlayer, /** - * Description: - + * Description: (!) This function is no more available in the mod. * Forward params: function(this, idPlayer) * Return type: Integer (boolean). * Execute params: ExecuteHam(Ham_SC_Player_CanTouchPlayer, this, idPlayer) @@ -3726,6 +3787,533 @@ enum Ham Ham_Item_GetItemInfo, + /** + * LATE ADDITIONS (2017) + */ + + /** + * Description: Performs checks that must occur before Spawn itself is called. Always call baseclass version first. + * Forward params: function(this); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_PreSpawn, this); + */ + Ham_SC_PreSpawn, + + /** + * Description: Performs checks that must occur after Spawn itself is called. Always call baseclass version first. + * Forward params: function(this); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_PostSpawn, this); + */ + Ham_SC_PostSpawn, + + /** + * Description: - + * Forward params: function(this, key); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_PostSpawn, this, const key[]); + */ + Ham_SC_OnKeyValueUpdate, + + /** + * Description: - + * Forward params: function(this, classification); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_SetClassification, this, classification); + */ + Ham_SC_SetClassification, + + /** + * Description: Returns whether an entity is activated. + * This function is not supported by Day Of Defeat. + * This function has different version for Team Fortress Classic, see Ham_TFC_IsTriggered instead. + * Forward params: function(this, idActivator); + * Return type: Integer. + * Execute params: ExecuteHam(Ham_SC_IsTriggered, this, idActivator); + */ + Ham_SC_IsTriggered, + + /** + * Description: Returns the id of the entity if its class is derived off of ICustomEntity, -1 otherwise. + * Forward params: function(this) + * Return type: Entity. + * Execute params: ExecuteHam(Ham_SC_MyCustomPointer, this); + */ + Ham_SC_MyCustomPointer, + + /** + * Description: Returns the id of the entity if its class is derived off of CBasePlayerItem, -1 otherwise. + * Forward params: function(this) + * Return type: Entity. + * Execute params: ExecuteHam(Ham_SC_MyItemPointer, this); + */ + Ham_SC_MyItemPointer, + + /** + * Description: Typically adds points to the entity. + * Forward params: function(this, points, bool:cangonegative); + * Return type: None. + * Execute params: ExecuteHam(Ham_AddPoints, this, points, bool:cangonegative); + */ + Ham_SC_AddPoints, + + /** + * Description: Typically adds points to everybody on the entity's team. + * Forward params: function(this, points, bool:cangonegative); + * Return type: None. + * Execute params: ExecuteHam(Ham_AddPointsToTeam, this, points, bool:cangonegative); + */ + Ham_SC_AddPointsToTeam, + + /** + * Description: Removes an item to the player's inventory. + * Forward params: function(this, idother); + * Return type: Integer. + * Execute params: ExecuteHam(Ham_SC_RemovePlayerItem, this, idother); + */ + Ham_SC_RemovePlayerItem, + + /** + * Description: Not entirely sure. + * Forward params: function(this, idOn) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_OnControls, this, idOn); + */ + Ham_SC_OnControls, + + /** + * Description: Whether or not the entity is sneaking. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsSneaking, this); + */ + Ham_SC_IsSneaking, + + /** + * Description: Whether or not the entity is alive. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsAlive, this); + */ + Ham_SC_IsAlive, + + /** + * Description: Whether or not the entity uses a BSP model. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsBSPModel, this); + */ + Ham_SC_IsBSPModel, + + /** + * Description: Whether or not the entity can reflect gauss shots. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_ReflectGauss, this); + */ + Ham_SC_ReflectGauss, + + /** + * Description: Whether or not the target is the same as the one passed. + * Note the strindex parameter is a string passed that has been allocated by the engine. + * Use fakemeta's EngFunc_SzFromIndex to convert to a normal string, or fakemeta's + * EngFunc_AllocString to create a new string. + * Forward params: function(this, strindex). + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_HasTarget, this, strindex); + */ + Ham_SC_HasTarget, + + /** + * Description: Whether or not the entity is in the world. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsInWorld, this); + */ + Ham_SC_IsInWorld, + + /** + * Description: Whether or not the entity is a player. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_Sc_IsPlayer, this); + */ + Ham_Sc_IsPlayer, + + /** + * Description: Whether or not the entity is a net client. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsNetClient, this); + */ + Ham_SC_IsNetClient, + + /** + * Description: Whether or not the entity is a brush entity breakable. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsBreakable, this); + */ + Ham_SC_IsBreakable, + + /** + * Description: - + * Forward params: function(this, idActivator, useType, value); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_SUB_UseTargets, this, idActivator, useType, value); + */ + Ham_SC_SUB_UseTargets, + + /** + * Description: - + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsLockedByMaster, this); + */ + Ham_SC_IsLockedByMaster, + + /** + * Description: Normally called whenever a barnacle grabs the entity. + * Forward params: function(this, idOther); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_FBecomeProne, this, idOther); + */ + Ham_SC_FBecomeProne, + + /** + * Description: Returns true if a line can be traced from the caller's eyes to given vector. + * Forward params: function(this, const Float:origin[3]); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_FVecVisible, this, const Float:origin[3]); + */ + Ham_SC_FVecVisible, + + /** + * Description: Sets the player ally state + * Forward params: function(this, bool:state); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_SetPlayerAlly, this, bool:state); + */ + Ham_SC_SetPlayerAlly, + + /** + * Description: Callback after trigger_setorigin has moved the entity. + * Forward params: function(this); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_OnSetOriginByMap, this); + */ + Ham_SC_OnSetOriginByMap, + + /** + * Description: Return true if you want to be revivable. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_IsRevivable, this); + */ + Ham_SC_IsRevivable, + + /** + * Description: - + * timeUntilRevive is the time until the actual revive event occurs. + * Forward params: function(this, Float:timeUntilRevive); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_BeginRevive, Float:timeUntilRevive); + */ + Ham_SC_BeginRevive, + + /** + * Description: - + * timeUntilRevive is the time before the monster is supposed to be revived + * Forward params: function(this, Float:timeUntilRevive); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_EndRevive, Float:timeUntilRevive); + */ + Ham_SC_EndRevive, + + /** + * Description: Determines whether or not the monster can play the scripted sequence or AI sequence that is + * trying to possess it. If DisregardState is set, the monster will be sucked into the script + * no matter what state it is in. ONLY Scripted AI ents should allow this. + * Forward params: function(this, bool:disregardState, interruptLevel); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_CanPlaySequence, this, bool:disregardState, interruptLevel); + */ + Ham_SC_CanPlaySequence, + + /** + * Description: - + * Forward params: function(this, bool:disregardState); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_CanPlaySentence2, this, bool:disregardState); + */ + Ham_SC_CanPlaySentence2, + + /** + * Description: - + * Forward params: function(this, const sentence[], Float:duration, Float:volume, Float:attenuation, bool:concurrent, idListener); + * Return type: None. + * Execute params: ExecuteHam(Ham_PlayScriptedSentence, this, const sentence[], Float:duration, Float:volume, Float:attenuation, bool:concurrent, idListener); + */ + Ham_SC_PlayScriptedSentence, + + + /** + * Items have all the attributes of normal entities in addition to these. + */ + + /** + * Description: Adds the item to the player. + * Forward params: function(this, idPlayer); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_Item_AddToPlayer, this, idPlayer); + */ + Ham_SC_Item_AddToPlayer, + + /** + * Description: Returns true if you want your duplicate removed from world. + * Forward params: function(this, idOriginal); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Item_AddDuplicate, this, idOriginal); + */ + Ham_SC_Item_AddDuplicate, + + /** + * Description: - + * Forward params: function(this, idOther); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Item_AddAmmoFromItem, this, idOther); + */ + Ham_SC_Item_AddAmmoFromItem, + + /** + * Description: - + * Forward params: function(this) + * Return type: String (string length returned and string byref'd in ExecuteHam). + * Execute params: ExecuteHam(Ham_SC_Item_GetPickupSound, this) + */ + Ham_SC_Item_GetPickupSound, + + /** + * Description: - + * Collect Types: + * COLLECT_TOUCH 0 + * COLLECT_USE_DIRECT 1 + * COLLECT_USE_INDIRECT 2 + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Item_CanCollect, this, idOther, collectType); + */ + Ham_SC_Item_CanCollect, + + /** + * Description: - + * Forward params: function(this, idOther, collectType); + * Collect Types: + * COLLECT_TOUCH 0 + * COLLECT_USE_DIRECT 1 + * COLLECT_USE_INDIRECT 2 + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_Item_Collect, this, idOther, collectType); + */ + Ham_SC_Item_Collect, + + /** + * Description: Gets item infos. + * Forward params: function(this, iteminfo_handle); + * Return type: Integer. + * Execute params: ExecuteHam(Ham_SC_Item_GetItemInfo, this, iteminfo_handle); + * Use CreateHamItemInfo() to pass a new ItemInfo handle. + */ + Ham_SC_Item_GetItemInfo, + + /** + * Description: Whether or not this entity can be deployed. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Item_CanDeploy, this); + */ + Ham_SC_Item_CanDeploy, + + /** + * Description: Deploys the entity (usually a weapon). + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Item_Deploy, this); + */ + Ham_SC_Item_Deploy, + + /** + * Description: Whether or not the entity can be holstered. + * Forward params: function(this); + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Item_CanHolster, this); + */ + Ham_SC_Item_CanHolster, + + /** + * Description: Called each frame by the player PreThink if inactive. + * Forward params: function(this); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_Item_InactiveItemPreFrame, this); + */ + Ham_SC_Item_InactiveItemPreFrame, + + /** + * Description: Called each frame by the player PostThink if inactive. + * Forward params: function(this); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_Item_InactiveItemPostFrame, this); + */ + Ham_SC_Item_InactiveItemPostFrame, + + /** + * Description: - + * Forward params: function(this); + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_Item_DetachFromPlayer, this); + */ + Ham_SC_Item_DetachFromPlayer, + + /** + * Description: Updates item data for the client. + * Forward params: function(this, idPlayer) + * Return type: Integer. + * Execute params: ExecuteHam(Ham_SC_Item_UpdateClientData, this, idPlayer); + */ + Ham_SC_Item_UpdateClientData, + + /** + * Description: - + * Forward params: function(this) + * Return type: Float. + * Execute params: ExecuteHam(Ham_SC_Item_GetRespawnTime, this); + */ + Ham_SC_Item_GetRespawnTime, + + /** + * Description: - + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Item_CanHaveDuplicates, this); + */ + Ham_SC_Item_CanHaveDuplicates, + + + /** + * Weapons have all the attributes to Ham_Item_*, in addition to these. + */ + + /** + * Description: - + * Forward params: function(this, idOriginal) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Weapon_ExtractAmmoFromItem, idOriginal); + */ + Ham_SC_Weapon_ExtractAmmoFromItem, + + /** + * Description: Unsure. + * This function is not supported in Earth's Special Forces mod. + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Weapon_AddWeapon, this); + */ + Ham_SC_Weapon_AddWeapon, + + /** + * Description: - + * Forward params: function(this) + * Return type: Integer. + * Execute params: ExecuteHam(Ham_SC_Weapon_GetAmmo1Drop); + */ + Ham_SC_Weapon_GetAmmo1Drop, + + /** + * Description: - + * Forward params: function(this) + * Return type: Integer. + * Execute params: ExecuteHam(Ham_SC_Weapon_GetAmmo2Drop, idOriginal); + */ + Ham_SC_Weapon_GetAmmo2Drop, + + /** + * Description: Plays the weapon's empty sound. + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Weapon_PlayEmptySound, this); + */ + Ham_SC_Weapon_PlayEmptySound, + + /** + * Description: Whether or not the weapon is usable (has ammo, etc.) + * This function is not supported in Earth's Special Forces mod. + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Weapon_IsUsable, this) + */ + Ham_SC_Weapon_IsUsable, + + /** + * Description: - + * Forward params: function(this) + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_Weapon_FinishReload, idOriginal); + */ + Ham_SC_Weapon_FinishReload, + + /** + * Description: - + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Weapon_ShouldReload, idOriginal); + */ + Ham_SC_Weapon_ShouldReload, + + /** + * Description: Whether or not the weapon should idle. + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute Params: ExecuteHam(Ham_SC_Weapon_ShouldWeaponIdle, this) + */ + Ham_SC_Weapon_ShouldWeaponIdle, + + /** + * Description: Unsure. + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Weapon_UseDecrement, this); + */ + Ham_SC_Weapon_UseDecrement, + + + /** + * Players have all the attributes of normal entities, in addition to these. + */ + + /** + * Description: - + * Forward params: function(this) + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_Player_EnteredObserver, this); + */ + Ham_SC_Player_EnteredObserver, + + /** + * Description: - + * Forward params: function(this) + * Return type: None. + * Execute params: ExecuteHam(Ham_SC_Player_LeftObserver, this); + */ + Ham_SC_Player_LeftObserver, + + /** + * Description: - + * Forward params: function(this) + * Return type: Integer (boolean). + * Execute params: ExecuteHam(Ham_SC_Player_IsObserver, this); + */ + Ham_SC_Player_IsObserver, + + /** * DONT USE ME LOL */ @@ -3741,6 +4329,7 @@ enum HamError HAM_INVALID_FUNC, // The function is not valid HAM_FUNC_NOT_CONFIGURED, // This function is not configured in hamdata.ini + HAM_FUNC_NOT_AVAILABLE, // This function is not more available in the mod HAM_ERR_END }; From 9a95fd988632f004af801772712a660f5a929fcf Mon Sep 17 00:00:00 2001 From: HamletEagle <cs16_artick@yahoo.com> Date: Fri, 7 Sep 2018 00:01:47 -0700 Subject: [PATCH 56/98] Add cs_get_weaponbox_item native (#548) * Add cs_get_wpnbox_weapon native * Rename native + fix strcmp check --- modules/cstrike/cstrike/CstrikeNatives.cpp | 29 ++++++++++++++++++++++ plugins/include/cstrike.inc | 11 ++++++++ 2 files changed, 40 insertions(+) diff --git a/modules/cstrike/cstrike/CstrikeNatives.cpp b/modules/cstrike/cstrike/CstrikeNatives.cpp index fb973847..4931993e 100644 --- a/modules/cstrike/cstrike/CstrikeNatives.cpp +++ b/modules/cstrike/cstrike/CstrikeNatives.cpp @@ -1998,6 +1998,34 @@ static cell AMX_NATIVE_CALL cs_get_user_weapon(AMX *amx, cell *params) return 0; } +// native cs_get_weaponbox_item(weaponboxIndex); +static cell AMX_NATIVE_CALL cs_get_weaponbox_item(AMX *amx, cell *params) +{ + GET_OFFSET("CWeaponBox", m_rgpPlayerItems); + + int weaponboxIndex = params[1]; + CHECK_NONPLAYER(weaponboxIndex); + edict_t *pWeaponBox = TypeConversion.id_to_edict(weaponboxIndex); + + if (strcmp(STRING(pWeaponBox->v.classname), "weaponbox") != 0) + { + MF_LogError(amx, AMX_ERR_NATIVE, "Not a weaponbox entity! (%d)", weaponboxIndex); + return 0; + } + + edict_t *pWeapon; + for (int i = 1; i < MAX_ITEM_TYPES; i++) + { + pWeapon = TypeConversion.cbase_to_edict(get_pdata<void *>(pWeaponBox, m_rgpPlayerItems, i)); + if (!FNullEnt(pWeapon)) + { + return TypeConversion.edict_to_id(pWeapon); + } + } + + return 0; +} + AMX_NATIVE_INFO CstrikeNatives[] = { {"cs_set_user_money", cs_set_user_money}, @@ -2070,5 +2098,6 @@ AMX_NATIVE_INFO CstrikeNatives[] = {"cs_get_weapon_info", cs_get_weapon_info}, {"cs_get_user_weapon_entity", cs_get_user_weapon_entity}, {"cs_get_user_weapon", cs_get_user_weapon}, + {"cs_get_weaponbox_item", cs_get_weaponbox_item}, {nullptr, nullptr} }; diff --git a/plugins/include/cstrike.inc b/plugins/include/cstrike.inc index 1587ebb7..bb366f4c 100755 --- a/plugins/include/cstrike.inc +++ b/plugins/include/cstrike.inc @@ -739,6 +739,17 @@ native cs_get_armoury_type(index, &count = 1); */ native cs_set_armoury_type(index, type, count = -1); +/** + * Returns the weapon entity index that was packed into a weaponbox. + * + * @param weaponboxIndex Weaponbox entity index + * + * @return Weapon entity index on success or 0 if no weapon can be found + * @error If a non-weaponbox entity is provided or the entity is invalid, an error will be + * thrown. + */ +native cs_get_weaponbox_item(weaponboxIndex); + /** * Returns the map zones the client is inside of as a bitflag value. * From b4927bfb1f409f52467c40742503b58ba97e8562 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 8 Sep 2018 09:41:29 +0200 Subject: [PATCH 57/98] Revert 1e3832a942ade577d39463979441651b13a5eee4 (#554) --- modules/fun/fun.cpp | 8 ++++---- modules/fun/moduleconfig.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/fun/fun.cpp b/modules/fun/fun.cpp index 33a1e377..53be8696 100644 --- a/modules/fun/fun.cpp +++ b/modules/fun/fun.cpp @@ -315,8 +315,6 @@ static cell AMX_NATIVE_CALL set_user_hitzones(AMX *amx, cell *params) Players.SetBodyHits(attacker, target, hitzones); } - g_pengfuncsTable_Post->pfnTraceLine = Players.HaveBodyHits() ? TraceLine_Post : nullptr; - return 1; } @@ -484,8 +482,10 @@ int ClientConnect(edict_t *pPlayer, const char *pszName, const char *pszAddress, RETURN_META_VALUE(MRES_IGNORED, 0); } -void TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t *shooter, TraceResult *ptr) +void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *shooter, TraceResult *ptr) { + TRACE_LINE(v1, v2, fNoMonsters, shooter, ptr); + if (ptr->pHit && (ptr->pHit->v.flags & (FL_CLIENT | FL_FAKECLIENT)) && shooter && (shooter->v.flags & (FL_CLIENT | FL_FAKECLIENT)) ) { @@ -499,7 +499,7 @@ void TraceLine_Post(const float *v1, const float *v2, int fNoMonsters, edict_t * } } - RETURN_META(MRES_IGNORED); + RETURN_META(MRES_SUPERCEDE); } diff --git a/modules/fun/moduleconfig.h b/modules/fun/moduleconfig.h index 292fb31d..75216a8e 100644 --- a/modules/fun/moduleconfig.h +++ b/modules/fun/moduleconfig.h @@ -232,7 +232,7 @@ // #define FN_SetOrigin SetOrigin // #define FN_EmitSound EmitSound // #define FN_EmitAmbientSound EmitAmbientSound -// #define FN_TraceLine TraceLine +#define FN_TraceLine TraceLine // #define FN_TraceToss TraceToss // #define FN_TraceMonsterHull TraceMonsterHull // #define FN_TraceHull TraceHull From 579a83c2a484579db4198702b30f5a6bfbedd28a Mon Sep 17 00:00:00 2001 From: HamletEagle <cs16_artick@yahoo.com> Date: Sat, 8 Sep 2018 00:42:17 -0700 Subject: [PATCH 58/98] Fix vault.inc documentation (#550) * Fix vault.inc documentation * Add missing * * Fix typos --- plugins/include/vault.inc | 41 +++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/plugins/include/vault.inc b/plugins/include/vault.inc index b38ac4c6..9982dfb6 100755 --- a/plugins/include/vault.inc +++ b/plugins/include/vault.inc @@ -16,16 +16,45 @@ #endif #define _vault_included -/* Reads a data from given key. -* If len is set to zero then get_vaultdata -* returns value as an number. */ + /** + * Reads data from a given key. + * + * + * @param key Key to get the value from + * @param data Buffer to copy the value to + * @param len Buffer size. If len is set to 0 then the function will + * return the value as a number + * + * @return If len is not 0 the function will return the number of characters written. + If len is 0 the function will return the numerical value associated with the key. + */ native get_vaultdata(const key[], data[] = "", len = 0); -/* Sets a data under given key. */ + +/** + * Sets data for a given key. + * + * @param key Key to set the value for + * @param data Data to set for the given key + * + * @noreturn + */ native set_vaultdata(const key[], const data[] = ""); -/* Removes a key from vault.*/ +/** + * Removes a key and its data from the vault. + * + * @param key Key to remove + * + * @noreturn + */ native remove_vaultdata(const key[]); -/* Checks if a key exists in the vault.*/ +/** + * Checks if a key exists in the vault. + * + * @param key Key to check + * + * @return 1 if an entry was found, 0 otherwise. + */ native vaultdata_exists(const key[]); From 9a2c586720cfdaa429afcb6de9c99ef0a156a723 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 8 Sep 2018 20:21:53 +0200 Subject: [PATCH 59/98] Attempt to fix windows compilation (#555) * Attempt to fix windows compilation * Testing mysql-c-connector --- appveyor.yml | 9 ++-- modules/mysqlx/msvc15hack.c | 83 ++++++++++++++++++++++++++++++++++--- 2 files changed, 83 insertions(+), 9 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index ab621320..087c775f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -12,10 +12,11 @@ install: - git clone https://github.com/alliedmodders/ambuild - git clone https://github.com/alliedmodders/metamod-hl1 - git clone https://github.com/alliedmodders/hlsdk -- ps: Start-FileDownload 'https://cdn.mysql.com/archives/mysql-5.5/mysql-5.5.54-win32.zip' -- 7z x mysql-5.5.54-win32.zip -o"mysql" +- ps: Start-FileDownload 'https://downloads.mysql.com/archives/get/file/mysql-connector-c-6.1.1-win32.zip' +- 7z x mysql-connector-c-6.1.1-win32.zip -o"mysql" - cd mysql -- ren mysql-5.5.54-win32 mysql-5.5 +- dir +- ren mysql-connector-c-6.1.1-win32 mysql-5.5 - move /Y mysql-5.5 ..\ - cd ..\ambuild - c:\python27\python setup.py install @@ -24,7 +25,7 @@ cache: - c:\projects\*.zip -> appveyor.yml - c:\projects\mysql-5.5 -> appveyor.yml build_script: -- '"%VS120COMNTOOLS%\vsvars32.bat"' +- '"%VS140COMNTOOLS%\vsvars32.bat"' - mkdir build - cd build - c:\python27\python ../configure.py --enable-optimize --nasm="C:\nasm\nasm-2.13.03\nasm.exe" diff --git a/modules/mysqlx/msvc15hack.c b/modules/mysqlx/msvc15hack.c index 06abdfea..ea155503 100644 --- a/modules/mysqlx/msvc15hack.c +++ b/modules/mysqlx/msvc15hack.c @@ -1,13 +1,86 @@ + +#define WIN32_LEAN_AND_MEAN +#include <Windows.h> +#include <stdlib.h> + +// Fix from from https://stackoverflow.com/a/34655235. +// +// __iob_func required by the MySQL we use, +// but no longer exists in the VS 14.0+ crt. + +#pragma comment(lib, "DbgHelp.lib") +#pragma warning(disable:4091) // 'typedef ': ignored on left of '' when no variable is declared +#include <DbgHelp.h> +#include <corecrt_wstdio.h> + +#define GET_CURRENT_CONTEXT(c, contextFlags) \ + do { \ + c.ContextFlags = contextFlags; \ + __asm call x \ + __asm x: pop eax \ + __asm mov c.Eip, eax \ + __asm mov c.Ebp, ebp \ + __asm mov c.Esp, esp \ + } while(0); + + +FILE * __cdecl __iob_func(void) +{ + CONTEXT c = { 0 }; + STACKFRAME64 s = { 0 }; + DWORD imageType; + HANDLE hThread = GetCurrentThread(); + HANDLE hProcess = GetCurrentProcess(); + + GET_CURRENT_CONTEXT(c, CONTEXT_FULL); + + imageType = IMAGE_FILE_MACHINE_I386; + s.AddrPC.Offset = c.Eip; + s.AddrPC.Mode = AddrModeFlat; + s.AddrFrame.Offset = c.Ebp; + s.AddrFrame.Mode = AddrModeFlat; + s.AddrStack.Offset = c.Esp; + s.AddrStack.Mode = AddrModeFlat; + + if (!StackWalk64(imageType, hProcess, hThread, &s, &c, NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL)) + { + return NULL; + } + + if (s.AddrReturn.Offset == 0) + { + return NULL; + } + + { + unsigned char const * assembly = (unsigned char const *)(s.AddrReturn.Offset); + + if (*assembly == 0x83 && *(assembly + 1) == 0xC0 && (*(assembly + 2) == 0x20 || *(assembly + 2) == 0x40)) + { + if (*(assembly + 2) == 32) + { + return (FILE*)((unsigned char *)stdout - 32); + } + if (*(assembly + 2) == 64) + { + return (FILE*)((unsigned char *)stderr - 64); + } + + } + else + { + return stdin; + } + } + + return NULL; +} + // Adapted from dosmap.c in Visual Studio 12.0 CRT sources. // // The _dosmaperr function is required by the MySQL lib we use, // but no longer exists in the VS 14.0+ crt. -#define WIN32_LEAN_AND_MEAN -#include <windows.h> - -#include <stdlib.h> - static struct errentry { DWORD oscode; // OS return value From d2d121619f76f32cf23e4de2f122f5af64ae13e4 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 8 Sep 2018 21:12:57 +0200 Subject: [PATCH 60/98] Another attempt to fix windows compilation (#556) --- AMBuildScript | 3 +++ modules/mysqlx/AMBuilder | 5 ++--- modules/regex/AMBuilder | 4 ++++ {modules/mysqlx => public/msvc}/msvc15hack.c | 0 4 files changed, 9 insertions(+), 3 deletions(-) rename {modules/mysqlx => public/msvc}/msvc15hack.c (100%) diff --git a/AMBuildScript b/AMBuildScript index 12f361ed..df3a2ab6 100644 --- a/AMBuildScript +++ b/AMBuildScript @@ -291,6 +291,9 @@ class AMXXConfig(object): 'odbccp32.lib', ] + if cxx.version >= 1900: + cxx.linkflags += ['legacy_stdio_definitions.lib', 'legacy_stdio_wide_specifiers.lib'] + if builder.options.opt == '1': cxx.cflags += ['/Ox'] cxx.linkflags += ['/OPT:ICF', '/OPT:REF'] diff --git a/modules/mysqlx/AMBuilder b/modules/mysqlx/AMBuilder index cf1e69e7..7c7bcc93 100644 --- a/modules/mysqlx/AMBuilder +++ b/modules/mysqlx/AMBuilder @@ -36,9 +36,8 @@ if AMXX.mysql_path: '/SECTION:.data,RW' ] if binary.compiler.vendor == 'msvc' and binary.compiler.version >= 1900: - binary.compiler.linkflags += ['legacy_stdio_definitions.lib', 'legacy_stdio_wide_specifiers.lib'] - binary.sources += [ - 'msvc15hack.c' + binary.sources += [ + '../../public/msvc/msvc15hack.c' ] binary.compiler.linkflags += [AMXX.zlib.binary] diff --git a/modules/regex/AMBuilder b/modules/regex/AMBuilder index 6faa6e92..16edb2d2 100644 --- a/modules/regex/AMBuilder +++ b/modules/regex/AMBuilder @@ -24,5 +24,9 @@ binary.sources = [ if builder.target_platform == 'windows': binary.sources += ['version.rc'] + if binary.compiler.vendor == 'msvc' and binary.compiler.version >= 1900: + binary.sources += [ + '../../public/msvc/msvc15hack.c' + ] AMXX.modules += [builder.Add(binary)] diff --git a/modules/mysqlx/msvc15hack.c b/public/msvc/msvc15hack.c similarity index 100% rename from modules/mysqlx/msvc15hack.c rename to public/msvc/msvc15hack.c From 8a720a7d6af4d8e2982ae36095a06bbe06d82b71 Mon Sep 17 00:00:00 2001 From: Nicholas Hastings <nshastings@gmail.com> Date: Sun, 9 Sep 2018 07:40:58 -0400 Subject: [PATCH 61/98] Another stab at Windows build fix. --- pushbuild.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pushbuild.txt b/pushbuild.txt index 06eb8a33..06f1772f 100644 --- a/pushbuild.txt +++ b/pushbuild.txt @@ -17,4 +17,4 @@ Buildbot shall pay the iron price. Bow to your sensei. I shall not bow anymore. Run for your life. Throw a blanket over it. -egg +egg From c9e9ef905ed75d002a0af68bddec0be5af7c7ba9 Mon Sep 17 00:00:00 2001 From: Arkshine <github@arkshine.me> Date: Tue, 11 Sep 2018 00:46:07 +0200 Subject: [PATCH 62/98] Promote git revision number to 4th version string component --- product.version | 2 +- support/generate_headers.py | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/product.version b/product.version index b57588e5..f8e233b2 100644 --- a/product.version +++ b/product.version @@ -1 +1 @@ -1.9.0-dev +1.9.0 diff --git a/support/generate_headers.py b/support/generate_headers.py index b61f8c61..8df9b8bb 100644 --- a/support/generate_headers.py +++ b/support/generate_headers.py @@ -55,12 +55,10 @@ def output_version_headers(): if m == None: raise Exception('Could not detremine product version') major, minor, release, tag = m.groups() - product = "{0}.{1}.{2}".format(major, minor, release) + product = "{0}.{1}.{2}.{3}".format(major, minor, release, count) fullstring = product if tag != "": fullstring += "-{0}".format(tag) - if tag == "dev": - fullstring += "+{0}".format(count) with open(os.path.join(OutputFolder, 'amxmodx_version_auto.h'), 'w') as fp: fp.write(""" @@ -74,10 +72,10 @@ def output_version_headers(): #define AMXX_BUILD_RELEASE \"{4}\" #define AMXX_BUILD_LOCAL_REV \"{6}\" -#define AMXX_BUILD_UNIQUEID "{6}:" AMXX_BUILD_CSET +#define AMXX_BUILD_UNIQUEID AMXX_BUILD_LOCAL_REV \":\" AMXX_BUILD_CSET #define AMXX_VERSION_STRING \"{5}\" -#define AMXX_VERSION_FILE {2},{3},{4},0 +#define AMXX_VERSION_FILE {2},{3},{4},{6} #endif // _AMXMODX_AUTO_VERSION_INFORMATION_H_ """.format(tag, shorthash, major, minor, release, fullstring, count)) From b1b053c20574bd40df04af3dc55de7a926875c67 Mon Sep 17 00:00:00 2001 From: Arkshine <github@arkshine.me> Date: Tue, 11 Sep 2018 00:48:15 +0200 Subject: [PATCH 63/98] Bump version --- plugins/include/amxmodx_version.inc | 6 +++--- product.version | 2 +- public/amxmodx_version.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/include/amxmodx_version.inc b/plugins/include/amxmodx_version.inc index eb2215dd..cfbcade8 100644 --- a/plugins/include/amxmodx_version.inc +++ b/plugins/include/amxmodx_version.inc @@ -12,6 +12,6 @@ #endif #define _amxmodx_version_included -#define AMXX_VERSION 1.9.0 -#define AMXX_VERSION_NUM 190 -stock const AMXX_VERSION_STR[] = "1.9.0-manual"; +#define AMXX_VERSION 1.10.0 +#define AMXX_VERSION_NUM 1100 +stock const AMXX_VERSION_STR[] = "1.10.0-manual"; diff --git a/product.version b/product.version index f8e233b2..81c871de 100644 --- a/product.version +++ b/product.version @@ -1 +1 @@ -1.9.0 +1.10.0 diff --git a/public/amxmodx_version.h b/public/amxmodx_version.h index 04d9e1d0..2f90c4d0 100644 --- a/public/amxmodx_version.h +++ b/public/amxmodx_version.h @@ -21,13 +21,13 @@ #define AMXX_BUILD_LOCAL_REV "0" #define AMXX_BUILD_CSET "0" #define AMXX_BUILD_MAJOR "1" - #define AMXX_BUILD_MINOR "9" + #define AMXX_BUILD_MINOR "10" #define AMXX_BUILD_RELEASE "0" #define AMXX_BUILD_UNIQUEID AMXX_BUILD_LOCAL_REV ":" AMXX_BUILD_CSET #define AMXX_VERSION_STRING AMXX_BUILD_MAJOR "." AMXX_BUILD_MINOR "." AMXX_BUILD_RELEASE "-" AMXX_BUILD_TAG - #define AMXX_VERSION_FILE 1,9,0,0 + #define AMXX_VERSION_FILE 1,10,0,0 #endif #define AMXX_BUILD_TIMESTAMP __DATE__ " " __TIME__ From 8f88dc5ac8df471a39bc6904edff4e44a8d46564 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Tue, 11 Sep 2018 20:19:28 +0200 Subject: [PATCH 64/98] Fix admin chat displaying the wrong language (#559) * Fix admin chat displaying the wrong language * Switch %L to %l * Improve loop * %L to %l again * Change git add . to != 0 --- plugins/adminchat.sma | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/plugins/adminchat.sma b/plugins/adminchat.sma index 1f5681d7..d5a7e621 100755 --- a/plugins/adminchat.sma +++ b/plugins/adminchat.sma @@ -216,20 +216,18 @@ public cmdSayAdmin(id) log_amx("Chat: ^"%s<%d><%s><>^" chat ^"%s^"", name, userid, authid, message[1]) log_message("^"%s<%d><%s><>^" triggered ^"amx_chat^" (text ^"%s^")", name, userid, authid, message[1]) - if (is_user_admin(id)) // no diff here if admins have g_AdminChatFlag access or not, but we don't want to print "PLAYER" - format(message, charsmax(message), "(%L) %s : %s", id, "ADMIN", name, message[1]) - else - format(message, charsmax(message), "(%L) %s : %s", id, "PLAYER", name, message[1]) - get_players(players, inum, "ch") - for (new i = 0; i < inum; ++i) + for (new bool:is_sender_admin = is_user_admin(id) != 0, i = 0; i < inum; ++i) { pl = players[i] + if (pl == id || get_user_flags(pl) & g_AdminChatFlag) - client_print(pl, print_chat, "%s", message) + { + client_print(pl, print_chat, "(%l) %s : %s", is_sender_admin ? "ADMIN" : "PLAYER", name, message[1]) + } } - + return PLUGIN_HANDLED } From 5694acf482c3b9a6f9a234a9656390e2ee7603c8 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 14 Sep 2018 15:47:11 +0200 Subject: [PATCH 65/98] Compiler: Fix an issue related to passing arrays based on an enumeration to a function (#582) --- compiler/libpc300/sc3.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/compiler/libpc300/sc3.c b/compiler/libpc300/sc3.c index 60d2c2b7..da6f8ed9 100755 --- a/compiler/libpc300/sc3.c +++ b/compiler/libpc300/sc3.c @@ -2058,7 +2058,8 @@ static int nesting=0; error(35,argidx+1); /* argument type mismatch */ /* Verify that the dimensions match with those in arg[argidx]. * A literal array always has a single dimension. - * An iARRAYCELL parameter is also assumed to have a single dimension. + * An iARRAYCELL parameter is also assumed to have a single dimension, + * but its size may be >1 in case of an enumeration pseudo-array. */ if (lval.sym==NULL || lval.ident==iARRAYCELL) { if (arg[argidx].numdim!=1) { @@ -2066,7 +2067,8 @@ static int nesting=0; } else if (arg[argidx].dim[0]!=0) { assert(arg[argidx].dim[0]>0); if (lval.ident==iARRAYCELL) { - error(47); /* array sizes must match */ + if (lval.constval==0 || arg[argidx].dim[0]!=lval.constval) + error(47); /* array sizes must match */ } else { assert(lval.constval!=0); /* literal array must have a size */ /* A literal array must have exactly the same size as the From 8d1f924248b5e8073bea1a3134139e55c1a85160 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 14 Sep 2018 20:21:47 +0200 Subject: [PATCH 66/98] Upload amxmodx-latest-<package>-<os> text file when packaging. (#585) --- support/buildbot/package.pl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/support/buildbot/package.pl b/support/buildbot/package.pl index ad8f7a1c..c53dddfc 100755 --- a/support/buildbot/package.pl +++ b/support/buildbot/package.pl @@ -5,6 +5,7 @@ use strict; use Cwd; use File::Basename; use File::stat; +use File::Temp qw/ tempfile :seekable/; use Net::FTP; use IO::Uncompress::Gunzip qw(gunzip $GunzipError); use Time::localtime; @@ -126,17 +127,30 @@ if ($ftp_path ne '') $ftp->binary(); for ($i = 0; $i <= $#packages; $i++) { my ($filename); + my ($latest); if ($^O eq "linux") { $filename = "amxmodx-$version-" . $packages[$i] . "-linux.tar.gz"; + $latest = "amxmodx-latest-" . $packages[$i] . "-linux"; } elsif ($^O eq "darwin") { next if ($packages[$i] ~~ @mac_exclude); $filename = "amxmodx-$version-" . $packages[$i] . "-mac.zip"; + $latest = "amxmodx-latest-" . $packages[$i] . "-mac"; } else { $filename = "amxmodx-$version-" . $packages[$i] . "-windows.zip"; + $latest = "amxmodx-latest-" . $packages[$i] . "-windows"; } + + my ($tmpfh, $tmpfile) = tempfile(); + print $tmpfh $filename; + $tmpfh->seek( 0, SEEK_END ); + print "Uploading $filename...\n"; $ftp->put($filename) or die "Cannot drop file $filename ($ftp_path): " . $ftp->message . "\n"; + + print "Uploading $latest...\n"; + $ftp->put($tmpfile, $latest) + or die "Cannot drop file $latest ($ftp_path): " . $ftp->message . "\n"; } $ftp->close(); From 1f0dc3387534f6d0eaaf2749dd5996054c68b294 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sun, 16 Sep 2018 20:03:39 +0200 Subject: [PATCH 67/98] Fix typo in json_object_get_value_at documentation (#587) --- plugins/include/json.inc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/include/json.inc b/plugins/include/json.inc index 687421b6..b26c7b26 100644 --- a/plugins/include/json.inc +++ b/plugins/include/json.inc @@ -594,10 +594,8 @@ native json_object_get_name(const JSON:object, index, buffer[], maxlen); * * @param object Object handle * @param index Position from which get key name - * @param buffer Buffer to copy string to - * @param maxlen Maximum size of the buffer * - * @return The number of cells written to the buffer + * @return JSON handle, Invalid_JSON if error occurred * @error If passed handle is not a valid object */ native JSON:json_object_get_value_at(const JSON:object, index); From a54b9f05a7a18b1702b94468e3b581326cc6672a Mon Sep 17 00:00:00 2001 From: IgnacioFDM <ignaciofdm@gmail.com> Date: Thu, 20 Sep 2018 15:27:15 -0300 Subject: [PATCH 68/98] Compiler: Fix broken UTF8 support (#329) --- compiler/libpc300/sc.h | 3 - compiler/libpc300/sc2.c | 12 ---- compiler/libpc300/sci18n.c | 117 ------------------------------------- compiler/libpc300/scvars.c | 1 - 4 files changed, 133 deletions(-) diff --git a/compiler/libpc300/sc.h b/compiler/libpc300/sc.h index 0f8b3212..82a7616d 100755 --- a/compiler/libpc300/sc.h +++ b/compiler/libpc300/sc.h @@ -726,8 +726,6 @@ int mfputs(MEMFILE *mf,char *string); SC_FUNC int cp_path(const char *root,const char *directory); SC_FUNC int cp_set(const char *name); SC_FUNC cell cp_translate(const unsigned char *string,const unsigned char **endptr); -SC_FUNC cell get_utf8_char(const unsigned char *string,const unsigned char **endptr); -SC_FUNC int scan_utf8(FILE *fp,const char *filename); /* function prototypes in SCSTATE.C */ SC_FUNC constvalue *automaton_add(const char *name); @@ -803,7 +801,6 @@ SC_VDECL int sc_status; /* read/write status */ SC_VDECL int sc_rationaltag; /* tag for rational numbers */ SC_VDECL int rational_digits; /* number of fractional digits */ SC_VDECL int sc_allowproccall;/* allow/detect tagnames in lex() */ -SC_VDECL short sc_is_utf8; /* is this source file in UTF-8 encoding */ SC_VDECL char *pc_deprecate; /* if non-NULL, mark next declaration as deprecated */ SC_VDECL int sc_warnings_are_errors; diff --git a/compiler/libpc300/sc2.c b/compiler/libpc300/sc2.c index 5bd3735b..09ce6621 100755 --- a/compiler/libpc300/sc2.c +++ b/compiler/libpc300/sc2.c @@ -152,7 +152,6 @@ static char *extensions[] = { ".inc", ".p", ".pawn" }; PUSHSTK_I(iflevel); assert(!SKIPPING); assert(skiplevel==iflevel); /* these two are always the same when "parsing" */ - PUSHSTK_I(sc_is_utf8); PUSHSTK_I(icomment); PUSHSTK_I(fcurrent); PUSHSTK_I(fline); @@ -169,7 +168,6 @@ static char *extensions[] = { ".inc", ".p", ".pawn" }; assert(sc_status == statFIRST || strcmp(get_inputfile(fcurrent), inpfname) == 0); setfiledirect(inpfname); /* (optionally) set in the list file */ listline=-1; /* force a #line directive when changing the file */ - sc_is_utf8=(short)scan_utf8(inpf,name); return TRUE; } @@ -319,7 +317,6 @@ static void readline(unsigned char *line) fline=i; fcurrent=(short)POPSTK_I(); icomment=(short)POPSTK_I(); - sc_is_utf8=(short)POPSTK_I(); iflevel=(short)POPSTK_I(); skiplevel=iflevel; /* this condition held before including the file */ assert(!SKIPPING); /* idem ditto */ @@ -2395,21 +2392,12 @@ static cell litchar(const unsigned char **lptr,int flags) cptr=*lptr; if ((flags & RAWMODE)!=0 || *cptr!=sc_ctrlchar) { /* no escape character */ - #if !defined NO_UTF8 - if (sc_is_utf8 && (flags & UTF8MODE)!=0) { - c=get_utf8_char(cptr,&cptr); - assert(c>=0); /* file was already scanned for conformance to UTF-8 */ - } else { - #endif #if !defined NO_CODEPAGE c=cp_translate(cptr,&cptr); #else c=*cptr; cptr+=1; #endif - #if !defined NO_UTF8 - } /* if */ - #endif } else { cptr+=1; if (*cptr==sc_ctrlchar) { diff --git a/compiler/libpc300/sci18n.c b/compiler/libpc300/sci18n.c index b106fa9c..40912c46 100755 --- a/compiler/libpc300/sci18n.c +++ b/compiler/libpc300/sci18n.c @@ -309,120 +309,3 @@ SC_FUNC cell cp_translate(const unsigned char *string,const unsigned char **endp } #endif /* NO_CODEPAGE */ - -#if !defined NO_UTF8 -SC_FUNC cell get_utf8_char(const unsigned char *string,const unsigned char **endptr) -{ - int follow=0; - long lowmark=0; - unsigned char ch; - cell result=0; - - if (endptr!=NULL) - *endptr=string; - - for ( ;; ) { - ch=*string++; - - if (follow>0 && (ch & 0xc0)==0x80) { - /* leader code is active, combine with earlier code */ - result=(result << 6) | (ch & 0x3f); - if (--follow==0) { - /* encoding a character in more bytes than is strictly needed, - * is not really valid UTF-8; we are strict here to increase - * the chance of heuristic dectection of non-UTF-8 text - * (JAVA writes zero bytes as a 2-byte code UTF-8, which is invalid) - */ - if (result<lowmark) - return -1; - /* the code positions 0xd800--0xdfff and 0xfffe & 0xffff do not - * exist in UCS-4 (and hence, they do not exist in Unicode) - */ - if ((result>=0xd800 && result<=0xdfff) || result==0xfffe || result==0xffff) - return -1; - } /* if */ - break; - } else if (follow==0 && (ch & 0x80)==0x80) { - /* UTF-8 leader code */ - if ((ch & 0xe0)==0xc0) { - /* 110xxxxx 10xxxxxx */ - follow=1; - lowmark=0x80L; - result=ch & 0x1f; - } else if ((ch & 0xf0)==0xe0) { - /* 1110xxxx 10xxxxxx 10xxxxxx (16 bits, BMP plane) */ - follow=2; - lowmark=0x800L; - result=ch & 0x0f; - } else if ((ch & 0xf8)==0xf0) { - /* 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */ - follow=3; - lowmark=0x10000L; - result=ch & 0x07; - } else if ((ch & 0xfc)==0xf8) { - /* 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx */ - follow=4; - lowmark=0x200000L; - result=ch & 0x03; - } else if ((ch & 0xfe)==0xfc) { - /* 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx (32 bits) */ - follow=5; - lowmark=0x4000000L; - result=ch & 0x01; - } else { - /* this is invalid UTF-8 */ - return -1; - } /* if */ - } else if (follow==0 && (ch & 0x80)==0x00) { - /* 0xxxxxxx (US-ASCII) */ - result=ch; - break; - } else { - /* this is invalid UTF-8 */ - return -1; - } /* if */ - - } /* for */ - - if (endptr!=NULL) - *endptr=string; - return result; -} -#endif - -SC_FUNC int scan_utf8(FILE *fp,const char *filename) -{ - #if defined NO_UTF8 - return 0; - #else - static void *resetpos=NULL; - int utf8=TRUE; - int firstchar=TRUE,bom_found=FALSE; - const unsigned char *ptr; - - resetpos=pc_getpossrc(fp); - while (utf8 && pc_readsrc(fp,pline,sLINEMAX)!=NULL) { - ptr=pline; - if (firstchar) { - /* check whether the very first character on the very first line - * starts with a BYTE order mark - */ - cell c=get_utf8_char(ptr,&ptr); - bom_found= (c==0xfeff); - utf8= (c>=0); - firstchar=FALSE; - } /* if */ - while (utf8 && *ptr!='\0') - utf8= (get_utf8_char(ptr,&ptr)>=0); - } /* while */ - pc_resetsrc(fp,resetpos); - if (bom_found) { - unsigned char bom[3]; - if (!utf8) - error(77,filename); /* malformed UTF-8 encoding */ - pc_readsrc(fp,bom,3); - assert(bom[0]==0xef && bom[1]==0xbb && bom[2]==0xbf); - } /* if */ - return utf8; - #endif /* NO_UTF8 */ -} diff --git a/compiler/libpc300/scvars.c b/compiler/libpc300/scvars.c index 4a38f149..89c3b339 100755 --- a/compiler/libpc300/scvars.c +++ b/compiler/libpc300/scvars.c @@ -84,7 +84,6 @@ SC_VDEFINE int sc_status; /* read/write status */ SC_VDEFINE int sc_rationaltag=0; /* tag for rational numbers */ SC_VDEFINE int rational_digits=0; /* number of fractional digits */ SC_VDEFINE int sc_allowproccall=0; /* allow/detect tagnames in lex() */ -SC_VDEFINE short sc_is_utf8=FALSE; /* is this source file in UTF-8 encoding */ SC_VDEFINE char *pc_deprecate = NULL;/* if non-null, mark next declaration as deprecated */ SC_VDEFINE int sc_showincludes=0; /* show include files */ SC_VDEFINE int sc_warnings_are_errors=0; From dfbeec069cf6041400d1f506692ceba6fd2ed5d8 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Thu, 20 Sep 2018 23:32:41 +0200 Subject: [PATCH 69/98] Fix invalid handle passed in the SMC/INI parser callbacks (#592) --- amxmodx/textparse.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/amxmodx/textparse.cpp b/amxmodx/textparse.cpp index 7ad389de..9f4e062c 100644 --- a/amxmodx/textparse.cpp +++ b/amxmodx/textparse.cpp @@ -44,7 +44,12 @@ cell destroyParser(cell *handle) // native SMCParser:SMC_CreateParser(); static cell AMX_NATIVE_CALL SMC_CreateParser(AMX *amx, cell *params) { - return createParser(); + const auto handle = createParser(); + const auto parseInfo = TextParsersHandles.lookup(handle); + + parseInfo->handle = handle; + + return handle; } // native SMC_SetParseStart(SMCParser:handle, const func[]); @@ -224,7 +229,12 @@ static cell AMX_NATIVE_CALL SMC_DestroyParser(AMX *amx, cell *params) // native INIParser:INI_CreateParser(); static cell AMX_NATIVE_CALL INI_CreateParser(AMX *amx, cell *params) { - return createParser(); + const auto handle = createParser(); + const auto parseInfo = TextParsersHandles.lookup(handle); + + parseInfo->handle = handle; + + return handle; } // native bool:INI_ParseFile(INIParser:handle, const file[], &line = 0, &col = 0, any:data = 0); From c3225afda1d779161a766fb2e29639ef55fd9645 Mon Sep 17 00:00:00 2001 From: PartialCloning <30499481+PartialCloning@users.noreply.github.com> Date: Sun, 23 Sep 2018 13:59:18 -0700 Subject: [PATCH 70/98] Additions to hlsdk_const and cstrike_const (#573) * Additions to hlsdk_const Added values to hlsdk_const using regamedll_cs and reapi as reference. * Update cstrike_const.inc * Prefix constants with CS_ to avoid name collision and for consistency --- plugins/include/cstrike_const.inc | 31 ++++++++ plugins/include/hlsdk_const.inc | 122 +++++++++++++++++++++++++++++- 2 files changed, 151 insertions(+), 2 deletions(-) diff --git a/plugins/include/cstrike_const.inc b/plugins/include/cstrike_const.inc index 3b0f77fb..df50ced0 100644 --- a/plugins/include/cstrike_const.inc +++ b/plugins/include/cstrike_const.inc @@ -488,3 +488,34 @@ enum CsAmmoCostType CS_AMMO_9MM_PRICE = 20, CS_AMMO_BUCKSHOT_PRICE = 65 }; + +/** + * Weapon state for use with m_iWeaponState. + */ +#define CS_WPNSTATE_USP_SILENCED (1<<0) +#define CS_WPNSTATE_GLOCK18_BURST_MODE (1<<1) +#define CS_WPNSTATE_M4A1_SILENCED (1<<2) +#define CS_WPNSTATE_ELITE_LEFT (1<<3) +#define CS_WPNSTATE_FAMAS_BURST_MODE (1<<4) +#define CS_WPNSTATE_SHIELD_DRAWN (1<<5) + +/** + * Internal commands, for use with m_flLastCommandTime. + */ +#define CS_CMD_SAY 0 +#define CS_CMD_SAYTEAM 1 +#define CS_CMD_FULLUPDATE 2 +#define CS_CMD_VOTE 3 +#define CS_CMD_VOTEMAP 4 +#define CS_CMD_LISTMAPS 5 +#define CS_CMD_LISTPLAYERS 6 +#define CS_CMD_NIGHTVISION 7 + +/** + * Signal state for use with m_signals. + */ +#define CS_SIGNAL_BUY (1<<0) +#define CS_SIGNAL_BOMB (1<<1) +#define CS_SIGNAL_RESCUE (1<<2) +#define CS_SIGNAL_ESCAPE (1<<3) +#define CS_SIGNAL_VIPSAFETY (1<<4) diff --git a/plugins/include/hlsdk_const.inc b/plugins/include/hlsdk_const.inc index 8c9d7525..f9b8cfa2 100644 --- a/plugins/include/hlsdk_const.inc +++ b/plugins/include/hlsdk_const.inc @@ -209,6 +209,14 @@ #define DMG_GRENADE (1<<24) // Counter-Strike only - Hit by HE grenade #define DMG_TIMEBASED (~(0x3fff)) // Mask for time-based damage +/** +* Gib values used on client kill based on instant damage values +*/ +#define GIB_NORMAL 0 // Gib if entity was overkilled +#define GIB_NEVER 1 // Never gib, no matter how much death damage is done ( freezing, etc ) +#define GIB_ALWAYS 2 // Always gib ( Houndeye Shock, Barnacle Bite ) +#define GIB_TRY_HEALTH -9000 // Gib players if their health is under this value. (GIB_NEVER overrides this value) + /** * Valid constants for fNoMonsters parameter of EngFunc_TraceLine, * EngFunc_TraceMonsterHull, EngFunc_TraceHull and EngFunc_TraceSphere. @@ -252,6 +260,7 @@ * func_wall_toggle */ #define SF_WALL_START_OFF 0x0001 +#define SF_WALL_NOTSOLID 0x0008 /** * func_converyor @@ -271,6 +280,7 @@ * func_rot_button */ #define SF_ROTBUTTON_NOTSOLID 1 +#define SF_ROTBUTTON_BACKWARDS 2 /** * env_global @@ -306,7 +316,8 @@ #define SF_DOOR_ROTATE_X 128 #define SF_DOOR_USE_ONLY 256 // Door must be opened by player's use button #define SF_DOOR_NOMONSTERS 512 // Monster can't open -#define SF_DOOR_SILENT 0x80000000 +#define SF_DOOR_TOUCH_ONLY_CLIENTS 1024 // Only clients can touch +#define SF_DOOR_SILENT 0x80000000 // This bit marks that func_door are actually func_water /** * gibshooter @@ -475,6 +486,27 @@ #define SF_CORNER_TELEPORT 0x002 #define SF_CORNER_FIREONCE 0x004 +/** +* func_plat +*/ +#define SF_PLAT_TOGGLE 0x0001 + +/** +* path_track +*/ +#define SF_PATH_DISABLED 0x00000001 +#define SF_PATH_FIREONCE 0x00000002 +#define SF_PATH_ALTREVERSE 0x00000004 +#define SF_PATH_DISABLE_TRAIN 0x00000008 +#define SF_PATH_ALTERNATE 0x00008000 + +/** +* path_corner +*/ +#define SF_CORNER_WAITFORTRIG 0x001 +#define SF_CORNER_TELEPORT 0x002 +#define SF_CORNER_FIREONCE 0x004 + /** * trigger_push */ @@ -493,6 +525,7 @@ * trigger_auto */ #define SF_AUTO_FIREONCE 0x0001 +#define SF_AUTO_NORESET 0x0002 /** * trigger_relay @@ -555,6 +588,16 @@ #define SF_TRIG_PUSH_ONCE 1 +/** +* trigger_multiple +*/ +#define SF_TRIGGER_MULTIPLE_NOTOUCH 0x0001 + +/** +* trigger_counter +*/ +#define SF_TRIGGER_COUNTER_NOMESSAGE 0x0001 + /** * func_breakable */ @@ -662,7 +705,9 @@ #define ITEM_FLAG_LIMITINWORLD (1<<3) #define ITEM_FLAG_EXHAUSTIBLE (1<<4) - +/** +* PlaybackEvent flags +*/ #define FEV_NOTHOST (1<<0) // Skip local host for event send. #define FEV_RELIABLE (1<<1) // Send the event reliably. You must specify the origin and angles // for this to work correctly on the server for anything @@ -688,3 +733,76 @@ #define FCAP_ONOFF_USE 0x00000020 // can be used by the player #define FCAP_DIRECTIONAL_USE 0x00000040 // Player sends +/- 1 when using (currently only tracktrains) #define FCAP_MASTER 0x00000080 // Can be used to "master" other entities (like multisource) +#define FCAP_MUST_RESET 0x00000100 // Should reset on the new round +#define FCAP_MUST_RELEASE 0x00000200 // Should release on the new round +#define FCAP_DONT_SAVE 0x80000000 // Don't save this + +// UNDONE: This will ignore transition volumes (trigger_transition), but not the PVS!!! +#define FCAP_FORCE_TRANSITION 0x00000080 // ALWAYS goes across transitions + +/** +* All monsters need this data +*/ +#define DONT_BLEED -1 +#define BLOOD_COLOR_RED 247 +#define BLOOD_COLOR_YELLOW 195 +#define BLOOD_COLOR_GREEN BLOOD_COLOR_YELLOW + +/** + * Player physics flags + */ +#define PFLAG_ONLADDER (1<<0) +#define PFLAG_ONSWING (1<<0) +#define PFLAG_ONTRAIN (1<<1) +#define PFLAG_ONBARNACLE (1<<2) +#define PFLAG_DUCKING (1<<3) // In the process of ducking, but totally squatted yet +#define PFLAG_USING (1<<4) // Using a continuous entity +#define PFLAG_OBSERVER (1<<5) // Player is locked in stationary cam mode. Spectators can move, observers can't. + +/** +* Player hide HUD values +*/ +#define HIDEHUD_WEAPONS (1<<0) +#define HIDEHUD_FLASHLIGHT (1<<1) +#define HIDEHUD_ALL (1<<2) +#define HIDEHUD_HEALTH (1<<3) +#define HIDEHUD_TIMER (1<<4) +#define HIDEHUD_MONEY (1<<5) +#define HIDEHUD_CROSSHAIR (1<<6) +#define HIDEHUD_OBSERVER_CROSSHAIR (1<<7) + +/** +* Entity classification +*/ +#define CLASS_NONE 0 +#define CLASS_MACHINE 1 +#define CLASS_PLAYER 2 +#define CLASS_HUMAN_PASSIVE 3 +#define CLASS_HUMAN_MILITARY 4 +#define CLASS_ALIEN_MILITARY 5 +#define CLASS_ALIEN_PASSIVE 6 +#define CLASS_ALIEN_MONSTER 7 +#define CLASS_ALIEN_PREY 8 +#define CLASS_ALIEN_PREDATOR 9 +#define CLASS_INSECT 10 +#define CLASS_PLAYER_ALLY 11 +#define CLASS_PLAYER_BIOWEAPON 12 // hornets and snarks.launched by players +#define CLASS_ALIEN_BIOWEAPON 13 // hornets and snarks.launched by the alien menace +#define CLASS_VEHICLE 14 +#define CLASS_BARNACLE 99 // special because no one pays attention to it, and it eats a wide cross-section of creatures. + +/** +* Entities that toggle (buttons/triggers/doors) need this +*/ +#define TS_AT_TOP 0 +#define TS_AT_BOTTOM 1 +#define TS_GOING_UP 2 +#define TS_GOING_DOWN 3 + +/** +* Entity use states (buttons/triggers/platforms) +*/ +#define USE_OFF 0 +#define USE_ON 1 +#define USE_SET 2 +#define USE_TOGGLE 3 From 08213d8ead7ac8805bb03a72fa5fda25cc4d3236 Mon Sep 17 00:00:00 2001 From: Duko <Duk0@users.noreply.github.com> Date: Sun, 23 Sep 2018 23:01:49 +0200 Subject: [PATCH 71/98] GeoIP: Add "reload" command (#588) * Add reload option * Adjust logic * Modernize the code a little --- modules/geoip/geoip_main.cpp | 69 ++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/modules/geoip/geoip_main.cpp b/modules/geoip/geoip_main.cpp index 3e9370de..bfc39008 100644 --- a/modules/geoip/geoip_main.cpp +++ b/modules/geoip/geoip_main.cpp @@ -14,16 +14,19 @@ #include "geoip_main.h" #include "geoip_natives.h" #include "geoip_util.h" -#include <time.h> +#include <ctime> MMDB_s HandleDB; ke::Vector<ke::AString> LangList; +bool NativesRegistered; void OnAmxxAttach() { if (loadDatabase()) { MF_AddNatives(GeoipNatives); + + NativesRegistered = true; } REG_SVR_COMMAND("geoip", OnGeoipCommand); @@ -38,7 +41,7 @@ void OnAmxxDetach() void OnGeoipCommand() { - const char *cmd = CMD_ARGV(1); + const auto cmd = CMD_ARGV(1); if (!strcmp(cmd, "version")) { @@ -48,7 +51,7 @@ void OnGeoipCommand() return; } - const char *meta_dump = "\n" + const auto meta_dump = "\n" " Database metadata\n" " Node count: %i\n" " Record size: %i bits\n" @@ -59,7 +62,7 @@ void OnGeoipCommand() " Languages: "; char date[40]; - strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S UTC", gmtime((const time_t *)&HandleDB.metadata.build_epoch)); + strftime(date, sizeof date, "%Y-%m-%d %H:%M:%S UTC", gmtime(reinterpret_cast<const time_t *>(&HandleDB.metadata.build_epoch))); fprintf(stdout, meta_dump, HandleDB.metadata.node_count, @@ -100,7 +103,7 @@ void OnGeoipCommand() return; } - int num_args = CMD_ARGC(); + const auto num_args = CMD_ARGC(); if (num_args < 3) { @@ -108,12 +111,12 @@ void OnGeoipCommand() return; } - char *ip = stripPort((char *)CMD_ARGV(2)); + const auto ip = stripPort(const_cast<char *>(CMD_ARGV(2))); - int gai_error = 0; - int mmdb_error = 0; + auto gai_error = 0; + auto mmdb_error = 0; - MMDB_lookup_result_s result = MMDB_lookup_string(&HandleDB, ip, &gai_error, &mmdb_error); + auto result = MMDB_lookup_string(&HandleDB, ip, &gai_error, &mmdb_error); if (gai_error != 0 || mmdb_error != MMDB_SUCCESS || !result.found_entry) { @@ -121,17 +124,17 @@ void OnGeoipCommand() return; } - MMDB_entry_data_list_s *entry_data_list = NULL; - int status = -1; + MMDB_entry_data_list_s *entry_data_list = nullptr; + int status; - if ((status = MMDB_get_entry_data_list(&result.entry, &entry_data_list)) != MMDB_SUCCESS || entry_data_list == NULL) + if ((status = MMDB_get_entry_data_list(&result.entry, &entry_data_list)) != MMDB_SUCCESS || entry_data_list == nullptr) { MF_PrintSrvConsole("\n Could not retrieve data list - %s.\n\n", MMDB_strerror(status)); return; } - const char *file = NULL; - FILE *fp = NULL; + const char *file = nullptr; + FILE *fp = nullptr; if (num_args > 3) { @@ -141,7 +144,7 @@ void OnGeoipCommand() if (!fp) { - file = NULL; + file = nullptr; fp = stdout; } @@ -156,12 +159,29 @@ void OnGeoipCommand() MMDB_free_entry_data_list(entry_data_list); } + else if (!strcmp(cmd, "reload")) + { + const auto isDatabaseLoaded = HandleDB.filename != nullptr; + + if (isDatabaseLoaded) + { + MMDB_close(&HandleDB); + } + + if (loadDatabase() && !NativesRegistered) + { + MF_AddNatives(GeoipNatives); + + NativesRegistered = true; + } + } else { MF_PrintSrvConsole("\n"); MF_PrintSrvConsole(" Usage: geoip <command> [argument]\n"); MF_PrintSrvConsole(" Commands:\n"); MF_PrintSrvConsole(" version - display geoip database metadata\n"); + MF_PrintSrvConsole(" reload - reload geoip database\n"); MF_PrintSrvConsole(" dump <ip> [output file] - dump all data from an IP address formatted in a JSON-ish fashion.\n"); MF_PrintSrvConsole(" An output file is mod-based and if not provided, it will print in the console.\n"); MF_PrintSrvConsole("\n"); @@ -170,7 +190,9 @@ void OnGeoipCommand() bool loadDatabase() { - if (HandleDB.filename) // Already loaded. + const auto isDatabaseLoaded = HandleDB.filename != nullptr; + + if (isDatabaseLoaded) { return true; } @@ -181,18 +203,18 @@ bool loadDatabase() "Country" // Is the default shipped database with AMXX. }; - const char *modName = MF_GetModname(); - const char *dataDir = MF_GetLocalInfo("amxx_datadir", "addons/amxmodx/data"); + const auto modName = MF_GetModname(); + const auto dataDir = MF_GetLocalInfo("amxx_datadir", "addons/amxmodx/data"); - char file[255]; - int status = -1; + char file[260]; + auto status = -1; - for (size_t i = 0; i < ARRAYSIZE(databases); ++i) + for (auto& database : databases) { // MF_BuildPathname not used because backslash // makes CreateFileMapping failing under windows. - ke::SafeSprintf(file, sizeof(file), "%s/%s/GeoLite2-%s.mmdb", modName, dataDir, databases[i]); + ke::SafeSprintf(file, sizeof file, "%s/%s/GeoLite2-%s.mmdb", modName, dataDir, database); status = MMDB_open(file, MMDB_MODE_MMAP, &HandleDB); @@ -200,7 +222,8 @@ bool loadDatabase() { break; } - else if (status != MMDB_FILE_OPEN_ERROR) + + if (status != MMDB_FILE_OPEN_ERROR) { MF_Log("Could not open %s - %s", file, MMDB_strerror(status)); From e8c811117891f786b8439e6740c304a8f5efaff5 Mon Sep 17 00:00:00 2001 From: Arkshine <github@arkshine.me> Date: Sun, 23 Sep 2018 23:14:33 +0200 Subject: [PATCH 72/98] Put back <time.h> from previous commit --- modules/geoip/geoip_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/geoip/geoip_main.cpp b/modules/geoip/geoip_main.cpp index bfc39008..46273bd5 100644 --- a/modules/geoip/geoip_main.cpp +++ b/modules/geoip/geoip_main.cpp @@ -14,7 +14,7 @@ #include "geoip_main.h" #include "geoip_natives.h" #include "geoip_util.h" -#include <ctime> +#include <time.h> MMDB_s HandleDB; ke::Vector<ke::AString> LangList; From 22fd09efea2fc2c649c407ecb7a8413592d13ae1 Mon Sep 17 00:00:00 2001 From: justgo97 <hamdi2050@live.com> Date: Fri, 28 Sep 2018 15:22:21 +0100 Subject: [PATCH 73/98] Add constants for get_user_origin() (#604) --- plugins/include/amxconst.inc | 12 ++++++++++++ plugins/include/amxmodx.inc | 12 +++++++----- plugins/include/engine_stocks.inc | 2 +- plugins/include/fakemeta_util.inc | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/plugins/include/amxconst.inc b/plugins/include/amxconst.inc index ca5011ee..33d0610c 100755 --- a/plugins/include/amxconst.inc +++ b/plugins/include/amxconst.inc @@ -533,4 +533,16 @@ enum STATSX_MAX_STATS } +/** + * Constants for get_user_origin() + */ +enum +{ + Origin_Client = 0, // Client's Origin + Origin_Eyes, // Eyes (and Weapon) Origin + Origin_AimEndClient, // Aim End Origin from Client's Position + Origin_AimEndEyes, // Aim End Origin from Eyes Position + Origin_CS_LastBullet // Last Bullet's Origin (Counter-Strike) +} + #include <cstrike_const> // To keep backward compatibility diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index 98630819..74f87432 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -1203,14 +1203,16 @@ native get_user_ping(index, &ping, &loss); /** * Retrieves an origin related to the client. * + * @note For a list of possible modes see the Origin_* constants in amxconst.inc. + * * @param index Client index * @param origin Array to store origin in * @param mode What type of origin to retrieve: - * 0 - current position - * 1 - position of eyes (and weapon) - * 2 - aim end position from client position - * 3 - aim end position from eyes (hit point for weapon) - * 4 - position of last bullet hit (only for Counter-Strike) + * Origin_Client - current position + * Origin_Eyes - position of eyes (and weapon) + * Origin_AimEndClient - aim end position from client position + * Origin_AimEndEyes - aim end position from eyes (hit point for weapon) + * Origin_CS_LastBullet - position of last bullet hit (only for Counter-Strike) * * @return 1 on success, 0 if client is not connected * @error If the client index is not within the range of 1 to diff --git a/plugins/include/engine_stocks.inc b/plugins/include/engine_stocks.inc index 1ef21890..baa386fa 100755 --- a/plugins/include/engine_stocks.inc +++ b/plugins/include/engine_stocks.inc @@ -125,7 +125,7 @@ stock remove_entity_name(const eName[]) stock ViewContents(id) { new origin[3], Float:Orig[3]; - get_user_origin(id, origin, 3); + get_user_origin(id, origin, Origin_AimEndEyes); Orig[0] = float(origin[0]); Orig[1] = float(origin[1]); Orig[2] = float(origin[2]); diff --git a/plugins/include/fakemeta_util.inc b/plugins/include/fakemeta_util.inc index b0bab0d0..4c66231e 100644 --- a/plugins/include/fakemeta_util.inc +++ b/plugins/include/fakemeta_util.inc @@ -325,7 +325,7 @@ stock fm_remove_entity_name(const classname[]) { stock fm_ViewContents(id) { new origin[3], Float:Orig[3]; - get_user_origin(id, origin, 3); + get_user_origin(id, origin, Origin_AimEndEyes); IVecFVec(origin, Orig); return fm_point_contents(Orig); From 49430082f58756d597f4f19971971d661e1f70ae Mon Sep 17 00:00:00 2001 From: justgo97 <hamdi2050@live.com> Date: Fri, 28 Sep 2018 15:36:19 +0100 Subject: [PATCH 74/98] Fixed a typo in get_user_flags description (#605) * Fixed a typo in get_user_flags description * Remove --- plugins/include/amxmodx.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/amxmodx.inc b/plugins/include/amxmodx.inc index 74f87432..2d734802 100755 --- a/plugins/include/amxmodx.inc +++ b/plugins/include/amxmodx.inc @@ -1830,7 +1830,7 @@ native set_user_flags(index, flags = -1, id = 0); * @param index Client index, 0 to set flags of server * @param id Flag set id, ranging from 0 to 31 * - * @noreturn + * @return Bitflag sum of client's admin flags * @error If the index is not within the range of 0 to MaxClients, an * error will be thrown. */ From f1f95425b6ae5f8cd894f9cd6c8c70605b53264d Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 28 Sep 2018 16:39:03 +0200 Subject: [PATCH 75/98] Fix a crash with set_tr/2 when -1 is passed in TR_pHit + allow worldspawn (0) in set_tr/2 (#601) * Fix a crash with set_ptr2 when -1 is passed in TR_pHit * Allow wordspawn in set_tr|2(TR_pHit, ...) --- modules/fakemeta/fm_tr.cpp | 12 ++++++------ modules/fakemeta/fm_tr2.cpp | 11 ++++++----- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/modules/fakemeta/fm_tr.cpp b/modules/fakemeta/fm_tr.cpp index 6b735f06..1bd9d671 100644 --- a/modules/fakemeta/fm_tr.cpp +++ b/modules/fakemeta/fm_tr.cpp @@ -27,7 +27,6 @@ static cell AMX_NATIVE_CALL set_tr(AMX *amx, cell *params) } cell *ptr = MF_GetAmxAddr(amx, params[2]); - edict_t *e; switch (type) { @@ -85,12 +84,13 @@ static cell AMX_NATIVE_CALL set_tr(AMX *amx, cell *params) } case TR_pHit: { - e = TypeConversion.id_to_edict(*ptr); - if (*ptr != -1 && FNullEnt(e)) - return 0; //TODO: return error - gfm_tr->pHit = e; + const auto pEdict = TypeConversion.id_to_edict(*ptr); + if (pEdict == nullptr) + { + return 0; + } + gfm_tr->pHit = pEdict; return 1; - break; } case TR_iHitgroup: { diff --git a/modules/fakemeta/fm_tr2.cpp b/modules/fakemeta/fm_tr2.cpp index 57db06c9..4b5a0e07 100644 --- a/modules/fakemeta/fm_tr2.cpp +++ b/modules/fakemeta/fm_tr2.cpp @@ -98,12 +98,13 @@ static cell AMX_NATIVE_CALL set_tr2(AMX *amx, cell *params) } case TR_pHit: { - edict_t *e = TypeConversion.id_to_edict(*ptr); - if (*ptr != -1 && FNullEnt(e)) - return 0; //TODO: return error - tr->pHit = e; + const auto pEdict = TypeConversion.id_to_edict(*ptr); + if (pEdict == nullptr) + { + return 0; + } + tr->pHit = pEdict; return 1; - break; } case TR_iHitgroup: { From b4768a3d1d9c020fe12c5668dd3777c7a574df16 Mon Sep 17 00:00:00 2001 From: OciXCrom <ozzz.safe@yahoo.com> Date: Fri, 28 Sep 2018 16:43:41 +0200 Subject: [PATCH 76/98] Add a bunch of constants to define max lengths (#566) * Add constants for max IP and SteamID length * Change max authid length to 64 * Fix port typo * Add more defines * Remove max query length --- plugins/include/amxconst.inc | 37 +++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/plugins/include/amxconst.inc b/plugins/include/amxconst.inc index 33d0610c..fef8543e 100755 --- a/plugins/include/amxconst.inc +++ b/plugins/include/amxconst.inc @@ -55,10 +55,45 @@ public stock const NULL_STRING[1]; public stock const Float:NULL_VECTOR[3]; /** - * The maximum buffer size required to store a clients name. + * The maximum buffer size required to store a client's name. */ #define MAX_NAME_LENGTH 32 +/** + * The maximum buffer size required to store a client's IP address without a port. + */ +#define MAX_IP_LENGTH 16 + +/** + * The maximum buffer size required to store a client's IP address with a port. + */ +#define MAX_IP_WITH_PORT_LENGTH 22 + +/** + * The maximum buffer size required to store a client's AuthID. + */ +#define MAX_AUTHID_LENGTH 64 + +/** + * The maximum buffer size required to store a resource path. + */ +#define MAX_RESOURCE_PATH_LENGTH 64 + +/** + * The maximum buffer size that can be displayed in a MOTD. + */ +#define MAX_MOTD_LENGTH 1536 + +/** + * The maximum size accepted by the user info buffer. + */ +#define MAX_USER_INFO_LENGTH 256 + +/** + * The maximum buffer size that can be displayed in a menu. + */ +#define MAX_MENU_LENGTH 512 + /** * π */ From 8717ffe07ccafcd96de76a49f3bce2f967e5c998 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 28 Sep 2018 16:46:52 +0200 Subject: [PATCH 77/98] Implement menu_create "ml" param to allow menu title/item to be looked up as multilingual key (#593) * Clean up menu_create() internal code No code changes. Just modernizing code a little and tidying up things. * Implement menu_create() "ml" param * Include newmenu.inc to VS project files * Adjust documentation * Put back the quote in the log error message. --- amxmodx/msvc12/amxmodx_mm.vcxproj | 1 + amxmodx/msvc12/amxmodx_mm.vcxproj.filters | 7 +- amxmodx/newmenus.cpp | 91 ++++++++++++++++------- amxmodx/newmenus.h | 4 +- plugins/include/newmenus.inc | 5 +- 5 files changed, 75 insertions(+), 33 deletions(-) diff --git a/amxmodx/msvc12/amxmodx_mm.vcxproj b/amxmodx/msvc12/amxmodx_mm.vcxproj index 80fb9367..da893adc 100644 --- a/amxmodx/msvc12/amxmodx_mm.vcxproj +++ b/amxmodx/msvc12/amxmodx_mm.vcxproj @@ -457,6 +457,7 @@ md -p JIT 2>NUL <None Include="..\..\plugins\include\cvars.inc" /> <None Include="..\..\plugins\include\datapack.inc" /> <None Include="..\..\plugins\include\gameconfig.inc" /> + <None Include="..\..\plugins\include\newmenus.inc" /> <None Include="..\..\plugins\include\string_const.inc" /> <None Include="..\..\plugins\include\string_stocks.inc" /> <None Include="..\..\plugins\include\textparse_ini.inc" /> diff --git a/amxmodx/msvc12/amxmodx_mm.vcxproj.filters b/amxmodx/msvc12/amxmodx_mm.vcxproj.filters index f1c49446..946922c2 100644 --- a/amxmodx/msvc12/amxmodx_mm.vcxproj.filters +++ b/amxmodx/msvc12/amxmodx_mm.vcxproj.filters @@ -54,7 +54,7 @@ </Filter> <Filter Include="ReSDK\engine"> <UniqueIdentifier>{04fab577-6f56-40d0-8f69-7ce1b8bf3bb9}</UniqueIdentifier> - </Filter> + </Filter> <Filter Include="Third Party\UTF8Rewind"> <UniqueIdentifier>{270f3524-564f-4154-bb35-242a6faac09e}</UniqueIdentifier> </Filter> @@ -693,10 +693,13 @@ <None Include="..\..\plugins\include\string_stocks.inc"> <Filter>Pawn Includes</Filter> </None> + <None Include="..\..\plugins\include\newmenus.inc"> + <Filter>Pawn Includes</Filter> + </None> </ItemGroup> <ItemGroup> <Object Include="..\Jit\helpers-x86.obj"> <Filter>Assembly\Builds</Filter> </Object> </ItemGroup> -</Project> +</Project> \ No newline at end of file diff --git a/amxmodx/newmenus.cpp b/amxmodx/newmenus.cpp index 9e07d356..59bdd7e6 100755 --- a/amxmodx/newmenus.cpp +++ b/amxmodx/newmenus.cpp @@ -10,6 +10,7 @@ #include "amxmodx.h" #include "CMenu.h" #include "newmenus.h" +#include "format.h" ke::Vector<Menu *> g_NewMenus; CStack<int> g_MenuFreeStack; @@ -90,9 +91,9 @@ bool CloseNewMenus(CPlayer *pPlayer) return true; } -Menu::Menu(const char *title, AMX *amx, int fid) : m_Title(title), m_ItemColor("\\r"), +Menu::Menu(const char *title, AMX *amx, int fid, bool use_ml) : m_Title(title), m_ItemColor("\\r"), m_NeverExit(false), m_AutoColors(g_coloredmenus), thisId(0), func(fid), -isDestroying(false), pageCallback(-1), showPageNumber(true), items_per_page(7) +isDestroying(false), pageCallback(-1), showPageNumber(true), useMultilingual(use_ml), amx(amx), items_per_page(7) { CPluginMngr::CPlugin *pPlugin = g_plugins.findPluginFast(amx); menuId = g_menucmds.registerMenuId(title, amx); @@ -356,18 +357,32 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) m_Text = nullptr; + + auto title = m_Title.chars(); + + if (this->useMultilingual) + { + const auto language = playerlang(player); + const auto definition = translate(this->amx, language, title); + + if (definition) + { + title = definition; + } + } + char buffer[255]; if (showPageNumber && items_per_page && (pages != 1)) { if (m_AutoColors) - ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s %d/%d\n\\w\n", m_Title.chars(), page + 1, pages); + ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s %d/%d\n\\w\n", title, page + 1, pages); else - ke::SafeSprintf(buffer, sizeof(buffer), "%s %d/%d\n\n", m_Title.chars(), page + 1, pages); + ke::SafeSprintf(buffer, sizeof(buffer), "%s %d/%d\n\n", title, page + 1, pages); } else { if (m_AutoColors) - ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s\n\\w\n", m_Title.chars()); + ke::SafeSprintf(buffer, sizeof(buffer), "\\y%s\n\\w\n", title); else - ke::SafeSprintf(buffer, sizeof(buffer), "%s\n\n", m_Title.chars()); + ke::SafeSprintf(buffer, sizeof(buffer), "%s\n\n", title); } m_Text = m_Text + buffer; @@ -462,24 +477,37 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) option_display = 0; } + auto itemName = pItem->name.chars(); + + if (this->useMultilingual) + { + const auto language = playerlang(player); + const auto definition = translate(this->amx, language, itemName); + + if (definition) + { + itemName = definition; + } + } + if (pItem->isBlank) { - ke::SafeSprintf(buffer, sizeof(buffer), "%s\n", pItem->name.chars()); + ke::SafeSprintf(buffer, sizeof(buffer), "%s\n", itemName); } else if (enabled) { - if (m_AutoColors) + if (m_AutoColors) { - ke::SafeSprintf(buffer, sizeof(buffer), "%s%d.\\w %s\n", m_ItemColor.chars(),option_display, pItem->name.chars()); + ke::SafeSprintf(buffer, sizeof(buffer), "%s%d.\\w %s\n", m_ItemColor.chars(),option_display, itemName); } else { - ke::SafeSprintf(buffer, sizeof(buffer), "%d. %s\n", option_display, pItem->name.chars()); + ke::SafeSprintf(buffer, sizeof(buffer), "%d. %s\n", option_display, itemName); } } else { if (m_AutoColors) { - ke::SafeSprintf(buffer, sizeof(buffer), "\\d%d. %s\n\\w", option_display, pItem->name.chars()); + ke::SafeSprintf(buffer, sizeof(buffer), "\\d%d. %s\n\\w", option_display, itemName); } else { - ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", pItem->name.chars()); + ke::SafeSprintf(buffer, sizeof(buffer), "#. %s\n", itemName); } } slots++; @@ -620,38 +648,45 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.length()); \ return 0; } -//Makes a new menu handle (-1 for failure) -//native csdm_makemenu(title[]); +// native menu_create(const title[], const handler[], bool:ml = false); static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params) { - int len; - char *title = get_amxstring(amx, params[1], 0, len); - validate_menu_text(title); - char *handler = get_amxstring(amx, params[2], 1, len); + enum args { arg_count, arg_title, arg_handler, arg_ml }; - int func = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE); - - if (func == -1) + int length; + const auto title = get_amxstring(amx, params[arg_title], 0, length); + const auto handler = get_amxstring(amx, params[arg_handler], 1, length); + const auto callback = registerSPForwardByName(amx, handler, FP_CELL, FP_CELL, FP_CELL, FP_DONE); + + if (callback == -1) { - LogError(amx, AMX_ERR_NOTFOUND, "Invalid function \"%s\"", handler); + LogError(amx, AMX_ERR_NOTFOUND, R"(Invalid function "%s")", handler); return 0; } - Menu *pMenu = new Menu(title, amx, func); + validate_menu_text(title); + + auto pMenu = new Menu(title, amx, callback, params[arg_ml] != 0); if (g_MenuFreeStack.empty()) { g_NewMenus.append(pMenu); - pMenu->thisId = (int)g_NewMenus.length() - 1; - } else { - int pos = g_MenuFreeStack.front(); + + pMenu->thisId = static_cast<int>(g_NewMenus.length()) - 1; + } + else + { + const auto position = g_MenuFreeStack.front(); + g_MenuFreeStack.pop(); - g_NewMenus[pos] = pMenu; - pMenu->thisId = pos; + g_NewMenus[position] = pMenu; + + pMenu->thisId = position; } return pMenu->thisId; } + static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params) { GETMENU(params[1]); diff --git a/amxmodx/newmenus.h b/amxmodx/newmenus.h index df132df1..8b53a52a 100755 --- a/amxmodx/newmenus.h +++ b/amxmodx/newmenus.h @@ -95,7 +95,7 @@ typedef unsigned int page_t; class Menu { public: - Menu(const char *title, AMX *amx, int fid); + Menu(const char *title, AMX *amx, int fid, bool use_ml); ~Menu(); menuitem *GetMenuItem(item_t item); @@ -127,6 +127,8 @@ public: bool isDestroying; int pageCallback; bool showPageNumber; + bool useMultilingual; + AMX *amx; public: unsigned int items_per_page; }; diff --git a/plugins/include/newmenus.inc b/plugins/include/newmenus.inc index 9485ab2f..79a88f7b 100644 --- a/plugins/include/newmenus.inc +++ b/plugins/include/newmenus.inc @@ -117,13 +117,14 @@ * @param title Title the menu should use. * @param handler Name of the handler function. The function will be invoked * once and only once to every menu_display() call. - * @param ml Unused (should be 0). + * @param ml If true, the menu title and items will be looked up as multilingual keys + * when the menu displays. * @return Menu resource identifier which must be destroyed via * menu_destroy(). All menus are destroyed when the plugin * unloads. * @error Function name not found. */ -native menu_create(const title[], const handler[], ml=0); +native menu_create(const title[], const handler[], bool:ml = false); /** * Creates a menu item callback handler. From f82455dd840cf719b2dcd257a417f412e75c264c Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 28 Sep 2018 16:51:54 +0200 Subject: [PATCH 78/98] Move hamdata.ini to gamedata (#597) * Replace atoi by strtol in the config parser * Move hamdata.ini data to gamedata files * Reference the new files in master file * Remove all the parsing code and use config manager to get the offsets * Remove any hamdata.ini references --- amxmodx/CGameConfigs.cpp | 8 +- configs/hamdata.ini | 4719 ----------------- gamedata/common.games/master.games.txt | 67 +- .../virtual.games/ag/offsets-common.txt | 938 ++++ .../virtual.games/cstrike/offsets-common.txt | 874 +++ .../virtual.games/dod/offsets-common.txt | 1238 +++++ .../virtual.games/esf/offsets-common.txt | 902 ++++ .../esf_openbeta/offsets-common.txt | 1388 +++++ .../virtual.games/gearbox/offsets-common.txt | 1105 ++++ .../virtual.games/ns/offsets-common.txt | 878 +++ .../virtual.games/svencoop/offsets-common.txt | 1466 +++++ .../virtual.games/tfc/offsets-common.txt | 1133 ++++ .../virtual.games/ts/offsets-common.txt | 746 +++ .../virtual.games/valve/offsets-common.txt | 1091 ++++ installer/amxmodx-installer.nsi | 1 - modules/hamsandwich/config_parser.cpp | 381 +- modules/hamsandwich/ham_const.h | 2 +- modules/hamsandwich/ham_utils.h | 2 +- plugins/include/ham_const.inc | 4 +- plugins/include/hamsandwich.inc | 2 +- support/PackageScript | 1 - 21 files changed, 11856 insertions(+), 5090 deletions(-) delete mode 100644 configs/hamdata.ini create mode 100644 gamedata/common.games/virtual.games/ag/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/cstrike/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/dod/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/esf/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/esf_openbeta/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/gearbox/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/ns/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/svencoop/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/tfc/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/ts/offsets-common.txt create mode 100644 gamedata/common.games/virtual.games/valve/offsets-common.txt diff --git a/amxmodx/CGameConfigs.cpp b/amxmodx/CGameConfigs.cpp index e60895b2..75d66109 100644 --- a/amxmodx/CGameConfigs.cpp +++ b/amxmodx/CGameConfigs.cpp @@ -325,16 +325,16 @@ SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key } else if (!strcmp(key, "size")) { - TempType.fieldSize = ke::Max<int>(0, atoi(value)); + TempType.fieldSize = ke::Max<int>(0, strtol(value, nullptr, 0)); } else if (!strcmp(key, "unsigned")) { - TempType.fieldUnsigned = !!atoi(value); + TempType.fieldUnsigned = !!strtol(value, nullptr, 0); } else if (g_LibSys.IsPlatformCompatible(key, &m_MatchedPlatform)) { m_FoundOffset = true; - TempType.fieldOffset = atoi(value); + TempType.fieldOffset = strtol(value, nullptr, 0); } break; } @@ -397,7 +397,7 @@ SMCResult CGameConfig::ReadSMC_KeyValue(const SMCStates *states, const char *key if (m_AddressReadCount < limit) { - m_AddressRead[m_AddressReadCount] = atoi(value); + m_AddressRead[m_AddressReadCount] = strtol(value, nullptr, 0); m_AddressReadCount++; } else diff --git a/configs/hamdata.ini b/configs/hamdata.ini deleted file mode 100644 index 05a44691..00000000 --- a/configs/hamdata.ini +++ /dev/null @@ -1,4719 +0,0 @@ -; Ham Sandwich module config file. -; -; IMPORTANT: It is highly suggested that you do not modify this file unless -; you know _exactly_ what you are doing! -; -; NOTE: Just because a mod contains a function does not means it will work -; as expected. If, for example, HamKilled() does not work as you think -; it should in Counter-Strike DO NOT FILE A BUG REPORT. This just -; exposes the function for you, whether or not it works, or how it -; works is up to plugin authors to figure out. -; -; NOTE: If a mod is missing keys for a certain native, that particular native -; will not be loaded! Example: Say CS is missing the "takedamage" index -; but has the use and pev indexes. The HamUse and HamePdataCbase natives -; will be registered, but the HamTakeDamage native will not register. -; In addition, any attempts to hook a function who's key is missing will -; result in the plugin failing. -; -; NOTE: The base key is only needed for the linux configs. -; -; NOTE: Any keys that begin with a modname (eg: cstrike_restart) will, -; obviously, only work on that mod and all mirrors of it (eg: czero). -; -; NOTE: If you change this file while the module is already loaded, you will -; need to restart the server for the changes to take effect. Changes to -; this file before the module is loaded will take effect when the module -; loads. -; -; NOTE: All of these offsets and settings are for the latest (at the time of -; release) legitimate version of the mod. However, there is a _chance_ -; that they will work on older (and even newer) versions. -; eg: If they work on non-Steam CS 1.6 this is coincidental, if they do -; not work on non-Steam CS 1.6 this will not be officially fixed. -; -; Mirrors: These take the name of one mod, and copy all of its data to another -; name. An example of a use for this would be cstrike and czero: they -; use the same binary so all of its vtable offsets are guaranteed to -; be identical. Mirrors should always come first in the file! -; -; Version: $Id: hamdata.ini 3687 2008-03-04 18:51:35Z sawce $ - - -@mirror cstrike czero -@mirror ns nsp -@mirror valve dmc - -; TODO: check these - all are estimates -@section cstrike linux - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 3 - objectcaps 6 - activate 7 - setobjectcollisionbox 8 - classify 9 - deathnotice 10 - traceattack 11 - takedamage 12 - takehealth 13 - killed 14 - bloodcolor 15 - tracebleed 16 - istriggered 17 - mymonsterpointer 18 - mysquadmonsterpointer 19 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - giveammo 25 - getdelay 26 - ismoving 27 - overridereset 28 - damagedecal 29 - settogglestate 30 - startsneaking 31 - stopsneaking 32 - oncontrols 33 - issneaking 34 - isalive 35 - isbspmodel 36 - reflectgauss 37 - hastarget 38 - isinworld 39 - isplayer 40 - isnetclient 41 - teamid 42 - getnexttarget 43 - think 44 - touch 45 - use 46 - blocked 47 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvisible 56 - fvecvisible 57 - changeyaw 59 - hashumangibs 60 - hasaliengibs 61 - fademonster 62 - gibmonster 63 - getdeathactivity 64 - becomedead 65 - irelationship 67 - painsound 68 - reportaistate 70 - monsterinitdead 71 - look 72 - bestvisibleenemy 73 - finviewcone 74 - fvecinviewcone 75 - - player_jump 76 - player_duck 77 - player_prethink 78 - player_postthink 79 - player_getgunposition 80 - player_shouldfadeondeath 66 - player_impulsecommands 83 - player_updateclientdata 82 - - item_addtoplayer 59 - item_addduplicate 60 - item_getiteminfo 61 - item_candeploy 62 - item_deploy 64 - item_canholster 66 - item_holster 67 - item_updateiteminfo 68 - item_preframe 69 - item_postframe 70 - item_drop 71 - item_kill 72 - item_attachtoplayer 73 - item_primaryammoindex 74 - item_secondaryammoindex 75 - item_updateclientdata 76 - item_getweaponptr 77 - item_itemslot 79 - - weapon_extractammo 80 - weapon_extractclipammo 81 - weapon_addweapon 82 - weapon_playemptysound 83 - weapon_resetemptysound 84 - weapon_isusable 86 - weapon_primaryattack 87 - weapon_secondaryattack 88 - weapon_reload 89 - weapon_weaponidle 90 - weapon_retireweapon 91 - weapon_shouldweaponidle 92 - weapon_usedecrement 93 - - cstrike_restart 2 - cstrike_roundrespawn 84 - cstrike_item_candrop 63 - cstrike_item_isweapon 65 - cstrike_item_getmaxspeed 78 - cstrike_weapon_sendweaponanim 85 - cstrike_player_resetmaxspeed 69 - cstrike_player_isbot 81 - cstrike_player_getautoaimvector 85 - cstrike_player_blind 86 - cstrike_player_ontouchingweapon 87 - -@end -@section cstrike windows - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 3 - objectcaps 6 - activate 7 - setobjectcollisionbox 8 - classify 9 - deathnotice 10 - traceattack 11 - takedamage 12 - takehealth 13 - killed 14 - bloodcolor 15 - tracebleed 16 - istriggered 17 - mymonsterpointer 18 - mysquadmonsterpointer 19 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - giveammo 25 - getdelay 26 - ismoving 27 - overridereset 28 - damagedecal 29 - settogglestate 30 - startsneaking 31 - stopsneaking 32 - oncontrols 33 - issneaking 34 - isalive 35 - isbspmodel 36 - reflectgauss 37 - hastarget 38 - isinworld 39 - isplayer 40 - isnetclient 41 - teamid 42 - getnexttarget 43 - think 44 - touch 45 - use 46 - blocked 47 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvecvisible 56 - fvisible 57 - changeyaw 59 - hashumangibs 60 - hasaliengibs 61 - fademonster 62 - gibmonster 63 - getdeathactivity 64 - becomedead 65 - irelationship 67 - painsound 68 - reportaistate 70 - monsterinitdead 71 - look 72 - bestvisibleenemy 73 - finviewcone 75 - fvecinviewcone 74 - - player_jump 76 - player_duck 77 - player_prethink 78 - player_postthink 79 - player_getgunposition 80 - player_shouldfadeondeath 66 - player_impulsecommands 83 - player_updateclientdata 82 - - item_addtoplayer 59 - item_addduplicate 60 - item_getiteminfo 61 - item_candeploy 62 - item_deploy 64 - item_canholster 66 - item_holster 67 - item_updateiteminfo 68 - item_preframe 69 - item_postframe 70 - item_drop 71 - item_kill 72 - item_attachtoplayer 73 - item_primaryammoindex 74 - item_secondaryammoindex 75 - item_updateclientdata 76 - item_getweaponptr 77 - item_itemslot 79 - - weapon_extractammo 80 - weapon_extractclipammo 81 - weapon_addweapon 82 - weapon_playemptysound 83 - weapon_resetemptysound 84 - weapon_isusable 86 - weapon_primaryattack 87 - weapon_secondaryattack 88 - weapon_reload 89 - weapon_weaponidle 90 - weapon_retireweapon 91 - weapon_shouldweaponidle 92 - weapon_usedecrement 93 - - cstrike_restart 2 - cstrike_roundrespawn 84 - cstrike_item_candrop 63 - cstrike_item_isweapon 65 - cstrike_item_getmaxspeed 78 - cstrike_weapon_sendweaponanim 85 - cstrike_player_resetmaxspeed 69 - cstrike_player_isbot 81 - cstrike_player_getautoaimvector 85 - cstrike_player_blind 86 - cstrike_player_ontouchingweapon 87 -@end - -@section cstrike mac - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 3 - objectcaps 6 - activate 7 - setobjectcollisionbox 8 - classify 9 - deathnotice 10 - traceattack 11 - takedamage 12 - takehealth 13 - killed 14 - bloodcolor 15 - tracebleed 16 - istriggered 17 - mymonsterpointer 18 - mysquadmonsterpointer 19 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - giveammo 25 - getdelay 26 - ismoving 27 - overridereset 28 - damagedecal 29 - settogglestate 30 - startsneaking 31 - stopsneaking 32 - oncontrols 33 - issneaking 34 - isalive 35 - isbspmodel 36 - reflectgauss 37 - hastarget 38 - isinworld 39 - isplayer 40 - isnetclient 41 - teamid 42 - getnexttarget 43 - think 44 - touch 45 - use 46 - blocked 47 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvecvisible 56 - fvisible 57 - changeyaw 59 - hashumangibs 60 - hasaliengibs 61 - fademonster 62 - gibmonster 63 - getdeathactivity 64 - becomedead 65 - irelationship 67 - painsound 68 - reportaistate 70 - monsterinitdead 71 - look 72 - bestvisibleenemy 73 - finviewcone 74 - fvecinviewcone 75 - - player_jump 76 - player_duck 77 - player_prethink 78 - player_postthink 79 - player_getgunposition 80 - player_shouldfadeondeath 66 - player_impulsecommands 83 - player_updateclientdata 82 - - item_addtoplayer 59 - item_addduplicate 60 - item_getiteminfo 61 - item_candeploy 62 - item_deploy 64 - item_canholster 66 - item_holster 67 - item_updateiteminfo 68 - item_preframe 69 - item_postframe 70 - item_drop 71 - item_kill 72 - item_attachtoplayer 73 - item_primaryammoindex 74 - item_secondaryammoindex 75 - item_updateclientdata 76 - item_getweaponptr 77 - item_itemslot 79 - - weapon_extractammo 80 - weapon_extractclipammo 81 - weapon_addweapon 82 - weapon_playemptysound 83 - weapon_resetemptysound 84 - weapon_isusable 86 - weapon_primaryattack 87 - weapon_secondaryattack 88 - weapon_reload 89 - weapon_weaponidle 90 - weapon_retireweapon 91 - weapon_shouldweaponidle 92 - weapon_usedecrement 93 - - cstrike_restart 2 - cstrike_roundrespawn 84 - cstrike_item_candrop 63 - cstrike_item_isweapon 65 - cstrike_item_getmaxspeed 78 - cstrike_weapon_sendweaponanim 85 - cstrike_player_resetmaxspeed 69 - cstrike_player_isbot 81 - cstrike_player_getautoaimvector 85 - cstrike_player_blind 86 - cstrike_player_ontouchingweapon 87 -@end - -@section dod linux - pev 4 - base 0x0 - - spawn 3 - precache 4 - keyvalue 5 - objectcaps 8 - activate 9 - setobjectcollisionbox 12 - classify 13 - deathnotice 14 - traceattack 17 - takedamage 18 - takehealth 19 - killed 20 - bloodcolor 21 - tracebleed 22 - mymonsterpointer 23 - mysquadmonsterpointer 24 - gettogglestate 25 - addpoints 26 - addpointstoteam 27 - addplayeritem 28 - removeplayeritem 29 - giveammo 30 - getdelay 31 - ismoving 32 - overridereset 33 - damagedecal 34 - settogglestate 35 - startsneaking 36 - stopsneaking 37 - oncontrols 38 - issneaking 39 - isalive 40 - isbspmodel 41 - reflectgauss 42 - hastarget 43 - isinworld 44 - isplayer 45 - isnetclient 46 - teamid 47 - getnexttarget 48 - think 49 - touch 50 - use 51 - blocked 52 - respawn 53 - updateowner 54 - fbecomeprone 55 - center 56 - eyeposition 57 - earposition 58 - bodytarget 59 - illumination 60 - fvisible 61 - fvecvisible 62 - - look 64 - changeyaw 67 - irelationship 69 - monsterinitdead 71 - bestvisibleenemy 74 - finviewcone 75 - fvecinviewcone 76 - - runai 65 - monsterthink 68 - monsterinit 70 - checklocalmove 77 - move 78 - moveexecute 79 - shouldadvanceroute 80 - getstoppedactivity 81 - stop 82 - checkrangeattack1 83 - checkrangeattack2 84 - checkmeleeattack1 85 - checkmeleeattack2 86 - schedulechange 92 - canplaysequence 93 - canplaysentence2 94 - playsentence 95 - playscriptedsentence 96 - sentencestop 97 - getidealstate 98 - setactivity 99 - reportaistate 100 - checkenemy 101 - ftriangulate 102 - setyawspeed 103 - buildnearestroute 104 - findcover 105 - coverradius 107 - fcancheckattacks 108 - checkammo 109 - ignoreconditions 110 - fvalidatehinttype 111 - fcanactiveidle 112 - isoundmask 113 - hearingsensitivity 116 - barnaclevictimbitten 117 - barnaclevictimreleased 118 - preschedulethink 120 - getdeathactivity 121 - gibmonster 122 - hashumangibs 123 - hasaliengibs 124 - fademonster 125 - deathsound 127 - alertsound 128 - idlesound 129 - painsound 130 - stopfollowing 131 - - player_jump 134 - player_duck 135 - player_prethink 132 - player_postthink 133 - player_getgunposition 126 - player_shouldfadeondeath 66 - player_impulsecommands 137 - player_updateclientdata 136 - - item_addtoplayer 64 - item_addduplicate 65 - item_getiteminfo 66 - item_candeploy 67 - item_deploy 68 - item_canholster 73 - item_holster 74 - item_updateiteminfo 75 - item_preframe 76 - item_postframe 77 - item_drop 78 - item_kill 79 - item_attachtoplayer 80 - item_primaryammoindex 81 - item_secondaryammoindex 82 - item_updateclientdata 83 - item_getweaponptr 84 - item_itemslot 85 - - weapon_extractammo 86 - weapon_extractclipammo 87 - weapon_addweapon 88 - weapon_playemptysound 89 - weapon_resetemptysound 90 - weapon_isusable 92 - weapon_primaryattack 102 - weapon_secondaryattack 103 - weapon_reload 104 - weapon_weaponidle 105 - weapon_retireweapon 106 - weapon_shouldweaponidle 107 - weapon_usedecrement 108 - - dod_roundrespawn 0 - dod_roundrespawnent 1 - dod_roundstore 2 - dod_areasetindex 10 - dod_areasendstatus 11 - dod_getstate 15 - dod_getstateent 16 - dod_setscriptreset 119 - - dod_item_candrop 70 - dod_item_spawndeploy 69 - dod_item_setdmgtime 71 - dod_item_dropgren 72 - - dod_weapon_sendweaponanim 91 - dod_weapon_isuseable 92 - dod_weapon_aim 93 - dod_weapon_flaim 94 - dod_weapon_removestamina 95 - dod_weapon_changefov 96 - dod_weapon_zoomout 97 - dod_weapon_zoomin 98 - dod_weapon_getfov 99 - dod_weapon_playeriswatersniping 100 - dod_weapon_updatezoomspeed 101 - dod_weapon_special 105 -@end -@section dod windows - pev 4 - base 0x0 - - spawn 3 - precache 4 - keyvalue 5 - objectcaps 8 - activate 9 - setobjectcollisionbox 12 - classify 13 - deathnotice 14 - traceattack 17 - takedamage 18 - takehealth 19 - killed 20 - bloodcolor 21 - tracebleed 22 - mymonsterpointer 23 - mysquadmonsterpointer 24 - gettogglestate 25 - addpoints 26 - addpointstoteam 27 - addplayeritem 28 - removeplayeritem 29 - giveammo 30 - getdelay 31 - ismoving 32 - overridereset 33 - damagedecal 34 - settogglestate 35 - startsneaking 36 - stopsneaking 37 - oncontrols 38 - issneaking 39 - isalive 40 - isbspmodel 41 - reflectgauss 42 - hastarget 43 - isinworld 44 - isplayer 45 - isnetclient 46 - teamid 47 - getnexttarget 48 - think 49 - touch 50 - use 51 - blocked 52 - respawn 53 - updateowner 54 - fbecomeprone 55 - center 56 - eyeposition 57 - earposition 58 - bodytarget 59 - illumination 60 - fvisible 62 - fvecvisible 61 - - look 64 - changeyaw 67 - irelationship 69 - monsterinitdead 71 - bestvisibleenemy 74 - finviewcone 76 - fvecinviewcone 75 - - runai 65 - monsterthink 68 - monsterinit 70 - checklocalmove 77 - move 78 - moveexecute 79 - shouldadvanceroute 80 - getstoppedactivity 81 - stop 82 - checkrangeattack1 83 - checkrangeattack2 84 - checkmeleeattack1 85 - checkmeleeattack2 86 - schedulechange 92 - canplaysequence 93 - canplaysentence2 94 - playsentence 95 - playscriptedsentence 96 - sentencestop 97 - getidealstate 98 - setactivity 99 - reportaistate 100 - checkenemy 101 - ftriangulate 102 - setyawspeed 103 - buildnearestroute 104 - findcover 105 - coverradius 107 - fcancheckattacks 108 - checkammo 109 - ignoreconditions 110 - fvalidatehinttype 111 - fcanactiveidle 112 - isoundmask 113 - hearingsensitivity 116 - barnaclevictimbitten 117 - barnaclevictimreleased 118 - preschedulethink 120 - getdeathactivity 121 - gibmonster 122 - hashumangibs 123 - hasaliengibs 124 - fademonster 125 - deathsound 127 - alertsound 128 - idlesound 129 - painsound 130 - stopfollowing 131 - - player_jump 134 - player_duck 135 - player_prethink 132 - player_postthink 133 - player_getgunposition 126 - player_shouldfadeondeath 66 - player_impulsecommands 137 - player_updateclientdata 136 - - item_addtoplayer 64 - item_addduplicate 65 - item_getiteminfo 66 - item_candeploy 67 - item_deploy 68 - item_canholster 73 - item_holster 74 - item_updateiteminfo 75 - item_preframe 76 - item_postframe 77 - item_drop 78 - item_kill 79 - item_attachtoplayer 80 - item_primaryammoindex 81 - item_secondaryammoindex 82 - item_updateclientdata 83 - item_getweaponptr 84 - item_itemslot 85 - - weapon_extractammo 86 - weapon_extractclipammo 87 - weapon_addweapon 88 - weapon_playemptysound 89 - weapon_resetemptysound 90 - weapon_isusable 92 - weapon_primaryattack 102 - weapon_secondaryattack 103 - weapon_reload 104 - weapon_weaponidle 105 - weapon_retireweapon 106 - weapon_shouldweaponidle 107 - weapon_usedecrement 108 - - dod_roundrespawn 0 - dod_roundrespawnent 1 - dod_roundstore 2 - dod_areasetindex 10 - dod_areasendstatus 11 - dod_getstate 16 - dod_getstateent 15 - dod_setscriptreset 119 - - dod_item_candrop 70 - dod_item_spawndeploy 69 - dod_item_setdmgtime 71 - dod_item_dropgren 72 - - dod_weapon_sendweaponanim 91 - dod_weapon_isuseable 92 - dod_weapon_aim 93 - dod_weapon_flaim 94 - dod_weapon_removestamina 95 - dod_weapon_changefov 96 - dod_weapon_zoomout 97 - dod_weapon_zoomin 98 - dod_weapon_getfov 99 - dod_weapon_playeriswatersniping 100 - dod_weapon_updatezoomspeed 101 - dod_weapon_special 105 -@end - -@section dod mac - pev 4 - base 0x0 - - spawn 3 - precache 4 - keyvalue 5 - objectcaps 8 - activate 9 - setobjectcollisionbox 12 - classify 13 - deathnotice 14 - traceattack 17 - takedamage 18 - takehealth 19 - killed 20 - bloodcolor 21 - tracebleed 22 - mymonsterpointer 23 - mysquadmonsterpointer 24 - gettogglestate 25 - addpoints 26 - addpointstoteam 27 - addplayeritem 28 - removeplayeritem 29 - giveammo 30 - getdelay 31 - ismoving 32 - overridereset 33 - damagedecal 34 - settogglestate 35 - startsneaking 36 - stopsneaking 37 - oncontrols 38 - issneaking 39 - isalive 40 - isbspmodel 41 - reflectgauss 42 - hastarget 43 - isinworld 44 - isplayer 45 - isnetclient 46 - teamid 47 - getnexttarget 48 - think 49 - touch 50 - use 51 - blocked 52 - respawn 53 - updateowner 54 - fbecomeprone 55 - center 56 - eyeposition 57 - earposition 58 - bodytarget 59 - illumination 60 - fvisible 61 - fvecvisible 62 - - look 64 - changeyaw 67 - irelationship 69 - monsterinitdead 71 - bestvisibleenemy 74 - finviewcone 75 - fvecinviewcone 76 - - runai 65 - monsterthink 68 - monsterinit 70 - checklocalmove 77 - move 78 - moveexecute 79 - shouldadvanceroute 80 - getstoppedactivity 81 - stop 82 - checkrangeattack1 83 - checkrangeattack2 84 - checkmeleeattack1 85 - checkmeleeattack2 86 - schedulechange 92 - canplaysequence 93 - canplaysentence2 94 - playsentence 95 - playscriptedsentence 96 - sentencestop 97 - getidealstate 98 - setactivity 99 - reportaistate 100 - checkenemy 101 - ftriangulate 102 - setyawspeed 103 - buildnearestroute 104 - findcover 105 - coverradius 107 - fcancheckattacks 108 - checkammo 109 - ignoreconditions 110 - fvalidatehinttype 111 - fcanactiveidle 112 - isoundmask 113 - hearingsensitivity 116 - barnaclevictimbitten 117 - barnaclevictimreleased 118 - preschedulethink 120 - getdeathactivity 121 - gibmonster 122 - hashumangibs 123 - hasaliengibs 124 - fademonster 125 - deathsound 127 - alertsound 128 - idlesound 129 - painsound 130 - stopfollowing 131 - - player_jump 134 - player_duck 135 - player_prethink 132 - player_postthink 133 - player_getgunposition 126 - player_shouldfadeondeath 66 - player_impulsecommands 137 - player_updateclientdata 136 - - item_addtoplayer 64 - item_addduplicate 65 - item_getiteminfo 66 - item_candeploy 67 - item_deploy 68 - item_canholster 73 - item_holster 74 - item_updateiteminfo 75 - item_preframe 76 - item_postframe 77 - item_drop 78 - item_kill 79 - item_attachtoplayer 80 - item_primaryammoindex 81 - item_secondaryammoindex 82 - item_updateclientdata 83 - item_getweaponptr 84 - item_itemslot 85 - - weapon_extractammo 86 - weapon_extractclipammo 87 - weapon_addweapon 88 - weapon_playemptysound 89 - weapon_resetemptysound 90 - weapon_isusable 92 - weapon_primaryattack 102 - weapon_secondaryattack 103 - weapon_reload 104 - weapon_weaponidle 105 - weapon_retireweapon 106 - weapon_shouldweaponidle 107 - weapon_usedecrement 108 - - dod_roundrespawn 0 - dod_roundrespawnent 1 - dod_roundstore 2 - dod_areasetindex 10 - dod_areasendstatus 11 - dod_getstate 15 - dod_getstateent 16 - dod_setscriptreset 119 - - dod_item_candrop 70 - dod_item_spawndeploy 69 - dod_item_setdmgtime 71 - dod_item_dropgren 72 - - dod_weapon_sendweaponanim 91 - dod_weapon_isuseable 92 - dod_weapon_aim 93 - dod_weapon_flaim 94 - dod_weapon_removestamina 95 - dod_weapon_changefov 96 - dod_weapon_zoomout 97 - dod_weapon_zoomin 98 - dod_weapon_getfov 99 - dod_weapon_playeriswatersniping 100 - dod_weapon_updatezoomspeed 101 - dod_weapon_special 105 -@end - -; TFC Does not have the following "standard" entries in its vtable: -; addpoints, addpointstoteam, getgunposition, teamid, usedecrement, updateclientdata -@section tfc linux - pev 4 - base 0x0 - - spawn 2 - precache 3 - keyvalue 4 - objectcaps 7 - activate 8 - setobjectcollisionbox 9 - classify 10 - deathnotice 11 - traceattack 12 - takedamage 13 - takehealth 14 - bloodcolor 16 - tracebleed 17 - mymonsterpointer 19 - mysquadmonsterpointer 20 - gettogglestate 21 - addplayeritem 22 - removeplayeritem 23 - getdelay 25 - ismoving 26 - overridereset 27 - damagedecal 28 - settogglestate 29 - startsneaking 30 - stopsneaking 31 - oncontrols 32 - issneaking 33 - isalive 34 - isbspmodel 35 - reflectgauss 36 - hastarget 37 - isinworld 38 - isplayer 39 - isnetclient 40 - getnexttarget 42 - think 43 - touch 44 - use 45 - blocked 46 - respawn 47 - updateowner 48 - fbecomeprone 49 - center 50 - eyeposition 51 - earposition 52 - bodytarget 53 - illumination 54 - fvisible 55 - fvecvisible 56 - - look 66 - changeyaw 69 - irelationship 71 - monsterinitdead 73 - becomedead 74 - bestvisibleenemy 76 - finviewcone 77 - fvecinviewcone 78 - - runai 67 - monsterthink 70 - monsterinit 72 - checklocalmove 79 - move 80 - moveexecute 81 - shouldadvanceroute 82 - getstoppedactivity 83 - stop 84 - checkrangeattack1 85 - checkrangeattack2 86 - checkmeleeattack1 87 - checkmeleeattack2 88 - schedulechange 94 - canplaysequence 95 - canplaysentence2 96 - playsentence 97 - playscriptedsentence 98 - sentencestop 99 - getidealstate 100 - setactivity 101 - reportaistate 102 - checkenemy 103 - ftriangulate 104 - setyawspeed 105 - buildnearestroute 106 - findcover 107 - coverradius 109 - fcancheckattacks 110 - checkammo 111 - ignoreconditions 112 - fvalidatehinttype 113 - fcanactiveidle 114 - isoundmask 115 - hearingsensitivity 118 - barnaclevictimbitten 119 - barnaclevictimreleased 120 - preschedulethink 121 - getdeathactivity 122 - gibmonster 123 - hashumangibs 124 - hasaliengibs 125 - fademonster 126 - deathsound 129 - alertsound 130 - idlesound 131 - painsound 132 - stopfollowing 133 - - player_jump 134 - player_duck 135 - player_prethink 136 - player_postthink 137 - player_shouldfadeondeath 68 - player_impulsecommands 138 - - item_addtoplayer 66 - item_addduplicate 67 - item_getiteminfo 69 - item_candeploy 70 - item_deploy 71 - item_canholster 72 - item_holster 73 - item_updateiteminfo 74 - item_preframe 75 - item_postframe 76 - item_drop 77 - item_kill 78 - item_attachtoplayer 79 - item_primaryammoindex 80 - item_secondaryammoindex 81 - item_updateclientdata 82 - item_getweaponptr 83 - item_itemslot 68 - - weapon_extractammo 84 - weapon_extractclipammo 85 - weapon_addweapon 86 - weapon_playemptysound 87 - weapon_resetemptysound 88 - weapon_sendweaponanim 89 - weapon_isusable 90 - weapon_primaryattack 91 - weapon_secondaryattack 92 - weapon_reload 93 - weapon_weaponidle 94 - weapon_retireweapon 95 - weapon_shouldweaponidle 96 - weapon_getnextattackdelay 97 - - tfc_killed 15 - tfc_istriggered 18 - tfc_giveammo 24 - tfc_dbgetitemname 41 - tfc_engineeruse 57 - tfc_finished 58 - tfc_empexplode 59 - tfc_calcempdmgrad 60 - tfc_takeempblast 61 - tfc_empremove 62 - tfc_takeconcussionblast 63 - tfc_concuss 64 - tfc_radiusdamage 127 - tfc_radiusdamage2 128 -@end -@section tfc windows - pev 4 - base 0x0 - - spawn 1 - precache 2 - keyvalue 3 - objectcaps 6 - activate 7 - setobjectcollisionbox 8 - classify 9 - deathnotice 10 - traceattack 11 - takedamage 12 - takehealth 13 - bloodcolor 15 - tracebleed 16 - mymonsterpointer 18 - mysquadmonsterpointer 19 - gettogglestate 20 - addplayeritem 21 - removeplayeritem 22 - getdelay 24 - ismoving 25 - overridereset 26 - damagedecal 27 - settogglestate 28 - startsneaking 29 - stopsneaking 30 - oncontrols 31 - issneaking 32 - isalive 33 - isbspmodel 34 - reflectgauss 35 - hastarget 36 - isinworld 37 - isplayer 38 - isnetclient 39 - getnexttarget 41 - think 42 - touch 43 - use 44 - blocked 45 - respawn 46 - updateowner 47 - fbecomeprone 48 - center 49 - eyeposition 50 - earposition 51 - bodytarget 52 - illumination 53 - fvisible 55 - fvecvisible 54 - - look 65 - changeyaw 68 - irelationship 70 - monsterinitdead 72 - becomedead 73 - bestvisibleenemy 75 - finviewcone 77 - fvecinviewcone 76 - - runai 66 - monsterthink 69 - monsterinit 71 - checklocalmove 78 - move 79 - moveexecute 80 - shouldadvanceroute 81 - getstoppedactivity 82 - stop 83 - checkrangeattack1 84 - checkrangeattack2 85 - checkmeleeattack1 86 - checkmeleeattack2 87 - schedulechange 93 - canplaysequence 94 - canplaysentence2 95 - playsentence 96 - playscriptedsentence 97 - sentencestop 98 - getidealstate 99 - setactivity 100 - reportaistate 101 - checkenemy 102 - ftriangulate 103 - setyawspeed 104 - buildnearestroute 105 - findcover 106 - coverradius 108 - fcancheckattacks 109 - checkammo 110 - ignoreconditions 111 - fvalidatehinttype 112 - fcanactiveidle 113 - isoundmask 114 - hearingsensitivity 117 - barnaclevictimbitten 118 - barnaclevictimreleased 119 - preschedulethink 120 - getdeathactivity 121 - gibmonster 122 - hashumangibs 123 - hasaliengibs 124 - fademonster 125 - deathsound 128 - alertsound 129 - idlesound 130 - painsound 131 - stopfollowing 132 - - player_jump 133 - player_duck 134 - player_prethink 135 - player_postthink 136 - player_shouldfadeondeath 67 - player_impulsecommands 137 - - item_addtoplayer 65 - item_addduplicate 66 - item_getiteminfo 68 - item_candeploy 69 - item_deploy 70 - item_canholster 71 - item_holster 72 - item_updateiteminfo 73 - item_preframe 74 - item_postframe 75 - item_drop 76 - item_kill 77 - item_attachtoplayer 78 - item_primaryammoindex 79 - item_secondaryammoindex 80 - item_updateclientdata 81 - item_getweaponptr 82 - item_itemslot 67 - - weapon_extractammo 83 - weapon_extractclipammo 84 - weapon_addweapon 85 - weapon_playemptysound 86 - weapon_resetemptysound 87 - weapon_sendweaponanim 88 - weapon_isusable 89 - weapon_primaryattack 90 - weapon_secondaryattack 91 - weapon_reload 92 - weapon_weaponidle 93 - weapon_retireweapon 94 - weapon_shouldweaponidle 95 - wepaon_getnextattackdelay 96 - - tfc_killed 14 - tfc_istriggered 17 - tfc_giveammo 23 - tfc_dbgetitemname 40 - tfc_engineeruse 56 - tfc_finished 57 - tfc_empexplode 58 - tfc_calcempdmgrad 59 - tfc_takeempblast 60 - tfc_empremove 61 - tfc_takeconcussionblast 62 - tfc_concuss 63 - tfc_radiusdamage 127 - tfc_radiusdamage2 126 -@end - -@section tfc mac - pev 4 - base 0x0 - - spawn 1 - precache 2 - keyvalue 3 - objectcaps 6 - activate 7 - setobjectcollisionbox 8 - classify 9 - deathnotice 10 - traceattack 11 - takedamage 12 - takehealth 13 - bloodcolor 15 - tracebleed 16 - mymonsterpointer 18 - mysquadmonsterpointer 19 - gettogglestate 20 - addplayeritem 21 - removeplayeritem 22 - getdelay 24 - ismoving 25 - overridereset 26 - damagedecal 27 - settogglestate 28 - startsneaking 29 - stopsneaking 30 - oncontrols 31 - issneaking 32 - isalive 33 - isbspmodel 34 - reflectgauss 35 - hastarget 36 - isinworld 37 - isplayer 38 - isnetclient 39 - getnexttarget 41 - think 42 - touch 43 - use 44 - blocked 45 - respawn 46 - updateowner 47 - fbecomeprone 48 - center 49 - eyeposition 50 - earposition 51 - bodytarget 52 - illumination 53 - fvisible 54 - fvecvisible 55 - - look 65 - changeyaw 68 - irelationship 70 - monsterinitdead 72 - becomedead 73 - bestvisibleenemy 75 - finviewcone 76 - fvecinviewcone 77 - - runai 66 - monsterthink 69 - monsterinit 71 - checklocalmove 78 - move 79 - moveexecute 80 - shouldadvanceroute 81 - getstoppedactivity 82 - stop 83 - checkrangeattack1 84 - checkrangeattack2 85 - checkmeleeattack1 86 - checkmeleeattack2 87 - schedulechange 93 - canplaysequence 94 - canplaysentence2 95 - playsentence 96 - playscriptedsentence 97 - sentencestop 98 - getidealstate 99 - setactivity 100 - reportaistate 101 - checkenemy 102 - ftriangulate 103 - setyawspeed 104 - buildnearestroute 105 - findcover 106 - coverradius 108 - fcancheckattacks 109 - checkammo 110 - ignoreconditions 111 - fvalidatehinttype 112 - fcanactiveidle 113 - isoundmask 114 - hearingsensitivity 117 - barnaclevictimbitten 118 - barnaclevictimreleased 119 - preschedulethink 120 - getdeathactivity 121 - gibmonster 122 - hashumangibs 123 - hasaliengibs 124 - fademonster 125 - deathsound 128 - alertsound 129 - idlesound 130 - painsound 131 - stopfollowing 132 - - player_jump 133 - player_duck 134 - player_prethink 135 - player_postthink 136 - player_shouldfadeondeath 67 - player_impulsecommands 137 - - item_addtoplayer 65 - item_addduplicate 66 - item_getiteminfo 68 - item_candeploy 69 - item_deploy 70 - item_canholster 71 - item_holster 72 - item_updateiteminfo 73 - item_preframe 74 - item_postframe 75 - item_drop 76 - item_kill 77 - item_attachtoplayer 78 - item_primaryammoindex 79 - item_secondaryammoindex 80 - item_updateclientdata 81 - item_getweaponptr 82 - item_itemslot 67 - - weapon_extractammo 83 - weapon_extractclipammo 84 - weapon_addweapon 85 - weapon_playemptysound 86 - weapon_resetemptysound 87 - weapon_sendweaponanim 88 - weapon_isusable 89 - weapon_primaryattack 90 - weapon_secondaryattack 91 - weapon_reload 92 - weapon_weaponidle 93 - weapon_retireweapon 94 - weapon_shouldweaponidle 95 - weapon_getnextattackdelay 96 - - tfc_killed 14 - tfc_istriggered 17 - tfc_giveammo 23 - tfc_dbgetitemname 40 - tfc_engineeruse 56 - tfc_finished 57 - tfc_empexplode 58 - tfc_calcempdmgrad 59 - tfc_takeempblast 60 - tfc_empremove 61 - tfc_takeconcussionblast 62 - tfc_concuss 63 - tfc_radiusdamage 126 - tfc_radiusdamage2 127 -@end - -; ns's linux binary is compiled with gcc 3.3, so the "base" is 0, and pev is 4 -@section ns linux - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 14 - bloodcolor 16 - tracebleed 17 - istriggered 18 - mymonsterpointer 19 - mysquadmonsterpointer 20 - gettogglestate 21 - addpoints 22 - addpointstoteam 23 - addplayeritem 24 - removeplayeritem 25 - giveammo 26 - getdelay 27 - ismoving 28 - overridereset 29 - damagedecal 30 - settogglestate 31 - startsneaking 32 - stopsneaking 33 - oncontrols 34 - issneaking 35 - isalive 36 - isbspmodel 37 - reflectgauss 38 - hastarget 39 - isinworld 40 - isplayer 41 - isnetclient 42 - teamid 43 - getnexttarget 46 - think 47 - touch 48 - use 49 - blocked 50 - respawn 52 - updateowner 53 - fbecomeprone 54 - center 55 - eyeposition 56 - earposition 57 - bodytarget 58 - illumination 59 - fvisible 60 - fvecvisible 61 - - changeyaw 65 - hashumangibs 66 - hasaliengibs 67 - fademonster 68 - gibmonster 69 - getdeathactivity 70 - becomedead 71 - irelationship 73 - painsound 74 - reportaistate 75 - monsterinitdead 76 - look 77 - bestvisibleenemy 78 - finviewcone 80 - fvecinviewcone 81 - - player_jump 83 - player_duck 84 - player_prethink 85 - player_postthink 86 - player_getgunposition 87 - player_shouldfadeondeath 72 - player_impulsecommands 101 - player_updateclientdata 99 - - item_addtoplayer 64 - item_addduplicate 65 - item_getiteminfo 68 - item_candeploy 69 - item_deploy 70 - item_canholster 71 - item_holster 72 - item_updateiteminfo 74 - item_preframe 75 - item_postframe 76 - item_drop 77 - item_kill 78 - item_attachtoplayer 79 - item_primaryammoindex 80 - item_secondaryammoindex 81 - item_updateclientdata 82 - item_getweaponptr 83 - item_itemslot 84 - - weapon_extractammo 85 - weapon_extractclipammo 86 - weapon_addweapon 87 - weapon_playemptysound 88 - weapon_resetemptysound 89 - weapon_sendweaponanim 94 - weapon_isusable 73 - weapon_primaryattack 98 - weapon_secondaryattack 99 - weapon_reload 100 - weapon_weaponidle 101 - weapon_retireweapon 102 - weapon_shouldweaponidle 103 - weapon_usedecrement 104 - - ns_getpointvalue 13 - ns_awardkill 15 - ns_resetentity 45 - ns_updateonremove 51 - ns_setbonecontroller 63 - ns_savedataforreset 64 - ns_gethull 79 - ns_getmaxwalkspeed 88 - ns_setteamid 90 - ns_geteffectiveplayerclass 91 - ns_getauthenticationmask 92 - ns_effectiveplayerclasschanged 93 - ns_needsteamupdate 94 - ns_sendteamupdate 95 - ns_sendweaponupdate 96 - ns_initplayerfromspawn 97 - ns_packdeadplayeritems 98 - ns_getanimationforactivity 100 - ns_startobserver 102 - ns_stopobserver 103 - ns_getadrenalinefactor 104 - ns_givenameditem 106 - ns_suicide 107 - ns_getcanuseweapon 108 - - ns_weapon_getweaponprimetime 90 - ns_weapon_primeweapon 91 - ns_weapon_getisweaponprimed 92 - ns_weapon_getisweaponpriming 93 - ns_weapon_defaultdeploy 95 - ns_weapon_defaultreload 96 - ns_weapon_getdeploytime 97 -@end - -@section ns windows - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 14 - bloodcolor 16 - tracebleed 17 - istriggered 18 - mymonsterpointer 19 - mysquadmonsterpointer 20 - gettogglestate 21 - addpoints 22 - addpointstoteam 23 - addplayeritem 24 - removeplayeritem 25 - giveammo 26 - getdelay 27 - ismoving 28 - overridereset 29 - damagedecal 30 - settogglestate 31 - startsneaking 32 - stopsneaking 33 - oncontrols 34 - issneaking 35 - isalive 36 - isbspmodel 37 - reflectgauss 38 - hastarget 39 - isinworld 40 - isplayer 41 - isnetclient 42 - teamid 43 - getnexttarget 46 - think 47 - touch 48 - use 49 - blocked 50 - respawn 52 - updateowner 53 - fbecomeprone 54 - center 55 - eyeposition 56 - earposition 57 - bodytarget 58 - illumination 59 - fvisible 60 - fvecvisible 61 - - changeyaw 65 - hashumangibs 66 - hasaliengibs 67 - fademonster 68 - gibmonster 69 - getdeathactivity 70 - becomedead 71 - irelationship 73 - painsound 74 - reportaistate 75 - monsterinitdead 76 - look 77 - bestvisibleenemy 78 - finviewcone 80 - fvecinviewcone 81 - - player_jump 83 - player_duck 84 - player_prethink 85 - player_postthink 86 - player_getgunposition 87 - player_shouldfadeondeath 72 - player_impulsecommands 101 - player_updateclientdata 99 - - item_addtoplayer 64 - item_addduplicate 65 - item_getiteminfo 68 - item_candeploy 69 - item_deploy 70 - item_canholster 71 - item_holster 72 - item_updateiteminfo 74 - item_preframe 75 - item_postframe 76 - item_drop 77 - item_kill 78 - item_attachtoplayer 79 - item_primaryammoindex 80 - item_secondaryammoindex 81 - item_updateclientdata 82 - item_getweaponptr 83 - item_itemslot 84 - - weapon_extractammo 85 - weapon_extractclipammo 86 - weapon_addweapon 87 - weapon_playemptysound 88 - weapon_resetemptysound 89 - weapon_sendweaponanim 94 - weapon_isusable 73 - weapon_primaryattack 98 - weapon_secondaryattack 99 - weapon_reload 100 - weapon_weaponidle 101 - weapon_retireweapon 102 - weapon_shouldweaponidle 103 - weapon_usedecrement 104 - - ns_getpointvalue 13 - ns_awardkill 15 - ns_resetentity 45 - ns_updateonremove 51 - ns_setbonecontroller 63 - ns_savedataforreset 64 - ns_gethull 79 - ns_getmaxwalkspeed 88 - ns_setteamid 90 - ns_geteffectiveplayerclass 91 - ns_getauthenticationmask 92 - ns_effectiveplayerclasschanged 93 - ns_needsteamupdate 94 - ns_sendteamupdate 95 - ns_sendweaponupdate 96 - ns_initplayerfromspawn 97 - ns_packdeadplayeritems 98 - ns_getanimationforactivity 100 - ns_startobserver 102 - ns_stopobserver 103 - ns_getadrenalinefactor 104 - ns_givenameditem 106 - ns_suicide 107 - ns_getcanuseweapon 108 - - ns_weapon_getweaponprimetime 90 - ns_weapon_primeweapon 91 - ns_weapon_getisweaponprimed 92 - ns_weapon_getisweaponpriming 93 - ns_weapon_defaultdeploy 95 - ns_weapon_defaultreload 96 - ns_weapon_getdeploytime 97 -@end - -@section ts linux - pev 0 - base 0x60 - - spawn 9 - precache 10 - keyvalue 11 - objectcaps 14 - activate 15 - setobjectcollisionbox 18 - classify 19 - deathnotice 20 - traceattack 21 - takedamage 22 - takehealth 23 - killed 24 - bloodcolor 25 - tracebleed 26 - istriggered 27 - mymonsterpointer 28 - mysquadmonsterpointer 29 - gettogglestate 30 - addpoints 31 - addpointstoteam 32 - addplayeritem 33 - removeplayeritem 34 - giveammo 35 - getdelay 36 - ismoving 37 - overridereset 38 - damagedecal 39 - settogglestate 40 - startsneaking 41 - stopsneaking 42 - oncontrols 43 - issneaking 44 - isalive 45 - isbspmodel 46 - reflectgauss 47 - hastarget 48 - isinworld 49 - isplayer 50 - isnetclient 51 - teamid 52 - getnexttarget 53 - think 54 - touch 55 - use 56 - blocked 57 - respawn 59 - updateowner 60 - fbecomeprone 61 - center 62 - eyeposition 63 - earposition 64 - bodytarget 65 - illumination 66 - fvisible 67 - fvecvisible 68 - - changeyaw 70 - hashumangibs 71 - hasaliengibs 72 - fademonster 73 - gibmonster 74 - getdeathactivity 75 - becomedead 76 - irelationship 78 - painsound 79 - reportaistate 80 - monsterinitdead 81 - look 82 - bestvisibleenemy 83 - finviewcone 84 - fvecinviewcone 85 - - player_jump 86 - player_duck 87 - player_prethink 88 - player_postthink 89 - player_getgunposition 90 - player_shouldfadeondeath 77 - player_impulsecommands 92 - player_updateclientdata 91 - - item_addtoplayer 70 - item_addduplicate 71 - item_candeploy 73 - item_deploy 74 - item_canholster 75 - item_holster 76 - item_updateiteminfo 77 - item_preframe 78 - item_postframe 79 - item_drop 80 - item_kill 81 - item_attachtoplayer 82 - item_primaryammoindex 83 - item_secondaryammoindex 84 - item_updateclientdata 85 - item_getweaponptr 86 - item_itemslot 87 - - weapon_extractammo 88 - weapon_extractclipammo 89 - weapon_addweapon 90 - weapon_playemptysound 91 - weapon_resetemptysound 92 - weapon_sendweaponanim 93 - weapon_isusable 94 - weapon_primaryattack 95 - weapon_secondaryattack 96 - weapon_reload 98 - weapon_weaponidle 99 - weapon_retireweapon 100 - weapon_shouldweaponidle 101 - weapon_usedecrement 102 - - ts_breakablerespawn 2 - ts_canusedthroughwalls 3 - ts_giveslowmul 4 - ts_goslow 5 - ts_inslow 6 - ts_isobjective 7 - ts_enableobjective 8 - ts_onfreeentprivatedata 12 - ts_shouldcollide 13 - - ts_weapon_alternateattack 97 -@end -@section ts windows - pev 4 - base 0x0 - - spawn 7 - precache 8 - keyvalue 9 - objectcaps 12 - activate 13 - setobjectcollisionbox 16 - classify 17 - deathnotice 18 - traceattack 19 - takedamage 20 - takehealth 21 - killed 22 - bloodcolor 23 - tracebleed 24 - istriggered 25 - mymonsterpointer 26 - mysquadmonsterpointer 27 - gettogglestate 28 - addpoints 29 - addpointstoteam 30 - addplayeritem 31 - removeplayeritem 32 - giveammo 33 - getdelay 34 - ismoving 35 - overridereset 36 - damagedecal 37 - settogglestate 38 - startsneaking 39 - stopsneaking 40 - oncontrols 41 - issneaking 42 - isalive 43 - isbspmodel 44 - reflectgauss 45 - hastarget 46 - isinworld 47 - isplayer 48 - isnetclient 49 - teamid 50 - getnexttarget 51 - think 52 - touch 53 - use 54 - blocked 55 - respawn 57 - updateowner 58 - fbecomeprone 59 - center 60 - eyeposition 61 - earposition 62 - bodytarget 63 - illumination 64 - fvisible 65 - fvecvisible 66 - - changeyaw 68 - hashumangibs 69 - hasaliengibs 70 - fademonster 71 - gibmonster 72 - getdeathactivity 73 - becomedead 74 - irelationship 76 - painsound 77 - reportaistate 78 - monsterinitdead 79 - look 80 - bestvisibleenemy 81 - finviewcone 82 - fvecinviewcone 83 - - player_jump 84 - player_duck 85 - player_prethink 86 - player_postthink 87 - player_getgunposition 88 - player_shouldfadeondeath 75 - player_impulsecommands 90 - player_updateclientdata 89 - - item_addtoplayer 68 - item_addduplicate 69 - item_candeploy 71 - item_deploy 72 - item_canholster 73 - item_holster 74 - item_updateiteminfo 75 - item_preframe 76 - item_postframe 77 - item_drop 78 - item_kill 79 - item_attachtoplayer 80 - item_primaryammoindex 81 - item_secondaryammoindex 82 - item_updateclientdata 83 - item_getweaponptr 84 - item_itemslot 85 - - weapon_extractammo 86 - weapon_extractclipammo 87 - weapon_addweapon 88 - weapon_playemptysound 89 - weapon_resetemptysound 90 - weapon_sendweaponanim 91 - weapon_isusable 92 - weapon_primaryattack 93 - weapon_secondaryattack 94 - weapon_reload 96 - weapon_weaponidle 97 - weapon_retireweapon 98 - weapon_shouldweaponidle 99 - weapon_usedecrement 100 - - ts_breakablerespawn 0 - ts_canusedthroughwalls 1 - ts_giveslowmul 2 - ts_goslow 3 - ts_inslow 4 - ts_isobjective 5 - ts_enableobjective 6 - ts_onfreeentprivatedata 10 - ts_shouldcollide 11 - - ts_weapon_alternateattack 95 -@end - -; Sven-Coop 5.17 -@section svencoop linux - pev 4 - base 0x0 - - spawn 1 - precache 3 - keyvalue 4 - objectcaps 9 - activate 10 - setobjectcollisionbox 11 - irelationship 14 - classify 15 - deathnotice 16 - traceattack 17 - takedamage 18 - killed 21 - bloodcolor 22 - tracebleed 23 - mymonsterpointer 25 - mysquadmonsterpointer 26 - gettogglestate 29 - addplayeritem 32 - getdelay 35 - overridereset 37 - damagedecal 38 - settogglestate 39 - startsneaking 40 - stopsneaking 41 - teamid 55 - getnexttarget 57 - think 58 - touch 59 - use 60 - blocked 61 - respawn 63 - updateowner 66 - fbecomeprone 67 - center 68 - eyeposition 69 - earposition 70 - bodytarget 71 - illumination 72 - - look 100 - runai 101 - changeyaw 104 - monsterthink 106 - monsterinit 107 - monsterinitdead 108 - becomedead 109 - bestvisibleenemy 112 - finviewcone 113 - fvecinviewcone 114 - checklocalmove 115 - move 116 - moveexecute 117 - shouldadvanceroute 118 - getstoppedactivity 119 - stop 120 - checkrangeattack1 121 - checkrangeattack2 123 - checkmeleeattack1 125 - checkmeleeattack2 127 - schedulechange 135 - playsentence 138 - sentencestop 140 - getidealstate 141 - setactivity 142 - reportaistate 144 - checkenemy 145 - setyawspeed 148 - buildnearestroute 149 - findcover 150 - coverradius 155 - fcancheckattacks 156 - checkammo 158 - ignoreconditions 159 - fvalidatehinttype 160 - fcanactiveidle 161 - isoundmask 162 - hearingsensitivity 165 - barnaclevictimbitten 166 - barnaclevictimreleased 167 - preschedulethink 174 - getdeathactivity 175 - gibmonster 176 - hashumangibs 178 - hasaliengibs 179 - fademonster 180 - deathsound 184 - alertsound 185 - idlesound 186 - painsound 187 - - player_getgunposition 181 - player_jump 208 - player_duck 209 - player_prethink 210 - player_postthink 211 - player_updateclientdata 216 - player_impulsecommands 217 - - item_holster 118 - item_updateiteminfo 119 - item_preframe 120 - item_postframe 121 - item_drop 132 - item_kill 102 - item_attachtoplayer 124 - item_primaryammoindex 126 - item_secondaryammoindex 127 - item_getweaponptr 129 - item_itemslot 130 - - weapon_extractammo 135 - weapon_extractclipammo 136 - weapon_resetemptysound 141 - weapon_sendweaponanim 142 - weapon_primaryattack 145 - weapon_secondaryattack 146 - weapon_reload 148 - weapon_weaponidle 151 - weapon_retireweapon 152 - - sc_prespawn 0 - sc_postspawn 2 - sc_onkeyvalueupdate 6 - sc_getclassification 12 - sc_setclassification 13 - sc_takehealth 19 - sc_takearmor 20 - sc_istriggered 24 - sc_mycustompointer 27 - sc_myitempointer 28 - sc_addpoints 30 - sc_addpointstoteam 31 - sc_removeplayeritem 33 - sc_giveammo 34 - sc_ismoving 36 - sc_oncontrols 42 - sc_issneaking 43 - sc_isalive 44 - sc_isbspmodel 45 - sc_reflectgauss 46 - sc_hastarget 47 - sc_isinworld 48 - sc_ismonster 49 - sc_isplayer 50 - sc_isnetclient 51 - sc_ispointentity 52 - sc_isbreakable 53 - sc_ismachine 54 - sc_criticalremove 56 - sc_updateonremove 62 - sc_subusetargets 64 - sc_islockedbymaster 65 - sc_fbecomeprone 67 - sc_fvisible 73 - sc_fvecvisible 74 - sc_fvisiblefrompos 75 - sc_isfacing 76 - sc_getpointsfordamage 77 - sc_getdamagepoints 78 - sc_setplayerally 79 - sc_oncreate 82 - sc_ondestroy 83 - sc_onsetoriginbymap 84 - sc_isrevivable 85 - sc_beginrevive 86 - sc_endrevive 87 - sc_shouldfadeondeath 103 - sc_setupfriendly 105 - sc_revive 110 - sc_startmonster 111 - sc_checkrangeattack1_move 122 - sc_checkrangeattack2_move 124 - sc_checkmeleeattack1_move 126 - sc_checkmeleeattack2_move 128 - sc_checktankusage 129 - sc_canplaysequence 136 - sc_canplaysentence2 137 - sc_playscriptedsentence 139 - sc_setgaitactivity 143 - sc_ftriangulate 145 - sc_ftriangulateextension 147 - sc_findcovergrenade 151 - sc_findcoverdistance 152 - sc_findattackpoint 153 - sc_fvalidatecover 154 - sc_checkattacker 157 - sc_nofriendlyfire1 168 - sc_nofriendlyfire2 169 - sc_nofriendlyfire3 170 - sc_nofriendlyfiretopos 171 - sc_fvisiblegunpos 172 - sc_finbulletcone 173 - sc_callgibmonster 177 - sc_checktimebaseddamage 182 - sc_isplayerfollowing 189 - sc_startplayerfollowing 193 - sc_stopplayerfollowing 194 - sc_usesound 196 - sc_unusesound 197 - sc_ridemonster 198 - sc_checkandapplygenericattacks 19ç - sc_checkscared 200 - sc_checkcreaturedanger 201 - sc_checkfalldamage 202 - sc_checkrevival 203 - sc_mediccallsound 206 - - sc_player_specialspawn 207 - sc_player_enteredobserver 212 - sc_player_leftobserver 213 - sc_player_isobserver 214 - sc_player_isconnected 215 - sc_player_isvalidinfoentity 218 - sc_player_levelend 219 - sc_player_votestarted 220 - sc_player_canstartnextvote 221 - sc_player_vote 222 - sc_player_hasvoted 223 - sc_player_resetvote 224 - sc_player_lastvoteinput 225 - sc_player_initvote 226 - sc_player_timetostartnextvote 227 - sc_player_resetview 228 - sc_player_getlogfrequency 229 - sc_player_logplayerstats 230 - - sc_item_materialize 100 - sc_item_cancollect 105 - sc_item_collect 106 - sc_item_addtoplayer 110 - sc_item_addduplicate 111 - sc_item_addammofromitem 112 - sc_item_getpickupsound 113 - sc_item_getiteminfo 114 - sc_item_candeploy 115 - sc_item_deploy 116 - sc_item_canholster 117 - sc_item_inactiveitempreframe 122 - sc_item_inactiveitempostframe 123 - sc_item_detachfromplayer 125 - sc_item_updateclientdata 128 - sc_item_getrespawntime 131 - sc_item_canhaveduplicates 133 - - sc_weapon_extractammofromitem 134 - sc_weapon_addweapon 137 - sc_weapon_getammo1drop 138 - sc_weapon_getammo2drop 139 - sc_weapon_playemptysound 140 - sc_weapon_bulletaccuracy 143 - sc_weapon_isusable 144 - sc_weapon_tertiaryattack 147 - sc_weapon_finishreload 149 - sc_weapon_shouldreload 150 - sc_weapon_shouldweaponidle 153 - sc_weapon_usedecrement 154 - sc_weapon_burstsupplement 155 - sc_weapon_getp_model 156 - sc_weapon_getw_model 157 - sc_weapon_getv_model 158 - sc_weapon_precachecustommodels 159 - sc_weapon_ismultiplayer 162 - sc_weapon_frunfuncs 163 - sc_weapon_setfov 164 - sc_weapon_fcanrun 165 - sc_weapon_customdecrement 166 - sc_weapon_setv_model 167 - sc_weapon_setp_model 168 - sc_weapon_changeweaponskin 169 -@end - -; Sven-Coop 5.17 -@section svencoop windows - pev 4 - base 0x0 - - spawn 1 - precache 3 - keyvalue 4 - objectcaps 9 - activate 10 - setobjectcollisionbox 11 - irelationship 14 - classify 15 - deathnotice 16 - traceattack 17 - takedamage 18 - killed 21 - bloodcolor 22 - tracebleed 23 - mymonsterpointer 25 - mysquadmonsterpointer 26 - gettogglestate 29 - addplayeritem 32 - getdelay 35 - overridereset 37 - damagedecal 38 - settogglestate 39 - startsneaking 40 - stopsneaking 41 - teamid 55 - getnexttarget 57 - think 58 - touch 59 - use 60 - blocked 61 - respawn 63 - updateowner 66 - center 68 - eyeposition 69 - earposition 70 - bodytarget 71 - illumination 72 - - look 99 - runai 100 - changeyaw 103 - monsterthink 105 - monsterinit 106 - monsterinitdead 107 - becomedead 108 - bestvisibleenemy 110 - finviewcone 113 - fvecinviewcone 112 - checklocalmove 114 - move 115 - moveexecute 116 - shouldadvanceroute 117 - getstoppedactivity 118 - stop 119 - checkrangeattack1 120 - checkrangeattack2 122 - checkmeleeattack1 124 - checkmeleeattack2 126 - schedulechange 134 - playsentence 137 - sentencestop 139 - getidealstate 140 - setactivity 141 - reportaistate 143 - checkenemy 144 - setyawspeed 147 - buildnearestroute 148 - findcover 149 - coverradius 154 - fcancheckattacks 155 - checkammo 157 - ignoreconditions 158 - fvalidatehinttype 159 - fcanactiveidle 160 - isoundmask 161 - hearingsensitivity 164 - barnaclevictimbitten 165 - barnaclevictimreleased 166 - preschedulethink 173 - getdeathactivity 174 - gibmonster 175 - hashumangibs 177 - hasaliengibs 178 - fademonster 179 - deathsound 183 - alertsound 184 - idlesound 185 - painsound 186 - - player_getgunposition 180 - player_jump 207 - player_duck 208 - player_prethink 209 - player_postthink 210 - player_updateclientdata 215 - player_impulsecommands 216 - - item_holster 117 - item_updateiteminfo 118 - item_preframe 119 - item_postframe 120 - item_drop 131 - item_kill 101 - item_attachtoplayer 123 - item_primaryammoindex 125 - item_secondaryammoindex 126 - item_getweaponptr 128 - item_itemslot 129 - - weapon_extractammo 134 - weapon_extractclipammo 135 - weapon_resetemptysound 140 - weapon_sendweaponanim 141 - weapon_primaryattack 144 - weapon_secondaryattack 145 - weapon_reload 147 - weapon_weaponidle 150 - weapon_retireweapon 151 - - sc_prespawn 0 - sc_postspawn 2 - sc_onkeyvalueupdate 6 - sc_getclassification 12 - sc_setclassification 13 - sc_takehealth 19 - sc_takearmor 20 - sc_istriggered 24 - sc_mycustompointer 27 - sc_myitempointer 28 - sc_addpoints 30 - sc_addpointstoteam 31 - sc_removeplayeritem 33 - sc_giveammo 34 - sc_ismoving 36 - sc_oncontrols 42 - sc_issneaking 43 - sc_isalive 44 - sc_isbspmodel 45 - sc_reflectgauss 46 - sc_hastarget 47 - sc_isinworld 48 - sc_ismonster 49 - sc_isplayer 50 - sc_isnetclient 51 - sc_ispointentity 52 - sc_isbreakable 53 - sc_ismachine 54 - sc_criticalremove 56 - sc_updateonremove 62 - sc_subusetargets 64 - sc_islockedbymaster 65 - sc_fbecomeprone 67 - sc_fvecvisible 73 - sc_fvisible 74 - sc_fvisiblefrompos 75 - sc_isfacing 76 - sc_getpointsfordamage 77 - sc_getdamagepoints 78 - sc_setplayerally 79 - sc_oncreate 81 - sc_ondestroy 82 - sc_onsetoriginbymap 83 - sc_isrevivable 84 - sc_beginrevive 85 - sc_endrevive 86 - sc_shouldfadeondeath 102 - sc_setupfriendly 104 - sc_revive 109 - sc_startmonster 110 - sc_checkrangeattack1_move 121 - sc_checkrangeattack2_move 123 - sc_checkmeleeattack1_move 125 - sc_checkmeleeattack2_move 127 - sc_checktankusage 128 - sc_canplaysequence 135 - sc_canplaysentence2 136 - sc_playscriptedsentence 138 - sc_setgaitactivity 142 - sc_ftriangulate 145 - sc_ftriangulateextension 146 - sc_findcovergrenade 150 - sc_findcoverdistance 151 - sc_findattackpoint 152 - sc_fvalidatecover 153 - sc_checkattacker 156 - sc_nofriendlyfire1 169 - sc_nofriendlyfire2 168 - sc_nofriendlyfire3 167 - sc_nofriendlyfiretopos 170 - sc_fvisiblegunpos 171 - sc_finbulletcone 172 - sc_callgibmonster 176 - sc_checktimebaseddamage 181 - sc_isplayerfollowing 188 - sc_startplayerfollowing 192 - sc_stopplayerfollowing 193 - sc_usesound 195 - sc_unusesound 196 - sc_ridemonster 197 - sc_checkandapplygenericattacks 198 - sc_checkscared 199 - sc_checkcreaturedanger 200 - sc_checkfalldamage 201 - sc_checkrevival 202 - sc_mediccallsound 205 - - sc_player_specialspawn 206 - sc_player_enteredobserver 211 - sc_player_leftobserver 212 - sc_player_isobserver 213 - sc_player_isconnected 214 - sc_player_isvalidinfoentity 217 - sc_player_levelend 218 - sc_player_votestarted 219 - sc_player_canstartnextvote 220 - sc_player_vote 221 - sc_player_hasvoted 222 - sc_player_resetvote 223 - sc_player_lastvoteinput 224 - sc_player_initvote 225 - sc_player_timetostartnextvote 226 - sc_player_resetview 227 - sc_player_getlogfrequency 228 - sc_player_logplayerstats 229 - - sc_item_materialize 99 - sc_item_cancollect 104 - sc_item_collect 105 - sc_item_addtoplayer 109 - sc_item_addduplicate 110 - sc_item_addammofromitem 111 - sc_item_getpickupsound 112 - sc_item_getiteminfo 113 - sc_item_candeploy 114 - sc_item_deploy 115 - sc_item_canholster 116 - sc_item_inactiveitempreframe 121 - sc_item_inactiveitempostframe 122 - sc_item_detachfromplayer 125 - sc_item_updateclientdata 127 - sc_item_getrespawntime 130 - sc_item_canhaveduplicates 132 - - sc_weapon_extractammofromitem 133 - sc_weapon_addweapon 136 - sc_weapon_getammo1drop 137 - sc_weapon_getammo2drop 138 - sc_weapon_playemptysound 139 - sc_weapon_bulletaccuracy 142 - sc_weapon_isusable 143 - sc_weapon_tertiaryattack 146 - sc_weapon_finishreload 148 - sc_weapon_shouldreload 149 - sc_weapon_shouldweaponidle 152 - sc_weapon_usedecrement 153 - sc_weapon_burstsupplement 154 - sc_weapon_getp_model 155 - sc_weapon_getw_model 156 - sc_weapon_getv_model 157 - sc_weapon_precachecustommodels 158 - sc_weapon_ismultiplayer 161 - sc_weapon_frunfuncs 162 - sc_weapon_setfov 163 - sc_weapon_fcanrun 164 - sc_weapon_customdecrement 165 - sc_weapon_setv_model 166 - sc_weapon_setp_model 167 - sc_weapon_changeweaponskin 168 -@end - -; Earth's Special Forces 1.2.3 -@section esf linux - pev 0 - base 0x60 - - spawn 2 - precache 3 - keyvalue 4 - objectcaps 7 - activate 8 - setobjectcollisionbox 9 - classify 10 - deathnotice 11 - traceattack 12 - takedamage 13 - takehealth 14 - killed 15 - bloodcolor 16 - tracebleed 17 - istriggered 18 - mymonsterpointer 19 - mysquadmonsterpointer 20 - gettogglestate 21 - addpoints 22 - addpointstoteam 23 - addplayeritem 24 - removeplayeritem 25 - getdelay 26 - ismoving 27 - overridereset 28 - damagedecal 29 - settogglestate 30 - startsneaking 31 - stopsneaking 32 - oncontrols 33 - issneaking 34 - isalive 35 - isbspmodel 36 - reflectgauss 37 - hastarget 38 - isinworld 39 - isplayer 40 - isnetclient 41 - teamid 42 - getnexttarget 43 - think 44 - touch 45 - use 46 - blocked 47 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvisible 56 - fvecvisible 57 - - look 59 - changeyaw 62 - irelationship 64 - monsterinitdead 66 - becomedead 67 - bestvisibleenemy 69 - finviewcone 70 - fvecinviewcone 71 - - runai 60 - monsterthink 63 - monsterinit 65 - checklocalmove 72 - move 73 - moveexecute 74 - shouldadvanceroute 75 - getstoppedactivity 76 - stop 77 - checkrangeattack1 78 - checkrangeattack2 79 - checkmeleeattack1 80 - checkmeleeattack2 81 - schedulechange 87 - canplaysequence 88 - canplaysentence2 89 - playsentence 90 - playscriptedsentence 91 - sentencestop 92 - getidealstate 93 - setactivity 94 - reportaistate 95 - checkenemy 96 - ftriangulate 97 - setyawspeed 98 - buildnearestroute 99 - findcover 100 - coverradius 102 - fcancheckattacks 103 - checkammo 104 - ignoreconditions 105 - fvalidatehinttype 106 - fcanactiveidle 107 - isoundmask 108 - hearingsensitivity 111 - barnaclevictimbitten 112 - barnaclevictimreleased 113 - preschedulethink 114 - getdeathactivity 115 - gibmonster 116 - hashumangibs 117 - hasaliengibs 118 - fademonster 119 - deathsound 121 - alertsound 122 - idlesound 123 - painsound 124 - stopfollowing 125 - - player_jump 126 - player_prethink 127 - player_postthink 128 - player_getgunposition 120 - player_shouldfadeondeath 61 - player_impulsecommands 130 - player_updateclientdata 129 - - item_addtoplayer 59 - item_addduplicate 60 - item_getiteminfo 61 - item_candeploy 62 - item_deploy 63 - item_canholster 64 - item_holster 65 - item_updateiteminfo 66 - item_preframe 67 - item_postframe 68 - item_drop 69 - item_kill 70 - item_attachtoplayer 71 - item_primaryammoindex 72 - item_secondaryammoindex 73 - item_updateclientdata 74 - item_getweaponptr 75 - item_itemslot 76 - - weapon_playemptysound 77 - weapon_resetemptysound 78 - weapon_sendweaponanim 79 - weapon_primaryattack 80 - weapon_secondaryattack 81 - weapon_weaponidle 82 - weapon_retireweapon 83 - weapon_shouldweaponidle 84 - weapon_usedecrement 85 - - esf_weapon_holsterwhenmeleed 86 -@end - -@section esf windows - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 19 - addpoints 20 - addpointstoteam 21 - addplayeritem 22 - removeplayeritem 23 - getdelay 24 - ismoving 25 - overridereset 26 - damagedecal 27 - settogglestate 28 - startsneaking 29 - stopsneaking 30 - oncontrols 31 - issneaking 32 - isalive 33 - isbspmodel 34 - reflectgauss 35 - hastarget 36 - isinworld 37 - isplayer 38 - isnetclient 39 - teamid 40 - getnexttarget 41 - think 42 - touch 43 - use 44 - blocked 45 - respawn 46 - updateowner 47 - fbecomeprone 48 - center 49 - eyeposition 50 - earposition 51 - bodytarget 52 - illumination 53 - fvisible 54 - fvecvisible 55 - - look 57 - changeyaw 60 - irelationship 62 - monsterinitdead 64 - becomedead 65 - bestvisibleenemy 67 - finviewcone 68 - fvecinviewcone 69 - - runai 58 - monsterthink 61 - monsterinit 63 - checklocalmove 70 - move 71 - moveexecute 72 - shouldadvanceroute 73 - getstoppedactivity 74 - stop 75 - checkrangeattack1 76 - checkrangeattack2 77 - checkmeleeattack1 78 - checkmeleeattack2 79 - schedulechange 85 - canplaysequence 86 - canplaysentence2 87 - playsentence 88 - playscriptedsentence 89 - sentencestop 90 - getidealstate 91 - setactivity 92 - reportaistate 93 - checkenemy 94 - ftriangulate 95 - setyawspeed 96 - buildnearestroute 97 - findcover 98 - coverradius 100 - fcancheckattacks 101 - checkammo 102 - ignoreconditions 103 - fvalidatehinttype 104 - fcanactiveidle 105 - isoundmask 106 - hearingsensitivity 109 - barnaclevictimbitten 110 - barnaclevictimreleased 111 - preschedulethink 112 - getdeathactivity 113 - gibmonster 114 - hashumangibs 115 - hasaliengibs 116 - fademonster 117 - deathsound 119 - alertsound 120 - idlesound 121 - painsound 122 - stopfollowing 123 - - player_jump 124 - player_prethink 125 - player_postthink 126 - player_getgunposition 118 - player_shouldfadeondeath 59 - player_impulsecommands 128 - player_updateclientdata 127 - - item_addtoplayer 57 - item_addduplicate 58 - item_getiteminfo 59 - item_candeploy 60 - item_deploy 61 - item_canholster 62 - item_holster 63 - item_updateiteminfo 64 - item_preframe 65 - item_postframe 66 - item_drop 67 - item_kill 68 - item_attachtoplayer 69 - item_primaryammoindex 70 - item_secondaryammoindex 71 - item_updateclientdata 72 - item_getweaponptr 73 - item_itemslot 74 - - weapon_playemptysound 75 - weapon_resetemptysound 76 - weapon_sendweaponanim 77 - weapon_primaryattack 78 - weapon_secondaryattack 79 - weapon_weaponidle 80 - weapon_retireweapon 81 - weapon_shouldweaponidle 82 - weapon_usedecrement 83 - - esf_weapon_holsterwhenmeleed 84 -@end - -; ESF Open Beta is built with GCC 3.x, and the VTable was slightly changed -@section esf_openbeta linux - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 13 - killed 14 - bloodcolor 15 - tracebleed 16 - istriggered 17 - mymonsterpointer 18 - mysquadmonsterpointer 19 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - getdelay 25 - ismoving 26 - overridereset 27 - damagedecal 28 - settogglestate 29 - startsneaking 30 - stopsneaking 31 - oncontrols 32 - issneaking 33 - isalive 34 - isbspmodel 35 - reflectgauss 36 - hastarget 37 - isinworld 38 - isplayer 39 - isnetclient 43 - teamid 44 - getnexttarget 47 - think 48 - touch 49 - use 50 - blocked 51 - respawn 52 - updateowner 53 - fbecomeprone 54 - center 55 - eyeposition 56 - earposition 57 - bodytarget 58 - illumination 59 - fvisible 60 - fvecvisible 61 - - look 63 - changeyaw 66 - irelationship 68 - monsterinitdead 70 - becomedead 71 - bestvisibleenemy 73 - finviewcone 74 - fvecinviewcone 75 - - runai 64 - monsterthink 67 - monsterinit 69 - checklocalmove 76 - move 77 - moveexecute 78 - shouldadvanceroute 79 - getstoppedactivity 80 - stop 81 - checkrangeattack1 82 - checkrangeattack2 83 - checkmeleeattack1 84 - checkmeleeattack2 85 - schedulechange 91 - canplaysequence 92 - canplaysentence2 93 - playsentence 94 - playscriptedsentence 95 - sentencestop 96 - getidealstate 97 - setactivity 98 - reportaistate 99 - checkenemy 100 - ftriangulate 101 - setyawspeed 102 - buildnearestroute 103 - findcover 104 - coverradius 106 - fcancheckattacks 107 - checkammo 108 - ignoreconditions 109 - fvalidatehinttype 110 - fcanactiveidle 111 - isoundmask 112 - hearingsensitivity 115 - barnaclevictimbitten 116 - barnaclevictimreleased 117 - preschedulethink 118 - getdeathactivity 119 - gibmonster 120 - hashumangibs 121 - hasaliengibs 122 - fademonster 123 - deathsound 125 - alertsound 126 - idlesound 127 - painsound 128 - stopfollowing 129 - - player_updateclientdata 186 - player_jump 187 - player_prethink 189 - player_postthink 190 - player_getgunposition 124 - player_shouldfadeondeath 65 - player_impulsecommands 193 - - item_addtoplayer 63 - item_addduplicate 64 - item_getiteminfo 65 - item_candeploy 66 - item_deploy 67 - item_canholster 68 - item_holster 69 - item_updateiteminfo 70 - item_preframe 71 - item_postframe 72 - item_drop 73 - item_kill 74 - item_attachtoplayer 75 - item_primaryammoindex 76 - item_secondaryammoindex 77 - item_updateclientdata 78 - item_getweaponptr 79 - item_itemslot 80 - - weapon_playemptysound 81 - weapon_resetemptysound 82 - weapon_sendweaponanim 83 - weapon_primaryattack 84 - weapon_secondaryattack 85 - weapon_weaponidle 86 - weapon_retireweapon 87 - weapon_shouldweaponidle 88 - weapon_usedecrement 89 - - esf_isenvmodel 40 - esf_takedamage2 12 - esf_isfighter 41 - esf_isbuddy 42 - esf_emitsound 45 - esf_emitnullsound 46 - esf_increasestrength 130 - esf_increasepl 131 - esf_setpowerlevel 132 - esf_setmaxpowerlevel 133 - esf_stopanitrigger 134 - esf_stopfly 135 - esf_hideweapon 136 - esf_clientremoveweapon 137 - esf_sendclientcustommodel 138 - esf_canturbo 139 - esf_canprimaryfire 140 - esf_cansecondaryfire 141 - esf_canstopfly 142 - esf_canblock 143 - esf_canraiseKi 144 - esf_canraisestamina 145 - esf_canteleport 146 - esf_canstartfly 147 - esf_canstartpowerup 148 - esf_canjump 149 - esf_canwalljump 150 - esf_issuperjump 151 - esf_ismoveback 152 - esf_checkwalljump 153 - esf_enablewalljump 154 - esf_disablewalljump 155 - esf_resetwalljumpvars 156 - esf_getwalljumpanim 157 - esf_getwalljumpanim2 158 - esf_setwalljumpanimation 159 - esf_setflymovetype 160 - esf_isflymovetype 161 - esf_iswalkmovetype 162 - esf_setwalkmovetype 163 - esf_drawchargebar 164 - esf_startblock 165 - esf_stopblock 166 - esf_startfly 167 - esf_getmaxspeed 168 - esf_setanimation 169 - esf_playanimation 170 - esf_getmoveforward 171 - esf_getmoveright 172 - esf_getmoveup 173 - esf_addblindfx 174 - esf_removeblindfx 175 - esf_disablepsbar 176 - esf_addbeamboxcrosshair 177 - esf_removebeamboxcrosshair 178 - esf_drawpswinbonus 179 - esf_drawpsbar 180 - esf_lockcrosshair 181 - esf_unlockcrosshair 182 - esf_rotatecrosshair 183 - esf_unrotatecrosshair 184 - esf_watermove 185 - esf_checktimebaseddamage 188 - esf_doessecondaryattack 191 - esf_doesprimaryattack 192 - esf_removespecialmodes 194 - esf_stopturbo 195 - esf_takebean 196 - esf_getpowerlevel 197 - esf_removeallotherweapons 198 - esf_stopswoop 199 - esf_setdeathanimation 201 - esf_setmodel 202 - esf_addattacks 203 - esf_emitclasssound 205 - esf_checklightning 206 - esf_freezecontrols 207 - esf_unfreezecontrols 208 - esf_updateki 209 - esf_updatehealth 210 - esf_getteleportdir 211 - - esf_weapon_holsterwhenmeleed 90 - -@end -@section esf_openbeta windows - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 13 - killed 14 - bloodcolor 15 - tracebleed 16 - istriggered 17 - mymonsterpointer 18 - mysquadmonsterpointer 19 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - getdelay 25 - ismoving 26 - overridereset 27 - damagedecal 28 - settogglestate 29 - startsneaking 30 - stopsneaking 31 - oncontrols 32 - issneaking 33 - isalive 34 - isbspmodel 35 - reflectgauss 36 - hastarget 37 - isinworld 38 - isplayer 39 - isnetclient 43 - teamid 44 - getnexttarget 47 - think 48 - touch 49 - use 50 - blocked 51 - respawn 52 - updateowner 53 - fbecomeprone 54 - center 55 - eyeposition 56 - earposition 57 - bodytarget 58 - illumination 59 - fvisible 60 - fvecvisible 61 - - look 63 - changeyaw 66 - irelationship 68 - monsterinitdead 70 - becomedead 71 - bestvisibleenemy 73 - finviewcone 74 - fvecinviewcone 75 - - runai 64 - monsterthink 67 - monsterinit 69 - checklocalmove 76 - move 77 - moveexecute 78 - shouldadvanceroute 79 - getstoppedactivity 80 - stop 81 - checkrangeattack1 82 - checkrangeattack2 83 - checkmeleeattack1 84 - checkmeleeattack2 85 - schedulechange 91 - canplaysequence 92 - canplaysentence2 93 - playsentence 94 - playscriptedsentence 95 - sentencestop 96 - getidealstate 97 - setactivity 98 - reportaistate 99 - checkenemy 100 - ftriangulate 101 - setyawspeed 102 - buildnearestroute 103 - findcover 104 - coverradius 106 - fcancheckattacks 107 - checkammo 108 - ignoreconditions 109 - fvalidatehinttype 110 - fcanactiveidle 111 - isoundmask 112 - hearingsensitivity 115 - barnaclevictimbitten 116 - barnaclevictimreleased 117 - preschedulethink 118 - getdeathactivity 119 - gibmonster 120 - hashumangibs 121 - hasaliengibs 122 - fademonster 123 - deathsound 125 - alertsound 126 - idlesound 127 - painsound 128 - stopfollowing 129 - - player_updateclientdata 186 - player_jump 187 - player_prethink 189 - player_postthink 190 - player_getgunposition 124 - player_shouldfadeondeath 65 - player_impulsecommands 193 - - item_addtoplayer 63 - item_addduplicate 64 - item_getiteminfo 65 - item_candeploy 66 - item_deploy 67 - item_canholster 68 - item_holster 69 - item_updateiteminfo 70 - item_preframe 71 - item_postframe 72 - item_drop 73 - item_kill 74 - item_attachtoplayer 75 - item_primaryammoindex 76 - item_secondaryammoindex 77 - item_updateclientdata 78 - item_getweaponptr 79 - item_itemslot 80 - - weapon_playemptysound 81 - weapon_resetemptysound 82 - weapon_sendweaponanim 83 - weapon_primaryattack 84 - weapon_secondaryattack 85 - weapon_weaponidle 86 - weapon_retireweapon 87 - weapon_shouldweaponidle 88 - weapon_usedecrement 89 - - esf_isenvmodel 40 - esf_takedamage2 12 - esf_isfighter 41 - esf_isbuddy 42 - esf_emitsound 45 - esf_emitnullsound 46 - esf_increasestrength 130 - esf_increasepl 131 - esf_setpowerlevel 132 - esf_setmaxpowerlevel 133 - esf_stopanitrigger 134 - esf_stopfly 135 - esf_hideweapon 136 - esf_clientremoveweapon 137 - esf_sendclientcustommodel 138 - esf_canturbo 139 - esf_canprimaryfire 140 - esf_cansecondaryfire 141 - esf_canstopfly 142 - esf_canblock 143 - esf_canraiseKi 144 - esf_canraisestamina 145 - esf_canteleport 146 - esf_canstartfly 147 - esf_canstartpowerup 148 - esf_canjump 149 - esf_canwalljump 150 - esf_issuperjump 151 - esf_ismoveback 152 - esf_checkwalljump 153 - esf_enablewalljump 154 - esf_disablewalljump 155 - esf_resetwalljumpvars 156 - esf_getwalljumpanim 157 - esf_getwalljumpanim2 158 - esf_setwalljumpanimation 159 - esf_setflymovetype 160 - esf_isflymovetype 161 - esf_iswalkmovetype 162 - esf_setwalkmovetype 163 - esf_drawchargebar 164 - esf_startblock 165 - esf_stopblock 166 - esf_startfly 167 - esf_getmaxspeed 168 - esf_setanimation 169 - esf_playanimation 170 - esf_getmoveforward 171 - esf_getmoveright 172 - esf_getmoveup 173 - esf_addblindfx 174 - esf_removeblindfx 175 - esf_disablepsbar 176 - esf_addbeamboxcrosshair 177 - esf_removebeamboxcrosshair 178 - esf_drawpswinbonus 179 - esf_drawpsbar 180 - esf_lockcrosshair 181 - esf_unlockcrosshair 182 - esf_rotatecrosshair 183 - esf_unrotatecrosshair 184 - esf_watermove 185 - esf_checktimebaseddamage 188 - esf_doessecondaryattack 191 - esf_doesprimaryattack 192 - esf_removespecialmodes 194 - esf_stopturbo 195 - esf_takebean 196 - esf_getpowerlevel 197 - esf_removeallotherweapons 198 - esf_stopswoop 199 - esf_setdeathanimation 201 - esf_setmodel 202 - esf_addattacks 203 - esf_emitclasssound 205 - esf_checklightning 206 - esf_freezecontrols 207 - esf_unfreezecontrols 208 - esf_updateki 209 - esf_updatehealth 210 - esf_getteleportdir 211 - - esf_weapon_holsterwhenmeleed 90 - -@end -@section valve linux - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 19 - addpoints 20 - addpointstoteam 21 - addplayeritem 22 - removeplayeritem 23 - giveammo 24 - getdelay 25 - ismoving 26 - overridereset 27 - damagedecal 28 - settogglestate 29 - startsneaking 30 - stopsneaking 31 - oncontrols 32 - issneaking 33 - isalive 34 - isbspmodel 35 - reflectgauss 36 - hastarget 37 - isinworld 38 - isplayer 39 - isnetclient 40 - teamid 41 - getnexttarget 42 - think 43 - touch 44 - use 45 - blocked 46 - respawn 47 - updateowner 48 - fbecomeprone 49 - center 50 - eyeposition 51 - earposition 52 - bodytarget 53 - illumination 54 - fvisible 55 - fvecvisible 56 - - look 58 - changeyaw 61 - irelationship 63 - monsterinitdead 65 - becomedead 66 - bestvisibleenemy 68 - finviewcone 69 - fvecinviewcone 70 - - runai 59 - monsterthink 62 - monsterinit 64 - checklocalmove 71 - move 72 - moveexecute 73 - shouldadvanceroute 74 - getstoppedactivity 75 - stop 76 - checkrangeattack1 77 - checkrangeattack2 78 - checkmeleeattack1 79 - checkmeleeattack2 80 - schedulechange 86 - canplaysequence 87 - canplaysentence2 88 - playsentence 89 - playscriptedsentence 90 - sentencestop 91 - getidealstate 92 - setactivity 93 - reportaistate 94 - checkenemy 95 - ftriangulate 96 - setyawspeed 97 - buildnearestroute 98 - findcover 99 - coverradius 101 - fcancheckattacks 102 - checkammo 103 - ignoreconditions 104 - fvalidatehinttype 105 - fcanactiveidle 106 - isoundmask 107 - hearingsensitivity 110 - barnaclevictimbitten 111 - barnaclevictimreleased 112 - preschedulethink 113 - getdeathactivity 114 - gibmonster 115 - hashumangibs 116 - hasaliengibs 117 - fademonster 118 - deathsound 120 - alertsound 121 - idlesound 122 - painsound 123 - stopfollowing 124 - - player_jump 125 - player_duck 126 - player_prethink 127 - player_postthink 128 - player_getgunposition 119 - player_shouldfadeondeath 60 - player_impulsecommands 130 - player_updateclientdata 129 - - item_addtoplayer 58 - item_addduplicate 59 - item_getiteminfo 60 - item_candeploy 61 - item_deploy 62 - item_canholster 63 - item_holster 64 - item_updateiteminfo 65 - item_preframe 66 - item_postframe 67 - item_drop 68 - item_kill 69 - item_attachtoplayer 70 - item_primaryammoindex 71 - item_secondaryammoindex 72 - item_updateclientdata 73 - item_getweaponptr 74 - item_itemslot 75 - - weapon_extractammo 76 - weapon_extractclipammo 77 - weapon_addweapon 78 - weapon_playemptysound 79 - weapon_resetemptysound 80 - weapon_sendweaponanim 81 - weapon_isusable 82 - weapon_primaryattack 83 - weapon_secondaryattack 84 - weapon_reload 85 - weapon_weaponidle 86 - weapon_retireweapon 87 - weapon_shouldweaponidle 88 - weapon_usedecrement 89 -@end -@section valve windows - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 19 - addpoints 20 - addpointstoteam 21 - addplayeritem 22 - removeplayeritem 23 - giveammo 24 - getdelay 25 - ismoving 26 - overridereset 27 - damagedecal 28 - settogglestate 29 - startsneaking 30 - stopsneaking 31 - oncontrols 32 - issneaking 33 - isalive 34 - isbspmodel 35 - reflectgauss 36 - hastarget 37 - isinworld 38 - isplayer 39 - isnetclient 40 - teamid 41 - getnexttarget 42 - think 43 - touch 44 - use 45 - blocked 46 - respawn 47 - updateowner 48 - fbecomeprone 49 - center 50 - eyeposition 51 - earposition 52 - bodytarget 53 - illumination 54 - fvisible 55 - fvecvisible 56 - - look 58 - changeyaw 61 - irelationship 63 - monsterinitdead 65 - becomedead 66 - bestvisibleenemy 68 - finviewcone 69 - fvecinviewcone 70 - - runai 59 - monsterthink 62 - monsterinit 64 - checklocalmove 71 - move 72 - moveexecute 73 - shouldadvanceroute 74 - getstoppedactivity 75 - stop 76 - checkrangeattack1 77 - checkrangeattack2 78 - checkmeleeattack1 79 - checkmeleeattack2 80 - schedulechange 86 - canplaysequence 87 - canplaysentence2 88 - playsentence 89 - playscriptedsentence 90 - sentencestop 91 - getidealstate 92 - setactivity 93 - reportaistate 94 - checkenemy 95 - ftriangulate 96 - setyawspeed 97 - buildnearestroute 98 - findcover 99 - coverradius 101 - fcancheckattacks 102 - checkammo 103 - ignoreconditions 104 - fvalidatehinttype 105 - fcanactiveidle 106 - isoundmask 107 - hearingsensitivity 110 - barnaclevictimbitten 111 - barnaclevictimreleased 112 - preschedulethink 113 - getdeathactivity 114 - gibmonster 115 - hashumangibs 116 - hasaliengibs 117 - fademonster 118 - deathsound 120 - alertsound 121 - idlesound 122 - painsound 123 - stopfollowing 124 - - player_jump 125 - player_duck 126 - player_prethink 127 - player_postthink 128 - player_getgunposition 119 - player_shouldfadeondeath 60 - player_impulsecommands 130 - player_updateclientdata 129 - - item_addtoplayer 58 - item_addduplicate 59 - item_getiteminfo 60 - item_candeploy 61 - item_deploy 62 - item_canholster 63 - item_holster 64 - item_updateiteminfo 65 - item_preframe 66 - item_postframe 67 - item_drop 68 - item_kill 69 - item_attachtoplayer 70 - item_primaryammoindex 71 - item_secondaryammoindex 72 - item_updateclientdata 73 - item_getweaponptr 74 - item_itemslot 75 - - weapon_extractammo 76 - weapon_extractclipammo 77 - weapon_addweapon 78 - weapon_playemptysound 79 - weapon_resetemptysound 80 - weapon_sendweaponanim 81 - weapon_isusable 82 - weapon_primaryattack 83 - weapon_secondaryattack 84 - weapon_reload 85 - weapon_weaponidle 86 - weapon_retireweapon 87 - weapon_shouldweaponidle 88 - weapon_usedecrement 89 -@end - -@section valve mac - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 19 - addpoints 20 - addpointstoteam 21 - addplayeritem 22 - removeplayeritem 23 - giveammo 24 - getdelay 25 - ismoving 26 - overridereset 27 - damagedecal 28 - settogglestate 29 - startsneaking 30 - stopsneaking 31 - oncontrols 32 - issneaking 33 - isalive 34 - isbspmodel 35 - reflectgauss 36 - hastarget 37 - isinworld 38 - isplayer 39 - isnetclient 40 - teamid 41 - getnexttarget 42 - think 43 - touch 44 - use 45 - blocked 46 - respawn 47 - updateowner 48 - fbecomeprone 49 - center 50 - eyeposition 51 - earposition 52 - bodytarget 53 - illumination 54 - fvisible 55 - fvecvisible 56 - - look 58 - changeyaw 61 - irelationship 63 - monsterinitdead 65 - becomedead 66 - bestvisibleenemy 68 - finviewcone 69 - fvecinviewcone 70 - - runai 59 - monsterthink 62 - monsterinit 64 - checklocalmove 71 - move 72 - moveexecute 73 - shouldadvanceroute 74 - getstoppedactivity 75 - stop 76 - checkrangeattack1 77 - checkrangeattack2 78 - checkmeleeattack1 79 - checkmeleeattack2 80 - schedulechange 86 - canplaysequence 87 - canplaysentence2 88 - playsentence 89 - playscriptedsentence 90 - sentencestop 91 - getidealstate 92 - setactivity 93 - reportaistate 94 - checkenemy 95 - ftriangulate 96 - setyawspeed 97 - buildnearestroute 98 - findcover 99 - coverradius 101 - fcancheckattacks 102 - checkammo 103 - ignoreconditions 104 - fvalidatehinttype 105 - fcanactiveidle 106 - isoundmask 107 - hearingsensitivity 110 - barnaclevictimbitten 111 - barnaclevictimreleased 112 - preschedulethink 113 - getdeathactivity 114 - gibmonster 115 - hashumangibs 116 - hasaliengibs 117 - fademonster 118 - deathsound 120 - alertsound 121 - idlesound 122 - painsound 123 - stopfollowing 124 - - player_jump 125 - player_duck 126 - player_prethink 127 - player_postthink 128 - player_getgunposition 119 - player_shouldfadeondeath 60 - player_impulsecommands 130 - player_updateclientdata 129 - - item_addtoplayer 58 - item_addduplicate 59 - item_getiteminfo 60 - item_candeploy 61 - item_deploy 62 - item_canholster 63 - item_holster 64 - item_updateiteminfo 65 - item_preframe 66 - item_postframe 67 - item_drop 68 - item_kill 69 - item_attachtoplayer 70 - item_primaryammoindex 71 - item_secondaryammoindex 72 - item_updateclientdata 73 - item_getweaponptr 74 - item_itemslot 75 - - weapon_extractammo 76 - weapon_extractclipammo 77 - weapon_addweapon 78 - weapon_playemptysound 79 - weapon_resetemptysound 80 - weapon_sendweaponanim 81 - weapon_isusable 82 - weapon_primaryattack 83 - weapon_secondaryattack 84 - weapon_reload 85 - weapon_weaponidle 86 - weapon_retireweapon 87 - weapon_shouldweaponidle 88 - weapon_usedecrement 89 -@end - -@section gearbox windows - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - giveammo 25 - getdelay 26 - ismoving 27 - overridereset 28 - damagedecal 29 - settogglestate 30 - startsneaking 31 - stopsneaking 32 - oncontrols 33 - issneaking 34 - isalive 35 - isbspmodel 36 - reflectgauss 37 - hastarget 38 - isinworld 39 - isplayer 40 - isnetclient 41 - teamid 42 - getnexttarget 43 - think 44 - touch 45 - use 46 - blocked 47 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvisible 57 - fvecvisible 56 - - look 60 - changeyaw 63 - irelationship 65 - monsterinitdead 67 - becomedead 68 - bestvisibleenemy 70 - finviewcone 72 - fvecinviewcone 71 - - runai 61 - monsterthink 64 - monsterinit 66 - checklocalmove 73 - move 74 - moveexecute 75 - shouldadvanceroute 76 - getstoppedactivity 77 - stop 78 - checkrangeattack1 79 - checkrangeattack2 80 - checkmeleeattack1 81 - checkmeleeattack2 82 - schedulechange 88 - canplaysequence 89 - canplaysentence2 90 - playsentence 91 - playscriptedsentence 92 - sentencestop 93 - getidealstate 94 - setactivity 95 - reportaistate 96 - checkenemy 97 - ftriangulate 98 - setyawspeed 99 - buildnearestroute 100 - findcover 101 - coverradius 103 - fcancheckattacks 104 - checkammo 105 - ignoreconditions 106 - fvalidatehinttype 107 - fcanactiveidle 108 - isoundmask 109 - hearingsensitivity 112 - barnaclevictimbitten 113 - barnaclevictimreleased 114 - preschedulethink 115 - getdeathactivity 116 - gibmonster 117 - hashumangibs 118 - hasaliengibs 119 - fademonster 120 - deathsound 123 - alertsound 124 - idlesound 125 - painsound 126 - stopfollowing 127 - - player_jump 127 - player_duck 128 - player_prethink 129 - player_postthink 130 - player_getgunposition 121 - player_shouldfadeondeath 62 - player_impulsecommands 132 - player_updateclientdata 131 - - item_addtoplayer 60 - item_addduplicate 61 - item_getiteminfo 62 - item_candeploy 63 - item_deploy 64 - item_canholster 65 - item_holster 66 - item_updateiteminfo 67 - item_preframe 68 - item_postframe 69 - item_drop 70 - item_kill 71 - item_attachtoplayer 72 - item_primaryammoindex 73 - item_secondaryammoindex 74 - item_updateclientdata 76 - item_getweaponptr 77 - item_itemslot 78 - - weapon_extractammo 79 - weapon_extractclipammo 80 - weapon_addweapon 81 - weapon_playemptysound 82 - weapon_resetemptysound 83 - weapon_sendweaponanim 84 - weapon_isusable 85 - weapon_primaryattack 86 - weapon_secondaryattack 87 - weapon_reload 88 - weapon_weaponidle 89 - weapon_retireweapon 90 - weapon_shouldweaponidle 91 - weapon_usedecrement 92 - - gearbox_mysquadtalkmonsterpointer 19 - gearbox_weapontimebase 58 -@end - -@section gearbox linux - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - giveammo 25 - getdelay 26 - ismoving 27 - overridereset 28 - damagedecal 29 - settogglestate 30 - startsneaking 31 - stopsneaking 32 - oncontrols 33 - issneaking 34 - isalive 35 - isbspmodel 36 - reflectgauss 37 - hastarget 38 - isinworld 39 - isplayer 40 - isnetclient 41 - teamid 42 - getnexttarget 43 - think 44 - touch 45 - use 46 - blocked 47 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvisible 56 - fvecvisible 57 - - look 60 - changeyaw 63 - irelationship 65 - monsterinitdead 67 - becomedead 68 - bestvisibleenemy 70 - finviewcone 71 - fvecinviewcone 72 - - runai 61 - monsterthink 64 - monsterinit 66 - checklocalmove 73 - move 74 - moveexecute 75 - shouldadvanceroute 76 - getstoppedactivity 77 - stop 78 - checkrangeattack1 79 - checkrangeattack2 80 - checkmeleeattack1 81 - checkmeleeattack2 82 - schedulechange 88 - canplaysequence 89 - canplaysentence2 90 - playsentence 91 - playscriptedsentence 92 - sentencestop 93 - getidealstate 94 - setactivity 95 - reportaistate 96 - checkenemy 97 - ftriangulate 98 - setyawspeed 99 - buildnearestroute 100 - findcover 101 - coverradius 103 - fcancheckattacks 104 - checkammo 105 - ignoreconditions 106 - fvalidatehinttype 107 - fcanactiveidle 108 - isoundmask 109 - hearingsensitivity 112 - barnaclevictimbitten 113 - barnaclevictimreleased 114 - preschedulethink 115 - getdeathactivity 116 - gibmonster 117 - hashumangibs 118 - hasaliengibs 119 - fademonster 120 - deathsound 123 - alertsound 124 - idlesound 125 - painsound 126 - stopfollowing 127 - - player_jump 127 - player_duck 128 - player_prethink 129 - player_postthink 130 - player_getgunposition 121 - player_shouldfadeondeath 62 - player_impulsecommands 132 - player_updateclientdata 131 - - item_addtoplayer 60 - item_addduplicate 61 - item_getiteminfo 62 - item_candeploy 63 - item_deploy 64 - item_canholster 65 - item_holster 66 - item_updateiteminfo 67 - item_preframe 68 - item_postframe 69 - item_drop 70 - item_kill 71 - item_attachtoplayer 72 - item_primaryammoindex 73 - item_secondaryammoindex 74 - item_updateclientdata 76 - item_getweaponptr 77 - item_itemslot 78 - - weapon_extractammo 79 - weapon_extractclipammo 80 - weapon_addweapon 81 - weapon_playemptysound 82 - weapon_resetemptysound 83 - weapon_sendweaponanim 84 - weapon_isusable 85 - weapon_primaryattack 86 - weapon_secondaryattack 87 - weapon_reload 88 - weapon_weaponidle 89 - weapon_retireweapon 90 - weapon_shouldweaponidle 91 - weapon_usedecrement 92 - - gearbox_mysquadtalkmonsterpointer 19 - gearbox_weapontimebase 58 -@end - -@section gearbox mac - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 20 - addpoints 21 - addpointstoteam 22 - addplayeritem 23 - removeplayeritem 24 - giveammo 25 - getdelay 26 - ismoving 27 - overridereset 28 - damagedecal 29 - settogglestate 30 - startsneaking 31 - stopsneaking 32 - oncontrols 33 - issneaking 34 - isalive 35 - isbspmodel 36 - reflectgauss 37 - hastarget 38 - isinworld 39 - isplayer 40 - isnetclient 41 - teamid 42 - getnexttarget 43 - think 44 - touch 45 - use 46 - blocked 47 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvisible 56 - fvecvisible 57 - - look 60 - changeyaw 63 - irelationship 65 - monsterinitdead 67 - becomedead 68 - bestvisibleenemy 70 - finviewcone 71 - fvecinviewcone 72 - - runai 61 - monsterthink 64 - monsterinit 66 - checklocalmove 73 - move 74 - moveexecute 75 - shouldadvanceroute 76 - getstoppedactivity 77 - stop 78 - checkrangeattack1 79 - checkrangeattack2 80 - checkmeleeattack1 81 - checkmeleeattack2 82 - schedulechange 88 - canplaysequence 89 - canplaysentence2 90 - playsentence 91 - playscriptedsentence 92 - sentencestop 93 - getidealstate 94 - setactivity 95 - reportaistate 96 - checkenemy 97 - ftriangulate 98 - setyawspeed 99 - buildnearestroute 100 - findcover 101 - coverradius 103 - fcancheckattacks 104 - checkammo 105 - ignoreconditions 106 - fvalidatehinttype 107 - fcanactiveidle 108 - isoundmask 109 - hearingsensitivity 112 - barnaclevictimbitten 113 - barnaclevictimreleased 114 - preschedulethink 115 - getdeathactivity 116 - gibmonster 117 - hashumangibs 118 - hasaliengibs 119 - fademonster 120 - deathsound 123 - alertsound 124 - idlesound 125 - painsound 126 - stopfollowing 127 - - player_jump 127 - player_duck 128 - player_prethink 129 - player_postthink 130 - player_getgunposition 121 - player_shouldfadeondeath 62 - player_impulsecommands 132 - player_updateclientdata 131 - - item_addtoplayer 60 - item_addduplicate 61 - item_getiteminfo 62 - item_candeploy 63 - item_deploy 64 - item_canholster 65 - item_holster 66 - item_updateiteminfo 67 - item_preframe 68 - item_postframe 69 - item_drop 70 - item_kill 71 - item_attachtoplayer 72 - item_primaryammoindex 73 - item_secondaryammoindex 74 - item_updateclientdata 76 - item_getweaponptr 77 - item_itemslot 78 - - weapon_extractammo 79 - weapon_extractclipammo 80 - weapon_addweapon 81 - weapon_playemptysound 82 - weapon_resetemptysound 83 - weapon_sendweaponanim 84 - weapon_isusable 85 - weapon_primaryattack 86 - weapon_secondaryattack 87 - weapon_reload 88 - weapon_weaponidle 89 - weapon_retireweapon 90 - weapon_shouldweaponidle 91 - weapon_usedecrement 92 - - gearbox_mysquadtalkmonsterpointer 19 - gearbox_weapontimebase 58 -@end - -@section ag linux - pev 0 - base 0x60 - - spawn 2 - precache 3 - keyvalue 4 - objectcaps 7 - activate 8 - setobjectcollisionbox 9 - classify 10 - deathnotice 11 - traceattack 12 - takedamage 13 - takehealth 14 - killed 15 - bloodcolor 16 - tracebleed 17 - istriggered 18 - mymonsterpointer 19 - mysquadmonsterpointer 20 - gettogglestate 21 - addpoints 22 - addpointstoteam 23 - addplayeritem 24 - removeplayeritem 25 - giveammo 26 - getdelay 27 - ismoving 28 - overridereset 29 - damagedecal 30 - settogglestate 31 - startsneaking 32 - stopsneaking 33 - oncontrols 34 - issneaking 35 - isalive 36 - isbspmodel 37 - reflectgauss 38 - hastarget 39 - isinworld 40 - isplayer 41 - isnetclient 42 - teamid 43 - getnexttarget 44 - think 45 - touch 46 - use 47 - blocked 48 - respawn 50 - updateowner 51 - fbecomeprone 52 - center 53 - eyeposition 54 - earposition 55 - bodytarget 56 - illumination 57 - fvisible 58 - fvecvisible 59 - - look 62 - changeyaw 65 - irelationship 67 - monsterinitdead 69 - becomedead 70 - bestvisibleenemy 72 - finviewcone 73 - fvecinviewcone 74 - - runai 63 - monsterthink 66 - monsterinit 68 - checklocalmove 75 - move 76 - moveexecute 77 - shouldadvanceroute 78 - getstoppedactivity 79 - stop 80 - checkrangeattack1 81 - checkrangeattack2 82 - checkmeleeattack1 83 - checkmeleeattack2 84 - schedulechange 90 - canplaysequence 91 - canplaysentence2 92 - playsentence 93 - playscriptedsentence 94 - sentencestop 95 - getidealstate 96 - setactivity 97 - reportaistate 98 - checkenemy 99 - ftriangulate 100 - setyawspeed 101 - buildnearestroute 102 - findcover 103 - coverradius 105 - fcancheckattacks 106 - checkammo 107 - ignoreconditions 108 - fvalidatehinttype 109 - fcanactiveidle 110 - isoundmask 111 - hearingsensitivity 114 - barnaclevictimbitten 115 - barnaclevictimreleased 116 - preschedulethink 117 - getdeathactivity 118 - gibmonster 119 - hashumangibs 120 - hasaliengibs 121 - fademonster 122 - deathsound 124 - alertsound 125 - idlesound 126 - painsound 127 - stopfollowing 128 - - player_jump 129 - player_duck 130 - player_prethink 131 - player_postthink 132 - player_getgunposition 123 - player_shouldfadeondeath 64 - player_impulsecommands 134 - player_updateclientdata 133 - - item_addtoplayer 61 - item_addduplicate 62 - item_getiteminfo 63 - item_candeploy 64 - item_deploy 65 - item_canholster 66 - item_holster 67 - item_updateiteminfo 68 - item_preframe 69 - item_postframe 70 - item_drop 71 - item_kill 72 - item_attachtoplayer 73 - item_primaryammoindex 74 - item_secondaryammoindex 75 - item_updateclientdata 76 - item_getweaponptr 77 - item_itemslot 78 - - weapon_extractammo 79 - weapon_extractclipammo 80 - weapon_addweapon 81 - weapon_playemptysound 82 - weapon_resetemptysound 83 - weapon_sendweaponanim 84 - weapon_isusable 85 - weapon_primaryattack 86 - weapon_secondaryattack 87 - weapon_reload 88 - weapon_weaponidle 89 - weapon_retireweapon 90 - weapon_shouldweaponidle 91 - weapon_usedecrement 92 - -@end -@section ag windows - pev 4 - base 0x0 - - spawn 0 - precache 1 - keyvalue 2 - objectcaps 5 - activate 6 - setobjectcollisionbox 7 - classify 8 - deathnotice 9 - traceattack 10 - takedamage 11 - takehealth 12 - killed 13 - bloodcolor 14 - tracebleed 15 - istriggered 16 - mymonsterpointer 17 - mysquadmonsterpointer 18 - gettogglestate 19 - addpoints 20 - addpointstoteam 21 - addplayeritem 22 - removeplayeritem 23 - giveammo 24 - getdelay 25 - ismoving 26 - overridereset 27 - damagedecal 28 - settogglestate 29 - startsneaking 30 - stopsneaking 31 - oncontrols 32 - issneaking 33 - isalive 34 - isbspmodel 35 - reflectgauss 36 - hastarget 37 - isinworld 38 - isplayer 39 - isnetclient 40 - teamid 41 - getnexttarget 42 - think 43 - touch 44 - use 45 - blocked 46 - respawn 48 - updateowner 49 - fbecomeprone 50 - center 51 - eyeposition 52 - earposition 53 - bodytarget 54 - illumination 55 - fvisible 56 - fvecvisible 57 - - look 60 - changeyaw 63 - irelationship 65 - monsterinitdead 67 - becomedead 68 - bestvisibleenemy 70 - finviewcone 71 - fvecinviewcone 72 - - runai 61 - monsterthink 64 - monsterinit 66 - checklocalmove 73 - move 74 - moveexecute 75 - shouldadvanceroute 76 - getstoppedactivity 77 - stop 78 - checkrangeattack1 79 - checkrangeattack2 80 - checkmeleeattack1 81 - checkmeleeattack2 82 - schedulechange 88 - canplaysequence 89 - canplaysentence2 90 - playsentence 91 - playscriptedsentence 92 - sentencestop 93 - getidealstate 94 - setactivity 95 - reportaistate 96 - checkenemy 97 - ftriangulate 98 - setyawspeed 99 - buildnearestroute 100 - findcover 101 - coverradius 103 - fcancheckattacks 104 - checkammo 105 - ignoreconditions 106 - fvalidatehinttype 107 - fcanactiveidle 108 - isoundmask 109 - hearingsensitivity 112 - barnaclevictimbitten 113 - barnaclevictimreleased 114 - preschedulethink 115 - getdeathactivity 116 - gibmonster 117 - hashumangibs 118 - hasaliengibs 119 - fademonster 120 - deathsound 122 - alertsound 123 - idlesound 124 - painsound 125 - stopfollowing 126 - - player_jump 127 - player_duck 128 - player_prethink 129 - player_postthink 130 - player_getgunposition 121 - player_shouldfadeondeath 62 - player_impulsecommands 132 - player_updateclientdata 131 - - item_addtoplayer 59 - item_addduplicate 60 - item_getiteminfo 61 - item_candeploy 62 - item_deploy 63 - item_canholster 64 - item_holster 65 - item_updateiteminfo 66 - item_preframe 67 - item_postframe 68 - item_drop 69 - item_kill 70 - item_attachtoplayer 71 - item_primaryammoindex 72 - item_secondaryammoindex 73 - item_updateclientdata 74 - item_getweaponptr 75 - item_itemslot 76 - - weapon_extractammo 77 - weapon_extractclipammo 78 - weapon_addweapon 79 - weapon_playemptysound 80 - weapon_resetemptysound 81 - weapon_sendweaponanim 82 - weapon_isusable 83 - weapon_primaryattack 84 - weapon_secondaryattack 85 - weapon_reload 86 - weapon_weaponidle 87 - weapon_retireweapon 88 - weapon_shouldweaponidle 89 - weapon_usedecrement 90 -@end - \ No newline at end of file diff --git a/gamedata/common.games/master.games.txt b/gamedata/common.games/master.games.txt index 3e82358c..5042e42b 100644 --- a/gamedata/common.games/master.games.txt +++ b/gamedata/common.games/master.games.txt @@ -1566,7 +1566,7 @@ // // Team Fortress Classic // - + "entities.games/tfc/offsets-cbaseentity.txt" { "game" "tfc" @@ -3404,7 +3404,7 @@ // // Half-Life: Deathmatch // - + "entities.games/valve/offsets-cbaseentity.txt" { "game" "valve" @@ -4105,4 +4105,67 @@ "game" "valve" } + + + // + // Virtual Functions + // + + "virtual.games/ag/offsets-common.txt" + { + "game" "ag" + } + + "virtual.games/cstrike/offsets-common.txt" + { + "game" "cstrike" + "game" "czero" + } + + "virtual.games/dod/offsets-common.txt" + { + "game" "dod" + } + + "virtual.games/esf/offsets-common.txt" + { + "game" "esf" + } + + "virtual.games/esf_openbeta/offsets-common.txt" + { + "game" "esf_openbeta" + } + + "virtual.games/gearbox/offsets-common.txt" + { + "game" "gearbox" + } + + "virtual.games/ns/offsets-common.txt" + { + "game" "ns" + "game" "nsp" + } + + "virtual.games/svencoop/offsets-common.txt" + { + "game" "svencoop" + } + + "virtual.games/tfc/offsets-common.txt" + { + "game" "tfc" + } + + "virtual.games/ts/offsets-common.txt" + { + "game" "ts" + } + + "virtual.games/valve/offsets-common.txt" + { + "game" "valve" + "game" "dmc" + } } diff --git a/gamedata/common.games/virtual.games/ag/offsets-common.txt b/gamedata/common.games/virtual.games/ag/offsets-common.txt new file mode 100644 index 00000000..923fc088 --- /dev/null +++ b/gamedata/common.games/virtual.games/ag/offsets-common.txt @@ -0,0 +1,938 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "0" + } + + "base" + { + "windows" "0x0" + "linux" "0x60" + } + + "spawn" + { + "windows" "0" + "linux" "2" + } + + "precache" + { + "windows" "1" + "linux" "3" + } + + "keyvalue" + { + "windows" "2" + "linux" "4" + } + + "objectcaps" + { + "windows" "5" + "linux" "7" + } + + "activate" + { + "windows" "6" + "linux" "8" + } + + "setobjectcollisionbox" + { + "windows" "7" + "linux" "9" + } + + "classify" + { + "windows" "8" + "linux" "10" + } + + "deathnotice" + { + "windows" "9" + "linux" "11" + } + + "traceattack" + { + "windows" "10" + "linux" "12" + } + + "takedamage" + { + "windows" "11" + "linux" "13" + } + + "takehealth" + { + "windows" "12" + "linux" "14" + } + + "killed" + { + "windows" "13" + "linux" "15" + } + + "bloodcolor" + { + "windows" "14" + "linux" "16" + } + + "tracebleed" + { + "windows" "15" + "linux" "17" + } + + "istriggered" + { + "windows" "16" + "linux" "18" + } + + "mymonsterpointer" + { + "windows" "17" + "linux" "19" + } + + "mysquadmonsterpointer" + { + "windows" "18" + "linux" "20" + } + + "gettogglestate" + { + "windows" "19" + "linux" "21" + } + + "addpoints" + { + "windows" "20" + "linux" "22" + } + + "addpointstoteam" + { + "windows" "21" + "linux" "23" + } + + "addplayeritem" + { + "windows" "22" + "linux" "24" + } + + "removeplayeritem" + { + "windows" "23" + "linux" "25" + } + + "giveammo" + { + "windows" "24" + "linux" "26" + } + + "getdelay" + { + "windows" "25" + "linux" "27" + } + + "ismoving" + { + "windows" "26" + "linux" "28" + } + + "overridereset" + { + "windows" "27" + "linux" "29" + } + + "damagedecal" + { + "windows" "28" + "linux" "30" + } + + "settogglestate" + { + "windows" "29" + "linux" "31" + } + + "startsneaking" + { + "windows" "30" + "linux" "32" + } + + "stopsneaking" + { + "windows" "31" + "linux" "33" + } + + "oncontrols" + { + "windows" "32" + "linux" "34" + } + + "issneaking" + { + "windows" "33" + "linux" "35" + } + + "isalive" + { + "windows" "34" + "linux" "36" + } + + "isbspmodel" + { + "windows" "35" + "linux" "37" + } + + "reflectgauss" + { + "windows" "36" + "linux" "38" + } + + "hastarget" + { + "windows" "37" + "linux" "39" + } + + "isinworld" + { + "windows" "38" + "linux" "40" + } + + "isplayer" + { + "windows" "39" + "linux" "41" + } + + "isnetclient" + { + "windows" "40" + "linux" "42" + } + + "teamid" + { + "windows" "41" + "linux" "43" + } + + "getnexttarget" + { + "windows" "42" + "linux" "44" + } + + "think" + { + "windows" "43" + "linux" "45" + } + + "touch" + { + "windows" "44" + "linux" "46" + } + + "use" + { + "windows" "45" + "linux" "47" + } + + "blocked" + { + "windows" "46" + "linux" "48" + } + + "respawn" + { + "windows" "48" + "linux" "50" + } + + "updateowner" + { + "windows" "49" + "linux" "51" + } + + "fbecomeprone" + { + "windows" "50" + "linux" "52" + } + + "center" + { + "windows" "51" + "linux" "53" + } + + "eyeposition" + { + "windows" "52" + "linux" "54" + } + + "earposition" + { + "windows" "53" + "linux" "55" + } + + "bodytarget" + { + "windows" "54" + "linux" "56" + } + + "illumination" + { + "windows" "55" + "linux" "57" + } + + "fvisible" + { + "windows" "56" + "linux" "58" + } + + "fvecvisible" + { + "windows" "57" + "linux" "59" + } + + "look" + { + "windows" "60" + "linux" "62" + } + + "changeyaw" + { + "windows" "63" + "linux" "65" + } + + "irelationship" + { + "windows" "65" + "linux" "67" + } + + "monsterinitdead" + { + "windows" "67" + "linux" "69" + } + + "becomedead" + { + "windows" "68" + "linux" "70" + } + + "bestvisibleenemy" + { + "windows" "70" + "linux" "72" + } + + "finviewcone" + { + "windows" "71" + "linux" "73" + } + + "fvecinviewcone" + { + "windows" "72" + "linux" "74" + } + + "runai" + { + "windows" "61" + "linux" "63" + } + + "monsterthink" + { + "windows" "64" + "linux" "66" + } + + "monsterinit" + { + "windows" "66" + "linux" "68" + } + + "checklocalmove" + { + "windows" "73" + "linux" "75" + } + + "move" + { + "windows" "74" + "linux" "76" + } + + "moveexecute" + { + "windows" "75" + "linux" "77" + } + + "shouldadvanceroute" + { + "windows" "76" + "linux" "78" + } + + "getstoppedactivity" + { + "windows" "77" + "linux" "79" + } + + "stop" + { + "windows" "78" + "linux" "80" + } + + "checkrangeattack1" + { + "windows" "79" + "linux" "81" + } + + "checkrangeattack2" + { + "windows" "80" + "linux" "82" + } + + "checkmeleeattack1" + { + "windows" "81" + "linux" "83" + } + + "checkmeleeattack2" + { + "windows" "82" + "linux" "84" + } + + "schedulechange" + { + "windows" "88" + "linux" "90" + } + + "canplaysequence" + { + "windows" "89" + "linux" "91" + } + + "canplaysentence" + { + "windows" "90" + "linux" "92" + } + + "playsentence" + { + "windows" "91" + "linux" "93" + } + + "playscriptedsentence" + { + "windows" "92" + "linux" "94" + } + + "sentencestop" + { + "windows" "93" + "linux" "95" + } + + "getidealstate" + { + "windows" "94" + "linux" "96" + } + + "setactivity" + { + "windows" "95" + "linux" "97" + } + + "reportaistate" + { + "windows" "96" + "linux" "98" + } + + "checkenemy" + { + "windows" "97" + "linux" "99" + } + + "ftriangulate" + { + "windows" "98" + "linux" "100" + } + + "setyawspeed" + { + "windows" "99" + "linux" "101" + } + + "buildnearestroute" + { + "windows" "100" + "linux" "102" + } + + "findcover" + { + "windows" "101" + "linux" "103" + } + + "coverradius" + { + "windows" "103" + "linux" "105" + } + + "fcancheckattacks" + { + "windows" "104" + "linux" "106" + } + + "checkammo" + { + "windows" "105" + "linux" "107" + } + + "ignoreconditions" + { + "windows" "106" + "linux" "108" + } + + "fvalidatehinttype" + { + "windows" "107" + "linux" "109" + } + + "fcanactiveidle" + { + "windows" "108" + "linux" "110" + } + + "isoundmask" + { + "windows" "109" + "linux" "111" + } + + "hearingsensitivity" + { + "windows" "112" + "linux" "114" + } + + "barnaclevictimbitten" + { + "windows" "113" + "linux" "115" + } + + "barnaclevictimreleased" + { + "windows" "114" + "linux" "116" + } + + "preschedulethink" + { + "windows" "115" + "linux" "117" + } + + "getdeathactivity" + { + "windows" "116" + "linux" "118" + } + + "gibmonster" + { + "windows" "117" + "linux" "119" + } + + "hashumangibs" + { + "windows" "118" + "linux" "120" + } + + "hasaliengibs" + { + "windows" "119" + "linux" "121" + } + + "fademonster" + { + "windows" "120" + "linux" "122" + } + + "deathsound" + { + "windows" "122" + "linux" "124" + } + + "alertsound" + { + "windows" "123" + "linux" "125" + } + + "idlesound" + { + "windows" "124" + "linux" "126" + } + + "painsound" + { + "windows" "125" + "linux" "127" + } + + "stopfollowing" + { + "windows" "126" + "linux" "128" + } + + "player_jump" + { + "windows" "127" + "linux" "129" + } + + "player_duck" + { + "windows" "128" + "linux" "130" + } + + "player_prethink" + { + "windows" "129" + "linux" "131" + } + + "player_postthink" + { + "windows" "130" + "linux" "132" + } + + "player_getgunposition" + { + "windows" "121" + "linux" "123" + } + + "player_shouldfadeondeath" + { + "windows" "62" + "linux" "64" + } + + "player_impulsecommands" + { + "windows" "132" + "linux" "134" + } + + "player_updateclientdata" + { + "windows" "131" + "linux" "133" + } + + "item_addtoplayer" + { + "windows" "59" + "linux" "61" + } + + "item_addduplicate" + { + "windows" "60" + "linux" "62" + } + + "item_getiteminfo" + { + "windows" "61" + "linux" "63" + } + + "item_candeploy" + { + "windows" "62" + "linux" "64" + } + + "item_deploy" + { + "windows" "63" + "linux" "65" + } + + "item_canholster" + { + "windows" "64" + "linux" "66" + } + + "item_holster" + { + "windows" "65" + "linux" "67" + } + + "item_updateiteminfo" + { + "windows" "66" + "linux" "68" + } + + "item_preframe" + { + "windows" "67" + "linux" "69" + } + + "item_postframe" + { + "windows" "68" + "linux" "70" + } + + "item_drop" + { + "windows" "69" + "linux" "71" + } + + "item_kill" + { + "windows" "70" + "linux" "72" + } + + "item_attachtoplayer" + { + "windows" "71" + "linux" "73" + } + + "item_primaryammoindex" + { + "windows" "72" + "linux" "74" + } + + "item_secondaryammoindex" + { + "windows" "73" + "linux" "75" + } + + "item_updateclientdata" + { + "windows" "74" + "linux" "76" + } + + "item_getweaponptr" + { + "windows" "75" + "linux" "77" + } + + "item_itemslot" + { + "windows" "76" + "linux" "78" + } + + "weapon_extractammo" + { + "windows" "77" + "linux" "79" + } + + "weapon_extractclipammo" + { + "windows" "78" + "linux" "80" + } + + "weapon_addweapon" + { + "windows" "79" + "linux" "81" + } + + "weapon_playemptysound" + { + "windows" "80" + "linux" "82" + } + + "weapon_resetemptysound" + { + "windows" "81" + "linux" "83" + } + + "weapon_sendweaponanim" + { + "windows" "82" + "linux" "84" + } + + "weapon_isusable" + { + "windows" "83" + "linux" "85" + } + + "weapon_primaryattack" + { + "windows" "84" + "linux" "86" + } + + "weapon_secondaryattack" + { + "windows" "85" + "linux" "87" + } + + "weapon_reload" + { + "windows" "86" + "linux" "88" + } + + "weapon_weaponidle" + { + "windows" "87" + "linux" "89" + } + + "weapon_retireweapon" + { + "windows" "88" + "linux" "90" + } + + "weapon_shouldweaponidle" + { + "windows" "89" + "linux" "91" + } + + "weapon_usedecrement" + { + "windows" "90" + "linux" "92" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/cstrike/offsets-common.txt b/gamedata/common.games/virtual.games/cstrike/offsets-common.txt new file mode 100644 index 00000000..c9a3c4fe --- /dev/null +++ b/gamedata/common.games/virtual.games/cstrike/offsets-common.txt @@ -0,0 +1,874 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + "mac" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + "mac" "0x0" + } + + "spawn" + { + "windows" "0" + "linux" "0" + "mac" "0" + } + + "precache" + { + "windows" "1" + "linux" "1" + "mac" "1" + } + + "keyvalue" + { + "windows" "3" + "linux" "3" + "mac" "3" + } + + "objectcaps" + { + "windows" "6" + "linux" "6" + "mac" "6" + } + + "activate" + { + "windows" "7" + "linux" "7" + "mac" "7" + } + + "setobjectcollisionbox" + { + "windows" "8" + "linux" "8" + "mac" "8" + } + + "classify" + { + "windows" "9" + "linux" "9" + "mac" "9" + } + + "deathnotice" + { + "windows" "10" + "linux" "10" + "mac" "10" + } + + "traceattack" + { + "windows" "11" + "linux" "11" + "mac" "11" + } + + "takedamage" + { + "windows" "12" + "linux" "12" + "mac" "12" + } + + "takehealth" + { + "windows" "13" + "linux" "13" + "mac" "13" + } + + "killed" + { + "windows" "14" + "linux" "14" + "mac" "14" + } + + "bloodcolor" + { + "windows" "15" + "linux" "15" + "mac" "15" + } + + "tracebleed" + { + "windows" "16" + "linux" "16" + "mac" "16" + } + + "istriggered" + { + "windows" "17" + "linux" "17" + "mac" "17" + } + + "mymonsterpointer" + { + "windows" "18" + "linux" "18" + "mac" "18" + } + + "mysquadmonsterpointer" + { + "windows" "19" + "linux" "19" + "mac" "19" + } + + "gettogglestate" + { + "windows" "20" + "linux" "20" + "mac" "20" + } + + "addpoints" + { + "windows" "21" + "linux" "21" + "mac" "21" + } + + "addpointstoteam" + { + "windows" "22" + "linux" "22" + "mac" "22" + } + + "addplayeritem" + { + "windows" "23" + "linux" "23" + "mac" "23" + } + + "removeplayeritem" + { + "windows" "24" + "linux" "24" + "mac" "24" + } + + "giveammo" + { + "windows" "25" + "linux" "25" + "mac" "25" + } + + "getdelay" + { + "windows" "26" + "linux" "26" + "mac" "26" + } + + "ismoving" + { + "windows" "27" + "linux" "27" + "mac" "27" + } + + "overridereset" + { + "windows" "28" + "linux" "28" + "mac" "28" + } + + "damagedecal" + { + "windows" "29" + "linux" "29" + "mac" "29" + } + + "settogglestate" + { + "windows" "30" + "linux" "30" + "mac" "30" + } + + "startsneaking" + { + "windows" "31" + "linux" "31" + "mac" "31" + } + + "stopsneaking" + { + "windows" "32" + "linux" "32" + "mac" "32" + } + + "oncontrols" + { + "windows" "33" + "linux" "33" + "mac" "33" + } + + "issneaking" + { + "windows" "34" + "linux" "34" + "mac" "34" + } + + "isalive" + { + "windows" "35" + "linux" "35" + "mac" "35" + } + + "isbspmodel" + { + "windows" "36" + "linux" "36" + "mac" "36" + } + + "reflectgauss" + { + "windows" "37" + "linux" "37" + "mac" "37" + } + + "hastarget" + { + "windows" "38" + "linux" "38" + "mac" "38" + } + + "isinworld" + { + "windows" "39" + "linux" "39" + "mac" "39" + } + + "isplayer" + { + "windows" "40" + "linux" "40" + "mac" "40" + } + + "isnetclient" + { + "windows" "41" + "linux" "41" + "mac" "41" + } + + "teamid" + { + "windows" "42" + "linux" "42" + "mac" "42" + } + + "getnexttarget" + { + "windows" "43" + "linux" "43" + "mac" "43" + } + + "think" + { + "windows" "44" + "linux" "44" + "mac" "44" + } + + "touch" + { + "windows" "45" + "linux" "45" + "mac" "45" + } + + "use" + { + "windows" "46" + "linux" "46" + "mac" "46" + } + + "blocked" + { + "windows" "47" + "linux" "47" + "mac" "47" + } + + "respawn" + { + "windows" "48" + "linux" "48" + "mac" "48" + } + + "updateowner" + { + "windows" "49" + "linux" "49" + "mac" "49" + } + + "fbecomeprone" + { + "windows" "50" + "linux" "50" + "mac" "50" + } + + "center" + { + "windows" "51" + "linux" "51" + "mac" "51" + } + + "eyeposition" + { + "windows" "52" + "linux" "52" + "mac" "52" + } + + "earposition" + { + "windows" "53" + "linux" "53" + "mac" "53" + } + + "bodytarget" + { + "windows" "54" + "linux" "54" + "mac" "54" + } + + "illumination" + { + "windows" "55" + "linux" "55" + "mac" "55" + } + + "fvisible" + { + "windows" "56" + "linux" "56" + "mac" "56" + } + + "fvecvisible" + { + "windows" "57" + "linux" "57" + "mac" "57" + } + + "changeyaw" + { + "windows" "59" + "linux" "59" + "mac" "59" + } + + "hashumangibs" + { + "windows" "60" + "linux" "60" + "mac" "60" + } + + "hasaliengibs" + { + "windows" "61" + "linux" "61" + "mac" "61" + } + + "fademonster" + { + "windows" "62" + "linux" "62" + "mac" "62" + } + + "gibmonster" + { + "windows" "63" + "linux" "63" + "mac" "63" + } + + "getdeathactivity" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "becomedead" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "irelationship" + { + "windows" "67" + "linux" "67" + "mac" "67" + } + + "painsound" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "reportaistate" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "monsterinitdead" + { + "windows" "71" + "linux" "71" + "mac" "71" + } + + "look" + { + "windows" "72" + "linux" "72" + "mac" "72" + } + + "bestvisibleenemy" + { + "windows" "73" + "linux" "73" + "mac" "73" + } + + "finviewcone" + { + "windows" "75" + "linux" "74" + "mac" "74" + } + + "fvecinviewcone" + { + "windows" "74" + "linux" "75" + "mac" "75" + } + + "player_jump" + { + "windows" "76" + "linux" "76" + "mac" "76" + } + + "player_duck" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "player_prethink" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "player_postthink" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "player_getgunposition" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "player_shouldfadeondeath" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "player_impulsecommands" + { + "windows" "83" + "linux" "83" + "mac" "83" + } + + "player_updateclientdata" + { + "windows" "82" + "linux" "82" + "mac" "82" + } + + "item_addtoplayer" + { + "windows" "59" + "linux" "59" + "mac" "59" + } + + "item_addduplicate" + { + "windows" "60" + "linux" "60" + "mac" "60" + } + + "item_getiteminfo" + { + "windows" "61" + "linux" "61" + "mac" "61" + } + + "item_candeploy" + { + "windows" "62" + "linux" "62" + "mac" "62" + } + + "item_deploy" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "item_canholster" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "item_holster" + { + "windows" "67" + "linux" "67" + "mac" "67" + } + + "item_updateiteminfo" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "item_preframe" + { + "windows" "69" + "linux" "69" + "mac" "69" + } + + "item_postframe" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "item_drop" + { + "windows" "71" + "linux" "71" + "mac" "71" + } + + "item_kill" + { + "windows" "72" + "linux" "72" + "mac" "72" + } + + "item_attachtoplayer" + { + "windows" "73" + "linux" "73" + "mac" "73" + } + + "item_primaryammoindex" + { + "windows" "74" + "linux" "74" + "mac" "74" + } + + "item_secondaryammoindex" + { + "windows" "75" + "linux" "75" + "mac" "75" + } + + "item_updateclientdata" + { + "windows" "76" + "linux" "76" + "mac" "76" + } + + "item_getweaponptr" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "item_itemslot" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "weapon_extractammo" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "weapon_extractclipammo" + { + "windows" "81" + "linux" "81" + "mac" "81" + } + + "weapon_addweapon" + { + "windows" "82" + "linux" "82" + "mac" "82" + } + + "weapon_playemptysound" + { + "windows" "83" + "linux" "83" + "mac" "83" + } + + "weapon_resetemptysound" + { + "windows" "84" + "linux" "84" + "mac" "84" + } + + "weapon_isusable" + { + "windows" "86" + "linux" "86" + "mac" "86" + } + + "weapon_primaryattack" + { + "windows" "87" + "linux" "87" + "mac" "87" + } + + "weapon_secondaryattack" + { + "windows" "88" + "linux" "88" + "mac" "88" + } + + "weapon_reload" + { + "windows" "89" + "linux" "89" + "mac" "89" + } + + "weapon_weaponidle" + { + "windows" "90" + "linux" "90" + "mac" "90" + } + + "weapon_retireweapon" + { + "windows" "91" + "linux" "91" + "mac" "91" + } + + "weapon_shouldweaponidle" + { + "windows" "92" + "linux" "92" + "mac" "92" + } + + "weapon_usedecrement" + { + "windows" "93" + "linux" "93" + "mac" "93" + } + + "cstrike_restart" + { + "windows" "2" + "linux" "2" + "mac" "2" + } + + "cstrike_roundrespawn" + { + "windows" "84" + "linux" "84" + "mac" "84" + } + + "cstrike_item_candrop" + { + "windows" "63" + "linux" "63" + "mac" "63" + } + + "cstrike_item_isweapon" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "cstrike_item_getmaxspeed" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "cstrike_weapon_sendweaponanim" + { + "windows" "85" + "linux" "85" + "mac" "85" + } + + "cstrike_player_resetmaxspeed" + { + "windows" "69" + "linux" "69" + "mac" "69" + } + + "cstrike_player_isbot" + { + "windows" "81" + "linux" "81" + "mac" "81" + } + + "cstrike_player_getautoaimvector" + { + "windows" "85" + "linux" "85" + "mac" "85" + } + + "cstrike_player_blind" + { + "windows" "86" + "linux" "86" + "mac" "86" + } + + "cstrike_player_ontouchingweapon" + { + "windows" "87" + "linux" "87" + "mac" "87" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/dod/offsets-common.txt b/gamedata/common.games/virtual.games/dod/offsets-common.txt new file mode 100644 index 00000000..97275ff7 --- /dev/null +++ b/gamedata/common.games/virtual.games/dod/offsets-common.txt @@ -0,0 +1,1238 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + "mac" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + "mac" "0x0" + } + + "spawn" + { + "windows" "3" + "linux" "3" + "mac" "3" + } + + "precache" + { + "windows" "4" + "linux" "4" + "mac" "4" + } + + "keyvalue" + { + "windows" "5" + "linux" "5" + "mac" "5" + } + + "objectcaps" + { + "windows" "8" + "linux" "8" + "mac" "8" + } + + "activate" + { + "windows" "9" + "linux" "9" + "mac" "9" + } + + "setobjectcollisionbox" + { + "windows" "12" + "linux" "12" + "mac" "12" + } + + "classify" + { + "windows" "13" + "linux" "13" + "mac" "13" + } + + "deathnotice" + { + "windows" "14" + "linux" "14" + "mac" "14" + } + + "traceattack" + { + "windows" "17" + "linux" "17" + "mac" "17" + } + + "takedamage" + { + "windows" "18" + "linux" "18" + "mac" "18" + } + + "takehealth" + { + "windows" "19" + "linux" "19" + "mac" "19" + } + + "killed" + { + "windows" "20" + "linux" "20" + "mac" "20" + } + + "bloodcolor" + { + "windows" "21" + "linux" "21" + "mac" "21" + } + + "tracebleed" + { + "windows" "22" + "linux" "22" + "mac" "22" + } + + "mymonsterpointer" + { + "windows" "23" + "linux" "23" + "mac" "23" + } + + "mysquadmonsterpointer" + { + "windows" "24" + "linux" "24" + "mac" "24" + } + + "gettogglestate" + { + "windows" "25" + "linux" "25" + "mac" "25" + } + + "addpoints" + { + "windows" "26" + "linux" "26" + "mac" "26" + } + + "addpointstoteam" + { + "windows" "27" + "linux" "27" + "mac" "27" + } + + "addplayeritem" + { + "windows" "28" + "linux" "28" + "mac" "28" + } + + "removeplayeritem" + { + "windows" "29" + "linux" "29" + "mac" "29" + } + + "giveammo" + { + "windows" "30" + "linux" "30" + "mac" "30" + } + + "getdelay" + { + "windows" "31" + "linux" "31" + "mac" "31" + } + + "ismoving" + { + "windows" "32" + "linux" "32" + "mac" "32" + } + + "overridereset" + { + "windows" "33" + "linux" "33" + "mac" "33" + } + + "damagedecal" + { + "windows" "34" + "linux" "34" + "mac" "34" + } + + "settogglestate" + { + "windows" "35" + "linux" "35" + "mac" "35" + } + + "startsneaking" + { + "windows" "36" + "linux" "36" + "mac" "36" + } + + "stopsneaking" + { + "windows" "37" + "linux" "37" + "mac" "37" + } + + "oncontrols" + { + "windows" "38" + "linux" "38" + "mac" "38" + } + + "issneaking" + { + "windows" "39" + "linux" "39" + "mac" "39" + } + + "isalive" + { + "windows" "40" + "linux" "40" + "mac" "40" + } + + "isbspmodel" + { + "windows" "41" + "linux" "41" + "mac" "41" + } + + "reflectgauss" + { + "windows" "42" + "linux" "42" + "mac" "42" + } + + "hastarget" + { + "windows" "43" + "linux" "43" + "mac" "43" + } + + "isinworld" + { + "windows" "44" + "linux" "44" + "mac" "44" + } + + "isplayer" + { + "windows" "45" + "linux" "45" + "mac" "45" + } + + "isnetclient" + { + "windows" "46" + "linux" "46" + "mac" "46" + } + + "teamid" + { + "windows" "47" + "linux" "47" + "mac" "47" + } + + "getnexttarget" + { + "windows" "48" + "linux" "48" + "mac" "48" + } + + "think" + { + "windows" "49" + "linux" "49" + "mac" "49" + } + + "touch" + { + "windows" "50" + "linux" "50" + "mac" "50" + } + + "use" + { + "windows" "51" + "linux" "51" + "mac" "51" + } + + "blocked" + { + "windows" "52" + "linux" "52" + "mac" "52" + } + + "respawn" + { + "windows" "53" + "linux" "53" + "mac" "53" + } + + "updateowner" + { + "windows" "54" + "linux" "54" + "mac" "54" + } + + "fbecomeprone" + { + "windows" "55" + "linux" "55" + "mac" "55" + } + + "center" + { + "windows" "56" + "linux" "56" + "mac" "56" + } + + "eyeposition" + { + "windows" "57" + "linux" "57" + "mac" "57" + } + + "earposition" + { + "windows" "58" + "linux" "58" + "mac" "58" + } + + "bodytarget" + { + "windows" "59" + "linux" "59" + "mac" "59" + } + + "illumination" + { + "windows" "60" + "linux" "60" + "mac" "60" + } + + "fvisible" + { + "windows" "62" + "linux" "61" + "mac" "61" + } + + "fvecvisible" + { + "windows" "61" + "linux" "62" + "mac" "62" + } + + "look" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "changeyaw" + { + "windows" "67" + "linux" "67" + "mac" "67" + } + + "irelationship" + { + "windows" "69" + "linux" "69" + "mac" "69" + } + + "monsterinitdead" + { + "windows" "71" + "linux" "71" + "mac" "71" + } + + "bestvisibleenemy" + { + "windows" "74" + "linux" "74" + "mac" "74" + } + + "finviewcone" + { + "windows" "76" + "linux" "75" + "mac" "75" + } + + "fvecinviewcone" + { + "windows" "75" + "linux" "76" + "mac" "76" + } + + "runai" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "monsterthink" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "monsterinit" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "checklocalmove" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "move" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "moveexecute" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "shouldadvanceroute" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "getstoppedactivity" + { + "windows" "81" + "linux" "81" + "mac" "81" + } + + "stop" + { + "windows" "82" + "linux" "82" + "mac" "82" + } + + "checkrangeattack1" + { + "windows" "83" + "linux" "83" + "mac" "83" + } + + "checkrangeattack2" + { + "windows" "84" + "linux" "84" + "mac" "84" + } + + "checkmeleeattack1" + { + "windows" "85" + "linux" "85" + "mac" "85" + } + + "checkmeleeattack2" + { + "windows" "86" + "linux" "86" + "mac" "86" + } + + "schedulechange" + { + "windows" "92" + "linux" "92" + "mac" "92" + } + + "canplaysequence" + { + "windows" "93" + "linux" "93" + "mac" "93" + } + + "canplaysentence" + { + "windows" "94" + "linux" "94" + "mac" "94" + } + + "playsentence" + { + "windows" "95" + "linux" "95" + "mac" "95" + } + + "playscriptedsentence" + { + "windows" "96" + "linux" "96" + "mac" "96" + } + + "sentencestop" + { + "windows" "97" + "linux" "97" + "mac" "97" + } + + "getidealstate" + { + "windows" "98" + "linux" "98" + "mac" "98" + } + + "setactivity" + { + "windows" "99" + "linux" "99" + "mac" "99" + } + + "reportaistate" + { + "windows" "100" + "linux" "100" + "mac" "100" + } + + "checkenemy" + { + "windows" "101" + "linux" "101" + "mac" "101" + } + + "ftriangulate" + { + "windows" "102" + "linux" "102" + "mac" "102" + } + + "setyawspeed" + { + "windows" "103" + "linux" "103" + "mac" "103" + } + + "buildnearestroute" + { + "windows" "104" + "linux" "104" + "mac" "104" + } + + "findcover" + { + "windows" "105" + "linux" "105" + "mac" "105" + } + + "coverradius" + { + "windows" "107" + "linux" "107" + "mac" "107" + } + + "fcancheckattacks" + { + "windows" "108" + "linux" "108" + "mac" "108" + } + + "checkammo" + { + "windows" "109" + "linux" "109" + "mac" "109" + } + + "ignoreconditions" + { + "windows" "110" + "linux" "110" + "mac" "110" + } + + "fvalidatehinttype" + { + "windows" "111" + "linux" "111" + "mac" "111" + } + + "fcanactiveidle" + { + "windows" "112" + "linux" "112" + "mac" "112" + } + + "isoundmask" + { + "windows" "113" + "linux" "113" + "mac" "113" + } + + "hearingsensitivity" + { + "windows" "116" + "linux" "116" + "mac" "116" + } + + "barnaclevictimbitten" + { + "windows" "117" + "linux" "117" + "mac" "117" + } + + "barnaclevictimreleased" + { + "windows" "118" + "linux" "118" + "mac" "118" + } + + "preschedulethink" + { + "windows" "120" + "linux" "120" + "mac" "120" + } + + "getdeathactivity" + { + "windows" "121" + "linux" "121" + "mac" "121" + } + + "gibmonster" + { + "windows" "122" + "linux" "122" + "mac" "122" + } + + "hashumangibs" + { + "windows" "123" + "linux" "123" + "mac" "123" + } + + "hasaliengibs" + { + "windows" "124" + "linux" "124" + "mac" "124" + } + + "fademonster" + { + "windows" "125" + "linux" "125" + "mac" "125" + } + + "deathsound" + { + "windows" "127" + "linux" "127" + "mac" "127" + } + + "alertsound" + { + "windows" "128" + "linux" "128" + "mac" "128" + } + + "idlesound" + { + "windows" "129" + "linux" "129" + "mac" "129" + } + + "painsound" + { + "windows" "130" + "linux" "130" + "mac" "130" + } + + "stopfollowing" + { + "windows" "131" + "linux" "131" + "mac" "131" + } + + "player_jump" + { + "windows" "134" + "linux" "134" + "mac" "134" + } + + "player_duck" + { + "windows" "135" + "linux" "135" + "mac" "135" + } + + "player_prethink" + { + "windows" "132" + "linux" "132" + "mac" "132" + } + + "player_postthink" + { + "windows" "133" + "linux" "133" + "mac" "133" + } + + "player_getgunposition" + { + "windows" "126" + "linux" "126" + "mac" "126" + } + + "player_shouldfadeondeath" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "player_impulsecommands" + { + "windows" "137" + "linux" "137" + "mac" "137" + } + + "player_updateclientdata" + { + "windows" "136" + "linux" "136" + "mac" "136" + } + + "item_addtoplayer" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "item_addduplicate" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "item_getiteminfo" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "item_candeploy" + { + "windows" "67" + "linux" "67" + "mac" "67" + } + + "item_deploy" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "item_canholster" + { + "windows" "73" + "linux" "73" + "mac" "73" + } + + "item_holster" + { + "windows" "74" + "linux" "74" + "mac" "74" + } + + "item_updateiteminfo" + { + "windows" "75" + "linux" "75" + "mac" "75" + } + + "item_preframe" + { + "windows" "76" + "linux" "76" + "mac" "76" + } + + "item_postframe" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "item_drop" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "item_kill" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "item_attachtoplayer" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "item_primaryammoindex" + { + "windows" "81" + "linux" "81" + "mac" "81" + } + + "item_secondaryammoindex" + { + "windows" "82" + "linux" "82" + "mac" "82" + } + + "item_updateclientdata" + { + "windows" "83" + "linux" "83" + "mac" "83" + } + + "item_getweaponptr" + { + "windows" "84" + "linux" "84" + "mac" "84" + } + + "item_itemslot" + { + "windows" "85" + "linux" "85" + "mac" "85" + } + + "weapon_extractammo" + { + "windows" "86" + "linux" "86" + "mac" "86" + } + + "weapon_extractclipammo" + { + "windows" "87" + "linux" "87" + "mac" "87" + } + + "weapon_addweapon" + { + "windows" "88" + "linux" "88" + "mac" "88" + } + + "weapon_playemptysound" + { + "windows" "89" + "linux" "89" + "mac" "89" + } + + "weapon_resetemptysound" + { + "windows" "90" + "linux" "90" + "mac" "90" + } + + "weapon_isusable" + { + "windows" "92" + "linux" "92" + "mac" "92" + } + + "weapon_primaryattack" + { + "windows" "102" + "linux" "102" + "mac" "102" + } + + "weapon_secondaryattack" + { + "windows" "103" + "linux" "103" + "mac" "103" + } + + "weapon_reload" + { + "windows" "104" + "linux" "104" + "mac" "104" + } + + "weapon_weaponidle" + { + "windows" "105" + "linux" "105" + "mac" "105" + } + + "weapon_retireweapon" + { + "windows" "106" + "linux" "106" + "mac" "106" + } + + "weapon_shouldweaponidle" + { + "windows" "107" + "linux" "107" + "mac" "107" + } + + "weapon_usedecrement" + { + "windows" "108" + "linux" "108" + "mac" "108" + } + + "dod_roundrespawn" + { + "windows" "0" + "linux" "0" + "mac" "0" + } + + "dod_roundrespawnent" + { + "windows" "1" + "linux" "1" + "mac" "1" + } + + "dod_roundstore" + { + "windows" "2" + "linux" "2" + "mac" "2" + } + + "dod_areasetindex" + { + "windows" "10" + "linux" "10" + "mac" "10" + } + + "dod_areasendstatus" + { + "windows" "11" + "linux" "11" + "mac" "11" + } + + "dod_getstate" + { + "windows" "16" + "linux" "15" + "mac" "15" + } + + "dod_getstateent" + { + "windows" "15" + "linux" "16" + "mac" "16" + } + + "dod_setscriptreset" + { + "windows" "119" + "linux" "119" + "mac" "119" + } + + "dod_item_candrop" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "dod_item_spawndeploy" + { + "windows" "69" + "linux" "69" + "mac" "69" + } + + "dod_item_setdmgtime" + { + "windows" "71" + "linux" "71" + "mac" "71" + } + + "dod_item_dropgren" + { + "windows" "72" + "linux" "72" + "mac" "72" + } + + "dod_weapon_sendweaponanim" + { + "windows" "91" + "linux" "91" + "mac" "91" + } + + "dod_weapon_isuseable" + { + "windows" "92" + "linux" "92" + "mac" "92" + } + + "dod_weapon_aim" + { + "windows" "93" + "linux" "93" + "mac" "93" + } + + "dod_weapon_flaim" + { + "windows" "94" + "linux" "94" + "mac" "94" + } + + "dod_weapon_removestamina" + { + "windows" "95" + "linux" "95" + "mac" "95" + } + + "dod_weapon_changefov" + { + "windows" "96" + "linux" "96" + "mac" "96" + } + + "dod_weapon_zoomout" + { + "windows" "97" + "linux" "97" + "mac" "97" + } + + "dod_weapon_zoomin" + { + "windows" "98" + "linux" "98" + "mac" "98" + } + + "dod_weapon_getfov" + { + "windows" "99" + "linux" "99" + "mac" "99" + } + + "dod_weapon_playeriswatersniping" + { + "windows" "100" + "linux" "100" + "mac" "100" + } + + "dod_weapon_updatezoomspeed" + { + "windows" "101" + "linux" "101" + "mac" "101" + } + + "dod_weapon_special" + { + "windows" "105" + "linux" "105" + "mac" "105" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/esf/offsets-common.txt b/gamedata/common.games/virtual.games/esf/offsets-common.txt new file mode 100644 index 00000000..98ed1d6a --- /dev/null +++ b/gamedata/common.games/virtual.games/esf/offsets-common.txt @@ -0,0 +1,902 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "0" + } + + "base" + { + "windows" "0x0" + "linux" "0x60" + } + + "spawn" + { + "windows" "0" + "linux" "2" + } + + "precache" + { + "windows" "1" + "linux" "3" + } + + "keyvalue" + { + "windows" "2" + "linux" "4" + } + + "objectcaps" + { + "windows" "5" + "linux" "7" + } + + "activate" + { + "windows" "6" + "linux" "8" + } + + "setobjectcollisionbox" + { + "windows" "7" + "linux" "9" + } + + "classify" + { + "windows" "8" + "linux" "10" + } + + "deathnotice" + { + "windows" "9" + "linux" "11" + } + + "traceattack" + { + "windows" "10" + "linux" "12" + } + + "takedamage" + { + "windows" "11" + "linux" "13" + } + + "takehealth" + { + "windows" "12" + "linux" "14" + } + + "killed" + { + "windows" "13" + "linux" "15" + } + + "bloodcolor" + { + "windows" "14" + "linux" "16" + } + + "tracebleed" + { + "windows" "15" + "linux" "17" + } + + "istriggered" + { + "windows" "16" + "linux" "18" + } + + "mymonsterpointer" + { + "windows" "17" + "linux" "19" + } + + "mysquadmonsterpointer" + { + "windows" "18" + "linux" "20" + } + + "gettogglestate" + { + "windows" "19" + "linux" "21" + } + + "addpoints" + { + "windows" "20" + "linux" "22" + } + + "addpointstoteam" + { + "windows" "21" + "linux" "23" + } + + "addplayeritem" + { + "windows" "22" + "linux" "24" + } + + "removeplayeritem" + { + "windows" "23" + "linux" "25" + } + + "getdelay" + { + "windows" "24" + "linux" "26" + } + + "ismoving" + { + "windows" "25" + "linux" "27" + } + + "overridereset" + { + "windows" "26" + "linux" "28" + } + + "damagedecal" + { + "windows" "27" + "linux" "29" + } + + "settogglestate" + { + "windows" "28" + "linux" "30" + } + + "startsneaking" + { + "windows" "29" + "linux" "31" + } + + "stopsneaking" + { + "windows" "30" + "linux" "32" + } + + "oncontrols" + { + "windows" "31" + "linux" "33" + } + + "issneaking" + { + "windows" "32" + "linux" "34" + } + + "isalive" + { + "windows" "33" + "linux" "35" + } + + "isbspmodel" + { + "windows" "34" + "linux" "36" + } + + "reflectgauss" + { + "windows" "35" + "linux" "37" + } + + "hastarget" + { + "windows" "36" + "linux" "38" + } + + "isinworld" + { + "windows" "37" + "linux" "39" + } + + "isplayer" + { + "windows" "38" + "linux" "40" + } + + "isnetclient" + { + "windows" "39" + "linux" "41" + } + + "teamid" + { + "windows" "40" + "linux" "42" + } + + "getnexttarget" + { + "windows" "41" + "linux" "43" + } + + "think" + { + "windows" "42" + "linux" "44" + } + + "touch" + { + "windows" "43" + "linux" "45" + } + + "use" + { + "windows" "44" + "linux" "46" + } + + "blocked" + { + "windows" "45" + "linux" "47" + } + + "respawn" + { + "windows" "46" + "linux" "48" + } + + "updateowner" + { + "windows" "47" + "linux" "49" + } + + "fbecomeprone" + { + "windows" "48" + "linux" "50" + } + + "center" + { + "windows" "49" + "linux" "51" + } + + "eyeposition" + { + "windows" "50" + "linux" "52" + } + + "earposition" + { + "windows" "51" + "linux" "53" + } + + "bodytarget" + { + "windows" "52" + "linux" "54" + } + + "illumination" + { + "windows" "53" + "linux" "55" + } + + "fvisible" + { + "windows" "54" + "linux" "56" + } + + "fvecvisible" + { + "windows" "55" + "linux" "57" + } + + "look" + { + "windows" "57" + "linux" "59" + } + + "changeyaw" + { + "windows" "60" + "linux" "62" + } + + "irelationship" + { + "windows" "62" + "linux" "64" + } + + "monsterinitdead" + { + "windows" "64" + "linux" "66" + } + + "becomedead" + { + "windows" "65" + "linux" "67" + } + + "bestvisibleenemy" + { + "windows" "67" + "linux" "69" + } + + "finviewcone" + { + "windows" "68" + "linux" "70" + } + + "fvecinviewcone" + { + "windows" "69" + "linux" "71" + } + + "runai" + { + "windows" "58" + "linux" "60" + } + + "monsterthink" + { + "windows" "61" + "linux" "63" + } + + "monsterinit" + { + "windows" "63" + "linux" "65" + } + + "checklocalmove" + { + "windows" "70" + "linux" "72" + } + + "move" + { + "windows" "71" + "linux" "73" + } + + "moveexecute" + { + "windows" "72" + "linux" "74" + } + + "shouldadvanceroute" + { + "windows" "73" + "linux" "75" + } + + "getstoppedactivity" + { + "windows" "74" + "linux" "76" + } + + "stop" + { + "windows" "75" + "linux" "77" + } + + "checkrangeattack1" + { + "windows" "76" + "linux" "78" + } + + "checkrangeattack2" + { + "windows" "77" + "linux" "79" + } + + "checkmeleeattack1" + { + "windows" "78" + "linux" "80" + } + + "checkmeleeattack2" + { + "windows" "79" + "linux" "81" + } + + "schedulechange" + { + "windows" "85" + "linux" "87" + } + + "canplaysequence" + { + "windows" "86" + "linux" "88" + } + + "canplaysentence" + { + "windows" "87" + "linux" "89" + } + + "playsentence" + { + "windows" "88" + "linux" "90" + } + + "playscriptedsentence" + { + "windows" "89" + "linux" "91" + } + + "sentencestop" + { + "windows" "90" + "linux" "92" + } + + "getidealstate" + { + "windows" "91" + "linux" "93" + } + + "setactivity" + { + "windows" "92" + "linux" "94" + } + + "reportaistate" + { + "windows" "93" + "linux" "95" + } + + "checkenemy" + { + "windows" "94" + "linux" "96" + } + + "ftriangulate" + { + "windows" "95" + "linux" "97" + } + + "setyawspeed" + { + "windows" "96" + "linux" "98" + } + + "buildnearestroute" + { + "windows" "97" + "linux" "99" + } + + "findcover" + { + "windows" "98" + "linux" "100" + } + + "coverradius" + { + "windows" "100" + "linux" "102" + } + + "fcancheckattacks" + { + "windows" "101" + "linux" "103" + } + + "checkammo" + { + "windows" "102" + "linux" "104" + } + + "ignoreconditions" + { + "windows" "103" + "linux" "105" + } + + "fvalidatehinttype" + { + "windows" "104" + "linux" "106" + } + + "fcanactiveidle" + { + "windows" "105" + "linux" "107" + } + + "isoundmask" + { + "windows" "106" + "linux" "108" + } + + "hearingsensitivity" + { + "windows" "109" + "linux" "111" + } + + "barnaclevictimbitten" + { + "windows" "110" + "linux" "112" + } + + "barnaclevictimreleased" + { + "windows" "111" + "linux" "113" + } + + "preschedulethink" + { + "windows" "112" + "linux" "114" + } + + "getdeathactivity" + { + "windows" "113" + "linux" "115" + } + + "gibmonster" + { + "windows" "114" + "linux" "116" + } + + "hashumangibs" + { + "windows" "115" + "linux" "117" + } + + "hasaliengibs" + { + "windows" "116" + "linux" "118" + } + + "fademonster" + { + "windows" "117" + "linux" "119" + } + + "deathsound" + { + "windows" "119" + "linux" "121" + } + + "alertsound" + { + "windows" "120" + "linux" "122" + } + + "idlesound" + { + "windows" "121" + "linux" "123" + } + + "painsound" + { + "windows" "122" + "linux" "124" + } + + "stopfollowing" + { + "windows" "123" + "linux" "125" + } + + "player_jump" + { + "windows" "124" + "linux" "126" + } + + "player_prethink" + { + "windows" "125" + "linux" "127" + } + + "player_postthink" + { + "windows" "126" + "linux" "128" + } + + "player_getgunposition" + { + "windows" "118" + "linux" "120" + } + + "player_shouldfadeondeath" + { + "windows" "59" + "linux" "61" + } + + "player_impulsecommands" + { + "windows" "128" + "linux" "130" + } + + "player_updateclientdata" + { + "windows" "127" + "linux" "129" + } + + "item_addtoplayer" + { + "windows" "57" + "linux" "59" + } + + "item_addduplicate" + { + "windows" "58" + "linux" "60" + } + + "item_getiteminfo" + { + "windows" "59" + "linux" "61" + } + + "item_candeploy" + { + "windows" "60" + "linux" "62" + } + + "item_deploy" + { + "windows" "61" + "linux" "63" + } + + "item_canholster" + { + "windows" "62" + "linux" "64" + } + + "item_holster" + { + "windows" "63" + "linux" "65" + } + + "item_updateiteminfo" + { + "windows" "64" + "linux" "66" + } + + "item_preframe" + { + "windows" "65" + "linux" "67" + } + + "item_postframe" + { + "windows" "66" + "linux" "68" + } + + "item_drop" + { + "windows" "67" + "linux" "69" + } + + "item_kill" + { + "windows" "68" + "linux" "70" + } + + "item_attachtoplayer" + { + "windows" "69" + "linux" "71" + } + + "item_primaryammoindex" + { + "windows" "70" + "linux" "72" + } + + "item_secondaryammoindex" + { + "windows" "71" + "linux" "73" + } + + "item_updateclientdata" + { + "windows" "72" + "linux" "74" + } + + "item_getweaponptr" + { + "windows" "73" + "linux" "75" + } + + "item_itemslot" + { + "windows" "74" + "linux" "76" + } + + "weapon_playemptysound" + { + "windows" "75" + "linux" "77" + } + + "weapon_resetemptysound" + { + "windows" "76" + "linux" "78" + } + + "weapon_sendweaponanim" + { + "windows" "77" + "linux" "79" + } + + "weapon_primaryattack" + { + "windows" "78" + "linux" "80" + } + + "weapon_secondaryattack" + { + "windows" "79" + "linux" "81" + } + + "weapon_weaponidle" + { + "windows" "80" + "linux" "82" + } + + "weapon_retireweapon" + { + "windows" "81" + "linux" "83" + } + + "weapon_shouldweaponidle" + { + "windows" "82" + "linux" "84" + } + + "weapon_usedecrement" + { + "windows" "83" + "linux" "85" + } + + "esf_weapon_holsterwhenmeleed" + { + "windows" "84" + "linux" "86" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/esf_openbeta/offsets-common.txt b/gamedata/common.games/virtual.games/esf_openbeta/offsets-common.txt new file mode 100644 index 00000000..ea081813 --- /dev/null +++ b/gamedata/common.games/virtual.games/esf_openbeta/offsets-common.txt @@ -0,0 +1,1388 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + } + + "spawn" + { + "windows" "0" + "linux" "0" + } + + "precache" + { + "windows" "1" + "linux" "1" + } + + "keyvalue" + { + "windows" "2" + "linux" "2" + } + + "objectcaps" + { + "windows" "5" + "linux" "5" + } + + "activate" + { + "windows" "6" + "linux" "6" + } + + "setobjectcollisionbox" + { + "windows" "7" + "linux" "7" + } + + "classify" + { + "windows" "8" + "linux" "8" + } + + "deathnotice" + { + "windows" "9" + "linux" "9" + } + + "traceattack" + { + "windows" "10" + "linux" "10" + } + + "takedamage" + { + "windows" "11" + "linux" "11" + } + + "takehealth" + { + "windows" "13" + "linux" "13" + } + + "killed" + { + "windows" "14" + "linux" "14" + } + + "bloodcolor" + { + "windows" "15" + "linux" "15" + } + + "tracebleed" + { + "windows" "16" + "linux" "16" + } + + "istriggered" + { + "windows" "17" + "linux" "17" + } + + "mymonsterpointer" + { + "windows" "18" + "linux" "18" + } + + "mysquadmonsterpointer" + { + "windows" "19" + "linux" "19" + } + + "gettogglestate" + { + "windows" "20" + "linux" "20" + } + + "addpoints" + { + "windows" "21" + "linux" "21" + } + + "addpointstoteam" + { + "windows" "22" + "linux" "22" + } + + "addplayeritem" + { + "windows" "23" + "linux" "23" + } + + "removeplayeritem" + { + "windows" "24" + "linux" "24" + } + + "getdelay" + { + "windows" "25" + "linux" "25" + } + + "ismoving" + { + "windows" "26" + "linux" "26" + } + + "overridereset" + { + "windows" "27" + "linux" "27" + } + + "damagedecal" + { + "windows" "28" + "linux" "28" + } + + "settogglestate" + { + "windows" "29" + "linux" "29" + } + + "startsneaking" + { + "windows" "30" + "linux" "30" + } + + "stopsneaking" + { + "windows" "31" + "linux" "31" + } + + "oncontrols" + { + "windows" "32" + "linux" "32" + } + + "issneaking" + { + "windows" "33" + "linux" "33" + } + + "isalive" + { + "windows" "34" + "linux" "34" + } + + "isbspmodel" + { + "windows" "35" + "linux" "35" + } + + "reflectgauss" + { + "windows" "36" + "linux" "36" + } + + "hastarget" + { + "windows" "37" + "linux" "37" + } + + "isinworld" + { + "windows" "38" + "linux" "38" + } + + "isplayer" + { + "windows" "39" + "linux" "39" + } + + "isnetclient" + { + "windows" "43" + "linux" "43" + } + + "teamid" + { + "windows" "44" + "linux" "44" + } + + "getnexttarget" + { + "windows" "47" + "linux" "47" + } + + "think" + { + "windows" "48" + "linux" "48" + } + + "touch" + { + "windows" "49" + "linux" "49" + } + + "use" + { + "windows" "50" + "linux" "50" + } + + "blocked" + { + "windows" "51" + "linux" "51" + } + + "respawn" + { + "windows" "52" + "linux" "52" + } + + "updateowner" + { + "windows" "53" + "linux" "53" + } + + "fbecomeprone" + { + "windows" "54" + "linux" "54" + } + + "center" + { + "windows" "55" + "linux" "55" + } + + "eyeposition" + { + "windows" "56" + "linux" "56" + } + + "earposition" + { + "windows" "57" + "linux" "57" + } + + "bodytarget" + { + "windows" "58" + "linux" "58" + } + + "illumination" + { + "windows" "59" + "linux" "59" + } + + "fvisible" + { + "windows" "60" + "linux" "60" + } + + "fvecvisible" + { + "windows" "61" + "linux" "61" + } + + "look" + { + "windows" "63" + "linux" "63" + } + + "changeyaw" + { + "windows" "66" + "linux" "66" + } + + "irelationship" + { + "windows" "68" + "linux" "68" + } + + "monsterinitdead" + { + "windows" "70" + "linux" "70" + } + + "becomedead" + { + "windows" "71" + "linux" "71" + } + + "bestvisibleenemy" + { + "windows" "73" + "linux" "73" + } + + "finviewcone" + { + "windows" "74" + "linux" "74" + } + + "fvecinviewcone" + { + "windows" "75" + "linux" "75" + } + + "runai" + { + "windows" "64" + "linux" "64" + } + + "monsterthink" + { + "windows" "67" + "linux" "67" + } + + "monsterinit" + { + "windows" "69" + "linux" "69" + } + + "checklocalmove" + { + "windows" "76" + "linux" "76" + } + + "move" + { + "windows" "77" + "linux" "77" + } + + "moveexecute" + { + "windows" "78" + "linux" "78" + } + + "shouldadvanceroute" + { + "windows" "79" + "linux" "79" + } + + "getstoppedactivity" + { + "windows" "80" + "linux" "80" + } + + "stop" + { + "windows" "81" + "linux" "81" + } + + "checkrangeattack1" + { + "windows" "82" + "linux" "82" + } + + "checkrangeattack2" + { + "windows" "83" + "linux" "83" + } + + "checkmeleeattack1" + { + "windows" "84" + "linux" "84" + } + + "checkmeleeattack2" + { + "windows" "85" + "linux" "85" + } + + "schedulechange" + { + "windows" "91" + "linux" "91" + } + + "canplaysequence" + { + "windows" "92" + "linux" "92" + } + + "canplaysentence" + { + "windows" "93" + "linux" "93" + } + + "playsentence" + { + "windows" "94" + "linux" "94" + } + + "playscriptedsentence" + { + "windows" "95" + "linux" "95" + } + + "sentencestop" + { + "windows" "96" + "linux" "96" + } + + "getidealstate" + { + "windows" "97" + "linux" "97" + } + + "setactivity" + { + "windows" "98" + "linux" "98" + } + + "reportaistate" + { + "windows" "99" + "linux" "99" + } + + "checkenemy" + { + "windows" "100" + "linux" "100" + } + + "ftriangulate" + { + "windows" "101" + "linux" "101" + } + + "setyawspeed" + { + "windows" "102" + "linux" "102" + } + + "buildnearestroute" + { + "windows" "103" + "linux" "103" + } + + "findcover" + { + "windows" "104" + "linux" "104" + } + + "coverradius" + { + "windows" "106" + "linux" "106" + } + + "fcancheckattacks" + { + "windows" "107" + "linux" "107" + } + + "checkammo" + { + "windows" "108" + "linux" "108" + } + + "ignoreconditions" + { + "windows" "109" + "linux" "109" + } + + "fvalidatehinttype" + { + "windows" "110" + "linux" "110" + } + + "fcanactiveidle" + { + "windows" "111" + "linux" "111" + } + + "isoundmask" + { + "windows" "112" + "linux" "112" + } + + "hearingsensitivity" + { + "windows" "115" + "linux" "115" + } + + "barnaclevictimbitten" + { + "windows" "116" + "linux" "116" + } + + "barnaclevictimreleased" + { + "windows" "117" + "linux" "117" + } + + "preschedulethink" + { + "windows" "118" + "linux" "118" + } + + "getdeathactivity" + { + "windows" "119" + "linux" "119" + } + + "gibmonster" + { + "windows" "120" + "linux" "120" + } + + "hashumangibs" + { + "windows" "121" + "linux" "121" + } + + "hasaliengibs" + { + "windows" "122" + "linux" "122" + } + + "fademonster" + { + "windows" "123" + "linux" "123" + } + + "deathsound" + { + "windows" "125" + "linux" "125" + } + + "alertsound" + { + "windows" "126" + "linux" "126" + } + + "idlesound" + { + "windows" "127" + "linux" "127" + } + + "painsound" + { + "windows" "128" + "linux" "128" + } + + "stopfollowing" + { + "windows" "129" + "linux" "129" + } + + "player_updateclientdata" + { + "windows" "186" + "linux" "186" + } + + "player_jump" + { + "windows" "187" + "linux" "187" + } + + "player_prethink" + { + "windows" "189" + "linux" "189" + } + + "player_postthink" + { + "windows" "190" + "linux" "190" + } + + "player_getgunposition" + { + "windows" "124" + "linux" "124" + } + + "player_shouldfadeondeath" + { + "windows" "65" + "linux" "65" + } + + "player_impulsecommands" + { + "windows" "193" + "linux" "193" + } + + "item_addtoplayer" + { + "windows" "63" + "linux" "63" + } + + "item_addduplicate" + { + "windows" "64" + "linux" "64" + } + + "item_getiteminfo" + { + "windows" "65" + "linux" "65" + } + + "item_candeploy" + { + "windows" "66" + "linux" "66" + } + + "item_deploy" + { + "windows" "67" + "linux" "67" + } + + "item_canholster" + { + "windows" "68" + "linux" "68" + } + + "item_holster" + { + "windows" "69" + "linux" "69" + } + + "item_updateiteminfo" + { + "windows" "70" + "linux" "70" + } + + "item_preframe" + { + "windows" "71" + "linux" "71" + } + + "item_postframe" + { + "windows" "72" + "linux" "72" + } + + "item_drop" + { + "windows" "73" + "linux" "73" + } + + "item_kill" + { + "windows" "74" + "linux" "74" + } + + "item_attachtoplayer" + { + "windows" "75" + "linux" "75" + } + + "item_primaryammoindex" + { + "windows" "76" + "linux" "76" + } + + "item_secondaryammoindex" + { + "windows" "77" + "linux" "77" + } + + "item_updateclientdata" + { + "windows" "78" + "linux" "78" + } + + "item_getweaponptr" + { + "windows" "79" + "linux" "79" + } + + "item_itemslot" + { + "windows" "80" + "linux" "80" + } + + "weapon_playemptysound" + { + "windows" "81" + "linux" "81" + } + + "weapon_resetemptysound" + { + "windows" "82" + "linux" "82" + } + + "weapon_sendweaponanim" + { + "windows" "83" + "linux" "83" + } + + "weapon_primaryattack" + { + "windows" "84" + "linux" "84" + } + + "weapon_secondaryattack" + { + "windows" "85" + "linux" "85" + } + + "weapon_weaponidle" + { + "windows" "86" + "linux" "86" + } + + "weapon_retireweapon" + { + "windows" "87" + "linux" "87" + } + + "weapon_shouldweaponidle" + { + "windows" "88" + "linux" "88" + } + + "weapon_usedecrement" + { + "windows" "89" + "linux" "89" + } + + "esf_isenvmodel" + { + "windows" "40" + "linux" "40" + } + + "esf_takedamage2" + { + "windows" "12" + "linux" "12" + } + + "esf_isfighter" + { + "windows" "41" + "linux" "41" + } + + "esf_isbuddy" + { + "windows" "42" + "linux" "42" + } + + "esf_emitsound" + { + "windows" "45" + "linux" "45" + } + + "esf_emitnullsound" + { + "windows" "46" + "linux" "46" + } + + "esf_increasestrength" + { + "windows" "130" + "linux" "130" + } + + "esf_increasepl" + { + "windows" "131" + "linux" "131" + } + + "esf_setpowerlevel" + { + "windows" "132" + "linux" "132" + } + + "esf_setmaxpowerlevel" + { + "windows" "133" + "linux" "133" + } + + "esf_stopanitrigger" + { + "windows" "134" + "linux" "134" + } + + "esf_stopfly" + { + "windows" "135" + "linux" "135" + } + + "esf_hideweapon" + { + "windows" "136" + "linux" "136" + } + + "esf_clientremoveweapon" + { + "windows" "137" + "linux" "137" + } + + "esf_sendclientcustommodel" + { + "windows" "138" + "linux" "138" + } + + "esf_canturbo" + { + "windows" "139" + "linux" "139" + } + + "esf_canprimaryfire" + { + "windows" "140" + "linux" "140" + } + + "esf_cansecondaryfire" + { + "windows" "141" + "linux" "141" + } + + "esf_canstopfly" + { + "windows" "142" + "linux" "142" + } + + "esf_canblock" + { + "windows" "143" + "linux" "143" + } + + "esf_canraiseKi" + { + "windows" "144" + "linux" "144" + } + + "esf_canraisestamina" + { + "windows" "145" + "linux" "145" + } + + "esf_canteleport" + { + "windows" "146" + "linux" "146" + } + + "esf_canstartfly" + { + "windows" "147" + "linux" "147" + } + + "esf_canstartpowerup" + { + "windows" "148" + "linux" "148" + } + + "esf_canjump" + { + "windows" "149" + "linux" "149" + } + + "esf_canwalljump" + { + "windows" "150" + "linux" "150" + } + + "esf_issuperjump" + { + "windows" "151" + "linux" "151" + } + + "esf_ismoveback" + { + "windows" "152" + "linux" "152" + } + + "esf_checkwalljump" + { + "windows" "153" + "linux" "153" + } + + "esf_enablewalljump" + { + "windows" "154" + "linux" "154" + } + + "esf_disablewalljump" + { + "windows" "155" + "linux" "155" + } + + "esf_resetwalljumpvars" + { + "windows" "156" + "linux" "156" + } + + "esf_getwalljumpanim" + { + "windows" "157" + "linux" "157" + } + + "esf_getwalljumpanim2" + { + "windows" "158" + "linux" "158" + } + + "esf_setwalljumpanimation" + { + "windows" "159" + "linux" "159" + } + + "esf_setflymovetype" + { + "windows" "160" + "linux" "160" + } + + "esf_isflymovetype" + { + "windows" "161" + "linux" "161" + } + + "esf_iswalkmovetype" + { + "windows" "162" + "linux" "162" + } + + "esf_setwalkmovetype" + { + "windows" "163" + "linux" "163" + } + + "esf_drawchargebar" + { + "windows" "164" + "linux" "164" + } + + "esf_startblock" + { + "windows" "165" + "linux" "165" + } + + "esf_stopblock" + { + "windows" "166" + "linux" "166" + } + + "esf_startfly" + { + "windows" "167" + "linux" "167" + } + + "esf_getmaxspeed" + { + "windows" "168" + "linux" "168" + } + + "esf_setanimation" + { + "windows" "169" + "linux" "169" + } + + "esf_playanimation" + { + "windows" "170" + "linux" "170" + } + + "esf_getmoveforward" + { + "windows" "171" + "linux" "171" + } + + "esf_getmoveright" + { + "windows" "172" + "linux" "172" + } + + "esf_getmoveup" + { + "windows" "173" + "linux" "173" + } + + "esf_addblindfx" + { + "windows" "174" + "linux" "174" + } + + "esf_removeblindfx" + { + "windows" "175" + "linux" "175" + } + + "esf_disablepsbar" + { + "windows" "176" + "linux" "176" + } + + "esf_addbeamboxcrosshair" + { + "windows" "177" + "linux" "177" + } + + "esf_removebeamboxcrosshair" + { + "windows" "178" + "linux" "178" + } + + "esf_drawpswinbonus" + { + "windows" "179" + "linux" "179" + } + + "esf_drawpsbar" + { + "windows" "180" + "linux" "180" + } + + "esf_lockcrosshair" + { + "windows" "181" + "linux" "181" + } + + "esf_unlockcrosshair" + { + "windows" "182" + "linux" "182" + } + + "esf_rotatecrosshair" + { + "windows" "183" + "linux" "183" + } + + "esf_unrotatecrosshair" + { + "windows" "184" + "linux" "184" + } + + "esf_watermove" + { + "windows" "185" + "linux" "185" + } + + "esf_checktimebaseddamage" + { + "windows" "188" + "linux" "188" + } + + "esf_doessecondaryattack" + { + "windows" "191" + "linux" "191" + } + + "esf_doesprimaryattack" + { + "windows" "192" + "linux" "192" + } + + "esf_removespecialmodes" + { + "windows" "194" + "linux" "194" + } + + "esf_stopturbo" + { + "windows" "195" + "linux" "195" + } + + "esf_takebean" + { + "windows" "196" + "linux" "196" + } + + "esf_getpowerlevel" + { + "windows" "197" + "linux" "197" + } + + "esf_removeallotherweapons" + { + "windows" "198" + "linux" "198" + } + + "esf_stopswoop" + { + "windows" "199" + "linux" "199" + } + + "esf_setdeathanimation" + { + "windows" "201" + "linux" "201" + } + + "esf_setmodel" + { + "windows" "202" + "linux" "202" + } + + "esf_addattacks" + { + "windows" "203" + "linux" "203" + } + + "esf_emitclasssound" + { + "windows" "205" + "linux" "205" + } + + "esf_checklightning" + { + "windows" "206" + "linux" "206" + } + + "esf_freezecontrols" + { + "windows" "207" + "linux" "207" + } + + "esf_unfreezecontrols" + { + "windows" "208" + "linux" "208" + } + + "esf_updateki" + { + "windows" "209" + "linux" "209" + } + + "esf_updatehealth" + { + "windows" "210" + "linux" "210" + } + + "esf_getteleportdir" + { + "windows" "211" + "linux" "211" + } + + "esf_weapon_holsterwhenmeleed" + { + "windows" "90" + "linux" "90" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/gearbox/offsets-common.txt b/gamedata/common.games/virtual.games/gearbox/offsets-common.txt new file mode 100644 index 00000000..df1f9909 --- /dev/null +++ b/gamedata/common.games/virtual.games/gearbox/offsets-common.txt @@ -0,0 +1,1105 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + "mac" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + "mac" "0x0" + } + + "spawn" + { + "windows" "0" + "linux" "0" + "mac" "0" + } + + "precache" + { + "windows" "1" + "linux" "1" + "mac" "1" + } + + "keyvalue" + { + "windows" "2" + "linux" "2" + "mac" "2" + } + + "objectcaps" + { + "windows" "5" + "linux" "5" + "mac" "5" + } + + "activate" + { + "windows" "6" + "linux" "6" + "mac" "6" + } + + "setobjectcollisionbox" + { + "windows" "7" + "linux" "7" + "mac" "7" + } + + "classify" + { + "windows" "8" + "linux" "8" + "mac" "8" + } + + "deathnotice" + { + "windows" "9" + "linux" "9" + "mac" "9" + } + + "traceattack" + { + "windows" "10" + "linux" "10" + "mac" "10" + } + + "takedamage" + { + "windows" "11" + "linux" "11" + "mac" "11" + } + + "takehealth" + { + "windows" "12" + "linux" "12" + "mac" "12" + } + + "killed" + { + "windows" "13" + "linux" "13" + "mac" "13" + } + + "bloodcolor" + { + "windows" "14" + "linux" "14" + "mac" "14" + } + + "tracebleed" + { + "windows" "15" + "linux" "15" + "mac" "15" + } + + "istriggered" + { + "windows" "16" + "linux" "16" + "mac" "16" + } + + "mymonsterpointer" + { + "windows" "17" + "linux" "17" + "mac" "17" + } + + "mysquadmonsterpointer" + { + "windows" "18" + "linux" "18" + "mac" "18" + } + + "gettogglestate" + { + "windows" "20" + "linux" "20" + "mac" "20" + } + + "addpoints" + { + "windows" "21" + "linux" "21" + "mac" "21" + } + + "addpointstoteam" + { + "windows" "22" + "linux" "22" + "mac" "22" + } + + "addplayeritem" + { + "windows" "23" + "linux" "23" + "mac" "23" + } + + "removeplayeritem" + { + "windows" "24" + "linux" "24" + "mac" "24" + } + + "giveammo" + { + "windows" "25" + "linux" "25" + "mac" "25" + } + + "getdelay" + { + "windows" "26" + "linux" "26" + "mac" "26" + } + + "ismoving" + { + "windows" "27" + "linux" "27" + "mac" "27" + } + + "overridereset" + { + "windows" "28" + "linux" "28" + "mac" "28" + } + + "damagedecal" + { + "windows" "29" + "linux" "29" + "mac" "29" + } + + "settogglestate" + { + "windows" "30" + "linux" "30" + "mac" "30" + } + + "startsneaking" + { + "windows" "31" + "linux" "31" + "mac" "31" + } + + "stopsneaking" + { + "windows" "32" + "linux" "32" + "mac" "32" + } + + "oncontrols" + { + "windows" "33" + "linux" "33" + "mac" "33" + } + + "issneaking" + { + "windows" "34" + "linux" "34" + "mac" "34" + } + + "isalive" + { + "windows" "35" + "linux" "35" + "mac" "35" + } + + "isbspmodel" + { + "windows" "36" + "linux" "36" + "mac" "36" + } + + "reflectgauss" + { + "windows" "37" + "linux" "37" + "mac" "37" + } + + "hastarget" + { + "windows" "38" + "linux" "38" + "mac" "38" + } + + "isinworld" + { + "windows" "39" + "linux" "39" + "mac" "39" + } + + "isplayer" + { + "windows" "40" + "linux" "40" + "mac" "40" + } + + "isnetclient" + { + "windows" "41" + "linux" "41" + "mac" "41" + } + + "teamid" + { + "windows" "42" + "linux" "42" + "mac" "42" + } + + "getnexttarget" + { + "windows" "43" + "linux" "43" + "mac" "43" + } + + "think" + { + "windows" "44" + "linux" "44" + "mac" "44" + } + + "touch" + { + "windows" "45" + "linux" "45" + "mac" "45" + } + + "use" + { + "windows" "46" + "linux" "46" + "mac" "46" + } + + "blocked" + { + "windows" "47" + "linux" "47" + "mac" "47" + } + + "respawn" + { + "windows" "48" + "linux" "48" + "mac" "48" + } + + "updateowner" + { + "windows" "49" + "linux" "49" + "mac" "49" + } + + "fbecomeprone" + { + "windows" "50" + "linux" "50" + "mac" "50" + } + + "center" + { + "windows" "51" + "linux" "51" + "mac" "51" + } + + "eyeposition" + { + "windows" "52" + "linux" "52" + "mac" "52" + } + + "earposition" + { + "windows" "53" + "linux" "53" + "mac" "53" + } + + "bodytarget" + { + "windows" "54" + "linux" "54" + "mac" "54" + } + + "illumination" + { + "windows" "55" + "linux" "55" + "mac" "55" + } + + "fvisible" + { + "windows" "57" + "linux" "56" + "mac" "56" + } + + "fvecvisible" + { + "windows" "56" + "linux" "57" + "mac" "57" + } + + "look" + { + "windows" "60" + "linux" "60" + "mac" "60" + } + + "changeyaw" + { + "windows" "63" + "linux" "63" + "mac" "63" + } + + "irelationship" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "monsterinitdead" + { + "windows" "67" + "linux" "67" + "mac" "67" + } + + "becomedead" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "bestvisibleenemy" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "finviewcone" + { + "windows" "72" + "linux" "71" + "mac" "71" + } + + "fvecinviewcone" + { + "windows" "71" + "linux" "72" + "mac" "72" + } + + "runai" + { + "windows" "61" + "linux" "61" + "mac" "61" + } + + "monsterthink" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "monsterinit" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "checklocalmove" + { + "windows" "73" + "linux" "73" + "mac" "73" + } + + "move" + { + "windows" "74" + "linux" "74" + "mac" "74" + } + + "moveexecute" + { + "windows" "75" + "linux" "75" + "mac" "75" + } + + "shouldadvanceroute" + { + "windows" "76" + "linux" "76" + "mac" "76" + } + + "getstoppedactivity" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "stop" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "checkrangeattack1" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "checkrangeattack2" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "checkmeleeattack1" + { + "windows" "81" + "linux" "81" + "mac" "81" + } + + "checkmeleeattack2" + { + "windows" "82" + "linux" "82" + "mac" "82" + } + + "schedulechange" + { + "windows" "88" + "linux" "88" + "mac" "88" + } + + "canplaysequence" + { + "windows" "89" + "linux" "89" + "mac" "89" + } + + "canplaysentence" + { + "windows" "90" + "linux" "90" + "mac" "90" + } + + "playsentence" + { + "windows" "91" + "linux" "91" + "mac" "91" + } + + "playscriptedsentence" + { + "windows" "92" + "linux" "92" + "mac" "92" + } + + "sentencestop" + { + "windows" "93" + "linux" "93" + "mac" "93" + } + + "getidealstate" + { + "windows" "94" + "linux" "94" + "mac" "94" + } + + "setactivity" + { + "windows" "95" + "linux" "95" + "mac" "95" + } + + "reportaistate" + { + "windows" "96" + "linux" "96" + "mac" "96" + } + + "checkenemy" + { + "windows" "97" + "linux" "97" + "mac" "97" + } + + "ftriangulate" + { + "windows" "98" + "linux" "98" + "mac" "98" + } + + "setyawspeed" + { + "windows" "99" + "linux" "99" + "mac" "99" + } + + "buildnearestroute" + { + "windows" "100" + "linux" "100" + "mac" "100" + } + + "findcover" + { + "windows" "101" + "linux" "101" + "mac" "101" + } + + "coverradius" + { + "windows" "103" + "linux" "103" + "mac" "103" + } + + "fcancheckattacks" + { + "windows" "104" + "linux" "104" + "mac" "104" + } + + "checkammo" + { + "windows" "105" + "linux" "105" + "mac" "105" + } + + "ignoreconditions" + { + "windows" "106" + "linux" "106" + "mac" "106" + } + + "fvalidatehinttype" + { + "windows" "107" + "linux" "107" + "mac" "107" + } + + "fcanactiveidle" + { + "windows" "108" + "linux" "108" + "mac" "108" + } + + "isoundmask" + { + "windows" "109" + "linux" "109" + "mac" "109" + } + + "hearingsensitivity" + { + "windows" "112" + "linux" "112" + "mac" "112" + } + + "barnaclevictimbitten" + { + "windows" "113" + "linux" "113" + "mac" "113" + } + + "barnaclevictimreleased" + { + "windows" "114" + "linux" "114" + "mac" "114" + } + + "preschedulethink" + { + "windows" "115" + "linux" "115" + "mac" "115" + } + + "getdeathactivity" + { + "windows" "116" + "linux" "116" + "mac" "116" + } + + "gibmonster" + { + "windows" "117" + "linux" "117" + "mac" "117" + } + + "hashumangibs" + { + "windows" "118" + "linux" "118" + "mac" "118" + } + + "hasaliengibs" + { + "windows" "119" + "linux" "119" + "mac" "119" + } + + "fademonster" + { + "windows" "120" + "linux" "120" + "mac" "120" + } + + "deathsound" + { + "windows" "123" + "linux" "123" + "mac" "123" + } + + "alertsound" + { + "windows" "124" + "linux" "124" + "mac" "124" + } + + "idlesound" + { + "windows" "125" + "linux" "125" + "mac" "125" + } + + "painsound" + { + "windows" "126" + "linux" "126" + "mac" "126" + } + + "stopfollowing" + { + "windows" "127" + "linux" "127" + "mac" "127" + } + + "player_jump" + { + "windows" "127" + "linux" "127" + "mac" "127" + } + + "player_duck" + { + "windows" "128" + "linux" "128" + "mac" "128" + } + + "player_prethink" + { + "windows" "129" + "linux" "129" + "mac" "129" + } + + "player_postthink" + { + "windows" "130" + "linux" "130" + "mac" "130" + } + + "player_getgunposition" + { + "windows" "121" + "linux" "121" + "mac" "121" + } + + "player_shouldfadeondeath" + { + "windows" "62" + "linux" "62" + "mac" "62" + } + + "player_impulsecommands" + { + "windows" "132" + "linux" "132" + "mac" "132" + } + + "player_updateclientdata" + { + "windows" "131" + "linux" "131" + "mac" "131" + } + + "item_addtoplayer" + { + "windows" "60" + "linux" "60" + "mac" "60" + } + + "item_addduplicate" + { + "windows" "61" + "linux" "61" + "mac" "61" + } + + "item_getiteminfo" + { + "windows" "62" + "linux" "62" + "mac" "62" + } + + "item_candeploy" + { + "windows" "63" + "linux" "63" + "mac" "63" + } + + "item_deploy" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "item_canholster" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "item_holster" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "item_updateiteminfo" + { + "windows" "67" + "linux" "67" + "mac" "67" + } + + "item_preframe" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "item_postframe" + { + "windows" "69" + "linux" "69" + "mac" "69" + } + + "item_drop" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "item_kill" + { + "windows" "71" + "linux" "71" + "mac" "71" + } + + "item_attachtoplayer" + { + "windows" "72" + "linux" "72" + "mac" "72" + } + + "item_primaryammoindex" + { + "windows" "73" + "linux" "73" + "mac" "73" + } + + "item_secondaryammoindex" + { + "windows" "74" + "linux" "74" + "mac" "74" + } + + "item_updateclientdata" + { + "windows" "76" + "linux" "76" + "mac" "76" + } + + "item_getweaponptr" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "item_itemslot" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "weapon_extractammo" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "weapon_extractclipammo" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "weapon_addweapon" + { + "windows" "81" + "linux" "81" + "mac" "81" + } + + "weapon_playemptysound" + { + "windows" "82" + "linux" "82" + "mac" "82" + } + + "weapon_resetemptysound" + { + "windows" "83" + "linux" "83" + "mac" "83" + } + + "weapon_sendweaponanim" + { + "windows" "84" + "linux" "84" + "mac" "84" + } + + "weapon_isusable" + { + "windows" "85" + "linux" "85" + "mac" "85" + } + + "weapon_primaryattack" + { + "windows" "86" + "linux" "86" + "mac" "86" + } + + "weapon_secondaryattack" + { + "windows" "87" + "linux" "87" + "mac" "87" + } + + "weapon_reload" + { + "windows" "88" + "linux" "88" + "mac" "88" + } + + "weapon_weaponidle" + { + "windows" "89" + "linux" "89" + "mac" "89" + } + + "weapon_retireweapon" + { + "windows" "90" + "linux" "90" + "mac" "90" + } + + "weapon_shouldweaponidle" + { + "windows" "91" + "linux" "91" + "mac" "91" + } + + "weapon_usedecrement" + { + "windows" "92" + "linux" "92" + "mac" "92" + } + + "gearbox_mysquadtalkmonsterpointer" + { + "windows" "19" + "linux" "19" + "mac" "19" + } + + "gearbox_weapontimebase" + { + "windows" "58" + "linux" "58" + "mac" "58" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/ns/offsets-common.txt b/gamedata/common.games/virtual.games/ns/offsets-common.txt new file mode 100644 index 00000000..6ae2eaeb --- /dev/null +++ b/gamedata/common.games/virtual.games/ns/offsets-common.txt @@ -0,0 +1,878 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + } + + "spawn" + { + "windows" "0" + "linux" "0" + } + + "precache" + { + "windows" "1" + "linux" "1" + } + + "keyvalue" + { + "windows" "2" + "linux" "2" + } + + "objectcaps" + { + "windows" "5" + "linux" "5" + } + + "activate" + { + "windows" "6" + "linux" "6" + } + + "setobjectcollisionbox" + { + "windows" "7" + "linux" "7" + } + + "classify" + { + "windows" "8" + "linux" "8" + } + + "deathnotice" + { + "windows" "9" + "linux" "9" + } + + "traceattack" + { + "windows" "10" + "linux" "10" + } + + "takedamage" + { + "windows" "11" + "linux" "11" + } + + "takehealth" + { + "windows" "12" + "linux" "12" + } + + "killed" + { + "windows" "14" + "linux" "14" + } + + "bloodcolor" + { + "windows" "16" + "linux" "16" + } + + "tracebleed" + { + "windows" "17" + "linux" "17" + } + + "istriggered" + { + "windows" "18" + "linux" "18" + } + + "mymonsterpointer" + { + "windows" "19" + "linux" "19" + } + + "mysquadmonsterpointer" + { + "windows" "20" + "linux" "20" + } + + "gettogglestate" + { + "windows" "21" + "linux" "21" + } + + "addpoints" + { + "windows" "22" + "linux" "22" + } + + "addpointstoteam" + { + "windows" "23" + "linux" "23" + } + + "addplayeritem" + { + "windows" "24" + "linux" "24" + } + + "removeplayeritem" + { + "windows" "25" + "linux" "25" + } + + "giveammo" + { + "windows" "26" + "linux" "26" + } + + "getdelay" + { + "windows" "27" + "linux" "27" + } + + "ismoving" + { + "windows" "28" + "linux" "28" + } + + "overridereset" + { + "windows" "29" + "linux" "29" + } + + "damagedecal" + { + "windows" "30" + "linux" "30" + } + + "settogglestate" + { + "windows" "31" + "linux" "31" + } + + "startsneaking" + { + "windows" "32" + "linux" "32" + } + + "stopsneaking" + { + "windows" "33" + "linux" "33" + } + + "oncontrols" + { + "windows" "34" + "linux" "34" + } + + "issneaking" + { + "windows" "35" + "linux" "35" + } + + "isalive" + { + "windows" "36" + "linux" "36" + } + + "isbspmodel" + { + "windows" "37" + "linux" "37" + } + + "reflectgauss" + { + "windows" "38" + "linux" "38" + } + + "hastarget" + { + "windows" "39" + "linux" "39" + } + + "isinworld" + { + "windows" "40" + "linux" "40" + } + + "isplayer" + { + "windows" "41" + "linux" "41" + } + + "isnetclient" + { + "windows" "42" + "linux" "42" + } + + "teamid" + { + "windows" "43" + "linux" "43" + } + + "getnexttarget" + { + "windows" "46" + "linux" "46" + } + + "think" + { + "windows" "47" + "linux" "47" + } + + "touch" + { + "windows" "48" + "linux" "48" + } + + "use" + { + "windows" "49" + "linux" "49" + } + + "blocked" + { + "windows" "50" + "linux" "50" + } + + "respawn" + { + "windows" "52" + "linux" "52" + } + + "updateowner" + { + "windows" "53" + "linux" "53" + } + + "fbecomeprone" + { + "windows" "54" + "linux" "54" + } + + "center" + { + "windows" "55" + "linux" "55" + } + + "eyeposition" + { + "windows" "56" + "linux" "56" + } + + "earposition" + { + "windows" "57" + "linux" "57" + } + + "bodytarget" + { + "windows" "58" + "linux" "58" + } + + "illumination" + { + "windows" "59" + "linux" "59" + } + + "fvisible" + { + "windows" "60" + "linux" "60" + } + + "fvecvisible" + { + "windows" "61" + "linux" "61" + } + + "changeyaw" + { + "windows" "65" + "linux" "65" + } + + "hashumangibs" + { + "windows" "66" + "linux" "66" + } + + "hasaliengibs" + { + "windows" "67" + "linux" "67" + } + + "fademonster" + { + "windows" "68" + "linux" "68" + } + + "gibmonster" + { + "windows" "69" + "linux" "69" + } + + "getdeathactivity" + { + "windows" "70" + "linux" "70" + } + + "becomedead" + { + "windows" "71" + "linux" "71" + } + + "irelationship" + { + "windows" "73" + "linux" "73" + } + + "painsound" + { + "windows" "74" + "linux" "74" + } + + "reportaistate" + { + "windows" "75" + "linux" "75" + } + + "monsterinitdead" + { + "windows" "76" + "linux" "76" + } + + "look" + { + "windows" "77" + "linux" "77" + } + + "bestvisibleenemy" + { + "windows" "78" + "linux" "78" + } + + "finviewcone" + { + "windows" "80" + "linux" "80" + } + + "fvecinviewcone" + { + "windows" "81" + "linux" "81" + } + + "player_jump" + { + "windows" "83" + "linux" "83" + } + + "player_duck" + { + "windows" "84" + "linux" "84" + } + + "player_prethink" + { + "windows" "85" + "linux" "85" + } + + "player_postthink" + { + "windows" "86" + "linux" "86" + } + + "player_getgunposition" + { + "windows" "87" + "linux" "87" + } + + "player_shouldfadeondeath" + { + "windows" "72" + "linux" "72" + } + + "player_impulsecommands" + { + "windows" "101" + "linux" "101" + } + + "player_updateclientdata" + { + "windows" "99" + "linux" "99" + } + + "item_addtoplayer" + { + "windows" "64" + "linux" "64" + } + + "item_addduplicate" + { + "windows" "65" + "linux" "65" + } + + "item_getiteminfo" + { + "windows" "68" + "linux" "68" + } + + "item_candeploy" + { + "windows" "69" + "linux" "69" + } + + "item_deploy" + { + "windows" "70" + "linux" "70" + } + + "item_canholster" + { + "windows" "71" + "linux" "71" + } + + "item_holster" + { + "windows" "72" + "linux" "72" + } + + "item_updateiteminfo" + { + "windows" "74" + "linux" "74" + } + + "item_preframe" + { + "windows" "75" + "linux" "75" + } + + "item_postframe" + { + "windows" "76" + "linux" "76" + } + + "item_drop" + { + "windows" "77" + "linux" "77" + } + + "item_kill" + { + "windows" "78" + "linux" "78" + } + + "item_attachtoplayer" + { + "windows" "79" + "linux" "79" + } + + "item_primaryammoindex" + { + "windows" "80" + "linux" "80" + } + + "item_secondaryammoindex" + { + "windows" "81" + "linux" "81" + } + + "item_updateclientdata" + { + "windows" "82" + "linux" "82" + } + + "item_getweaponptr" + { + "windows" "83" + "linux" "83" + } + + "item_itemslot" + { + "windows" "84" + "linux" "84" + } + + "weapon_extractammo" + { + "windows" "85" + "linux" "85" + } + + "weapon_extractclipammo" + { + "windows" "86" + "linux" "86" + } + + "weapon_addweapon" + { + "windows" "87" + "linux" "87" + } + + "weapon_playemptysound" + { + "windows" "88" + "linux" "88" + } + + "weapon_resetemptysound" + { + "windows" "89" + "linux" "89" + } + + "weapon_sendweaponanim" + { + "windows" "94" + "linux" "94" + } + + "weapon_isusable" + { + "windows" "73" + "linux" "73" + } + + "weapon_primaryattack" + { + "windows" "98" + "linux" "98" + } + + "weapon_secondaryattack" + { + "windows" "99" + "linux" "99" + } + + "weapon_reload" + { + "windows" "100" + "linux" "100" + } + + "weapon_weaponidle" + { + "windows" "101" + "linux" "101" + } + + "weapon_retireweapon" + { + "windows" "102" + "linux" "102" + } + + "weapon_shouldweaponidle" + { + "windows" "103" + "linux" "103" + } + + "weapon_usedecrement" + { + "windows" "104" + "linux" "104" + } + + "ns_getpointvalue" + { + "windows" "13" + "linux" "13" + } + + "ns_awardkill" + { + "windows" "15" + "linux" "15" + } + + "ns_resetentity" + { + "windows" "45" + "linux" "45" + } + + "ns_updateonremove" + { + "windows" "51" + "linux" "51" + } + + "ns_setbonecontroller" + { + "windows" "63" + "linux" "63" + } + + "ns_savedataforreset" + { + "windows" "64" + "linux" "64" + } + + "ns_gethull" + { + "windows" "79" + "linux" "79" + } + + "ns_getmaxwalkspeed" + { + "windows" "88" + "linux" "88" + } + + "ns_setteamid" + { + "windows" "90" + "linux" "90" + } + + "ns_geteffectiveplayerclass" + { + "windows" "91" + "linux" "91" + } + + "ns_getauthenticationmask" + { + "windows" "92" + "linux" "92" + } + + "ns_effectiveplayerclasschanged" + { + "windows" "93" + "linux" "93" + } + + "ns_needsteamupdate" + { + "windows" "94" + "linux" "94" + } + + "ns_sendteamupdate" + { + "windows" "95" + "linux" "95" + } + + "ns_sendweaponupdate" + { + "windows" "96" + "linux" "96" + } + + "ns_initplayerfromspawn" + { + "windows" "97" + "linux" "97" + } + + "ns_packdeadplayeritems" + { + "windows" "98" + "linux" "98" + } + + "ns_getanimationforactivity" + { + "windows" "100" + "linux" "100" + } + + "ns_startobserver" + { + "windows" "102" + "linux" "102" + } + + "ns_stopobserver" + { + "windows" "103" + "linux" "103" + } + + "ns_getadrenalinefactor" + { + "windows" "104" + "linux" "104" + } + + "ns_givenameditem" + { + "windows" "106" + "linux" "106" + } + + "ns_suicide" + { + "windows" "107" + "linux" "107" + } + + "ns_getcanuseweapon" + { + "windows" "108" + "linux" "108" + } + + "ns_weapon_getweaponprimetime" + { + "windows" "90" + "linux" "90" + } + + "ns_weapon_primeweapon" + { + "windows" "91" + "linux" "91" + } + + "ns_weapon_getisweaponprimed" + { + "windows" "92" + "linux" "92" + } + + "ns_weapon_getisweaponpriming" + { + "windows" "93" + "linux" "93" + } + + "ns_weapon_defaultdeploy" + { + "windows" "95" + "linux" "95" + } + + "ns_weapon_defaultreload" + { + "windows" "96" + "linux" "96" + } + + "ns_weapon_getdeploytime" + { + "windows" "97" + "linux" "97" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/svencoop/offsets-common.txt b/gamedata/common.games/virtual.games/svencoop/offsets-common.txt new file mode 100644 index 00000000..29a6e172 --- /dev/null +++ b/gamedata/common.games/virtual.games/svencoop/offsets-common.txt @@ -0,0 +1,1466 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + } + + "spawn" + { + "windows" "0" + "linux" "0" + } + + "precache" + { + "windows" "1" + "linux" "1" + } + + "keyvalue" + { + "windows" "2" + "linux" "2" + } + + "objectcaps" + { + "windows" "6" + "linux" "6" + } + + "activate" + { + "windows" "7" + "linux" "7" + } + + "setobjectcollisionbox" + { + "windows" "8" + "linux" "8" + } + + "irelationship" + { + "windows" "10" + "linux" "10" + } + + "classify" + { + "windows" "11" + "linux" "11" + } + + "deathnotice" + { + "windows" "12" + "linux" "12" + } + + "traceattack" + { + "windows" "13" + "linux" "13" + } + + "takedamage" + { + "windows" "14" + "linux" "14" + } + + "killed" + { + "windows" "17" + "linux" "17" + } + + "bloodcolor" + { + "windows" "18" + "linux" "18" + } + + "tracebleed" + { + "windows" "19" + "linux" "19" + } + + "istriggered" + { + "windows" "20" + "linux" "20" + } + + "mymonsterpointer" + { + "windows" "21" + "linux" "21" + } + + "mysquadmonsterpointer" + { + "windows" "22" + "linux" "22" + } + + "gettogglestate" + { + "windows" "23" + "linux" "23" + } + + "addpoints" + { + "windows" "24" + "linux" "24" + } + + "addpointstoteam" + { + "windows" "25" + "linux" "25" + } + + "addplayeritem" + { + "windows" "26" + "linux" "26" + } + + "removeplayeritem" + { + "windows" "27" + "linux" "27" + } + + "getdelay" + { + "windows" "29" + "linux" "29" + } + + "ismoving" + { + "windows" "30" + "linux" "30" + } + + "overridereset" + { + "windows" "31" + "linux" "31" + } + + "damagedecal" + { + "windows" "32" + "linux" "32" + } + + "settogglestate" + { + "windows" "33" + "linux" "33" + } + + "startsneaking" + { + "windows" "34" + "linux" "34" + } + + "stopsneaking" + { + "windows" "35" + "linux" "35" + } + + "oncontrols" + { + "windows" "36" + "linux" "36" + } + + "issneaking" + { + "windows" "37" + "linux" "37" + } + + "isalive" + { + "windows" "38" + "linux" "38" + } + + "isbspmodel" + { + "windows" "39" + "linux" "39" + } + + "reflectgauss" + { + "windows" "40" + "linux" "40" + } + + "hastarget" + { + "windows" "41" + "linux" "41" + } + + "isinworld" + { + "windows" "42" + "linux" "42" + } + + "isplayer" + { + "windows" "44" + "linux" "44" + } + + "isnetclient" + { + "windows" "46" + "linux" "46" + } + + "teamid" + { + "windows" "49" + "linux" "49" + } + + "getnexttarget" + { + "windows" "51" + "linux" "51" + } + + "think" + { + "windows" "52" + "linux" "52" + } + + "touch" + { + "windows" "53" + "linux" "53" + } + + "use" + { + "windows" "54" + "linux" "54" + } + + "blocked" + { + "windows" "55" + "linux" "55" + } + + "respawn" + { + "windows" "57" + "linux" "57" + } + + "updateowner" + { + "windows" "58" + "linux" "58" + } + + "fbecomeprone" + { + "windows" "59" + "linux" "59" + } + + "center" + { + "windows" "60" + "linux" "60" + } + + "eyeposition" + { + "windows" "61" + "linux" "61" + } + + "earposition" + { + "windows" "62" + "linux" "62" + } + + "bodytarget" + { + "windows" "63" + "linux" "63" + } + + "illumination" + { + "windows" "64" + "linux" "64" + } + + "fvecvisible" + { + "windows" "65" + "linux" "66" + } + + "look" + { + "windows" "76" + "linux" "77" + } + + "runai" + { + "windows" "77" + "linux" "78" + } + + "changeyaw" + { + "windows" "79" + "linux" "80" + } + + "monsterthink" + { + "windows" "80" + "linux" "81" + } + + "monsterinit" + { + "windows" "82" + "linux" "83" + } + + "monsterinitdead" + { + "windows" "83" + "linux" "84" + } + + "becomedead" + { + "windows" "84" + "linux" "85" + } + + "bestvisibleenemy" + { + "windows" "87" + "linux" "88" + } + + "finviewcone" + { + "windows" "88" + "linux" "89" + } + + "fvecinviewcone" + { + "windows" "89" + "linux" "90" + } + + "checklocalmove" + { + "windows" "90" + "linux" "91" + } + + "move" + { + "windows" "91" + "linux" "92" + } + + "moveexecute" + { + "windows" "92" + "linux" "93" + } + + "shouldadvanceroute" + { + "windows" "93" + "linux" "94" + } + + "getstoppedactivity" + { + "windows" "94" + "linux" "95" + } + + "stop" + { + "windows" "95" + "linux" "96" + } + + "checkrangeattack1" + { + "windows" "96" + "linux" "97" + } + + "checkrangeattack2" + { + "windows" "98" + "linux" "99" + } + + "checkmeleeattack1" + { + "windows" "100" + "linux" "101" + } + + "checkmeleeattack2" + { + "windows" "102" + "linux" "103" + } + + "schedulechange" + { + "windows" "110" + "linux" "111" + } + + "canplaysequence" + { + "windows" "111" + "linux" "112" + } + + "canplaysentence" + { + "windows" "112" + "linux" "113" + } + + "playsentence" + { + "windows" "113" + "linux" "114" + } + + "playscriptedsentence" + { + "windows" "114" + "linux" "115" + } + + "sentencestop" + { + "windows" "115" + "linux" "116" + } + + "getidealstate" + { + "windows" "116" + "linux" "117" + } + + "setactivity" + { + "windows" "117" + "linux" "118" + } + + "reportaistate" + { + "windows" "119" + "linux" "120" + } + + "checkenemy" + { + "windows" "120" + "linux" "121" + } + + "setyawspeed" + { + "windows" "123" + "linux" "124" + } + + "buildnearestroute" + { + "windows" "124" + "linux" "125" + } + + "findcover" + { + "windows" "125" + "linux" "126" + } + + "coverradius" + { + "windows" "130" + "linux" "131" + } + + "fcancheckattacks" + { + "windows" "131" + "linux" "132" + } + + "checkammo" + { + "windows" "133" + "linux" "134" + } + + "ignoreconditions" + { + "windows" "134" + "linux" "135" + } + + "fvalidatehinttype" + { + "windows" "135" + "linux" "136" + } + + "fcanactiveidle" + { + "windows" "136" + "linux" "137" + } + + "isoundmask" + { + "windows" "137" + "linux" "138" + } + + "hearingsensitivity" + { + "windows" "140" + "linux" "141" + } + + "barnaclevictimbitten" + { + "windows" "141" + "linux" "142" + } + + "barnaclevictimreleased" + { + "windows" "142" + "linux" "143" + } + + "preschedulethink" + { + "windows" "149" + "linux" "150" + } + + "getdeathactivity" + { + "windows" "150" + "linux" "151" + } + + "gibmonster" + { + "windows" "151" + "linux" "152" + } + + "hashumangibs" + { + "windows" "153" + "linux" "154" + } + + "hasaliengibs" + { + "windows" "154" + "linux" "155" + } + + "fademonster" + { + "windows" "155" + "linux" "156" + } + + "deathsound" + { + "windows" "158" + "linux" "159" + } + + "alertsound" + { + "windows" "159" + "linux" "160" + } + + "idlesound" + { + "windows" "160" + "linux" "161" + } + + "painsound" + { + "windows" "161" + "linux" "162" + } + + "stopfollowing" + { + "windows" "162" + "linux" "163" + } + + "player_getgunposition" + { + "windows" "156" + "linux" "157" + } + + "player_jump" + { + "windows" "178" + "linux" "179" + } + + "player_duck" + { + "windows" "179" + "linux" "180" + } + + "player_prethink" + { + "windows" "180" + "linux" "181" + } + + "player_postthink" + { + "windows" "181" + "linux" "182" + } + + "player_updateclientdata" + { + "windows" "183" + "linux" "184" + } + + "player_impulsecommands" + { + "windows" "184" + "linux" "185" + } + + "item_addtoplayer" + { + "windows" "76" + "linux" "77" + } + + "item_addduplicate" + { + "windows" "77" + "linux" "78" + } + + "item_getiteminfo" + { + "windows" "79" + "linux" "80" + } + + "item_candeploy" + { + "windows" "80" + "linux" "81" + } + + "item_deploy" + { + "windows" "81" + "linux" "82" + } + + "item_canholster" + { + "windows" "82" + "linux" "83" + } + + "item_holster" + { + "windows" "83" + "linux" "84" + } + + "item_updateiteminfo" + { + "windows" "84" + "linux" "85" + } + + "item_preframe" + { + "windows" "85" + "linux" "86" + } + + "item_postframe" + { + "windows" "86" + "linux" "87" + } + + "item_drop" + { + "windows" "87" + "linux" "88" + } + + "item_kill" + { + "windows" "88" + "linux" "89" + } + + "item_attachtoplayer" + { + "windows" "89" + "linux" "90" + } + + "item_primaryammoindex" + { + "windows" "90" + "linux" "91" + } + + "item_secondaryammoindex" + { + "windows" "91" + "linux" "92" + } + + "item_updateclientdata" + { + "windows" "92" + "linux" "93" + } + + "item_getweaponptr" + { + "windows" "93" + "linux" "94" + } + + "item_itemslot" + { + "windows" "94" + "linux" "95" + } + + "weapon_extractammo" + { + "windows" "95" + "linux" "96" + } + + "weapon_extractclipammo" + { + "windows" "96" + "linux" "97" + } + + "weapon_addweapon" + { + "windows" "97" + "linux" "98" + } + + "weapon_playemptysound" + { + "windows" "98" + "linux" "99" + } + + "weapon_resetemptysound" + { + "windows" "99" + "linux" "100" + } + + "weapon_sendweaponanim" + { + "windows" "100" + "linux" "101" + } + + "weapon_isusable" + { + "windows" "102" + "linux" "103" + } + + "weapon_primaryattack" + { + "windows" "103" + "linux" "104" + } + + "weapon_secondaryattack" + { + "windows" "104" + "linux" "105" + } + + "weapon_reload" + { + "windows" "106" + "linux" "107" + } + + "weapon_weaponidle" + { + "windows" "107" + "linux" "108" + } + + "weapon_retireweapon" + { + "windows" "108" + "linux" "109" + } + + "weapon_shouldweaponidle" + { + "windows" "109" + "linux" "110" + } + + "weapon_usedecrement" + { + "windows" "110" + "linux" "111" + } + + "sc_getclassification" + { + "windows" "9" + "linux" "9" + } + + "sc_takehealth" + { + "windows" "15" + "linux" "15" + } + + "sc_takearmor" + { + "windows" "16" + "linux" "16" + } + + "sc_giveammo" + { + "windows" "28" + "linux" "28" + } + + "sc_ismonster" + { + "windows" "43" + "linux" "43" + } + + "sc_isphysx" + { + "windows" "45" + "linux" "45" + } + + "sc_ispointentity" + { + "windows" "47" + "linux" "47" + } + + "sc_ismachine" + { + "windows" "48" + "linux" "48" + } + + "sc_criticalremove" + { + "windows" "50" + "linux" "50" + } + + "sc_updateonremove" + { + "windows" "56" + "linux" "56" + } + + "sc_fvisible" + { + "windows" "66" + "linux" "65" + } + + "sc_fvisiblefrompos" + { + "windows" "67" + "linux" "67" + } + + "sc_isfacing" + { + "windows" "68" + "linux" "68" + } + + "sc_getpointsfordamage" + { + "windows" "69" + "linux" "69" + } + + "sc_getdamagepoints" + { + "windows" "70" + "linux" "70" + } + + "sc_oncreate" + { + "windows" "72" + "linux" "73" + } + + "sc_ondestroy" + { + "windows" "73" + "linux" "74" + } + + "sc_isvalidentity" + { + "windows" "74" + "linux" "75" + } + + "sc_shouldfadeondeath" + { + "windows" "78" + "linux" "79" + } + + "sc_setupfriendly" + { + "windows" "79" + "linux" "80" + } + + "sc_revivethink" + { + "windows" "84" + "linux" "85" + } + + "sc_revive" + { + "windows" "85" + "linux" "86" + } + + "sc_startmonster" + { + "windows" "86" + "linux" "87" + } + + "sc_checkrangeattack1_move" + { + "windows" "97" + "linux" "98" + } + + "sc_checkrangeattack2_move" + { + "windows" "99" + "linux" "100" + } + + "sc_checkmeleeattack1_move" + { + "windows" "101" + "linux" "102" + } + + "sc_checkmeleeattack2_move" + { + "windows" "103" + "linux" "104" + } + + "sc_checktankusage" + { + "windows" "104" + "linux" "105" + } + + "sc_setgaitactivity" + { + "windows" "118" + "linux" "119" + } + + "sc_ftriangulate" + { + "windows" "121" + "linux" "122" + } + + "sc_ftriangulateextension" + { + "windows" "122" + "linux" "123" + } + + "sc_findcovergrenade" + { + "windows" "126" + "linux" "127" + } + + "sc_findcoverdistance" + { + "windows" "127" + "linux" "128" + } + + "sc_findattackpoint" + { + "windows" "128" + "linux" "129" + } + + "sc_fvalidatecover" + { + "windows" "129" + "linux" "130" + } + + "sc_checkattacker" + { + "windows" "132" + "linux" "133" + } + + "sc_nofriendlyfire1" + { + "windows" "145" + "linux" "144" + } + + "sc_nofriendlyfire2" + { + "windows" "144" + "linux" "145" + } + + "sc_nofriendlyfire3" + { + "windows" "143" + "linux" "146" + } + + "sc_nofriendlyfiretopos" + { + "windows" "146" + "linux" "147" + } + + "sc_fvisiblegunpos" + { + "windows" "147" + "linux" "148" + } + + "sc_finbulletcone" + { + "windows" "148" + "linux" "149" + } + + "sc_callgibmonster" + { + "windows" "152" + "linux" "153" + } + + "sc_checktimebaseddamage" + { + "windows" "156" + "linux" "157" + } + + "sc_ismoving" + { + "windows" "157" + "linux" "158" + } + + "sc_isplayerfollowing" + { + "windows" "163" + "linux" "164" + } + + "sc_startplayerfollowing" + { + "windows" "164" + "linux" "165" + } + + "sc_stopplayerfollowing" + { + "windows" "165" + "linux" "166" + } + + "sc_usesound" + { + "windows" "166" + "linux" "167" + } + + "sc_unusesound" + { + "windows" "167" + "linux" "168" + } + + "sc_ridemonster" + { + "windows" "168" + "linux" "169" + } + + "sc_checkandapplygenericattacks" + { + "windows" "169" + "linux" "170" + } + + "sc_checkscared" + { + "windows" "170" + "linux" "171" + } + + "sc_checkcreaturedanger" + { + "windows" "171" + "linux" "172" + } + + "sc_checkfalldamage" + { + "windows" "172" + "linux" "173" + } + + "sc_checkrevival" + { + "windows" "173" + "linux" "174" + } + + "sc_mediccallsound" + { + "windows" "174" + "linux" "175" + } + + "sc_player_menuinputperformed" + { + "windows" "175" + "linux" "176" + } + + "sc_player_ismenuinputdone" + { + "windows" "176" + "linux" "177" + } + + "sc_player_specialspawn" + { + "windows" "177" + "linux" "178" + } + + "sc_player_isconnected" + { + "windows" "181" + "linux" "182" + } + + "sc_player_isvalidinfoentity" + { + "windows" "185" + "linux" "186" + } + + "sc_player_levelend" + { + "windows" "186" + "linux" "187" + } + + "sc_player_votestarted" + { + "windows" "187" + "linux" "188" + } + + "sc_player_canstartnextvote" + { + "windows" "188" + "linux" "189" + } + + "sc_player_vote" + { + "windows" "189" + "linux" "190" + } + + "sc_player_hasvoted" + { + "windows" "190" + "linux" "191" + } + + "sc_player_resetvote" + { + "windows" "191" + "linux" "192" + } + + "sc_player_lastvoteinput" + { + "windows" "192" + "linux" "193" + } + + "sc_player_initvote" + { + "windows" "193" + "linux" "194" + } + + "sc_player_timetostartnextvote" + { + "windows" "194" + "linux" "195" + } + + "sc_player_resetview" + { + "windows" "195" + "linux" "196" + } + + "sc_player_getlogfrequency" + { + "windows" "196" + "linux" "197" + } + + "sc_player_logplayerstats" + { + "windows" "197" + "linux" "198" + } + + "sc_player_disablecollisionwithplayer" + { + "windows" "198" + "linux" "199" + } + + "sc_player_enablecollisionwithplayer" + { + "windows" "199" + "linux" "200" + } + + "sc_player_cantouchplayer" + { + "windows" "200" + "linux" "201" + } + + "sc_item_materialize" + { + "windows" "78" + "linux" "79" + } + + "sc_weapon_bulletaccuracy" + { + "windows" "101" + "linux" "102" + } + + "sc_weapon_tertiaryattack" + { + "windows" "105" + "linux" "106" + } + + "sc_weapon_burstsupplement" + { + "windows" "111" + "linux" "112" + } + + "sc_weapon_getp_model" + { + "windows" "112" + "linux" "113" + } + + "sc_weapon_getw_model" + { + "windows" "113" + "linux" "114" + } + + "sc_weapon_getv_model" + { + "windows" "114" + "linux" "115" + } + + "sc_weapon_precachecustommodels" + { + "windows" "115" + "linux" "116" + } + + "sc_weapon_ismultiplayer" + { + "windows" "116" + "linux" "117" + } + + "sc_weapon_frunfuncs" + { + "windows" "117" + "linux" "118" + } + + "sc_weapon_setfov" + { + "windows" "118" + "linux" "119" + } + + "sc_weapon_fcanrun" + { + "windows" "119" + "linux" "120" + } + + "sc_weapon_customdecrement" + { + "windows" "120" + "linux" "121" + } + + "sc_weapon_setv_model" + { + "windows" "121" + "linux" "122" + } + + "sc_weapon_setp_model" + { + "windows" "122" + "linux" "123" + } + + "sc_weapon_changeweaponskin" + { + "windows" "123" + "linux" "124" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/tfc/offsets-common.txt b/gamedata/common.games/virtual.games/tfc/offsets-common.txt new file mode 100644 index 00000000..70b97656 --- /dev/null +++ b/gamedata/common.games/virtual.games/tfc/offsets-common.txt @@ -0,0 +1,1133 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + "mac" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + "mac" "0x0" + } + + "spawn" + { + "windows" "1" + "linux" "2" + "mac" "1" + } + + "precache" + { + "windows" "2" + "linux" "3" + "mac" "2" + } + + "keyvalue" + { + "windows" "3" + "linux" "4" + "mac" "3" + } + + "objectcaps" + { + "windows" "6" + "linux" "7" + "mac" "6" + } + + "activate" + { + "windows" "7" + "linux" "8" + "mac" "7" + } + + "setobjectcollisionbox" + { + "windows" "8" + "linux" "9" + "mac" "8" + } + + "classify" + { + "windows" "9" + "linux" "10" + "mac" "9" + } + + "deathnotice" + { + "windows" "10" + "linux" "11" + "mac" "10" + } + + "traceattack" + { + "windows" "11" + "linux" "12" + "mac" "11" + } + + "takedamage" + { + "windows" "12" + "linux" "13" + "mac" "12" + } + + "takehealth" + { + "windows" "13" + "linux" "14" + "mac" "13" + } + + "bloodcolor" + { + "windows" "15" + "linux" "16" + "mac" "15" + } + + "tracebleed" + { + "windows" "16" + "linux" "17" + "mac" "16" + } + + "mymonsterpointer" + { + "windows" "18" + "linux" "19" + "mac" "18" + } + + "mysquadmonsterpointer" + { + "windows" "19" + "linux" "20" + "mac" "19" + } + + "gettogglestate" + { + "windows" "20" + "linux" "21" + "mac" "20" + } + + "addplayeritem" + { + "windows" "21" + "linux" "22" + "mac" "21" + } + + "removeplayeritem" + { + "windows" "22" + "linux" "23" + "mac" "22" + } + + "getdelay" + { + "windows" "24" + "linux" "25" + "mac" "24" + } + + "ismoving" + { + "windows" "25" + "linux" "26" + "mac" "25" + } + + "overridereset" + { + "windows" "26" + "linux" "27" + "mac" "26" + } + + "damagedecal" + { + "windows" "27" + "linux" "28" + "mac" "27" + } + + "settogglestate" + { + "windows" "28" + "linux" "29" + "mac" "28" + } + + "startsneaking" + { + "windows" "29" + "linux" "30" + "mac" "29" + } + + "stopsneaking" + { + "windows" "30" + "linux" "31" + "mac" "30" + } + + "oncontrols" + { + "windows" "31" + "linux" "32" + "mac" "31" + } + + "issneaking" + { + "windows" "32" + "linux" "33" + "mac" "32" + } + + "isalive" + { + "windows" "33" + "linux" "34" + "mac" "33" + } + + "isbspmodel" + { + "windows" "34" + "linux" "35" + "mac" "34" + } + + "reflectgauss" + { + "windows" "35" + "linux" "36" + "mac" "35" + } + + "hastarget" + { + "windows" "36" + "linux" "37" + "mac" "36" + } + + "isinworld" + { + "windows" "37" + "linux" "38" + "mac" "37" + } + + "isplayer" + { + "windows" "38" + "linux" "39" + "mac" "38" + } + + "isnetclient" + { + "windows" "39" + "linux" "40" + "mac" "39" + } + + "getnexttarget" + { + "windows" "41" + "linux" "42" + "mac" "41" + } + + "think" + { + "windows" "42" + "linux" "43" + "mac" "42" + } + + "touch" + { + "windows" "43" + "linux" "44" + "mac" "43" + } + + "use" + { + "windows" "44" + "linux" "45" + "mac" "44" + } + + "blocked" + { + "windows" "45" + "linux" "46" + "mac" "45" + } + + "respawn" + { + "windows" "46" + "linux" "47" + "mac" "46" + } + + "updateowner" + { + "windows" "47" + "linux" "48" + "mac" "47" + } + + "fbecomeprone" + { + "windows" "48" + "linux" "49" + "mac" "48" + } + + "center" + { + "windows" "49" + "linux" "50" + "mac" "49" + } + + "eyeposition" + { + "windows" "50" + "linux" "51" + "mac" "50" + } + + "earposition" + { + "windows" "51" + "linux" "52" + "mac" "51" + } + + "bodytarget" + { + "windows" "52" + "linux" "53" + "mac" "52" + } + + "illumination" + { + "windows" "53" + "linux" "54" + "mac" "53" + } + + "fvisible" + { + "windows" "55" + "linux" "55" + "mac" "54" + } + + "fvecvisible" + { + "windows" "54" + "linux" "56" + "mac" "55" + } + + "look" + { + "windows" "65" + "linux" "66" + "mac" "65" + } + + "changeyaw" + { + "windows" "68" + "linux" "69" + "mac" "68" + } + + "irelationship" + { + "windows" "70" + "linux" "71" + "mac" "70" + } + + "monsterinitdead" + { + "windows" "72" + "linux" "73" + "mac" "72" + } + + "becomedead" + { + "windows" "73" + "linux" "74" + "mac" "73" + } + + "bestvisibleenemy" + { + "windows" "75" + "linux" "76" + "mac" "75" + } + + "finviewcone" + { + "windows" "77" + "linux" "77" + "mac" "76" + } + + "fvecinviewcone" + { + "windows" "76" + "linux" "78" + "mac" "77" + } + + "runai" + { + "windows" "66" + "linux" "67" + "mac" "66" + } + + "monsterthink" + { + "windows" "69" + "linux" "70" + "mac" "69" + } + + "monsterinit" + { + "windows" "71" + "linux" "72" + "mac" "71" + } + + "checklocalmove" + { + "windows" "78" + "linux" "79" + "mac" "78" + } + + "move" + { + "windows" "79" + "linux" "80" + "mac" "79" + } + + "moveexecute" + { + "windows" "80" + "linux" "81" + "mac" "80" + } + + "shouldadvanceroute" + { + "windows" "81" + "linux" "82" + "mac" "81" + } + + "getstoppedactivity" + { + "windows" "82" + "linux" "83" + "mac" "82" + } + + "stop" + { + "windows" "83" + "linux" "84" + "mac" "83" + } + + "checkrangeattack1" + { + "windows" "84" + "linux" "85" + "mac" "84" + } + + "checkrangeattack2" + { + "windows" "85" + "linux" "86" + "mac" "85" + } + + "checkmeleeattack1" + { + "windows" "86" + "linux" "87" + "mac" "86" + } + + "checkmeleeattack2" + { + "windows" "87" + "linux" "88" + "mac" "87" + } + + "schedulechange" + { + "windows" "93" + "linux" "94" + "mac" "93" + } + + "canplaysequence" + { + "windows" "94" + "linux" "95" + "mac" "94" + } + + "canplaysentence" + { + "windows" "95" + "linux" "96" + "mac" "95" + } + + "playsentence" + { + "windows" "96" + "linux" "97" + "mac" "96" + } + + "playscriptedsentence" + { + "windows" "97" + "linux" "98" + "mac" "97" + } + + "sentencestop" + { + "windows" "98" + "linux" "99" + "mac" "98" + } + + "getidealstate" + { + "windows" "99" + "linux" "100" + "mac" "99" + } + + "setactivity" + { + "windows" "100" + "linux" "101" + "mac" "100" + } + + "reportaistate" + { + "windows" "101" + "linux" "102" + "mac" "101" + } + + "checkenemy" + { + "windows" "102" + "linux" "103" + "mac" "102" + } + + "ftriangulate" + { + "windows" "103" + "linux" "104" + "mac" "103" + } + + "setyawspeed" + { + "windows" "104" + "linux" "105" + "mac" "104" + } + + "buildnearestroute" + { + "windows" "105" + "linux" "106" + "mac" "105" + } + + "findcover" + { + "windows" "106" + "linux" "107" + "mac" "106" + } + + "coverradius" + { + "windows" "108" + "linux" "109" + "mac" "108" + } + + "fcancheckattacks" + { + "windows" "109" + "linux" "110" + "mac" "109" + } + + "checkammo" + { + "windows" "110" + "linux" "111" + "mac" "110" + } + + "ignoreconditions" + { + "windows" "111" + "linux" "112" + "mac" "111" + } + + "fvalidatehinttype" + { + "windows" "112" + "linux" "113" + "mac" "112" + } + + "fcanactiveidle" + { + "windows" "113" + "linux" "114" + "mac" "113" + } + + "isoundmask" + { + "windows" "114" + "linux" "115" + "mac" "114" + } + + "hearingsensitivity" + { + "windows" "117" + "linux" "118" + "mac" "117" + } + + "barnaclevictimbitten" + { + "windows" "118" + "linux" "119" + "mac" "118" + } + + "barnaclevictimreleased" + { + "windows" "119" + "linux" "120" + "mac" "119" + } + + "preschedulethink" + { + "windows" "120" + "linux" "121" + "mac" "120" + } + + "getdeathactivity" + { + "windows" "121" + "linux" "122" + "mac" "121" + } + + "gibmonster" + { + "windows" "122" + "linux" "123" + "mac" "122" + } + + "hashumangibs" + { + "windows" "123" + "linux" "124" + "mac" "123" + } + + "hasaliengibs" + { + "windows" "124" + "linux" "125" + "mac" "124" + } + + "fademonster" + { + "windows" "125" + "linux" "126" + "mac" "125" + } + + "deathsound" + { + "windows" "128" + "linux" "129" + "mac" "128" + } + + "alertsound" + { + "windows" "129" + "linux" "130" + "mac" "129" + } + + "idlesound" + { + "windows" "130" + "linux" "131" + "mac" "130" + } + + "painsound" + { + "windows" "131" + "linux" "132" + "mac" "131" + } + + "stopfollowing" + { + "windows" "132" + "linux" "133" + "mac" "132" + } + + "player_jump" + { + "windows" "133" + "linux" "134" + "mac" "133" + } + + "player_duck" + { + "windows" "134" + "linux" "135" + "mac" "134" + } + + "player_prethink" + { + "windows" "135" + "linux" "136" + "mac" "135" + } + + "player_postthink" + { + "windows" "136" + "linux" "137" + "mac" "136" + } + + "player_shouldfadeondeath" + { + "windows" "67" + "linux" "68" + "mac" "67" + } + + "player_impulsecommands" + { + "windows" "137" + "linux" "138" + "mac" "137" + } + + "item_addtoplayer" + { + "windows" "65" + "linux" "66" + "mac" "65" + } + + "item_addduplicate" + { + "windows" "66" + "linux" "67" + "mac" "66" + } + + "item_getiteminfo" + { + "windows" "68" + "linux" "69" + "mac" "68" + } + + "item_candeploy" + { + "windows" "69" + "linux" "70" + "mac" "69" + } + + "item_deploy" + { + "windows" "70" + "linux" "71" + "mac" "70" + } + + "item_canholster" + { + "windows" "71" + "linux" "72" + "mac" "71" + } + + "item_holster" + { + "windows" "72" + "linux" "73" + "mac" "72" + } + + "item_updateiteminfo" + { + "windows" "73" + "linux" "74" + "mac" "73" + } + + "item_preframe" + { + "windows" "74" + "linux" "75" + "mac" "74" + } + + "item_postframe" + { + "windows" "75" + "linux" "76" + "mac" "75" + } + + "item_drop" + { + "windows" "76" + "linux" "77" + "mac" "76" + } + + "item_kill" + { + "windows" "77" + "linux" "78" + "mac" "77" + } + + "item_attachtoplayer" + { + "windows" "78" + "linux" "79" + "mac" "78" + } + + "item_primaryammoindex" + { + "windows" "79" + "linux" "80" + "mac" "79" + } + + "item_secondaryammoindex" + { + "windows" "80" + "linux" "81" + "mac" "80" + } + + "item_updateclientdata" + { + "windows" "81" + "linux" "82" + "mac" "81" + } + + "item_getweaponptr" + { + "windows" "82" + "linux" "83" + "mac" "82" + } + + "item_itemslot" + { + "windows" "67" + "linux" "68" + "mac" "67" + } + + "weapon_extractammo" + { + "windows" "83" + "linux" "84" + "mac" "83" + } + + "weapon_extractclipammo" + { + "windows" "84" + "linux" "85" + "mac" "84" + } + + "weapon_addweapon" + { + "windows" "85" + "linux" "86" + "mac" "85" + } + + "weapon_playemptysound" + { + "windows" "86" + "linux" "87" + "mac" "86" + } + + "weapon_resetemptysound" + { + "windows" "87" + "linux" "88" + "mac" "87" + } + + "weapon_sendweaponanim" + { + "windows" "88" + "linux" "89" + "mac" "88" + } + + "weapon_isusable" + { + "windows" "89" + "linux" "90" + "mac" "89" + } + + "weapon_primaryattack" + { + "windows" "90" + "linux" "91" + "mac" "90" + } + + "weapon_secondaryattack" + { + "windows" "91" + "linux" "92" + "mac" "91" + } + + "weapon_reload" + { + "windows" "92" + "linux" "93" + "mac" "92" + } + + "weapon_weaponidle" + { + "windows" "93" + "linux" "94" + "mac" "93" + } + + "weapon_retireweapon" + { + "windows" "94" + "linux" "95" + "mac" "94" + } + + "weapon_shouldweaponidle" + { + "windows" "95" + "linux" "96" + "mac" "95" + } + + "weapon_getnextattackdelay" + { + "windows" "96" + "linux" "97" + "mac" "96" + } + + "tfc_killed" + { + "windows" "14" + "linux" "15" + "mac" "14" + } + + "tfc_istriggered" + { + "windows" "17" + "linux" "18" + "mac" "17" + } + + "tfc_giveammo" + { + "windows" "23" + "linux" "24" + "mac" "23" + } + + "tfc_dbgetitemname" + { + "windows" "40" + "linux" "41" + "mac" "40" + } + + "tfc_engineeruse" + { + "windows" "56" + "linux" "57" + "mac" "56" + } + + "tfc_finished" + { + "windows" "57" + "linux" "58" + "mac" "57" + } + + "tfc_empexplode" + { + "windows" "58" + "linux" "59" + "mac" "58" + } + + "tfc_calcempdmgrad" + { + "windows" "59" + "linux" "60" + "mac" "59" + } + + "tfc_takeempblast" + { + "windows" "60" + "linux" "61" + "mac" "60" + } + + "tfc_empremove" + { + "windows" "61" + "linux" "62" + "mac" "61" + } + + "tfc_takeconcussionblast" + { + "windows" "62" + "linux" "63" + "mac" "62" + } + + "tfc_concuss" + { + "windows" "63" + "linux" "64" + "mac" "63" + } + + "tfc_radiusdamage" + { + "windows" "127" + "linux" "127" + "mac" "126" + } + + "tfc_radiusdamage2" + { + "windows" "126" + "linux" "128" + "mac" "127" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/ts/offsets-common.txt b/gamedata/common.games/virtual.games/ts/offsets-common.txt new file mode 100644 index 00000000..2cead359 --- /dev/null +++ b/gamedata/common.games/virtual.games/ts/offsets-common.txt @@ -0,0 +1,746 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "0" + } + + "base" + { + "windows" "0x0" + "linux" "0x60" + } + + "spawn" + { + "windows" "7" + "linux" "9" + } + + "precache" + { + "windows" "8" + "linux" "10" + } + + "keyvalue" + { + "windows" "9" + "linux" "11" + } + + "objectcaps" + { + "windows" "12" + "linux" "14" + } + + "activate" + { + "windows" "13" + "linux" "15" + } + + "setobjectcollisionbox" + { + "windows" "16" + "linux" "18" + } + + "classify" + { + "windows" "17" + "linux" "19" + } + + "deathnotice" + { + "windows" "18" + "linux" "20" + } + + "traceattack" + { + "windows" "19" + "linux" "21" + } + + "takedamage" + { + "windows" "20" + "linux" "22" + } + + "takehealth" + { + "windows" "21" + "linux" "23" + } + + "killed" + { + "windows" "22" + "linux" "24" + } + + "bloodcolor" + { + "windows" "23" + "linux" "25" + } + + "tracebleed" + { + "windows" "24" + "linux" "26" + } + + "istriggered" + { + "windows" "25" + "linux" "27" + } + + "mymonsterpointer" + { + "windows" "26" + "linux" "28" + } + + "mysquadmonsterpointer" + { + "windows" "27" + "linux" "29" + } + + "gettogglestate" + { + "windows" "28" + "linux" "30" + } + + "addpoints" + { + "windows" "29" + "linux" "31" + } + + "addpointstoteam" + { + "windows" "30" + "linux" "32" + } + + "addplayeritem" + { + "windows" "31" + "linux" "33" + } + + "removeplayeritem" + { + "windows" "32" + "linux" "34" + } + + "giveammo" + { + "windows" "33" + "linux" "35" + } + + "getdelay" + { + "windows" "34" + "linux" "36" + } + + "ismoving" + { + "windows" "35" + "linux" "37" + } + + "overridereset" + { + "windows" "36" + "linux" "38" + } + + "damagedecal" + { + "windows" "37" + "linux" "39" + } + + "settogglestate" + { + "windows" "38" + "linux" "40" + } + + "startsneaking" + { + "windows" "39" + "linux" "41" + } + + "stopsneaking" + { + "windows" "40" + "linux" "42" + } + + "oncontrols" + { + "windows" "41" + "linux" "43" + } + + "issneaking" + { + "windows" "42" + "linux" "44" + } + + "isalive" + { + "windows" "43" + "linux" "45" + } + + "isbspmodel" + { + "windows" "44" + "linux" "46" + } + + "reflectgauss" + { + "windows" "45" + "linux" "47" + } + + "hastarget" + { + "windows" "46" + "linux" "48" + } + + "isinworld" + { + "windows" "47" + "linux" "49" + } + + "isplayer" + { + "windows" "48" + "linux" "50" + } + + "isnetclient" + { + "windows" "49" + "linux" "51" + } + + "teamid" + { + "windows" "50" + "linux" "52" + } + + "getnexttarget" + { + "windows" "51" + "linux" "53" + } + + "think" + { + "windows" "52" + "linux" "54" + } + + "touch" + { + "windows" "53" + "linux" "55" + } + + "use" + { + "windows" "54" + "linux" "56" + } + + "blocked" + { + "windows" "55" + "linux" "57" + } + + "respawn" + { + "windows" "57" + "linux" "59" + } + + "updateowner" + { + "windows" "58" + "linux" "60" + } + + "fbecomeprone" + { + "windows" "59" + "linux" "61" + } + + "center" + { + "windows" "60" + "linux" "62" + } + + "eyeposition" + { + "windows" "61" + "linux" "63" + } + + "earposition" + { + "windows" "62" + "linux" "64" + } + + "bodytarget" + { + "windows" "63" + "linux" "65" + } + + "illumination" + { + "windows" "64" + "linux" "66" + } + + "fvisible" + { + "windows" "65" + "linux" "67" + } + + "fvecvisible" + { + "windows" "66" + "linux" "68" + } + + "changeyaw" + { + "windows" "68" + "linux" "70" + } + + "hashumangibs" + { + "windows" "69" + "linux" "71" + } + + "hasaliengibs" + { + "windows" "70" + "linux" "72" + } + + "fademonster" + { + "windows" "71" + "linux" "73" + } + + "gibmonster" + { + "windows" "72" + "linux" "74" + } + + "getdeathactivity" + { + "windows" "73" + "linux" "75" + } + + "becomedead" + { + "windows" "74" + "linux" "76" + } + + "irelationship" + { + "windows" "76" + "linux" "78" + } + + "painsound" + { + "windows" "77" + "linux" "79" + } + + "reportaistate" + { + "windows" "78" + "linux" "80" + } + + "monsterinitdead" + { + "windows" "79" + "linux" "81" + } + + "look" + { + "windows" "80" + "linux" "82" + } + + "bestvisibleenemy" + { + "windows" "81" + "linux" "83" + } + + "finviewcone" + { + "windows" "82" + "linux" "84" + } + + "fvecinviewcone" + { + "windows" "83" + "linux" "85" + } + + "player_jump" + { + "windows" "84" + "linux" "86" + } + + "player_duck" + { + "windows" "85" + "linux" "87" + } + + "player_prethink" + { + "windows" "86" + "linux" "88" + } + + "player_postthink" + { + "windows" "87" + "linux" "89" + } + + "player_getgunposition" + { + "windows" "88" + "linux" "90" + } + + "player_shouldfadeondeath" + { + "windows" "75" + "linux" "77" + } + + "player_impulsecommands" + { + "windows" "90" + "linux" "92" + } + + "player_updateclientdata" + { + "windows" "89" + "linux" "91" + } + + "item_addtoplayer" + { + "windows" "68" + "linux" "70" + } + + "item_addduplicate" + { + "windows" "69" + "linux" "71" + } + + "item_candeploy" + { + "windows" "71" + "linux" "73" + } + + "item_deploy" + { + "windows" "72" + "linux" "74" + } + + "item_canholster" + { + "windows" "73" + "linux" "75" + } + + "item_holster" + { + "windows" "74" + "linux" "76" + } + + "item_updateiteminfo" + { + "windows" "75" + "linux" "77" + } + + "item_preframe" + { + "windows" "76" + "linux" "78" + } + + "item_postframe" + { + "windows" "77" + "linux" "79" + } + + "item_drop" + { + "windows" "78" + "linux" "80" + } + + "item_kill" + { + "windows" "79" + "linux" "81" + } + + "item_attachtoplayer" + { + "windows" "80" + "linux" "82" + } + + "item_primaryammoindex" + { + "windows" "81" + "linux" "83" + } + + "item_secondaryammoindex" + { + "windows" "82" + "linux" "84" + } + + "item_updateclientdata" + { + "windows" "83" + "linux" "85" + } + + "item_getweaponptr" + { + "windows" "84" + "linux" "86" + } + + "item_itemslot" + { + "windows" "85" + "linux" "87" + } + + "weapon_extractammo" + { + "windows" "86" + "linux" "88" + } + + "weapon_extractclipammo" + { + "windows" "87" + "linux" "89" + } + + "weapon_addweapon" + { + "windows" "88" + "linux" "90" + } + + "weapon_playemptysound" + { + "windows" "89" + "linux" "91" + } + + "weapon_resetemptysound" + { + "windows" "90" + "linux" "92" + } + + "weapon_sendweaponanim" + { + "windows" "91" + "linux" "93" + } + + "weapon_isusable" + { + "windows" "92" + "linux" "94" + } + + "weapon_primaryattack" + { + "windows" "93" + "linux" "95" + } + + "weapon_secondaryattack" + { + "windows" "94" + "linux" "96" + } + + "weapon_reload" + { + "windows" "96" + "linux" "98" + } + + "weapon_weaponidle" + { + "windows" "97" + "linux" "99" + } + + "weapon_retireweapon" + { + "windows" "98" + "linux" "100" + } + + "weapon_shouldweaponidle" + { + "windows" "99" + "linux" "101" + } + + "weapon_usedecrement" + { + "windows" "100" + "linux" "102" + } + + "ts_breakablerespawn" + { + "windows" "0" + "linux" "2" + } + + "ts_canusedthroughwalls" + { + "windows" "1" + "linux" "3" + } + + "ts_giveslowmul" + { + "windows" "2" + "linux" "4" + } + + "ts_goslow" + { + "windows" "3" + "linux" "5" + } + + "ts_inslow" + { + "windows" "4" + "linux" "6" + } + + "ts_isobjective" + { + "windows" "5" + "linux" "7" + } + + "ts_enableobjective" + { + "windows" "6" + "linux" "8" + } + + "ts_onfreeentprivatedata" + { + "windows" "10" + "linux" "12" + } + + "ts_shouldcollide" + { + "windows" "11" + "linux" "13" + } + + "ts_weapon_alternateattack" + { + "windows" "95" + "linux" "97" + } + + } + } +} diff --git a/gamedata/common.games/virtual.games/valve/offsets-common.txt b/gamedata/common.games/virtual.games/valve/offsets-common.txt new file mode 100644 index 00000000..360ddd52 --- /dev/null +++ b/gamedata/common.games/virtual.games/valve/offsets-common.txt @@ -0,0 +1,1091 @@ +/** + * Do not edit this file. Any changes will be overwritten by the gamedata + * updater or by upgrading your AMX Mod X install. + * + * To override data in this file, create a subdirectory named "custom" and + * place your own gamedata file(s) inside of it. Such files will be parsed + * after AMXX's own. + * + * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(AMX_Mod_X) + */ + +"Games" +{ + "#default" + { + "Offsets" + { + "pev" + { + "windows" "4" + "linux" "4" + "mac" "4" + } + + "base" + { + "windows" "0x0" + "linux" "0x0" + "mac" "0x0" + } + + "spawn" + { + "windows" "0" + "linux" "0" + "mac" "0" + } + + "precache" + { + "windows" "1" + "linux" "1" + "mac" "1" + } + + "keyvalue" + { + "windows" "2" + "linux" "2" + "mac" "2" + } + + "objectcaps" + { + "windows" "5" + "linux" "5" + "mac" "5" + } + + "activate" + { + "windows" "6" + "linux" "6" + "mac" "6" + } + + "setobjectcollisionbox" + { + "windows" "7" + "linux" "7" + "mac" "7" + } + + "classify" + { + "windows" "8" + "linux" "8" + "mac" "8" + } + + "deathnotice" + { + "windows" "9" + "linux" "9" + "mac" "9" + } + + "traceattack" + { + "windows" "10" + "linux" "10" + "mac" "10" + } + + "takedamage" + { + "windows" "11" + "linux" "11" + "mac" "11" + } + + "takehealth" + { + "windows" "12" + "linux" "12" + "mac" "12" + } + + "killed" + { + "windows" "13" + "linux" "13" + "mac" "13" + } + + "bloodcolor" + { + "windows" "14" + "linux" "14" + "mac" "14" + } + + "tracebleed" + { + "windows" "15" + "linux" "15" + "mac" "15" + } + + "istriggered" + { + "windows" "16" + "linux" "16" + "mac" "16" + } + + "mymonsterpointer" + { + "windows" "17" + "linux" "17" + "mac" "17" + } + + "mysquadmonsterpointer" + { + "windows" "18" + "linux" "18" + "mac" "18" + } + + "gettogglestate" + { + "windows" "19" + "linux" "19" + "mac" "19" + } + + "addpoints" + { + "windows" "20" + "linux" "20" + "mac" "20" + } + + "addpointstoteam" + { + "windows" "21" + "linux" "21" + "mac" "21" + } + + "addplayeritem" + { + "windows" "22" + "linux" "22" + "mac" "22" + } + + "removeplayeritem" + { + "windows" "23" + "linux" "23" + "mac" "23" + } + + "giveammo" + { + "windows" "24" + "linux" "24" + "mac" "24" + } + + "getdelay" + { + "windows" "25" + "linux" "25" + "mac" "25" + } + + "ismoving" + { + "windows" "26" + "linux" "26" + "mac" "26" + } + + "overridereset" + { + "windows" "27" + "linux" "27" + "mac" "27" + } + + "damagedecal" + { + "windows" "28" + "linux" "28" + "mac" "28" + } + + "settogglestate" + { + "windows" "29" + "linux" "29" + "mac" "29" + } + + "startsneaking" + { + "windows" "30" + "linux" "30" + "mac" "30" + } + + "stopsneaking" + { + "windows" "31" + "linux" "31" + "mac" "31" + } + + "oncontrols" + { + "windows" "32" + "linux" "32" + "mac" "32" + } + + "issneaking" + { + "windows" "33" + "linux" "33" + "mac" "33" + } + + "isalive" + { + "windows" "34" + "linux" "34" + "mac" "34" + } + + "isbspmodel" + { + "windows" "35" + "linux" "35" + "mac" "35" + } + + "reflectgauss" + { + "windows" "36" + "linux" "36" + "mac" "36" + } + + "hastarget" + { + "windows" "37" + "linux" "37" + "mac" "37" + } + + "isinworld" + { + "windows" "38" + "linux" "38" + "mac" "38" + } + + "isplayer" + { + "windows" "39" + "linux" "39" + "mac" "39" + } + + "isnetclient" + { + "windows" "40" + "linux" "40" + "mac" "40" + } + + "teamid" + { + "windows" "41" + "linux" "41" + "mac" "41" + } + + "getnexttarget" + { + "windows" "42" + "linux" "42" + "mac" "42" + } + + "think" + { + "windows" "43" + "linux" "43" + "mac" "43" + } + + "touch" + { + "windows" "44" + "linux" "44" + "mac" "44" + } + + "use" + { + "windows" "45" + "linux" "45" + "mac" "45" + } + + "blocked" + { + "windows" "46" + "linux" "46" + "mac" "46" + } + + "respawn" + { + "windows" "47" + "linux" "47" + "mac" "47" + } + + "updateowner" + { + "windows" "48" + "linux" "48" + "mac" "48" + } + + "fbecomeprone" + { + "windows" "49" + "linux" "49" + "mac" "49" + } + + "center" + { + "windows" "50" + "linux" "50" + "mac" "50" + } + + "eyeposition" + { + "windows" "51" + "linux" "51" + "mac" "51" + } + + "earposition" + { + "windows" "52" + "linux" "52" + "mac" "52" + } + + "bodytarget" + { + "windows" "53" + "linux" "53" + "mac" "53" + } + + "illumination" + { + "windows" "54" + "linux" "54" + "mac" "54" + } + + "fvisible" + { + "windows" "55" + "linux" "55" + "mac" "55" + } + + "fvecvisible" + { + "windows" "56" + "linux" "56" + "mac" "56" + } + + "look" + { + "windows" "58" + "linux" "58" + "mac" "58" + } + + "changeyaw" + { + "windows" "61" + "linux" "61" + "mac" "61" + } + + "irelationship" + { + "windows" "63" + "linux" "63" + "mac" "63" + } + + "monsterinitdead" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "becomedead" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "bestvisibleenemy" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "finviewcone" + { + "windows" "69" + "linux" "69" + "mac" "69" + } + + "fvecinviewcone" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "runai" + { + "windows" "59" + "linux" "59" + "mac" "59" + } + + "monsterthink" + { + "windows" "62" + "linux" "62" + "mac" "62" + } + + "monsterinit" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "checklocalmove" + { + "windows" "71" + "linux" "71" + "mac" "71" + } + + "move" + { + "windows" "72" + "linux" "72" + "mac" "72" + } + + "moveexecute" + { + "windows" "73" + "linux" "73" + "mac" "73" + } + + "shouldadvanceroute" + { + "windows" "74" + "linux" "74" + "mac" "74" + } + + "getstoppedactivity" + { + "windows" "75" + "linux" "75" + "mac" "75" + } + + "stop" + { + "windows" "76" + "linux" "76" + "mac" "76" + } + + "checkrangeattack1" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "checkrangeattack2" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "checkmeleeattack1" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "checkmeleeattack2" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "schedulechange" + { + "windows" "86" + "linux" "86" + "mac" "86" + } + + "canplaysequence" + { + "windows" "87" + "linux" "87" + "mac" "87" + } + + "canplaysentence" + { + "windows" "88" + "linux" "88" + "mac" "88" + } + + "playsentence" + { + "windows" "89" + "linux" "89" + "mac" "89" + } + + "playscriptedsentence" + { + "windows" "90" + "linux" "90" + "mac" "90" + } + + "sentencestop" + { + "windows" "91" + "linux" "91" + "mac" "91" + } + + "getidealstate" + { + "windows" "92" + "linux" "92" + "mac" "92" + } + + "setactivity" + { + "windows" "93" + "linux" "93" + "mac" "93" + } + + "reportaistate" + { + "windows" "94" + "linux" "94" + "mac" "94" + } + + "checkenemy" + { + "windows" "95" + "linux" "95" + "mac" "95" + } + + "ftriangulate" + { + "windows" "96" + "linux" "96" + "mac" "96" + } + + "setyawspeed" + { + "windows" "97" + "linux" "97" + "mac" "97" + } + + "buildnearestroute" + { + "windows" "98" + "linux" "98" + "mac" "98" + } + + "findcover" + { + "windows" "99" + "linux" "99" + "mac" "99" + } + + "coverradius" + { + "windows" "101" + "linux" "101" + "mac" "101" + } + + "fcancheckattacks" + { + "windows" "102" + "linux" "102" + "mac" "102" + } + + "checkammo" + { + "windows" "103" + "linux" "103" + "mac" "103" + } + + "ignoreconditions" + { + "windows" "104" + "linux" "104" + "mac" "104" + } + + "fvalidatehinttype" + { + "windows" "105" + "linux" "105" + "mac" "105" + } + + "fcanactiveidle" + { + "windows" "106" + "linux" "106" + "mac" "106" + } + + "isoundmask" + { + "windows" "107" + "linux" "107" + "mac" "107" + } + + "hearingsensitivity" + { + "windows" "110" + "linux" "110" + "mac" "110" + } + + "barnaclevictimbitten" + { + "windows" "111" + "linux" "111" + "mac" "111" + } + + "barnaclevictimreleased" + { + "windows" "112" + "linux" "112" + "mac" "112" + } + + "preschedulethink" + { + "windows" "113" + "linux" "113" + "mac" "113" + } + + "getdeathactivity" + { + "windows" "114" + "linux" "114" + "mac" "114" + } + + "gibmonster" + { + "windows" "115" + "linux" "115" + "mac" "115" + } + + "hashumangibs" + { + "windows" "116" + "linux" "116" + "mac" "116" + } + + "hasaliengibs" + { + "windows" "117" + "linux" "117" + "mac" "117" + } + + "fademonster" + { + "windows" "118" + "linux" "118" + "mac" "118" + } + + "deathsound" + { + "windows" "120" + "linux" "120" + "mac" "120" + } + + "alertsound" + { + "windows" "121" + "linux" "121" + "mac" "121" + } + + "idlesound" + { + "windows" "122" + "linux" "122" + "mac" "122" + } + + "painsound" + { + "windows" "123" + "linux" "123" + "mac" "123" + } + + "stopfollowing" + { + "windows" "124" + "linux" "124" + "mac" "124" + } + + "player_jump" + { + "windows" "125" + "linux" "125" + "mac" "125" + } + + "player_duck" + { + "windows" "126" + "linux" "126" + "mac" "126" + } + + "player_prethink" + { + "windows" "127" + "linux" "127" + "mac" "127" + } + + "player_postthink" + { + "windows" "128" + "linux" "128" + "mac" "128" + } + + "player_getgunposition" + { + "windows" "119" + "linux" "119" + "mac" "119" + } + + "player_shouldfadeondeath" + { + "windows" "60" + "linux" "60" + "mac" "60" + } + + "player_impulsecommands" + { + "windows" "130" + "linux" "130" + "mac" "130" + } + + "player_updateclientdata" + { + "windows" "129" + "linux" "129" + "mac" "129" + } + + "item_addtoplayer" + { + "windows" "58" + "linux" "58" + "mac" "58" + } + + "item_addduplicate" + { + "windows" "59" + "linux" "59" + "mac" "59" + } + + "item_getiteminfo" + { + "windows" "60" + "linux" "60" + "mac" "60" + } + + "item_candeploy" + { + "windows" "61" + "linux" "61" + "mac" "61" + } + + "item_deploy" + { + "windows" "62" + "linux" "62" + "mac" "62" + } + + "item_canholster" + { + "windows" "63" + "linux" "63" + "mac" "63" + } + + "item_holster" + { + "windows" "64" + "linux" "64" + "mac" "64" + } + + "item_updateiteminfo" + { + "windows" "65" + "linux" "65" + "mac" "65" + } + + "item_preframe" + { + "windows" "66" + "linux" "66" + "mac" "66" + } + + "item_postframe" + { + "windows" "67" + "linux" "67" + "mac" "67" + } + + "item_drop" + { + "windows" "68" + "linux" "68" + "mac" "68" + } + + "item_kill" + { + "windows" "69" + "linux" "69" + "mac" "69" + } + + "item_attachtoplayer" + { + "windows" "70" + "linux" "70" + "mac" "70" + } + + "item_primaryammoindex" + { + "windows" "71" + "linux" "71" + "mac" "71" + } + + "item_secondaryammoindex" + { + "windows" "72" + "linux" "72" + "mac" "72" + } + + "item_updateclientdata" + { + "windows" "73" + "linux" "73" + "mac" "73" + } + + "item_getweaponptr" + { + "windows" "74" + "linux" "74" + "mac" "74" + } + + "item_itemslot" + { + "windows" "75" + "linux" "75" + "mac" "75" + } + + "weapon_extractammo" + { + "windows" "76" + "linux" "76" + "mac" "76" + } + + "weapon_extractclipammo" + { + "windows" "77" + "linux" "77" + "mac" "77" + } + + "weapon_addweapon" + { + "windows" "78" + "linux" "78" + "mac" "78" + } + + "weapon_playemptysound" + { + "windows" "79" + "linux" "79" + "mac" "79" + } + + "weapon_resetemptysound" + { + "windows" "80" + "linux" "80" + "mac" "80" + } + + "weapon_sendweaponanim" + { + "windows" "81" + "linux" "81" + "mac" "81" + } + + "weapon_isusable" + { + "windows" "82" + "linux" "82" + "mac" "82" + } + + "weapon_primaryattack" + { + "windows" "83" + "linux" "83" + "mac" "83" + } + + "weapon_secondaryattack" + { + "windows" "84" + "linux" "84" + "mac" "84" + } + + "weapon_reload" + { + "windows" "85" + "linux" "85" + "mac" "85" + } + + "weapon_weaponidle" + { + "windows" "86" + "linux" "86" + "mac" "86" + } + + "weapon_retireweapon" + { + "windows" "87" + "linux" "87" + "mac" "87" + } + + "weapon_shouldweaponidle" + { + "windows" "88" + "linux" "88" + "mac" "88" + } + + "weapon_usedecrement" + { + "windows" "89" + "linux" "89" + "mac" "89" + } + + } + } +} diff --git a/installer/amxmodx-installer.nsi b/installer/amxmodx-installer.nsi index 5c62d4e7..39fdd0f4 100755 --- a/installer/amxmodx-installer.nsi +++ b/installer/amxmodx-installer.nsi @@ -110,7 +110,6 @@ Section "MainSection" SEC01 File "installer\files\base\addons\amxmodx\configs\core.ini" File "installer\files\base\addons\amxmodx\configs\custommenuitems.cfg" File "installer\files\base\addons\amxmodx\configs\cvars.ini" - File "installer\files\base\addons\amxmodx\configs\hamdata.ini" File "installer\files\base\addons\amxmodx\configs\maps.ini" File "installer\files\base\addons\amxmodx\configs\modules.ini" File "installer\files\base\addons\amxmodx\configs\plugins.ini" diff --git a/modules/hamsandwich/config_parser.cpp b/modules/hamsandwich/config_parser.cpp index a2b54b94..411956a7 100644 --- a/modules/hamsandwich/config_parser.cpp +++ b/modules/hamsandwich/config_parser.cpp @@ -11,381 +11,46 @@ // Ham Sandwich Module // -#include "amxxmodule.h" - +#include <amxxmodule.h> #include "ham_const.h" #include "hooklist.h" #include "offsets.h" -#include <amtl/am-string.h> -extern hook_t hooklist[]; +IGameConfig *CommonConfig; +IGameConfigManager *ConfigManager; -enum -{ - LEX_INVALID = 0, - - LEX_UNKNOWN, - - LEX_START_SEC, - LEX_END_SEC, - - LEX_MIRROR, - - LEX_PEV, - LEX_BASE, - - LEX_END -}; - -const char *tokens[] = -{ - "", // LEX_INVALID - - "", // LEX_UNKNOWN - - "@section", // LEX_START_SEC - "@end", // LEX_END_SEC - - "@mirror", // LEX_MIRROR - - "pev", // LEX_PEV - "base", // LEX_BASE - - "", // LEX_END -}; - -static void trim_line(char *input); -static void read_mirror(char *input); -static void skip_to_end_of_section(FILE *fp); -static int lex(char*& buffer); - -int lex(char*& buffer) -{ - trim_line(buffer); - - size_t len; - - for (int i=0; i<LEX_END; i++) - { - if (tokens[i]!=NULL && *(tokens[i])!='\0') - { - len=strlen(tokens[i]); - if (strncmp(buffer,tokens[i],len)==0) - { - buffer+=len+1; - return i; - } - } - } - return LEX_UNKNOWN; -} - -// How we handle "mirrors" -// We just note down the current mod name, and every time -// we come across a mirror with the destination that matches -// the current mod name, we change the current mod name to -// the source for that mirror. - -char CurrentModName[64]; - -static void read_mirror(char *input) -{ - char *data=input; - char *data2; - - char source[64]; - char dest[64]; - - char old; - while ( *data!=' ' && - *data!='\t' && - *data!='\0') - { - - data++; - } - - old=*data; - *data='\0'; - - // mark down the source - ke::SafeSprintf(source, sizeof(source), "%s", input); - - *data=old; - - while ( *data==' ' || - *data=='\t') - { - data++; - } - data2=data; - - while ( *data!=' ' && - *data!='\t' && - *data!='\0') - { - data++; - } - old=*data; - *data='\0'; - - ke::SafeSprintf(dest, sizeof(dest), "%s", data2); - - *data=old; - - if (strcmp(dest, CurrentModName)==0) - { - ke::SafeSprintf(CurrentModName, sizeof(CurrentModName), "%s", source); - } - -} - -static void trim_line(char *input) -{ - char *oldinput=input; - char *start=input; - - while ( *start==' ' || - *start=='\t' || - *start=='\r' || - *start=='\n') - { - start++; - } - - // Overwrite the whitespace - - if (start != input) - { - while ((*input++=*start++)!='\0') - /* do nothing */ ; - } - - start=oldinput; - - start+=strlen(start) - 1; - - while ( start >= oldinput && - ( *start == '\0' || - *start == ' ' || - *start == '\r' || - *start == '\n' || - *start == '\t')) - { - start--; - } - start++; - *start='\0'; - - // Now find any comments and cut off at the start - - while (*start != '\0') - { - if (*start == ';') - { - *start='\0'; - break; - } - - start++; - } -} - -void skip_to_end_of_section(FILE *fp) -{ - char buffer[1024]; - - while (!feof(fp)) - { - buffer[0]='\0'; - - fgets(buffer, sizeof(buffer)-1, fp); - - trim_line(buffer); - - char *b=&buffer[0]; - if (lex(b)==LEX_END_SEC) - { - break; - } - } -} -static const char* get_localinfo( const char* name , const char* def = 0 ) -{ - const char* b = LOCALINFO( (char*)name ); - if (((b==0)||(*b==0)) && def ) - SET_LOCALINFO((char*)name,(char*)(b = def) ); - return b; -} -int read_start_section(char *data) -{ - if (strncasecmp(data, CurrentModName, strlen(CurrentModName))==0) - { - data+=strlen(CurrentModName)+1; - trim_line(data); - -#ifdef _WIN32 - if (strcmp(data, "windows")==0) -#elif defined(__linux__) - if (strcmp(data, "linux")==0) -#elif defined(__APPLE__) - if (strcmp(data, "mac")==0) -#endif - { - return 1; - } - } - return 0; -} -int read_number(char *input) -{ - char *end; /* Temporary pointer, needed for strtoul(). */ - - // if begins with 0x or 0X it's to be interpretted as hex - if (*input=='0' && - (*(input+1)=='x' || *(input+1)=='X')) - { - return strtoul(input,&end,16); - } - - // otherwise it's to be interpretted as base 10 - return strtoul(input,&end,10); -} -void process_pev(char *data) -{ - trim_line(data); - Offsets.SetPev(read_number(data)); -} -void process_base(char *data) -{ - trim_line(data); - Offsets.SetBase(read_number(data)); -} -void process_key(char *data) -{ - size_t size=0; - - char *a=data; - - while (*a != ' ' && *a != '\t' && *a != '\0') - { - a++; - size++; - } - - if (size==0) - { - return; - } - int set=0; - for (int i=0; i< HAM_LAST_ENTRY_DONT_USE_ME_LOL; i++) - { - if (strncmp(data, hooklist[i].name, size)==0) - { - data+=size+1; - - trim_line(data); - int value=read_number(data); - - hooklist[i].isset=1; - hooklist[i].vtid=value; - - - set=1; - break; - - } - } - - if (set==0) - { - printf("stray key in process_key: %s\n", data); - } - -} int ReadConfig(void) { - char FileName[512]; + ConfigManager = MF_GetConfigManager(); - MF_BuildPathnameR(FileName,sizeof(FileName),"%s",get_localinfo("amxx_configsdir","addons/amxmodx/configs")); + char error[256] = ""; - strncat(FileName,"/hamdata.ini",sizeof(FileName)-1); - - FILE *fp=fopen(FileName,"r"); - - - ke::SafeSprintf(CurrentModName, sizeof(CurrentModName), "%s", MF_GetModname()); - - if (!fp) + if (!ConfigManager->LoadGameConfigFile("common.games", &CommonConfig, error, sizeof error)) { - MF_Log("Unable to open \"%s\" for reading.", FileName); - + MF_Log("common.games gamedata could not be read: %s", error); return -1; } - char data[2048]; + TypeDescription value; - int insec=0; - - while (!feof(fp)) + if (CommonConfig->GetOffset("pev", &value)) { - data[0]='\0'; - - fgets(data, sizeof(data)-1, fp); - - char *b=&data[0]; - - switch(lex(b)) - { - case LEX_PEV: - { - if (insec) - { - process_pev(b); - } - break; - }; - case LEX_BASE: - { - if (insec) - { - process_base(b); - } - break; - }; - case LEX_MIRROR: - { - read_mirror(b); - break; - }; - case LEX_START_SEC: - { - insec=read_start_section(b); - - if (!insec) - { - skip_to_end_of_section(fp); - } - break; - }; - case LEX_END_SEC: - { - insec=0; - break; - }; - case LEX_UNKNOWN: - { - if (insec) - { - process_key(b); - } - }; - } - - + Offsets.SetPev(value.fieldOffset); } - fclose(fp); + if (CommonConfig->GetOffset("base", &value)) + { + Offsets.SetBase(value.fieldOffset); + } + + for (auto index = 0; index < HAM_LAST_ENTRY_DONT_USE_ME_LOL; ++index) + { + if (CommonConfig->GetOffset(hooklist[index].name, &value)) + { + hooklist[index].isset = 1; + hooklist[index].vtid = value.fieldOffset; + } + } return 1; } diff --git a/modules/hamsandwich/ham_const.h b/modules/hamsandwich/ham_const.h index ee6ca006..817b9e79 100644 --- a/modules/hamsandwich/ham_const.h +++ b/modules/hamsandwich/ham_const.h @@ -558,7 +558,7 @@ enum HAM_OK = 0, HAM_INVALID_FUNC, // The function is not valid - HAM_FUNC_NOT_CONFIGURED, // This function is not configured in hamdata.ini + HAM_FUNC_NOT_CONFIGURED, // This function is not configured in gamedata HAM_FUNC_NOT_AVAILABLE, // This function is not more available in the mod HAM_ERR_END diff --git a/modules/hamsandwich/ham_utils.h b/modules/hamsandwich/ham_utils.h index 82877a97..9b8dfa34 100644 --- a/modules/hamsandwich/ham_utils.h +++ b/modules/hamsandwich/ham_utils.h @@ -33,7 +33,7 @@ extern HLTypeConversion TypeConversion; return 0; \ } else if (hooklist[x].isset == 0) { \ char msg[1024]; \ - ke::SafeSprintf(msg, sizeof(msg), "Function %s is not configured in hamdata.ini.", hooklist[x].name); \ + ke::SafeSprintf(msg, sizeof(msg), "Function %s is not configured in gamedata.", hooklist[x].name); \ FailPlugin(amx, x, HAM_FUNC_NOT_CONFIGURED, msg); \ return 0; \ } diff --git a/plugins/include/ham_const.inc b/plugins/include/ham_const.inc index 3d656c2f..c21fbc7e 100644 --- a/plugins/include/ham_const.inc +++ b/plugins/include/ham_const.inc @@ -40,7 +40,7 @@ * This is the entity from which the function is being executed on. * @note All functions and forwards (eg: {Register,Execute}Ham[B]) require * the mod to have the pev and base keys in addition to the function - * keys for the corresponding mod/operating system in hamdata.ini + * keys for the corresponding mod/operating system in gamedata * @note Some functions that return booleans may need to be logically ANDed * to get the desired results because the mod will return the full integer * value. E.g.: (ExecuteHam(Ham_TS_IsObjective, this) & 0x0000FFFF) != 0 @@ -4328,7 +4328,7 @@ enum HamError HAM_OK = 0, HAM_INVALID_FUNC, // The function is not valid - HAM_FUNC_NOT_CONFIGURED, // This function is not configured in hamdata.ini + HAM_FUNC_NOT_CONFIGURED, // This function is not configured in gamedata HAM_FUNC_NOT_AVAILABLE, // This function is not more available in the mod HAM_ERR_END diff --git a/plugins/include/hamsandwich.inc b/plugins/include/hamsandwich.inc index 162475d1..8eb65c27 100644 --- a/plugins/include/hamsandwich.inc +++ b/plugins/include/hamsandwich.inc @@ -15,7 +15,7 @@ * Ham Sandwich is a module that is used to hook and call virtual functions of * entities. * Virtual functions are mod-specific functions. This means that in order - * for this to work on a mod, it needs to be configured with the hamdata.ini + * for this to work on a mod, it needs to be configured with the gamedata * file. * Be very careful with parameter passing to these functions. */ diff --git a/support/PackageScript b/support/PackageScript index fe70fe8f..a2504793 100644 --- a/support/PackageScript +++ b/support/PackageScript @@ -166,7 +166,6 @@ configs = [ 'core.ini', 'custommenuitems.cfg', 'cvars.ini', - 'hamdata.ini', 'maps.ini', 'miscstats.ini', 'modules.ini', From 0b5584a334a0adb0baaaf5df620f329732f20922 Mon Sep 17 00:00:00 2001 From: Arkshine <github@arkshine.me> Date: Fri, 28 Sep 2018 18:31:48 +0200 Subject: [PATCH 79/98] Fix missing files in PackageScript from previous commit --- support/PackageScript | 78 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/support/PackageScript b/support/PackageScript index a2504793..23611be6 100644 --- a/support/PackageScript +++ b/support/PackageScript @@ -35,6 +35,18 @@ folder_list = [ 'base/addons/amxmodx/data/gamedata/common.games/gamerules.games/tfc', 'base/addons/amxmodx/data/gamedata/common.games/gamerules.games/gearbox', 'base/addons/amxmodx/data/gamedata/common.games/gamerules.games/valve', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/ag', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/cstrike', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/dod', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/esf', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/esf_openbeta', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/gearbox', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/ns', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/svencoop', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/tfc', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/ts', + 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/valve', 'base/addons/amxmodx/data/gamedata/modules.games', 'base/addons/amxmodx/data/lang', 'base/addons/amxmodx/dlls', @@ -418,6 +430,72 @@ CopyFiles('gamedata/common.games', 'base/addons/amxmodx/data/gamedata/common.gam ] ) +CopyFiles('gamedata/common.games/virtual.games/ag', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/ag', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/cstrike', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/cstrike', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/dod', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/dod', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/esf', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/esf', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/esf_openbeta', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/esf_openbeta', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/gearbox', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/gearbox', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/ns', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/ns', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/svencoop', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/svencoop', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/tfc', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/tfc', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/ts', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/ts', + [ + 'offsets-common.txt', + ] +) + +CopyFiles('gamedata/common.games/virtual.games/valve', 'base/addons/amxmodx/data/gamedata/common.games/virtual.games/valve', + [ + 'offsets-common.txt', + ] +) + CopyFiles('gamedata/common.games/hostages.games/cstrike', 'base/addons/amxmodx/data/gamedata/common.games/hostages.games/cstrike', [ 'offsets-chostageimprov.txt', From 87b6f274a0949a40a81604fa07495ebe18673151 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Thu, 11 Oct 2018 11:12:06 +0200 Subject: [PATCH 80/98] CS Miscstats: Fix enemy remaining option displaying the message to the wrong team (#611) --- plugins/cstrike/miscstats.sma | 76 +++++++++++------------------------ plugins/lang/miscstats.txt | 6 +++ 2 files changed, 29 insertions(+), 53 deletions(-) diff --git a/plugins/cstrike/miscstats.sma b/plugins/cstrike/miscstats.sma index 89ecb000..c3ac3db0 100755 --- a/plugins/cstrike/miscstats.sma +++ b/plugins/cstrike/miscstats.sma @@ -13,6 +13,7 @@ #include <amxmodx> #include <amxmisc> +#include <cstrike> #include <csx> public MultiKill @@ -81,9 +82,6 @@ new g_pcvar_mp_c4timer, g_c4timer_value const TASK_BOMB_TIMER = 8038 const TASK_DELAYED_NEW_ROUND = 98038 -const TEAM_T = 1 -const TEAM_CT = 2 - new g_connected[MAX_PLAYERS + 1] new g_msounds[MAX_PLAYERS + 1] new const _msound[] = "_msound" @@ -178,13 +176,7 @@ new g_HeadShots[7][] = "HS_MSG_7" } -new g_teamsNames[4][] = -{ - "TERRORIST", - "CT", - "TERRORISTS", - "CTS" -} +new const g_teamsNames[CsTeams][] = { "", "TERRORIST" , "CT", "" }; public plugin_init() { @@ -543,48 +535,26 @@ public client_death(killer, victim, wpnindex, hitplace, TK) } } - new team = get_user_team(victim) - if (EnemyRemaining && is_user_connected(victim)) + new const CsTeams:team = cs_get_user_team(victim); + + if (EnemyRemaining && CS_TEAM_T <= team <= CS_TEAM_CT && is_user_connected(victim)) { - if( TEAM_T <= team <= TEAM_CT ) + new const victimTeammatesCount = get_playersnum_ex(GetPlayers_ExcludeDead | GetPlayers_MatchTeam, g_teamsNames[team]); + + if (victimTeammatesCount) { - new ppl[MAX_PLAYERS], pplnum, epplnum, a - get_players(ppl, epplnum, "ae", team == TEAM_T ? "CT" : "TERRORIST") - get_players(ppl, pplnum, "ae", team == TEAM_T ? "TERRORIST" : "CT") - if( victim_alive ) - { - for(a=0; a<pplnum; a++) - { - if( ppl[a] == victim ) - { - ppl[a] = ppl[--pplnum] - break - } - } - } - - if (pplnum && epplnum) - { - new message[128], team_name[32] + new killerTeammatesList[MAX_PLAYERS], killerTeammatesCount; + get_players_ex(killerTeammatesList, killerTeammatesCount, GetPlayers_ExcludeDead | GetPlayers_MatchTeam, g_teamsNames[CsTeams:(any:team % 2 + 1)]); - set_hudmessage(255, 255, 255, 0.02, 0.85, 2, 0.05, 0.1, 0.02, 3.0, -1) - - /* This is a pretty stupid thing to translate, but whatever */ - new _teamname[32] - if (team == TEAM_T) - { - formatex(_teamname, charsmax(_teamname), "TERRORIST%s", (epplnum == 1) ? "" : "S") - } else { - formatex(_teamname, charsmax(_teamname), "CT%s", (epplnum == 1) ? "" : "S") - } + if (killerTeammatesCount) + { + set_hudmessage(255, 255, 255, 0.02, 0.85, 2, 0.05, 0.1, 0.02, 3.0, -1); - new id - for (a = 0; a < pplnum; ++a) + for (new teammate; teammate < killerTeammatesCount; ++teammate) { - id = ppl[a] - formatex(team_name, charsmax(team_name), "%L", id, _teamname) - formatex(message, charsmax(message), "%L", id, "REMAINING", epplnum, team_name) - ShowSyncHudMsg(id, g_bottom_sync, "%s", message) + victimTeammatesCount > 1 ? + ShowSyncHudMsg(killerTeammatesList[teammate], g_bottom_sync, "%l", "REMAINING_ENEMIES", victimTeammatesCount) : + ShowSyncHudMsg(killerTeammatesList[teammate], g_bottom_sync, "%l","REMAINING_ENEMY"); } } } @@ -600,7 +570,7 @@ public client_death(killer, victim, wpnindex, hitplace, TK) { switch( team ) { - case TEAM_T: + case CS_TEAM_T: { for(b=0; b<tsnum; b++) { @@ -611,7 +581,7 @@ public client_death(killer, victim, wpnindex, hitplace, TK) } } } - case TEAM_CT: + case CS_TEAM_CT: { for(b=0; b<ctsnum; b++) { @@ -653,19 +623,19 @@ public client_death(killer, victim, wpnindex, hitplace, TK) } else if (!g_LastAnnounce) { - new oposite = 0, _team = 0 + new oposite = 0, CsTeams:_team if (ctsnum == 1 && tsnum > 1) { g_LastAnnounce = cts[0] oposite = tsnum - _team = 0 + _team = CS_TEAM_T } else if (tsnum == 1 && ctsnum > 1) { g_LastAnnounce = ts[0] oposite = ctsnum - _team = 1 + _team = CS_TEAM_CT } if (g_LastAnnounce) @@ -818,7 +788,7 @@ public showStatus(id) get_user_name(pid, name, charsmax(name)) new color1 = 0, color2 = 0 - if (get_user_team(pid) == TEAM_T) + if (cs_get_user_team(pid) == CS_TEAM_T) color1 = 255 else color2 = 255 diff --git a/plugins/lang/miscstats.txt b/plugins/lang/miscstats.txt index 78bfed00..da026480 100755 --- a/plugins/lang/miscstats.txt +++ b/plugins/lang/miscstats.txt @@ -42,6 +42,8 @@ CTS = CTS TERRORIST = TERRORIST TERRORISTS = TERRORISTS REMAINING = %d %s Remaining... +REMAINING_ENEMY = One enemy remaining... +REMAINING_ENEMIES = %d enemies remaining... KILLS = kills HS = hs @@ -136,6 +138,8 @@ CTS = CTS TERRORIST = TERORISTA TERRORISTS = TERORISTA REMAINING = %d %s Preostalo... +REMAINING_ENEMY = Jedan preostali protivnika... +REMAINING_ENEMIES = %d preostalih protivnika... KILLS = ubistava HS = hs @@ -230,6 +234,8 @@ CTS = CTS TERRORIST = TERRORISTE TERRORISTS = TERRORISTES REMAINING = %d %s Restant... +REMAINING_ENEMY = Dernier ennemi restant... +REMAINING_ENEMIES = %d ennemis restants... KILLS = frags HS = hs From 7f7d01fb8d91eb57cab40108c35896221ababe3e Mon Sep 17 00:00:00 2001 From: Daniele386 <34394252+Daniele386@users.noreply.github.com> Date: Fri, 12 Oct 2018 21:04:14 +0200 Subject: [PATCH 81/98] Major Update to german translation (#620) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update miscstats.txt #618 * Update statsx.txt #618 * Update and rename mapchooser.txt to admincmd * Rename admincmd to mapchooser.txt * Update admincmd.txt * Update common.txt * Update multilingual.txt * Update multilingual.txt * Update scrollmsg.txt * Update statscfg.txt * Update adminchat.txt * Update adminhelp.txt * Update adminvote.txt * Update cmdmenu.txt * Update common.txt * Update mapchooser.txt * Update mapsmenu.txt * Update menufront.txt * Update miscstats.txt * Update multilingual.txt * Update nextmap.txt * Update pausecfg.txt * Update plmenu.txt plmenu.txt adresses only the behaviour in the "Menü", not the text in the chat! * Update restmenu.txt * Update scrollmsg.txt * Update stats_dod.txt * Update statscfg.txt * Update statsx.txt * Update telemenu.txt * Update timeleft.txt * Update admincmd.txt * Update plmenu.txt * Update adminchat.txt * Update admincmd.txt * Update mapsmenu.txt * Update miscstats.txt added changes due to PR #611 ! * Update miscstats.txt * Update pausecfg.txt * Update admincmd.txt * Update statscfg.txt --- plugins/lang/adminchat.txt | 4 +-- plugins/lang/admincmd.txt | 60 +++++++++++++++---------------- plugins/lang/adminhelp.txt | 10 +++--- plugins/lang/adminvote.txt | 32 ++++++++--------- plugins/lang/cmdmenu.txt | 6 ++-- plugins/lang/common.txt | 10 +++--- plugins/lang/mapchooser.txt | 14 ++++---- plugins/lang/mapsmenu.txt | 22 ++++++------ plugins/lang/menufront.txt | 2 +- plugins/lang/miscstats.txt | 34 +++++++++--------- plugins/lang/multilingual.txt | 14 ++++---- plugins/lang/nextmap.txt | 2 +- plugins/lang/pausecfg.txt | 20 +++++------ plugins/lang/plmenu.txt | 24 ++++++------- plugins/lang/restmenu.txt | 8 ++--- plugins/lang/scrollmsg.txt | 4 +-- plugins/lang/stats_dod.txt | 36 +++++++++---------- plugins/lang/statscfg.txt | 66 +++++++++++++++++------------------ plugins/lang/statsx.txt | 28 +++++++-------- plugins/lang/telemenu.txt | 2 +- plugins/lang/timeleft.txt | 2 +- 21 files changed, 201 insertions(+), 199 deletions(-) diff --git a/plugins/lang/adminchat.txt b/plugins/lang/adminchat.txt index dd13690d..40db65e8 100755 --- a/plugins/lang/adminchat.txt +++ b/plugins/lang/adminchat.txt @@ -12,9 +12,9 @@ COL_MAROON = maroon PRINT_ALL = (ALL) %s : %s [de] -COL_WHITE = weiss +COL_WHITE = weiß COL_RED = rot -COL_GREEN = gruen +COL_GREEN = grün COL_BLUE = blau COL_YELLOW = gelb COL_MAGENTA = magenta-rot diff --git a/plugins/lang/admincmd.txt b/plugins/lang/admincmd.txt index fa2c4186..0fa04a76 100755 --- a/plugins/lang/admincmd.txt +++ b/plugins/lang/admincmd.txt @@ -85,31 +85,31 @@ ADMIN_UNBAN_2 = ADMIN %s: entbannt %s ADMIN_ADDBAN_1 = ADMIN: bannt %s ADMIN_ADDBAN_2 = ADMIN %s: bannt %s BANNED = gebannt -REASON = grund -FOR_MIN = fuer %s Minuten -PERM = fuer immer +REASON = Grund +FOR_MIN = für %s Minuten +PERM = für immer CLIENT_BANNED = Spieler "%s" gebannt ADMIN_SLAY_1 = ADMIN: killt %s ADMIN_SLAY_2 = ADMIN %s: killt %s CLIENT_SLAYED = Spieler "%s" wurde gekillt -ADMIN_SLAP_1 = ADMIN: schlaegt %s mit %d Schaden -ADMIN_SLAP_2 = ADMIN %s: schlaegt %s mit %d Schaden +ADMIN_SLAP_1 = ADMIN: schlägt %s mit %d Schaden +ADMIN_SLAP_2 = ADMIN %s: schlägt %s mit %d Schaden CLIENT_SLAPED = Spieler "%s" wurde mit %d Schaden geschlagen -MAP_NOT_FOUND = Diese Map ist nicht vorhanden oder unzulaessig +MAP_NOT_FOUND = Diese Map ist nicht vorhanden oder unzulässig ADMIN_MAP_1 = ADMIN: wechselt zur Map %s ADMIN_MAP_2 = ADMIN %s: wechselt zur Map %s -NO_MORE_CVARS = Kann keine weiteren CVAR´s fuer rcon-Berechtigung hinzufuegen! +NO_MORE_CVARS = Kann keine weiteren CVARs für rcon-Berechtigung hinzufügen! UNKNOWN_CVAR = Unbekannte CVAR: %s UNKNOWN_XVAR = Unbekannte XVAR: %s -CVAR_NO_ACC = Du hast keine Berechtigung fuer diese CVAR! -XVAR_NO_ACC = Du hast keine Berechtigung fuer diese XVAR! +CVAR_NO_ACC = Du hast keine Berechtigung für diese CVAR! +XVAR_NO_ACC = Du hast keine Berechtigung für diese XVAR! CVAR_IS = CVAR "%s" ist "%s" XVAR_IS = XVAR "%s" ist "%s" -PROTECTED = GESCHUETZT +PROTECTED = GESCHÜTZT SET_CVAR_TO = %s setzte CVAR %s auf "%s" SET_XVAR_TO = %s setzte XVAR %s auf "%s" -CVAR_CHANGED = CVAR "%s" geaendert auf "%s" -XVAR_CHANGED = XVAR "%s" geaendert auf "%s" +CVAR_CHANGED = CVAR "%s" geändert auf "%s" +XVAR_CHANGED = XVAR "%s" geändert auf "%s" LOADED_PLUGINS = Momentan geladene Plugins NAME = Name VERSION = Version @@ -120,35 +120,35 @@ PLUGINS_RUN = %d Plugins, %d Plugins laufen LOADED_MODULES = Momentan geladene Module NUM_MODULES = %d Module FILE_NOT_FOUND = Datei "%s" nicht gefunden -ADMIN_CONF_1 = ADMIN: fuehrt Config %s aus -ADMIN_CONF_2 = ADMIN %s: fuehrt Config %s aus +ADMIN_CONF_1 = ADMIN: führt Config %s aus +ADMIN_CONF_2 = ADMIN %s: führt Config %s aus PAUSED = pausiert -UNPAUSED = Pause beendet -UNABLE_PAUSE = Server konnte das Spiel nicht anhalten. Reale Spieler werden auf dem Server benoetigt. -SERVER_PROC = Server fuehrt %s aus -PAUSING = Pausieren -UNPAUSING = Pause beendet +UNPAUSED = fortgesetzt +UNABLE_PAUSE = Server konnte das Spiel nicht anhalten. Reale Spieler werden auf dem Server benötigt. +SERVER_PROC = Server führt %s aus +PAUSING = Pausiere +UNPAUSING = setze fort PAUSE = Pause -UNPAUSE = Pause beendet +UNPAUSE = Fortsetzen COM_SENT_SERVER = Befehlszeile "%s" zur Serverconsole gesendet CLIENTS_ON_SERVER = Spieler auf dem Server -IMMU = Immunitaet +IMMU = Immunität RESERV = Reserviert ACCESS = Berechtigung TOTAL_NUM = Total %d -SKIP_MATCH = Ueberspringe "%s" (stimmt ueberein mit "%s") -SKIP_IMM = Ueberspringe "%s" (Immunitaet) +SKIP_MATCH = Überspringe "%s" (stimmt überein mit "%s") +SKIP_IMM = Überspringe "%s" (Immunität) KICK_PL = Kickt "%s" -YOU_DROPPED = Du wurdest gekickt, weil der Admin nur spezielle Spielergruppen auf dem Server zulaesst +YOU_DROPPED = Du wurdest gekickt, weil der Admin nur spezielle Spielergruppen auf dem Server zulässt KICKED_CLIENTS = Kickt %d clients ADMIN_LEAVE_1 = ADMIN: erlaubt %s %s %s %s ADMIN_LEAVE_2 = ADMIN %s: erlaubt %s %s %s %s -ADMIN_NICK_1 = ADMIN: aendert Name von %s zu "%s" -ADMIN_NICK_2 = ADMIN %s: aendert Name von %s zu "%s" -CHANGED_NICK = Name von %s zu "%s" geaendert -ADMIN_EXTEND_1 = ADMIN: Verlaengere Map fuer %d Minuten -ADMIN_EXTEND_2 = ADMIN %s: Verlaengere Map fuer %d Minuten -MAP_EXTENDED = Map "%s" wurde fuer %d Minuten verlaengert +ADMIN_NICK_1 = ADMIN: ändert Name von %s zu "%s" +ADMIN_NICK_2 = ADMIN %s: ändert Name von %s zu "%s" +CHANGED_NICK = Name von %s zu "%s" geändert +ADMIN_EXTEND_1 = ADMIN: Verlängere Map um %d Minuten +ADMIN_EXTEND_2 = ADMIN %s: Verlängere Map um %d Minuten +MAP_EXTENDED = Map "%s" wurde um %d Minuten verlängert [sr] ADMIN_KICK_1 = ADMIN: kick %s diff --git a/plugins/lang/adminhelp.txt b/plugins/lang/adminhelp.txt index c214c522..66008cab 100755 --- a/plugins/lang/adminhelp.txt +++ b/plugins/lang/adminhelp.txt @@ -12,12 +12,12 @@ NO_MATCHING_RESULTS = ^nNo matching results found^n [de] HELP_COMS = AMX Mod X Help: Befehle -HELP_ENTRIES = Eintraege %d - %d von %d -HELP_USE_MORE = Nutze '%s %d' fuer die naechste Seite +HELP_ENTRIES = Einträge %d - %d von %d +HELP_USE_MORE = Nutze '%s %d' für die nächste Seite HELP_USE_BEGIN = Nutze '%s 1' um zum Anfang zu gelangen -TYPE_HELP = Schreibe '%s' '%s' in die Konsole um die verfuegbaren Befehle zu sehen. -TIME_INFO_1 = Verbleibende Zeit: %d:%02d Minuten, naechste Map: %s -TIME_INFO_2 = Kein Zeitlimit. Naechste Map ist: %s +TYPE_HELP = Schreibe '%s' '%s' in die Konsole um die verfügbaren Befehle zu sehen. +TIME_INFO_1 = Verbleibende Zeit: %d:%02d Minuten, nächste Map: %s +TIME_INFO_2 = Kein Zeitlimit. Nächste Map ist: %s [sr] HELP_COMS = AMX Mod X Pomoc: Komande diff --git a/plugins/lang/adminvote.txt b/plugins/lang/adminvote.txt index 6cf967e1..316e14ea 100755 --- a/plugins/lang/adminvote.txt +++ b/plugins/lang/adminvote.txt @@ -36,35 +36,35 @@ ADMIN_VOTE_FOR_2 = %s %s: vote %s for %s ADMIN_CANC_VOTE_1 = %s: Abstimmung abgebrochen ADMIN_CANC_VOTE_2 = %s %s: Abstimmung abgebrochen VOTING_CANC = Auswahl abgebrochen -NO_VOTE_CANC = Zur Zeit ist keine Abstimmung vorhanden oder das Abbrechen ist mit diesem Befehl nicht moeglich +NO_VOTE_CANC = Zur Zeit ist keine Abstimmung vorhanden oder das Abbrechen ist mit diesem Befehl nicht möglich RES_REF = Resultat abgelehnt RES_ACCEPTED = Resultat angenommen VOTING_FAILED = Abstimmung gescheitert -VOTING_RES_1 = %s (Ja "%d") (Nein "%d") (benoetigt "%d") -VOTING_RES_2 = %s (erhielt "%d") (benoetigt "%d") +VOTING_RES_1 = %s (Ja "%d") (Nein "%d") (benötigt "%d") +VOTING_RES_2 = %s (erhielt "%d") (benötigt "%d") VOTING_SUCCESS = Abstimmung erfolgreich -VOTING_RES_3 = %s (erhielt "%d") (benoetigt "%d"). Ergebnis: %s +VOTING_RES_3 = %s (erhielt "%d") (benötigt "%d"). Ergebnis: %s THE_RESULT = Das Ergebnis WANT_CONTINUE = Forfahren? -VOTED_FOR = %s stimmten dafuer +VOTED_FOR = %s stimmten dafür VOTED_AGAINST = %s stimmten dagegen -VOTED_FOR_OPT = %s stimmten fuer Option #%d -ALREADY_VOTING = Abstimmung laeuft bereits... -VOTING_NOT_ALLOW = Abstimmung ist momentan nicht moeglich! -GIVEN_NOT_VALID = %s ist unzulaessig +VOTED_FOR_OPT = %s stimmten für Option #%d +ALREADY_VOTING = Abstimmung läuft bereits... +VOTING_NOT_ALLOW = Abstimmung ist momentan nicht möglich! +GIVEN_NOT_VALID = %s ist unzulässig MAP_IS = Map ist MAPS_ARE = Maps sind -CHOOSE_MAP = Waehle Map -ADMIN_VOTE_MAP_1 = %s: Abstimmung fuer Map(s) gestartet -ADMIN_VOTE_MAP_2 = %s %s: Abstimmung fuer Map(s) gestartet +CHOOSE_MAP = Wähle Map +ADMIN_VOTE_MAP_1 = %s: Abstimmung für Map(s) gestartet +ADMIN_VOTE_MAP_2 = %s %s: Abstimmung für Map(s) gestartet VOTING_STARTED = Abstimmung gestartet ... -VOTING_FORBIDDEN = Abstimmung dafuer ist verboten. +VOTING_FORBIDDEN = Abstimmung dafür ist verboten. ADMIN_VOTE_CUS_1 = %s: startet eigene Umfrage ADMIN_VOTE_CUS_2 = %s %s: startet eigene Umfrage VOTE = Abstimmung -ACTION_PERFORMED = Durchfuehrung an BOT "%s" ist nicht moeglich -ADMIN_VOTE_FOR_1 = %s: %s Stimmen fuer %s -ADMIN_VOTE_FOR_2 = %s %s: %s Stimmen fuer %s +ACTION_PERFORMED = Durchführung an BOT "%s" ist nicht möglich +ADMIN_VOTE_FOR_1 = %s: %s Stimmen für %s +ADMIN_VOTE_FOR_2 = %s %s: %s Stimmen für %s [sr] ADMIN_CANC_VOTE_1 = %s: otkazi glasanje diff --git a/plugins/lang/cmdmenu.txt b/plugins/lang/cmdmenu.txt index c9b7998c..eb3a57cb 100755 --- a/plugins/lang/cmdmenu.txt +++ b/plugins/lang/cmdmenu.txt @@ -4,9 +4,9 @@ CONF_MENU = Configs Menu SPE_MENU = Speech Menu [de] -CMD_MENU = Menu > Befehle -CONF_MENU = Menu > Konfiguration -SPE_MENU = Menu > Sprechen +CMD_MENU = Menü > Befehle +CONF_MENU = Menü > Konfiguration +SPE_MENU = Menü > Sprechen [sr] CMD_MENU = Komandne diff --git a/plugins/lang/common.txt b/plugins/lang/common.txt index 03f6c60a..2c9be6ca 100755 --- a/plugins/lang/common.txt +++ b/plugins/lang/common.txt @@ -21,7 +21,7 @@ ON = On OFF = Off [de] -BACK = Zurueck +BACK = Zurück EXIT = Beenden MORE = Mehr NONE = Keine @@ -32,13 +32,13 @@ YES = Ja NO = Nein BAN = ban KICK = kick -NO_ACC_COM = Du hast nicht genuegend Rechte, um diesen Befehl auszufuehren! +NO_ACC_COM = Du hast nicht genügend Rechte, um diesen Befehl auszuführen! USAGE = Anwendung MORE_CL_MATCHT = Es gibt mehrere Spieler, auf die deine Angaben zutreffen CL_NOT_FOUND = Spieler mit diesem Namen oder dieser UserID nicht gefunden -CLIENT_IMM = Spieler "%s" hat Immnuitaet -CANT_PERF_DEAD = Diese Aktion kann nicht am toten Spieler "%s" ausgefuehrt werden. -CANT_PERF_BOT = Diese Aktion kann nicht am Bot "%s" ausgefuehrt werden. +CLIENT_IMM = Spieler "%s" hat Immunität +CANT_PERF_DEAD = Diese Aktion kann nicht am toten Spieler "%s" ausgeführt werden. +CANT_PERF_BOT = Diese Aktion kann nicht am Bot "%s" ausgeführt werden. ON = An OFF = Aus diff --git a/plugins/lang/mapchooser.txt b/plugins/lang/mapchooser.txt index 9c66acdf..17051f39 100755 --- a/plugins/lang/mapchooser.txt +++ b/plugins/lang/mapchooser.txt @@ -8,13 +8,13 @@ EXTED_MAP = Extend map %s TIME_CHOOSE = It's time to choose the nextmap... [de] -CHO_FIN_EXT = Auswahl beendet. Laufende Map wird um %.0f Minuten verlaengert. -CHO_FIN_NEXT = Auswahl beendet. Naechste Map ist %s -CHOSE_EXT = %s waehlten Map-Verlaengerung -X_CHOSE_X = %s waehlten %s -CHOOSE_NEXTM = AMXX waehlt naechste Map -EXTED_MAP = Verlangere Map %s -TIME_CHOOSE = Es ist an der Zeit, die naechste Map zu waehlen... +CHO_FIN_EXT = Auswahl beendet. Laufende Map wird um %.0f Minuten verlängert. +CHO_FIN_NEXT = Auswahl beendet. Nächste Map ist %s +CHOSE_EXT = %s wählte Map-Verlängerung +X_CHOSE_X = %s wählte %s +CHOOSE_NEXTM = [AMXX] Wählt die nächste Map +EXTED_MAP = Verlängere Map %s +TIME_CHOOSE = Es ist an der Zeit, die nächste Map zu wählen... [sr] CHO_FIN_EXT = Biranje zavrseno. Sadasnja mapa ce biti produzena za %.0f minuta diff --git a/plugins/lang/mapsmenu.txt b/plugins/lang/mapsmenu.txt index 15fe486e..2f5616b8 100755 --- a/plugins/lang/mapsmenu.txt +++ b/plugins/lang/mapsmenu.txt @@ -30,21 +30,21 @@ VOTE_FAILED = Abstimmung gescheitert THE_WINNER = Der Gewinner WANT_CONT = Willst du fortfahren? VOT_CANC = Abstimmung abgebrochen -X_VOTED_FOR = %s stimmten fuer Option #%d -VOTEMAP_MENU = Menu > Mapwahl -START_VOT = Start Abstimmung -SEL_MAPS = Ausgewaehlte Maps -ALREADY_VOT = Es laeuft bereits eine Abstimmung... -NO_MAPS_MENU = Es sind keine Maps im Menu vorhanden -VOT_NOW_ALLOW = Abstimmung zur Zeit nicht moeglich -WHICH_MAP = Welche Map moechtest du? +X_VOTED_FOR = %s stimmten für Option #%d +VOTEMAP_MENU = Menü > Mapwahl +START_VOT = Starte Abstimmung +SEL_MAPS = Ausgewählte Maps +ALREADY_VOT = Es läuft bereits eine Abstimmung... +NO_MAPS_MENU = Es sind keine Maps im Menü vorhanden +VOT_NOW_ALLOW = Abstimmung zur Zeit nicht möglich +WHICH_MAP = Welche Map möchtest du? CHANGE_MAP_TO = Wechsle zu Map CANC_VOTE = Abstimmung abgebrochen -ADMIN_V_MAP_1 = ADMIN: waehlt Map(s) -ADMIN_V_MAP_2 = ADMIN %s: waehlt Map(s) +ADMIN_V_MAP_1 = ADMIN: wählt Map(s) +ADMIN_V_MAP_2 = ADMIN %s: wählt Map(s) ADMIN_CHANGEL_1 = ADMIN: wechselt zur Map %s ADMIN_CHANGEL_2 = ADMIN %s: wechselt zur Map %s -CHANGLE_MENU = Menu > Mapwechsel +CHANGLE_MENU = Menü > Mapwechsel [sr] RESULT_REF = Rezultat odbijen diff --git a/plugins/lang/menufront.txt b/plugins/lang/menufront.txt index db0b4c9f..c3d4ca72 100755 --- a/plugins/lang/menufront.txt +++ b/plugins/lang/menufront.txt @@ -19,7 +19,7 @@ TELE_PLAYER = Teleport Player [de] KICK_PLAYER = Kick Spieler BAN_PLAYER = Ban Spieler -SLAP_SLAY = Schlage/Toete Spieler +SLAP_SLAY = Schlage/Kille Spieler TEAM_PLAYER = Team Spieler ^n CHANGEL = Mapwechsel VOTE_MAPS = Map Abstimmung ^n diff --git a/plugins/lang/miscstats.txt b/plugins/lang/miscstats.txt index da026480..ad95cdc7 100755 --- a/plugins/lang/miscstats.txt +++ b/plugins/lang/miscstats.txt @@ -49,48 +49,50 @@ HS = hs [de] WITH = mit -KNIFE_MSG_1 = %s hat %s geschnitten und gewuerfelt -KNIFE_MSG_2 = %s hat sein Messer gezueckt und %s ausgeweidet +KNIFE_MSG_1 = %s hat %s geschnitten und gewürfelt +KNIFE_MSG_2 = %s hat sein Messer gezückt und %s ausgeweidet KNIFE_MSG_3 = %s hat sich angeschlichen und %s gemessert -KNIFE_MSG_4 = %s messerte und verstuemmelte %s -LAST_MSG_1 = Nun haengt alles von dir ab! +KNIFE_MSG_4 = %s messerte und verstümmelte %s +LAST_MSG_1 = Nun hängt alles von dir ab! LAST_MSG_2 = Hoffentlich hast du ein Medipack dabei. -LAST_MSG_3 = Deine Teamkameraden sind alle tot. Viel Glueck! +LAST_MSG_3 = Deine Teamkameraden sind alle tot. Viel Glück! LAST_MSG_4 = Nun bist du allein. Hab Spass dabei! HE_MSG_1 = %s sendet ein kleines Geschenk an %s HE_MSG_2 = %s wirft ein Knallbonbon zu %s -HE_MSG_3 = %s macht einen Praezisionswurf zu %s +HE_MSG_3 = %s macht einen Präzisionswurf zu %s HE_MSG_4 = %s schickte eine dicke Explosion an %s SHE_MSG_1 = %s sprengte sich selbst mit einer Granate -SHE_MSG_2 = %s untersuchte die Auswirkungen ^neiner Granate an sich selbst... +SHE_MSG_2 = %s untersuchte die Auswirkungen einer Granate an sich selbst... SHE_MSG_3 = %s schluckte eine Granate! SHE_MSG_4 = %s explodierte! HS_MSG_1 = $kn killte $vn mit einem ^nplazierten Schuss in den Kopf! -HS_MSG_2 = $kn entfernte den Kopf von $vn^nmit einem Praezisionsschuss. +HS_MSG_2 = $kn entfernte den Kopf von $vn^nmit einem Präzisionsschuss. HS_MSG_3 = $kn verwandelte den Kopf ^nvon $vn in Pudding. -HS_MSG_4 = $kn siegte ueber $vn durch eine Kopfschuss. +HS_MSG_4 = $kn besiegte $vn durch einen Kopfschuss. HS_MSG_5 = $vn's Kopf wurde in der Gegend verteilt HS_MSG_6 = $kn hat einen super ^nTreffer gelandet,das weiss ^n$vn nun auch. HS_MSG_7 = $vn's Kopf war ein bisschen zu lange im Fadenkreuz von $kn... DOUBLE_KILL = Wow! %s machte einen Doppelkill!!! PREPARE_FIGHT = Vorbereiten zum Kampf!^nRunde %d -KILLED_ROW = Du hast bis jetzt %d in einer Runde gekillt. -DIED_ROUNDS = Du bist bis jetzt %d Runden hintereinander gestorben... +KILLED_ROW = Du hast nun %d Gegner gekillt, ohne zu sterben! +DIED_ROUNDS = Achtung! Du bist schon %d Runden in Folge ohne Kill gestorben... KILLED_CHICKEN = Irgendjemand killte ein Huhn!!! -BLEW_RADIO = Irgendjemand sprenge das Radio!!! +BLEW_RADIO = Irgendjemand sprengte das Radio!!! REACHED_TARGET = OMG! %s erreichte das Ziel! PLANT_BOMB = %s legt die Bombe! -DEFUSING_BOMB = %s entschaerft die Bombe... +DEFUSING_BOMB = %s entschärft die Bombe... SET_UP_BOMB = %s legte die Bombe!!! -DEFUSED_BOMB = %s entschaerfte die Bombe! -FAILED_DEFU = %s konnte die Bombe nicht entschaerfen... +DEFUSED_BOMB = %s entschärfte die Bombe! +FAILED_DEFU = %s konnte die Bombe nicht entschärfen... PICKED_BOMB = %s hob die Bombe auf... DROPPED_BOMB = %s warf die Bombe weg!!! CT = CT CTS = CTs TERRORIST = TERRORIST TERRORISTS = TERRORISTEN -REMAINING = %d %s uebrig... +REMAINING = %d %s übrig... +REMAINING_ENEMY = Ein Gegner übrig... +REMAINING_ENEMIES = %d Gegner übrig... KILLS = kills HS = hs diff --git a/plugins/lang/multilingual.txt b/plugins/lang/multilingual.txt index d1ab9b36..de280578 100755 --- a/plugins/lang/multilingual.txt +++ b/plugins/lang/multilingual.txt @@ -10,15 +10,15 @@ TYPE_LANGMENU = Type 'amx_langmenu' in the console to display a menu where you c LANG_MENU_DISABLED = Language menu disabled. [de] -LANG_NOT_EXISTS = Diese Sprache exsistiert nicht. +LANG_NOT_EXISTS = Diese Sprache existiert nicht. PERSO_LANG = Eigene Sprache -LANG_MENU = Sprach Menu -SERVER_LANG = Server Sprache +LANG_MENU = Sprachmenü +SERVER_LANG = Sprache des Servers SAVE_LANG = Spracheinstellung speichern -SET_LANG_SERVER = Die Sprache des Servers wurde auf "%s" geaendert -SET_LANG_USER = Deine Sprache wurde auf "%s" geaendert -TYPE_LANGMENU = Schreibe 'amx_langmenu' in die Konsole zum Anzeigen des Sprachauswahlmenus -LANG_MENU_DISABLED = Sprachen Menü deaktiviert. +SET_LANG_SERVER = Die Sprache des Servers wurde auf "%s" geändert +SET_LANG_USER = Deine Sprache wurde auf "%s" geändert +TYPE_LANGMENU = Schreibe 'amx_langmenu' in die Konsole zum Anzeigen des Sprachmenüs +LANG_MENU_DISABLED = Sprachmenü deaktiviert. [sr] LANG_NOT_EXISTS = Jezik ne postoji diff --git a/plugins/lang/nextmap.txt b/plugins/lang/nextmap.txt index a9c2a1ff..31f5f305 100755 --- a/plugins/lang/nextmap.txt +++ b/plugins/lang/nextmap.txt @@ -4,7 +4,7 @@ PLAYED_MAP = Played map FRIEND_FIRE = Friendly fire [de] -NEXT_MAP = Naechste Map: +NEXT_MAP = Nächste Map: PLAYED_MAP = Gespielte Maps FRIEND_FIRE = Friendly fire diff --git a/plugins/lang/pausecfg.txt b/plugins/lang/pausecfg.txt index da49c978..14bcf70e 100755 --- a/plugins/lang/pausecfg.txt +++ b/plugins/lang/pausecfg.txt @@ -39,15 +39,15 @@ CANT_UNPAUSE_PLUGIN = Plugin "%s" is stopped and cannot be paused or unpaused. CLEAR_PAUSED = Clear file with paused [de] -PAUSE_COULDNT_FIND = Konnte kein Plugin finden, dass mit "%s" uebereinstimmt -PAUSE_PLUGIN_MATCH = Plugin stimmt mit "%s" ueberein -PAUSE_CONF_CLEARED = Konfigurationsdatei geloescht. Bei Bedarf Map neu starten. -PAUSE_ALR_CLEARED = Konfiguration war bereits geloescht! +PAUSE_COULDNT_FIND = Konnte kein Plugin finden, dass mit "%s" übereinstimmt +PAUSE_PLUGIN_MATCH = Plugin stimmt mit "%s" überein +PAUSE_CONF_CLEARED = Konfigurationsdatei gelöscht. Bei Bedarf Map neu starten. +PAUSE_ALR_CLEARED = Konfiguration war bereits gelöscht! PAUSE_CONF_SAVED = Konfiguration erfolgreich gespeichert. PAUSE_SAVE_FAILED = Fehler beim Speichern der Konfiguration!!! LOCKED = GESPERRT PAUSE_UNPAUSE = Pausiere/Aktiviere Plugins -CLEAR_STOPPED = Loeschen der Datei gestoppt +CLEAR_STOPPED = Löschen der Datei gestoppt SAVE_STOPPED = Speichern abgebrochen PAUSED_PLUGIN = Pausiere %d Plugin PAUSED_PLUGINS = Pausiere %d Plugins @@ -58,8 +58,8 @@ PAUSE_LOADED = Pausierte Plugins: Plugins geladen STOPPED = gestoppt VERSION = Version FILE = Datei -PAUSE_ENTRIES = Eintraege %d - %d von %d (%d laufen) -PAUSE_USE_MORE = Benutze 'amx_pausecfg list %d' fuer mehr +PAUSE_ENTRIES = Einträge %d - %d von %d (%d laufen) +PAUSE_USE_MORE = Benutze 'amx_pausecfg list %d' für mehr PAUSE_USE_BEGIN = Benutze 'amx_pausecfg list 1' um zum Anfang zu gelangen PAUSE_USAGE = Benutze: amx_pausecfg <Befehl> [Name] PAUSE_COMMANDS = Befehle @@ -69,14 +69,14 @@ COM_PAUSE_STOP = ^tstop <file> - stoppt ein Plugin COM_PAUSE_PAUSE = ^tpause <file> - pausiert ein Plugin COM_PAUSE_ENABLE = ^tenable <file> - aktiviert ein Plugin COM_PAUSE_SAVE = ^tsave - speichert die Liste der gestoppten Plugins -COM_PAUSE_CLEAR = ^tclear - loescht die Liste der gestoppten Plugins +COM_PAUSE_CLEAR = ^tclear - löscht die Liste der gestoppten Plugins COM_PAUSE_LIST = ^tlist [id] - Plugins anzeigen COM_PAUSE_ADD = ^tadd <title> - markiert ein Plugin als nicht pausierbar SAVE_PAUSED = Speichere pausierte Plugins COM_PAUSE_SAVE_PAUSED = ^tsave - speichert die Liste der pausierten Plugins COM_PAUSE_CLEAR_PAUSED = ^tclear - leert die Liste der pausierten Plugins -CANT_UNPAUSE_PLUGIN = Das Plugin "%s" ist gestoppt und kann nicht pausiert oder unpausiert werden. -CLEAR_PAUSED = Loeschen der Datei pausierten +CANT_UNPAUSE_PLUGIN = Das Plugin "%s" ist gestoppt und kann nicht pausiert oder aktiviert werden. +CLEAR_PAUSED = Löscht die Liste der pausierten Plugins [sr] PAUSE_COULDNT_FIND = Nije moguce naci plugin koji se poklapa sa "%s" diff --git a/plugins/lang/plmenu.txt b/plugins/lang/plmenu.txt index 34753087..1e7c492e 100755 --- a/plugins/lang/plmenu.txt +++ b/plugins/lang/plmenu.txt @@ -20,21 +20,21 @@ CANT_PERF_PLAYER = That action can't be performed on player "%s" [de] ADMIN_BAN_1 = ADMIN: bannt %s ADMIN_BAN_2 = ADMIN %s: bannt %s -BAN_MENU = Menu > bannen -BAN_FOR_MIN = Bann fuer %d Minuten -BAN_PERM = fuer immer bannen -SLAP_SLAY_MENU = Schlagen/Toeten-Menu -SLAP_WITH_DMG = Schlaegt mit %d Schaden -SLAY = toeten -KICK_MENU = Menu >kicken +BAN_MENU = Menü > bannen +BAN_FOR_MIN = für %d Minuten bannen +BAN_PERM = für immer bannen +SLAP_SLAY_MENU = Schlagen/Killen-Menü +SLAP_WITH_DMG = mit %d Schaden schlagen +SLAY = killen +KICK_MENU = Menü > kicken ADMIN_TRANSF_1 = ADMIN: verschiebt %s zu den %s ADMIN_TRANSF_2 = ADMIN %s: verschiebt %s zu den %s -TEAM_MENU = Menu > Team -TRANSF_TO = zu den %s geschoben +TEAM_MENU = Menü > Team +TRANSF_TO = zu den %s schieben TRANSF_SILENT = Stiller Transfer -CL_CMD_MENU = Menu > Spielerbefehle -NO_CMDS = keine Befehle verfuegbar -CANT_PERF_PLAYER = Diese Aktion kann nicht am spieler "%s" ausgefuehrt werden. +CL_CMD_MENU = Menü > Spielerbefehle +NO_CMDS = keine Befehle verfügbar +CANT_PERF_PLAYER = Diese Aktion kann nicht am Spieler "%s" ausgeführt werden. [sr] ADMIN_BAN_1 = ADMIN: ban %s diff --git a/plugins/lang/restmenu.txt b/plugins/lang/restmenu.txt index 439b7f8f..fb521524 100755 --- a/plugins/lang/restmenu.txt +++ b/plugins/lang/restmenu.txt @@ -95,7 +95,7 @@ NO_EQ_WE = Konnte diese Ausrüstung oder Waffe nicht finden WEAP_RES = Waffenverbot VALUE = Wert REST_ENTRIES_OF = Eintrag %i - %i von %i -REST_USE_MORE = Benutze 'amx_restrict list %i' für mehr Info´s +REST_USE_MORE = Benutze 'amx_restrict list %i' für mehr Infos REST_USE_BEGIN = Benutze 'amx_restrict list 1' um zum Anfang zu gelangen REST_USE_HOW = Benutze 'amx_restrict list <value>' (1 -> 8) REST_CONF_SAVED = Konfiguration gesichert (Datei "%s") @@ -117,8 +117,8 @@ REST_WEAP = Waffen verbieten SAVE_SET = Einstellungen speichern CONF_SAV_SUC = Konfiguration erfolgreich gespeichert CONF_SAV_FAIL = Speichern der Konfiguration fehlgeschlagen!!! -REG_CMD_MENU = - Zeigt Waffen-Verbots Menü -REG_CMD_REST = - Zeigt Hilfe für Waffen-Verbots Menü +REG_CMD_MENU = - Zeigt Waffen-Verbotsmenü +REG_CMD_REST = - Zeigt Hilfe für Waffen-Verbotsmenü RESTRICTED_ITEM = * Dieser Gegenstand ist verboten * MENU_TITLE_HANDGUNS = Handwaffen MENU_TITLE_SHOTGUNS = Schrotgewehre @@ -1276,4 +1276,4 @@ MENU_ITEM_NVGS = 夜视护目镜 MENU_ITEM_SHIELD = 战术盾牌 MENU_ITEM_PRIAMMO = 主武器弹药 MENU_ITEM_SECAMMO = 副武器弹药 -CONFIG_FILE_HEADER = ; 由 %s 插件生成. 请勿修改!^n; 值名称^n \ No newline at end of file +CONFIG_FILE_HEADER = ; 由 %s 插件生成. 请勿修改!^n; 值名称^n diff --git a/plugins/lang/scrollmsg.txt b/plugins/lang/scrollmsg.txt index 120615c7..d71f7a92 100755 --- a/plugins/lang/scrollmsg.txt +++ b/plugins/lang/scrollmsg.txt @@ -4,8 +4,8 @@ MSG_FREQ = Scrolling message displaying frequency: %d:%02d minutes MSG_DISABLED = Scrolling message disabled [de] -MIN_FREQ = Minimale Frequenz fuer diese Anzeige sind %d Sekunden -MSG_FREQ = Scrollnachricht Anzeigefrequenz: %d:%02d Minuten +MIN_FREQ = Die minimale Frequenz für diese Anzeige sind %d Sekunden +MSG_FREQ = Anzeigefrequenz der Scrollnachricht: %d:%02d Minuten MSG_DISABLED = Scrollnachrichten abgeschaltet [sr] diff --git a/plugins/lang/stats_dod.txt b/plugins/lang/stats_dod.txt index f002968c..33f30ffe 100755 --- a/plugins/lang/stats_dod.txt +++ b/plugins/lang/stats_dod.txt @@ -94,9 +94,9 @@ M_THEIR_RANK_IS = Their rank is M_OF = of [de] -WHOLEBODY = Koerper +WHOLEBODY = Körper HEAD = Kopf -CHEST = Oberkoerper +CHEST = Oberkörper STOMACH = Bauch LEFTARM = linker Arm RIGHTARM = rechter Arm @@ -116,31 +116,31 @@ RAMPAGE_SMALL = %s: RANDALIERER!!! UNSTOPPABLE_SMALL = %s IST NICHT ZU STOPPEN!! MONSTER_SMALL = %s IST EIN MONSTER! GODLIKE_SMALL = %s IST GODLIKE!!! -KNIFE_MSG1 = %s hat %s geschnitten und gewuerfelt -KNIFE_MSG2 = %s hat sein Messer gezueckt und %s ausgeweidet +KNIFE_MSG1 = %s hat %s geschnitten und gewürfelt +KNIFE_MSG2 = %s hat sein Messer gezückt und %s ausgeweidet KNIFE_MSG3 = %s hat sich angeschlichen und %s gemessert -KNIFE_MSG4 = %s messerte und verstuemmelte %s +KNIFE_MSG4 = %s messerte und verstümmelte %s HE_MSG1 = %s sendet ein kleines Geschenk an %s HE_MSG2 = %s wirft ein Knallbonbon zu %s -HE_MSG3 = %s macht einen Praezisionswurf zu %s +HE_MSG3 = %s macht einen Präzisionswurf zu %s HE_MSG4 = %s schickte eine dicke Explosion an %s SHE_MSG1 = %s sprengte sich selbst mit einer Granate SHE_MSG2 = %s untersuchte die Auswirkungen ^neiner Granate an sich selbst... SHE_MSG3 = %s schluckte eine Granate! SHE_MSG4 = %s explodierte! HEAD_MSG1 = $kn killte $vn mit einem ^nplazierten Schuss in den Kopf! -HEAD_MSG2 = $kn entfernte den Kopf von $vn^nmit einem Praezisionsschuss. +HEAD_MSG2 = $kn entfernte den Kopf von $vn^nmit einem Präzisionsschuss. HEAD_MSG3 = $kn verwandelte den Kopf ^nvon $vn in Pudding. -HEAD_MSG4 = $vn siegte ueber $kn durch eine Kopfschuss. +HEAD_MSG4 = $vn killte $kn durch einen Kopfschuss. HEAD_MSG5 = $vn's Kopf wurde in der Gegend verteilt HEAD_MSG6 = $kn hat einen super ^nTreffer gelandet,das weiss ^n$vn nun auch. HEAD_MSG7 = $vn's Kopf war ein bisschen zu lange im Fadenkreuz von $kn... DOUBLE_MSG1 = Wow! %s machte einen Doppelkill!!! DOUBLE_MSG2 = Unglaublich! %s macht einen dreifachen Kill !!! -DOUBLE_MSG3 = Ueberrascung! %s macht %d Kills auf einmal !!! -MORTAR_MSG1 = %s stellte den Moerser auf und schickte %s in den Himmel. -MORTAR_MSG2 = %s killte %s ueber eine lange Distanz. -KILL_INFO1 = %s killte dich mit der %s^nueber eine Entfernung von %.2f Meter.^n +DOUBLE_MSG3 = Überraschung! %s macht %d Kills auf einmal !!! +MORTAR_MSG1 = %s stellte den Mörser auf und schickte %s in den Himmel. +MORTAR_MSG2 = %s killte %s über eine lange Distanz. +KILL_INFO1 = %s killte dich mit der %s^nüber eine Entfernung von %.2f Meter.^n KILL_INFO2 = Er machte %d Schaden bei dir mit %d Treffern ^nund hat noch %dHP.^n KILL_INFO3 = Du machtest %d Schaden bei ihm mit %d Treffern.^n KILL_INFO4 = Du hast ihn getroffen in den/das:^n%s^n @@ -149,7 +149,7 @@ NO_KILLER = Du hast keinen Killer... TOPX = Top %d FFIRE_IS = Friendly fire: ATTACKERS = Angreifer: -VICTIMS = Gewinner: +VICTIMS = Opfer: DMG = Schaden HIT_S = Treffer YOU_HIT = Du trafst %s in: @@ -157,10 +157,10 @@ SERVER_STATS = Server Statistik SHOW_STATS = Statistik anzeigen SHOW_RANK = Rang anzeigen TA_MSG = %s schiesst auf einen Kameraden -TK_MSG = %s toetete einen Kameraden! -NADE_CAUGHT = Wow! %s faengt eine gegnereische Granate! -NADE_FAILEDTK = Oops.. %s killte dich bei dem Versuch, die Granate zurueckzuwerfen.. -NADE_FAILED = %s konnte feindliche Granate nicht zurück werfen. +TK_MSG = %s killte einen Kameraden! +NADE_CAUGHT = Wow! %s fängt eine gegnerische Granate! +NADE_FAILEDTK = Oops.. %s killte dich bei dem Versuch, die Granate zurückzuwerfen.. +NADE_FAILED = %s konnte feindliche Granate nicht zurückwerfen. NADE_MASTER = OMG! %s ist der Meister der Granaten !!! DISABLED_MSG = Server hat diese Option deaktiviert. MOST_KILLS = Meisten Kills @@ -179,7 +179,7 @@ M_DEATHS = Deaths: M_SCORE = Note: M_TKS = TKs: M_HITS = Treffer: -M_SHOTS = Schuesse: +M_SHOTS = Schüsse: M_HS = HS: M_WEAPON = Waffe: M_DAMAGE = Schaden: diff --git a/plugins/lang/statscfg.txt b/plugins/lang/statscfg.txt index 3cba2697..67c266cc 100755 --- a/plugins/lang/statscfg.txt +++ b/plugins/lang/statscfg.txt @@ -88,59 +88,59 @@ STATS_CONF_FAILED = Fehler beim Speichern der Statistik-Konfiguration!!! STATS_CONF_LOADED = Statistik-Konfiguration erfolgreich geladen STATS_CONF_FAIL_LOAD = Fehler beim Laden der Statistik-Konfiguration!!! STATS_CONF = Statistik-Konfiguration -STATS_ENTRIES_OF = Eintraege %i - %i von %i -STATS_USE_MORE = Benutze 'amx_statscfg list %i' fuer mehr Info´s +STATS_ENTRIES_OF = Einträge %i - %i von %i +STATS_USE_MORE = Benutze 'amx_statscfg list %i' für mehr Info´s STATS_USE_BEGIN = Benutze 'amx_statscfg list 1' um zum Anfang zu gelangen -CANT_ADD_STATS = Kann keine Statistik mehr hinzufuegen, das Limit ist erreicht! +CANT_ADD_STATS = Kann keine Statistik mehr hinzufügen, das Limit ist erreicht! COM_STATS_USAGE = Benutze: amx_statscfg <Befehl> [Parameter] ... COM_STATS_COM = Befehl: COM_STATS_ON = ^ton <variable> - gibt spezielle Option frei COM_STATS_OFF = ^toff <variable> - sperrt spezielle Option COM_STATS_SAVE = ^tsave - speichert Statistik-Konfiguration -COM_STATS_LOAD = ^tload - laedt Statistik-Konfiguration +COM_STATS_LOAD = ^tload - lädt Statistik-Konfiguration COM_STATS_LIST = ^tlist [id] - Statistik-Status anzeigen -COM_STATS_ADD = ^tadd <name> <variable> - fuegt eine Statistik zur Liste hinzu +COM_STATS_ADD = ^tadd <name> <variable> - fügt eine Statistik zur Liste hinzu NO_STATS = Statistik-Plugin ist nicht^nauf diesem Server installiert^n SAVE_CONF = Konfiguration speichern -STATS_ENABLED = Stats enabled -STATS_DISABLED = Stats disabled -ST_MULTI_KILL = MultiKill -ST_MULTI_KILL_SOUND = MultiKill Sound +STATS_ENABLED = Stats aktiviert +STATS_DISABLED = Stats deaktiviert +ST_MULTI_KILL = Multikill +ST_MULTI_KILL_SOUND = Multikill Sound ST_BOMB_PLANTING = Bombe platzieren -ST_BOMB_DEFUSING = Bombe entschaerfen +ST_BOMB_DEFUSING = Bombe entschärfen ST_BOMB_PLANTED = Bombe platziert -ST_BOMB_DEF_SUCC = Bombe entschaerfen erf. -ST_BOMB_DEF_FAIL = Bombe entschaerfen fehl. +ST_BOMB_DEF_SUCC = Bombe entschärfen erf. +ST_BOMB_DEF_FAIL = Bombe entschärfen fehl. ST_BOMB_PICKUP = Bombe aufgenommen ST_BOMB_DROP = Bombe verloren -ST_BOMB_CD_VOICE = Bomben Countdown Stimme -ST_BOMB_CD_DEF = Bomben Countdown (entschaerfer) -ST_BOMB_SITE = Bomben Platz erreicht -ST_ITALY_BONUS = Italy extra Kill +ST_BOMB_CD_VOICE = Bombencountdown Stimme +ST_BOMB_CD_DEF = Bombencountdown (Entschärfer) +ST_BOMB_SITE = Bombenplatz erreicht +ST_ITALY_BONUS = Italy Bonuskill ST_LAST_MAN = Letzter Mann -ST_KNIFE_KILL = Messer Kill -ST_KNIFE_KILL_SOUND = Messer Kill Sound -ST_HE_KILL = Granaten Kill +ST_KNIFE_KILL = Messerkill +ST_KNIFE_KILL_SOUND = Messerkill Sound +ST_HE_KILL = Granatenkill ST_HE_SUICIDE = Granaten Selbstmord -ST_HS_KILL = Headshot Kill -ST_HS_KILL_SOUND = Headshot Kill Sound -ST_ROUND_CNT = Runden Zaehler -ST_ROUND_CNT_SOUND = Runden Zaehler Sound +ST_HS_KILL = Headshotkill +ST_HS_KILL_SOUND = Headshotkill Sound +ST_ROUND_CNT = Rundenzähler +ST_ROUND_CNT_SOUND = Rundenzähler Sound ST_KILL_STR = Kill Serie ST_KILL_STR_SOUND = Kill Serie Sound ST_ENEMY_REM = Gegner verbleibend -ST_DOUBLE_KILL = Doppel Kill -ST_DOUBLE_KILL_SOUND = Doppel Kill Sound -ST_PLAYER_NAME = Spieler Name +ST_DOUBLE_KILL = Doppelkill +ST_DOUBLE_KILL_SOUND = Doppelkill Sound +ST_PLAYER_NAME = Spielername ST_FIRST_BLOOD_SOUND = Erstes Blut Sound ST_SHOW_KILLER_CHAT = Zeige Killer HP&AP ST_SHOW_ATTACKERS = Zeige Angreifer -ST_SHOW_VICTIMS = Zeige Gegner +ST_SHOW_VICTIMS = Zeige Opfer ST_SHOW_KILLER = Zeige Killer ST_SHOW_TEAM_SCORE = Zeige Team Score ST_SHOW_TOTAL_STATS = Zeige totale Stats ST_SHOW_BEST_SCORE = Zeige besten Score -ST_SHOW_MOST_DISRUPTIVE = Zeige meisten Durchschlaege +ST_SHOW_MOST_DISRUPTIVE = Zeige meisten Durchschläge ST_SHOW_HUD_STATS_DEF = Standard HUD-Stats ST_SHOW_DIST_HS_HUD = Distanz&HS in HUD Liste ST_STATS_PLAYER_MAP_END = Stats am Ende der Map @@ -156,12 +156,12 @@ ST_SAY_TOP15 = Say /top15 ST_SAY_STATS = Say /stats ST_SPEC_RANK = Spec. Rang Info ST_BOMB_PLANTED_SOUND = Bombe platziert Sound -ST_BOMB_DEF_SUCC_SOUND = Bombe entschaerfen erf. Sound -ST_BOMB_DEF_FAIL_SOUND = Bombe entschaerfen fehl. Sound -ST_BOMB_CD_HUD = Bomben Countdown Hud +ST_BOMB_DEF_SUCC_SOUND = Bombe entschärfen erf. Sound +ST_BOMB_DEF_FAIL_SOUND = Bombe entschärfen fehl. Sound +ST_BOMB_CD_HUD = Bomben Countdown HUD ST_LAST_MAN_SOUND = Letzter Mann Sound -ST_LAST_MAN_HEALTH = Last Man Health -ST_HE_KILL_SOUND = Granaten Kill Sound +ST_LAST_MAN_HEALTH = Letzter Mann HP +ST_HE_KILL_SOUND = Granatenkill Sound ST_HE_SUICIDE_SOUND = Granaten Selbstmord Sound [sr] diff --git a/plugins/lang/statsx.txt b/plugins/lang/statsx.txt index f41a28cf..e2bb53dc 100755 --- a/plugins/lang/statsx.txt +++ b/plugins/lang/statsx.txt @@ -50,9 +50,9 @@ X_RANK_IS = %s's rank is %d of %d DISABLED_MSG = Server has disabled that option [de] -WHOLEBODY = Koerper +WHOLEBODY = Körper HEAD = Kopf -CHEST = Oberkoerper +CHEST = Oberkörper STOMACH = Bauch LEFTARM = linker Arm RIGHTARM = rechter Arm @@ -63,26 +63,26 @@ ATTACKERS = Angreifer ACC = Genauigkeit HIT_S = Treffer DMG = Schaden -VICTIMS = Sieger +VICTIMS = Opfer MOST_DMG = Am meisten verursachter Schaden durch -KILLED_YOU_DIST = %s hat dich getoetet ^naus einer Entfernung von %0.2f Metern. +KILLED_YOU_DIST = %s hat dich mit einer %s ^naus %0.2f Metern Entfernung gekillt. DID_DMG_HITS = Er verursachte %d Schaden bei dir mit %d Treffern^nund hat noch %dhp und %dap. -YOU_DID_DMG = Du hast %d Schaden bei ihm angerichtet mit %d Treffern. +YOU_DID_DMG = Du hast bei ihm %d Schaden mit %d Treffern angerichtet. EFF = Effizienz BEST_SCORE = Die meisten Punkte KILL_S = Kill(s) TOTAL = Total -SHOT_S = Schuesse -HITS_YOU_IN = %s Treffer bei ihm -KILLED_BY_WITH = Getoetet von %s mit %s @ %0.0fm +SHOT_S = Schüsse +HITS_YOU_IN = %s traf dich in: +KILLED_BY_WITH = Gekillt von %s mit %s @ %0.0fm NO_HITS = keine Treffer -YOU_NO_KILLER = Du hast niemanden getoetet... +YOU_NO_KILLER = Du hast niemanden gekillt... YOU_HIT = Deine Treffer: %s %d mal, %d Schaden LAST_RES = Letztes Ergebnis: %d Treffer, %d Schaden KILLS = Kills DEATHS = Deaths HITS = Treffer -SHOTS = Schuesse +SHOTS = Schüsse YOUR = Dein PLAYERS = Spieler RANK_IS = Platzierung: %d von %d @@ -91,14 +91,14 @@ WEAPON = Waffe YOUR_RANK_IS = Deine Platzierung: %d von %d mit %d Kill(s), %d Treffer, %0.2f%% eff. und %0.2f%% acc. AMMO = Munition HEALTH = Gesundheit -ARMOR = Ruestung +ARMOR = Rüstung GAME_SCORE = Punkte STATS_ANNOUNCE = Du hast %s Statistik-Meldungen -ENABLED = eingeschaltet -DISABLED = ausgeschaltet +ENABLED = aktiviert +DISABLED = deaktiviert SERVER_STATS = Serverstatistik X_RANK_IS = %s's Platzierung: %d von %d -DISABLED_MSG = Der Server hat diese Option ausgeschaltet. +DISABLED_MSG = Der Server hat diese Option deaktiviert. [sr] WHOLEBODY = celo telo diff --git a/plugins/lang/telemenu.txt b/plugins/lang/telemenu.txt index f1aed2e4..d36b4086 100755 --- a/plugins/lang/telemenu.txt +++ b/plugins/lang/telemenu.txt @@ -8,7 +8,7 @@ SAVE_LOC = Save Location [de] ADMIN_TELEPORT_1 = ADMIN: teleportiert %s ADMIN_TELEPORT_2 = ADMIN %s: teleportiert %s -TELE_MENU = Menu > Teleport +TELE_MENU = Menü > Teleport CUR_LOC = Momentane Position SAVE_LOC = Position speichern diff --git a/plugins/lang/timeleft.txt b/plugins/lang/timeleft.txt index 4ddf524d..67ea8d98 100755 --- a/plugins/lang/timeleft.txt +++ b/plugins/lang/timeleft.txt @@ -9,7 +9,7 @@ SECONDS = seconds [de] THE_TIME = Es ist -TIME_LEFT = Zeit uebrig +TIME_LEFT = Zeit übrig NO_T_LIMIT = Kein Zeitlimit MINUTE = Minute MINUTES = Minuten From fb615aaef10277c85a624c189b36818e36ebfc1d Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sat, 13 Oct 2018 15:05:04 +0200 Subject: [PATCH 82/98] Compiler: Increase the maximum number of array dimension (#584) * Compiler: Increase the maximum number of array dimension to 4 * Compiler: Fix array initialization --- compiler/libpc300/sc.h | 2 +- compiler/libpc300/sc1.c | 85 +++++++++++++++++++---------------------- 2 files changed, 41 insertions(+), 46 deletions(-) diff --git a/compiler/libpc300/sc.h b/compiler/libpc300/sc.h index 82a7616d..46107475 100755 --- a/compiler/libpc300/sc.h +++ b/compiler/libpc300/sc.h @@ -54,7 +54,7 @@ #define CTRL_CHAR '^' /* default control character */ #define sCHARBITS 8 /* size of a packed character */ -#define sDIMEN_MAX 3 /* maximum number of array dimensions */ +#define sDIMEN_MAX 4 /* maximum number of array dimensions */ #define sLINEMAX 4095 /* input line length (in characters) */ #define sCOMP_STACK 32 /* maximum nesting of #if .. #endif sections */ #define sDEF_LITMAX 500 /* initial size of the literal pool, in "cells" */ diff --git a/compiler/libpc300/sc1.c b/compiler/libpc300/sc1.c index 8f5936c9..03d261e3 100755 --- a/compiler/libpc300/sc1.c +++ b/compiler/libpc300/sc1.c @@ -2170,53 +2170,48 @@ static cell calc_arraysize(int dim[],int numdim,int cur) return dim[cur]+(dim[cur]*calc_arraysize(dim,numdim,cur+1)); } -static cell adjust_indirectiontables(int dim[],int numdim,int cur,cell increment, - int startlit,constvalue *lastdim,int *skipdim) +static void adjust_indirectiontables(int dim[],int numdim,int startlit, + constvalue *lastdim,int *skipdim) { static int base; - int d; + int cur; + int i,d; cell accum; + cell size; - assert(cur>=0 && cur<numdim); - assert(increment>=0); - assert(cur>0 && startlit==-1 || startlit>=0 && startlit<=litidx); - if (cur==0) - base=startlit; - if (cur==numdim-1) - return 0; - /* 2 or more dimensions left, fill in an indirection vector */ - assert(dim[cur]>0); - if (dim[cur+1]>0) { - for (d=0; d<dim[cur]; d++) - litq[base++]=(dim[cur]+d*(dim[cur+1]-1)+increment) * sizeof(cell); - accum=dim[cur]*(dim[cur+1]-1); - } else { - /* final dimension is variable length */ - constvalue *ld; - assert(dim[cur+1]==0); - assert(lastdim!=NULL); - assert(skipdim!=NULL); - accum=0; - /* skip the final dimension sizes for all earlier major dimensions */ - for (d=0,ld=lastdim->next; d<*skipdim; d++,ld=ld->next) { - assert(ld!=NULL); - } /* for */ - for (d=0; d<dim[cur]; d++) { - assert(ld!=NULL); - assert(strtol(ld->name,NULL,16)==d); - litq[base++]=(dim[cur]+accum+increment) * sizeof(cell); - accum+=ld->value-1; - *skipdim+=1; - ld=ld->next; - } /* for */ - } /* if */ - /* create the indirection tables for the lower level */ - if (cur+2<numdim) { /* are there at least 2 dimensions below this one? */ - increment+=(dim[cur]-1)*dim[cur+1]; /* this many indirection tables follow */ - for (d=0; d<dim[cur]; d++) - increment+=adjust_indirectiontables(dim,numdim,cur+1,increment,-1,lastdim,skipdim); - } /* if */ - return accum; + assert(startlit==-1 || startlit>=0 && startlit<=litidx); + base=startlit; + size=1; + for (cur=0; cur<numdim-1; cur++) { + /* 2 or more dimensions left, fill in an indirection vector */ + if (dim[cur+1]>0) { + for (i=0; i<size; i++) + for (d=0; d<dim[cur]; d++) + litq[base++]=(size*dim[cur]+(dim[cur+1]-1)*(dim[cur]*i+d)) * sizeof(cell); + } else { + /* final dimension is variable length */ + constvalue *ld; + assert(dim[cur+1]==0); + assert(lastdim!=NULL); + assert(skipdim!=NULL); + accum=0; + for (i=0; i<size; i++) { + /* skip the final dimension sizes for all earlier major dimensions */ + for (d=0,ld=lastdim->next; d<*skipdim; d++,ld=ld->next) { + assert(ld!=NULL); + } /* for */ + for (d=0; d<dim[cur]; d++) { + assert(ld!=NULL); + assert(strtol(ld->name,NULL,16)==d); + litq[base++]=(size*dim[cur]+accum) * sizeof(cell); + accum+=ld->value-1; + *skipdim+=1; + ld=ld->next; + } /* for */ + } /* for */ + } /* if */ + size*=dim[cur]; + } /* for */ } /* initials @@ -2274,7 +2269,7 @@ static void initials2(int ident,int tag,cell *size,int dim[],int numdim, for (tablesize=calc_arraysize(dim,numdim-1,0); tablesize>0; tablesize--) litadd(0); if (dim[numdim-1]!=0) /* error 9 has already been given */ - adjust_indirectiontables(dim,numdim,0,0,curlit,NULL,NULL); + adjust_indirectiontables(dim,numdim,curlit,NULL,NULL); } /* if */ return; } /* if */ @@ -2340,7 +2335,7 @@ static void initials2(int ident,int tag,cell *size,int dim[],int numdim, * of the array and we can properly adjust the indirection vectors */ if (err==0) - adjust_indirectiontables(dim,numdim,0,0,curlit,&lastdim,&skipdim); + adjust_indirectiontables(dim,numdim,curlit,&lastdim,&skipdim); delete_consttable(&lastdim); /* clear list of minor dimension sizes */ } /* if */ } /* if */ From 75cf5f55f9b06e778fc9a87c0bbc84d00be7b805 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Sun, 14 Oct 2018 17:44:15 +0200 Subject: [PATCH 83/98] Make UTF-8 safe others strings natives (#610) --- amxmodx/string.cpp | 85 +++++++++++++++++++++++++++++++--------------- 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/amxmodx/string.cpp b/amxmodx/string.cpp index 2ff80fc7..ebed1ab9 100755 --- a/amxmodx/string.cpp +++ b/amxmodx/string.cpp @@ -1,4 +1,4 @@ -// vim: set ts=4 sw=4 tw=99 noet: +// vim: set ts=4 sw=4 tw=99 noet: // // AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). // Copyright (C) The AMX Mod X Development Team. @@ -210,6 +210,16 @@ void copy_amxmemory(cell* dest, cell* src, int len) *dest++=*src++; } +bool utf8isspace(const char* string) +{ + return utf8iscategory(string, 1, UTF8_CATEGORY_ISSPACE) != 0; +} + +size_t utf8getspaces(const char* string) +{ + return utf8iscategory(string, SIZE_MAX, UTF8_CATEGORY_ISSPACE); +} + char* parse_arg(char** line, int& state) { static char arg[3072]; @@ -218,7 +228,7 @@ char* parse_arg(char** line, int& state) while (**line) { - if (isspace(**line)) + if (utf8isspace(*line)) { if (state == 1) break; @@ -919,6 +929,7 @@ static cell AMX_NATIVE_CALL amx_strtok(AMX *amx, cell *params) int right_pos = 0; unsigned int i = 0; bool done_flag = false; + size_t spaces; int len = 0; //string[] @@ -938,9 +949,9 @@ static cell AMX_NATIVE_CALL amx_strtok(AMX *amx, cell *params) { if (trim && !done_flag) { - if (isspace(string[i])) + if ((spaces = utf8getspaces(string + i) > 0)) { - while (isspace(string[++i])); + i += spaces; done_flag = true; } } @@ -974,6 +985,7 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params) { int left_pos = 0, right_pos = 0, len, pos = -1; unsigned int i = 0; + size_t spaces; char *string = get_amxstring(amx, params[1], 0, len); char *left = new char[len + 1], *right = new char[len + 1]; @@ -989,9 +1001,9 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params) int trim = params[7]; // ltrim left - if (trim & 1 && isspace(string[i])) + if (trim & 1 && (spaces = utf8getspaces(string)) > 0) { - while (isspace(string[++i])); + i += spaces; } for (; i < (unsigned int) len; ++i) @@ -1007,17 +1019,17 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params) } // rtrim left - if (trim & 2 && left_pos && isspace(left[left_pos - 1])) + if (trim & 2 && left_pos && utf8isspace(&left[left_pos - 1])) { - while (--left_pos >= 0 && isspace(left[left_pos])); + while (--left_pos >= 0 && utf8isspace(&left[left_pos])); ++left_pos; } // ltrim right - if (trim & 4 && isspace(string[i])) + if (trim & 4 && (spaces = utf8getspaces(string + i)) > 0) { - while (isspace(string[++i])); + i += spaces; } for (; i < (unsigned int) len; ++i) @@ -1026,9 +1038,9 @@ static cell AMX_NATIVE_CALL amx_strtok2(AMX *amx, cell *params) } // rtrim right - if (trim & 8 && right_pos && isspace(right[right_pos - 1])) + if (trim & 8 && right_pos && utf8isspace(&right[right_pos - 1])) { - while (--right_pos >= 0 && isspace(right[right_pos])); + while (--right_pos >= 0 && utf8isspace(&right[right_pos])); ++right_pos; } @@ -1058,8 +1070,12 @@ static cell AMX_NATIVE_CALL argparse(AMX *amx, cell *params) // Strip all left-hand whitespace. size_t i = start_pos; - while (i < input_len && isspace(input[i])) - i++; + size_t spaces; + + if ((spaces = utf8getspaces(input + i)) > 0) + { + i += spaces; + } if (i >= input_len) { *buffer = '\0'; @@ -1078,7 +1094,7 @@ static cell AMX_NATIVE_CALL argparse(AMX *amx, cell *params) } // If not in quotes, and we see a space, stop. - if (isspace(input[i]) && !in_quote) + if (utf8isspace(input + i) && !in_quote) break; if (size_t(bufpos - buffer) < buflen) @@ -1106,9 +1122,13 @@ static cell AMX_NATIVE_CALL strbreak(AMX *amx, cell *params) /* 5 param */ int RightMax = params[5]; size_t len = (size_t)_len; + size_t spaces; + + if ((spaces = utf8getspaces(string)) > 0) + { + i += spaces; + } - while (isspace(string[i]) && i<len) - i++; beg = i; for (; i<len; i++) { @@ -1120,12 +1140,12 @@ static cell AMX_NATIVE_CALL strbreak(AMX *amx, cell *params) /* 5 param */ if (i == len-1) goto do_copy; } else { - if (isspace(string[i]) && !in_quote) + if (!in_quote && (spaces = utf8getspaces(string + i)) > 0) { do_copy: size_t pos = i; - while (isspace(string[i])) - i++; + i += spaces; + const char *start = had_quotes ? &(string[beg+1]) : &(string[beg]); size_t _end = had_quotes ? (i==len-1 ? 1 : 2) : 0; size_t end = (pos - _end > (size_t)LeftMax) ? (size_t)LeftMax : pos - _end; @@ -1367,18 +1387,27 @@ static cell AMX_NATIVE_CALL amx_strlen(AMX *amx, cell *params) static cell AMX_NATIVE_CALL amx_trim(AMX *amx, cell *params) { - int len, newlen; - char *str = get_amxstring(amx, params[1], 0, len); + int length; + auto string = get_amxstring(amx, params[1], 0, length); - UTIL_TrimLeft(str); - UTIL_TrimRight(str); + auto leftSpaces = utf8getspaces(string); + auto rightSpaces = 0u; - newlen = strlen(str); - len -= newlen; + auto originalLength = length; - set_amxstring(amx, params[1], str, newlen); + if (leftSpaces < size_t(length)) + { + while (--length >= 0 && utf8isspace(string + length)) + { + ++rightSpaces; + } + } - return len; + auto totalSpaces = leftSpaces + rightSpaces; + + set_amxstring(amx, params[1], string + leftSpaces, originalLength - totalSpaces); + + return totalSpaces; } static cell AMX_NATIVE_CALL n_strcat(AMX *amx, cell *params) From 77eb33d5f244effebacfcf43909bd16078214fa3 Mon Sep 17 00:00:00 2001 From: Vitaly Karpenko <vitaly.karpenko99@gmail.com> Date: Sun, 14 Oct 2018 18:44:59 +0300 Subject: [PATCH 84/98] Compiler: Fix undefined symbol: pow10 (#615) * Compiler: Fix undefined symbol: pow10 * Add version check * Remove deprecated pow10 --- compiler/libpc300/sc2.c | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/compiler/libpc300/sc2.c b/compiler/libpc300/sc2.c index 09ce6621..5d7b6a84 100755 --- a/compiler/libpc300/sc2.c +++ b/compiler/libpc300/sc2.c @@ -600,13 +600,6 @@ static int htoi(cell *val,const unsigned char *curptr) return (int)(ptr-curptr); } -#if defined __APPLE__ -static double pow10(double d) -{ - return pow(10, d); -} -#endif - /* ftoi * * Attempts to interpret a numeric symbol as a rational number, either as @@ -682,11 +675,7 @@ static int ftoi(cell *val,const unsigned char *curptr) exp=(exp*10)+(*ptr-'0'); ptr++; } /* while */ - #if defined __GNUC__ - fmult=pow10(exp*sign); - #else - fmult=pow(10,exp*sign); - #endif + fmult=pow(10,exp*sign); fnum *= fmult; dnum *= (unsigned long)(fmult+0.5); } /* if */ From 20d917a307de86e4f9d01e8bac71ca63f48b2ef7 Mon Sep 17 00:00:00 2001 From: Artem Golubikhin <WPMGPRoSToTeMa@users.noreply.github.com> Date: Fri, 2 Nov 2018 16:15:31 +0300 Subject: [PATCH 85/98] Port bugfix for incorrect heap deallocation on conditional operator (#627) * Revert 4f8917ec (experimental bugfix for heap in conditional) * Port bugfix for incorrect heap deallocation on conditional operator (ported from compuphase upstream) * Fix the upstream bugfix Fixed the wrong order of heaplist nodes and the incorrect calculation of the max. heap usage. * Add an additional pass for functions that return array if they are used before definition (inside definition (recursion) is a "before definition" situation too) --- compiler/libpc300/sc.h | 9 ++++++ compiler/libpc300/sc1.c | 12 ++++++++ compiler/libpc300/sc3.c | 59 ++++++++++++++++++++++++++++---------- compiler/libpc300/sclist.c | 46 +++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 15 deletions(-) mode change 100755 => 100644 compiler/libpc300/sc3.c diff --git a/compiler/libpc300/sc.h b/compiler/libpc300/sc.h index 46107475..fd3d269a 100755 --- a/compiler/libpc300/sc.h +++ b/compiler/libpc300/sc.h @@ -280,6 +280,12 @@ typedef struct s_stringpair { char *documentation; } stringpair; +typedef struct s_valuepair { + struct s_valuepair *next; + long first; + long second; +} valuepair; + /* macros for code generation */ #define opcodes(n) ((n)*sizeof(cell)) /* opcode size */ #define opargs(n) ((n)*sizeof(cell)) /* size of typical argument */ @@ -700,6 +706,9 @@ SC_FUNC void delete_docstringtable(void); SC_FUNC stringlist *insert_autolist(char *string); SC_FUNC char *get_autolist(int index); SC_FUNC void delete_autolisttable(void); +SC_FUNC valuepair *push_heaplist(long first, long second); +SC_FUNC int popfront_heaplist(long *first, long *second); +SC_FUNC void delete_heaplisttable(void); SC_FUNC stringlist *insert_dbgfile(const char *filename); SC_FUNC stringlist *insert_dbgline(int linenr); SC_FUNC stringlist *insert_dbgsymbol(symbol *sym); diff --git a/compiler/libpc300/sc1.c b/compiler/libpc300/sc1.c index 03d261e3..66af30d4 100755 --- a/compiler/libpc300/sc1.c +++ b/compiler/libpc300/sc1.c @@ -628,6 +628,7 @@ int pc_compile(int argc, char *argv[]) /* reset "defined" flag of all functions and global variables */ reduce_referrers(&glbtab); delete_symbols(&glbtab,0,TRUE,FALSE); + delete_heaplisttable(); #if !defined NO_DEFINE delete_substtable(); inst_datetime_defines(); @@ -805,6 +806,7 @@ cleanup: free(sc_documentation); #endif delete_autolisttable(); + delete_heaplisttable(); if (errnum!=0) { if (strlen(errfname)==0) pc_printf("\n%d Error%s.\n",errnum,(errnum>1) ? "s" : ""); @@ -5450,6 +5452,16 @@ static void doreturn(void) /* nothing */; sub=addvariable(curfunc->name,(argcount+3)*sizeof(cell),iREFARRAY,sGLOBAL,curfunc->tag,dim,numdim,idxtag); sub->parent=curfunc; + /* Function that returns array can be used before it is defined, so at + * the call point (if it is before definition) we may not know if this + * function returns array and what is its size (for example inside the + * conditional operator), so we don't know how many cells on the heap + * we need. Calculating heap consumption is required for the fix of + * incorrect heap deallocation on conditional operator. That's why we + * need an additional pass. + */ + if ((curfunc->usage & uREAD)!=0) + sc_reparse=TRUE; } /* if */ /* get the hidden parameter, copy the array (the array is on the heap; * it stays on the heap for the moment, and it is removed -usually- at diff --git a/compiler/libpc300/sc3.c b/compiler/libpc300/sc3.c old mode 100755 new mode 100644 index da6f8ed9..f54bdb85 --- a/compiler/libpc300/sc3.c +++ b/compiler/libpc300/sc3.c @@ -1010,38 +1010,60 @@ static int hier13(value *lval) { int lvalue=plnge1(hier12,lval); if (matchtoken('?')) { + int locheap=decl_heap; /* save current heap delta */ + long heap1,heap2; /* max. heap delta either branch */ + valuepair *heaplist_node; int flab1=getlabel(); int flab2=getlabel(); value lval2 = {0}; int array1,array2; - int orig_heap=decl_heap; - int diff1=0,diff2=0; if (lvalue) { rvalue(lval); } else if (lval->ident==iCONSTEXPR) { ldconst(lval->constval,sPRI); error(lval->constval ? 206 : 205); /* redundant test */ } /* if */ + if (sc_status==statFIRST) { + /* We should push a new node right now otherwise we will pop it in the + * wrong order on the write stage. + */ + heaplist_node=push_heaplist(0,0); /* save the pointer to write the actual data later */ + } else if (sc_status==statWRITE || sc_status==statSKIP) { + #if !defined NDEBUG + int result= + #endif + popfront_heaplist(&heap1,&heap2); + assert(result); /* pop off equally many items than were pushed */ + } /* if */ jmp_eq0(flab1); /* go to second expression if primary register==0 */ PUSHSTK_I(sc_allowtags); sc_allowtags=FALSE; /* do not allow tagnames here (colon is a special token) */ + if (sc_status==statWRITE) { + modheap(heap1*sizeof(cell)); + decl_heap+=heap1; /* equilibrate the heap (see comment below) */ + } /* if */ if (hier13(lval)) rvalue(lval); if (lval->ident==iCONSTEXPR) /* load constant here */ ldconst(lval->constval,sPRI); sc_allowtags=(short)POPSTK_I(); /* restore */ + heap1=decl_heap-locheap; /* save heap space used in "true" branch */ + assert(heap1>=0); + decl_heap=locheap; /* restore heap delta */ jumplabel(flab2); setlabel(flab1); - if (orig_heap!=decl_heap) { - diff1=abs(decl_heap-orig_heap); - decl_heap=orig_heap; - } needtoken(':'); + if (sc_status==statWRITE) { + modheap(heap2*sizeof(cell)); + decl_heap+=heap2; /* equilibrate the heap (see comment below) */ + } /* if */ if (hier13(&lval2)) rvalue(&lval2); if (lval2.ident==iCONSTEXPR) /* load constant here */ ldconst(lval2.constval,sPRI); + heap2=decl_heap-locheap; /* save heap space used in "false" branch */ + assert(heap2>=0); array1= (lval->ident==iARRAY || lval->ident==iREFARRAY); array2= (lval2.ident==iARRAY || lval2.ident==iREFARRAY); if (array1 && !array2) { @@ -1055,19 +1077,26 @@ static int hier13(value *lval) if (!matchtag(lval->tag,lval2.tag,FALSE)) error(213); /* tagname mismatch ('true' and 'false' expressions) */ setlabel(flab2); + if (sc_status==statFIRST) { + /* Calculate the max. heap space used by either branch and save values of + * max - heap1 and max - heap2. On the second pass, we use these values + * to equilibrate the heap space used by either branch. This is needed + * because we don't know (at compile time) which branch will be taken, + * but the heap cannot be restored inside each branch because the result + * on the heap may needed by the remaining expression. + */ + int max=(heap1>heap2) ? heap1 : heap2; + heaplist_node->first=max-heap1; + heaplist_node->second=max-heap2; + decl_heap=locheap+max; /* otherwise it will contain locheap+heap2 and the + * max. heap usage will be wrong for the upper + * expression */ + } /* if */ + assert(sc_status!=statWRITE || heap1==heap2); if (lval->ident==iARRAY) lval->ident=iREFARRAY; /* iARRAY becomes iREFARRAY */ else if (lval->ident!=iREFARRAY) lval->ident=iEXPRESSION; /* iREFARRAY stays iREFARRAY, rest becomes iEXPRESSION */ - if (orig_heap!=decl_heap) { - diff2=abs(decl_heap-orig_heap); - decl_heap=orig_heap; - } - if (diff1==diff2) { - decl_heap+=(diff1/2); - } else { - decl_heap+=(diff1+diff2); - } return FALSE; /* conditional expression is no lvalue */ } else { return lvalue; diff --git a/compiler/libpc300/sclist.c b/compiler/libpc300/sclist.c index 7d60226c..e4d36060 100755 --- a/compiler/libpc300/sclist.c +++ b/compiler/libpc300/sclist.c @@ -443,6 +443,52 @@ SC_FUNC void delete_autolisttable(void) } +/* ----- value pair list ----------------------------------------- */ +static valuepair heaplist = {NULL, 0, 0}; + +SC_FUNC valuepair *push_heaplist(long first, long second) +{ + valuepair *cur, *last; + if ((cur=malloc(sizeof(valuepair)))==NULL) + error(103); /* insufficient memory (fatal error) */ + + cur->first=first; + cur->second=second; + cur->next=NULL; + + for (last=&heaplist; last->next!=NULL; last=last->next) + /* nothing */; + last->next=cur; + return cur; +} + +SC_FUNC int popfront_heaplist(long *first, long *second) +{ + valuepair *front=heaplist.next; + if (front==NULL) + return 0; + + /* copy fields */ + *first=front->first; + *second=front->second; + + /* unlink and free */ + heaplist.next=front->next; + free(front); + return 1; +} + +SC_FUNC void delete_heaplisttable(void) +{ + valuepair *cur; + while (heaplist.next!=NULL) { + cur=heaplist.next; + heaplist.next=cur->next; + free(cur); + } /* while */ +} + + /* ----- debug information --------------------------------------- */ static stringlist dbgstrings = {NULL, NULL}; From bb84a43a7bab3fb7b8effdc9f4f61d093c8592ca Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 2 Nov 2018 14:16:36 +0100 Subject: [PATCH 86/98] Fix a navigation bug in Plugin Cvars menu (#637) --- plugins/pluginmenu.sma | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/plugins/pluginmenu.sma b/plugins/pluginmenu.sma index 0bf1ec78..80f43fc3 100644 --- a/plugins/pluginmenu.sma +++ b/plugins/pluginmenu.sma @@ -468,7 +468,7 @@ public CvarMenuSelection(id, menu, item) if (ExplicitPlugin[id]==-1) { - DisplayPluginMenuDefault(id); + DisplayPluginMenu(id,"Plugin Cvar Menu:", "PluginMenuSelection","DisplayCvarMenu","GetNumberOfCvarsForPlid"); } } else if (item==MENU_BACK) @@ -790,7 +790,7 @@ public CommandMenuSelection(id, menu, item) if (ExplicitPlugin[id]==-1) { - client_cmd(id,"amx_plugincmdmenu"); + DisplayPluginMenu(id,"Plugin Command Menu:", "PluginMenuSelection","DisplayCmdMenu","GetNumberOfCmdsForPlid"); } } else if (item==MENU_BACK) @@ -914,7 +914,7 @@ public CommandMenuCommand(id, level, cid) { // We need to display a list of the plugins, instead of a specific plugin. ExplicitPlugin[id]=-1; - DisplayPluginMenuDefault(id); + DisplayPluginMenu(id,"Plugin Command Menu:", "PluginMenuSelection","DisplayCmdMenu","GetNumberOfCmdsForPlid"); } else { @@ -925,8 +925,3 @@ public CommandMenuCommand(id, level, cid) } return PLUGIN_HANDLED; } - -DisplayPluginMenuDefault(id) -{ - DisplayPluginMenu(id,"Plugin Command Menu:", "PluginMenuSelection","DisplayCmdMenu","GetNumberOfCmdsForPlid"); -} From 7c7ad3d3c0b269f448f73337f996e838d2d510c8 Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Fri, 2 Nov 2018 14:16:57 +0100 Subject: [PATCH 87/98] Fix again a menu regression (behavior change) due to typos in #471 (#636) --- amxmodx/amxmodx.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 1bc7c532..b041c5c9 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -1272,7 +1272,6 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ // Fire newmenu callback so closing it can be handled by the plugin if (!CloseNewMenus(pPlayer)) { - LogError(amx, AMX_ERR_NATIVE, "Plugin called menu_display when item=MENU_EXIT"); return 2; } @@ -1318,7 +1317,7 @@ static cell AMX_NATIVE_CALL show_menu(AMX *amx, cell *params) /* 3 param */ return 0; } - if (closeMenu(index)) + if (closeMenu(index) == 2) { return 0; } From af56d964c16fa2bf02f62e5e6c0198694130c87c Mon Sep 17 00:00:00 2001 From: Vincent Herbet <github@arkshine.me> Date: Tue, 18 Dec 2018 10:16:33 +0100 Subject: [PATCH 88/98] Bump ReHLDS version to 3.5 (#647) --- public/resdk/engine/rehlds_api.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/resdk/engine/rehlds_api.h b/public/resdk/engine/rehlds_api.h index 63348948..4f4e63df 100644 --- a/public/resdk/engine/rehlds_api.h +++ b/public/resdk/engine/rehlds_api.h @@ -45,7 +45,7 @@ #include "../common/hookchains.h" #define REHLDS_API_VERSION_MAJOR 3 -#define REHLDS_API_VERSION_MINOR 4 +#define REHLDS_API_VERSION_MINOR 5 //Steam_NotifyClientConnect hook typedef IHookChain<qboolean, IGameClient*, const void*, unsigned int> IRehldsHook_Steam_NotifyClientConnect; @@ -203,6 +203,10 @@ typedef IHookChainRegistry<bool, edict_t *, IGameClient *, int, const char*, flo typedef IHookChain<edict_t *, const char *> IRehldsHook_CreateFakeClient; typedef IHookChainRegistry<edict_t *, const char *> IRehldsHookRegistry_CreateFakeClient; +//SV_CheckConnectionLessRateLimits +typedef IHookChain<bool, netadr_t &, const uint8_t *, int> IRehldsHook_SV_CheckConnectionLessRateLimits; +typedef IHookChainRegistry<bool, netadr_t &, const uint8_t *, int> IRehldsHookRegistry_SV_CheckConnectionLessRateLimits; + class IRehldsHookchains { public: virtual ~IRehldsHookchains() { } @@ -246,6 +250,7 @@ public: virtual IRehldsHookRegistry_SV_CreatePacketEntities* SV_CreatePacketEntities() = 0; virtual IRehldsHookRegistry_SV_EmitSound2* SV_EmitSound2() = 0; virtual IRehldsHookRegistry_CreateFakeClient* CreateFakeClient() = 0; + virtual IRehldsHookRegistry_SV_CheckConnectionLessRateLimits* SV_CheckConnectionLessRateLimits() = 0; }; struct RehldsFuncs_t { From 9417ec188de4c3ccb4c59dad9aa83801cb9bf979 Mon Sep 17 00:00:00 2001 From: Adam Richard <39578558+AdamRichard21st@users.noreply.github.com> Date: Thu, 24 Jan 2019 18:09:15 -0200 Subject: [PATCH 89/98] Fix typo in json_parse documentation (#663) Just a small fix on json_parse return description. I'm sure it was supposed to be `Invalid_JSON` instead of `Invalid_JSONValue`. Thank you, guys, that's one of my favorites features. --- plugins/include/json.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/json.inc b/plugins/include/json.inc index b26c7b26..61f608db 100644 --- a/plugins/include/json.inc +++ b/plugins/include/json.inc @@ -64,7 +64,7 @@ enum JSON * @param is_file True to treat string param as filename, false otherwise * @param with_comments True if parsing JSON includes comments (it will ignore them), false otherwise * - * @return JSON handle, Invalid_JSONValue if error occurred + * @return JSON handle, Invalid_JSON if error occurred */ native JSON:json_parse(const string[], bool:is_file = false, bool:with_comments = false); From f365c943b722d4c28c608f238cdde26c07f7fc9b Mon Sep 17 00:00:00 2001 From: regener <dtomi24@hotmail.com> Date: Thu, 24 Jan 2019 21:12:32 +0100 Subject: [PATCH 90/98] Updated Hungarian translation in miscstats.txt with latest additions (#661) --- plugins/lang/miscstats.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/lang/miscstats.txt b/plugins/lang/miscstats.txt index ad95cdc7..dd5df5f5 100755 --- a/plugins/lang/miscstats.txt +++ b/plugins/lang/miscstats.txt @@ -755,6 +755,8 @@ CTS = CT TERRORIST = TERRORIST TERRORISTS = TERRORIST REMAINING = %d %s van még hátra... +REMAINING_ENEMY = Egy ellenfél maradt... +REMAINING_ENEMIES = %d ellenfél maradt... KILLS = ölés HS = fej From ba083deb1edd5cc687e84dfb21686af2784e49dd Mon Sep 17 00:00:00 2001 From: voed <iwmyc@ex.ua> Date: Thu, 24 Jan 2019 22:13:48 +0200 Subject: [PATCH 91/98] Removed garbage generated by VS (#658) --- .../ipch/WINCSX-7d4a1d4a/WINCSX-e0702fa2.ipch | Bin 19333120 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 amxmodx/msvc12/ipch/WINCSX-7d4a1d4a/WINCSX-e0702fa2.ipch diff --git a/amxmodx/msvc12/ipch/WINCSX-7d4a1d4a/WINCSX-e0702fa2.ipch b/amxmodx/msvc12/ipch/WINCSX-7d4a1d4a/WINCSX-e0702fa2.ipch deleted file mode 100644 index 6d0b20bb5e6e84b8d723540692fc2c29c93f6319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19333120 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 $yPc8c%k-(psz8J2S-mj9 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 ^ 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�+HqvFof$H#$W%tj6d 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%0D1DTVia?)|LXYtABfRlgw6XLD9C!w;0=<^H3#ye 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≺m#(=<Ji-8 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�UVrV$d=s6d+(SvZkCQU?Nx6@cUIr>j#+&x` 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 w{!O2mRn6`X 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%0AD+rg>zTjzLr>+JbuX3HrDncKzD?JV(6z`FcT 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ʼ`> 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 evZD82y@{0 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%0An&#FC+@oB>U+$#9TQ#OZG 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≦a`b>fRptgpK7RVzYZ* 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%0AGiJ^i>|T{>obSBrP}i2ldO`lPX*%0A#a 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%0DUx`HV1Wb5tDqPZz0?C{N^F161s*? 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�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ⅈGdOU>U}Sl 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%0A2UDG#d&M-a7LctY<c!R?i#p$>A;fi@<k?GCR}%w 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%0AF&IM(x|N?8a@&121{KC%cZ{5PkbH`X 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�i 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%0D2OVNIUd1YYxT|Bd8 zj9m(*r}Bfip8La}$B_hwdwbvx7TZSJL!os_i|gWaHlA`AjOnw2ZBdyxe=zLBcYHGK ztwv01T8ed)(P*{#UmCvL`pH60z7{Rpp7EsIr?E6z_0nvbt7*~5+N=LX<D<Gi{TrIE zxGmHNRlkkTu<ptHUUu%AtBl$4;y9(Q#*O4T@5uU){5~(%A<H~lN@pD)+HvJOMsUBq z3@VrI;dso)@)$<dT~_^*mC!L}I7AJu1p5{mm#bbA?b;XkJ91mx3=Uswyfx+Yp4fJm z=u3-d*FnnLaY3xKC+ajYt!>!W+!Z1Qk?lOAP~q>nd#h3>{Rzk7^|i)o+k4X^q1PnV zFd~Q>KZuTt;QxPJc5YfDj5$)B9EapS9P!tCBlF{?zPs>9WwLa-<M?}NX9Kpc>hbhU zp81w&bKWN}hw9v2!njTU<l}48VSG+#xPK<(Zqr`7_Q3ZIx;BXK!4*$5g8vqAFR)`! z*XzCep>jX<DWt#RZEe3%dn=9ES@mn6{T1q;5WntKx=y;c`T6j@r9Ce1&Dhry9r{~3 z|4Z-m!ts_|C;D5%XS;<pLO5+7%nP<R-H!ciX$Kv@Oit3kzBu|FK1Wx4PH}6lraGp7 zh;b2y`FEVllsq<Cssk&hs$-ERP0Q8vZinSTb>o(OP&}CKzZ!ocBwa>xU_{eX!P`RB zWnw(5d1|Ppe1su;wf}^DUEUS@A-9Epj{?zqoV;9u0UhDbeeu^U7W653`siagk*zLE zpZ5xKdIRs{I4)Z$w5xg1v+<k5Qaa0C@qR$f-*8)Kn^V(A@|@Mk$DjHUqon#pf<<U5 z3+oh&?CXv|XD)pvG+L!+p!_|@M%xGlQ;Qe1JHL$6q%%kHzBUvN>a)&S2suyCysGU4 ze5Yl35Zi$HY8r3!eZSd3Fbn?ID%B(HpK==~e5lNAV|Zh*UF*<q10T>H8_SRCDZ4PO zV-BCs7p=nUUHyyv-cF69^=$iOkubi7c=7J4>GNELE@cm$uc+40zkh0eU==t^Xe=ms zKKx#G4AEZS@*i;yT3f75qcv92UZ2ze#(~<gi_o!U`>&$i<|N`ZajjYnPB%T9_$0r( zRaClBnLifSITqUm+xA!06AsgPCzzG%CP2xzLm}s@*`WIa$9C)a+Wsi7gy!Z11C^G4 zQF}nol{d@Jjyhxi*U4~Z<bDRp)_P^$M(>-g(;}be-o8CYaNQm9z214Ci(6Au^8w}A zT(wrI6C6^O+`mS%57ETTr1_f1Cyz%q4;@=(Hr}tgB_gh&3+IqM*YLRk(S<Ej{f9#8 z#nQ6%nv?b%6(5W7XX-_TeC&$^t75t_sB?Vad*eC>9^~|QbnNGz!{IfC`CVJWU-=V{ zYkmQrBYIB5`!K~v{VL%>rRN&n_g5Xpx}(18Cum>p65gljTD`$>7+w?YBICOfVT{qE zwDV0QtG}=46XOIKkz$m3>0Tl{cDs1)B7IFA;cd|OeIWMs^QB*n?>y6o(>QC(mFG4r zbk0@yJ-?g_wfz7~kLt~}^bEoFm5#-J#&OvkaGiTO)Z2G+<Iu06Ho)?!>(OtCYp$kI zKew$O&B;>tqi1J<_PWUE|IRjV1-5xD84a8FfahX*rq!Zj+f7p!1?M2OYd++y6+h$V zFAp8#>~?HJET(RJt1_?cKhF==J)>7bxt*TBo7Tv2+m4TejITF9Uf{Q9)4N6}I4nL} zkNuXu|BTwZ<Ed=)Trq)vZ^^&93#xD9X`DkA2jv)sl_~OS>vDs2$L!fk8^R0u$|&S$ zop<JQ&mnpHI$awRA^GAB5%cA&*1p3d@|rgF-!~-3)3vIZMC~qm)FeSS-(r4`<otv3 zLY_ST>iuGefJ5{pWzL=WZ*-Hdq<Ewcm9~FIc8An7GxQv#Po@43;hNIvcnqD?_x3K~ zZ4J?)m+y4mo^Wg6jPzYs*fA1Xby>AY9xv5&-OJW$%4n&P$0*Qk(d1F%lV{z}b(%aa zPp#MNBmC;J^mOW{qW_S`oETd!*eh}V2hWa<NJhg3K2K1~WuGkx{GA`_(|1Kamb84F z^O(nkk5Tal*MmQuA45Vi&2w43wCd?YhA*%3$>&Po>DmRRVr(1M!@Lg^Xafz&MPd%^ zJ8_{f=kcZ)khcr_Mi!?khwd5D-r-yz@RPp3qb#|fey>Tz?{dFgdq{qVW!Qn^V5E9g ze98MYXRSC_3f5?R#%fAB9Gs7+ePaHn(5fodMCyN3UBSnyS0nR*gtvarh@)B)*Ku^s zjrWfMc#gMag3p%8zfm5xJ<@tq)ToGcEsi~+NgKOHJNI|Kw=>9BQhW5iI@EadUj_bd zaprbKx9Vzo{$=^v&Tmy{*mhF4599Bb3%W$#MQD$v>|U-NBXdv3-;34!=JgPLPFYAj ziR|?M$j9kuSPB&@>%jhxM5r7&EQn=o;P+&99=&%rzZjVhiFzK#aN{%bJAYRcpPLaq zNf~3h9{gRR4~SW?SQu~CI{psPvNrOVLFAFrRy_r(7Un`h^F~1qp+P0=o1@upA5Y^* z?wfo*Zm;H_Sxj|3;}fH%3^grzPWm*oe<E~jneM@B)pX2SL0($mZ;n}7R5!m#^>V)) zVf^a@aXli&C4#RD%sZ(!xLYB6XDbYNzZI$i|I8n>LPy|VsizfEK5T`Sz(3zoF-8*p z|G$;ih4j5(qPyjxEnu3B?WMNHtIQ4Qmz6~+G>?<@qc+3r!$GXdo3Ibl8yX<}7JMeD zShf|iSJC$xwJ=D#dD}`sueNW*y<?gXnLlq_7FhETFIQ*acm2$Ce<9N9-PnFZuyI{Y zBjx88L=?MitRUYymXBoxi+2ZU?4LwFPn-g(hoY2if=req?VHsQKb!73w$F2;2MiTk zr2Gx%hsI@bwCY*+YywLr{#&Z@KW2cvUM`E}Z)~SNKksF{r;E<THizi+`S`A(^goLg zz0H4w&cQk#p}wJH{XB(_mD_aRDrh*DKW{X)&{$AWNblC8p20Sw8zR~&i;3zDGqhu| znzp~s?Qv9J<MQFkxSFR@UHgm4(!1x<y-{;D#YZ%TXIDV&|6(Be*^;2#>X-O^#o~~< z{&{)at{t=#dJnXM{|x>&?FnD{?3rNA32!^r0rQnPAiQjuaU&gr_hPv$mj17-!|V}| zHUr16(yh#Wz{3lrI(zRefz$`6-Kur*e2;x%&ABtA{A&86eQvqxILNZZaDQ8oFgW~L z5P5cczNUVeL$(I{QUkw@LFmJky?5~M-}&^~IZ^C|;cb%0i+z~p1MY4bN6Jqd2RRqf z`05M%tznOa`Vd<(uMfcsRaQ;s*VXd^jl1nJ*kAbn2=9Np^RNvVR?~B1r*#vQ9K^9X zC6hnbBApxq==ml2JM2qS57V(DnyP$^i|Vph+WHX@t(WdSI<ELju&ku%+UGY`R(i}1 zK}O0i{JDvxC-s;O8w0uj3a}2w`G4i_k@>>BgxQKb!?W6-6>#5p{BrX(k&S`q6s}CQ z*D10Qt)p-y_iTQQe^%p}r!0Y*ozzCv{pi{GvY59dzqyf<BjfwO-PV41)SuGH(-PTw z%f?lai}z*f9eA!%2a0(`ZxQtk2*bH!f}*dfSMJNzvXTd3+^8FlUtaLl8ik*wvz|k3 zuvtg_qxWNaFNWyrZ{&Rmi^10OEZEnwZIRS#=gV!~ajtkz8haJ*N5bJ7x;H}BYTgD* z_O?Rx8h(z|IGzNY_vo$&y)V>!p`N3^Dv_=O%hOp&b56FsJ70{4riu9+UQZzCvpl5k ze2?ZNq>U}B@4)k1W!NX>N3>A`wdc!m7Bffn)X%iM!~2V>RpL5Z;|_8%YoCeZo>@IZ z)f?(WTVd&YuN<~KrtkX<*>>l|)q*_39pbsE<qy%fA)KZg<#W!;_%rpKXnqdEVVO?i z=QA9AfBP-BRD#P_$jzB!2!QX0$y}Qjt}aWo;{hE!Ui#8S&=UA9KQ)H8WHi_2yNc&i z(`SQ3R)8qxqW<|1$DN`stSoC<A!J?^2fgikptgYK{8m4IPf2(Zj`04Kw4>4ibGb3H zeWB{zPvd;C_c5=+AM^QMrJk@H;}+~^&INsd*8PFs-Fb=6aUErJ?z;E&`Oj9oFS<`O zD!8F^a{jJu6YepG1HX5*NWrmRaY(7lFb#+4SPVa|hxR*n2I+nG@aM6f#};rnMKcaT z>}Av^$*{S$doZrj_BcN;s694|`a;J<fcV_NVe3UY7KQgOtkhnyl^Yj<Zg`bniv(XQ zSgead{{tTz2)*SEy#DDcL|@+%_>NjahsyZjq2mTii|TpTi~e0r)8FUr2k2hWZ{+uT zRt~jwglo^C=cMfa(KATKzm9O@3hMBoe11ad*E@Zxf)iCdOQ|ECoK5_>p>&35`=(Pw zTe3U>pm*cF*5e9%o@oh>+q9X-MY4L+7eME)xtx5|j$YO!^u30hA8Fl@iPznBwtP(; z3z!&=p``z}&l<kG?I(&`<L1x5xx1+ibx+5AEf=p+bWLV{SEcHU72r6Q#%;H8SKv&w z3kqIbgXyh_(6WceXO)V+u>`z}W`Qs9u!2webN?gmmxl5D+!9(@nR35KTeTse@6!Pt zFXqp@$rWYLQO~!@FtysUR%2ar?!#;2xl$hUyE{bRt%aF-c_l<u&^@3<r*8LDP&;rh z`g?tvT6TY*W10I>HE+%;-foOH<Ik$u3j4oK{`+W5CvvKz;+MNdbP0Ax`bpVz!G^Fj zg!X7k--YruO1li7QIkw-rSkJY?muKYWWLJ#PiyBw0n@wxFw`6r$J$ax{r7;+^TE<0 zekLks&Orf>=#k|S&)U^LE(_B8h7S&wNr9w>&=-8(0Lig5Pi#MRb+FI6U-b8Rqo^Mv z{Nc)~bvVyLbmp@G;4|LN!ts;-hI{C}6>5uiQd~l#E~}%ke^9p{?Q_of84#7W2hwk+ zxn3x&?iTz$OYU7W@SG-LJ208WxJGaq-kYtgP109*El3|*_BM#QgKwL-W`xH)4zHc_ zLW)oNA}w8}#gOS7r|1_cA4`|AJt}x_ZQDZcN7;T<w{F5`N7rrI<5BadpEHJtXHwVR zGDu!IG$Q?LdUq*wY3~Ns@c}Vrs%5%A=l8u)M|DWriT8DR3bqNtYg!`W#vH6uWD~kS zQ~JIw<nWxS;=I<}#^=SM<dux$#~F&2^y$9f_b+KjrS3NxLrw4TG1z+}|6JaK=d1Rb z{@Zc0iQiA9TWEgJ{v`IrRnzIZvpW9SddH&4+!`Rf=pPS3);5}hqc&43&R=tfQQJZ7 z<drm6oX41Di-Xv{l`+fhZ(<)q=t*hL<liqM?YX`FAaBFOwZYQ;AdVHJAC-n%S3u4m z)NXBa#2lNYM|Iz~ay`^^y5jJ57hSmzI=52!1jBgWASfTPQJL4KxWMmT52CS+(DkQm zIT6QO(<E_^5S-fc>cIGYoFdnsE%#;77k33|+CC2bezV^t<|H}Kc%fm#Aw>p}EtJ1e zJ?#@i%Te=o)QYj#vJcymLi=->qC?7kVvbMfENfJJfsP_OeZMRxkDgly4=JnWi{mGK z5tnPj+hn9zEz{_F<~$qtJjU&EpHO=GRAp{LVYe?7b21ry=XcZ>xNlenmWQc-lF_qm z2_r`fy7;20Z6Ml|RQlNjmRDWRNSEKK<?h-l$WZf!dQQKb;%45x2fE*hZ2nlxo=Tj< zx=zLUOxEYyz`bE2n40+*M|jFlZsl~=9pY`iVu*Zg34f?Edy)2ji{3aQC^zOT>L)^B zMbcLg@8!l42@gwS`gKdc_)V+$Jk?ptKeO1O>P1&$xyChv`XxUUX3smkKQUZir(kDa zen6>*!pIvS=FlvCNj$%H(PkdkkVE|h%h$4q=R<w^U*+~m_-gLu?Ub~$WlG(I;J7NY zwQbflp%A<u4q0ybAs75tQNL;$g?R~{;mmcy9HkcE9Ei}U%batzLs62L#}w_vYf<_$ z^$!jIi_F)kWrTbly-?6OJ5ls|GK>QAdVyC)$F`O1qxP=f8hY=z&cU>)H&b74eP5p2 zcq+8#*|svY9N){K?Fi|gcF6`XrQtItJ05l2|K2RH6dnY7GM?9-A9sS`oE@6;lx@=1 zo5k*Y&<G8K`MuJ7?heoo!MP@(%{grX7=EHQO4`+>yPMMF4CQeNtuFAL&8F89p}KyS zsQ;@t4kmcUh<yYgP^SJqMd^>R;WH@ej_-Rv-&P2Lzn#P}%=*?rg_ePcxEinVod+yH z`DiicMg7Ik%WdBIX?WWp`1%Uof1>ux$99JulfQ@hJpK9D=B-aogp#*Q!t#2T(fgQ& zCq0lfL_R*EBU_q|se|f^)<Wzmy1&?dQqS6T2<)A7e!3g?aC#LD-vFhr%!UT{ZpiwA z=BJ21b+<Stp62j#LS&<|_Jhdj(=R$4)UBdY-18ODbe>s!t$OoBeD2BlUA6D;$7@va zEFN2IPa;H}C7$uLaJAZd9-GO{D@*76aaXWU-}l|z)~6RjMmujGxj)ia!Sc%L{;Zvv zvSjq6t>stB2eY*O8lgvJ#|1+*WfeS0=eFm}wVHGUuV^u!U+8Y-?JFmnzuPU}BfgJe zTF3jDqL1UCp=>Ewu8_wTBHQ!up`d<6zgI%-t9Y(c?&a@N2(40HjN^dvEU6SN$GEz| zE0ytA=7+)U!)g3^Z;+?y(ZvdHLf`kcv!dcprnb>Mgx>RZUN>9eL-f|ob;@({`+;11 z3|$`<Pgb}8eh&CnYM&V$8|e7d{22>ZD{@I+yBE(3c@9^af53n96^<^_eqHl)NR62e z=DS2+qJ@z<IP$v^Q(NG>cTc73qJ@dt-M4o^=UrXG9F<(R3B2R6&qH*kOGO`ITEg=s z-xYqJA*^t(EIW@Yqi<4uue14(whbWuhJWDs^VQ<LSmnh&JLggAcZeM4+A?82^8T3! zF&p?8So+#3j;`T8Z5t)nsEq!dKi689<SRIh&tv^+R?zze#ADnyLZLy=>Q~9leRp9y z^PzNy_}vw1di8Vrk88m8-bSem(+lIccDS35N$n=;D~msB1^vgZ;12xD@wRe&YMHX< zmJ7x8NVpH%Rm%t4A=cb~8>?nM>rwSG-uv!H`7x+<$vK9<yLH_?9jZF`d0=^L^@}1N zYx(E+E~V%pDx>pC{th`|+*WW*tcw_v)g|o)KJP9lng-E}`IwIA%@y-Gd{f`=B-g}t z1>4(h<Lx1O4#ur`kH=?av-Q;ZM>u@amvJ1n<(N&mT)%4{KL>=~`c@%FN7{Yug^+$T z^-KPwVG3QU3-2RB8?MZa!m```P2;@#L^}VvvGTZCWTA8Dm?h4!uXHVRXL^Hr#XPuA z(a*U<{`ongXVPqn>&nMDTF19y&SAFne?Jfzo>ympfAnlcC&zIUlzRNlbnW1^(aY`G z^82%<%PE~@<HW$<?~3~XZs7eUkx$BG`(i~dY3rSgZIC=iQd&OX&#W?@noFtg&8#gG z<jQyk{35qMDeX}<W=!Ved(8vX4%LvUseIf~_p{F>7wm_;d-3_$@C+YQSUPpR;{Mji z=7wRcxM_jH6MJei81^TEIZ6_X-roXkcN~PAJ@kDpgAd1J25vy?nl6Z$e;%0UQe3vb zzx9qE=-<*K-l7L18)MZwqHb#0r8moMJo-htKh!*b$FuR9$;ul18GJ*8zt65Eqab?? z_#Wi_ds^aoVEs4tv#v7i|MbU)-&?6ak5I-``)Dp?{X9l_mdWq_Hc_+Rx{caE>@jkm zPB5*B0bg-C^%taFR>od4RgtOxApF@(hGCi=`TkV%r;OX9$XE9zyu#zQ9oP=FT~om| zED;*t<@u}wXxuccruS-UO!hf%hM4yjA1{CZpngQ?Jy-nm>fktZUYZ*rS?0K%%J^)Z z<G^{XwtqzQ25bL5|Kz_*j9cB$(DN+9M6dLD7}q-s&#A4P-a}%F0R!wdyyr_gCPVBU z^fO|*Ju4yYWPZL8Ph$bSd$6~Qe#Ggfd&H*t-gY80qEh3#){|eyI_8bWF*oLGe&1?g zd*;);zsE)ETJ+)Cvp%77RsH4;WxWw!>Z#N&(R0zM;`*0-gXgyD=3Nle7RV{weEy2~ zOzGimy7VB%uKaO3_*VC=^ZQf4a!_15gsFb@jy?{mo;|4OUmwknCH?r&XAgu|zVRH$ z8#{{oyJ1#N>^?EBR+YsCWwzWhN0H6)u=S)X8o=_x<RD%0M>G#=|318KEKaC;m5KU9 zLg%_o+cz5HCSm<&;d|q(V|Ie=SnZsyN%bCi$EZMT*^BXg`o&OutK0`6U0R|sZq)ik zV9DDBo)+HU_*?3@Ic!LzxpCu3mqSw%jvd8qn>ac$&PdAA=+Qx5<H<B85x(Y$yZVJ| z)KMQoF#c>Azi_CcL-X(Qm|FF$xIWHHvA=43o6l*9KK8YuU64L?nYRtc-^MG3E4t*w zZc*xL`oHSAttPymU}d?R=s6U%cL#D;wqL96>E!KBP1jyZ{c8C;)IX}}$aC`4$mbUE zSQZBSWZ$dzBrl}@_mJ|8nmea&<(>&`&r@rq?WCVA(|=qPr1hUa2pZ2E1UBO!h(2o& z)Cc~xois4$;|eyHL8^}C5v5NLjtIZLt2IbhFtZDyZW+Ej@A*}bHOL6{wNcA`W!kx0 z)Ck_s+3nbGuzI6<@iuza@_op^2c@Qs{;4FWi|OC_kooo;LI3s_us-E~tO2KCG2}G% zZ>^BLs78#dbM?<ZAYN}$;5$Ozh+3XBiO&a7A9?v-z-wh$DL?NMx&Z?h3*%Gz*vhA( zZ)3aJx_tzeP1>3+UI%bs4JW6x=@9o!XxXyFfydYRF4Zx9-5x1ldd5Db-7^`2^~}fq zyf5|Mu?L*_eB5Vs3|H4(%EzB@^jiJiZ?R31{^+IHC+8I$frKaKDq~0el^2cRo-H3u zhvd7c&ndd06)L-U9)gR?;xhRh_x64Nkl}$bkUQ@PB){V2<k-&I1ySAFxCq;k&f5WM zGllr>64bAL>E|7WwwrfDYTx&;qy8wfh^yv9&*rR^L7km<;@Bpm3DPxTI?|u<N#O6e z0-r69Zsym4^k)v84yAA9a`Vx)^9c8hXp1fxEwmAgaAngp9$!XpbB4d;knuGiPvc~R zOZ)x)(!#}HermgP433(<7?WBi?MHHBis)XJ>Ctvres?URJ({-q&2%5g`0KBxwx9K> z_Sw^65aU|Z0&Rb6yJinWPu&HX1{xcYe8aKK^Viz>P}`~zknzL_Xbk)_mg4>Gxr?{a z%2nEVGCS7#H)n#rgI^<G;B$v1ApQ**%ZKV_GhM%&iv~mLQ0=@&H-07PuMWM>5N6Wk zN{Bvtn5NAjnn+$rKk>OhD4ymYCv);#!}z?RbUThAp)k~arPm$iFxCC&*?L_*v^UO| z(zRF5P}(~VVEeM&w+Nzdq_~Ei;yr~-j#gXKTVe766{CNfc5YLBv$*!1H&8!Zal{xL zkENO353Aq@SgL7WtnT|Op0n=9<2Bz%{hQCd4RZe_o_E^E;v7eR7Nza44mIs`t@_K$ z()+KC%#T|wbbompXbyz1DsQ8{jKvQ2U9b+@+Dnw*;^X5>(~@yu9=~3(NyO**l3#Q4 zUU@7~%VVFLx6cAoBE`-9Xe+jp3uxSdo`CFC*uPc3(*^p=aQ<#RHlNdn#r-Sm=}*&r zW_=Fphw$CjBZ~a;AE>@WcFD+@5M!7Q#!tjPMB|8+&zE~t;5Vtd0%t1QA_ZUX<;Uup z5_q39i~0y6Q&uKN`kgPoYJX<9<H!a@7bL?IGl_d<<u;n@xW1Z4#QjyVJpA4$Iy>~< zOIb;A(|7YSS$$C5c|d+<vEP7Wjp-qgzvK3`;J9NgHx@N6`)vG!fB)Cd*iE-(2gIMr z#CMjluWo#n<~ub5@!C4>IXa){8mpauAaPZ?Lt)1iQ^l{jMCAcd)A&3ke)u79byDo8 z>**d*^QW7`pUK+J#eS>Zj^kv@taV}aR?CUx+5hixnz(M&-=zDuXx~8)S=nc{DtMVA zX`S?=(jLd}Y1CH#{EYv@-21>qS!{p6R%@<Ts?9LTs5bAKWLsikQIf5>S24-RxJ8Dw z-mtJJxdcH(Np{G!wj#qIF4<aZVNnucZb`NocDLJ>WOOB>+KiHtYvjcwBYSstm}h35 zndjL>@9%xz{d{!(o%20sX3m^BGyCu?B%ZY&+#C5A1htWm;U?`^l+egh<56_Y<y?Fp z_+O`GMDMu)`<v8Dv9GOOkH?;1IeuCVz4NL63trs_rXqO^-E#XO@Q>5BUEhPe-MC+# zpo|xiXM73kV0!@X*#l$ndLX(CHFb`0ari^!NA&)$=`%7Z^*EmCzksgUp<p(@NcV)E zA-*%Kby;Nllj)MtiNA*`y=$K`7S43}90ilGZMHrQ3N6C4-a&cmEIYV1wanO^OLW_F zR&Rms-|_fW-br!QI9g@Le!NC<7BoW2Pt?CR-H7+GhMonw^0jbHtvL2c{$(`BpZCua zu1xq{p9Q4#q}|=P0a`2cX$b9+rkx2?=Z1e^eY<-3bv_gsaYd`SzBw1t^*<CGE!w85 z#c@eu?lyeCir<}TVWE1@Ci(XhsLgjrKGzpi$9}xu(KX4|qkPw!d!T(DKNhIo{Rob; zTQ3|b#qQoTH2o2#@kbn2+h+3i7Fgqg-WT{fL?6w^_pNr{2*2xXm(YivH}G#%5gL-( z?-(x7qBir`T&}+LMLC^w81GjIZZv826C0uLLEN8)JE}N&(eN8j#k?60(D)JYx!)>; z#Mib7cxg4_xU@Wp?-$}+{CC#Lt3vNFdJyCG7V+`DVbcKtTdi+i(tL%+GZ*{$#0PUB zaWx;CCy%4CQ|TqV&dJx(vtRY&G={cL+OJ@<a#P>r&v9%U$|pU+#{q16_newAX5IZ% z4%_a2Kl1))3w^K4^4N0tXY<`3jD`3cupN~q(l*z{Yrt^cc7@lrU@lbLzfLI=%+A)s zzq2P8T4~?DsbP7EjnVDNtvfoP;L{F>YwLjK(7(9ZD<I(ne$8~AI#KC^eWQr$n~29N zbNmX0PNrXl3FG=s3*9rtQya<n5|2moU+LH({&bCZw6WM}p*y3>WICSR-|%+H(vrO4 za=cbhIW5lx4bHJpId8h4d+ucVeK6rgsdG3Vqtu;sA5^|R7t%kV`WvsuI>o5I8$tYS z#rO=8e*eO-%z|z7d)?mcbgdv-^~ZRK?x*Uu;=+;TzM}1ry$s``_O4aqg?_PoiMs>3 z?JO<IXMe=+AKvx2&!uOE?m@=y6R`Ro*b%Pt{DEzw>ouwy!V50o&reBL(y>78=#!H! z;^G$if7<IjE^T3Q_b=u2>puM;S7s<9W(RIEfp_ItDSyFV`0sF2j~9Ia63~C^?$GZt zc_H;%eSa5G8HT`jGrb!^)phf<?>8B?aMsg>=g5}C`#&{Zq;gAF^m|}%GQNYTG_Hl5 zoFk9r3`^+Vkdv|v1}5?QVI<wv?HLcRf$W1t(s@?XqH=%RD*|o7W^CgIXcXFH7~#6m zclRhwaA?~`Wi!8a>?Zy5jr-T=*1GR1ew`2<ExpshZJHl_9|&V8b;jPO@EPx|3FjS8 zECurw6O?*K*#afcunx=GO3%5zhvjQ7?dyXaZ)KIFub1L^v|m0IEG5)VSXm^W{J;#b z`3HSbvph~Av?R6uZ9Sxx(|wK9Yo%qg@m@{Z9rqP-eIWHDwFj(9yX8y%&c$D_QfVXf z1@})>>Vp5;3Z`r6`f6Fp>*>g*bKcO;_cuEq?^gtOsA)wFfZ;W|=d%3C_bgU)v~JU% z6U1lu8P6e$f%2ISyx)>~UwPy>kI+U+E$i@ED!3BcYTd)wmMiCAoAW%v``k!)vi9yV zye-tfMdJWd{7k6-6YWo1Jk2Al>b-P*6u&6B)4hO>nd<?UGTt&hTsK&uEHfW^UkN~3 zIi-ysfzJ@;KHf$<=Z#kIk_)hX`KItRGC8EKEQ9x9q(1u~-it^XrG^1M_AsoiQe>m{ z%-`mNuPC3ZL-phX4jikHGD=&MtDxaJ?2p)bly4X_2C_EF^;6T5vgc+|M$GMW90?tp zHns7#OWI=dbCtd{nd$k8wCkm=&#Av<>EcXd6iiefx0&~wEG?Xa`{H~G`<9$P?cjJ> z+M(tLri?7ltK`2EaD6~+eyDhf=gPl3F8*$wpmXlYQ-!+F&j~@&>v)XY&!_7N=}~Y8 zZv!o>>3XtV+Y!dHuUrmEgTHZ*I&YtV&-TZ@y$CWdYUF4#d}7>7c*@SfF-+UlJZ}0M z{P#PA-gV(94x7{uHEk%RXFccR6Cr08_2I_Hv3<4V@y})SXX80_CWqpd5^BFhcAA0T zcTm0c%L~9BdTx`@kTma;v0PpMdOSw94a1fC)*nj3c~7O>-U${-jYs2qo{G8q!+Zm~ z$0=BZMk}@dRwK|>ygOZ}^To_j>e4;A;4@Hr(ZX(cDfB$)&9lJOxFyW%E~k6977wW} z>kBCINF7RZ=Tkk{daZoo_1Gp;h99f^O@MD?5%@0ND8(l@1HWAi75~EXK<d<K`lGnL z>{32%QPX)x$@@a+>X%2pH#8h4r!gNYRQloD6#e)*@8WH%t6pP1kHz)9*Y1Pv#_@_Q zqI>g0HPG<;7^Ob&kW0xE8j{8>UMIA5zw;PZ7gOef)Ozfj37=NlzAFH>f77@j-gJn= z>IZHALol81uY`o#=$cMn%KPu+=c&DUT~!>uaneq(uF&>NS?6oFA^9nLtkCz0+{dGK z#~=BeJXD81uD_2g@66==CaN!cp4tK`XAj4=kMjRlpR!x!IwE=1d$BJ!TCsmZb)MT- zD}Ac}M7-BZJ99l)8t^=Jp12u&(?%-vh@X6%d1pZU3)8`IzJ}cn5@vofHO${Mem%H* zmIzpRsr!{WQ+xoLHXhm8n&@{pY3~mFOh4fb&ddi(l2y@<)E`dT-L*a<PQ_;G@A{o$ zY*t;0@1K*C#eGe!lmGAH+^T5~x7?eE?+;whVSnchQk!BiGk+frj+#Rdh@)$mZEtDB zwpID+MySkP5B}*ZHODBJs%_^8vtigOO<q=J$}ReP1xt(aWoOFmyY7Z%kn6)|H#Lt| z*?RUqPDfJ{oo|*WcSRc%hkoy}<y>w5nR^583lV>^f%@Ozs`=17(8$SSWgJPq=@5^b zdB;XwIks+k51^LYwn5J8*tS8yw4Y65MTC>HMSFZud;ITH1q@V=K0ROUQQEwHG$uuD zNw!AlPT|jmsGj|_G|9gU8n!F+9qQmaG+BDRyt_w~RXu4147*1@ZvJCCAa_Iun2a6J zmL)lx>j`7pnnLfh>OXoSw5-H;4VJ-_kd(f^L>VJemsPPdT-STlBrqJMeUC`!wbInD z@mhx)sU26;?Sz7LVvHlhh@Xqkk+L?fZVX;yEzceKeF}@)@~g@(yt5!YE*aCsvk1!< z%qk4iRUE)`ZvQWi%~={Y-|xe?sLuZn(M||$?*lZ33g%%Mq)jWWT`2Bt&J$>?Ami)( zE*I)9;A3G!fod#dj7L}(JVUg_Fysc_7ZEWTnd1IQ+Ss&V{1UL$`k|*{9k@2_7VO>s z5RGpUU+))moLL-_FTQM%fPvb~MO&46|B3t<dw!?_=RtlgIe*9H>dQlZK=Mhuav>y~ zmJ7~eic82cPV0cI(euFk2=#HO%~;3FD6p=j*rC6XKs5b^Wl(#DejgDX`jnkR{Zqzq z(Tz9e4Be5<qW;~QB45kNi{)#h?{@hZ6YTU393R1*G){`Wf}ZaQ9Z4&u;xk9t{rp*I z*uXS!J|M;<JwF@_kCp#;S2%56jC~@(Lut2hO}H&%Y8SYdsc>0BNk02dx}NIn)5AD~ zta&2FExn|RtM`rxaAiUtZJOLG`j*z2>!JN@Y=8b3d0g(zv2t<^5#CRxr;qboJf4Im z`+GVLq%NAY`+ELtjd)U%cx-|bcR4@4q(0g-?`~>ik$7^~kL1P*(Wm{eC0y72lpp-Z zV_Pd5_liKLhwb=9zJAm^ou{rAaJ#;WZohSYwFVNV<Fm4-=zxHOWSK7OQ0l$zt>B!p z0Nhpby{OsD$6Te35n<kz(C;9`^zpWBc$V&gNKV-WA>6%q9iX!MQ+;oAXP^4#FmBzF zjf&nZR{Mp#?`PXcJ~(f)z#DkQ1;LkgLfXIa+!9)nwkEehu6eY==eiX8ldL=ED0PU| zeFgO^X@fq8U__G|XJA}Jn|i(pg8NV7@MRdyv-mhE{rck|xqOL~&-{|OUn0!DCjNQ4 zvV+vu6PdngMUb$P;`VN*c|xO?R-VAeAc)p>AYZDd8Yk%!I<BbA{SM}<-K)RuVy>0@ zkYH$xh>Y&@@E+^iwNI%dZF*^w0k6%zSkazXKJ!|9M`3gGewU>|`5<#IhsrHuF>d9Q zu~F%jk-(2d@2HxHe7>*eaWw7+mvUvKhx(Iy0><t82?W}}GWtD0;Jikz-7**ZqU?jw z`7iGz{7jvNxkry%x)Ulp_d>hR1epmmrpP!!?$cXNT^`oKv|u4lpIN2oWd12143hV+ z8YeA+z*za%<!qR$@Tb3dNXe_m2$jn=VH=gTadlnTj@Y`&udHDEoX$IZ7kbvPMO;6K z$80U)^>|Bv4(%80=jlTjo+93du)2`E-9+OJ-%m>+<#{^(ga)O)JE#wJCW+%{%i`^V z<#n7=BIrii6P8k3Qa6;;>#Wkmjs|Do>JEiJ;mYaZeD#;>!TLxQz;TnHcMqMfXz&P) zf%%=I&YQI{5=;2~m+(hQbB?C5mB+%LClGJzl=(`(SS)+`3^4Q*fx(CS%C@n2lP@6U zCp6wG)`#2S!Exc#@&z47LPOG+2D!f`?Pj<B{Sl#K)27F%z59>Xj_Z>bVZEB(#y-*f zmkD5bQGS-IKbOWkZWCVTIhDsiPw4$lZCSh@W_3yaRUVVGG#SoO((yFxrhc<v_MtFM z%R{QQ9|G#h68#B_f4KRE?@Pim%ib5?2SzZ>>GQ$ySqCI<H-Rzqcc!+<m<P4nci?z2 z=Ch5`{t*n6!u@i8WcZ5uAeNrwp&a{rQjU~%T^BiCBp8Y3)<AsBDyi-bzw3{=<vV@7 zGcT3f8IdhZO$X_^O=y$%J2;ZssT#xmGqzh&Z+V@!B|r0=S;`vz@98oI-)Tm8wbJ;9 z8>Qo=rnh`N^!~FL@u$#vY_-h-M>gL#M4Ns03K+P5PE`7^*pc$FN!s^^P3-_V2dMvz zgjGCJZucyoeL&lP#toY&?O)fo)OWC0|Cjl)bny(Kmgl^1rBq)+m)6aH*Bc*b1jE%E zpgCtQIGTq;?@fGr_Bv|ArnDoA7ZTsa@i);0rAdpUzcUNezXFb*w?pg5xnLZ{?`vsS z)AI+5&*p90_2W2})_)%z$IOe4Y%Q_4n)!e2)txs@z9<_!zfc>mxJMrM*#FoyBpqU{ zQ^E8AKC@&TH95>1D8sQ$Ptq}vdE+|BV1H*@qN~4}+O+4@X^{N^e|}Q4n66u+=vX#& zjFMN=p|WM0{=Ai5C6E7QSX|xU-)nJol0w?^%-yo2T~_7$pbfl5e(+Razh#?TDD=_3 zZs@o&S<%)7-sIPsny-4K{x~Cg-y>o_)HspKt!s0Iu~75aB78@#rYGh4CT;(be%T?Y zkLS<BeKB|raz3K|()BdmD@=*>@05uQlE$q5-|v|OJDRlYGG;Ho8qZ7rW$U3hk?#2f z2S#Y0p9oF$UzddE#r%lezq+30?Z^I{_ShH~V}C-h9d{Oj!95Y|56a^)LZ_8l^Y!<a z`u|4mU*4?g5PM5>_o-TX=+*b%C7vN=^x6BV50|y0Izzj5?8Nd6%)#d!whrZU?w<k` zSIW;zYFbn_4Eib3mgk`HR>}*tka`h6pM);z^xhee_!K_lIfmiAB@%DNZF8Y`?pEw8 z{-F0~h%fFaY7ZV&n;N%z6kX5iHd3y59w2Yw>WF^Ha0~SlgqKYRChrMjxGQIbQ^$E{ z=wkMsJOjWQ*^i{0k8zE!?GW%v({UVN{z>%B2^P98Qa`7$P*1m2!LjFx{sQ%>HNu)B z{SHo#e0C?aC~aeYH<GO<dG~tlb2Onrsb$Vw@c1I{Su79Acg+hZeMjZA_H|qt)oFd2 zui6^A-^0(TG#tcdc;l-ymeJxXd$<r{r;jQ(eyjc6ZSx>*eci#ZK87nJ+oP7eq10P< zZIt#uE=7#<32yHR`26bmj{1q*DcWcG>{}@v!8npM>-PhS&RN^qAmKatv;IhibJ%g< zzJG#3Pvmw#qB?(`&FrTkqVA8Z;2u*H=4*4*DE#eb>BqJNKkI4zb)DvW1zLLoVA)Ci zVfU}%T-5&y+XKN(ikJI*(jF<TK0k8&6$yiFZ+R;EJ-zvF`;~EYyt@#RH?C631heek zLZObdk<@hRRE5SjT7C{fwBFL__ECa6l(a5aWj}+=_6xco@g{MMOMjz%m&x(}q8~rx zCU-&c$^0{)aN#uQ{hh~6y~L%AjZ99YI@@ME{%P~7pz}-Y+tX`#83ZHqrv*}3j$PV! zy(#HcQXYay(zd3Jkk%;nrKOw3aJ@fS!&vDn0g3~=72KH8@k*ZHsndigVn)Oh7kcM_ z@spL{`4szt%#+7RvEwtaE<}#!hsb|h9veEZlv!7Y@w^#x1zhKIyiZL(Tik2wf1V0? z>q`V)q6eF%y}*xWV7B(zx%~>hKP(Q)H>iH2B;iZy2O6HzUXzG7!G`-)IzIBgP<8?D z{}4a>32fv0gxa#p<-XT^d*~T}0%|9I>q<y_SM)(Fel&SE`7PKF+rSs)Zx6Lp%>w7Y zwb#5cf<MsHtNp_rkhVb_7sAs8*p^9IEA0-wE2DRU{7l{Tk$mo)8^t~~J+u(gA6N*E zWARwmmMxUpYy7&MLVeryfpDGgM)6$QwgTfcKeG?4^>QDj)i+dcVcvZxqZ@d3Us$&F zqV0lSsdH9BAn^id*uuwj)@vUVXdRvTN}b`i4zRp74Lldi$1lS;R-r{YrH7u=G*82N zpt9#w+-Gl#JZ?uc?5F>2JmxX)Q2*k7i|WJDviZ6n@p|sGisNeex9DHX4(hK{7TdQP z$72QCYQlX@D>w)RN6Vl8cBF{5n*GN{Zj2CiUPoiNu044;c>6IfE3@EZQD?TD&0B7b zeBSjux(|$3is!+u5_~4<K3D_x>#0w4T_Ebr%4GAMKj@z+I!~wft%NV_wk}~zNE=GK z_e|y5y?*hox;FHjD9eNLZMhV;{%0>#ydWQ&_UAhUUKT4bdt`asUc8psdaZn~SMDP^ z=W55lu-B@q1Cmu;wLT(^mQIoCv#;C&HlThA;zeJ`Vpx7#0mg^uxtwh?o9KK6=52wv zZS-7RdWGnZ5U*|UJ&-I8%De91eMRdfo53}Yk1YsKXExotz02udN!n5BNfPaZw5QF^ zg|a4W3+WZ2jS;%y644ggy4LB=O`gX4?Fgn;TDw-;X4E_bGqCRnR%0KfZdaELGwE2w zzqdqJf5dC3mD@FHYx!-P!f(Hj-v>}T`Xt%AAm*qo3LUQ1{=e_fjQ~H0K2*k0{I@C& zxAS{^kENy^kUS&rorCSBcIJ%GnS@`5nWtc%sK#N-j&qlWe#c-7#LuAq2DN8;sSP=9 zUCrso@{_zdt}r4Ep_Qd=@9xy(@BbF>?M@3`vn~I`<K;UZ+lv1U`C69AiKfnVX)aXH z$7{)%_!#u{W8WJJ_@z2F497mgdnvYIBExqQzu(v2Ph+}_N3hK%PRDnQgh!n=KR>Fx z?KbK&3f|LStBBv(fcHmBP;P(4@zmF}oIed(UR@5k+c0kWI(pW%?VAS4_it4CocScx z!{1E(qFQIRoV||vK-;oHXzeIb@K`!^KK1s|0$uuBIMzV4ffw2!YdZDSWy2Q<^lD60 zHePlgq|O*2rLFT&KR|ffoYSSWq&@GXsnGnbwr?SHhm+=hH#A(!9U3vhdU|$mR^Kn) zLdOv4SoxS09K*5Q*4{lwzwh_1h0ZtU>C#k|><_m)_tHJNW%o>Id2Up>{cHZaEW=*B zo{=7T3FD#onkonwW<lWj1B#5y<7&b4E43*^i$0nAu^e0qJ+FQzU2FDnBNcwqu1<U3 ziq0+xU+O>BaF~I8bZu0hfc@^kkMw>tC!41yIO)CnI2=?T_ot0qoo{_1S0=o^2bMzo zf2f~E^{JnR&PR1LKCX@p-J`_dwc1;e3kIOEF~MQegtc`2`#vcIpKmcI+wuEYTs~PI zqp(;gAAI#Rj$hr5%D#`NU-kaJK$AZG66`Y#A5i~gOpx1X;)8TPkc_%v+H1)>4dWs@ z*{9Yx6HL8>{gx4g>QXP9ujrkA!6+r~KjS_nKQNr?ErUrk^Ye~q>=)qg;DRU0Z9s-Y z>SA6C*};GKm^JBTK1PWD^JYaq!l$HD_<JwkOL(n!`FIS4UXn3?gzYEhQMw-0WWks9 zeTbT#EyrAfb&TnMOuHW}gDM|9Np3$XGR>lEw@WJ5fBi~ny(Ul;4TkvRp!<rdFm8&Q zu5mSM!nYmJ+cOL5HtyhbFkHs3{X7@lGcBX2owVJ%0n(cT9IskN;yt6v+pnNL9krX9 z@cz?14v(pKTCOez!7NK0n(rliZYMqSkvcXtHG9E5w+bqs-zn82;X*u?EYDE#y`%8m zPO<luFuw8VmC({z3)$bVg9JC;qYRJEfY>{S<MtEqx@jJ<RjLmw+kc4qf|T>IjR$tG zgWBgXu48UKRQ^@oFBV6g@B3I~H>&$A|HiS3ZdofwLm>1o<>Ap#ANm*n$Y^kd{tblw znOANL(*=GK?Z0{$-v9C*3+*=}sg0?1VawSMb%gO!&!hcj+oQ=RW>Oz)9IL<nJf&D3 z!p-~afYN6zIX$mT#56j;IikgTIQ4l^{*JB;yX(OCi2YIXRo+ZvM0K0GoE>@|!j#3w zE&WSsqLNwAh2x8yEV?hM@ku$ck@^LfU5ualrXEsc+J2yM3*t|@pMQ3RV5-yRd+?f6 z*ORg}hVJF04yDe2^3Sx9Hvbbm9wcC&n_Z<pC%#Ye!+mKTd?pm()h6+AZs0^b#_g*% zg7;Bz-%f0h>qK-zY2|y^SE0PQW`Z()sEj_nPl&j<MgG63Jakr$)&4$9&c)aIex-Y` zc?w;ZgeucGLeLYnHO&@nqI8LNoM*fU`)h(*eas3l8{~H_hz5Qy;^YReTMBK)K|er1 zLa7h-aCA)5u>LFQGgFSMXg+Tq&X;|9P?ML%QRkb@s|CJNAN95AMb|=E3)ag#Cs&|V z<3(F;-M0t)>kmQNI77MpCi>k$&e!{(_D6B<5N>ez0WilLfS4EM?U7`+&s+!2>3poA z=1F;Ku&;0OaX+EU$dAq+5PFijH{ke{lu>Hg9)RE%tD+v$)Z^v8uJ+LWFh=%=^ez+O z_x#SRheOjjId;|ef3eA<xpu^lKJDl14gKyZwFgw!RK7z>>wbvNBcfwJsbd?VrIfA% z+qwLClh9V)$lF-vN%-$&om=$h4e@83(FXRZ0jX}bHtZLP9FzvLsU4*`=ozJ{l3(8} z56ah`PuHKijg<Ru!`KbqlqmYtd#GQHy%YPKuGAvvI(tEw#<Pq1_Iei|Uzsy-jM{nv z9=GD1xSuhug9<*8P14$oy%0Q^jyb9SU!^(Scu&&83#MY7lTRO`sUypqcs<=y*m{yT zJxA}QoOS!cn8Az1y$8{oCJyIhCOot=Tu##XT>~N``6Y}Sm@E3l<av!@jI?j?dP6*Q z6ZkcU>MXZv&k1T5KFg1RzI_`xeFd6Og)2wI%{yhj!k703UOR1zw<>i~oWx1ck`>+l zY<WSHDZ?an&L`ySnzUQzHiF$VR#!hlo0yGbN%QLypm&vs>oehX>R4W=;5qAXyl#3K zz_u69CBZ{!E9?aC%cB)~woNaeqVaBi!jpcP7m|+lLf2$^{v~Z%sX49)O5ZUk@1xbC zL-o#1ZT}blP!*(1pzpP1aXe@7^_8c0g!^843Vt_6Vg~g|gfH{I^ml(q9h-WuF3}yo z&JVTs0Tu`4z2DGvnjWja{t2&T@EvN-c5#imkH`CW`V|Kh9lJlozP)aa-0sXJA`X&e zJO=N#O)JMKSf<%HhD`3?6|VE2O?^_=mi>^{EcZu5cXgUszF5IVZFygcHml~TenQ-z z658lqucnWtZ2xSFqDN)<K5)H5{Yq91jcpwr_zt*k;(mo5;m7TH3@V=BV+^(2GH2wz zu{`!i<nxt1e+4HS@%YQ>91#rTlXPs8nfDW#-Z-*z2EjkvwBi|TGpX^|SNUGpAoQoA zn2#~sbvRyNWd<J;`A~b}1;;6PWtqG^`YtR|+E^@Uo_X%Nt4ZAFSf0$MuzvOvyQ0Sr z0i^wlx1*M|!xet>uF=po_#SxgNf@_f?m;krg5!#Y(3z3dL6*0iCqMJGPvzH(?W%(c zmVMk9B~LKBKF8zc`2vqa*{t<pnu`A20xjXuN}H~yeIzuN+j*N#pFr<X8oIX)Sq8z? zOFgS`Un-BD1eSpViVW|I@^y!>TEC{>MX9mvozo!w8gV~CbnXZ96?`?{P|C)qwf8}S z<H^^zRYE6A1J^f#h4~ExmZtSO{kY0-Lu0s)cH?r$3Y}G3M$s{~f1|Ba?3yLQ*tD+- z{r%LFqMs-F#N5dH2U4$2%QC7c_REij^JSlkzJ%~OYw-Ab?meXNWzFnR@`$eIz&3D> z;@1!1*Gv7gS8_PkM1E}s@880;6D-H~`4B8w3Z}jM`x=Z+8ZY#GCb!G9X?R_y{z2EN z<E9Bvd@&viA_Jwl+vu4;#<p0{#kR6AT-SG{=y%(H!7-0FXBh-?J0K<&-?<g!<JcqF zwmQsfw~M%}4k+I~hU!7u3f>dzNSiEe`zIgw$!Majb1ig*b@yF^`{2HSuI0|rYlU$d zNZT&dv9jDZObEBPkLB+rbKAr@Vfp%AqxTTGJv1g^X@;CXdjc4z>dQ?I-IKDoo<n<; za@+dQ?-%_x0Xo0n?~Pe{t$f$2IZ*o~zm7U*Vw^tTdPPQsjjlz4m7Y$=F7-wI?}G`? zP}AT&+T)V`)G9^4XmMNZo25K0S#(|rR>mcBA+Q?T9jQ~Nsr&GAALa^bk7^oJZkeln zPmy=|nDF__xs>-!Y8+pqd@LNp<_mpl?!j|t-zkrU+MmSnXV6dQSS`=9n~w)jd*)9= zx3P>$-oE_vMO#wK)+^`at`qvJN3YceL92q3)*{!b<!$-A#h!%iCFNStC-$$Qejdrr ztUpbWqos>heOf(lfBt?t*On%HKUaMx_6_}wc${rB8##IPZoFrC-rd2~7cZX+Cg()1 zj_6_gS0Mzh;-6_kZCN|3pzT~Q^uTK9d3_%Y`whpzsLg#x4Yd3;Ucl>{O5<8Yr}c5K zDule}L+^HZBZM2}XW&&l1}Q671B|8jl@(j5Z$ePT9=cDfq01_1A5fd`j>3rYedptS zC`^CTNKN|Q=jlGwx|ZJWs&!z?11Z|EulKe|(D{To#w>p{`GI35LE7MNR}3s4F4e!c zhqsrUYjIrGd<;DoL?cT^6I?z{k?A<M5OS=M|JF^7W9c=4d27Ccqi!eVjLJqBINJ+3 zQ?$?A#>?sc)xE+BJ^$wSTY?o$TCskAM4bqZ^{x2=t$7QMO$ZH29UHJs+AdiQj@|M& z6VWxN@_sDsdOmJOG~`qLs(d^e9+Jm3ek<>b!Z=rJpDBnOHccF$^Ul_jynWJWa5qeW z?x%PiQl5#<hY%c+nnLeAPkWx~ojs5D3xsZ{Y1gtM2>zF@?W7L*-b`?FlJ0|whqeiG zo!(F))Da%7G;Qlfur6N!W$*rP_CcAPV4CPJ;oYLBboCi|8<gRry0~A*LFV(*!<e=g z#dX{h>Zh95dGu<b4$)XQ(EBEqCoxO={L0d)^Y#zr`@Ti8zo~h(%9ST*uSG2$b$#gt zbp81Mp!;*~R@#3@2Op!QEvu1^8NqI8n+9c%(>-wDzme_AY{32qVdUI5vfTb@qpl1@ zm(+X)M^pL{z9)AdOZ}a3w*GoBKCivkA{p!l=JRt{cR3%2vb1bI7^^>CEG^2%bWVco zQ%7-qQ`4x+1)tNoQ@4>ayoG(MW8G3nd@C1vUG&UHXtdIV##Lc`GV?b=U4$_$eq0~7 zJC&c4q=)x$eNBFr#?h=k3Bz$5+%<B)Lhs8E*E!;eAI)Q;x`D>E3Lh#*`Z!18J8eC> zxY;;{ahy->U5{SYmiobbPA`MxZ`mB3bbYw?Y~<((X8qoc;5=3Iv!tC(-9PjC#y+4C zBi=yeviygekEx`-B*_}t#_JyqK)M;9iTppTSNiSCp=(^NOU_kdUyRqRRCv|&hf~gM z2*u1hBd<Av?Z1n+>H10HImxq2z8^Z5%I_Emw*9p!;6Dr7YUu}fj9RwquR+9XyLhDT znB?ZJ3AY#bT>t~2e`WhG0K+fh`7|$|u4jLd_BaQpMn7JpZ?e?zB=3h2O-l*(Z8>wP zE`-<frF>jTd!#h*mk!-=io_p#^D2cu{!jXI83~KD_wNmTXY>GGn^`B(vj%BrQ(Kny zS|M}|wc?r~ZL-wk+7a$k<p+&Q-w<6O?I2f{@uIrw${Jld`-ePkYI<bcIxF_YS~3r( zzW?gz=PPc_7TrFv@_VnLxIXJ}DPPK+c#M*t<#ElY<qPy>{rY}7`%U>8$N>7CizA)d zN$HfxzS-b86xJhgGJm#W``I^kCj_3Y3e#DR!uxMm;UYnQmPeh>K1<tHTF25e=Rk3E zxZMW4f2RMP?v>69_4oSf7v#?=B3)aa!~Q7Sh;h~WdybtW?QcxpEJ(X$F4xv{kLb4z zad@xrU#YJnkz2W#?y;m!omQVXAL3SbaI)1jLn+6p{vNXO-}-yYP_Uz-{b3bkEQ{>J z{MX<yH2Oqe(ep@j_7jypA)@YG^qHa5j3r>YeZMl^Io0^it70?Or@Keo)1r}+VBe}> zs_9d{3~06y+TZ|=12YFi+jV4#KEU<93!Far9-pv*-npeY4?xm3y5D;~rfZGJZh39! zeYQV*0NlwXn*EAP7w478i#AP4z|TX&DN{A&M2m&!QWxyuaAE-4spm6sOooDcIJB|v zVVi^z;@DTeCdQ;{8M*sLg!__yV`SS>^J<mr?5nu((V`n_y?d56uK6_mxo!J$x}uYD zW^^{?xdz8!#j|T5kh%ft6GDG0c=iV93;nB}v;k7i*#LDd(?jo9-2e&aZUDzAcu#Ko zWg}$%Z6sJG@G+09zv*)}D0<1-hf-%bS$lkjf}^JG9<d{89S0scE=*h6FaH|^Pb&Yr z;Ye22dOjYqB~F9f`Fx#PCsa<op2j-v4EZyv@mJv(MaHkxJxXnZ)b-3ep!C`H3B41p z{8qjvwZ&1t?d#E>hl+c5E7(MyI&ImG&p+yVww!wE4(R@Tu`X7{OSxQo*I7Hm<;-ui zzawB}$nwU!?*mH!+q$~Fb{!x8<Zj}B-%d>*soXk}uA!VWXg(63Uc2Fw@zDK<+%Eif z7qq>0NEx#jb7Y^M?4f7qmIeI0nKtp`PxNZHt_aIW+pKR3*`Lo)bRoPX&G;LBE`XGC z%T|N$dj1}Wv}vWrQ^!Kw#qzaEcxr>%IuM$MljlI(W`6EbTiof>pnKN>r4L<sH0HIx zI17BWbPe~vb{|+lJR2l`Nn_~hlogPB_Cf^@$?&gS39b}s8@@K|JJL6b=dhHe2RUBE zPd@eM@VKP@NYac4b_nvS3*<Icwukze?%AgDoM-TOCjN%wuD&<6hq2N})3{8nTlxes z?qg}}2Z|tL6Qzk8{R$+#iE&xFX!5P0cWnB<8B^}M4aY;--|=h8@H)27yt_^V<LC3k zy0?$V{)fdkdieOWwPrqe{y8-N1b55*5s?%BGalR6^YD7~-X2{HK=@HQaNcHc<k30u zoi<LGTb4djzV{QX3rwMR2j0<g8|=KV13DY{^^Wk}YsK%{t-I;`BAUSTanOF!Lg>6x zZg=%gYt;R4yovowu3y|Uk*sJw#gF0V91?He11T>~RAl$>9;@ULPRi$9;c{?NiBey8 zjrO^n$j*Ix4a6_!u}B+A>x-zbVC(<i&esBc9%ZPqE5D~_F~S=>s}cO6_Xv}6q%_rw zX}cc6dyyV}|DsnQaZ)Y#PNZjG8GYU@IQ~OzIeELGAa7K8%;dS?J_FlLx_1@T?+ffV zWH_WQ?*}W?T_3%z#TRry{L%V<8&vlDQn2q9_bMc_wB!KQk0=pJ%a&A0>yw{~&X#KL zrMRsPa}=y}BQqX@@;oE7V*=M}E`=A7Cr%$3F1u?Zk5R@*ZQS4kbR7<=G0c58y^AAt zD7BooU(umo@{DEP6VW}##A15<OTw6O>*-!p-?<CgyZ1uhm%E_)t6h-t^)3j8{y}gT zBz&_A0-=8_hF;!r));}d;4T__AYT7jE5Z2lZpb`2pwRk$%vbWZ;07g+=wnLeab;A8 zKEZ)~N`0%3#yhx`|KH^o{WniRONLnSjFUNPvLcI6TF=zqm)u{-ZJF@@|0zv>f%<;W zo5u)!O`5$GT0{SGQ@4U~4n2dZ``~#G`#9s+$2g3ZKh}lI&Y*~`#)ziu`X2ASnI`QR zZQzUJ%e^iff7D+iu74yaqfT6pM830+k6j$=qdQ}DUbutnyWxW(2)rvFv)n&5DzvTd zU|p&ULU$fF^D!RMDfI;W_jabg(Dh_Iaht-AX!`p$Li^xvS#}?6gw*-^>jLrUeVl*c z{h%H#+veSg&jxIr=Qup~@aqIcXWt_tU4JP*?kt8nZyvK23~NS}n+-(@CZh3&{suB* zzqohT&5In@sAZ6HeHZop)`@a^>biF<rw8HHOLKb;ay-V9`8mz0v_k86diK@Biquwc zIrjf*x}>T((3H3zY@dp;65PF<(@)Kd$`(7twf!iLO>5|Huw{JqE%SwX$K|39GT!EF zaXs2*(mhkgQ)bK;<gs+{0=-u-{JLJ3mgPhFmM1AMD#Lelk40s3;b{V1!~NU9wkRJQ zZmO57*aZzU=v_c-L$1OXlPTWoA#C!gz5x4QR8IYaUt1}w__Lnj1b$w-ucS6+_7o~I z2{uW4hw;9w^#!V5>@4}77kpk^iv%y4v|^4N*LE~LCu-sNrYr@+EtEfR*6?uOn(G?* zJ|3$oYXM5?%f{4%v1-fD2&a8l&@qvaD^>RAio*1HCahETt#}>9U%rFaP2r#!*SA&B z{3Bi~_0B`O^no0VTf2sT=ArJ^Il6q7r}TZXJIXZzbLiby!JlVBRsnhNN-ob)c` zAYFUG@%Rjp{WZ1iv`iOR)=mWXeCm@4@344k$4Z?fle9`)kBBUI9bSvUFZeiAfw)$_ zHr&nnHeQjk1p1hB8^JRzU#K|;hQa5bO8+Wf_nia$ewOzfwnMmmH?-*BBH1yIYV<GE z<{v@NjJaR(`xDVSQrbO%_kWS-+4k6<<!2&9V;i$hbG!&f>I7|mLSq{~4vYqg{Sbms z>b_jR9g()ZOntTK5qc(TxQNDSIR|;4$%r_tY-Z95=zl)|jsYIm`P5u!JGe$VKGlEb z$IY6>?^nUe(e1me!li%3eJnT~uets!OQf<{9yag!8T-H9drH9k(Baz)!E`(E+C}Bq z4DGqAeq|Q;2ef@#?BjG!3HITno)UT7Bg4wutAFPs<1y6ndwAL@)X!G8?iA)CuT6Vj z>Pn<%<Uj#k|7y8;&+dn^t$4pux3OjW0^Sajk3S^n!_xmR^GzMNFWFfEO_|Mi&V$~M zc0tDD<27lb)u}hQSi$HDi0jDu;OKCB_quHgUHdz9yrY#9iEiNiePR6SEBUc!`O^MF zV<EQwaPzJk7b$%j3P#z7OLh6cfpJ^bH-_o*?%~%*>Y8O>uBQGL$?pI8fP$I4bqbhv z?SszmtxBC*KeIvGU$usw@oT@dLz7pH6{&18PUf&m_fLViU-<VJs4-d=@atP?zePJ{ zP-upbvFsGrrg4Dx$H5dDvqgfgy<;52zAN6_)wZmMY$uK5BH={ap1gl7H@1W??~r_c zGh?t{h$*1<Q<ghHz{uE2<7HFa#&CP<_4v%;ujBU*=P}sVr?t8`9N)40yu%OU!FQUd z7reNN<121Fs@y!p@0krR6mb{{Mbv%=?h*YG87GoDexvtu$p*~pZ^U)h4|j0bgeTgx z;ujppBl@0<MsNk?@i&V%@G*WSGyc8lg6u$%3lax^Q!f22xo*bFodO@i?+mU}>J5|m zGmyvj7~~c1f#gT{`L#VMkNa7DQQlC)?>R{c(XSiC-|#CwtD(H!r{%}-kiL@c_j<IX z%^G^ogx|!U8BB-x-(ATqsZquz%r{s2j+Nk&H0i6*`o5I<U{as;6de;&mX*gRL>g&} zfv!PB62F?p)fy~ZHGG3@BWvX>u>FB$dsF590x{a3;NxOcm-0P-cY^8y--!MK)kpKG zy#4?reEAAA?B{Kd@Mb-+TNxw6U*zM}c`hIO6W+4p=)PL^d_K6gyA&+jM!LQUy<Qsl z^C4(|q)Oq}qa8|H-QNyC|A#|c7sgTA=X%G>RbZ&cdiGx{|NfoT&pByoxKBw=JpO$H zLyN_NN8>S0-A8>y!cL97niU+%Cp{<bwJMUsF7};9_cIox=PcY`Qde;$J|DN#Q(L!O z8v2{>qv%~s`_wL|y_VjuSwF$+I&~ZEGs3gn$M5H5@r9hdm?x_Cx@lcpJJAWHrq9-k zZF|;3+Y5BeYF`{B(y$;J`Lsu|{%mtvW*4M=7zpF}#^>wew!B&tZtu?E{U^Z-PACjL z7a+<Y?I`WregNXq<m;KGi<Gan&@r#I%lE!W7;O7M@@g>mY!Lcy_+0dREFYWi9x0AX z@aRG)vtxU3hJLq#rB~-`XYYeyH&*G>oW$FQb54k7@MHHCfv<GCQYQ6UX=l#bsA;t@ zNWHC`K08P1jwJP6NPV~r$LyXT*4^Y%tt}aGs16Ep!}N8N_;-Oh2dcocb0-Xp<Nbzz zG+yI5f5-i@zNJ4eYO$&1E5q{aC(3<d?_K<O)#*G_-SP-tcWN1^oco`n%45IfZ9+!p zc}I@XTe2XmXL{(hHHa^<F7kK|3>VKeYMI@o7?;$Sjv5)pC*??KjEC;ogw{4%e-7+_ zOo0C1qVp}L{>X8FH+_v%=av?YbzC4{d&R{#?hl6EWkmXdQqzyT4Ujh9*>uk#btLWk z_6!aq{*+Z*nb1W_Z8doRLv)rJY#T8zxuB(gc+_}iTOrssMYaVb!}LT61a9Him~+Om z(BC-B3CoLJFP?7@pX}55l6YreT1TH*>AI5c4dyo<6Z+%4;WY67gx9AGKbks+SHx`y zy$eN)*Z*Sl@(ib7Uq!Hdad>|G<Hl*?4>ako4T5#JY3)yRpCK5Y*SARZu?1H_?H71_ zGWUgkS7qaUU^I*41>5$5bCL_1N@={Ba^5x$GpTMB^!JL-qY@p|Y2UZ}eY5{^F=jRv z>)!)7QwHbiY&`C28K~@b=<iQ5p2Mk&-HYQ7?>QT}aTy9$>W#QRmQQvG81CUT{*__2 z^z(O)>4VP_%V^oUmb+^>S$V*p)w=$=0E{2dbGJK9oF^8qboOEeullIyeTDfn>T^vG z@#koSZ@2>ERv%RZ%|A3MGFaK_d}_sg(AG3wlQ!?F=y3WQ)(aS(TSXm_e0Oc=uKuOS z_eF>{^U+D*_<R*)U&D{N<<EGXc}GNdeu(qV<Mi|X3&*#nY2teH?3Viiq!0OYpM`BL z<}qy3zFYQk_=qlRym&V9{EOOP{A&8#FQPB|n`k%QoY1qJe(VQo6J|j3a%wLX$4wPv zBAlUqD$mh~0T`fe=ACEV5A%9@p2T}pLg<~T8As32)XDHqaea0^yhxKCiSPUqj$Jdq z9IH#ms2a|8h5lwkT~~jD#P2MyLhzx90xidTwdfzMdk*UJFaUAOb}F>q$MJse{F$D+ zyS@^2W!N>dnRh-0y%!E`T-0EW6R2+Lwz6aQD0-{gP&u)(glo^4FP<6Id~n-xjz`^| zxFvwwujR))`)O=D8E@hJ4yr_33S*s3eIzRPJ+woVH<tQ>l#8mwc9l}rMBd(2&0Nv^ z5Y{_2^e)eE!{P}Xesb0!uFNs33Vq3A!SWzon{5~IyeZ%E*pB)Qn%KRGx!}?GJq%WC z-WI$Uw2vJjV8wUwF)!k)TsAmgEQlmuaSdL30moRdZ^Jgw8{Evv$e2#|S!?L7l7&fp zlD{V|9kC|d-gWhEg|2fr=J)Q_w%g3}MSo*(Q$K8468hcnO9$tUQ6TuU*mtIRSTIS% zW!u@j@pu69Kc*^rvu!A!_ZlBFv+ag<JU?t*+Im+Q%b<F%Zo$_yel#uM*DA}em5=>^ z+MX6o!lHFB>~d^}_6-Z9eTx5*+LGbp=>kpJC34;3j=_6ne1jYp>12tc`>9&Tc8&KJ zB095&_b+N*ww(T*RnVDjm*t(;4aVI}W7;<}!IG`5uc?clci${={Ed@c&~@2%K_BPM z^TTzHmw2Dhwzfu~ZG9Uc_Qr$IauvVt^o8Eb)O#UbS43^+iSihZw0FNEKDSHS4kztA zr3Ml|uL4IsJ<}f!4&rg#MeR<FQ4rH1jEkB^T`pdtZHH=Fb=k0j-}g)p&~dH4O~h@w za3&<^{LNi$GaVo2Ei1uoqVsOdr9M%u$FNnDj&1W^Mr}N`L|mgRtybQ6w0JH?wCy7U zLmq3y7k`0d??w%wPu<FcnwXCJ>7H(0bx4yATF(H-0&zT2zh4G<w~KRvB}eyv%quQv zJxcr@D)mG0z9%|FO4a42^ON=VDxrVQKSz$kC|dNn)C9VpSQ=IcauHJ2zmJdVch87a z=QYudv$GHTH^N6!+vd=3i2SM@_jn6=e`dNxj177N*zY?38r`@BF4_);I{JKY;y<=1 zW04dPeKyiH?_GL7Ky=qjQ_eXEU7N9gF6$~(@b!4~+8q0|$4HNlZEMr{9k>2J`=R#` zzkjj3@HOsB%1iqpBlLGoY#YjZLVs7Ku1lG}Q>atZv~J{MNYoy?uS1hBI6++RYRqWM zK5M=rr>v0rT+c7j%kUKMf#R2F{E1{|%);lB;Gv<<nSHppAIH>;h1Lvl%(eR2_PXdZ zy?-07^i_**$n_7>@iRP0eVPoXtZ@P)bZrLfpY-GKy3l)8Wc+NMA#EHuT13Ce(#Y}& z-D{!gE9wIgP4SzN<tbR7(>*r6k;ZV<d)5j%=S-0MI|VD0sSDCGL|2gCV`E;SK8f%Y z7tp)1xU;N~Q%H4pe5xHQ5q?>kdDj_`y+=HgWcm2Ig2BIsRAZ#~?gh`E=y^Quj4|P{ zuv~-p7x;ajFg9uoS$V)u$6DQPy6GTfCyV<4OIO!|eNS0)K9nsi1j{EYAoJ9@Q2hYk zFT|76KOJg!@plA$_f6#VcHT<kHC7JEr>`Fi4nJKFq#mX5S9U<&Z)-R_wq2G_dQx1& zh|bl)-_xeNr0-+fr{Z~#$sl#f&ggv$;bBw1Q|{-w+IXMPv+KZ+#(<SkcJs(Euj73@ z4~}BSpDn}B-MIoT4!`=J+aUAqT&|AA)XiI>-veYgJ#AH-+`cb)za!&8brxFye6O4a zwfm!=lio$54RlZ8<Cv70*uP{=-@)m{>XGmOwb9OB<?;DI=@jT%w<V0>^A<uw6<rsO z;Y-8y?#prNct`Y$ZJ+Zt!OBPZyhHT<Ip#I_dBk!>k!BwdM#Xb;b=wh*-Y0XW_L^~C zd<=(eo4Oj@Z{hwD%nSp)8zyxq^#$|6)43JOaxuNLbvuW}((2_K_LS)I^?%Ca+D_$t znHoFMMaP`9<@_A^{i}o)rR`q1y|6TglefJ^am~NifcxqrTbHa3Suaq3RB-bKZcLpg z%jXdBTlQ<)2a7Mu$2{2>mSfN2ZMgK@CE@z)z53XWft>(5@ONj!b`^3uv+{DT+0V6= zzA=?6`)<U0l}TkwzReww-P{4jw>zLd^e=r&2lR#hRln20@w2kj`J`XPGqUgBRhs;L z6M5YTp0|jex$2o`5&bt(U7AgY1l*Y4_<bN)NXMyQGWBspjwLASOWI^<aqB8@r0{!v z@A*7#^(WMBWf-Kc{UPkDYU}jl8A4A|=g$~FW+m=x%(G%#gJ|oX)V{AISZo^HhJ6!T zH<Wz#H@saV-uO*;ew(}Lyy;<9JTX?7Q#F0X6WaS}!4F-!{JpJwyLahMO?uC?$hxR? zW6S9aX#7!TF9PGEbWco}I6_k{!l(=ElD4<JjmOw$z&2Rnq3eW|9me=%hZG}g>Q-re z|0dku+?qzEeP9!Q2CVk7lge!t>?h;fc-+=43&HknA;erH;#SxBA?uHY3Z7a=wp`1+ zm$dH$ejj7$wDR6AUayqDim`y<2Jv1`3-3tkvz`gvgS+JGsrQS$(($lWYR@IoB{fLT ze44t|>YuS?d@kcosK{F_=ww;6K&UI7x++|ka5n$!Qfeu$n_)fuj@P|jj4_ZN371ly zo?rNwHT417CevA6=iRUh(zh-a^i|VED(AM;a2RP{&j8;!bUh$`%dgaz)mf*5dsO7O zq~QRMtEETlW8*maT6AoE?2YpMqh+2oYOLPZsjp(OW%=x@BI8yj3=hk0J750XdTzt+ zh`O0a<|{N6H&GjE+Bi|E=k&Xc?)6;#V8P!zU*Su5Tii1fe<)GfS^m`Fcn@pXN!z=t z=yyOYEt~IpNk5)Lw3XhCP_Yz`70WBj*FVmmKV&qd&b&>0Hj1>V)68!lgVfVUmM46& z9P;`H<I50{<3sr#q~=HEvT{0CvUWT3ySn|wxF2RXa$j707WJjEr}2Ba<8-<IMf$mQ z_JOQ(qFbw^pTXy_9N)S8IxNoHDA-f5PmDJW&KhX{iGC+xIdP=GM`RstYN(*=hhPMz zY!l@44<9Ae5qiDUKlzNP`1*f200SQWc@RBZ(w1wZd%3}?9XpvH7+T!WJUA}F(6hos z*8e(9u!(lS$}mk9&)cc9R_f~G^0^@O<7H6SCB|F`JK?wk3cu~m8Q}a3uaoR|BF6{0 z7uN#x$#D~pr?_k%@}`LXlx-(@bA|SrL^RgqDn;+!2l*I-V4$?=wyn_nlYGw_*vaoX z$uINY(G>qB7y8W9p8P+E-$Svod@nCibVBv!x5sj2LfbW)$4TA24O-q?9;OZK(y)Ou zc1p24Gim%(IfutZ@*Lk6hWQ*e?Y+3?3tpzDwn!?A=-*u-o~KD0O0(k+>hc?t<u;qs zv_qGVm4Wi6Z}{^xs!K?t@nCL72Z!gICXc@oUI?wL`~w^<!ur4ZR9w4XS622ra=WRR zL~SvWZaMqp^X;?YF=!aPV?sCsMMK-i)UxXa#CcHDWITHS5~twxRrb;brT@;gYoIAZ zw5RrW`M)U|I7V*&tem!O`tLVpX%8pgQ@t>(_rRT@-?@H3+vf}w+xicT8!eyrr|9l$ zGU7U*bOJpqmW@2}I7&;$#7+EK)1r%1-~HZ}@ECXX(>oBvlW>^78^y{?I%zj_{>I~y z_PTfZHCMk$jK2_V%jeWj<eWH0v15XxPAlvAzu#21qq1WLwr%SNydP$1d&cr>-;vI| zM`8?K)BR3-AKi8mjuY%N_i*}U|03=WtPGN`PnPeOsNMYwJsT1FZWV6uJN+1`^A`Ox zM@+{^PH!ToCr%X)nwCOvAYV$0c+$Sn_6JQb$CW!%@jld<hx;2mK(S(Oni|H1r}qi? zd2jN*DKnp+8=@~st5@K8jXioQ6nuy8Bt11EZrXJLMON(lQz5>Pp0NlPNi9D$Dzr-7 zOn!c23hCL?a6lUi@jJHUL&GDK-o(5M54F2LrMjVVq|ZPyo~z<BS1EeJe~Xkn;jcfP zUyl`;+G~LDpfvS5yk}Hiw-4IJiN42U=5blxxG@39S{$7ZW%)=xu$!L2NL}nCaSuan zfk%%Ez2kqJ&~L&QP1<wUE0FLhmf3oDi6&OrF@>6KL{4=!UVAws<ZF!3d9I3l?~*t5 zU_^Nc&)v$e7gXn%p&#EPnxTA5@2rQ;sr>U9(en4k?1R`FrbG50*v8FE#*`;c$KP3d za{0TN;Ig6V?R$0tc#oYC9w%QZ=FR>L`{$PH#q*q=&Ka*;BaV0KE85>l>S61(W&0;a zl*{sGpQdf^FbAJ=So$N)x80-K7oq@+xp6fV-&Z5;S5{yLS6_YRSjg?hekrY<`bZ+C zHp2TsdUwg!Z0A0Db|YADqc}b-Rr+z8`@h(}2nL(h4e@(RmiK>^PrvFos9Z?nEBk$7 zzmY7%qeU?Ax3Q32jQ2=ZetYvAF#I>N{j)qMAKS5-n@e^3;gkcPZiLjeqAtB}R4KA5 zf5rYI8hp>~k?&ff!O^2}2G%RO5xS(=`f-c@X5OC~?xnVA3C#z=(MuiI(mR!g14|%# zsW`X85=GruOv74yCg`&*(v(?$44&t#B!2C(IBdS)v^KCjhjBfZF9Odk)X(>R)1fH` zVOYK^0>|y!r8Lm8L|RW|SKJ~$SCDpf>O7r3-(+1m9PI5h?(=y<@9O!Ot}8XKQa);p zqEk)+9iP@G>D(aN+&1jv6uu+Kl-1=cGNXd|CHj3e@0P8Ru`ieabqDBrRO?_`!_RTg zTiCBVo)PyF%UR>X@+!W?Xa3$>u-&LJ*|OJ(<EM<5rVG0EN$OZ$(>i{?u#Tbc60d)3 z4#bpG8({fJKKK{8?`eBsm7ojZL23G*Y2Sl~MB3PA==v+T_&^xTkjMMM?2H-EpEg2} z)ARm8p^nH-|G^LaFKvgE^0v_L6=Gb{CQI{HkLIvSpB3Xv86T<3sO0Z`QGKcv&oQAv zY20%Z7d|=w@jr-bH@<5hr%T+?*pCbhm-`16pXA%q=vm%*x{Jd@G?q5`ei?2{m>7C? zc`4X>XF|;5p}YPbdjE;qyXJN%c+MAaY?%C_XdihMYZW@gcO;*{`SQCl=PX{gBaz|A z-VL#%s6EQCx)x*K+5UK=(l__g!8_p4ckyXI?F`p<U(^N8ANjd;bkn()VW&?Vt6;W# zH(trJw5ChDr1dNfo6p-)H6(h%>pv*kE@_LDT0Yl52baD#L(wVW{HaPl5-w`DyRh9R z8mB?t@7Nz^-l4xgvbgp0<aPvqp|MAE$}!-)5&NyOPW?G!u}Qw?SdquKx=`q+zeDtC z1mk~^mX(V#Vf=E)GA{!AWE^*SnpQyBt%YEE7{Gjd5vQYJ@b4kBH)H=pbn5>=`|MD; zQGWjPpGWrrf<w~W$=Yp%MlUu0yn)l3rFEZI1pc{nt+H)Lnvc14D_A|_!SU59P5DGd z{0nklSpWG#Xn96l>-H2rP9``cO>vLLGJna3rvJ)q8qo$vlnA;RpN@VXA@V9dUoGH} zHk3N9IjGwnxaK&>oV5b#u05pCC9GTwWmnR<PhLRt4NRVuqm{S6hvUxrzhiv!yE_y) zIWORQ%8Fd^oK5g@myas1$eshiMe^_SV(PTdHJzt>A?|BFW+AwTo0_-sYd7Jx!`tWl zheST-Qu#QP{gAJW8LPLsm)c8$C2~Jwj@GvY7W+u@6^pcEcK;|b=E*Id1<qk>!FPqc zpU&qD<+hc$ExQf-=9pu&@4kFb@?#P6^+s|0%-9|srPQ|d`dqP6T(2yBcRroZ)}zI9 z0888Q-YP*Klg9qX^2zd*S8suyL!$*e8ErIm6|V-uSoJyb{X&LeDV3b_8N$*#sh!5X z+69$==j}WphL-K!qR(ZZG_&pJ3?K3sBy6U3(vYn^zhwh8L&jzmZEKwhX?Ib(cYaCZ zPxC{CP;g%(RNsWho#jJ$%MbGXiKR<oo{#qhc>l!GvHAF(wGcOTam0S59F+TAgjIK6 zuE1};(F)#67K7<&8cVWr{}=g~OScJfWw`wt+MxK+MI3FG%L?5mXs`Lst8t8M+(B(} z*inrfhD;V)m(h*S3)O#MjD)}JgyPNOIV|@y`J59h<5c~1Md-{yJm>8f;`wMhUBq=B zHE~FNAlUxr`Tf;-CO&8RBmDLp;s5_49k|vYeP@O3wF5BBQV4aQ?TBhDTIb_+?>vFt z%c1@_zFDftpZs<eq-_#o#D+IdDzAHECnRke+WRz+Jhw$#9%|S7G(5ZndQ6NhhltHR z;yFl$;r=*Z=x5v~o5OWoE9sfU7{jlpn1@_pnu-rYeg0!xXm9s}^(cSn{VDYPneE~2 z3dye?w+!6RZwT{dcTI!N5eo(Rte(Ap9|5f;eBapiireKrJ^N4ExGjH*Zk==vzMC^F z@0!Sdl+{ZspZ+Rdzgq1={YBU=Tm5uD5ojb8tv?Ls#x;I2j;Vt4>3sK8@8oC*j3e}J z)QTtMdN%wZulKdlSfY6@z2D5aqeCi#$Qo*D_;rsiUfmP?y6in^HAi1@ofR^2a3A_= zc)Kz`jmzmvc?`9V0qbZEQ{9freK+rb)FpUKT74m(bQqt!3rChGpO0hU>@9RHMg!He zT3ma2e5uoUdqK3NXVGzJAGIRtKJ?Wtf!y2pao3a0wpHJ?QCE)RF1!!2Jl03#v3T3P z)K+U_wa+Uo7RkG=)IQe}8g*K5R&+6onoq0TUAjegETnv)-yN0Khbn#JOCaWwk>$qw zd0fX${N7_5A&xP^bO*HWo?30u#q_N!#%b!Or8lYXx=em=UYCOBDs{~&XxqLO%n#uH zIJU_9LGXr>8fODoU3gEim=C`XaeW8F{V#oGER=pS0}>DDuT#%`bl>egm7h0OfAcSR zPbGEcv$SK7mL<!>Iyf%H`+VZ*7`OW$VmzO4%06zsDoRR}vimmPZiwumq?PB7QSkKm zf}h|!;)<s>a`Z{NtGKcnBUn=dy_*7Inx?MkVr?}>PtsT{<6Z6XSMykx((i!OZK#|O zOMOMo*649%SXy;m^`b9Gn;iMRKKt%z&?Wo*-W#;%+df6aH9cOVJ2zT-M_ZqI^mY!v zq8y;YjPDy+jJOKCHq0-C-eWr;`YG!<+P*$!B8?+0%jEutm8H(-U8`@OYI;--6yn&u z`(iA+?31mKdnL7d&uv4C1=KQv(`cViTjn`Y?(O3yaN|8NIu}f9tXv(!%Ugi&gYzcP zaW#j2;|8^%&%h-#kIJUL$oC(Jj(l3z%~P;Yop<NRaM`p5k6ZKV4z3;1G@OEMrT4ZH zh-(=1CC||{h-k>i@uhf<CvED~{!9_nommTJ8{Qk!Z^E{wrc;;A$1eq6=%2b?R_=Uq zH`pB*x2c!z!LGm4y+Ov;x(UF3(j@S`%FmmOR$W(i9QO0B-01AL_pC!v^##cZ+)n+1 z<15@R&q=h7=+bv`<e05LvkLsLRY7Up)TreX{BUZa=OM0MqhR^^g3#Z$;J6a%wEcF& zz~CLq9rAI>yO%$EXo!ng?fY#5#LQb2b>CZ#!FxXo?0kmW6kGp)kvH5svOH#|OH*HO zesuR1TDqA_^C9NUV>IyzU-4~XpKC7`;~zqQq$$MDfPtn3VZA(?B0nE!d~l_-4{?LG zC)3Baego8gF2<9^kI;UVzC(So3?p3k-7fHi{-u7u3wlETDt7OJr0!kN9{N}M!!9uY zxJ%G2`N9sNj>U&v(;&E-o+sHhl=s|CeOcQ^{rw>Qze}KQ?0uX(*LPFF`=Y+D%JS;t z2Hx2M2?zMSDb9prN437Pa^^GmULfOiaSmAeJWmP4o*_O<(mPLo3|S16&m2FW8w0kz z{zYxy<eM1XzC-XFr(+*!?7*>Ao`L$C?7#AI-0x!>C%h=_yHP%d{$#PgiJvn*KXWb^ z(yd${eO9cycQcKLSXpeoGEaNHy((P77qboD*)%ur3ClHmqmKm;M$g%F?%m%U;B-gr zxmz$U%KtAu!Q~jQ;!S<q4_vS9b7gwCGI;uyrORQUPxKuFmyA;S7_*(fL$}Q=0?*Sc zptxo@l+8aFrpvpApHC#a&4ACLzCLVcGJQy$aprbK9;qYgz<yqS!Ftga5$!-8{@a_B z#2QU3f~ij1mUThrOLAN_EnDtM$K&LjP0tWb&(raA?^r)%U08gS?>&IWk<_QRmw+Yo zJxJ2zj>E=I`1GXmf_{wKa*w!Y5?Q`yBhMY7Md`rwMopbE>hx{7|MhX@?%A|Y)lXDG zrG2a>9xIp4r;MM=@eDA3+s4ujdmXPa^Up_>_uPZ?T>D`b8k%^l{%`h%et(tPhYZ%e zUHl%P&8~mfAj4tn9OsvC<G{9|e18c)PU`mmRoVa3B1qpCeH?E+G<fbi=UNDk$Opse z*x$zQ=Fhi!`XxWLF5LI}f77+7rnlxV0<Teg7Ns?YkL_D;)gMPSE-F{=(T<5^^wHKO z%?tgm*Eaoiq=jXBGP?L6vnU|gO=7|!u;+?CUQ3p`KK<(@5Fd);+&^MpQ-AYlL57+~ zU5@QJynd^3NICTi`kf}JW7EWc({Tt)Sfi<L?mzhbiN%oRtK)WtvGShFh19d<xDA_f z!!!-W;@_~!Fx7R*3toZlWi{Z7@O~D;*S&1D(7(W`)5CTBw`_octF`xMf`QVWKSI7v z^>N%O+MT_48k9ZA?-fbct_t&7RDaLJ!u2ktYcc2MEn#}&DtxB$Oc3X@<v~#&77yj! zq2~%nUFIZuzn=6-$d8XJf|j!|Ztdtp3LT+GsU?M;aY()M0(#DC7(S-F_)Ph|KvK(i zDQ4XH`geDp$C-GV2o0tF6GVSTn)5W?%}Uyff%0}{Zh+iR<uV98NxKH$BdL@>qTdsf zI^V>6uAd24(0L>@(WI$Q(K9bg@5!j)@Yyz$Pxn#Zks3?;siuomuHHm(2yJW2;qRjZ zOX>IP1P`SxtLKFKV?H<*@=8PJ|JCEc7@?0We>8dX^3XehpX7a4?D=>N%J^+h<2|iy zGxY`CPvaP}wm<UShYXX{WnA0{fww6xsb^F7*Bf-_n5EUr2XhZbjnf)>hM&WFi??I0 zO;reN3jMA680_m&lf}>&#&UEV2&X-M?Xf0M#{cm5A*5a}wXa>y>#Ro{YBPV#$Ez~( zg8%YkmVVT5T^Yedyq}bo^4RrlJ0aD9>nhrCoF|hPO<nK~Y%h7q`s>f}H~qM=zKGr{ z#;n8fV$w(2`$pf>c;AUe$7pEcZ^e6knfu7?J7X_DPcr$IBK^HZ#-mqP|E;#nfo}0T zin19UV7|OV*M72AVE?Bl7qum}t_Oel0s+fBbp%(J)4yIR_ujS`9Lwdt#&jP2p3$rN zyK8s<J_Q5GZu$eSW0Xf9^E$py8OLM2;(y}LJ`LmW9tIgB%e&fEK(J;bhl{Y%m&@Y? z)P_F(`{jP2>pr~hFjeILW53-GmG@4E`l7W^SuVG~Z1-+XKjY&o!B~yuv>m|bEVZPD z@AfM^J;z)NDJSTkf7Se`?7n|o7^8n-E@bbbHe2VR*v*MEq5GEkiYyk#H(LAbN9Z#C zfxpv4<@gsVZkJd5+f%}$m6jc|RH_G|_YZe*?M+{YeoWds^mC$nb`gg|@S{z8ZsqNi z<*U4dzjH8}Rr?=Htdp-@xI@q}=qto^X-lDd&1&cx{QXh8J@i~c=${T;)J^^0T@3w? z)BZW%Zj|CSyo-HqG{8M~(YxZ#bbJPI`*_@pjnk!aWcUs@Zzu8RFHv~S7lz&yaHi-p zWjJh|?YevggRLKG-g3)o1;=LFr{rZgt#yZC8)uYAG2PvAe=L)m;F0^rzJ>D??24}_ zP3m*v`AmkZu5)}m1-ieZv4OhXyFv896;3|hQS+d(sc|u62gfS9%4kqsy;;Mi#*c}} ztHy-=Q={kUT_Di97UD7VzD(o3o~;^ox(1JZ@Y<pKwz^*4?*^;^MVHn$X&&`2^`w<b z8!A`K8^x7TozFS}Dxc=#!|EhFuHNHjKt_%H?mPXyH3AmGlYN>d9S3p09fGDE`0gNk zzS!^hXXw3x48zjb0cmq;1eulJ;(Ot&$EdwHbEtnC_OU37#V^jH`x{$dc3Bs6z0RLK zQ^$`J<g+}oyz?MkXR`Ki-E7`Y3}0YhZ#d%>sK14-SuOsIXT|l~nYkMZ-k7MXZ|mPm zG}}AJ@OK-ICEEVeY}pCsM&946b&dOdF(=DDLw*KxI3@GtrgeRTzj4;}JB?RaS&3`3 z`{dZc?<<I}>F525UJa{vDtQ)Do$pD-<DET69QW+o$CP)5>J$1fZr;3O%e_JQK9Tw% z_Jxj}`QV*0=*t|1iVpRcF?Ot0Vz3-A@it1xGACoZ=^GgtgYXPnMP-}c$9~LwmG-=w z+US~7Fqlls;O|ECygLsZ2^c4L_O*~P^-#EvuDH37GLMg^2z$eT_&iL?uhb3*9h<uT zeGr-^AA;&LX)IjdjL#DF33HTjWqH*3zD*mWqEqv!%bx8kp!K8iVXWY!MUePt^zl?q zk@mRe{ic2HZnx8ZtMwse>udbFR_d=>1$l9iV~p$%4nfYT;=bOLgy)ptq12nJJ(dM; zh--)CjW(Y%LVmASakAK#z_H_wcy6mV)AMgMI-27f!B~R#;q0oxH9p9gHVgaAx<&l{ ztHw?H55GU4_U6+uubP&W+r9FAjkFIX^=%OCG4Hl@(y?s%^B6EsD+G6qe4LDDKNjXI ztE2C8E||GbiZv7+39Y-B`jhxmYarv%sv%)J|D}KT-8o{Bg6H3JK*?A9hweLxhw*(V z(VtBRPNU~4RNpssts)PVy+zBw(Y=bRbAOu8l@Z<l^(VVcjNO_VcY^KAgSxs@j9;zW z&gyO2F&fg!d7qKphkbhDNV<M9Gqo{e-w^##;-4tJJGm&LKJB-xiAY2AuI?VGNo#%y z?_~uG@IIHeL>t$5K8_(RecJjZUM2R8=pjohr|@>}4e;yPY~}ag>bu474%N6G5ceO) zope1S`qp!KToxmJ9`+3}ewTFI%td&<y^BM-@5%@JYj`}`mhs;K#~a1Hh?Qd-LDwo< zPx8s5tWx=;{YcZywb)*JN3Dmlj-`<L#tu$i*PS@_awg)nU18$wUM)WudfrT3$Clf? zZBQTI1?jc={bqTFny<9s@41G;SG<Ma52NMvUA3R<uj_pN+^fd1-MyHjXWM&c(sdX7 zm)v(+4vBWnV&t7ZN)sQ^RbIbAX*Zrl;}u&Ywr3Vgov+Q;_n~TfRE`bm$H|DMe~b1y zMD6S+>xT|Sf3`kS-d;ZLu=pb3HmuOL<JOgt&)YdZejkk_Pu6ZM#OJH}5%Tkwny2g% z{_JTO->8gD-TG}xUd@Nf-Hv5Y_Abw_&|N&A<L&)b9(O79IvM|Lx!*-B)nmsha@wkv zD0vpHzKh?3GVeJKjFVR?w5eM}ziL?%`8x<Cqh;}E1t)eIT|=yVbw2r08mo~u-%HeY z1jk{&nszo`FYSYW4`)vo?<UeMcnuW%c^tT>i?{?on$-CIX-Z!Ry+QIEtj(Sqrt{qs z*<L%}*N^v8O88ik$nD!VBP^q3lh|iMgHmJqO6Z)9^~kzH#A-Q%+B4ycpS@7%Cu!44 z;q3`S=F!4Z*XR8~ZP;`Jw$;=d@Ev{py|gWFl@;u(<l|w#6pxo0TU~bCM#rN$^iIRz zJ#-I1wB|bsBla_KmVO+AaQy#W2CZjzNwM-;#Px=FB7F=GEC<^n4Sy4fS=H|C6ypMW zDDF{_2}OI7Xk&!P@u1i*_$&3pzMoe^!*c;}_w!>;_zx#-?K}X+6LEYR4Zm?E^?Pc1 z=M8vWlX~C&?cwooj$9;+OYXO!@11`U$IJFC?`sj3c^3a2q5CvGzAC*M`_1l(?ND%# zf1cX&GtWzO8){m8#Z;jWYK-jX`FN>zKJGuEYkRW;il2#YUqC#bZTL>hr+R-O!DG{w zn{ljcE8%4(KP$!!Ip5;F)a4h)+WEpLD83(`q5KK*^;h<FKBO^gGcX+6XyVg2e({c8 zEgh@62E5m>dZT=qaf?Fl`~=6XzM?{<j-|IvUMj6;X=M4j9T->L*6_Nxj#-+XLTp>D ze?Nnhn|<uHkavI|zuvk-VVcBtejTuQDDUc=&SBM$qh)h`J|vIe{XksN7KJ|HMEUnt zY8mRXYch@njN|aWK-$e?Hz?So4yBzNshq6aIv{62v?D~9{?ZzSzv5xskDeTHT_f7W z&$Q!P=WSIAj?b!1hj51SssD`5QOk8>!Imq=6Sa@=>lWcBwqhNcuAp<n$-QZTqHnKP zv?0sjJ4}4z=O}a>|6n23zXw|WiO071JN>%|$6Rdt{)04TWHFtm)BEeDl4HPceGCja zygy*+qseEF@6gpBVf4)&8Ih)P6OKs@=k8NzW8F)Xyp}GxcZ;^v@-6Sv&A;MtDZUZM zCh;!*yX60ex%YvKve^E|HP>8&YBNkC%*`;-=t>EONw((ZU6YKwSY%kMtz9f`l0lGR zZg#w`wHX;)xwhF_SXh*sVNsE7Uc7BZNkmD+wavDqBrg#p8QE`Vhk0h^ndf<S(eCH_ zdtNV{f9Jf<nVB<Z&djsys$ri<J#12rqX=f~QEbmGXC0LKSo7KjDNpFs($WU(`_<Y> zeRPg9EN1*i)CO7}!FM#>m-U3@BQge(#!SX{JOkk=_?-7iYP`08sK+TC9~=(bpSq8Z zK>CApK9HQ8qC?P9p^RHSl-?!8ub_TTO}~NGC${X9bWTzDjWjL1hFE_78pG^464sx> zpF<oIcx=PNv%#=7vN@_Bf!9Up`{Eg?>TJ9(=C7f9N#c!k4AP$5E{zA#x8cL15SaQR zxUUrV1j`<ZgXl{Kr%L>}H(^}ecAet)N)mjMMk{<TDru9a`Z#5Kk<*c~Uq4UMi`0=c z;1loQs#BExV)m(&Hqif@lmy3qy7Jwa>E<42&YB&P-!X;aI^T#|6Tblag^Zu(Lg4wM zsyZSWFkgFbLNvM;`TJ^A*ZTsGTlos_yAe(M#UnLkBbrE_?)gz`GFH2wJ@^kEbU~$q zU$e=1q76lYTlUcbPQQ|MJZ|Sm-VS3wqVE8;@VyGZ7f$G1!M}wpyN+Lnq^<I%;5w<= z4h3DjUZmY0wNui!^8nt5NE=Gw;nm=~8`t}%Y=ng84~6KfbHw$>^5vY4aoa!V?+V~7 z<#^Zm0>))Aihoz0>*lCdNoPcFABxLa_bdq2yH{Y_Dp^Hk*^6mxRym4)mr!;#EnE73 zm$W{sNRnZ`FG<P|y1$U-iL!rQ&eeHM;<?>EMA@D^uWaRb2_&2PN78ekV=bMd_N!?O z$I>h1)9#@CC+&{Dbs^dLmj^%35Z|vy_eRL>Z4h+wO>hcz1V<}P_--xO&g|lN8*jq% z#PT`*;exuqtOC!c+Up_tA>Kdcp2e40OnKhCo7Y3$u2!zM9p&^_ql>gYY4`9DUdP!u zzGC?*cJ9%X<+yw@M88Al()ad@VBOvd**9&H_`1iAkn$|HQoi(a-Y%0j?131Us2AZ) zYA@%oV-5WJCUk6Cc^zF#Y`r|+Y>48pQG4t|^xdiFZFRlmSl;oxOyk;N0=Aq-tz2E8 zeb=7f&5t3$X)dDk)M3E!Vg0zFk{(GTnxP^1579fLn<4Ma;5*6~T=xA3uT6qQQvcP; z_TKQ;SP2)=b~f>4!jDqN<+DSy72hogrLOD5J2#d-l6>!YI=(H3FfQTCD%b?k&hY-j zdN+<S2%lD(wio*e-}(GF={Lu5F`VCs$E)*-W8C;4Y~K^wYfVXho}JkX5QdTVE5Biv zAVUdbAa#~s=(r+2%Y*wuGD>{ALut(^ygrD=kcQ*0^!s}v(kIciNuu*x@ctHa4(}@~ zCe8+H&TJ^1hVSn(E~ontl8K(g!6U$!q_98YX2t(K%a=&934t|>|6E2^VeoIkik1m< zgx-J0IMp^nlk+I{ThVXOa~f%rr}59y@sPK%<x*G?l3PCo-;vgzN#h7>%rdAMNz1u0 zG|yt>ILC+8ou&UH@>SL1+#%e${K=rdQ}pM?YeXAsiP^#FU2v|rmKuLr0gdA~aCAsc z^BsqTI#loQ@M{;<DLwUHj0NA<{JK}7lh?)GD8^-Sn&U0ID{!9@ii*Jfr{#+ML)h-% z@7&8}RFBLP>f|($mfapIJNDtB9IiQwKYKWK9O2rDjEoQIS)p+uwsF!%QtyB0ItpxA zE8s*oigO%)ig=#OnXm^EmPhXQk$lS#?E8o=k)-A!Cv*D(%L5lhh4k;$4ICHYMEk~a z{r7&4=eTSc#q%|<1NTdNq2Ud@9(=Ojnq>8n=WV$|IQ-a~@YvU1+#0Hnd3j*tC&!nU z`);RmD{nJ(9_4f)?YWCrLGR_k&pZB2yfY^>@-*cJaepd_qGugB{qdGNCNyw5`(|k0 zPbG~D{@u$MYQF{Dn7;XwITDWXCOq~?r;>3aq<SqKtzXi4wE7o>czm_W{WT6(-bc&) zR4*l2h65PaoL>aGG1T8xU)>6I!QVKje6T1axBEyJr?dWRjGO(bcC5?FY`&A)i7%7R zdxLHZhuxMj9IE|d{KaAoB=4U`{iW|@9@nrW3VbK^?+uGKb9yMrsGL3xYHRs(wEZ$X zMl8K)=qAX$i>_z3jpSo<usq}2{Cj264tFf&^htPzzBeN@C{50d3ej1IVjFPZAnvU! zed*uvTy{*|0;aLp$5;G)8z&3VC#GWkl6KN}P^A~9N_6!Luze?AH7Zo6TgTf7E7MlN zpBXCd+bZF(be%_({RK-S&sSW<?<Z|PDeqIRm$0q-Pgh<;a$Hody^D`6S(=)w%EA1^ zYQ=uAbSR&!vM<W%{+H#-7;Gm<MqBRzL2uu(g^>Ac61dh6><${?72HeLHY&4E@?G@4 zzU5uf*7J{v`#j>WyNmjxmOtZp=zbW-#p!jC-MzDVgv+-)g6%jQ-SM_V{%X+2X#2~~ za_Xxhk<<HD_;*uUIM(@CAL|czZOCbJC-J_HZMRJ?7i<W%+wNWq4af0!p9DMaYtfHb zXDt_G8CM>H*cmdvH4@vB?}>h&PC!pE^;d}US;&@irwjVA?QFjE`ZuBbI6r5`;>h!k z>^Gt9P^+Lv)?t2sMSR`y^Pq8Jk3gIJgt$JFZlU}!AM$%r@lW(KWO99a|4VJ%eNY^~ zghgAx`HAwHOFMEsbiN>)+kOGro*9DPa@ktt>=%`B2mQ7ogsVG8*{8S5enUb_hFV)< zYxo#LjaRF_?<{dGLLHqO{qV7&zQyE>P#rtVf5f$(+ov5%Af3D$>Aq4nsS6zE{jqCL ztKW)k(UYV;R*q)km1_=3^(>$Lz!Js!`ZuRR-Ae3Vv!}I!engxiUEQ_HxI~6^Dvos$ zKHZ_nkLUu;$3ktUqw4!8!5c_gP$I@cj(5eqUkx*%myfMjy3)aT?OJEy^DAnD%TH`S zLKwRLU|U7`-u~alaha5HGwnmcy?P^5T%oQf!XZ!XS{y%Q*5ZBEQKN3FF>5xe&KJV- zF5IQsuK$bjJ9DDPiKebj>RSmG45jBqQYTN%|K-<z?q)pJ3GFmSLp=V&_>Q1uhqy-& z%<NL0CsbcRZGq6q)0EeDO5<jnvI45+^D(yfF$G*X2vatEO#M%b>^s)nFBD3$7#1Px zJ*s^sXq<u9Ct@_M<oDPLqq1#UKNss;eEUNBq%?)MkCL6bHC2nTPtKS^^()v%_dj#n z0%$xoETTRNoz|#G-me@FYOsWDvNcAwM#BQB5VTlY!FvjSZ|-4!i_{jyw;>qM^D8vR zE_*ih$MvPFHE9uEO+KBc#^pmX{ihqidu+NUZ(S$0hf1sZ7{z?a-^U_(<f*>$v^7;r z>AO!-kJ1V=Jx8(i@_hF_+Uw36;k%l=G;HGpKc|@DCT_rfg|r=S>U|H}r~5WMKgp-; z0pBR6FvgCT=Yrw%a-lv_xt1ltePWI{evUo7ul3%b90Qp24U+8S+ZIXrNag3>sEn({ zZ!A-ZZ~K{iqr^S0^QtI_J$X`C{gN&^DA82C-Uan;>=zBcD35VcHSa5ZvEgOJ*L8(t zbll>C-g{Spamo(JsiEso-goDRyuHcW2U6Cn{7pycx4aFMT!wW-*v|RbA2)nVY0C7& zrE$`dU-L?TjPa>@|K$AnQ|R7r`0Xesr}Em=P`TjM4P3n(1C`4j+7y;XiEkiv6}z?l z-axRFXltwILQ=|3p&$PF{k~U;={V~;hYW%Ccz&<VdZ`?Iu7UZqws*8Y?-(-zpWD2( z>i%A-3!NR)q2n8IER<-&)ftQSLdT2ig>enXN7_plY>{}AUO6J=Nqc?M7Vtf@L#QY1 z@-%ih9t%ef#g)^jl@kLa6y^9Uw@dZ;n^uJKiM=@9Qo};^ffxBTM`&Z`(0DKAf;kel zWk@rWwDaqrWIta<7#Z6!ZjzC)k1Km593sd43XL)HZy&zKd<!iT8vA+6q2S;siMR8L zHzDDC2KVPUsg3ZEG)=Gkp22*S?q!6QO^ffOemL{MR4}Zf=Qu*=^ec~@x&M2Y6Dri> zAA&*Bmj2IlcRaI8>Wja1Dp(uwd7IFo)P5uO*BSL<jKI>d`RJ__7u6e@c-;2>-+Bn# zLg&5Yrp=Nr1S|PG(ar<AseKSSc^Yq{xJh2R@5<@Il>>|S2s$C2zSrnGI8-+De;;GR zrTFtHs7~u~-nIt}zXjtXmB)T1eQ(5)*fvGpm$u9e9Dd*Y-CWt9zl<*rqveJ(W<&f3 z{rfAUK*Pt%Hjp!AQwXaxnZ~OOn_{-{`tlG@?Crc>ip0lJX*z2K*FPl)$5j6Pw8>Hw zmZ$j_@t&8(t`FX=vt>4)d(K?dHbfVjM#r!CVwHD0zpC$36-Lp|SQa0G((|Z)VfA72 z%{zH}VcTlY!?=3pGkB=I@<-~Y%(XN|&)mX~D~okJdDA`0=QD!U@jm}I4((sB4vll4 zXT0KgTh^-2k#1rt$5Z?azmK%P7PqGO?Um4e10ECK`RgTmb2N=FiEi>VyArSAm}e<& zMw#-ulJgFv+!qtsdp=j}NJ)Q$pEGj{G#gsEx^Qwk9;5Mq@eMo|w)uE1`JY$b6T@Mu zwL6}s>(4QWVn;_&9T0D2iSqhkaotPCL3bgY2h!#}P4olZzlpH|qK_@xsX10<jdV}2 zPbt@=%{?PewcYm~f7eHJMQQr7jjDVsT}1`&f1=;mtH>8Pla6J|wPGxtcE|8F1&w%~ z{Yi0aDs|dtw$g2QU09n6A!f;JsJrHvqFh#2k_WpO7t{pfqria|!F4hpAEb=o?KUt! z==(e)pkXaOU$$RI=K|sPPNLr>mvSHP6N+~Rf8*uejSzc?o=u5Pg9eY2^lwfL+RxTl z=`(Nsa_SFEUo=DaowSYcLrG-wMd(qQMgAT#k&l0R-=Q&qGbRsGI@N8=@G#ZQx>@`0 zKRW+KagqGySn+p+P(6C|k6>KubJ%XG?o&7m7=ml+r;EYVP1i5x4*!4WXLMco%ye(j zeY*wvmL!GdBB2J~CCJgzr{qEBQ<Puc9&hLSDQ_<sA-ns0kJ>|e*SwJIx=iJDRQe;H zXY*3t7ujy37)V~?x#J~!lFQHjOvJ8m?gZ}?YJ+kfQg&FJ0&aTxD4~wfXTP8v?~-<T zs=tQLMddW=Cmea$Mh$=G*KS4BBIx^u-rwt<jLa6i*HIp%LzxV>?hCpP$aOr?a_q;9 z&v1nwbGbb8V61!Z84arAj(B1p$962|M`imIzW+)z;p&W+(*4VQ6SnC(BVIEN&D2h+ zDt2k=8BUH?d&6HN_xox%eNPXC%y%M-ZPYO2^|lB2^(b#Yk#bV-dzov_ZHC_d@7#39 zEf0-v=Gy?q2XI~s-+QnJN)~GG7YYAe8^Wx7hsNVtn7OUN-*UYzxNr48X~|uoe99Uz zer+~xkmx*@W4h$?g0}kT0!YcFzR?|5DA6VUeP}2jYtIX%4%h*?C*ku!?iX~dD_|xV zUJrjxBYG;ORk}rB@rrw_5^cD;j8B8#TlpjPf!<cCYdGHHX^&2)dsh0InNWJ&ZqN<E zXBRcR`mJ=oGCo4*%X;=QY5Wmy^1s!;Z^M|SY<Gt3%5zbZg6CaLr{k$NK8$s!`D(YM zcS|~R&lU!>)3P(fXPTh=&c<?(;<8XJ4$;3EY}CicGT&=%=pHG>bqK>Wjvr%!TeE4q z)CbF{PN@8qUxzg%L!@@X<JdyiAF8wd&SM+vslP_;RV~_ffoQZI&yx*;4v4<{7~Qv7 z{>D1`Ud8eue(%-%3$-_vHm(2rOV~QoS=*qxfbS#Qu9olo6CX3E(Y1V{Jnw4sd6!UJ z^AG&|5FXD})Xv>?+rjkKcJK%P*>`OR<J;T88~kVW2Iu;n?cfgnGwr7HjxZds9`bHI zRdJk&46QVJF^@-R%WgTUh?%k<$MB|;@LEdy3+<yWiN-{oH{-c9ABcQ?5!onp3`&JG zV=B~Nyf>tW%Zl|$d=SU^oproz1u7Q^`bNJ(^|8IzB($^g)bhFOg8Pob<N0-oRA1kB zJ=pDdUvi#H*ImV6Z0C8#A>i&)#*stEev9p)d-E^}zpRVzE8>Y6kME~^m*900J?}X7 z4F?`uqC@_o;NS8t-UQCaosw+QhEm(-c+V$wr3+gX=}0@9+Fzu5HL1@yXB#B^EqF!? zKK8)AP-^vQ#~p;Xri?#3qx#-)UC?)W@bep^`E}aaBGM8Zt<)dfAGO+*+Vsl~hvl)) z6~}^L8B3M@1Zh9s)Tmn)Rxe8hbKf%s$0Yg^evUmKhd)2r6n;yZ)jM{>rm(sY`us0e zL`;i#DwojnA;Dl%Uy^n^p*0>0KVF2^dRDorj+Lt;TlWNuO_Q(X_hYuL?1fXI;w<c6 z(yvyKu}s;<GWX35>FT|8A*A`SFL%{!0OR6$ihW3U7_U!OcE?2{LbSDy^7lfBCUFUU zpU`*4C`C*bODXT~!+XB(3hD!u=o(W3A^gPa6z+Z$7^*Ld>`dD`72_&E4DwXaSY4?- zk~-gCu+K)cS@ZEenGO6{#$OfOUv9#Cr*9dKznw+frSYtLP5FHtk?%;SW8%M=#-FxV zHb@wRRw;G<D;3}}G5)iEr)*aUBlC<n9{WvgUr}aKA7_MTko`Sm@(1evI3;x!c(Q2x zi1^tj^MUD-Zg4<*KPYV<D$%kSB;Qw<1o{8QdrZfN>SrF$OGi|3n*T)4VFZ^=OUtzV zRMPYOnm1fT|9*hQi6n1$8~}df{d^>Rwrl7ahNagXqGQe0qkQ`hG(KY6%=hxX!tpX) zBO$(H*cL1PF&FAedsN32(RQw)e$zB{xh8GzU+JFbUv^BBw(4ZOM!m-xBs!B(8=v&C z{iG&|ht#3e_dAu()(<pa)u(QUELKMFb4RG0dw!RqKE|=jp?E#-ix9nOJ>O63xKu@c zL@R&XC)2&O>`L*ysy%?QTTU$xVHP|R2i8G!T-tuY>(%hq#ZXy5eYpN3-bRSrh8a<u zZaPPB4=d~U4F`jMHTYDo-VsWxQddIhdmA`<f+J6(e^4J|Pdmny^F&h48IJd4-`QJu zJr0N0E4TGx=vcES#FzMa6Zp@<W68?Z$IEcpMkeq4^2{~5_4pjq{ow*h7uOd}p}gw~ z^>xj_45~PSeVb*BI6pP_;62QKAGHa>+x-Kce^N%N`HGE_9&A0zTSxIeP~M(-cm}j* z?3DN`o}+iT_CJfb?wOJGPcDa)-Oq|=UB_f+NPhe8+PV@9>$%GDZow|>(-KY|xSuB2 zD9yXQM;Z_ByM<Do&{X~t@7b2Y{Ql#P!nElZP@mt>>x9hRc@l>25%FH9H<6yf^?kSx z?znLh50Oh!&rcMO)Uj#vdgc2dmL}4C?8(C=J=&h#2bmA#LGH|bP<a{ESqV$GRE&#~ zie<4$##RYij!}OH|8B1KaYN|NFaOG8(0hdUkJfZ;o3s|wIn?EeddX#nD<{4^ThP0B z%2A;%gmdn0p}y|4Vc>j=`e;_3`G<u7fw5pW<F#KrV{?eV<BcN%4$Ft~)|H~akkdr} z6|d>e)5LWsr$yzYahpPN6HdqeH+jDcY8GQ(r$pawptx<{><X)M?9JMCL}aAhjC~?0 zqqJq1=%3j3aQV_F@*w$9>`U^l$K$NT<4WMylh20tT0|RjS`=iwbBya}b_4y~Q|7## z5EHWxa);7b)^w8gJhi3Afkj8pCPb&oD*kSX)U#>EJJ^@9bpy#K+o%stxKjP>;oH9o ziigjHhEvM9zPp@wtZMd*km{|c7fJboGU}VF$I>xDI$AHq<5D|y4*2%bebJDo5I1~+ z*F*0C_3t%8n1NTrj~SvvPwBI?@2Kp%W~rpN_Z8|xP@CG*F=}Lp$GTVjoTbKlJoWa+ zc-uo5fsVCMeG0C(>>nldArgH1LNPXqgm0iU8NJvqTK8#>Yu0dTFIqCZV~<AE&%~4B zB)Wnp#!7iLY-d`RDox(X@rrFFIpQ9#grB^c-^Y|_*gEIsc>gSZ1IGq+6GuU!4g1B0 zZwI#SZI`OAZC0i{U-J=Ovk9;A`*VmcZ5%k$MckUdY=QJ!r-5%Ky^qO>?}9Y%N-(X{ z_Jyo`T{`yn_ECk<eP(#OFqL9I?U}Mbn5T?G%4cj=9?Dl_(e-1PjcqLNOWen_sUj}o zDZO$#n422}nWzmt?!n?1;THP8br8L)u%_|*52XtJ-p?n^U<#gR;?Ldz8Dq9dGONDA zagOI~>cdz*rM&)1S$x({lzRwcp`vkqYDh*}e0bbIVPxw-Ntc1tCDhRSRK!;~U)?q` zM$tZI2fwHv(I-_OgZwlVU7x}03(;vk_M}t6b{jx$YyUYlK+oogFX0=04y)c&_8nR> z!nMVJuuq!*gpYT?AWtC}9>?!JJ@+1z+LUl|En>W(L>Eb2)-U1hyX~ggf<Cr*{!T(J ztL)bRIEJhb@wNS=GGB5gS=k@_?5C_sv6wq_Qbcr$%nFr;gLG~bng_MT(S5uv%y-b0 zUNsD|Zoqb?gvHjm#?yG5t&cPxIGKKy2=O%QY1uK1=C$zh`mo<rqwyZWv0_alf96dt z5pA~R`6GYGyqMoCf~w?=5n-8`@Agyc1FEn770*dR3dYszwbxYsH!C8NuO-tvo8C1b zx{9mly{??kZKO7a+H5ZkSC#Mj6ZMnb<CXWa%Kg}X%H>2__T31I^6P`&p&5NU-;cz# zc;7+Tx^r;c)HrspBEOdW=(H&4yh(Z7TlQdkHjLW~8N<TcS@T9b&#tGjkJXZk+S<=( z0>ddsAmbN&&S<$0#~{|{Y0MpcT^_g(9uC_tcYTjU<E)`;JnePtAH(V5-4Wa$2JrY# z9vz~ue}TpV17HtJ+W8rO7DNn*@6fv9vw1rY3#dZie{Kk*ojU^@jr{)1k{goa6vxJR zy$>9n2c)(HOL-`-OI98e_)xi?$jZ7*+yhA)Nexxv8tE;aBk9oSruVf~kJ3HS{KIC6 zhG4O2-xXUl+gaM!{lV{|ctrHYEDf8tw{4KH^;^WVd*`q&sMGOdY`llsV|?Xsh<TR! z9~K+s^IPXh_@vGE`%-8h-WB{kfqg<-{EW!^O7KwXn;B+*vo7akISsfEdec0xpE?ej z%amhe+l-kIui{gY+}``gbGWE(ppVPj6vC){qe#N)o3;qL%Xdm;IcCCwJ;C47;BB(y zL3MgLe<bDF;NOv3YsNwPg?m)>(89^_3<dA{EfD<y)hpv>C*(hId~-}>>6q`r(I;#B z-}JY43%a|1F68QRrs7z(&C2WzmmG$KYw_A`@8}BA`@YbQ5r}^Bw7T*TCr{q)o{jey zRNs5!R)MzjR(^j)ba@*mLj7|*uJ6Hh0&i9+wd<Di*Fr`PUaK%-lR%4b(PO%SA0Jeg zSBK*zlvjKF`QxBAW`im&;j24(7<@~6z&BW&8$zR$<{waB<E3ly+0R>}ZL1v>;m;Hu zXAYD4;6Eey-PAuHmC8zbwXf#&vfL$(t+|k{ZG_Rcm(FR$dpI^x!X|b32h@Emq6sX- z{qF6h_cnz0k4UQ?Sip^e|4C{im2b@i|1ITUil%j}O#3s-pkg>3Q`BZTRkT%>M=js@ zNM1+}eVoYOIa&EVjT)9#z3c3qQh)7_E|>CJJfzKW4vqt=|A}KpQm>X8@9h!rW3CZx zNQu8;4R3qaQ;MMbLeU0X&tqT4VpRP{l*_gsZ$92H;=2Dy$Mbk`3-&LR#;N!j>N62u z?nrUncP=gu(VP0T=dbO<h7g@$)`{CsR`7S}(u>6Yvwe;^ZAVC6;*|s2Pio5P-r#Q% zeNx+HxW7o2FR4iyD^~VE^7%6-LsjsMGY}p^>-dJZOHx0OG$CJ%rwM<_D-rzu%1w0M z^G?J2gMKa@^O!?;z74Z*oB!_J;QeA*sK4D=lcBf&@3V<a*9z^iNP7=s_g)~{BEe8g zD?jAV0M0Q-LV8qRHL&*%1m99S1iYqNaP8%B)6c`W6-gtdd5wOp3o1_9C6zOqT%f-{ zPAU^jlG<)OrrJhmB1toc;lDXEYz=;1FMi-_50)sr*C2vVIszW|3PnAwmlksMw$Jc- zB&<ql)@$^<M%vAbaZKcTorxQRjfQ`$0R4}tkQ1jJYZxw>&FMjK<!O?O?){G8;=aey z=Z{s6sjP$W-{}`jjDqOVgV*%t@G(d9N5d6$>9{y5RIk58{jQ>Z0)O5#FHeHTQhx20 zy29IxY1Lk+PuG~!U`OH9;BS1+qW25N>?mj+wgXbW?*i)`^lpV66L}tPr!u<FsfDZs z{O1}{l2b!{*3D7A6R0pP<;E)QbiAhIa+J#LNBB6X?itaKvwZ2F(tR$P`Q2ugrgJ); zqugira(dPKXpA{%GPU{4*YI79WsJDy?El>h`Z04LdO5?(2(w!ka59)C)ojc?{5eI9 zu;hnP5n(5-5aSzynN-BTyCL<Fq-FQ1<I4G~7OsT+Q)o<;+!a|L<v48Fdr<rH5ro$M zDc+-8JqCa=<#f#cH3ZBbTn{P3w?N*IO|+gc22<U7I)6sX4)D#O{-iw@?*aBhG|pgH zBhJG6%Iii8z}tdjFgZ>Bf}M)}kkg@ZOZQ4Bem-uEf6;PizIRbXd^sMvz7U4*0_x{0 z3N}j^Iq#2v`p=4_GNP3~?XzY}?XfF|N_jb5xN_q^w?cEG^8Bgs*3I1pRWHvA$#jo9 z1bxBJD_B0917!tqp}P7<@SMbsUaP2=?<n<&tc<?QZ4$kHJht(`N!LTmQ+RCr!S5}x z3<EHCVxLk_N&iN|w1vj&EM{>N?>|YKciM{Jo=wL*@$)0lvN7^CNpRHCssiObEdA95 zkZ}t2JyrSYGTUb2@l=(OHw1K3@K{&AM%P;Mr~9OFRO3bUx;8wH{x^nzv8_v$#}DH` z*K<I%-Sen+tlD-fzh@)ajhiPz)!?QOX6%p5yq_{jRSx2lKP4~IzQz{KgP1$`{T0zW z_m6;#<)RKX|J<l4%f5`RSD$e`6g&{MCOgdcf*^U0XKJCZjgRvRrm4>};*mejZk|8> z2JA1p_tSd&;pLqE_LpfJ!E1SaH~7n^b9Bawu}>#7@-+9{CXQa-9%;EabHxec7*zfa zKEGC+XEnXLm-GFxFuxD(dmtFQ_fq?<KXs(4&czVf{$ThAACIc(Me6f!#N!n6W9*vF zjdaY+E5yC6CH_=M_#jnPM}ldNixX)!N2Y&TEMAWdPdGyuo*%m)Y13f|&;3Xt&aVyr z{%jexOCnb*_4TX^@zu1_c(2Aqapk<e%jx-<ZF5{f$JaLv>qy#@f1~3^>hjN+4vu$M z1%H2mk9l$vmG2D_j#0VY!95<~l*Qt)OIgO-5|Qyoq^38u*QJ&WU*<Y!yq3;y^FPJ; zFFn)%-sR(@c~rw|c#HZ}H5yXy^WZrp<*bW%UxVt?4~sU^_O<r+nGrmc`lnN!s~_1N zR)56Pyoc^7sI2w)+O|lTiG}_5G{fn+kMR12j*{qXokhVrXz@%#Xi3_8y>eVa+MR28 z`z7@#b>6DpmUg2yF5=IgKRcvv;#%z(J0oxuJYUR}`sTWRAHXbZKUIh4h3Y#dgzqbo z$v&pn>AWRhUmn8Axek9XUGn5SNgm5n_A9oPj#tJ*X**tPwtFe9e`5GG(y;Gn2)n>W z?@CIVwD)>e2d%tu`vyh5m3S-{Q$M2A-g!tlMpUBhO<bZXw|?*H;AdBG|4Q%1bIxK^ z=Fqu|9>w2VWd2DV7hyPlJ)$a?$f*C0o=r)eQtG`%`;Lm`aXiMKaXrlUFUPFg2Z1B4 zP`~*wRGt~UKde{>*0=b0!1Fa-|D|s=X!b$>Z~ikMNp5jZ>b-lcfDt_d$Iq<ZYWbRL z=vhyVMqclFcBmjzPUDU$3ek8+QGajkz_F%%LTXrk7SB2?GN0^j73Z<<6Ycmm;p~CM z^{ieb@68Rr_6aSU)-6f`M?sR}Skzoi*G9%?O^}`u*&TSjRgBGu%v>k_n>5EPyw>W* z;IWC`<5bjv@C`IIkLAZa|0miP7R&zVR!**URuNdvjNJFQF5t&5YYX<TtPGUz@GHxg z(~)vrrx+LbjdXvHP4$6wX(6XO;U#Iy)P0aOk6(wS=LY@$pO-=P_jn!a_R)I+#HU|~ z{Xt?SZ^!Z9`XJGPeRl2sxr%Z<_iy6rEpuAI{2-2J{dW{X_M_DA5FJg|sP`e|7=Ui1 zvMqIgi{spwFLs1vR@_YEW`a%9{LjR{ug;C*?Ss&&rGfX0!2M$(*oN=p`Y5Nj#z%(h zIeRJ;e?tFWfyHs1CXN$oPxv1DGnO{@BfOs2y7;^4I*p%z-&rKa2L!#{lX;)vsjG#$ zokyViKjS!B+oRJU<~%XxV`WB??>rgrL)q62f#`SXy2)Hy3*FOC9AD3Tf4P!A`M>dZ z{z^2c&T3P($*L{%bAxKUsJ<e%TpB-PO_Y?E^JJvZ7);()5yju1`!cbAEdAG5@Lac( z!}Q#}0@9l3-%rZ1*m6hk`{HfE@8Lvsx$F4;_?>i4Sf1k7)caujir@P!WeYgnSR6KA z(@583^!?)8dx}>?gu`O~QF+6TQJn0?`{;Vol2N*3JIBY;c3zFg9M#42EmEaJ?Jz=p zyz6U}{h{8)$7u*h>j_*oP12!wvAP{14D)Ok1V8F0(JSGmpU&HBrCE6&RN_^tYhHo( zA*Hr~)Wx5xJ=O@zA1(UT?u*1Z$S9c!xvzAAe#ulwsKoQ>EEexh2cjRLZQI!u8sCa% zshyCv<4JXck7>?VB$$RH4PbTP{meF+KSM;qFQ+Nah&-;6^F~@uZoy|fcRRhm^1PTA z8jGsIt)bMkR{88uHUzgvDhnF<n9lPGmM!P6AEdlyS-Q5p)E~0-k><VC%D$WMcb>mV zvWMDN)ng?>uaw#!;^PH5jpLkkk_^<QdpZ1PgDj({-|9Sd8yL!QKYE|sC}BCiKO*Jp zqj2nLc#Ha@fSdX<Rwv(IaSUzVqCBrD=i&KE-ihsl<z@4hUaBKouawvQh57^iw|p$v zcMXlfT>r#znPK{Fsc#6ccNVo<g5Pie-}U%9_i?nO9i<&Z_`8?-2dK?itCoiNbc>>( zZNYBH{RjOV3yU$(eC>NnRP`AsmYlwOKkl=<z9DMCam&mditV9cD7G>EORFF-4e#wG zryf6U)i8`}d2JS0kB%1fOX=a`Y1F6ADtzv0Ud->C^8TJkIp(xDK^NOs)IM44z<9j> zkh-#hW+>g=An=oRdD{H-K?wAT`>33bls(J&@$Q?4WAo}Ad`wE{<*6^Ae1B*y;BgUO z{eQ#jmGmLsf4Mw)+4e<b@it_Kmo3LGNSO+q9V;RpdpUo&vMFYhBDU_pC@3+Bdqewq zyp6WqFoNR`EGhy=<vi$kCXTBodIUbkW1DfWQ?XrFUj)W)mP6+|8@P7+2E4!aKD>vk zC%7Hy<3sgTcPZOK*+w3Z@F}GgNvR>MZXbUZvFpV>&ogO`qCSa#6YF)U%6m(Gxj4Vk zUmsP(W%V_7FAvc;#ts)~+h1!9)io{?_mISY9)qf!qu}qt{4C~)<g4`?B|WNhM@e~v zX}M@KS4MT-vD6n9-@*GATgh619`T?j=OMah*)A4wF;)2gJ8H2_Sm*NR0wWyaWE+BK zYArPD^P*iKde7t7j+A&kTlsZFXtFbu<BOClM`-Fm_)%&<wGf;w!Ot_iiuH<a$F>xB zdkcqA@UHUR9gC%u?~XYFgKpU*VcB2BXGUWZolhk`Qdjdko-@<kbRJ0?Nwb;1(R5#= zeI_M5^0fU9x&{l@^Lt%N8gHL+-bl*E_1Hf^Ymqb-T6`5A>Q8*r0W#~utg@!L1i zrSH3AA^nWGc)jOb#oGa)izGGMuwQY1BHFxX55I<$@EZ4Tlg6rXGo2qL+W(6>ch5{P zm+|-Bk;?T>n<w?9WjcTUBN(oe!jB1|RZ0sc9|QN`8Il|&8n(`IYMdf%<x<*5U0{bq z)A6CW$6He9d5XnG`Q`~jC0==(ysTS^?=O-&@*pkvZi%!Tw?*bB2t7%2{}uE*vd25D zT&lBuh~>#h6pM{-=Sh5u1Ouq7)KOnJ0JcH)Q7cYZhgiM(K8bY6t3N8pFnPtbYrT`7 z6UVsi5?{w-*jMUX7D#o5iMt{BK04mDzbW5~nq%nMQ*CUjKgYP~3-CT1Xr;I;kK_Aw zl6<xv<<n#NJzIYPrR}&0<H~tZxx!8Tky3l4b@nUxxomi23-tE?UI&YjczT>-A2N#Z z7-YVRePTkUIIkH$QeRTDZwr(Kl<(oPwumtws{@<27b;`42Zn(25vQbUdM4gOSl+}H z*r!<UUIu+N{M`jh7fHTx`fN!SOP`suQ>ynoHAc#_G?C`r^?3hd>0w&b8r#v<h;XYf zQT}W~<9#c@eu0P``z75Ukj%0-aT&(927ikk@9Vzvd0%V%MZ{tCC3*W3Sm(MkHb$g7 z;X`RUTnzf!u^gY}@fnc)03B<Vp3S>{+ya3+sBPxnu@dT^rhd8XrYH`V<t6!s2gI1B zto!(55`r6P>bP7v_9p!Gn~J19ST39fX?vB=l!zYQQr{1=uM_)8Wc*QS?d0HjA&u%w za4lbI_mR+%wBeFHp*~x-&^Up#{n4o-`1{o*@gt-$*1|7s!tsfth5GZB@%*~d;zw<z zCA_WY92zFcE*>WOwQzXy_P#53NqF)$dAX%i+t<XHsgKvcqtMSC!QUlTiSgvJ)XJ7; z=z3M7A@vE}W5NAe0BSGa1~I2<>rQw`YC1FzDzBryqW*!Y(D4D?rxX5^3VA2-_w~g! z{CfiX(GAkrS|`xYH`t%y;}s%PD@_@RZ7Jh>dS7SM_}zJgWr=Q*<ZEFkyCRP#v*YQQ zAk0$3f{0|O$uGTo4wR<h^~=&YMkwRj|1HLUzK5qvI+&m5V>U~VcqgHM7oXkrt$1Cw zoGsF@x@hHVmK@(2^ghAI9Hke{f|92fO8sDECbX`FzC$>+LiL$9h<jbZi>=^)Zh445 zb}_$?1xE09(Tx+jI5}<KZ{*5IMx{eMTcP^W4EpW|l_PoD9ve7MB)AP<9ToJ>Y!>^% zVpR=Qju}}RHlL&t+aa2)u4b@oTL)>M3>Wku7{*c5Hr-oRLal-NNJ4|sqz-XT*><J8 zb<ieNxh%ai2Jfetm-R^WCI8@K)?~{zsg315(Y${)kL$k;+h`=X`d|3Z?!~^(V_DP7 zk4tCUh&XUxA6}2j`}=*}W*WPv{F{!Uybq=f{ynL@9hHmE8~8j6I0?(3DtZ#vcmI$R z!?nJ;9h~zvaF|GL&M=DWpE$66tLztguJ&Fm#(6@&ki5^S->LeY_vK3T$t(HzNQq`3 zb!~OxzT@?5hx|5r4u^ZGUXGLLITOiot=$a1Z}th}NOVYkat~NCsNZV*vj5&-_VL|k z6I_(mUrTXGea(_hka?TvC$fLS=YpgkwSBX1!aCKy5E=3`_FVA{Zz#)y=->E#-f}m_ zHhjtdy#m7XP2%O2v?NJ-<j!i9@^ab7RsM*^6rQFPA?(1msnC1HL?~_$b&E*Gm(9@m zAB?3$pY=KK%Lt8goAUl;S<CO?u$|f<;x*oi`;hrNy{9Lb^3--HHPpxG3j7@&^7et2 zlmEO~n2+Q`Jwn|;aanrLtvE)j{DI;ImP8)660DYG)SsccnAi9{hS14V_Xi?f{14&n z&~mH#`5Vcw+@~Es=6x&rl62;GmXlvnwj;Uz9V7Stq4PoTYe&=hAa#+Z{^mkeojS)T z+h*^2dIqa6;>W-3uI&(57T*4q^z&pG*7&~VeU7OxvN7{MwG8a>)Q7P6ri$fY`(|MK zCgN{1hqrC>7rUkLt54wl0jmSadtJP5u|BUn{+4r;$KE+M7|V80-|kL}3&~IVZiu7@ zkwsFoJ-l9oHj>n`h`)1;glC{M-r#TBx=UvWeKI{)2rUImxcdC)B#1w>OR9743?Ek_ zeJpEeoP)~N#<3CxD$Ad&+wiy>O~E-}p33`+xN=J_ogap5Q0J>VI6AhC&G%j=`lH;8 z?J#JnI39?vu~B`GBe?o<<@bxEouqZlIA-5L?@LHKN?jL>h^QagXYuzG`K4IT(v8%9 zVpB$iu<RouU!OknXjS<!v*?;Ny&sIxM+{S>wZupE`C-FBd{%9_m;d{k{I97TG$#5B zoRXZ%XL)--?P^ci>yh8Hrd=C;p4H^Y>y48|A6@g?QK=8Qled6t2-U6HhWlIBO=$?G z$+Q^?-a8=iqI!J{@5fP{f1UEWOgc?F?zRqUh3d=sHHYxXQ*}MQm+^kQ3`(AuE$LCU zSb4p)JxcrKxJsFZU=Jj<UxxeVdqwPf2<Jj&TV!P<y79eH#o~#O-P923OY}PNOq+O9 z)S8^p2c^CujK<X>U4AuhrwI+p@1R&6P`>Y3ah~NgO6BGaJ>Y&&c~3+1&CiLr?SJNV zM0B~AG5-8_%9FBC-S>F!*c=)UTU!xCFFppDS84lmB!@h(NPUki9lwtoXT+2IV;)#G z;d$22a0=}NH}Qd?s%?a3plRUoSx`A;k0!4DH#!GK{Si%Cx%~9t_mD<2zf+y{$W}%E zvQq|zE0;scz8Cnr-`tEPA$ghqReqPG|5m&21eZ-~YLg&#F2-f+1FyQEu?C;Ni)Tc( zM-qPTA??`I_i6yF7L4t=<&X0-NPcN8_6<ZAdFqYl_bYijD*JDvHbUAv2hUTSYtpWj zHvTNGV<r01!*RzgLkUl<P9OZ;<YYsaBrCawj#={)OQm|mAOG7pu1qkS+j>Iv_6t^U z?J*m-ab-mBt5os(1gt-8`_Eyh_!8riCiCgR_%8Uk3&nkz&?uz|seG*ID>w{}8oUpr ze6<(i4Hy^kc2uaJgEKGV?^vQYJHdGK4Cu(`@exi^K(zZhlX$0J|F<G2xEuTN*vt5M ztMo?d(-EfqQ_&Vtz1q{=$n&ewl|DU6m?t@H_Tw)?qH7=MReldgPA@Mf-cS9Y<F=iu z@|+Ek>FhsyE_6<ILCY$N>pzFLKe-M{<=*Mo_DkJ(>=T~d0L71E{qjG;XCJfgSV&*< zHIu=3kgomWPxzRu{)*rqZC)$xk&Z(v!RlNNvCm-tW_h2kf$Z%UgS}I{vr*EOt&6`; zv^ifQjR#m-d0sbJv`sk;Tee+3O?AFlx`E_<^Kl%~+;ly3|4Pp~N*FbpTNUM7?i2k$ zZNVzY%N_W5djFd$$*4S)-)mW&VvcQ*=t#Y1q_}T2zQOzX+WM8?j#?)05)6IKP@%2k z#^87K-h%f=Lg!ep4yrwP?rWaj5aMauL~WtuJW)Tw%ck)z%EQ(VG;h4BNYI<bXwRhj z=Txf8v>)cjCiYnxm-<t2JYIh(Z->!8;{7{+A@<95H(s|jJw1?ic)Flh?ksKpV2H-+ zoYh|`@BS%Cz(#bHPx1OG@v?RHeR%%Zx^Vf-kzLTTTG_snPQhm#@5B69B24Ey{5_7A z9Q#T1?vl`DH||#KGig^#y<e3p@;M%%K2VMKc<ST7r7=pyld~n+mF-)lyc{>>#-*V) z-$radq`mPT^*a<o6E1aqau_@@3sq&ej92$H2)nueJFAuC7+$8a8ftexNc&Fc-CLv9 z7$%IA<eQCne@e`o1s&rTKxW?vsg3X`rEWtJ<ZlT6y>Re*UX|LF>MEVeXA>pbaCN<z zJt4W)^OsBVOZMQnCANLIR7Y@<{~Y|Coiq4x*ZnN|s)VKD-s07bgNzyUoiM>1Xj=L$ zzXuGIpQSI&*bLq)MO|4M(;0MZ*!t#l?AKDh2B>+D->cj$g~HeoUSAEhP4k)ss&t6H z(s)#AH$|@q<=qFCLFUf}s9P|wc!S7Kn;MKcpW6fZX7zo8&}yb{7edugK6aPW8`G&z zO`MKxO-_T#v9IHMG^IABy6$n2``tmG?2^V1VKw(+`$l<d8I5(4_m2k8VZ6^*OrHbp z$IC-}_G$aT69{i}o|}5WrArO*q)a(1$;`WC1~@A)7Ltjc>L2On_)t04M|DDFwI^dL z#jX8;=GExs_34H<Nw2DBHc5GwF6V|FiuEiF$~(s{gwCD#GmnPNbbLCxwnfB`FfzB` zJ4cjPd;BTmAm<3}D-`o%smOO7_Sspt$ASO98zg-yTh@m1Np<5xY2X)%tAwNbs1~eW zZx7L?t(yzB3LJOouU;o%+M0?Wqlv~<N;s%4?S-+BRLkF+qI&m|Wx?;k#A_Rs*~gc& z4yrzzEy-frNWSq^aepFhhAteh^=@)O#pnf^IGOL`HI?yax+VzD|Esh<)dil_BP6{$ zMq%9om7Bm+q26y+-|92)nq=!xK4`oWE-I(U;=i`T;eArhM(kU>?{DR>5Z;MCzLQsi z|AWYJ(+=?avX*??_u<!Q_f>za9mH>;KF)G4T|ZiS9&cMtGqrWoy1n3O%!7t}{xdY~ z@6Cajtw$oBw}5#D)P72Fk#4=ZjUoPuyY@wl6G@+PUlZ@NBH{ZZXbcbWvCN5JmQFnt zYzgAICoz!3jaTU*x_`*!rTujkWQ^60k1ONoc{nx=`*=ByyzKrB?+YE9@Epq9kGEVl zMES13e@_3s*FRQreIJM%|I9*F-j3iH<##EMV@;a4?-04>$-_dJ88vvXAoVCMS-lII z&o~0sqD_+AwC3=8UFPd!q2%yfiHF4`c}wtb@e^dffnxXx>tB1DX#er|1V6VQwSvQ} zzL&mFCAcU}p4Y?C>DJ@1PfAd*qu22M&hnEyT#j)vUTzKH*%lN*+6ALHY((pu<P_=% z21-qjohr4*-nA22Zf}svEFH-=-^8yOUGV$)E6xkQA5}iR77C(!z<MbiCtWc<n<DJ= zg&4O%Ar|*fS{~9VZ=5(r)fez}3E!>-$I0c2eTd(e3Ta<cf0+Ct)rIs=o|=Q-^~~0l z+#LLlryJ>-X4}H$-PhB&z#X@P!)1Ak-@$F&mx}8(;aNUDM|>IQ(X)(mw1``F3vFlR zgv-~AJw85!TmKOq=WudL9UzQF!U*x5d}4+V>TfO*Xw~r39^m&?LYFiF+l=EL+HPy( zeMeqCUnab2Y4mj7k0r_OmJpwB3yv)e-%($fI6VAWIp@)tQlGt3u+8e5!t)Vbb2nkX z;2Ylr$;{_GNIRE)x)&1P*$c^Yl-CeP8$qGCC`r<tCGQ@CZ7c8JC$Gs!QC?3q<MH?P zBR<P4Z9m3hlYGHc9=Br&^>u_sDJ}5_zdQIzW<CwW75hMV{f`%FwiCLvcZLdd#j{dF zb>;)=ds6lfdxC%C7d|c~a;*F5x=omi{Y7FH-AgR5iTf$xWz**E;p44_`4pGsjU=C+ zzeE@hH9q~5%67!kSC#LU@baIcYlfwf=k>DRaOpgCr-Z@M`tCfjb3xu27`OPj+2Ght zV*|Z&V7PS;Y*N$@>1zKswZrPek$r9>#>?N6<^GAWdv*Z&^VO$|pP_KyPvt7GgsSW& zIyZzSaXR&b=397w7JEosD=`yW!4^Cl5&jcRy)oMBS_$7eO5BqXUGt<pVf8ZojQy|@ zZn(NcLr+-z4re(>6Mv5wtFm(P|IN=mX>+#i<ZwuRq-pcJ%6_A_K%CR6!0M1JTMylD z4eJJWzBd$J4`ureVEb^bq<7#L%_F_j`hWWx<zvlV;9s{)qD6I)KH!b)em8S9p0B_@ ztcUmSg`B*$=fmSPf*1ouqG$AiH^K4rI&l568BB#(ZcWQ{FwDj}Aq?|1VjQK95@SbJ zUdc`PGc;`7K=U!X`Mt;KJjRU+i&xukzsc_m{Jm1iquPFql@m5UlAk+7AG-|utK=0l zhLqz}Zop$~K6zm8iRC!*a{YO!ienatR*xYNM#GnMe)H=aLKyCXaf(=SnesAxB<`>N z)N;t0h+{7M<vSt2SG3=x?{FMrcms}0uB3-!xxgQ<-x{i`_$d`C_G}Q^bN<5nCH+Bq z-%<My8f!{2f*IF4iv%3D9p$~(^0?g!zlR~`8E857l1-41tG@Ru;rU+<KexR}*e2YU zV_R)`>WI+a<Oy*?9g>$kd}FA-VLjg4VaZ<5c~^t3gZgs0Ud`XC$0aGF#QnJJ(oJBU zuig*;IrN=n_9`43SbpBZ>6_J#>&v3Bo<t{I>tXPY=CK1)X-q=sjwcO_;^S4@Gt(e% z#3-oP%KJYSyY&4%A-%ot?*ntG@?7VfjMrV}&nu)pre)CgrJdj7buHoEbSmht7uOop zuEw&yC<Nn0b0GbF>W6FQi7}ppC(8r?_cL#5tE7*NL@FAGQ=O&C{)}Y=?z_BRUbcTK z-haqx<YiN}_FivJod&j7M}*a1j?0#fek>z8_<b2{J<0py>G+bmKO(Jv3a?uhE2X|E zq=V&FY8PyKq<QZ%v%s6SRO(OCyBL@7+dmfn7OHn=DwtN$HRX6_6*zvv?=t)BLnJJM zfzsZa=PA|`n&wf;e5C#VI<35Dr>4He3EQB0Oatf@{^muW#QO!Jd)wAHh`ol6HK`Aq zuA?y>qHX!E32Gni($p_3W{{xZ;U1`cbQM&rRPL*P6^?%pR>5iI5ZHwMl6fh<$0ag+ zwb*9NtHgM>`5qik7HmGTSk2yzb@5$-``umiCN%D9fOPvlZX9g4Z--bA*JpaG@^3?! zC*b*TA8v-UV%|n;T>LrImcJIN*5lZR^j#^<=@idgDbaD9o-AMYGJJ+B&Knw{@&B>` zvMxLZmT{s_XZe)!feXZOhI`dx)4nUP|44XA^f4^HBW4n(zx~pqQrY4eE#+ArlCNo6 z0NtnYdxv$_R*9#jT-=M=@8oTsV4*a6<@OM7O*V}sOnv;Gn>zyAboC{Z!ToF@baZ3? zRP`y|6A4~md4F8@+Eg$;L+{i`J4uUAk?pypL6$cEg6A^rm4i^4Pxr!#4fOrEJ-JZo zd%;9(&&BKUc=(uoyz%)FAv)iKeC#O`87d~o{=S-}>AhRIU(R(HH)f3bovDA^a!FT$ zS$9j6P)FJZnzno$nLkW^l-ff_se0^LYs2<j`2#+aN1{*taH@l67;i^%e*a!NcWpB+ z2LH>nET=8)%oD~*_oKS*h~GEeDe$Dt7$wvZS-mfcYlpO*XzIEe`wi<-y4Rm5W<e$0 zQxI1DgXN*VSznk4b-M;8$J|~7zN_hYbsWHPqv2QnE}`XR?4JU@J={1t;;H|Lq+j`a z#QBVbZ=f{UbB2ZVOn7%-@np^P$YR0j&zrb$VD)n^6W4q8-*>9gBVNZvc%L%1spBHL zOy>97P}$xz9g@C(5xmLb9Rg}sdi-<f+-82XOHr@J4aYxEzNmE^rf>H)u1s_)eUh%p zw3p}|L*=OLkooygfv5A4jY1v4vfatYQ=}fHiDM{sb6<lh2Fs(CFS%$Yl$?!YI5ir1 zebT&*kky3uPI((!j?sznm1(znpIP4H&F8k_aZ70rzdy=lcoIfRW9b{ZUdqeqPNdxV z@3{hQ@f&;`gzzi$>h~pD^7YGjyNTJ~#mOt)H%}@%4EPSkeaB4beH8m#gl%su4AG>2 zF&r#cV4L=TqZ}^~T}&qxg?JidpK~GYN@-sISQtLUF;RPlxJC$H+Cl2avc~a!A~Z^A z-Yq+%{wlSzb@}edeGcJEI$t?9$h(i9Q`Z>vc$;9MwDA!d-^b6J2syhVe<xy|gV$Df z-&XKui}9Q1Gv>X}nbZzg`6zFGo427s+fpMQL&TrBRDB*%yVBG6&%tYqPc0A0DZPct zt4qg!pHVe2vhnMv=D+jSH3!=-lG)w=`=7?q%Y^=9eHJ{Qm5&hWm2{1?F8Z%=kkP`Q z``k%%4oc6V`J{LkWXkXGf`Y7r25ys)>KBgA@~{tL9*g6~#QgWwQ1LyrkK7ySJuHjo zpN`iwTZi)2%8B4{@?#>WLFI-g=$?+sjwi7kLz?zJUX?ETeb`8S8^R)wVb)QuZ={~2 zx-EwxuuHebkVVgFq>ZGuB}1X4S{tY4ZRL0YVKf`C|EL1-j80@IrKVxyINjaPhmQ-b zr;Br9GUBzMS2$xR$z|(m%XlAB`UJMs#PQ-B5Weoe<8wMGtEJYnsErXC!-eX&h$gWq zi5nBbr<FR+!Q+-&wFlCy+IyTFr+zDcZ;)Kdk4MbeIA)jg9d9{1uSc_g<^p_QYK#^A zTl3z5#dwkG7}(#csT08|j^o#D$93gUFmea@TZTjS<C_GG?p?d2y2`SRplcED5eas| z-P-Gq(4o{^&d(WX(;r?S$uk_Lx;AcYkm?ET@uX&ryDNg1@u#i<$%;N@ks`h0iJ72h z&cFnpP1EmJ_em@r${Ws6zfZ_NDB5_(S;~90UB5!m*YjjlsIJX0UT7nFG*{E}4yvnL z%m2-0?=4Yl+!J_zNO&VjbwAOyk$vV`RXxIC<-M{V>W>ar<<GcYoZsGQ;yJ_Byp_Z7 zDg6FnI9=HG+@rkB+t%V(ou&C-<ZYMi<@%u{qo5GKe@}U^Nt0H$G7xIl6*WWinaZ|O zF-_e+`X&d!Qio#*%Qe&v`|iiMNVnJv#JP`oWGMI!yP*CX<uU6_3qbt(9bjCriPOLI zb{v04|E_KiO5;K5a{B)cdQcv3>!iJ|mf9?-lc(-Ki~9hfNj#H|w{hb<Xj!|5)1T0> zsm_uL$<I>1QF4UFuPhzRUkx1-b_jTBvb#3tH%A2;7Kh|5t*f9q75fQN$EM8-)W_KH zuO^6fE9=Q(puFz!5g~n2#)<Zo_ydkvtIm&IQ}9CEnyP=(@sr~ym3_a8eeJ#hW5P$u z{!$62Y`AhP>v{B4h~KNe-keq^H`XrC5lHuI_rc-Cv8j?CsIGp2vdx&+ZiCJ%hCuCA zIEG7jb~m&STLPx5aeRV!qi;CE>4WODp6XjRL_}YgO>r}?r|Vn``~RXX=@tIItp1{* zQh%zhofFC%uM*d5eJ<~JY7%!yd;`(jIg!6l%B;N@qUVnYVfEI}f`SM3fnoJN0lV=x z<@<-)b@+X1cD~3%^y)N+Ka(KZWZf1)F2PVs^S?TCP4}XW5})a9x@X$&DU|Bf_#>^a z@>1MLdHnHlit-c8{5$B_hjvPI_2(o>c_hcSk>88-OV)AiC5h_su$G>lar~U<`@hd2 zzWgB67t%PPbXDYQC(t*R(~Xs1eg4U7*s?s|mN9sZrQQIBRs7gku2A=7a*TnLi=QZm zs#Lm%MZ#M<OTB-DKah*hzVX-5b!Is>QW_V-jyz~v71=(NQ?nO*|5CnJA@VxTnHR!t zm_JIAk?+7Uf&C}Z{uBPb7Gm$A_C|2h?+QRn8TQlBFC7VC<pLjX6WU1A?B{1oI<Y*> zwc7g$ODoU2Ps8`W=AxmH*s~hUr_=jjL~H5b$1A-9-yg*<re_!X&%7^l#Nyan|Nd@4 z-{#ceYjiKHhQOt?EpxW`xhJ`vq--h_eK~1kQ-1{SDRLGc1lyU|u9DWYLP^<pXsqCE zxN(f~n6t7_-dHZ$hMXou7yOM8rFv2qAFXos{2}-|WfS>Wr}&$ZYiv*A^`WmF7s743 zSJ_7r{69K1jidg|KRIfR@kjM|qVMTl5dV_0|FP?}$IpG8c6+Hu#PwaqkC$5CJrChH zL9PA&PxXPmR>^*%|1J6*qHD^f{C?yawn^d}v^DbnmafKkHlBacc_uPkQ+Z!O>QUO! z8@$`iz`m5N*UDRl@p@%c;<KJ(A$@m)_%rv@Gn#oG)=!RWJH+qv@^*PSt!n`tA9<s^ zJdS_YSo;-@mpZKCcocUJ09P(YR?dDM_d6#4DC9k}7aT9pxL-y($o^tvep1dCD97WL z_(=G@D%&2JZ_HjX2OMuH-vQg>i@0%jB#Lt5ACCe!O!s3}=Z3hToyi_Jlg2y+qf$fd z@f-IEbTYO-wAlD5zh3(M1B=Cz9&c6E7arxu3@L6~H86X(-}NRWo;FEU#y|$6*eA}} zK={>Yv-(Ct^GA3;tmyh<Wu!OKeb(Vx7aE7e6nZ8x2YSGC2VFyfCVZFR`x>t~$IG)J zew%g-j`~$Ln!kgn{kBIMbL;Ihq`cY~sMQB-;(91uFbw*R9aY41?#K5O#rN^?T=G*J zIeOnmcr4W9l6q_L4vvr1qcrV(-anEy%SEl=Rr;HSm7?DyJeeosdGg85X{0@p)Vy*v zxX;A;+K;K96)Ml6ca|)!V+7rA*m^c^{ZKtVNm@7@(uXbu<5E6OM*Ni%W`Ok>dbY{^ zWsB;#5_z@`K3=YFqjqF^CHUFeom0V;Gz0wiZ-<1(aGSM{;-<ILJCoW6`S-y@hCKBR z744#T7`CPM%hdPz=vEw~v?U%=?U&JnV^_J%NXmT^)Nyl<iED&lwngQEdkdDEwrD$8 z*KQK@bDX;n`V#T}Vf;pYei5c6V<z~28p>hRU%i1V6WK~>i)S-O8+cyb|Fir#ztXv9 z>q$O7qbY=IKact{!`%&`y57I>pMmfX6ZaK@qn1_=+b-!{ugAD7t?34SOxQN9y!~Tk zAEL#>w#5_#pmJKAq#J3ge0U~QXYUf~O|=`rZ9gc~6F!m}b8(F7zDcx)s@>uJgfVu7 zri}c*jgi_t&xzwn^!Ovv#v|A#vRHvAI-hJk$+zkFa|NkqQ^Qdn*Yea}XbJvJNbPUb z2O;{lZ~H&TDEloJ^Q67f7$CaXp;25J)se^I<M%UCkJ5s3@EYnEGzY5Qi_8wK+sCQO zVzDF1r~ECC!zzAjDOZ+b<bJyd8i7CSAR7PaanL)voa0Ri^PTT<Y__bATF+szZGo$j zRNDxh+qGPiMmKi&nv_^xU&1R-oj*G{tjziRn8n{2jO7nRb|+h0!|!D_cM-(ecZTr2 zAD^jyUpiRb@40V33bvo|8N>Pz?;i>psn53EC(fI^ubGR>q4;ljT=aQIAqJh1`yay# zT~eOZ$x~agvYxfShUZ0C-d)OTw{oX4u3WxSxqCN_CFJdmffZ1*pWgGy+ez63!)V`s zr27<UCu!AJJ(P}A2GiJ7eD?7$-%ZOj|6$qm-D3Pkz!UyU_tN%@_J#C}>4<C(a}2?D z<ZN<+>)pualE~F9;@1nQZ@&=xMaQk{021(L0rJgw?;<oP^{&_h1xK*$de_l4YrM6P z8*AsNom`p4Fr=%;U?o|+FSo3~cRGmQc|RVXmPzWdj%imjl$xn*%QIpeim;OJ)81DR zjoRZLgZ){-6LX;9=qRC|F)Js7->lw8gd1;~30Ye<gm@bt#kzPl@V4K1)>Z*qNvFO+ z(^cs@5+*|BMjof?N;+=@FZ#B~Y>&{ZrR|fNAiH@{NFRNvx*vAT3IEwsxs1epi@^K0 zB|=~8zX(9pa~A`&;=Ram(RzWVy#cQ=IcB)B@w63?=EU<Pr|olV-!T-N&Ce&x54}Z@ z*`aQO4gH^UKs@jPe+I30<9@PuB%i%{lhAk4hEm^;aq8`pM7v;l)$+CJbYD`Vk=I+E zrv8t#RYWO|GigU@#;{a%{aM0bUU$Q4Roa{pBNW>#Q?VbkUOiT7@4Z4jo|K6civH-4 zQ27~ur=yEj*Gmr2_@1)AmeaB2(kjs(bnaRY`pbgfnSGWEGDf)oVqH+2&f67>F_3)h zP8_G&bky%6e*IQ{jIHO3v9j*Xq0%@LnFXGmkUg57jr_xSTtdgC@9}X!#%B@mZ~%P4 zc(x1bg8xu${j@GYN1l3MrIyDBuZi#61xaQmj!}TnbvAHvlNQeb!_#~nVaxq^A=F-j z_v^mNn5Jeje|{pgY+911zMdMFmUHskEqJaf&(_}C5PtPD+azA^PCm|N<&(U}xdKWz z%mmv@_-?QG3OfI3N5%1Pet0|d_3eY0rQ0Pr1Pi5>G2$MO%>0dB%*#6=_Bk5kX8~RB zh~In?vqlH=wuRcWzfFR`>o|@?<*NM*J*o)vbgmZtA7aVP#ru?{|FgT@D>p;mE^$3; z!8`so@V%AbRn^dWBX!4}J~a<2#^5{B>{qpM>*mlq-Mq&)hUPTzT#@435`8Mpdl7VY z%17$e(&Qn^wnFIB*W-0lIh^-fq#dQ6QzmKZ1dC@v`>Y*ce{s1c9gB(bDP?#a>Rm%L z`SKUhcvz0Xmh-RG#$jnQwjBh=RXAp2>;H(n@6Xz}jUVp=_uw6>eU45L*Z%S9W$VHA zq>phb%JaWU{Q;7ZcoiR?HOw6Xf#3E*_rpyRzuO`1X+*z1&oO`}7C}su=!Y|^E(YBl z)CbhGDDMTX4AI{=-z54rBGd3N#Uyp|)HF$5XF_WR<+T?Zp9+psdZhjndU<L+rBI^j zyyFNozAMVq-Ou~X#QT-w>FSec%$k@dTf-AX-^}V#dEo|054N7<jrWPZvhFMTKA6zS zQ{R8^UfA;RKCtXozEe!9!)u!5E!8Q{GfVUTDqmm<-*2K@cNafy#SipA?<M>=1V-`e zx;Rz)jOp#xo=YM-XR!-<x1PBsY2I$dxi#L5<55EI9X$_XcOKzr^N-TLmL!h~wKc9% z{w_)5Sbi<|S5Vs~GSdEub#csD$H_tMrH}J|gz%u$a`w>>eL-6=Bwvf~b=daf$vZ5; z`<aJi>qG{WrK9f<Wldp=v2(D_giv>0037r2T<1MT_nn68ox#s>tb^LW<_TkhcxxZz z`&&1c$IaP#IK<b|PGdpD*Lm7Zu>MQ56}Lj1hUn2_%EvnB*Q|v4UzN{2xgX&*UGNG2 zeF+U3-#vuUPyBy#3O!@Sj>GntxkL2*L{d)7G_cQIt~joQMl~%E?N^DmYN7IHa1gEK zLT6an6<^ae#^Pr-i06Tl|M2URrB}-5*6vf3pROOFSg(YkROf#S+iz9SPDp#=U>v*p zriH(=ulo|u9pTkV>#fvJ>Hfyw5oqzDHvbvo+}D<4d&xQDn526+od0!u<7(ycNZ7-# z=|B%XOCg;)Rw~~eI^6sogJ|uo;#i>iNFUp){q{Jf2wb~nNMo0L&PXXwuykG6Cz0~; zq`tSrJ~Zp;{MX!gP>{>YscaU{-+gnA-=8CF<2Z3I?R_<TELj!55~>H&wOF&1_ZhnR zVqe+598W&_5!!#tH}fE6@<A}(sqE7UzGHuIe6Hm84C^dyKiD`Wc*fsM?b4rx{Q$va z)4&g7HRsG)OyghU3)h3E2gd~U-D9Em28?U}YJ)0<^$@Q+D;wo|3+HjXwLK%aGNEr6 zg6AhOH4Zwz$9tmxGv!#p<m2~2f}xh?{fO@=`u<Ai2hj$6lOa2MiK0GgSg1bfLmCgH zIC;B5?U_sP7^1v6X|;fFQu%#)^L@PULHtTj#S}XCsNH-$mXY#Z_<exjLA9tCX$zM| z|5yw9anvsm`kXFm>+Sy4;J=O97NId#;CFbP)i~7|l0xHSd|tPv^p(+Ie*)JN`V&b5 zcZxcy;ibJr_f<JfVmAN2wC-H2Goq^>AK5tizYf0_IIdeK*os^iQqHXjer|K;Y-kMr zgI8w@e8~?{8%&<M8?5cy!MK*%Ex`$;DRCkG_+fj%kSyL?CEJ$@_$+^;gW~FD)3J%4 zyit{}^2Xg#TkNjXP~JU(A0uyI;NR)Y>h-_K#}8BXU#zUg!?B^yXf#x8korj4GvA=| zg6hmRY@^LPB8!dSr#%8D!A5E9ORb@HegE&$G%Vz8BkxY^TUj2IuT0*dh+ELa_@o!K zeLcdlZKi9^bk#gXOhiW>n5G?55IU3^HgD6!3j_mUmLBC}KNjZz)t7y~OQN;9@&177 z$&*;d-y;}bpnFknJAZd*e{`>eMfgMM!~Ex4xwc@zmEEMwCnuDZGgi@9P}am1)7DJ} z-&Zuwv0qRK@ZPlGcV-6f%EpUh#WGjCE}n%@d!xeL5z7}nWth;XDi8e|J4Bl{X(kx2 z754@fC(^v*J$x>b(`OzN?L6yY?3)5(=v+GWc<xHCqQ1)dHugt`bb9s;JYE#)m+QxY z>23cV%W|jVbxHJ$E^-RvMB4tS)V_rFNsgKG!DdbQvEAk1eKvUio}e64SfAUe$uF1Z zu&o4}UEAj5JZ#x<9-Rxe{(qIPIBkw<|4hS{L&5$AsXZYt_&eLr@-Z3Ft4)XJ9e(eU z=t&!!dhWw}tT}IiCLQ82ugA8C^09+^ASX%vJe0jkd+&Bm9i=JHI-?n^@6yjvWX|o6 zz0Y-lEBG&Mj4Sx}rsdEaOp!k5NxLs-^VVfj8P&O`;r+fOgZgm8dlVPZuusLaGr;{e z-s{qmkA|>}7t?;Tw7!^i;F-YtYqni2pP0hOb!v24^*$rM5AgNJ?#-`YzZo<3NJ!^~ z_vkwDeiWJSNIx6%D#>l|9fj;`hX==7To2yZ<<gj&o-Bl{d*~W>b{imRv^p-5rGI;! z#IGb<t<J3S8K(NDBHO1r)?qtvZ=!2TO%|#*Popt+;u7_<VAjLx_LcS*G0sKUE&8=k zzbg2<AJvC6$HFvq1;iWp_XgFAMuB@Y-cJw~`{d6P_3U_pe`jjAn%^T3zwZ?sBUFr0 z#${zhlD9lT;{i4Lq}@H5eP{V{^veDv^XK5-?Ocf0FH1kry!9W{rV($qj@tA<vBJ@3 zf5ybR;fRCn_T(aH7%~%zA6f-<v*`S^J)my))}BIPY-20<JH_Pe6%tKu^A;)3s+6`% z+2_Mk%6Ho=FUosX9fFkLZ-U6{6K=&m*0)*N7j#?}$MN{?cvC9-5Ai<OTEp)FtgMW8 zsb6I4QQr1Q5_G(Z=ehZo$YTcItCOL`f_+HYkpq%mmCR>#5x)H=e6I9-7rC7yzM5~b z&voow2f4fGeuvuF$JNmTX|Jl=z9X8C{c2;?{S=Ff@}}fKs9zPQECJU~{CE@Enmln{ zNn508ZW8bR@~!iv@pRwBuSpg&@01g}?`5%2zU7GxFvx@V&9q_4HqY{8O~h-sYBOGs zX*o+Iy;(XoU;O9oA)1WISohq-QDJ#l{(<EEzlHZ-@xO`oknjs$muj+-kBttiGaM6f zTOP*tq=u_jpR$7PRhF(9;JTg0b%>|&5saI1M7$qW!z@0)W2n)w^_l<VKO2*DqYtw6 zM-|7y^f~suuJiGH6P!*@(8idj?Op!7$~1+tj(hiU^lW?XF22p(h3$}~8A!hEVrBoI ztEc|O{SM7rPg2*tVlLkMW5!SC^zVBo%stzNWgI=yU%zmrRM#&1z6+)PrP+DCOjDOZ z=1jbvOV`r2+`1zYF2XT1iZObJb0(PH$3DpY0OdvWS#Qz4nAXuY->=kn`0e68-?8R; zu>DSL8es+cKLdgC^2f3s`-&LXcuwEI+0?c&%)_}h7Neya$9|UQ>D-}qxJ!AR*TrF6 zmt&DCCX3JJ9p5bh_|s}A_<kW6o&t$K>vrmkbPs9cdS>!|qA{umVy?n*OJ0ZQS1k7^ z#}BMtTKT*d<u%OmRC{Ucf$B5->M;e&$L6h>qHVM7Cz|ixI|F>DFny_4-#cx4`11sj z-MAdbbR`$!Ik3);TxZKf{=IPQ`Fz><#&$?wDxM{gZ0~qJ#!34ZUh}4<v_A7OY?tnF zJZ?cQUAO+1Fb(NX%(wV{oRp6zZI}?*T*LWuBzs44d?&5v%7W}=k&UhCQqkrGtS}Yz z-6KM}bav-)I_0h31jcR4!G06H8@F9I0&G!?9m%kBhtho__EEmigtYi%+1am`?tAgS z;O~)5F6QTo@Up4<E9_T0xAA(jG;H3sDfl-Y_lC!<^D2*N_J3wU;3ewU33huBx8Btx zjh**LEW^ERF6ec<JrbU9Y3F8qen52k)A{l8d`RQ%hGTpT9}bta*I1JzeMudg+D-}n zM)B2KLp0I;E{?WioC_QmxFA8cE?NFa@<~B|RP+8e(A~-JcZfI8gndlzdc4*n!IRTu zpFNV(Ti&i!P8*GVdj2)x?M04La=r^<6I|dQ>w=nKO4?0(3L&$1RH&S{wnwTb?WKqK zaYpsJ!`R;P(t^JQm`mrK@Q^fq0w3>@dN!@SYa=JKeJZsvmX6JPV|d)eUsr?up5+`4 zOJD!vWXPN*;<|oLg6KD>A7Od4^7ad&*66MKpz`nh`8y_qzPDB5HwVX`Ydd)vU+!<T zJx1@$^)mq4^Z8ha!;lr)9}V8$?V)>&tT|MK1nf@|@7BikU6~5`xhnuJr1y$)JV!B& zXHqV}xQ*NKc$a)Z&%C`;Hii1?`8$m_<yfTb{_AAun2hO3omy(Sn98@FT_}xbXXgwl zug0rZpSeN(t|;MtbzGelk5fzkcW4s)%KK<v8ZM%F)NX=tAw8YvZ<F+OPw9dj3-#Xw zM=k9ggx9cAdvD?}30J8-a8VLuI?GjQ;@exnH3{#beLwMQPYDmQv~3UZ{C~{74_uVR z_CId9=8{-MnB>LV=3SF)D@-g(vNg%pBqgOHqgrb%tSyNkk&C(MG1np^E+!e-+Ffs0 zs6<$lWSe1awIvxTA$2#~n{*{3gCrySKC{C-^UO2z>@M2<{XYA8!TdYtea_6BIdf)q z_gPa#E!bk%yFFBIUO$V`BT<L<>$D%~*dRKsSNXHG48Im#sCw7s>{xid5x<YB#3(Hl z-<d0ELgvrOgW|l%`WO-?!p0^~_&E|nU0KA8Z*j~trYz(+fy(r)B|-cwzxF<(hR?p1 zuFvTAW(4^gf%Vnyci8vv<5yz)CRnLG{5hDksZ&c9JvRnUDU-*;c>7j4ujDDd4etTf zGx6uS?DLKa=@5@zkFgWG`88a%#S2Dv-#+nFGr;=`VL%=4TYG9Fv#V$$*4;gw?ma~B z^uEuP!iB>)UF|07;|aZ1YJL^(cdl#mI2<KU##M8`Q6g=8+t_&`G}Zy)eUr2+Q`e?> zA!QA?XaN`u*go|4(Y4>w_n8PKmSgTXXwK~pjVCeWY{GU&cpb0C26<w>o51m!FPG*m z%u7E4uLJXD7T5ch_Wqr9w|HK%#&t`3YYb#v7e0=xI%RiQ-8%okb5x&){drpm+?<8S z!s3M)iePi*9=zYBY*`b;t6XzHh^tfm&bAWU*TJ5fl3THE8Ap!@v6Q?hUvm0ks2r<3 z{xRQ<1J59KjN^CG?<?ipJ_5Wuw?oB}<MhR9g`~2#Y#UU5NbmLtiEDixSl#$eE6d66 zRc-6>cp`e|jFnKhSbR<{eFXa#{f6P-O}B%yjK@M4e(4SqrRtaGGS+^T?HOOq=Xl~* z#VqgoJ~H2*umF#32GB8<@fVyU?XPTo$|ipA$_Y$?+-KRiB<V-Gj!fUKhQyKVoWj3H zae5=Ujk8Q#y?!fRPc@V1I&hDe8>Dl;6#D%D_g&a8x4p{lRdOGtjQ*09vdriNjEmag zQo1h~M&fvr@cHNRb7=XM(s%YumNEU!*l)WoVSii4c^5yHaRJ_URLq$L-jA_;wq)Qt zgp&8R%J@X5NK?zbw7)%1vv(5N7Y~QZ2J9c&Z^vi$q&r4v%L?(mVDqfG;Qp4MPoihf z$#@MXRrnZu$M=VsGND(eUEkw%(K%RqZV8Y7X?DI6to%3=+H@P<H%OVJwr7WcZqEU5 z?VbVg+t~4MK7`M3gchZBnfPp5bq>20(^gMn`e)c&z?793(8=Svo?HN~>sP~o9c&B~ zw~gAU`8q6HiKWcPxyv}2hA|6+bq)U#uT8}7D%18w1mC`i{Y}*R)9|^lEeX%7@nIVK z`QO<Ab$1`+bRk$;X?rZ*L(*%-J{R%9e*%zmJ+@&joc`3?q&07!O??pI&A&%%e@Vl4 zY4*$d5S^>~X;R$$Z`FJR*s|v_N>Aj9()Oj)U&p;e=P~{&)>aU&EuFPtC7vs@8&YrV z*3_TSmS4@|!q%lB`TV20p>7Rck2Rl$wo@WUnI`98pOU-<>mT#TUQV9-;o4wb%X8GX zw9Tb^k`ga-ANAW7#rti9Cg;~!4xhB4H21U+{!vM&%7d3ZBir9*_t5Gl#r&L${eN;d zT{|kc0sfc7@q>~s@dzLDwI$*4RMM&Q&abvZ-Q&B3<Iq*S8_dtl;o5vVs2}YprgP-J zdN9Ncq-V>_sfQWfjH5Ibv-}(HMM`~|_ux5&C86z1$)n82e9dDj+yDQ__iCIwl)5;) zgM#DKKAy%A=F1D1u|xDRcd~Is;sdid8bs$>6yB%6o&5Snyy0Hi*YozE<mtGJ$1NF! z&-O{uZ{a9uQNHjGY(LR6L*pV^i+c%FRgZ_HE#sm7)$w4i!|OibvElMK)IF<xSBWs> z*P=X`N3IiOTq&xxr}4~m0V`8gZ#*s7cij_oeJBZ>v3UI(o5n%KFYLM@bWRiBxAf-l zb4~cerQVJ8knz(&=&hsUspQF+H9z#2J%;zF)V9dhVb?yqN94|?xT!Wao>R&f<r}hS zTu<6vFHHsSuWbBF+ED74z|VcvgLFSp(kk=OPhwkD)}egr1H2A|#`oP(D13NB$Z@N= zo82D>FG(wJnF#u6+VM_X=I$WAbLezPO9|~e13xSTe*%tc8uo;b1CS2ZXH3v2Jww2H z@<!;D{!pE91#ctz^Xa~TXiQ(w7&q`4dykemY6>`~u>B6aiS^Mxz8KnfU>)`EQkt6Y z@f<a`P~6gGc#k(cC_VFfi7BX?XU77F*<HkpdGtvWp!taQJefa=lIh#$u=d*==DAy_ zujo~{c`T$Z6vrZ{-KzLL5h|lsmFgLJi5ac39#tc8Odb&Im6)6VpYsL#`SG;JLZ72~ zgwQpO6%(c3*~ataZdoYns^&^u!QUBoZnn$xJxj#vv*v--GL0HD(sJsRbPOZqiIgsB zC5<ULo<pI>+Hoh{OU$E>-*5NMX6+N{;d!Eec;;6NPI#P=+}u|baemw0KLr!vDqn$h zWel!s1RX~uovRu9iq!M8=ijS%=2H4@?K7ql*YK!#Z0n8F7`>D{B%ix$4K!Xll%uo7 z1%h>6H)~J1_1JGkFCWD4n9JF{zr}bo*zVhoeV)avy+06Ll&L$b9uhvL{c78_UzTT9 zd=AUi!S9tleQ|y2608HlZE$0sY|Y&w<0$3zC!g)0xFSBI<bz0k{j>NUmz33M^wrd# z)V#@#si&ClTg&~t4QC$4<79oUR+g)lBPzFj%VQC`m@4WENgYY+2999lbiIh@c)-Kc zA?Z}whtf*CM-skpY5A4d<}4ei|46ZE>!`$YT|jNvd<L}}B@N1_{IXTnJ^kcXIbYSV z9t@v`_K(IAHbzimn|8AIYoy(_F*F~cBWdQ96J)(eojUb>S^|!??P2K<pZ5y7m-%DY zK-N2>!SAB?X?5>QvHbzw*3>f9W&IfdmN9+ndZfb7DhSj2?ntZ3CqeysDpNu7e<o`= zYj@c3>{usW`;PC#?|qWa<y<rkD%Vk4E_PGfBQzv6_B|7)@J64eK87<F2HU#+i|;Jj z&K2uLFe6FRzQ&k@)_gs06Y*(m{OJBWZ`+2eDNWDIG>>o-M#e9<R}WckI8YYU-!-fV znzxF_qT`BPU|HC|eS_$(OuPI5EnE70l(HdAKGV$J2c+E@`s|_w*K#+#SJI+U)_Xr* zDbIV!Hzji3xnaJXNA#(i*}a)yRGo*%mXt|asd{Fi**g?G9}R`nPlkfNX($*!r#_VM z{4Y}720V`S=WT@Y>HVLVNOkJ%rDrBB9=r71_QaNMW?V(INkGTiI$dLbSyUk7)cf~B z^IWlAi||REZgw-+p2q92@rM50H4qH<hka|Zl8&wa`{A-~gpQ;sXZpbZB;B`DA3X$_ z3-RY(l6qHb@)7<}X;XQT%-^x}keo+6Fk%W+JXy=sX<=oKm!7SEi1o46U+ot1mhNX` zQG}VH9~q==xgPI@fzJ;^b>Drg?+!bIQ#i{DzFQ{Cbvf1aj9>n2=s8XQ;;_s|`eNC$ zk*gzZ>38l0lXM3|$|$Y4k^0PzCOU7WcZ>tu9aO&MB<d&h-)P%P$J;}eyQ)m!`ePm= zM=4X8_uSwA_r(Z*UBVP-xNECWPW&5UzeISo($qZZHx$R@$(Z%YJLSCXpHm_IP3`fu zTLuSd>!MYk<?Rzzs2?U{spY3_)5cZPMp`zXJVuu19zy5Ycp1${ij{xhFc@ybe#yI! z+C`-Np6jT;vi^W$-}Ddge&e*Rgh0wvFlFO&lM*xKVH!^=>#G-pwwt&qbl&W@-v&)* z`{c1u;zW|Ke3w5PJ7Y^A{p4d%Gdch+Z+FDl_8YLD)NjITw`LmUZA{m;S-s*8x9hhk zEbsbSUhWo*E9#duZ3IVO(u?OnME_^hC4GQnb?1|-8QGqHuxI0{i|BbM=R54X)B2tt zG{C(LYG!KRR}wudU27Q`jaN~>N@!5(J81|*r)(qnM#bGDsf#3SS;^X^W7=p<S)O0> zz;DrRC-UN+p?d<U6Q$n2_1T5g*!f!#<b2-$7!qQ6Td#VW-3zM@U|iS9Wl(-EJLV$2 zM0E{k)A`Q4fSnIt>MqSO6Jdp`bKQzR&tOSk$>AnT^JO`>o2y5dJ(sa(-lpG+gmfbL zDbKL>t)waabXG{5I>qy&37_xFHPC$FF^J2f<3`$)X?sIxdoun+Z7JjYX(9Dc;x;{V z6l#oPz_j;hkjMUfD;OVT&v1l3=H>$t<5sP~c!XCgty+UWN2S$%BK4k8TZ8&m_x)b6 z7M9aDit87A8XK(h&8B|TJX$<12sh&r{(Khwz*vZTVh)F`)+3|T&e8OA(3nk4uPo;r z(e?$6#=RVF@{iIzjmFEcn%$?{dvUyr$P)_I1^H~JXxqOU*7ls(Ppj!jIkz`zx%1;0 zP<cJ}6Afi-yrrv^Y~_V@VE7N78^R|_o5t+W>}TC-jGH<p03PX2#IIGCa=rk!mX3)> zy8o*fy)lTH{{pMO2-7Xycar-0v$uoc$2D>p)f>iPEJA})`@!(G5q~j0zf~{035-QJ zuf!nvz;=4iOzI*@<D_Q<AiDIOr*NNlAp9|%wEvl>*E0PgG@`U(sE?s_e1-R3-;ixg zy^=Ru&#xh6yE31h$;K?oHf0{((H<LfQ641TGZnI57^JC_5=));55;yDw~Rk$s%gWO z&FA6%^p0eGsmY1Qyy|K^eh9~Vn)dov%W2AI=K;0D;z^J+p_}V-OZEt^PK`&(jfE_3 z(l@b?t-4!q#7AZ?Y4etXb%3^A_$RYxTL1Oh`>6AmmEgLli0McDHJD$YL-$wGj}uMP zzFf%2(!#Sw;eCv>*H2~RDpG%<srPTJy(gU88j*e{BG>*k_9JOWs9#O~?XXa;;c`3< z*1xfHgyfrkQhX-hw@EU8+(v#6l=b~;0pwgjeUw};Wy%-veplJ<oiY&YX#*kVnt@O! z{VCf>zH7-qD7>28Q%T#2q(%>(C)aIw&DoCPJ;WX>?hBFCdj<b_1=7~@)Er?SlFtku zOIpfT!hjqsyZvN-Ew;U^Etkl*oLR!jw|u*pt0VO4)VPh>uH!pCmQM7rXB{Pf>e)1Q z%f2VfI{##rtW)6L@bOKP;+ao%f8Q<hD&@CC@L6R--(jWkfv=j{c19liIekQ*)y4NE zDP=9AL)J|G9wz>;G$ty3j`g2Jk4Vyt&-rz#=CdBav7WNty^hLP*6UuO{<7v-JP+ol zTbceK`o@mIOkJS~+oWkd#;v>V#P?jKUMQdQC62?}K4s^j{Zefk&be?2=<T%KbI%Ay zZ?%j_%cb4Yb01!$`&?o)e{O4Z)3HRjg+r%7`aLCJxdF!#s4i#r&XD@JHj96sz_XQo z4jIByzPvYu##Pd4<vrIdV0BxB?Wm@VU;AAp>>X3-UTPoaC-~>@G=5PF?RQUyE+cPS zTKb^+>fE)gP6}fEK0MC>>2nDdKO6rfUxM#32)Q$Ql_n0ML8;-X@z9nY+4`(_me(!4 zU@D}o+5-6(RYGID_T6#fdu0*nqtwm)%ldxvAb#`B*lv5euy0K`Al_S*vclyHZ(1wG zh#0pfpZaelpXnCXZhTqd@vxnXeMj5Pc-+nRVO%8^$yd8sKUQhw{jvTlY46l{^$wu# z7b;1TUt)2UZB^%p_ZTJ3pPFyUgT|-UK>W}9HT#hjHH>L9-(A3z|4e-v1>X%r_`1y# z!8|c^e3UgF-wVPm{91`b$C4cJXHzmJU|fP>`5|;Xl(Mf9s=DcTx^9{;9Iw<7$DsFG zcK__GDUxY@3Dh@~CWnvXh<;kB;r`Lk`wYLA$n<MeK3QsTw$uGhrX!j0R98~Pq&9jc zaNWvdGqfQJU6<7c$E5L9alGbveUv<AAz%i??8ReknU3!~^0$>i$-`42@ppFKGrwsS z;_1$b71k?dIu9*|oaZoJVi_Gf-RE?_u2@OqJ|!>7TQAIG<aDg-X3B&vRO*-RH`MK} zLuFhYqG^2aC{th2S<95wIN{1!Uxtp)n!VaSSB<TI3&*$ZkJ7PJ(tvB}aqC*sMb8{c z%uxA~x)P|lc-C>tB-lMJZJRB*nZ^&+Kj>MQ@P<npu9(v={d6yBpRKfHITLovGIaa3 z`=Z64_^`C6FFFiywYaaT$vCFVn$NFs^T~W&=?XiPj_1e5^Ff}hmr{1!*GJ@f>!cI2 zZzZle-}IY3D92nKnT<!^F<jOQVdZWZ!<3sd+0SETe8u|Q8XaA`)?L`I#1FyyldGGa z1rT-*Y+<lbUCk6+m(a42YeVhmmGB4lo4E9U<A316wVb}j*|@)%Q&@kFG)}8t2wA%R zuXppV|6Q!39!VpZf_*AkwTA1Pn$~gwjyv-g@Z%uUp0gk<j!YY2CMJnra}lyKWHp=5 zT<$UBv2`XM4(gfy(S%@{@d92$3`2-Q##Quw9FaNi!e{t|TX#e5UF>=h!RYSCV`$7< z81Z=NKjiOS5O&t0V?m7Q%eCV*_Z_RivnO)9>iig=H{CnuN30*|XUCw`{pQJdBJ}vX zzNB}x$;;+|yOR3nk|^zd6P-}%s5(B|tXmr^>`(Nw?AZW*X7?n=n8?N<x<>nKrqrM0 z&1X=X>5awf7q$7N=d*h*rF)UCmg2&5A=WGb{{JX-{vw@|tF{WqRH;JYAbbZ$>b%S5 zF+3%}`rOW+ilAh7cwB_n*eRY<)CP~SxTsF~(p|&)qx>bigL)Z0rsJ)o*UFc!VE0`u zy8hM&GVvWi(@*>5@v=Td?IKdVhVM2)U;!HoBnh6s8}mB$6(ZcGcg6P+N?My2+jF3D z8d%DP%Q_<(=ND_3vXT$wo5qX<$5+~ShY4HzA7`p%9B(<PH}siZjcZ;~3DK)2gGcba zI@9No*|i$eQ(7R8Uuq$}uZnqgwOp^}aoio+7bE(tarB-*%`YmKXVpSmK6?+)_9dR{ zih1n1cK@5kvDU+7(D>=$pspV2S?g+S=YzYT>2c}<)$OF*a16iSm7ZM7VGtUvG|r>A z*IR#ldq~E8vlzK)mn>z<=4iYIhz`zkfoUi8B=tVNmuauxvp!f(9JQONC-imSTn^Ud zY|KL1M5$>7Kc?Qb)1YHb=)Kl=WTQ~NNXCiO`5NhZ$Sf557-KOzrq(M5f^O14sFMED zufli4@a!tcKbPMdlh2FHmshN$>%bEeo~Q6Fs<-*oyokms`Am#ke|@Vaea-?On13zP zY*&tTM?JM2&wuhD{s$aOHNMK8RpOtby1FOh^`pdzG@ttewTXDuGwK8XW@9LXX;eLj zRV~L2J0t3+nvax|w|XJ&NA^88(xy%u4vmJ6vcs~x)EU%oc7}Ks7s7E~ULy0UaZ%a2 zn&PG$?hexGFS;$5nol1l^LFaSgZ0cUV0=aUjw`3>kW8<XRo#Vg>o3N*$~Ka3=sUZU zGD$0zYR5rsg<^S#xAY2DPnUGxPcSp~`Q*I+5jvL18ZkEFGyk|Bs&2#U6_vf$uaq&O zzsJw#G?j^cTi2~@{DSyHy$TanL(S5nAb#O%i^1|WUURPTbWaM!-=8+isk9#=zCb0v zHV~cRTKfK@|FbngT{BK*{dG(!yMMIjj0n<I<j#`Ej>xo*+zLr&-3E}fi)({RF+QR# zDPZGq!jIDS&5~dJmA^0b4;R~=V*(yyf)R6ZB~(j)sGL841|(k0#sq{;D>bzpg}BY) zcq?sCEY~lDW4eIu>xJK~6Viy}W&Ha{kk)k$wF%ey0*1fo?;{|k?^zzXuSAAjdEQXy zv9M=Ik$h!c)dh>8;k(ejx%iJLMmHtDDBtr5UcX6cye`)J?3!5cDYijtyfzJymv#q@ zf9#Xifq7^D;;PL5vU^qb+Xo=?H0<k$3}u>{w+3>y(Dl?lM|_t;cuHTz@4IHc!^W(r zy(Fd*vVNYcISz=XDIM#Qv*`eoG|)3hQrB=uo-i%QTe+SeU&PzrSNcWNjv3x#+CG}0 z6BNu}Mm8S_=h4q|m~-(Oh|gFD9Yg3@LjWIfRmnkio)M#G)WYESrJOWJa}M<W(7u%@ z(3~fZ9Z7q*v@%L;>+PpwTkCjt6}Z0W|5)gT*rED<`q|vTu2q_S4X0ycAzf=~THDpf zZzF0fW!e7zYEIwIvnD{yMbd8z?ZNg>=yiY9){oGTv~-PztrG$%O}f7x8Un+E@~w9i zK+f~LE{I$=p4}I0?JGE)6|h{kV<a1M<iC#Rx&2IjA4JTq3~fJb{X=_iC4ya7(>My% zWnICKMfyk@ClS8XIrEu*Wq-`}o6wOo`2o7;qq@5Ha4b=LDLZe3KB9Erc18!p(^WqX z{1w<|pmO$)Y}^>QWd%6i!@6{R%EmJ()p&k`e7ExBfa=k!6#DM!8ZeGwppVl7(Z&2* zT#wq&E7wogA}X7sYlS!^m*RNT?Aro<>94XaAU)q@3wWfz>iDBDplJ)Zq(Ad#QoHnL z20EwZFQ52+kT_3ldq`*W>KHEG_jI@Ou^;Bp{_lt_faKAepyDj;d(4zwWia3;)+Xc6 z+!!1?$L=j)_*@zr>Cf7{1qOVv1yY{rX2#Xk_xX^Vi`FvrNGr#A3*|bCSCSLrRb9d2 zh9K2!G7Qr0rzVr4p~lRve^dA2kUAsQ>O*3^OFu9%yj`{v_v1Ye?2s`Ve~gv$iY{>3 z#%&>D&k=NOJ9lk^+^c8FnAz9wmh&8_MumCRF7S?&ehcq$Iwln_X|Mgpo3#B^`L2yn zl1$@4B(k`K;t~~-o!D=Xa&&hItM|S544`{)DO3&^0Ugd*&>tG6`TZti;BrV9I1Q>E zr?`z__P?qxwePoyUh33#H;rr3ucn_>Cv=`2c~JB4STLWl0NO5C2icRb?=9W35fbjE z@k;)F*6$*I%gmL`7$hHCEtehT1(2xttym&2Tw2l*zuc3TC*y>pPkD{nQaD=uhzT5S zhQ{xPx$1b_62~!yKe|o&U6jeJ?S#|eMA|L3mC&sEyf4ACUrFyD4PzpU*%5DPJlzM% zAI9^SxfaiR>OHrCvHdWls(z22$W*7!$%nz`R;>$(DDkGnP*ZM~$IhKY?*jC>wQ@be zi#O2N%W?`nd(}V4&V}upkqi&wtNWIX!B8D~rOl`NnSU9*FTt&U(*Iie+c2GvvCnK$ zO31&Qwq+Q2e`#Aii0hY<ALSiOCqwZ-yrzxgXy4RyCt9}6m0~W72~wYD<DLHCLIu_{ z;o9ADzp4htLh~2&4C8O1@81*bs#xvVB{2Iics)xXF?z6!N%$g7ji2DS1JRpTjt2X1 z_WY>-fPTgxQcNYCb=wwjKROXCHFRw$+r#B6cChvyj-Ip^zj8!4CZ)O5M^)AGdjR3@ zPilzbeN6VDR-t@b8(q^%8UES)+$-B7$=CJ0XMt#S`xipR3OaV}-}C25$2)!JfIe`` zA-soqztOh2Nc0Fr<Na)Za9moJ;Co50mC8z4wl&z+woN;J(ZcqY9pCzI8_mk{pS1wY zUl$1HPD?hauRFUQdaf8Q^QON*`$lM#X-Wd#Tk6)+HK=S?=Z)Xud!K}dRzst4oh*mY zRsABJr4+B`7kOOi8VUxCD1!RG91hY}?_zn(i5S;-kjGa*bJ^6?Zm@qy@ANo=zKXh& zhA}#d=*)vAfvFJhktx!hv6{yA9e*bDr()Ydv=$w<V>O@m0eTl+c!qSBo*+IS*p_eS zWGb<Azlhg1qRAOH4{Das_QLr~AUmF(A(S{IZ+;B>B-4>tS#I|4V%-o=@ozEE^)qX? z1Pi6Ei>C!~63eCUBYniqiEBuaEJMi?w{#R39?J{1bzZRnJc+A?bV?p|K5-c3N!!5R zQD&uXkTKiz)DNq1P}%g^ILLX|B-3}DIRVUyITrCWekeX;r0vxnD-lklb&l>bSwF)I zd*!^6->VOQPJtKkd@1>~@^L@0dwtt78tWn+>ltIf{qqWN4&c|m2s1Z>y@%+yk;bMX zdab&&K}#X$WNN=!bOwQ41wO*Dk>z{dUv}Pi2z1tk!m%YX;uCA-_R>8=p=ONqURhh{ z_c)Ut&|Y5zxA?lyHcIG7S}pw^hS_pBs7voxbU*iw#lAG=#(=CR;>p@cV?R{3&gQ?@ z=I?t}PR>IV57CBtwF&OwDjYQ4ZrDuylW#HIuaua@rF2Y{^`Y`L3HWzQLeVJO96#rQ z>#Ks`n54fwH<-3b&lhYc=f?r@d9UNo-L~c0`&7w$C15*e2s7ro7x5ezUZB26sT0X3 zeziNumvQ$2nZIc^9=D{jF>+n?zs5k;>eW!X@rYbUFi`4PG>fZGOyqrI&2XO1x{cmB z5KPCA{>9Nv&7tG>=&QGI`Vm>id&GXJ@mp#?LE5FP9UIr+^IYXsbU#3J#uwOi+`e}Q zqzx0xK=d`sSX@*W>C4m`p10)W`CQ-KhsEn5Qn}V2eUM&U!r?~Bf4p?Ai$*gti(}dM z4J=oMjzJ=o>#2-o<S6+(rDegk#MgFf(h&NRnJOES8mx2jAmLQ@OqO_PJXDWob=U2o zylp4l1dfEfu<{z09A69&9aSr1`wuUGnxAP5N%|s6qZhH`FQRGNLT$9?i^Y(zjrL1K zuT|%GFDj^GO^$diCB0iD_aQqI#|w>n_!wG=@4t7e%tPueqo}^9uKc}ImgoMmhNC0& z>eTJuD5OmtD*1`={25x!Ps;8eweMjZZ?k(W;win3U*`l%nO1jh0+SQ3f7?&&omA30 zJgzw%;}#!V2bot56824rpX?C#UrBSkdGlKn!pc`;*PTXf8?`0hH65ZK<@X%I=Xxac z9CdtrRMsIe#V6+pe}B?;@|k4lmT{`?TnpYav2SU-Y#Ov}lAh1;kML{1KXUs+t9y}+ z#R;#kX(Je(552w!tul>1e~#Q&Wj)F3d`m;N6FQRW2eIoF)u(*Go(Bo7DDC`uXIOcL zS-cE2R?MhrVR6(v%5uvSG~OchSyQne%No6c!7gtOzkg?5fo;4cJ^bejh&+-ytLmZi zKoO+Ppr7#}ZOYX48;xQ8eb3^^xtZS+Qf;iCQDPi#-hWmBGbZ71d@saCOmBF)7NVQB zhNX`_f5`I0Yo~zkLplybkE*G&82*lh>>0MRxRz-rd?-!3?678=;~Q<?rNmI@>({Ln zVkW;oDOhiOc?DE_#rH#v6RzCj(VlDjB6>bk;}~9}^O+*W3F>xK&Ts%UZ3bZ*YPTfq z<=W~W5$j{S6|br0vw3?(Smf1tf%aOfc$)WRscYGJCO9bdyoUD{eLnX0o-W#FC7m*# zwVaMwPdjT<h6h8(X^B4_V#XsdYavrs%JDog9*n1G+ntg&T;4Gu^d73_uegbgebw!a zb9ZU#jc5%&vhuPQvA)=_Pdv`)SFQ)+^{j6tva7$Q`#h;L&cn2EU+^~Nc$Sq>_&klp zlTRuO>TjH*J-!`+&vKS-u!CoQYskJ6-Hs=<JsP#Vb0s@gp>R6aYTuiAFVS9?O3X$# z_BYBpl5hTLCj=_^`7nQ`J#K{eL{iTi;r(8G7w?lwuQ|rdP1A;X!LsiXQ!p)AN^RhH z^-CM8eGX7#x-P=&p!8LK&-e7*R}db{1vsYBKRym>+QY{;gioEO2!3lkYasT+@h^+_ zs?L*#$>Y|uf{uO5V*Go#M22N=_<JD7o0miR2eH!cbzr~iKMDIp+fr&rjeTtdSCp34 zY1_7lUR3A&jP?b!JFhO0`>CY&wBT{^UdZ2(De1!HE$2nfA86Ph)I}*H?$_{k5O{}< ztCCllPd{x6ct?xl4JDmczH~mjZz<_Km(3FPqvA^XxhExkxV-a~l|sBwd>w+%+FFjV zaYDxr>>W=iJksWD=hrQ1BWcRT0ceo^3J-{VOUnKHn(4S_hGrlAm*aga>t%M2O?w2d z2c7#IO<tsv-xRrjB7KM?O{^XhQf?#|Iq!6zFosf2OvQQ`uXBv{{04r+Yoz=K?Y$1+ zW_-Z=9NWSG^lW6;Vf(8lS#H8xH$ll}v0qW@s?K*T3V`iEWZ!*M^M)#?-$rA%__!6I zvxGjs`~Q+B_aziAX|ptjUZ2j*wB6xgV=()7#~|xy`1iNcUdM59@+@ti1z#+LY{wLE zG=<jR@5jD9Yo+$w`waZNm-ZG#JT7%d`FU*kaZQlF;;cU}R;uqi8<M%GYR0~|W_uBI z{(76NZ$<PxXs*X{lS{B3g=da{<RPt~Kdl7x|7Bw*+ji``3bR?CiR2_Sv+Js2Tjc%8 z|0Hw_8sjPgTh0hsZ_=;QqjWyf9+LLdd-FJ&wqcu~W(e*-;X`Rp9osi$TYvMq*+(EP zpRON$54CMAtb_^J&XN|eJ_FGwF2cIiWge0HV<}q?<}TiTMEF^C+VAVzKOZe)ig=ZE zZCUKz()p<N85!}#pzljaueSNMvJAg}x12|9jzKi`cKo`ZX+!PkWtmAor|Ie1D5SxZ z_<vmX4(J(-<Hy7q1HnCvjjt?^@p@b5voW6%Pn0)a#$t+SP+j%&Wl()|Fbp_9a=)O) za(<|7KZbv82|FHYJaswk7wx|5&ZTy&<cpV{jpwnfmSs0p<G3wt=tiji3da)uDYTvN z7ROG5v<JjGI}R$||Gko5yN*$1vb^Z;`oDJ?9^-A@c^>vtuDR=EY@#bl3->B?Qa1dF zdCLRTm!*Ekt}&$;?+WQR3xDMO161*Kh_B<bC@>FRAncbC7v-xvBlmw$#@c?%qx?OJ z65sP9JD2wNY9rD~iGlLTkL;HD(q38$sSQJx8&g{4I@``#=(r$!yqWpoC~(|$Q07C} zx|^gms(K|JlfDx&cTliC;ibu7{d_M+gIJ<Z-zKbYDLZp{(>fftB)>^xPL&wB=)ZU& zgQGh`j4LxpnT(n!hNmQ1J649Nk)5qlf5Ph)0+inPJUiz|hn$5I7};?qU$ETk_kyeM z+3fZY@gAVmIaJ>M4DXvm(W~1mmu!I!>92JB7D(N=6<U(FK=B0Wduo?%fkx>s=Q7^+ zK<^B>AMTG1$$2$4DMO}Y6NS`%To>c<s*dUZ8OrkG5KVb?pReKCn%2-52kBF8qWdS& zuRm$}x@nw@Ncg>FE5Y-oc-?zqsXx=gYFr`SSG4F!z2jH_a_6$+lJE_lGuMZa`8tB7 zOsfVQfX;4{JQkH#9hUP-I+SnUAAVh`d6ebSEH4C3rM9Bq$DZ}uXNrBXp&0kC?K|r8 z5N_4Ea~NIIei!d$N*zc(fAcYDTrFO6)`JBMF5%Hi)3+#W@$nJMvzqrquk=?l<rt*x z*$?f~U&&r^jHkqGZ)R;HMmnb`+fm-TiN-`pjdn=6lJ0@}*>wDRJ=BNAOgaj>d)Gi9 zfnRf(AI}BT8^eQgI%ZCSz@7N)uasMJAAbfdPFw;dlaE5m%lv!QX|FGZ1|R;cpb|%! z?`mexI+htj<-S_KErXQF)YeRoO_tk~7{`-0R`l(YE2tf+aZ<jV4_*Ic+v~nz_04#j z^+#%q^uO!~>fAVtom1QA{P?PQmF0>@#5V2DV9!9QYuCzSq+7tsM0mN|sJ^yg)bAUA z;P2raAJe$SFmWN6Z=46FH*tTIx+(L;&-ab1vQm(b8&U@P*Rc&dZk`v^IrUeuFV^2j zZ9V&aUQYo$Q<e50KMt8!DAuZiI=yhOJbtcWG+y>xhkcLd5dS`F`ks;?PtV=4khAFs zK<*UK<*$c~=di6*e2o2S^-k?`hC&57n=+B^v7|D$m(CxlLutmA$<P(U@9n6~{Q|Z% z$H~-&^ba18`>A_mA-JpP858k@dRd>tc2W8*>z8u<I94nvke*XMhksAkpIiVjuI-TK z=I28xFV(Rfvd+aZh2u?epOo}nW5xa((dgczvfPhum-|fkjhnH~q#U?}-_zU2QGbf) ztpB0&81uc4!z5Ut(!vX(j*E|AmOI9Rd*5wgF?7EDK^ot8RA+=yKa}2yIEwN5BiJOZ zeC`;;Y{K8uuzxfi(*LtnmS=c(48$!Ge}^OIE$lN*Uw6y&1T$&;1g?&>k<@Ujc+P$I zl|cM=^TFlkaS3mzG%=gSZK=jMP0z75ko)$eusW*cG)IL$-yoj&M~;H+mmQk;(SIom zwt0TRsanp7l&vd9Gjg4Oo6nR9cB6lkTwgb4gq$bsBz2^>YPJ!YaA~~s%mG59HwWZA zsUxZPdhBDXrOzs%y2fXD|D6%S4-lLn?@zIeoa_&IKdYn<mA52CEqA3C1o3hPv9SW; zD;>_C8`XF@!+E~;Nn2$dd;ZSaC*s%NLH9(0=Q9qJc}QI#j_s@QOKp9s&ywOl)$h&| z9ChlOOXEt^X8aGe88vO`fAOAOeLp|Hz1`yX*3}rwa!LgoYo;|X<od0o50y`8(O$Qf z1#`ff%I<LlE47>5OC0s=I1@UQHovr*(a)Vbhbb#*v)XC=(R@CRH5x96T5j60G05Y2 zEsx>td5`+>KqB^M1TS$To};$qlfe7tO0dMNhIAc``4C<5h{*T-x{*T}*{+ksV?*R0 zPg*=}gyyqHvL+m6<Rg4n8SB%OG7XE_*jU-7&UgCwxK2%@F8l9V%jr{oVJ%mu<V%_z z1@<ZQvvA4p@Z%rzUJ>~23yniCvu>RhQXZj0srhbdTgv(q$)}B28kBGQH@m0R9RP5& zvG0L}lau>VUu+xV`M6zc`SV4<whIiWjfR%@4?@~iV*i$zY6tTy?5B|)-Y5CFL-nqC zn5J?#zrUdN{=7<ic1Aomp>Qkav%WSIEo!S-&z_MisqFoVlE2bI{XzNP#A~3l5s#JQ zY8q#kALQ=>oDZ7%)!*bE@f;}iQ|8l;;21zzr_S5H9}(2SSW5SV=1<r3ORwfO@i?eu z^{3qa@^J8d89vT{tz!G_kF0RC$!FksZ1YBO<I>XC=J=gG^Mu1xws%g(cTt&l58?2Y zbjrMAFW%o!ooyyQuab7X^vo=hSEkO%G@dWKn)mf>g5N%Le^1v^qJJsaUZ!@U#O_bN zW#25JeipN~y|#M}F+A>ZN13uxzVkJ_MxB2v3)1M`<@>6n|FiO?w@!rio9LPkh3mXb z+g_@_<b8!2tLig0ezceK_lAb|F^zB31jtGmvONAyHr^qau0_)4Zy((V9lovHm?k{K z;}Sk~no`W)1(YwNcB-aF<>VXjT#4HHQ<u3Bk6G^9MO+^Y6Z4q5%;c${zl7b}dwYBg zO(@xxTUSO*tHueW(6h2*HXDmo3}Eko8e{qSP~+(h{nMq{$DRd@N7%Srjjt@{?_uw9 zm2LgW>xX08hrbM2-ejeH%pXbDPGaBhk~S`*v7b^#qi-~%7O>yRFS(iZANn);H#R9x zQ~5-e?hfkzNS(WY`rG`Z&_27;I{^ZF#A_g}3CDYh3#Q5TRNeP{dm@XZj;sQi2Gu40 zvwyK7!STjPzkg9gV^6>Idl;lGk~AQli4dKBBp&OgSH?ru=JDXK84u-u-vO3WMu4G| z)s^5{ud+uZOP|KhBjGnhvFioZXYIy5-nwlP<alGj^9g^)*LxXWbM72$zkvtv{5c_V z`zUSVafx2)w7!gw)9ic3gK6pDVE<j8<MHXN3Lj^gKAi@+=eGv=N*+2Q9KRHu*alM` z=j~aoD=McJu(-X7-}*85vF~*M%<f5!mdHQnQa<z;^c<!(uGYbQcliCe_-Q<**-;aM zW6+yM?H|gQ2I~?QPY$LTn|#7?LUQe88#LS0dXaMUeWB;cU$+bLw{B%{^}FfaQjFuo z_Bj3IBVbfKZ!r20_9vc4k000e(;%oxW9J?9*Ex_~6Ai8OzJ!cN;NYQPUpt(w5crj~ z16>WaRYY5yBDPC{6E1ZnMd2}R*aAHj*p_215bsxYbHm#Zk(W}5$B&e2mUjo`xQwI0 zy@2|5(oWLo4cNY%`{)>1Mz3S$-JQQMShjZUXX*)tI<=fkV<z*BbpLPcdsdm6US0M* zPy)IqvHdICjH~!_k>dq^E(uS&VK=9*sRQ4&loZmnZ~DQ+&=s$s`lsq=K+eFMz&x%t zNRv`W+lZXwO=~Rd`!NWoF_ygtHb?XO1Cf`|#orsHZyXiWGxxJ1rcZ?DL{sCVb2wb< zq8-7ywkfqxm{tq!t?V6P%-$ksnkcq$r9Qb|@_VUk5gm`{9DWZqJ&5PgJ{;>n@Vtkq zJ(D_=Hcnz?n3hs}LRUSNwSQ8tl~yED8_&M`7&ks5zUm(i3h5kI(fRh&4w7jMIkX<( zIcDcU;j@##^TT}5&8G33p%dfw`lP!Cqrz5S7%pQGeWKHN`y*}U|I~u{A$Ckjn>zJQ zqWf0I>jz{xwiWoCmFCBD?`YZ&2I)BvYJPQDcLVk}4foYUZaX_)YFbooeukezHC_5C zbiJ$F`dhZ=hu)(a6@Drv2akK{CT%~}U-^;H$4wa$cAO)@`Crmx*0S+Map{PNb<Pja zwc)?Bf9usbh#i~sd*=t`I!<QqO!MCkeFxa^dz4V$##<Ib&MVu5ZD>3*)7f=b^PBiR z^!|>0<LOI-GV`O?%Ci027RdSj;t~2rJs#`M(<v@#BWcwRelH?zB&~l2`vFoWsr51( zkCU<})z{(s>&{g>!}cfeJoX<1$Nn+DXOT8hS}|VXHzfk^`KyF76F!*(4R$=2@XB5x zjR;><XZYg8{Zn;3y$cn|h@{SQ$p&FR$~&<iQ)2XfMdM`e2mKpkB@W8lrO)-FG&vr} zc#Wxe4%)qu;a0q|i_<%25RLzI_s~5O$x*-bdHh*8=~NSkS@BEw_o@ru8WZGmJ-Zv4 zp2KmYS{^D#ucz@$@#CTQFpCM_FCjj|X4)^?{G&lxO$Y3tU#@*#=zU@%*B68p>8t4) z?5lIX#`|&hb@&b|>)vK4jf#Tkdm@W_Ldo-IV?SWoF*>Mg-NSwTyt)9YR?u;b{*;cJ z7M|{h1K_xr_1}j5;pa{ZPg$RRJ@)PHMXaAu(vW=TQ@jnKw$2A}%vARUK-aJ}Cp0%i zmMATGTO4nB4=jQF`*wq6)XIot8&BfTUP^gssWb*g^>H)Be%kp%<ah5%{9t~l_&rSj zwt`?ET4sh`LmXaTMN0i3ND35zYhqs?9>KmO=2d{0cd@-|@%|b0In!yZVBLn}#I!F4 zLtXEmb2p82Z2b9P$ayY#Y7->YN4|zLy8gUzNm^b674xW_#sos^8tIt3bdm4L{?{&t zraSq&#fs&4A8L9R??a};*x#l}pZm~1HZ<gzMye;FbJpNJHodC^l789*`TKDhwI{gP z^+kA;sbe-?2g*86G4`dXE^V`Rj8>c;e(s|)s1H`kQ07Z7YL&;Nrx4#QrFvSyFa5#0 zt&q5*6@1cP?t86}l65#pn^Qz_6Q3O<^DA*lzB7Mqu-!LJ`i-LV#lFjX5#1{ZA4#Jh z)ZROCB|qG`mOTRyKHXh7wkBngR{R&o?r8&uXzJZ~86F416KPt1v-Df4<?A(ZBgH{< zG1B)>`a_Rsvk!{>Y0uGa87up)RS<peP-yrl^qDyQTr9tSARb@C9eC}ee?;fQ{yW8O zKP(<^q?fZ$dwzp@UpzwAuVhD=oHxEt_nyv+u<bQpj#I>^eA((pEKi=lTIN-@p?u@Z zq4#XZ-}5wi)mSH5E}6G6q^xrDKxn^iAe2rY2r20UHEA=YXQ0<SD?W$V#s!3Y-h0@X z%4S<3JzLu+(|XoRzl--GK9_iXbpN)*&@)xc(WvDmFH$>5+o<iQA{{GTCAJ^uMk*8W z>ZRWr*21vO5znbrcSPpNG4TAwuW6qx5~c4$8v34*QMzlpjH9K4vK~fgKeJMwrO-oq zCc7m@dUkqxttNi)9e8hR)a`=oI`-LA?x)x}RO+D2+uV3wJehP)QMQx3$wA+bj~-9^ z(Ba%6)UWyulUyHYA0_7ro>rRwE{=~(PwarIg?N8#Orvo`=e3h$tn{+MQ2Z;N-?k_4 z9@6&BCP)~J{gyX%olL7G57j${XzLfh82gv%okxRM?QahU{}Sv6pfYs)97<;U66&`Q zUE|%W!FUI&uYCyalM=_g5XUacI#J%abPKe-Q^xeaefUnu+By~5Ph)Y-=S~1!HG8hg zJO|rT#bA8y70D3Q^?u*V$Q04^r_PbGwO@GVpLaog-}j5XOJ)UmtJ-hlFgopYtSzIl z-*OMfwx!F%Hr+LSFUQv(-3e{yJA=UF8UCkWAxz6H3O^y0b2o&JuZSL^)b@<F?W^f? zE*}=`L(RZ3;8=zC`oejA=bXv{h~7hes+t#-o22ivD(kBY#zSBy|30Rpb^+wxL(fl$ zCu0PE7eugf_Y^U>q+Xq-KSB2+)K>FOXdl@yioMfCJg|NuxQ_FgCrv-G{YQA@)w7G8 zQy9d{Zr-oG&m)|ezVB~057L%{=<1J+1M_Qm|ISRIekg6qBuLGqu|mUxtX;uiZQRn! z27*6DibY0Xf00y%Y2(jZADo-S({=_^`#`+LkRIw+Vqmg7j}2?_csMihd7$T08V@-p zER^Zg7^s{u>{zfpcZYb*<&@yFXhoX#9*=O0Z(})y#dPmO^~zV~WhS96feNZ);-%Y# zH1$zbesL3j7Sw+&{jT5{{QjSxPsc*33&|I^9FgUf55!|Z+T`?3UY^{h%9Pi$v4yI6 zfVHR+>ivJN-&e~p=HT%x*3<I@p)qxaj$H`d@uvCr4423Acrha7Yl#}k$tu}U0#J_o zpZ~}lNH~b?mtY#lU|-QWp7$AqMx6%su=~BbU8`)npRQ3tlesu@Tgq6-uK)PVSz!6e z1kP`99GZCAZs?GHhd7AsT)>Tmr;8sSM4O~z_Y0z%R+{xF-s82}NxgBhIL51-u$$8j z@l-6MxbZjb719vwNYeU+_0VAM8xM)W`DEYw0bBDT!me7dL8deP)`!!P2Ms^4>$TC= zzc?!r-4RXGfi<#xB~MC``17)erto4MXDI1WzGpMLN20ov)MHS1pZI<UwWF8eb{q%d z(((Vd-o^V;T^U}Nb?5T?fOGdsuJ1LuKCVuwQP<e{!FJ=<)b85j*>xSgn=K=L%jlAj zxNg&YFdrHUU7bUr{NZCzy3h_iJww5AWBB{%Y76xh_O(Z$t%Jr0Nr%G6UcGkSXOlkr z7Yz^UZL2&Ao{9W=M|ApbejEwER_e<Zk4LVRzYo^JAoUr~iuZ5QE=n6;p9r=$CW5Yh zBDkf$v^OV$F_q4#lBeYoJ_aW3b)SgW4{0Z9^cvm=*T08-k^gzIuV_3q7E1TpL)s0( z_g)K7^#_dw^-k$ISm$87hnS@tzy52yP8&bu+lam-t-J}}K{*R<lW|%Wv_gDU|JQ6= z9JNb=kJ6lJdu428{r`o0@3>e_w~Ff`JLB7L8^ZDSr%xG{$b5cg53l2Z2KGL$zGWk$ zOU}#GUO1idcLr$#2Vx*~+o)i^c*FsQpW~4#(nf~2r}nq_F>wv!?LTGH2B^4Pd)+DJ zyH?c-b<57cz6;SNKg-{%8*1nnS<j~DtRS`n?<Jk%DGjQ(jKXWj>Mg)BV|d+z{C)q- zvlf6~`pYTqhWZCsUtusWfOxCquVbm6O5RBG=6Y7gNcptr>W;E{_TGnma_;@%_Y#-A z|NdJ`kK?ItT60Kf3*oR@CgJr_e&cGHzsVWi_Y&Ncwc<TA@qD_5lTN1lwD&r?XGSk> zhR!RfPqF`XgscO>_x&65dY?ISdC6dQpQ^r-k9!cGV@We4pGoh636?TVy-oYxhR`Kk zkMWzb=-dV->Xw&2emJOSPIBbqgfMlfA$*V2UN~(7*MFjmR_aIyZ<~ZSd049uKjm~f z2ZUCXx)Sl-ny4*Qoufe<KOr9dx6~d8M)5qc9LLawp#R1s>;vHyrS8--m#6%S=ezWE zJYFTQVgF9(T`nv$;r22aKl3Z>vkR|h{Q}}ia^Srp>meNDC%hR2$rn<4EIzsu+-I|U zPwF-FUIk&~PNr)PmDMl9Qo3%GZH6ZbWF311zgv(tWt!ZM_^LmqYmwk|RI{;q*U3j1 z9z<6;F0@@#Me+J2FWL=RMY9+z$J}{LndpGh<PZ3BJF52_#Pu=j@&2nnm5wcH5B2h# z%K8a4ZPin2HTChe9p&0APb`LZ=`(SO56<D*)Yz!(`Wf3${Cn&et7!wT@Z;Na>0qIZ z!c(+$Cb&J_*xmxqh3>!k$AO#-vw_+a!9%HGUmiz`>Z=CuXWPKdbnPG-^zx?g>l?S= z|1lb$(^b+a^F224-FVB_>}THN&Kd*On(2`7;-sMdo;yPO)_@tWXQizE=FNAoW76@; zcH!80Hq$X}NIxv35y?*5y90DHXsj9dl)wM2oV}aFi+-m>uG9Yu`=IjM_;Z=#i&2og z6_0P+Y2(51yEwk`tY!VVYkZN6kMx#~<xCmXwKw~iy1-2AZvyQL!7z&A>03ju8HDA3 zU>g)JiDmFmz1FKbCVUJ}cs;&6$o+x(<%TVIjW$_%Kb0MO0L*vexy-s3?-c|mT$-Ca zNK^m1dDxD!--x`AYI*Jz>=~jax_|m9@!+u?vaXi<7eh|!VY%#FOg~!@<Vnec^3f(p z3*m!opRoI&^MN7DJ*xMZ5mun1R+dBbF)g667^!oA$l{TDWt#p3{oW9%Pmt~~NnV}C z{Sn!C)s^tL#ir@tOqc=bnc~k#d-Jww%2nzS|2U7WY!8<&>7?skL|fXUnmZ9ugmu+% z-N8O}CZ4w3852H6tJ+8X7!l!E&F@R7Eo)wQJVa;NfPJ|B`_Ow1qE)|)Rak#g?_ae5 z>VMw}y_fKD5uuUOo3Ia%%Y7Ng<Fvl&=f3`)QvewmLzcq?id%ZN*iNjs&(pM%x}F(w zTfipX?<>v~<LVM|ER58Icd=fE&DaMQj~WiPmo5j_FI0DBzsx_=`-C1Nwol7L_>Qdi ze2i<l1?y(HlC?i)62C7fvDNvSe0uk$ZtHJ3<+WCMyu$G|%n2WBA&jbWI*tT05U>57 zWabb1WgS|sW&JbaZ=N|G+Gg{Z1lw8}e!X^dABK*<9+u@GUfaz$PB5$DP2=4YA>oQz za6G>XTysY-JVYi*dw<g&6WboXFNBYz-i-duz3Y)YaNfN}QzyeM?0O|~w9=+ccpvY4 zcpZmn`W44HJzI`|`)humS7SD<?Z01+{}{)iO03+f@eq9;>+_nf7q3~%H1YUl4Brd( zi}rGTQp)izkKFc^d?=qZj`|sOTcqWx)<d8h&-(k+H;#qWS%hs_%KG)x%2**rPg`i6 zty{#tO)1lmgZ-hhE>u2lB(|?mG^j25<N31AEwd&=bi4TbnBHCVv!pGK(DNHgrtfv? zgKKV@1inwV2Ic!t86)cvil4MK-JrcL^0V++!n1Wt5L0ib=bpF=Ba5Sm9F)fQ#oTRE zd7snv2S3i`ug_xolI5rCGi~ZL$e6l1*zOv&2|6cH%&hbI_|Nk|J;ZO^043K>V=$Ha zp}ggDvF)kpl;vK9UdnoskAI54_iFeR>rQA;8h6oD@N|gJ!Ad%1zRiZ`hSUYt^JhoW zMpDab)CR5N_d>uD0N+>Go{BFTCLEvARboFyFqNrm9$tr*v)Fa5q=__NcQfzTBjI)a z6(G8564bmfO74&Sdww1emi?#D>#%t692p}L*=m}!?cz8tKZ?b*{JxQqlXf=MH-9r; zA0?KfL7L1dbX+PgrSqwK71LGqrKw#e@D#Igw&hGZm(~Kh{$u`WXXK-P<m~I_>Voxu znFTdp*uii+^|_u~Xr7FLdCra?f92V9U#Pp9>Q3m=8rXe=)RWY3=GGvN`Sk)$AOGr| z&^4Hjoo70ZFH6@@e}QnE)x3`(_~BCh$`PDgC6A|O5?DSO9g>F7H*7c@5na}NR^N>O z*a03K5)m(wRl2hXVChouULdw_dy_9>EQIH{hxX6)!8Y*xRHn(VFURjIB0lvi>2u!B z%EwXrNZx?$-rQ9N*?o7PYK%zB$p<6wha2hrUXEcZB$OUt`eo{iF|}kGa>K{(h&SbD zJl>vH>381Mm<eOL!H~BA^po-22mVUm@A5t|9O{qFf<S?Ew{{0!SA;)$Jb&*;+H!AX zV^LC1(&Uk+$j{0)Px3<Jm9<R&2_2I@No}}%D7yy{x~43;CQ04@B6a>_Qc&Lp`+U%! zs~sb{Ptsn)w*L+f-)EKbrgOx;QAw6@jE_Z7d+saP7K}IH_Jmv6wOBd=`*|f6%Im7| ze%2e{`(jv_7q$;c7X_eB`cvcn8Rd*Oa38YMcM0*MqXM9B7zYVby!L0vBN$CX#Qo8G zVxVFee}*;n(0PlSL)SjRQ>HopS`7x(v+_}Ud;J=w59!Zsg7_m8SBa6lh+mtYzfymf z^B}8(=OTPobagC{Wh4c}=SQWSNb|M}Vr5(rk9jQi^Ug;%$aLvfi04$q@BWDT24#Ed z8QN=8Nr&>y57YJFm^>(`N2c#EG)2#nbyD)=zk~Pu&PV12+k58C52p2vbe>8tE(6OV zimT*DdDB~bT%xAYDre@h>%8<j>QAb!SPYFfh~pdYB_&Y)hIp+LS<$hRK)0w?*l$7; zY3e^YPsVXLj?bpL#<P8Oe{@jB)Y79mVXcrRW)hw!Ek0DAHha6wYnp;TbLTo|Eu^+< z`w`Do;c*eR_0U`y8<j;b@4H)rG@iwDom&32lH;>pF_^1U;^j|j)od?3Z!GvfqU&AB z_rJ^+zer<)tl_wS)>pScLla)Z?Q3^|=bD9@dL!K|leFjI&(J;TtLc!W`0SG7KrQ$J zCU9lpeczoUefISn@q3!}0{`y#ZcE7iM5?pzFEnmKJkd?m*M!3`T(Y{~Iwbv!_x!@^ zct6#+n%!gc9lU*p(+Rc5CGPFFUP0XH{5pz0wSRXRBK@4#^SIe>?EqgziBQkPSh1fe zK5~4%POVegL>|BAYdmJz1^j!MYJOecIoLIVT~q06Sf8rqLuJUBBkZ$?medvhUE3yg zzu{Pt&_<g2pAYS)I<lgcCrs6TzrW`a$&S-;j3JWQuK4_K{!xJDE9f1Cn!f#y{oI%| zrY?n=ms+7b+r+h%s6J=r*u4$RXBBXCYB{J}QgJLKUH(OEJA6iCrpnURki2Sn-c0TH zl8c)uF5zprwI15yhV@GZ;U%f{8|?E*Ib52M!QQWgqt7@Sf3B=?tT+}z{GR)z&k!H# z$A0o~=ryOmM|=+v|IB)BtSpzYJ|)g7zB_1|!TXZR3wFqO*72*M?mNlG!@P2DXTOt_ z;j_y;b+_U(jqXB<tAvZWNxUWs3-MiGRw|a?@kh6eiTG`|iO))?4ZafJQ(6X#@0?QI z{5T+-KjYQ;Use}e#a6I2(Yl5W(szn2c-?0IC6?)9DEazVmq5dkIUIfbbn$mNG_fw= zeTyb-gbmSWO^5p5=>FUEY!Rnt>G~azb~>wT$Ce2kol<0b+7M{(dp@bM9_3SC3%y6X zT&+RubORgfsBt1G=Uliuq@G<*;B%f5tNnEvpDOE7-gX%KtENZ7+hO~scs-~wGPBwB zp>7wIJzw;H?hP-ndxK@{EM_dM(+eQAOM4!ZzMBl@|3-Gth;*)BG>X9&^}{<0-!Y2X zs-5^eEowX7y3WOTPiy)Z+qLTzK92CTu(quw%W)OubuHNjuG1>PbxNMxXZ`sg=S3LK zr|}-za4WWNL}U2$h|JTqZ&EOCcogd_!U$KVZ)5L~mGnLR#5MLkAKR6@TGmmCC(0)u z;LqhvFXC}=f5-2CB8-|@^jy)@j@KKa%Q!j=EaRs|tV?f>_Bz&2#%C4JV|Y$2r(!#= z+(_p}q}%b-!9%qX>wG-;{o&DH9Qk@CxPg0FyY6V!-p>h-GPQiL5)z)EcCKs-m)HF= z3iQ1=zG(aVP>Ao{4t3va$MNCtP<#3Fbia#)9?|G7*Nz|67<TFRI34x^Zq6I4@feuS z>fiXO@wLjG@sZ*B=CLs+!3&t_S|fGpG%%gUL+UnVIr|73XOgz)nRA2Vl6$FmZzOal zlIs4Wtz-4*?cBVCljZnvC&%NF-Y?VQOLz|ZajkYzZ+=M|gV2c5rcY_iE^3douCyBO ziILDJ-YSm$5wG<d-qumQbJ_6V7^Qf9@>n&-<8@T$#4%u_FA8EV6W^mD4CSkR-c}hW zw?pjP>t3ZaN?vu|mrBoYS&y*u)$$A0$Myj}JNE45V=r&rF<F<IbGOKOB&VijEc9;J zz|^VbqjLTZZ9kNAY;9P6gpvGMcSLlEwtgl3%mym=_mwk+-8-U>(7S0RR$><$gQO+n zxe9Dx*Ja`#;&Y}FD{CD8UK(k4f45uMcgIOPp>7R6M_UJl-YdFRP6FFx{vNF6Nj{Dt zax<^iUJHbVq%F(EV?^3dG=;|(2FJkh@;rGgDux`A^P%vg*VhBw5E(7P={b$kwk5H1 znOw}q(2cV(ZS`Z=#?8|2x*&{(@{JHbh|X!t4g5aQa%@6G`XfB$t9}_iTeSbi@73vf zdm&>djX#^VvOY9(*(gpXY>3P+m3}~RmHLSCj&b4lST&#VIyzp;wuZjvkSXi_jJ(G_ z4RoJky9$Mu@Hn1ZL}Od3O&`;U*H_^>>?c#RhJt@e7{66Y&j4y2O5P}u=PIsYuAEoX zX_Xyc90b<{cK*BWpD*KhZZDAYS{SIluvvW1*KqGHA%FHI+rT(edz?hFnqv+_iy^el zcuJ{{>)LS?a{ea1BhC40T~M!@opj!mGR=F+gnBD!)OnA08^crO;n!}<VAj9F=a)le zwD_!FT^$95uZs6}wQN#uzl@HL?zG#W{+$ua&1bN4XrDy)==z<r7@Y}Df70^j`R^+e ze)~(<CQII;-`_}>N^QbY9QpfX?&UQ0fR}k&x6i}-RE5TSXxabS9Z_Em%f>`RXZ-JK zhORw|#yPGOYKLSj{#U7W{sKl1k(|IH_S`C>fn*v7irQ=L5XZ=d|6=*Mm-76nBfG=u zhGeDAn!(W(J{_5DmPo&0Q~2WnNPm}KZwR~hEF7O^X~d!Fzix$^t>X8~OvB4Ky$~jP z<vQ54oHS}Y^gPG!otPT`Pm!L{Tk;oee@<wNpPi#Am(XaXzQ5x!cU({eeiQvIV*M-Z zce%CrQ9Z2T;|5e8zb?G)h)(p1>0$R7B~4($L@?Y%*G$VJ-JlQP7)D8l^5**rgk#hA zD7&9DHO-Uh3>y288k>|YFV})I74NN%o;(?cw4=1mj{T_d6M7F9myh=q*V)>3qr~uD z6WKk5bv2$lcOD!6c%EnP-rFMhZQZ2Y@M|*n1uy8`JB9sL>W}iBpN|FmPpiVx!UtlT zN-i1?`CswzrQt3-?!Kq+JgDUwe%dOOY2S(KowMnCEA9gNUSek>^<(Cx2O)7;Hxw3# z&x3Vy@I30j!R_`&{(Ttxr$>c)sP#o<b27DYWxM`Cx(|BC4T=cQ{R*{rXEf{IE03to zY%|v~nC@p-JIZiQV%l@pZeYqvU5__!+e>|8;&XH_j|9*8+!|RQ=QRNBXAG6gh#w4i z4R#(C$Du?<Z^w3-&-Xr^3-do{zAC*4yl>(8c3sSlTmDtkz}(87abUA*tcfrwt=iKH z>3dtDQ~E1!k$x}b%T{QU{v55XvL1xIb03RaT%(OkcnmGn#z~zrZFzvzU)ffDRV<@} zt}aS0XJ2|m&LbXkK6|D`b#<Tl7#ho9>;vqNjbQ2#EqY~+!u}GM1`Ke|#r-Rv5c%f~ z0*l$RHo;P-&L5_N<!rGYYT9t+gkILxx-K{dy;ntsopenr#2DDM6;7VA-O<gC8ENw^ z!#**0@d40DpT#8gTzYf=)^T9$5YWYn_jvzX_#Q(oLx1HG@O^pwcRPl+#kguY<*hrk z`>7_@C_~di@EzC+mV^BH0kIgy;XTJ<VaMH)b`;{*gcxUu*Yf-1pni_WsV_m8#it+R z^tRoz6ViUd>o2-y7uSyXB6*o7(Q{QK^r2`1_pp12h&JO394FWP$j*1$>;n<?p?)>> z`x)t#&>{Ufudf8-j7soGf7vrDp-1{F&!~i?8>r8zUnRClwT>~F{8$s3lwXgA)Uoh) z?9bdIqn79Xrye|$#b*M9XLQrO7nK8r)Gz7Z5XTaT4!v@#=y!^6jrhNPCXMYZgK2y~ zs2z8)_YI_;q+O#WJ0HE9>9gmVv5>zvvh_xAL}|+lylnGXqrts-1vqBWJt_Ggbl$S# z&S7*RxL%`p&(3@uuO~t$Oiv0OKWEIOeXajsmQcPD7q(D(W&MffGi$YRy?>n%R<B6p zSI*S7{YdylG^WPsLfy<`S^F39D(f=p**(xZOg!gGo=EeBb~a8j-$2(*q!{7ol721% z$2#oSt$(Fw>TrDF+8s%FzY)=8okZ_0EeBUZ%0TLmEa!-QwdYZ~mpI4pKEsks>#Fw9 zIY|0vk#L@gUX4}avm0qgsUN6pWxZCuc{O`)==itzT(8A{qV-9y*yTP~Ch@*T*Y`YY zy)N{=uhygO!m;2wG7U`L{g9oEalL<Nf9F)qA4xeUeYLE6B=pt+(p}J4ZCf*}j*-8E zitrkTiG6h>vb1P)Z$}>ID>2+74>NtW<j}K8<`cYsa(u%28YNb!e8)fWy|3%)ZblyB z>4>9oOZxpKkng!1y57cj7N$FKT<V^=UFNejRf2oGcs<mgkN3pDzwsREexttBFp6J? zxksp-HvEM5it;bUOP{YFvOIIPcuYI{em_Z<z^*ZM|5L_nhn%unh%2MMMomM?jpej| zzVA!qzIN>u`y#}b{11$qyi=Qo;EPi0<Y}@Tb$fbt=y(p%_v~FG^LI|hb6A~7W7m|H z$nQk6hVf%<Oo&?ER(%^J|Bc$DT2E2g|JHEubj_1>Q__?S?X#zD>^rQJ3!vqKbD(A$ zd#-S%0%V^wguzHyIY%xV_LsqcJ#^0?GW7X;9cc@dwp}q~x$~7)86VN=?!~rS(K{hn z?-<DHNbutN`8helr%Wp{@w#qE-6HFtA4%s@Nn832T{Fu1gbqw^d=1}!IS)|3Uow!! zw3Xk9&sAxE<M+X~3VQbG>3i0_Qf7bi>2FKV8he!XvA_I;9zL!ITQ%+{snbf612{en zJcQS&?S;sFXj(0MKT_C0<BF6w@tQ+&+v7$++gjFsMEdAI-vm|7^MiBjJ52qIh?dk9 zpH0tSq)wTFeIb;zuvm`jfk7GVPHi7UFnWj5vnZ+SZ>o!lXZG0s@+;|WS5E}Xj#2VD zKyAj)=su#PC3(Y`(GW9sEw~=9W%x+DR%*PS9b4Zy?3&Xx2ZVTb8%w8!-`{%Qg>=0U z-rP-5j1E~xW0^9c3zarZqxx2Sf!{C4iDLb$nm^+;yk3fLI3~;U4Hzcp)%2)r5IhIN z_Vr**9$(5@%{GD$+gQKU=A|)H>38h=l!Ql}CNJvW9#(Sz<Lcv9ar(t&(RHtuL(2AI zyw8!cI`u@)m2nfl#r<=|6v=gjzH~0GYmCA)@mH(?!=3_}t|XcLTvg9*?CS`B{dv@W zGtU?T&3Zm&s<7ZY9pg#%AZ}LS2=FYP1E#m=I1@aS!t+Z(e|RPI=B$zRP_~nN$0b{Z z?XCtfF5>Iz#x_SVNb0E+W07`sYI<utn17-+uWYYzP+Q0;!1I*y!STfn1UG);ZNk2y z_MUl>o!L!$4nfi)th43Dm6~|2pZnhLtIUG|cS~{GRjVQTn$UA$7>U=dYhwTU>9mB# zCH*&CD(TYq%5Rt6!_rTJ-crmP{l*x%%{fCnzcGp8b!<7XTjnMBD0MuzKv?g;l-j$J zp5*-?<|FMWb)7@+^?VPE2+Gl?vbZG|ZUXnU10mfq5W1v4B|pixseWV4H6D*gd_MbG z67$_+o$Axs_hW0aaNI!fm8mWd`v+xRfAf}eX<TGG$omO|mppGbbY4p1%G~F%|E|w( z6^;Soss2j44Yfz~DjUS%H!PbAFq_^tTL<wr<iBVmxO&Qhyqz0ILEM8=A!8X{k9rfo z#?lrpg_6gpZw{qf+B<m6p)&k_kns2*&}U=YxBabuzD(BPq{+}xG!A-vGzK+{DS+Jb z@f^r>$C0UDPkoem*=p&F@wM`JdroHKgpz9}1l#lz*q9TE?fkq*=0oL_7cs8o7Ito& z?@fomAdG|P$Sd(rxI4{Xxe=N_!)G=B=ptyWjC^h6{0;k?=qh%-BmIm|Y=oHP!%Y92 zqp@El`kQWV1>ZH>p>P-Vvq^9M3HDC}sM5?W*!FZcV!bRjY-5BhRl4`Fr=6gEM6qWe zgk3*~`bZ+{MAE`%PEf}X!sDdh4)k2Ok(oC_Zr)cWtS9ZEQp;uHbzDF5l;w?|9t?}y zaobp^e^`tWO0K9aRa&F<SM3cc(|a*%8wkg8-&Cmk<R<93GyEB_-4*$LlC?08(Ixsp z-iDO@sGH61iOM#0K4$~#OGta^&8+Vs^~%)qL>?4MacglFj&(^}{1?N6`szpGG4gq- zZ>w?*Szh`1kzjk(Uv@%g3;%g8gac`;d~-d$=dg?u^AP!=(%k&;_m`pg`_tx4Uo7p9 z?AlIsvt@+W(Jj6Ub6>P8I8LqyTJd;x(!ENghi*52zB2xUj+=<*RXk7Kdp!OGlv zG}yPAj{ad-Z=!pGNN&UH7+2lq{O?Xk|5)6HX!QeQgZilX`dhC0fc25C-wJ}bRmmoZ zyVEDj@GYAK{ugmuq%t~&vv-b_eb2V9v{76wEbGxch<S2WP=4UFC|M6epAfs6sjF}5 zv$;>``#z;<?AUuNXdA&%r^aDy+@o$6mD5+V^W@#nzBkq}d4{a3b--%K-#X$?yEjAn zWNoMg%R_jqMEa@g?2q8{X7c-GLA{dGc|T>oc%iJbnm;9Xgl3z^%=6X#!0$l>GsnJG z6N}KO)AXl#|AA=Q7fOEY)1n}rwXhYen`$9z1C4RjIBmuWLE6%ltzmWOJ%`$0Acfwm zH}7Z94Q5ZCjAcEQJ>z*Eqit$k!j--Arpvf$T2oRi#B7_#wAW8y^{O`vhvK&3P}7OW zM~$IXHcZ?Z#I3%EJsbAKVB68+3ss*z2KU8qGrK-R@f=TEgW|c%=9k5D+}<7eIYFsI z<<0awtgI(_m{7~i2dekIMB@uW7ipTCH-f{9gg0)<Cdi&f?{dTO_|IegDx&vA4Ts*R z4}iCIWk?+whTB87hm%d(D}LY0;neS4$JG&fl$u{WBDc4nti4v0JfZR_2L=W4oCCyj z);?%2B)vh`Qq%iIP;>b-tivm8oaDMTbex+yY=^9SD4oK!#k^bu%`<AD;_tNo2{-L# zu;Zqf<Z{WfK7A$NlzY0td|qfh;?kQT`>^=4LQM;(%y4=t+be%;g`@)d`8s8rGN1le z-Y%8x{mEBOXYbFIyt*d5ZaqI1$m67J50!V%r|(U=f8+g)aRv1WbsEnHGZx|Zrp!0e z{U(%5(iS*nD%j@pdoOD5y)*PV4AEHM%j<W45g&S`UE6;j+L4aWbN=WJLAfo(V*5#X z4Bt<-6|a@`^S+PYy9mr@-^at+9N&L^erVr@P@SDTjkR$<{PM=vIi43=p<Vhr=~U^r zkP4H6uW=~@2AtHVPL4!pn6@w2hh`~_mFm6T!WU|!`aTjSarV_`?%W^5C5_Pw1`N32 z&65U1kqSk6(#g1xAn_=w2k4|Sl7%plJVwXMsgBVSo#DED(0;=bXqM8mB#`y<7B?at zlz1d>>Z|XOQe{7eN;=L8qoYTG8A!B4l~hKu5GInx=s20`SR=J1PTvQm56po!DUFeo z`StOK??yThy_9KFUw!5K7?-r2Ch0gkjE**mhtQ)mT`D742ouR;biA7Cm?_a2)A3xl zNa^Vk?~~tra~je?iAVDJef8!KFfOS-UD7c#jE;JVhtQ+6Q^G>B5GInx=s1Py*dw(i zT)z*ps>eZ-ltxRu2kt9*3F)B3Bl-Bg`hb)w`w=7QcvBc1t5ulgQW?oYm`EO@V;a@5 zQfiBtfyc2?N|BDaF;BjPbRc>u(}uo!r}Q~RWk1f4bi6r?ju{e<5-UY2BUuO&$zyc9 zhU#dR=yWspLC$Sspk7MPkU$<g=i5xAgA$MAt$p>T4>2yOkCk-H3Zr9}3bRcrBUuO& z$zyb!N_7lKZMuwo&~&H_>ZKH|nHl$vpN4cG@|CHsuf9o2mHjwV((#rsI##GK9a0&| zLYPRNQpZb@sE$s=cf&sDnzI7xq!jtbvf&%vK{_aPBl)Vn`uvYDE~$@`bet1L$5e@j z&>Q`$z$lfGEQE>VQ60x6C5@*#nh@WteULJB3)D#|vd14zzu_gM1Hn_K>3#L_A7fn7 zHcZm-)-XEy6__dG#)4NWBUuO&$)h?ZC0#O(>ewW;bxFD*x~kdxU}&F?NQeJN-5bE= zeO34WP|>DJ6*aB2M#UO6)l}0qYFg1kfdrHgB&4Mkg|wt4j<(nmOKY^KUuV>)s8O+I zii$I8HZvDDHnZ)S#*O`#&FI*SDVv#4jhZR@87I29{yy*Tz2|xE^X2>Sg#74Uum63$ z;M{x8x#xV&x#!;R_xU~#59U9lv(jUHNb)d_i-obX2*xO|c}RBpGzKF!@t243svO1v z$xaE|ihI8tjkdcyzUkm=J`aWvoAvj2e)kb)*Z5Bp#@7|WxJq+OA6lU?zOaeEJdD9w zS4!`MupN4EGTO7{p=i10Uhr_)y<iCKS%019m;HmYYy3)Ke0>p&M-ny<YK$*z;xC6$ z_4txp9uG-2BW(B@xxrm$N<TXKL@=2DkWNXT@jl7JI4%*!t|A!w6E-_E#uqm6m&2%f zT${t#E!mW?ozVZu7{2kL=!x=QaaGxqzz|}y{*dQ4|D&^O{7Z$gy9mbRnq&IVGqQy* zY~n8uW01!(&6^aq{_<}|yE@$Y_?|lt+zy7&p7mFH{;X&i$J2#zYY~j&37exD;|rVk z%ftB6TpssHc2wB*o&T;Vy2)YuVE=XZg28Zwbi(uZe9PH2*$QF2r3l7O%`tswy~g;$ zCjRm;zAT5aS$ao=t-t2NXy|6QuTNj}-p_*}v}gT3&tG@c*){$%gz?rQ7)vzA^r0tZ z3t!m8UmnKbK73ZPjIc3h;I$6pN3VPD=fMCk*(yALN;Hh)nZnpp1mjr3=5CGgg-!hB zVGQoW_ege7*qZhEq~1<<_T2V^Z;gN<iI4F?&ma1>vuirf62{w#U~JSJ)32#}ZnQ>Y zd|?xRIgC1c0*vdVH!f_g`i|AU*F6+f%E*Vy_udZ%vlr41&tLf+XV+v^!gzZTjHePd zCpE?wHu0B-F}M$(lI*as;cM{q?)A)(OCJ0l7|ef2&q$x~gydly&lbksA{d7gHU~Av z7dG*ihcUPhA3{&q=33jLp{|Fbr^)}9D<AwG7(#5;ANBmce{yz>f0;0DFM@Hc=9vD0 zcfKxKp)tO&iN8FI^|^h$QhJlZ#@t=q?(Dhgzzr`4gV_sdz2{d<I=d!&jxhdC5sb$Y zHZvOI3!C`MVbpadcwIOl*->HJ^*2YNXsg3`v*v-p{D<_U^cf$NJd9(dF!mL}xHDn1 zM`L_p6MuOagL>?f?1->6e(meg&@B$*Yc&rHAvWvp_WX{2c6N>bTw%PU2*xVSF@5MV zjq!y|{N-T`>ajw46T;T9?ETTsTOGzu%>zSd&-!aT|BPrD$Mb~o&LS8OCv5K57+=`L zUmnK#Ts<C??69y6-}9|#u*YG1o#uhTaD{Zz^GE;1*)`eoh4HQ;7<)Cx^r5X9;|rVk z%flGFF6@wAM%ae*KY|CgIgGE@JTQdztUu`a_1|@NjlW75`-@;K*BsM_o|Y|qVH1CO z7=zb^XCyl$Y-Q)|jrwnM7`rqN452;iukienqG24D3*#G$U_21mZ2h<IL?asG3!C^0 zF<u?KE*zC?T-bJg{i{*m?d}YJ%C>hs6AXqcq#4iOeazW4*$ag6?jji5HOKU!)f(dq zoA}Ga7`*1HmtIEL4wkh<1HBI8Q#B6^p*`#Oc>bF2IlIPxp)lT41mj%7<_V4Qg-!hB zVGLe#os?`s*jBe3iFR&x7?*1v7|ef2mwEoAXc)(8VH_xeac{zAq%pp*iN8FI!E3JF zk{uPcMtwIz^ah9VBFzIsh|T)@J%8}Hvupe-gmFg^j5V5L`c+p=M5{E$7dG*ihcS3P zvqpNygl*))cSpN_$6>r!^T1&CLfY#2D;{!oP4*&Td{YsOGYOkVG{zS;@t21&cs(;I z*$H8*(El~t)8{ZgP4mED{zH0N`iwJ@hjF}E81F5DaaY1-zsC5&CjRm;2CruZB|9l> z-Ov73wD%5&u~PHE5Ms0bi0AiAIlIPRBaDMZFs{}d(}ynC7+=`LUmnKb^~?(C%?cZH z#_n{_q&~dt`@LX*mu%IZzwBR~U6WrajQ176cr;;iTw{D;6MuOagV!?|$!3KOUt@PU zjC(W>4CX(iC#27KzvN*YR|(_&MKBHoHv1p?WYnoKzOaeEJdD9>g&xUfg$=)B{SM<t zG!G2$k}dN5)_-$$O@6g7zPSj-O3g9-m}-nKY~n8uV{retOnS4z#+<P?I*cFHJTT<h z^Mh5Me_Aw*W34dmEQ0Y+!seL9_`)Xs@-PPXkNYK?6}A}T-45f&G!G1E7>{`V$oHLH z(|L(7zNHApZp|@$XrspX!Y2OmFb4OJt<swnw(?6KjK=P97)LY@452;i_j`Wz31`>% zFBQhO7QtAiIi?RiC0qEyCjRm;*5~dYPfIo{Z2Q0Sm1u0hVf?t}fg!YK{pFs2LNtuy zWy1JC5sdp1HitFF7dG*ihcUQ+9Fc5R*uXHh!(n_-^T1%ZLOSmG(Z4&pCR-<rLq#w) zYmVtd*J_L}Y~n8uV{rdiExlP`%ZyG&V{dX8KcRVG2<=(F)ALvTz}YqaHNyC|A{b{A zHjinHFKps3#JD!Ne>@@CtgwxJYkf3!??cg3<@AQmf9nN<`Ol-Ce?&Bl<62>Sdl8I# z5;k{gjIR<={N-T`?jIw`W`(UJYKz7O9mX3q4-9$O{9w%U`=^~<(|NftzM}}nb(&-P z&?=4bg-!hBVGQmcS4nSH*qAeRpTpRpd0>E-Y>l43e8$-|d9^S`MKDe!Y#!DaU)aQ7 z9>(DQ@rY!z!ZvrNDH^-qVZ2H6z+nDEdP@3?$0ZNrc!e;&vk1naz-HCe7eu`p;|rVk z%VE@WvtVEMOExQPV^8{SH1=lq-0YK=p8jhvgxIV<?D?G!JG;hzr7-?(5sWJ}$Mko7 z?SZIVV|-x~e>se6)~pTgahFT)jId4p^LL^HI~~SPX&xBNUP#v(|A)@5$*vQ|cNM`n zVRQYY0~+HCoA}Ga7~JEIOSbGS4@F1*;yckHQJz1JYF>#jnE#L-lRo1y$-_8mgmG69 zjC~24?Hc1NwyAy|#^4^eQ?li6eJENx`>tq06pWwNJTQdVtiRLq8-FBupi?W1?=FI| zf;mB((|mkk6MuOagL~W(&8vDq`})ZbMw6mo{EX(s7y^6Nt@3_OiH31pFO2Ugg7IJi z<6e#Ng-!hBVGQnZ$0S=l^ib6K{q@laQ80d1^T1%ZLVDQqhfg}YCaV+1_ZGp}p*f}x zt<e}?*u-BR#^4^eQF`m%=FZ1cqF@};JTQdztl#VTYk%zQ8oyo`cNf8UCSh|%V|-x~ ze|Z>#d)!l!)xTZu#Wik?=0w5xIn4uu`44Hi=N}Ud<7g1Z_Z7i7ny|S`V|-x~e|Z># zd)#5kTHm4fkS4wml|>HY?`s|yLTuJQ;Q2d$;_MoKy)eGN2*!HNF@5N2jq!y|{N-T` z?s3;juT$8Df4C#6c;`dWC7QeS&R_gB7(#p2Z}<GFpE|q7-yn=1D1z~1!sbzp@r6zN z<zcMP-QymUtWVg+jz2%D`dx?d7R>{L`48!w^cf$PJdC4J7>A2s+?}vFpfSF%iN8FI z!L@KFzJ#sgzPChc-sLdfs(D}tu~~nw=l7m+c8%X8j2|q5agFAfKD1I}d|?xRc^HFx z+$!nq7Pi5seKV@r<uLYW9vDJ<*01sW^8avljsGfP{7?~$lL?!LG{zS;@t4D>dx`+# zVafIi+uWBXqt<u3_X}^l`}4Pf!Tg7GM*55oNFK)VYGK?{1mj@BX1B)p!Y2N581+$w z;6A)pvQc4M`MhsM?eB3IfBdGmzZDE2HtX;5{Pv$YyT)%8#*Y-ixI%MGA6lj{zOaeE zJdDA8c)9e(gzeySKNNMm*WEuZ+w+GHfg!YK{neg7CmP1FQ5Zj31Y;&)bDzfe!Y2Om zFb4PG2P7L4HZXMTb{I4N)A3JWFkB%$>iK(r?(CYZMHoL;1Y?ipm_D>wV|-x~e|Z># z`|x(@jS1V>#mA$L_qk_#Kfb<k3m8Is)*tZvnptPp_?v`rqzJ}knq&IVS=quDHu0B- zF}TN_lWf1Rt-I^_QTO{FiZ0UJz0do>ZD0uPS-;ZrXGFs|T7~iBMKJD9*xZ8+`NAgt z@-PPXxO*i#C~T9rzdh>xfXm}=-|@EhfWdHu^pNN8`cG%qWUmp%2a8~A)g04@uG1J_ z*u-BR#^4^eMtX;Yt^7mZjrxaO9{=m}r``&N(4O_XJ%9E8adwU0CXAmbg7I|1=9I?x z!Y2OmFb4OyGm;$^wnJaPCK~*pJ9~cqzOw%SgZU3>ndcuB4dd7>jGrumaU@}LNMn3q z6MuOagL~Xvl1&KPv1jXj*AKb1zU26YF9Ab{&HDR1f8ZC+uJPN2@l!=GR%?#wLsx2y zFKps34`XnTyIOijg>CEu`hvs{yU!|=J?3XG2197i`puqSdD_`E{uW^zErRhx!sdj= z_`)Xs@-PPXxJM;BCT!zR{bsa#&qL8O<h1d?`+o@r^B>Y#=`%hgc^JnH!Z=n0W0bJj zr!l^;iN74iE7x2ZoZ$nK%?jJ9+MA=XkGRhak9@XdCm2F(*5Bj#-M@5pjenysey#|{ zRhnb^&<c(5g-!g07}o@Otd!oYurX)sqwYHMgs;5yJz#*BZ0kI~?7y5{lXnQ??-#*% zBw_QQ#`wY}{_-#e`}&Y%v%=Q>;p5TR$K0NY-uJz~0)zPv>6G*t?~^=?<0fJJd=ZTO zfz6o@>bj;ezOaeEJdDA<?v`v$*!F+zL(%>bx7N?z^qbd%A;f0=A<u9Am9uO7n}u;- z5sb?<$Mh#peIYs{Tlm5z{_-#eXLy<B%?TTG_kY}d4&YC|SiS`eW-p{GJ%3g-jN`S! z_=O@E#}hV3HO3b<@fTveGPtMMC)sIXJ9h0`qJ0m#`|!ixSo01rgxIV<;rV;!oL%F0 z3gZ`xVC>W!(}&h;j4y2BFArmIPth#BvQM}?j*Ig7@RQqje;y2>J?r;*{<>c~yT*T= zFn+lR#uCjjedtNq!WTC2m&2(0@LO}Q3uh&p6Sn<R=STbZy0tE;{D+r=A+%@x3eTSs z4dZydFdis^aV%kTH)Hw2CjRm;_T(_`k?b_s?miOj`@M&vO9iIs4LyxuFkB%$==npx zadu7CC5(Sm1Y@J-m_Brk#`wY}{_-$x%VAt6y|Pd0^AuYj8;y(dEM;cdFOGvDv}gSe z&tLi9&aUyhh4CvzFrG@-oYWX!*u-Cm@uk6Qt|`eXKBa5n=Wd7&i-PfC%>#q^59t}{ zGoFw<jAN@X{&5kE!wH*%8siI__{+l>yyhB`Y{jVCGe<?i_(RPDLx|1#qn_V)#@RLg zEy8%P2*$OVWBSk)8siI__{+l>T(4J3Z`G%@XMXXQ(Ud3{f24U}2<=(F-t#Md>+Bl; zR$=^V5sb$YHZvOI3!C`M!x)^86Oyg{jGj|$yjp)R=rEqtJTRF5ke-x2<Aaiiar6k| zpA^BkGhwqwV|-x~e|Z>#^RZ8|n$PMpn)<xWX;Jd{W6c9Yh|T)DJ-_3BoL%E@6UIL+ zg0V_-Odq;TV|-x~e|Z>#*IX6SYaZj-p8g*8a}MKAG!G1+J?pRW{4=6q9JdMMcoB?; z6E^p2j4y2BFArmIy*`Ls*p~m}%cJt&clY7%`SufE0tUks(n-%BeZ<){+3mvkXGJjf zYL4kcTQ$ZPHu0B-F}OGDkY2a2t)2X4wEXifj|Ur$?*l_<&-#O&Km6I_v0dZ$3ge#_ z!PucWrVl+WTlm6e&L0@2qoa>ZOLs;;rP;sDE!CW=(rNj9D0-#(J&(Ba2!2D$mW^Gt z&COkPwapDJ^|fuA#Z*J~oStpBZNGC{)qI_*HG{YL7Hd2Gl~ekEX~N)HS<><6?(cbL z0vUKv=y$Xfo#$u_Z4zzwx{s)#2cC0n%q>4}I;xUQ;*Y#-_zJsgLtDd!O>IrJE#5&G zd!D>X2fG^b31amz#7zI|^*+|4fehb>dmJrAXO+g#R?$|kyHv53JVvp~Cb9bb#+dVB z>DuB~I)AN`I#s$((1^K5-+8&x#}YIBuPz_+;ZP<Fh#MU(MTeN7uNJNGx=R)FjQo)2 zxW2t@Ti;jJwiaC5SXQMAjT-tT|8_j8^w=3%>-I733uO32zNRdurRWeNbd%_6FJGz{ zkKji(iP7gZyRPlEO*dMQ#9@1v^>nf-U8!6{zE^Rc31TtXRv+iEiz#Nue$`w4SQjTc z#0jkxt?;@_73Tr@A-BZobDNFx)tlNH@JUO?8Oy44vGcNZ-#;GB1aZUy{kp}+IN;)m z+4!V0=VL^N7@^JZmpH~fkDHFjD>3@KW@Bt@dQ}@|AT1eVEUVJR(#s|l<3tcgEYPo8 zeT*IQV?2D)pK`Pm9b$x1uT$R6Qmy0Q`O^`3B}SjuY>e%VwHD&M7?D-!T1zAT{u9Te z{XrbDK)-r?jMegEJbcnW>}V-E#0b4kG~?|oRgB%srX%u7j6Sc~7#ka|Z)><w0=0ST z7|W{GIjNJE|NHT1IEck$+kBiW<;!^ZrGMDbQgnzDN@B;noh6I&g6W9d5~t5?HqPwz zvuk5R*ZQ`Gmbyl1&5t=nuS$<!<3@h=DgMDAMlUM4&EgjZ<8}Lf#?exAh#yMIN4%Y- ziof&m(-Aq3<M+0~oPWKnZL7V$N$;e)mR$2({7$dxO1+p>L$Ce^iam%g7U<XQKK3g4 zHy&8%PdHkN4zWYIwvKo^OBH+16BN5_61&fL%G!4{H??;)v}|Z@+U%BpUd`v?4|S`q zbaz!Q4=0p|fgo17j9ahI!zy7h9=PZqb+i;6@&J9U=!mzoRC(wtpN_~qdGNU}l!ss! zEVK{eJUHDdo}jx%J?xx59_<WbHQ9Ebhc&`tJaExJ<Y*~6<N<oK=%}}|RC(yQa5^IQ z<iY1Yn};nMYnxxQrL9(?xFz?1$*Zo)-E&pW9FL+P9-I3HAL|PFGakO_XB;g>hghK< zqI<oarHZxliPI7JC03u`IM(J3ZLLl9T{kvtZf|I7>1x>0wy9Mg{fJu_bE=+RKIsdT ztn6cZ2bF{VAWm<pq~GVDN;r%MCi;gREk);f8bddT4tqOGm4oglO-JNC-v8b<G5Xl* z8d}=hbemZ$2l;v~2YEH${;>9b5T{(k?TtPMD}}>&V4^?nXem1609qru$J<$|9JE(x z@5?4R@OcmG;QHF;_Uyr*vi?r)Vs?cuJLsKO%!5H(V#V!lA9JPr8V?Ng_c>aM4lzTy zkr?)NmMZ4@C+pmoO=9+W4rA7F-oWK1ZYeRxau>3D>4DCkA0ChTf|&gDl6!o-%jDB| z_@}?u(Nc7X7s~Bn<n1g~yz8Da9g$<=^*IjXt-GnMskzy&a!R}=cOko%A@TgRKRO<D z264%J+y;EiX95`*5Dq(9iViVDuZ4QurHXm=Q>P>HOw2ydVa)AY+Frd-T|2pp*u5x` z9da|Nm|J};8fM!LAM<P=0|N??qowE&GnBgS^}0(HbJg<ch&&Us&-1*P)9zvXc^AjL zxiLRzVjehoJgWDxXqatp@-fc@GBBVp=x8ZA#0=%0xYO${Rm{sTnvTdbG5b7+F~^TV z8aBHtSW0c1+yx!HHe3E<JqPo#$aJ>d>tj9^$iRR?pQEMd5Hpn8ZuPoL74x!-^&Ct# ziP`5lj5&T>koL^aud|c8i1S{j9aPM#eJnDaZG%4MBY_MIC=5DUiViVDF<S3+mn!Dv zPn(X&Gco%-hcW9yUEkE+w5dhc>$=9K7F+UI$DSEkozK^G$p~Mwwg2RJROMro%WS*P z=i*o(0~-pFqowGO3n-OW?{$|d7gd$h5&4hT-`l3PeSDjnHnui5t#4|m&rd~KF6QgH zRBV;GxMBCSa<SUS=-Dy3-{)c`kbw<hzoVt-kPB$NXsg#<s$7&`qPmdHc>jCbK`ye7 zW8fw0fX6ZM9qTO;s-d&zr`q>EhM4Jpz1hclG?3vNagU>==nyNEi$=58U8-11F4ex5 zO=9)=4fjC!SSD?)o!mvNPZqdF%xh2S`L~b7_|Tm`=EI>(7?5>1T8a)aL)rJ$UU#Wt zJ}p1wnV5Z^!<h3POr)%_e;^UBa*s^J4ZTUlT<K%+?3ld8$2=a$z<{v*=`k%uhnS(n zyvECyD&|@I$R;uSJclvg(A3c0QoAvG#HFouPRFhHHkpbWu@C&m@u=Lz;<=8z)yIA? zki}Reu3zC|M~B#<)uOAs?o!2mLVn0MvHN_7u{X8UXK&lm;*RAm<lAJy?djz|J02}_ z_+y^^dcem!7Rd0AeBCo#yyy@wl-q+UFJG#7C*_A66R*#481IILO>G<O9lVtKHhCPf zf9w{|Kd6}Jg1BTpZbLri5f@*~0|TAa&vY@PL(EX_Un;zOsbZdxAM#AhKF?vywQU<4 zS{8`e<Su6aw1M2T>pRI$1#yWLx3~G2cf0sv9vJAXc$SM99b$$ObD5VfRm|h^L!OD* z=Q)mf<Cdnb=GvAGTWU8nbT!pW>T1@mRSCIb&b{V5t$0raF~yVhYnP9Ar;9CS<Dbs* zDi<$0S9skn(YYm#_kjG6W8(EWo*yr#nB=suw)0{}M^W32Dtg1S$D^Y`Y_S3Tdbf{z zz{MD|!9i!mvt8Wi5I2;I;3;os$<|qZ$Te~MTxa9n*wCg$-h7iDt!?aDuMa0&Ut4Dn z8j|s+>M9T69$)>RdXFrKRW9T99-oJuF6Njw?)z1jxjdjl9-#M&p7M5<Di4R`hup{O z?|l;^YwKd$vbmuxKMUzO$kS5>`1WDf&_ALa91Y?$*?WBshFrWc8%%U+p5t<W4mp6{ zCpzoxEL9Gs<cGYI1E2S7Ehr6n6_AWQkXPk$mZ+Vooq;SbPx9#YRNwzO9!&;0hz0t! z+vjK0<sxQ-mrl(}mmhS<542nKl((~F`H>&ig#7q5$>yiMQSXP>XOG6z&vcNNq#g&P z6$m-4{>Aa=bP%IhaeJS|?_!O4Q@&sQTo*qExDmV5b9#eYnG$ax&Uw+&|Es@v4E zc~i6Ac5G_agZLO;oSX2vkgpRT4i<W>J4Nh4e9nsgzShUS*TosL!9u70c`kNzh#gAo z6<)qnv7eA1@=feM-`TaV+oTt;4IN#Z>)M)H+w)S8l7kf8_>{=K2f6d~@n|-PRW9T9 z0iTC47jw)57oF<oyF8#n9-u>_%e{Q5@^DOk$US-RxzFaIO}F?KzHNZyIgzKMxb5v1 z^j7>*_kclcV#RIP$Gz9Z81ukEr*)N!8y(_?>Z5!m%e{Q5;yxum<T_q|Z`*1=KFM0! z8rC<owdo;-c7xp^xhy1euz-HNDTs^4yhF;#Y!G)W(60~roE&iR$80dt>Ac+K1RZh$ zMNsMGOO=y3`C%Q%iC>3oEhxsWrk2g^x@%BMismCtH{KO89XE2(`CrGQG8dcYI`Sc( zi$j47Y)JcF;BtWuxqx#2u*%DqDi_OMI31CHa^drzmy68}wQY5c@h3d<lOg?-`shm2 zS3>fx6=#%>3KyTO<l2XQK8^%3@S!o_Xem161Ns5cbzXO=@=>vRI${mThhKwiK1e`U zOT(7<-OASZnqjxq^Ky}<8*dVS<sf%^f2C)iK0XbzZI92xWFP|<3OgMwMTa~<IXCLP z?o#EU@(Mlsluh#BbDzya%choiXJm7si>D<bSre(c@eavdH>&53N2`2%a+hr%@p+gE zWZ*(!x1*)#kO%01XtUQ{sywWE(R4)a$%D^*HV+$X<454xQ$oex-rm%*q0lv?pnkkT za`~82KGyg+<u=<s>hp0bkbw_{F-J?$As<lQ9PjYDOO=nB7f(m50r~K2kj)2W(0-FP zM$4x5TvGgokv=V19}CV=Uc&3_&R-voYJ9xTn*04RpO-RWGd?)!XB;g>hrB>}V%6vE zELC1Q*GxyO1$psnF+VSMf@U|)#@Z(T22#Piq|S*GllR$&6~EEnTn6zAM%+exZmNXO zcwnV}%+XSG$PM&&L?dr!sd6)L<#fb)kQ=`qXOo*P_5sgD<YtR|ry=+3=8*C-5X3GB zar?N>%Q|5*9ysYAakLa2@&bK>=%}}|RC(#WN}malP4eQ`BAb`jY-wn_sf*ntp;|Hr zIeD;2yk4jNx8Cj`uGoNnJ?LXzEx*PC1N{j{OVJ@_=-r}Y-p*3R+;jDGM4pM+=Q$B` zU1LMtt2b}iC<V3jxJ_sNJ~*S;hl2Q=6@7PtkA0Q=8xJh>k2qS24zWYuB)ZqzS*qB3 z*G@;|o7jE66S3zuyFIZ>k3UZ@PJ*j=m#@8N^x3~4PPvQQUY~>2!eKlx(Vuj*6diH^ z-2wG>mMRDRFPV<Wd%XVMHZk&A+|{&RX>HolR@V?0zg<cT)Iq*(oCyB_6Pwk)RV@Uu ziWRrt^Lbb+EXD&D{Yghl(IF4eouXsj&XVQfrK$zlBo99K*;?S5*wnIqQ`Zd*ZJYI8 zyHw(qtc9drcoLvHrTBLRF?us4pS1Xe!Fc_?f5g#Jbci4NM$vuV&QitS`?BeXoX7Ed z+g1nbx9IQ5ti(OQd9jB&1RlIUvGacvcMzM!IO^kGE#Jli2mK?CmZEdH#!%uP^LCaj z?sbY=HskvDwk__~+P3y4eXt@C`n=jt>Jh%(3}9=;BdYr#MzP}dX^USNjMwY?haD|N zhxnnyKkDr)Rs7x8sP1Jmj^Eq1_?w$ri^d-65O;X)RqF2+hl1EF#?Sb;SIW2Xz(N18 zqowE&H<Y;ddOJ%N_qB>!Hi_HkI=kO(y>kx}q@<Rt`T2UvfPYMn?zrL~3}TFp=+|d0 zeqk_Px9=Zzv=klUhZ6sYx3gsNzg(XMmCZPQZ#%p0_P(4x9NEyaxuM>JEEvD(DSUgd zfNn>r;tyi<W=h5^eqk_Px9?Y0$GlQ>h#wlq@9ivA{0HTSoX7Ed+ZMn61|)uqDt^kc zzPZ+3K+cmR>)O(~K_9Hr!zurms+Nyq#bG7$HQ#RhHb$0R#9Ul|bL2G0o8|9|KBt2& ze=(aF>5Sj&a*7V`<wM^tI^pdsRZgeKsce!{zm73x_xUU_)yT=oS4>A>dz|{GJx2H^ z&YOvj__2m1^*5at<NpiceUip|H4lD;e(*)V<dvSr1NW<xFER<*?9ZPR^=WP<;8_>H zY0Ywyl%a2Upv(Q(_!p+g%?3Knb@{I$P76P=kPC|iy`IO+M8|x*h%6W1@VVIM<0cp6 z6P@zw&Mp^&nww!lqTx5KEtCtx10@$w>_EvyQf~IqQQ>Ek5&N#0j);X^SS;{QDi<@s zI$JLO&gbHwkDFYOPmz*J*@A{Gtu7+X&4fz6ALB{kFO&<z1HDLdq1b_vi=^DlqoZ8- zPeHgnGIYH@52RSgg~ftiU)fAF8?3YC;#)o!86P*fDDnOB+Ox~Wu=F#`OSE&zh2eod zRra9Rfs%`)++3p5b!-3jJNZHiHO8}w`Ao2$7W2Qz7ID@qS0nmqRiC_xlvLK~b!~lq z+<f-~?L0@~-%(0#5TwPN#tTf9fTvQ7<33jJE>t<|exW)`GZ4mOa<E!{pcnh`1)ef4 z)Z#dmKk6smi#|um_`$f$8$q^l>tJ2)*1I=vzkgfIg;&4rwyit*2H<CT&D*y2Tz}ty zQxX@wx>jCc#VYZ5uhx#WjO!mPUT^Yos(-)6@T?Zd`C~NBcwJ;AzJD-L2Z)kq0efUv z`Wb|YmW<oPh1Ljt!viHptO0ymi=^Ca7V>5Ckj8sFWcYrWQIZ$5v~$43=J$+pV08<x zxiwrFw^mgfv>wvKyyX_%j`L@tT|utHwc(Q7+2Gc(LK$Iw#VXnFdGxI%*9J_hrI#^< zfEw<A6?coR4R}}s&Ze}rc|stM4eA%Z{Moc^u-0+mO)2h?AP$RrO7>Z!nf3bn6y=Qb zDbAhfL5(Y#Tn;phTiW@wQgcln(zLkKc;OuIJY9@wQFLvcL!Gnj7s_wi{6goG<p+9+ zCPF!%Y@B8b9@zIPf7B2)Xf>3KAB^GowB^q2x8BvWEqNrx_Ua^P-Fo}BmaTWBoJ$QI zwK!J8$2zSW>loL+sPRWGQ2qNcJgWop&Dqr1=ya(G@T1e3r~!D%`X|2CnwvqGXvvsO zTxfmJH#|`4oP5K#yeH*mvyd;7hjg)LldWNB!}{iTL^-gUg=c4ztq#0HuU1|7wXxj7 zU-9^vXl0P=aBX;PG3RBRO{}k2C5^9gl)km(+JI?7`WaIQsNoJ+aktpofQL1(J%OEY zZJrp&V}tsIPWEiN(Q)C8D(<yG92WPC?6XEg%GacRIGe~FGgmb0yCF8_$DVdJWdgg* zvz8Wj8qf5h;Nfigsjo#_=TPTt`-SqGHowr>Wch)z4p7b}8>iWVN1SEKA2r1JU^SGC zAB^GI<gT&}9e(LzJEK|y)&x7OiAc;ZFV{VgUn_XFrsR%u=CIdA1{UaeVm;v{YZ<J2 zq@O{UXi5AgE|hEZ4G)xahTOro946&vvyd;7hjg*$jIBp#!}?jj%9Yh0yxckCRtMhU zmg$JxvNo1m_`_P8-9fIywP9a(Yo3Vq-m((bm;RLJ(YKadn-b}+kzU3W0-D7g@aPs> z8}P6OR^QkO*M@V(<m$!^9jjH(iq|xkqnuu5({x0P<j7)Ve)WYj(cU0t%h9Z`a6cAl zp0nceO#fKGGg&f6+*7qnFJlS;J(nCA9_XdA1;q~Z$)1AO<m$!^o%*)vh#Dbw!w!E$ zu^&i@{Xb=sX9h#9x!B2{SS3dT9%EWEcCK};(#yos{9or1yWxR8Q|6%9ff934ZXVI; zx^u@Jw`{xnwmSxDV>Y}MPn?Mk1##G#|62Cg!^@PfPW^BlB6mz&wRt*<+H?7U$8`w) zc?^7Od`-TN@$s8%X}nMeJS$*)&BbfyK&W%J{X+XMZGIS!$-!#*fl`A|u0u99-6Umh zh4MrVQG-@P$@sw-UWZzC+)=;%_U!}rc!TKkdVTwyx8J<&?z>_xybX8XwL?#7Zue?& zZS?imZ@YE-9b5Z0Z|l$JxA)$)<DRW|_T&WEXxVoA)`9JB+P3NLo^9^wfV;lwD=e>X zXj{Lrz1CSl_kikvx*!(T9|`=y3OyV0^#af8iuL1Kc+~4sW8?#!3E3K(csTAerX}|i z`5GmEu{8e|e$!f^^^WyD9&qv6ll6n2UB`sn>=*K7@{kf^S}XI+GLjcGtBHV>?V8_m z<;wN|yyn*A>bP}Sd!t^@DqpxDzZgRQjMitwkKu*u1K$2EPM7N;Ym83D^XOYkt`E3s zq?a*;fExCI6?coRPn<uk1NWh6>%;Yu^+RqAU%B%xcYiSS<e6xH5QoKGs`>btyJ0$N zR?b@0CwJJ}BRbpR`iyCucksjWVV&kWY5woDxYKyyEbwsNEfYo8);iQV+kT<^rp*uI zF**J%KTys)DCeDxO*cuIyHk0hhNwZSp=A7E%scPwtO;H-t+;7AVok6^?(v14Q%{+R zdi@xlttq+Vtf}^E$NGW=owc%c_}dGgHDE2*+zb;EEs5X6g>sF);em42kURL6!=&77 z7V>5Ckj8r@WcYrW(ZpF}>ya`g#s+^-Ik5TzOK{fM%c5Af=H}^${NjTAG8g^+r_MxW zehe>MAMj3PWy?xfV{|%X3mUfMSp%;9($9oSzF#P3#nuNrtOI9B+WK(TnB2RHW6Yku zo|(u~%!OC|+UbZG$&tkff5q~ds4|Gza&)1v@cvzi=0RxW8QLE37}JtD;+lL^`k7do z|La_GWO$&QPf+YYpW-QaO|EX-&^i1%T^odj*bO`ULB+m0CH5!EChv!w3F0JwVwJRZ z=JLUqmW-Y2-4W?$Vrl-bbBW#XK&xa9iXA91C*@+r4V|uAciesVwmWaVFMIdx_Qn~- zzAlKx*8O7Hq!xE6XH)uVRiFG}u=Dl$JI=2B__-dzKMw`pCIY+0gQmrv#tY|whu0g= z@-f?a5bB(5ztA2`n;*twa<E!{pwuCh>yeF3H%XaWuRKvl)S=Z;GJY_I*Q3_E?%AGp zPu$mE=NESKeRte)SD*RAUfmY`y;w`#O}RT}m-`v59czhy){Hsmk6)~P;K%T+7RWi* zu`<8r)CDo1b4I+~4=sEhBgRSTXPA&^$+%5iXpPV}JW!rRkaPH!`=s1#7V>5CkP>5B zEAz}Uk{2{v$AFdXn%^4b%IX%Lo{h{~A^3f_=rxV<g$weFA^6o#n~9G2F}!enIQz!B zoi6vxtT8%so=4wW@|*(Kfb=q^5KzM&u;Om9^#Kp-@GQ}^_2D^*$zy~1g|G0OvWq+X zjAB0##A2~m$p>q-MmdZ0!#PF%L`sf|uI_Pt#x%|;_~E|p-<q%EG#wu68!eO%lY@tI z>T+L`w%#UR3@w!7G#g<&CI_qK2g*4G<(#sy=_V<2$CW4Qh&r@7O2!Yy@SF-N+LkX~ z*AA@%>w+!vk3Vd!zGNmE^<#LpuH=t1XYf|1%Nm0RoqpLmFthNP1Kvi>%`hR+k};UL zP`=SOJW$RY@(17Yn3S8%LcUBM(#4)RwkDws>zm($%7N7&yu33fcx^MZP1kh4KI9iW z=pWGf)C7AdTp#v$rRJflyV4TYnBGX1$H=whnFFqq($APeKn;7qio3<u2Ry6;XHMGs zaORjiHmG0t3TifH&&!inhQISReMhcvQ^yu3{LV{fqV^ze%hQX5hkM8x%@c_mxu&xx z;5mu#@WL!;T%RkXmkD^*#cx_$C{Kn5TBXTQ>_EAPOv=TI8#?{H`s|Ic6T4xDKd#t& zQ(}LyZ1TCM>f3X%lRvRah65gBS~7O7edW^2#M1m<_)TjI#cp_@D>WI49Vly*l$(8Y z^i3lz&6~T{Z)vH^`y6le(`TZ=AQoHqm&zu2TC1Gx(oc>0<WEHZOD~s?G8k%Q=Q*lg z+<B}H)k*0u^K(oJ1y7;)Lp{?qEKt@M%KUYnCg<1~okQ}^nh}ewS<*K-&$|Zb`zmVN z^vyo)ZTc%)XN@_dikln|DzPDfe?mDN3*xjKzD)QYD|xfeSB?7M5h+2&KBpNjH!3Nq z(kJ<_%MWd0{r4jFKAD|TA09HZ59RDgHuyYi3Vor&TyjSo$-EpDRxrLyvRxiG`tyoM zJop`bdY&vj>{wmE?^!Vujr;i;X0MCa$S=<ThTq`wz%>J(=*)N?eQU`*#b=(orI#^< zfZ{i;EwrZ$50qR%u><AvoJqOaN2lw~zI)!Z?e2TF-*so+=Q>X+_9H<oRu46@NxUnR zvwr=ws!#r~S#gK%FYa`G#x(BrXxXi$e&_Gx>%<EBl@@y%&-9_-p$6-H%yyj(b<Vb5 zD935@!+1;%R?82Rdr&C%dNwxQBxUZL@<<&~hgL_)_>=p*=U!Fy4Q>IO^ugTh2Rvni zxuIOcxH-N)YNdZT*5l`fGAz2krb~S8Q)|mwgO9al4z`XwQ?Cnr4ZyQnVNJMy9QV4& zh!J`)Q77<{`-B|q(%cNfL`&wy#D&%neZvE#hFKH%wl+z**(~JC<RQgwS}XI+GLjcG zTjzk4?V8`y%7N82JUx3&Ss}L;tKO*Z<nU``Ic84lvu2{9Am`y4aXsq1%dHEqTlads zgPtdGwk6jHY^$Z0$!g>}hCjz~y<%$w9@gSHqG@Zyd)y{>7G3O#vuxX-7lLC_@s9-Y zSo}@C7Ebl+{y@3oJR^rpJuF&vkLxq0rJZN1HP=b=f2YNt#tUbG=h<Rx^0jH}9_pNJ zzfhjj<`+88EI-gHO@wlu**MJ>JmTE1{83Akywy@N{`u!w!)>>1yOqamO+6S=W6te6 zw)fQSxM$$5JMs@KWcj<Hp@TUzWUX31))Ne@r}2lMJrfQ4F+8gW^3IvncXw`0i36S9 zL@mHe?g!$m*4zxjL`%kQ;zH|$zTts#e?;ElTmF-BvsuWO$wRu>Gt1U8v|)YoyH7c= z+J%=qvuu@+bq?q~9KS}EWBAK2)8`|DoQG?~YlRBU6VX||EM8~&1D;3UT5^rRc0zVD zrVvoWAF$$Xu{8n@Yw>*1v^C=MLne<6>KDHBWx08OThzNlXOOT_uNDh>Bg#c{5S!&< zi+plly+ZRu;_Djuq(9_&^sOaxF|qQJ=#=y`rV!9`$%Wy85;GJ#P+nFi<>t=kBJXd` z2H&L59SIw`uvpMr@tm2cBZ$p%af8prD$T<#bxl6$4|^VcYsp-2Up^=Oj41^4TykM} zpih%6D0ZOSmnY@s&gY`8xpwpBkk>w_zl#<=@?r6yJF0y21o2ruZuI$BcW*8q<P@7j zvIPxWT0WL(ZYEUn{d38O;eql@0*W0d`AEvWtK2?`zbvWthT5j)+UxzdXffZue=^=n z`8risT<NT!w{qo7G~jb#wxKu4Ki9O%ASdJ+*|GP<v=p6ZcwJs^40}6vE)>cKHi|Xo zcHgJZb!%;2slNZ4;5cqQ^H5mXZ4vVhD~`SZtF3pJFj5;Uv8A6HZ&##b^c}hNE`y<# z_Pisbd2@knr|HhBvyBlw!vf{CG8F#rcxrZ&6rFv-K>p)>@3AC(C+{1Sq^_3SpLfT; zcHghRd6up7WRtk?g`M8#&P03s7@p;?TiAHku}<^g*XRc<^pRaAIwo0i@0{(k4zmyC z`E|0vr^d{e$-zu~&5EymOMOGg?|<`j1V&;68#44yDaHXmhG#Ku^)ar{Joq*GAy4#? z5#uh&3dM*YTA}ATW*?e%Ujd&O%~xzpzp^oIYS|D53BPrx-rp2Pe1nZS@cW;q>wq7_ zvlwsjG3p=tWn&~y=pZA;Udal@$o(I!P>g0D%C$Gy;1i?yGP%Xrw0YB2A#crF^ejdA zh!0%I&^@jAs{I(A#doWZ??ezEIYI{+@ioe3q4>&BR4Wvp*@q?`g~#*Y6QB8tnfevP zcXi0Cc&qMdgpc^Zg$&)n=g&kd{1~3a*W=^Mcv+2P<Om&P#J5T|3&qDCrWK0M>_gMy zgHL?sD>kNI7GK-?x+`Dy(wD|;c(cL+KH>ux0{CYX-<g#7w)yx*y>5+k$&pA2GU8kI zK;if}7iop!GyBl^bCFIx`x`#-nJ*Jqe9d*)Thcg=W5NPH;sY1@=nk!#iKaYmc(#7G z`S^ysZjEH*2pwd^H@iT5=cA}rC_b|fO<O<s#Am)@WBO(Bt#4~;XsK_$Dfp`YSe6;m zXFPqJ;A0+h$}XRY4*4-Wi}Q9LXRqeLuh9>=qK}L?k4aXjPVISpp*YPxlxHHz2A??1 zm&q;8P3zY;)#*!;l5vi`P2cG&oUAAKn8%!5igV15;aQx$KF(IngI}W`az!5*aUPPa zP@LRb(F(<B_MvHU!Y5Ai6&uqpi?h9HW5dmx^#8TI0RHgXb>AwC#0WM-@XKGIzX9@N zcoyS!ALClhgI}W`@<bmQG47MBP>l9kw@{2`ADVW}fKQC(3%@jr(bm$w*C>p2K=*cF zB~~!nykW)K@5k^g);IWAtNcA-jb!8t9c08xD-<h#FGedAtJ#P0_e;qJpIAd*=nyOS zhs2S*_Zy1z9RR|}dpeySH~Q}WIQLQs-tre}jf4ALi~EhTjoo_L8qrUU`q&jI$^5RP z^vn3ARtAu`IS%g!&Pcz~&oL<!zx<p{L(i~4xle+^AMmu09dwS!KWk1bc3+?LopOI1 zCn>y1X3l|ks-|U+P>D?>#xbrO9t`5N9NsN_Twgmi58WF5fQLRZ)_X!S!v)_p_kN(= z6Beo+vk!f$O${h~UOSpE6A_E<kzI^!4I9GmdD^431tT$njXCI7uhuhRKZa*9-s5Ae z@ikE+8F@knnbmZm813G^P>g0DnieB`VhnxZ8_d)PaU|D%^j-Qqjxe%6c6!|C>*a8p z{;`XGX`lu#qqz46^=@&$S+>F6BU|J8X;mM)A|?BFJ4(NdUuwDi;l}KbWxMqEwSJD{ zy5IQa=WH5!h6T#A6DZe_cZe=z2idIrv*zT;_H}Yja(}ekb+`UFYWw~Aqo=#>+%(W@ zfAqw>NyS7S$UE_g#29+6n29EXSS^n`g^@in<aKM*2a`w%GCo&+N;1O+pJuNk-Kg;S zYWAT#cT6_(VbtWrk{4&4lfWN;x9)v>j9^0o|D<9(<j3$V#<%zwdo&Mzjef`zePo>P zM<pv1BerRU_K4YsrhP5|K6x}>u`&Ic7h}DXz~B2GeFjz-Sx2xTf#3I{nP}9H;aQAt z^)WVT9{d{pkSF@ci1DCgg<`}Htx$|+ADR{;d}1_Tu`&Ic7vrnlLc$+<ulBAm;u~zt zfj_GlBR_^`F+Sj9T&;QVYxF~&=p!S>5y=Y0SnRcy*@vc`b?}MNeBqZiKgRkje^6%; z7>N;Vra$mveFn;p;aQAt^D$QVGpt53@`MgDVx$#{k#mGrXdTTyG%ZH>#2EU*UL0fo z@f`Cw<9G&<Jims8AKaYr-98p<47^{@`!q)1&T05_%15);(=eM4v)}5TZN~Q>*hZ)M zBaYIymV7Quo~krAV+sMqZ(6hGq)8e2h6l>MC1<_yjgk+On+;@5^(}lA<fa?DwzTMR zdDDiL23IJOA-8A4X?lDos((Bj>+W2m`$nG=^8wu@JY0L$DbL0y=k!lFT8hqdHHLPI z?)P>qZm^tdWA4rm=>Au0#PebQOghF)T>KxF&F%G9chzpLYijCh+tQqUDKsw!X}aXW z9!TM9#g)oK5Ub&Sx6eb3uow?q^d}uHMTa~<ZxKD<?JQLu`iFJzE1TrO=RS_{hRwbV zcu3kJp<1~9`Enw*|CZqN4k_k6L0ry){tugvd9C~!4-E8AI9iGhF+=YX-S6!zRm?j- zsL%h&CNcXw$FXhLY(Y1*G&Zy~wd;#c^?#~1+P7eb@fX&epNr0`W};m|ymA}2_xW7Z z2#@i=Mt|2o$Fvk3ask~Ty5HMbs$8u8ke-#wX1xC1HgTS9v)3O<{W8xev%}tx>*X)0 zYh(P{>+ub3o3^xeHRw+OTiZ6()y68wk9<^XryOC{&eo;C8#~ai((|q7=$Y9kMTZJt z#_wq_JMW1lWsDzrBsZTkHm#x8_hEhKWwrY;okDS}k#4B-QPl$H3zTbDa%{Ruiv1bc z8tlF#{xLb%{j|0(#qYIJ#2@tn4aaFV;NiD(&wRgy@>3;Uv&CHe)Oy;GGB({LW$vVG z@jf&^CNHy2f{vv4ZIllFn>`K3iRsxPerffes*Lz?qmuYFjP*lW5!@qKyqlze-y1v) z$Kl+t&)hRQYs!OqwR<*f@jCmo_r<<t?=yek<GFk@rX}xD_Gr%?*4#`i&HrWb=5rVR zP9DPpeX%A&Eq0zkGv>83^v1w&Azy(?w!7G~X+~#Dc5<SFU(TlZTx!;dr2pHPe>%B3 zpM6lD-&0;WpDeFSf!W}soll(~OUI4hJzloh^QnB~?9Zp8fq#5{Ol!8*(`!=3Vx>0b zM)JGwPcMmoOsUZM)F@rkF~8Mf;Qu;L!?EcmDRa-rR`OgdbUtNL{9f<<t@kt>C;izN zzqI5zQRdk5ey<Dmsm0qQE#l?b5;PpoGvFD_9lClZ+85NjofFvLoLHecMx8yxHJARr zy}5idrX|mbHPSsLoS9gf|I6ad=PrCs7#=9EEua=V=LBQU3FvDA!-aeWD%tL0&xvK9 zn4bqThTkpvJdOWv-^n8)#$NSFJwH{RI3p~lOMy3wA>|%sr~qdCj(gc+&xkduhvc3q z6vyenKRP2?FV21F)hT1KQk&UN?wLYoL|;&|=9hPx@%su-!*QxpF_~Mob|yON_XT>k zXRyVdY5l$2p5Z!xPWPwg*Gh8FbV#>Kb2CgxG>bREUhw<w3=ed*CPFQC_6%e843zsg zYlVE7Jfw@=GwW3I;ry_V-vXD^827PJ-NPwI>=(=DQeZU<Y1h;P1@Pkcq?avrzu@m| z_shzlZt(eWt<?)XW#1&nVx>0b?o!>B1@TzjVuQL}ru;IQHRWugU-_B&>y@nA-KyDR z!kJ-0q7_;nd)=B)kJs7oKvzitYOzzdjHz4bn!rFIUx7-tyV$y&^|{F!2s-$!+f?7s zTDxK1%^<Sj&uU*QpVY18b1ASIgtWTt{q+2GLm$7RUiN6#?Ns0&pATxSuJDxWcXBLN zYGZEsOY~kzkbkRNY*4ouU!$xkX9R|hj?IrhS-17l9oF0o6B4b^`Ycqph6nlr*@If_ z)GcG`7HZE0aa+h2vSeFq-R@KEC2iOkzxB244f+n1)YmYLzps6*98tHH&!xbc^`CNo zQkAl9=;OD;%O1_T-4po7=O?sQTsxthHOaA9sg1eAs@s7e|5mrypl%00=hlWb<&208 z?VG<|$+|tGnr+nFOgtg~SE2P;sBR4p^m3VlTI|#<W9k-a&-L+I$QQC?TWsBStM-yM zY>eMz-G<+XKKKRgYvq%=E%EtW3anZGDRq0S0ABo7eBQ;f*t*@Nd1rf{(CmGH5ubat zRxk3DvnDwfE45jk`2RchKX_0)FI8KA`<3GNCDO&;HJ*m!0%l^&%U?PZtq$^N`vqI< zmwkRMsU^-PY>j_$ew`%u%R%jxLCwuDA<-<}1be~zYQqENUJPnEXTLCJzd(5|YORnj zlZSM%`(;=)AI=Z^_~o;Fh0ggk`*ofupX?XQ=Tcxb3~Bc#%Tm@2ef-vV*<$w#^Urp_ z><s+l^Y^q?ob%8%DPyrx8*@igx1B-$t!}YJ-FAP;tqp6+*@U6~KbXH>$-13U&92eh z3=<Nq(E2QN&Kn*m=RDM6r*0Wjx6uEsbG}ivmk2F81RMV&jDJI$e1L-N<R5BZE1%S@ z<+D&;vPOeWp*?0QX?2?^fET}WUiN6#?b@Jj@cBut6?F@xZj)oNQX6wuylf^~9>imH ziw)|wQu$>vdE$(qKYC#PdL`?2uWI(BaAug0Xoc2ip}I9ZQ0f+Hu~WB<saxp(R^66- zd43)&RInxMHoQMs@fGcB<&(O#d=|=!*$nBq)a_say!bufWs9xbRjP%vJ#SA1{_*)K ztrhntQ0`BXW3f`3<>_qiPkMrSHNV`C;E($gXgE%FDkgJBwO@|-J%OI>7i_R!8viJ_ zUpSl4ss8HxI!W%AcIj4XZiWeoX7MK23*Mg?9w_%GP>Y@Y!kGO6{olGjS*w~)#$aQx z*^~18_xs&De#j5~iOv+|i9KUEEtDIx8`5*xGy4l*#_x=mEq2dz{_)wrpH?MZivgdX z)_Sp5puFFo9Gh;EGIvt8cE0$M_{ZeuStmh9Qv6aU_~ZRFXgE$x&kph1d~m+sLhq+l zNY^G?yw{6?zYU&-W7ADi<{p-<vwgpRSBl?Pd4DaQhU26^8{?Ojd{5%Bjy?Z(a5h-H zuaOq<@?{&)a6I3D<1lySI{i(YKY!rb*@O+wrWx;xeZchxot{6-<(n}rc{W9|c~EmR zu{8ge#hcGv_<cOX1LgTO)MDpsV$9hDy(utU$XB3}?H1bWWnQC<LnLUEI$MHaUKhWG z-tV{1BcOBQ&-LBo$}6TVuS<d1z@*)aHveflZu~}Gw%GIOjOLx~=aDjje|&yMYsUNi zP_C`Xu~?~%xdY>8|9<~E>6#()%lrHI<9vdKW7ADi=AM$R<hfYrd^(Wgm-7gJoKMhj zob+d7{L+%=gw>~$=6<gV_Nm3od4xaC2WU9X&CKsHcc0FQk)Yn~oWKU>M7ipiS?nRM zx%5X4<?_v#mOLk_q&p>?nOK_t%i_)FE__ZH9w_(pP>Y>&f-&a=v@I}P$XB3}?JoA5 znDe>G8VEZ0O?kiHj))k0#b4_C6O|{<2+QeG;58U&XGH(k=C2+4_}%Aai#;Q%R1e8L zQz(v^z&|>l)p~L6LpdvwW3f`3*-!47^HR0-Im4i4%`f*%_~X59XgDrlCeG99Yi6QM zu=ciRu)&_G`HS41;W~h=*1wvc_vD^wlx~IQW|)v@7H@*R;C;X0fv(m>sKw5nVa%R^ za!y(+<jdqCUF@D&rJ4`thkg7e-tW)bFB2JkpOkXMezANm1y;k5wqHgI;KlDTFI((> z!Qa{Lm*qj-;B!oC#cMd|nv}6vsg1b@RJW&nZK7m#i!JJQ&ii6bIh)W~_VxMem8{#H zvN@r-873rJq4inl`Hta%@_s+mVyA8yQ@2pA1=b4rGI>ZBTel}vd*S@BkKcLk_xs94 zHuMecYvq%=wR|oGR>P21w;g|-ju*efUiN6#?UBGgK0l|m;{ARouUV60u~Hjz*Iqjl z?GN&Ab&Cz^_JFTZ)|4{>Lz%<#<4@M@TImjHZiWeoR%m?|s$0VYeSz#jEq3abF?9>& zvu)N2`7(J(7hAU@s=aW2*vD`3eN#Jdk*)h1?Q7+Ty0v^R1y;k5R<{)?>xMpl8@=q& ztlKE?kI&!NT5;`!a@HirVx>0bj;n5ag8W<EVuQNv{ia(R)|4{>L$iN7f4!1*drCFC zPIEI%NVG!hvryd{9w^V#p%y!J%b2=_vUjZ&@@4XnF1Bu4ReRz5u#ewl-P(VRM%Mdx z+Ske_b!+)t3ao}9t!^g@;EnzIHC=4o4r<=n-X~NCb%W2(Ypq`7DQ8V`Y_TM%<>_pn zryor5%jahC$1_1_I8OSrF@CFGJ`=47@@V@78|;^niQInSY+~-d|8IVsB=^gh_DZkj zW|)v@7H@*R;C;2>fpRYfwVbnG7_(oXFAoeC@)f9LyNlf~L#p}g<U|L*$@lxibH3_` z&J*R6{bKoC3akbrZNJPFz>D8CeoYs<U+{Of`=u|a8+`85T5--pIp>pOu~HjzGpgI> zARen*Y*4qYf1j&c&L#|X|HJ(CO4jY9YPL#qGfYUdLhG~8Id6ENobynNow{XA-9rDj z&iQq!y+ml)A=r}dn}&6J>>stSl~3x{@>wV^S))Ox&>l0Dw7NY|055(|dfB5{w=09X z!RHsWR@5z&x=oJ7N^Q)ouh!?kgLtfNu|eG~Q+}CDo;V}u4<DVsUdg)Mt(rY1oEau0 zTA}q>sBR4pl)8ml?9?q|>K6LHRkyP~H;M4#A=r|28{VIkeMkFR`J`?wpM~<0X8&C3 zw)b1}*A3hF9rd!s)@`L~;cU;_slY!zzo@n1{shYXNpdV!YO_3@?fpr6P_O2f`w{$c ze*z81sZPaY?u7Qsp<vx@zhHy?vhLft{leLVt@?kOpZDZ`sh93D&CM_&(JbBsd%^n? z!vp311ZuIfUl_Arp#NL<Co5F*$rx-5HokY)KGPNQSN@C666J@zV!14o6Pp*(bJ;6< z3Sh<W5ieWpUI7!|GjHED&$v(=%YvFg=Sy0r=X=U}CdXo>Hs&_JVkSD}>k=iaS!__V zr@Sxn#JPmd=)cWht7Od%$mSu<%`hR+3dOb18E<%?D`gLAu~V~*saYu3J8N-_{;w+Y zKP%!iOrG}l*`bY;_iAEsJU{=>y0iRw&-}bW<|JRAdQluxQWpM?hU9&EI4^lkSx6Sz zwD0Cg|4dC)I=j|cCzf^B%|xpv=hwt{wH6mhe)6AlGWIJoha4?M=Q$cfId2=iuGIqe z&$Tgk#doJ8>X!F#{CA_oISyk^Tl+ZbG(iw|MsYW$#C^=ieZt2IesDnh9W6zNxS_oF zT<vw2D(>=Q(-FBQZlCMCxKrx6Duw5xb!Sm?%}msn67TnXyhnYEa#@0ZXosVv=nyaT zWuj}n?o!2jT7Jke@%kL+#hZBFs46kei*r(O?n;UCxQ}z($0k=L_=VPgFQ%pF5GR!T zmX%(<RB@h=A972aKDT*s&O39e=5g|3?WmoJMpI&a$j3V7;*vLgX2thcA9t~$L#$9f z6It%%OBL&c{E%N__4&<<HF-`}B^kk9ol=~KQsSKQaqf08$&>Eme82J`7biNz3FSTL zxh0PCp!|?q;`F&)FwTaKd6C-3h2weM*Uv=9QeypAAM2otOWyR|gw~&Ov7$q)Q0{wA z_*^X2n(mb!@=L5fzj?7HuWwaJMzE$cit}_zod4$I>~=B9lm52G_fPsb(IHMKYkI`z zVX5Mb{#BoYlTG3*@xDvdwd+puT3wZ71abD(%|sQ!H58My@B26#<;!vOIWFIybhH#5 z;)D|CL62pr;_TPGAh{(@pWD3kOopY}ozDtlJ*8Mzr^I@~$GSGS_ry1GkIcB*MTc0S z)b3uNi=~Qn`HAU>{1U6rZyama`ljZFja!;>|E1AgFGuQi9SQK-z4ecUkNfFk-`98k z$Y!hh*cK@n`geUU>Ib>?gqQZe?kY7GS+Y@M$(F_ob-=@SZ~jUY-N%Q*MfNS%XEW`* z6eavyexQ6`CzSh08>dW*S<LNK{-_IH58CULWc*-U=8Yihuj}1*>+jsN<BpKGdE4D@ z+J5V{gecBW&%MoC@4S7-*4wwWY`tUKrrU12XWM|E>gDbC^>1sc-?(-Ao%8<>XigT+ z1V_)k$gs)GQ0nT*$z^v-Q`T&5Ud+#%l#|6aw=@M(WLs~!euw_a-`yehWGSP!Y<fDP zKFKNdi9Y;28)l+*KZa-ZO&vW(<5fW&vo7dV$rdzh$=8mo+nn?>p_1?8H?0+_JM;|? z^g@lPBluQNNx9iC<jdqCE%Y3r%qx|Vyr5Za2CQt?{Prk+win^GCKpFM_-h~5b8h7e z7nWc6m5npeY_JC5`aD_k3BMNn-#*q@tdgqloGiLN;2M#Bh6#yg*c0pppGT2@@IY6H zrmYY8HM!ZwSJURM#-<I8U7NSGwQbs<FDLLqWcS|M8;|JQb$6crDrsF_wQ7~4uY5&S zzBzrNYi(Qm<yFsno^)c>>Uk>qCnlHk+?j^2y~=x;yC%gv`?c(lJICe%8Ec39sHf;u zX$-wZbhX#D`o{jbHs<#IP|p&zc3i{!bu-4Syzu3{$u!2YAa{8>^HP^5P0d`sMvyqL zO*QF#GM|Sq#tVGj)(E@tiG%*~A32InmB!F+(Oz$7sq%I}epoB=W@`mz<t>}DuGZS7 zHt}f4dhdz5albF<2l>pOyQ=q|)qVG<8s}GOuh^==<T9<2x|Lq+XZBV4e(@kr4uP)e zK8FK7U+{?uy6dE)=y3l8C5~}#XQ^_y^2hqW<g!T)ZQaOIaIAH0XlU=M+tS>=rOoYR z<o*0ZZBZIy%U^+ct73ijbaU&Co7>wiU*$MgyfW>={mM0$U$<&Yv;N&#SF3d6xi5@= zr|VzavZc8>Kj)3jGtoql*BGdNRrs8r^!bHP4xpz!eX?};dmkwKea_ois+<r1ME{RM zHp#iIb6U<f);6_t@$U_r>NiU@ZVTl))Xycn{>Dvh^)Cn$p1j*xINeF@{A7dY;KrG# z+UL&0jLCAJ>vqL!d}61+>!*%h<Z}&uz4$%e&Qj%i<taULlTC7M>sut(z+14UgFL%5 zuij3Q;wx6%tIpPHE_vJ?UjDr2<;p%Ma<_n5h0Cvd!Kzi+^(wdlk~1%Vq4R(38h7jv z-&~8n6Eetq9F%@l`ZYP}^ADdKLFYWZ#IFhTUE&|{c9v>Q_WXyw+eJ3x`u8{%Toe9D zm)`;C6*_CO>k{kdcEJ22hYaT5(-+?Z`TF550Mlrz_JGfyhS|2l=et8O8<Y6ycmB-L zXZU<WId6Krou$h6ocyrH<lELbHQ!sB@{XGYbDh)8B|2NW$@;gKImNRaykZJd9Ph`O z*XT3FK_1B=t;*;4kk2PPVuqgjxuehaIfizMf7IJqsvPf{)&JFzO>%7Ox^Rv`SLB?@ z=J+g+8TT4A?UV@?U~z|xO-wsuR&LfaFrQx+jr+aQuSc_TVtn#Lzw<vGeXd^*D1x=# z&Qh(%ocvG&tcTUWLhBJ6F$<sleofB)h_MV7ul>9y0(sT%>SUsQCK?TLN<L|;e7+C) z+`=P%=)i>!$MkZaZ)msp6W-2J<$K`&Oh>G7T>suT`KG<>F{LHr$Igp!Fs_#_^crD7 z$0)pToa8s%bA$d3RZrbrJ=<FKpa=C>zxo$iYx(5);?OUhZSx%~75P=@Ie|?}`%GDx ze40F@_-*&H#eUvk^4I#TfpS9}hvxF*n0ow^BYyh6@ru}Qq4<UaT<E+)IVL{n(>&$* z1!JDOB;{hot&n|_hxA<XSAV*2{&srVV)F;4bInux4Kq=vuS@LMbD3&iqxGt*{rc&a zj5Vsz&*@+3e=qwv$$atLC&?45Xk(7~gg!}Q+XvTbT&D5MJto$U|Al8QoI4?`Pmo|- zxjdqp0DIYgDd#m#JBiKC0i>awbHRX(#qRmEIep+&yUxdJ6do9DY}EK0whh$QwK7`V z8Z5SsskL&|fb*39JIwF7)N#JG^wGKCJ@hExU45gTZ}_zWsqLNX{kje5EIX;6Zpk>S z*GaeezjeRl=Y+Xp{{PF~F`rQESZ&m3%-*T>n2_@sC2L@?xn(+s**om-di{XCM!d7# zJ7(uxFn}kycZ%(Uv^o30t5)yhH42YdZEV!|+B=&XHrnoSx~qRX9kFg)mzJM#c9Uzy z{6g(q>a^!K|Nq)o%T>>5@rQX@>^V@@p}$%8>xgaJR~!7A9+S@+tw*<H@x6m|M@k-! zPWd^ZZ|48M>?`vL<$XG<n+A>9SL;0{<b3AO8W?PDr?9fG*!z36zF;4ro@$(S5^wUF zWOmL410It5s@NV$n^U5_0Kdt{YZM;%ZEV!|+E;b0iD#xG|D*r8skLHXb(gyP^kfd0 zU#Km1U&a6b%HvPk#BaIqz+Y^gjy>k#D09KXaU4BQ&c$&+_RjWxtkL_%KUg*@zZZGR z`%jFyZ-sK-nv{zbH|F;B=cPKf*I4#qQ;%g)bXWYWQUeJ(^lk;M-)rJYJ(Z1EVO zV1!cN(5HAx3?^4MZjbgFk3LfPEUMD^0Eoq`u|s`!zt?>BcvM+36P<iyMt<<+UgPa~ z<aq3NT(T9ukHz2UO@z<<xqA;T>7n#I#~IR`P}Zk$&*>A-#U{Q=%k=kWgKPLGO}y67 z0r3y7(|!7PCZoY?rlX6+d-Lim-id$Y$u{iy9i=m|O_Tq(@O`!jzADWzeQ3GH_`)Xs z9KNg8AhWe!E}g@|)$#a=Xz<$Uh&mbg!w-E1|L7qc2-4P!VXd}BrMWfC^`Ym6^! z;?Ln*n}_e9_=kn-$QRZ}gD-datDAfBr}3Y}#`vh`pE%FiG@aiH-xrJE+ow6E4{g>M zU)VH%Bf{`}$zJipl{baDVZT%g`W!}=KFrj7eQn*VyVf_?Zs^+5x}mMMUjP2FsYUM_ zH}gL*^-mye9d^oBWwq`}Z~j_zM3igfwZDGs<-`%%rq6Y6-1B=Llf#DWe-!6mD9$G_ zNVLcB!3#CMlgsto@3pdlFKn8>W3O-+YG1waGJJ&k^ubW=`6oqf9<oP-;TuITl)N$@ z!?<kV3!CO|Mmp!q-u*jkK8Fu%hYbuF&+jYC&5L#VOG^H(2!`_Oau{ZJ-5*uU2EMR~ zzqwO4M6=T2J-BE5+3el;2>sKK??F6&Ry4#}Dh%H$f+74~bnInh17G!`aZIZojLy`! zJiPz2&-?*C&<h){A0|A1@^NmS$<Gspe-VZXV+6F!pKIl{s=LR|w;QM~x*Ogzoz3KA z9+*?c#q3dP<-K*$YUPTYk~{Kx^h0+=2d{VchTksPcz7Y#6JGCKKN_7Yq_^%hebJQk zsF7QK@RC~#>A|0s9((@#*Z%7JtYK0Y8~Z)K<9vtLbRMHMKCU(P+uPVNeT-k@%DP;w zBUmLH_`)Xs_J67_+NFCB{5<{dfAG)vhz$h4kgf6jDbWyTna2>mmbIyN?r?8oJm`Me zz!x_0x9oxkqLBvoxu)lgZ0N*Cs81jJ2R(n}0yoce9xDt}MQVM&?5|ul->%s>7rNM5 zPv!xik7ljU{P(+}O67{2k~{KR_12F>?Hi^e?hoJmxhvC_Et`sd>7npn-+04Mv&=-N z`d|Mb+9f?ci}}loF8MZVlTeAz%6`vZ@py;BbRMU*n=VwtzOWC<zUf0x$riq_iNBdA zd^%d$<o54ZE_h@NAE7>dYWTFrFe-V7^L&qCp=)QW?1wh{WdmQ>#NV=qC!)2lay5L7 z@{NyBpFX)9^!)O2H_vpI3Byd08g7*RlPPx1#<|eN)^IWp_<S^L82eLCn2E?Kxg)Q~ zep?sKzS`B?6E42w+vF0xu(94Vng?%K@^C#aP_BPksOJ2+xuQ9@-a~)%*r;1J@P$qD zw|k?jxe3()K0^QW!O-jZ)feXGA$z>Xuu#p7%Rai+W@HOr*u-DuH{KoXZE<J!^5Oo= z@nO0~!O(rUFFGJSUcc^|d}M5-fZi#O6?quX6NGhE`Fg4u4X9mbrer^0mki4Wn6L@1 z<=*FtC%Uoemdo~k$~Lb*lFe)%+mvtnlxz_PHo;o<<-d#$wYs&q<8OcTS$rgIvG-1U z41*PJp6OgD48Jb2_m0YbPl{c$aV~VRdoP&>d_LNHuj5HG5jiDy<aK!cbECmFxAzV{ z_O_oFihJFwFN}6eFMb{oz4Ctw>FpkQel#jQ>hy)B@5+8=KB>QU$EDFh>9LOY{=<8J zlaz<!Bhup;%{5Pb!iPhC*l!<ue>CIu{;uy2|2UL|{hqgeCpsfN_Rb@tU%Z;y3FY*` z-s<^hM8o=fqH3!|pJ7hDNAt{8n{)NubIHxo5!t{OHu1OrCx01@w7b|Zdh>h!9v}D( z8yF@%f9T0>p2?r&F;o~MpmvWoA^QQlq*XTXg-!Ffe~Vkscc>ol5$e-tZ8|*v)KhZv zkW~mnsq&D9!CsGKWPc*XF7wZ|Eq0G3^MKz+dygGbuE;65v%L1+=xXkwPk-@ha+!>u z^*-$R{ZGx!L+{DT^|B&0w@3ETwN@h=_`)Xsh938^sO%<Jb1zgK;KOu{f}zp#S1fn) zO!gFyA#J_wTwg2urVl+VTlm7J`K!Fyoi(Gkz4A-=2=(cMfwo$DoHhUOi`QQ?SU~TH z$BNwSGxw>&dZF^QoI#=))(+VZMg6h?CTxQ1w6}dm{SfDJ*?yvI^ZYN_%y#>0^KBoI z4dTEiSPu<vkJfd%Gwt?2{qQUCk+j9$oAmtgi`_iaxkwl;F0%JpWxxKS`F735xzNS# zy<{Hn`DpLGb;=bvC3o@KUG}<Y?sYEL-=2E#fkJV2{@qujir4G;t`z>{@e_QsCAC%F z`Icz4^jM$Y{mGucWo?p*)bOz9S3k|+FrACFcF!uZmpf(O^r7XlfiG<0Z{O?oMn}4) zBi<ML{OFhd1RtS3eK0Kd{ETRb^JyLfuNjlgt{-P)Ka>s22EMR~zqu<Oj81gByuL;G z#z&}6pB#;N{_0EIJkzNZhN>bpJSY3hD(BlZ8|Ok7Tf@mb;PcV0;WLVvoRT~8I(+8K z(daF%=Ju)%$YnBi*1OE}4~T~Aafxz$d6AksD*K_$A=$teHt~1jjn9v2dR)!@h3Wtw zp+0>u?DG81OWi!vxzuAwtvUZ1tzY&{A6h0G_`)XsM&G$TYTxFr3-`X_6K}&us81gZ zCtmZ_s8@R2Gk)W*&i~nX0ljk1M;^xWbYXpw^0m+zKO+11vvxo>z=Tb3t<?{*>ZiN0 z>8+6M7t40|IV+Rd^<&R%`L@etgE+7W)}w!08V%k)9r0T8y3DJl@nJTMviFvI{t3}A z2hR|OmkI;VDU<DSel3P&KT5Hi)VJ{g>4F8H;HmtF2cofFS1(haxUd%trfZb78u$F3 z6>gr%o+*qk6GoodC);@*<D~3|vbC~-FKps(`N!{##<#nDQ~Tm?XYdi~(+5Mf=bsb} zaXw2Jt`UZXUelkH{m|yPY~Tx<=I_WG+*;lJVBZb+2=(c+RvFJf^32>kWL3gYBMcP` z63y<jXJmiPGv?b(s4r@`*mE+O2b?|H=j2M|iky-=@;dv$Pe!}@^mokiedEm!7ksVQ z{ray(`=v+T%dgmCUndFVyf!!fo#?Ri$o;9WzI<JtFc=Jev^F{+J+8<9{gk);HES4% z<1TeJ=J~D9a(GSW*;?azt#RsWN?+?0cjVVum2BV(oA^6%*@My0oet|SK2xz5A7<Yu z7*=`yq-coqGLIqkp4pz;%D&lxj>!hTu!+C2fBkeca@Tak-}$cl%+-I5k5HdJIp6R3 z!_Ri}Oy@bm&{U+>56b?Es`+-!#<|eN*80Ij9`N~S*80Gck4F{C6*(n$<aOtntx@M2 z-8JraFWYfXp}5zsd>|T-9&0lFkN1DQkRJSD=~3&S+V$ICu{KFv>ZjN9mtW>^n9fSA z-KHWnd|38PA37sj_`)Xs%J2S4wDunNUdEq&@w<=1N2pI945vJX5y?ZG&-EBmuiL(c zdu2bg*()3P!lwCa9&qm!50?DnefS9V>4Tx)^H)44HxJqKgkg*FK)#dB?ybY`|3l}L zY~c%==C5Oid$0JL-@E_a_(<9U!)cFURC1e#-t&dwh9Ve-WIwdoFB|y6CjQEP_T8xG zP3}3~-@W1&7vm$;rw@if&tJLH%`=@<!f;~|48yW-`q0y|g)eO4@65mNjRx+Wj-D#n zWj}q!34Db5)<5Gh9F{!9dATs$Bn-Tlm2CD|pxp_ZgBs%toA~3iELW72UCDg=jK`4p z<H9v|$48>RLHAtem$(1ZHvA|3aNh0p{NCp}o2K&u;p-B<h3><KWWQYVY)&z{PP$;h zCwO+Re@wLJK8Nw}%X%ijkhH-%)_DFY(J+n|3S+l0E_5H3k$tnd?&(LOL)efnY~pX? zOJ9iw?swPQpMUk2pT>vj8wJB*&+mVpn`g4s!mzanhB4VUeQ1qr;0v4h+xOE8qK-Ga z^YW|T{K8H62=(cMq0#eCi-tI_5QbZdVAv)5q0PgxfiG;Dzv`WCPo4j>4eRj{>eC0q z5zilder_JJ7YW0yMKJWrKDyQ#WdmQ>#9#Z?Z$&HK;xH@|A0MV`6b!ANe?~OK`C?({ zDT1L<_RSXbh-}~soA_Hcv^P2<9iH#q_XmISm-q<v>4Ra?^M_Wsd8V^Q7`7F`u<EV( z7+PfmU)VH%Q_{iDGw<wJj}NnN6j_JomtCHlhx|%mxUC3=We?<In3OGiVH1D-pWhK3 zl1_!}UHIp-@5BeT!v=;ak71YOA<nCW;r1dJW&;eF`|F|(*}xYz@wcnt{n6Nv!|;tu zzp@n{p?~^d==S{b7r1$*bG0z^7Qt{#_Dz3c?|3vNTlm5z{)Pv4M7!VS_GbBKcioK- z(>Dr+8INID@(|}*Vc1>-!y(x>Tl*`=qi)&27dFjb|J&W?Cg=Wg>+A7h`bNRf>-o!H zn45?ECBpEAA{h3`zS)A#$QHh^Y5sP<!|jV_?C#r!k5HdJ*OOBo!?@%&57|qF;f=zu z(Dh_g_B&JTGC!^Dk}g>AX?PAs?)B_TFPm)zLvkK@8ut9^)wy}-y-XPIE|RAi*$-`& z%Lcx%8OJO-^3EIve1!V+!LZ!(Gom5Rb;58@5eyTupS7v^!}<XOHqGDu-*wm3wg2?9 zGx*5r`wnY0;`u#S<mMs1Mi|~K4B_84_-Q5f3??J{%QVmU#pqh;f(4)88Gip{H2E%f zKYiv8ezg(|NgL#;+Vf9}hH+dgj5~|uY1ytIPqH;G8~DN|{u(d*Ty#h}#QEB_JDz}# zGz=Nf?|YG(XF4wzhPM>Ka4LbJS~l>7P5kvdyDu7jx5LmWK0eI8QSwml`Lm)S&T3(J zYY_}bW#4Q;GqQm%Y~pX-p07vIdtA+a;G!K*z(=T09}E+oKk#BV&vafP3=b5+a8UM5 zzkBwEs9rYkg-!gedf*SD-uF5T!{Xz^^o@d{+4JW_L!7S^hPM^LFe3YA3pybi_`;_7 zYu@eN1H9`Uf7*nPP@g^+j(YyiHMx1nt`mlL2t(?#63^Tx`{-J0mJNJi6Ms{;wM4t$ z=bjVQ-~3Of@nO0lZTI{YSGsv7s}Y7>!m!ZmikXDXqZ;E2oA~p8W03c{;+XiygsbF| ztE1iTpVr?El$5+6dT;{&<~yXPrO)_~<Y5f8!uReX_@ac(evR>kP5gO$S7F~?_Y8`E zLbxXX{f21I2i$(@xV7$Q_(w0<_IQ5hRnDf#uNS`e7Qwetb4(vvp)tO&iN8`^<n%Wh zYt|@(hObgOlfs4muHotEQqjM;qisF@;U(Kz&p#s?#!x4G?<<1uaKh#Rjq!y|{H5U= z7ypECE&GeFN97-yj(C&t+VB2i5B`(b*aMTEKXkRTX*%`7_fg^FyZe*Po-s6kB!3UI z$_Bo$iNB$`Pe%JbIvru-hKH}+hmWK!Fm!l+*;+TxbQ*-=V?{6wd^{h+q-@~}oA|4| z<So(B2i-n=+#9>L;KS@21;dobuuJj~=XzlnDS~0&-h2!lvhja;J0I{ks<Q335Tt6A zpizTHO(8(RAXSPKERfQGMFJEEQlMZ8DWsUTp#&)qB)|X#0u~GqAV7dB1*2355;SUs zqE!n7jnYq}R7q>Ws#WqzmHPVKznSxN&rWxDcDL8-xw?I3&Y%0apFiiEncd9}y1+zV z^V>fdl-w6x|Ne8+&u>JB={5<623J4+;Aot+eMTJaO5o6Ne>#U@VWA65(>Kr)?bB}@ zch95fFnp767;zkys@=xXK0_StPT)}fU^<5eVW104^liR-QPBEO^giJ}-+k@@beL|F zaA<P%WuJ=1S=+JVa8Ck<!DZ<jMudefFwwVm&u4<_uSM_o?7RB%Ds&jWNjPkB9J<u* z^ZcwhbSH2avpk(clQ7T)Ci<Fo{y;GMk;o5!yrcRQbeL|FaA<M$6^BIQtnD~)xHo}A z|D)*~HVF$|V4|;oUUN{^8*w;m!()}`Fnp767<C+a)b8`F6Nmc}IJA5tokNQ-&;=&? zmR)pTu;!alEY5yo?nCG>-6r9%*wt6*8S*~Q<Hh0r1P(nb(m9L@3teEMuk+I{2V1`t zt&=mgcA>*`n}oww$ARbA`#et&hX)ckOnow)!(w5e3ry43_3db#Y}VR^4%2NC4(+a< z=Yrcf+D{Y*o=2Z+t!{ieox@gPp$km(P2KJG@LA)0HdCRs3mstl1r8;yo@YG!JZFjn z&-c#7!Ja)2=FDY5&@K#gfr-As+s_D}8(pgQ-TwUZ8__{uzrbOMtLJ&WKF^cHfoC=6 z;$YA7Hp~)XpbJd&wO#vM_zYmaL-6*xdmcrH^)(5H@vfd{ulhVs76+cYn~Q@zo7wP| z2m@VUnm(TA%KQ6MwRWMy`kI8pQdiIOENvX^r-%d3P|d}`p0jIs<As4PFijuN$mD(T z!?kvy!}^+pLz%1R*@QNZ_Ih#Pxs<s$*fUcNZ>ccQ1t$6?E|?oW?+`!yTWc3OtglHp zbh&z-Gw1U>RUCN6U@i{!97@A069&4#MBk=6hr(yq!QmpUUFfjBCgD)w>UnmT&+~KQ z@JIp&d#0e_bqNDqV4|<DLhpCK5XGWZYZp4KuSq!cxO$$&<nugD9C!v-E<f1w;S8@r z80Z2MeeFNHGkm@i?>AiX>-W8m4(n?Y4ppw6XZiR%XNd#PRLaG{p1WmuJ;Fj4nCL70 z(Z%8Of%xq0Lwk&NqQm<7GI;)s@Oe7i+Z?j*r<e159lzZ_<~cOv_-oIWPpGTO+;7Fs z)57Pt@Ewib(<;UdW$D-b(*EHyP{@_NHa>kU&qVQc+3`s0ufu1El&WIae?RvC&lIsX zUvBy672)$YSc^V!*X30_kHc^Gk9mFtc&pb|pThGj{5JoX=ReTzh>0sIc^-t{X2<1E z-4H%I0liJD=03!;6s*mc%U!JTub&U6E7mV7*17IoSHxn{p>tviCUG6B8<%VkjIw*N zPW9tiOoNUG@$+-y4DqmMDEYiOw$J9K#$s8fb8-eu>>8_tg-5nWI2o4;jpO-9TO1d1 z#Lv4k#f4`U<?_j@7?&QMlb2v(+gNSR*`BRrJeI2;&n>DvB8nL~=;!rp@v!F)W%J35 zSUyhFIe8Bzc8x8SPtu=NHZAn21DvG(JX2_f<3N7<bLK2@;8{Ppe6c3Rp;zb3DKN2V ztdcX+6N$_Zed@!rep(y{=8iuf&lU%s!;_1{%-B4dq;uvgnAkK{6Ft+Tf{eoy_2)S} zU5*3u(x2;}7YCk?lZ(Spj6<K!Sqs3#rm<SQ;v9I0k8v1KAD)l1(s5wU`|C)9IPmP6 zTpVV3^MCaX-w&qfoOK3FY{Czj9<O5@Y8XGPze98!SWo;lYK}O(lE7iu<FM?ygM$H` zvxb3*O>l@m5N4Y4(KxJ9AD$~ysyR)X@=O(f{X0h-)+KOg&={BEp{M~v>m!)hL@eSQ z{8-FTe|z2w&vRif9e?xvm2mNKIi{_})pvd-!nZ!>itB6QT51)ZwD0TjT!?iUaJ{Yt z9~Sx@rucr2!vD+fFo8dGwB9q2Pw}1kb;i2rz2Nuu{B<IIGM299V7B_<Q~m6b`$pXM zJ^B0p#p=g>()DBB{y*FIh-%tvhk`DLx8H+pf6Ufz?LQ9<`qYoT_V3NzbF%fLe$eS% z@XwF_GF!iO=gkc^s~^`Yd;GkcDUh*L|8!n3?)T9>#-X41R91fV$KMuIsUO!!zrOPM z|CbR=mE(UhFQ`#Jt^xnu{)tPn^`o9=z3{pGw@$t0XXJLgFBr|Po@b9(9O>7n+<#NK zpYgqU7d3mfjNxt+7P`Ph-{Aax!{?bW#}2=`>}Tk(z9!+Y*>T`G96ryvjsw?u@nY|d z+VfMay;&IO0@L*IY!5K{4m;xpbXZ?swz_(rX<_4NKTjO&IUs(2j_ulJna22Sn}vlg zFws}Pdv{PN4*2q?KgqNMM5C)64r?jTLK&;B6UUT9|K6tBv6IwNvfr4J$|DZff0>?q z5;gC$kD9%4d)c_D8OG_U9^t6{A{JxDREozWy?EY8?GNUK&-f@+<B=zi{1E?GKVSB_ zdY)(D`}lnM@9p}{t4vm#|N1q?$C{*bbb*P!TGyW4F9&LP$}i~;EeRh8li4kM+OW_q z>BC}PnIaA|^x|0}%kO+Sd}aqZb;|=ceixg4{&u|D)$_aw-)~Lwi9O%L`kFMKlxmFC zA#0D*@1jT-nCM%v;kKY>!>a*P@k1Z+d!`?^Yh15h_>SkBjGl0P(Cfw>`O);g{#n1q zaLzcMg~Ii@5^B2#orLKb=4PdOhA{|}FaF?@sGr#KVTzY-t<p1~7ta?N{LfJMTn;`< z>6?4qFYucVw=0#do@Yz=zMm(*+A}=jgUqjO8soQh3kzLfqOa{3UB8G6-;rxva>5V% zzW(uA#{vI@zi2PXy;L;mqNfUkW_q*mQ1vM};D|9LnVxGhrbG>s!XZb7&f4~fhp;Ym zF{Da9Hl`#zVY=o(J8Vn|Pd@QnJ!XwKuhWa?ij+?X!sl}Eb3VsC{^FnUr4F|%9j=~d zM)>i#K)$wTc*F;puUBe}-!@L?=mHac6|Ozahf$u%YvBU}#+2+I_u?Ufbauxdc2Teo z^`l_fu`+m2`6bR(dhxuFp6)f_b2ND7-N9!a_cMIt+iS;zuAb*W_<sI^d}z<yu)ZeE zhfNw|b;!CCM*?(#iM|G%H|gd3uvO>ur7nE>2ghl93G*;arl~HO!j&*e&6HEaht@Hr znb8wn&r<}J?0yYW7Atldrhge?nUvm@x%3F0X@D7AT)<J$3TKZ_DfRL}n_fIiX6WHL z;qy0GCYMiaJDfO#onrqjcJ(|<!jEOM;#85ahxKZV4>u|-bb*P!ajxBuQvvJ6_75c~ zIM==PA`@DMY~L#0rTAjgtHI{?UKT!IgIxd6W5@jrANls$@qnx6`47II=gWuoEDq~y z(sF&%$?2F=bdD}C(O2i%(|nk?UVKVw(i7I6x=^qS_sId3!GAU4Tdx<-{9wNFJPf|a z!2HEOX1_1DIvaVOgYV-7@?TX#4ldOg!>Up4FP08;fr-8jy*l;s{nw*&#uTttOi=f@ zLo+TFCuit*V)XRQ)MmHiD+O0EaXzLdaiM6J{mb>@IUw~@uMVG~!LwD@?lSmiVxYtA zN{_4Oxd46~7b-^fyp8xE%kiO8(=jV_jxI3KH_5g8F-lq|_+vKD0cnp4DLBWubI%Tz zA<LDQ;ygt!p5HR~y`k_~3EUUo{P2F$@e#gQ;Uvf0^G!VSi0ypasvmM`kq_;;6ZG{9 z_wJO58&B9acEtG$d_P_n3df$65RFRx|IU)=nCBm)YPB~A1I}QAXW0CPJ$9HajLC+* zo5S9s{)WwSAbef?9zIvWqb<+=9c=n7agt;FQ{vV8zFQ=_>^J1;>ld?&-=_EL+l7TL zFwtY!{DwICjRRw{VVhlp>TlTmM!)H*_~56*-y?^6b$jJ4VAHR`Nseh7cH^n{ZN5l$ z*>8B$*Dq!lzYXr!&w{^nfeD^rcb+aAb#5FOlMUPKTCV<v&2Oapy2}3@y|4A=gmEu| zO~1`fa_r}GomYQ}^0`%Z+3!))*Dsm!xpwWY;crcY`Q2yR*8Bba<0?<ju;Y%ti=~g> zl+N^<U8b+&BYSSMwa<;k9zRxJ6i%IRScl@p;=%99`)wPAfseoh&#;@%)V`y0^BrTd zVOu<=oRNx0t^9AgI%?+yjXSLm-_!k2$?zY+25+^K9Q*O;^Kcf+KbOd^dfCNimhqCw zKlM*f3-POj-|Vo!SuC7W6L9=>YVs?42b1+X;~F|<#xCzUA+Fobw|abyJNhn_zRxA- zTlbGS+u~8{aPW(ttCtDql!UlWeOr25R|*4Pg9)BtSDYoE;1|7&e>QB3Yw7G%-!{e3 zbWM6~C>S>`it8t&3v4hKJIS#h*A5ToQu*g{*>z?C{;{|Y38&U!fzu|O*$Fs)T>W?% zCvdJ1&RGdK{yeO39I)5V<u3{6jD&dgy)!*tEy4(WC`|ASdz54M!k?6E*cPvq>L2yg z^}FI@x(5GnaxhuX599siH-0_m9bj8OU#@ZW<3As9v9>E^*BsfE>wUq-vs0K&hdmR_ z&^fxmL?8El+n$|p^x|n?+j=!qeR;mw=t=#-?02sZ|7M}=bH98P9`tK+l4J5}{O0F^ zR`uifA5-sKN`0o%?Qyd9%M|Z++0!I@O0Ck9nbwt7hXW7acUKAL{DgRSm!{&~zVf!9 zK^WKuCU}P3+Mv&9bZ$07DI2!MdxiQN^(FF$udC@j>%-4&S`RzoNwDcR=p@Jf{H*rs zFPDF=mR$=9@Q?535yuIfYlO2f0mq-818yul{g?;BnV;b2w)ds{jD4$xf$d;|XV~56 zs-8Bz=ts$hZGJAFlj<ADucm9LdQLFo1M9=jf#%$^_wT?4Z;O*0`+n~9aN6XbYh~BP zvWw4=;>GgN_m8cE)#vE`+F^lnop8RGfa9-UvmdAqD)xxhgM%mj_SU#=|9q1A@i#<o z8#sB;ulJ8j#E0`%NwX1N*NfLB;>A06@nZJ*`{1y%X}tW0jf??jiEtJt*w^*Jx!dAd zG5B22^ufr!Kdr63F|OOrtKR%W(58O;UQuoBorha}T#h&{_2iDn>jv?<RJ@Lf574>U zH+XpJ{%63Ar8_nvvF}FVT$W&8Fp|Qla(*Ju{5gG-a9V|9>niwG>^gAGhg0*UrTdCt zvoOeAFu^nIlJoW1kj^cq!O4bg^Q5LRvWdQpnir;P{N_i3u8&6ZWS<Y+_(8Dg)8Hh> z{yZ7*aITPlI%HRS0sgUhQZiTZa#-NpES#$naQt{#-0Os6oWQw7I9CfNS6=)1XmRfp z4xF$ToG%OKngl-n{IGd8EDSgq&Qjq7!a16XSg}0x=fBOfy7M$&J)B#Gb8P}2e?3A~ z-CoiBdHxSWAB(Bpc3LGpoD4|9on!33P5Q2rK0ZT=7vsHYkJP-ThAS>ERRKOG;k z?Yz_JqXHX|==+NFU7w(Dd0li55sr1aL!SC;dZ%!%6i%*rHfi6~JOgW%Fv$HnVS<OG zzT^VsgwAbFP?rtc=Gk)fryr$H^U8Gf&-+HObz-z$KmD%*eg!st8l2>qdDeZ?P*`8r zl*0Lv{ByhP`bt9legA+rb^qu->8%gGk?A&#E@P^ko&m{W#~polNMC1yK0p3l#|FV_ z>Ek+dUGRLSbPx5FUirDmxAWv@ryG5DO5g3$$0zLZV)^Fhcc&ZMDjc{o2AnS8+>yZB zpKonlR|IQ57V-Xl4&LpK_ki@3=w<rulD<2ouPRPj=f>M#C+gf-y2Bj_@4JQ5mB8Cy zxB6VH$RBbR9LhbyxlK5^@_*yUWBD%(auQ7N47;OQw(8t+75r@2+wx!i=|?HsZ+&38 zmOnf%=$jPf|BKQEHhnfa$+4gRRbNQqTq*x_%dYzh@Q>wnvv7tTCvff+&ix5Ee!MJS z`-Eehz`0L2J;JGic&u35{XDaL-6|Y7F$A3Zh4VlHA3yIc4{PN&I2lfla2^!S-Z3tm z8XteY`gsT^!+AhB4<+#N*O@-&TjJ=iWe*DHUg6}*!^Tgg=ixeGkQ-ovXV{JN^_h## zEob1G4cqc?lE%=FvPOAlx+Wgd9gG|j?Td#DPB{$hs8{;`Q(gUNOT@)mACg_mWmm5I z?I90y_-8K${W?b%nCKg;i}vXY=eNvRH20L&Me`P%KP`2?y;AMfQ}lk$XMY`(9UAdG zV9%F_-~or37pD07^QCP;s=i%$wM;x;5Klgkju*=ZKaQ2HtAqN()`#B{oZoOn)~6HI zJ3VC!bwBKm(f3v9dr|swt>1qB!D*B9;m6&6{;RCNoxgJbeS<Ndj@FG&eD(0($8E9m zO^(ZK@iJe)>ucgQC|<edg+ISmIh;}9U?ce8JS?1-gfqbudeZ#q&-cN5x`T03qxV71 z{m@Gv_qwMYZf$uWs8B!db3Q%mJJ+N&dM9ffm#NAFY@`WZ%f;*G3HJHx*)lh_S2);c zIFAVD7YX+H`_I}VuL$Z7kK%XPOK&~rQB6AxT;5U%cO<+YmA)bA%at!_*ZZ0mj3xj5 zIs0|tJTIJF>r7ou`Z_a17|f{=VS<MQd(B1i34ZZ7XT!F2rpud;)taxSYsF_C3(Aj* zu7@`qb<R#;qhn%gBspgOmhW;!Fj@V$K%4!IjbR_!;$@A~Gj&mF{8jQ}uk8O_0e-Z3 z5(sD1VS@7w;k+W8T=T?_zs-|1!ZA+Zd{a2<gp+HY`1xpgT_*p)3A@30OgO(!;N#CX z%j-Zma59_~!udl2AAkPWckLfE938zsvHN{*RLA3B=d)crIfpwE-rthGSEVo4y6dll z%Ule|3x92YTsXfKPOiKznUS8?mBJv`zy!~*D=v{w@QcSe8@A<ji<hUfl%J++aKi(^ z;IYx?3)6q`lOeFNeX)}q`}<Pa#Zf!;SIa+7$gWMYE7$vKzJC~3dR%lLGxyR1^bN|) zWs~FED}Bq{G5Y$X@6QSP{P>UR*<sz%$LGo)|M}~SGHV+%X5^78^nK81eLvvUN7rWS z7dZPzCCwM`dQ!apB3`-XiJ#xI9Zts=^*vN~49>TO^VbCX{P{NVN1q5*)U6MnJ$cJ- z?pc+MH}xykkNx@Z&;B9P&xeLX8^wo%AxUiH7+z0_*JknJt3L5!`=!60Om#T)#YQAJ z{lfWMf_?rz(dJ@LKKg6z)57_aaB|J3(G%0>Q;RUjaWKI%>}8kg^B<jC?!z@3w#}!N z>Q6t)M$I47RrC4-!OD}O`E<H;fgN_bEY;tiPg57C>aUT1z9YNdEWkfDPXghLI!@qx zS2$Y|aQt{#Uat|3aRO&RIR6w*uJzB)N6YIn*$pRb2j_dj`BwrTe|}gV&K3@w4Cnj8 zc}qCC-VgNWzn_P2GMpa>XKMl<f8APR@m3uDwQ;3z{vn)PdAQ`X^gP@m9^^)dDLlh& z(=qw7EoVeF8@A=)3@@+ND(`$<<4%wEz5U)ey&G(7kC%E^KhUOjug?!<*O>3+zAxJ3 z_3wE3$zV|D=mHacd=6PR{rEX8+wO`|_eE>fK12K#-*iPV>5S-pVDVi$Ul#I^>hdd6 zeEs>-d3mayFAY2+p5w$b-~DIOKNbZoXGZ(M1AjR&Q(A{EYIb_6<(DdVjJ{{3@9hct z{QMhz{I+0=^zACt_9fZZ=XIalKNvSV+JD}+@xn~$9r7w6PAaXE<_mbO60diNSFZKh zpI^hCAF&ZkaGn#+I}_~l=lfR0k+H<f&#@l~XIJ6mnisuir_YO0VUPo0f@j!$U($Pm z;%K>nzHHbwFB-i3nW6kLU7KHD6fACt^6eJs0vo*2D<jFVpKrq+&b9K-k7d{H1^CDE zs7iV|9TqsNh4Y>S96w$b_h#W3Cvbiuoc9VRQ^MH3?B}B&cQ|1$I6oCmSppw_J#2Qi z;5UD+{!BQf!pRl)wT<a<A14fA0Va5c-JxURV=;njHf)RgERCTbWvSw9x@OnE9Lzc| zx-Wm?tQBX29ra58ztPo?zbfKlt!rdgx$MgIKGD_~<~p6D3rzI!K9RncQMd5iIn8sA zU2xvQX{q&aquP7Kul~Y$!IJZ%{0zo@?QigaLz9yn`}x_{p0eXQ#qoLZ{AeL@bnCz> z;Y@Z|;JhH5$^;xguPi^|XPm%!Q8*KXW4TDX6|3{}e7xg;y?%@ah4T^N<jSkbUr5iZ z24RFg6ef6vJ#e*-IoHd$WW%<+TH*EWQG85S@7taU#>|i6b+_ULHkjqtq_F*XRl9cj zTrdB;B)j%W@U!n9TTfbrGvYXb^K;?sn}CxoUd9QWUkGPn0*=293^)$h>*wf@aQ04! zS8q#tyh?=;`cRnQ8FnYfve$fz@3LWAyc#ryew1>>$8^oOadl9=C|U=8u;%1nfgSZq z|G(MQH(nQUvDRP8u4>tpYaJ*F(lIv*3teEMk9FXbEbG8#wYQ2N`et7geXr>Eo&Ar) zgSwSYa_r|-ucvc~;`l4^Jh*^3c3oZ_^t49TAMd#2HwS~CsRT|>#kIOmaL4F-S^7Se zpwG|0Ex$S@sJ%G4F8bhwS00~97j>gfM~C#8jp$n|eTO9I^XE<5=IOzR^bxlO|8wCh z+4MC^4{bw|*vK*Z{-5+sk-l8}tbbi(`)q~c1$V>wwQvqi;O*a+b>DeLIF|8nGMwKC z=P==9`XJcWRsTM^%=wZ0@pFDyIFp5wYh7J=Y5F|v7X~>ACU}OuX^Gy;)w$&=T(e=@ zJRNs^WD|WCE8k7m?A;#;Ixdg$|4r!vn?5scNcH#gKk#sFP`rLCyJ`~r?EA;^dW~?V zIxKL0C!A>sIDWh=U(3Wd@Nixc&QS?Ce*Rb<&K3@wupK_@gfm?@6RC(5i@TrqmWRuP z11E-n^LydcCh+m+tDlE(GMqmM=V;;N%0qv@D08+DM}IAQRX9fqCs!WMx+*;nYlJ~= zfC-*quhKF3VmSlXY}l5EOErdml;z4h(^Yxxp~2d#*N4An@%kqp`U2Qduk`=BUH#IV zA}-cCBD;>2UAgv)DL1BLmg^i{V4`nqY4m+wT{SLfoU_PXIi{{1E7ia1n)Si5_f8MS z2hp7Q^Ui1P4;OfBa*|_z&h&eFZ&XgK7uT5yIpN3B=FAx3w>T_tHVEgW1ROuNY|hLO zj&TC#kHR@Q0msjEn={x6Cj>Yfg>#B<Y<^I0#p?XIH^bS2-~4#LCY%$6lQTz`r03{} zFo*@1;2HLkn@0lTV=;nHHf+n$$sMUYnW#9=a=OZ=zbmM^F^c=nC1>srHh3dWa_q-_ zg@<#K{PVi(nw8*Z-#-@jEy8JXSm69gIHxDz`0=v1*NCTa0%wzO&Pc%V^T&@noUj+1 zKMUu~1ROt~Yus4;=FgeG2<J56<cj-}Thik`EDT}+CU}P3aLY(Qd@M$A&4z7puhtm) zQEC)t(>41&`rDAD(c1Kn2abLf?5J1z|5IFj_0ouowf<FheO`9uTAPME%=Ux#4*GPC zE-=x@+N5jQ>Dkt%0rjaDM|4iTHOkSmw=DTAT&P>(B*%V^)_*x=ONU~)SzMb6h-L50 z=zD41!Wr+d!1<eS<_Ra)b)27Dvv;2t@*EL{aRTS>!nq)UkDu%IJz4C86B3*^g!6?2 z9DnYO$e)bGZ+^T-g>$}ea^-0M?ddt%E(~G;CU}P3d8@v&qH~K8`m$kLjt;6n{V1~( zXJ1!vXB78u?X>$TVAE%_lN=Lwi&vdjf3y7aKeFpW*=6fA{jFG??;qdKB@PRme+Xxh za7t~kCk@As*RZn(o_>zLDV&xBKR4Z-?&podz;-afGwgv*U5o47d;+Cx*yiUcx262t zBft8(CU-~gLoB)R;}gLKul)8@e}8`Uc{sPoKU-wi<+6+4F^HE;{xLsSeMRrrIV^Dg zDV(+h96w$o_l^xV-5b3hzgJbqy0~sT-|BR9N}q8@-@l~q3hAq~j-E8${(SEI)#E|O zebIgH;oraeX0LnNVYBp5Q7u1WBgg1_OZvVfeVKk*$n^Pp%IsGj4<_9o-RIuB&s(d& z$yE9-4uTr>V=bP%@8s`i>O)<Li)$;n<MG-mURR1&rY|NLFaJJe*o_4f8<E)eZ{f5j z#LvHPs&#Q8&-^+4zrwjpIJwrNjtA4{NvSZ%T`<8j?Akl^-j6t1PQx`Dw#}0UFYoI# zFHBeOpY{!AEsN&KedrQ4cs)*X?9Y>759iDB&wpgsbp`lm+dR2L@p4$;jJZ(n|0Uq~ z@v{7H7LIWOXRL6R2&WR_v0`!e^U?CUPdHV2F$A2QgmZ&%GX3<G;rR2&@^Gs#;AA*E z3+G1R@XKTIVmSW%_wx`=jDb&yaBfQQkH20wJKqvVf6d!PIM)g%R~}YAnx2PU!XP)m z1kbQ5x|EYTx151%Hf+nojp|Q7N{jN&*VXg&=zYj@dJdfecGN5V|4}!7_B|07YkiyS z`m*fGb?w#>!)(zxy1+!A`#hq4-u$`8EL=2yPV2PPJ>_DxZxlcD4faOgd;8I$8+zbD zUB8nY`}1Y|T`4=3DvrB~=UoNF(dJ8=a8^0~;EWT_-3d5;Ucsy5o6+}-j=t^LBRJ1g z>K)%rlExi<Z<oG%q^~l=Aj@NaJ}iCnwxIm6==1h-zx4S`(<nq*<@8OyTc4M@WAwd4 z`nshr)3d2fU#5AyMmTT>9GrIw=U(AtB49ZFy3+Nl4+N7}M7+me^0np+=7v?{o_Q{q zp?-X?_2J!1_s`aEnfTCFru@K0j^Q<4yzUdPgQ$oV<K^!wZEh@Gu@MQ*yM%MUaB^Lz z_}_!>b~!}8`g82v!s!xDu61GPiPX9<d-S<rg)o={V1j4Zv+vV)cy(@b1FqSyZCx1C z9oa<RO`2b(i#@OB$<%cm*!1all4F0qwRt$V%0Iiwu7?ZokIlDD!kO%_z$q2Z@&p_| zUXwoa>tNPX(RJKAuB%=L&rD^N(=qv8<-ezIcj<dX`YJOFvi$J#*7mVA!ht)(;Qb!q zJSv=gug}(e=D1*1e{_8o<oJFD_)Y4^dOQ7;E&FkvsVoy8>dO=_Y~&bT?-j4Fi&w7e zGk-m4b7L8gjfPVuoZf`E`0L<!=Nt0JU$fsQoUaKdSN;dzP33=y_QDmy;Q9<q@C<vT zN4c+a%T>5$!`_zv_eVC-w_o{gy4Y)HelK->1~z?a9!T|1%YP5&Hu?Gevg`2z{A2mQ zN;s1p7C0Xe&JzhZe!MKN$BS>9hf^+`KH*eiM66g|XIj_mg##ysz-JHPJSm)f*LBOo zZsEYma6TxUZwn{a^_f4f{XB$|;e1FqPbK)rUx&v#TZp5-mQ@JnTf)hehvm<v@~}hK zE>ncT^%<Dp8TNpV$rsBRxMst)JY1qN^rJK>?@U+EF;50vtD^nxhhIM6F0i9s>Hl}S z`o?7u7i;~n?E0?k%5{BK{a`v~sm{>_Ci>j<S?!$G?XS<u)pwovm8^IsSp8h|{>l?) zKY1ZM;IPt3j{W)4>*@T8^6Dev`D_7kwD~eBoJNNQ&PRo_DgnpOEBicY>O=Zm*Tbn4 z&U3=y_W<L?=1Zo1U`RM{VhnsH2<Jz_sf>f@+;IGPN4J5WMC<!*`@MBvhGAh<^KW(y z2Gx(>clpc%S53;+uUC9%t56)Ukz;u6DPBJouS^4tm%pwAZY<-m(Qx(>&gukz`}@FD z=Nt0E&*duNJR_W3^RMFh)ck9{?v|im7~~q5;2HL&uPG;VZaE0oY}hvc#(g!iiM}Js zW7Ac0(PhEL7oxoWiFAQYpBWFQ`ulkucsQN%^WL)Sg#!FzdA&wBQymsK`v~X71ROtJ zme*zCYn;H@S2%+SIDS6b_04SIzzN&InJAo>gi}dHtXTf|^TYCRnQ-955ODSr&d-JO zi5Lc_hU3pyKM&zVKXCRJ&My+|^7nx<XA5!k*Qk#P=Xv4e%EPU{Oy%L|Z`K4g!XP)m z1kbQn>6m=6oPldLY|F!?8bd!y$&2d)(^Y=RnxO6F=rfkD-#_kku%lk-|989kmPaEl z)><vQUY1?C_JJwO(=p3+jxI3K=RW^E;o|w{%w4qYPCa$6Ua9`8#j)+MZv-pWt`DE( zu=%9hzXca~tZ|ZKf6nxKdT&=O4-nT^#FgLqj2FuZKbAIU#yq0We;pP$9~aKL1ROuN zY|hLOj&TC#K;iseIGO%<)%f_iZgXaxaNvXu;7k(EAB2<X%if0L&%N%g&jrhdqc#4u zRqvc1_l1AnuYTMUA3lHoOd$@t_B$>U$qkR!C&cSj@tW)dx?|(zuPsa6Sh|EZN@Cw9 zg)@@iZ+|bC;bKKz`1yR0aDFG8Tyt>Ty3`zm$0}ivYhZ$B*jsv)6FRpXq;EECn}cOv zPtAih%45^DZjVRwJmx5`-*)ot-vS%F`fsHA`+2?8!?{ELnJl|rFTg*R*K36{!(oAQ zuyFpAfaAx@^14!djT1PZ63(Us96ui|ubYGeCu|4j5aIk;IJxrLpC6WoD})0l!<izS zzX&JOm;Njd{rT$WA)E~7P~rSF!7hLOsC2dvM}LhvOgOIzCs!VB+?bw+b;2Mwzy!~* z2X#!oSkAyT8@A<Px5m(qvRQfO>uP#EdM~v6fP23HcGN5V|K+ZJ)ngGCYyGtBdP8<) zS}4Zu6!oh8W;$k-&d~)X`grabzwLMNqD6BToO|iE-N1ZRt^NbzShn?qVA-D{u1~If z;7z!op>jnEpE)xc==W(|zdw&}I3Z%O{r_!_*CvnOoyx(fvgs|^lxvOlV{X5PGg*9= zIV^Av7tYoM96twxAhM%PIK~N_BZTws1RQ@(*mqE{7*0rVjug)SCgAvUwBFf*fBn3u z5zfDaWAOpsiv3R5_|56LTrLb^1}1ohJ@759*Wzfg1ScD|<#Ll3?_tH+bhV#(d$9Iz zQGWbPy1)jn{PFbsu(*$SI9>A3G}%@1{oHZ){bO;jmY!~h1<p~z*(CwTkC(;0RXD~8 zoaw@OTLO-sKYrZdgzeze3TM{@96z61oh|sypIb)@XJ_H$iu=@mq{qEf7{mfh@C>_C z$Hd2C1lMfX7WW2?p&w;barSi$ycykB{krkNH^Gj2rT^dT>X-CIT&(pN+4WA@m1_+f z_e478Mq!}~O!ST2UEdj9aPj>3mxjz&o7HFhmi2l@)@{M4B!Am?;Rl~Q0xs|vagt-! zu$uOvp!A<nzug}>v4Q$brN;4E;qkjmG5?HgDw9pQ-ZS=NZn?ZgI86=<oEgG-UjmMw zgO<xRvd1`qbF6UQpMc}f2|t(NgzeybRyZF>!13p3xf_dr{k%9%IPVpX#mD!ptzjMi zPS53GVGuJg!87dkZ|gl|om(uy%7$&ZT>WG!pQ;sSU)QYvL~*}fy1)i+*h!AV{BU+H z_i*l(f9hn{hYRqJ#eK7I8XOil#|!5p2{?YdEbddp(>Q^1f^a^XfaB+nA9pxmFE}R( zr!oP@&*v#_EPnIn)=c442q#zEH}AY5)QfJ)kT8e^nBW=qtfxi-;$tzQZ#Ha;dzHq} zkJ73*`?^|o*%036p8v)EBfyS&rT;(4)t5XSak18uWLK5!%C&~AiDCBY99>|dk7sSh z*D!u+*?iTfKC8qLoxN|{5R^(j{+R>&;6h!4lN^(yl-26DyX4;w?R+Y%$nalDe>A?; zNxIyln4c`04v<ZSUWW|`r`lnGbBb_2o`B=$pxrCM!#IIcFPsAtaQrzjEPsK4U;KEU zDx7NJm|y8*#nzt1??}(VS;D~AV1j4Zec#b<-|5_908Tb+%faR9Z~8_QAJbLyor8kf z@ljk?OBdMmEB$V&KXJ8qRk?Qhbjv@VlU)ZF;2&FinuRm$IDvDTa6XlQlPzAx37lEN zIV1tcUo-j~2kiB8`E=n-PKej&Zt3wFCydaC!UWH-J2;lT=39K14cp>1OJnFqX;6Gj zSM{dbgVx<Qgn!4e`L~Cx0z2xJ{(qyZpYpwki?yC1yFM+ua;+I-2GTLt2@73dqL26S zSTj;zxVdN=_?Fun)n}zRlCR6(lUg(2LcdNYIVQLC@lUWy{dU*!A0FI!l=@6%isQB1 z<9DxOex_`iUO>z(2R93+!C`?jTR61|IN5U0IDvDPaE?yE@z;z}#{s|i@jP2NM+wLL z>ifjjjE?uGa<EQ$*C7nn3^2hn?2X^o9;S1P0a)3vEeD6y-*m21d`uU4J*zymW`Iq< z+8?C)6IYAZEZ0t-`{bX`%dX=J@Q=l-M>wSp3!Dbw)Ft3#i<fZ%XO3`=Pr&iljE&AO z*z4!=Il}pDLcGRRq~f(zYr<4vux5Y>o?)-#ShkvP@m)4-i&uxn(2vrp`1rb(d^lP& zPJI4jdxIVIO8>vh)i?hz;$p4m%C3`SSFSZ<^2!uu=Z78(%5;t{FwtjgM(RW0^fjYG z{fER6odX|<u8BTew&%`pp>DO49NTrqTJ__eYPYM;<Y%!mmS)Fm*yDG<V%{j5&X7%o z-YZp!N2kLAXRdJ0Ou)&OgT@J*^Mo@y0mol6Y8?ms;>YuR;hZj<Tx&+po~azfX)A?+ zufYV*uq&R`cSdz?F`#cYY|FvYXHt1Es`!|$D*fJQb5#`AgQN>=@D@ACF>$qcb$B>E z@=ufOI;Q~t*qSjUoLYwk&OG6qn}CxoUd9QW3xv~{fa9+j6^;Y;`nmiC;mk>hSH;Bi zc(n*4^r0}pGwe~0-3xzGvSC}iR;qv0Q{TT<e0*Kq`$c>5zxF<`4{Yn_%Qdck)^iaT zYipKWO|mQ3n$ff>9dm}x(FG>@c#oLt3~$W{p8{jKJyZQRi{tXgjt$oCzajjM*jbOh zdJ0_N(dQ(`<kre3o(s09AD?s8UC?_G^_fbK<5lX7e?T#xFPkouP4-!WKi2B}nEUq> zs~sjd3xu;M0msk5#cnM2_;FY$oR);#*?d5H?(_-+AAt#;VUPQ<>S@!<?8=61xwF;l zTl%pLf$6FkJ|Y-6F!FQo%I|Ii8_Y&0IVK*%r+hlBU;Lw#&Ije67TI-~?8>z^`~I=H zzEU`o92Phi3g_|!96w&;_if&0yKw?%k#O1)aQwA-oa2DKehywFoJ$kp)qYTVyk-j{ z^r0}pGwhb1=$Lc8@Fyi3w#BR0>pP_Q_`2#2j@IVt)1P@S*x;>kl4Cz!6IZ8nJ|zFN z%C4(rSFZ0e`~I<c(IT96juSW+3+I{yoJ{drCmiDh&KHFfB;fe@gMD3xYzTi_^Tiy$ ztvUPF=x;G6$}ezd9QrPizH6m#e=1_d)&>9l$$rm&aAycOi-mJt0&o9w*?#9c;^fb* zONDclaBQ9QDcOC)vcpn&wtA1}f>pvG_F#f%*lT|(Td`L!!^wtic~+(|*0)J{Wx6Ka z@_5iPHCh+WI&0hr*z}wHvs8cb%;xh_4`-SDbD8YAS$6Gi;GQ%;`~I;!quUIJ1<vKd zxg`O|k5{F~)1MP<!s$rx^UNbtey+Jdzu6;Ou^mk8HteO(>oalHnNQ%H4cq+O=J{=j z{A#*pzI*SWV%moAyM5EUpJ)afyiHDWjGrl!)Q{u+HY{5aR%G~Zh0`-*O)5@bl^?H= z{hhKu(~q!PJbXWv?DfH*`KS%yZwStP;ptCgP!(2HIz9c8Yn^WNeM$OmPtfPbf8f?* zgHh?@8szDdd!NmwZ>iZO|Co*FyHfh@kiPvg3^e=vb;N$7WQK6y&M<J=g>z>DZ+~5D z|6A&}a>lrrfpe8`x)N~wb#{sK9dY;P*ww=Mig0qR4{gV!@)kQrgh4KW37%mOzNqhn z=-hIQzS*!XZzsQy%A;E4pRa4ij3{qUmoBius~$}CCs!>WS9myIlYg#}UH2B?AIq~X z!fA3?-~__CF9FAom*r25_!=j0t`*Mx!r31qVkKApED;Wz7y{09!s$ui<LAAfKX5Xf z>xJ_`0**glYa9ps@2?$8gwrjYT=_HW`1Jg#5(Y5^6FkFSu4CeCv4(3lY|EckjiDc9 zw(`YvZF%(MVC@MT`1#K<O*MVZV27Pz|FygN?w?0otoa7n^;OxG>z<|TrF6`#!a^6A z=o_mqRO@>!pP9Qb`gt4kQHjQtof!FKt0d3Qo^@dVvv5HF7AH9-$44)_FDRQCt<5+5 zX9FL*WGr=#&xptCVL9MN+0rXpa((|iE!Kw&1v5{I=HAlx&CmK=y8)-CUVK~KG5T(j zzHcPx^K-Oo{tdyf^l>lt)RFHxDWh?!toHn3HlnXX`o5W<&tIFX99R78=f%y!`MPi{ zPCgI2RvJ7dJ(o8NgV=!yo?#FCLf;9|xy2N$Y}l5|H5y|&Co0~itM}2ngYHu|gwH{~ zZ0^8?VAHRBDAk`lvG^MXa=H9-i|p!?UAgvV-#>L8zMqR<7S0n1{#kum%0H8z34&5_ zgfp1%HSCgK>boDRGh5)A4cq+F;Mv<Jf0(Y#RsDM2bmX7whR%KsZ15VK<QV^~8aFTK zRli+yy!Pf>E~7qE>Gbqi`y=w>QrZ8V0{qzQaNyy`>Q>=Ao#4m8GgE$q!z^K78<^l3 zcGa)+*`LnMX8LBsHa{*`fBI1d<PXzTe{grueOC0|$%41O`Bkv#)9xh4_|dM(Ik)nt z{BxV^S}D7Bw@OcD+T;2h5Agk1eMLAwNbt|b&!_umu`u8aCU}OuRma$2wm>Nxw)tnZ z`Wy8D`NMRTAG>eRHz!)J*SyhlD%kX!^>V5|{u%P>ecyG;uICc$sy;W}u9?C{7ntZV z?25JeEos#m2Y6(|HoJN}o@-=>>8j|uJ=oG1*|qkZ>Cb}=-eM;?&KCDx#r<~K^)uO( zX=BP1_g=>XeBXC>2<N8>{;5Ad-9IhDfHRoj8TP1-vBPY^hHTj8pOxxQKgz_p8v@hC z=iQa_HU#XSA6V9O1K9ML`TtV=@y{Bs-uK;|vg_vwb}hRgW!LKKZU|-w8(m<c$FSGv z82!cp9@((Xt}c&ft?V#e{SzJtTADY6&-J<Bl7}aN4c^3Gr`xs6tM_g0l3gz+*foAZ z%C3$#_YW$CjV>_JW7x}djDF()k8IdxSBuB9S9bWi)-K!-u-|Q-{I;{f25-!7((P*V z>V2E<l3l+|u&d?5lwBK_9U5#A7P>-A=`rj!9ix962hqreZFbG@c$T(o2u#<eagPO4 zFN)UZ<*(fF64;ov*6U9m*8BBd+ugG34+(Y+wWjQv`hoWagBp)6FwtY!^~17J=f(jZ z*|5#7N{yi(rB!yAuH`c?3wpj7+4ai%o?ieqeO7q=v8&pv_iesMcKtEIt|^OCcC|nM zSg>4J=mHZxhF$$z*{E~l0FP|gX4e+=rypgl>@Z!6d!_{?mqqWTc6?^%v%#j%5+^yv zt`e`_x4Bz(ZA!4K>++Oc;I#`2U0|Zeu<L#&8+C3R=$j4O>>5;m`cbCH4%1b2y53{F zBKo}b7roC+1)Dz0o#Yt1{CiL8C{Jj=xL0<)A-g6-RcZfc+AoG35Ac28-RE#}U9YdY zGTlEt!hkcF;2Cz+E4nt-x!D3KIA+2&|7=!&Bi|)|n6BPScMg_b75V4KhgUuaHvQV2 z<QV^Kb>pe`eRsd?dMk@=yAK(EO}br+g@G<G!87d6-|N~(=f(lu*|5#7)#^__O0Vqj zb*&9H1bh}VxXX7JflZ&yPI8Q0_FilAx)jcnihGaj8vBF%uM@zVbzO8_@`d*9M>)?_ zYMq`E@!0CPqwfLf+e!K?r~I*2=ii5}>VF^@bA1%Il^^}pp?-h=c*$<Mu5kTozr13R z-{v0=J6?6-WxjydgW|Qbc;)&VIsbmV&+{WTq63_Vgi|7%T)(g5zc)4Hd_%naTwErc zF~Z4|>y~d@Zb;9!jlv)Yzy!~*YhTrOB6M!K0oQEUmTy!3kjj(tYc~X@tLyz|1*>j~ z@@=^Ftk=N?uE$A^{e0{5aK0`7d{uUhmtDD@5AOTN;<Z&c%?=BkuL<W}!pZmj6U#^V z87FWa7S6kclk0b-{d}x-9I)4)W6Oo}&V+b1eK|c|UBU=`C`|ASd+K@}bFLSBDcP_s zUK_o>n-m{k*W_C_1bp_lZolXH!3M9(Nsj$^HIAfoJ|+J=BD>x%yK>z}r1{6qi(cVW zI4p1;70w5QV{;t6R;<pSUl#XKVHhWHzAl_{;pCd9e*XCL6i(;_r&l<82q)J(_1}LP zb^gU~ey)E*IPViqu6f#jdwSfL3WHdH37%n3{-eHcrgMuCT(e<Y+}Ei;{V1~(XVb;p z5ANI$@Hf`131HJ_sgoT0ai6^*h0`zpd{cH!kX^ar?)%5)*D~RhIV^A<6V9H(u^6M* ziq-k?vbb*&hH(OCg>d!~POiB7`QyhOPUr;ZTf(UlPOiB7`Mk;b7r*&)=5gUv3MW_G zNAF3+eOT-75@8SvFu^nI>eux7kIpSdaLtBoabK(c^rQ4D&ZY~@mG`FN4mN$3ILWae z_xg<~oTufVCuCQ(?8+5)-#-@jZsCk~Sm5*t=K$eYjL~bw>il?F+((3AoWOZfI3E{I zuDJX8<HsFN=mh86!Z}blx#I5U^N8~=e)H$dQ^NU}aB{_c(u1kEw+W|R7{nb+@C<wS zbzS@G++qaRY}gj}LG`B}WuxM3y4X9mJ`}~BJq2v~O!-r)zaRHH*G`}B$UptE>k!$M zYhU*LWAW+~PKm<;=V{?g5l*gs*^igy4?K($INuS@p~A_vFQ?^?^9%O+x&B?@d@3Pc zJrAei)uA<ck}yIa3KP6xhh6t)9m`hpEu6DqTfEvm|5q*3_br{SSvTJuG(WN-&?9=r zeDdlA2Z0UVawj?V<5jgO702(&KLfIBn(WH;*|+Z>@OmGOKF|5riA{B!XDVAA-vR0C zbI0iWp7b4+pwEwM{Z&^7Q@<YBcgTg=pMSXQg6^PR{qzXOF~7b1wNGc_L|vz|zeN5q zU%>18;x%2oGW|ihtuub!HhX@=MzF#8fpBUQ?DN;X4(A)<<<GH|!l@BXuJxh%o2h(5 ze~&Q80WiTc?2*m7_tm-O27R+(TfS{pfBI1Z<(KK2bmPmxmdB!abX+q3Ah79E^S4xg zKi``FlByq&e|{*tJ}bN4$Dmj-Kl}c%JSzFC;^nZwc}6(LCE)n+Le+|IMftH`?@h~N zs<)kvKlrg=wd?nd51se>Z4I%5VaKITyv#;;Ju6;y;&o80Kc{A&pWl5BXGA#INI!5^ z3Fr6(`}}!XHqsw#d_20J{?-G3`Xe}*%8bD)f-z4-{SMy!N0piSP&eSXRFgX%ujj<; z1o8T0hJj|E|J{^MH?~_i*cf8Vz8?waMB(K6`#=9TU>G;0FXH{eL0`@E(;p$DR+o>Q zz#WM{e=L17rLU5TSTWxI?=x?8`A=T^Yw2p?94nk$^K$Z2>GN`mFqkV~f@j#P-jGl5 zi^n+|w#~~W-aIQ^u^}*BBM<4jL{CTG<Noc&>HT11X60xkIrise_1{zV-;;lSBD-eE zu3Xn^zJF>KtO;tr6YT?=7S28r{7j|9=~*Q?;JBmjr_y)2^znBc@nZ3a$A3urST{<} z*yWD+7(3t6dqObk`Yrj%D=%1mTy{HN<K-vw1-yPHUT28cr{V*2ZoK^bZgn_q!ofy{ zfwM+9X9_3Z>y8;0UKx}OMBmF;aO>G`WKbVg)w{TI0(T_(o|nGa(q|m0w_<hvy3^@m zL4Npa_Y1-~O*pyoyZQU+`CTpyat=)J47=?g@(F(NIA_DQ{BH8{wL<x9x(2@f>tM>t z=yRVB-?8fpU}N7}Cpq@>d;I^T^85Sp&x^9FQFi6JF7^FWcHTFF_8&&`Y2V|1cRKi) z%829JCVk!R7=44%H&^;{t#AJN4R+Zxk$ttN-jMbBrQX@KO44jZ-%HYWp7iC)H$QJH z&pjdZ-(>j@?&t^S=fXKZ!B76Y?0@yULDjR-I`H-<R(=JXOl7<mC%DrGeZP>trUc&p zy3^`>Ox*poZAduh3MW_IE`2UNZwG}zE`bT2VUPc(e4=y9F}P;Kw!E!;GnH?%l&7Yv zd)i~c>>o#eLwWy`ZBKy>UXzm?lehN0i&Y-Z59FU;%C3uL*WPrD6`R+-f7U(yc+j&t z`fl8NTdv5uj&wUc<G1KO*&U<rSJL;z1bu$|gNq}3>V;$6!FgFYmk4LC7-vq6x1W!* z9nLD@z=?j~tQF4U1U~*eYN$CVsQ77Q|J0ZM^%^*tO1INN8{CoT`+w4RX@Wj~ov3!c zBcA?R^lRa?3MW@ScCSg##|B}LBVdAO*mZBoCpx#>fonEw%f}V!Pe00H<)7&)-~Vxa z2R6#bC#4H)`Yd;nV?Q6O|CPd7DgXRNc73S;|5%>23TMP|0%uq_S0>>2akV@f5RP#I z=eNRX7fuz#V<lIfmB?N=F$A373FoQ=K7QW&`2#1zc||x^C*b(=b-?)q|NCpgI^kR) zoLu?S{)_bd=@AAo1rt2OuG*?=c%56U;hGKG@@KR9(~lA;Urbm1!mEQZzl^TKd)oeS zI@nRK^#8ZI@l*ac;$p48mtEJ%u3X=}?eZ`?MmmDUI!70n=ySg>dP?h}c?-_3zqDm; z_}7A|-z8{QpE_|w=j2~S_o~4KZ=Mbp>N=g|*w6Lyf2VBup>pC6;@Tyyxvo+DSX!<( z2xrjQ0M4tzxhnz3&n?UK<-##e;EV|8ZsFwn`-!%uZWa!luos;5!nr4bk3aYPT!)k4 zY!FU&0*=2{E_Xh`|9;;5Q8;%BCs(dF{3bouJA^?@!358+8^-)GAkG$RxMst)Tpw0{ z`cdkXFTSqo-$wa!w{(F`p8+R14)e$D0ki&-!g)r1-YB~sEWke&_a5PtIxKKr6V5}z z$+egI@v^v=i>Gk{=XK#MOW@=0$=H{<ysGb&tq(@@8%KJ2s$Qws5yRPP8-B;`;j8)C z!$Y5CiY?eP{`b|eon!0MSNm$fD{yV@rzYu=RyM`PcAn0BN#WI=zEg-@HxTiw8mr&p z(yKuz)#|rq>#M=kx2+Fq-5AqvO8BvXc%8N7l8iB(NY=Vz9f!|KmgxLAcYcDT|NF)M z*yZBN@3wczpA-M{YRG*=bz^E&sS@Y*AC;&jYTFSG;2g5^*fITUBOivi&QE5GN!pA{ zd`#U=(eJFyboQFGF?Md!>iNyknfz&mTidN3nNP{|K88PT?5_TqzOS=+w_wz9O>c>8 ztKK=XW2bkIDZ$p1r}cf0_yBiKzX6TQcP=zJ9Smn|y?n;~9Fpf~AT^Cc$=_4N+f@}7 z#;$tr`e0P?;(d(T_eb2RZz$34lKpkJ@U`lqqr&--ZGLTu@j2D;LGnEzBz%y3{t$0h zRans5++yKO)vbK{`k+g57>;e@Qyl3r^VnAdUX#U_^K3rucJ1^*&*vOR<OFxl9O9h! zj^gdA3JYWNEyd*4%v~Zo;yTc~#I+TgTdOp#*xVYUb+6bwz=mSu(|o4BhvCgLTcb}= zeDK9;@tU-2v__K~<?7q_PW@KA8xxPyj;zt96UpaBwg#P~bJpmS9Vc?ezvhC2jja<` z@{4_Bt#T3WOZ3WjjW(QOI7sbwYjo0jn`z8u_^O=d>@`Upw%WN#tM}IE)2O4w;}g|p z{=b-c)HN>qJQ{Ruh0dcHT8HwTN8{DktijeZ<ulf3Bx^L1H4(`g9dB1vSQxujSozMu zAf|V=(~D#+MxqzVS{!dzRanr=zA!_%dW4Q!-xb+oaqB<+)qq#hx?A>+bU&Qs_#h_; z7s<RpvhK#)RTUP~Yv;LSG5NCE<LP6EdbO@lS7^RW)wp8wWwFK<8*{i88=s1^^cy1H z+_81{48;du)M)=*u2+MO$&CT63Eic7{-+xgkJFB<yQUM#x@+soES<CNp6)o2Gx2rT z#;y`q@{7G;reX~DG30WMDplfq<JZQ9Qw#_2<JY-KYpAzYGCbtBSL59C<}H|8>9zUC z)54Cf@2KK8+09j}N6wLtxW5?k+PJQwt$Io*$I|Eht}p(a;rg0S;=W>RzQxAI{Zaew zh(n``rAcrZW9KHV{@9CZkD7i;-P}2iM_t-Fm)fX*{oIRMr#H=66xD1WU#rg~i&;0u z>=yBl<H3E3Yb$i!0BhXecMEv6I{%pe;(A&={q$*)AF%_;XIMzqdnEfzyj@jc$%b$3 zzAVO16SYS87<P=_2G{oA^wapy>-(P0w{Wp_?tJ+PP7`-uA1u|YLC5TarRv-EK3%hA ziN}ttbEXr?o@}{3SLdvA=Q&Qq&i~vFo;J2uTv_K>i&rQo;J#6>eAhX{DTag8Znw@Q z&Ff5KX1*uNkqex?Ch3c<c5c$@)7OHd7gJAROunU<oZjmA#&w{#PWRQ+7n;+nrmhdx z)vpilbz46lVSqO*ynL@EmN?z$XY2y`6Z?>?2}sriBx^#vT~%RWY}JR>2g`JS&%Jl& zM^b#~5MQHqqB27%FN?;}1m;4=2MHe}e30;ox2q~FjLo+c6VEjsPhSsuOEmYXD>R-p z8dq%G&{wRFTO0H_k(ZygzRj19v1gp#>uJ%eLC3_mLVeeKczqDKF>zn-$oghFk;KL3 z?-z8=`qu0?5%>7|W@9_VmGzA^xL$FB`)a-NUEd6+7!Fdq-TIcaR%IG9=>t&?UFhsJ zNniYJ=O(TG_=}rc=W&@+zwoqqjdQnM-o#@>|7@ku`A~K7PQkF_8^=U%S$T2uVVTC| zJ0E5`9q32r#qt}Uu_5`sH<EP&$+{75S5;UTTQg7B{^vyN*w!yZ+^KKaBmeuXbum6) zbbOF|2nz`xB>Q;0T~%R0@44q}i|V$z=9X=B`ph!bxBQazLH~k?`;yC2+&7DR+j)D0 zuSq&)MAr8|T|0fye~CEm>m+~cz&Y;^Ao=_#-ma>!Ft+o9dd^N&#Had@6rWzzlQ+C7 zoId7vrc$lGRuAT4=_R&EKIcH<OC<Mx@pe^(CG_RFP20_j<`%2k=E~6S#=Z3Zo4E0w zhP&?x>!)g;YdcWB<mI^W8!?&6#u)cY#qk(*M4s#<_?%C7(r;H)Sm2Hyc@Libb<4gf zU(&&R+2r)G24^aZ#og+`yi9uWB@$mE@g)*p#@kgD7RKgVidj#pD^fgtJ?L$8ZH4Zy zJsMZ+dNQoB`M$>zpZn$7D~p|b^%`rjEp(nNMQ@RLiqB1Np*huku6_&A+Yjt|qE$IX z{ATIeaHU=iIwqgDYHyyTd~S4O;<>dW*Au1_NuJw&xk%@%e-}AU<T-1a6*$<~VR7Yp zf@_{W%^$dze^mKd6ZMYswf8`1^>K>f07m?MkfdvaOk>*NtJ3D|HAx*D?cAi*+satK zaNB-EQ#d9($m74F=6_|5`S02ao&Uocm+$=V@$}=LcKMC`L2^BTWSvBEJrQqLRah8X zKOz6Mqg;L6(9p+MIlV}(8<6Nla@`Pb_s6agR`(%$gfH8tvhDdxV|uR^K6^g$ASan0 zoL4#Nx2q~F*ju}2YR$5>qr|nx#W?k~I>ufjeEf`LKSE+JlKm*&uBxywc1T!@8}<la zc8!y5Uv7`-4TOKRFp%ua$itnS=A_@Qs<5E9?)ddV)8Wy+JTNn|hx#^MKiC>-Yj?JN zxm0~4#At3^EB*KZi64;o0f`^t?Wzh3dYfBn=bkr5Hv-$P{v%8{ay`cNL)o+x&xyLO zu>Gmd@z^zj+wTAV7|-j(hx>9Q*Mdm$5()o!yQ;zx@jUgSxs92*a^1!I32<F;V2Ue) zhqmk%@EUbo_`X!8(kQ#E9(~t4u1Inh$!}>Q`P<ugyQ;#%*nCSdYhC%?DW1L_^v-l` zg|2lS8dvOEw_0QKz1E4ZS0(!tzvk3vtj(7~*NrxfEq3nrdwL6<r=uEM?A#&N#pZI! z`TCoGx2J<+*H~97m&uy}T~Ad_jIObmM|JAE@#DIFabw~+y(8CHrW47Ww`+(ibk2VB zCC7>RHBskQ;9z5G#Fc9-t^<2CZ{gmiSH9O+hEog&_{6WVlCGCBjTwQj%9owJCaJ?# zJ2z?d(-+QfnX_na^xflW)c)UJUv=!4ea%_r+6rBBX6~=|O`h5#d~Iy`W$24|o<-K_ zfAzIv`g}z`BX^LzuZLv6Lvno;Z&y`V7~6Qs^!Y8vG|xHzqEy|m@NEs7>U3p$&$%PU zrPFai^0!t<xFFfv;_Z>vC}!uL+cbUQ#S2<L;VR)*|1o`@Jb#byHTvRdq21Z8!^+jy z$GcrR*;kPta}rLRPjJ$2S5;WhyG~fPp00K_mbmt~SQ^uNhwzC9lHcb+;sYetAMtio zg$2FlgHL*Ov#L`*nDkQQgKXDk73%AThV$l5>8w%(vf4>}z&SpMx2q~FaG{tF);Jrp zU4wPT^mYj!A0Y7o5+5M(LA+g6VKKdSo=X;Uy)ff|lz)6|^tQXULg(&)#uYnvw`gp! zb8WKrq+;hri^f`P3(fCdPj8|5h|f)Lp*dA@!AP*x?GxbGzI~f=iukqaT6b8l1|9Q$ z-wO3@{M7oO%&p1s+}e?S+jJsX*KA)}s&m$-TOB9z-2a<XIM~=N;>y0wwZ)+358NkD zQhwH`QYFqe{@#e;6vF}h_`aRA2WJ}74PTYJoxLWhgTI}dwEDDt`!s5|w>PTI{C_cX zzxET^=YE@OD|GIUYFxf^zu(i3Z|;-NSR;|_+ep?(B>Q%}T~%RWZ1X4cUpFSHuNxZ1 z<bJ0YNp2$1izJuh?f%#iVf7ugNBBzGkC(^v_6VQ72+3ZAL_cy*C;fI+g#~+OAC&)k zRjIyiXlU;P!pF}@_97(qBH4@L?Wzh3dWVE%_9m@$T`|263V&~5AP;a7dpXD6c)O~? zf?i6#>tyNVbbB8XKK3H97m2+{?2WgpDlDeg&U49P=HDuhr;m-^t*))m`8Va@;^$wh z#^$^C#^=xqjkUZebRKNdSc`4a-W$*5iQ3OhZ=v~!&rNUA-W$)Uj%NLClw0e;vAy?R z<rMMTEMBwp8D)cxdH<<Ned}uUT?aQNo?APz_nJ;5>y_;-_voCxx7%?d&*OWqjcpZI z_Fk?J>XdtMU!hmNd#~XX!$E4d+k2Dt(X{;%02O>{-&sv-uS`3e7It?18|RM%BiI=$ z%jGM+x7sl!)yDgsbenN{D96%=eG0jc<W`4c*Cp{7GdAC1W8>E(TOFUDN+*3xg6p5h z>yMeYpz(ydQ=<0;90}9mPIHQ4*0*JcrhMmvqj%V~6}rB)9+v<5R<6FL7o9K2XY4ab z-m^vWemJtyNxxlHVPS0JC21b?-XVzmUjFIS+F9@P?&QYD#fliO7p0&3ZY1wfBjJUd z;H2NKs<6OI_s6F!ym-;MbG^FemMF}A1AUi@qkV=mM#l_ceaKYmT{~@z9TXS#ZY1~O zNH`+l7H?NoSQuM3HMPEPa<-Sa_PAIR)BBR}C#Vy0KPS=4Ie*U*Z&y`V&@113Zcg*X z=9<tB^Nrs?-z8tvdiSO1GlI$+BHvIyEbivB3LOK!3;$&(OI$lmjQzPd;xi=g;UM9T z#Aoq#RfUDId}nC#dm}zQb5nfU^|_1fS>v3(Z0|votFMC$`TRn9C#V9+d#6bFAn|3q zT~%R$Pm7#+jNXiD^y&umxfkDSA!pajNO7b~#sBUW@Tzwlc6H<8Vj#wGNL=s@lJ}^P za74mA-ma>!z%k!a%v#oRM9P=G9`r7EZH2C7BN~_Qy;6KFt30y!^=7ulT22?b4s>a( z<zJz5dC1dS=v*q*wUg;BH1CO5vH3XKG7^+|`<PwlJ+FKu_G`tfMxTE+=$N^%TKjW} z=0dd_6VJ;Xxz014NbZMikN=s@S;yBnPRtSRC#}H2#?BU3uJgDS-J-b%_bxuat%-Wa z`P#J%tv*gM9Ka~_dM4ADF-Jvn@z>5?lk|n7otw0JcJOFtJaJLuyajWbX;5KIw7;jd zZnwvWo%8swnDu4Q*%XI|+qmhGy@jqX?HXtIbCVrDc$rGA(?J`3ekb3u4kHh9l69E# z2^rc|6&A*B5mtPC$#yL?5YzjL@YyqwTxTHBi-b?ST~%R0Z%b`zjj*+ed6B71R$r@U z>^k9N7n17?BzlqTjq!F>g@v&jg=O~Ix>n-a<DxgF_xHlbUL@BDNc1AHH{PzQu%Nf~ z=#;&-CT6=fsZw7zG>q>bgpa*Qt_6_jMPhHfT~%R0?>WbwzhL2_xzp!dG<RDa2mD3_ zuLh?p+jYr`7?)S2lk09I>lP9&$Vw;uc2$K1F8P*X=49hBDWCaz(A(|W3Z0W{HLln> zS@xM!p4q;g@4T9+v9^B}IyX8zy@lrYYEN&WIf~DV&8amPjRfW1nri#@Z<SNTZ>jd^ zEqXQRnC~*J(H=N@qTct&vQF;EzHK^@yGx(#OTW=M>(j8~M85OBs1<nH*s^1zeVc2G zO`1P&pQ*YrHBs;QT!`=6hEog&G{pDqq&+y(n11-GY;^XTqz?XeZqn-OrXN4Y-O^5@ zjuN*ws?Gd=F>}A+v)Si<muo9@?pGa`|MmWmrypB4$!ENWjpRKiB=2D(xfYDKt12vv zZM;PO^R8y7TPZHK4wdSd&e_(I2G>p>#{SuHLGpeg5-v#Ie~h=QDlClU{fb5Brp|Rg zzUW+Cc11N2{*=1Z_n>;6?ri(`))=?Hh{FVdA=%fEeAgApcTVH&stOC-hNRcl$Zm(5 zZ69w{UpF-L$zO#}e2~NkiBFJx#t?5;Ral%)YW3&i+s^sU<wdP2r_iVI_|$jORyy6; z_WDxwjnE^1ZWf1qRDt}slkD-FbBz&iS5;Wh%in}@pU*x1%vljG^%V2f3dbkge%}-0 z^Ec_mS4d)m#8*gs6>nEnSWK^-=aR+D`T7%5e)F->+u_;@o%5?TF5i3n_?$1%epKun zt<hNfE@7c_s7+%nwuR1vevP&7P8OP{_}ugsno|{*j0A&je*wq#`#&kCh+q3meP>ax z1|5^nf%+~vO?7TeJhygazc-yo^4a#Y*L2Q0_PXOlp7Z^GD{!!}B_~DuJ=Y||nm=%_ zQC+_Kz2OwY0Y35lK56gHG-f$`Ro-y+nxqa}?cAi*d;7inCPdVq_Iye)bART^+2{Te z*H-A<A9G6nbAOemAK$zwpRq<F*-wzHkx2IYc)O~?!q~;qoA0_YRejyiFeY1^UL<=v z61_<F_ISHLcC)bTJ~(O3>5J+8r||a_7?S&MBzpsry(-?Ws<2>hllCZEH<H$?YV~zP zLwo-veEf{W&q(Y=GI!(cstOBww+PGrCN62MTNcy%mhkr#2J%2Bv6J&EC;fI+g$2EQ zF2LW3@VB1sv&hgEI+!1l*3ZeOru$*5^x_93en;X5Bz}mut12w;$+r|UFE@HTeLd){ z{9I&1q4RRK#^t*w$LD32#uhubhBUU=`BAF9%3@n+j@M~yv3ZKmO>dz&wd~T7V5Qpw zz_C5~AId4>SElR9HoY2jOg^`&Z|~XqJ83s2o?APzC!0<r`D}a6sLt7w|HpA6&*OWt zjqMUw-aF^Ip+$KK_aVLV-IEQc7!Fdq-JYDZzk2&9!$Y6j_anTvO7D1D*wOWEyG*~y zc6w@^u(mPZi@qDN+-u`Lf%cyBLOGT`@25hNb-lv%wf80Bv88Li#m2_3QOeJVIFv{y zeN2MupU3O<`(||u&z;jem*4Z97O^lL(OK^Qi&@uJI<9eK^lou&g|2JuXXd}IO;%si zjm~lM8S6iieGtj|kK}qI-ma>!Ft%<wKXRWsub3_DBlJ7hdbKz`J4Mag{XY=n@pi`p z2@fPZko<jJyxjodaqhWIwR2kMgjJk3x71DFR-tq1I>pWIPsYJhCEI%ovs^oU82b)! z;6573`*cY5Y$W&5@pe^(g|QS{N4GeeOQP!S{vV9#eW&n=4U)YXiBFKMW$|`Zg~jyR zc`jK@4hLtYa>&O<?|^G7G>5lnT)umAJclQ1?<h9!S~RxUyukKiV>{5M=Wu#!f$fpI zDz^A>%IDVyJ$g0hnCrd~t)puj*9SA)n0SnLWREnRNUrs5o!mv|%#pV_PUKsBkF>D^ z;>sS$K0aQtg!>k~^4%j1rx*@WyWJj{v?pX5)6fv*^}C$CCh3d6?cAi*r|l#ErSI^M zo0EMG*0{Dp=U~6a<vR!4JpK4)clnI93d#D7WUWH7kHp(m6&A)$Iw$}6I~vpb9;X+H zUL<;v>>KfRRfPq;E2Y=2kCXO<W;nXS*!K#b`!po)ts>bIkX0GlRTUP-c9iQkc&0}8 zaqhY)%r83RyPj-~@hOvD{EuX>K;j1^dquomRbhcozNMJGV#T>BzxjI5yV123nx|D- z2aC<q293>kuZZVbx5gHmFW6peZ2P`6qCG0*N82k(6<hq+I9H!z>eZlQ@~T>WCx1b| z$?3+#W4t4Kh3Q1HSJ+zkZk@AN?B+O;Z}Gjt#%>f>_6qj1Darx3S8@MPqe_)HU%Pj( zHp3}~0~qo9hop5sZG8to1&(%4mDbKLC2x0E5%ur5awM1)-6w?@_FuVt#dprfoS%v@ z-vgzpbx|nC(ueg8$+c*U!!h5)ea6^)i;a!@rN#02kaW_=B)I;0y#AC79xxsGa4K}2 z;kyFmO)1~`I?y}QwH3O~tk$@E*O?AaKRQ1upRpbzi5rsj7|DJZZ&y`V7&~j8Y{~OJ zs)W9-Ft*a^MWPppUL^Zryj@jcVJyG-$KJ$eeytZqxYSeZGo_?`vNOhKg7m&e<B{x3 zNcbS(6K_{lSWK^-=aR+b%Zv+Be)F->+wR&5&6fd<D>h%YptH!B!@t=0jK69mSmLca zwzqsl@xd1>wU10}j`kLEW2*Z0w&?oajfux;NA?!eiDYlFb)`b*B|87G<3!HH_ZAyl zE3WJ<?0<vGMYy-?mG9nSIK^;~+U@q1q%}0tn2qpN+0)r;k~;it=O(Q_ZQcDZ+=sC4 zE}fr!9<6q5h0dcItwZ_FqZ0MSehR+XM?PcSMY8@OS#OZ6yYY5ag@v($VC6Xn+hTh6 zb$XHLMWPqUIu~zORanqFV-J1Ct6b%C9k<_yw$Q;oH%MA{$1hCx!$iji$y`Cg2g!OF zZ&y`V;FE7DX5C%s@$~hecZ+K)G+!obJt{U|S~RxUn8Ux=_zYY<5{&WYj;*_UD?a#Q ziuT_gy&7~(ZuDtQSb3>_Gt!NT$7x5_UDJtV-L-XPFP*dQRyj`O41Y&$1r9cLKwQK3 zf8@^@iX+^&=#}rfYdFPlfKU9|HE9h^TPvMG*kjl9Y3-G1XVYBwFixG<=()eqHM&)Y zvRc04ntsS@<NAums%t_ymOiW%NUrH?UElx9Yx>%YA`YLBPV6<Q!?g2wz3ytJ>ywfN zjdK=xpO!>p7@JQibiLqyd9&ji$A|mG*2tDZ*NZh8m+yMf=yaeTod?Tr>@P@Shh$wv zvcJUJRTUP-ngd-`h_~b``tET@bj{s<M`RCun=jT}uhDbn^y)D?ZD34}Q(voM?57+@ zBx^qsj!5Qryj@jcaU8dOsKa^7N`3CVBI391*%ZIhFY0~XBVP?)wN8Jw&r_Di_#NW- zA-N|&!VgJ~#M@OBme4OP@}l?Q4s|2<>pNZYBlj)!52ZNvh@-u?KjJvBo@FX^>TC62 zP7xR0-$NegB=7HW&SyUHc2$LivBYz--iHalJNe}lpGlXbKFhbyg0g*=b2!H5Q0XP_ zkoXLV&yc*o7jIWpSm49ow{ndEpUSIKeCW`$%kBZMhP%!T?Pnj!RGP)z>cKorddYtz z->*e-orC1LYVmeeg@v*CmSWb6%Ec+3zMe2HuC37ZqEq9FT`vYTw%B<*Ui*Eqb8Lpj z7MuHl#>U^P%r{T*d9gXwc-=@a+gtDLnrO0eiul!Crt2WR8gxuPm#Xiqt7NAe6VI(3 zxh685Nb=D3!%ym*b?zX?i9BarumT4gJ1DMP6LH<PT=NI+<1bf!)<nJId~M&S)yFA@ z0~qmZqNKe))0kHHs!VnEnxqbnc5c$@W7iA+weNFQw&j@ruC37dKd5o}&i_tNKmMta z-&nVitd~gEZ6wzV@pe^(g|RcP$ban^ufA?*7?){IFOq8jBzlot1H{|?u`7j@@46Gj z^d9B(BH5>q=tVM*;_bfPDcYy(^OdCidTUJYbm8-NAIM2gGA}u=a?)>CRao%zYU#~) zy=zrpH#GEft?-F25_^%@i)3Gpx2q~F=;a!LXRUDG@9qggOgiMdhL&8J&gW?9CC`xT z%SiTRB>Qr_T~%R$Prjv?eYxM`>FYu7X4h8eysU07eqJ_dY`*()d~Pk%*kb3$I*lzh z$1Akg6`QB{yx5%Dv}7dcaQgr_wl5#4oFaZB;#H^X$_5>i&o$~hYl&jx#>8`LNA_jY zi6jqg-#J|8?8`?uPULxfU$(JL;>y0vwL^_^5AMsjF0N6fN}O+eUpAa#IDjADmy`C` z*j@@m$kE=bh_#2$YRz`9zUqdNU@f-B%CYhn?^guTdlO+R_YEA>FAe2b`mmQE_m|x4 zaLhk(zcDu7Vq@dJ8FhT>q?0}-!S&DM^?Jv~Znyty?^p1Ccu%msZ;k6(*H-8{H}l&3 z*SRwFMIQzK%#`2QpOEYeNcJZr*B|kARfUDItA&;C8rc!kdy><OBxjK5MRNTSZ&y`V z&|7m|{_AUr`nsW^y(c@pNcLkSdXcOb@pgYK$M!i|()CAMOz$be=W|XZ_9D@XWdDt~ zt12wmn{O#}-z6U>U7zxguLr$NuC35~T&8jPUJu9fah=8%n^P6qQ}W$+<9UJY#m08& zO(Vg0Z(iH}ccNm8A4kNi?uKap<C<=z)~qGB=(9&RCLZG*+5b!@l6<gr?|7Y;===o7 ziF}K{S8rpR#5LUi#JgX44EJSv<-7kGPB9!ral8F5X^qb`X8es&Ue`N&P0|;C+qp@r zkL?TpmHSfWVZY-G55K^5vui7K9yZ;S|2(W#U(<`uS@IkE0+M|J$$EukUx>G>DlCj$ zC#-zu@UocR)16)<>m(ArNcM$zyQ;#1-WI*Dn(zFtP+vDR%!f0aUL^Yh61_;~QM}zB z+o$*6`JF)S)7-UCh)Ey&{4Z(0=#B9?)A2zvPm%CJ!YAIYs<7aPd`mI=MZ?W0zxjI5 z+vVB{&C?-`%Xhzs=V__d(PDG0PGgJB7i=#!wo7gv397vLZu`Y)iY<OD(`N#0dNt^n zyjrWZxBqtCi?}iI81Kk_VLFlIgRO_B>YV-JbB+`F7XOW48`~wW>=*258<od!AJQw| z{lajH;UKl!?H5UFe{78hBJ{i6FU8vVbT{k0Lc=ZkTe#@{C&aP;J}-Z9ztrco@wpG} z8^0dPvGie$L+&qG>H7X(-Y-?%8gXcpPV&g44%5!#^>x#at*u`eeR1`KIrH6Lbwy(s zn@=fpz2Uu#LB}_a5BG7mMYa^W-n466zUxh`(}8|;Hpy@7i%9lGB<nJgeKFpys<1G& zRG&fGdpnyx7d@Y5C)XYq12MhxgwN-V$Z98f|AO->C;fI+g$2EQKD+qg=<~hqzQ||P z_lS?ZU(|9+Q<$6CKBKKu-v}}C!v)fdACT;qNc@20ea(2gs=|WaE&8mLJ(JHHC*70c zLkIgC>QxsV73wRYGD8`T@%e(|gM<$fK1i+`;_U_rpL|O(`Mb0;<u_jsdRM!)Li4vo zdqJ`JTcfeX=3tw~7Mm~FUTkcumyQHey>-C$%kvdm{8)R3zH_QqgO16o&00sB?$&#Z zZcIGJJF;JzP9*tY>*QRWGk4B&oX9uUb}MkOv8%<E{gOSsTsZ*uk~@_rHBs+4U)v98 z^>K>f07m>hw4^;D)0k%Xs?2xxnxqbnc5c$@Q#*)u6YVL~Q{py9wVD4fbRIHS%Db}9 z!<nwF(0RC8<LnyH*7Iz3ba?vdbD{jk`$5PLILUg&IrhcdRTUP)kI$uS`$)-MDZ3fF z$l)X3@6OT7IqPJ+T~%Q*y>^~U789R-kEf4~-p#J9(D+nq4JbA~a46Qtowtqzftw%T z*m~6>A7js`c+J+n*Pvs*mo!CvJ08?`BHfs{uXkj<GMz}`V)Jo<&e>ZRI!?r$JhTD_ z8@pIsS+7`AYZME(_pxu+M7`sD<Li~-6vF`x@%1Wc?a4HzqC1)gmpFS((ii@AZqn-Y z*-8Dp`E!q1xM=>I)@juK->y~cud5u_NL%WEcy4uVh0cZ6d-K0$n4-R>6`hyMXS@f2 ztaOq!gLAHV<L#;n3uDXfOZ_g6UDIV-t5(GHwmH4X3Bp367s*-`Z&y`V(A(TX*iz@g zxDCO|u^Yl`&YE{_2<@X^zxWN#KQ(-9a{9Af1J6|72r<fmE5xHx70A7vgcs-hPBD^e zbZggPSR#H=O8IrO-_rXLqtSJ7{r^U~!oK(Gn(e$j!dHjmz}(GLMq?bmBo2JekAx!< zj!3TG<L#;n3wrgt8QYu~appAr_a_I3wI*zcI1g=3ao#G<_WiON9Rs>ch`jxO%UwGy z=($qdKJFy<2%O_b<X#!tRTUP-a-YNf1>-h8n&LwTyLO%A^s%mHDpPu*akPQiF1_SG za)OiOA?Mud#M@OB7RKgV3f(iYWs}F#*Mr`w2O=8^T_+keF5i2L_&U+8vH9+q@wvWM zV~d@KW!gK7ogXtbw%9zy=f&pKK<7v>*<0uB8sReK6!9z9_mtc9YS1zHyixmYrSiGX zjfv;hj$9*{P9$rC?SYGR&RTe><3yhCsdFoEu(93Z$~6MlF|Eo=xUbbK-)jWJDTV`l z;@1dC`+cS{HOrzobG5VABz>{f&P`f<+BJgv#3&vg`erM|%>9jyYaA23m0vAx?ssWi zzH@)J(}8|;UMHWiMj|VnWR2vUYlL{as=~t9(y!&eZVbirUhniGCkP9PUL?63Z&y`V z(7Qx>^Idc5)YlCS?Oh`LN-!kZSCQyLviBp|v#ec*VL|U0?NN4LlC+<%is`+<;Uf1D z6cWA2GAGe%?K%t#dY4MCz4w!}Cr?#hH#D^OM&a{!4#-2CL=WdxPWtVt3JZF-=)Fw- z27}MX+<V_4CLQu!Ki9<g+$6o^8*+k^#GP~Y<aoQP!V>!5P7-7>^Rj(;%5OeAdiz~l zp?mVE#uYm+Cp}X9+-la?V&}(ljV(6EM>MwBJjLh5=2Y#S`uz=WU9~;=TICe+>(%~S zrq6B~bWA>vSKpy0^qY@vOgy)CWKTAoNanZgIoIf%Jvnfk$n*G~Y-1;hD|<564dawU zaBt?bry5nN#QDbW+YP4}4&cZ4<fQ#IZ65_d1&;Q)Tv|KdV%+Y|JnCQ3H4^k-XRLf# zzTz{v8NI1C?ic8`ZdEA9(udD=kgTu$4##{G_ZegJEjBjpmww0RcIl*#NpSu1c)dJO zd-0+<t@9QxNV}OdJ^An|W{qq7M#_J_4)k`rwnEpqvTx?U#;x`Aqw_BLjlBR_=_Gpr z=UjWl+f@}7#`Z{WzV|FM)z=LT<8rsti=3baBzpfpbLRu6*EQ|^q#dLTO(QC0Fsac- zP20h!T!M*CE7fTQQ%xC6+DT2_X)}^Zn=;7dTypOXH`fiKqT)3Of~a6hFlrDL8WjXV z$h4Uf1fzoB{e90_E6<*t=kFQ3@BVzAS!e%QzqR(-Yp=D>dHxKPJsbCjy!u}bwscu5 zx-@^R5O3F+tWwV+_C>n9Q!*Qc0e!4dbfC_81WLa4eqE*oxvTp6CMiSP4(ZbMmDAGK z99=WGjz2|8ul3Uf?<UFOECS`(0~EVJdFCDWt0^t;cK_(Er1RU^{rm3ynOxde>pjdk zpOku@a3s>_U6RY(q3mfWwt=E&+^?pzAeY|`4Ht^G!rD!K7BX<Va=}QZ``9-My3hD{ zA)hVMJOC#*6f4`UpFU*WEFGU{^chBZ20}aESBd-8looh9b>GO@i)SGnI|}+Rz;k4) z$-5toMM}GL_hvBPExGJ9DCb@%YYXMv75A$tE$~)b^2DSgfu5lp<hI<B&7szq)F-}b z&s}j$+9KY(ab--re(tI@4m9dKl6T*Bi8t>a+bCW?v(@V3tXE!t?0V-|vOCD<erDS! ze`M{ux9fjz>ea1l_Clhu$!GPyvWzG8%c-2%TqczN=jHkOZK@N;-)=gwM~FjS(7}1f zq$_7O&XsHA)9Bv#N%?PEHagbV&n5JRIC*pcqt>%YF`l*PtMXo(uT$F4(d$mVo%77n zfq(9MEiIoa#5eTtf}XwBS8LqZFTQHy#!w(1nIDkNh_BE_qr_M0oMqyEHKirh_tVwK zoCb{zdAFEc=v;L`kqaeP#{D6$@}ZV3YeA3w!uI&J#N?DZ#|%Y!d{FWlg#jhMK#>pS z90Mhnd%rHzg51Gj#h@zRCuz`FV@-YXL&D{(0!1zqxlrCGiTl-*7UXh9a05`!>@oRl zFd=#VoVnLz-zS4O?(cA<+lQsYIT{5emqW1ul(RtGucox13&msW62mQZ_Gr0vvQ4%M zA76ydHHuGAC)daQYD$aC^?Es)C)bY!dWP7@ZTL(!hg$dS67l8Tvm3-)ZLW{^-EQ&b z-7EFVV|o33k$Cg^BR0?LQ(ZTYC7UfjfaCf4{qiZ+Z>G+vtM%&EHJ@AT)Yv&+(&wLz zC-$wW<ZG7+Wv_ca8d9Bj^*+-HKaZcWIPV7OO1|by(I>w|_uYC`o39-wj}8)hT)wW9 zdyDbR|6I0bK5FxI%2@2}b*J7wDPRAS-uKvVx}rl^&~wh`^X>ih;;VM=cbW`jBl8y7 zj2H=RG)j!5PQH%&)sz-^XMCahxUnme`w5c^ohvLTa-sNg+^?pzAa{-ARvUBLHP%?u z`ED0}qZ**(NhtE5<Yy?k$@_Jg7UUigR(yX^XZ<nR5y}0e;X*k(Ly-&R9zO1OJmjv` zJ-OeTRLZ@r8XNL{O8C650p)!UDD#6h84df@losT66Tenv?|azu#ngrjs5X9%M*4hO za`89lT%)Wzb#ijtucox1PqigaPG0@Rg55$n$lYdrwdUkQ;>)`)=iQcnZ}o^b@BY{< z-n>4(PrP~k6r1Pusj<yt$>JccdQSehe2VoOQvR*i^YLz7<Ii;(+o0!Ly~Y#!)>Lw` z%Y?GOJ?DH(b#n4H(+NM1bF%Z!ldj}s&JEM#L+IYa^Zhn8s>J%n_t1`$M+flZd+18} zby6M$Km{Fx_dN>t#k}uPs4Ywf+xQ*t8A~=Y&!~J>w&Hz{wl5d@cuvW%o!?98bjI+$ z2bB1_&2Zc{vCZJEwm5HWmu;rc7bKH0PQeZ9al0&V>8fk5T()A;r!tRU*K+#hiE&+D zDcCQ>M%NA2S8I%`|7!IyZg(IbnO~CK$OX_wqvQhWoIT=xHKhgKL~^UWXIZ4N#+t6n zsL6%SRR<KgQ1)!xAM&<;t#HrczbRPi*}zC7_shcPI~CAIqsXOxveB?#O=)4i)t1;V zTBL8tJDnsOlzGoTkPPg+D=8+USR1UqrvjMt(#Ic-<{ghKRgZP|admc4M_>+0C?{x6 zFI|^m%?%q<Xgex<(8jCMXIIt)wuAR8wr<cft&YD?=j;gOY~}sBObfhv#**#%pslYz zYw{;8jN3R{pY456_Br3qhZa8PyH4-T`2Fr~)2r0;m-!lNV$wN(ReH6k0s0i9bB%Ha zj{DV=7WCo0EY5*Ew;BCzhD$re^YsqXCt99tkpAwB^w}vr*!NJL|3FzIDDD~et0^rm z*X!kIDPMA)>G$)ij53$OuNUkV_9Az?_0<|54~wtbGhiGan|I}palPX8XDhYFsUh*^ z-6Q+Oo7YdVd0wCD85&D=2Im7m1KuW|V*R%0yf^ck*%=Uj9@N;Q-_hr~j3@T3shj~_ zCKNyP{6C^Px#Eka6Mo*Lx)*eC-e&2_8IW^ooqP!0d-baJ4Cpv{bU>e4&pO3;cB8M# z?KWShv@ut&JN5SHd}L2%{_*Fd!8^+Af9tDt|2OZhe*Yg1<YS+2%5KC-Xroc$Bz4Y5 zale|<0`HLIR(n3`)mURq*X0hA3!SSDC~~3XySP8(?YXmX|5z#R?2qK`Hn~vbLXit) zAI1HlT)(bF<Gip~`i4C5`DnxC2a*ln`um=b8ieOES*vPGth@8o*+qOl3g!4%r!IG| zbiu|H+V;sFwDGERKH41E4&HBRof?gDKBA7lKsg^lIUhmk_X2O9&Kdsfpwjtfj>d+( zcM9+EYJfh~=v<@R3&#CwN(*v_^jRA|_rhm;?Ormq0|TnfMOz|$zAZi2w@}VEP;3n4 zd=vMpDJ|$zZ7Jmo&R^_&)3v8yHy;N@?gs0tHNNc@U$y6(IKI^@|K^QRi^S{CscMZg ziFot+_=tG(`YE=~>r;o`KbDMJJ_X0mH{Xy?v3_fHHb1Oax32N$O&U96zs?SpQ)1tm z%K64+Lh(b--(Odq^UW^P2|sUA-3vN6Z@r$|aK1^;VA?<EzKCZzZQ1Bp-|(I@#L1%r z65{hsrL#(OCP|e<kKh?s_)LeVTw#4-%Ah~+jDBD&8O)wrd2>p?CwuXnYu?_%KIQ(4 z&K*Bb>2${Mi~xF;=mx`a`+%RfIB#s5ji%2JC6h5ukrUSAcG=+kRV!93yY8wRCq3zM zIo0TyC(gBhzhJ*m266|juhuv>A--zk+;AWtnLm-;$bV3t`9jGDP|k62znanlZ{H89 zkC81JYpm(I>^Hek@(>icQ1WuzAM!TutN#9ROC<NF!soZPpv)JFTqw`E;(j%yWh#C# zNBTMrG(N|5z2rdB^~1mKIc_YPcPPKybt#{&Gp6_)7s`oo-DaCLH*8FyZCv)CjaQ{} zTyJ1Icz<T=2IaHZQ2YhT`3*YPDE(gG)pIW2^Jz0}ef{3#Pr5Q4`L1~9yR&CYb$`g# zkMXO2RCtCkY`T?t*43o3sUZD<_keV3HQHtr->023XWXx*w7|>vz&Q`{tZUmn1$`Lc zd3(t8DfO&td!)~p<g)jn$cM5{P|kvJznap5KGl{|{^b0{&Vs!^F4)b-L6N)J`f81l z`^1+wM$Y+3{y5hu-fEw9#j$F=c=PU)UE=j;UA6itw$AHQ{T~`jwgqPdKMVd?KE?WN z(7ErZUfsIJpL;ZRd|dyB+IV8$n#x(wWkUIGgr5QSsm@vON2U{g&gcETpo8<y`Du0* z<h*)V`v=`S)mH6U&~ftUfIhXJcZ%`sKwp)+ZN5%vW3FCz>g~s!k^V`aL+brmnf-5l zweJ5p2ddxy`vUpc=jXB;aT3az0ZN>Naz={#)sz-^*Gq1-_mQ0%Ypm(I{KDiy$rDiI zLdkh?f5^M|uIleWcSUj!nOrDxp~!_2&*T13u3uN8ab8#;eM6r3jI{g81Ie1Pzwa4o zhVWb_YgKKDb$7lxyNJ(7p&TFU)a8y!7i>(SZKv!(8?Q=dq;-Mq;Qgi62|tB$27=-* zP|iruxk0}!(*o}joiqFyLZ!S>r?JMG>ijF=K1mJGg+}oo>crQ$UrlL2E@v&ipT@H; zyPr%k8BlF5+7RjUYsqEbLOI_+u`!hMP28`hw4hJ5rIar?f3fq;qJssy`8X(Y*H~Yz z@ok6rsy*Mt@$HCs^Tw!F<?d>qb;WU}U%YvJe5-i#`YE=~>r+RzjwO36pMvA(n|tI_ ztlxmn=KJ*O);0dTR%7cA%f7}F`_@#>H!c&(`Ns42LDf0mjGIpQd3?Tc-XqeLXI-4Z zc5DBjdn?a#+SI5L>+8>Qyw7p+=m181zNvIpIqpmXhzfcJ&%6AlE_=4a6R*iF3sWZJ z+x?NTq&Itp<;^Mmo$SUluZCX~_AB>cbk-k9>2${MJOO%+Xks{Sr`Ue*R$H7mw$VD% z=MR#}7^mQd^|<|l>sDP`?8mm@(S7jJKK@$|gBGt?eidLUu0vKU|F_my$p2>OJXEl4 zh>qNK)>msRtox<DEBuiI>1)JnRcanP1Nn^kv#lqz+3MsB>O9+w`_+^dcn2jnj=?8b ze@xmm*4yAcYI31-t&UvkoH65mHKhgK31P**)6f1dR)!<Fe=)gGay1mWP|gf-zhfeo z692}(pMkR8!rzu(O`h*xO)iwP3KY3e{3z~sB$w;;ax{-Wjs<##*vM`8bvB1u{c(x- z^7`Wj@#giZ-Qvyb7tB5H+Kzr~EEx)7rsv2%X>GCNM&-k4zsYhW=e{KxyWn2so)UX? zDml_+LiygX$HXJ5<Ewu(o$xpO-wS#=Z-aCtN0P_;@DJ6O=v8fwbeudopiiywzZlO5 z`cgiht-&#>rgTr0XpeJ-f8ZtMNdYVW$+Hjperx(h@W>sqzFPNT!|&vC-#C!ID&>X! zfqZ1v$v)(HD0u-&yn>P!;(j%y1>OykTkRfRqOr!BuFHK)E_ALspvZ-i7vlbqw@J^i ztKI**Bf0lAxlr~66uD6HLfjw9-F&mol6n@+y_}tsj-4Z_jVayIJ;c19=>sKSK+y+^ zf5rVFuU}W9dHi(t?+bc{_^f+}_0{U9YsHt>Pe;X@*Vm>g2Iut`=AL(LcYJ&-+3WF1 zIG!&~)Y@XlozkmC@4<BI8oyenvFrYFS2AHdj0wwB@`cNUk}o_?PFJ0Laf0cDzs32& zc{`*l`GTCbNq&s(Yk3c;O^qtCzJ9OZeU6hy2QcD%Q7QJvF&+#Gdip(8Jf<;jSeUY; zJR5EqOLj2ds60S6<9@0yyLU=^d7q7o(fg#IC!fw3KA!|7&h9lFw^3|6c&jbW8{21} z=`&L@8RHb(upYO^Cb(er!c-M_j=P__VD+)S^rDJCdE(K~ACI>?qR?rd_0<}WI{&2i zp|%}JUo#B@ykcdJ#(FzrX3M7h_5-xVC~=!Q`84iVQ(E916IQjcY<(p6Ato2fK7}F| zO5Tk7)sz<GZf(3fnf<Wrdk(#iE_}~n;Lp{^$3~4c$kg_ynm$mz*8oKyDETz*4|zxQ z+v?<0-uoS{E9k?RYGdxUNS}wAKF}uNK+y+^-^KlEN=vDA_x_OP@!y`K1-pe<$lYXp zwfgT~@#Xek<(a%bxLCZ^=F`|;n0wx}UAuiOnFwO6=hFvkZL#B=zuuLs(W_h6_|+DT zJ$&NbNpp$4J(YawGNJs|i^tGYRIgKgmg$7Qu`j%!r}J)-uH;j4{vr7>y6@Gi+I;Fb zd2~RZTJuFQp0>YbetnwF*C}I}tJj@+`|&v@y90x#+LC7<HcrdpOtmtmO_Q&SXX0=0 z9n{P2GX;RIOAN2py}Mg{>vtbWUzKvthCpXzK0>x8_dv-#P+}aE+!Ob!DJ}3WQp~M( z-`8ubv8Ho<q{)Snd!WdLl6&I*kaw@Js*M>*B==D!7s_6OA{R=IiTgvjN8hF2w$t9? zp3Tl;>0B67Z5*0?!el!%nm*7b;Xu&`iciM<YD&vL+P8NGdb&(#Dpzrk>stMEf%x+J z>1y%j^|kHd&Fe4BGw<52`ILUo*<u<vo?{xcw%Bn{=aezMx^<oY?-h+*egC_Y0pp3+ zcq%!@WkSg@9z!3ddY$SIH=XdeILA2eG~IuYW5|Px<saz2fP0cQHLAq=`u&LaIZhrO zz=(59rF?OGUH~Q2v(!D?1*?y{Yx7%{bbd=dJ(l!m_hA{B{cV!nxNmE^Z()CPCZ&7i zl$1_q4DYo=iM8tt$L$o`58i5v^TsyXVEQ~(G8y9(+^`<EW4pr7Td!Q`dcc$YZ=(yZ z9bnKu@qMta`xR{K`ascXgZ0%Klj`+<nT9`fAbssLTY*=s><;8J=4{!N90}z<97^nl z^1L(dS5sQx-6Xly#<N8lYpm&9&oQ~sx$1x-7fSAo`$Jy7n@%3%K556y4A<uyf4<>F zXN>6HNS|{}A1Kcqq38o8r^fvb=W@MXj^;U^tvjh;w-6h-qt;iezf4nn&g(A=#G7}` z(Le9{)ZIFkYz^X)=b>h;54Nb&|0C<ut6SIjMz_XJoUHg>Vn0kJ54lVzYwB_5EY-<F zk29U{nfTeE^RAVy<RNn9Y^@`@kLp!z9&(&KI!Nqsd8ks1EymMapZVtFZN5$!%bIxI zskcXQ+23kPc^Feo$+MUCn!YhUy3TxHHkVrW(pvFtx&1);suX)WOa}6i`6Stm*b620 zLWwz0VsG59rnJC2M=`M4eK;D)J<sGq=L!poTqv<O?pIS<kURFZyAu8nAomY;COEck z)$Z+1>7F5Gc6hSs110uC(FaQGjr&7hzpg~{_{$8%k7Bskq0Rbg^_M~M<@J|gc=dmH zd5!mfC)MqQVhXA)UUP=!U7zir8B5xOz2mXBRqKN-)+h&$>(#AmeB+4X*t%0yHy*}> zWh$}PWkOj~k1bD7o!I+C(+Qu6W3Thp=`2g^B|of}FQR)J=i4?ls>J&G+1C3UCyx$b z#OK>eaWsmTK%_c`=l|fGn;!my`ofgKc-DP(EE&ko^4^@%r^;TO{TpWmK5zSU&m+>d z>5L&RLC+FhXE<)3*lsCsm4BQ!w#|Ce=NXd87^lF7^|&3I6@KC^KKrLV|Mau}k_QL2 z4eY`^)>~h#@uX3|)wFx)K>8XrTe&R*5$WZwKt5y6mrcn(Q1TCyxC>>S<9;=z1>X71 zcPI1C$lf~{J|~+O?c1bJwK1xT-<h%kZ@cLOoojXUp-x_k`_+^dczGX(+{8V>?uLRs z45&8l9g6h1!1RHVm!RkaB`?MOYDx?GR9o`orOgj1*e#TU+`ZOUs~^o)yw2-Ki^ZFF z&Cx&a`po~_Sh6LESDu%isrA7YbM)I~YxL^YHNMfMu`}cw`%CPTspKV>31v+^9<`}X zURr26;WKewa^6kSHGTg>_ME46MEAXVRhyR_Cyx$N@wmKHDfSlQX`7Sz=Cf?RP8rLZ zc-^VDNAdcfc297~^hJ-bplj1<*<5PfOPj<uGI}6=Rf@^oCIi{XyjXT4CPRtIP+|_0 zm>l=3DJ}3eD+X4(5BElLJ4`NguCSoUg%W$?el?{9xx4h9Jii&pJ%ODS(z!68+P&Q? z-5E~-^AghsO6-NA50uy&_p2!_@K#&$#NLL77xWC}Ah*-{YW0`(;>+tVyTqG!&Cx&a z`iy^G?+XNb$7AoawLaKlgW~K_y}EUcZ`5n-=F|1QfbqoZG?m!vGNG)g$CgE^6MHW* zo$#4B_B!tzopFi1<cA^oBD!~S?rl?}O02J+dA-kZ^5_6YeD19jN27QNM5<$WPY|4c z(|dxTzA$Alo{=w%C2O-YzBi}zxw04c1g(!O_&nz<IuAcKrPCQhT!Nk@y4i5tKC#{4 zt+qICY?~p|=LM3<7^mQd^|(E<*`)VGvi~;|ydUsS`W#o^qYAbS?ZP~UtgqI1(%LA@ zEeF!qUbB_kGL*sf{y;usUMQRLUOKeJC~=oMc`5E!Q(EBddx`c<OLkANtvj0+?W5AC z+8EW3?pEM^k?8|v??TZBN?wZl)sz-^xj!K{aZfNdub>YDs*QWo=1$h9%k+UZ2?vTk zQ1VjTucox1PqigaUfLe$8OlNKA?vHvkLD>}=k=o=@#bA~^v}CKeP7gPQiFKqdFcwR z54LE2^xeq@y}EUcZ}e+ygM4G6#6FoyUUHdGzPIV|=yKJ`OG`{Ad?tRs+IhE0SMn0M zbAi?o-4E$iZC-MmJUU41ae1jy>@CLA*_7>}m)LxrGL|**x>IjIE?(PR!9RL0O?ymX z&!dYM<j%LgTKCd6@g4r^f%H`=CJzMik$I);MofkhlcB^MC^0$iS5sQxZBq=ab{`&! z<X&ZRp~PM&a-qcDxL-|aLGBEl`S^S-_XKuUNY|PH)$Z*<>CSixm_4Qsl-LVJA1JXm z?pIS<;H|dgiM=gn7W53|Ah*~0YW0^P@#XcG{o>8L=IEbyeHy+rmh{<P2ghUYQmqfR z*rGT)Q|HERUE>>#8hiNcyOXuX6R*=$Vz0}D5_>(iyi|2!Z@1}$&&09Ud7Gsxv6uWX zEMG+TUe3L3YE+5!^)s*cIZhrOz=+SimE!1e@e&Xf^ek~-U>_9<?hKBdiZi|mt?4G_ z9F<<#jeCQ|XBGN5Z!v84b5c5;F~le6Iikac<93Se2XD2-d1D)mm_FA^CS#m}8`k6Y zi&nm1Y2P(H9ZRo!*{Y>4TlTCK%UAWgF7OrWa2<SHIhrS~tbJU;wjnlhN35^bxUyK! z?I#u-NMA?HR;A`~G?34jSIDO9B`Em_O8kZLn~HJ2n$iOAy2tC;t8xNo@kOoKyj*S^ zZ%)YAj{Cb#x_cwMD@-3K|91z9K2Y*O+^?pzxLmK7qj}b?O);$)CURF>U#;u5U3_`h z4PEluc*&RboxNa>dra?_jhWA&-uoHTt6SHs?>dcL^F+l;^PSk%Q;F#=6UzUq^F4f> z>UF9wH=S7b(^U6@4$eF6+$^S(cXrC3(0zg0s*UN6lSc>isWn~|;~7F<mFsQ3PHAJV zUU%y4`gN2`JD&f7Wh+)*v-~<5RpRx@T8sb9vllw_JfIjFaue&TbuY|TEE&J%K>FG+ zYe9-%Y91qje8#*|HY0XH$@@^wvQT13+^?pzz}uiR%bN4E7`Cx1n-}dv(x=+<)?$s# z5Hs7q%JhM9#)hH~6nn@0A@BV8cPG3LOHA#1YC#{yY`^Y6!fWV~Yg2hAI%7olNBRt! zK2Uzo9*RCta(UeEaHZ_;{UOccM;o3{uv>_Q++EgJs~^o!oXYD*?c&Y5=IEbyeP(=B z&o^xUgX8h|My(IFs8?<s(5qY5_(s3R4n5`WWRLO0>ok>k>@uPFh{u~7RIgKgwdsV< zJVA9Y=-|BTr7LG_az=yJ5#4v`Rc$<WoIE<9PaKac#nxgxtxw8)^EEbKr;KH;UU%y4 z7p+t{ZeMowHP<cc(XSF;bKT46`NzlP{ibgwt?(CJ=bV?#rPjT)UVPQ=rB0K9WMsZh zcH_I?(9?}_j-&pNBK>Mg3%rd_);;8}PflN>E1#Lhx)ZEFCc7fJuQ$2Sxf%>bE|l|Q z-0yhEo!PF~tN2UoZGTo~GulU_PqllyOJhUK#Por3zXU}eDCe2DKjgjYs@`KiY>gh| zsYB1UT-907Z?Sat-|^dj-zBMh_G+<mG}7<irN>zs2qiZ_(F@A&O~(CdN(=hT5El0U z*lSK(K_3R}KIxQ%*G7|f9~z64b<*9N!F+?{;y2Jnqu7gjz0t5=O=*F*+L9+%wf##$ z&rl9>S6g4L`)j-S^6sz0;?289nw2~9`g5;%^ZFWg%j*~YUmHt0f*9vH^55hatU-&; zN*nd+)-^skO=A~7L(g`MC-#r2<VcqZ<=)wIz-v`!->os7@Y%VldqD^1-7a0pk>v56 z+5_l*Sg&exq~qk#0e#{eSt;KY<5{vG+Y|p`^L5Ht=IV8)-tNz3mS45BZyAj$@%m(~ z#sB8nztf&pdjHP1zFPP1Hu1&h#ZvPa2;?*7O|lukQ3E~IC~=ND=dQS4O=)rbYWM!3 zNbZ|WF7%;7gd!J8evJE5q59);y<U#yS)a{MFTFl{t*_SgnXUbwcYT;&UK{VdeJts> zy#bELs&%q4cHAeu+LbT6b<KIBNn-~u)H8GAiETZVSmiRI_?7R)|5Tk=^<SnF>(0Hh z7j$smZs|&_BA(9ETA=$T@_k!2I@Z^p1=Abi<k10)I964PJH>eF7H0mn-sbC+vFPY^ zr{1pTE6-ZCoF7+RNK-ntLxF3c@VF&yOFOIhQ|sQ~w~lw1?lC-iPgq~Adt>mKx-T2h z|7g~$#W27tR$4UH+ZnS#HY8?2`Q9*;7y>1R#QkbY3%oLB=Z*bY)Tcf}XWBKZ4y3O> zlT+%fKOE`tR?`E@a||eYK(TY&ucovhx36EC=q-|^LEA>@;{SJJ!eo_t#?r2_#+t7G z+a&X`YJhT%hH`#}@(d{MS5sQhh0oV)(K(rO^!g<kF75MlKjOc2edI;iZ;-HOi<Lc* zK5v&?)(DDipx6e=IXdoFQ(BPAJqBlc^l7}bpbrB^ZappG)$yjTbpEBz^*z#^@f0vO znm$m@?@;uC@;*b{ucoxXTW!g+x8__>&@+^S+{M;c>)u)?zPx*Dr+D-3hdSkuy#CuJ z-n_ns-SYay`frRS4MBYKT=~E93)WzU?!)`_>gHNLxm$T>$tB7`C1Tc8a;3|JlJ7hh z{EzCyfw!1W_$qtK3wk>5I_U~8`FykX0J`tgtJ+-YIC*qHpEy@m%6r9lS{7w{;vF_$ zr;KH;UU%y4g<P3^sE4uDmOOiRkLel9KyLj-*&J%!yNUR!-MfoS2J(^lF4>Ei3nec? ziE&W!V%)E$w7`2*Sk><Pkx1^%CKrldLXiu_u5rJb(t_Lp#d`l=43%=;e2q2MbiVHv z{#j~(@+=ri&Vx1?4g1xU7Ub4lTz$OR7RlW#eC!NmzEI{1CAY=>YDx=o$+JA?<1<Y5 znTB*O45&7SwMlozQ^0(W=>sLVLD2_FZj1ZXlooiaEqV6GM4)FV2f581`SwSz`10<L zA@Sz*@%`e>>!%IM7uDvr*w?UIUccCV$5^r`h*6%~HpwqogE8sVq4QO@uJOsE$`iYv ze|OSlJh6XFCAYauDEY}__f4vk+umt9;j3|ObKYL*3NQJ0P`-ukL!1xW)Tk2c8{Y>y zP97b=k8@k4JXOd?aA*4YXQm2${DYB6w|MD1w(QntB$!)N-Y5I;8L5Hi6#6(XGpyq~ zDV@$3-s6BaiXJi?w?}Lz4XL^~Z)}S((`SohGR7&uVLfi=^JUM!apl0WYq3Flst4m$ zJHKz~%9Uw@Vfb|=T5GK0e~D~fT(D<|k1l(yuhv}N^IZKF!1en5LA_=h26)BFY>oAH z#%z@x`3?+pu2Et-b)MVB{c1`Jyo;CWe-o!Z)pM+ELiipx7n`gTGM3~1ZjN;Mi0J}t z(r75UKsi^${SJsO>3uGXT;%t#+P{4u;kD1?mAcn$dER8(eAM)To*@}f^nv2{ale|< zf<D!jJU%oQ=o!jEZiC_~ZMFK)67l8rp$+2AyXNSccYQY9IhGs^;*;l{4{Lp}MVH<? z9M!8^*PMs8Y3$C+^=z-i9+^tsahXugLLPrUsCu31A2OZrnKM=Qf}YO1U%HZa$c=qk zV{~u0OzYW}jgI}w<1D=)P97b=s5RCW<4Mq0Wt+{{DQ)QJb*J90<aF7}Wh)B7*~Zgf zO{sMs;jhgvDD3x8272~bU#<HHoND*c=0H9&x65Xn_o3WZL5Vj|VsYHBrnJCYZOLP& zPVJdu_{d#neg8~5?fAAn*KK}=UcT=?Av>W{r=BhD(5qY5e3oFb#_oQR-U~LK*j`iF z_bwC4J(>IU$5rQ<;Vq^UYsY8zyr6^g?v<|Wdt%c*`2@PpzM}el?>KpMK%aQuSK7nH zcm~l|<x@6ar?fFwuRHbj=a<;`1cDw0sl@A*wHE(dtABGQYkgs9|L(KCJpS!DajV&; z)I7EX@)`3P*^oE@<!lBe4nR2v#r<kZODTNs4{07db!iWU7=Df14c7P1v{T)8#*z(Y zTXgX_aI5TuPF-Efp?Y=en)e<SY3%q*wZBTN$5i5g%Y+gK+|NI)dY$USrW0$&vlB1q z>Ad@;YnuOM%Q5)`x;MPI`Z(Y?d2~RZI1W_W)5Ula^i|nm^L0uabM?AYZ$E$eb=NOj zF`!QrE?w0(z&nq}J~HtS-T%CA-ujZ#ew|oft$saonbxi`dv9ststlj`Q>uNhek9Nf z-Vxc9a{!e103|L!dCxoUS5sPCuGh=aTH^w98PJ|8hKby*)>o_jz{_i=rtj)}V15XW z$AvG*PUtkytvst&x2{>E#TwhJHQHf3vAw1e7hEQk?|r!6e@=Dc!sksV){f7qctHo} zJtAF+3&gIY@(FZrT`HTmWus$#<NE@~$)f`j;<!+0j~C<FguW`b*?gVShW=i6>g~EO z=<HpwY-vvr65{zXwp7XE&+S*1_Gg!q$Df_I9L=Ne#6LjaquN8;ZOzcv_t2MZ{f4z) z8hf%m#BXQxYHa7r^!az=iPvZ<d&p%%xwm#7`I74Fp;6O`exA#CK?mnuAYIu*?DIj{ z3*A@iRqY;foIE<9PrQdJ?T2DK`_WhBt2SS!v@ut&JN0&*v5W4Zy~<In-FX_=(3@e$ z>jp-tQme0~&p#!z7#?yDTVJhvYeS#j>k=>X==;~n^Qbn5G+$lN3thf08#6yBJ_RM$ zLdmspznaqWkG9|bKu?zmMeZE!Kdx)FA3S;O)UbCfIbwbZj>n1HWhZpnFP#?2x4L!B z8g13sp_l6!oUL_iuc^cdmkA|K_&(UFI&tD_rqeFb@bf(A;JiK3l{i5x>y@q1eKUKb zO^qtCzHzQ~oIE;!AIFJGd%hUYjB7GKxWne_l(FdVb*J90T${Z`VyE!SF7j`VGvfHU zXRXEm)*2gl?{SCe9V3P|&*R%MUa@)}ef#9c#jvKL?}YYKV_*m0Pj}i{wkW=B)T>*9 ziQjwVoAuY}b3(=w%0{=T>?fBA<vE1=%Wl=d{g&xOf1~PN(7}1POIP+2dwxPXqWfXJ zs@+eHlSc>iiT6{by-|#3iSi5Wdu+Z=X=AQlck1o-OuNKx%6N|~*YBiS?%JbubY5sR zC6C`WUHkX<+iG-WOdfsr`~&pe^?iMI-PRSoe4l;K)_5app|$B&ALolEz4~9F{AE0U z&wb`Hp?o&o{pdTYv(LV3I?*3LLw4Q<>B>GM7Ia}R)tBg1?LKpyJUU41ar>;&o+-vN zg1#z0u=zTr4SRdtskg^@i>zgD@uz%UEA`uBS~t#z^H*dt;`IZoRLSGBYx^@fF=i<D z|EF9wU%nmdN_{H&4*fu%EwMEP%lFuiY<-VPW{=jRTYbdAb$aa?&{^JW7s`fzD!I&M zLV0%PKJ-J?!QE#%(I0;<$a&XDSN0fjU_?5i`wsl6O^qtCzVX@6aq{Q@ew@oH?U!Oa zP1*~z|HS6&ls5GDx>IkToXf%;mhp{Tum7E)^<$51T9wI&?EzM)l4p+{vbn^Vq1^wU z_Sh!*cC0J)spvcS!?9#RU<co0KeP4i)>`b;t6Or2gNNm>^H=Nh8padKMwhAVF_#JD zS*QEZe$~PKsp&*N=SeT<;Jjnfl|4orXwnPa8|7Qo?lH&7qXYWHd#uuaDaNxFeO1P6 zzD{Xlu3mTQ?Z@S@^F51Ye2uSEZr8f8$EMx*kKbcF6Igu1-`{6ZznW5OOhDgh^6g^S zp`X_p6FT>eC7W$c!S+3N(AIZUGMlv?-RdI_cIvh9RXW!jPbeGysq8VA31yGD58b7D zo$7a+PV~on%y}0{SN0fjV6D~{-4pz&O^qtCzHuINoIE;!AMdeB`=uDqA@o(b$L8yl zHuU$pQ*V#**s&c3&ze^&uWQZNU)_TleryYHN|ikRx=nk!7+xs1R(~yqSFA0MzTNWc zVpvnrxA{k7NnKzE-(QDpZJV?f>-6fDU}E5~)_(N0%45b8%0{=T>@SxI<u?!9e}1ky z`|B5`6aDe`h@E$fbY*`L1IDEzx{v8q?f!C{JUU41ar>*%UMa@Yp}j!+VVkd0+OW6R zoqGGR_Zp&yhwv<VjdHo{!TwseCc}@{4xCb@R)6K0;!MdbhKJm4>#KQx{rlYsv4VN* zdHv*h#NVMPHNQ=PUX1yj>^#@#8AgfUwDVn~xL-|aDTVL-A<bjI#oA{fhF>Fht@YJx zKk??ZQ^$|Tk{<I-bn#e$eb8yK{AyUQZe6oRbM&g$8f`S5*j`hK6)qFX|Md2~@Eg^^ z{jKRl|Cy?LK?mpEBVCCV#IwEf33Q+NZ?bt?HagZf&c%+CM+YRtxwz84FUGSPeN~Rw ze4WyU{$6+L?aIa3`;tXs1!Jlyd3?I*b)|jUW#;i|=PgI`=)311pl{Pp#*+26Zs_a# z=+Cx>8;NU4wvUM0?HYUJKlJ?5cw)bt%06<LQ1+4g$sbh*_fMu1{qb+3I&Xt?WgoHE zyRet)OZ2LCA307Q9VGU+eN<^r6yq5|UzNYue4WyUy}j<#+qIAQ*2}V$D;KX=cJ;Cq zE0*;Xc9eay3I3gL)ccuQOY+vpe`d1cbp*3isnvIRzkj`QWidSD?zg^L_uAV3)pG&O zg?X%bTVWn+-=OCk(eLS%nqPy)x?YT#{)O!Qe(0%I=ly=_eC9UpS5sQx?O)Y*>8fk} zz0%C!v>*MjWNgm#ocL%#&&ASx$)1z5m+5gr26x=w(MZn|qz~s(Xrod5o;vFj_p2!_ zsh(F|)q70KXRf+hu2Sf`VdX1J^=+Frp3MJaHjgbQj;D45Z@=cz_q5Z}SA(trEA`!~ zb=J=qcu$nRtwt|2+H92XSjYWpN(;O@@f*EZ|CaRyyE4G-I?d$O(O9H3tj+l70<%u~ za6b(_!ziEgppL!cel?{9-fByp{j)pJGn9ke8H&fW)w+M$#g})VtP!u<cu9@EyF<Kr z{e^kD+*;Rm!%y`-gvC~HJl9Rr+G58<vG9;y-E_*Y)@f|-f9vdM@hM*8spLAB3FW;! zkL7<=%*R*%X0iW1rW-0zQXQ;q#(!nGj(ogC{(<i8YO6NaO-Tpo5}z3><t_A&dA6dj z$_$@VFyGX-OSJ3$vZ`DMb~Po>p6ppyh#jE}^xkBBweHE;Z>oMz?hWK4vtG91v%^rn zHwNW%;!r-j7Wb<uE%2_B+`*@xmcBfOm&!$pHP%>De|(_uxkrT(yP?R1@@ypTS5sP$ zOY!~eaimo4*cr)vkl{m#)llR@$=z|kn$qHOy<U#y@r%JX7wi*aBX_&?)#?|A#aC^t zj{TxpF)Z)eqJQ4?X+JQQjN1MN$K&k-v_9BkLV9&6Z+GjObKGi;9e%6gnDNBxG?jSk zGNHs<k2fc&PQ1Op>2$JDHKhd|oOiW!<%~s6sMC6&`*zM9ZRyY~HfNXV-}oNgaq{Q@ zV6CyU7*E6hWWG7e=INBN%+>2oz1^Odm%Oov*9yK;CC{GPZF<L;$er<)Y)-ZAsWsxO zc2BjN4CEv8RN0StK#4U_?h~NgC&c|~N(;O*b>9;2sZz0aM<n;5!si?cZ8VBcQb(V- zUrlL2Zr_LX9hdFdd3niKGMmx9S^89a9_!H93^B9A9LeSU4!zJQIe<Fn_qbn8X+iGj zJ9PhM=l30(3i>d>?NjNDw=dG?G|A=s4kaf*Iln`(Timavw4hJ5C6E8E-%zkyC<nPa zt*=)9ty8Sb>%VQ{bsKx$t=0zz#hce(n7hlZb!`{iHI}pnalrG*L$tQov0cvqw(8Zb zYy4_lv3cU1ny2x^Ydn>F;xeIpkJIDjgH<P=%r>1KW>igSK?mpEDP7sS<h(iZ0d%i> zyZodr9a=G;I8GiNkPzpSO1YsJPapcKJi_Mbls4w-b*J90e3E^}ykthn_!(bK$+IV$ zHkRI#UDj9Yp4=n8YWL*EKt8sbD;qKoC^-d6PJxnB;(j%y1>O$DQr}mV_VY}QHP&>E zP8UA05!z@Jzod>nale|<g4}(=sx}s^jpROB_~Z^KxdTe>fRa1nel?{9xjawf`5(`I zj{Ki&K54t^Zih<oWzJ2L?a(B-<PIpg14{0IVxPEQO=)qtUN1-U`01`d&k!5Ab&7Aa z)#|5h;>+u&gT&M-pIgShHZ0z}{=z(6ZmnzEdT=aBELMTzxua2QiyhbK{4uUqx32N4 z`5N0IzuIa%@fuGhceqR__vs!RAE`RI<58y5V~naPE$HC9b??e@2l=g2{(<goYO6MP zI8GiNP$teDmGVF_o-OFBGSBAels4w-b*J8b?ES+3hq<Hs=0fa1FE8l5(fVrLlQZ94 z{hr(t$VX<gY)EW@k~^T}4k)=J?pIS<;9V=ZzOO3fjt-4A)^v@|7Cx~N+Gv#AK^=YK zel?{9xpNf5tBnPtk=%2HPws${JD}taD7ho<S5sP$+pp)<+<TBadbecrp`GG(s1#p1 zrF+Ja`RcinOYVS@JD}taDE5i_)sz;O>-BOpPwtrUo`RksHgemnuU0=D6koNuBlgo_ z@w$y`^|cA{=Jglm?s98g+va=5k`aql;CSwMoYodQ?ogg+dT*9H@T&oh-TVQ?WaEj~ zcq+NWWkSgv9vdI4I=SO4)2YR%n$m&}&f6wk*`wsQ_3~qMAJnVb+~GKRbU>LncT~y) z#dyZhSLKN|Pp7moSFbzu_G6z*`+t}_HVu{DlY6YM);-zrzUuenOpV1J6m0cm*^u`Q zp!gJ&=jc%0H;DVyloohLg;njd<+YLA`NHRY11PZ@id-n~8^rx;N(*u+zMnmglzQJ_ z+WRNZ_g@SjO00$=7fSAo`_+^dm+SR%G*7JF9_SfjBlnQ?)#?}X6o;yf)v;gnh&S)r zqJQ4?+4pn(o~P|^a6I0gr}e=W&C1yu^y;Ql@oSsLHh)xc%=S*aPE(1uE)&Y$@OaXy zI`Q^Nrqff5q7nrioOhdaCEk(~7HA#O{g7VO##_h9qXW9c@wQUzEXLFM!E6sLuz5OV zEOYg`Q*YN<{laVdmR)k$Mf^`8TC?%lRpq~V_R&$(HAY9z)(>U#sC6HWim%#z)NeA7 zkIaR#8UHH>dahAEzeXLOiu=`+7I^!w(g$*|;NqnNy+M1TXZc&^pO(J1`kbu)IHIxM z2IezOALx^;jy}|RZ!GRtQ(7{8t}MEq{l~Rtb8op_pBL177@W0xzLDtx&g`xF4ETWq z>8sQ9D;2*-BK^;oo|g&(dWF%a8@<SA*srFvAeZ+)IRB&1(N7ojVZfFXPf2(!FnR3n zVr8*(_jWMbr3dQ^1s94vp{y?yyL!Ja(*kd`CC@&n`$$30P!4hzSYNICV72)2?t|^( z&Fiy=#hce(n0wx}?fB(b(ig-N&qZxoQ|vgbywmuxEEnNdjT+l3ze<cJUgN3cB9{r} zp59~a(^bb;pJ6)TXHQn$3pzOO0_jRFB44g!530UeuWECV<K)o+ed1hHDX$dc*^j;| z7utNC(#Bl9?$p~0xu_6K<Mm-|sgh?8uH9C84~|%0t$T3($E)9iM+5oH_1Ur+XL=~_ zTS0kF1jVP~el?{9-u;qW?fxCmSYu7s<YJQxovRKga-sZ2Q`{f&_Fq-_yy~R(;Ipce z+HcW&11+beubrkxsoc__u_14V^m(EhpyU+j*+w64H0)PXTCh*wUHb0Ep)9xb-<#pm z-tvjUGmmYi5Bs%P*&69{iR80h&_<&?SE9~yrMO>BX+bV_v$TB7;nQ|IQs_`Nsr{(* zpV*t}-*Qhu{}Ji$_ME0`1cbkvl?t>!eb!GES(i#rp2tDkjB>9>y~SwQucoxXi!QUj zmFY8YUqPQ<<#4~Z7&m(nSBsUSkv`9nTz=O9dX`b_OPzbsxL-|aN$s|(Z&e@vTVmOY zr31@X9Bb!%!)Lt7{jFap=*fV=+x3|`z2-}2>i6SMkuqfcbRlc8^l3DDj#2caowG#T zucoxXTW!e`&z5{Ln@21Ix$CX3)_Ar{eAS*Q;&?XWQ~6_3yLjENYmF0Y#Opp->z>{b z$gOoh9SP*t>ieu&UVj`rtl#&uybF$>gD#Rkvi2i7^UNF0&Oz*jts2|+d3}e?@=xrS zQ#l8@Oei_a^Zc_^C$26sot|q{O=&>~=WUm+oP#*4?bqHz_ceM|dk%7(JUXCEd=9E~ zrYXiVj=n0LHczLtF;}lU^>&?u3f~JV+?J<2jH#yNi5(kmEgd^{SzoQOqw6!($Br2q z>vO|COJq0Z0X@|yXA<i8Rot(pw7}bc!?lGk$^`ARKU;Wa)^74nu>P2AjP$ueav!Wg zP`>L6MIR{7C*yuKr6tveT)(uh@5-fD{p+#s?}Yv2{4)LPq_@AfGGTg^Ix{WSSc6V| z=7rLa+y{NOQF0b_-lL2A)sz<Wp0h)rqpdq7eeE&1?BQZ%XC(JU!sj_LlrsesJ3(2` zxL-|aN$s_8U|_{HSFRdZR`{M4ovurr^rBwsoYQIji~+ApGC7YyIbT4DFHn3e?pIS< z;H|dg*>f{KS6Hi14szS9uhu;`D86d*b-d?>#p}<MYuz6c;?3)$Ey_i{wzc{hc5~iZ z{bKZYW6882?s?w4Tz<hC9Fbn#Ix}|bnrBnn71P&$S^qP@cw+yUO5SvtQ1*%Eh09cD z&%MBOda+S8r3D?FcTl?G*W~u~+5_l5%$c_>9eP|2i9ZAHIC*qHLYy}%<-lS*jU(Bf z=(c$}Wh`^`x>IkzboszFSKnAjo#*%J2L_kXoAG5=mH+11$Gc7E7#)3Qd@-9(t^0VB z_^RE<?Ir{H$n25rc+U{ZGfpTz1?4^^?pIS<;N_Y2z=}(k-QbBT=xe>LaGqb|^RoV! z?2U9<CfUSZDER=2E>Q06;(j%yrJ$4E6u$nN<*QasR*e3wfnKw94P&YN*l+!ef%j_3 zCr?3nmH@?8Q1VpVucoxXyWmTOH5&TJb5gnN)na8llKV2@vqsQHqsXO>UE+Q<r3JbD zJvTgmVClfBmCqYkab3{PrN_c1=|;U&j$Cd1i~+M(a<K!n$te0z#}0A7n$iMqwI$Eq zY97tz5z9bskM-5Mw>FC}@7~%cUVqM3>mHb++~K^n`e~<lUFTYT4cq1Qi@|%xlKDY= z^Bj4V{DL)T_==vV>(#Amp0ylOzS*=(_us}7`^Qvrq|1cjlb!>Xs?NT<(sa7UsG8D( z4$iw-x{@Qw<J+|d(0!j?)#gaY$)f|x#5uB3zAMJl{?%+xyu#+`l(Ed!>rTC0_m<Ds z!TP$Fb>7&&?1I$`X{W?%l(iQBn`aLnHhp76<j&if&85~oyj^_N{y&5slYx9>u9Dpz zW0dEN)X70m@@3qwrnJD@a|1W!7_iXR{I$Z~-0btox{v#NIMU^M(*??X85CWhJWGuG z9S~iHBzN#?J;T&%>&17a@xD~v>($th_XgoVS`AQa07Wj8``fr*O=&^yBE4_y|HFKf z$z}f)EBhn4tA&s4p~!_I7s~k{?pIS<klWX<Q{9Tmw&xi%-<>;8{fqWwb7U-~dHN{{ zuLkK$y;Lqtte-LP-e@{PSraHaLa|NUucoxPT(6g-dG^u#uNT%Z#71tv_0_tMwu&$B zJ{lLV=cHQwzDYSEukUt?H?RL;x4eE)|HrYUD~M&D3kT#Etiil*=)Oy@Ze8P(Gc|V2 zxAh*b@x=Zym0ajDq4<)=`W33P7gw52_$r@k@q!M{yH&c93(40b+5_l5u2;3W&~ftU zfIe|9td!S^@htvkwkKX`^L5Ht=IV8)-X7(`%W0>?Ym~JX|C?tIA2oerMC7*Kk<F#% zJuJRz_i(?-Kt3{GBfAlgp~Pb-u?|WujQiD;7I>R>SHJ(qBe}0Nxlm#(6uD6HUfi#y zv><nr<ZgQMY3Zv{-s{#_V@>C~M)*x?fIiMBa;Y~O4g1xU7UVW7*HjyK_C|95P59Uu zik+dzg_8H;el?{9xm)x;DWBC!-}C-XHXqt4)yA@3>7H?9>;5{^2a5fn=mRCk#r+|# zUss}e_D92=1wBK2=G$p~weFAg;>)`~c8Ryz92fie48{Jue%dbHyuOCr^7=)`pU0Bk zAVztPd$s(6HK^AaYe27VUE`At8r%It-A5UZ`=z?mGL;<XGNJgA$M9FFUZ?t?>4dMw zInH_4OILCnd3Z>B0Nr=#Rc(%QoIE;UfH=oh%2!cd0wT5hqkEQJea&^t8l(QWzA$Al zo~EN?$ux@>-VS|(>~)gp)}W7bbUNlYDV@$3;sKO+HOI#KGvj!jQ{F27IB#s5hVN!N zY>-UGI0ZJW$L*7BvM^J^Wn{JTfAhqtQPVX>M($DTt2Isye6RXAHD6<0HZnKLX1qTM z<vAYo{zmysQrxemw7`2vSk=b3ZIRq}m|Q4%42oRngN&k=_v<n($Q|5U{XM`ujWyQP z7j6>%>1u%T`CcfW>xFWDi2K!)7UYgTa6B2m?|6F8xMpVIw-W2WUwzCSj`Vq_<T6hv z_J?8zXuZ*}UrlL2pE=6!<aq937yK-nC+(DK<M<-!o^fP*Ws~UxWnG}@Szi=?kNZPj zzpg~{?3<&3o*_Q-ZT&$uhg$bdzxb-n@A1CbD&D-lKQ7*C?_p#AZBovxHowQdhTZb| z#r(hOcUpqj<@x>X@(b4Bko4-@m*sbSa$IqL;HP&d9meB+i4K&h<ad_|C02M`f2-<s zs=v*2!dJN$@q!M{+b>=5>+}pF-$M7TdR3d>9Vd?t=u>MBE5<YXN15N>Z1Z)>Smx?= zr`|p(@7Wz}ygrOARr2iL9j0rHiQEb6t9AeO{rLDjSZW?E8tbwd^M7PB;wqFl2PN)8 z@u|39O=*F5Ojz;x`~>Td$(Bg&dxg*QQ|MVnIWJLfG#d7+DJ{tD`pNNoztnTvMvXPr z)E9<?&wQce87T9Gl4s(6HKhf)lsIm%&x)0ek=*y0Tqt&ivhSeyQQYsCF4ybjXdZv; z*k7<uh>hID`fByZ5%I-2q0~HLe>^JQygoHwaW>8g)%pc<&%3tW(+(!h!M^sK@E)yg zI&YmxdiCm-3_kb0U-7kfT)$^)Jh5%2k`r7el>O^5@7=27tD8+H{4LH2&YMVAe3QJj zM}Ca%BYIVv6C5Xx4ibA@PN)>$i}B1mkool%o3B&GVsEcI_4W&w_w{6N@-3t(Tfg+G z@}FAwAHKTF^o-Hbv2HAzL#_L7P<+1sX4?Bpv5&dDHj_b}F<WIX;v<we1tmU0@u#?7 zO=*F5LRj&6u2eo4j^uts_;ZB;ooAH$5$fEJ#QkbY3v!dYs^9l58f&cSd_O9D<_jes zK$$O;d=U4mDJ{t5_u`k_lHGSq{5iv=efHgY&!YRZ^fl6vy{}j*PmDzRd`xoB5C-%d zqdZTfPCktL)sz<G^8Fm{g}4u@KU~m<0Uj5(nLef7%Udkn8BYOoo8)32DC+^mK2Yov z_p2!_@K#&$?3=oS1wBJK$X#H4weFkM;>){lwu?8f?;jSguaCbUTq<wH{@biPlGoR; zo6D`$FE*cWFlh^7m*>0>%P&}i3F*~!PnPrW$qD6;_FwD%!gyl;m`cubnNaeU$Mg@X zjvYT_I^nCFF}<LJ^RAYz@RFC;X%C?LcD<_2d5)7u2lR>WgDT~(Vmu8$&-TQ}ZN5$! z%Ur$g)Y}U=FS`kf*M@PWN}jztVtU4y$US0xweH>iUsS($TQ$~YBlDB87cmY>&Vv%; zpya%`UrlL&cU)N2o>#X<az7>f(}e-$861=t3nk{q{c1`Ja=R7leeYI^8BH2%tf?P- zTKLQtO3s5aUnns>?pIS<kb78IgXiiqGkR6ZZJQ#w!@@sP7*O7CfHF^LlhLqWO=&?c zd6w^R@*du_>=}DH7piWDN-?bYmy_*qtK?z_D0YWp2Pk%k`_+^d^r^Pw*&q7@JwrLj zo%5?~4z=!&PVrTn+v5GPUc7mIe3y8AeQNd78Oj%VeGR+0+*<u&f8D{PHHcB3+qTOu zScBctYrf7`-MYpn$CW3x{9gZe%6MY`m`ZMQnNaeR$L?EHC%1jVbi!BT+~&NU(iL9v zZ?Aj{-PdzIY*V93tgpXE<$aEmM+Y$C+*T=174i|>nSTEMU7@eBaJjHBZumY2lTqdt zmCwmOyl2;Kv4d{T%h1_>N$GUP@Y!)_qv&44aeKse(vYf)^TxK=ZTfssG8y9(;IJOI z^HuHaN2dMr{Lfmkd{zI-g{Bd_ef^XAVB!DDq$B9Bw$vKK_@8J)zde2pkcZrT)>m^3 z`<<Snzx6=+syB>M^O&QtK0n5MS@tE@LgyPL)>CgZ8uqIxE%5FVmdDP~mCsCZPq6-& ztdHb=#pFV{uZ1EP%Go0BcRZh0`@82Pyk?%?mC7x3Uoc~0@_fH)a-rl@C~~2EFCp%a z<$Apw&Epq40zE@)<~w11wfaSiVsBo*=o4?=wMGBD>(h0=gUNUhi#*4SYJIRp>%Gdk zdUflXv(F}tZPqh}<`RBCl^o+Tp`3#}*4(Cgo$6mQo$wia*b90(@33@D@4aNtcC912 zPv})`j&YnkI-pOjakUsv*B`PywA1G6l(Ed!>rTDBR4n!nMZ#Nc$+M?s9x3eoP!4hz zSzoPtYD9bsK6xO0Rf@GqARn2#WItjllvoQT_COnrhW%<v3%rZ<Os(4ecr=px4U-GS zPoc<#5^LjrHKhf)^WUh?!Q1_Xod?o2XF#=ke4TVp0rdyWZ<;<(VlWhapv2&~UrlL& zx7w1&U)ugu&@+^S+||}stG{d)UtWJXEZ)3pj{bSqr~aga$$;(o6z7T)()Ihg)(2Y* zE8aF9&0;XVF;8RnpD><mG@f{!rV@i)CX^WLG3INk6N7Izo$#4B20QNp=}HVHPwbR0 zqWfySs*S;plSc=MJuU`Uil?RGCRh~g>*xMbV;f6#EKDI%j4`eAR_qX!J7r7m2?nzB zf7;74{q*7i>F1iJGv?81fG!Z-Z8-nPdxA03=R1;#4V<D^SdZH=#iSE|$MUO|_AM)N zPmta#WW6vQyDP}>kyA~{6MJ_2_4su_7W100zFK2X@;80P<{bypSEFHoSFE&XthY1f z`?7J9QP!6_F&avaiu=`+7I+t(HlDOSIQtyj&W9I12RC2;OL$_zf%J9ctW4es#ut;3 zNS_~=KF}5ohN2IY-;#^_V?2E-BblT3qxb&ppyr8AnGbC`GIng<oBx(w-zMN+yrS^g zgBXk7{GjZ=cj+<Saee-YwjGkO!LF$v63%<1V==owppFsQ`^njrzV~{`o@Bc)ZhHA2 zt^gA}$L75S-c#r0<4a+mY}j?v3uAd-o%gPtm-i`%i}TNW{olZ*{iso{XXtfkAe+~k z0Ow1x&o4Evt(q6l3FA`CKFO*KXQy!H8x}af63$12GdBiN-ElTPY}qlLy9{Th^mLuT z`L%F9T0x&frxkE|uFv#YA{=x=JUEAi<L@QLD!D#eIu;(&XMy1`7M-Br{6;wb9w2RD zah!FJJpCBXOw$4Tv*tejx5D{w1^?l_86OXw5C&@sCU}m`^E=kr*P5}Vu-$*!Pb}!d zdsHr~@$U1}XMy<7rIH0UcnkEL2}%k5XC%NGm3@AvdHMSX+33RGV)k+WnISo=4GWwJ z;rROj1%&L%al-X-|5+>?*9n~83&)@Dm%=ILKO2REPVj(puW<Z%ekq*LpF{saC&&4N zaBi*O&td#oY&OCE;T}FB9Dhz3>*Mi<=bvF;t1wtoFu`+do*}Z%zSi)R!gl{j#N*gJ z2X<NQKYn4t^GKO&+M?aB`y1FkE~M+No#z6fZ~am8@@JRfc&?{gQfa#HWXyWikp(95 zrptN5hov5)XTzuG3Vk0sKYbR#x$~^KD^5ZO@Q00ZjgQax&(|j03qDlWTc7&NSJ7Uq zbeTT80=>R01N=#I@#k<cpZjpQ)}6Oz@n^R5NDK>{KMTj7o0Y-|eQ)U7FFa;**9n}X z!tv)|rEtQ%&}uqhmv9~bA{>8y5#zY;@&17K&D;6rWScOsHJIQzHuogh-`4=1QrPZ$ z(`FRbpXWm^tK~JT()%0MwN0|X2CvsB*Q~3r*I<D271`&nniu!%oP*-x>lNC^*K1Tb zt%e28--P4$-lcF#t(WTr&a@SUd*)I&q5ssI4$L?7<>|uldz~1^*Nc0ou&-MfsSSk* zo?~-wfnD9U@RY*#_1dQKj?KNK%j(;FW_q8(d$Mm^yW%9UeOyR)So{75WV(3Y37VJR z(|DUxj}_hbpNu(Qb!35wyy<e5a<^0-JKDs@bCQ7tZ%vMh;$uH)`OPQM37HG(3v%!= z3TN{)#_a9cpEeZvv(faMVK@x=s@DEQ&CSo^G21L_2-kk|Xm;*dESwR;1gB0oeugfE z6Z)e2^hV*hPT<@}I6u_hXo^8pcYVUW5yl{Nf(@Me3TIyhoG`EV+gz}3=pXkJ&R*g8 z`h;q^PxI^|Y;P3?YX&BGj=lGR%6-z&*Akvm*zVIwu-@%jXO}hemggl~>&DY{|Gi{^ z4PNVmCi{o4`!wrk%ud;7hUWFt8tmiizDPL3rV}_P3Fl`OaKiQSbzhG@rV}{#7tVnS zIHCW9>yA!7uLlTctO8Ex&+Bb2*e%>!^}^XNoO0_v=cLK&-Yg8(0!;86dz-FVA73MM zErsptJ}4f>QFd#cUDnpl?<E`Wue#cA|NL)033fUt`m@&BduC?3c=rP}uW`+b=QDBf zSk`><WXw9%kp(95JeHMuCgL`$2S?9)>ZS9zD9<&{UGR#N&<WWiM!6=I?cMtyNnQPT z!vDm3`2}Apc5BGcX+5Ujo<Ps9$%h`Kx&2ym<FhYunPm;(+Pg0{NRM@f1<uLBIa~p! zlrOqY;LH@xZz|w~dt-s=fL+3MJw-Ub5{}z7oSVm>;gbu#xc{X)lVM?CYcRoc?Afyp zCfMKC0IX8j?u#={DfmN^*2iVdZ~b7BoRY2U1(F3ec>PAXW?g-~k^tv+*=LsKb#D#! z@%7pzoCSsj&Vz;XhYC2Q*2{GQXSQ&TRKN-SXSV6Ud_!M;h;V*iVZB-(QdlqS)GLhC zhQb8Tu@7-=FUC<yVf%UwYkW3R-%HT?xU7+bFHE+dI-c;n>*v4v+-|UaTu4W)eevu} z7w<b&^E#?|m5UwS51x$KraH2~MBa1-0nR~%U&PEFqq=V|g8!l8$<gPHCF7#AB>d#D zrN2iP^w?^YYkaHk7e7eq=43uN`@LH~M0>Ha(e#=T@PA!v{!q=SZY2A^7BL^PDdC#C z57ItjnBdG2&V4H2gg)4Byv!$Dhtq^}qHx?E$noNPeVRQJ_4XlQU?VWWbL`=V=-yj( zw;kh4VY}~4XuRV#%C0VJ;Pb=Du7+$q9wS*`Gj8^&h4HM1+qvKR8M90Fd6?#P{~GKQ z+IgN~f%9<TJfH$jxL(r&JwxAV5Y9;z?7Z_)llN%7=E~f`Oy_Ob>(!1u+$PMq6t>&B zE3n(R?CP>c{=6$$G<Q5XMHtUJXZ9IjgBO=xYoB<i>0$#Op?RIGd6nCvb>a!}#)O3| zFp)QX)}(utV{dl2Pae{kP13Rdv$rM5=~=$s`?j0^3thlnJg0z<Ppp5+2a_R<6YR8g zSDtt)V~Ujp#=kYt?;Be4M`})|YEI$zs+=E8O1S2s@AMcJIFAy}Lo48fdvta%pKu)- zh4YXKzBBxo$-c8lHo-<<VjsuuI_+SB-FRg)DUI#EvoWymi0taJT3X+lBxh#p@hiy! z8_Z#&T(cf-=h;E~H)Wr>npZ;&_6hC0%X9+gbm2Ur0#3MIL&l4qq3=9eI1jI2=j5!( zcHSlo<_;!!j@|k&J^NAJZGtUIVY{8DiHC8NA=%Ys9l8EtNnP`J!T~jTSM%?|P6tJQ z>aBhDBQjmQyGiq!t9g~%qgx})wW=cvOyo`1A-V88;r!)2`e%PHv$rIDpRU)qF6lXN z^?Q=`v$MSamsRT?fIjHbZ<K5NV&3$dk}i$odglGcuAseG851t;Lk};^`wp%9V>GX3 z&1+#1rdie&uKVb>XC~Xu8BgCsYWUobig0C3b?-hi8MSebYChawYT%&hb4aw_uF>lZ z>2-Dmy~2IpX}n2;{3pOUQ#j{TzzNUu=y~MaY<~BC?ol5trFZWqpPtmWWaIwW`~<$1 zSG06VA3Ao4GDohN-#qDcZUw!<XC1AE13z<goW}~Mr2<a)p3@HV1N<o517`^bKfsUT z;%AtKCr;kCy~4mZ!358-4?R+`Qg!!P@JeC(z8%(hm)kFYc3BM%7*57pvph6Bf7U#( z8Mo+Bh4JX@{@rE$jM*(aKTh*%)x4fYLsVv2J+#lrwI4~E&&&4HhV5tE7_l6ycKy!_ zQay$w?~v(^yk^OJQU!UF)-}-AbqD8c;ha|iC-mD<(*e7LG2$GXf4OztFn{v8wh04U zg9)Bv@0zQ*GT%UFY+DT5*L8icPIXTjPh8f#n|CJNPZ>|&3wqp5*KYzF<IX#M^16Dy z>S`>se@pf`SMz$BWIy%TiWDwp*=1;-t(z}OHa&Gb;j?dFJ@u8JE{vXhwf~LpOSWqq z&pkf>#|vIJxwlYjHGPIeM{SPi)grx~F1?;o7<%l=^$OR&-f$LZ{ys-=9xt3{RKN-S zcKFe+PDU2!xs9aVyna>PF`>~#L;KCiUX8;Jvp&6lUDSQ7I@{JG5oL~apw|<mS6c<U zhjICk@xsp>9p{O{Sy*9yVcywfHpV}~z27Pv{GgZ*dfYnnjLH7pC=7fKOz<4LtLb2Z zAG$B1Ybk8^@BYAF2jtH#Yu<TpOokU`=enQmec#K$25;CX*XZp2eJH@WQ+9rm=5>MQ zbs+<zGRx|recT^gAFcH=EO5>f&V?0l!u4{0+$9{>37jVj=UEkSLVrZX!{=w`myPdz z_qJ#X$EqC*Uy#gb&+eU`z5RplKGqRk3`rlFX3Kuek!$ptFTEB?uZw7iirXpNZ-d6m zQ052)=U;?#QHA-1@nq0!%zB0~>nXxv-OBmnjAu>u$8EyEN5BNnu{WKen4r4*4!V}Y zc7L4qm~2jr-7EidS=}FbWwK{c79Y-i)U7W9n=wa>avl2PV1V;&+2^U6*Cm=4p9_nN z+c~t4$B$9rv>FyT3xsoN1)OlbJbu(mPuB^YrwQjd6>vg-^!?E(9CTt1;5=P8i-nVZ zmol1|&#Tz}U?@64!Fh&oo?AhmaKF}@4%k1832nl`&gJ}P{F2H3b66OxDVX3n_TXa` z+f?_pM%Pl<?mum37X0Us{3VpN{W;?azyJ5}!<XC!Hh6oDavl25Sb(!f_F1TTy+HHg zJ7sZkJBRjR%*5g>eq4OxS;cNoQkWekr*ob@ziijYd#2=FUO`^CuALV>K1rUN<^3B! z`n12sI(ofXa=0E9^*JK%e92o<L0;&OEnirb%z0jB&nvEb$xj_WrkhM&tL)4i=|^6> z<XurgUbv68y?#@&Me@k|f4lsHJ7PIruMgIfIns{23ncG_7378czr)r7{|IBug~GW^ zIOY7i`LfCWy;~Ug9GKuac73yAg6i&z=voTf{k!q3Y)*{bC4Y8V>)(A-a^wZs`k&kW z%1?vMm|mk?hyJ}O!1<2s^DNElrJC0{42;SwtB3aS`-d^%bQ%^oi-gl%0ViD7UGINS zs^{S2w9f;ai-fbZ0#4|UsMvf(b{>Cc@79w3F=s)Nv}qjAL6TMT-e*%gj&w>N8b?K$ zBiGFD+0yIE3VMb6ve|IpXO50@v2d=cfD^`(X48T73}aS@a9$#ua{f5KYqCFf3j-ek z6FkQr(=~qMzJso%u-zZGX*}a7vo9Y{LRrHv&fYV=^4jM-8tiP;<i9(tJvlqm#d|N& zy!te+a?h(e#N*?Se&L#AzUs&V6M56?l&df6=wOULpK8;X`j?C+JFfpovPG15{=$*V zmLT7;LfU2Rjpt;T-gl|=yS9RU;}Paw)sY1z@}}zxpdF{5eoVLhYMYQweRupUS^v`U zgztd=>BuE7MYhWg=@E^m-q4cadEaxS+jSLm+Z16AsE#Z!kvCm$_II2<clFsTZ(Mn{ zes6i{s=k4<`_jkq=|{-io`V{DM7pk9`J`ljcb4xSbWz<a(FuK48|B)4^oYiBpZA!@ zJ-K9_+GF~)pIeywceVc(Yi<LY8~^htF0-s5+&6u%%04@^PB=#m6P)J?XO(bx&m%65 z6Yk@>!3<}Qa9k&Fo+q5^g>yy>qPpXRacZCG!*Fzhg7bXg+#nqCTU;C`jGJ3+F4#Bp zk51vN6ppV?h~@W_YnM%q2mQie&A<fDu@61rV8S~3T7p#y+vCBA#=Fd!OUDzJHS@eX zlFpZ9_enRj-+Bw!j9c`?!g&0{*L}g`3+>;NeJ<0yUZZ)HTldgDNs_HsBAf}+37i)Q z=e5G&`AA&c&f$6;{%-c1Y?p9cCvYwo&YBAPg#I&O`pnk6(Fxh$ED_GX3CCrJI(b{@ z&prR1&8tf|=;Sz82<LUeDd&e_{&qhc5)L{!&I^U}df}Aw!`)B2G#wAmrneV9kBd%@ z^CICS!r}A9aq)T08!zDOvNggV!kEz|oL38{oIf{QH`$-tgn^HN37%sQJW0<4q@(*D zdX>U<e_kK>XTSW{W%bPbK{CEPi+4Yq(J~Kg@OB&JI`rrI)~uiQy;}DdYhLR#uX6qz z+Q*->bP8wGbOPrk!g-T$%K3A+UPs@O`OhZdxK7}_R5))IP9q9NWtP=L|LObR3};L@ z=)@3kx`p%K73LNCbKQmvr&)GGC&yVTob|#f=g;B(+GqN}k4}zrrEva7IOY5~-0z#r zwya|qo30Yhe+j3YA8uSV*$;OL1K$7>Jjd>vuX{b!-Dl9X6t?@}obw9)Gp%3WTQyl= z_S{hLL$JZyX_V{G4>trj-`9HeXkHsNuX27E+Q<EHpKv-13!G)bd53Vy`C+(TqnomI zZ+f!6dlukaEu5Q#(}?0xnPv6Rf7}oIgo92DL7$fi=baVi75ekgyE1*Y3kRJXr&l<e zgj3EB!~HdAI8CxYIyufY!g-f)%K2fq-`kZYX1^-CpLyELck;E>qUET`pcCDp%>U(* zcXNgLhxxL}Y=_^3G3;N3^LF8s^ZWYO6#RaN{CY$f_&u25Irf65$|l%FFZ868!gjx( z`7edBgYxrG*521<?}vYE!<{bz8@!E1xeon)U4Zig*{4tQdS4CpalhXqoOZ(k=UU;s zUpVFbK3vz%cVvFn@DzRiGr+k{I3EyBBZ^05meoT)8#SCB;h+;k&}X@Dwg`vMv&O}7 zLcjO@vsF0g1P?g<!uenY`-J;&=%#F56T(0z$9aWtJ|vv8Vr5i!eZsgfXgCZ<Cn)-? z5YC5%Q*Qr+ajL;=f<J_@aHVjDgj3F+m%O3i&&Xdd415es@Em*eX*v_C?!L#^QrPa# z`!$|%lnMFoF<GBKJ!x8-osaMPqffm8Y{oP`y)ZuX=dJ~X_8-bV1De+@npdrHd`LL6 z4GWxA!uf=7%K3A+UVi>NBn;OHoa=?NT{yFtL{z*j^dI-bR?QooU;*a_;e1j!jS&V_ z#|iy;>w7al925>ZF%F#7!ugbN=Ft!p#|igWVmJ&%Cnz{K3g^?pDd&gbem`XE%{qp$ z>6OCyxNyq(;odh*_QN^Cz&F4I&#^n&bS9LJ?lb6G3fuj#H}I=A`JKyZzvVs2(0^xf z_59s$`#9L(Z86Gq=!atg&OX`aRhrl5HLr4h7~03<YV$L6J~AwD28Htl;gs{kaJ}3Q z2ZZA~f%9tNj0k5IibuuULjQ3;+#wuvf(4w{2<MB!Dfj)k(4U7tnE7Fy?1oN`^IGBD zCY-Y(U8uS~;r?20IP{|v6n)kR=S#vV=Z9fD95CCmj$ussH{pCvIOY7X|E-h#aI-M* z4KTrT?0pM$CRE*h23<>GyB{9bc*api<aaJ>&v$Q27Q8)se%N^92j+s!nEB5vjK>ct z-5SUHI@heZx8(b;{#;>$;lTGJ+3|In|LvN8xwsJ8u_@s1uxoH$FPyJeSdVaBkJ`MM zPq?=d;e4&adbHg%c|BT$fsMcf&#~Lj*O^#4y6u>ADQsVlHGzFs%dReK_~4~U{if`h z<Tu{e`yXI~x7jGyVO%&G;QUzj`FG9h&I)!8?GxI0yJ3Oz2H||Wf}O+lT4%iI8T!r} zh4ZZnc0O|RWIJyZ26G1!Jjb5UVI6z8O|V5NY`62c#xsu6BD=b*BOR|!MmJ~oa~prT z@KInhX7L4u@z}X#@XWNm$NCxb6WM32=Jf;3EByUX`Y5w9GA*=^?~AR%X)r8s{zEuF z6b|3<jEm!h>s5bd-?90)PT>5faP|qOF$PiHal*JcVRm7@p>O?{aK2w*y_O73Uav*M zNNp%g@Ep5yk*+mYw=Jrb!uIvr7}$TG*2iVF?s{|5^!{wU-uTk9zY8{a+l+D@?u*$M z7S?gU?6XeuI-q%#%a@^jntHRm(j}Z-rV}`C63&=#%H_*&y=K1FKK~~i*9n|A3+FE3 zG@*D@W?4P-pADwZA>p7CL%{iO;oL2pa``FDyK79J)@SMb7vQWH&cO=$gy(>cYwY|d z9CUJh{zo|D74!+uCGO9o!a*m;d5duF5l*@9`-S(_{`|OJ{xBHe{I76+E}U|oCrHK$ z&qu@Wo}!cMvq3n&sDLx=506U6!!u+)gMWrG<*mZ`nQ+RT12%rNu)kWr_`PI{Fz|UW z!E@}R7wegz>b@6{TMFCv*Ab0p9A$y_lgnyZ+L!cf%l6laUwHF*U^8Y(M`3)pzXmQU zwEt9o_%_Y!x0+YE{T14$^SaD`b_l20u)uk{aDFG8a{DV>uS14Y_iUYy0-TM)nGjAB zlZeVJtB3wGYB(LjK_`Zw&pU+kd*PJZU!gzmTAs~ogK*Hvac&aMy}~K>fXVd<_t%i& z>=On$InFzU^M?xhg!?_|&-7{1dZLr#Y!c29;gs7KVf^uZ+9w=za-4Sw=a0fEw@<@( z==*fLaL~zdZWhj;D(Dl&=Ww5*ljFQwIDf8ybM*AWZ!6W=TI1(oF4-)c-w3DNKAnAQ zVV@#@u`t*>V1nn^UC+^3Q9AmbVr(gF-=~{{eK)9m>9RI<?Mn84COe0pGXHCPzy@#F zDA(aWZMY=sr~PO0=l5t{Cw{T~J`L^Tzwy;0oIR!!IR8gDb;2pPPs8={-)Pz@9M=h) z_X_7e!kLSLQJH1+(0}|lnkIyUP7DEONI3TuPPu&=`m_JW*Mdv+K5T&VKH=O?IOU#0 zhx^NaqbU&%I=MdY7tV|d`h@%4_t!4rpp)Z#KsYA}r`-Mu<B#vJ+42W;a-1!~xxaAA z?e{PqhWiVh9Or|=c|Zl6Fg|ZJpTR%FT=F5|oFJTX`)liMllRv)Vc_#%g6G(qo~tvF z>b@7ywG_7RuW5_3IWhK#_LIxnIPtw?^=S5a?DI!&UI=zN#wge9FF)4}1~>=ghac9w zW@%ot7#J0A3+?0Qx>4b@8WuQPh4bJFIN^HvxvpM%x=!GHL^!i6;Dr9;=ekbepc7L7 z=cB@TNClkGpSxCOc?W)Ua-5F|=hO-~;r^;O9gYYijB(q9bBb`v`Oo0j3jWi5@?(<2 z!eC9o1kbT|JWtQWRQI(;*HYN-KW*Y+9A%^YC6u-3>)G?=Up)GbKY-1cInOVQ592d^ zUdCkSk856!sKGuR0X}nbtXqWBP{BT{zfrIcd^4pZI)jP6j=e$G%){rx*izVTpYCA3 zJ+g<(YM!?+>Axe}UoXD&jQfENURbbCpS2&pEYrpNKcRUwYF@?emrvB^yeN%#PM+7e zu#g2N^433PELr^ROov0S@3|To@O8YPpbI+8IP2!5-^R_o{*QlTOtCVjGvixplreW} zEw@Y8Go)*|*d6X+e@3udIBkXn&L@R)rf|xgt;0Q>*k@qoXkM-pIG+;EJmHkf+2J1c zT+%HZbn<z9S~!obpij7mCrqC$tfko+eTIc|mT+bjF{-zPu`<j_=;Zp`DxAj&r`%`E z!rXt@e2euC{qHlvd5mz%#gw-17kq2z=o^!EVWd7JOz<3gC)d)^eG6SnVf&uhARafx zdikBpn)#09$^0K?{(8ov7pw)_$2rAcH(UFLC7CYX_gT&B9L=lTp6UNlVP5bxTz)V? z7MRGZyXXhW<{xM8SM)vZj1!T;xWh)dMu#<vKAG&$IL;Z%He9)h_F|<&__XgZ%JsN> zVuy5Xm9FLXOz2y_XX>QKfMJ32IpI7>IOX<C=v)5&NQZD-CvZM5ob!ZJZqJ0i75XST z`Mka$oF@yXoR5ZkugT_ueZ%!05zZ5ZQ_e^04@_Rmabd7#V1nn^eOJi;Rrj?-*HYN- zqw~eXILbb)v&%Ys+w!FDuI&4_za9A5cfig@75?HM?bbg3MVT(%`$f&`DVkR~A04@S z^1Mcbg)A_Ux9dw|$>D=p?)}qa&fSg-@HZIc8XdN^d@rdV&wTk&rycql?ZwJr)3y7B zg}MA(K5?6LZIiC$ezPL<3HQ-0!kJ@O;Cx9q3x!k8M?;@*A3ZD#*9n|a;XG3~<$N^s z_0UJriMfOGW#ODJoN_)I?!BF6AM6{h_g94T4B?dX(Y1#PYq?-_ELkTE)(lMW9D8P$ z-cL~7*AiVzVY`p+(|E>F=4qWnS!;fk`NwyE_pSc~I~!H_i+_w8|GpPzx_IwbHLnXb zuW~-R{cvGk@byRrvcPnCW53CK?`?m&^7qJK-29gmbU}wXZ@VLz_S<Yf?L6zTuVGBF zvccw1XE=;Gq_x~BT|1;}LlLG~)>h27I)t;sFv0nna4r!}t-iHEIIa^ow+rV|;Z*Be ze)d3Bbb^BOb>TcmIOXnR!@bvMbHToDf3S85=VIZM^U=Y33v0Rh+|!d5VX$Ukg6G)V zU#e$f($Uuv{8HHNqicfoZqPcrtaTr|Gg)*b^U(vBUwi~?@Md;T_K&vBpG|r+j^F#b z@V@u9GNxGBZgQFohcUmD9lxRZzfki(y9m=PYYXk@F|3cd8YVd36wZq(;Dj+Fe816k z0_P6lbXC9!W7s;=0lS2IXSZ;!sIaa_{#;mBraD6y*cwdm9DDYa2NUe?Yrxo2*uJhy zf^{0y`nas_CqMAGSOXqqSqXhZAKx0_W?X;YzddE}=PlKDm!E#k>8+ytruz)p<@~2~ z=|5n+Y{k-R8!x;@|1YC)-s<`1J+|wTYpz<ceC6`12O6K>e(}n#%dfevXZZ~)yRLuo zIgel1b<K5G^{whz)^&p}mS1;HFEg0=SA7rXrN2lH|M7bz?K72`_K3OT;`bzdl0#f= z?Y->%tZOmMmtKC+rRP8A(wEY=Uvq_S)!1<FeM|oJdaYNv?@J9t_`Rwl7fhG!ai?E> zo1|OgO5JNtyC=D?WZwI#doDpP^25S+c@k@%(^J4=%$?Hfzol2PI9+!_hO$QZ6Gd>d z-h6-kf4aonTW&vIf5yc5k+!;GNs5lYQyIVNV1iAt9d>QGb7?Z~gnJVHpZjZPx39#O zu_%1yu=r@-r2cR{zAan7MYgub4U<^?8N_1YhaG*wKo*$D+xq^u>wgSn>;0SuzG5aa z!tq?A!+^CnF3b3Q%pTK${TLV5VO;p$w`ATMlf%M77MRG}GkYxARd-Liryq9e2fu<0 zAMX^OJ7PLCzbxbPzVAqf4HbNDzwmpD;5tSgTFU22VTE?^G5=_v>$>`2f=#g<cI|rV zLz1=ky(g)Y0{^<|>%RS6ony4~$=4(sH4fkU@C4DIbQ#h(eE1DdZGTg#QJZhOIoYmp zApPZmKYK^1aqC~bA{o^<rQ&Hf-DmS#SnGH!{#a-2+eAZu`L2B79ToP(Vd00EYlML; zFp<}G#ru-(8JRy`{D4Qk0vX|WuF+wwwYT<Wd_LxTrbDq9=zC(F@O?bAP8i4n6L||x zxg+U6>7MjA8ejF=-!vg39M3g-qTbqvU;clIdms3?imLxVg#bmOR$4G<)D(gg2oRuX zl?o|MAxMA-0i*VjR9Xxg+SsNNwQ9wy7L8IhO2vo~ixw?Vv1))k7@<hiJQA@&#HvxE zO>5PtRjNk)e%|-a$xf#GC%gUOZ(iM=J7?y6&Sz%M{JFb#H;J9q84`!j=9m*5!e5gH z*Dwl^`Ob;3AMp81&xzJ+cSiIneMi4Goqu;U_lRBbzWm8^jygV5yUXr*AgWb8`u)z& z{;4xlJ@ieg7oUm$u<pcc_1aaBI2nE4_$8U@RaTrIb*dg~?6>}>V@IZXZBKkC+N64% z39i5Rp-k0^_N}}%>Qz1NfqwhPv5a^C3^{%)zI1LMF&2U{57s;V{I@3kX?1?87`#2x zTy$rFl9I{uphOt>0@M7hd3M5ebK5nK;=}Mw!eN%v_eq)^<xe^e>E7Eo*m2k*e8WPn z7Y4q-jN7#0Ls92*5)Qxl+J&FNhhN{WH#mJ$OJZmGpNYd))eqUuYI9^`^^vob#}}CR zo2G@cs=cbJ>h#oi+sjmEhj>wc{d1EzI{&VJ`~v^z!ZgqH*Cm)%zC-*r=it|GwleB^ z`SYW#%Hs=6{7vvXBgL;*`t9OXbj`A8-Hct)k+Qvf&9QGQl7I8<%OTY#->q`L4L=vZ zJ9F@B4lo;($5)K0>j{3kL$ytBvGjxDh0o}D$@sRv{qTPLqYG2J(^oH7xmV{G;&)dL ze$%n>(q7r)3rze?@Y5e%HGbpL4~SR!)t5wTkK7eM^ZcWqTz5z8-@~%YQs-k>(r?2r z#qaJM{5A#rI+e#4nD{e(r&p!;bxGeRUX?$4ENYvX?Ad?+$Ps_Qzj5+qkJGPRkziWc zu=s7s!LL>}Rv$T6d3=G1KjU|X$8WysY!<K9<5xsYvy%RMXxB%+g?}H*t{a`cyfwiz z{jbFDYdQFh2AJEG#}}CRGk$YDemkV^7O(EN9vn3sm8|baf9`{S!@v3V<v!IX-=}iF z4Zjw@dvfqw7htw2k1sIsXZ+@Q{MJa{Azn4#`b1QHbh7V_UGswz@$d7p>kUrd^tJ@k z^iPT3*K_cjBO9wf<Mi93S<2%JO#C^1r&oFW%2a2Kcwtxd{Dj}&_Q!9)zhU`up3@hv zOfao%MEthq;5QIpZdD#%VB&9@4y?)gtTo!>*sHQuaqGPI`lzBbS)<?b_4}5>!TkGj zhw78xq;kI<zY)i8<lxxqVOHO^B5G6~Utr>If+G|?j!i0S5jXsnACvUsL$CkBad1Ev zrnOFAw<^K4^52T%H*;{DB^#@c92XY8z{KAK$1^5#ES6o9xb^+y(P-8S5{}=S`_MQX zd_23ZaQZPxza2Zp@mo1K_5_&S%Hs=6{7rD2JDKAql{JVP9Hzf8IfuRGi|_v|9E_JQ z`<=eCEy1<2QE}|a!Ev!{tp1j_K0B&W9$#SM&p5^uy|J!Sy&7?A-f?rZPx45C%)I+E zN5aAIeA(jk^HwLgR<=tV@6ExnNH$i#yn1CcDlB|~i9h2wk8bohj;XAsY**BO=%dj- zNzTzt&+4pzgW>sdhSTqm^xLsp9Pi7)abtklp*+68#9zWO4#r6wJ5@ISMafu?N%A}0 zAHVST<8bh~an1e0R;TZ~KEbs*zZ1t^ahzcaPulxsB`@9;RlI$FT(4^0m-*hOg=b_O zKGXMUrRppCl)j^1*Uiyy-M%D=hx5iWf7Z}Da6&YodVEK0aK-X;T|3cVBdW*vEWGmE zofFF7V(q$jM&qi-T>1Ij7hS^`236ws12#B)O?$%E>g>@Ne@A1?dnsW$*xiFvl_#-e z<+Fr=FEH`f^QDKQ?%7G4J$TNWzKjp6Ym)n*GN<pC^m+c?ao}${g~>Q<7rtM%K^XV~ z)BN=uyDQ>t(j|36x8lREZ`a*U-~5i09c6zIhevYE$12$v4zf&ne1VBSJE!>fK^3Yq z>$qLf+<z^J`Xy=O`&Yl{Px$w-?7G_Nr@u47H2ojNuRjOB!2q*Yd3=G1zX^V4q|V9P zq%W(`IZyltC9VJPZ@zswtor0PsoZbFnD~7!2ftPibB1shD^LG{iN6Vc-hI$g=_`-l z6;Wqc()i)u=VjMxoxb*638v})B!1t|!Ec6atbV<4#`S_9nE0FE=iLVt%Vz#dcSY10 zlQe$#H!NS4JN>An--bVn-w$%|+u~u4$zPZ9@B<Tn#?QYG+9-Y932yGpNzU<0?z!&< z{QJD@y3gs?tw}IV{}=K5Q4W6fva$Ne`O4!9O#B%?e}2@c&OGtzn)hh5N0RmKZ>zSA z;@`)z>n5k4^X>%G^n1ncu^jxy0?ZxC;|omuP4GJ-H9tnApL1f;e>)^uw|C6%n}&b$ zJxMx!zog%Wzlz_FbMRXqV6IUfUqzDmo8afok4XBmlQci>`$9A*$+P{xzvQ8v_@Bhf zWxAcd`8^4y)%lzF{Uis!D%n_lWSR2#0uz4|{Ji;5p*k~8-WBy+^NnbmB;N%+=)=>i z@b6=B&Dd8v{r2}Jm{#X$@f#AqbQ`9fMMj0cB@M1&6e9CIi-h|WK8sltp24(HeMO(r zcl7IyO?O7?PuUg!ZOrFAaLCj2W$2#$c(c<tu1)N$&OY_^lj`eiXMzFYTm9~ju8igg z17Bd`um1FRM)OZg#{10ozWYghSbdXlsB-!pl0MJBI}YidakMi*yYLMQxmg(a0@M60 zu1d~EzyDSHyYb=I=Q=+BI(_R6DLcykAr3oo#9X`ZE8e$1F7}0{d}A)`2mC&hF*oPh z%c4^C6@9u@eMi6U?Y}50KO@;+p0(%T(M)ZxJ$xjZt9rb@-*M=!L+JCcE^$%o^m`@! zar>vn<QF+&vsw6tx%O6lW+x1Mfr-EV7abK1otebNi=X)Y3HY%3CgCvP^zH9Y?5u3u zaY*-jf)<-4b5k6!s}%;mz{FqF+7peb4)<mUy=~?r_%M8v#AdzImwX_xv$B7Q!*Gt+ zEICW>Nu<Fwj6!6-u^ILQKA*|h1b=I!^-z6E-_fr_<BvvLUzWV*@xjmB_c7{ZO8u&L zqzWs(|IZ)N=V3kKVnq1p*Q?wgw|{F)ew`yW$A#}>HVFe?VB)X&I}hkL$&$D@^O|*U z!-rp=YdADJ{j3irc2?&<jzhM4sczw0edLI+@C7FRDvJ+}qE{qmojLEhwFV!4eXfbk zJ&r@`y2Ngx&MIN%h|MnHFHVCyfl<IkzOfnh11_KG*sTAM&RyzL`i_2GfB)T4&DqK4 zyPy5$D>6QNuw}uMQKRbd?7{S!D}S1?dumUJT2znc;=aH5XR|Wad){eLhwAaU-vzTy zJ|k1T?(KI(-Olf`d&-J4)kD8k^?26ejFR=&XR5d1B_E5nsUGoj+q1uLEU^>Tjn{vt z-z(|I-!#S6?=#IYcVO8od>?b0Fz{6?iNDd0ToNsPRTAH?TQ&2K`0(p<9k2gR-+p6a zXLSy899Sp9WY17^3g0iQ6$ZWrglYcT&q@0K$(Nk_Gko~<?YiFSOFx{lqwHXD_>1}> z+vm2!0p@`6_yQAu6X$jBbKC9GZxOHQi!O?mo}29FuY3H)8}M(Od^x82<a<=^x1m`4 z_U7QXHo$CA9$#SMZ-Sqq(>`}>lfFy5Hts$%s;^GoPx<kl;-~TN^RnypPT%;E1k?0~ zh~Hmx@GF;%)kl^nk1sIsH^I-lADg8*8^x<?`T0@ff@HqF@B7!hAOAj<T~|5%K1sg~ zhl=0da`5X5FgGiYFEH^p!Oy!N+baEf@xp)2dCB;`@zwQr;@>#=a?t5FbR?Koc9{4* zor7PKY^*-API-KRi9h4#zhBXyI%~vh{`L1qRST2;d*mH&coP3U7T2sHtxjM0u>{lV zOc%eui(j_;#Twxcr@=LhLS(*sP`FOu^O@d*wtsYIM4!@k^lR6ak41ZGlIQN8bN;7o zs_obOvfG}F##N6s=WAd2;_dW#Sc!GB*y*=O`r~%E#^gU5leG7hPB~}M<aKkcFz^K? z{wlwHWwhb^Brf(XAB^ykj>9^qpL<hcXLX+CIPkemm~8FdCj5!An^#B0!oU}p_?z|T z^P^1{B=7Y<|BZK@g^!8)-bIPiZ<q9W9w82gJeYm$?g}v1DUUBO@n>_#e=lvl^rPYh zg|6D<^V~nI8-EV|Jz5i&o1MOGeS&EPCE|Bz4u11xWA%}9l*bpC_?zJ8t=(0sGb~=z z@4PU1ud3zoyUxNtx-iu_{j85Cm{$I5@jEOBza0T)zw-D36Mqx@ytR8!`t9O{pLMU^ z6>)gFcg+P)<KKMya*yhh->P!I4bKt3={fkV2{4<L#}}CRo8afI-L2AZ7q96@EQr=! zl*Hea|7dv_|2{9f?r{2sPb8S8f3El)o`YYRY^*+Vy7Kq}6Mx3fU%O|hPQQ4yFX)ff z)FttE%JKK#ihm!=t}C5>ucY6G8RGY>9Q=9%%uUMU3rzeOKmVDVEz<Xi*Zk}6iP|ns z;_s^~uX`B(#>tlhPT%>-1k=i%Cw@od;I~*dRv%fbJifrhpYijbxv5v3t>Q)f=1Y?J z+gEz%hwzUsOf617w===C@*~BsBnQ8753_scifB}Me1VBS<L5tfGba63@tU{fqNw@O zT@mkp{QaT@+wpI{eOco4+a>)r%oM+8=it{BV6IahUtr?T@tgF_&3fs3#B1=MS4J)M z$=R^+k{8~Df1j6KZ+7~&PbHY9pCx|J$-!^FY^*+Vj`H{d6Mv4MKAcaTU8_{5PrORr zbZ6A|n&iFF(>6W24*x!uUDrANtWPJHrawyjo|}W;jsUY?d3=G1KgUmxV5ImBN<Sc8 z(HRFvYcEUQKmOC^Kh@&jeEV{b>XYB9a=#5ni{FeK{MH1R&C25oO#C^1di)~AuT}aX z@uE)0<tcvn_j%cMhtoIQoM4*%`QrDy9Q?{;WAzscXS(w60~3D<KZT#iZ-(lOh}Tf* z{n3VoB>tk^t8T!*VfnJs>Gw+dZ73DLBXjWU4KOz;k1sIsm+<2Wn^ga8k$#VO_1|=7 z)O|(r9>E(fZ2l|$eO`7w;Pjmv5=_${BYrb;@LMb!tKT>6&Zt&-e1VC-gdb1Wr1;gV z&X{=3FS{k$cxCb)*xTElcq{%5%a<)qKld{Urj@-w{Eo`OZ#=*pRUThp;?Kq3nLfWU z>Gy~ie!5?~D|(^i=5OBhZ2X&VliZt>IDPeJ6HF_6q4<@G-wacD(mu=DCj2#NaJ{N| zU*>ynGU*)bygk$RCat&VxmfineMi5R_eA>Md~%k!bI;7#nHs%*)yim{>hV2<vo3pg z#_ucaJ?H$WOZB)<x&5(ougQdmev9hOlw5t>>FIvPV8V1j_4r)#bKiU9LyYxAfxEz0 zsnc(h^y8&WvG8KWLfU&G_x#QD*C#P&xShhl7nt~)d+7sF`x}yY{P|ap>%oWBH3^3< zr?2fw?5ylXjzhUAJZbktTZQkbi%NxoFEH^J{q=-s!{S{L9rfI<OJ9T!zdqN@iE^i} zyfv}2IxiN7@*H!bPx$N8;2K6DGT%87_5(hj$vM$+-1aE?+|GzTrSIag`@`#_<~JsD zV&lnge<)MCyEb%1k?L_D)AQq%={^#eFx{wnyth2(v5)*}LK$3if9AocNA>tP`~F2w z|C2Ecs>JV`7CZeGNk0x=qA@-xN38D?zK^+982AFy{53ZvaaR5DZI9r?ug^8HzRv0A zem-SKS-InIESVr#tZx#&UsNm%e1VC-iZ?HbI+i5;ddYk5I~^Z>eXis6-|73i6FaLj zTO2BL#QJ98uStVz7=_4uV?FE#d_I%04t}fpiasq-+v(S)6Fw0&T%D}f-5+>&H+3?l zX4RXi!t1_sMi+e^)*~*uoxbi13BJ`iR%3Enrr30gbC>X~KC(<0_yQAugNLq&N|q&Y z@!q!6cHqOW&ovw>oPJQ!=XsptknOiqYJ~4&b_)YvVB#-&;K^vtHOXg~>pwlK3m<-c zu8GY}PT%px#Lnteh{NeQVzWm0rMK;mYZ!&dd}A~02Yf!$v00+NqEG2N`nB_cC!#%X zPCoNmee#p{XKHuD_il*BRgd-cjW7G|ahd9&pV6E=8*%qg$Dxc(SeN)&>hv=<COoXp z@fy3inPS+TC2E9k^^wEE!WWqMYwG`XwDsB~e!laO8_&mwU!Q9@j5-dTD))K5)Nx4r zY=oOfqr&$wmkI-4VB)X3_<?BPEy+A;{Z!>G`0(p<O$@g<efyUZJF9boIJ`VZ4DS*C zjx@N2QHabphQofq=QA0@>)(G%G<dr{%T%Azcl2xb1Jk0;mLxWR^U#$%mXkL1?6@J? z<m!F>>z}JjTS>~Q!Mmeg)gwmgFaGh8O!d$Ys@_b=o1WNM%ov7sV+^Msm-ORcj>h<$ z9I;+}ofl_M92^Y@17G!$=C5se5@%od@E2<Ek&eT5r(gT!lpXa>bR4p+*PDg!W7Z1; zUtr>|yXT$J`V~n(toi1K+4%75+jXPUmu*VyOn;I%EKomW`y6;Az}&7pzQDvEfBU(r z{q%{?Sa(RbU7WVR=cH&|Yw|w9=o=S)2;b({B=c~u>XRS3Bf+z>lf`Xej(NCA_)F8^ z8b%>9-+3605k8;EdDuO4WYnm>qEG2N`nC9_4@dPYlePa(H}3pWrgrzdvOj83J-##E zc)|l;%T%wm=kBOO^*H<g`1R+$hp`FkGQYMs{o=1AJgiQo#;!KU{MsgbtB<S{2EM>F ze{<WC_&KJb=X8Ad^|^+_T&EwFG&{;paU8g}4wIeLTZHeIZ4m~(z{FqQ!C#2#S10dP z-_vo~G5GN7b4?8QIDOaV#LnuRDh?Orh~ZY@&-v>9xQ0=P%r}O^e!%B58N=Y0sjui$ z`i_2Wy5at)^!g-*-_?CIKc|v5@q4LrRgd>-4qEiUEom!BSv~r(s8;oe^_#nXI>gw7 zb%~!gr!T)V;bC=7)7V{_BZk)s-|APtLcf14EPR29zcp8NMPuzr{5<u(M;^k5)i(); zeU8IMmHRxa9EWs|fLjdDc}I!^m~Fzq7nt}f?~J07cP4ZBTQz&G$A|g$<r=52xht`= zveU)k3iU&_J)%T5Rv)=fSoi`HfA0OzN$=Md$)-`fwjFjtRPwImp8SuyuI<IYk7d_o zPCp{)x8V%&yD|sA%>m{H<?#h3{wDZ&&oXsO-y&X}_naM-uSwn?JF2Sg7W^A0U-mkE zba#SjWoL@tYjg0cla19!&Ql&=VB&9rpZ9rqwd%Bs7xgROoy6F}uWYWxKe{k2cKV7f z38t0L6~D$D{PqNxL(1a|O#Dso^F9wBmVS+R?K}RQsOmk*J;7P8dvF>4&9^VdRiFIa zuO*mPc9!_PE(gDk0JB|re1VC-34Y$^;cKOD7q6DH&Wtv`H+es7-5veC_&47snWIhT zJQ1y1o19HwQg#2WRu;-_0T;^upqsassU26V9qHb;w`T$U-(T!<I6dOy_u0#Z^CsbN zKNu!k6Dr>~c}-X+4B7@J?VItg<D(fjB+pSk^7ZNO!bgZje!bH-+>_W@oq6JLO^z`s zla19!mMD)eF!47{PYUVdn~8JdES1-aQ_l-Wq7g~@=`|02;9PuTAErvDACvU?ze3#J zoP%3WfVoL|e1VBSxM?Yv;I>7&iuWgdIwT3V6F&Lg)A1ehBH!=y9bZrItj;UNtvLs` z2H9ABWR3Fp0uz65(=sr@txn~ok=|1|=e^N@BsXDud(OTD-`Iy~sngHdn&4Ua+2Z!r z9NfkN%wgs61t$LBc9sAo;xsB<$p`d3f-@h8`Xpycd+yE?Z@{;!GFdqNHc6lVd~s{Z z!L1{}T%$a`iX`y|x0lJAaf_rY{-C})*!x)2Bgr|T^|POf@I9GSlIwE%rQb;Ktj?>% zZDkH_m9nw=$WrC;1t$I`)+cZODOa88AJVg`s~?McB^lQ_7hLuf{(UUFp6~R<-%Kz~ ze~$RA%E50S!0b^TUtr>If}gkl^hsa5ZdX)0aC6in3BT*Ue`GuU&9^Uis6P3PD)-xP zuK2a(;MWphHY$%VF!49R&)a{Ru(?ss6CHI)v{iDZd~X=~Sv&rHUUt34>1)1~V4A*K z{8s1SS0Wp$kK89Le1VC-34Y%GQzV;l@tS+-Ezy<_C;MYd^tQL)-^a4+GN&Jr^xLpN z{NA2}-)0YU@V3jM4a(ySO#B%?|9Px#>Gz2jf46t@M-qM~z3}AU;oms<ve)UOo&?j% z&J(}ubMUK^jnzlaQyyPn;?MZ`&tp}q&R+3a|JT*grjBI(-m$s(Cj9$YcD>l?EACA& zO}|k5+H>&R6JQQ0k1sIsXZ-x<v4*AJCthu5J`rvHXmTHW*SRz9#lQLX<+$pT-==cE z4K?ETjvV|t0?c;h@dYOSjGzBJ)>`Su#cNCV!+O3nxj)!*#MR%&zt79AyPSUMeF>)N z7m43HbMUK_jnzk%DvvKP@#pwWdLFA>b;iYuHFC>M$@!Kw6aPMzUC(#=;`<X!)1NPX zYjf}$@GwiXrt~O}FEH_E{pUX~+lS5i<V>(tlK1hZ{rmQ5_&49a+(CV%S^t}0TG<8S z_r4tbS^~^Q<?#h3{wDZ&>vNOzB_H1vZ93-msN@sL`g~sR4;SDc->pt^&H1+Boliv7 zs>gTKpE_^wo9NS}jgHH#-c&pPsKaQj+VK&!gMA=O>CU%%j!gb0=wjgvI81OZ6i$b5 zP7FbmHyr=>&WEnNFmBI)aEuc;uNKZng_G^P?f?GzoHK8adODMN@a!!=&v?Gy=(QW} z(8S+G^7k?Mo0)~T|MvjaxHdBme$3Pf=flFWbBYglL~)Xve)Ht>eX}qaTQI>h?2>P* zPn5SY$2t?X{l0pS>YL9-#e?r_`-UWr8s!UY>NPvbHF0F|G53KK&Y1e=VzsMN?aCG( ze*ai}tP##0#|fNEg!3ukWQz}fTrEDf3CB2rbE$AXEu3ue;m4Uj?r@^L;M5D}X5q|4 z5hROO|GsXUYYYA6&%xIS=aa(8HtzF2H+kHfguz&V37%n(=$i4dF@jbmY#aA2s&Dki zG|uL0-NUy;J+~(JJa;twZ~@p>&zHSUzvVj#7c09=?dnpyvb}%Q*f$w-p7Qtt6Mxeb zH1*4ty>;P=<*Qb-EW2=d>*}@za$tQ`t@_hHuV;7v-5-rf#xZus2X2B3JW3u+;rlT< z<oW%R#`1D;{i3*Li&1|pEk?`bXT8G$r$IOyg_A8t{n)Y?Z5EDk0_O_h+%BAKG3v*< zAER)h?ciJ~oG%GyCW;_gjQVr0*|mj!^T+$O!nsX2*6%))txYW(C&y?peXp?q6FkG- z^pN&-akMc4D-*WGXoEM7CEa@O#`&uF)U;^cmy&TmTE4&ruXtPfaUb+>{;d9KRJ%5- zUD?Ln?;jiYQu$fuu)ukpaPAaNwsH5z%f`J)IK~N_*9+$^;ba?kKYsjihZAiF=MBQS zTR1aO1j)wTkLM=W7W&PfGmC}uRpDeC_pYx@9`|waU@X7{&#>3(n(?tQf>tJM8}~YI z92+#w=8L~0Qnoo+o8G+O12=&kG&9aNI(^%B6E0Tgf7Gt6YFD<kX>WkJU3q+gi9gn+ z%a$!!nrUs?p*k(%IQ`6%qJ}$@`>1<vTkwByfybbeT>EQN+rz20{6%B=MsdAgT(iZf zKb97wy~3$<Sm0bGoL=Faio+mTO!%>7F<L2}#tEDz;ry>~vc;$$>$n=-lAPm@sp;3J z#_3bB*B@}F7XFsV-vjbDGmV+?_UCA^v!#FixOkIr?h{V7Sf2Ow$+6ro48{yh@C>`9 zUwxvyjV07FVOuPhK9U;OR>gz)TKbwhqT+8P@zF0|V1w81B-eg?bb2^@)jwCOUE9>I zZ1LgukHyCh;nX=SaFz<^Vc}$p4}V-OJ}Si1IDxZFINudcw)pVl%pZ3+(Oz(_5zZsR znTaAuHtv4hS2$bx&7WIu7S2P$$u{oI_f8)7K4CBxV1j4ZHQ&>mR^G-4TA8qI+-Jzf z=$C7peP5&ZC41M;qD5~3+v@qU%;~EJ5-wKOtac5kUD?*Ko&a-$^7sN1f78^FuU&a< z+p=I0v%cz9o%#3cy^M>Vj4FDQ7=87~Azg5RM~9PK6QiVR)q9TQXYYOR<*_2oe`CT$ z-SquboBygYzgBJfvD%a^mi;leSnd-}slx*2EyCF@oO9Cnw%GAwu<8dpqo1h0Oyk5N zHRFL@(T2)T#5`+NZd}2CtMI9xEyn%1vh5XmCPsMNV;?r}o>wJa()_Rfd_3UMBfIJH zPwgH_+R8ONTEv6;*?9PKf8!bVL{;BTKL5G&%2(Y5PP(+-`J;@sBk^~g{5>Im>7HG( ze)a!eZmAa^V8o06chs-{ml}7|&zHX6#RYNY&xhsm`<VP%Tw-I%&YxRlZ#rZo3}O{b z@C<wKhx$83%3BOmHxsta;q9tVJyN6M+kACgqdn%KWL`AM7ueLPd^A;`d13Kh@3s4H z>dzHw*U#0iZ1L{*r^Wjg;Y@c};Is<o7sAOF?|vNYlkG26U#4+lT;@NViuW06hj9h} zZNjI1wm9?Sy<7If0sdCuTO2p4oHpPb{FTC|el~o6zWVVASHoE)oL>niTYUQKM~}0` zo<u*4JhCeq8BC3z>C5}|yALi77+-(wYm?s{@|!I_H^?3=OBKQ(X21l`us7+NII>ux zekN>-&o<c@ZkOWGd~sGS{eH5?aCQaT>iKf5)7LzfaIv!0YS(You55cunb%kS@;5H5 z_)IQ|KlT{!oP6o(w&W(>`l?v=E#k=8s^JI8=QW(U-~x|sC%N|LQkUoVX~odn#r5~% znr$xmV{db5TsRF53!LkP^9SK9#9@$Zjq_u%=0|#_MD=AFCt|4ahpD-=SmnkQ{C43} zKU=K(b7_{^KNjGR3g70^fbeMp&cT0&@Ts2--(L%+pVkvKJ(}!In}7bot#KpL{I^kl zOii1(#@{>T?@#iVZO-{?Sfw|fV9;MxKiU;-{&5Q5^exg?y0#Gqe*C^me)q_)#Su1^ zY)=@Gz3F;&Uf&=LVhc?040~j|_8a9b=CH|xZF6o^^$ojKacjOfD{lF5633h&!KPmI zPg3>$I9}?td!PDqjoS6J+LbMi{r<E#-X@$fhXu~Ng|kmM+2YubgA(!lyXwm{PK-;- zPf~GQp>pF2{(FQ^{cLgO$MII#|0BR35x&K7i^^#O&cT1L@Ts2--=Bwme8Sam)(YpJ z!pRn&{<<*WY_TWN53`2!dE*nQ@iTqB^m|<#Fuwj;^*;IioBU>r&wkm1McS(Sih05y zX21l`uzPh)99b+;KNGga=Q`O?k2Iio^nKMnnVeaUIeWqXft}Qv{C}s@w+|&;tn>!8 ztLUNZdqUOYDa`eaua9OZk1sIsH*MzR`wrU_tglK{ze^n3x8D#&KTDp$yZ7-kZ-NUv zwmZqSKbM9)zkgQ@y<c1p6W45W$shX}zuO)S?ns_7eSG}|yTMPFwm3iKiiu`-jlW3# zrpw>#G)C$64!eimBpl-o&Ig2ZxNx$?zCX8yzIJ1@{pShq$L{`eXBzjhs!9F!EaA#U zoQUnBU+A9H#dfL6X%lLAd{8{7pN)sVhU|O#j;LLDGiAT@&W~pNZqu0afgjqA#NUVH z?+E$BK1|ks{@OR^$yA(CpZ2U9-W655F(FR;_+BUcLxpc~=KHWcqv%(uIZ63|Fo-=c z!87bp`6eDMCaIeV+va51Pg8t1DXz`e;15?v1HVq<{89M=8@!sIrRw`}zQM!!hx+YC zwd;9mSGG9!`_1BaSUB|#3!D!N=SbnC`<|=yzdzm<zt!SvoWS{raApc8Tip2ZJ1F~E zsxQ+xF^<!JlZwlADu*kD;CBe0`q}XPy}^$+xEjt!g>#f}W}*m^wbx%C+J2rI530kn zZKs~&cib2+e{K4h@Mj1=TfFU&z3+OyFo*##!87bWT@x1;8`xyRws`B1jbV=|zI<OT zyOQ4@XglJpo4~euzTDvSi+_=Dv9g=gt{13X+3pMG@0g4^OL=^OiN9(3A&mX*3l=sn zS-Iruwq+|9O!Qfq?1sd(^s-MyeY+FR@2xoNCOE;T$4RdJIWpq;|EFSRy*SSn=WKJt zA8YVR_9ScSkq>_RbL7*dUgxJ$vC-zP@%M50J68U(%_ToZZ7y{P$GC&@3E><koNTe~ z&!rmmM}_LkG)~0moZqMB(zx*9N+I~46h8H{;rnxb^tHD}-NKtG`!jy{zKm=9cIN{> zv<Zp7PWd}t{;&^|%{hOqnmar>j%d%8Kkka^TwgQ(e*At)_~pXSHs|JyO`daGgh5P! z37%n>{Yu~KQQl$=zL~IX&K3PK#dk#UYQB~ZogeM}Q}R0qZyo&O0NCKQJIS>lziT|4 zarN7$)vijlD_i{f{bp<YHsQ>5Sm4|&oKu98?Tq4&x5Z_h#=$s&vq3ng3MX6K_;ES^ z$!|n+_a^T>{^gfdf26(XQnC8uG~vocoEYyq>|7l5O423@;qe*qpnf(U{yghFuPfRn zJf8bK>Q_7Vf|D+FdT~eFse`{;<gZHpW~MQ+`1RM3fnTTM0TbFY^f$G~wSn>X*RanD z|7783i{JXEC&zEAFo-EI!87cRr*u!Kyu}*+Ghti&_NhMgNM(QC6`8N07e`Uq-;?-# zpL~H$olz&b_TzWH*Y1C*-@4SUm#JOZ;@9sti{D5%dmSfmJ|~=)3n$-obwoJE37lJn zGfz0#;>M5PHnsB=sxQ+xF^-G>nTpFwmBW=n@INnn>Sx3E=b0aGa5bE6;k;5fGf@P| z;?1A;dw-J}KdQsC|6jYJ0oR9&m%rwGLHK70KU=(2|9f)04GV)9024gJUOJ-pMU}VM zz<(xei?=G-P>)oj`0{=A{U<pSf9l?v>%mTHP5ytr)9?6g!o^B&Q@hSpyRw~8Mgq(p z<?#h3{-)^*c>d>O$$hGKNRcz^w?5TxDcT)Hr`{YjOxqp*&R6$iHP^!nPV;uA`1|u@ zsW)E#R@{71yw4Z!Z1cn)Z##c%7EYPN0%xOeE)dR3twTI%apT9It@9<~Yn;HjT{yME z$ri`{JlQ7u3sqmHaU%Z4ig!<}-)mG3R|>)ZlJKdY4c}kC8x}8#nh)6>uiqzKyT+Ol z`||&5aQ%*sHX-r%W%+xx{LMrWBm?u;p{=8-aicozS##L#Xs^bbJmc!e<|g4U628R+ zbu8IE=3d#G4p}7(Vg*d_47+WY{*H;bTMSV*6SmE#wO*XHD-O+9|K6LUzQdEaZ0VeN z71-bnI?1&kmla;S|D%4pL+yHv+LbLX{eBy))9>0Gu{-|#k|##CHGrQkjXS<A^0(Dp z<L@i-cbWW6H7+cE2ZUqX!TG9iF3-W+kKe`Wj|SD3X`C4E86~OsouzWPQV9NL;Zr|b zzxeaaU+3X!ICl!?3gOH|5hROCf8JO8F0r+$aa=xUchuqfka6|boV$cyFZ`@=DSN|f zKKk8JKW$a4fC-*qkH|OiV=;tHCTxq#(%mV(BZ|Yl&e!%2ek|&nk;LT<@&z_{)q7I) z{kZJ(aEkP0@VnKnH{|Glzuzq0b_l1=u!OTkIE!=O_~U5tHeY-vI0@%#!ug*ZIDWhh z$o`G0@5kHtk*Ro#R1R1Ag!bMeeClV5H-EkK;|;Ec^L61|C7hYDV)B0$Z~lC4{X=Rz zs7<^zAGJHGaNHO#e=XT6{MQRVTf7a+-uFCD7{maW;2CzWu89ka4Qw)DTfD84jbV={ zzI<Oz&)*&Y_TmZOn{^e~R?nB6PG9xMgo~AZL+x6sc4a$P%=`Uh%o)n#3rzg+-pBdZ zwzRm%ZuUD?Sf7>3Za`eeZv8^EwKU;;#;<2x1t<7)ILWm?M}|HB(-bq`6z8|*h#7yZ zXPl?!US5!_-RHhF^Y3EzI6rd~8?Ejdf8Ub7mK^^47`3^yPB_LLoF3s^mjlP2OQq_M z<*M(`rLq^M=F*_>;Yxpjf3NVVpKUJrbKXBwz}0Z>6V3|Z%tR3+n@j#0)cp6!@xfeL z_oCfVt?NU^)sM^jh5r`eTU_`q>`YPg;>mL<5(cpXCU}P3H>PJ_l(!fHD-*WOrR}P3 zK8F;C=4;*AAJg9@-W@;hb^c%9dK%c&EBjNbK5;p6<de~et5;ODA>(sl)17_0lVBaB zaq3n3-=1Tf{Qlj(=*kJcRSpZB{}s;lImXE!?_t+&+T+i)2ZXaa$9QZzcJg@45(a$) zCU}Nj|7X2_C63m2v^f*DjmJ{2f5+9Y=4;*^4@c`OcE`V``jb;z2fzkzvy)si9`;?G z>7M>z_0PA}uJ`2VXTN_2Dj(M0*WDd|FaCqAXTB5sbZOY*yTM)KuTTEon`1ouacy<B zw8xLJ?+EAJImV;wgw%L+e(LUMqcG?rFu^nIIe*b-BFbCe(Vk4$HXeIb-`d@y{x@G; zt=prr6O(nj^`_q)1-8|jB%OX((jTh_)vg=Vu55eFrT}w|^7tx}#NV_R>;2!N;<^>f z-`udGcFFRkEz63Er8uRi_>7|B6Zto>u0*Q8R(yLOKS6&Vc6a>U#={5yT@0^Dd|jr; z>FfWR__8_=iTC?+@NU{W8FQ}k_yQAuS$Llr@}4i-wc<Nt_~xkj<fOmvzH!@a@PgB3 zC%N|b$?2ZHSn;?`yl)imZ2N&9kKhedCjIo=Q=bMpZ5sC4y1`xJ?_v4-u>75n#>(~$ zf4;RkTiWA~$#;dbPB_{2hfSxZ;(yB*TcVA^ppU==&#;I8rr1~B`VMNDuqWbQ^{ojV z>VNaqHhO*3R<%3gcZ@dQbK7FDsW<=WRDFLuHn?)?9HRbtMD6-`j`8sOXUj+LjJBPg z+)F(5+MhfKPP)|U`I+Oc@z*bZpOC*bX^d<<CXK(>9zVvuC!F;;#-sbp)Og@-uKI*N zDiUVgKMuQgpT=6()_2s+gl*#ydHvg^{x@Hnzqdrcdy|Yu&+J9p!3J-mlU)1bQRL|l zRsVcn?b?uIJpBIg`?<$)0_O+9`HXPp;4nzm&;Gcscee2KV`o4(H|OZ*wt18Lxl0(d z9Zc{HdxOqo^oR8cv@&5^Kkrd}qu;51HD4{eZ;h&7nZ#jp|B3;yskhfV_f6_&1CcyT z{quin*XMKev)?~!g?p>(2i5?7L~W`3_Z9zcf}iO-&fXpEbG+f>kNpqj*Kj;a@ui(J z+viX2&ppDRjbMUj*mM4=X9ASBwgZw0+xm0<KT`b(fAdxUx1OlxoZa#75>7w++~dFo zFLIJ=zdwgPoayS%N7b$`<<XzuZ9I2({2AxD!*9Ehe7e-*`Du06_#2eJFUwzf8Y7Eu zf1cDjTiWBt$d80`yBpUKYGOPVOdgLl!k~}91kbSN{7ZYZ^453YWx}@c7*KulyHx$( z?tHb(zcQ*>xI6xPp)WtKvk7eKMNV?<k4Nix3g>Y3&tq!WmK@{Z_s@>k-V$}xB=;F# zeD3+L0Y6=;b$*7C?iznTmcOsbU%J2FX5-<{r}5w28qHml#M_alJ=&Je7rGv=UDihY zZI{1$<WEPh{gV0f?^}mlKhuAHO#ehUcjp-Y+6#j57Y1VjCU}Nj^dF7A@-|iw%Y;2K z{;F>cSgP?hU$y&giDq56JN{cv$ISbmVz8;V*h#Ma@vr@N3g=nspU2g%`*MuG-#<34 zJ>WPjaGns({dtV*`oBJ`zlD~3c5uwyPk$Vq>C$?SuW`rUko@(^UwIlM8&^MWhg|>B zFaF&4sc`PiF|MO^lgG6|81yxm;2HK<k=A(notI0Qux(s7dUfY&9L?9fuU(|S)s>9v z@n8PWyJBo%)=iTSml)Tnr{6}UMWfO9e@11`XNajYD*I7U#b`9+#iJ3w&$afY)Jg6| z`eifr$LGecZL7|U^}I)tF14wy>B0Qjx2F|VIC+wjydQ*~@1=$1QpE||(L+b0c^~?1 z%xC!U6dx+oe7-c|HDlr8*k5sMwf}#`(<bxT;rJkRt5t-A50d+gu-p*i{;^CBneH<Z z-(=cheooIZj6FB%@p$^B_#Ja)2R)~#nEZeKld6$v9H>`$&}h{5nWy4c`M-Y~_fw{J zRQ)F@2bns}vfVrXsra?;q@?U13e%*%z;>f-3yl}x3mx0xBlO*if2G<{^SXoLHV<iR zX;aI=qtSM~nsiNEZBgA)#Z^s)zTw=KslQZ|F=1mqkv!}E6UX6kNn-U0mnYts7nXe6 zF>%#0S2V2ttX2%by|P>%FVox%t00?Bf)|0S_-fcv?}<P|}CwM_k`pTTD`BTtb^p z_$vL}wb!KCSl*=R7cF0XUEPx9Z(hCR&C4!Wxngx|-HNN1v@BcoS}G`+za*Fa|3c<t z?IEdk!$-&OT343ueB39yrT0D+zjDpTUe7;1f2IDbaB{wrtXt@L_9iTsDo)t8Y8{>G zT%N1C&NS}hUpv3ZDit8{i{$(kmix9vhfRGQ*c|wM%K1eyKaluEvTuatzTc%on%mlk z;_qJ`k+jF+WvXk-d~x?NM;sp{`vwv|NcN4e+_$ysT(Xcj9rJkl__TM<^rQ{>#_3Yo z6&k1AvMn^$cF1<B`$iZqw7t-=9eTFj>v8K;jN|r=VT~>QxKVpV$+MDugScu^-Ja); zMuX1AVhdZ+f$SUR6Un||>*6nzFIN7SjuY|5ys!iZvz;TZ>>KQD?TQb$FV$<R`-b5Z z!T~<{?g5$Bday{e?YO1OuDN#kvhqxIGZrj}A!3Xz&(ZrI^h1zF)t84$*W}g;iaC46 z)t(>AY1BCmy(H^zufwrDH;jSUc8dR*ZP;&vj?eGplR74W_4A>gKDy#U+dWq;FdEpj zw5Cd^SHE(_)qc5M=aPl2Rb3_f_dR~#wcVBFyH?dbdo<eA^;G;Sb{OELOEXm0^wjyI z`t>DFp5Y{GI(q&FVpuL!oUq*?tZ=Q$bUt1e_#Jb8k;e-QiC-jpTUahtobX#cQ*&AS z8~14AM<wmC_J-?Urh9|Z=S=R0KRG_g3gIH*gJf?D%cY8w`L%pDSxCGLcszY<{1$8d zMVD{9RLic=cv&OcLdP7gg^thC8G4r1Tbt~@<_{Vl`l4pWXtY_cCS4O7U8*}*u~Cs> zJ{-vYWImCMsjWSGlrL8P_l^@WLu^}ur`h(4EBh0BXoJQW?#0j3cvdI1!??0FmQo+5 z5DsAEyUwPwX@RfOpIv)RqJyL5O`1Mfo9%WcwxP~cQXzAx^vKkl_kF;%-j(G$m-=P5 zq4%lym22(o@ciTRZ|XPJUL<QTk~Ig(+8dTj6(?*PwFXXg9u}*vGmZQBY3CP7d?N9S zWbF;hecKkj&#_Hwd3;}yoC_w#ZK`v-GvKq&@j+I|84^B7*50t(=VRBoWFhfVJ1f<1 zK0f`w)|KTOFTJuWG+y?}w$L$$f1%?u>qxy<?B;rm<L(Xqs_~&O`n1l@IXYQ;iH&*G zec@=-?QE#yrvq7g%_ovEwYB9h%Cq+Fb)1NqaP2kQ8gXUqWq%k{EW&-QUQ=Cr4W|$e z^h3Dz=2}OC^%97<-~Ic6)QNUgd>i297sLk6W{<{lD{T$ZxcVzT|GPO&G3P8~*X&qM zqYi(=40)2|fWxu9DI8~Pr<%+*?3+R3)0f0rkx2o^HkLQ(^z_-~?^xBg>^k?Rnd=2? zTHG6H|LwE?hSL4}o&JH-pexIFJ!v{d^X~Ic#jj$A5%&wgK`K#QQ&Fc_eWu5LW65}u zXWd0|-yN1q6(?-@jD)>_Gx+-Q1lRmdb&cu@_#EQ+AZH5~2_Gc;QdllkoXoG~v&lmC zf%+Gu`pw72?>bkO@3?J~U7_O!heG?fewNPBHm8JR=jemg$F!$I>-Ju~nsm+hcByXv zOGcye46$_}Yq|ME#-CL>4$~xA%MWsS#{F33Ey2@lXOtytIs46!;tB3`(oJ<OH=IH^ zz$fqZDvixn_$nRh+G`RWZMD2f)9<&&xsx<DQ%!};ho%>0o(~&bS-$gOj@Fa<Z$A~k za;;<AJ^!@zS?V{|F(m64l63>gIu@2o6(?-V^<HMJ;)e6A+vkd`|E4;}mWq3Vn2gsE z@(Um2Y$xGEo^>oNmnu%?*Yeq9A>&r6d7KUtzxA#x-*M}ZU7_O!mqPov=O}#-#myUV zY#lpXeN1~Av?ulI)ue02cdhF796uV3I-9Vs4`dxPpGej*o2Q2<&pI~Uabn!Vb<Avs z#FaBCYi+mU3GTBvcU4QN6!Nt*mz5b#AsoO6*Rfn{(tc|XAWHD`&!v;jVDZUxl4e0{ z<m}cTt!KlMv!<zI`CRoIXVY=7jPnPDiz{O}jXFHji#%0wsjF-K6!sssQ%z<Y_EF2R z35O%)lR75B_4A=V)prY5EL~QwPj|!jr%gZkglasd!n=_5Vcu~`dqRBtu5)Git`A$P zMx%i_$@4TLXD0aIl~#;KrMEp5zc#vl%+$VZ9xv(~t^Vfy5hP=cWPL@l?uO-3#R*%u zu;z1atvflzhYC|&iyFk8`Xn%)FTe0X^7#l7K1kO4uw1G*WooaL`?8SnoUZlG$FOVs zR=cu%$8(MB3LQ867uv^rpRe~IT%3So>-|ycW7<>mQoV<&SCg(8-+8JVoirNtWr(c< zS?|p!a+dtr{GO>i>-{WAI5F-Ol9te!ZNIq2@BgYl*DIdjUVMVat2(JoT|e16hR(++ zgaa7)u4QR$;Hy;X+G`RW94&9s^l8?=|Jr-NWt#u+2oro8Tv@(zVnlY+AABl)<yy<u zd;alRroLnCK(dx0Sv!!dWnsBgal*Ehby2ay+12fXMd(RWooD4IruqZh7s)StkgR1$ z_#j!!!g8tNWPUB5O%}42ZTEQk*!V5cJV%%BxYf$8&~d|Gp?$pg7_DV)?to)!*$dUj zv}cC)rFOlVDAf4QQ{6J{og1A^*w+WLmYGi^Ynjc}W0Wse{soQ`<6Z$Dm*8Nwo#M(` z#(KM0;{^9Xy{5XB8BQS_ptIjvmSbH?v;F{6M4R?MyDqddns<7g&@G4!o$cHg=<l&4 z=TTF~a<=-8^J}kH#yNz-k~hY38g*W*Jd)3X%3WPs_ro#AcB;v2!+xqfCE;+Ad{W0G zxPCs=U$SE5bxT^Vedn^v+g4t?{LL{9>Z3njuUO$Q>^hgscTK2ReNZ&&_=nhVnRjZ^ zwtUxwa-CPl<|k|FzN-=p@WzC<sYB0L=(X7SMV~IUIp35~r&9g9z{y%CU+(0&Y09OF z6Sh}hfBDL*>y|Blb6fL-uBBDFpzqhdYBb`k&AE1Kb&B`e(?+ANmmd?qwppLVNc;a+ zsk)}c_bHAy@*<aqH~CkkDVHiv*si-)?;Cz1;nVl|6rXwG$k_4P;`n5GMx!_2bE@Nm zgbxxv$X7T?KU=vj<COGc&8oKj`cb-|9~-aM{egJVkM-B2c=wC<n$wPnUnRN*xHv}N z|Gzd@P6@tG6F+z%;f;hhlIN(xa;f5k?U1;z&%<Z&D^h%@VEwqy_0u6J)1>0l6FZ8) ztdd{&AmM|A50ZWi%cY7Fwo^@o%;z4Dr|$>9W3DXU`CNHM;q$gxwuR1}jk2}z$v4i2 zWm{;h(QoEA-?*6dBK@YWx2D>;g!PN>*lf}nWX9a&TtZCl(;n41Pw|;yJv@+eiTOkx zE#I~Wovb|T1$v9+i<P&8Zo*bvk5HboQ?=p;?#+5l^;|N6Qve6}<h$Rdvl)c1(iyJ3 zCehJW%bPU)g{vlZ>80Kh7u!&0Dk<MN%y)R!oRwN@d>?S#>dNw+!__aF`Wznf{Nr=3 z`i;E`S>xoHPM)2nT&g%>d-e6+hM_#V9&xcXVffI-cx(=eE%yI!jp~{f+p`=OBwUbi zL9*_K<x<57TawM|N{5?i-`pGceVOx%#4i%R$g`ZJkE~pmaWcP_&n63rl}#^C^^cE@ z-(gplZ>*GQJ(}t{EsT{$*%mss@Go?H_Pki1$+~$Cj;*`IEbDH$_WgBwHR+l&UYF|b zIalu&xmXX!=|I+9^NHlMGh0{ARK8ew^!OuI&X=@=&TKb|E9)+MLzTu6?!$Ubb=@_b zLO8%DTz7M=q3LXDUzx<_*{;1NsY_ceZ_@M^E?wTRV!^7bue}ycQa8EE{eQl5h<MxM zc!ub3tT;PqL%wrpP<G*a8{nl&P0j~p)OnTqi**&bz)9|B$#aGc%cY7FwpU->e8uu> zuh#uGzh|4$>v{c@TANu?lK89Dy_(J0t=3+v5XchMH5LBO5vNx=d7+c1JIQ%CESD-y z*iP5|md*Dr=Qq=O90h*Qb$*c-2n&f{B<pfmE>)adA1%0i;e{8bdMN3KmevXNL=RD) zdzpdPCHJ#?llK~m&~FfbJ7W$xe$4N5sYZ28k8QPhGR8>mXOWCCl70)zrHT`_T{U`6 z!`)vEUXb9TCs}{?IX;>0XSN4?7RWE-h+O0({Yjqw49lg8llirLHd)BrTz5{Y-+XNR z_PMfr=jOQV3Z0wtv}Y7LSK4H2<CAZ^Z;@@Gu|~g{-+bd@V7C6Ap|?KTzRDWJzS^$$ zNrv@m(ls$TOLeC!Cfl4%7#|0+ubNLJ&otY<F<*Js4fOaUR>OVOY{$iweU-g`hT;J3 z^A;$^s-;v4`PzGjR%SSbZ~!CRS99%=>1?{;tF+Ly*CaalTi&GU<9+p#CD$!$UAfG* z1IkEYyAy5t{|lMN_2*@t$Lm~KzVo<f;ne5xHqSq8U8KGvMv!$*@);2M^U{<{6(?-l z<#(!Uz<kwprg0yi@BAXKPyrIZ$Qmc%W#zhz6MieS?%O=hwSH_3{9fSvA}<#f62Hi5 zC-H0Lx{MQkb*8YWnb<PXx3v1|i7m5;vaRB3>(z8!16Is`X;PCbrwH3xapEk2e4UdE zoP=XoE>)bcU2~D1Q_|kXIcdu!iC^?2>$@@6H<|Xvv4GEo;(=czKX{I$?~v6_`sGr^ z$^2SAn=E8bZCsR!Egu`dJ6u`5bE@?G!sk?jYzv(i>t$=>lW%Mf$hOc}qu<PLzHza* zLcclZ)?#pMZ)6Q&Z|u}QIIdTdu8GMO)g8T9XE$dP#>b(m7wV+SnXoaRNIvtnwZBGr z_D1y7BW785Ecv#jwaMPd{#~i~fqR2=agfU(<QDFY2f_h9;og{QpG#-c3ty#+TzgHT zgTLiXnm*ne-7OM2QrO-^oBsbo=I_!AGtb{HSC;Smo%QOe&)*@>KW)8Oea2@g$n%_> z>*TyN<x<57+Yb4)xo`JE2f6Z4)T^%Pu)W0jMY8TA@r&f1BrKOIPS_S}y|?*mXWLBo zko|$*OPyaN_mD{ZBH2H}a;f5k-%k0pHOKCmGwpBHs_RUPu&oz9`v;Qu-I4f1a!(kR zOBE+<`z}*IYk#8t-YXJZ^d##CTR$`HZ-W7!*T^s9j->yQ^aBz<VYyUsGQXD3CJUJ# zQC+Ivd~E#oy0U!d$3EFj_1-U>A9J;K7aHTOvbFKaH%>Rpw$NCk-^_2manbcs{oPBq zo`Pfh8|wr6Tbs^TJM?POH8HtPbt@H<dz?)e9|y9(nNQ?Q`Lp%API=}#di)Wqua>lg z&TRLIEBAiv!6k|VxX-;*F;<<_4*7=ro8c6~0T1E+mTRv{XVV2=rORD=O`?Op<xQIY z%4I9Bz2+U4U%m3$*0xnBmBRKW+VubDJAe5ctEN8l{9WV9@}0jWubKM%?eYB6)+^O# zM>)wEiTtyj<o$%OT&g%>Yu|VDdk}rM_}H4T*V>er?e~AJ>Y5VU*E&AP<6Is-<caaH zT&g%>t9!EKOPM|)=_#wy9$|Anay~Qdi8}&LjgAwtLRd&RA^DxIuw1G*;kTu=VVNEV z*)PV1*t6X8Go`x5pg6YL|GySjP6?Q=lV8RRIonD2kf)Era;f5kt@>y`Lg;xfm-|Ha zwxa(@_@F0Qzio0nGVP(WE}uM>uXj9=#|j4tPbB>omP-{U^K1ERvXD90@A34pW4{ea z8}gll^JO>HJv5wy?XtC4$alVMm933WzHvR~`OP;5={NJ6Z(OW7QQsAJYc@ExhhCw$ zU=Qulep!BHvWF6r&8j<Zu|98bHeq}m$R27wk+bC6_J{`MnUCo4N360QSwd&F^Tm}t zlzqNlu?6>by{5W{8crb`;1lklx%R_!HpB2$TI||u5*=-|yh+nvu*^N_HhGDQZKyMq zl<yoS?mAwZT5EhCaNXw0@}9$uQ=h{{s%w7nd6oK&=j@T(Cm>(y<Vk7DrHT`_TZLuw zKi9J#?SbDW=NEaFu#osgRyqkUE7xV5@Y|p@-{$bZFTWVKC)1ud7WiG_{36*ikoZN; zaT32)uFE*#S9{Q;XhElEPxsp+N7$3xvys)h2B4V#(xmmSoFeevBp&!j!Vd{Q<jHBu zrHT`_Jg3V&CHJH5IqD+xB<rtA=P%P<SpNFS@o}~M!UxG`nMn8`>94R{syLZn%V(2? z%%kldPahk<C2vUDkncRImEBbL!f+l%vMqEj^vTx7C*OD;mu;c3M!%WgeB+{|Qh!In zt-avbUie1E1$*H(?R%9vk2UF<nB1(o>z3&=MYqO<@o}i?g*vHnCTz?n^7+c!TK_-F zvo4^g9<j=MUzU8^T5)ABWWQdl*n)e+d9pgG9dZlrCl7=J9>Tpa*S=PF>B0qdi>|t4 z!NrTNy5jOhmt9q}===p&)HNh*lfJa?Ze*%ke#sSed|pPPeIpvv9@-qF7WLcV(zU!X zRmQoSYVH||Y1BD|I+8qVu*2b4KZX5=?Nk%Cej6^l<jMt?UAW*9Yb@pI+B#9MyzW@e z@g(X-r|gV2d2NXc^xt)^oefu|+R2(qx%=+JH0sb!WR+yU!+9p!dHL%uZ&-Bk<dMzP z*2#6%;Mwh`ta`_)Q}h$5OIEkEozk*`pUO^p0gUof^>=l=c1jhe<*pAJn^JwiGcy!+ z{X3S^s6!th7fEh)IR9Vu0lvcd(C_%P$|w9yQrFLidY$u<d+Q6AU$bISJJsX*_8tJA zdd5npx9eQ8kUeYNl2o7i`0(#@W%=$|^>0e;JNsN8ftN0gd;Y1@roKGd$=Oam$4Txf z!g8tNgl+F%^u6b|Bxem57jeH1i%-!xPsOj+H~c1!n}eKPC_1R?5}2#Shxcxf@Ivxk zOC<N*VYyUs!gkKPbg%W+<b8nc?@4gcw_csvAEz%)_+&aOmZ@%nn8e82<(IP#l6Xh* z`-I2}C;f7%;)Gwg@ZBlSa3jl8e5hc1?mpK)#VFIH%>ke5<(Kh6GCoN92U+5zUoKUg z;4{@!NL)89P4%1a2frI!S-x?-U3PY!$~UfO=$uh#4A#lk&Qtlu3vDlSY|E<j_v5@Z z*UnR`G`95PtZT$euO?j+SDmU`rns8n=5#p52XdY=pGfANt*LKQp1HG95`XPZ>M~B~ z%yxsga-QPMH_9ATe!E^%Jx>`<Asir+@BWd_X8xO#xPGT=r%CG4R?C|-z4n}i+H99E zU9!^KbrKuuOeGaE4@Vu}5Ff7P%}HDGorfD_H`RH#*!jReKHsB$V;x7%c9QjpJnL6j zE>)bcouThbmR9TcQ1t3<%f63n5B$DY`1Bu=`vD~DBohB&xm0n&Z@2tfd#fKzzR!|r zzo=7PXIg~qTH(`PB>Myse@NOJmP-{UY&U5yZ9Xm8FUoIEaM4#uUvlnK@vCNa(hr&T ziyZ-<_sQ>(!a$ZfNk5RMf5LL9;)LIM+MDb4jz-+`xBn}}r%!xreH?LoGQF43qPhuU z5)U`XFZ(6(R43^t@)b_{<x<57KJ&k-`$x5p{j}-s6rXzSv*DV{+Ltbk2YlWyzl;x( z@j=o*NcPjPT&g(1r(gZUcVlBdZ%^@|Lh~Wdi+DAC<_&TC4~wn#|F1*bO$%luzr-t& z-<&|Q{v!F@BrKOIPS{R06|$~Wx1@Obe(>Aw%JN-Tw#v@tS+4y(Tvx_qTj<(Qd0onH zzVo|TwuR2cjj}Ct-VDpO&=_aD3XR7-XY7m`ygkLvB=1%{GWMG|f2>H(B+P~Bs=Hye zzW?fM!niz;Gl}^`a*tqp?z@y{eO}`@eZWbn;sgh?trS<zB%GW2HTU4&tk+b}B!*K6 z2grnHl3eGDbT)(VRa)oTX%Zc6wY*8w>rB#c?RCreIf^B1-hD9TQ%Qxa8||%`*NrW% zEZ=ow&f8M+H`ltc$Ma9$bg0kRpOLejWc?@4`X81{6(?-F<u`n9IMaRYQq^^)@tAy6 z`1BtV|48;3B>uy4sp5p+(v|w{nCq^HUwb~6?Ejh0BRc}W9}|ALFp$SPi9hn}FG%)Z zE7xV5@Vj1qZGG;zHT$`vL3N#J5w<r8mv$oYgTybAeh$l}iW9ceSEbg;>dz;BGo3F6 z0>A5p&-np)s*|*je1(&Kxm0n&FUi)}D(5%TIif}!6N_ZdeO&mo4@vuwj4zUNL|86W zoXoG~v&ll{-#(A0kB#4|wxkXD&c7DfSzP2h|2E0C&^a_B+d}6-x%MREoNp{ImaXmE z`NkuCUT93Uou%(UyR{x1+j~Evm}2}Ybmr{Pt4Y_q*VLuDCA{zD*1Ryb4rK2&pGeN5 zwzu4<JZsU19j8w?DOH@{V78mYmA#kq!CJ*7+(-19>fUQOg>ZmOxcBDTN7LEVU7yUE zPS;M8)TOPKH)(q9y){eP{=0kcUdI&<eu8IZdtq~bqwH)R<(m7=&Ii8nxj}u#o`9U~ zBx@#l*37V6syJa=_KvBq8^eL$&j_Ej6N!H$Ycmr6VYyUs!f&Vi+M3h&t?YYmqv|@- zB5ZFFez}wEz2xzSWKTr0Hz6svgl)+?Q~jK4y&4SsepYz26Nw)rev$NZST0qZ@Y^N7 zw$?TGWZ!#hRo9so#kRs{Z|#yi)k)e%p1l|8mrE5VZ24WRw)ZFZ((^u@;G(bAd-}G1 zHab3;_T-^}&*$Wib|Yywl5t0}Cx_)y#R<PHt@id^N(Vpg`Cleg`G-;*sbO<smiUs- zbicpGl~V^lw~7m6g`}^La7My8ESD-y*iJPSa&D+vlNwv!4}P0nS-$6njk2?T%6IJ; zmhDu}4dMJRdw1b;xKXyoIp2BMDceHl(x7Y$jeEw+IOiLWE%SCpOTB%=&Kx%@9vS-$ zoG;#+oH>{arK;QbLABG_gmHNwXAbj;<ji4v>Zg?F%<*Z*>GMuX6(=~DZJD@o=HOh^ z!`xH8QLm|<ISi)|4v-1Y9J$U9>1_JotMmoePLt?ptL06ao-@bll}p;LU9tSXde7go zHsK2oKf!gQE6aE7D0^RO9_Cs*hCToIyj}gq8jGCmBx@{r*4VIIsyJcWDZf))cN$gK zna1PtCE>I7BJq!8|3TtEESD-y_$|31wPtnPmHpf?82J6N@XLjPJkd$~k>@;sWUsMu zUB(H&k^C<H?lJMJ^zOuOu`3Tnt?HT%+fBlyKanqXlJ=74Gl;NUsyJagE-YKKY@I#C zm4~7)@Oy{w>0c!6L(*O(e8O_6;)LH0?di5g*KSGLo9TQpPj#JX5w>3u{z*>0%*o@N z<hjVOT&g%>8|kdV^9tB?e=Na8PqKA?uH%#GEYTnE`KoI-lFxdO^gojGPFOBgoXoG~ zv&llv5^JJVzxmks-RjEnT@S`&XYrEndQka+!sm3eZ0&v^-+8%FwuR2EVcA-H^PL}M z?9c95<a}eC@hUVP=bybZ8ghFVIChrUsCZ=TN5rd6=jbL~GZ#8kcj%+~dsWURjLQQ# zOPEh2-!rnk@;2o;OMKCB+U%rMae{-{Hj67~3C=skia)q-<UXJ}u38lGwP)cd^>GT} z07iJ0$aOAAXH&8+nTvP1cABIv94&9s^g2siviiC=En7M1B$3!qXDX?XwWG)J4e{YR z=F0M2JDP7y&81vxN2ThTZ+zaPeq*me&UTW$hCF*sST0qZupJiGRL>F{1HWGvKK+Np zKa#Z_iT|)%syN}d@x!V1+UL>4e7aPox~9i=tMJ*ok?bi*{378KmP-{UYzKuk^rPRz zFI%&UU3n-v1Ha!8ez__kPjHfUl4p-ca)z;TUB(H&wI4~XcZ1(c_Vi3=i4xUyrbXC( zQ@HHiNPfQ!IorvXrYV;yPS}!ct?YGvGo2-(!0)%@hxQ>EUnKpEWbY2krHYgJwR|>N z$o!kvk?J2G8^5itEZ_OJS$4LU<vagIWn1VRs?gqIe)F9NO|mUCmb+wY`)|JSNS_xP zQ`=s(Gpg{`PuqXLrkG;<mg?L&pjVTwd2ee-ds*wJ^t;f`CXB5E*?-L^lF#mKf4N(E z)}k$rQ;(BU#R(2(J1Va1znl^JG=Jb;ag*Y+I<8t2@(uT2!zqLV9>V=M*It^=rUSl8 z_qleOL<fJ%n>4-l--WAJu3WbK>UT`qfx|XaKT|4b{;$t6|6N(W^M6!!HV<>n|IMC% z+WLU{jr9>Z+ey|<^6bB1xm0n&w&~+jUpp#P*O|uS@@?VMe@OfzS)Y;k56h*B6Mlz; zW$n$i?sNry`-IQ_i)8;r;ui^@uw1G*;kRDzsc#$kP5jEW|ISifXIg~qcZ7eele~vO zo^~SHcagKba$Uv=+hJkZde^ff`~KSz_<c~gCkX@jGAFsGCeOYcmP-{U{POH1_tn@< z|7_A8^dwtDH#$C<_T{oqPVR??<d=3M>3<~sk7QpC%cY8w`L%pDS;)K`^mzK%_?_OF zv?1SlStC1((|qUUTG>u@Uk>M1uje=4`LR#7g~s???RAC5DScjOOx0EIj5fM`036$w z|5q`^_>GI#Qhf&2q-)~2QFW_t(VpjQ!q_^Hec5~>xi7YT=YHkcmwO$jZB9xRCpehx zT5)Ax=Iqd@xP*HzpW#)<Rf|Ht;l6A*g>b+_xG(40W7FAG+?>pr@49xHq%Qm|Z_@PI zm#<j0Y-LUI6}#kXX5shAuD0KH@e0B|0WVW3WPKQO?FljQJ7+^->qEEfY`)}LAC@{F z_{Zn>)vv7I$TOXs?c__-luH#S>nEFQO|D%BS%pCE2>kv){#d_}FL09en>_1xST0qZ z%&+CM$wJ0w{b!Of2yyY-@5=IBzl*g-6goceD724vEZ7;%_u|dgv+t>oY0rRo&DDO~ zq-#FsAJf{f?^gZJh_ea%`asq*^ND1?w)y&q@~mh5#>q*k;sgh?tru6;GuGTvjRo90 zI8Ri^Rf|Ht;d*8`g>b+_xSr)&o6_0rg|E^NT{}&pgTLiXnqKQ!^2ew%tY~4|vCEVS znHQV7GS7=)SC;R*X#CvN=S7+7T6<{gW9mQFEhOs}a<-GKTVc6Wak74z>YVBf{Qg*e zShtX@TS(R|B<ogKE>)b&ujRAJLdK_7^EMqOe%HFPe8;C(c2ixq!tsGip?zGlaA#EF z#ha~LKT;plp6K)X?L)nqbj`g*pXOBKM*aO3XA}1Ifvj8R6UlhnynIx7)~!LuX}gnB z#R(2(JH0zuw^&;T6;E)lk#4H%mf;k_0W#sbm1_-3XR{f;N{_pCnnXuiEpO8Fd_GZk zxqcOKm7aF^FMPLw-$QKpLgu;9;mY!z3&pqTyRz3l6~AV@aZcP9VVu!sQorY)I!~(4 zh#ll?C!g&kdtq2ERh+P0BfsIjU#2rwwdy+4cuamKfBan}WQCKw$48#;vW4YR#mU;$ zyy~fl*T##li*bqfbg3usyF>Wps)%H5M$%p+&mV;4QpL&qT0Wc1ca0=2TE3X-A0HdP z8(mqxaWO2rLgS)LYgVCS3;#mLXK&5UXq%hQ;Mn^5Q;iROF(O`dw<qf>-|K8w-3@o? zcU+xKI8Fz$zM4-Y&yv~t@r3fl$`3hCKX+29IKjbeo5eN${8zm9Di-0sQLm}4uZB|y z2gro$Yp%62olVJ?lGyyEYo|%-(pJlxH2uOA*R?KL>HfO$e_?%PPv7de!og4Q+~dmf zokvT*y#HJX<IH@`QC+*H&Qt0$-up$)c9Jt1dER>t%cY7FwtIzT?~lztDS1yc)B4&S z_#F{G>kyK47Rgx<iT|)%syN}dWs`n)>nq87qSZf4+Jiol-qwV@kG?kRx?82X31Si> zzmeYxDUg*;mN|K>lYY5Wal-Gouy&|@%;oaOQha9Jk$T>>-}O&%Vz%G^eF2}}x_&@1 zK1lip$yqrpH$eDocwB$SL3r_d#!sgBY!n~spQ;}v{gdf4<a*WhF?Y%@?MKo-Ncsm! z|AggI#R)!T8mm29lm6-ZZHmua>Fu05aB>nq^kKR*9Pk;HU*ZHw{~+lfB>fYXOBE;h zH15{Dukh%f`roJcY!jcY%b$v0wr?MnnC<s}tLmB(%w6)!X9!3>V@JXd$!Ggvxm0n& zme^VIjf79l_fvctzN+sJ9QwTYW#8$Z?(Fsxs%tthcgru|tw(ZhK*9&fd!k{vRB^%< zF8po-{j=lV6dx+ITz^5tYsSLGu|Ix4EnQk4@cEtNgXBDigbxxvVYy+#XR0aRa}BXq zvpLmozMr@sTv@*BagXe5p5=N^F<g)L%C^uowd&54-+b4<7TMZd%y+HY<oV5aT^aHG z=DP-z>s(dnd|fQtLgyB7Qs_KrsMYfe-WkBokH6MDAm%FW*4m_3ldhSALpqDi(j1)c zY{L0)Am>N(iRAof=c8fexnKE}<Fv;~sp13&v)v@FoF6&k4rtE9eMGORo*xaT5Dt(D z&yTszg6VAPwj^u7A6z?4QkS+`-lXZzzjpaj-JmCbcKg3{e%$N0!og4Qto&Nij(pdv zjk25Sde!WF;2WQRR-du|B4<0vx=x<+V^}U#oUkpsC$-i!yfXXwaX9e%7vZzsBad^E z{hvJk!*Z$Ogx^m2we}XBo%qdkf8MCN&a?>Iy~3|>@^mLT2chR26qZXBCu~c;o?2t~ zxb_yi@=y#0e*fy)g`~fcv=_;FCoDHS{6_L??Jb+1v^UeauU2(^+rJ5){zabVB!8EJ z{A?%va;f5k-*K<K)1BW;=exeZ@6*C(9Fd%3khB*`d&6?6;)LHeoi)q;{oMG~@T#P} zna*+ZRM(jnVY|=yLvn6IvNj?)r-bEF#R=PDotwh_DARduOW^nK!sq;m<ot-F{YZF( z<x<57zno<`^K)L?{#4Q)^qt}p?s1vUYt^b71L{9){~^EhJCgGw5<W=!AuN|FPS|p9 z#_w9er|qE>A1Z|VCS#f|4F-Jv>G&WyKO*6Sgily*nDCiuD&+haeKXZ>z90Pdy0U!N z<9)KT`I_te7_P^2zg75}+A3S~oA0`~S+;h5%y(@Y_59|$K2`Lj{N}sHG|9Hmb)rkQ zh0gUM*%mr4iLpZG(D+6A9;|nMu(Ri%G>3@SZk;oy-<O;{nZKo~yZJ%gn>w3tE*;3( z(|jUXU+rx5N9Eaz#~i0|C#8xL9L%;tTseDkJ}%LmiMdNR)w8GJ6v6>A;n_3SIWnD1 zKYW$`<JxHw9c{I|Nz>OYym(3Lq?2b-pYo}sLe{$0`!la~n_OAGYh8J7YR$>D){S`n z>6?SUlbnT+vt6D&fjno=uw1G*VY@+o?LK?PMadcAAXgrW#j0yMY>S0Y{~>wr63IS> z#D7>WRh+P$@xQ6|Zgze%ojtb)eh(2o?L_kVJre&&&JJO@RB^)ZI{CHrxy$)2cIBa{ zQ(e<xd#Lbf7m~deNqdo;#lmu_;)HF{1F6r!`|7fvJ+}pZ4-@`N1%W)(N!m%i!b!he zsyN}dU4E^-Tb$oaXV3Yn>rCT0H(mI&7fBo;X)luYhUHSl3BO~)3ipLfXV0yH-@}DZ z`;eRgk?=rr1`NxkiW7dDzrFvSlIiSOsk+WIZtt^%&sh)2Sr3U{B;y^HOBJVhe03G> zN14u;8w0;bIKN2FbV&Rn@f(&)6({p+`E0U~b*`~5)jvKqe%HIQeAl@F+1c4D-*s;K zcM4ytYGiAE^IdP&%GTykzH3IWZ0-4%eCPc>&u_kScdpJWh0ecL*@ow`sm>wdq|kY= z_)`5wx;qDeW9PDiG!KZmdAf({)~iX^yf@#ex@*3t=M9}rI3Et=TxLFzJa;g0?ogh6 zYMSFz;-pk@f`i%iiYw<b&W^*H^Kjp%*Hq7ChEoU!$b{#zTxYCwHci`-HQ+g}ohGSE zTP<(W^pieQzI5f%YnLx+p^OxcQ=(1(e<ADEjE6I?TeYq%-*u}`cD8=lX9}6x5qbWp zbENu?@A)8E-;wO2NZJ>cOBE+<=Y2P|_SokUna*e9f!~?VFA~2<{36-E!*Z$Ogx@Xl zYwfkqGBTad+Emw>#$!9n`9<OviC-k`4a<GoIgg~;YoCJ@TZKUG3H%=A{37v-#4nQe zhUErl<H++pyqXqeKc6iXN8k2n=NHL)ph)~8Sv$gV-`1{k$wKBqX@82Rk57B+U0J^K zphI>R7x~VEe%abSnr|!@Yn?a0`Nm_lY|U@JF-5->8W&x!*%`IF^%ET1&z`5aU<{_~ zGwxQsnsm*3g_Ww?{(pK8)7e;DsyI#uvY(kxBxiYBub-<t^LmEk^n521kI7nXwjJWi ze#V~LtvLYqe!Zr;pBYXe9N-h~XSw#KbT(B#Nan;buAL^SOMhG5r0FkQb>)(lYnSf# zC7^JOsGlk2JBNw89gc5^iQicRNn7%r!(iE5%5?^>cRsMe=Zn;D>}5#q#gMFZNZJ>c zOBJVQx}S<QZ_Jl3@jKs@{Wtrm_p+T)tv7Zy_si5za4OdGS}l4t>6+(W#x;+sf2!}- zIh(M*4rK0|PbAOoT5P{SdG^*9I!-TkQmQz?!ED!wD|4UqsY5XV_icJjb?zHZAsiqR z&i!2T7@Mi2OmouC9L2$#CF>teA7}WYzw}odFTCXZORrjV$rTsZUv}xjMU9IZjYl}9 zrcWm`@v^$pf;UrGE2a;o=Z4>ESC;P_=#ib>zfSnJi$JdN{NuA+@x*7P$hm3qf%!xh z+o~U>{sxE@WIFfmP2-opYlGjjo%HjD7fSqYlHahsna;f}s%se5-gBhD??Na2ywwdQ zwj{f6PI6i!>>`jOY5bnAI{3ZFNk1Q$Ph|1idHK$$)r)Ccr@-Pp)&9qlHWH6KONnvo z&r|ItPnyO7+e`bjHf)e>pQp1+Yp>-^`roxP9n$(1KJcn^()74S&wFObI!R0BD_lS3 z{WxjEv8qoUli2zBP`_yT>g(*+gOfl0<sNu(cC9Lm^{Q9Da>dn)+9#KTKb2I_{NKL+ zxZsQSRJ*dg=fCWDmX}wn>oe=qupMhW|I~S@`j+=`k-U$K<g9??>=2eq6(?+~ev&%x z+ZiR}{15z|Abg$;LC$uP*dWi@7wMNv6({^|lHc%e4`rPHs_RVSKAt07#tq4LW015L ziT|)%syN}d{P9$K?HSjM^FQ!=qVQ=ClKw{G4@rB&a;f5k-!1YR{>`II&%`WNU1u7% z_axzS7DVzLBqZ%c(hp&|RB^&D&q4FNINPhOC+JDG4%)M|!4{lU(*Jt`J}1jB=Nlyb zfrJl|&sM{7sp4dQEuT#mGB3NINcEeKjo%?xmhZfrHB|V#te0(g{-5gH>X2=r^P}JM zn{SL4>ug+ToYLoo#?;sqJEMBH?tx?b<ME0q#&1Bp=02I6<B8{D)h&5yG+Liwtt6K7 zi8p+burZ%V=C$oj$0^TRQQ<gMIw@70eA{|)<s8qw#vH{S+&lCts!r8Su9E-#J=w=8 zgae5A?!!KpY}c9QrLCdiIll2{>E|RqXlKoWhDGOJ-0=U)Iest$H+W6ok?_uUy;v)| z@LUUCx>VzQP)40o6;GVwk(}ehyi{ouw)=!->xEUywAS>d@yod#f1Klye%|mxY3;H( zZ{?Zx@wwi4*4oRt9e<qTk$&FrLWynvl{=$(-uT&i0S4#S(qAOwN4)Z^A{h2vAg(Qi z=jlGp(NXd2vkIQH_Ij%L(x1D2nY9r<@Zvm;G(G2O@|+=%HIkOhS2&N?xpq}K9Fy2# zV|kON=RBSI<2kD)j?37zw8kaZwNWWJOdAhya-~dbgW09Kmu~oF`t<?79j+|jIaoZb zGqlE#SFh`@Ozr6R{8MMH`jxXC@=PZ=+mPoh9hOTKCv4Zq?^O5uYSne7@wlBOe9ltH z*-jD{<k^G5a;f5k-@U@JXN$J2Ixoh}GzWVEzb_L$<A%gPlJ+9;AC^lMC;XCZ?%Nr% zI8pESf7P!hxA*13=M0I&FA~2<&X8fbRB<xDmd_>&iN_I-r;m-_vR@}{$TuDvWmjlC zcFMNUm>QIAp>aXm3mx0e#+^~On|I*Y+I*(QmVVrzb6e3!a+c%%q(ODp?a_ByGtAWk zIm?+(B+vNRx_G+s#OfK2(>y1oiW5A|woF_(%W>XpAwHCE)N86|Im0Q017z~u1F)G& z$}~T04u@yC^4}!!pAMV;YPj&?;4GKaq-?4w6DPAzw}))Vzze^Ft}Nd<Tl?FopW{kY zcY>cTUa43*#Yx_e3G-Grl-5r+@2ou2IW9`$_blh{l}`G3!wV&TTVA&_D)#!(<}BPf zzclYm+Q|6u{SPp<j-}d7o)n&^Iy6t_$+j;po&2A*cd}N`04aq!^3*pz$dg>&^qi;A zvu`0e%UUvD;anPW?V7Lp)G>*jpAYpMl~R8QSm!C{2%DDHxWqqC#iho<Rn002nFrmY z`;P}s@H^zn@|_3uyEJx+GhQVQBU3wOsjfAOI@Rh^&P+(|Ymn^mNWRk*mP-{UY=?z4 z)qSrc@Vh|xoGFmAog^m6bCwFrrHT`N>-K7G-|fB||8&wG^sUlObuTSb-2^e|`}5?N z@kGK4Nk1Ur6_!gCC;axSZTy}Ad!WrX^dws+a-F?42YeRFFJ~_#e30-#a`p<#rHYgJ zwR|>NNc=YaF4b>7Hhwp_vV7xryX*>$-x)fS6dHqdvMn@T{vU7W17Brw)%|3fwy9#5 z)>NskZMvnEwy~uxc2UtLOJJd!g$UVQ+C~YxNf$IrB7{OKD(Y2HQE9~%-=d<TqM}7b zMMaH@ii(Pgii(Q9yaskr(W0WFeShDXb8;t>=W_3TlJ0yyH|Lpi&YZt9XXbhCpWu7h z+%A9jROP1CG~{?4f4g!^96SC|`<h-ux@KM-6Yt)C*E6abYkMwdFV_iVzIhG(LiO9! z|01)g*Pu|LVW*EhEL%ByaX!4Jd5rBB^=kC&<#Ni{fHBSP7mR77)mk6Kg_fVaj{H;c z+JKjM^{v-C;;WL!Xb{w(HQH*~<l~FZULF5jY*(<!Xw9zKvl`dvGqnAQesr$ZT;e$k z@XZB%_a%pnU7_=guUV(pI(xMwXCK$gGduJyH<<QaUJe;c^YtEk`Yw@QWN=S`Ud}n_ z?KYV9v*FWS^e!Bns_aYVmDdVnapoKRmzZ1T1$!cc_qALPkZW)GnXg?kyEJyv84~FJ zCa7?Ew=<vH1LSw~fgW?teDv8zfjvQ5{NuXvHGJOuT4Qn?GKw+Ycj$P|eDQ}}<Hytd z)W?|7@rbKFLSxh?e*GQ#*V^mvywRFnf4v{mcN#R$!g<4Fcr2q=)xYiH^&UKZiYcGX z1#%Ar<ZJ=tv%)!DsL&XDQL=pf`E#sV>u+DC_Yuiwo&q`30MQF%Zsc^KLPPJZ*6Wq! zPh6{P)b*y1M}NQ%>n!N&($846*5yL+27&s+*mcs&o(IGpAoc(`W94+ALSyWrFVp8e zb?$qct|#wQ?SUcxzDOI$f_5~sXT9|Doh#rg3=$XmJQvC7LWPDsjkYrT$H2c;<Cf|{ z?*XGVJAcn<T-o{Crn6AlIoPeSW#<dNm(A_vFPW-bwVH+;uj3CZx5Tks_c7yo4e6SB zby&Q&|6BJJHP-fA&U~&D$h`6zx>kMW>O0J)euF}VhMhk4fNbT=$GP;f<}tRP(<^Ln z!sl}`-8)h_Wo*EhX7`JtF-vd9dHtCA=@4FQ^u9yKZy4D*Hu~O?!p}dCj`PnC2F8qs zA+ur;kTw1^yFU3W|1I+)7l{vD{~3L3c6}bxIKQtNHu-r@UEfyIK_8xXDW2>rK+ZY9 z*BE?50bQuj7<=D;RnL|6KI?QP)BA4I3*>wUL@)652C>WOx(v<z^6y3X|6ZuIk8F~S z>DWQj3;aA0fanE&wn6kdU6-M`Uhm%xmYEj|R6mMjqPN#*&CZK`8dr8+oY7dnXJ|IJ z_)#`Lr#9>J=gAuJ+WSuBhgej!f8Wq+NY^}Dx}!SQ{^9GDy*1|jTxzfD1akK9+VZ&i z%(qQu)0Y?&Dm3i$vF-m8YcKo5A<ac>?-j1m+Us)4*nly4?X6cwN6Z(_Zr4`-MVOQL z)BnHMDqkkrs9xW%{_-97Ow)F6+y3O(_BU=7IyCrKe*U1|`F?80mZv*cZyO!i*|}uT z^0&Qi@R4m#?ikxS_MVB(jlB==9DH2Az&5sf=iqxEc;lOU1|?>6*YL<-k-SO8jMoXh zo|X+i`kQe+n97#Q)*BV>U8eN9_MNZ%hQ|aC|L7~f0Xp`yiJp#ID1V%``SG>uR<2*S znLZ8vR}YW8XWRCXPN#K3P=nU-#8hR}#s{SR`Fh#KcjxaUG|s`0FTXh4=e5GaTmteL z#C^u=doJ?JHpZ^Z27|kQ<^2K6^&XwanY;U?pZ>8Vj`SOCwQAgzr{lax<#5lzi?&?) z@xM*4zU1COIe%(+TXha8i<L#XH@^IF;`WSQ)qG>;9Ou^zUC7(Ka{c-Zy}D4Ne?mDP zPwvgV4t<B>hVQ3!kF(&O>y>_8bH5|d(y#uB=f!LKv{r6X)ZBlrZzpo;dn<~65zhI6 z*u!UbKWO<hbty~3*FFau8Ibzp{MhR80dju?WKDSAd2`6v<%-`K-G@@M{kcf)KQ{Vz z`k^Ih3wgVs_>&K0kPm@?Uo<>bSz>)~o=@V&dbn*ga*G}CT+4C^E`K(Io#(_q2{CKA z?M|*0XZYP7;0x6!Zs0wBIo)N}(&h9N)>^x5#*{xR^<1Pf{Mz*{Q>=XMf$L8aLx11} zdM2Pakr$6E_#?{8WD@5zFWj>nY>T;A*wWrYZiQ;OVmPk7<$1xLA@NN*Ljv9A1Qjmp z<pq0)Kk+Nd3;sJj2-F{RZQl4uPha2W4XaiT1T?tLk*Ui0#1HrTkjY=9c#Y~seIa%X zyeZh%9<S-ss4w8t^|<NzGkGFsw8gI-){2GGv4`hR-)-~IbL{kHV6FHT$w>WiI<|Uz zfIR;KQeV99yg6j-CB=z3#2oZFl>3j3X?^J%dC!E)f_GqSJaoC<u<fa>PNe_f*u=!x z(}5iFo~1qDCX_$&i4EipZpL;!rT<G|eQ-V>h&%P^@Czd^a}Ph@IUrg6``H_-Enf%t zxm9B)t1Q!3=q+ls@&v!z1LV9#+`)VNbGpl~rOW9l#K)r6X2`rgc`l2_xZaD3fzMrV z{aJDX-zQ(M5L<FXY>@~4q;fNqth+Qf*t+aRo}2a-^2@jbhU3~>o*Qgx6W^pWB+%_n zP~oy(Zm@?O_}V~Dnj4;#Iz0%~A9yxDyy~5sS3S0B-2ioJ`Y04=%eLw)l=$QRe?)rF zclML6R~9LD{Rk8UELfm<_bKt3KCS31)TXhKI`eOl|3$cT6!zRN#1Gk=^n9m0jb7J^ zbJ6%(waViI?9@OYwaWWNvcTczEya<!6y~DEKKCCR(^~b!!z1tO9oxO#<-)&v!^rr^ zmWh>PyS96&3i5Y9wr$76t}UY)vT|&ABn%1shTr()mhIC7QK3D$ecO}bUAcA3j%og$ zolkDtHjRmV!@F0GZJ*dNhVYFOTPC9PNUJf;g8akG7x|6P%pa7X_w<)dRW8}Q0_XFO zJX0G_880;A20WR~J#hK@V~ticb`oON&|B1M%?tS59w7I2<Qcr@JEyz+TDqK`Le^VR zYcphC8;k0Yk9WN{6$4)@;QDJM3EG}}b-uP7d5poY`0}aB-X!K}j(ERjQ@sDxReMXw zv#u7rV)ok4bA)Y6G<H(_d2{=7e7ziD54m`)U{Q{^Z*jWIM%RY553L#4+|xI(xqri| zjT=|>8WEa5FPO#CxpdFcrAyzO%9&KG4o%0yDJ?BOE}N(iD->hL5^t_AM%W4upQi_| z7CdQk+~-;`K}NmC*ztweE98gojo34bFo*kAtuAss(A@W&C%VojHsd-T8l9>fOneIj z{W)QNFOzP^VF%Y2B5Z{Rzk#cOCTG6<9(~F63bDp-i*@iV=5yu1hQ66epPloRCwjh2 zvS=YEPfu0$C;mlBOUqA~?@OiMaoEE3`3PI#!FS+8g2znGeEGihrPnLO8{aM7)tskp ziB3y>4>?bHqU$`;4-MX<^1YJyXQY;&G~c_V-*MQ&^<;#t@ZdX;`F_;o%$M(jpQ`&T z$;5YyckplHnzfqnwb%I!dhq$pOC=&SeD2;pRoR#LWu%smn$Mlm>o{!S`b31S@ZdA> zLBYc&XTE%1)1kAOWa6{MIryxf{?Nys9^Sluod{}ao~yLr>|5Mfc&^CTiNv2USbt8M zuM4Elap>myXoRis;4834aKFi!FJD)@?0SXx;;Y3s=6B_W^?iLa+@0a?#*`jhUgj<b zzI|i5CrJE~_|SgJd~T6m$6*842O?~R2cLnxf_qHPeEGcO)2>&DGd^3KgUu^@`ZuN? zr}<52!Q18LEj*p$Q<Z_lAE83~Y4i0)LPIyiy%Dy;gRem5@>b)WFJBjZ`t=I&#aD}O z@O9O?H9hNAuIlB!Mx@YEe^WXRzj<kN7@kS_+iiZ>&;WkM{Jose&<}Au!d7_j7x;yO zn~Zn9{9Uj}=OM|&UyE_@SO3RmbMJ#IH?CaMvq7ZLQh!r=NH88JJ`a7xRAs68;^Tp* z%;yUU4I7}1M%W4uJ_Fw&xW;(r%jfo&>;6(Q@!8@$?Q>6GzY_iEBda#7T`6*Cx!);I z^c~l$`EJ{x|LJ5txeVaXn(yZm8n!?iim(+Pd<Q-v*loP?<@+7!A>R0I@t*em;huq> zhkMrbh!k4xx6`A~Z<*oqarxY7zW8|H&zaAY2@M;d4SYs`t?=M8aIN5SqtBPmH>HO- z<Fmzi+UGTEH}pJo7oVLTeO@-h=f0g&m5%6xBv;$do6n~b8aBYu`<c;ac<>pB&s|2J zFQ2bS4{^q4i}SS48`eM4V_R~-`FWc)9caPX;OmS%>Zbf{kM>JywVgJ9k0mtp!_j+R z^cNod1)}>tqtBba(nE~#*J3>FufF!Cx8v45wra!1wS{L9`8|^-1YkMI_5iRJ4oyr| zZYMqp71}Sj|IycgyJFWXJ}deU5B>wGX&pwNFaIw|4>1q^n`~?*r});pc4N<jecb6} z=dhV{IUd&awByKFzDs^5z6Bxr^NZ&9k?3PUV+R)<ua17hgWo{%zR>9N<@df<%5T|* z-xlkT_sx&2e{`chZ=XMb#GlLZ=VoHFKU+8>8yAY+E18G&>en^$1zMJNUauT@RlKH8 zD|-G|DR>4Ec*BU9f3W3l4SN=g;nxJ=^=B$~8&iws@vcQr@%N-1yGFmq2YA2rdA{I% zW1R&UyGZe4ZiHuX7NgvMY)qd&4)1<sY}d|_{;{3gCiEZggIvZ8?|yKX-Wl1RKMNe* zz3ROq+b33!Zh2~_8v%cfsSsj%MmZ(N*hP*R$C%08Q<XcGdvHES$OX>`FBva1d;?z0 z<_Ea^`4i8mj*EX1V%G9_IJs8t;CFj~9qN+{@Sc;L?lNoXa(W6`6Gg4fkohyhqUUfv z-t~4URz9D>_18!ew3DhO#F!j;jKTNr(f8Psn5Q{fB>LX_eZ97~kY}M<uD!u=^kU0% zgl&BqJLwDwbo&!jxU82W>>(Gg7c9yVpSf^)5U4-sTCELvb9gB7=8XfJAAEFRKp!lc z`4}Pa`5t~Z{&<Foj}DQ2PVqZE9V6G;((>D~lXX22Yj_}#11|1c9AGOvuTvk$cSo<7 z9FIe-I3c56W9(_^A!pQe+e?C<;rZDk>l=ziE#4T1>T|@c@0+TeOMG?v&RHDxMxO&3 zySV6jO^gFP!~sYgZkU|;io-eSA@;<<VxP^6x2)@JYF^CdkMW347m0oQ`==@w5}$<% z?RP952cqu*hkabEcx{XaJj4S?JZ_tu`HIIS=^+Qi!*Y<t<E<N-i^pvK7?1eKk$4<e zJgy`@3l-Y$T0D+K-vbW&xaj-r7!P=e2atHQ8-2dwaZP&2K{)@IY;3O9fn@`0nwlT8 z`9nPHaU`<We5KA$iO)iX_InnO6Vdm8!#*ySFNyJhhj;*q$0DQ8S3E9C4>=$nmV+=q z;`Z{$`p4{D7X0v<nb2bD?cEi4uF2PyXuEpV_DAOH;e>{6IF`IF`U($q9mx0WJB&VG zzMhpH;)|~q-{5QS`bTxt-@LMK?aGHm3N7_FrALRWwQ&F5smhJSCm;XE=I{RKTR@|q zi~C+5{e=gAf%w~I^!f7lwDb^T{IwV-xqW=is#Sf3@1e!~8a+DfZ>5CsOTKEVayju! z;zRor^LcOdFW|6&i-qwV(FzYf1M&IRJo|h?dWbVVTbvW0*UWG_&2jYE>CtI_69v9= z^7%sImr$YosrfvfoRhEt;>j<Hd4`Ac4Dc0#*G$fQ<$3UPRO2NRpDoV8XFfaKyZ&)i zv(>9tZP>hV?YmaZ_;3k+ZT)I}?kTa|&xDs`E9clw$)3=Qdpq<9w44`Q@}_uApH_5l zH`FzgCvwJfnqND_mb*3V;rlRuDG0Bhh3__|7R}>ci=N_Z-P?J5fYfK;iwx4Q)v*1P z;>R4}eD3G#+<$CL@9pZOGQ?y^IUz^LB}dqR+>2kM_kFDo&T~vGxi_15V>M6M2G5=> zzu@w7KeqR3>?Fjj<^DLiR_x(-dw~3&3NZ!mG0y2Ovz9KWr?A<3GtW;d!>?WMNyWhD zBe?!L$%5y`o3B@hHM#OwgWt4os<I-9eVQwt3w18_T(!55Z=qWDOylUqmgfo^Z;F4? z84~DzB&cv%FIU(@PN<VbxuVuNJqXkvbZve_|K(uzqozQ+EdK`+f877e(nIb}DsF9W ziS>vWB6q9$XW!~^0V6$@kaYdtOyowc__xUaB3wEKdtNQX-`E`W{HHvPUe}6q(fHIK zr(>(f2ly)MQ;)pwyg6iSzv9PS3Ukq7l>3j3X+7dIW=}u8W&7~j;UE(J8fguAy`}t+ zFLaPE1~F#*>!vEptPjrfO<bu>3zNKJCp-(5&CE5pe7>_Lu84mUV%BosoLnmp@Vh-g zz6VTP!Fzmjy34Gk%jqd>wl)>5dza^W`xHN)o8bCuBnjHSw`pA|X5`3Y4E~mKbScS0 znj_9~r>67K-a?**YFY5P^>c)66^)%_K-S#;41L$%QX>c016(3llp{WS=5&{huFb30 zuY7dl?4ks1&)4hzZQ94`9K9kv<g8b5J520!O$-HE?g(yLJ~IYIHK|e%C&m}~Uxb6# z8}=+#=kEpK^}IX18CYvA6v?PnlRQ4a`!x_qP4a$`EO6L<Rq<mkg}G=k%Kgu4(i0m; zCRUF<xyv7B!(St<LC1dOhkT)fd<g{nf^X3CE$f5x`A%G^Nyi?j<`p~PIhy4fTwaq{ z6B8Oc2{CKAZ%(e22l(9{AkVUiD|nA@PIsBLbU8hR&DNx%b?@?A?-j+s=O(!R8cBk- z@C&Y2h%q_x7=u5k9E~P1Pjke*)|$`r9JRNQXQ5h-OylUqmgflD7Kv}t84~FBC#Y~) zFGtuzE?zHKlp|`E(}O_$LD%NB>-rxp_&z|#H|q0zi7)Q^Rp}sK7e8P3XNnv3i1-P# z+@k-59uqLqp(KD$*Kdc$M(WJJMZOo|(oxvM8So!%UV6?`o<^^0#kgpE>W|a0)#C%? zJ5@mHk@uZ9hm5_fI5Cfyhdz&T|MPmJkKczk*jyg`;T^gJ3od>O`@voBdC$m>joaQo zl90nZcw}Vzt{fNYT!KVS(hcJZrcc1{)jVKc;0yT|2>9{+dKO@Pa6YfdA9e4@ipa|x zBOdS^lC18J&YUy(nj&7K8av5=tmQFua;<#B@Ad#+tUmbz?|IDWF0+;{r>C&ly61Bu zmEqT}_mX1ZYXDq-L4v^dy<OkCw)_xZ<bc1W{0t{+IL*&XMPCu0H>n1+w~%AT^{$+m z8*q7kuxo+FPD0F@+n%BCdJZH0*aKw!7v+cVpgY}Vqig!B4~7Ki&z+}fGoCuf*zEac z{m)eM-{k>6CL37e3l&qx6JM^6MA!-s&l`Zff(J~F&%s(TKt{dB*yY{&eGKJ;=X3T< zFyu2na||E32x3xS6I%MnIgDHMEt&_3KW@V<^Yu<bLpSte5w^mEufWxUdyIF!eC_Vh zd%=>4uNL26bHO8#s^j8KeXqrvK8l9_wBpcj{;50N{>|dhCR-edU0ffGuoa&B)dxN* zIAL<;D-K-`>igD`NgOQpG3V2dK15JU{jT1c&3^v8>075Nn-YKG=$4j$H(zfiG;~AX z8(}LvoDYH6Gito^<?ABV7~+d;i*N8NIo63X)7OL+ob^xd6OY^Swby(I1MSa$n6H-; z8oD80dnmwGc=-Mhklzg7WW4j`>*?O>72=Dp7T@6OW<L0<1KaBLBB<fV;RE_iZ&H7~ zUjL_TV}IEzSr_!;oQ7P1mL;onPrN!_)2DGx1D~F2&LnapSNx0KycOY69_*ned|VJ- z-=k8VMz1~2jqs=bI6wM5K0toA6G#pBzVqggu?rO^<^*RO-}`d^u`zv?m3)0N_@AXR z;7%wf<OsRs0^P{%`gVQp$#MtIb4)BbGhHxV@{MiqoRzHZ-_LT)m${RM?MKBwnc(~~ z_s8+IVh_LD1LSuUh$VQBX-;>UwRAZ>h0UIsJU^)nzjnO~6f2*P;QF)VfUB(0c~-F^ zH^deh;7=+yhpi7T&CR{)kH(r2&P(JMp0kh7%nP{uyo60FG<FhV*4*w4eb@66vBw@D z_liZi;hgJqmyNE~>o=@=Xv6wP`A|#Wqq9G+n$hFNlDuEP>^r6^$1M&n7x?^Nk85s? zV(WO~%=MKBTj6<y@%9K#njD{pwPJycdX2Gr*Xn&T#hO}c^*!V@@#&!rt5)$b+0Yo{ zXT_W+I$nL>{-XRolK5sKT3%p&cT2b9u!HN15w^mE-@pe2Pn(?i@_YOp+5;pLzb)3e z-y8gm`x-ur9zFIq?%|s_sPDZdehC%Y3(e<c((5>E;QC^Ot?=M8uv_qi$(c8wAJ!RJ zGV$5socp|X-N34K8`lmLexE4G_cULO0Pjx4deHF!eFrr0F%a~p-TjvhjvKe@a}l<} zga1Hse%$2Dm;b|k`VOdM2LDYqIeV~Y<->Pd-x)o)oSvml;dA1b`}ZRAd5QEo4jZ_h zjIb3Rd<OEp*P|w9zI+~hL_SL<K3kka&J&+%uJ4>DIBwsHByIyA)c4^N--HV7lg#f< z>2@4;aD6JmR(S9mxJK}>$(b*|``2Bs5NrIlSm%BhuJ6QWU*FSTip1wz@_8chOQ_I3 z*?jJhUdLer*QX+Eg$JL3+!r1&IrHZ8dVMxQGV$5soclbzZp9KBK6yP)e4pkEIkzuL z!h7gDrz%?$AEOk#7v=uT2FLZ=_2~#(;lY0(Ip1$`=F9(qex36rGx%?^v3ceCM;_59 zl=~igP@h`v>0P_-q0JAzb71y9UW1Pi_*W-GJeM6(3=%)x-%qg^ERr3L!zQjLBW#6d zvHC!2+<ucYUojZ`V#Po*iGjsE*qrz_u%Tyd-;5xLH=PHycnO5Qi6idFe^GH5O?(Xm z{duv)p;NXv4!gKMA7Lvz!~wWc@Sw?=uQ+Vopx>a9OyXd%&*SjWhPAz$*R0>L_Fe1O z4fOPhQLRQCGF~E~@1n&aVa&vLsV*e`8mZ-8i$$00aU8aBeJR3Lc!&j%-y}V3a^@=* z6B|_*B$HTJ{0n2zr*ESTtkwSn5g+Ytv6$v16#7<L91+KKd}yk&FY(uD3oRDQWsl>q zjq9rsw!%X!fExslnVk8G#l8XkE`Veb3yXhYEH*R|i)miPf^Qs4bZErylwxrp@z+Q# zFR@tk${xpI8`n1?Y=wtd0GSsjP0oD9V*jIhuT(OLg~dOQ#Rfe<+@SBQJ+`)Yl|6N- zIWK1LDinNKQ<5Y9z=w68nD`n9`twqYL!WGM9CmSiGs0GQhy(C(!80ajzT$A;F}+7E znZ&_jpT|M>eu{&BGc4{JHDgfaQvmp~rbLFuT)3qe98LT*Qp=}W4Ekk<<FJYA8xgj` zLkxg#7o0RX^A&^rx+f>@#K7X7$6%wrde7JI#Zl9L=b<XR)xF2}Lx-m-#}fa75dC?X z`QDd26TlYe7smo@g$Lh(-GY-QXTE%2{!V?5QZhsSO*S_31>KG7^{I9JP=;=S{WHGP z4<O-L_T9>9V!J>8SR`8)ihgI4_G8KK*EM<sTH4>Gv+29zHGNvq=T=r|Y^2Woi{88y z;Zh##=@Q}<g7EtDo|LE2Yma*){Pz?vq2J>Je7*H~{^<RJVFAV1n~EcIBs`0<*ysLZ zWBUA2pQYQiW9Qh88DHF#EXM8bnV8tI?TK9zBk@x$;CAka?-=VcG;sRv=axO&p5FCz zB=I)#G_B5533`qw=ga}@W)3hIx!oVp@1)w?0OxavT=9JKr13(-ci^dP{(#G$q4At; zpT<r?%o=)&TCLo|@Ad$BZ=YO&_nhT)mtRYl(^JTrDQazoY$JF{D|(jbWY>E`G4S~g zPQTk*e_em6KFe#l@>nzWta7y{iG7-@PSFPkV}5vln0yP>GHE!jz2&*W#xC(qIzs~8 zj|3Gi>*cCbT;zoJXo_;hXN#S#%h1qum%6uVQ^L3Ai1zfvH;+Z9bdty0U!wOZ6-R2{ zGC_vk791Fg*Ys&cwQsq`M(WJJMX@NtrK7OtjY7QM=Bv+zl&8__S}`vgU#s?ce1Ozs zAhpl?MY6!*=M}||dBrmDd6oN*jcM)M-9I+IYdkA*Chv*WyGBQMKDlFLWc$Wl<KtsH zCPs!u3Jtj{$419?3~YH~G?uzxL+#}=Jv{>7LFJjeV=H+_C^EagSKslqJ~*E@<cE59 zbaOTL_zTbRY|eno*AVd-*VsvjS<7SO<XZWJ-|YduLVfZB-t&~xU1lv^PETR8_0Dsi z%J6H~ds#8?IS%eF^=>+0!LKLvd2Y*>#~b`f<!fsa|1@9sBY#WG5jBsTW6uf0aqTV7 z7j|}vZ_*hO=)NSVa9J;3*h5}8%N6D8RS7)^)E{(B*SwXFZrHd!eU~}Xmwlh^;}V}d z23^uc4zE6;y<PF6)^!RBv>Xw<Jshv;)2Mae?}^>;cd^DM-RaAs7!={A2j~KOUL*J> zo2xz#Ql3VyYsI=~eCm(WvDM=Pe6{tdb>4U095S||I5D57A3mRQ|FJQxbx%CDZRfV> zY87+m^(s$oux~_jP<qfoUa$lFxucr%)(7YLCa%<|Udt=F$IiebS<Aof?!Q%z9~~My z$$+fozB##89^iL-fP5x{xCXy0-Z|Z6*3#wl6gFF<JXfg<zjnR*6a$}|;HGO-o+Qzr zpMFa3*IAx=6=&pu@B99#$^z?yOY_9%8g3Yk+SFy&z3-X5-tyXneP_f!iO{UM4;lKd z??00V>;bap7v+ifrJe4w(KTJ0R_j4!_W73!@_$L<kNf{-=^<}>6}Jm|QJ07za(lPx za}V2Q#-Qj7b|#U_IB!M%7vY>Ah&`<TWrFZ}?x8i?YORMNIkoDN#|QW-4Fpn`yk8^> z9JY5Ue#|9mhR>zk|GX}3U#*`DM}Qi<!@EID-$DkQ*QqScfp$UpB7Z@r^t+q`KR8uc zXnk;=f8tD?x{=VZ8=h-f?!o2rAHU9se-dKWa$lWXD=+Z7J-|;@pE!f}c;|GNSxcAG zQ`l^s^4z5|{Mz*{QLKEff}5^WS(2a)jcQ&fX5`3Y41VFUsmiG&=4p=jUc$jIi+Q0& zk!PV=ZWxYhZ+VWeZAg5R&X7R2KS71ddO5-#a<N3PC`Wv^%jrR&{-A4ijha4M2Kphz z;C$kf$KV0!B5#WoyFGeQr--9KOWV`(Z+pC^Pb;cZ!(Tp=Cvrx+{MuoyxHuhqI6r-n z%}>w0)0=^{VqGMoR-N+r0I8oq>Xi43WP!ua8;T?IiTUXBDfd6GQ&gqZTb|xF`aYyY zIp7{2ss1AvWUSuu<Ou&+G%y+8tomhB0RBVDBYDLZ^2#{ydwy8I`C$15=ktR2Q@>6a zFEsoCp2+3|xO{Ek?_Q0agqXEF22QS(FZkUaAm=RN58m^T(_LmQT~1G7v-Qh!n#%BN z*LzJd@Hq@_cKw>UPRGaf9b(Iq$C+_=l&6U#?rEMl*9^pG^;*mAA=lV(T(W>^%kzYN zi#2vKWwLAcAt%+#6ZVh~&RIoy;+*AlmyND9Yc~$8-|)`O>(+1XeYAh`>b@R6krU^s ze@3E!hj;y^`S$&Yeh0#05s>z$NA|F8mnAVF){r;7KfqRa_`Mcjr{D>b<Nnr)hgj=2 z#@@H%dWCh!y|KNw66Wx9?RMv;-{FY9-*;S}Z%XX;+^>|K%-Jhnq31l3P3=a9K+9Rd z&WV}%FRI<08Vi5kihM1?rQ@*YwL+{BgxBYN%G2nz$Gj2#TD9Bb16(XYK<0q=Ystp; z6N(@6gL>)fDEA*5(|g}F+jdTj?Ra1HOKzrsaqD(H{lv(Q_3xR%6W{I#vGUqoFa-jA zK)EEh*h6j+joeE=s^=os2j_Ex98kYUcUJR@Pw<Rp^8#F67w~z7#!f=aS{?@{*UB0E zZV!+%3^@Srxyb1*vz9KWr?A=j?RiaQ__gajt{C_{1~*;53latW>U;HhUdxlm8T{an z={F#fxTksI|7dmWin*bFlWU<`#tp}{w^@0TeOJXl=?n>U9}-l!td}S3As;-mFUk}3 z-RVJ~{-A5Rj&0PBZmk^9?<!YsmZ4u!4EhtFJO&R-7r8sG*xk{KIz}7?TK4VM_XPLE zYx=aJI(99Q8@b}&q8Jq6(lOY>`Fp+1QO|$M)97`rSQm}2RmVI&K<X=yI_CW%S>W(< ztK!FeqHg$n%KgX2w2lq$-Z(Nk@+7~n+q3=2tz$b7rpCCPJEm#VIImp=X%Ax-zE5*h z`NRhD$v|WsIidf<ZGCV)ABa1(Ye|xK{D5bPWC7EbuL=CTE&j=r$*yzXouyWu;CFj~ zoLz`Jc#nThcbT<xIX#8V)-KOwD#Nc`@37+Ma~Irn?J7tV^jkUy5ohw`aR%S{6Z&nC zBo}F(cpv(L<%HTru7zsp`r7(=!oH*8pJYJR+=mQ(*Jpg>0egUa3!*4bd<V?wE*o7w zhjsRxj!sJV^JftsAGYz28X@bL;<X^2DP2T>kIF9A?dgO@%ps0`Wq_^lyiR@Kn*_Uz z?(?%&T#!+(F}8iLzDJ~(a|X3@Z<x#O*R=C0-TF=8_4;u7#`uY&xMuS>6!OP_*f((E zxZa;sOrno7%zVsZaz3G9BTRcDY=wuI0M`gEGv4`%Nyk^|cUTl>Vq$ry5tDW62R5&I zq~E@tK|E{6W12TcBYrI>$i1pqbefM6G2I@wSX@eI*apMi2wUMH7C^of)N8!+6^lh* zt^bQ5nZ&~4KO+|LJKNJ)7gzDT$oOIm?29_Yt@6>SN|*T-gxH@=7K6(P4VxhEiLezO zVgOt#*k`=+6@!ki(R)OaNenFR1u@XCPTIG!isnJ|AD-y?a>=5>yZEHOGiyEtr2ToP z`F<&(VGHCnUl(92JopZLP_WN<=gap==_B4D|0Wxo8*R<*W0%aoBKhd$KkxMR>6bnA z{l9^=>sC1*v?KeJCyi&n^8IE$Y@OD@KSxj6otyVo`lT~LO<$t-l+o^aaZ4NhkAHlc z9L_V<UiAvTl@mKg2i`Y6<5}M1*K1#tZ{)#pALb4tZ~pVW6<+&IUoD?+Cbq)!q~;9y z0rH#~$oT;H;sUx*p)q#ZPwDfcNv`}1@Px^@X!||#v73Rze>(HMSaA7StxLSeG<FhV z)@u3Xb3J1Z@o{^A+@}l)B4>+Wn;>}l!-CHj^ad{ci@}xg_t8@PbdBdfG#b5gY2;ws zX~kw?T%SHH!1qYUi*$87p)qG6E>?a8TH)cD6Yv#+ON`fjM1I*e?bCxBR`onw$FGE^ zGx_f9z)w$At|s=oEl-(mmFP!6GiSM2REfU9gKt25YccwK`F2Wrh$m~r;u&%q^VqlE z|JMtuX~bh@E~`A9$^Lv(K3_`w3WN1$tNFYq`WMjHz{P@Zh(5!E&p>>>HP1dDmmcDb z&lcyZ&wcA3TEBYrj6~1!Ipyj6TuF&>Iq)-je<<-Q5cKEE&F9hRUqE967j54deTE00 zf%tsQ<jhx|k4g`5#%GIj)#r_C9vxttO}w7v^Gu%3w@D5Sz9pxoDwBzCfuKL5=J#;) zF`%)7i}r7de#3*`K>WUJa^}nLW70#c@!Mh@Y+kjFf7`_Ad}a6-!8)qzH`K(Wmik`I zH}h}~|5?T0bmC_aq(3_>23w=Q0gX*uwC#^Efag`l``Ln*OwN48;HdNvcVb|1Ph+6( z(XC3|FY>?2Gvg#4V>SG<Q<XD`e^L|LPV;>@`WbN85-z?u`VJ4i1B34-XTE$tB0a=A z<ll6YFU#wym21}5^S#P5;{+akZ~Hmr-F*s<#Xl3~`%v^VAhCsuJLWq)_zuMPiza8j zd_Vjx%DZIZdyDB#e7B!Zs!n`pUfV4`DbI{UIK0Q?`>Dh~)X;XB?}O4GG5S8BUEhwd z6&`#C;`;@YGhe<R`d000l8NsY?{v<`TZ^jeMRPvk39kFs<pXc;&relOCjPmf?={~y zNx$Q;h3i`pw!(w&Kzu)Ma^}nTg9r3GvyzGL7Vp&ewd*$OJCgcGZoPIVP>}b8C-^?& z{|H}|?<W%fq$af8=KFy3I}Tg8z8zsJJopa8_j4v^zI;FQZF+xDGV$Hwo%;U8kLrJS zY+lv7wvPW9Ux>ks@6cCH>-SI+Kcz0TJr;vavcqxM#PyvBTj3!Fzz_qIGhZ<{{O$V8 zsbq%yn{0CIHE)xCAEQ_Qa+f!Ui=Imr@`Vuie;baqZ}Bf^9wdI^Bkg?_gF)F5F<Sq2 zeJ8?Jc!&WotO1iVZ!!1|%>&5{>)&K2G3a@8VEyL)_4<{N>Hl0=xbM&4BLw~>dSsoI z|0fe4-PiZK|FXexhyD6sz_r4I|3Lh|U~=Zm|0B{v%!B_XJMq7I?$ILwKlnh;>VM7` zX2H_r-e&k06$AIpofX_?F&K*e1`0NDvETzS2JkF4-q#CWFgf!TgX7Xe+=)Sp=}uzs z_=cYT%{_V;xxR065{1HfFq=0<!tQwNEbvR(4-<b;OZ!@j#c1?9;INI0_V0_afQMKB ziNz(8GheY-@<Hu~l1VHq{-G|a+w#EkT3b$Ex+mB}|CZVIO|pe}IfRz>bA12E$d|7i z+rD#bbY$)J@m&)=3{Ydtr9(Q0OD^{f7d{+)2fsBPpgs+JqpjAnG9TaiLcfZT=T8?D zi<#KiLvQDIMq0DapH}>Up80+x`nT+ds{Wmnyh|T`d3bf3-dg?*nr^It=UWy3ml)(8 zi9XMofcy?vP8TXP#<u^IeoOaww5R1%)t+wUf!~Vdb>vqb330f`#^vBfX3qiX<+&-4 zM>jy;3j$KZa=K8VVb7Xh)%Oa1KH9VQ*Q@s2ls*0|?&Pnp3HI>5Wl`HJUdJQz+oYHL z1Nl4zkoW+37MIh73XQR&<Nj%q@N39BH;il<HgbqPxn#|R``quX+6&Lt=f9-F>$KU^ z<^wa>^<6XV{dU>K=Z1l=HOO!5(I?M2U8vBox6xK+JzPobO!c65(TAcB&8~+5jVn9v z4{B`LIeK1W%g!f!FPqzrU)FnbNnP=0yWgVR630WTd3W?0(lzsHQnhgT_vn8=)TjwO zk8dXLVh@cmt`o?-@;bd=edg*nn@!&#m_NVuv5O90uP`^;W%E|e4{RS0uBBT@wcIw} zr<~?;%GiL6X7{9`F=wz>?V$PV5FGY<-=X94eT?7haGG7#1!dOZ*6*&?i&O!&9yMCC z>u}NkX?z`CPV}SmkmAPt0kZ!9sjooxpPVjKXd$-J+vpk|5N|s6yCk1|2FN}GWS;@D z&*XHWLPKw->UN{+|9qzRLy}M4fb1tg`~|X~<aD7zLvK6#y!HdmS9YeGUL%dxltI}Z zCC2&rVd-VR0J2{IS(8BWlGB9>4SO1GW#;L^BUL+7J?LFyv}WgNMdKRXFY<Xhsj+3} z+8vE8J74g<Y;G6)>Qv>T)hFcme({~kEpa@ny`f9zjv-w$ul9>~^q6e5F?o*XvR}AP zAoI%W;Rn=bzxbfpbXYLoFMRA8*~;8xPdlu6jO`W9P2EDO<@V<Lh07^p1M>6zqF(LK zYdkV&*y;DcIZtPf=m|r@n5)X?Y5dLF5yg!6FSo|~yg=n_$;If209)aqz5)5X|3#DI zG0J1d*hZU=&Es>)?D;<FgvTLr(|(TUoSfdW^_U^9$GUd~Wol04=<L{{1ifdB)@;pL z_Wh05oZE?hbpD{?###ZgHv-u!fb5MqU8v9)dsccItykmXwV}b+W0KF_2xM;rGIxON zjX7PY(9pZ*54A3TE8f$b_~R%S{DAIV8?AvY;*Anx?0-ml$tRFK6G$9@?3p=TsL;^M z{VDq<_gKR}UbP2?M(gUq%$^^XUiM5NdnS;&1SDTMU8vBor_oks{`UT0HEyXM^zJoU zv-9_~#x=TU=JWTK#+IFfOWB9)^E37C+4K2=?`3m)^4Ihk+N6&9p7{gHEpfapyN2}a zWk}b|t7GCl@?-j+HMVy19M5IXbe%xvmDkCm>bI%?{btjT2<CgHkKHR<nVanE=QWS9 z{WQ;xx`kBB?e+b@X)dRX4ajJAPbeDG`NMHuA2)v;x{cm<==gjed9LoU&YQj1kv3x8 z_9M}kX4m0fjcarrcAE}#qw|E~#{2=Yj{vEkK=zTGE>viYy(L+VuHn;}-k*?s_7Nca z2#|dQ$Uc(Og$fP571ixV*Z)%S+R)(dPf9-Z6Ucr6#9tu$MNStgH1r<Un&vqx_gHpz znqDJ~)|AQ2o{vf|`vs8w0?3*Kl9!w=RA|`KXe+Z{O#EmyZmAyho-kUo^Yog=m7S-H zRY%LtwIPiyJ74g<Y;KSL##Ci_vfh2a_;KZyI4;qd<Dgzcx@KP8Q0-m*GkVTtWAYr& zWxsHpK<1U#!yi?j{o=>WrjvsCe&J(J$X4bid)gh%V{E^sSEKud%PC`n)Xv&3>ec?d z#v_A9T>Ty^=jqH5Jz+=~v+wLw<-T~&6p{A#lw!s`*7=0S*%I=KUkb1l9_kyAd#vTg z>w9XRYsNO(d~Cj-uK0;)!_P}6JPwhY_H+E>JGM=X6x?LFo<{5{Q**AFy}5k!cK&4a zrP-Qu<)e+)oI%rpesunl;>KD5vNr<RD}d~cIbEpG<`Sp#ve)GR^UqrIe=rw{r$|Q; z4jDejxK5k%AI|(vdG2;yE63CmS{nr`X{nwB9WLFL0r^IZY2e0BsvZi*tKR#C_lY+Q zw6SNDr#I>v$fsn1d@mOG27{lI&~+IadJp}Le((Ly;=SRyzl(Cgcj|r3M)#5vnLWQO zy~GU2*#n5LK+YaHU8vB|o4;Sk8l4!~K27JnP0lCW%P#%Js=YAy{&mgl@%)6r$)7>_ z=3R9DitOTS0_3a)r2Ye07dc(1&=}ijt2KvweCrGSDni~rU-;8iJ5wrp*BGtYI#JQM zM$aaBotV_vvUBu~#+IE=_+B=*6TdZ88A$4_pG|&Ixh0Ngbq?t|70)Kjt9J2j{RRD= zf{n>@JeRYH>jb`3x_v)7tv+-07tE$#70k~jK6Z_4Wo~kQI;?q&?G?QmJ)5|kGB!x< ztg}hIy|-x04eV8$G=Cj}Bi`P3==fRtwcX6-IfB1dE3*y{|7`7bc)@7RuERAy*Z4YI zAYS(;%vr^ax^z~M{TfJp1+rfQQ@T*0h1g0~qieX5>HST~WuF1E&j8tHfb26s_8F(^ zGBot|t8O>C{_kXZe@k-78<713h`&JglbkM8Xy{#XNNZZ_gnL;#qlP&KL!&k2fNY1K zhRolVUiJ$h`vs6S2_)`0U8v9)+h{8@PrFZ7?M(HccaPDUou{WXuF?G>pQkr9w(MN% zQVlLUU+}$bZb#2eRoasE?)$}WD7VD%mh2kTxnoGz%&XI?Wv6~kzh7iy@*K})zi^#E z_6x6vzotI>#jl%9=LGZp!pH8Bt;|jKv~!xr*nWz0Q@4<6xxMKb8k)-~V*~Q@d$oGC ze^!l0h#I!|z3eQW&RLkAFv!OB{?1h88a`+3yyC|F?2&ly8mOEvxfuQ309)bVcN&1y zzBc3aIOXwUY@^M`<}q4uCfe|a(g}}4<fi=`pWM=~-!)PFU?^k!^PiD`q}jQT*y6us z>d^)BBbSIh?Y|s-Y_=Zl)41t+Wb%<$)Ot+^G<g0*@uWTjUty4agg*ObP8TXP#xDGo z>lOZ&Ew6g_XJ<0K7bTzl2e``MTMe!-n9_v`4ZUanQU90Y|Hb>An>S<3z@L^q{rAMz zwQu@Bn6tG$&)Fy5C^5$2Ph|)B1oEr~NF0Fdr#W4y(9k=)JN{(Y%CWH>!wLRo*E5y2 z&wM7_myN$EewP~lp<k`qx!>$)vvE1NmD%}cW+#v}2*gexcII@Khu+a~R>Ovor}V=> zDW3ObITLXIIP^Q!c*1j_UH{uhucfk?ep*xMdplxu`sn&|*~9m@fr|}(ib1}+p3{X2 zjj@fkGV8B@vYPi)4|?|-t=aW=R^!U9zZUJ2W!KOOjV(Lh_atMRorA=!?7UcdeyXxK zseyi$_+!lza?t(j`mDZQL%L>8Ueexj_?$kgTBEMb<t*Vkft)3L@3^2o>+z4wrb~k9 zyvI%-dsen`mf*Z|NoxSxTYf{YZXwn3`Rse7(_Bs&8<5fLK3OzoEB31Wh573c9QJ$P zq2p)mt<TZDXUEyvYq-y7O|M~%Yjh3oPxKR?zgFDXLxJp}Kx#6OJv65a6&hn#{AT0p zzeT(@H00%PB%eJJ$Q}x04+XM^=5(P#L+>fcYP5Fj$@KoM<WqZr?3F<L1+oX_bfH2+ zZ?E<m*ITdd+|2Y|F}*<cJ|KF5=*{Uug@)b}-+#Tr_dtl3onxohW}~%ipKOm3<GT1e z>1B@tE;h&>N1r_|rwbJt_B7hc>~YI}yJ}~u2fd?4Yj%Ac*SNCl<Eq9sy2s^nyi>K` z=S#gaT|Q3-ld;XtHR4uwUR?Ntsmea9smSSlXZ(KKWz7q6uvllT19}bVnmM^lyjTB7 zXJ{Lf&yTt6ajp}{9_KauFV$~T|F6uZzZcB+I3Iglwz9{u51-K*!1k+pHM+;SoH8~@ z?W{en-hMS}UqXl)arOJ<Sv={RzccO><GAC0I8|8`?|*|V|ML%uTX_FBp>dvue&jC$ zY=wt<1$?96GUN5LK%Q^LHrjk_ehygid(npL(g}}4<fi=`pFTB6!{B-vv8znYx@Pv~ z^3mIQKKjyZ&ARgYjn}L}(}8|;{-ff?o(^PB2eQ`y+0%2nP@&BwPUmH>%K_%^|1Mdj z_kYDxq@xIj44-3Mr_K2fXMU$Vce}2YV`>U**89JSp2$)C>$VKYH)2c!x9Jb`tW-E& z^`0->C*Cm7#{QG?v{Ki=cNlz&!ES>O8iei*z1JkG(LLu-ruUzvkJtb?8v*eN$QdQ4 z3l$oAc~)@kuj3hI-|MQ+3l9Ea)t-9$*kbXT$PmMuW)F}W1jHU7_T=<*?C5x?1~VQQ zU?=a5bDrXP!NI?X`oPnC&m1y4(mf?|#J}e=JO4%YaFznT#vo@Y`kbY5x=^9HUhm%x z)|#_Ers)0VeHW_nbUq+@PaCb-x^zq98a+$pb!n;231!#BsK%C^*T<8w&CWsMRd!zV z{;}SxPWA>rOWn}CAP3`rtXS$bq-*A6yLiuC(tFi5CZ8X3IZL@tAn$eg-uaCB)V*iT zrhgSo=RG#~*juudvlQpOcIJWlOaDZ3tXoL6+}^Z)r*g{Jfc$392}NTLW3SrB%wLD# zu+jSt9Y6bQ5g!=jKEq$Dm082R7i+KKy+&(#4QpJZYxs1cA7B4NapP<O<ZJ<?CIdNJ z<aD7zW9;akHopFsir0pQyxf+2_Cz3i9*{i|*lmzK(doJj4ZT+-tI^tVJk$H1l26`% z?1@191+oX_bfH2+?}YXm*ITddbc)x827mv{^a9!YfanFHH>am#H=We~)6yQr^8!1^ zPp{2JYuU-np8u9!_BbGW9FRQ@$R3x|g$j*0G}_9nkKsSB#x2!@-Xlh9c70sZxU%b` zL-o7SJuaW){Tl1@rQY*`e4ZXi#x^_Gh+EltarL5p$H;0ba(s{bcg+iOFrYKm8NG&d z&72&D_wV$*9UGI+kGbq|t`o=}=QaG6`s{K4W;Wds%=b7Sdr7vk$FUFJ&>Fz@4(^4! zg;dM!&G$H$Q^p45=X+ee{c85Ugp_EfKQEZgGvf{R^j10ecjiy^zcJ$de-!3_e<MCG zxRcO0PeZ<RJ;2r$@$eZY;8KBM<MlY@@q@L|=4101js8`%;d#;tk3;09{Tx5*Im*hd zTXt-Da$;mhPcX^#g-)G6WolRF<!E;<8ois0)@<#%s&S3hu0x4_biPpWV{Zqtw*%R8 zfb8u#U8v9)J32lcylLE^?g#e_y*#`wxIb~otiPS&btLlIrSnw=-(Zma7yK&==t70Y z*p|O({If=fGrcd8d~ylovuQwL0A%0I=|Y8u-r?PGM)^DG;4bJM`;fhlKD?xQUwlF~ zdab``Hc+FA+6wVH9+{tHHUjy)9uOOW*qGCW3XQSV&tsFX>d!Yp<8uj|9k@3>buH=y zPxH@T?J--@`WZRm-)otzpDdfG#X!ytK<X=yxt7y~3eEL;|8B6%+B@>M)tIKT(R<No z&91$LSIV!wK8-EAR`zRbqo1wI=lfZWEjtg1TiJQB=h9TAVs#rier|Yy<^?%8pfkcP zy@qtnoLny68&i6Z+Q#JbV=m_g*9oM?_&(95K5O#%X43+}blziwk6rlp@!Y`KX0hfE zw)Y9w=()k=l(9i(%sMyJ+Y^h%oWfqUPceTTg2PwuJ9K>Qee}7xN8b8>Yp>;_Mr(F0 zFS^?JTE3j<Cr&R>{HSd}_E8}98OT1G(}fC+u?MAh@0(s8UiJ3O0rA?<ke`=I{{2D# z`K}(2`3&qdn9_v`4ZZEE{f*X;^O@dHm3(S2kUbNKzd-h*oGw&o=shgGjn<!D@!HVf zZ-?mxvJV2$3q)^DPsiT=W$nw_tGGwDvultEPop*MVrI|Fq?f%8$X*9zuLCk4a=K8V z5r;-wnZ0iRKUCwE>Ot?M(VAT!cQmfib7sCimaC4Jo#PW4TXvqF)Y!6fjkuMa7uWt$ z|KGxDD{_3VTc~+K4)*A*bw#fsT{9>5iFe6O`DtVF`7xKh&UFH*4PMJ%tUi0)y=K#= z3Fdp9kG&&Xnb+*c3pEe0eL44k-9oD6_WHe_(_Bs&8<6q9^Jf0;ZoPf0_Wp#lnfJ=I zd1t@LK7Gg2Q<XFMS5uYIcrP50_V+UsPu^=^{!Dc(a^8kK+7j*yTH&E?0J{YbnjDW` z9#^q6+<a^vyW?ihXGteK4iTL8bNsA0^-N6c*!IM(iIHfM>x;d+|1DF~2A{3QF_n(q zLq==1rgh$Eyrx}9^rQ1tiXSx|$es^mF9NdX=X9Y$W9;bo%;14LEL*x-UlLvmbPe-8 z{3&RIMu)`M`=yh89>_TW$XW+>8cgXzg~r$=|JZnay_o5Jwd9jaAm;!eF#xh3=X9Y$ zL+}3QKU2B*-|^n_Ondb{`J(J;v}O;B*F=UmEH-<9oDYE51H_)3o{p{FCzG3*_sLgp z>3_WH{J?$kqT5j?KG1xRIBK?}H8gU>zYG6qrme4$O`IKo)Bqqg7RbEH=|Y9(dcA)) zSZ1A_P3%l%qxX){nq6nh|GE4+o6y*@>*A!wHhOl*=k^VaEjtg1TiJOr_&53=QOTa+ zXNOMB3vzHu=Y;$IC7vCalM~|Y{||k}&Bo;OV=iY0*9l}j`JV6!^*KAd(rkLIU^?%y z!N)F_t;}oAH+`Bv*gm0G*zknU?e)D+q(E~yWo$r3v-@Asn9JC!w#58(2oC$b@6hqH zpTp-Th}r%#wpJ^%o)7(NweF;HvHQHynqAMmA8UL)w~N>HqO(geq`m>!H-Xe>Ap2%c z7b-Nyo{_A*@6o-oUiI#k_houNNAh1K8NfFfWKPrP`EpJdDm3)=ss1-wM{Z|&-zfRy z4agn|#9ttLQcf2tH1rPdwi)CPn1us>NA`GaTBd6TupW!rexpNU?3>IUAZG+1_5iUb zrwbJtW2<{)c$SQD{?i^oHv2i>cVnMy|9G^EaWt=oXU(3pUPO-gclp1~oG(jd7yBe| zi9zZKedbY47b-N@>;1dIGVAI_VrMEFy^H@n`q1pU8q&B%@3HfBbwp#!u8m6?TXueT zXzwXI7l~Whd2!$0O;v7LT}F=YlW)+xAP1LaSFg@$L%L>89v5%-|7!oSnwQUyx$Kj! z6Ub*bd>?q7`mD>>n@w*POy@l|_}C%Y%DiSTpU~XG_9L7%yM<KC?alW|ms7?D<mdZj zy*;mJOxu6PdH)vk*CD*v?|p}kzso)uA1K>+_#0_u*7F&&J(rK&w~W^8dLI3+#@F*w z@w#qwzD+Ttz5&@Mfz)Xr`(#cRDm2Dkm8>HVyga<>?UTndy$?t}_liL7C4uadz)piH zU8vB|JE;2KXdUSkuMG`zW4Yv$Hz4~Y5PyN}OF3Pr(9nBBvKp;HhcmsOXL^C`hd}fK z(VNqS3JtvrRadw-<e9QP)0tkUjn=g#cV@=n^QD*l4#<87q%HuN4>?_^(6Fb`R%U%% zPV7wepts|Hq7TikkA977bid2j#{rEkJIBvyY}t9*rah$WTqAB}=f#2ltKW1?YLxGH zpR0L64$jN2Wjb>W>6$rtL3_uo7d}(zwK4hpn9F|WI)UtWUeDjEKKtD=v*`;2^Zm}p z_RCi0HGA@~<`%Xe;LO-9q*`uozTdf=GBzMT-|y<}U3b}|5Z6GvURk8)zL!4Ev#w|L zig{xozSjQi*7QAN!H2k}X+3TLvWBnf83M7)+S`?n@cpm&{5eoLvvYC&)8jK~cwVbM z@Ik>&<MsF>zijiddF)rT#^-+zN+&!H(UbOb{Op{}ey-Z6tz~NBO|v`Kfz3<qi9R)3 z6R$l_bHx7--kF#ik6W&1*mQu0XSL$T9s%Uc0Aw!%a%RZsLWNdKzSC2f$LXT%P3igf zz&bv5Z)K5qigXm=kmYkNmCH5!dp>?|<!I)2&R46S+wOdAc9DM%EY;(@4&C-a`9_Rs z;D*|sset2E?>YWr@rHpm_95kowFg{kkh2&4R~vjyLf2(z=)EafjqYhjGQDdgpV$C7 zdjatY$QdZ73l$oA`K;T-r^ernIroa_5BQ^czTfCR*(Kg6F~)GM*#qQE2E-m9_T=<* zZ1ovMc#c2o8O8nu&r~?K@r>fky;XaW;d}E|vnSoVTnF%SX74*>7iTsgXEq>v8<6#w z(}fC+I5pa8&0QZ~^nI{{FQ~@V`GDv>XS8PPQ=85dW$RP7#+F?hdo{M~{64L*W#=OC zDmyPO|AW2{mh2IJW?Q9sK@RrmeXnbJ4e6RW*)HB&FMg)7$HwIIV=iYl*9l}z`ChtG zed=GY+4QhrI`6T;$F{xbnQ&&~T)9Z|2iv=aYxK<Ka?02sGiIIH>YW>k#vI39wMWcf zhv4wl`wktydfVuz{nU8;{Csxw%5%lITCL1l9{i-*Yx$7TnqAACpWOIbzL4n0*DqH5 zsBJ*b8bE3^kh4Zk7b-NyJ~<t`D(<jsnY{ny;k7{5Q0|H3S$_wO4gq-^q?4Ee`OXp$ zTY!9LDW?k+8e<n~KWMbBT+H-tlzd_U<U3J7^a9zZa=K8Vq4%itHd>SV#A`!?zXPTh z$o&@(y+HKl^mHtHHSfK%{~iCdC>MKZUgzpPqraTl^QiQ){{h+mfb4%j;*-;b3eEL; z|8B6%nmPC>)wrdy(R<El&90d?)#pa{zkJPfYi!v$zE@+*&ePKxTXwDyx3cqM;=1lb zt==NX_rHG43v#ee=dWve4e6RWIU(LFFMFnP)yCxWV=nuj>jbj@d3|4}KKtK#v*|Ix zeE;*YZ3}JxQ#==G{$P8zaE<PNE~ktQGI7@aS8p#X9D}`TkDI>^!4YroJ9K>Q{qMQ? z%=h3+YOm!(Mr(F0FL-GaYdO(RoZhYYQQLs*e?V$5ko_;G3l$n;E7Cjg+Lwn{y}fRY zcx`CN&!FiAa&HJkFOb@w)6=ncB&*RHGMVZ964MK0uLGhNh~Au@>OG)6r_uVeT)gSn zFEzbD_BtSXf#}WY>DWuU&*grP=kxY_E5s0<Mr+!+%%08C%U%a$uLH8z0htduU8vCV zTITp7SZ1%=+fj{MDigh@jMnV>xT$ds?{(Sw=u#aoJIA+bY}t8wOk>N=HR4uwUR-@v zd!5x*<oI6qF3k&aFsifGMZJb}&77QoSI<kX+L(NP%w?~0oj~?FujQN6XRmvw*)$}W z?{z-*rfg+ivmdu<9$<SH&xpH)RLkv6pV>ikIc01>{sYgO`I+zIb@r{=`xDZlz5a~7 zHg9KbQcqRRnHy7;q4>N!BJJ<6;>q*%u0_?g$ax#G{YFwNJg-q7*ezHwIUc_}u3~Ap z`Pe*mN6en5q!S*82u}MsepWDMK3<<S2kvHQnVQ!B@@gDY+1R|_XwBBNj?ZYkrkzdn zqw~uZKWaRXJs-$k1Z2<8=|Y9Z*xd!OJ0M$lKF+H}*D%+*=j}H-Jjfe0TY#JcfY<`$ zo;Rlp6&hpj(=*#f>+88p@6)Ci$T<LrULgB%P8TXP^d9{cy)XF(_M2g^kN$!`A$uCF z*_*^0CB`^xH+z7b4}jPM#Gag<j^+2uI3sW`eBjkpd*JbXpx(3KYneS`(#!b($oT+B z9R)IXa=K8V5r;-wnYDD}zG~c3J?On?v}V`R!p|zdmijcd?A+h4v1RA)S&c0_*N9u$ zd9n1Lrz)qCeZkKMU#59M4i4xna7(WtT{9=QiudgOim#2y=f_;m2d)!H?eMz4RejC} z+svkM!TfySV;8<Mo)0*~EY|$N_CDbnJs-H7GB(J>S?7a#dtA|&Q`oDv!~As!j(B_D zq2nJKnXpH}kBkkEfQ|hAKRVWI**-j);3G%<zh&0-L}%@FeZpwXuIt6Gs;=v+7NdOr zxi{Am{qVe3v82uc*&~6}V<3BEP8TXPm+$NA<mWwp*ZpuvHl|~DOFnfMxX2)Nmp=C7 zbfH3Xz23hYER&xOt>Ge>=<PFFv-#OiU9isxG@Bo6DI4R-oBCd>%?IRo4cny{<4?c# z(9?Pi>6-V2_lft&XFpT9Q)3RzrG~jqAp5+p(VgnIsXt*h?Gemtn2)_ETbU!&*&~`y z*uHSF^3^S*T0S@YjP5j-Q^p2l<mdEy^{8mf9_&?nzxnGB9QJ$Pq2pD<*6n)wiIE-a z-;@3a-Bs@$**>uoCbiuEh%NqGW^F8eP3^U@)o9JGjXN6WYoq&vcmMp%u|z+<ezjsq ztpM_yRzPYOklK~gg$j+a)z2Nw2;p=Lea&5Qziey{mcO<d6Xbr4bW_)W_Zwu+(#O`E zE>vir=-k~%>~x(#^e)z#=epV44QX82+@Y^*jQjs}s&dfQ5puk)eU)O2KTDQ8Q#q*D zkgmCB=oRnrH>zIPm^{{VscWti$Q<-_`<3cb*Y=uC`vmj4=3`IDR^|w`cS3o>_G@}I zTGw1o85^W_R$Z%CqgJk8w{d;ns?8f#_4I9C|L8#fqXV1Q^sMXcTZObZr~KJXZQjl$ zePi378W@YGuO*-Jme;*54v#tfm_9%Iy6W08Qp?vVjy$uulF+zEg}yJ|qqf4cSbZS( zirvQR`$3+6#x~j*JHw~7>vH#l{e}Lgyt(^topwKrzk>gE&z;)#_3nQ{<F~!x>HScE zt?=;qGa&yrwA*;+%YSs`dtv_@q7C05oy5o?ylFqjSI_1fpWHDrvOWH{v$fmbGsehI z{GQg<HG7V^-T|XETNfwa{!Hb}+v0PI?gyiMV$l9MNxiJ|S<!=uU5x!^#g+X7$T=Oz zUI%2a%jrUe##sIK-`Mt@W1}O*ArASu_U30QJnvz>Y+Y8h86l_Mt^Z-E*LjZz$b!}@ z{~V3pZ;@@EZSd^|sdM08Q$QCgG{!dC%A8|vCw8WK(7ROo1h{5%KB{rkdtsBgMPJz% z_y5~eWvi_{<oI5=Uopm?WpC11S+5~oli&Nqd-Sc(R1VmfJl1pB3tcCW=M=uyzft`* z^}oq%`c}bwFZ8jeWh--p{d%ABgzdNVYIHAjIc02++NSGT(U`%daSnZ(`Rfo~;_ZEh zj;~z{SM7m^mgg&Ci~p8c8y%_xMbgmQXS8P5M$20oUmN=q{pkFFVo2QsQulz=Js@>2 zrwbJtV{6tu3nx6(Y5tccb#KMzMc={Gjt}X3sCu1szax6q-xc!Dk&OMIY};$_Lk7Rp z;QI^cLWSmfy?-}YCbu^eJ5$-{U80%*uG!oUYh0ssFV8Ld%EtK0zfV;rY@H#;>)t`d z9)G&DhaJ*uNY~_diFhZLtDe}HJl1omd#)46dm6s3zg>Om-glTy%!?1J?+qJ#>`B>5 z-J>?|QJ%2<hF*=<J(p9)2JCs@c{AU?tyjZ}#teLJoI{7qUx)DGtM?r`e&h7>+5CX= z+||7Wssq@QH|*{;TC;28qQ*74Hufd@(Ro-gr0xN!dqC<Qkh+)Cg$j+aD>UCZ&xL!R zFN}VHr!~6X7Cumo2V=imdU<~g_@F`Tq5s+fx=^9HUhm%xmZ@oH6FXDc=)GgKX7jdO zb)szEu%T>>*WA``)7ctAj@PsgE5;#?+Ml-SH6$AO?G*2x6{;0BCXe-8YMSc=Qqz3R zewX^xv=5n0<e&fh;SC#nY(=(G)2O?B$_2Jh>eXmXb2(*fz@EIO)vHfMW0rh=Tn8U9 ze;vY$uikg)c%9|?w(NLnWT(IN^!T>z!(+QQZhQX-EHR(qs{Ws5*9GsFUN*aP>Db)y z1<|Kw*9Ec~T^IePgE8p*KE;oE2Be+=sUJY<Sxy%!G{!dC%EYNn>!(OQdRG|jxs21{ z|D39HC%N+)@V$x?HnpjqkLop~YtF8>w4V0#JX0CAF?qb^QUhEkkk6(096zEy_ix{0 zHXXITP@!RikKHd@sR7if1DX@qepatWYk<osV*|$IHK5*lE*jJIMRAV&fcfhXUVQbw zL&sO|=T`38v2$!k^{Lh;cKzSEd2i*i*^Dh|!`?1Ep90tHygvCQ&s2`}#&gBep(q1+ zmn5&zy0F!Bqo1)qte8?4fYb#bbpc3S$mv3b#@OlmyDYrW239>&;T*&nXyKZwtqkrR z(R%`V9rHMVENC6waU3LM{)lYqG|2z9qR-q0VtY;(Dm2D6+M2Cl<oaA<XR0UYRc!#* zY_3;mT-ltWuWXE${P$F)H<`O$|9(g@#-BDlPaV~3NY~`|wra_mhgAP;OdjjG)IZk= z?2tZR-#@56XP{$d({aK4d6tjeFIz+XQ#|{XCu~2fSEKdM<&?2OCeEsV^=et+n3Zu3 zoiKkL!b`lp@6hqozg;_a=pAZ%{=9l@`vgR_JWml@{I|@SxNJ7(64BeC8V0`EHE~Ac z8eJ3prUO0bJgL}G=YZ4-AaxE%oy+M$g~r$?9@(;I+ta(Ajz`EUzC-nEqCeKS{&z>8 z;2%}(qb~3|;J(ITv;N-B?EERS2gtb}h@C(_r<&7UV9@LDGg#J>bcYz+dWX*cvYDEE z@{y{&$hfxcdWF|A*-rm?{3&S1jSdN&KP|h6C-BV%S#R{QKc@>78e<!6W#-@D>gY$V z1HFfg*6jSdpmAmA-vZUhvU36-%I0Uu|EQiPYtifZN0lF9aZz@y(EdE6Yv#sn)y8Xm zs^>N)&(mD$x$6YJO!~ZD{e=3|^Pe=Eenv2_=RS6mY-N72=UnBCq5dJx7u`at<@Wk} zu1<3~Wo$sk1J9fJoUW@*Z7v#f2Yc0i&ir)<4*R|D(D8-!Jb9K5Un8x|dOEST_IkQ% zv}V`Spz2Yh>#0+`?i(@sMa7PK4y677sgpqJc}^E9G{!D?xbd}kIMe$}CLc(B1ELp5 zea`7Zg@)eryv(jlefB4;(Ai5kH&dUNZjAndr=8fY|I4k{MYE??eO@Eq;)pnx&d9D# zA%J`q0m%9R61SW#RA{c(`*(w7=F^?T&Qvyfm#O}MYj!@3Yh2m+bV6ert<U+Kz}B+) zY5Dk6r6XBeUY~zK`5_h)+NUq;HKc3i#yQoFts9=HEVD6rp5{`YT_=$5s(AhRdG*`W zKW#QKXPBeju))XPmaWV$_K=EljP1+TDWBbuJGVEl&n~Bo4QR;gbG=$yH0B8Qs{M-j z>ku6Fd*7ksc^_rgdHXr4&wcBw>mGZ&VQ<A~&90|A8rSH0noRVg^VbzS>NAi!1Efv@ zsn0oGsL&XDKy|RuwYXfoHZ<hsH%vZ|`V2%bkoug{)3H2T;f&1O?teVW#U5It>-$`0 z&spi^_tJsO3}O#`KChV5g$m8}djD>)O#R*a#nrf_veA3WXwA--n;KVkzI3UkmCZT! zm(9;j{kG&OTkpv6`ul6j53#r<y9Tuv4{@!zu~oeLAJg}HZA_l0xzu0R38emdefd@O zslStE6LW^W+#5Fd*gdk9`pX{CrhH)gDb5nzkvq3HufHy*j16eW>u<eUS~TXqfjBpR z+x&G1FZO%iq2sI1d)I8+IWe~5eaQn~#!a8UW|M<l<TTRCthXEHQ!XF77C##OZFapO zYjomzh1Y<|&-3g0hD-;2cz#c@eU(A#5`E?kkb0HVg$k{fe5a?dOq@Ejwo(~>jov<^ zJ(qD>e$TU&Wl8S5KK!oD%?|Aod-WQUeVpH~X|3&lm!1pN$j4mjgX;ux|LpVsoch#< z-!YrWU0xr2>|xnTo~dC+G$*kAqF#;G2bWXE2C1D@AL_03qA@Er#X0i(=C4C|nJ3<N z==kdATxJ)5PxQRLVK!q++R(fBozKDgHy!9k=N~C{od(}(kaG!m&TBbcsL(#qaq7_8 zaa}1yZ=caVq3b`3)28P=TNy}l=j;E1&Akpi_uZ@4knH39*e>3!o3;LJOdhYftbf-D zWc~a6{sZ+{|9@yUkvnR-H*D~+hh=M6|BB@i`HJlq^=fqeyPPsMV9x{3oB8~#-dZjk zGZ^Q{pP0W6;l)?)J9K>Ye87{J>5qbhG4M3fn%&d*EXXypH<ypC%k`cv_-5yH-+P{^ z@P07&DhIbl8OS>)T%%|33Db>!#{RkD$vqp88UUmw0J&$&=|Y9Z*iOmf{g80)G+ea@ z2LJ7W8&AdW3EdM$&HmH&rEwe-WL}b9;tlLDh&}ZA4r@*qDm2D6+REhfbYf?!2fa6q z)@(kzR5Qxv4I9eF_-32xTQWbrzWteEj6b(z*PuRYFr;hp+b-VyPd-x_w=sFF=ThHX zC-9}x=j->P`n(_Tr)JY%SYN2nu))Xfk*(qWM|O8B7ubGEuSV;e%PC_6#>}d37AN<` zA-o>De9V1Y;yU;%^Vgw|@xDXHSL@rxk<pPSC$^1kpS}Y^*Yy3*Z1S`%$g0<xT{GO* z-!PwY+1R!CiRf>$YX(_M-lzWst=E9b_n78-hD--|c>Y$g<vV)7<p!BI^j}p#7b>(` z@|~W-GI8qA+Dc{kHG2Du_FTqk`3rRaljP3p!{6B4>`<-WtJje1V?Vm4wRY|)oquZN zV=nc<bpm-l;`9Hq`ka6M+HATan7@DMV-L&LaQ;y&k7!O{`$fGPtq(4zj14kzR(+_q z){Dlh7>RS_s`={>UgnAS9Xek1A^Q!3N5*#T9C>ip#Du<|2v;0m{ce6SJ#yCnTWbF6 zTvH?&zlM$0?EJs+W%{hP<|b#8(Wj$)U&sC(_`McW$LBU2P3(f_nqtrI3;_9DK9G3@ z<P4S5g$k{fe5a?dO#BA4_EH&sjot%BYc_t!C>y7JFVy+MVv8KFA5)4GHVx?PdPc7y zU6Z4B@g5u1+N_a}xzrEW3FLh1>*N2aPyP4@v+25EUO#;7CD}@zsd1MzC$PO^n_}KA zq*|We{Q0WODPsfj^Rq&|T2M4*FZQZEYyLU}hyC7n==kdMlbOHc1ig_~W<D?0+AWfe zofAfDc0RA!sqc1aEcM{Pt|%XQZC_qJgV+0=pp%JRjQwZDl64PcZUMPh0dnt@(}fC+ zv4fJu{T%j8d_~nB82ns6IrJwX4z=!`x@9~3G-TeCUg8bpSpg7xfZRLfbfH3HY@@AA zK5r#<rh3rZrF9Rk*?ex*IKOvlHgD)F8{=#3&sGlET0)N3wtrHL@n@;_n!|bx>6-km z5$}m{y=+V#>$%i6*9j!QzIJb@-=_XQnoa*AnAbKRdrG!a+o->Ll_zY!saK=5&E=G_ zL275!wt97{Xw0VVaSnaV{B;N~@%Fw$$5(4xk8YgaJL9Js;GyODirC`6W!A>RvFaL5 zrJ{F@(VATw$nmw&UFUZZDv5q{{)b{nO#@QXfYcBmH7%zL71}2{PRq51TvrOwJ8rb+ zGEVKE^lW9^<{kEU9r$;}37eLyrXSU7NZ0H;i^Y3(LhH-M<nfwI9dMmMKL6nJ{FeIE zfqyfbZVTphz{j4Et<(W()uiSGw%^vP(K_IA%Ge;av+6*-HC;4jXh)nQ|7HF<gqL`G z-=X7IkM7#(ze~Ax`}nSj_=7l*Kk@5d=aQf(`-8nhMr(Fn-`cHbV0PA-cz=}d^KH5= z)cM`FBZ*y%{a?kDx&Y)eEI{f4kh+l5g$m8}djD>)O#STFnktfs-u*^vHh#z}8>c0o z{A^{9%|qmPUHBix37h(L_B^fEkgmy5mv~RSPj$h@<nfwIU2vU1o}Ku-|8MoF3wO+> zj|=8?!N*>dt<(i-*CovfY+v|Z#k^ZcwcOtP-pA#Xu>tw{y-&S0UNmM8_Nuj>jX7`_ zaCgC1&j;ymBs@3oA@TgQOY0aL^G3|~8m-y6J@hTQ5Bfm7?>O@ji;Ltf*i$`E*E=(u zPVB;#=PRz%1|Vk!AhiKVZOG|Dg~r&kdv!+Eyy8Bn_iL*5z~H|@-TCwH2yv)&AGAic z!%suz3#6A?0^~jjh&@2g$vIu9&=}ijD^siPBzC5H(7Q}E09>>A9M`z%T2<$)m*)+A zWn(<K;MvMSTUW^OI@hKc<Ii&KJ4f{z(lz<*74P1!*84KP7KKmST<V<b1o9hLzP|5K zzfJw;nN2Sg%<G(wJtJGg`A6}rC{NgaTdzjzoXaU=198afT)moAG-l{4;~aXC`Rfo~ za^ii5j<43a_@&<dv7Os^BMCa~6TL1vR0E=>nSasSXS8P5#bu3abY1LE^rQ1r6hG=2 zka`BBegLUwIbEpG7<=jK^m$^{N9x(8Z-{<*{CusAzVq(yi7)!9YCIVGV(F#c0QsCA z5PN{svz#teXs*}$cY|f>+4;oIR5p6swAR5jo40O_E1Ng;m5uSH7wg<+>jybr&lV`g z_|vYvX<V-%U6bD~@gA(`nYE3{V?CF8<~o7=PP?zyPg0+H_Q__`y@Gi?^RWkHEA@<; zJD@ya`#HTDt!FN$j15vdtDe=XO+{mt?u&EiCFZX~c!{_79XdX*XVY(p+c@|dX=T>L z6|*^)kG+e&w%nSyshZO0niw!0=tt+v6gz4ekXi<$b^xhmIbEpG^7-ueBACbNtn5ws z^8a^#<VpP>XYmy2D8eBty|0)d+d2m`zf+#OUFWttFYAn!|G)cGPvofnb=&*o8!@H@ z+_&o4kM<b$gk|3zW0Ug2U+;G@y1u>|Q^tOp^7k5p4;Vxz`1=hmPUyM}&GmZ!Zm?Et zd`!{*Q@@hf>3l%+E>gYZy4gKpK;z2JfAkUGGBKXK_u0ytWIg+y(4iRP&wbk8D|!v- zn*82TeI5NaeHPTl<guR1p5Quxd@jyw-b>YIu70Z7^yz~6p5SAT%2xIS_N}eT6SiO0 ztI<8d<&?2OYG>^U_3C@knBH%UbLi#fuS0l=xAz@7UU%?g)Bl}3y`ArY!`5lMtoygj zy0~q2=fbgh={J>I7mL5S@pUn3I?#{K&r<x@7l7;wK<WpOeIcg{6&hn3ZF!t7?~i`^ z_<Ucu`GV_}PVp4!D8eD9-o9`=^V@aTgSqX_Uu$1T^*FCXw|!W?rTfC@c$}3R^trt) z+n@4(hZOR2<p)$(^sI(GW9Wxs+>mo#IY$n!n|h(+9{v=xA@Mqzv9C~Wd4B-dWe|Jl z^FQH%{N|X`br~9C^*O@PZR0a74SxN!{vY*^L_4pZtlGIpw!582%#K>$UvC$$sS3Wo zQg(C-0equD?sMq#>>0>?kkfS;8ukqD?$z)AZQH(u8`$+bwmr2i-o`>(K<w<^Z2V}| z)<xQ%{l1~sZ1Frt$<@E7GFv-k3v&g?z6&I#Ky1$GLWPDsqvQPd$ZDVGa@;?X^Um+8 z+6TwL@9Xo9dfhbrX^oE(;@<)J;(c_yN_LP_V5dRsqtCqskY^@N*JWsoZM4-|D?YyH zoX~!tYNzu7(c5jbX3q(GHLlTfLS7F~Ypl=LX4loNWNfo@eW}h1W#=C8DmyPOy!6@1 zV6rFq+2%gY2Xb&*b`9yQI;3mn<U;XoI`m9spN+}q$6U@ft`o>y^u7Bt)Mp)jrrC7A zU^?%y!N=~Et(<K*e;w2s!1mLewY!B>%k53~jZ{t<8<3wrzpHmnDH_xH9dS*(+Wd70 zFE)DLq2p_wZ61eXw(k*J{I|?nzG!ym60v!~!RS-7Yq_FvjjrW2rUU)x{A|UKvkj25 z4Un1#<ZP4Eg$j+acO<LPIxv~(T_XAHuR!)!AbNr9uRv<C({&jddM8x-U2nY_vRu42 zH2C{E$?X&Z_(p^5J@nZxf$Wz~*JWtvZTn#3_2*=!_w|y?d;zle0r3}z{+upUXy|1h zZqYjZB3;}6(3xJNjn=eo*&ZdvyuU$ui7&9zAokE_uLDwFoUY5zu&2>hW_{dB>`e8b zx9dC0t&go5S9X0I(^#Kt_4c}aj$cW}Hak!6)Be%uUYE}`;#PKEbieG`%JQT}`Cj*0 z%?EODRd)61yfuUp&B+_uH*WnOeTKru<nv=Ld!6e9G8es;FIJzu?loppmtelv`Pi+p zmA#Jrc(3LbwjblX*e#@5Zg0NVxtuaKAV1&h>g`)K_a}s@VXy!1uA01^H7Pwoh{;*> zY0p+J5sR!XRXq70X2(8MrE%VdZPCvK*b2{L^?}r-J0{2Dm&cW{jW!>f$FAeU(T2B5 zCp-?3oAz^j^%-~kh05ph8TVPUIrklV?-;Gw{eJ)9#_QQ~@w#qwKA_mK-vin2fz*8< z`+ZIqDm2DE(es4<OV_T6kp#EsyQ{xTGhw>!F?tTpX0|Lhoj^Ww1H={}zeSYOT^_bf ze^)R0(NXX;uh%WIjef0r=>em|!`RQ0Ud|-I*Bith`kYCC?3qs2WoWL~`*(w7_QZD8 z*CLtd?KWDob7-%|HM%F}bLh0j`fm|6n{)gqo1a^s{%oZySx>$<y-j%`7W+P;@7L)y zgpS>M)}s1#{QFe%ZA_l0x$I4@6UZ}WuQ|)qZ&Uws&8E*6%=acA+jb=GP3)fsH5akH zTewE|CYMvj2AMc(Z>m>ci^d$sUbPkGuS0Oe+xre3U#-alBYP%#CMI@ld%`PAo+rlC zYGu~brthh}o(>wV+4a=^y^XJ@^ND_Z?N;ol$v|o{kh%k;Cg*gaLi0FveC*x|ul;pC zE72<()3H4!A4q)zq8CX0&FSe_zpe+%<mYx`XDT0mmufwOYc@Zl8rNvO%kzW2vN0Zf z`LmTtTO-Kvn)P<Y7=M=O+3FF!hIGv{><RH6KBn4bV?4(qhc=g*<vM}vx4tI7P<?9F z7nw~D3g$J-$DWq0oTsU)`;;eazol2BHOu9cv4H^OXTo~*r)bRJ_s2QZYyLWfmw0>M zq2sGHYvsg_(fEIXcR*BQoMASM?b1VaJ0#`#3(PhClvyi__1;I3IP?x0t=YA5TjRRE z_Ih|7vRKvf<8Y!s#6U6S`N<kVp6dX4z5(R<3NWP$6&hoEhKHxGd7p&$Ai{e(KNfv- z8~p5X(fx}eX8m3EgVoqDcCB<%Pl421AoUJNz02uBh30y_e>Yerhu0E2Q`zY4R4oA4 zYz_xCu51p`S2o5SpZRQM!sZNeyxu*e7~{|4AJYHX(Q8Q8<add95C5n>*I#3v&86PC zP9UFc_Vv6<ed^t6vx&U(dn(?r)5ji{t<*be^0@MZ?N{|`wBEU#GB#jOUhnGFuA(u0 zKOE=K!{)C;c=6Ty4juo{$o7#PTP8;AzhhAJR=roh%MG2z*x}tX(cl_wW!6fE>Ozrx z^!6F8*|l<8<NQ0W`z=<r{Meu9hiAQFiXT9pQ30tbK<Zvj7b-Ny4)5;YG4|xh&YchK z7~3_zHWokOp`Fs&;C*fC-?5*FKD$kB>sj|#JVkBU@oKCX+i$i4slh;O1!8MX7b-N@ z>;1dIGC94L*qO>kZ>MSlxMp)YsBs>rW^;-@AKPq<&)@fKW!UBra=iYnQ;hLvvG%e9 zdJXBC{4Nsj<r6wb)tGm4sei5$$TNLk-+k&+{~j@$$a|;y-mufh9+$15{wbd0$`iI< z)vM9^=W@!}fIWHrt5?ek$NYGlLmSLrhw$R7_Z>REXLNMzNh^NfXz(}M%B+Q3W^1k^ z)!Xb^$Ys^)m$CPl=5CR^x!8N`v$TeiIQSZR)bh7g_3(mTLsHB+agliMJE`aUHYU}L zZF5;et`oRGvV4wgRG&38U^YD_$TM?q*x+Mt$X3=6>%2=ZY+v$|jjth>Q^p4DnYD&2 zPVS3Ccs+Lcn1k4>w#oc;=wrO^(DAExjQIHh)U^E2sq?4Id|dX?`Jaz<%$z2dvG?jH zz}~&Dc(!uf@`Z7}e%@`lJFc~|@TcPX;hZrj-riICtsWcWbHE*&%ldJhK-PfIk9Vri z`gxbxG$@#_A0OK#TN%q5A62}teXCxL?m;f6j19z~*|ktK<^uMrZ8m=$f+ODEcj$OM z8Qt=vf8ida8vOsCx9fqcbWGc|4zglGhz%h$goY48Lo-5VGQuD`4Gqm|W-`;zkQE+e zH-v`RmXH;j)!OWamO%(Dp{1pd5Yx^yE3{;HmhZaW_qjXwd7aZ+&9~q4o92H0+|PAi z_x=2N|D1E)xASrQJ`iKa^TXIDTx{>SQ8!YW%3Q61&2V_M+i%+@du&Sl6EM-2pCQ`M z7RUAoIR{(Qnd8`v<X_?+g1o460b)%5D0xm!$@5%Fp67boQRSpa_|mTBRN~jIcxo)# zjlue3-DKm(K2wcT{T}Phpq-b*k$vKP#EG1`!6^fCtB{Qtqk8COKZWD19cypAHf5g> zo0Pm4BkQ0L<p9bHEhmm0KZBD*4$?OtT)9thFPo28lY0%<MwYAX<tv|6vsL3vg#$6X z`-I<`pP8RO^MsrQc{AtDnv=gEZ{FM!W}SXIfsn{YKIadsmz0u{eb(H0+0zf4G2Q9m z_9;tRZ#w9+CoMwUxWAUWpWi#J+(Ve@UE|1T>hQXda(~DHiz9LJ#*cj`nxwBcMuV2m zV%VgPNaE_Uw?6nR*Zjq0C5vVX5B8~U!|(Uto3l4Q?fS_2vCoX1E^ZIjPc%(-&2wFL zaDNMvXg3}_*)-WTpZo%Tr}$@kZ{WqCe~rK^FWklXOSg6-`Il#H(>`^U*s-VNeOpR? zCPc~mw%&GBIf;GAh5I<;-Scda4;5r@Do#7y^_7)jQoo1KQrKm@Df#&-CHHVj?&02c zR5>Y<ztXPdRK~OR$;ji`W!ok@o-x={r#f!*XR0yo+jG5%Qu9;x{}RNQaqI@K46L6* z<T<{rSgWxZ-`oguYg6`ru}R5sk@fyFl=)fI#g@}DTSk?W$W!{}gR8UugLfjvg4}Dk z{<DI*ZqEH*_BEC?&Qv%MW3qc&xIUxgi&Sd;70Ehsl(I;v_w0xE+stks>P#d}Wj!>u zM_vzowr#TOp#=L$#lgEce}4N|0(8YU#-|K%OS1AnE4h!co}aCI+fn5t_T7ki&0`18 zMeQ-si8&P}y2hG3d{)9P<4VbWjFS5pCHFCJJF1*SJ`+t-8MlIGf^pM!Xt&n3O?KS6 z(Qm5bMh;VrarWNpO`MvCvX8AmjOkAuk4ZSkDMX&*+krLK*MWO6wvRW~o3f9IO-hc7 ztkX+S=03LEa=O%(QRO6ZkiLoF%6*J`?EvQ!%JX@SmgT69%}KWu`nx`jGZhZR^zLJR zdy;4GacGf;oWFY7lRV{_P6zzQK8eZeO*MV>q{|U6p1)>17i{Bs2i0m`b7VAic)dr- z^Vdd;Bl|q@r<$a%H#SX{&(C3#IwEODm%a7D7`Q*YTUheL^Vo@UoznV$J{U)Bhn$;j z+ho^&_FwQ_keA)_z^XS~eBx!|e08GdH-m~7`(A^%@|uK_=cSa~&nbCc>TO4rlh~JB zxTo{HwCvR&A1X|AuPFz2>N64ZTG(a0DY>6hazCf!e(r5Ym6O<aqG>AQnTq`^96s$9 z*|y1!X9N08b==5hsxh9w556;{*17EGS0l#srx@2f-S{g+p5t2v-R4)YSK2<_SZ~UH zE;cFo8Jeu)t5D{CUTHaT-1!{?N#r1XhrpHlIgdH5m`~)M@)E`?%hmSsmHmpX8fPjT zh%wncD_ox%@<lS%Uy-aMM=6Vx`Uv~n|J(U#HueB=@g{Pvux*oF7qOiaKhJ4X_Gz;U z@k_Fj=cg=lKcnRNska?fPGa9$?2Wwk=lQ8U<~gya!bI0v4!BdFiI_LSF83Qs?q`(T z&nUT{dD~ItB=((Xn#z8*QSsDvXg3{eopqBPw^H<*==rI4+-PsAF<!GTK98~Mhd8pI z-GCU=p9~zE8t_+$Jjb^Hx@%rvXS!@3Z>%?EKNFjj+|OjaUWYRGv+FG<j=Oh1lfLcX z%KeOcuE98w`zZb<x}OQoR5-xw5B4*^y(z*TL?|czKRizjIVV%+t0DC>9RQ0_w;z6+ z;GTy{wIgpr9C_Y4tlD^9!p4RkM@Ca;FO(^dg3PtLavboEKl@HJNnh_Vps>s3a4T$5 zM<j7|*;^m{4($Km`6|DQ7>jeua6Xf3fo+@YelY*db%uK?&kyV0cJU=%6&K?E1OEK( zKh!B+?7JHA<abLcxt~*VKc(b%PrdD^a+27U@_2Hx`zhm>i~S@VChZ#AHre<QZ>n*s zO~Eq+?HnYI?1{CA6FKGL`k@tng~)S^QlZ=P7RJl=@y2UY_C&Es$=J%AzYXO8%C}oi zcR+HFltd2Fw;No!CvxBJ!JHuX*lxr;%hmSsm9@=QjWZPv#F*^*4%erQe39<7{)%KB zIZ9ci)O+@X|Ce(+&gmqqUvls!axJxOlbzGO@8B~|j33Xj?EdWdP8;<{>|*%mw<k0! zUgYvC#FO7IrsTCOCHDkM&Npv6s+`2W6HQau6AH1O!r{|yoo$<J{D?QzIJHj4y&pRV zi6eW$-G~!86=IL>#9txXFh*I>P3p&Q{A?d@yf$S|5Sx^Yt<3p4l({F|WjWPDdiMnB zI{>cS6S!{;Vos2I5|8;=s6_Je_3jCRGZhZR_wEUP>)W%A3E^;*^CM4tlBYb=>0tX* z?~nJIx#u@h?Z^hii|0d8e+|w(9*0@AX3&w*)Zu+R%KafrERMv-8#nfyXky<5C(NC5 z`rO=E3+Bz5nJsz9{CRV81&4YW2dp=lil@xS2f&MSq8@w2F#ht8=f1(d74PDAX1zh* zSQpL3j`Sl}IRE!4Tvh#pIl(qRf60f}l1-4*wdUA$(n(@Gk&fCQ(WiZh59I;2%rTd; z=z1ml79oC|4_v!NHb!3m$uY)uW*gq(if3>yEIFZg;d1+$MkfyLZxha1c=4i@rKc`j zak1^<w8^kXngYa){~N{<<4P_ZSN3Q9Na}i%Wy`FSdBOPex8})e{OJ#MQh`OOQ#8L& zsuKMjf&Lm*Cs}U{q(0JkQD68_@?I(9&w3dLZ@XYdvL)?WMmp{UtWto%Q%S~DRgGoE zZXx0)bC`8`euD)a>Xp5RXSE=HG%4|Beffdw&5#-sJzjgFy~mDCTvUuR=BSG5eQL;e zyvVZ=eb=yqC(&-W<TqaA!*R)k3^!g$svTJ;i7oGbpN)7>;SoFTB3Z{iQWh!o^A;^E zvR`|j$vP(LxBd^_<p_Uyy)=m9uGCXbBt@Dl(l^|*?*i}taNSU!eDZDEWY1BmhHxD* z;QG=2dC-qQpZblk&pUr=6fbi59b(MuK1!}NO3q<QUiW$1QRO7|T{`yGS#DtY%NT## z?D$y$Ud3Oz=cJXRLB6%9FWX`}=db>mQ=Rb$w<i-T3%VM!#qy%u2@RCoQz`lVJ8yeP z-~ZsbKk%RPAUWDyC-fs3^F!{Db=mktdiF-QhtKa}m-B;iZz~x;mU$o2+m0$H(QelE zLuPcn8=uy=AfGPqk@vEef8f4HAYl7>MIm&hj+l?bF5h2ExsR1Rmt&dZ>}^Mtli0V^ zc`+7NP#K=1tLi!DxJNN=ooj>RNEPl^{HwP-^f{%4a74@pp*;TpK0L-!9$_Wp#qxA3 zbvvq@M4l5(Q(3p|il??iyCb%3vg<bO!>O;&67-$wT4_Sxsm|*G^quM)WZb4YFIo@A zGb`=>PaHYsJ&Jk3F=)pA9siMgEyXz*M_tUxYTL&<KX^>_))Ch)v5(lK<SCCFZ+?q1 z*JHEg)C#HRz3!U^u3Ue--pj`PA@>seMP;E9$;(Y2XEn}LI1qob$JTItddL^)3G1&& z){&!>MM}Lo9{<1HTdDXsxX+M>B=T&vZIfNUsh>=I{SGVpwD}}r#(kHP$5%=oA1HZz z^|qtRN$lGQyAxge#n81~oiTaZ;#2ZCNy+0RC6ANdcHK7-`~5`sjed{acHnd0rR4FD zlKxV1fA_Yd%1QLM8FnYS=gfz$?dtgZXW;X=N6F(JCD$D#<L_-pm6K>U6UTg>Bl6yv zy_O$amlNH`20eV9fn6TID0zINr2mvWzIoeG<s|Z%Xqw9Lt^U(s+_W9q?Xhi>T_16u zO?`djqVH7acoq6ib)I&h?^Nd+<2KcKF){<!bap=_jvU|GFfTX;)i{=o;I9yQ&dCPo zj{IYt3D|wbJ3lt%_$D?fd3=-o`;RE|`1U8u=~+nc@lE>1;ocY58IQrqm_Ov6%llzj ztn@#=3C>hF5Z`-z^E+0lV-mYNF_-&<sx3+7XF7^jx9gDgrqaFNC)JL80WspeqNKkE z*B8&5*;x0DBcrLqy_j+@$Xbgd$9(VDvhPHb^!3K0#`1XyHmM_$xVr4EKWq8ou?J|( zv?RoaEsiUuvNvU{3&u`^({8D4o9x~cgX^n_K0m8j*{97{5i=e;DEXNvC68s4Ja&8A zQRO7|^<Eo0@l@@V;1wUUo%82+4V(>K+tnGf*I+*#6_iI?nPTNZRvxO_k#!Pz#o-=; z?3shs-$>WG?H;>bu*Y$wOtzBoV424@Z#$}-M7y!r%gQ#o*N|<~g4enY;3NBR$H@5C zy1CG`kWL)_0=qk-f-==gjtk5D4v4oMRZb!w-k0EUpVzeYU%R-hXOiPl*7NfndwTD4 zHQfLEJbYfad?=HkLdkehl8?6?RZbGSQXWrEWnI;52*yog({872o9wy@;FvVkb(Mv_ zQ=R)2=sVT<+lIbVookHSROdzDFno_n9T()7{|e>>$Dk7T@&@r&h&<<H0d#x*iTks* zk9U4-$}wMTQt~=L_WhSp4xrp=IdQJ;iLxYekiLOo_n6P~k_5~ja?e8DM34D`GZhZx zGudNYxIRtfi}Z%|S0wA`tCU4by*@6=MXh&ys2eFwW&P%T5qbSq*|y29->5GqzJ5ED zefs(~V#eblC69}gJPuHD|Mj+`%1P{74!aXw`<c+SU7a!M0X~m=lsxWH^0-II;~piC zd(w`qlW2DsSQFhhT0M6E3S5pGWwMp@mt`LJyzQuR675#vI5W{bCl$K3tK;uGz~}Le zlE*hn#+Q=E6K^}JoJ704&&|&Zcui~1KOIaeOmrV>_waew@}W!u4khD4Nj~0oR5^)! zCYq+QK1xS|anp8ax5>6mc6|(>-$ajZ-u01$y?d&2ya0WtI#27+cdB!ZahvMA$UXwU zd$9W{apd^+7Ul)Vpb+O*o%kz6o^!Gcx&=`~rq}lI&W}wwzKKmr9^YjD?nXI)@|%_u z=jxs)OCks9I{>b{rsXks6l;LolXwl6<!XER%JmytHO^Ex5W{<X^E+1QV-ou_k%wH@ z>h>gEnCYlGx``S1-iv#k>Q>tS-$$HyT|27Uc<#(*`<Y%eb+}Jaa(^tbx)K*}yx4c5 ziGAf`^!!=#^G}_dJ!`@7XUv{GYn}t4{fwZOG{YLBZU_8Kx1UAYYDauv{p?q5+(X%D zKbwoD4zJrOd2ch{>i%E(Nn75r&->Qp@DXg1zewupvbX+(<%@z(z{G1c7A;zO{K^Y2 zT%@1-ON@!6$?nPAHv|82d3*86In%aHc290aKiL}#=j1tKL%eXQT-m42r-&c@pyW9V zC6D2hJcfJQQRO7|t;Th$*v%MS;Mo0<ZTE^{kKNC#T}pm8jFNUKY1i8>c#-^)b}hZ* zQwYAg-TQr=)E9D0<G<ILa5lo#5liN{#${ggQ-LRKQYYo{q?fzs25iRrJsfREbVZ8Y zL2zM=nOMiq*aQD@ul3uv4&Hl6L>+bcmwonG4*y8^LONAUiMbZz$NTt{{LTv{$CGkj zD|v1z?Z`TbeR&_G#queO3G(Sgoy@b26~{Y#Bo4Own3xY;DG+lIb{R`b-eaU>3@FLV z+m0$Hv9I%v(y<L9dtuqaU>oDc?{V-xNpT>^l^SxsP;0qFx=#}LE|lxv!HLHUO2&wi z+$nh;>1{`qlgM?VDbl=>{@(BGaL;N}JVlR^c86`-WcRGp?}KAH**&XR^_}d#(}=!P zo!dz`H=D{l)G>>kUuzPgaK89Gp5X#JjII;kSJpc7xe#sAcWa!4y|*GN>iHMk>rJT_ zDbK!68JsiLCugIJ(*zvap)PUW2hIz?;q{X@2~PJhL7bZJTpa2OC*t%0rvo_rKD;*x zPWA44jqz#u-o?p{#`hX*p8fs@IL`qm+??Jz;35~#3$7d1WCLTLhrYjpn8Xw8j32Ex z!|;`VZqLZr(=2u^`ipMQ99%ajTj}}h4A)`wua_P`Z0glo$$Sj{D%-nEKJ@t8%bUMB z>s8i=OP$J&w8tWjAHe_D;QyXdsbsh~Hdq|;pzosoA#h&xiDT87!8oR7-e;<TLEnf; zJi(s78Qvj>viM9Jk+3C>eb5&!Wr&B^ihcbalRw{$<2JF|JwR;gwOYwM;}|YJ+aNyu z@as+Zl|)5P3KyS2%Y*oOtUdxxw_kkD3C4$}nt?&i#3Y_z4+qv8`XRnhHxjnQXCw5f z$5e)RR4H5e1?vobIkBUuo!HdL-8`tz_zc^9q1?7pXIsSQWBBzh{NjBmZweQm_y>aP zIn81b=M&)c0w>(@LU8oH(2KtB*m!d7@>;bNe&oakc}soPPuH0k<(D4&0oWBBFaNRi zzaVs6vJo4`ikOU(U}tQBwU0W9A@L$%PYbx#YE_)czu4L;KjB4_zHpu4@%f>LOPYzz z9<^37&v9YOhaS&0%J*9Jx>FJ6zfNUGnx`S|pThqS5l3D}c~iK!H&`6<&~xN7;Cx`m z!;2$vthyi=$C7pXm}+3qH)0Y`uq(I3+DBP@CSD|LiDMu1#cmnmA-3XcFEjaz))`)F z95j0I!NjIspOwrrj&WN*YAT?|IBvb;TRp4~m*P}EX^%r3*TVln_`icxDj6=0gO)FO z=rJ7x&RU;1c3u>WBhB;xgT4`yc!E6`v)<5O@tL}juqBSk=tDiGdc;F)C9IukY8S6F zJcpfEwCzL0rcU-&L4C$CX4qZd4GL#F#OLqu>vQ-u-aet%cj|_>#(2!PSj1TeoMGUM zw@>KfewyN`$9z3-{^1kn#*)xDXTn$dPE7hO*fBpw%uy#XVO%0%OPs4!+?o+ru~qZ^ zGE=$~&z}Rvl4p1Rkl4g4vXXhdAG0iJd&Fl5etqK;XC0q9%Y*oOEH?n>YoGWumxjit z02t&<OyUW4%GTH;Q5IjwHxjnQry2U<R~_P^ZIv%~_r;|TU3Ckwsb{QYp7CjXI(VF6 z9n%ho&p+VTcaw-uo8>`#JqDix=RZF2=_m`0PX#c@nV7^A>@_%M(GT&3Tq9vie7c}d zJ*GOuLu|$0d5x*Lbe-Wnj=VcA+?CkWN!%u=ujfypI$p*jKEv>9b6o$8w@&r^X+r-k zpfA_?yl#&z$M^WYIcbbvl(j+pFMv<|@z$^22l^Fn`a%5CRrpN6`cJ>~*nbK90PuP2 z_a-?GHKV_7iw6c{MNHxe_WW&eeFW|jL-vV;E#p$8__ksk#8&p_`<e19@Hs6oDsCxx zfY`)qwUT)~E~5%(N5t(b__dACxahcL0e4%^xb#)vc}#Z)*F~MRLHrTmQ-8d1(c?b2 zU2r~;JI5vK=Xl45#iU<)&ixbku|DHcf&Rpj)C>&9ikQR`>^0MH?u)X-kou9ZWn4Bw zUvTR&4q~hM+nY^JrF;Dp|Hwyo6PtR8aY21OF6FkJIy)h5U&F5*ea1z{t?ggI_@`Mc z;(P;~oq)sd%z9I}^M@G4Q_rDM;KcjHxyFRXIUc^!cVg0S!S3E3b02jQ6Y`3LEpaYV zaVth#wXK5d-F@k+zuY=NY~rQv5I)W^YJTmE_<Re$cJqm|p8vhO-)Q*0b?#%=wEpWQ z+6tHYE#Gq3tFw99`xor(4tqQfdy|ZZ9@o@u?=yTyJMU}U_<Zjj-ab;!6TjfU_(*&I zhP^#tFG&=Y6npyq3Y)WkvCixOdG0Y+EmG<s**4fo0<PYl%h7L*<xz@u`p!<|u@O9| zKi)ntw9BHgwNw{(vl#{+ufML{>d1cLgiASgyqz|ir@jBc-kz|hpUE!$#cwkZydP8< zADl1L<GwRejeW<C9p{r?yWasn5%}XB4@zzdu7`{Vwl~SZ;2b3;@dTUiw&%Q+xl8+z zu%`vsife5(zbi5SLu}pRu7|B&zjc7v)UUUadA;upE1U$x?R)sOAN(5cIIZI*^E?Cb zYqD6xi7JbVN&(Jz^IVU&%-=fT2q)r117|vLl1SW>WE}PUO@W{LLtoF!vRi}mvLE>5 zN+{z02>8?=Z(i#4sOKBG3eIN0IRH50%{RS|cwBMjTmS9rOr?z>$4l>F0pRZo{PE`7 z{Mz7r8+q?oQwt2v0b&wQuoHH|@5E7-xj`<Guw}jtKwmf)V19|M;+vi@y{p$5J}Yiv z<2@G;TlBOXw*C38Y&{n@hhJ&%i=RPzQ?&gMu2x|dUw)-2L7BFQNqf;aDaA*i%SuY@ zuY>jHp)=k4`@}ATZuTAcjqSNFI`8X_M_t7yW$om|_Pm53cfCe3Z98>#!JOFwoR0wK z@z#hQ>#`%RGJGF7eZ23S?QbAXxD;>gG(&b-pJ{JP*vo)D9s|5d)_|U)vD@8d_>Ot% zN001wzqgN+jq*!;q`er}I}-NBTf2JAHCnEWpC13MfO9x-#+$Qz$GGsJ%mD_+gqXw= zY`(9U<0NB6-ALHe0&K<giyBY9Yh7#=jPB#S`<VB@R;*fkFR`iLW+n4_{Nq*qu87Z% z;a8T=`0MyIsB_~k%ZWH!183$W#<kJ*B~Lw9V}Wy=Pn`K)WctOFcbhRSz@YEMB%WaN zJ*kX`#Dw~huqDn>y9U<{-w!Ren*Mm3^UhU%)^K~x`*#zYc%@b{&p3Cz`;6iHe0dM( zj=w*%CF{ebbZe(e+4~9NxDEWzf&UZz%!b%}M=y`@-!6*usV1)Vm7M~cr@d`q?<Ajb z)8ij&`_gYc$EE@2M4xfv`(1S`ih;pc5|em>&G$Ppz7k{hiG(fV)&_mS=6i0nt)kz! z*OUuBkAI2S)Jwtp??j*DHn`+b!*^IBBvDPLUo}_SymH9eF&2mIiRcsu|L4O0@s7PZ zj>S>$nvRF?n_%>xb<X>rdhJNLK-r16dD`0!_VRq}>3y`r@}}Q<&TbE!Iez2zaOk)t z0fVt5Ch-KD?-XQwCC2n261I$6Df)=7d_O1OQ_OPNRhK#MC**IvZcY1jJ+U1<ym!r! z_>bdOq3ZRR?f}2e@bQc93KT5LQDD)Qg9$r=&3C=g{ul@7M#2`qauiR#Gf`|+Zc%Ue z-Z;*)9Xs~hjo7r^tMuttzOGko@$l<hAHVnxH)2ZaMt|BOChZ6|-%UmP!h!mcu*I(= z^buUX%T8>yEU9<ibH(p5UUBnRmk^tJqe`EC)t#g6c~Jpr4+LXJ_;tY~=5wmT*Rk6P zIOqGshwrX(ExZ2@1B;xANxp*3_dL-L@rBxvuq8fO=p)#ChnKd+cSiB}F*Eg-FA-bx zw9K{jd~b}7-Oli95&RnO+;Yf+*@-f35tH_!agvY{6~I5|tyWQi=~00LqXILSk@K2v z=<ywK`6plIytjt?)A3)fKiYYZ4e}X#1$lEknfR<e9`BN~_K0|XmJENWTWclrNf`G8 z__YLnP4swIckH~exaC?b;_L#Pr9SgV@4p-2Cppj`Jr=tHr^IjmJQX^B(tyDj5tDd= z&39%nZW24%i-bKbz*c-$LB*Hv0OGsgSYKTBjPw2tj>ml1A~x$AtYn_!A#vWQaP~xe zegePB;8zkAJxR{Hb$oQ3TP+rG5`nYQC(in~Q*HZ_r=B~z0cV9zocV4JO|=df^qrW* z6KuZEg7J`;uumjxiSr=z1)J|E(YE+*3|?<Mu%P5%VvC-ZBep-Eqp!zccldQV{2Fha z)_5>WQKl_o(q1$MIru!~;4^?_jg~`)@6HKqagXy1f8H<8y>a!!<U)?ERx+>WM4YPM z3uCzlxXQa7sH>CA2|bp2PIOuyh?4}IYklT~o?8vJFL~<t?g^Z$edYw8@2`0_1B1R3 zlX!y7=YcaG5)<}`ge`MoBlHEE?>P`#EibKfo-NKepATEare5NHL46(Pa@$Uwy%C?i z;8zv=N@9g4Nt|_jbez*H7IF3l&W%2C*5ehUc<MQk44fN$;>_ocYpU_^mA(^`ehW6A z$<263OxPz9w#2ze#f{Hj7h65i*ErAj=C$lMr|jB8Y|TOPrM8~WH`ZgY5B$0bevP;G z;?YNND2ISWTg0TjXbf_2?fvjs<gx}wpv(6I6yNf=^NeNg%X1dq{0DL(?y$0>=LXv( zC1XtY1?Sb^Jl_2mJ*LSDU&m)Z;MDqzDW97xwkZdJMb5+|U%}=xV(EwYLfuH%GNu{m zLp>%wKU!?n?01UuyjjMl2)2k#ow)sj`jO(Z58{&ozkUV3WSy|DB&pN!$yWG!45kA| zp7kpIMapNMe1@#lQO1BHITMq71)I-Zr61x8bt7R*eC8{E`7B+rRdQ9m^9)xWZytMn z+lPovJZ~zp^?Y8cj@|z7i_dT!Z_Y=dkH+f<7Htue_ISJr_ncXo>x0nYbD9ellsM07 z<-N48_q}32a?!ZV^Lj1L*7F&j+Mff!^#O3@T=1rVy+6ulS5}6>_3BTi9O?G}kuXxP zc7NNi+XLZlAZmq8%$Ffnj45O1JQMfA^Gxi!>kO}_@QG(mB>2qkCrmQ*7}M8x_>#A- z!=|j!66blUyr;k8;;(My*mxDW4!dkUpXaH^Hx*;ogt6m&CU4rzj-5QeRoZiaL0iP6 zy~0PjoM(hGl=~$PzeyXSE0P@YY(1Z^rg<J{IqWIQN^WL}@mV*jI;sm;v_(wXtE_n3 zd1f2u>B$36-AfzPk4p=3AqV+xOvypP`hBq<9Rv=)LmVc$U)RK6Zup$WcwoNKF#Rgp z3YUhqcR#;tg}sf|f7&}3_T)K{-hQ(G>2rr{%XcHBa3@Y0aOC-pk#O{V{^57s&)`cC zA97+J;>-Zf<M4k6F9^!QM}HQUQ@)?`yhYCA<<HN2AWS!>D%*|&3*=5odxyZ@A7JkQ zR(O)w)1Tq>*w}GA_53;%IFABH_B0J8`#+z1r|V;Y!8t-q;t4jNi^O>&bBBE*VNVOV zi1XF_;`9H+R{TqC&NG%c9}8iN*zA#ah%1@b^RY+a?1%WI!!LO*8+COG7ay5tiLg^` zv50dRaGpkdcpUO3!O`O?^Q;Is!ihMC14o{l76~WZJZlCHIk69MjsT842Q3m#$h=qc zhnxf_131t4%pZOJP-J7m`0G94NZ`oxpS*lz{_wd{x-AD798+QvPq6u1CXTa=HTy)u zo)&Ns>(EEAo#$&=TSKR>HhjhtLKaoN&80=e7CkK+Z9Sjwq3707@QcrQ8t?oe^UzSt zB$R23n6$^=?0KI-CF?8&x_nMu-Qzbp&lTZ5Q2Wx1`^kg+3aw<G^IX0|KcH-;z`3Kr zQ=VZ&U7cip>TwKgv)J&NLA>8~)wllpZfZL216iB2mkE3F>>_Q8d9kPGU%TyF1{~o| zoMV8~h4_X$=Mfye9%}pDeYYJr<V1VKITkp70S>Q?yh(8M`W$}e%&~buPV7UR<AC$J z502hXbFE(-Cq1{afb$A)WSli8Sr2^Xiqv=RU2WzAgJVxj;t4i?lh64ebAo*$VNVOV zh)vKJY(9HNY$cvo?fkx<^Xw7WA~y9JtYlu#v*g2rIMWfInea=V2|`_+B+fcMvY(a! zr_XXC&hfzML449RfXxez9xs_ct-ujZ#5n;te+ABD=g&sqkP}T3CmT5O3=S_P;iKoX zo<HOyIJ1Bw&(4U1qt{`pjS1tg*ZOSW$TJMQI5L0uOat9k2MmrWF^MPGd>#PDS;m@u zB4JMpxQK($7i>P;L2R|{yQTAN0UnR{-|~?Ai7k3sj@bVEjlP~+C&I7yF<#^Cr_~<J zQj}?nn6wv-$?JXefvmG~wDTD$Be&n+JR5-f!R~{{{+T>9KgrkI`r)HoY^l!yPd*!9 zJf0~>1~F4s)tdyAX^WV&7Y$M~04Us&(9Y*9<XyJX6o2b}k7oTh?|wtuw3~Z$5RYqc z%{}fpZ<DgKKj!L5;3mIuXFr`}uIf2f`r3I8{xEO~Ef#T32F_<bYe&!dji<SLW(N2Q zC*qs}oVCE2u8G*Z@X>pC{*yBuK25+OC#n)B7dV4HeDt1Bwd4uI-z(F`@qfF%-J1M? zsI>8A1G!Vu-l?$nci0>6n4$Nw49k_{r03Hd;0ypq#+mq%WUcZUDN>hv{W&HZ7#w?I z5>K!@k>`AnIl(@Wu%`uF#9H(b>}t%bF<akWZc=_UWSn#7Ma#N~O}*sIpg!kWgR0ka za4!7%+{dqm&4PXrI}zB0utiMT5$w2Q)*IRv4%Cf=Eq;|Ko>}li+bY@I^{b?3yKG_; zuf$5`=~r6Ad&WQyLml<e$PwX|GF77*lpUu6|D~c+9{m3r{*QOgujfa(#UT$J<I{li zPoFq8Zy6fLB4E%rViHfV2a%`0;xqY1!j?F;LSOu<Lp;RR{N6K7`Bp>D`uTA458H`N zz3gLy`p!P2>UE6g!LN-zevSM%=vQu2kI4i!ZLI+&?NHKY%yIbb6Y|1=b&;^A1=xyb zc_^N>@I!0`&VCrbw{ZPhUv_mmv8i8VCG*a_4>RruVcbuLUz@!+@o}%SJczGjmk*pD z0cX5@VR+kMe8{T+801V$;t6&?^7KP|p>8B>iBB{1smIiZc!;gc-gohRWH&ya@4RMP zV!K+Q|F_xtiY%9lw4MRKV&GS}1ts6(%tjy4r%Xqgwuni4-eY4X+U30&dD{&c-iIsw z^!dYSTjNMR-_}>nbn&GAOmN%Ehg-h~vm0gFA|~yT+aUmyaqC50BRIvZ-QP6gJs-Sg zdi=tNlWCiF2dreC^NOhtdfa!OuCHleIb2Fm{iOY1bUF(@OoI>O-9ys*&M^3~KY8eQ z%?Hl5KJzbe$I$uL2Mqc~OyUW4;qmJY{S}{SFB0~&09&z#qK})ybt~c_wrU<(X6knu za(<Wm!q9e~5?l1N%&_$vA$5$;hF{zHjB$qtvlV69A|~y5=U+SO2Ei%q?Ji?>cE|Yi z-o-0vTXT|pkFBrEcJZYC9B|v-hg;zZp_q9n(-tvl&pZF-qrD59lAet-l?g7lXa0Ih zJ#EwOh?UH9{>eRpeq|>O^Xgo1+Zo)(yEm)nm7J&L0l&^-5vKq+3BVcenoFOjkyq8O z?wWr4-nYX|YpO)0C_jWd?VSgEyTBfQSM5#V&M!+XSH?w;-%o+F6L4f*Yb-fWYe)=T z4@1CUtcgiH!7iPJn4m0UK&(jE(*mxgO!N_(Z5T(f)j97Tld=1d^BKjfbJibCZ0dC> zeU596s@G$_0DkT6<5%k*p?-A$i?)bKJA$2ZB78(yIFLsqZ1F38cF?bU_#w8^?z_@d z?&;3gX-6G&B(aHStYn^k^*uGmG(eBvk-9GN+ho><OYKKKZQ7v6^RYc1%{()l4(m!S zpMJ&b5X_@O#A$!TY5y=C!_A`{)xXZ>iL($m2LNZH^FPV<rQdo?&j-$QpK)tR4js1& zU@(@%B%WaR=HR=gC`*j#VkB%Cw=U>QD7q0>u@&ETjj7nzosXB^I;)1*)Js1psPD|j zbM|xUb8I_x4n=$}fM17AB0i;OxHvV$u~@_@0?y$+IQqJ>e&so1{s<@HECS9EJ~(>c z>$P#Azk04-2%L1E@ygymI9`RXKWI{c;lvP_#1rhQlaYt75?d#}5wNEP*oyD+s`%Go ze8g7v!qp}&)g7;Dj2E$~KVT*Edb~yzPCDXq5&X)8?TH>2WW2I~-(s<dQw*GAd~hO- zmvAD^V&EL>gQJfxRh9$&)pPV`z&ScXOl7}cb8v9H7^gm9I57k!@dUf@6y#aPAN80b zVas@>qK~VIb0Lh6*eW{sX_Ga>-N!n<dGT6ei=LJlw!Y$2my5Jr48M+tU*nyB_joW{ zQKl_o(jLFlFtcdv6^kW{7p|B|d^t9@L#G-XSyy(5JGW+SxBh5yVO_74%<H+;m>cxv zFpOmhxSj;A6WuFo9(v5Q9qL}29MH1c%fyeAdZ5R98!va4<wnw}uzZFfV{M+imVnpE z;FTJtW4L2MzU`Y1zr{!5ECtRfKK|*wMekAMMDxU12Ao_U9DOft0OP~H90xsrN`aFD z92rOINRm09c|_=(?*<0PmYBp7?6SGIo<Lc~oH&uNrv+RqNpphZUxRrgwpu^F!NeTt z&ZBc-i`eYZZ6))19@Q(H!x5iL;MZyJYrH*5$4AC}066&;i#W@HGY>ci(x4~Fxa;wf zaZd$L;Y6Gjz&YJ#ydv#&<V4fNDFaTvk6(JPOSOF&H@yZ|0w)hR<BfaCF`?t$2@H+} zF^MPGxq0}k4`mr6a*c#7<DP&%)MHA<IBQ!&$GUsn?U!AAFtJ^&(EpQdeb#9%7iql| ze$9tp<Lz~8JeUnA(-tvlFZBDuGk>txH9;riIGndWa->Ph8gibm@xY<eI>?1Q>aAp+ zb5yTk)-fG{vAhgi7x>HxJ(k_D%f7_daVZDRPkqL6{_&w>SqltuCMNL&yKo+U`-`&p zLVJ<0rv=!G^9Ja<Iou0GJj7P%x*n69?Z)Rx*djLd+O1?hQhYKHpH=Xy2!4&XhIM>~ zEf3=BF}NH!7x=`dV0JJ*BQ;x^R$!1bF^MPG8K-0aL|J^H50S7XJ^}Qh9#anDp>6e@ z=-$`Z^OCJ%i0x{H{vT)Shah$Au7F>~@N2xe-s-`uMwzyVNqeE+&voYdq7}J|mR?j= z9CCcGg>F{Pkg3~prb#(z$a&V!{VyMrO-_zq`9ba+(+*Xy{i*=xr9NZPadL1hh@Ay& z+9GBS@`BxgJnahy>PEtz7GP^sRE^?U1V6N`nq1efHrld!NoR!mRj=yF#YK&Zx)Oe^ z@bN2kPSCHKbJ|P-uxX2!v?JK{$kV=Xpp8h_;#aZa*#$quR`%<wP4nC#=QsFwrEJ?l zY~ieBnXNBB%jF_%KZjrCK65PL%uvi>V9^#aX^+3b4}J&SnPaoc)hv@^&?s~h^4u6D zoaUa>eX`~k?c_v0JytT$IhNjXnaPD7_lLJSPxv$I!=>7Py=RJ{hb<-Qy0d>A@f@+- z`Z1{dIU1d=LJY1#3=RkbF6RJxAIh`+)4;dE=801YoJ!z~cWxW$96&e`=W5_w?SrGw zNm48a#!rv`HNg2fa3ucPJvsNwIwLq|+1>>VjtMb|C)g=x<1;6eWvr+h30vlD;{4#e zslfPXTd`-k<Nqyf0h@TnO6EEKGG28GClm3x7Jgk1zs5UP*YT0@>IY7q#UhRY&J8|s zjx=7vi8$8*rwTX|J&vVV4)j;g`RjpmozHl+pA$M>6~J&}2u$J$cGNk@vy4B+lPMCm zj8~V^O~LqRTbTv!Iy}G(9ZhT(G4%gl+rRo;my5LC0Kcl?*LcUVG7n}x%CzNRA|H)~ z=-Fcy@d{Pub^&y1z_D{ReqVClkn{cF+b{Xe9^^tEgH|%nxz#>%XHy3~-hBS9EbDI8 zhfBl%e$2E&kKd2Fwm1Fha5}8(vHY`@ontUJs^I(W@O`}N3%$2ATO49;w0Yv(2%K8r zOmuHCwy)#2!u$nrZu6OA&4s}^*7n?$rXM~rmc%5UV2>2wo&d@cV{(p!EpsdleW=IO zg}92XjZZ&g%FlPl?P1s=Hg)pO3+i*+B+ktW=UBw&m+<Q@_;nCFd6MkmdM)cX7g;Rg zR0HR3pE&FB%2Yh{9J>iPbv|(}UlfcpDd)gf`c6#xE!bViGaeEX>PEtrIM=DT)gi88 zE8)ET%;<&gyuUlAx}Dg>^QK0rFLb#``_1s{9{4rhTF(AyC}tAMv_(wXi;n-nTITrz zR&#JYr=U;XMMI|Wh;731qi$n_`112uN%bBsQvZJ?^T)wYSb+U^PVL^wkc`(T<OxR= z<Sk!z(ei~$l4dV1S+pW4r99*C=>?}Q#xsmoEW5BQ>GbSVRur7IcxlnH%T^Rzdc;99 zW)>`7dO^v`qD2LlEna%*qU8q_le;M%GTj)PiiPg?U;nTC5u74q`u{o8^urFHlG2!X z$n8<EC+%9EIcwg698`3}Kh_s4bjMkAZo!;+(r3;Tda(0RrcDRawvFxeD90>z*G>iU zDYyOX;wq~{o0}421bF$1<rg?XuKwAO8GRAox3PYSKmS*fF>bD1YX)J5_bq>U;V$Pf zcH!{TrT%=hD_?66+fJX@c1m9h+=4P~5tH_!@xZis`3o?Nr=K);PH+vjp)KWNd<K5- z-KGzcpR;}Nn-v{V<PawHLZ8+3XxDz+3XZS%a4hm*=A%qo4kq&6&*uwJmr#N^@cquF z3zFOh20mCq+hM3hmD&1?3(&4~ZUeVheYi!jk4nSnPg}&Ky=eTFYDQYx*ty6k>SC4* znT+3`Y1$!q%s%+p><-7a!jWv8#qWdE{BH-h*L}D(YHqhJH`OT97BOir8ppJ>^4YUy z%}z@{K09}eV=dZZmJXTfwnt4nB+rAcKJ$XP<RHAXY_;{3MJ}$i)q>+&J{)t<NAxMv zP^K+n(w@sPEiDZ}OiK%L%z$3ZvLRD-!h5D2G9G<@_s?q!$U);te!i_wUgY9R{c3Q0 z+lS+j2eSud+9D?Hjd29SLuUs$_Mt7V)ZL3ZAQA4UXVZ3mfE>iWmK&kZawpogA9sM` zJ3bt1JecJu(-tvlPjgJ05#(6OewVl$TOm0gPp&!WcyiF(B;R1`OD=SArT$KEeAkC# zI{Jt{Wg^P7MNHZY;dn@pV>0_Kw;UmPzI|8Rn!CwC<4Hc-*2i7s;!1rTIQIH*?Db%- zL7BFQNqZq2(}Ns4(KZTh!-v(I<`wSs>+~nD*n%9yzLtZ~XSo&a+K;=y@ozpHD?FG* zDAN`(X)lChMv!9(+D5^xvFTXTTxL1`C#i}YG&jjt+xq#%F0Rzy4UX^ma7;oU(Wi_- zc{*$nllC;n8ERd}L2ne?*r$1=%ki9^<3`DWb>5U_>o-DbKYj&{@B47<@L)EhOk2dH zJ<ahD#jzD_qu`cUUu~K%b=UQ}s*Egh@bY81$JRG2c5y|g9vnaL;aH45qEDHJGHnr) z_B2PmKhB5VAh^ZEw3+(Lh72E`ci7sB_2i)OBwudpvw!B|O8u|F@k1YuvFIcElq0~R zEn?E%7)Q?@z7cKR;8ydieT*p|a?XR_s%hVm95kNf6K(w<r1s+;aP0Tt*y6#gLz%XS zNqb`)4+%ZaG@xw_xYc~~t|?pPaxA>HeMfQ-URtiP_0<=<xYBknIDX{AF&}+IpE46= z+9D?Hjd46Qlw&sZTELC>^@}baa-NO+`!kREF*#^F$rsuBv=SFr>KnlEV;_#A9?X7} zX^WV&H^wnNl;a@U>cA}{_i~eag&W5WJ8ru-If#8NV{Cm7r1s-JaQwuFW4#B{piEoD zq`fhYhlO&iMq3rQkw<2Q%kjw_mZp(|<|g@OTVKA!#g+Q|!SPccj#=m<`jjas(-tvl zZ;T@;s=X%-dgb7j`o(=F^-A}9aQj@BvyvP%p5*gved1CVSLz=C$IpB?4tOxTP^K+n z(q0HhbxzTPwo-6wPQYh?KX>D}*Y3}!k%QRRas>J;uR*)^qY)g}`f#lBV3wjxTg0Tj z5RU4cq8x37;6}UgSGgQp(2pEg=S_9CzG#_?EA0=0<Dd`6RP+&j%6OD%i<q<*!tv1H z@j4NDdEmxAfl7C*|A6?D1M9pg)7Hn7y13H*8*u!)565l~W*f@1MNHZY;i%4g)}Sp1 z+(urx!EA)&eeO5QvDUyr>}%N%eU_WiuKjoj9M}7BEc0L%piEoDq`fhYJkF^3ScJBm ztKB$mge1oWtG3;n95gq{8(W`uiHj@sP2f1>!!ZGUMBkAp(-tvlFNC9tV+{0iuCW{; z`Tf=>9{6ZFIfUTZLW->)fz*CH42~OoIJPUy{&VM<MwDrbn6x*>k;g){W}4BKbuGTH zar;6u0!fa0{xbDIatOz<%huN|cX37M5pev65643E5q-)Wlxd5Yv^U0)$3nGc@}QSt z+&B(F@_J_W-v2y^95kNfOKpAT3Kv)Ee+!PE`)~}PkLXhl0gJYXNqb`)c`Q_8J%YB3 z>xNAF)km8lNM0A7b5`6x$U);tKHk>%Lux;o!SPEUj!hoS8kA{^n6x*>5ft@trVec> z*Sm4-gXH;R`B1`Yau8lxw%K}9=Hg1*qu}_J564{e5q-*Zlxd5Yv=_ort?Nwa#oaJu zirRWi2P8SZFnyQR<e>2+UtsG~R=T)S|2uFT@!>e^!R$quwuni4Asp43=||frxTOb9 zGR;*k$7>JRWi>g7{SayEyCAh6kAdSqeK^*7Fe^}|ttd#^3*o5Nj6qvJxFy}&WomE4 zH3JCkyXBFF974F+LZhuOz0}1OofdHX+J|EX`iMSd63VniOxg?KsMbsh^t!=~eatW1 zIR5Q{U00I>>%1w)*2iDw;!6AP!SNd(j(r}?4wPw&n6wwd@vz|Wx(jV>;MVu^yG_Y2 z-Tm>Hwf%YIAojH!f<DV_XxDx`4vwQf94kGT#VFGjF=;P^;}JoQrD$sbH?IGpYWLnU z_XBd!+$3LP>kG<VT&e#9IR4v*V>0@PzJa}1lxd5Yv=_oro#VzsuL;~ryLwE)P3|5( zSa#j@<RExjrc3=Q7gyR^!EvJx$4=>sPE8j*Z(2~MEn?DM2uHQ|w4tpD+zOvErr>7x zoMPH>7hWF)4q{)+Ug)#jh<5GA6X5tCAC4s+%zTt-%fUoGgrnMf3eeUBZl!CMnSxtf zj@KVhay>a{Zj!IC^*NWLUFrN09KZA77{@*;jiNto5tH^pII6uT3jLbEt+-<^Q&8iM z_0G2)bG^es;Yl{h+8Kh>e*6g>zxUzT>fu<AGHnr)_Ch$Sy{8dvP2e{F{;N#Et?s(c zFD<;09E6va9k#ya3Kv(}+Q2dDrSU%>osT}EPnm@>Z4s09LO80uCkJ{B;MQ{fa+80X z8^^gbR$WgH8c*`Ywm!YW#g+Oe!7<v0<3<nW0LrvQOxg?KczAH{8A4kFxDB5-!{p!Y zelBy<S%o)}gV@(H*4FnzYCoO=#~=A{Y*3g<+b%a%DAN`(X)lDM+8=AsRtIi<`)+1( zYu(QkmTXqOH#ul-l5er~6<4~rQvWnKZsx-=8+}BdG8JXoA|~yHa8&nk)1lV@ZtRo4 z+MSP|EiJr}99ZW~`L;gk=Ps_aw}WHAhvT3Jvm0gFA|~yHa6B?N*1c$}12@{ry~Dj{ zzgxkTYsf+DYdH#imOId{{rEFDZtlae+Jjk!GHnr)_Ch$$405bMTMf9CKUZ(E?{vrd z{Kqfcn;bMZ$=BQZ;;UR-sec9>xA5VZhCZTCnSe5F5tH^pI36G5m;}8#a7(%S8IxP* zen<70r)&N}4jNDLS++j5(#4hfXTfnxAC5f=v#~GEw4+R0#H76tjwb{;cA%{Z+}7mG zGzE9Ldr$N7r|%>Ov9IL-^jU5}yY^!ZIR4m&W4XdCyXZ_)h%#*vllDS5s^fJr+M2+v ztZ1z%xZCA;{mQ5BBnQn+@>RAz|7sUk>YoG0t$jEqqL1iP22iFgV$xm+M|Hf8g<cc5 zu}{IT+|NE9{CUMK<iI*_O11T)klK&u!7<i{;~EcU6UwwjOxg?KsE*eyXlnwuvf>*| zLA`rUQMI<@K63E#W4YVb*Inb{ip~q*IL(J+A^M0uWiHCJMNHa@#!CRx%5m8`Blx|9 zeCRZS*ZlidoB6+X_nkw3()lp$Yb?o^+WL%ZT}-L(0Ke^g_(h?Q=u-{>i?)bKd*S$v zunoLA@E!2ndt82dp88-9?Q1N_$JzQ`NbSRm;J3XGzXlIxHOjO_OxhdccStaPwWzNK zul&1uOxC^bI!PS*(=yr@PFl9u`f}r9O501|w}TJAEc6k5%2bqTi<q=G#xFg{FC97t zyn0`J-efem^DpMJ6Yr;ejV1X!Tc2>9iz)RlgWpa*{Q5nZT`1EQF==m%pPGL?sILUC zK*fMbzt3I6A6@a2U(vqU)^Zs7EVrRu`_Kt~JNxjf^k9~tOk2dHy)k}je9KT@0baD3 zcE5Z5ck2s#ETMhYc~gz8FSy>tl=fG^Zx<ha$><~cl(8t&7BOirWRFpMbv*RSz^y!^ z)1*A$a{Tocs}_-i#*=)y)ZgIZO8u+gxT_DxPU&kqwV+H}#H76tj%u%NLt6>BC3U`Q zk{X8$-z!;r>x?6!z(MS5*$aJ^8_}-)cnutX;={2-VdnhUn0%CJ%fUoGgrmA{DWENI z>pl5B6ZfDS$Npz>=aPfwCix0mpHqc)rPBqDyZLa8V;`G_hF0UA7w##+7BOirgrho_ zjY7YCaAVh)-?-<pX|*@@IUEE~$s}uM2vYm;7jWF&hhwYaNXUAWX^WV&r#b5HBs8Ke z7u*~g54mxS`NN#K<e;dHWjkzr&5bUuG`tRud-!mik3OP5|D?xF7Rt0mOxn{N^>-3- zpqCA9>^lm{@5tPE{Hx96Ab469+xqlhxVX~x1~~5N!*Qbra{y)9A|~x=j_K;Y&Jfx% zn}$sPzB`*?NOJ5dEIpeX#J-lXw!Rlq`_T=Kd--r|@L*P<Ok2dHJ<Tygajaqc!}xCJ z%`?m(BtPT0=&ffSB?rw-@-4Q$;+HP2)V~Rid;4(AMjz3qOhuWth)H{jBR<gzo^Pi^ zFZB`pUV4kgrXP~u&$}h<^dreZ<4Hc>)+bfFxKjTXI41jW98{R*rOiw?%CtpH+EX0y zX;F}4FWORni|<V=ecbdz#>42PSEoHq4q{)+QRuVWfp+c3+u*p5565Z`W*N$~MNHaL z9Pvp^kYfef(wp5iGYHAgic)U-T_-tcZj!IJ^~E>2xKiH(j{Ev>OhX^hr%XVZwuni4 zierZ6m;}A_N5So?&CMVs`j&k9yH0Y@c#_Yu^|3d*xKjUDaNN&_V~@ftIqV73jxuc# zllFof`2lM%jvZ)A|DBB^Bsos6`CTVDh<z;wpwDs(+O;3=fMbde$8ry5A<DExOxg=_ z<cF6*j>Tw8e{9HX{HDhYLUPUA^ZA*%<e<4pzRK3;-{Rs*{kz~e-G^f$`iMSd0A<=D zChY||@`J%3$5`m4x8S$sH{W0eA^E-Kw0}MOC^=|6$*0=-QAq7aFF5Y+!*Pwm+}L$2 z?!n?%2wTLYy&y+SN5!!PZK=P<dLB8}^h5Hq^w}{jo#Y_AwCuL^^))W8wEYbnQ++rV zp^xZO=Aukn#H773j-Kz8<wGy^aon4Kq096`lH<Z|tThjwV3*nYtXo}Nseca~5A@*} zgFd29ISee?A|~yParAtzY!q#&e;6`7LzkI;NUoWezrSXL95kNf6Kwqer1s-|a6H(D zW3vad7G>HZChd)J^n7Ql9&M?u*u#%%GyRbKt<<?Qt8&Rfcxl;g>#J^aaiy&f9MgO_ z=An=1Q)Zw{Tg0TjF^-&$YCdK`FZBs`@9Br+?|b$>^P?tm(0GzBwDqaCySP&SKj1jS zhvSF`vkzt3A|~w#M`t=Jjss{*|0BNpw(c6!_NO7kXVX1)P4@<J5c^sNY<(A`_TvL^ zJl2O}t-`E(e|uAjGHnr)_M!vMJri892Cu2BP#<W+_127gOdDi8+HPB%`x@<QUXpLL z^(D0~rqq83e#iOnOGh8kr%Xbbwuni4mLINIgZxsU6L=E8-#qX^(+0_BFt`5tjSaL< zJ#Wgk^|7m6Olj{2zbqeqJqok%;0Mhblxd5Yv}gIH6H|V3)QS3-r*K}|USirId2Ffs z^36SHUu=uyZ+Qlw&+_~_7gO3k0>5nV<6huR@=m8-;OB?I_3BTiJn45jdEN^|TmQ{> zI@QnE)#TiP`(KDDW5>Amy!*JRY<Isq)BDLM5r5ZT*nO<2g&xo2KW<9+eWbXIoPh7` zLyyPYuH$Z68A-3_HN0!u>RmgIUfC@-m_F!n&&*r3rL*3`Vb<)^W=5^vmgDHv{`E)` z|7VxqYj=DT(chY=nI;u_{7%t|;;(2vY^q6r!(>5^-}P8@%$k?NDxoqVs?+2{kJoA= z^$oR=^jKd4J<jj63py?zPtRDrwdY6H>ppnE)I*PJ;hFnixSDIli%ITjw!Wj@ofo3> zG1k)QSWDx*W2+nZqEFcjEZQO_?Tz>Q(ldcA>tAE&-<NK*+;sc@Wxh26e$v73n(k-a zvG~(-Gj3sQXgBHC!5A`j$(y<F4CuQnSbrQQ&L@c7V)!@SGZggioK0qzgP(gh?n_xL z;tT-iXTUiyjMFkP_3y6RzUndE&$)AQ-Zh)&gz4r~CBqIg?U2Hq_CAHZi+$|rXFs%V zywj9D@7nux*3X}aWUtoR%l{Sb1KB+7eFl3aKKAr;#=0+f!X&)lj>|3Q<kv>BSN+Dj zCJlNVqisLlGa|24@F7M$BxAumd94MnB|hV)-}w-*IO&)t^igmIfwR;HrzzKcKLh)e zEx5rHb+~)QFJI0nWL>0G0X_cix$o)5aMR4`7Hj8i1tfiBCH?z5crEkcRk!ORN1uHL zY+vT-BPDUx0jJalr~m7PV>l&tZgU;!{b)UKih&buKNx$KN@wU^lK>2^O=1#Hu>0=C zbvro9nkCmr*wX@RMY~$pQETul6>DpL;Biy^iaX!_0$aqUenx{Unb-TkfWpZ_e1_oH z%1OjW_JP!UFkTjmI2(X-DR2&=K~Iu>K#!NK?=s*BC*u4AIG6e0==mt?wjDU+MAO9i z9604ZIC_1^Itw6v<Rm!5z*z;H@%A^p{$-uz0*9Og=L_Im4xDfcLE@wLEm;?}z#%8W z`4Tu+`0&yDtzH-8BsgCIr^1Ji-v7(&SaV+KW6TI}%78Q8x@hkXT^DJ<;9Mmp@dUdS zdCp&%!{izXds=|4c-|8FxH)|8f_0#6#k}R7BW)k}?r>s@o|e_NzNpdVB5nVKUsuDg z@t$*$d|xPL49c`cOxlaaiPD*ime0n+9A@KL4>O4^af*X(4)`@JTxbR$c}^Pj)cK|4 z!R#6<nb+&LOWB->dHywc-Y|)AZ2IzJlicI(-(O!{*i8IzsnOcWydR%0**xui1AA4l zH{N>C^KbOPwWbyJcy4~yNX$OrY_TpLb|{-6#Yfs3g}obn?CEvWvFbgO{a5$6+VR1k zi-{R78EbC@l0H(0_P&L^U-;P5>s{7q<^%YSio*F9aDM576K?<M0S-9{pML|V+6PDP zhn4TIHf!E-$M^dWS2qwRT<YrTG`-N{{C?++J0o5jG=mTOCt^O*N9Gx)jo@_?c#XH8 z>HXf=zU)sQ1?NA&x!DItAD`3hT;%%DYx+CjTn`*sU&NOr$LIR@LieFIt}(1RViHfV zD;~o4rcsu)NSsL6(*mxQm<L^-SlWp7EVf4SFEfMhyX$)=*djJ{daYz$uWzGpjz^ro zhhMi(B0jQiyMU8vv4|6etKC}QO!W9H>oNW}_%4RRi3ZMU9~?a&Wt|lOhn(my`TPht zclhAw^&#u55jf-|IGX|IP9Ge-UgbDH1PpQ#oB(j@d~ozWBkLj^<48_|vpI0?0?tJD zN4+k{NpQ9R&fUNnZ++?GbG(f$=aoKoYzds(fHU5@NcbdlU33G3bCsCH6YTsZd~S!b z%wckkggq_5)~Ki?^l@|ezYoufRkn%-+~Y#amFJfddrVJdQf+<T!!8$Tih*DE!msg; z&m9Ug<@Qd~gfeXrllG!<(8cljq@^p$7M7H_hiHjY3)-8(kM?ptb?--B{N$PYkO%8B z9tra0`t8bj!xTf0$GPiczd4&a;nGInvcA^hFn<Ep!&dO;H}EIiYt!ZYP>*-&{%cLs zXYO}W>UZ0!k~rZ~iL#Sy^R)M4*n0@}_+BM%5_|eM-eY;wZ#`C91Lr}X`Bg9&I=|9@ z!B`TLc!Hh%Tb%oWqr{lJB4JMpxU4JHI8-A3Vyk<nHoQOA9k;7ti`eYZU?uY$HyMwO z3MU)!iG^Q}!mr(^=t<$?qvPCav52z`aDL|#XFaafwl8_=IkqiuntkG2GZY%<I$+Ru zViHfV6Pxip5|kw-bT1ON#CZ_<5{6F1Rcv+dGt=~Ka6j+(?RjVHLu}F0a>Vw}{GH21 z+NQy;Kftf?)^V)|vlM08A|~xc<HG_x8<Gnc%X!7(WlK+5df~Fu7hjH3ZduRe(98S> zo{O^nPSXp?`}bL&tXWPz<WgrP^Lk!nJ{t6A7RECUe4hf}WGZ@+%nLo9MI$$x#9{Y* zbnV^ew|KgY72~a)X2>q<FYRpydr!mO-ea1<jM&rbwC<p4(*%2bX4}bM#zs89H`d+= zr1(gC+rwVFk3D@HoPWN1f03-nosu{^0O!v>ani@-M(Z=jLC>Lh;5-Q&8AswvlJmO4 zuR`a24KO&i#3Y_zr?<dYlx56`6A61-z_rp3eX%!!c_X%lcX`G%kGS*bOxPke^=hnS zUeBX~$AUPs5uY95*9-6~+y#-0tB#M%k4E6cTP))21e}gZjF*i25HN%jadrmIi#|Ad zp6PKXC;CgA1mL^`oMcvblK7?9$B>OL<EGc(F2H#nIOC0b+_$0QUIh$}1u=;y*s;Io zcP`vNp%e*wTENxlg}&%^Vw|<Df`7T6`7FBOx#h$bJuL@p|F*|nF4DFu{CW+3jkn)b zD$JU`5>tpWZ4s09qOp1XaK8)gb;ZzW0mqin<tF#v?z6!gyI((-T*xE-4?)hHqw-$2 z6x&Xn6ET)Q0oT{T^)Oa=QrNNVc+b>rbkBkQmU2H&g~BImrxdcy`bv9=*51isdWk(f z2lX*mxD#hLi&H!fj^4v+EC<F#kLT_dC){VXviBr@A36tPfx%c4lX!w%+zMamuZl5a z8xDJ#or48xoJui{Vyp7_=S^eO2IraYPr(+k>1v0S%<FOORX90_&mQpW4WDt<@rkmW zlYn1iv51poaZaH@Px2ct;Y6H0EzV*O28)8D_l#o8f&S{byqCoZ7gHIpg20B5_1X>$ zCx*Zzo?vG^fjrCj6IzT}IBXfOSo9IyPK=M(Dr|btG;O}Yd5=hG!JFq2TlBO{u=NFh za=A#`-tg;f*dA}sX!l^&qD))Fq`l}}!tEJ6N19bW6NY4;t%q*h78^`l3XX4(JEE<i z;+Id66Zy1R$-JIpnSTuWbP~oi8Jyn%=QJvMQn)ddIc9(}0uJm#oPB`vE^xwqxGp$) zPmtqe7jT3VarOmHFK`a`aA8q!^qiODWIX&OC+ZPrKj8e$$1i={*2hV55}Xv^ya${t zR(O)|(f2>PY)lw`J%6SHhjDi9AA4|Q&d0?D=X}S0C8h-!98+QvPq6EsL_OQ^Cs2{F zrv<D=TTr))^TygrO(`)2+qm;*IcyP|Jw~l$UeBKjg>y3Eyg&SU-zUyGJ~DqgfRk>q zh;smN`har?4SJHqS&x^@pIGn|PQ*zC&i?>svhyb&IOIgr#5oW+ANcsC=d+$a<Rmx; z0p~;DWU<1N#4o*P###=Hzh1)!1BY=QZ~l~TADln+FMe!>fx$5)Ch-Kj>?wREh_Z|| zX+^@GX6H{9`Uw3B%olB|V}}jS_tfU~-ux7?MNi9ITVK}ha*?()`1J|=8gI`W@?dtN zOk2dHz33go?U|wbWjFMa;y0L<=b}wJB##e&Zu#qa@*$UQE1Bnf@6Ei?^g@r<XGh+Y z@fz#HrR1mG{sUH0=M>DJ8SrZz{2K4NL63Xl$89EVrwz_?bLuvGts|T*)-~_-v`K;< zer_4{^8Uxni=@|X`J}?HT$?AaL%?gj4=+8hYn5N(BXJG|&X5m|-lsPr{^ZIy>p7AR zoWBD{j%(T<*%wVha9*>$6BryjViHfVlb-=L@$n}(k+7!)T#bZ32XzNA-r838F77;e z8@7ne9+g%y&v_!_U#oC(5ud~0*B6tBkBnCzaB?jcaSjL0m%!PV20cmkk4WPsoQQJ- zaK7^4qvvC?<v@S++Q<OTu+Ml^?iM;;<-l-a2u$J$_D1IIpSTtYTgIys`l368@ey0G zw>)OLcHiK9KKtw6KX3}MMNi8fTVMQ~%SGCbgkPiZYrK7^^x06%Jd|mRn6$_D)#1ig z?!u)Ptz3A~qB#qfgnpJhANmP<xUp%4<b~I&D;L~HF67Z+CG(tHd2cQ>UC`rNKjDhX zt63i|HCbL+Yl8ev#h4!jpT2`nJB8^ab4QOk)dG8NaDG2&5`WekrkhihVC}R(c3a!D zcQovM4|_X?=_vN}TpigC_xi29{ipA8Pnd2_Rh6}ug!qV$w3i8cQ7=bF%?{I1?CCwI zdf|O0cQ1EOZ~QWEO_**@)u@UiePku=9RqvOus5E6`W&Uw#)jjn=i{-!`H#;Us!k5B zq5eEP`yCjZE5sz8U>ClCYaf(l4v}jl>}dhE;-2~Q!Fke$`K4|3?&HqOTVRXW)Ni+v zdCp6jZ&eCs4&rkh{MrKX8E?Mn_{co!22Pg6B2E@?w)DZ#<0|tb0X&5hab^N1#%F%$ z`KZU8oaircjt9<GKI5*}QG)Huxal>00&q45&UnYVjQxY-PW!FE;8+loc!HhLf$zkk zEMr97NZ2y&0ra6B(=f(aY$fjfurUX0aK2Z3?Kl6KOKevw^#3?pU-Od7MOw4r*S7F$ zyuGu@gISF-Z4s09qOlob?>uegqUEd3Tv)Pl(ahkrZY|ooz;C?o0Ph$ft~&}z$``}? zrBya1-v*wM`q!s!aK6J)(|XsuNII-<1jm%U^7n3mWIPRGy(#ZW!MkXdFS^Km7ft+u z8%))6|8U+%GaiSjwiTgcPxV`-6n3~z{HWp4-*B#k!&`9HNpt4SI&lHp3an1b%kEqd z{aKh-2m8#cVTIpy$kt{6W!fdC*p~G+gt`WDyZJ#ga*%tjaQy6pcc5Ld86s_c7o=dZ zeKvR<@58IsgIR$xZAC%S9^d8SJTHYmp~6iQ;b_p7aqtFH)49wHL2d(kFFc>~9yx?? zvxP=mU)t&7iq47Pc!Ced4D=Cw$|RI&i<q<*!tszG#}w$LrEM_T-|lAyAmh<@`bmwq zlY_>Se2%S;f5pWes|UwyAC7$<%np=ki<q<*!ZAI_u?ubKGu*v&5OO;h&AjHLKazvk z*K!E@EVrRu`*9LD&hp_{sW8{9Pc_9T(-tvlFN9-8kYg#@(hsp5A$d)@`oWL?NDi8t z<ZEnw!K*H=)SnEFvwb)wqmSrQ#-dDH#H2mVaRzP%%6yE6UfQ89#{o!w9{b9(SC)~3 z#*=)y)W7E9O8qI|c%l!-PU&kqwV+H}#H2mV@eswa4Q*-ZSTpcr08-)@1rB0g%U<ZS z+=zDVM=m(#_;4)In83+LnQ?S5k=Gp46~_X!r5=X+CVza(^h3tN{@3S>{EZwmH_2Dn z`jRfRE1grp@nj#4>FlG@DEiYDF=;RQApEvFDll)}>;-t86nEj{Pnt7x-q}%sqze40 z`s}mj&dZJpOb^b7C}3wE?#_o{Nc!>gbu-^{cq*Hc&9+?9|Ki$~`Z@696dyk}di+>} zGHnr)_9pJfX+Q9z6a90K*kHQPU1p*(+-sf>Uw^xsJcXl{v9`V!Qu{g=e&qW2(cr<X zLYcORNqfOLb0JbN)-`C$1h@F)W6dxmV|~d}wb|sLxk<jo)>pjl;!1rUIL`6mn2kQ7 zPnn7`Z4s09T#oLqY4HlJvHc+(dTB@6{Q;8u>`_PMoIws6PxAS;KIsh?SL#m#$GJWn z2R)eGDAN`(Y0u^8{J0wj)gZ@Sw51(oIYRQ<@cdU!y^b8jzLulVXSoCI+K+kQnD4`} z+Jjk!GHnr)_JU&_dfcx-TiVeZOh<<?1Cab(?Y9@)^%Oa1Zj!IJ^~K#TuGF6nj%WLD zOhX^hr%XVZwuni4kvJwnFC%k<$vJ6%GX%-|64M%A{4qIbJmz`+mu2gRAhjR);J5%B zcl35bc{BSX!T4j`@e-AGV9*vZX)o*hyUi$cINzSTGv#yI5M3=hY<=gOZa--|0~{9l z#Hj{-M4vJXW!fSp?M0v9?4#I9lX6a(#qD!C{!lz4ckY}M7v$y7<JK8K1^%(hDW;V> zKbz+aWh?r~u{H<zg~z&n#~<hV_P|!p>`CsLhvXY<edAj$AE`eRzFp|!TM7DzK4l`x zv_(wX+eF`HczsI-eg%9=%G$=HWw~oGXNNmJA$QF~@)fqe@@<!o)Sm_4F7oj$2Yp1} z+|*-6fkj)yq`gh_?GUeTQLtAJpUP&Wn!K6ru_XGGE0&PE@X&I;tuN?t`AFM*_*U%W zTQd5HK4lNEXp5M%w~4+T>h-M;n9cAhz3B#1c)a^LVS3R~kCD6PA^CJ$pYd0hkJO(H z-xmA$7KJ{dPuT)2+9D?HZK7}KUf<e)*$toSe*Bg(C%C>n)^^lm<gR&0KF-$1zvJ?e z`g7ph&wPCA^I%q^Ok2dHy-oA&upjItwZI&KPvqE??S7}>#jVf&6}by<Er+1b@-W)9 z|L4NDi+y}+^I#UEOk2dHy-oA&@E`bA3e2Qg8%$f}&87#E*CeMO{>9ehu6>exr>*aL z*X1Mi1@LW&k8ic;Bl?utDAN`(X>ZefOFPUvCv$<HHJkV5ZZjj0y#AkY(I*#^yXGPJ zMqA(1>++HM^WfW3AKyyRNA&x$-!Mri(-tvlZxekx-0NEk@bgdHfM*>%YGQJ5EP(NM znxgv1U3h3&Y3t43Tt3qFQ~0*b$G2Sc5q-*yz@jZ;(%vTec7)fr0PNMkC)&zB$=yqS zS#|7P<jy*8DzNoQ@40-WeF1!1>Eqj=!b~cB+VrAKTg0S2?>l(=QCAI4=}V3_Stq;S zN4q_0$r-dQcC{RZKFe)r*Zd2?ZIutVN)Kik%CtpHu_xy{6=<sgpZU`|P4+1p41eRW zbhqL^(XQqr`5IfF|9%jQZ41Hc3LjpH=p#6ku_)6PF=>zQ22LxVF?KE%kM=rnqHb>P z2Im<bfrH-Oi?&&(6R*osZGFc7xOmcjKDbqY8_$QmDPYfa3xQuB2G^@Unet?xBjY{a zrmg?xb7Y8L(}&+oBc_ZU<C=ESp(bXId+)e?|BSt;6D|$kz1Ac`k9*^i?`9{3(_vlv zX?X50^f*4RzINLSk@QObeV^%t9zN=cO8dh*Z*UB~x*WeaTi*_;=fMRS<7+U+dwM&e zyqO*2z+87OiApsvXp5L)ZxA|sZ_?M7pEg1pqAQYq)Y|&a4}<;KUIY#X9C+``o8);# zqreY*@Izd${$$FNooC)S(AIx@o{hq1#+0#RT$|2*%ru<l&WoF8{{GzY{B46C=fy!= z-us_OdObzgm@eos_P>6t?5~mZM!tK`3__1%yye5Ye-TM9bB9hdYV{6ZbZ7_1+N;a? z*kJ2(`(3|8XA$PYjhG8Rk_shdJ|@izosWsYpe<t3Ug@jPo0`+zwYbI0=iEgb3dYHj zL$a;!hSWSSv>d|CN8!*8e2v)v4B8?l?G3;GuxZG5;}v_wX(P0u^_l0IXtMR0AG`fT z=OS?Uh0mI30e-?qKg1P`smRH$32z)|^S`|&Vi7CGl(Cbz&Og(QbuQ)sW9jvs;~j77 z*FZ`?>J=l_w?vwAb|O{+Ut`t)gSLoCdns4EXok;n=UgJ@0c~h~=E<SX)|Y(Z_7k1O zmP6P%XE`L!4|2#XKgq-cgSLn{X76nG-qxw_&Q7BZ!52vmQFvEl9Q3%BfBot%KkAI2 zmuTzRK8BAzKLgiV#EbW@ylFGbH3Rs%Z4EHUiJ0V-jX$;zedd-$_hMkL2DW?$M(QaA zJN=wc?8E_lmkE9llUxfgx!fe2>+X@8SABXNZD<_k8HchvqRlAu_{{aEZ~g7ttPhuR zfzSE@E192*jkN?^?*`ZLzB8h~TTz>~y{Rv7=g4m^NRGHCw_7{;pW^#~Hcxv?tUY`L z@`EJt(%%V5n)#?nInTAX&3m(7`#~pLkqSG^c0h`cw71mSJ2p&5v8TVwLbX=d<Gz;g zi>hP7baSfet-W-N3w>lI?Ja}7Uqu*uv8TU-)4A21Ci|zZy>Gwx)d`X8#oF<2grtvR zuhiN*AWTQG7xMjY==H!J=gTK?E6)hi&8ezT^Nl{TlKx#{?Hw1UquA5WHAuE&U%J+v z*V1h{a5(SeT14t8<@i*%Aaspn0fTFSm|PDdw?*T-6z+NG)|VZ3ByDIM=D9|4Z2btN zUPmjy;n(00?zi2tP6vT6nDzVJZ90HKTf`K5T?<_fZ``-`QrZxGk(^6iwmxrNupisY zz~NqS2)Ad-^~nJ6GY5Z&EBI59lRZZ2IEcOf_AxT;@9Pa?%Gfck*^3S})fd>gyW;cj zg-1Bq06kuxq;Gv>Yq)mSWvyCk+AQ8Zd*8P_l3pQrbWH#+P=A{lfF9@E$~WJ=I}%>S zXCIqU=<)lfU;g#cKSk1GeO!^dH>~;b7ag2CUR~NsvGqNWdj74%-1-gXR@n1UTbTuX zjoAnc+9D?Hb#J}gv@CMJJGEj_bv<opedfub+1Afr@Aea&OTnQD9QKw9C1s8E0bf-| zr2vDrh$;5gT<DJbMVCDC9c^fR=DEhwY<<y&U_Z891`dxzT4Od2J-}}WgUkL?O_N<? z-Z;?ie|wG94&gluh$&;oxK?Hin2KU|&YjY_*?y6H-}uitrWSfQBt)%W^+jhSz4%i% zGfh_S@;4*vWf$CI+M&nux%AWD5BIYT$3*f$kD4y4xApOR?Z&b8+U9)BwDp6KdcKrn zE<6@#P1t({Bf!^~ZNQ){V$xpXHxHVkpSkP&{Rd9^k~XwH^W?C`)|dRl?I${`EQfG= zz8w2%fG_%Sr#*pZGORbWMNF|*cCouAuEhA!hUkmrn#i{Gy`KmBvHfyzXz^JSRlsiz zgDdz`k&|5$Iu2s*zr7}!5G%%%v142Zwm8A0Epg}Oo|p%WrEn3+@ous81;cJXX}bck zej?JGv-{6{;EO(GDllk^n6#I4(VeDqsXOPsz&xN0t<O9;q}%$KFWi2jQ(-xbH|Iux zFZz@%z@jZ;ioM=t?zP$F`z`pAHncwT<iPKz4?>S?`PE$y=_rbz*Jio0UGRx<CAdC? zc#U^$7FQa|wE!68L`?GPx7dToYo0#`_S3+Yb5+`tB*&xJOG2^RfI&ZqNv<1LJ#2=d z!@V!#ocKkwAsAY&vGrA7y8Wc>Dsboohw;9zorgZ6Pnn4_Z4s09q67F&(HXh9Y?E{7 zZ0Mvc$KJj44bun7_z#|OT_x>PPbZF3p{=j@%EgrSO7MFf{0^21C1rmKtWYspb*AY9 z7Htue_Ie&$Xwu8v811&*wso{Ym|iQHCkLiN=)s++hpU%`J5_OXVpTt<0{`V<0Imkt z9&nu|l}gGO>+6vL>oa-ixLgCAw}B(ER4`HUJGlBwmCsP<1_pg2Ch-J2_MiB!1<K+x zu_9qlqvJ?PBf&8$MLe{v;&S&pz74Cp9ws*Ri>+jyag_LUD4f#}pKIaQ`;&;z(B>zY z&Q<O{^GQ=oKk>t*dSxfy=4sEsULWl7GhuI%@zB?!skSfu(R1TE;JoKE9<^5l$0IYY z%@hKIF(M}M1Uvs5+-pNwVn<$)uw^`2pfCKZ5Pxl}@X8I&dn>-UxBC!cQ?JEJ<~bfU zm5ZJF)USg$^AMlw;nyedE8N}|E<R;X&U0|;fiqw^5$6Wr3;<`m`!;&sxAs10GOlvZ z7Y<yw;pgNTE|ponvG7N@(_R(qed@zo-`7ZZ^fuE6d)(tLA2}-ACAMRJK*fhXvXb_0 zguTyTPh#RI+yA6a-?wSEvEexAwebt!d<>lN)^*Y~!Fe?QzWYoQFgUivB%WZmkK$er z$};Ap6A61-z$H5heM>v467xoErA@!g3|;Gf59`Rq>Hj1)^%A}f>T@2+c$C?8>YR@F z{1Sd`@EH#sA06jZi$$Dj;QYe}M~`bj@zitvCg2SD#JT(WV4Uek9DJqk#H8PXU5h;9 zAu*wDBy5Rup^lru_lm8pq}wky^;Pa??!Qkuu!Pve8`k<Lm#BI@1~<d65g)&jei7=| zAh2kQn6&f1)V%?il-X71-96JuNP-E8Bw-9mdL|@c5|Z@HbTSx;b`RZ5lWFKqcQeC8 zw3|%#4458hp_ySKDrzO7qCrCpMs{U)QPH5HvfrYji!1B0E32resJNoCO43b26cr6I z`~Tg0PSx$(RdiKRndkZL^HiPpJ@?#m&i~wd&%N(kZ&kVO@qg8S0_fa*z>iA09oKTT zL5^}tINa9hzSk6{e;|Hl|3g3Y)+Ojh=1d~b_~}acDdvv}*B9r&HSvQpah;MbY@ri7 zuDk1|FzVcWz>iA09oK>{mT)cDd$o|-TJf>?Owp&W{`|w}M&BW$9D{4TYrL>ta@^zD ze&8cN3cp<GGCRi;dyi_|?-Twz&y;@#*7Hj`?tOi|DLvz+3q3z9JuT96tNll%dFVc& z=SQUH1=4e?bs^2?i_Hh(lJ@z>rRNUmxmCVv|M<*)Js=lC8K-PgaQKGwPS0r9P* z+xzv3<h>sz)IV-(@gMwNq3IK`Uw>1!(2ZRGzm?>}cr{$3R*%eMiqC%GdZ}<#yWV+! z9hIKNrVBlvke>N<_LuvFo*$K-ubQL3((!ZM;sV}uEPqmZUNT329Xl|yzj~x2#85iX z=eo~wEUX?|VpmDG_tycnL5{Lm{gc{i`&3+?KKiO(co^MLYUcZ4<6mp~T=2zf4+z&Q zh3i(=I2~V}sk2q**g_}v`2Dtlv8PsU-LhruiAf!8-afhQxz6I)UMl&5e8lGXkH=@e zUh^N9uEZC3z0HwwoQ|zURu6x@`trx*>s|8oRWPzrE*E4Xb)0@yzi~BPxEOvD4gX8? z)#vTx3tv&-wf{?>4OsXclyarz-(o#=w7vEo?SKBI#Or$ej?n({>1gAM?DjY7_ZcO- z>*8k%izR#L&gsHlYvcA+9SYwu$az+EOF|pB3DwVPHT{+O@YkZ~{Tn;~tZ0faZ96Vs z)kRGk<adX#;`<T3nmWW($$d-jFQt0w@d5o0-r3xA;zEoe=lvEZ$KsSa_a$$$;Ewp) zchiQ~skiZSr_R@J7i#Qp-#R|FvL7DBZN#%%zn8n$leTE)20>CTzT_2!6Xt8e4u`4T zJ6_h*!ugkzPhjlUY2NHB?(Zgz-C0J(xE+7be4Xy2BysRL^m*&QWi8W%{d$ea&N0o; ziyDtdU!?JAZBpC#b~|&(Z9=)9>tp1q&RcZ;IrHh7Xqs#B!P_2_ugoFl`8D~7@6&o! zJBM6PJwC|ntT{B-d??pu=moK#|K9LAMHZ}n?$r5%73R>hE4Pl0_3Kw+R(ByfW4r{$ zE#7LKS2wS{T)!1qd7SoGT|M)PIm@eH@yW-Y!zd*7k@+XZkv%Jv+zjQJ04RIvyk4wO zD(Uz7l-3ic<(fyS4nM~3gw;Ktaa!<R?e{IV_~N<X9~CEjT0U>Oa7eEa9k(bKv`Y5+ zOQs74D)h(g<N~(|B^UTu{|B9u3$B|_|16rXr{4CYd?go<uTE)9;QI}|s?7ziryd_< zc2+K!YhIUYGxFj%M*hX{Iz^T~@pGrnFRiD2J0>S~O!}(&l^oN|&G{M+_>h;>Zarf< z*H`Ym);Wm3C%*#zUeP?-Y5j(uK96o%AMSqXbm59#BdVLc`PsrU$zFSz)+%e0#)|g0 zGmqRRl>NPrlYiAY^XQA_)0af^HPzd;%#ZVkx!$E0zITXM?L2Zl_4ok(e2+QToG91k z2>z;k+3-4rN4)*qsq;%~>hm{`SVM=ts`5PAYjyR^qiWaCGl_lTbLW4LYbca86v`S3 zWev^i#R?@K%g!%HYn{KuX_w|rIbGO2ZgtORoaTLlo++}ihF?DS?@*lZY1hlA3zzj8 z(eaI`&lV;nyZBYQKDIV_yl!XiyG<x_zc{va&fIS{pISuoHPqWSEr@fU{M4cszON9k z+PUv~>hVD?&YJsk&Eu7QYX|#!yN6fl^Wwpk1Kr(g(GutQ8%M{U+`MJ1b+%0FeNigP zT~Z%TfH5oc6en`z!dH~)=Kn>!|8O|+nvvoEdZ0XqyVvyiwR+yanTcDT(ss7*!#$k? zU5|ARbceRcRK{79ZN1+tA-}6b_tp|jR@L-k!`t%865b9wzVhn8YewcxY5>K9Nz>CP zyr*T47!ym2ahON=n6C?a&9|4z7jQX6Ha*YzrM*(u=Is;X8=qUF>m?eg(C*MzYrT{1 zckB4F=Bo3@ClFjUzVWH;u!??#lR4h%$#t9LM>)0lc*5#x&2^g=O&5qU@wGlJ;@I?p zR}^?%w76oYT)Ce3h0Mzpe?Ak3@?S|%_Tf<O`RDawg;Ghs*Qd0e_#IhTIewR{uGaYB zQ@wH8)2ZKNu-Kx<*NT@ZPQ>Df#@YhSvk@KBN9*-Ev{-w^3jJ|AYlYi{a&Oq@$b6l% zR(zHDMBlw$=U(vB+b)x@^fT*Oo8pP@o5&L#Q9AEm&k@w7dg}239ku3zGP!h3UsqLm z6uIJ}f$t*^>32E6nw3{5UaT2CuPN1$PY^pBdCkb&t#jx-q9;v{$0v^)ZL2M`b)5Pc z#IC-_y1RypC}Z67^<svctrY0FDU5{#hx_nK!?;Yj#ChZuj`!XdXfrZz&^feK^swn^ z6vjicM_kEc7S}MQO8fWnx&7$ZXpE{YxqZ{?qR+L&yPiDMc2_A*GFvRz-EDQX=ArrT znl7Aud&JSQyo6(c@Ll-iUE$Sn@-v}ND&aes_=U`C)K}zdD03dlo*&Bnw7g!dP-uJO z9^EIFZQ{D~O(lO$i+AnwFAuNN+aC)4+!342dheC2Gts$7c8NEX&qks61LgY#dA(Sn z&~|)c?bx$}Piz|-+w#zkC!ZYK*0uTRu`T>BTxspTA^eOZeBRYs@);#p?)*%F*B<k! z(q{loubt`hUFIvaO?sfj4$5y?=JjHQg3r~KddA@K#Lv_YcBieb)-kwLYg4^rZIpGb z&T)bN_4dz!uBpOq^|{Bu*Wg#He~860<%Ioujp&%Mf!y&oOczerao$g?!SxjMxJ@W) z@Ivze+M@GU**RmTc)=om+V+@y4WEA~o-5Rk_%0EB0Vuo&*?1J+J^yl+>Z!*EbmVJr z>+7Ta*P8E6-JYL2b$)42{+RwMee1LEDS5mjxBPpp^I})wVg0UuX)L5#Q@gd!i&W38 zj_dJvm&Rf_owwufM7N&5PU7Hm;`P>t9m<VI^cs<2a{RQ$*s&$kg&}K`+Qzrr*_XOa zDDm-evRLQLiPxD=t)ef$m=%2Rwx{JQbAox>q8Gk5-K|$g6wdw4=Y;F2#|JFbIw#7t z*@V9;Z#KM6;o-lZJ9U0(9`$eA`o!4w?Y(-igi00KjXrDqm0Ndgu?qO(6UCZhi#$%~ zs8nhl%jEtZ?HS7H!|raYt99-zc%$}rb{%`dVps{s$;3V~Z&j?{YE(a^9M0LF!(Upa zUaU}P+rLzwHEBP=USj^+A}+V<>)avpr{exczDJF*uihrR#1+bQHI)4il>JX$FIFgS z*UxW7>*=>9&HZvZvAf*rYVEg4wX3(^@TJ}uFMU}10qYm^c<#GbF$T{H?PU+^HKJqs zw_UPbZ=Eijt1z~1C-=EcDEk4Q+i%f1xo)ZXM8D_P<lgp_d?ojhpZ91y;rmU!s?B|_ zryd_<c2@42E02|HGy3K@zV0);PLZWg{M@PYJ4Z+DnWE0|%^SCO!l%%t+EVL$2+u#f zrSg2}vASC4!v(e5IdWHcU3}ltFyAWSC?xigd6(h_4k+UYO5T8yH}ZP1LZR*S1KLM^ zUCd*xD<dxWo0Q+&pG7^<pGtXbp=6`R82fjdKT!OE;tv#m^7^zb*SK6;l2`Y%mHa`* z{W&-Ajlo`}YqZ0eKM$HeP_8SX_yfhCyk4wOD#hRHQ(DhBT7PdTZmBNp?z6gD$I)4} z^ElNyj^-)PdD~k19RIy-t^ISMN8c~A9Dp9r$?fVNVsTD>E!P@5qGQHJn`BSDQ_rPX zo4lWHCnvj2D1GWV=YE~H===fmi7~_PYJ0&4Z#yJk$;qr6moygfeII*-jwqe`o9{<m zPdz?hA>WVAm0!!Xxq-hb%MGtnc=+$<PMx3S<j3Gsa?Fui{=J^Lba+|ixpdL$YMo0% z%0;{0c~^MNHJ27i*3p1<h2qA&H7Gd;O3s0De<-gPD-_yZPVCM#5BFtu-)nZE*o9&j ziru_ktWdDKN&6l4wcKO1`?|$`^Ek{kw_D#aGY(&G{y>>8Q2c@7PhKxpC|~LEaz63X zZ9=g-U%7?jTE|O|+IgI69WRBXZLNKduWq;2{@L?B{r7V+cRcrgo%)AZ^lA-0uGff; z85^gS7gjttU07yq@_xFV-0L=><N(htU#oL+?|aNA#>^s}d%*{9drrQRds!bgsE_e| zKA%x^MCsh$JombudVIh_o_puYqglQTPU53~W|P&oX6K!uf!=5{@`!%#Ies4F>_8t< zy!ec2I;mryMdk8u2(%fQuhBX5t)lBq*5i}MjkeVmZ=1(v!~M~RZrMb}DSFfMoL{=< z@%-)kx!#<oy>dCs_}XE0wdRbL_R^kfuAH$ev5(EwiW~C;%03%PZiTY1&FjSqg|<T* zw>>pB89yrN9ozEM<fig<ksJGCmwY{?YY+D3OCFA~K-c~R!+DQ`H_T{<WSvFZ_sQ2~ zMjtf#W}}S5yk4wOXxqD5_a<eJ^{S(%<j)d)R_6ByPMANHt`*K@{yZXoh$-}Lqr{YR zVw%^B6$<`v9mN_-eA>Uh<PQS*-k5w=u8hcc=Ld}DPp>HJITU}O_yfgXuh(HHw5_(# z{#GUbZVj<r`0kRQY1`nl)zvx|_Nbl5sn)r0I%!+$7;MsdR_}NLyZh{GZ?%29YmI(S z(sCereC_Q~pAyG2@~drmTzeT;OC>x0UR_IAo4k*2XYF;HP{xDj+*LZ~Uev?p6XPtu z?(w$0@|Crh{lP(vV|?GESG8-e>#4^FnVq%v&b7XjYjX{MRn{0@r|^ikpF4GawkAC< z*FB8cgI`;D9-g<lTIXT!d#c~ZE|4rSpb($;D{fr(K*?87@)eZ*eqJwDD6~DD*qv(* z@5$^ANdMcV1IoR8DC-FHZAR02u|mP_kn(o5^S?>5)->Q9lz!$5^lqcz<(&MS*NYVj zc3De#u7mZ<_F+LM0{MQvQcl^I`7<QD#2?B$h2jsC_~-Rvg@QlTmU`BUt`()YrFO8p z%j#+!rzh0T<22WLk&n~sN!wb-TAOlkz2gP!?(<yhMc%iQefs^cWWM`)(XYNGjyL4j zi1r;LI%Zs*R4!Zp&~#ymwaNSVcGe5G31vKZK3uDF){8##iSd?St9jd9@|E?1HSMg% zF}|N*-_#+dO75>;i+G*usmBL&<kur}<^C+kqayg|*J@dPYj)ll8d#g&e*JzgShKQT z@#0$TK)fyswd^Z7usv=wGF+=c-zwT-vL2s2ZnUkoc-uTS^E#pr-zb~NI7M%Ip7XO9 zjBSq>8=dZt+w=2V(R%XEN%K3`i{0y1S8LuuSH9<~grlvq)W^sSD}LaBvOYq|&rsHj zyk4wOD(Uz7l-3ic%ZZ<<F6=H=4uSW4#;N1|`klz6?>yIiv*LtLm*rEhKCc?lG3)4g z&4CT8^jWR7$>Vi9xz24u$z?vqH|U&P_f6&#eV6Zzz3nFXO0FXxk1N*rewfeOI>c1T z{q?!*b*`r#AJ9?jd@k2!epeg^BZk+h`{?IRonIjbJa2pCQ|34Rq=lH@u)2E2cD|11 zedxB@yJzNrQN@ov8kF$@B?my+qviEtg;Ghs*Qd0e9B?J^Gu4INR?RJV&u5%Q2Br#2 zlD_jC@Py)oPgmqqzwSeg=$QLJ7c`$vzi+zGV{P(y-A)d0n^1CqkMWH<CkK4ce4_92 z{f@UCm#^di^3;T4jqgYFsx}9>o_c(c*;zSYuK8SH-l8hRzrw!9*Z6$@<NVH`z;rAh zoGM%-23gspII<5qWcT%`=KdpeQGcM#$lRlI=zBzOnjX)cdH>V4+Tv~VytzR49MSP1 z*+j-Ey!1ThXR++wnMH%P$9r`>BaGZX-1|th<9?uju2RpOzi4=J-KpJr=6tTN+<86z z?$!J*r|Wk7oz@s!n#95L%ogk8e)Yu(y+&l1d(Ia%CYP<9E{s~6)Hc4|PM&d_Q1<vf zj>dIPo_X4Q+A7NY@PZHC_Pl&0&yWij>V@wMG`6bEGp?r|AMmHvIa999PW)AwFuYFT zfz{8QI=|vPv)u-5k1K!BkIb{{>PK%2t)|p7ZoAere%w~$D>C)?d;Kfm@981^N2m2G ze)&AxZhd@0ebL$%=NY-MORtV~x;J2L8adD0CX{*R<LFy;&OF;@K23_|^UT|>kgv=$ za=|Xe3*UF@RqZ@;J@xn?v$N*eTyv)4+(4NM@vX3?m)5I%RWH?a1|_EF;5z-+H?hdd zPK)QxxQ2&X<|7CDHU!#?%o3eLxi@;w^fYQ+Z-2j@3(%NCx9ueYcAd_OX_I8(f17+E zK2G7K=Q%%%^_V}MN}Jw6*%xN=&%8&Ye)!?j?Aag520KZeB%|$cP{mta^WSji>hZH{ zAo^VEzTo;dPZ!RtkGLl{mT;e!KEI!`$?RgMT-j~5sYB*F)h}-|`YxkyGJ0>Bda**G z?cvS(Jo}01!h<@VeyZfpsQSn6@AjHMcf@A1-WN#Lndsate~34<)hO3?oO6FCuNNy6 z+7cVaCgY;;jU|5&@c8&W<4T`rAIkjsF7pTaYUzRE4-|j$da**mpK41z<7;TB6t~n4 zcK2Fct>f#A+IgI69Y-x%XX@>9{CB&x_Rr48^n2mST=O;YJJdhK;;j5?SB@CbF=OMb z^2W&zXuYvEc|YCG-qUSD`8^rWX}fgJn)vPJ6Jv(^7GChd+xE*>)<o9riyDjgzLy-= z5v6l~J*QKf>Z!*EbmV)_x$<|pHrMf2<+}~9Q+W93=T4nJE9WPBPGqVn^~|M1k5!&a z7p$(<xzw**<oCDcnoA2M>)43TM-?}o>4B2VpyXueTg%jo6$))HNmsS=aBpV!d!?WF zL0gTI>o_OZ<@I8Pg570WS6G+X6WBf^^fdw=hq>nV;>TykVUO%`pAX7>f#MI8`+Rx5 zSfSugwWXf%axU>RwS(Px$}R9}9WPzvBzso6*734iZR_oGe096E_RrGC^*<`f-0|G| z5%mwT=+PQ{Os^3gGd4~sFB~1wb2!!}@2A_zy>1gq?)BXAJvt}%7R)EcOn!gS+n$xL z<X+Z?_3C4MpU0lMLrj(2-#quao_c&hf1Z2i%A>RLB}!EAv%+=A*!KMTqqws+d>_#N zILGUVpv&L(DsEiIT}$fNZ&BYL_kPXD@Y`O{cZjYxS&vg5KiXDXyloz%k#CAVd`vcx zaf;sbJm+Vz<0`DveW9HgYd1bUHtT9)R-HA1Uu~%;=X7cBUrs-EcUfJnIcNTGX}@>e z;#djCiNroKA6LA29tiriM&DwT>xsNxtWapnH3RDfYg@;Y5trNbJa)kRsdU}YBj2OO z*w6dr2XTeoW0bXmbJniBUaU~uuAkqE*3)k{6F*bk*lkxXgjZ|7O{kskmuu}e?A06N zz2B(cZMA+ukLUXzQH;T}T-T(B^cvAI{ku%EJIA!=t}wQ4C*QkGD8Ccq^LwAp$@f2O zKGE-Q)VUY@^tLDEEBT%^si1zs_Zxauo9|suJwD)1t+}jhn-9h@^a;c36j`wPxl`wt z$$z%nwsio(DoQ<bVu9v=Io0^vV|BI8i3@7y`<S`rL?N+{%^y?jSg)Xb4hAKcLD`4r z^<srW+mjmS+?QeBYwKW$I|9|tvxTFjc%buBvP)c{<T5C^3`#D`>%|I%w$+w;`t3~O zXKE+d)jWq+Yrm~fyL$T#d-cZn`Ud4Pn>*<7Ty{V)22YFDrE$GRbWHy)lWfNseP`C% z<gvb;T;?{R<T9VDKdN(b*(c2>`aREO-gb|CC6|$J`_)hQep;_;bD8U@#|N36oy+FP zOJ(v8YC`NQ>|NQT<-6Be`?j;+G*!3(?yUTK#g6^!F}qJmHTw|gJl)3>X-4MtI)L)~ zuM17KQTx}!(#yCR)NB2huLRqipWZZG_*vEQI;`{M+v0!BQ1|TSEzgW?dxw3yD8^^y zdp77tX`b4)@#)r8o5vNDr8}3u``!&}Hb1d#>-McrPPPtqJ+gg6{9UN+8=iUa9rtx^ z*u3S5@g1XM8_MZxmwjHXdVN|xyw?5;Ztu6~-jiMn-yZ)1oV|V1FTCL+ts+N$@eLp0 z6d%t@hIS|Q;=CX|UiWDCz;F*ID%5%327W8t$Zs0a|MXhB$c^v6BAxWxrr1Y;$$e)I zmVPMq8#3fYDE9@fnVv@V+iBS$&y(YAti*nt7<*!Ha@*!DPi-%D5EyT#e+Db))F9Zl zecKZavr|sr3iTterF#9kV)=pJj{PY}#lnA04C!_3m*4Oa`sKi{mBzv4-<a8su|q>* z^6233s@3}4>D6mj^}(ae7!OH(>%h>k#>e35zO_ZU4IA~J!lo}U?d^<>k3DfL1TOu> z!J_dvK9IRv=TNRqnykK2<KwvOFeVuvHYOdj!6?DbFsJo1elNA@gL<wf!GznC|7m!4 zMr?tHeGcY59q}RqUMTyA>kY<xSaygpcrC_`cio`odsp|W)oZ)ER6DDW)B4u?+S-aT z2Zi@+f+<w!?SC2GO%YpQW1oY0TOwX$zzba>dfD_es(%m54lxe%-)z&5jOkUYhX+?b zytZ>_o&CVL_*oy%kZEn(xvIN+Ra^T*UA+<w1^MMq=s!*qj8@h3yN*9%4Q%}3VBXe< z9~tmN*{@zOJq^PzJH$NTH`^)xp@DTP^Z8oL^A@8-Mj>cxYg6a9wZ#yi>mv9QjADiI z2aZ2t4ZOp4ykH{YM+W@RfZy~q3ja~rA?5+U*-r42*H-m*K0LUlbMTSqb=fg6LoNnE zA$VZbjB&7gRB=eKy1qZOI7~#$fsJ3`;9FxHkRc9G;&9RQG%5}UWrx@k2aCPW`&Fwn z>mOS8aBzp%%;^7ESA^VlU#Z`hj7=3zJC4vgzWuS`9f{Zi6Z_#{Tf~bDc%h-+O;5w{ z$__CGZ<E<B_WN-EK=(j*Z+GWlckoGXvvHSXO5pFG(cfo;|G49FMWTP=_#@U(bI^`& z7=C2H4+Z}@)6*#Y`?u?RsL~nmo9zUD=g`U?%kpKh$NCcRb_b4*@h62l!4?4O?SkQ6 zFWb(;4~}m{+Kddiq2NAidK!j%Qn;lP+!pI(oc9l`ezbE)gMD>xmjqP6GjqJBGNk}4 zw*Vl&;3+-dlVC&-<xd^Ie25&~yR_pQkv1a(ekl0Qn4X5=-=W{dmCk_QbmMba@4{9_ zySVOw0q^|T_}S&TOcDQmmhMBmj)OnJ=ve>E@yiG2?YH9_kv1a(erUjNdK!lR8R3`C zfZueN@DKKPuUy^Pd&~Y$Ws3OkPw}tcB>V|R$NJ}vUp_c*za3wRv>6%jLj!)((<uCf zXN6xn1AfyT@b?W4uUq@b+P=q1`|{$rFVz(Rr|bJo@FtiX+y61VJ+kRM>~nlB(q?49 z3kB~f)6*!t<2!{{I>Bo(j`LlZy85_U&*pgKN1WL{=Fn#S&q0DEG}hZ+8qPM^avpX$ zJ{4&*GT?-Q^Qh@*6wVFL={~n~g41GK#Mw7^|9yNOL!qzJehqaI?fs=)Ta@ei7X9Zz zf+;A_+a<%>Dx1#3KF7x*ZAJ#XQ1BiwJ&nTK`(fP&lTPqjj8nW1r2p}g;eFu#i1&dU z?-k*lOfX4xD1T*m7s#gbu+Q;<NSl!XFBH6cOi!cmwtt(x!zZ2KwHO!iuH~X#CGXp{ zLlJ0u0u-6OADSwRCRjpaz5TV}yphylm-;=CHX{R0C^#ogwoy2j?9#I)(g{wBZ4syb zn`5PK$a1WqF2a3R0yng68=orl8V;!~mcKE)SCTsHBd{~lW@Nw%1@DN-HVW^;Z`b`f z=>)IExQKW7q0$C4#~bP*Uf}xj6WX2^-W7&JYK!In8r};@9rh8Jh_o3Q@It}cZ?cWT zJO4ZMoqOp7uf@28H~#s`peL(Yn2Yr#;C8tYbnJY3s<6!PNPV&Vt>HeG)ZqsLBat>E z18yj|yG*uGxNpi1u?Dxrx`exbjYAH+G+zx<SAtu-z#uk@x9B^7hC`>t@^^;!R8oh1 z1p2=-&}L-73kC0Tt8WzEY1tvh;I$a1cq`^-;r0B?uzsLd?J3|rCA<rx|AFUkR}Am5 zqz?Pk_w0^%kpV9hyi2XVQFt%Q4lxF=#khpm#;t<}%ZxrQ)|WckFQ||m-8xlhi8ypt zDxWdjN0K`HK%(cnB5q{B4F&gNt8W-?*&){8wpbT&YkxIdoU*E?<k)A(MELBwd|C(j zc@tBGn+e9Ksi|qo@kgwIec6tCzB}Sa2K-R)FS7cE;g=m^9`KuPFg_ahk&fTH{#N*X z+=Jh{Kgb^ie}XXp)!Ve=k5~iyvK@DPPsEQ5_@M#6)i(<NMcE<d0l(>X{9$hy5?J&Y zemd?;^|9mGfO>*Mw*Om&JHZyUG&Nl{+=n8@z{U>_mKP#!WWWst_d=_06z=n~L#)AV zu?~GjzYEs`_lHELN|iFWtv=#rBkG9`+3Ui6J;4@~=<Rcc`#{7P*!aQ0@{dH^$bcIP z?)g^VFx;|3tif%uF5+H0G;6re!k)@R^z2TH!#&6!*rwlqNifP(D4%!y5o_R`x8tQB zjrfrPKNS4)tiDnBPs<K55BN<tefH?8p~~0KrMd`Nh<(RK+ZEe|H^C%UD1UEw_e5-g zhkXtfd~d{y40xg7ZL<1C;XNul#2CC5<JjNA)Y;#U#hHB^`6Zmm{oqT&c`?Bf8td&J z4Ch3|6xi71;D+Hu2AoiEPB$3m{yqBKOFF@6u`S~4>g^SGHcs(NI4yC}pM^=?_fD{c z#(KMMIM>UT^RUbDrAV8R0Vfok=S@$e`g7O!>Atsgg41GK!a4A$xMgq-JX*qOi3*%c zcj&%Pf+aN8+dmr44%u=Zb~!#5X)`k5go5*=>1h<s@$c7tAL#_A#kPoZRi9rm&&En! z3GB?gbXIuxCzzx<lz%e3ZL;Y+>~nk~(q?493kB~H)6*!tLqDKrt)vsY7ULq`N7r|W zI~%L`C8+Nzjq!<Rbl)ez5*q96pAF|C*>WCsIX)I?Gcw?Wf^)y=X%x=hy}Iuso#3?C z7I6*^bq=jwIo!MYAyuj{MvMCm<)u=63HE~#c9328>{MYq!4{P0?S|oAAluHv4~~yS z+Kddiq2Ml<o<`yB`a%82m~?{MV(qx^pRw?$KEqwCFQG2pE(o$GgnKl>CKaK4(Qwa` zZRg<!$44S<Mh4taaPKlb4a5CIx*sH+;I>$oaCZ$ns*mbcuN~?hP<1G?uqQGl{Kd<Q zplid<sltW?qwBiq_~nE1y6pH!q|L~H9}51Rrl(=}Kc?^cOJ~4uy1}UZ#{I)!d!+mE zhx+s{=;mNq{4P@pfN!${{-)=IKf!3Kn!e=t<%9FO?D$Be&B%Zs8t|K*hT-2Q{L&fl zo9-F-dpp-Yysq=%viAi&MlMsr@7wKw|1kIyjE?o+9KU>UUY8voiL@CR@IwQB)6+2g zKP>#x8StC#8Th+a5BB$VKJNZem*l)SMogvzf9AT@^I_pnFuJZUJAV1#ye>OF6lpUu z;D-kMrl(Q(SNw?ZOJ~4ux@X{D)2HW-qIYGnhx!t7TjoN)PlG$b<`|pwY#h(OHOaQ~ z@Pp$+kv1a(ZYa1XO;5vce_Xhw6WkW-;B#@_uk9XstZ$(FGbujqO{RqY-MzR>Ay)go zZK^PoU<?)1Iez)zycKqQAkt=Jzz+rggz0G%{`UQPUQs#&e$$Q5Mf`)04-R#&3GTt4 zHRfY|3A!!x$hPki?gU#<qPIH?_l=|uKd3(xX)`k5hJt(CWE+Kh#V3SYI>BwRp4soK z*J>Nn+uQk2ucy3FKMQ{%R|<kZr4al7g5uC?_++kF?zA{G$roqh7sm%8ZAOMTKtmi% zPov_{{-gR_L^?zNn{N89)c<|!)^_1h#4-#2AoV5WUuz>D9lO3={hwe9O7zxZxNjtN z_(A=?NSl!XH#Fcj*+$`B_DS`>bcX&n-7|2n>{}B@eFfaqmtc1q>@Y@JzeD|Pc);Z4 z1%~@tQimVZABeOW8E`|vJ!-Oz!rgvA{Vko~wpi!mzJJ}&n(m>VKI`=g_*btj%9X<K zkcT1YJgqo%89tdSmKRzaZX|X1g}{+Wn~@<7&=3ccZB!h(eoWs-k<QTnrh7*J+ryaM zT{CyS$jq7pvt&yVS!ofW-KOu<xG<bLEtVHqJm$$KXW}2nM<Q)ThVN5B`OJO7^fW9U zpVGLHPU2yGP#PCptPc-#Y9Xk+|4(E}=x6T#=kL}&Ai*e8p}fTL%LnIm+3}G`n~`BW zKp77^O;5w{|G4%6(i!lZ?&5d|*dFa(In*}?{wPzzU)=tOSRMm^g3+<Q)bYy)=XKff zkw}}70Y5b0H$4r*e^B_PGvGJfGx6)`<L;ry`z!4MLyTOe6al{gK-bWB34emovCen= z^1*psc6>O}W@Nw*4fst@qwsh9JK>kkfZudS{CX^R_26JnrykYg>0@({x>6p<WFq|g z91F5Hz@Fgqx|bXF7TI?mzHodX(q?494kZWdG(C;N-u~}}T{^*T@wU0YYIx<k0euaj zd(a+z3H$_islE*61K&MWSfAjM`cPhBm~SL?_(0{}NSl!XGZf4dCfg{?OMgP&MU+l3 zTbzrS>E_jIi<djIFc<41X3}ve^z-uXQI0n(#t!6_hIu-v!v`u0kv1a(W+<3PO}0^( zTMsG6ODC8u&PB`*ty{HfsIO1Y-`h=i$$%&A>r^H}Z<j=ryCB>hh9@xX?W+y<<)jWj zsNNlEGcw?Yf_sC>HVXIR|Df+<Nhi21))Dt=&D&Ld11r_rVY9D#$_(7OOqp@MvoKXy zZkVEm`2K3cekrNL7ixD!+Kdd?p<o{}*+yYs^dI$|MCk;(#k+*POY3@<p1&XJ?koEo zHrQv#%pCB<Y0*cf3hjnTr^WIb!+tTT!xsc5BW*?o>`<`xn{1=7FZfT>1>y~Mi??GR z)-`Q^lFsu!FV;uIe2zGCFLOe;+YFD?7t39S`+QP|9|(*`+Kddip{!*+Cfg|7^A1lJ zh&8w^)<xWFR%?puO9!e7g+46K@ztw_y}pEd<{oClNA)|!hR0L{@->G0Y*L3GRBnj0 z85wXx!QEl9jlz9Hc8E2&E!IWcg99rojq%}FS3>M}?TAg&_v$|&3<sxPUTb(yCUw}S ze&{CyZAJ#XQ1G@}eWUPRlO19VUW;)NZ<ppSw_{ZmO5V?2UqU_ep2cC|UJ!A(ia=jy zxQ{1w_(5gwPet6wfEx<#rB>f4+*f3WScBVQJp=d3zOL?mLtYMdtS=&;@tumEJ^Fv6 zh(p>-<@JX9Xi|qCNOb*l#ElHNq2O+{`bOctBs;_!+!pH@xJ$e9S!>uZ{Y`xlb@7`N zQFdCmn<5TrFO@eK?!!qPeju^pNW_f{xS`-)Wc7{0eL;4JHMlL-Mcj`KtRCv_ALuK) zKUF>}))#@d7eAC^Z0!3!{nkN(O{`GvHrxjz#=yf54%&Yv;zkDCP;f7>`bObCCp*L% z+!pI1?&2O)bri6qdAwL(#Jzk5?)LAWDqKsj1togB$8hhD7y}zWI9T?x5jQg6hJt&Z z)i(<F8QCG$;I>#7ardno>RUC~-{}vi=eSGt4qT7<^-7TnvKNH=N`fs^=<SV$dvC-T z*!aQ0vQJ0c$bcIP?k1~m7;f1i*5I~S7jbv4T-iN1_~`1sUVZkSe5XI{^GwDApvV1U z0KmWN2lN{e2}WR0mN@>1HSo^Zar@DT9~tmN!GE*C_|M4>F%S67Ha<V9dCUd)>a`Eg z41nsWPh*hFc@XsUn~j3lrgg94kYJUXP~K#5*dH+m9)5Aq{&O)7$Pfo;7zbA0sBv&k zc8Gl#|EAmHu(EUQ+P<Nc1Ks-iWN=Pzc??n+$G<$oe_HsjBp6-Sn;n0|8rb;5LHo}~ z{K$YG3jP+WZy0{rA?5+U>7I!{UbNs7r9A#9WB7U2cSiqj`a$7OFh)&HO>c4h5o=(d zv*Y$(i1?8KKQ!RC`i9|`9bz8vo9>zT2fEjGu9>6%qm1F_k>45k=l_uKCm0?7QpX>$ zM*Mc%ek|fg2K>-~-|8ENUv`Ljz;C)|;*Wi+dsD$b>e3t#$A3}ALcsH{F$BmT1Al@s zDAL=#jz3}z>~nU!>=z?`WWWy%_^rNC_|M4BIr$dwn{LM+*0(j?Yx)M_qX;?nq~36A z<|nv^J|^4=Hpl%|!@W0R3~c=1VA(H4+{l0%3hpMWZy0XbA=cowSQpp7*r!T+UAkJs zwn~nDhD=1yye|%X<ZlT7r37P8q_<^`KVl8+Gj_b}mm_{;zz+rg%|_#w9bz8vn{9k% z{VQSXDt|9Fmx=gieb@BhKH*O=2B3O-yW@{o1N)2}FFPLbBLjYDz;AjQ*8j3Y%maS2 z?fBDskM1*d>AX*6BK-6lnQ^>y{IKvR7+u#p9e>0c*k|l`*?*4skpVw6;5R)D!!J9; zJm5Fmjz9K)Z(nCu?+5%#E;;_0GBE<oexCryUj~1I(ebxA{)jc=x8wHzFXBfA{Lp~k z^fU_pIoToR0l(Rvjelk5L;7W;O4oa(7?@lLLr4Q2hLAV*{D|U^VD&iMXK~mcF$Xq& zanN!i#sL}P03{AhR^O;N9QrScgM1?n7W?3{=RHhPh|N7K`E{yzyj1P()bYFJSBRTY zuZLDsD*dkIrKjU>>ZLmF&<QWf6~%$yns3qTro{w54k>QLkY53qCm%(Ee_W&TBW1%6 zcMlEs_O0yfT|HRt_b|%K(XsI(Hf${W_*CJ9=|;bouU8Cs#%wh9U0~x62Q9x6`xBYF zbq;-#=mpc$u>O=C`jq~(F*F<h+U|8j1I5QkLcQm<8Td^O^!~vU_|Jkr!6;TJ-{ANo z*1$Vt$Mb$Q;ztJj(173cGz$M=*&*fuzuCs;8MyQ_KdZV+zlKA7S^OnALJ&WIk}UG$ z`xS!(r&ytMSPV8ryn%;L9Q6D_i~%yl02*RodKwjj-jj-fbP@xLd+>R3<5S^h{np1% zmy18`2cG$#(C=6!KKt*hcF9NP=mO~+)r)Tjp<krw+^<K<v6p6k_*TW|DaZZ4Hd_up zcJoq>m&$a@A7loNnz>Y@>SK?0H4RccE{`7`ALu=HP7d&Mm(3|{Pbhwj4StLEg2g_^ zkB{@LF?FNQ4sL#G%f`ta+r|Rdc$3?9Jn`t*w(Xm@Zi&K?&(Dn-drj$gQAVFl_`NA# zKT|ro<B7?cO+vg!pPgA}&8!Z6tHw7zwSCRT?H@|~D)KX){YZ<rB|isud~ou)iHIuY zcWs;;Gv{Z>!*?&DeA&TmZO;CNzH^{)ORRm|Vtf4o{r*cbj(yxSzF6OOs+~wE^cM#U z-+Q&li#4)8-;W}tKYP^n)J%3b!*01!X*?qD{y<-;bH*2ZA7^>J>qq8Mlg-z}6aQ8J zl_^XQO6IuXM1J?OtA%e=8-7>zt973KKI~lkf)42<Zr^M+UuC~dD^~CqT1}~UU(h7` zzAsp)V{C!xijElr#Gp0dYpAc<yk(Su+KDU$`PTog*hr4w*qQe~OM0lUrd0CZ+cv+* zk0RxFv3H&-jkUBEf6iE4t-sg3>reFCX#YFn82$4Sj`hD;`VX4p-@B$5r_`<=w@B8H z@ny66mc1yHT@m!nM&DYdUaU}PyXU{@^R&N={w(=S$)B6DvFpjZ!t3nS-wF20<y;i) z&;0oo+2_A4p!63Mf1vz+Y+f%`DEPDe!}{IjuFczw75cvI3wlQBx1x_rua|s0B;Vb~ zbLInMy<Ax?S?6QtL*^rtjRX`Qq4=2Bixo=rv2$V~^AZ0#<O6uuUoH8#L45ad(tKz! zT{*d!`8aMqLh%ubk5GKf>s=o{j!*1ZxnrB0>>aZeD9)qpACBx)_OkqD9I!uG@wt-k z)AHT_C!<Zrw0VIy%;*8DhmHNG<s)Mf`hZb<=bSN_*NYVjZI^yYpMCvPjAd(6%<b@x zoSrUB&VNOCEi!vAjLl}fFO{q_X}iVzfs$XL_yfhCyk4wOXscLujcuQt5lr~oKWywM z8gL(e@zuhnJFbRtaAAJQ_vOl89?M<kTb6Q6i>}i%-?y6YP{sii-=X-P*SjKoB-fB@ z8JC6MFZC@l9?Ma)=ldG!(lROE{T!VW<_~nao#PMZ_><R*6$)*uE%oH<rN3SBGqr== z5v!{;UmsLE|Br-P^YR6?^|@bb4qf;^N^NV+ZT(5xT64}`we@jY>zqHMwmzn6ou4gd zN_K0VAM~}`t#vG)J~&l4XZsKI_<nPf#xmpPto&-%eq%((%p;MeljlTj{m;jArF=xY zTNU)UO(@&fC(Q>adG{$h|5nlP-8oa3w(Xa%FBPBv+Bl|pi|;|KBMRsKrhD8}Pdz>) zd$;H9zi<}+ugY_N$m(jH^Jmqr+Bv^3u}}PVsBc*JpzOt<<VGmDF|QXZ6xw$Ej`oHR z-W6VR<%@ZewWeX5J|q3_5Ch8k2E{HEfAV^<Lc#9I#O_?VW_M=yS+fh}|Bs>Ag<?0a z7b_I(wx2EGohwh>$n5SkyHM;xu?xj+UN2TC*gYz{{+~H><+usSTGJ5c=cJ##EtItw zid`ssvb<ibP_Vm1Yq964x$@(c%<hM!A6!uS7m8gd<0`KgD-`S=mtDs@S8g4VtThdI zzfJnV3nk7_>_Wkt*NYVjc8@7Xa^1$h((bhdod|dw=E~RCGJkf-E^&ae_kiLLlsM$| zVugY~)s}kp9*2Lo6t~n4b}w38t$AqC@714&hSav+T(U1|TWdZzo3yQUPS4Z2>f^N5 zdD*45KBj7&Te}mxwayRv+U?dlmM{LqRAH~L&(h<2k4cSX#!Zj*>&NsO(J}K#r0L+F z=^mxE$;b2y5vZe}$8AFA>wKH}0A=s7-Oj&VG~au8+q3eOy$AcFWg7GNu2XGB!h3P< z$20w&fr=mBt`EuHBdA25e}<6MwI;`%sqN#3^z3i^Jiyt3ewX1rlGJfcMdi`Ufi@%a zYMn#5=e*ct9Us2bTWBkvS8v%qxp92FbX%+zo%Q6i$v?Ed%N)n<QLC#ppRG7weLlOA z*vIDgDz@Z(DElfXc^^vN&+Eksg|^#2Jh<%%LdQSSCj7JV$FI+p=$NWX_qcXiJu>Lr zBfG4NQ2xIaia$`+#k^juP@+HFH<;-V{PllS^5?kOt8_nWo@7mB@aOx?A1MF92*n>L z{^a#(+Yq1Ze%86fmoBr_;*B!8KlA1L%@-(pBq+W>@g=W!b;O|Ok4rJ|TwLj%(|pOM zZGXV*LfNZ8u?xj+UZ1vY(S2DT3%>Te&;>GD$n5SlyHM~#u?xj+UhnF_t9wgBPfsuw zN;m4_7%{d9!&|6(OY;}RdrQ4{mF_L=m+yYfe!+aJbZ@CcvZ?(al#k3SD857S9m>4Q z>%|HMf4FbV9*=uVm;NT|g-`J{@s#;f>E6=0%%2}Jf1vE|p!fsDpS)hIP~5Jc--_0g z4+|GcaZ7b$_oUU;nh$TNUA5Plc|L6a)6#gYHFr%UZEMXlN0YX-=7lRs+gj)L6775H zou4CWTkrg!uj?Jlqlc#omy>;i@9#dUvCOzxs?UG+={2Hb=8;I#BF&?l)+Qg*mGTko zZdK6ZHlh5-W5IlYl3zb!=N}Wz_jlg*sC<2?WZ8qx*Vx5(omRcSb3OI=Fmn$SZ!hKX z3BFW#t7p#dyjXe8AG5kz=ls&YsD92*C-%YmarF(k8p<9BN^XRb8}oXxLZR&;+4bwe zx$?!RWUXl!r~9R!drMIE7EtU$@h7hrD-`T5`adPRbLE<gncYvAUFg?I7Zkft?B?}i zg@WCEiQT#K)R1JYX~6rVW*5pn0*YNIcJunQ?L4iC9_P7o+}X_TC(SODH5H0oD0cJu z)b8%Y?p*tqF3F~C513sjc%j&ZVmGf(+b+1Iy!=jmPOR5ldykWu-5-;F_Rvu5La_^F z-;~#j6$<^!XRUme&b=kO4hwyUK(+b0SH2@pLFcDr7rapR9#H&&GQaYAu|lD3wWXds z)bv*+KT|u{U2b)?=AlWot9I{^=b>Y2>tnpuTr!=stu-Gk{p*t5TIcj=(ze!lc_?XH z>)g7iw)M^r`nuk+yz8g+T@PQMrN{RkKccbBxH+tS#(dqs7|}8FNTg}Q6;WGr@-h8F z1nMa0ahp)~9{bD(D0`0|w(}ns&G#POcBy=2@4^0PkLE4D>$K{<hwG`whnahiU^T=r zxxbX$pWzl$a@tvvA3CDn0CvA4JG}pd;hz70OY@v-D=O`IjAmr+(m8ag=q}UKsC!KM zKY1=f<vY(TuHN$G*1^pmwnwn&!|{p9?UQ;mYkX`=@g_<>MkH3T)RXsaB=JZUW4G;Z zV|;4OdneV-uOl{@{z^E;%?7rS`6<Po|8R%iYxGq{zotyRSfS8%d}8$3o{d{Z$L$7` z+uZbmR}^?1aXi*0CpR)*ep)`fRzlDvMtL@nbH+(tFIFgS*UxW7>*=$je^(mAsc!6E zwz^vTtW|lb-af;JdSiU?XQm20$r$t;`jd(=c&^B={?Ei5%6<e}`=+N0yDN;V+sUDB z6Z#t2`A_BplpK24&X0)ZIn>*Z%U5zJdA?nJf$uu4I)}QRdVDCKU!I@qxQ@?O9+Nw* zuGTSmP3?RSG*=!up4eyH{G9sebw=4&a!wwBGN<!;u|n~=TkUvWHdVq++n+c6P;v&8 zoB<_g<n>~O;&%P~R<xd+aVhaL)s5Xnnosa*?VlmFtG9o!S8t5FK0Q@9;`2&+JZBtL zjKQ<`s{TV%uMr*d%%w=v$Uo>iU)Cm%_3h*gw+SU@{H*x^C1-rv&VNBP&l%qKkbEU) zkk>Y;pYUC$Rp$)XQ;!ejb4IW}WB*lNuC+Y7v($d^QT<nr<B9C>{>v7RgZ3;eOrGzB z9{blon~}L&=TNQ{Z<?O3+<q)No{tZFs#I#7i#M;myfFTG>)%W%b`M)!t#h&MTJ`Jq zrNllqe^v2aVw8JcoRd4DeAb%RixmoOXYRP-9`1yE@$25jI!3tCXMW>Wj|}>LO*Y?X zl)TM3zCiCTQ!iF1(U+N@@AQ13<i`=SQ|Yt5>zN-X%@62XWC4mFQ2fa2gA;ng51y;$ zd2jA7UHF%XA3kOBg?hGHub!Xl3vp?Q>{;&x`R+{G{<`cgG0MJ}bNqqQM|r(ip}1W? zzZI=#EHD52lAoz=>`qu+tz-G9+Eu$3&ByW;wXJvTEzug`ZEGDbV6V4tSN!}`;X;}R zACKPy{uT8tah#T4L)YVa#<;@P0*$Nd)+X=c+gZ=tCX{{4e=#4RjMWo%{u`qCdgg5> z<SXkLYwjtHV|>?X)$5t-smF)e3({A9|4UBq_{YlgV5im9IuEX?UDf-m#6IKUx70sx zGRpUuIVWF0$*+06SfS8%lk%6(gSqneGRa!gFjh~Sekl1Hie2d4MzQbpIt&H7Hxj#Z z&A-E$-T!WOq2y~QcA?nK>%|HMyXUp<;QLS9=eE5^z=A-vbGrSXXU5^TWp|0%L&?`r z{DG3M^LnvD!JleNJ^A`d;%90HyRA1OhFZtz2DPhqoE}iyddJ%Nq;0L^1?=_qZTm6( zU!dnS>GA82|E9hrjt7;STeOEA(J|vnq-pV&b^T#&@;<(ueC;-&<m*%B1GGiwziH?H zLp0CV-nLb~lCN1)CNw_qU8hy&Yu8hc53}=iupHv(_kL%~l)3KcEVY~ei~22i#}L`! z{dX(|3%*#ItL)XNT=2s1tWPsC%u{Ha=uXq~mAmHP9&q<gbHA8(@M*46>-=Y)T}iN~ z`Wch0H)AYno&U$w&gbyy?GJ@`=40G#Z7>_0BlEk8GoMRB`TQCBPNNT$sTV60+Kx{= zTlRi=$Cpa`#{-VZ+T~=rj6d&_5Pq<8fUY#!V>GQ7D-`_UJBh3%?E9Czp!Dn*0{Oj; zO4lK~<U8^dkIyC@<Hxre9WnZ((X?KyP-t6isb?Iu{aeY;)J}+l)zvzV4y#?g<LHvw z`ZYtXeUAV2_Roo5(*F@8bIR8O`ir<8QQq&>_iIOV%-9fV+R$>fFkx--e!88tz->a8 z$_~`W5ci@uf05DRm%nvBchT>i3&VjgGp0YMSJX>8*ALcBl3^WTtvjJ{3~pqaI>LL9 zjYsj_b1G-4o?88<?d&xo=GD0SkNTt4x!>!V4;{^hHB*moJFTwP`EX6`s+|wV6Z_cw zJ@qwt6-r)(l2@VR)x2J;P-webdCd27bIqk?lC`Fx57GOG7|``b$)B9BHk#Ip6$*Cu zo!0+IXxy+5xAnL<W~!Z^C(HP=S^BWgn1^mO`jpYMUaU~?r`l4_c$v7f6t~n4c8^$H zt>fjg+SNN=T9uRP?Q{IEw|_PrpDG;oJRv=vKj|mpdPRQqYb_noF=IodX@S1;f5zJ6 z{d7C|(``b@pHTEe$)8a2Cv>~07ni}`arsIPB*)*-Sj6`r*Ad=}<2jzq{(cU+(F3j3 zhe|onZQ*C-J$1~NWp>sxHmK<6_|N+M#c{cE(La>WTw_ecy>zHyPsBm%!a$pm;rbuC zLiDWZ@wEW`^%mOBj=}S@x8@#D*NZC8>0MS=>ztlHulhNCBC$^_{#Y??Gs>QnbMDDN zdDb+q7b_InZn)=aVef0>_aKJe6mh{nD1WNmXZ1)nYK-gepU5tsFF?uhQ2c?iHs$qV zg@WBhcV8{cTY5G8Zqp|HRudKQm+AW&p7Z=(Ri(Z4h0LD|vK#Kvi@sO7I453EzNeAb zixmoXiOuvM$Gv{f>r4KeO#JbC5-rv)Cz~YeJaqo4*@t2uN_?R7S6(kxD757}E3BX3 z>G<lBKM3UaIml(@%8ksQKa<@K2|~M#@;xlh>A$>QtWfZ$+Cr|oRmp!dig|YQC8fBf zZLxdV>S~>5tuHN&qq(kO^Le&GZR?#A2NJurj^Fc1+gisOajSP+Z1^v_|CQu;U$e<4 zJbQRh>vPLj#WkBTiLITlyjnPGZSwJPJ8QPvgtD$c(GO+bLDA1xT_x(pW$?FEzOrVs zuV~l!!S^875#EEocog4#t>P@zQ;!ej)~n~^nuU3E-EpSi4AZig#Te8&j}EJy=i|BN z(I&Iuar|@j5&0KN9)ptqpya>2UaU~)gT*hee*bzYvwKnc`HTem4MwrcIsWAJVuga; z{j%$L=bFFkC2LK?xcLj|2Pc&E2Z}u?`9H50D-`T5QNDM(bItv8nce?mcA(gSf)`4h z^LnvD!7ghazrRKPw>@2PepH)JM&x_c80XJl%5H}kP}UhJ>kJe-dA(Sn;7_%so^@v7 zD@uN*cCg!Pb+yiqJ!<FuR_pvYt+v%(qvd0~N%`09);dmCByDRQYs9VIadGfhbRR#- zQNGTQ2gutk+UJbxHKJq2q)1a?k=9~slaG(vS!diPlywG*erStP^fOlTb;jH7k*};X ztc3?P2k>2|Ro@?TJ<wWxD7Vf8+j;{><?F)kon@{Gix*Y2o&43Q!fD6iN=5%hesVpy zJ6`*R8uqCiEP6wr&B(k#=TLIdWz*wpY~F{ot+vos58L-{-15|pjZcMNCg}9G)ICd$ zF>0|>Yc65ljl9bG+8s#j9<aJvb4lB)OLO{y#kdlV^ND?AKC5`Y$>_aC=?D0Xt-M~W zP-y$a6Pt>W<9z#vi>F~M9g$!DUEo$7)9?=7%9L@drwUzD<`<MT35s7({L1Ua3Wc^5 z&v6S(@12o7>-}<OciQYi-zI4&cA?nK>s_JS_48ZNddAIx*Hj)i=d7;QaWh{z(&JR? zxam>bdi$2xxZPU&XY!<et3Amhz7~8&{X-ut&~G*D)N4e?>`_FTcE9dw;Yx*haXV{) z+l11me`h{GxwgJy=T}9^e_rs@+wPaItOcxBt?Ea74{{yhJz$DQ@!j(wXQ`fge8_U5 zUvA8@ncB~f>lw?VUsHK3AGEq!$MQnmhw(8r*I2%g*e8ZxQ2&qvq2xd)a~{f^&+Eks zg|>%f*S~W(SB~qKtThcW{(I?vvlviv4HUc3B}UVFu|mP_b=~9RH%izS+ZtNzH;=<y zbL&#(&p*g6ae(3v6n~(^A+HxJ6#S{S)H7c8FD}I`wS(QWR#)qInWvoKajJE^bg6B< zeUATbx7Pky@*Dd7RL>96<GJse`iEG|*Zs#yy+(A**br&jyF~XVtxeufx0CzaCX_z? zocRDH_kG^ZuZ!ln&)e>kujD@R^J4WQzU#E=eX#4P$A>KU1+&D*_rF;^Uo@?_f4r%F zIqSX$P4Vr9Vc!||xPi(2Vh+x}Ezo9U_&y_)ea>am<9R;sGul>LXe+<pzhi9MbB}Hu z-{HUV4}apJ@vTpMC~B(3My>Og`%6Qu)~}i4*xhS&wa(u*eGYJD-YdfEti`tyjx&jU zWd2RDezj4)1IGEwj4muwFIFhD9iPyDb!4$SDPIcuOo3c{=<N|JvggJ3`@t<bMoGo} zuhk<%+b_!}zNZF#y-|GRoag)Uda*)@K8{a3wByMq$L!&b;LAI&7WnLBP*NM-QSxz8 zpYI&|r=IXSVm?&bD=(0&nTczS{@-F14ADNL+`r=dA){SJLp{eT_%pF%=65vsOoug% z`(RCRZbTb8_3!2Pn*A1J%9LZ7f6elP7()5Z9hCb8P-2+Zixmp~Ra@$r52J4^#WA&m z-Gf$F>wLJNcJ<DOg<2!(9jE<jTle@8-g^6X({D}{jwgB5*TOGpeh|k+`mA!dUL!hY zT!}O-f9uu4#R|FNcGg0-31yCc(R_e1R&Uz*9U6D}TIg*L%2(FHuwH8%<GW6)UJG4M zJwD7>BkU^RD?JA`y}9xnIAnFT&Vfa5seTSzOzea8h3XsD1So3)l)i+rCgk;Eg+kkX zvg`L_=gRX#lC`E`oW98HLfLCWu?xj+UZ1vYRnDw-?w!r-&Xay}H<a8AC3i!~-O#S2 zUWcK8m$i=P0$A^CA5(L#-XPzjM&)50yjb?g)lhOZlw1uZSLgL&g+kkEOFg-I!M!Cv zQ#;u0vASBvX+iC(&DHrhJ*Bqwj<uU=Tkm)Qd$qYb@7s~z()ZdtpGlAB>KCYQiQ{SI z<z-s)M|8}%5@|a4jIPhDP2R`1ldIh(lzDci`2cOvd5fLDL^RLU-nK`+lB-!y4rm<X zyH2al)vl)=A7<q0U^LF3<hrG_-{-2Obk=F&A?C|ZPZbL8w^xY1%y2KWXKScpZw9r! zZ8I{9bPj#9=t0xdsB0Gg-!%5B>Hn1tX>Yw)HeavTPpWSDw)p)>#>enutJgko|3LS{ zI;OyTcJr2PV^6(<$KpeQxAHw3^k;rgZQJ;CD?hNay>;o%<?p_C!<x-cY}>kh>ywkM zgI$ko-=P1+8r}Nr_6^TG_>TKJH*DVW#Q2WUu?^+)omQN99n<R#^6O8|#xcGB<h25? zkyT$P%$ME&tykO0H+*ET=)~{6;Ugl!$Mce*-R0kj?G`524`33aVPq-z@BQp`tyHK` zx9_*73KP~oFzxM~(jUgM?fYSKEdX7v>jIHxWL}{I=qp7Frl(PTx>7pRg1_m1>h6+n zTz5Pu`_%ou#gR6gS6eFO___X5cZKYOzeTV9<oak}VAb%z&@kPwwr_2Ba07q5AF}%J zFUb5AwEbmn@O|n3m?~UPVjq;~?IG)z1F;VR`@9{uwZ(oxrqyJ>Lv+5?H>zLG$`04B ztmQTqg3k%A!4Ig8QUUki2TG`Ud?FNN&kFZ+g3YR$RvPYo5o2KE2M6u<Mcl}=>KuAb zw8iQhh5MZB5NmK-taIGm>-#&`b`2NdSHfSED}{kiFk`$X&gge(6P%$!Z(SCH{Sj|q z;}Zw%_s19@)2ef5h=J8NEC#Ye+=+q3J&%F@0=#qJan(~Q^na8of#)YWLP37v|I}~e zB^a%$soU{Ktbu*bj@urH_>pN<4V1CpV)c!}e^z#gdBAVF@i`g$U61t*bcq#81^hv# z2>-seqU;H<C-_WF(<;NhFX9YreBq$2Jz__uRp-!v-Rc{LU3Q2!*e%|9->+HMJG9z| ze+BF=Q-ptigdcQm_+J|P2}YR;<zdGku?F5*J6`s#h##3&)j+}DWc7{0e@1qQdBAVF z!I<>@`>W{tAX5b2Uh4a%-x2l%9}p-#hJA0u8F=`@!HRcB?8vn092&4&eWS2nkR9R; zc8hn~_j8T;INp~gk+KZ1t2N;Tse5H1=8eOO$E5^wsL<Q{EFK3V_Q1wJ4tgJq@j#|k z=g?mjz0u%!T#+66fOuFRr16+*9K<m&S3H7LDIVizrwZ2+%rYIyBNmUN5qsd_9|tRz z$9N#qs&gpum}m738y~Vm9}o}ggEStUYi&VbzGV9#)!A%#QbqL?<l6uDRG}&QA9()O zYj_VPbr<Zo?Q0`mWLnh#`c0w>t-eus&&m!l4*hSs@tM)Qwl6O4It?Yq?Dax@U)cAx zm2$uZVZN5&avf_8^S+2Lu<?O|w)aHL$h7Jlx?6Of)i(^Y>=0)#Tbzr1{DJO)zP`1q zI#>6u8;CpJ*=zp{8G*k)1uvb%Y1i*62PPQB3Z>8SN34N&){fi0F5*X~RW;DfNLYQt z@XHP{5BN<tKC{v9ALv`zJvcbr+28+2ce$}XOQyI2__jabZ~Z;tPcQ<5GUWIp*1$V! z$IDkl{K&k?WZ#K|)i(<NdD$W60l(>X{A<=}*&iBMz4qbZp@DU4S9T7Sx$aR6%E-+M z1UgR>hXgBdD34nl4n)j>hhH3we0_`qGQ<H&99pctQE|9Q9ON5uu-M0W(EadW=Nd6p zz;ILk;2Zaz7QQ$72!GQ#UE`QfIxXJY8kWD@&pc_e3v`SvWJY=;<=9IzHwlt*^P~3` z_Nwivgy)CYEmu4yc^&fZ50uZFq0Z<2YF_U;km=DZ7+%@iIXKuoIIPq#WR=u;{+}h& zx^!tP%+`Bbm#*vW(^%>s8n}1qQV#EJ+qvBG#l5YiHE~+8ykYTj`_M7@`eM;jaZH3N z`h$aA-w<dsGW@<h^ik1;R_`&v*Ln+W7j;}M(0_~*8=E115%;=*f$p_K!|MjS2h7Oq z*d#L5#pb>=HfMf+s<1F(odM%Xi_OKP4qp*E7-=&y#0E-i+Dx`lv02`!*eKq_#`>ca zo8G>aoxQ_rI#>3rw%aG6ZpOHoAyZv&?)TuxCb2&J2UCSM!>!X|dCKB*GpWO01dc}9 zj12LC5}#g^ZB%@E9@1y;(n)-*PfGD&%y6SqW!9Jpb=Ae=fh-=o|8T0%Z#bj&_`b>F zF<(A8AOAQ$7ilvx!~;q^Momwn;xWGRYJol=9@Yn?c=UG<tm+$B)46tK_i$I|P^V-l zvtpCWRTrjq4-@(}oS!O;Byk9a^tRbz)FwZjhtC{ekF*&XVgw~dyG>7{VzjU8YJq+s zM%FLoV>HygzG6O3V}x8)F?v^98l&ZZq|XVGILMt)zQtlRBtM;p&m6aQ2ilAbF@h4K z!=|TEF*+$b^b0YvekmWLwY`H$m~K6mOtz{}y}KBypmX6L>-+FYJmgj=AF^2Oj&TV* zeCMEJRg4uf#0pBR&YGS^#p<H$&_Be=`ll4Dm9{pm)UJPZ`~+pze48m#Re0Lo<s&K1 z-)oA``6LE%C6uQvK8Io~0uO&V7<xFy2N~i6B|g_oPov^<O?K!L;$wYMici<$Yj2s0 zyuP}qyxXHfjL-gwJ{w4IixtWii^=hbKk)F8gMB?QCdd#IC^4CD^^J<jvekNCM!pdf z>xWWId_1s54aWt1uzP4o7Y(+WmC4z+Xj5J29`w)!KaO0`|H#Hz$iq_EYO%YP)PV(w zy^%H}L+qf$uH9rC6}zSH)92Uf4`OHi6@2FUa<E&0=pNQ=Tid;IXm#IO$xzZcS5~f- zUrmT|g+HAtbQz|=w6`6GeLAVb7pnI~+KkNII)~mPI%=|w!oKVgeI_oQV7GV&Y+P7B zy1Gl_MOT;WRt^mgcXhAQuCPmTloWqO+14N$WLy7is?cHBA~(K2XEC^z)Zr7g2O@1o z2JBFtZ67t+M#Z3A*LcJ|^uOr_Uoixaba(d;4nNx2yRLh<w|niwLp`dU8G~EMa=WQ0 ze?oESGJJt)Z{KEdxRKQ17u8F*1=@@Z*Vj;fXJ(VhHYyJ1*JvzACvmXYhrWAe<M{9s zTenP(?VMCi#69%q`VF<@+Ss2H*(KlR(O$Zy_3GC#dTH0vr_bNl#$(PY%`b`cj__%2 zJid_Vjhy&SpX8++FO|Wcg<|X$Mb^xvB2^!IoU3VYM;RgPdwigLb`Nzv=amXF(~2Eq zg8LeNUjlww@R9gas8iqV7}K8<1xCu7(W6D#;ScIr<l%|QZK=E;&qcX!Qm(WZvjxYK z;usQE@z8Pg3bXeaynf9>CF9~25#IRwb-zbr4E2mLl)zv97kZW{8E-yDzgscCTlGgx z7QczDNYf4DaqK0(--A!PBzMXM5{lh&rPA0z-u;2T&CZ?A{U7+PMydCL%tYwm&cNdQ zq%dDeFgWIdbbzx>u`1}ryd-WkY#k7u!AkQIiC8B3XUaGqyLl<cOJ(qf=aRlp6j|@% zRHoYFO0g~1zS6w(_&{H+hEVQf`FS~A@bG<};>Y-5{Q3CF@#ph$;+f&lbESU`i@Kce zQx-kW%cg9wt-8tQCdMQc+cQ7bb$1re53674XMCfdUGB_Z>i(VeKRh2N^an9IW3r4H z@F8<D8zb=YxdHwIl0QXdR`Qs5b*278-u;1+*XR%U-Y<E*>#StU>r)EGa;3$XdEW9q zF4xBGwkTFUrs4Ic9iwx2OCHtlV<}ejjmH*#@1?22z9iOZ-{9-$Q0$KdiU|EHR?{)# zaqK1U8+>Y)+$k4GsQaC;!r@$fgFp1aYedWS4bKI8eNd=3Y{k44A7JPFoG>3sFgWJ# zmu_raS$DOtLh<U?F>w=V+AVtVv3SfmrL>=j=e#df+tOL-s2t{Uyi$v%Cj239eayz8 z_i-vy?Qx~pmTO-rZ+U#6<Si(9%g@W{f(On`iXY>L@#o_w$Dik|IE+jE*0TO;f&M@T z{UH)`ulVb!!g@Q0=lx0Cz_K*yH~c_mv2;Pxl8<5hydn8hsgND#zPm`JI3w@=K*=w} z4Zg=OuXml5Y<Yc38NcO9i!t;3;(bxBjoTen{Cw=ev;1P;2#I~r`uNoXv88W3w#c4R z-&{-LpY{#Do-X#oye9frtfuAC1x-udH~6$)@~2WEJ9fYGs=4|Gf9M19OS!%wzj(dt z4)F-<VB{q62@K8`e?Y$(CSQq-V}n2bH+uFV!RoQuFCTd3^ionse8p;Nmo8{p^4PHU z9+Uj3RLG98Tdv$HHtr9Uc@ISol$hl8t{<7UZ`AJ>$QQ7?@9@tE`+@|YWB-J7a&2-k z!AbnYY8n}y8#`;;QOTd8L00O)?*2f@#ZdG>883Ogn?&aQ>$(RX@6ofOy~U6JLfiQp z^t`%!Bqoljl5egrrIqHm%jCa_$oI-msUN&PrPy5}f8dq-zDgy(;D2cBx%5&!U|avh z)dGDEwkso1FS5sE!++=LhWS!S_lWtUW<lqt6l=yEl<z`88Fx^wxAS_jLP0<G6UH}h zk2e!^4sXRbX+CQ2$m^hE4=rZDO_%ZI9TLOlyNuprH2iP5_-Vas#O{_IPqPu<p7PGh z7ysV>QXNxQ>3g<2tsWWl;RE+ipgf5I<sn-rznz=cixmoOx9*sn*fGf!xPKcs>fG?n zrG7eY_FAl6PUcD0dFcFc*=6oRUuTr>!*I@+&FjSqg|?GhC)HE($}dL5gMURfj@+sL z=GCjq?7bkgn*Da5j6Yn%V)xxfTa7L;`c|XVd%^DJEeg-@2aDdoqj+DPH(QMJa%D-9 zt7wZ4-(a-I=+_$M`*nG}SfS8%`fsNSi<0^4xsv{+exA)UV$9s5A#?Af@j0jD>qL)a zFUZeRp?2n*<DJRX_sdms9_PrrKTsZ9Ibi<%m?(V)eUT_wSBrY7WXtPQS}FJW7;VWq z#Pe&a!;jr=m*O;Ie^VxLBRlbT`kjp=rrr<#PI&lk=)R4m`9O}x&gF#1IVJB0?2kz9 zRH&W#=048k-nt*$ALv`u5Q-is`4Y;#9<SG7C;{WPt<P*89osg%S${vC@UIK|*#wJY z{|V`$PZlfhPw3UJW7Ytgc8n^&j+J5puiQ1$h7Zn^L5@-mdpTZ|j_>&MdL90hD6-zK zsZ6!UmBxCx_IH$FV&CHf<$ueeTr>H3nP!1S+og&h<A@>c<0!|EkLf+wiOs_UZNv9z znTeW_kGzfJ<H_RV{0GX&J}_KX_Q~;$Pt91nq*q&jnRklNYtKrCk949Ju`f?+EHE~} z!`Pq>`ToypFKFlRd~DH&#Pv#2M@*2pn2jrV`Me@#CnSH0%B*0wT&dLO$h$w#uhKbv z2;ciMuXp{GY<Yc3Yt3&yE>azS>~@zZRz45l_4@}%CJ3)*lRlSHtmqq$E&TK9n`23= zy>E^PJD-mgo-EB>`d6%`^9hf0O5Qj4G$grGp?2n*`#qC;>zwEQKw0yl=z%itp!XQf z?`vyX>=+v!+cMcH0TtS<pPDM1N^m&tpOqf^Xuje#q8Is&*oib<=lokr@qkw@-}OE< zQwBLoIo#!VQ98ck4{Ogah$8F#oXS*tTxsl=YtOvQ3-&!e(7WuMeCOwR8$YM*Ma7RX z#2EB3l;h9y-7{n5?`=EZH*n~2o`2+Iyczejbt$hWHamk`)bCV((!cmb|55>e^s3fF zJBR1vgMJ`32RBDq#tOKQ*_VwCc=@~l_qf`gqB1MkEmtb_8}jZCly!oBfbad0*Sr2o zw!A*2wdO4E+f;`iyWI<lfsbW)+zTvrjLzZR9M?Tr>l=?P{4464(InPs-{9-=4|(6r z3;ior(;nk->?Q9Te3~b@Q!bED_d8*Q!@2qff9M15IhE@hu5-OUDAXIaiaE>f!oeH= z+*DyQ!Qr@%Nk4W@DP9Yojya3iiPf}T=f}6iW6mk%a#oYcM~TvVIo#!Vr53suAb-eN z|JlZ(_j4*!?Qx~}mTO-rXL)>}<SZyT%g@W{f(OnH#g808e(*7r<Ii(e9LlldkiDq* z(;w)dKSYA=3!m4s%XSXW`;)i@EJ?rN2Qt?a9_N&N9OLIX$)5_fGv9LGy|z-Ek#~Qf z<QU=x-{Y6pyUt3sygsG1<{0mbREHnC-4%+Jk3D#nV{AsnKDe><YJu2>{BN;EcEh!) z!kHx2Y2V=MLAApkpPSLY;dmlaj=ki4gHPjXd&&h8>V7Aza5z`r;17L3jw#nS<QT6H z3iXDqI8GxciBDi~eqDILMr;-sHu&?tpl2ZrKf)fHUzHEs*FKTNf%qab|6Avd4eRe7 zwLL|HtYEiXxm9f3A1L=1q3D4Ulf2&bBXfG2J{ywnV0Yi)j|%&hGT47jI=MG?Ji$r) z#A<5UJ~wvOw}RT9qCr;b!S4P*xvvdH50vqe*Skq%_(_%f;un7c8=ik}BdKd$yRNr4 zZFfbnxt8Gfx-+s#zTKmkI*<5rT=-O=&B(k-=g@maTddyuw^9tyF;}7OwDi#*+)uS< z;6gm~gm~xBy7=fSay^sUqe_;3_kM%F=kKQq7tJS~7RUVW%HMbD{HXOYvBefLEua2E z5ijSIJRh7{a#vxO+MWuvGv6v<_L$6+j&s`mfpY&EiXJG>z2^0<!)-lyXLHku3-R}L zs9UUfK+l;Tr|@Xw=T4nJF!t2S@vYm(9vOQMR*-Gop=VnZ8}7x9J{$F-W0MP+oJduL zSl_DTpOes^R}4?y4nLO5KltT7C#iJLo^}_X(=~+jf@{OB5-xNd_|(G%UL$4~`Eq5_ zY*UBKdBvL?1tqUQS<9f@o5<_M3Z;^MuTN<`@mu;##Fy&f7`r1@S8M!eUvHdt{liqD zJ?T?li~dk?!l$JgXZ!RT(J_5=MPp$9x9MJHh5lgP*AhdChe8{-3FUJUpA)~YbMA}( zf%)`DqUmQGY1^anmA3p2+A)m@e7~YsQ-_!;xo>GMNcGg?1Nv*7|K-~B?~G&QPYkb9 zWbx6@ojPARqwkrqZQFEzx_{f)=-89bV_s;|9LA5l;BUXx)jF;_e)wvk_d8==xcTv@ zAAQ%QuiEjxH}Q+Mf3BF47og+?D0u-&UdZdk3Wc_t){Z^flg0F!{39=uyRLk9$wwNw zk7pb|%rd3z!=>0^=c0W1YNLD(!THOKvOmo0#R`SC)s}j4*X6{|)DCtRD<{CKwU5`U zoyTde9G~|k_PlMaF`oaAQ-w`7&(Py}@6Qx#@U&_j+N0M9$Lin3l5JK0?y)v`tZygp zxlJgaKl!}ApmXxxpPEm9A)4nsZ+lq2lK05X<LW1Tzob{SdC&FK<Aco3%6oI=uySpB zzCDhizcjo~ktN=K?$r6@y@|0c>$Z<=TRFaQ`}VQz16#M+6AgJk(WX+VXHMKOpL3nq zZTpV;=ENzryYR`o!t3&Pd`p;Dm2ixk4eTTHH;NrO0?IWTl>7!I@8$Jkg+g0$E%_|u zvhR<+!ykpOXJmL?`kA3P&ttP$?>94lE}I`vK6iu?XDDMmuXlym-M;bZuCeW#wUk9J zyyeQJM`QyZm;X@7$9cPT@9w?vwOszvqSBu8kkuoD&i^Z4h#8c83ngYyVwTs76$))9 zHhpMdZ2OLJ8*V`#{;{XU#{=J6@{vYu2Olo*x@bPMz${a`gvZ&~`CIwIdIiNtDDxeP zk9oaVq0qM4QrGxT{7mg&x9z(khFaHzakZ;={2x)<y2q;8);os4UT@zH{j<JLpX3o= zi~d@DOB|1C-C6iOaV=t8EtKrJk6tb8wl;Ym-_Ba(HlgGX&$X9y&RX<W=F{Ja=4+9+ zZIiEzP1eiZ%uAh*>s9Sq<a+AyL1t&IMRTny<=ULbUzN`oUZ?Pgx1T$8zO6+ocWm3H z4@_B-sEKXj(cJI#%){M<Qocwn;Ohyit92f>ePs50$j6%7x}Mla=BnaGPKA=MpyX62 z`6{m$D-_qC&!szDAfw~*(OI<poY{r)Sp}4_2*qw*FIFgS*UxW7>*=3X&DU}|vAf>t zYVDu>YM1A$N;vZV!IyeteDa2VyUFGUdOTlEE5_L0pf&HbUL!hYKXFL1t=dn_voVtU zcsu#ZZ9-WeeLj9x=j5v?^Xc=VdA{<tm*gvBgq(Ur;|bpv?@@nsh^dnMo8L2VJ@xp2 z{`{W7T)C%Qn*#o-e8KQKg@^xs?$r6pS6!R8Z`6aF@s`2nEn}lAH$Jgx3;~rKd*qgX zuV-E?|Gvue!mZRgFTCAcv>t!2d<Fd7|1VR8gVule?DOfm_2p5`orOOT=M#I&e#uV! zpze8Fo4k*1XFj=2DEZUJ%irsq`ScIw(?5yk^U2$`$=9&{%kK%r3*X1}s&+oPo_c&B ze))WwYi^Wla~^+HZWvyt@QAmcJ9U1=`P97=k+1lC+OzlnU-N0X#&HNt_Lh$6TIc`x zziNH5{zI+Lr!QJx-jvNzT|17bj%(gSl5N-h#RV3-)HdyJXFj=2D9?2Gc=;EdGoSv| zeEO1TKA*hpZu!c53UgjQ;`>RieLKWd$^FgOC)ZPt59rV5(_C|-T$?2yi~am%!|N1T z{P%OG&ewcexpm8yu_q>Vr0=P0d#;nJ&}MvMjaDkHSZg;v{d}!gR}4pRB6$PD@_i9w zt>g9lzf*tyXuMx=_E6M;zBAJ2|1Y-Q?7}ZsCe1c=$lQ4*{*ET}Zae25GUwb|&g;br zCD{F0?bQxPe+oZW@@Kv7$NT+OzgJsnU*00wRA-Cqvj2v%PlIwj0Oh`WUN2TC_(N>C z@5B9+oj+Fc2Z4MKTj`$9{>+~j$S&6>P}Vspa}0`~dA(Sn;7_%sp8ZA7kCft;+QIH_ ztE+W<om9Je$I%V7t+&tdzux}ox;a%?k<2yE;diKih{Y-8>!tf+4rgp!Q$9R)K>Ljf z^W=7NxZ8v>cZxYm=j8Ba^XY}6c@FosUGkOj#X56NV-eqX>s4(IcRls^AhWY__+0t8 zT$?NStMVel>l7Y+;^$7CKRbt)p6x@Xno`eP+W(2lbLp(r)jF5Dl#Bd-#OBJ$^Cauo zh|fzEH}0uH?=ebF=A3)sdA(Sn(DuA^RXY!NXLjdHKRFFb?uC+jq2%7YUaU~C+p2Yi z&tZA)$DTC`eT_i1b9=!jXU5^HWS86vCHF#^8&Ler>%|HMf2u9@jF;1ipQ#<}-n6<} z$IEi%q<Y88q}tZo=lEZ5|6Ko)zIUI@9nZZlQU4H&6<UK2>ouZd#>R2wg%<5w7F(OV zpKd4jx=kp#*K^A}os)ZCY(BkAG|#=>_LO{Oe6c?Csvq(Fre4+NUe{BP4>CI|_s*3^ zXXi__#2ouZJ=UQeZ|iKCGOW&0yR-kMXQkt_f{|(OuT<P#tmDf`9s4b+7aj?;85zE> z3~dwbHCeyT$oreN)fR7?Ut<jYc=X{_vWbjS^rq)Ie|B8DcXpaHZp%(@N$SZTEeE5| zxnk_Du)13F$62+jcJH<`v5(EW6gz%PA9}Y@)*H^5OL@Imq0sj7uPW~!i+k>Q|25)* zzd_e3)#jvml8qW;pM8z&lHZ}MLr~TsDC<yOFIFhnEu7PHXQ!h-t$$SVXIeH+{egbJ zL9f$a{q|t5(lx+=%%9iFF8vH;{e|KWlsM(}VugY~TpzJEa!u0o(<Og6>*x%ra%^ zzn>YO#j?w~2xVP_lDDA5Ew2|V6#S{S)HALxCVr-Nu)FXlB8FPWb-&uxJFfStZM|dg zjM~;aUcg>&-(G9_Tw&aD8hU(9U8KGxj{CHJ-q34A$Be61$u9q?tA)MRChz0hSySC6 zl>Fd1^wm0NO?{2|^g7XeP4%`5|3h3;S@%aZKJdL?ylU4}*He!Va&gw0I@fwpuFVPj zRe8PPbqbGo`?*u+ms?}}OEGyr(WX+VXD)8~kENWE>c#FMtE+V`F8WW^?@=!%_OW@7 zV#hTNlxrF&xf4oG&FjSqg|_=-x7v9;Bw1@3`sR(&PfmogmO#nfP}Y*XUaU~C+p64M zZ4Nk_*<B+2^cxg>Q0zj%o!5&M3U-faUURRHYbo1X1uO_un^!i-cjPJPe3R_5W<Xgp zpsX2C;*-~l6$)*uE%l7k1wUExGqr==9;>T$oEFrs+H0wNoSstKddJ#LwXJu&fW6+n zy>iFr3g;|Gp~u&ZyVbYE@wC>5W!ig;=$LU;knG8$x))|`@;<(uHN$N}Su;E*zCq`# z8Lj5in?>_A!`t@ASH>pm+5wGYd@rzf>JU>U_t&p4yw3I1;{!VKYmB+_f4Mx59tyrz zz834=S>|f2cp*aDQ+Ix@a02XEd8^{b_1I**_6oJ^H95HP%Yil{!|!}S+eI&!9*<WZ zN7`0fyloz<%jVD9WfK{v=uOXaJ~7-jwsDd#GIg30Zo^J*N$SZxdw*tjTrq;((^gk& z?&;TOB6<F(h(odt3Yq&9GjcJMwF=6b0cEYq>%|I%w&N3nJ3g3w=irj```&ql*}B8p z<YaH=%l)#+{DtznA5hjUDA$B}y;z~(3)h3JVO;av{H2J|W02>#O4neEKRq)x56CX- z7nJo2N{)aMv%FrcP~5Jc--^~VhR!8^rn<2^PdOG|tz)Q5?dlyvyVbVdKF8O3`)A?> zpDWx<a*?k=ZR#Il(WB1?kLfj{W5&iY$+l~3EVOx+_tWjHL2eVuyzyM~4xO_Gz0-VZ z7tPloZ+lk0GQL<R*Q<~5ecsQjKRd)!`G35f4_s$c{{M^Y4#Kb*AuEK~5Hdn&XhuUu zW<m%J4Go#eOhar|%-x+3n-yY1$Zl*_YeNWw5ZV<RT4F=HvXhz5FuTIw_j=uX-re`- z`h4#F)IPqy^LWghd(WTe`*qHFpL5T>pZodb)hlbN<Oydg8pxRJx*DlYCG{d4V%jS) z)2Lt0C6;u(7XSacUrB!0o$u5kfjSFK-el)dFY3iQkLs0u+B^(>#&v};*J8$8iy70W zy!lA71M3!J{geG?(7Ky|vZks%CWnL1`y|GEmdcpxE@R$Dc=M5D2ion#bG=@y<GgP$ zdw>Z)jdfl(dh{FtyIgk}bKPakdBK?d<IP8s9jGVPFqL&T|4(keX*;xAYw{-RFWsm& zReu>r-KmZ_^-pztQh&VGsx$MP99eg>F+S{z)mUTGu^%kOF?}NkWpkgwyG*8zcbxv0 zbysXM<{XiAWhTzK?jCA1<skO1yHYm~TIpZBHuS?6slAr_*<2(dc=dYMUExec1Nq){ zH)svjYbEP5P@~@S%f8m$>&wY3yQp1u9AntYHhMxX`iXn|;!Zb@dn*>}dc}_8S%$wy z!Z;0apW#Tqc>9ZWV+~T*+b6w7&#|z{G7^)k&%NooujD32Y{a5zD(gh$qi)}68?@VI z@+P}ZWIq=BIx(W`)8=vLGp?JAd0k=5>k4De8E-z4?7+IYkK;4R_ndw8=s%ryF})Xh zV%_sqp{zr6#ws6nxxO>z@0T#99>&z^%}0_QXt(RHn4{3deSY0~S5Gn0<hxZB4LjQQ zqV4k&P}U(jdgj6|uYZhr{bS5=XUyxLHy=rMpdM;TMf<3y@!zhVQKVOw?r8t3D8Ada zm*7<U!T*gOJ;xinjQRZ(#=IUg=J<K@1xP&|(84j}^|)b;tEall?H~D`q+Sn&!8i?N z<($kDV3+;DnB&Em<HeY|y!lA71M7}&#P4UkZu}>1oy}!>&l5lVeh9AvkwT|OPXX-G ze;BiW7*h{p`j0msNp_&!SVQ2v=Z_?-5PC7+Do2|l*@%?Js<K`xjD0BOL!Nf$;B(KU z&DPnz*07b^mqkdYeU{HV{WL2Mj>c<W#DKDrPCF-}&-OJjf6JQZ98<>W5%Q5_2i6_L zxVEFs^!<iyT|FCN!@IYT-??>ayZ<+M^vr`@jxA&E{TTDw%$Q^A%}0_QsHdW`>@s{| zq;l!<#Z`-!E}2N@XS3X=QfF7MJ11D6e6wvW{_8V3c<qZ6vY!g?x09fU*FeU5nwa`{ z&Sx0jd?eXH##YY#;y@qt3^IQMXH4nTY}!rhcG@u6YfmZa#kxoJUVEBRcdFNkLDZe< znx6FZ)Ysoa)D^pvT`TKR*ZaM<Sl6{)+Ql56n8z41&k(yq>X|nQ*k4a|&JjA*c~H3J zT5DMC73E%F4(0)Ut`EAho^|d8I0qY1HuN$+lQng`^WlHF7Z96_ITvLwn1^%r<7}g; z5V5}YQG?VigjTLMykDupT%z`R{EPKoKsZy;0JA^17YN$-Myj)cdJ#@G?Uk5mY^$70 zEa~BUW#=i3cYIhjTA0du)x6qWS2dS*2Ta~%*Q<i(VqdSOqpaAa%~Q~4^c}|BYcb~D zf-(2X-h3q4fpvSpiuHcH&SUpfV~;VfdyHw9G5gh<k0d+LZqD=WdKI+yjYC;e)%Jzc zz~|nVG55ZVX^%1YzTSK!*@1RD!Kyg`zj23uL3`Y4kKJPMd7Wg;?;bJczJoEJ^?UP? zWCz;Kc)@LN(E1$m*gYM5wvRFQvW(f!jA`GSk0d+LZY%7@y0(|2tf^}E^BLfCU&EMt zR>ri;nEvL?N0J?AHwF8bSoe3s9=m6Pzb_b!xxZt~b~5Jv&YO=UJJ4=B?8bUcDMndS z)oyPI_-rp@`ZHs$tBl!RZ$6UjK)ZQ&erE9<Ki<QbXAU-#1!BEUje7K)1-sm@G3I`a zF?BGeAA0kVWC!YrHB4#!d(rJTZHIOTOx|SIzv(Ycef=vy-Knl&b*L-*rpc~DJ*Yd? zwImMv39&ob^&kgzr#h#rX*b6Gns;7yqV81Z7X4(Z^PpqvwN|3K=E{Dp2=jnGSA+Yb z5&SE~G3VfF>?Mi^@V6UH9q)YjU-oNalQHL_>__I~ocpx}M$_4dz56w(8;56-TvxcK zOv8Mk_8dN^%ta!CSFgV3W}a}SqJezxbIPE-SNI-_1V>|}XSe1}4S9Mik1y>u)oruZ zs&t;mIuP^!x#%n2!zRD#t}DF%Wp?q0b{x+#T$35|8c=6A(l_2dW8GMT)b;jDozb%h zHd#hua`m}4UH4bfvV}{QFFdbmQQ0h8j@YtK0{)xI+MNBG+lLxYyOkzyvTO4w>cx65 z-LCA@=3?|6=Luu(O&N0!!I*nfZ$6Ujz`CV<vEPTMp{%KDkIjYP^IFcBdnU%T%b0q+ z`AD(@?GAz^Yje;wq1j{iBJjC4Wz4-PV~!(Z?oGY<NU{U%7XBsn`~M`AHC65QRv12G z?$sD`&%~Jh?#<VAd%=?S23?ElJ$5e!pY3DJerC*mW=#9ud?eX{?ajq=@mQ~82`Fo- z+U;EeKF60a+sl}C8FPHS`AD(@?e>Ee>)y1+V|OX|`+~ukdsD`2Cu6Ql-h3q4fp+;! zna{fUOt1M%r#(zBMS85))kKuFf%uPgD`A)Yz?kbJV_sVrvmd<qNV0=%7yAHyHo-k> z^SG-g1RJqltD8M~E`eR{Ss8QB%9uJBbI<C{N0J?=r(h$lgSdXPf68XK&t{wZ-QTZE z`~D=m{T%B^Ap>P4oy=vhOTT2ihl$x=Jm)<1<|D}tcHhpfu3EIDY*AU^!exstUR0%j zdyJnianDb!xx;SXvGVB7J6il#ZnSVbB85SZ*5%N|zGF;ZV$8Y4m}`eOA4ztg)>y+- zt||3zxP7Ya&~A^(o9s0u?#-!RQ*ux@*5|X{>q0f^%33$swY?K{WBq*0yFQ1M-N~-8 z8GoDlI$4govF`W1Yh5eqPIX-xM%}5dAt~6q%kNcAcD~a;r#k;Cf3ntUQF~Ci&nU<I zqpy!ZSHWA(eFo=#5z1Eo1NR%Ij&~mZFZUT@lQGu>*<+rMbKYlMU^G=B_TFbq)P+{A zJ-io6!aSw+R{V?gK4XG21r0F!gZqr2{dA-{iEle=&kECCiCLEYE$0$TdgML$Y0S3k z*#|NFH<k6W+i3RUsdt0Po9ud7@lNdPWhTmsZQ8sXeaCAsW9|hR^ZLn{dvI?)lI*~` zBVfh)Y^BX(_X=Z=G502nX_qnk)tiqbJJ4>)VC?I3D$1Iw_SpU$d|ulba}Um#_89Xz z>di-z9cXs|tXQAvG<odSfX_V+V?G~d%)KFFJ|FhxBgqc5Tkv<cy+PN9=_qTe+U>m( ze727<_d1N(&x~o`n~x+r&~6V{vF^d^Ja&HpKKD|Lxd&%VyNu~?-h3q4fp&A=MSElY z{2ygaRlB`cfxj;j7;_KKnC)cDeUmpINp_&!POxIVrd50F)`HLWGNwN>=K9K*?e*p( z$quxef&F5v*Tay<?$zM)8o-!)YR0t3nEvL?N0J?Aw;Oh2y_S}vtf^}E^EKeppBQuR z%$V(G%=zWbN0J?Am+u$xJLbH%FwbyoCJV%ReIEDdSqZ!B2gV#{#`Jr}oY&rbB-w#_ zVh!Z^g-CzHr+vunH(i%@M@-&i*Zb7>r@r2opzc)H>?YKWb${$#cLz{+s%z);4_v#G zUH=MDcdBbx9qo2G|LpgWFlO9eMGT&K*@L=MT}$GyZ=C9Skb}BYozraBROesm4r{G6 zwYQP|aW&>2eLVs9!4>#diet|GLF_eC@&09=spFl8|I7YZY%=DWAp5^danA9(%xJO@ zd-umuw+>plesd3>g?UQtJ@^;v{#ZCu(EzhQ*dGV&btCU-NpkkIk)Fr9&!5BIs&<oS zx%IP?*IMIjzbDk85BYq)%Xt=W=koan56t_T@hr0&&KYMTPBvx#FQ3n+f8=Pm9yaM) z65}xJ+?$Sm%v)4}=Q;l$zeCw?v{IW6)IIHEryY~MM%1EStk321j1AhR&0nL>xQAfO zdjiJXyD{cHfj1vXc3@qGSf9Uid+auV&piZV?kyP8E@SHP<|D}tVpq=n;;CH2D@T6l z_q0K~Z6<HB<1>PKQym}Lo@yUg@3_{=RsJUH^o{6awx=Cya?-z?b(;IM4VbHapW-u9 zQ^(ua|I0cpHW|~eWG>d@oa^)rM$=7*z3a5p&4gC2)4Z09!=I?V0{>!Nr-d^W4KVwI zbvkI>iBxBRdJ%qO+AA^B*xzz4v83y@%6WR>lxKb{VJdT>=9B1iq0{6|b}nR$#y%H9 z%0Bz%R`eOy2F6^g7<0{FOrP@RBgqcp$Fc5(%b`)%z0KHT%=<mYw9A<N>dn`6<v1vw z%J`&Uu14ary+tN(vg6Z$da<rm-tnQ9srK>kPHU|(GdIYQwdxl1G22u8Z#-Yczfv6Y zJ0dM8yE=s5M>IYnV~lJ&{4Z;j*knw<lDT*@&bd}K8cj`zy=#@!9fDS_Ra{S7;ZM|_ zyawZyi$nykUfCZ>o^Yn3fei0E3_<ITUSC+Bfg06ba$>K<9puExEW4;(wrl6LRsq}S z3C-vy?i)iYkKa9FG4pw2Jj-zZ&NvNmnJFv%;_WZijWtMJZ=aNoIU4SUO_q_ETz&3M z*Ugs~Tf{~znx-<>r+xOreifa$CU3HHy$khXo$EEqKHGX9`iyHaW3I)Fxh68^obl!( z$quZWxi<FC?KXJqwt~-nBV+Cx8PhIf>hb0y$quyJ2D{$p1JS-`SAnvos_hH+8@r78 zjFU0#GNxT`zOKt-@3WKyDd34mJa&HvKA*8M<}+-@^dH82*5%Ddk{$l9{jq7C+dpEH zG41x7yvh1wBG&V%`eQ!o#=1}T`jmybQ}qkBd8%VuyUSXu+N?q3$Tja?j4k`I0N)Yq z#J^G;^L>#FlpXjl{`Rt|;~nGw<(elp8PlI-&1=CquX*<vO}|I%z2-^XerV-2kJsf? z_yDyhehxp$MIwS%udMBoC!DEhAY-!Yd!#y5)Qiw&+AA^Bs9(+{mh|vzg0n;SwwGn2 zg{fQ<Qoe{j2a8PJWanTX>cu(-8<c&vwH<v%-(k#a0%NX`jCoD)<|D}ttedwX_Gi`8 zP}Wqn$K)Ynk1_Y>jA@rK`_-GT>vn?`>)fyP*!?5;ycRL$HGwhhGG;$`^O0l+@rzj3 zjd73Nhr#DHfibTMjM+}cye4?_kz@z4E9ZXkRQ$31Kkm3_Htmj>yvh1wD%QKH`eO;| z#(F>E^{FP*ovL53?Nc4w>Rs1b^=1tsN3IEfz}T`MOTWZ#*5F?$j`_}BF3P6jyXmc_ zj(3dzmurI9WK4gSHSYnO^P2FW(bR$1drgqKBhbog0<T+H@BwO19fzOfA`!u>*LzJ6 z&Qvsz@4Y4jt?%LMI0=r%NcTa`JMI&ALUJo$x2Z67tyRQ!dO|1qiuXbrRUY35WwGYX z?ROpHS%&KvV}8C_VaiJ1c>9cXV+~T*+b<PgIT{{^O_q_ETz&3M*Zt-FFhOj^qHQYc zP0H6l>|fDaWb!7v-t?hf%<GM^&$d2=zT-S$%<CUxUJn@a`sd9@k{wt#@0-~7uhUT0 zRJF&Z8+=}e81tTpG3_#@9&bL9>_EE%V8y)7dF(!I>@w!{k1_2srd@A7lI%dc6>00N z+FhLAgDBhEeaE*9@BYTRc1}lGgS7kM8QA4@kuk4}jOka5d0q78Bgqcb)1AD|;%`FC z#Bt8fuAb@N{_rzaz1BGd=l>Ruo@Zf~<H4BkO)%y-F{Vy$K9cM}J(cR6WBe7iuy>C6 zI~t{3j#g`$tCf}IGu<Jhh3kK$P=IzxI_<57CO&^*%r%EG`;IaD&YO=UJFsr7VJdSx z?mJhfwnMwwCU3HHybATEI>$RuH`e=1?>rqt-KoyC^zWxWFUnBY`<_6oKFmI!icjgW z`oB9~V<qGF|Hr>y3t#3uaIRg6U*PZTAe17n`g`ZN7@LqgR=9r)!>ftwHG?%WZ(?4g zY?EOhw}C@D%qQo!;OuPX2h(&APFumO3C_rW9Stl;O^nHD1}6m^t_j{Cocf>cKEWw8 zZ7GOfYw_>SNS!;uNd_m<T--9jDaF4hAmth7fw9BA>Bo{up0N4b*!-Ic{3qq3v9~eo zM%0(G{JRQbt8lNm_U~+OkIemGi)@z5!*4W8`Dr}=#%arRlh3@<(LZ;gUAv=QTr0gH zQvb-f7lYGlG?8;RID3G@YmzqzM~|0`dkZ+CiJTU2(!hzdjtNKmj~;hwqHS{S0cTHe z{Kh?fblyZCwV1ZB-#Av%hI_%;4IIC5=Wl{bdB!<la4g6qPuTq3Y>tnN5z9tn%edF0 z4$Cp{x6#E`_ANWuzroGx#-V@BIF@X?kmtW9lg{75)jn|_+O;p*#eK3j#BbuHWG93( zlW<O3WYS*z_Hl98n|l7nsk23w{z^d|`FjEUEne=?j(&LQuGB*-eJ18H{Z#yGSlK=U z<Jk(m2STr(f9dfYz2;quzjI3F!?|7WlOHK`89V9FQE858?|#@j2=>s#AA}%36z$~v z4xEF*@$*AHFY=8B_KP0V--DA0j`XV*CF>7=7g(qFfWf{dlRRPb_c_`BG6t*@jV*qd z^dr|7`1{CWtNobG?BDw2xSj%AWRq88Vjk;pZBU#u(LZfy*I@zUs{2RAYY?1#!y@Ma za1IB@Zyk%aZipsw9t7uzfbr6PmTEMxz1o-m08Vzmc=7i{**_Ahz_9xeO!9=y-{NGy zO5d`4G`5Ua56TOdzpE;?Di2#~|E?#0p6=TEi+3ek%IUb@r1STi^jNl|UAbtN-?~vg z&1I(j_!g@G=d?v8?Zv}cxNgW7*Jr`7_;nG=@^^watT@a5-6+oY{XhG<kUFTZ-NZcB zel@CWmS7wof=>C}N|x0@=C2+{@vF?uv0fV%Ie!EvKfoWfU$yVJldZEF9MMG1!{E#X z$Im~tpXV*Q%jT>GhnlFLoDOh~2Z!svH%Pnmex~Y)`F7oDTVS82IDZ1?1aSPWv;9ZT zv+L4MmDyhvf<sMAqn<~=DG2DFu^kspa5kQNs(su94mAnq&)}R0&c00W1Zh{(PA*5T z`_teL)Wj;((+SSJ06oM1T{xkK_4wO<^t08MKXnGrBZXmOgL%}>nD!opy^~;%_jTSN zx;O6b?k}s2Z_$tS+<Oe1IpD}V&@5Ts`I}=py%h}34Km3SHh;r|^F`(i>qKMAda(iJ zh0Why6I-J{T4eto2>T}ww#a6=MEt&ll-KjHGSN*x3;pvr+I0%r<#*lI{Uh_R3!HSr zBBu+SQ^Aow72Av@O^>V0!?>+*ol~4Az&Q;Zzj>(rOy*%eIMhUY)bk`b#o%nu1Wyn> z+V5o^Hh@D-tU}IH;G7Q5War@^7}O-3Zg9>3$8VpZ*9Dn}sTfaNlhN}uIA?<6HxKnX zCG)Tx9BL9h&wx`BphvHpdVW!paGnL{EO7khmtM!?%ox!>^|fL(I7Q(2%`g5&4DCut z0E0eHrtR;B&EHnxJdnA-^3m8bzlzj+;cw-Lt+BuEZU0USzf(1D$L|Zt7W+CbHR=4` zte$(%p<U;qU4GZ&am5^--DM5ooVLiMy?9JceLdz5UixVS`SKfE{Jt*7;qVnFA4eV3 z*JolL>vf=dy4#Mk;pfjor~Lj1%jzKWMUSJb1FONwG%Rvn07rgLL^F6S9PL-K4ouq? z>!afIfO8T0&2JshelF`kAvn}Td(`tHI2GVb_Ilg|4mAnqC2%eVXR_<SFc{P%oR`5_ z0*>E0pw}f?2hz7&Yf+PMdcj!=j^8?<*GX9iD#4*9;k*J)Wq=;NZp%8*1r9X{=T&gz z_biyEgN(brjts1vXV*=Ke^L|6bG%*yXBqVHnXxwrC+^E#?efeo-F>b7+Y-#%ta-Z! zymcnd)jXhfrqf;@?8$FQOq4YTVz2fNcYiR=_!j4tUJL#LPC0bTywoh&AMm^9I=u%B z&Q&tW6E?qF#Q7_8n02DDW&KJ@a@xeQ{0_dh#qTL`T_}VtvRS6v#5~sPLWAO*gZ}v| z+9ltKW?3B~^^dFzgW%*F7CEnjBj0h>3?2(dkE^T;soUfFr#SuK{2cx4w=QTulXamS z9BQIH>Ujg48gRB}f+vU`?f0@j=m3YBScRN7!MPF~zjZ;+L)oW~gF#Kg`5QRD0B5r6 zLhcM)=M-lEoU6d`TNm_wgRBd6;82t3c?+D{06luYBI`mwIMgJZx51I`<T6bM>1Vx; z%es&Z|D-0CXFtCK&Na~Ew=U@GN*v~o*rF!k41%)~oLKiOsm5nGU-Y%~@8DE}<2T>= zT{_XgxDyP{K{Ck`Hot4ec`0*~WuviWz9*m#%Q5gfg<@;)?Yr#nt#N+*^P&02k!=_9 z{5RdC^ZPM+EqE90szbZ{_A4D8W<Abni%i;!N9XGOivCPo`l}J;_+99{_a3popTp-< zyMLO#ih3w@z{EV(>r<vmFNI&c2fe?BUcdX7Nc$FYN1=f+IYZzyfa5p+w12HOb*WSL z@%!N17~mKD?hfrr=mUdoCzCv3^ZNko59t$@kH!|iNI@Op@;gjotL*(p?C%z^pR-|$ zY?jNx`|46&_j8ltEJXi&fOg4uOQgKSGLLot$aR2a3Jr^#e}Hov`bX*rgR!LP@k&=Z zwNDI#Bi|3u3?9q%mft(jd0A*H+fF9iEo{EC&;F1;VV!7f>1Rvz8^3=cwn86Ix8MKg z^Sg?d_F6@@)*#0XCY|rU>M{5b?P^B<_|3oclyGJu&S{HG+B47ZCSJ;!1*0<Wl2Df4 zQ_cH$js4y&=gpfLM;=Wb)HY;d9&3MSQ#Q}VIDQ13@_swZ>JVuh#UDc8lo}Q}AA=+B zt7`_2g`@pSuAkY^DVoR`0Y~0HkH*p08QEX3EHyDE=bzxn`{Yd1LG<YBUbd;re$!+9 zFL3w{uk^d-h=1}OVVynz2FHR-@`TOz;W$1rMywN!E&iGIQ`blMuC&-{`e-xz-8zo@ zC~T2U-hhdDtjE1Yan3{ke1dk#JFG0LL!|zZaUTVz*s#bM1xMaV)eIgBM~|0`dnR;> zCUQOn=a1;;Sl4Ym?$ktk<op{Pd1sVqI*1;<E@hg!>^D7U)_^1L>uCm$W!(85pw8<9 zgJVG^dBW!Va~vNTBi4z=mT^x(9bxl*NU=3O>mB=DJU++xym;2pWJ@_6r<?SC+*fIz z7(=`GE}q}IwA#aL#W`(}Nqgow#>Bd$pJTKmpWlPxJ&=X>@Z>oLbx>c%9<E;PpSioa z>17zl&!F=u=$!0+pbngIXrL`})`HVL3BMBm><33Qk+TjQc?XPa9mKD+pNoGcqutcR z^5lfTk$1N=gU7<r>yqrF>%gHVmLq39IP%UF({vDyzCS2lbb`hAsF>$>f6e=FVNpAe zY43B`llP`1Ut+PRpLg_|G2nP>AN>NHCovv=>nYy>7Iqi*|7l?G{+dkkgk8KRj@d6t zb2PTht19Jxt?*B=#XbC3{JM$zYqF`K)5JX1{u)x8Md+UmXxB>t{;K;&*3;}XT>lJ< zod1CHGC0zwv@1c<^tg(@)`BCN$oVfgy#ao&{Y?C|7aVG$O>({j=M`}L?$fp3i@#1s zzfqHL#=&_NoLKMsv>#HFaJ~ZPHE?3R@2fR^%W>3e&)49*2#%j0cK_J*!#3R4wS&R? zJ~GJ@cIIBVCgNOthFYVs#Sb^4Jj*d8ZnDl2TfFzm!MoFP-$%AnD*XRxCcSWPM~mcs zgLd_!U4H9(n_||&o`rMX_mN3^=Du%YeUEhCSC4Xh$Ghf<8!c-KXWo=;z311|LoMwl z<}v3@)7iIKttiKL^^Q36_CGN_QWyr;n|?n0a3k9F4%!v-^}ukbL-*mg;Jh6$?!Afb zxKm3j7;IY?nB*~LdSyEN0q4?YrbT1RxNkstmSgBde`s5cTRY?aulCNp$!3{86Z4q; z7^#0QK>vJ)c6~63{)tn3Jyzd?^L|kOOb_p$9<ZpHOk1yL-WSh4aV%|N8=|qLf0Fi5 z{e%AK6<gpmZnw_b9t_(S*yNR%n8&(*x)i4z{S$X7?g=K*Klv~8T0=i^>>Zl5JnHAw z4a!cwIi|gM*!vgk#k!wOHFen@J?5K$GZHW!&D*=<(S?300)u@-CV9ec_!;_){l$MK zL}SZ%w5qb5=zp=*vUitNzQa2E^ZeVko^`a%26K!yOwiZMe3iZ!{j(|B^;y7p==;Uw zZM&>Cyw}d5Jfh{}$Hay=PE~dWjdt2gfW5V_NB{8#xvuK_f(}!c?a@BA88~AB<59Jf zJ07$(0tWktO!9<1o`HLKoJ-%aY&5ovM;7X^978SoU)#z}amM2z*dm){iuQBM>+$GN zoD0!EKSH}U1dNC7AKlO8hDFYg!TAq3Giclsq@VS;<|>_Gz5~t|0sWl4Yj{5wpsj2> znQXVP`*F<vkUpWTXl&`{X4P-S=vT2deAF3MSL!;;zW+Kc_h_;`&9qP3O#12r94%62 zbF}Mgw9D`MoV$NGGY#jT!xove7k2-3>cWZ@i)KyiV=`EGH>Y1l5p%x0b^jr^QwKGq zWV&qa52MQFMX0m|bjH8pf4$Y?Sn+qf2fD{Pi{GW&w78{;wjzbq#!e>mRGVYk+Y<IR zfjz&^U$p<V7dr1ZRf8ki$w>rfQ*dTRFfRV5_p2q_E}j@aYGO5VwgM+1K#$%(7n-)P zf3;6+4Ne?5e*4Vky<9&Yx^k|S1O~^9O!9=?bs(N8L!*qP-NYzt@#8Wz-W%Z$+E#hG z;~#5ai)`|e4vOp_!-`XZ{@DiY+5)!y_G7w#WZctXr^&F$nGVjD0sXAUOUAtt9MMG1 zw%{a!bEw@Z;s43FYyZ*XPED*q&UWBz6`)7^eWhs&`%TZSpMbMDIDX^ali`j#?I(i4 zu^^K?VK?BI<0E6lveDQw?j@+hatt*XXR(!h`8!tL{_CtQkiP56gKsC>F68;I+@y~k z;%JfVB(!Tgw99Y(+UQ}9;GDL|q`i3bGd@?Ey=2A3_OBI6AB`ce7TUTVf72>IV4eLA z`z1HOxrQ2OKYymHRj*w&2fOJPgS|a8?g)*3zNyDhd~*z(EW;va1~@wf_=5JSx*I>S zQV(2bv2Wg+zwc?%XWm$RI4cY9{3?4pz~0WVccixh&c%oIT<9@%Yrvs)R-^7@a8khW z+w17L8G74UOUJ;WCgJP|&Mx5i-Lvaw5j|VHYmFS__|{u<wq8k2q#&Q=XJK5aon@$d zC)oQb?D6-Ny+PWqpP}@ax~<?)JL{0MGdR0~!|xq?gK+d``7D#1wa(&ReUrccBF$Sz z&TEVx@|@Zk(_RYfr3Tp3?;s?av7$fg`L_!=$>7L*AYa0k3C>Z`q2X&rE*P96WRfTB zgu~D$>=&gu8e7(k1~tEGG5^F?*ODu()We+lxC*w&rkYX{^H|Tv#6z8YrY}MN{1oll z3+?iokGg+kJ{Ez~V>FSoD>!?D<F`l9<0|v48643>PAWL*;Kb}_X1qqgp(bh9Zs6<# zj^8}f^F!uYMmC<ED9-NS><f<HJk#@4=1&zk)FgWL0Ox1m9L)qz5Wf#wKg^uz28Wth zh5eHTP6jxB^GC0HdR|bIaP|aezW|P2hnvk<)35YezZW=rg5x(Y3UkBfMKKukRWivF z_7INgzv9Ex8jUUUq7CI)jv*WKKy3AYHDLA6T4(Vy;+vj*dkxukA<uuECOzj!M~h_d zjdmS`cKKaP3l4Xg4b~1;CeCS#OxiP_5u0mi_;<pxQ8wuqr(ZTA<~swgtlnXaI;f$^ z#5~sXw@=wz3V%q4&cmS7Z~p3Wl=+);1fDG#7CHNXb2vDD^H=*7b#>-B_gX{WK6(Mq zBL%q^wO~)Q)84+YcLeMm7ok$5`H+PAEZT>d+IdXQ&%nt6$8VnN`6=@}DF^LWoD6V| z1jlcl>-D1Z)iZ1j?ch+8=-CgPqrmZd2ClD@tk*tgo&6oXmGAJA-{@hrDYsAAgFlN_ zs`%V_ww4Xh#Wu1W`)PmZIvTo)B2<+A*6VYLsmtPQBV%$704En5zx797FG`G$(Vz7k z%mgPJ9KUtLIzD{eXaIwAgiP{;U6c!-z`4vFYK_L0bz>OiS&kv;*maiJYI^uutFXYC zkN<!zvRS6X#5~sXvE(S1Q;GgL5bc_ScKOXm-9IuPTfs>(EOHJ4=Qwcu=A#}jnP+2Q zh$eCl1}7h!d<ypj8F%fEGS9M(UTaYktB{ig&RlT(=9!)!GS6zjp(f!R0?zT^_{}pt zUuB;4fJ05fnF-Db;P}lmeLa<Vk%)1mCgB_kP60T6^FptCdR|bIaI(QU5gfmHq1WLt z<A3xkz1ANF&TMe}=0)uScV48vGGMiVL0=`4JYi?d!k!4{;=|M$jV<$H9OYS#p&au- z+lo8Ixt^wNvBMbIPO0$!6HI!_F^(3=Jsj<tk9PT8Pn$i=TAb4snY5>_r{>9;`_5Gz z^7EiC?xy>#j8mOwCm+Ynyq7wtq1wbe*7KL=5-x$C9|4`GL#N;T)#KO>yR1*X?vosF ziUY>6sMsAxGAhBKW-`eWc1|9iU*KHY!m`oWGLEZJp5+*F(H~+fIr&8^^$h2J>Y?{f zIF4+VX)-a7b^qiX>vEQ%e~v`EN+;1jrEfUjS8NAogV99JQQ#~DXIC2Z1X-8#yc@R; zvxd%eK7-ru#=<sFm5I~APo3{IZh$?}PJ2hg-np=sH&N0(5PN#PuvELLou$di1?N0) z{MJFee)X9)vwyV@&I0EgaQx<Z{n_FE(EtX=j7;)`oiqn+#kq_nwMJu$e+;8M%Q57@ zAH-JT*DqSdrOy0$rRcHG$!3{K6Z2U6N6BoLvmE_%4BB-e+9iF;@)9IX_m8}5(FabF zVUcqzI2VC4Ln^CSIC{L8op|m#i@!ruv-x4eJdYGwm0r<KdwH-|5ujW9<Cy6`_KTi7 zv%y&$Fs|e0g^z1F80>2@$rE<Zap)7A%NVdd(bzJsT_`W@uE02ITRn@Mas3Buk<D_c z`EGeVu309ZWvb9WbI`73ljt8A*BWrfj3#o917|rnv0k_Jc!?%*^1-PBhkxhJ8^k}f zpY<3GY_Im^x!_z9FkVHA!^bNb47(4(Bv07QJVtw^Z>cL9TgIy#bwvLl#z$<GJ^ZFM zaG~?O?k5LzeonTO({Yta??2wrB6-K7U6-R>e%IS+bHkY-uxN`++B46B3zjY{3wstk zj=bp?IejvYm}9x~{O@j}2HMX!!R2b7s#Eq>U<^-y##(6fyVmM4oW9<<mh^*@YgptI zfOB;KN3RvNhLa4vqKTXn!MO$;zdg5J1M&;!+U>0ahnm=Sa^``v5*)v4gx*7hTJN$# zOPqU-nQ;puJt87HuGI7|kExw8?VSXBRzUmp-aOf8<v3}-Dg@^$aQv=GRhNX%g)}fY z_GFSL?AikK3HwE9j>eX`P^J7PxdNY`8(S^qS6I2rowY0T`r}rR&9)Djn8(`BLW*-K z`sZY{>-tIbkE~tU;I|nTIrG7(pTxMz_r9o4G?B9aoEyOLd;diHS*_8)_UgG+1kQB< z<JEs@_;?L~VfP`J<Ow@-9*%jAf7HtmjV<GqcA{Ih2;(ERs(x{p)m-h2*Bp!&+2qxm zn8$j&S`_Cp^v@}1*UbUrrTa(5YZRPf!y@NYa2mmxL4%$k*9bii^>~RUa!v#1mVoin z^DEP6V0*QX7K8Jffbq(x2_G*D47(4(Bv07WPQo$I@lTo-jV<Ffpvrb&e8kp3!aG*` zmCm*1it^bj$QGuKhfV#QlN~LRcRJd22ioO#t*KJX(mkeIB{-)oGHK6TYfh?Mv?T0W zQ--`zXlvTy6RZCh&Kh~mCs$-q1MN4Nn8(_uHYj`57{fE5@g8XOyVmG26rU<9#C@1y zk#i<E_kt7a+CEsl#%if`K6iZdhzI^fosmKg>@d9@v1q5g64<*B_WZtEujhiibG!i@ zYA2JNv%qNu$8XKi*GN4Vs7W|ygL8iXM_;oo({~&v?N{f3(*lm)wI<hc=R#)N16BhV z9D6d!6L!r4-232Me1ck|v1Kj{qddzojKZ(PR^Ea~ti)eAe%1tAWV6hmiFvI3tYp5+ zxg7mmigx`0?eg<8-9O@It>7dX7C8&SX$NNp4SIsCU3$F4f5yNNP2`*l&O_i#)_=0l zUTUIga?S(ikKp+EPqej^nuJpZ&cgv5JrBpsII;irTwesvgW&l2PwMrq{|rCyfYnb1 z#*|F*gk4mGXM#AFv8L8&Z1JB|)L}V>H290yD!F0@tEJv~PIm84uF4|YDHZ;IhDqOW zs-s16&qupD(JsHWw8z72!#Qn{NqgownORH2KX>Xt{s{DiUS4MP-Qc`KyTjWLbx;R2 z6rSel)qb9Likp4~{NV!Vd<r`K{9KQt_<21z8=--=$SDV>8=P3zQ}Ocwa6}V1i@|vs zoXPrm3ffIgqUS<zo&m?t&-J{Mb+QZ`Y7)*x;5-|^(d&SGH=`XKY7$NbIIF?&dtR=e z-|O$>Q<HEm2Io0&{O-H;=LrL5jOY*AhnIl!BshNauBp+TceI}m27Qc7@`T-UI<9rl zD89$C(bzKYnv{Qz!GFb8^3YXQ*{zO0?+06Clb3pi6Z2U6b5gOJ{&V=xQnc%3w9C(* zb^nMzmw?k}G?7yYPA@n!XwVa6-PYqJ{@e<VXd>qla9#n&&!4sb$aQ}V9BQIza+ZPf zDmat%=PdLeH3?@qIIjh8^gcxVxdt3+5>6F3ec<@{v%ZdKf2JnktN`aP;Q0BoUVmE6 z7||c}8h0r;FM;Fd&!f%Z{+tX3eT+=<gx!o|`knY5wMJu$KbNBp%Q0B+U$Iqv@h4XK zUF$54|MOcv+(EWo$n#&7NpC*K(IVNGp<QpHU4GY*q%*^rA+TtROxiQQZELP0`kO}X z=Pu(Y*8`ndTOVe%-@VS_vy&GazPyuqsAb&5Jl6BCQQ5A6pH@Tf-=WuU{^{|Q_iTp1 zDKIQ@E(hmba3VcKk@=_nOWspUE5UbI6z2+X-UG+)^E~bE@_A<?IMl@UQqRx983M=8 z-}UvR@r*~T;(MKYu?sif`CD=#g$meVdcs-wjLaO<UJdNM4|{&|La!Uiv+J!9*yFfO zTXkD!BwI`yGB&DUk8NZc?Oh3b9|YLb>s?aqT~@<=&UYb>tlvI|oJgSnc9=ebm~G@S z?fnAw{t;kLuhXrU&a<*xo%^rfFMlZ7&(X(q8yiJuueI1lv3C{h4F}lMpXYZEA7u@} z9-m8B&*_Z%UQ7n;&_)kpwo&ZW!rq4g_VjNrv0mN%PJiBc?zd<1JW^;j_7X84*+!OO ze_joH9|hRczZoT;ixq)G?ZUYRoR0%I`ZvDxduh}poR#2=fa5psa_)5Ay<wd+GuODz z=rz&;XAm5}b-n+=@O3=|2G=e!$rJX#d0>-|f3(REjV<eXZmC<g7we+f8aU<_tGV5o zZ|}ht+2m!Gx#jgb*{wKNV!VEdcKsXe@>?f$|HwL-un>N2SmgW)oHgL&(zqwcI;qD? z*2w~JL=!oyz!?h|FYP}Q>m)eTMAPKdf%6$Se(R+6ds+X6z@R4KTno-xaQxOkJzr&A zOFI|qn&Mms&bk1OUT0*zssM+YM9=l$gaSBveUx>m6C7$1PCYp512}qJm-S^M7}O-3 z8^HNIfTOQRvTo$TPpL^bH-hs;07qXRW!<O;hnj@*Yj8FMaP;+BuN%}PoCa|I1CHOi zq4y63W-f5v={?F#;Cu>>-@4KAn7eM|c06LGgTc8>CV9ec$1&%(%yDXs#+G%X8g*EX zp$qGT*ed+s87sBRS?6CkbI}cCJEg+^w@iBV`HmLJ{SDgnHQMF3A52~3Vd9*&$fUh^ zY!dL@kds#|T6X!|CFd`-AJoEt^wl(!uYg9{EPBFuH}sCsqc>0s(*{h;W4*?;D7(MF zT5vP8#=q*n#_6$?d$Cb)iVcgLMsPL(C)Q^R@{U+0bc!Z&ZUJXga28OwC&*f<eO<pJ zMop|j&aL1ifaA9|>A9C_>aySTc;5z295~YNTGEyY&RO%*u8)qqaD>$d2FHR-@`PPk zj`vb<E@NcZj=~lnO}W7JlM0Np*y>*Ms8#-~GwvO*MK*bTCg!mo_a?=;3jNcBc5MOM ze%ChLKQiva;1n7bIk$teB{(x^&=Vq!myCNlbc!Z&?f@qdoFWf{r^3-|lOA_!VmWet z3(i*H_>H^v=X6t-{if$kGdP=r<2UXdFSz60weP!D4;UN^GRYHm{$jibfpZxnYK_L0 zaZf@WmSd>JIE$^^tDCLN7oBJ3trr&MknNNT|3B5Fw_W6Dk=#4cuI<n+zqP5$!)(Sm zZIMZP@%YlOtWENAp!8EK@~fdQ`;t$r(wCg~74ny#&_W&5kWk_3)&7}%p_^Wdal8vU zcZN<s|J38yJ+j8;*Mbv*2HGO$Zg5h-*^>#L5XrAH{^@X%p;t7K(*n*e;KcgALg(De ztfpS`9k2%%4SGz6owl2DhwSp<V__NUBxL%h6uQ_(W>MEY(DhU3I!%?8LusF$$Gxhb z*+${q3(l_K_+8WWo~PIJF~?K;;C<li1djNFXkjetW&LaJykYuA=%9~~NuIDrFUC6o z$P?dT*=TH;HwDVSYT<uktMl7cR`FjPe>@wu$R;mui4*f!`(v--T#bHiMZ5MyyZro7 z_mBAFbl9miEOPD#XD@L4{85jW_+v3RqKTZ}fwMO_vHGL<PYXEI#P*W&dvMahDQ1Ev zi2vwySNjh&u?jhD;OqmApa1CjT5S4+{jb-A2f#@K$IpLC-VFDj956VhWRfTB)i~xj z%UDxuG`9FpJ?gL=LpA(G+Zy_t^G<AicR>r;PO0$!n@oD@C5{%!eGu*1AMNs6ce9s< zGm~&mTV&Fn`8^_gPk7>rimJtx6^rckcloS|{z^feoB^kQ(%y3JeS5xb`!n@WOO1(n zto^-9*}ewj`3LBo3B7*)uE$fp6A@R5>zrYc(+<v|;KaHwlzY~Ea6}V14}p^nj^912 z-WSSu85+Q$CbpNHKZ0`@IDY#BJ^y6CG6)7W3Fl#O4hP3?zoORzy<f3489g1~9088s zywUfp`KE6<j@k$R1kNGg_|2PX?}g8sDlq69WRfTBw&i%fjdSrCwmBMG=1mXEvm8S% z{7!6byljp&Fy#2*yRbzz%Oq5}<+UH?E_2gYV!R$fyJn$XetxL?NBpo3oN=RxoIite z3^+4r+!JJ-)8i$6*bk0qBBv9aW5MzBL+wA}hskI+HPJLVkAjm2j-MZDe-=M11&5l1 z^B6d@!SVA$y?$#yq$c4!4$d5K{QOYQ_kPp297nyTbb*r#j-Ma4eB}CJ=}miD8=-@~ zK_+>^uEjC^MSO-@qp`&g3zT1l;CI?q>WFhsf6pDAH;_%9Hx!%n=1UzdlK%wSbpqPu zw|;N%Fb8l>TV&FnzNfd>ZRd4?iM|>_nF?r3zT|bQ=%3EL-HJ!QyNX(<W8B0%)^nz6 zh1(YX(9M(3Iv-m7=8PUoxwjhuC&RGFc?z5b;KaIimo0tMO8mrm{y*=bH&Hus=r%Tr z&>qoFd)=r}1bcp;pXxa=viTi&$HcMsGwbayB3r{d(yHIsMwX+!r(y4u0DF2aCz!e% z2kk%4fO9f9em>vxsq6E!9|D78OD1{3Zmh<$Z=B1RvurfB_<ZhV?)X>0Z^Tw8=LGyV zw&O?F!xq`LZ4>iY`%$;z{1W~1EZTJ@+U4g*x_`uv62PxAEOJ(ZQv%Km8uSENd-b@A ze-wZtn#g$$oU_1@IvOQudacvrPE9ON&hy}$9l+7^qrkK!1csi2FMx9fIDX?ES{FX< zqhN3>$RtnL6_?|gIL>8^s5Kf}#yuN#SdO6$<1DsvE_%nRT<<(1NU43JmTad~`2Tq( zee4QHi{$p8UFV@)erw&3V&<-xYpupPZIMZP<{82KMU@o`&s*d?y_A0HMSd6b(O%2v zj(=YB!i`nb!L<CJyLz>MmY95&`4z_TMd-W`I{o}pkE49Qr4^hc!y@M;a4rJJZ{5*; zRrG}Wcc4WRIWL1#0Zy#<WMk+DX|EomUT_wJBmKoP61Gfmjtc(k`c=zq%dA}VncatA zvj2qLT!Uk@Rr;2-qp`)W8dU#xVSL2a>KU(F$>Yv=HDSESCU4xtJl5ltsM1%Ve_lbm zmIaKLUI%2niooeHn#g$-oaNxioTpt0k``^eL=!o$fm0PQUfO?}jRv+?`)D6HmjsMg z&o}OPRpM`&gut--5KQufU3Ddnd5(Y5rf6&#uUyoTvY8kku~l{2Wmev|&N^`9KT6}t zmU22SFzI<$Ia(y|FKE~0XqVqQFydkM;+(d~q`irCV0qQjWuA4QANlprH@xHPR@HaT zdz{yAefnk8K@BY?=CSsx`d_&1sKYq^6*{kh&RExh=8NmC&hH(2FIZoGMSi4EX6$T4 zoMMh??{(N)341dlREp$({X6YxHN}PO-$%Lelz00gRI`%?RJ){&wAT-N7VHUI*OxRs zZ#JM`S%&?m$NUX&t_H_%U1{AU6y_sMU~o*xBv05IYVmvn=Q38b7mY1`I*Rfv$54;) z7F!#xTZO-c9paWO?(Z3;MP#!~;ni+=J^p1TpJlE^CGIqDK)d|LU-yr!EA8N<7#2By z1LsC?V!aN?-?F0)(L~MwIKKvGUuJlMjF(<lHkf{4d$rHM1x`IUe&dxqEquK4!La)f zO!9=?dJT@zR_R;HipG}lYEu1gVSL0^^PUyf$mY&?t;2YcZ8vje<nc<9d=$D4{qr{3 zbqm_%H(t7bWV}ki=`)(hc?X<Z!I3_-HJJY-O<xD}c!?%*2En-v9KZ1j^B?IKv{(D+ z-@$1N7_a)R!pCbIZL<52Oz>I_yN1Weo9J7#D;itID_`~hIL1e8@pGHRZ9?{M9qzHk z*+pdQzLMi2lRj=aS|t5lw5u8I^1BX<dYJt<r!6vRFCP7j&x{r<ywte}h))k9FCW_Y z{rb%5A^W%I_`Q2u0|XTP($%WhfO2Xy;d-#&gU0)y(a)#!7|L%Ybbym;SmX?W(+ZB? zZzX7-lHWj}6wyS^`{3Lkz|lTFj(#A6?bYM+0XX-9BmKoP5@atp{u9@ytUTOPfMNF` znB)mNdlin+R_R-EqOrxNnpOW7V0^T#p6#7$+Qx0(ol7=(jV9)?9<StIx#Lxj{`m*m z)gCZjx_{)}vJ{+tqluhha2^6D)@KxLr=MW!Yy(F$k@F!qe*`Diy}LY*3xPvTY%e(< zf%7mpX-x10S(EfVbM3kF?7A#UO^nI;7@Up(J^FcNo9Pqwzn(KA;QRp`KmVDwv+F;$ zeK0ttWRfTB>TB_tD9&Z9SvDG5{AUQ|S&m@{{vx*WKC`TW6vuzIoBr-xvRP)p#5~si zQ(WhAZb1M16YY8o?ed%Nx_`ufTELlZSmgW*oX5eLL4%$UX}rXLM!^tG<a`27SHO7b z^+)_C6YZrYnkHuyoF~BX`+QKZKiYq&NjRT^^JIV?J-<fHII;ir9R4>rkAmapKcl;a z`%fPj98)sM6L#TscsBs&GS<`@jV=C@f;ue6Fb01STO03v-74S1*@Jv@;wMLu?UV}t zKi#Ca)jL`wcMaP0EZXIFO<V0@w&I+&$fUh^{NN$4X^X1lEeQAhtajwLK_Bfkq=oF? zNxxv97eAy9rX}3q>eYUpd%c@}Bm7|uI$wrPKR?&wIPv)hIOEVjTjYEOPA@pIu9Nb2 zaQeX!P2{Wv=M`{f5bOyuU$mdgd`U*T>rC6oSqILm;P|b#dYzQ{QVI?=(KI<Ba9#sv zACDHEiXOcV==nlTEJx0IaQXuD=+Bw@P2X}HweNin&P(9<&6m1;!{^IJ=%8<qNuIDX ze+?f(p7;#4Mq|r-DNugZ2EP+q>BEbyq726muY@hK$*VUpkF_86D$cLbKVP6-Z=zj( zeyICL{BZh>cvfy$<ZJ-vZ{W<JK~IP@UgC$v;D{!2{sYcH07v_e_+bk;)I`(d{1=?J z!141#?a$(eqhL^zaJ~fRZE*bjFxt9JO~M%m=bZpOdcGH%zU4UTHRUUC-T=qX4^s|u z{cv=XPb>=z`UaWg342-t_U1SjpP|-hZ1KYZlxI1H3izGaO276UtNGxN{Tr;CJ~=p- zY^PNC|HGz!?oEys$^9Db8bZ7L*6nH!vjpd~MJDZ;XHv3m+n>ToKb0YW1o~*NFU!%n z{;Zq#qz<Mvo0!LXzKkoI4e+aPpz~ws6rW~!36iGAQT8V+(_vWTYy@WnoLJZGI#ZWA zb>Dsq&PM_M(0-`v4>`x&V>N=owv$Pou-krvYXZ)tPpCN>Tl`@J<ynql1pO+u5<fV~ zsy@u==O3Sa^PXh0Ov24>dEL*YCZA<)LjQb+cKth`pY^=c{hVxA<a`g#8gOP1><N*^ zD`eV3o!TejF2j500sUN@<MuO6ZG;ZColNqCU5jJ(hx7@{Mq^7q7pQ(~K);Huq$5VG z!6Tjh_7O+iv?tl*c|)<J-{NSI{CKo0gm(GOyO7j1l?HH5TV&Fn`L6saOD2Bh%H1yw zAwT7)kX8NsLsr7kA^Yz${`Jjwzlwtn;z~@+W9<)>jcz-BgK^vhIyXY6-}@Pn=3N&! z>4rtlrr>-V;1Alb<a$SaqKTXYaJ~!R=<7?I(ZKfVG1?5AZ@`gtigqN(bAY~M!u_fU z47(4(wENGnJ8ngvu|HLxMq`U#wW_kI7$32f_+>MGlg}Bi5sa73hOorj+;P$4l}g(t z+>HMD5!#jTn*Vs|{*n1x4$h#_M9z=F*$kW=1g>J4ztP4^G?6n6oF4^nwEuJ%4Q#LW z(apix6db?t%FlPlt8<&VRstAyAA(7qu<Lk?_DbKfY0=m+UPY)QUC@c~5nG9SZ)x?; zb)K`e-2UXbWJ@_6mzwmE+Z`>Ew*}g@CEDe;4s7%=hj30?WYS(d1_bv_6Mt7x?w+Kt zMo=c@c&r7}9<>rq2-$yIZQ059-%c&mk$Z=$S^HK^lbha%vD^|`w}aN5M7)Z{C-hi~ zZ}otaWmx1Sg7Xt_{N9a<<Xef*E1JmJ3Y??>j`nrgvlf9vO_Wd0*5GU(&@R3Al|5@S z$I|p6Iop6U1Dw57zsRBVPqcd{Y7#xu!Py}|kG?lZG;QHHYX937oNd7oKM*a9WsS=? z*_|^?&jy3OK_+>^u4u+wf=2NfmW{@iIa8<nDg}P0ZH>=&{ICwT$R@AX#5~r1nDATI z4{t#~Z-;j6GKu~XKP&*J+h`)^C*b@vfTPDtu1SsHh$eE9z}Yo`qy0zxa0nb~VtdKi z9-Pzwj`nBq!!-08H3?@1IJ<%4=ZAWJ>3eu;63!0b>>i*;&-X^tw;V^krX+)t0*;>_ zt}YJu!_{EWH^?MU*m-y2eHfgJ&roYLw)o+6)L}V>=?g-Z*qR=HmX&*ka}WQQJ6dli z+bI?Pe~L-3xy#WaxjUj=d!t=`Yj>xI*@Sc2B9r#a-`vB!6W-}D3%B%B3-arrZ`zv8 zt;#bUovWTZ`e^E)hCvhaSkIR%m3}MyYA5L2e-h&;^M%|oXkbjv&fpvXPOR&8kEu(Y zx^Gj!*)PB!3eOJrhkh{Fb~4Em_Q>71Cg5E9gj%Dq#UD~phvgXR(63@^`g6;ylv1ak z?}RO~Sthr|EwB5zS#fSd|LlTx9TL#bdfw@NE;1}~ehSXa0FIt_8A_-2iCw|T3h3vJ z=Z5!lHrmRzlgV}qyBo*s59t&3OEk9hbDiq9EcC0`YFl-WRa55NqaN`2KC8$k&l?&| zdi}kQ7RgUVyN*D+{N`Q8J>kshIHxT#Y0o^faP~|^%NF5JT~4e|$tc?ceMRGMTJ4LR zd%Rz@uDX>vsA1H^Jf=U4+;*eYgL3>El@D|kM*8Xxi^i21O#@0>6UKWtwC9*fjJNnr z9(2?j7CF0vb1XQq&QEHpzX0nC;(Hn&+@I%>LW*jyXs5kBU@tE~x4vHG7_IC-J?3fP z%mPQ&J*`3ZDUFN6{d5=%jtQCM2|K41eS&itE3%@o#ZNQubA4q1<0!T=51Vh5UgV5_ zGi`xQUXzJ=%)XOxZC9Mz(LZ~lUB^$Ne`H)YfKz5z<m?5`2>~3vuITX+P2}tiPC)=i zuPZr51KX>8J{_F70ppdpG<>`oz_9xeO!9=CbU%)Hj(_Y=hG=XVuVGcTn&V?^6~6P7 zRbT0RhV|yqZHZ(%#PI*eO#PxZM~md{gLa*acKNL<mWNr6bJ`-4_RMEk$1bhB+^j0@ zx>AY!KIr4;znzyje#Os)se>9iOw42YRmSH}S$!y%fa6#8TDA$(BZY2onV#`Gx4m~@ zy!S<WiqRgq_t14EO^>(uUllkbhDpxPz&RZpzh`;c|C(=ee&ePa9MMEh1~_K~aP)d1 z?*(W49`D_mwvn?RIA?;hgKm&HmUij=HnTdbob~z6Q{OI+P|Z$CfE^z6Af|R6)878D zR}x@P-zOB#yv!<E;n=(EC#SzcPNYz9=m}OC%JJ_$R6cs^V5BlkYc{$P;UDY^rcu`c z&~+Ac&18ZnNI&TN#41ylMcGEi<Ya<#HaLFQ4gGsDjm9_VuX>Ih2+nEX_^sok)$Y1b zy9&=@!QdPqlRROk{Q>V?;9TYgwMJvhx-gFNEXOc}c_X&?d3om*&V1wN=w!1@t%-Te z`6lzI>H(MYTlCLCXjd89C4I{B5+qIckIbWPa54;woP)tx1kMgpS;fN9<0bPb;X(Mn z;$(qyegH@Nqs*fMaHxr9spk-IE(qZ0c_j0r5gcj~&P;I112}qKi$4#6K~2Ir6r9E2 z`1!M5XS6?4lW?-Zxey#bf7a_>g6R|bgI<FV1Lr(&{QNodYS*7vUyFA!z@U$jNuIDb z;+TFXzDKRm*y7K<D9>^Xeehqg#rGvTu5sVhAloSw{{MhU&w1F<BDsg7T}#m}zw2B@ zyUT2Xy+WMxT@5m6&s^t@i}bEWG0KLZZ?O4FYjCCWZ1kL0ZmyyZYG^Vsk2&uWzgT0Z zCq3laY=(ax0iBmZ=V2`92{K>wII>8}FP;7Dll|X(=&3SsI%e9|4tuTUnD%mD?=sjs zbfTntAojHX<$pa3*K)_+^XHXDx;)x|`r&)5Zj@txpK<>1fi5-t$TIEUfLQv1x{idd zYUny5ytsWPy7c@iF`S$~;<tCqF*!$pb9q32>iI77%L0d*Xpo$v!MP%Uqt~C5Z8Ge- z8^EC^;pBqz^8k)s4>Jzj$?9F@tmEr{zuz}@2SoU<&)8rVwKJyfS+G|FdxtW?6Qm#Y zI$mRZgZ`@L*fHR&0LO1#=()~a7vlDN)M@~ObAU|pgq`>Z`UK}PHz+F_Th@hPlo$CM zFu%lB!)0r%hI(hdt$;1ES+3l~Jl6BAq{HRhiT*hj?YbslJaqraJZc3e$*{=D17{^T z*)-@0($9Ka#qY<!5KZLF2FC&?(hqG4NBf!heb%2aua%xT;QTV6U6K601{`W)6R77n zaDElQ(eqIJz6Ts?5>7ris{%NBozebGO~RQAP8~RY{jAr=G2=J%2fYR#56;!#`1$kn zo0UI9Kq(mXF*3;$_6UyYcj9~08jUUf+=22e$IuS{6<f`RVBR$19O+BXySa*NyO8I< zZj(OV>1dJc6VR?3&@R90T=Ad7nb|m}Ei!2@9$#L;XKVa~{lrt|E~r|zc*zB`U_kmR z7v+bcv9@Nu)q9Kc?C{ORJ1?dd>L_~D<#X=IcP|E&-Miph1<-m6wEDd#ug6k;yFC?l z8Vrk^6T!I^oZV>L6J*Y4-;&?nE(b?6kuwjR+X6V+*Q=hGZ@0Gt9BQIza!vxLDS)Hr zp1hyN`qU(xLU3*m;OMoW-1G_iU;E9;;533G<43*(dDhf(hwJMZFPvo+fWa{(lRRN( zKaO`op;5+~oM>$E^=9P{!|)evtD)KPpHbK%+vb^=$J&3AA9MZcZuIkfwCirPE0qO3 zLB?J8kN8h1IQ>QwISasP3Fv1%UgAG(;D{!2iom%ifD_4oLf}vnn?TMf;M^O)(f+Lc zhnj?QDmeEAaP<6YGkwyC{?~K(G;r<$$IpLS?{WQSsOK!J9t@5tndAw3dKcdP$GMC( zwMJu${|uo#%Q3XUU&L0@&tA9E?sJ~0pLp%`L&$bYh5tWl>Nh><Xp!7vw5tv6@>?rw zJ<Kwk(-xVuXP&8Zt(;X^8U7vh3glNn-_TpnSVgTN`|s}U-gwLs>Y#=VCgw5yJnx$| zc6#~~ZaZ4w52r)tW6+tzf}S9LuE#Owqyek>erNAJ_w^65JXPFNW2X{vmuV;ModJ7~ z2iVj8*Y(U(w(enYL_0ZWg3|>~tnbCH&VJr%`JHp^``wAlqdxoVGP(=Vf7H$f(OwDc zJpp@u?-%QNoc{A>tKjz``#1YTk8E<A+cDus>1v$VMzMDm>^&J^Pp>}>rjI%9+E>p8 z=TUI{=GWi@?);+tF)-*$WRfTB!EWqxa4tT^veDQwzjB^({jCaqDz;j-pJ%oH!SUN{ z*dm*}tf$@b+HboQ=N^p5IcV2&XqVr6r@DXQOy9=APNiXyQwq-W0USN9;*a^@h$eCt zg7X46vHGL<Sp(Z`+D^{7;Pimw=Vy9;X#b%m_8~dvf%9SjN6+hg(<khIy>^s=vl<*f z|5@D;?mrn|a7@W0PuLwe<~Yk(Q)@J~_)iV$upC1V{6%bKEN`}Q9|>7}NKhP_wS;WD zkmtWTliv1>qeZe8p<S<{U4H9xI_gMy#tAs5Ei!2@eg}NEvSe}9;)PX<7F@o(YSG0D z%2!mCExl~Xtcm_gM4cAs?Ai<O9{kx^5B58J;2Y|(na{d5w7+Y+_hLNHhu$}#H`aAJ zTk&<@Tma4+0pr>IX!v+;1dE!<On_ct_u`oCkhV~BG`5Uqfog9X`a^7W@7inCJ?`|+ zv9Lupd1<SI`{zFNPdVB(h<5p{2io6@6`yUQEr!M5yc5(vPq_WlaQ`eT1sbWDOzIVO z3y#?iX$$$$*wQ~0s=aOKk8Wiv=c$nWw<PLcJTrrA^1Pwiq$fS^Xp#I2(XRK=E<b-y zelDE30W8`gllJ1_e6!A7x~$6U>@Xth!$y>AgihMc0x$ij#hd3M-qZ*=_VALzWlJwu zw(#QAIg2Y6El*9a&YrnX$%%{4Tefuh((|iQ7v!C=yyUdSOE8U=mt1=2{s+z~S-j-D ziWOyxN|r5JxP0l7{mY4J?8db`@pEhZ#WfN8!I+zJRAy?1V25k*%y)nL4Er<^aLn{u zJM#6oT!cRV9DTk;gi7&d2U6u>mgAhZ$P|0hx0T4tcsgYD*Y#Pwh<69~=hbJwK)Vr4 z#91c2@CBE}auv`u9^?zC6UM|jZIMZP@n}?Lb>@MYc5ugk8p>ro6S6w?c*hz={4+qF z_)~QpHH7iZNxDhjfLOQVVrcv-Kx4OJmd3qqwc?z%$fP}^@gT3pcI1^k>-cE$>X60v zZ}%&EV}ELhq_NMWH}yDNDYFC`zYfq?iaJuBaX!vzi%i-x8ne6_3sJ5L+E_0AIaeb! zXr3Hbn)I9(9j>G=g~o3JG$x>ql+OWY4F9N+OxiOVv%MNOAkTuf<hUEH?B_$)PXReT z;p(rcL3lb&GU>yJbvr7d@w)(xZHhVVc*|<QIc<?idyYoajhU`LHX*MW+J>8+flq`i zeulO1<MYy}L2HxaE|YG(<ZvbZ5@`HBKw|;wNO{ItIHxT#Y0uGUx>0G&LAiElW1Z3- z_9yObzNk;52BvvKiAhg?+2Kn5GHBeS&wq^%d6<JZr!6vR&y2M*)Jo$p%RyV(?YCGJ zFFO17&z3*Gk{ZN*SZvb!5bJg<hsI3<G&XveH8`iOIK;FUO{0ap)zH?Fxy-71DP-*o zL9L&je>gRSX)`CSCcU!P;Yyh*XiNyun2kD8o^dM9X^TwSo6u;lkgh+bqg+3<rMA6e zSuZ<l__ur1T}KU?C&&3FJ?RyPE9onsakBu8Lmp-i&S{HG+MCd5uaK_BKIDa<jcsY| zb^DPT#J-NlP@d;q$k*+-6dHdNps`jllfWs*Is1`J+MCdLFkRBsSjl>?ICG{GG1s0| z1CKsQ4O*KVH<<L2R~@dTUj~go4$zo}I#Ryk;e}Qr&S{HG+MCd5FF&rvB$P{j74x}x zZ>tY6*Pg3ByCIDlgs0;yNq^1ZN?tWIP7Bc3D|Jn!4xG~#nY1^d@sRL->_T4pYauK2 z>$|KW#9Vv6{Mn6ZanK<4bv%gjJa0w5ZpY=&xOsra3J<dg=d@)raXg`MX1K-@<Yo1R ztn!n(tWm_f!2Y$T?S3gWXl-&_W76~ckgv*I0gYP(Xq?VEDvYB(ZIMZP6B-W<*BFO- z1%C-y_S*bccMZ2SD4raq8arc%bvu3zjavn1>{J^2ur4>_oNG9lv^SxV64jh(MP4zq zaUD&3-Ce_}L3HW3$D}v>#o<a`4K!{Yps^Trq<kgp<>H)cIGMDkHJ*RIJ7@Ayt`ypm zf75Fv^*i(Wi%sJ0q6XpVxZI>?{ng=0-j&d}O@PLY9_9$nX^TwS(;74JmVxZU$B<VI zZN>k<e*BG)#m|@)-1YsP)FAeCoM_Sq5$ksR0ve|WXl(H?>u^q6WYS)k#)Djq4ajSN zw$O81T6u3e`^P2c-g-DSXl-)bVbW_}ces*%6*O)epfL}1q<rNK$66UUr!6vRFHGaX zuEs2sYk{_g8_%$c{^nd~K7Z}j!>K`dIxaHlsr?RD@@k=Ry8w-&9%etzX^TwS3)6_F z+A`LI$m@W%{zo3R$_AV{^H%8jmDC{ibv%ypJnuoiZpYQo_>%yQ^&Vyw&S{HG+6&Wo zh^w&%d0o&}wd`H1;w`5iS6zPV;nbkD$#JtuFMq?~O8Pa>m=vHf6Lq9K<7AxE7MZjc zrV%fmNk68dTraex6+dFtyzTVk730sXqz28C<6M)T_@={^^p()KeSpRR53?KRv_&TE zg=sw0)!2i)erRh*yvnlP!EZvq=mopIw2~UczK%ywp64CN*X^*NaYlf~Y7es%=d?v8 z?S*N?3klMX<;WX>Hrj0(bk@h_@$c@W2BvvKok=hHo5Pj-Uqa&!0UA?KN6HU>^@){$ zbJ`-4_QEvcr83c&h;kdDjdeTz?yQf89}ssJH3(0~876%kv2Mq&pfNc><7yAH4d=8) zChdi3T<B`-Kwi?j*i)Q-kJXDf6@p$m_m<76L2Hxaev{rj;BX~<6*TS`ps@^fq&(vS zoYNMWv=^rFTvuZe%4NRi^y3I(?s5B$|Nc&D&^$S=GU>T*Ib2DvgT|c#G)_YuDbF|r z7HyG9dtn;Sb2W}5FMkN1L;mMjYa?PllWIM&?mBAFJULD_=_81BJFbPsodYzsdzg(l zr!6vRFHB>ZtFak*<?n~A++RLmrF`J@<4zC8-9-(eOUK<Nz3y#?D|y#JV@iO=Le!D+ zjI(i0TV&E+n8rn}#$1%Eg|^{Mcd)Yl;p}mD{-$RoHE5n3mzwm9cO0&yUk{DD1Zdpg zVGiM(w#cNtFpYCujU&iwg0}YE9<mCCoqjCY@ZFu%Aog{fVAA^$>vq&b<4*%LHYw)l z+fP}wIHxT#X-{iBQ0;N+kk<iiBSiyN*@w<OSMF=|Y1E*#$#I)WuNri?l70g;?i!#m z2X&-;%YJ8AX*j1XGHEYNquM`apxkO`tK0e$tLh`CAG6NJTvI&ZGA=Ob$$xjal6NCC zrUqyn_Aq;KPFrNsUYJI;f9yxzAhcEP-fY!>?CdG-*y^^!sX^@PIE3;%??%3E$FHGr zw*ZZnVvf&w(W<~XZIMZPVH(x`u?l&k(AM39-)tHQS$o6&JNIPfP=nSc$Bibv^j(K5 z=?&1hdw|At)RFRxr{kQq$fUh6jcWgxjB?Ze8L|d$xXkK7%+D(`cY0wZHE5n3XPfkd z_Z+UI-vo_&1ZeE@FgtNhTV&E+m`1gK>_%Slzntq#AL4Wv-S^5X&ZP#iuj3(<=Xo3Q zbvu3ojcEZID?Q9&oYNMWv=^pP?H@~#m-h)i^SN}XHI8@>*ss3hSJzR4)+WcbCcR+D z;Y#|=(70!S#w65{@{BivMO$RjUYN#1-Ssg6^~y$_eoX$<>BobY?{+RVXr3IWne-51 z-Ht|R+$%t1mxtMcbJ`-4_QEu({bL*Q8lbIp&WM%wZ^s|wj(>h7HHa=9_nP#^_Z_a} z-2#n!2WTuo9VyQ^kLR#OChdi3RQtyQlxu>v#IifAf;G<GEMco#H>U>8lj91Lp8bKt zmGoPoF+D(I9O_7U#-m`-7MZjcrcv!5L&)odw!Q<lvdYJt`|AVVzwK~p&^$SwZqkPk z>vr4*jr#;>Z1phfaZX!g(w^3Mkh&H&BCiM9%C4GgRe$C_r=SMWrQ=SMUW?}%x*bi> zxNm^QeAE$E4et3fan9!yWYS)kMs+RBM!6wqW4VU4&b5&Bs6lu-<}(+brwuz?$-5mI ze-@x|Ofl1NJb-_+MJDZqX;jz3A>?g<w*DD&thRN|I|}#hdh&8=5c@jbi1IuiK)!Cr z9niR6fW~GIvl{2LMJDa>os$LmMS1hinLm5hf|KT*bK=~2C(S=+-bwRjPuzdiqTIBQ zvkrA5MwPhjPkwGC^=O@P+-}l4K6GqI`fs6k{{X$!s3YYWr{kQq$fUjaW04k@5H5Mv z@sM0F`?y)ho_@}(!ntt?sWtc)R%TAYtmDopESNQK-t4@%gncI3mI;3DdZ%q05c4yh z<~Q!0OYK^R9M_rjqK_OslHQEA9T?EI6x5OOj1zE9TV&Fn<1goBo^J>DI*^ERg`e{` zCHt&|FP!f)#qYY{X=>0sInFTYnIAh`Nxu^svjQ}ZdzfuFr!6vRFFyB&{U6@9QTqPa zg4wg?opTBXXCLa3d;1PBE6}Eq?1!z?4NlvBddvNHP`l{X@idb@hFG`%F0}2CfVOoi zX3_x<TNch~i%i;!PmR*HDB9~$rvjQYo7PyV|8cY*UVP%6)TTAdagRyw9dYbQ`rXhz zGeCO->PY$2+fTJ}aZX!g(%zKEC2#KhqSJpkF8Scsp-r@z^IxZJr~UQrE2v#`=(xqC zTmN+QNL~xtc4$D`3Q$MNGfu%dZIMZP@u^Y9C5rYm)USi)s`pn}IbS;OINg)~%{A0U zzBiPZ^wfVj_9XuvXg@MQ`>2OGh;!N^llJ&t&P=s`A4Xa&G%-JG+|@?gVpqrGD97_| z<ZJ!+LfcUR+APKF1E&h-)J7)l#czu5P9HLJVlLJots0sVyVh74Upd#Mq-}q>2W@Lj za@=Uri$8IAl71hw9UY)86?LRM<LNl3Ei!43{dTarW+o%Q3YwZfd(=w*+SzA5w)#i= z(6;8tai&S%fLQBqg|^%PZQUMbJI-l~Oxk0=9dh776aChSv?^#S-)+Q7|Hk=#U(@^R zN@-j4=(x|MH;g(w$-5ugW(8;~Mja{7I3MS<MJDZe`>hc970|@8sT-Z=7j<n9m(VuT zyrJBrXMF1LB>#8Nc3gnA4T@R#{zujb&S{HG+Kb1ckL~0{zl|ZS5}GP*Ut^_x>+E^2 z&fd5UZHrwUCz$kJ#9IIFp)Ef^TZ4yLi*wo{llG_$+sFxRbx5m*rounHZe@Ju+#eo( z(VwoRZLLX;TTFV{za5^Ww?W(70BsqlBjp*V;GDL|q&;fGRG83~hWrL-V%fa!ojvY% z<ClL*+f4I@97$i}@Ff2MXgfYYTd&kbrD@aGSY0@$Ei!43+VBWvLfdMjwLnwm(xp~a z+<J@e&mMEr+MD8FTkPt15aoH^jC`&CL1-%s&{pPQ7U7(>Y$lGq{#JstZfF|*PnT60 zzuta!a>VsBx20{ZNsg;bdiEIdRhd6P+sOgi;#fz85bDzwnY8Eiw{fI(LsQ0yzp*Me zS#Q7F@!`CAx7)TAM-HbO{s3aFza84<2WV^dXsgFLZIMZPUVm#u+G=R3NNTpKHeGMO zzuNQEf;QR~JvweT>6M>3Jjr_q+D;45mW?`6KCk>PD;?*wMJDZeuUVPM?|`P9H#4l- zg!T4!QTu*fK0@2V(Q&>>FI?;JB=3*Vc6NZaWYm%JWrxhNdcdMBGHEY<_7C?dC))QW z3r?C-blR->v*QwQV-j{>;@ob{owuN9Rzbn6qPZu{b2iABR(9wEcO%+0{@Vksj?J9* zy;6G6Ez~bsbewL|GuJtqB=2Fg@0@`4jeD4_IHxT#X)k*F@@LJ@n_BzY!Oi&5daLBU zqpV@X+d=RVN1wJ6^^0~LPc!M$LXIZM>p=TT1KQW`VOlt+Ei!2@{>Z70U;Zicjtd{R zdhm*Wyxwj@;xuQ@99i-2KTx-5*6}dP^L!Zjy6t~LyA}qtt4%R8)_-J`;GDL|q`ml~ zqqghx1x2$@jOLZ6&?}EAfY-YB%VprzpgmbTJZxodzTW=(W&8D<H$vUIJ#yS-(!19? zS|t4uwCmh}c3G$+<r!z;oVLiMz4%#C+Z8b1=FdL%q<M4Zdd4gV{5G_yWL>>gvc-D) z?^pizn!Gw{*E;05(WEzg?&y*9Kcj8u1+=Xgb)-Dw={Tn?GHEX!KPD3SImbyw`LpLo z8#0sWj#o0cy=cqG`aP|hE!W$Bm*+>nSn~&J*7oJN+@$Az;pmX`PPC~kpiR?IN6N=N zve+5{i?+z5J$~OKZ1Fo~-U;(gI&B{7$a*)1a=p-5bJoFDO`_vpTYM2Jqn-)2I!HF@ zA;h{(k3#RF0KHuvW+TpNi%i=4!Lu>-h)MJ|quc;=Qc~Sk>+SE;TrlI*v#CePoH*<? z>8%?a8<O!D^qwD}w*qyfJmWl^(-xVu7mpW0!}>Su!HnC-1*kUyt$m5NSWR26x4%=m z?{#n9L`|A6$2BHB=}X6sq(2VL7X@g}_)j=<94y)*llJ2Ahri(G_{cS3-?)T>XC7k5 z2W8pOOed8Q9~w!Y$AKAw?%shbt<W~kUa8`#JNl`Q+A2-VWBnbtcBQ2i-|^~#{wnB) zTmB&MI>eyA<0aqu+yG9QVUhC$I4c4;`a72LozI;A;yr!Ec@msU!I|!u4*Os9=<npq zcRnp}sEHM*=P7V51IO<>pZYtf@}18<aHvT*-QZLQaP)U#D}LmBx0>~-NjOh~b9q3! z^zY5&n6_{nwNE|+&T?=j{D1~bkl%(Vn&HevNiPS3zCk8=!fyTw&l_+qKEv|S*z#Sv zE|eE;#`N`;*lH=+%t}pm{O}ssBAeyLP0VBMhgst;=YEXWvuM{fXqVr24R!yBAJ%{~ zW;Btr8l05@96es*hdtnkCUTww#|juP?LXp&iD)l1vAyIx56&;a@$*CN&*Fzg;82rr zUI6D;0USNQv>#HFaC*R570@m{-+N5oavb%V@*+4_gX8Ci8+Hlz!w?ws4Km3ScGcIo zf5W->47EmMiy!8q4$Cp*!SBRY^&K}_RlBaY-?_hOle_xKc1nf+UtrSHzj3rk?n`J_ zJ=*2>oz9Sl*^6`9B9r!b4T}67X8X@hP4rnm$__zm!o_!4)v3;Nf^A=(yO^3pPgrcy z`w;7Py$sDa2WW2eFl%s5TXBeKPk&CQ-^;d;*9UD)Pt3)$J?Gl~+mxLyqJ}VS=A_l6 zS8jB;Ql=Lg8v`_EqmGnkoQiYWB9r#QG~!{9_+C27bwXSDJD*sEyF2%Xd+qXZDK%)G z9Os+#q;DOrq`v}<w*+V$@-TaFPFrNsUYJJp%)1YHP0-f%^j%ig9?qU_^sK>BY7qN6 z9z%JacOhT5<5g(9H9%vnhgptu+9H$o!ZfP)7%Guh3vC_$xzb8Wb2OfEbzdnpXl-)b zVA4yzbGVZJ8Z_P(pfL?~q&(w9oYNMWw5K)dchQnit{mEucfQt2*mJ%8Ic(*e%~GgA z^W->7(!Y1OlHLc6O#vEvrLL*efpgj-llHVm{f<Bv@`|C2)e`q|)}o5<{``0xG>Cm2 z528HJTamBZ@fT>kJwRiHhgpPk+OnBA)*7?adkiJWD}%PgiypO-_jdNbkM6qf9@L<< z$#IQIFOU1&((U*wG~N-QF_U#vNX9vBxk;a4y<TSxeZLOn_)OQmu5ga`?~c!XzWQu} zk$3tg_VJUwPPul}O^RP<m7;8E*JoBX%69*Foz-gU$T}hR_*=%_G|BUeSx0O#-T~*2 z8x38E`P=$WnDgflZ>C_nZYH#1YY>+T-F4r7W^1oNT3oJE!K>|i1VL%eR5Xxt=%(>; zU4u>^^1Q<Ile9%*=7|<>odN1ac;2*EVyPqN5=*-N8&E~d7A{%7@Vu%;Wv4NF!j^p! z@L#0+16?JagP}sga{Te>O&rZC**;_&yG`CETgN5v-0g9Ex7J(1oU>fkrt7SxJC3ve zl~y@EDt+dyHm>Zm%uDDy?h6_7-iGlOCf+JSK9cOfy6v#reCUq$znljhyZE>;VyHw} z$za`=jXlQLs@UhW%X9XtHy=rMVBNF?%(Wxov-p>Nm18$r|BQO<_JaTacsm0)Ewifr zGb<_<DJm(Oq=TZe8?I=mSg140usi51j4-=9Yt+8%&a9v#5X>rDn3S(YMMXL))tIDY zlvGrds8pnAs8my-Qc+P+QQ<Ha75}9C|GxJ*hv&|n_vL+_XV|@;&pW^Oo^#JV=bn4- zIrn+q=Y8j?>I3BW0YLPE_#x$s6bgDrrFY`eQ^IR#@6BO6GmW1@O>Lcq?B~=!&xnG2 z&k<ytAlJPqU!+iwUHte<^)v6kIlLBreNE^$-q+SNz?nqv=hZ*o{R9biAmazIC*_M2 z3VIKH{44b<SHDt!wcd|DDH{)T%7tg$T<3LGeCourMrEUHcRI3PkX~XI$n&TmegN@9 z$`>gV*X#A`VU>M3{|ULBao_0eGhW$!xmR*k_vI<cR^3~(ly|D`k1okpUE{kXTXmh{ z^QvpA|M|N9wp>6zo|`|THO2gO&$?7UtXEC%S<m~`_T=nK_1P8+)3r67-0V6**16}N zPpeKkIAJ!O62^NN8(j93Y$Z2`^Mm#ew$Eb!b%>~v+MDKP@283l^j|j5HqNK?l-c^c zfx(A1Z60iI+^z|^GnZfT0^KjN_>)nyzhm+t*T`2R-dvA23&MVGqs;=f0d<)%W4*O? zpQXOcdM@_YWmA6*eM1&Y{#-g~<4CV@J*DHHP1`p-Ff_P!@S&l>2ZuLp*{olO48|b0 z@%9bd2SaV@8ZdH0C>sw?F1)$E_#2zY!vW)!jfWWL@$i88$bFa^zCY4Wn=i|k<Y(~d zhU9JPoKsT1NTD?A-}y0C@l&7TNZg0NNADivJ(hmzeW9*X%(vL$vG7Z_7W=;GQvH}- zHSx&r%hdMdoJ;j1P3B`dvCwsb#6n;1r&XV+`WMZnGr}|$y6hR*N-QK^pVgYc_PI}% z&pSj^N$1!1we!56DmKtZ*}dIJW+(Ql{H2Z85gPV;-O=fa2P-!>4hK`ljZCvrWnC|R zO7nF+V7y0lT}S%y(cj2-?0=B`53>J3_J7J3DU@`5IK2^8@l&7nPNTliyT^EsrJuGg z()Unoy<wN{|G$=>u&M8<+CzHP^nUp#zEba2+tF{<{x_M_U(?zDt`p>1!`Js;sm}gC zYc~C@Fx~$ydq%c~{V!jh)tbQexlb#;|Gl3oHps*&`@hv*ZYYDjDt~9=b%ch$z3%9A z?f=(5Jh<(Vsi%RdaSxehrOLWq{PgDQdcb&P*Y#D&70&;Weth(g@*VphWdDQge~|s3 z@<j>-*#}l_&s}IItbvHn+qwV!6nzHyl=@j8oAFavHaGVRegBj6b3F|{-;ni6{mF*- z-}!nQ3bI8@mHE3E*%|9W??UZ&Xl3WGCb_EfhrX&lo^h*Un(ZO_@tAgAK4v_No^h$Z zSFf7hpZOETG_@W67R5A^Nqs$?nC3b`J}34)`}e97)BeG1`e$Jp(_HqDY-NoQcZW4k z*nUB;qGuZKr-}_yJ2j@Yh)<1VdY_rCp?|UQI?@(@d)?9L*RBEWe>giGEK<tu1@5_C zF<aCAv2)41YJ1_d<a{r*y5~A%I?#{KugGV_GLU<&Ah8T2mZf}=LP2(DYjE7^4R0B| zM%(qRm+C#buc5D1&zRAkjfb|Boe$ky=XKD>nUSabopW<02Lsu0*~0n;`5i2fcm@)G zQ@%){xL&Vc539`OiO9~lZ}eU@UfH;|OtGTsTw+62AMgD(eU2EdO^<6A<>TPTXI-jq z)T<^P%<p`)UG|(y^<5^D`g%HX&2@sTP2acws`?XE|2MPgk}!>HE?bwa#5H1XkLCi~ zkLy)5u6aLIY>?V1ajjL1Y9zC0ezp%LY`l)N#ou0cbo%7D_Sk%uG-kG9LtL<PmSO_5 zvU_2l<cjWvF4KV?bY7OvSUVtb4J59C#I=+!QYgqC`<gy4RgB`Zh8fwtyKE1r>i5B0 z#jw+fJ^v}aTz7!&hQu)HeAbZiMG6Ibik2!dZ1=PCSR3m>?{VXmowuu!t2%GkP}Rp* z7VG)hXdQYC`w#h;@tjb+TCAK@(|hLkvf{z$3oh0BO(ymAbYht61X+i^N585%G3?*X zrvDPAG0bJVWh*g^I6Fr^#r8TmwL?Ue)ZX-dllN1_2KrC$H?@jKlj9COWHvr8z2_c| z4f(zH==c@JH1;Aro5DDg@;~ww_t<N;Ct-8m2zXn-HrntRF34wkW7d!RCiNMzMT^U( zei<`+{#QC_<4C`8J*CTED>py<mh7J{SzBa^lq!3D__<SkiY{zCVZ5??ed*Fm^^sdI zh4bG0Wm*69H}JgTF<^$;Vh07;w$EjI1|)Wa#BPw-o$^HrCFp(Is?7s~JM#LSm+DJi zmD$(xy4=3Y(&?WqE;s!*SwAW4Pwcx%cHn=Im=0neNK8-pB87r|OJAb+(`){^FSn<@ z@KSw8?dI^hc+b7TAI+X4SfaMpW$@SIq?hwHsIQ0wTw<t4?m|80ixdj>Fn8oT_<LTI z+d~8Q&(?JtgT9#%8<gXTJu_to{sHk1h<`x*lk!Ch1$&B?O6&jmx!+<v=sje-vg`kX z<cj9Hbe%6$?r|TNU4u2rR$VWQ-Sw88+v6|Rvy)N$^&C4xbBiAry-@cM^s4DS>uOYO zPb|JvziKk+98V|5x=xTh>GAdd6o<*NU$=Ptc=6L5>#~PrE3%veu4)})`vtv<=2-8i zk`2;ZHkU|bicIgKY+XOW=D?A*_}lA_PS5ktV{?sg+3ZArT(EKRE!h~#?!N<)E4u$S znhtcM^Bd$Z&SoHa1|&{_<e8K&QYgsISKRbH)N1dZOZ0xD`X_#Y#77XlAn`Hfixdia z4@vLN7wbNXUaj&(zuKB;81HQL{|XU6{y#HFo&aBF81qF6CFs@pU`YFeYocA*Su6BO z1NTF#SaKn;=bNM#KY;iF#19~TNckd#f;~k`l{_)}ZMolKJ?K4cyt3<bj$&Zdb=o6Y z_i@>^wp+4Q*9&8Jy=CY2=u31zDcbLzC!VCa#gDx@YaG?9ruVF?`D)wu3fXEh=^Rfd zPq<EySnqN0iK>$)W|>V-7N&W^WlzgiWXWX<wFa<#4*Q@(M3vNDzus`3_fy3N`bhIc ztC*k1cBC`=qU$ib?%*11(j`b3$KIFfcQ9>_XVTf<r^!EDf1QhXoFC!Ny**$XZMatp zwhQ~Mt@|VOlbRGRE<42+FV1ZEX6dAjBOS-}l%5Yh`yP_F2aA*{vE_={n)Z*KOO|Bg zC>vW2O0H;Z88RK{N9WD*895Ln2ZF?4kQ|uuMG6Jk9$m|Ld}tMy&L?`mMg8MHkk}8R z7bNzle33#y@6gr<AKZBDQ-^FEyT4tZ$?H1p<>L3<pZSrtXJup2bMkJr4NCL}*=NZX z{rp3~+YQN&(7Db^`67ja?CCr7T?W~NJ@em`+cWf1-HU$wQ^Tv>^fkM#ny0o|kC{F5 zrI)=0^4vDa9D#felJZ3g1$%0nFV#EVlI8CUZ_n+SBOBeGj!*RmeQ^x5E&?1(?D<yd z<#}#!fgy8BojFbUB87rIVGdUeZP>m&r_I`OsgB?9+460<jr(Pz&*4!22ZN2|gGQxC zZJmyuXUi7OEMS)*&t6jJ43zRk3I*8{njfy$vFG?eZcmTydAQHcn@`9ijmp`?p65s} z_ou+;8uFPv^=BH!e33%QeD=_A&xY;8_io!XJlMC%K6T612KP7)>5PW0^Ez`|5#D-h zcb(Tf*-f4A9XBewjSmlf?Pe=@i`9u0)Uh??ixdj7MN5?!y8LDN9LIXlJ8ZnNG4!zH zs>aZZlC2sC7ri`R+pW&?X?z-xtgpkev1ETFTXx@{jchKvALr?e=Qfw!JIr;}wS4hq zI*&%V*UzK#w3b;n=VVv6?qAmQo_#c5ZF@T|)pwapx~8Xd9(A1{@!QWO&rqE>@=UX7 zfiRB6*x<4QvX%2FXXX>yx7fa)`>!1$s-*V%`OA6UPZb;JqwE>1k<6@DX8ZWLHeN@! z(d&**kI!xQLR3k|n^7D8trBw%o2_Y&=)GXPvN5Oj9mQkLLbY|>=zM{EMl1$7w}G6W zK-N^s7bz5EW@oF^D`$F}P|3Gp)h+dF$Tgn$H6!i9fXYp&%xoT^oVQv?xfAToE z!jQ8Vb@F)17bz6<o>X5Rb6Um8J&E31)IVn~kTVyEe?iV%DPN>e(A%***V`(_&Qx0y z4dcC4{d2Yg7Z~Dq>i9k7ixdiakE$=f=5H0BcP4tjP5tYq!DfIf4LL7S=PaD^MG6JI z-8zG~pIgQD%Zc8_>YsBD$hipQTm*8~Nckd#g5DmT`}rJ-^<mec*Wy9Zd{LL}S&vyP zd6C%za`pk)Zy@%h{8-lCx56rMXxXcCJLCTG!&c*!jYEedSM=<Y#-R(6tr|-fz9wI% zt<FAaJg7<5*IL;<JsQcD-Ir$~o6GL4xjIj{&1Lrob6s^U&wQnRi#f_)e)f63)-vnn ztnBL2HA7AB*+-{!j;Oy@&v%&&ZQ?SWvybZpiKCv|pQk!!pM_@AZNl{I<FYl`%GrnW z*>UY#Y#-&Cr$a=Q)ZX;$<NZ{zf&SC8PpflGd|pAGf{jz}$F1BE-I2R?Q!31n=5UNL zCgr8_6ZhnXv-@v>%e5eHy6z6xMjK)lxKMb(`f<Oc{zA5BaoN--=gpp%NhfU_={K&Y zbn{jGNXV4=yq;}UV(Ok1Q~m08o-kh7n7X{Hcubw4wmv3&^Gf-QTmy2p136=X?3t7= zQYgrtQeQ>m@s33Acc_2-2Xe*$(F=06OZg&&g5GdHXY%8~Vcxn{=GV9W%v`hQ8fK}j zbs1#8Q+n?d0ern-ry*yPlrK^!*mF#Md8|ER<D6;y6m}(gmrEaKK9I8rh~GiZd?{a~ zP|&+n_pe-UtK4!W(fca(&zTQgV90z>XFgKCNTHzjVx)K1E$f3Ho82SZs<tK?{QPS5 zPkaFRf21Jm55x~CU!+jbt9gH*Ys2scBZdCfuDo;Ay1upd#k4EBPsaT;&S-Pqoask? z=bc&~UwcY;b^q#`U>A9yQCXz6PDl1Nvain&Wz_F7T-$&zQYgss3=ZeUm+O6ZUv3W# zeEtrZpPJn-JDS+jA^n_T!FEH=u+;Hy$`>gV>?vBR#J8dD+;6cS^d2x?+4y!&az)RK zX?&Z%s(Os-m#p6lE*noqB<piqHYSWkvSs)6Y@MZCZ`r-sE!nF3gSmFSW!LiZSLrv# zqceq{8JB4-vu@_RPIl>4(|h*OVYS`0PTz;Le3`E4>6{r|CrBLjGsDYOCsw?|Z0Z!I zXGWJDk*%B=IoDn$=BPfVSJ5-0_fy3Nshx6WY;`_rB(tn1+sC)tcpYhrzrF70^!QA5 zFGQ7eellv~zg1$+IkPqG5xw*7%EnPP=IoVR(U{X`I?#{KJLEHR8pxRn<ZJ`7rc%C0 zp&&bJb@6z0D$#qV`p17DIUGbU$eAkTixdiacS*0`$7vPoy42Q0!+5*Zf42xAxe)9$ zyu&c&ixdiauc$AN8?EBxu|)4G>EX-(a&`joFUZ*`<%<*wdbh60^|p$!OV!py!+2k- z{y95=3k>l)b^M<4MG6JI7b3l_;`5<I@9We*xgF%}1hURR{E+fR3I)A8bOtFJ+ZU>> ziH7m^sDI8rAZH(tvk%C8r+kq@K`)<^4=4t57PD)_&?gOi-dp91BZ)nCNiSy~u-%Ze z4|V*L@<j>-dy1ASacJY~bHBxU(7WGwW#iCU$yJR*^VU|6C4G{u8V~kL*5|hDo<0@H zmfe@LbS7}UW%pK>WUKBE=Gyg^UCVtP`adF3{_?ZWO08wq&1_vS4C__Xd-l;xwe9QI zI87#9)6+ToxK5Bb>bZS|>YRPL%%;`C^z7rZdu1zUAI@hJ+PBz#O0S}4AMdA%4N^Ph z?9=KT6Q5U*r{L4%e%ZBe5%C0De8Y&gi#zqZt=auA#IKdL@)P&V4n#bz1!-W{rERn! zW`PTZ^Q`TodB1G#J(&%6ODFa_>g}X@N|&$h7<zd7#`w3nkSS8C#M7f@XWBnDPZ+Ok zJf*Lq@pSRMc|1qweexIi7UWz9a=rrDFDYN7P>?NJs`%+#WM`}gz4H_+pgop;nt!|g zr&2U`9@F~eCu}+=o4W7IVjAazb6WFzzDLiDnM~@h>BKbG2@;olP2ZzBG3{Qn=?%g( zrn&5ZY(+N2UHKZ@_v=+Org=YAY>?V1F|F19Z6q`64cR(aZ{u~OE&lepqtmtL?;IS~ zj$b$U;KO<r>=76$=^SO$#(%4<=_6)u+9P@|8n5h{9{8@}XQ@SM>$=fdli%3;AbTHV z?}P09lrK^!$X-=nr#^67c-7zg#%w<tKZX5?-VN%X-=P3sVu)VqJR^|uMG6JI+%NTM z>l)nt;I>U$hqr9Y`NQk=T=~0h39my>90+zbyI;OcZ8OPi?jMl;E)l?c3}0+`yJ5^1 zDHQCY_<8B9jdx~7p7Qr_qW3}R<5~y2)e!$v=bA6&ixi6M_4@U&%6c96?%Y3d-{>7R zUfK0}Msh`SRk~j1DxOwdbG?$Sx-J-d)wx~XrO%F|eeZeWe$6d@oOl1F`Yyd{de5`6 zrxk;*Jb0<T++@-@o=)Cyogmki9v8n`b@Imdm`wx1G;g@<sB9%~klQY59b@|$y^7`y z@283lQadGYw8{aEWIAfux_-#U>quMt?R7_|D{u5{*)Z^!ec$}N*@^zRVB`D^*%-?1 zzY)n5-GBY21KsF+ll(=V0Et&1aT_FFrF@Y>3HCmqYj6AgqE^2zKbGiyv-;;A6i9vm zx%USWA5*?ap`dqY>m8eh2J<@a+>Y6@iF&jA&~JR&gubMY@ec{Pz5y9ONFD`azDS`U zTeMV()3X&X8ugFfF5{J5C%Yt9b)6iOtoyj^Tr&=rEjvGR@6i8AiS~@g+D)1ld{G}z z%+jl-_k6cxw%Yb>()Th=CY`70#9G%05-&ZLyis*x?MAcdEy6U`y6mjMEY^|_Mzj{O zy-T#BvDW*kVuMVa5^Gz<%|<eZuvcZXjn@$x{`R_~)ALw+FQm{myeaUf${y-{sQDh+ zZM?F3XvQ0h@1YZse*Cgc{vwuu#9EM80}^XfzDS`UyF+^YH-K90zvXIcqQS@8)jzQf ze6}I6mO8()l=4Li#rKZuZMAogBzlL{Kd~I-a|n>}g3M>i7bz6i>-Fnlm36UkWA2~0 zZ}jdrUfFeVR&qsSYq~DxDPFmc%g!zKyKLF{IdP}{zn<-7`tjKMy_z3<aZYx1zbT8Y zJg2flZHK>CXG4=o=V>~z)pdfzR*xN9R42A>HJct5rm@v!2V^U<#QzDcMQq=%SJBw& z{Zz3*YNy23R&g?qhe&7fFuI>>=Te@2oODDDb2Hkl|EJ5?lJbcB!@b<CZ_asqe~@PO z9mh7>5P!gS=+@7pc`x^z*|SqRSvQV)JE@-1HTczAhBrO*$cl{{HotLD=k#z_8?hi4 z-W2##B~I)e%6%BC!2XlQD;p>J-%>nI%v4*~i_Ts09cNOIJOUC=LGnk+7bz5E`(CR5 zQL-g_w(IiFtY7FCq~q$uQ^M=y#P#p_j3oB_pxFaHOMQXZ17c6g7bz6<9{Fkg{_pP0 zp4xkJdv<KjKMU;tYGzNfv;0D}wJyV2_#x?Ko<XiDK<oj@cPU?_P_XCp59-_~AH7`f zXT2-8r(Hht|C!VG@$R5+W+pb}?~%lwcS<k&4CH@Vf!G0(7gN4Sp<vHLo!cMT{NToI zTQ+ZbczZ<W`^r2wh@Jc1mfJ}apT`NaBaV~SMS%4hlh@Hzmp!a2ka-008^}DSe33#y zwrHuc|K@DX?Tq!Hx7&DS_g`IdMe}sJ|Bg%6eOz|0T$QXpgIso9FC*vL{}(H}2JxHQ zTy|ZIy;lGCHp(M@K6r=LMVR|-`g~Wfnsl%x52@|gTQAk;S!_(#$8^pIt`p=e>v`hs zs&hX00ki2{!g$?dgUi-sE9V2wF#EIzu>H7RMb8J`PZb-acFOsnRZeUqvuJy^Cw|1n z>quM1>UBq_E03<(I>^5(>V)*D=gw1RXHXXX!N!@x*%-?1-JOyvx_3KF2ddHe<MJ0V z4kUMi#5j-`m-0ml1=-8$%kN*bI-eg+^zKpr<N%Oop+Ir~NDfH(B87rp%97DL>%7jk z_&<tE9?oMWvOl5zxgQMj3=+uN2k}G77bz6i>-Fnlm6(1$vNP@*z4H}2pp{)0{gSJ? zE=D9<b#Ae>>iq2L(eLs`d&Fbwk7<7J#d_uT6MEJ3o^#t}#i_+QxAmD!I#1Jyt*#Sf zjd<+Xtva#wN6n_66sED&WzWf0WQqSnnqzFAzeDrcA)-oZuU~68&-<xj1AV05wQ3b7 z8_CqMSLLT{ypGVY-|LP}&tvOjb6;!GBl%v(1~1rHGhW#}bVhPT_t0phAD!=!zlbRy zu@xk?g2dL8FH$JT_I_XSdmnSv)<na6jHrJ;LjXDNgTz*l`&ubqq)^aHDY|#}BzoVg z{)w$1u@z+PgZLrkixi6M_4@U&N^I@;{@g!t-{{?8yt3=!h~%oSiwVj4y{T4tGo4%P zuR1?VR*%<5Z7<W0$JTdie(=Rn#nJY+XR(#*sb011sO$S0CX>$7bYiRP1X&{<JNBwh zZ2f7o>3za9wz}+c*@`Uj|D@I;w(roZXl(U<s@Nd4Q(|kYIGM*oq_fx=-Pf{nDEGA{ z9ZAF7%vv*EKg8IQ^0V>}_qDozAm?$tPP6lS0=ChHvliGcJZ}AXu1V)rO$ry6P4moA zv*!cSNgGExj_WBsAN;kiG>7&@4XP3!YVXK>7wf^!ea0&r9~SK@9v@Ce`qB9d@)_|G zByWJ^4UoK%@<j>-+2bG4GsZt__d!0IjSKoI*;Dj9H=wpzkJ(&(NP1a6AZK-ud;)S- zPx&H+g5HOR)@<ef!N&J$7U~|?-rvk@9QeK5#`U__<o5#hn+?tGam`X&Qxn$5hh+=7 z4a7ze8$o=S@<j>-8?PKtUmwow={uF%b5T0d|3^L3<Wks|*mFR7$%P>IxIpF*WNuTw zNTFa4_y70}KJH~*`0?Bx8l<s5j*alWEc&6z{`p0-2P8Lx#7+=<Qoi?tJw;2Ey>~XU zGuDINx$n%zP<HS2O0H;bPWRp($yVJbCnZ~T{mxXLt-99mTh(>3{Pp^+h$wgXnP9)x z1#@spb}iL?-<saDChKb3t~GhVWYYC9oil;!1c`H=8-8AO&IBJcn?53p*F844Y_Du( zU2|?3(AvWGJ>0kM5K$$y*K?rryq_vI&_~%k*huCw_Nx4njn@$x_IusY>2dDNuDGU- zm$uDHmHj*V!+D&E`^C=F#w)vjdw!(&{+*+?t{0sjmCuN0AaNfg?t-kTlrK^!$evJN zMbG8C6TOGjKi6C!*IXd^2P7}0e33#y?{dZaqH$w}+L~xs3%_dpgXBFBy&&UH`LXON z^;I<H>`3(fn))Zdf#f$3KZE!`<%<*w;~mqr1)nSNokBaKUfY*N<Jhbpo$QBSH+w+x z8%P`gu_xt=6bkkfEmii%vB=I?4|*>fuk8L<@?+Ka$B<;JuJMDCt-4OnOSbA-!*5mB z#m;r(_1RI3^8EHIS{Ka0A?32Ux=yO;J!|r~V(-2Y{cgL-r0Zik`OS5L#3GO12URD( z{j%9~SeWKFmt7)TS=Z#?F0CJIAJVI6e)E2+*dVo2@>{E173U=6Dfo2ib#L~2R(9ok z?c$HNeSPEg{fsdwN8~52eY<`l=W%wX*@>SI*hU*Z7Xudxk6J&T_tW`BwrFwLH0K{N zdp;(ev~i^0xSrB;U-fO<uzCB22Zsj-I?Wi@W!39Kl{hu<lerJ$&e1z+ys~j>?oSnu zQ)eRm==`L7N8AR<V<7njWbdSWkwQUskMtHj!}qGKiH5m3rvACs1<9u%`4r?@H|2{I z3VP@7Egm0FCVGEY{c}zL(F>v%Wc(>#q)^aXJEP~helfdV9Q&(mJkSrxo}w|gUv0A< zvo-pA(o22^$?qWk2bq_YFH$Jz9s9DL#rWIIo<0AX+p}EP{YB&Wg~XoUH+w+xJ4hS^ zu_xt=6bklmZGS}f6S$t<aU!?pl<e{62Nr&PO&CA%y;0erwoa$d<I>Bso8a>d@fUT@ zfhk|4P>|*R3}+zhIsAd#9vWPD*3ETZ8^^v9^pO`Dm09neY|kG^FL4fBWJnyK&bmtZ zB83wC<CPXzC9WKc?2Nld?`7kajVnvuQ$4N>Nw#WiI4Ieo=bv<cpO<Xaz1XhvNY#C_ zUb0o!IP+C?Jzl<NynZUm%YN?qgw`W-zfjM%?a`~I_w0pTYI|W+&;6TBx-O@4?sA<V zvEB3TQPtUBA2*vmB}~s<E_+b65^p#gc4^&W`+2>Jp1ZuCDmF;%lyg_BGe#qsp7&)j z<I^@?N7~|VuRA)u(YfTYy1#JMY{r(jVDHlRXX7awKMqN*=>5U1rUTvR{6qPUd;^k~ zLGmKVxg_O_6biBn_Z7ePx{&BSss70;AomwQ&IcgzJ>`oO3VKJSw`km|sjZ2I@qW(w z2RWC3=mi;n%8zB|{!H<hcP7#MdG${|1v!6!_!-3iDPN>e81EkGEgCO-)z(DAc)wtJ zLCzT<`yNDZ%8zB|E3X%gwI>t3r_?{^36S#y$oN6#J>`oO3gexlvklJ;b3etdd%{>~ zP&9t`%XZpR=<|=Hm-7V3c>*N=gRHldFH$JT7A;lI6SIFVw=>p*-Y(;njR(6VS2Z3S zlWfuZDe0cRBH60@a;b7<(ep&Qx3)^Q>i#$+*{W-t`Kr1ePuw?NABb{+pC>-6^~l^0 z>l}SnubSSo7v`z$*stjG3X@6K<#f&yt`p=u;ra4}>YOJ&V>bP<Fg;JW>=oHcT;a?! zqP>UhOSxy!A)-oZuivk5p7&G52Kq?vS+qJEG&%#&4+UGN-p|SJVMI?f<iyS(8e~V` zp#Qg%-LJ`r_V>@^Kkn}={9wN4xpsm*bTnWaZTNi+aH(*&_2d3Z{fKPQ;<Bl)M$Dcs zN+)d`={K&Ybouc04-am8WYy+}wp@GQ*kq6`QmVwvj{Uj+VjbAJ!+2$5=7i*m#>^v; zesunY{6;PXIYWTtc91hv$`>gVWH<hTp7F8&eeVBL;U?p!uvl%KhU{OefBs(yxYF>I zhOcVC7bz5Eo}T@3$!49%WRIFRW5E9v7b0Y2A|+)kYwoAN~p1-(Nb%Jus1>CH5L z3iH+0X~>>c|C}kn1%|92>YOQ3zDS`2y;~n#_wWN+rS{+kw0XLZ;y&m%U2%Lf@c;)C zTmIU{3bv~S$Ql5Np($UaP|TJG?%J>;v!`cpbIj}dLEWpjv(JvtWaCHXcx3B&v!&U+ zoj$dV`}`ZT6?}mhAhv?on(|{=ezQlmhW}RRreaV3Wqr2rmF%9+-2cw)95|5sbg$V# z4rx@bCU*X<*$F;h0w8vR*qQRZPxEQ`!eIPd&fyso^|Ak#**NsLiQp63&e6R^pZ8_5 zmwsk>X9?~%K4fIinT;TE8pK8r8&keWp_q;MGT6z#@QnS*{Z8hdduR*)Joo3($kwxF z3pu1w=}}v!qwnv`R`3?9V=HxRP5B~)lG+;EIaBvBdA^9V`SR1bo!uYFeY)H1AO<!n zmlHex-s}XKcMv;4>`eLICw9)BH&Gvc@kH?3@Unc4&qVh4Z#r>4X;kWJ>va132eSuU zY<29Rjy)+~q)?FMIWVqYn8%GD%l$)x^ncjQhS;FY{iVtFoR?nWEyz5A*aH%8Q@%){ zU{BFfB@dsB?2PpUy$7=~l+DA-C08{M?~rWOTzW*Z9uvyu!-+_?Y))JJ%emgNIcQ@f zTQ(;gh-Ayg>2r~6+4wnM*D&tqvhl1xk}Vr!Mk3j=@qo2mb?=Veujibj^S)o_ozdQ9 zpRE6=zC)u|P49^tHMQOUJ9_@xWYRr6o$EZ;39{e)JpU!t$<bdnoBmN4pM$W$WzWf0 z;waamz1siSKL3#RdWVQAsl9&P;ymxCiVgHp_S&V9OdWew{>jGc2o3wa?&$R7ddF`W zPZ=}qo0TeYcFC{i`5^8WTQ?f7Y@9tOxuS9QK%^g?|0=(ce?YExKyp3E^-jtcDHLS; ze@&lPz4+$vYIVIcUu{h^`1s${e}@R*9fn-*Q0F|7@<j>-y<_Uj<4&viK9cCYsQ$^n zAlEw}*E=BjH|2{I3VOSLJ=fbRH_TRB6Ak12iu&hz2V7vt`k~JCPRbW46!adC^tQ?? z^+fNujSFm7Um)`ha{fvAB87t9Wry?ew#rFY6TO#AFUWNYh+YuADPN>e(0e%2+bW+8 ztF4I!KTnumkn<;qUJ$)0KbBqe8~J!!<-&`J-mjWokZTDLy&!s1eyn$Yq_<Tb9Z=g? z_TNn}$axY(FNofhAIr|u`PTPQs~mhb(fc2!7sSsXdO`H2{8;b7NN=nB-KVy(>}Asn za-Ij#3!*pW$Fe+U!FN!IFLsaaTD&iMCODti^Pkd7JOS}Ph&>?jB;|_~3hTURsgh^* z{Z{U`SPy!~j8`_#%sx^*&vZ++YObhD*4Js-cz-;SEgQ41MzUq&?y}#GY;JLnCykxM zk!;!ccQ}$Q8^bO}vSs7YBAs)6j>^W8fk?J&JYa2C-MgnB)OSwp{7653p8pr^UG~Xh zUGtCVRnvRoMz7kA{_dsvQIkpc@N~}et`lUx`+4=BRp&f^!EE|3VS1i-*~7Ax^E}ra z?b_qmeo?QY=Xvj^iVadb<vic&Y@VFK=_2?&`n)FoOoESU;(BKgFquOG`hDl@a~CHE z{2%%2NqToG;&ERGrrncmqYa<qgSQHoSzEu}N#_~aqQzy?Yn|mE&usW#>7<P#{l@i_ z?mkHWPe@UFs^pUMW^1YgJLi8Q8%Nn(G9tO6*DU>}1O4c1`+SyTL9SUqu312?SyH}8 zp&&c^lf|F08%y-wr2aW$fIM#k^1KPi^S3Eqq)^aXmtMc0<^LbF*=ID}YHOllypL1= z>qG$i4ev61y<yB3DHQZl4(z$P&ddLQ(9DcH<?r!C?@a0A3<EyfkZUFC_#x$s6pHKh z`t`8NdK^BM`zP)jy@!lfc0FE@T-EisP&uLKbDQa!s!6u$x?t>8=XS?K<MqC1UwiJG zp}ED6i+)evgVw92_nez&sqNuU>-!uglg{yUa-Zu2*-swx{!g)y-1l{hk&hQY&3!I= zNVbyu$j?``j<NlMUPW`C_fyFR=`9=IB{D^(_xH1P{REo>N7~|VuRA(@QckctS?T=H zwpppN2d|i|X`kp_ay%PH**$nraz*#xkm*1_I=?|a<GKqZCxGMxkerb6MG6Jk_CF~8 zoYeV5?>DM{?%#ks`v|gzL7qiR`67ja-hI;R*F>#y!g{qe(J<cG>c39}@IFIw0`;|q zF<+!m&`T*AH%=#dze)X*6F_nTNKOFB2`OKsP+YIquZLCE<L*!8{)ziW?{VXmU5{5K zS9LuuQ>-ld>|MI1h9z5dT`=~lbGvn;o^^`$wdaH<X>Rf3@)MWp2lT4xJ<m1FSKB>b zxK!U|GU*&oCnva0kp1K_?}@6D6K0uBPZp**!DWxjR&oM)YmVj;+pp?XG$(jJRcw&j z((!##9H#>ne41Vlg|q*)tD*QxAZy>fX}rGVGgJ4&)8s3zh0esh4`=P{^Zz#5aGx6F zzHPU)eKfCyx<8xQ@J#7sypDQ1sh-l^Uw1t`G`wl+&|vVy_D;ltTzFI9PnCFc#cWQy z$NnXMn2o1wyg4Yj!tus*pdX#jlJCfWAo&j@|AFMclrK^!$hM!<dFf4G39r%h*>}5c zGJXo@6TS1*Klgt@?#F^$8-YA4p7KQs1--|m*Pk(7^xc`>X4gdP)z(DAc)wNsGjAaI z2xPn<@gn7m6bgEW2Hw`UWqA9h?;DJ0Tf^$P{o#jl+Op5(XY)g*zuC3Z)x^GM%MOlW zV9k(gHR^X8#(a@N!9I%LOWSAt#xX8yk^LQ(jb2CgIqIML(cp6p$<NgBQ_2@96xZwZ z>tU7svgq@<opImjtr@TEei@Zq)%|itvQ^joT;;r~>$X?2e!W+AP2sny>*C;>$LqBy zW_fP^7Oe~BVBRU^alLAK&$DZD)pq@#iDokC`j}2`cby<>(&PF()yeHQn@#P)c->=z z%Z|!cay#db!`cJbenzjNx!wDzVuRF9$?dIjSR<K^Kg#yR0voR*Z5gZA9i84d?-5NN z{k%6}HV0+VAM9Q9$Juzw?&JNEE4q&dOb4pb`F#0~ya$r^K=J@c-b?u+g@Ww7KhbaW zZvIMmwaR;E6TL4`|KvT8ya$r^K=NM77bz6<?v>u6@uN>|O*D-6h3cR93$k}W#tV}7 zQocx`pm)|-eqGTj_MA%eE>i#8djvNalFz8$V;J*A3I)BCqH(KBHf9pp{NAGe$!8$> z3?!d{j6daz6pHKh`t`6%KD!dx8TXCeC4X9N9}G#Z>OMFq*{W;#ykx7c$9Clizg8`~ zrtn+Ub#dV>`X6&qEb@G|Q0sy@xFEZF_3U*`?|H^~w%X46E9G93N!Q18@|o)dS(6^G zpQ}3g?0II>t->^)x$KZ^C7*?ytF?vg2lXnN&%B>1Hc0K1eAX&AHO@iwl<nK}nsxFu z+O><<$>h#l{`ltc`dP-Gl-uM(u3<+{=RBUbr`gc?fNiu{pgOorc-8uOG_PT2e=)P+ zrP9gTa@5;N^_1>@3|Al5epx7!LAFS#62Fd`y=nj0K4HAFd3@uSipQ_TYU{eu`EvP< zJPwk_LGl_%9#8oqg@Wuk_2r+x9GsW+dz0}~IFRUlh5F~dCCGDIAbAwzGrg2AQYh%{ z|8oA!gFjo+?D}=S+L~xs56jd)_gTONhRh>%?kA^wkwQW5g-GwNTh@nuXBt0+kwot+ z)ju%`<h%mncMw0Me33#yFW(Uw*_(YI;^;&+9_TyHD6W3(DdFY!vEw+G^^pBtsJ325 z_B*7P`_v%!u|e)*gWShX`67jaEWhK!cUWGo_Z$Bqw}%FvSNt<i;(McVB(di^rI+&t z*lx&qgF1do`67jaJw;2E{krila=*oT(7WGwW%uh@$rU|sr2BQ=Usm69eUkP0DZ6j> zMzUqs{wc{;U8nfmZ7#c}+P`<azA%cnepY#z))ezMqI1bry=r>TdOoAvw*T+-`}QW2 zuC3{uRa_^?I`n+>?W%KDS!y;d7sh)S8(enY+3c*sd1^xY2iyBZD|%M(eyZ3YGp3wX zTIJqGGRLr2<yAIbM`(=I>yA!O^7XyYDd`+#)W&}+?f<{N&i*%E+5JE7Z;J2#vypzr z+9|)0H$d_=NWKQi*C}75P>|g#z5dx)t9;$3wk8^Ue7pK5KZ5Os<ZJ4D-kS173I)Bh zlrMY_w~9Nb61^+bKlvJ5V8}dD$DWigQYh%%73pmiv%1vQM8kNy)IWI#BwvI09VB0; ze33#y@0@eR<K3}D?@IMgUIxj_AbA-iFQ<HwLP0NQ1b+7~JZGJq$*=7X_kXJx+9TVo z%OHD)^pcmsc0=+qb^Md^MG6Ibik2$-a>n1~cE)<pyUciH_vNtUist2XUmlih)xC95 zvOYg$_s1gTE0-<1#s?%@G%u&?6ra1^vTN$#cKttI%LDY|dAUPtiuqftGv$b0HN9s& z?^fFr|Dv2{GU?iyPF{AMAnVZc&Z|`?FTciYx>K0uWtTlHTe*k8*<rW#54K;_t7u;K zeyZ3YwNvtPs~nr;Qo0C!PwySrwehu^292(jcMa?LUyC)NBm46@`71pC8}YbqfPM6< z0o!Q9^S|J&!e!R>(Y#-<{2wzLR!b-A$Wd=6)l<5Bwsvsq(1r&G^IvI6*CBm0D^+6L zd9yX`6TS2QDH})G7&juhqA{-Dbf6!dYvnU?AjsJR<m>@*_DK06g@SDRKj+sit^U8& zSfY2G`X}dt<YJJs2gtpGlrK^!=pEX+dhl&`Y#JJjXon(OX6rqyX7>-)8=p4x*C(Ci zKaji#;sX%hq<oP=$!u9OG?3T=)9<0|GhH(?ktu&KB(~gbwt(0IVhe~ZDc?K9mZGJ~ zx*ffc`83sm-qXe_yKd(w{#RYMJ(6`FmtA|iBiXWRh4H)IvU5B7Ry`*i?SIdauh-n- z$KHR{_hIy^={@JZS!z3RNzVzJOghKY$&s!TWZ!vgT%$TUve#_7N0{bFmpv_8$&uvo zg<1pHKIh-GPC7(XN$vF<;5_fAiVgHJ<vC&VlaIyG^)-^&fxRmC+ISsZ#_NtwpOic7 z$~7G?ZJU)Ud$9dt^F7#ays~?6Omao{;7FvOv3{3)Moa?99U!p^BzL5IkwQVXTlYWx zY~5=A&Q@C!4Qpz>`sX?k<T+uGH4Jjyn({>o1-)k?y{-0sJ<<E!>Ys6foN++L3o@T6 zU!+jbd+@{hokHC|<~q*KO4s&>`=M1lnL9q&58q?<fY<|K4~RV}U!+j5r)a6NPESU5 z#(IKY#WQGS*XeS}Rb8h$B<nsdyVj0GvSrr`<8-}c=XPYrczv(MCi?MQ@dnK;e%v{s z-=)^8ruVF?F179XFMZBwGU*&oCs(*mkbUN{uwQj@#eHVe{lYX?xa<sFACN1^XT4e< z*uI==h7J)`QhU=};r&SB6(JJmwitluwf{oGjRDSKi)l^>V42`Y*&?DpZt=YAa zlLI~|UvVup@89!1&1XU|_xx|bHrjBX419rbxAo(`NqvTF(c-eHUv`^44@oC&9O*Z% zr}W@~?ZaEPJ%-m(Oa3GGT|92=+-SVAaps)lipH4(k$!Z(Nj@VVg5(L1cnp#cQ@%){ zAiMQ)ex9BEKsK(MjGw}MwRIY@Z&v?YzkuXL5WOJwq<oP=L6+YEBsaZW@Aq8I`h`yM z=U7f`zdh({c0F|{v1dqn$r~W{fY<{PKT^I(p}1bJUk|I~rP_byevA7??>^&|T`#94 zS9QJ2QM~qRiL!H!{Z;4Z;`fc$_eXKZbIT^p5571fyE^_m%Pp*pKD9mZHJ$HGCY`70 z<QCTnvNk-fyis*>%SN;5Ey6Unxa@k_N^T+lUC>&@_I-L4%`M(f6&s{>N^WTtLmSD= zxRR~S%{E>~+Tw4oJ34(*+<lC$Lk^m)*bo=&JZHSJ`>0=WsOUbLuePoio!jIy;v7ia z1&KExaX00Q6biBz)R&*pTJ6D+MDKRf2lBZIh+dHRl=4Li1-(57F4g(1Sgr>w--mgo zLD7A^@P8)zVc7J7#9a`3K=xM37bz6%DO#$;-7}G$u^#l!QCxvmcD?jSuIhT(E!nDb zj;&SaXLRRyeO|P8Jnnw4<_BN&D*qnUtETs?jZ=zY2X30EFEN>Po~9FbT_?!e@VK%? zb>i+;v*}@B8h2gxv}_Icf8@`a<`~=OaCYrb2P&z(er|Q1_fy3N`bf{Ntzzh;SV;#e z*f{A-?`PQTOz*YM(Ae4!zkR&km7UR@9PknOiZlJih{yQ~X7^LVZ}7I!hBH0LnSQ;s zb>E~uL$+vf+0-xV|1Y!Q2c(lWj`SPXQ+n{%X8j<uJ|1x!T!+`MhgD+5%&%v*rv0LK zx$(-zigx|pb<tR{Bhrt~ACk|=Eg-oCB&LGomXt42D98?N&3?+9-?TPz@b}E8$)0b_ zew+FD-0ZiRo!=bwzb-V6D_^JmSM|!~lJ@92DW1o)Bkrdrovl|}XCeDejfH#xE-)k} zQ0IPH$`>h=Y>fIWM(ZOT<H9FQ)X8yNSDc%b>7zZx?c8T}G`p^t**4kEy6j;NK<@j2 z%mv6=OZg&&;(EP)J*={3k4ARJeWQ26cxBh@V#WQcYj&e#-N$9u0`|LX+4<>u$9R3% zVh#Oxe)~bq558EU-<sd2S55C(8;jI-p4P@5lS$`kI{D3Yg8ZJi$F_H<PJY{EHoZ%j z<~Nr;B3sFC<lqj?BeqZIRW!eOKUHjy+9~<1RUB_5(?2uYLqBTcb)+r+_PV3f75mq1 zcx!$$C!HJGH7iy2&{eZD?GwFAAD@k(>>fHKxuSb$tLZ>LI)6g`BJP949FSN868BTS zNTDFRT(Pg{b^V1z?@y|K?&W~QWDva|_N07~LP0M%h5zk9%<X$}<}>J&iO+P`Cysul z-gV!-^%*mpe>T2Dwr3KVAAU-DZxsRLf2V-t29W<3mhwdk#r1mqdRS$>EPi5cXWTb> z2aH#Cz3i7<)%9{#vQ_6C`<a_-^P_sRoS4qf<z2eJ9PJ&CxqCD}_~L-#>+C0GF_*Qm zP;K{o(?q>)GU+@`C+50NkhtkF<;PSf=Ki?Zv{#tMT$f!WTahI%9MM|D_5r<$#$4~G ziVadbCFZt@pN(WrVXw+h+jt$J;cu@yIz5lM*^QiZZfMu6RM|sYzoGdaI%vGId#GJ8 zsOTO#AL(bT@0GuZaUd}lB=&*C+>|d;D99d`UO%_Ax{tG7ZA~=H$NNkl$bB3Ty&!%~ z`LXONowYgZav#U8@j{=pDH?MxCic8vdWpFpF&8A}g2ddEFH$Iv_IlYrJNKLG1kroO zcxBhiT*acQ>!nw+Rp%VLi^kk^eh&Q5c>TQXar*I?JEHl)7xR>Rcj;Brd)CH2wY~Cm zy-X&Zr|HC8*9j6gJ*K={bz<&&%%*+9H0HYOsBA@+ys${~i0x<eDjIXWpDH#;?Ub0? zDt_j166tLHMfY&*+{z7{Nk`Z)H#^@sUZ0)ai^+uT@2LF4y_<s(kMk7lgU<`tMjM`4 z1lxt}*7ni7cQbEJX2S=ilXc^$x0C8Aoxu+d>%x59;DZlu+cfMqaMHC$Kg~*&oN~hK zP5VUeRpXV75qq9mJVq>2Ti1=w56f@l6p)+(65By?O3D{06lBl6P-nX5WasJLZ_E0H zK4155PJQ6E@T$M}jX~c{nb?%SClh-PNH5=w1z%!_J=D3Uk@7_f1-+yCpI+n}&i7-_ z%I%@SoOj()=XL0b1HqnV=f{58PJ0S{{-W6fVh@NtAoiqukwQVXXsNP}W-DGc>L0yb z#w)vyc1f;iu1VL?G09e)bH-71ey-H@`*YEr@?7&F%@4k)>;B<Iy=r>T+BmP6G)rrv z$7IrZnoh29ogmk!9&`4qPOkX{v*{zkG}pN7tZ&Y84f$|HYZ2SKL@SzWyq_vI$iykR zrd51xBy$LRRSw#C9iicGuRA(Di^<^|7oE^3>HK8W#(%5qqrPV}-$#3lS9TxGd}i@| zbTZP<SP#i(#AA?n3=(fZ;&I9sDHLQ!q}Q*pTRq3up|&O(eEh5GpWF@deFKm)HOTi3 zQocx`p!ZD2ME&>+vOF-dBI_6WLdD~2p9QY&3HqAF-Lb@;Uz1+u6T~hMKY-Yk@<j>- zz1XtkBUv73e^qYJ5!vJZ@!t-ZX>uvl)YfVA`RmfV(C`*R;y?7~HsFgC3bN!#KGPsC z9e!?Z4-MQu{lB^<=!@e5d@mD;J%^<i|A6=h#6KYZN%<m$f;~k`mHl+!=G<?w9`v3y zUfKOL?^~+xr#{L0oR{4bdnN1hbE4$>Jr(IKyVmfV>n*!3mi@?h{e;C|`tf}DQLPK+ zU_`m^s$Mm{XHD)<+Y1XO>Ss+RT_4lQhprRkGX{_MzpOg>@K?;H-w?*@9vfVC-ux^d zlCu|U{a|~aXhrj(_fy3NnK30Fw#sddWR794%5U0u9icH+uRA(D%7^yk(xaab2fnrW z{v9=5+5J2B*~RzonMgmr`5pO;d<c>cLE;=pK1}%{g@WuJ>Gk^`t@eJe+L~yXlaHx? zK3@Qd^B{2*<TKxtFH$JzovC>5`?poxIGN}@s{V<)AaNaJyde5hzDS{<cSL%9ysctR zhuWHG81Ki`|MNuvZ#87x)SqV<^F;~;y~DbO<JyaRe0DD&^hpEvL#sG8me}(N>BSEq zegN?Uh#ykENTFa)(NZP9)!TEw#d^?t%y?z@#}&yHz3xi)$5O>^pYyV7e5+)Ae#)-X zLy_LHYYo4--m>dr$B*iJ^cGL)$Mf57Yh8r3sPolXy=vmICU>jt?pt*oWisjdm`;9k zogn$m<M(f=PJTOLHhof<<~NtUB3rq)NDiK@b%5<lxu4b{qDpG7-%E3z_fy3N`beLJ zYL%;^oP>C=FTS@pI2^9u!p%i{-x(TO+uk43@BU}^3!NPB_vIt*FV0$+?=Q~HFwcK` zz&6?tlR?hhJFOr0N$M+Pix!tn{jtOB`LuM>#*u#GdP<M{bnTb+Tt^X`s>G)D=jXnQ zb)dK3cx7YLnB<DarjbZLI{#2UBX@)3ZjcxblDkvBNTDFxt!p?xx3~J;p4n<^qG3)> zs(*3@$h}06oB?tzoAN~p1-)m~m&c}|y*Gz`n_aWk6TP2P|Ey1t+zB#|AZLb@FH$Jz z-Kp!}*_K1+zd9Qa^o_d5>h^eyo|%bF`8!u_orvt`O+Sb~K>QElkCZP`D9F}V>zsW@ zcFlVE^|?J)q~prpe<Zv-?#Hpsx(IL}vF8iY%e6Cjn<0Lp{sO}nMtr>u1$%~HJW=PI z!8P>xm*)1+!2RR7gqYr_EL}9&Kc}RZ`2q0{h<`x*lk!Ch1$&B?D*O0CWM`}gz3sPT zV<@|i*GsPIKHewUs(bOYWPN_h?x#7*+b&yn?e|Ew>N>^euD9%(I=DyQOO0}vpHDuk zHO2hR)#oHT^{VMT>$yv9=W9J5G?{d5P3L^#IziU6=cp5^b3XZu+4M)kcn@QP%kGn{ zoKHAIZPmKO_S1S5J)d|#Rcw&jDd&?``M8nH^2OPn`C}WeBW)S0*BzZcDTmt?csf6{ zZC0x6{qtsP+9!JFzo^>YACX+qz29#-(2vePlh4TEAUPZ)MuOz<lrK^!$j-hkzcy)= z!^aZ6f3E(?rC_@uYnVE@H06sF3VQ3(>-)D=%;{EJ6Aj}%ZF)g+6UaP*=uP>t?A1tb zt9W%h(fdWy1ConC{0uVglppKequf|D)-6-pSoTZmpPUTdX2`gylaoPmvh(#e6#UFR z_H)YdT=&}<J@}9Y?*CTt^JHSrm!%JXgZKf&4<LR>`67jaJw;2EeYtZ<?zdPEdXE^d zY)+n#T-ANK_$Af%)<((t{FL1v2O`<BYy6yKtFBXg?lzZQQ%inIzbh2QRnN(Psx`&@ z9aR3Eqif8X-m{)(sqLXxOw@-=CS6<8$;qx0WIcP%`4iR2$zx{I8DW}}U3Rf-B`0%k zn5i{{?Hjp9?hsKWwb!qYo#*{jv4K9)Yvfk>by6Os0~Ks+aNl6%j`+^OwJYbW{j9zE zAL@)VDQD#??j3Y3&3Rle(9Eu-+GxY~%0S}U5$nf&lllzVqQzxXzZ@}p{#H6^<4C`8 zJ*CTEcW>_5vSA?q*}W-qdOh2!#JBY?%Y7I3jh!RLD;wWtzr1*S8;kU#^B?3h&Kn?k z03;89oI6s!NTDE0@#~dV_e8s8V<wT!$$8TU@;NxjJ_WgVkn&?$f8PqL%+J-x&bWWZ zyHv3XTG{#8D!HQhC!HVkRrPVlPmkA6MSIob@!!kGjAz-hiTZxMYI@HZW0%_YFQ2HN zHyNK}u|t_oJa(NR>&o}yIn{~Be`hxRqcDxfE_+P25|7Clb<GpDU(u^*JobL7*nk7d z#+^nowO3|q=$~x7j<m(!UUzhQ9IO08%5;8c+pJXC3$wl>-?MSQ=<P6G*}ZU7az*#T z&PYEx|5ZLCR)NGSkXQw>rc%C0p}3!letvT~(fe=epKBzLGdoDE0=ZU6`67kldcA%< ztTI0bzq9%LoHJh8`I)c%Uv+*MUsWF;eD`>LhwTme@mTdQ@-coqFS~m5j8RSRxqrJ@ zZBN}kQQvDasjsIKt6V3@y7ImF&#DuvE|^Uhg=wsE*^RQ5SVcTtqPf8K19}yWRo+h( z8>DthtZEf^;`o9*1)oM|$7^RLj*izVouO%HyX!sU^)rkyDHHM&=f<6Oza2Kuj)C)E z8?cQweCGvR2wFdn=DG2r*>goY8LOk-PO7JL4Zmw}XmFTsrN&QDrfZOXnw2X1ecx-Q z`j-CDJ7&DH`@Pmte810DTOSWPugY(n^}%Nuau16-aXRIT6biDZdnW4h?#Vu9n0J5H zFZ2oND0<!*P3-w!=_O8s#Ay(FK;m@D7bz6<@)-=D4e`0hoK?9!G;n+T-deNIsTOxm z_Rs&BJz%@~0kH?fo|G?ADA-f9R9Q#oB0FO}=$)sS3a#uq>XTg2ypgV>y^?hwx4Mo< z=NwyIw(R`Oc<*?9X0)d~=X_1`gD?8^jO}r~YUt3~II4Kj-91rnH<@&vrjv7AC&=FM znDhTsC+GZ++4OZ`nsZ$CtZXIckQX;<j<J1Sm*%rWM3vNDkFC!0eyZ3&AL;qHReWtE zvkQAEU&!X*8j2L`Z$h6ElOLnc5f-n^_k6J1{$T5X@yhO{vyv;im-a{c(K%E8Atr;w zWRRExvaV9TNTDD*q!?KA{5DT*O*G8Q<JCX;8+^7QdZ}|(Px&H+g5F-;3*^~$?r+<9 z;M!Vsds^-7gNZ#)FnhoS>KDWw5PMR-NTFa)(NZP$uD>()TdW7YBgQMcUdAL>b-m11 zJaZqnioNNaW53Imou9++8?W#4y{>*d_C8MYgD+0YuI0+ZHN9tT^r-FP*Xz6ZCX>$7 zbYidT1lc1VbJ|oV_TFSRJyDp(UYG5ct;AmP!+EVmY#-qq(IKKrYHu2Qy`L&J(0>|x zTgA~S@sdtduroUIPd?{z@SjZS3_>Qi`~BnflZ-hj-zdL@^M7{M4_wY$yxIMRfNiwl zJ|K9T@VxcoeoFm^Y|-MfsgEw2Jx`WS+Bnj0Tu<rpLiU~3=<x44ir7>oZj8Kcs$bpC zQ^qSBH`eP6UNmmZQd=JzV||)@#&5lYoV7u|iwAPHP5B~)g6#e`>bErR%Ff#B-<0(W z{i1aES*}$q+Lze#bm`^)lz{Dq*h8Ibf|M^(DCotOZp9eR{wE&H?b#{1+tVt(EmGU8 z$87D)HG4pw>jtq0#GaHN%XVpOTpy7SPYmSt%wC;;p4jR$!J~;i-z>e%7s#`EAohUd z!;~*lDEMdQTXl|nOXi=$kL31@%AS+6o*G`Qo>A*oTkA6Ht!GH@3q%0F&5(6O9e<^K zkwU>9t{XWsFkidx%k7~-(a$c=B=$U0dhrj4e?a^L;-8c+QYhF{v{c#md)DNBi}j%Q zgz?Jm`x(8}_x*Co`kpAeM|VWBW%tt&$@<)uUHcP~t-4O}x$AB9d3d^}&i{<AFQd5a zXPl>MO)-B*b)IQoo1Jl3&qtMyj`!<1HIqr#)^yG|t`p=O>^bczs&mGfV>Znbre_?N zT`pTW<8Tg}tF?#iJM=1g#_@it*dVo2&N!{|cO#i|*sF50jn@$x{`R_~(<kTr?BX(= zAKEr6Rrdbwb<OwwapRTU`^)-@@BOQhe#ZK(@)<D_BvymONRXVL@<j>-*~8N7*9xuT z#<1F&Xqb~{n_h5%7$AB<t~pbFEW7CLTyLwGb1~8T9McOfRHq<%LG-5lSnq!6^|;Y0 zUJa;iEZc5+L2?m@UXWar@?+U0%8f;1-PuI%0`*T$2Fb}F^9+)cQ@%){Fu$Cic$S?r zi=FAi+|j`O&?<fo$#&XP=<~VK%X$Ox1Bf3${E+fR3I*AsrOLi+zc;rt)`Q-D<CWc) zBa$n67Ekx(m}IN&t=Y;qE?ahgbW7Ifw(J_OOSbAd#pkZK?3x-H9j{-p96&#wljmzq zF@HTePae^$ruVGpLu%XmJ$m-bVqv<rrjwIhCrD2AobxTJlarriHa$<6=46*0lda@r z&J72(f3STv*VG*%s-*V%^|bT6pDH%cM|w@&D!)$7qx6v37~OM-uC47MwFaNFb$wvG z-jUrq$U3pVFO;vi*Ki@?alHWBuBF;&!?hyF@7VQQTlY=sGh~YvmrecB|6Q34w@N2% z9O*Z%r}S%gT>7>R4t8c%xQ?uL{l8V>+l=+i<J&Uhm5pzQC08`Q4M+MJ>uvHGc>p9I zf#d;@b4SV-DHQip(d(6qiQX5hf7S`uZirs$T*Ie)kwS63UcVkznV<dN-F$w|7_aR7 z%vFr5IzNoBs*iX6ynZ*<_6GfUJbsaUj33X+t}cB(T+@5b7z@?*>I3?&vB{*qo=!Y= zogmNm_+I=r)rrT8&88*7G#<NbO|}w`$r+0@7uY_kSJ8Ov{Zz3*YNy2GR&l41%*<N0 zzFuPEb)+r+_PV3fC&jAl5-GHYU!+vo3x~|sw14b8Z@jX5Vf}{Ud!b!zT{k*kCZ7?j zKw=e0%m9g1DPN>ed>#8)tkpHrzC`cKO)t1WJ%Z>3xmHQ}L8<<@UawydtISW2_G+U( z(OWlO+4(sxxuUTuogZwe>f`et9Iwxh)|<zwrSdW3*{yrW6MEJ3p8L0B+V>-y^g9D4 zllpo(vC4IV#46v5FIAmb_3dWUD}-sRa@pCsw@j=eo}Siv!uD?NH+P7rlG^L%Bj<TP zRcxS-^o-Oh?o5g=bfAKb(b+Nkbc(Z5{#jLYa?08t+dp34Y4_DbC-&z%<txsP3kUNx z%Vz_yPi+m@MjJj~2f0=rv3}e)sn3utT3j~u%ZS<YYU!knBmKtplrDd**s}GJDdXSB z&#`WMFqq{!L#4%^O8ftz+?R3p=&c*C?East&yRfnpD^Dv8^`fTKW%Q84~frUyCHFs zI`KK>ixdj7=YB+=L;pbbxx=0x&&CD)sO%|v{^?cQtjBEbR!A>rOt9S$d#H29O!*>( zf?npaYjFFpk-}Qwa~eKB;<J&{TXGv|<38JCHayM+6TF<**d<%=8Mwd@8>!>7lrK^! z*jThwSz8A;=Dv*ep!b~d%C4>Xir4O^vTLhfvQ^gs_PgG)^Rwqe<Ml&P%<{a{srkVd z?fQ&$w_Y{9XKmEfcDB~W=_Y$;I(f-;g8WvG$E4S&PG0ITn^p?byyUV6WGi`z+_^;a zi0$X}Dw>zPpDH#;?UcOKD*iT->3(yzHt(?UI?|Ro@w%haqnK?c=&U{bBBjbcnlM|_ z{;_k>P&SUT`)I%9d_A|?M+2q<{pftHd`7$h+YN~~)QLAKU!+iwU849`^n7<V(fc~n z3ocM!AbLU0&?#S}P|$l>=LDW>;QqIr6~b6(;C^VeuZLti?J4xxWA=d917Z(|A5y+Z zp&(ndR9P?Wn{zv3J?QN>UfK0BB02X{+4V9e*{XAn{jRs{{475(Uav)a$K&oQ%@4lV zNB-5hv8MN|jk#)jVTV35HJNmtrW1EvCrI4&xN@iJ#NBSQ=`LX!cU^YAY$fiJ8xFD- zRqyBA+aaP#YOkMpo#*{jv4K9)b8o8{8pTS)gMHDpfS-N267ct(p`o>%`-|iCJ&Z3Y zua}Rw4p{uXIgfJ{%_e>*U>j{XpMlR6?zev2C#kQHEm~YQ^~b2$(<hy@airh4p3*h` zI~)B*+{QOQcK=VaZ(Hum*bmsf$9QF9#{BJh%s6Gfao@!{cz-g|Pn&-EkY_zXK1&4o zE+NQwzEZwOp&+~LNAxV}Ub_zXxolj}56PaQ=f8fn&3eq{?mp>dJ%QXe0=cdS`95^Y z7bz6<4*k+Zec1;yd-nfIZqM@J+@9Lcd{@xd?96{5vF8nD56E+wAohURlk!Ch1$$0N zZ{M$F_SAnTx96<r{<+<W?Y9SeW|~|IJJi-`^!Z)VOAZF{4~RV=^O*8Q3I*A%18?hl zWb5Fy`tZZLkF5T=Myh`zw{MT=8z2AF@H%4p<5(Fwus`$E*6Zk4Z}x%M2lAO7$ofk8 zB83v{d+>p-4Z|Dq`dhD6!@fTDk%>A!<!mwX$=u%gZ&f~d*3IEHVD^wh8kLiYz27an z7(e)(hPN5M)G+3Y6bklo4a|85{*@oh?V*ADug~<6dm5E~+3s}u{2tlCbuh?h{UB!@ zka<t}B87r%(Ng8CGy841ov|MDb{Vg1+}b5MKXa6gTgN0@HO5?tWXr~br8>7%-Md>Q z>+7QIzB(k?s%xD2a=m5OW8cB?`jIIA``PYZtw-j5_!0evtX?&}XD@72+a=lyXPe}q z>74CcC&<~(^ZVVZv%l^!o9-9J@d`U#_KIxfY{&U?M0*e0mwuntc87>6=|1vvjPtyo zDmKtZ*|SVT8SGW5*?1kHVZYZMogSTk9<yueuJ3OiH+CAYY}~jkxuS97Xrv$C49I8X zNsxR5a^3+s@1%T@LP2(DXYuQ+C2DJ;VNM3sKk*xUwjp_&I@ho%U!+jbdp^?JDqbB- z^gd*ILGm$(UJ$)0U!+jbyZ-IPV_m!2nrImB8%-~WUJ$(?{!jU_>}mDo@v2pv+?VLx zXnH~Pf}B4<<~!xbdIyxxi^kYFY8%ULQvaL-K+X{$=LnE<M9LQ_6#RTu_vZO-0p}XK zuDTY7+z+kd_Ws14H%Tw&2#|9G$T<RJ9j1JdLcyM*rOG*??;W|{Vm;{HW4yBQ;H2cL z#)Fx=s_*HJNVe?0+$q_j=ZJJ~9hI!Fi?aLUvSh2SapueQmR*kvKdN(t<t_U0bHsyM zkIelsof#JDo<dFU*$W%h_Qa3rw@pkYU6<22N4QRqbA;!~4XSgFc))CWvoJkJxNL`P z<s1>tI@){KzLR?*9U`iv_NM0u@283l^grbs(c(-H<$lD2ebGH4zc0c)B7ff*8d}?{ zn!m%0FDYB(BkmFPzBA`>T|~2UBLUlJ^9<EN?h&1^e%vRiuaGTTTsHN`akFQebkfF= ze&c#d*ZBD*yu0pRwQhLZrp<5cG(%jERj&(G;^I&}_g~yOdJh<{Y+PLOt~@T*hQAW# zq}e#mMfz#;R{8CfhRY3KWVoaOU!+iw-Manz!Z$*V6#P9VTl{)$zTU&T$r~g%WPHf< z_cqz`3PW-vb!-92ttnrmP>_A_fi({g-~RAJMhgAOzDY#db^oyLN7rr+uVbda**&7! zY8&^rLw1n!!4-xtF?^X}%oiyX^d47Vo(B$^-kHWvp`Pe{MEaN`u)`3)P)C2t7bz6< z_UhhU8q4EYXH5fKP4s@B=>=b-79e`TZ#Tp)=j&}K=;i+0Ox<JStTgnY%#YBo$R78@ ziKo9P__x_ToIPqAI@BLzzu)WuUuAXdp^hI?zDS`UtF_RzY1`m~!&|mJV&u>#_cb|} zVdt6m<aW}=*YQcSgPhT*EZsfX&YiM{bqwBah@I3~$0=W=P_VOTsS<lGM0Un{(A)l_ z*%->kp7oORGg;Z#vrn?_<Fc{hv}CL9<2gES_!=y`7keaIbwBNn^p;)w%$NJB?0Q`O z>-wFtC~y0j>|w1(=DzpG^<7N8YI@IJ*rT>{v==U$Ou8<ob0%}0AlE6Lm$$3V{u(x$ z-Y(=i&I>lU>}lD`nT&JeR;_7lpR-5nw<Bwv+Uw^JxN$#KY@m;_XOKoRJFr*f2W-5K z(6G_#j!sX{E%(AuNynT~8~?2mI~M*#9^>L((YxMwWn;%_$rX(q`y&15{2}>`+yioM z0g167=a!T&QYgsw{A7MD*edSKQCkxYK7ObAUnT-bP6W{lk`q(DNTHzjg!<a~;+w;( z)!AcrqPMR887J6fNY0~9?n?P0g@WGYKUF;5%}`qt4dZ>6`p3^;hauyoj{cM{QYh#> zqP~j8${mT`A2z)peg@GC;^&kvQYh%{Qcm~y-YU*cBzk|u^n#o*K=gu)H|2{I3VJ#3 z@XRD<SGy*<wlDp8jaIRHmu$~^%=Ywd>1DlvoH;@40r5l17bz6%DO#$;gQY*6+ZpRY z?~w7z#)E^Bs~Qi^OV)i{c2BpzyZXLdFIit}t<DnZ-r6VGs{7+~q_^xEXTIE5W!K~E z-_-vhvfM>KewO$_tw-j5ROg17x*t%}d-g(?+Mf7XeXrDH(senVvxMseIZJr1e240s zC3cxjKPpVm5-!^=TRBT`-Z`edhwbaRpV1+rN@{O<mhgV6*g*g3S)$dsAkF{uLBY=G zKF_3k8{F)fMCc46LFPR3$#|3U6Y?4Ndph2m^SD-`+0cgrw$bKUs)LJ#hpZp>QR+Kn zix!tn{d3st`Dy8-jU)ZW^^|Td=-j$h50Q6fR=AF=cKyFqVr2jOa^J<hqj#_I%Eri9 z@6WH9W<PK#%ty0voQm|*=DqS6pAmoy4cQmedHyuzixdj7yQFu?=$+wp_8r+hrkjkP zLYLY)4cYgp{{@D(7@`;Y%?<b>g@WuA^)>fZUkR^ernlMsnq!IH_nThuR`ms<7i7FC zU!+jbyLDe4*U$ZOUl`9!<EOAxZJmbfKGO>_UJ$(?<4yS@g@P=_^NIftoo4rI4kdbj z#`J=G&l^N9h~AVhQYfz1>(|37`=ItSxqsrmgRhKNb|0LUoL>)@-3N1&kE*Wa9?4c+ zkGm!7b6a*z;Ww8pyDqLA(eD&SaoltEh}H#j(ED?`hSsa5_ncvOs_lVa&{@`G()BT& zob5V6J}34#{chFC+3zu%epVQ-du(vo)3P;O|I42jv<I+#&ZyQ{hZ?D*_If^Yp7&G5 z2Kp$QlN!nFz+RP~v++7Y!+x(jI(<?evy1<9ytHjrs_ftP4>aGu{l+W1f5#-}XV6yr zcO=r!SU)JAwHrR)kT?gO^GM1UDHLS8f4=zMpRKkg8s=ob`d=UdNL&Ze3ld*bzDS{< z_qh5h8aL{R-d`}iAbAW#FGwCs`67ja-d^2@_qfq2=3Gtme#rEKj2A>N$aqt}NTHy2 zL~(@YhPf8D^WwFA>GrgWV|!$K)?>COK5X`Y<Tns|K<r8Rv8=yug;n-P$Nt>TxPSbx z!+2%)#}Ua@-5(Q@Et=obHNIGJzv?>OC|RG|vTF^$xop{WvFu~IhOu}`Kc3%yUh9H6 zSfbCL_UTpAd)8!^+MfAkedohuXcL#|<Tuv|lHWXjkE%|7`+(VWK$zw?mpvj|$#3M~ zliCB=KA~69{O0{su>n7%`K?v1nv|31Kn0&B*Q43BmtTxdx)RIU&pA3?UzlB6hCcky zLHX)Qs+@{=e7*>O|8E9tqYd9v2VWpuZf!mHr*n*K(c-eHUzQ)pZ1_#-q>Ur}#`ToG zYV)SyO&f*>*FCa*c<?RjHa<K&u;p!=JA*l{D^yziDI2S<PCTW4(QHn;M(@I3%*InT zRvng{e-_vOQ`dj~pk_MIkIvtb?|42DY&T@zQ0Mu<lrK^!$PR72YjFGa4R0KbXp26Q z+cN6oF@6dc6I(uJwt##G1jH5)TT;IFhb^b2*W=gxxxX9MX0z+m0kw@~kE(y>5@Zd7 zJgW+#Kjn)Q3VI*7W6QP&2ep~DuNd00eQ>~7!M9_-r~hsLaF&A?|8Axenffp3GjFX0 zUi;0KnJ$>%9JO^4vLBaCJZA|$+Yno+e^Ud#NTCE<*A70gWy^5qL&JmHeAUN%zC**g zfzLB`|3+>vZQR}-vnP(7-UoO*vG)^ZFZf*XLF@&wH|2{I3icK)RrcZV!Q8L09`qhE zUfF$kL2_01;X>s@mo2+*YLczG_D3b_b6a*T;y0HqyDs*9LjSuriiLh=_-(BV=3wAg z^h}~&HN9s|&Qjashqa$fCS4!XIWxFU@R`!*`Qo=!XI~yMn?5Ow*F844>;>7%nSpc7 zRqX+6U-(h2u?`VcQhPlwI?wy5Vgr4Y&5ey@_F%8d@7j1Bp<%z*9i84dpJo@w>9~<; zR;ujd<%gQ@<6+~K-NzRt=bsa|%BP1T{fzYw<U6j3zy*fn5b95Fz!xbLWCwmV*V`%v zEK*w&4RiA;(+l!EK8Riry(vGIJ*&Qo#*h7p-cPH4<_#owg2Z<a{V89hP#Eu!@{Pxj zR<UQE+L~w>?+Nu!9t6pQAbLUaO3D{06!h|4Ouoa)wXvOFukBB_r&T;VnAr0fvj-&4 zf!G6LPs$f56znNls_c*Tzn=Ro)`Q*=<CWbXW0I@7KV~b2yKLDt-Ywax>$EOepWCu) z4Zpc;*>!Q|*m(Vb#Z~(8Ja=5{f;s5XIqQgCHN9s|_N(o&-_~cgCX=p@>Et=r36keL zj{lzO<hkEBn?5T{^PJ0$$yV|lx%j;H0JhKO8n8n|mDJue&v`#pY@q)%&$Y@~jdK${ zWw!b?a^rUGjme$4{Ndl#?*eDnz!}m0eqKK0nt8@=<@=BGH6;5^bsKFKs1EXsNzM9k zpQXM;wrFwL)L&c8o<EjO+Bnj0Tu<qp4{X^s+~|VY<d82?s>HDNBe@S_9oXA%ys|Nj ze*C=MD#wpR`qBAk@*UUAV7no?jyl(=DPN>ekS$uO_^DfQqf!6p-DSMT(oY9}Z@j)c zTK^vV{?yi9_wP*959?KvedOfjYJ2SCx-V!lslTQZ`&=i;-1++c6V-`*V`kHz3)9%= zvZrJ#v5)vXrZs`>vpy!DcZjHx+Uxt+dEQSI8|b6#UT!FZy(*_|ypGVY-|LP}Z?OOE z)32%HMy6S*vaZ{YHec8M#;dZf{T$MA|3~`q(HZ%UGd{S$ko`}cvv$fCDU@`5IK2^8 z@l&_<PNTliyUTcwrJqjzzV^SZH|+BL|7BZy-Jj4N(yJyOzc;d6ZTp__)%rn`N&PjQ z{qH(K_P?+1FRIS||B~7C7s7P^yX-018uq_@Ii@v%?Xx~veE)ktRcw%nQ}=(1z1(2W z(oNXse(q_|ro92JGYFdO{^R5I<%~Nie=Xl}=D8g4xc^BryZ_ln8?M(tzKhduZ9P_| zbB=7$g6y`z4coVDzHOt+KwI%0>wC9tdE>SXZ)v|{)6n4d_C-6Ez5JH-cWrub+m`KH z9vW_6*Y&#X>+jvPSsw#zU;oxu-1d^r^_w<7IP~zq;QB`Wbsf`ZSb8nd>mN0aH=N4O zQmzx^`>s4MyzI<#-gT33_uo9{U4r2Iftg>OBsZddoVRY}>b_O0SN7b$HVg#vr1?tt z?V*9Snfs~n`h@l6bnxG0BiEvP>>e~Ue&YvRs(aLeHrntRF34xvv#jlnnwNFmeO;^X zU%Rq%-I~?+-_g@~=lv_z+;x`*E86StUbS{*mz1h7U%ob5%d{`qvE(I7LJ88D{2}?_ zWHeS|&A6hmu|7w#F$XgD=y@~n`<WkT^D@;zo_oK1gZ(h$xXw88J@+2W_hHOa$J(`O zZQp(O_pV)Yd(X<d?qAh4*-_W`Q&U+S_R`p4^waz4@%n|xCnAON|IA+}GT&rG+0UEd z4BKdfzd-yo-`d`&bu;G=6l-N0{<1l0;;$7wD?3-;fA=aiRJp!?ye;ln8oMLNU6w!Q z**LS_vcLah{x}`+un%rM!#3LB4-kJWx3)LRAMKx#KJ|$|Yz~_EBU=N-{NZi!$FeE@ z*mq*QzR1QYwb#nm%pd0?Ua(IsMzK@VKpXr4;*TC{d!ziZ?9+PoOnu@Hn}a6)xO?5o zwfA?eyhG8oON~{ozeeKr@{28#C7EcDUH+Nz`m$`CM$O>=%r93X9(KY#lwlif_&y8B zcb03`_D1=o`-J{qqWZ)yHWy9&(%aLy`kG5x_{7@E9kxo`9YOA#{LyRUl-g_M>*kNy zvdM|q$NQrhw$TQEfcRtB`ngg5==+SGhf<&T!{%VBKkn*$?V7dsuj%VvxmL|WX}U(D zw(J@!*JSFS)o-;%<F)Q)+@!MtIcT2jaT>Pq{&<FMw80l3zNlM2H_8|5Kdb+{pg!@1 z`M;SjR<BvTQmwADS291)E_FlbbI~7;*N399hR*coaps41+2S<p;{8~LZM4A;Ab!|m z{oE)&4E>?5H`FJ7FyA-xLwD!eu6sMz7V?F+&HNFLCsLroS~?|v3`b)Q4E>pD{#YWL zoQ8e8pUAL{HuwX?AN#DI8|9BZC-vPM^@%@h4x0I6P4CLJojR!Ax$eGoeJk&hfJ&>q zGFc{bPdJQZ;z54v$?<wU@`15tJl_1%D;u4Lz2W`m0=Cfx|A6@Cu=R7J{4**&%nAOn zIcesfb!+bEE4p61ZRU_~Cz6Cwg}�PM;t6I5Tqi`vmhxEgO5FVIObieLnLCZSV(( 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%0A{vwydse#1O`IDps~<><3qAZV|gvYH^>1^~f(x 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%0Dk|Q?hY$zcDc2VQ%^G2ZC+NV+%~| z73xb8qxpXJS?8S_&3NnQe$`irU*D%M40b!7uls1vB6t`FU+$AW`OT{LefffTo|c1W zXAE<>^4J0sdxeMVxg;^vN4G<9>`-~>clCXlU)KL~OLDIGx6-9oV;>&zw8oV;-w<J1 z{hi`>dJcZ&YGeAyiOOROOzcH_*m+86ektjc^y<0!3l;~PC3Q=x;K#c*-hh1{%Z{sD z`NSI|Oe<e2e&sp%?eH)s{PB`tqw?4S6MKdFKrHI#v(B7)-qgyo&z*W+K~YLy^PLJG zG_*eN1?M6CKFYUs9U%$lRe#uc1DuSHFL$G_v|9DPUw4V~t8;J;Vwf$;V+%~|an0|s z9qRWs)$J0uvaj41+OBMl^o`dSW&4aAwhPq8^pU%SdFz8`y#!2ri9W-lKS}96-L1Ob zhxM%OZ{`MV-;3t%*`2360S6z?j!RtmZb@*h{7d5anj9QA#xOgT#}=5_E7ZeA@jk8f zJ5|Q4Usp@NM|}BingyF9-cNtvlqcY2oP4>(mAA}|Y+2np@vg|hd$!t`KC(u6Y=MbA zu9?&QT06wCR(fm2ZRf+&!}b&AMf!&IW!XM6hwbe#+r7$vaMJG|1QTD_-&8D*dUf8s zYihx^7;RB~$0NEH{_7`$sgFkM$+TIgp9~M<;L8DLYqRRXwz{u~=UF*;c6yjIkL(N< zD32{Lu~(=E0nR_`th3KP@2rZm&#gRX>Urm#Q(1A|!gIaPds?N}E}m`QyCSIge#H0P zuRr}{_!t*ou5snT{K$sYeN}wV&cU}<ZA>3IQF&~Ei9Pq-*IG}quufQOQo?8#?+q6% z3o5om=jihaE;tH)zAZbR?aHSvh-_N<dhwr{ga5u5X20^-0uy`0J3TIJd@Rd|_YUbT z7f<Y#KNhWx*Z*ezGw?Akz8vq$cS`y`-7UW7=HR<NhPhICY=MbA_}V`GyoEY%r<d}f z@w`fU&Eh%n^LGRje-QC~#gp@&fsfDAjyJjTU}0p#%I^{1^K$U5RU6YsRw|DzFtNw^ zTl;k}P0zP#>C6<b)l<$1_DQnWed6NU7hoTZc$)3XOWzt{TK(6=uQCU}ff#1L^4J0s zd(r0|^X4rRLt77asC?=VqyF9{3BP+ceC@N?H`~74Cw=n$s`q`^AbuC*;MX0)T&_H} zz{FnR@z&qrE@<JI=Vo;I5a$l*mTgr`x4bvlE(zzhd%pHrIQd-dc!Mi%e_Le7%D*no z7v|txqc*0GELR>|U}CRO#)sId-r_n{dJ}#W#dV7$`?fcJeOmz>z=@}NSDtE#aIOAc zajeS0aaRm;oATHK6MO0N{4!!X#Iav>ML*Uaz3G#|MoHpWaN7%ShlAPo<zDHN?^nI= z$2Y|BbvZb8dzkg>KN_@=mn|@{S9qfJefq4q@NE6>MZ%nKm;OHS-8k#iV8c%$-VeX; zg}1}Y=WE9sTzSV$ku59l5$}s~@SdqQrjIOF9$R2ykIx!18K>hrRk{P>S8%uf=V4nk z2EKG#`QPB-W7=_pD=%9VVO#lq;#r-8=k6G0pYqrO6MI|(rPuytgm!2gY*+mb@!NgY zFM`!SjpF(I6R#|ShjGY|u6&oI@5}w-IXwr@4Ibu}`S%6w%44fQ5__XL#|CP*L%jFS z+!?HXJmUY|{#O>kFN3$s^t$q{#gR?Z`KI{K$icr!ZA>3or98I4#NJ5uG&O3|FP;l7 zeRt6LZ_&6|`>X2t@bR(jxYd>SwnjFre53eYnuBkN+L%6aKv>uU6MG}s6YP;*pLkBa z<iTKNU&Qxa-+bNoecX)WXFeIMaeCGFW!Kw0?!I7y^!PoN;1Az>cLs)+nXsrl*epHP zr<K!>UPK(c>Y>9fSKj<Dk#AP<fZ}v*jyRR8jp-vND32{LvBx@p&8#cx8!r!U!3@ov zNz&UVZhf!X8f^Gk6q`3)u(J&gKAs&{x$;R%B3vu~mN?GN!Et*GbEERu0uy`gH?FRp z^`;pi&7#!nUZ({#^V(N>yTy~=RLA!EFMU3!>W@BO?3wh?9(WliU+z&m@*7p}`}S?| zUY>(@M+~!7d2E4+J?<TGlhDqc%T?AUPVKu&g0f#m+&(?MrxV*gCp%u{%G;Mlcviki z+}@sp+a$Fy{k|8L2ji8;7MR$BoBuy{6I9<MPOEFL4JJGhJ)iWmHy;0?wQXq}!$bBJ zJsqr*9_RnZPQCa$aP;drW?a|1@-pH0ett(jyjwm@j5kvLFn4b*_*JyeFqLh>!WNj= z>$&GA!Gi74=M?YR_{*P|UR;*k_?Mtvdhq#5W&7vg64wdyt{k6ze;yRq4`qwD<GMPA z*{(dc3M8?|z0StPi{>t0*w)x4V>TuN)%A#5xr<ZtvPj?feOI<`&t}`*CoEDM(?{+V zCVdB{^`F@*kZ$LbQCzEk9o@_R*o&I4pZ(5E48!Z2_@baedPk_>`7hmY8~m)!q%O+~ zs$6;Mmb6Xkd&U0~;?MK6@l@paFA)Cv1l+iOKKX3F-M#1c2l59uKGrBJ;vd2eQJVet z7X{rnYmcCq5<B9$d473Nvg7%nNH(X;Tj!#4Ac4|P|0PICkD*t412Zr=wg2w?pj>*o zd@H!E`a55xZ{nKFiM`@M`C8Tc{riym?o;YJH^eiV+8nJHzF*NM3~Ygky@o%1AgKIp zbp86!Ejv%fhOf^t<EPz~m%Ke{XF3my!)J1gpP9lRNWe9W(a3D$XYI*_E0XZyaX{x# zjvw%MEZ-jxQ({M4_x=8`VE6B$x%&7s4{Rlt==q8M-lcYwtyaC?AKz1~@5s^L6aPK4 zzng`DEikcH^T?ZnebT|sUH9+$JT|c9C;Gd^%C+wJJU5F&caHup+4+31-P-%W2XUOO zzpGA7?(cXUFny@|d)qtq2gH=v5!Z&pJA;kCkLK39o_cI*LBbkNKlG~|{8;1t{&+;O zzB5OE?+`w1E!7JHTOp>7C%AQc<GW?Uv;U~D?-F*>>SWIVZ1VKM-=I9_A~5ZIWaq7o zs@wSoeGku{ei3y2F?v4vU8}Zk=w5Z;_yQ}n`Kn-p^w@(xG`{YqlqDtGFIIo?v<yE@ z_xtkW-W=mGwM)-pwMRVKZ%yW7c*s^_l_S+LNwTB`=bw5&d+VnmuE$pt7fq_B`wNUy z+-~qxX5VHpmr>mB{M&cN)4}pT>-XzbTk*<B#q9VE>YcuC8{f7luHR5x`JYk}F^rD1 zZ{#02l~xZ#Wt+3awB*=GZ;Avw2BbG(1hI`;jqUrYcjfL=-{KnS6F1^R+*Y2yGpPHI zXx;on?P=@6`Q$gyF`Zdod0^k$SQ+Yj>G|<Is-&P=MFpk1(=jHWa<KxF{y}by`7u&# ze=LEs;mECFf7+PHg>$UiAeMRkx7Kl~=}4~!@P15Vrzgj{)${jEU&jlBxPnP+ZQi$k z@$O*#o@fo7aPqR-u!W6yn&iscf~dXK|3F;6nPZ*X8^i2U9$R2yZ@sH$ty`{_yH})- z2$n5cx^VuYxy`!Ty>Y>uB@(CcTn|6;d`kF!gxVA`4JduJu8Lcvt3#$ln7W0%L9e~? zG20sVL;3JXjx}!2)B2w6_e8O&d~b4$%qFs2aq{y?$5-XK##x^ZarM?X;}o~Mb${kK zNa7JMTkZS{E;&5t`|oe-yD!tez<I0U^{5vwVq+M#c5UAqm33r^RebGQC%tX&OWQHL z{|T}-#;ZYj#wqb3?yKJNY|!;z?mGM>voB|k#Cd01yKD>$^{E>A@wBz8WnVhRU~hMv zSZnAX<jNS&kz)H}1ROh8*_g_OV{6w=&wi6TZeAJ9af`=~G<Lq9W9>>63}(b{i~M_! z;tD3Q%{GsJEbPa;acMS@cCB4hI2cS^5%o{mZ3p&~--hE!;vX-I=daFl9-DtdT)la0 zoZ@y{UyvD-IESQs;QTA?xFnc;*kHi=s>eaXWOiIO5>DT@jc-3uTz{ar@;oew7)D3w zy-J7hDQnFV)A)Svl3wrobH~=~j6_zAF`n6+Dcmq_;!NCD|LxmBRncI$w|>vFch@n- zP1j_$`EFxnsPEOlkEhM|k|WbG26L<PjrmFcAeYDd9VxaymcX&~-Nr;N9GmZbp8Yy^ zT+<oNQH#Sijh!FnnD5<3W%{~N{t;I&{n*;IkYQ(A2YxD>Kh3cYtR6oYq&^V!Tk!`E z>_4+%a^Ht?>(uAD4w&CVT)lO`IK}O@yd*PL#&0;;?EJIym5&MM#}%)iDPH!!C&b3^ z?0nvSOjK5vC06nIy<B?TBZ!&V`A5o0F<xcL+xeWh*Zt+&L1oEc`27EM_Xi(gOvm|U zo8LADhWb<u{dn5^9)Daq#$c~^oS2XF53(V~bEMe*7y-xDa~o5+aBP0}c=jvYah2{j z_;d2#G<JTTZGO8uxNBaT_O<D`#X*<iNnF7swstL&Z9ezO#;<bB=eCK1!EWoP+Yjuo zc>nGBaBiJz^PJD-=MYzKJ{LGnal8GK)3J$j%$A?+ux5V$>|pB&gW>)1>uWv`MLWUw z{(p^p^=;$Z&lK0~imTm&Ackhs=Ka8=sBC5eF1qn~-zvSX5yaN)jHR5Ar`?qFiCY*S z@os+Qnqb{42E*ruSDx{mcE);~U$%K~V`ZrC)zFWp&HLr4bd14X>o_w{=^tcW%#V>` z`(p{5p>^K%T`nA(_v=0TW$u{!jQ%?KbB&!RbIkkV(zLG?PrM^oB@E&UCb6}7zt!Cb zt^7z-ZZZFbZ0wMY;qIXpsEz5*JijH_BV6u_f@$|gZQrm@b)_e3zAV%K)JxKr7o79K zk73s^d|Bek`y~yF`hM~HeGXpTG0aZou>~gfqG#^U%XmI}waUkzB7TqlG3b@#bE~zT zN8O2ipO+nPaODFZjWDhJm*Q9Ox8dW~qc*0$^C^8!raZR5#9p=XHF^=dIeOJOeeyTx z#pk)Y3lsf?cVYNOC~m!^cs4=hM`%6bR~+5_n4;80u3Qj2T@@)`;3@MNtAF!ms%+Nl zReWkRjy6dWli%Hb)SdXO!voT0D_<S?VG2(uCWSd-vgKo$nAOT-3ry_QE8n1(#iZHk zk02&ho|^|1lbN!)K(C^*C?*>vnIC^T{Q15D`E36BvfuGsqk2DXzfw$&%n_637-qfl z*a|Uq%>S~Tb#6rgF(A#xhB$4S^;FP3CAvoX#O7JW*p4(Z-`iYy<;PX;>1-Fb;vC!x zXyc{bYL6{2vBxtW`nt{`ZhKYMCr%v|?+#X;7R~?Tj+^qH(6)zThb0cbPtxcAq`18x z2e&mbZk@_w3ry^VaXaVSA#STxwn?1UPrNs1Jw1xs_2X8*5ZlJbm+M`5>n9>StNXRM z9hHMyrP`Q2vP^kwfr-61w+hv-6{p$z&kq{Pqqx1ge9C*U?c><-OjkbslM$Yk|3=(i zn1fqi40E&c*a8!Kac)~x)+tU4YHkmzUp*Lp$LXJ!-|+!#n_XY-ls@@&s`vTt5Vw*X z+*&=%>Lcz7nv};DnAnRy@3cT=?c#*JiZccSJ*ru-;=E@*fNjd+sl%1mbVYbp|66f8 zHV3!yYGeAyeZs;PnAnRy?^GoH7ICUO_2eM+nuyz%-t_nfu<hg6@g!HiL(=E}J8^q) z4sPpWm|e<a3ry_6O^>Y(&4q52%@(J&Wp4^fDxyAJbk5g%ux)&NxzUxke=5SWx_=k9 z<8pATQ5(}oPE{UTU}7)6hE%D(R-Crow=5_)b1?j#yg650U4v~O$Bye=`NU60cviks z+$QGWwj+kQO?hmAi9O~*#q#ubMD?qzMx27Chl9P6d@j;<@i{-kw%PUNZt0WnQN7Rq z_u_VZ4sPup=E~CBgBInn1t#_)Zt3rbYExO&S%X3SC)enC<Y*1KX3CWJVB6<p$DOXc z{xcDtmH$E9PRzk=lG>O)vRHX+fr-7O|HmwmPU+c$L2K20LD$qMb|;>8>#wlyV}*En zD|h8H*F>16^GETUEPlg1*VleddS6Vtb;80HnAn?L^^>6K+`;hs%x^g74QF8ky|qqq z%-(g+c~1vj(&PB!e|zU&C{IfLj;mkyMqU5y64#T(wcf9A$L=HOg3c2s5Ba~r;lRU> z%by(1s}gWtSQHiZS7!RWMi}@8CU}OO`mFx1MtSp@)^JS1KE`1WNZ(AaS3Jzt_P6~a zD7_$x<NbdqeI?lFwL8f%vD@p~Q|`z3&+_Y(EVj+BwHK!Ss(El>&?XFQfeD^r_urxC zx|BB#*v^J+er=XMdZZfpVYbSfo(s0Vb};-t>RW&F^+zI&1K)@H{+To7m+jg7mUa)2 zvTAYm>&E(cujikS-BW#Gu<CV#;cwNf-*)f4#Llnhn10*f%GZ7_inZzdMg4ZJ{2Oi# z_DxIo+m^>44$6grEildA#)}7o69szDCHGy2jS#;(%>@ogb8EKd)_^#iFAj^1lqYR& z1v{@8@@uMxZ}w^O9}cJ7Yj1}(21{q8eW7lzu;3hGimzd}>li<Ve3333ldx?J&h-4< zt9bafS}%#>Gj8w78nCh5@97htdcWMO`>XuAAd7ADYwx9*er;2GY=Ma#!><3l`d@kD z0FP|g=2uE>&?9xp53{xR>ZgL5S%cwssb6{cL#KlsX=T2byYc}^-{=37Ul+-*;qF=V z#4y(>k1a6Gp3Th-DhtGC-HNAz%F70$=a64EYbADJH1i8-e#CpTS8iD7?G~?U@j8)A zELpsJU!NK8YGFSwTVP_xus7=%`^EvdY}gj>RUXeK`C+yyE`CQa{_^O${<aNw-VJt) zUYK3u$~WB^aWS30$**ZS;$5XSreFW{zXTJN#}=5_E7YQ=8y0%Bq;c+&C5sk^w>8{D zB-RfpwW$`*HAT+`dn9?TuJ+A)FM|)*6W69~&<~StJMg=|8nrGwCBD<e_hcHyQqsCm z>*4#c`Mbk$kAP($S%22nW%g%@IKmlB_!{<h9pi`j0vH^Vu&qCvJbzPH3<hSadDp2y z*BhevbRWI-Jg~v5yeoHnniQWs@~cL+%V-o!N%3j%@clk`+TkSmVDag{Ix{{M;s|Fj z;cM7EI>rz41zK=S!nXKyc>b<eJj_<vlP?H1Toc9TGY|AugAHEE7c=A2>6QDjdq#d; zD%&T~D3;8x((5w)Di$`jz{HMWcj_4X#sRo&*ydM*$8)p%Fk7o%@odoA5Z#OV*e7r6 z0Xs%7%r?97m0yaun9j5EYo`1fZrv<a8`DSb5Eiz;#Gd;<W9D&V^Wvph=khM;ZV=a& zZ<YkjZyXH2%YM_f4?Y4XaCdrkvd!fiG*<VD^JU_E7L8&lX{=84@csDwm%~XKPu8cs z*Qfim^H-h0c45I8O!yl1x^=q8uDtmIEjT7&Tc4JzjnQANc$lr`JO3Dre{&R{lH!lv z3pRR1Ury_1i_eXU&vWwY^|H<P2gOrTd@4PBzYqS~;UxKB@u_P}$7jK^2ZMdWf-{)# zHS7)@<A?bIFE}P)TYPFge@hh)-`1x2QG8x`<<=C~;BEKxiBE%9?#FJQ{JKK6FQic{ znO{>Eru{;tPgvLj6FY|8@D=^fuJXnK-E7$ASE<^dN9vOwW~=3{=YpQM4u;=hzx{99 zo&!75%6zYI<>S8^ak1Lx<=2(+Yq+`G7sFhyJhs5Zo}0^!jZ5FYl(TZn!li9V=j9&h z?i1HdfBJl|ZArAQe)>bd_zs-lv%pD?>5HAx=a_Qeul?fu265KU!yJ&TFJ`x;`(oGR zTZ1NHU<*v}411@Jv2Ppz%!X}!u|fJ~c%S?*TYD!w5^P@<t*bq2Zdn7i>G^V#D^J}M zak08V`E^x}zGzyXiCL*Uw!p-mzpm09i_{-UeNnA;lWvY;v`vyd(gVkSe2#HRk~^K= z)?xHk?dl8mN{{Eyo?7=ZK7PuY#@`Z++jl+H-;`BJ6{XVSL#V~;KWSUM1JqL&&JC)h zhuz6Xyjzh>PTS6XcTnf-KKH)yd>w6addG9Y0_hQ#g1Y-|N><V{bRRo8XqO(JhaL9X zO}F;n9rX`=Yi$_I8(jHbl~XrVum8AyoBBM7$dN^As88nB3g55{2Rrfcl?~@;aFiB! zoJyCC)BjUNxIx2vgAUcfAAGQPA9qWzXL;n;ODT74;UA$zb9AN4Z~L0=pXk`?3*}df z{7Sm6H@_ymJ?)p_V8>!;cCz7^U)8d0y8RcP82Gpis)IlHU{84B%|XjMqUQ!)aqDe^ zD_vXo8wUN=<nrq_=vikSTm3lsb(8$k*PI=Y%&*nLw@Smoj>XXGvf-Ft6J^_UgD<24 zAGbnv@CP64-S3<e?0jc*e{t`Gr;crMZQ*Yi_*Loh9beaZRmWC;nEbjmM}L*Hr~NV< z>{txVPBt9#Yq!UV{_=5)#S8x6n-5L5Mr-Qg&zD?Vse0_d-|XR6iIv~0^Qw-mzDRz( zD@T8I3g55{2Rmlp>ayXOUt2s*^q1k5KKcG&hw9)DzWK2IUD0}VOxcvnI(j01wmXSU z{OZ2@E<MK@jn{{sdBgFQ@{hU>CpixNxAJeucVgi3hs*!>%KsV^W68#Ao$#%y#I?hY z@wB>ZI79xsw&>R{I6Clgcc>2j;DbGL&VxbU`=j;$k9Xbwo8|XKe)TyC27YbccY9F& z;b>fUeD<-^E9D<`9Zqr_`fufmA9YrLg#3S>{GW+pESdie!ndjthl3r9wbf<A8S>w? zMZbLhxWI7B?|E6U15V-(KG^L`rw7|tMg9Nno3DAZ*+`PRrKc@=!N>Oe?y01D%98G3 z%u}Ny<^LV>pYOAbr=)%TE;oi5hZbwv6+4`yy|?YTYCo2aW9zY>4*G<_*aj0k!=|qp z?>6Sahhq}9?YT<5agq9n?qN7vNq*0l-!Bl~&j~YWzn<u~8@r4@e-0kyaFV#0-<v;? z_8VWe3WG7dOPJsxDc^O!o?TVm#yVwiOu{z5C#em3q^{M2f!Uh*@vT8gSM*tM!G+K8 z^_f{yne^D7T=vfGALw>?aIpr=pY{K)dzR8;zw;me(s+LH15tgmljx#XXYIc!zjSOk zFI1fFk}uUL#*)pmj?bmzWH|8g=R8fb;n+N@kZm);KE}tLsXF`wAME}op9qRRANlpE z-VfF8a&2oirZMnq>jjSo71HCGrP^PA?hA$=m&-ldR<}UoZM^(nFaKX{g`P|rZ*?9I z>l2#1$l>T~*bYcG-dgTV#}TC}`GRj?;+J95hxltgqYK9*Y#VQ#UR<gb53{vn{Z{?v zQZ$b07yb4|u#!@j*WT(EDn3Wcue)Wt!U{c^6rbhlJ5(5deqSBqaFTqm`0V*&W_)G~ zgE0*zc!s_1J9=JCc^m84gJTl5#b>?r(Iah9JbYW#>!S12(=WaCxTf!>^&;))ef!q( zpk8{+$9tB&@%4V4e_VIeQ$fd9qIJJx$6=k+Reb9}%wkuz!>fC%;$5OR-7jCbuITtr zuAb8Au=hpBUBb80vTy5ud_4@x{fjMM*V_0xtDm_&X#Hx$_eI<O@*H(OCu_6Ovtjn& zd#vL-MT#q9e8)My-NH8<WE|h;8`rgVrnB#gEkWD*=$Vi;KVI=N#)9dXWL;=#8W)Vy zHCXs`q*X}r9SkLx-!-ma$#n(aRGc}_ATRNBhC75i@iLulUyhFHGh&b{!7Hw#FosEV zGy0A~^E*^Xc-!HPYpZ^n0AH+r!7rZ8i>IV{Yw?QTPYUDZ0KjA5Bd?8vX338<UhZGB z4?r2~crDO;!3gu*KSv(t;>FmBC%eYqoiNtWE!<r<uK(2s{?ELRQ|88rU&e9iy@SE> zP5S)NeNIhmXE`PMF`Wj3l^S=IUr&#{be;V9#Ir%eXP*t9n~ihHHHHjl>w|g*Q*(+K zF|RCER_{xACdG>TI3)a<l(3fe$%f5Y;)(B3i{allx^Z6gP`W)WUZQ^6C@%4FOPzfO z$b{ZZ8$II1S`Q}UV2k5PoEoPsSu*GCYI{ofdF9fD@0h!IUU(xe{K(_R#mg48EuPo7 zU~Wt6+~@{f#=pn&Z1(ATRq&8CX_K(G>9wk7aM<4}dO$uT^^^asNK4F*(7+hJm1e>3 zuDdU&xo<H1?diWx{n2ssL6X_+uKoCjqqv&ROVvlcIr^wMhS{Jzw!k!d7M~{7b&5~f zdnN~~?vMUA=UemVjKeNA7dXi=V|4wUe+g>88SN3TdT(>qJ>r@e2imu24!%tMzbF3Z zQxHqGmTr4(`Z<#}hXW7ePP2&)=kyo`S=$4xd?0gvHwgpZzy!~*%fF|4-^!cMV8Ag6 z+x9>kq>mnHw&LO2>ic#SpSK_TnmfTpXQh)I6UU_Z+@$y%FTWm<?F&$hrKI?5ay-EI z`|1RTljMWNr|iMZ_;d&Z&R~LP*hQQ5yWPs0FVKQx61K%>oAizTKE=aq6~Fh|V9$4> z_>{fo-CqP7y(T9)CO+F;d&>RTy<C1hn#H#H)%;MVUk$>*7MS1}_UcD8rj$1h*v^J+ zeyx)}dZeP>!N9k*^Wo?jw>ui|`Y_n&>~@l4TjM8wFWUQ#f5}&`raUQacXn#M_KP(> zCdvQD<bO><qonb%Vg8HLd>s}zuW&eT83t!v?X;n`J&q6l_<ePv!#Obl$ND4nXl8%x z5(Y5>6FkFSUskw+xLNFg#MdNj>yOGu)BRDVxSFlq^S>6fe19<f&b?0z9$5f3c*{>q ze?J)gvHK4t!E))bUtFAYLz_lQEuNjIM4x*oj<1yeKNQE56?)S8!;fQ40uD`54#)nt z(Su<<t0v#|SY{k6zOVluk#At)mtpTyx%q22a7@CsICiLw=?032+3I+FTCnp6(RpF= zgb$1Z8@+}tX?^0D6rX=ld`^;ITV;E)fqOD3KAj$ZrN?Qq!%6aCXq^2hGd^|V2xl<i zYuJ+>(`T?MGhd(t$0TfvPq*jq9>pW&Y^{3y*`Vde(Rz0D?&}@^8@%OCa-1zbOBA11 z$*&*Db{UGXloX%!jtBUDACx+rBp)n3>$YXar&Snm1`|BP-lJpuFkher$0TfvPp|Zi ze!JpfwzkgIdjHdCy?cLu>3hINukHtFed4p#EB9k}vi$mqY$tuSr}<UUm+99`VPgwS z>=^dWAL_T8Rc0LEkqz7Y>hgFNJw6zit=hh)g7%+9>;1x){jmkCq*U>rB|(?;xTp53 zZ8vA#FI9b1-_I*OVo~<&i|<Lova(Im;~MWHAFaFC%HlG0`d@>7hqvsw=aO!HhfPWz zdO8@89((@FzP9sQaU9EUf9AQM;OCLvli&JYhn2@=?~`{26Qswzoo5^0(?!hDsot8| z-<!O0e=MA${(f5ho%ETh_4o2$X7+cbu(1Uub_~1dNBVqNWyS#>*|4p@S9&~4<%e%; z^Am1=eBG>ZV1w7>B**k!@B0sYj`C*B^Hb&5v+}DN#aK$3=c^qL@cr18Ih>^R!s1i# zWM+ICgz+tL1`|BPZuznHKFXUf(1K$Uw#8?i^o@R>;$gNn-TT*|_Sey8bhY36{olYw zZ;O*0`|&CD%5PD8rpT|ovOOKeSW1dd^AYKN&34BLoYNdmV+@0=;rQ1VJ+3W0{k}Zi z;UvYv;#~jR%sBT71K+^}&#*gxqGvOex0t{MUz4yc&LwJt9%;7XYPNP>|8&s(yJ#GK zM|}!5I=ei5;#~8`6NcJTPg<_{l*_OGlI^RaqKx;X_)PNf{l0v)!%4bMvG{D>nHirQ z!h$oH@HOl`+jMSL-h6=+9FwpuJ{4+X<TofDW-Ik@Ur_RgXdHgG@DG0j8@;-pruF^! ztoLx<uK1iGzn+urq=hvpKK?jtc39xN#^GFVBt2<3{=Trv<LUQhg~K`3Yj1}Z=ZSyH zjPp$Sitk|Jw_#6sT<1QOSxmse*CcF<bC(yll;Uc(ie^0+H2*mohrQ}ku)%9}l4C#4 z<So5J@i|j|{kLpiWQCqgiqBfd1AM<P&vH0PK3IHK4rIn>fiU0<CU}P3{%?9VMtSoE zN^nfVw)kw6zEN*eJj_<}oF{_5|A@xnS=E2|8`$XeJIS#hpQ&E?I~AX^<=4I(<Io>J z{x}?PoWPmtaE2R){(89CwS}kOm*+T~q*z#-x9?8JdEaL~9&8f^zJm##VXx`aXaCAu zOo#=(CShBgQ)+`AX{X|9w))5Q1!Ye~`>XOJ{`^I-(b?<i`*EhuQoG`FuKaplwud|K z`0*+C@cq6#&*7YA;GVSj)b2^ghw9zJf-{)#HSD6F>)x^Q<_o%TOv1MKRR1g;pGw8U zY&8@;9&|k&?JGa=#xFkyHh4`=a_q-vlZSJw;!`QV_RDtCXF4`d{rLFfu+3qCbH2lA z#9%BLjz6AjU0ZnieR+YyNs5KVdF|fJI5!9b-@ydWu(#`&cvwuJg|A827Uy-+H~Q-p zSF^RI=ec0_e?|X?yZa?S`T^Lc=gS^fKJd$ki`88yzY3lj{@#1lFETMJl*bmBX3y^H zR;sSzxxrxdf?ot%CE4G9rRB@#U>BP+pGafT|Ec$#8SIc=5p}5x#-Wpx+8l@3{pt4a zQvX(o|2Xj<ZXWslTm7L&f{K07vm5{V?$0Jo{UP%+rFV>S#}tqM^-y8#V9)higC^;5 zo%PYBZ~j88dMG>9@m?#r#`yyO*E;?m7}881*!c9v`A*k%KsXi)a9$^z!xRVoWZ(hG zaLRV2?{ANHd}ga(;6x*EE^;_$AApkH$NK;4j9S<JD4yFM-JnlhlG9Yz|7#`Tju!T+ zWv@uQUy;zvc<*>-PN<Jc@qMotI)*!C;7oHkZ=@iW45#aaxkGJhT^t#YHil_-v2Ykq zNdv>?c|}n{cu&vFR11SK4kmbpUA|qu;;-Y0el~2I=c~N=v0L-PZ1o?0LePGA!HOe= zkvj75*Mbe+N+&sHKG{4O|Es8;@(#sky8JpqeodnwmXhLQ<F#Hmn;j=`Y8=k{V;E!& z$L}v2uWN*3oWPkOoFm1@|7^@44aXm6HePoM2TtgMbBV(_(;9oyaQty^;}A7CA;Gy+ zIK?@}p}&r-aWNtO{+c$^#b>zjvvPdq_~{S^eF`RchTZaOotu@nzJ@D(n1pTPXPflV zBXw%Ln5~9y-W&A2C>lTC-f_>*z(!|_lN>XCtlw*&Oyj&)@tGyRUMSnMQH&*vvmYPp z_tnBFa#-M8CY<rY$#<RFE)3%Y&g&h{NY^Rr_fq)_CtLuhRyZ%p(eM8H>#sj>GMvjD zPD3m<WGz1a`m^2j6Y=-w@D;)#&PnmH^{4eEnd7Hd81yNa;2C!F4qf{zZ+#7yY}ht_ zN`8~>_njIqW^2u}JA+LxEm*;MZqCL3^$^(L^*YJ1KYltr93G&(QhpsHzlOUW@Z)3S zr%yOF4hx(*;gkqxxOKztFIzVziKlS_=M4^LxOKx{e{B5VC!CPrTqT@ibBrH<UQBXr ziJL$7u6FSmuHPrTBD3E&3WL4?6FkFS|64s5qrCMIT#0=Ww)K0l+Mq|;s($uuHJw<n zg8ROU_f<^<8=d0crS<9eidEBscIk2db^g~rz7U<HROQ*R`r8!8dij5xIM!RCCvE=t zah%}s@W<da4(ByqdporG)16Akao5>T2L<v4-@wE#!``D~{57A!fnyT3#j(zdOQ+&t zwpKmzwP4_+f)(s1_rLWkp9LGdx_{4%<I2Zw4T>g5^X$Wa`&8EbWZ>BWhxC5M@ml#m zK^(7+iZb4l;yBym;rHov4kyW1i(^@7I*u5cDPQmnO#CwJs-3#`qcZauT{tFTTO7N* zxJ*zyhHO3jaL{&gG#<;Ye(glC!RvC8W5#3m@6HTXNssZ^vT$qCvW#lMR?kjYpf{Z} z3mWAAOT;m$VNx8|IvjZTefma+leErQ9D7d9jN>X{;2W6W8TRJ#!WH;yKEoG|N!S+0 z9nv?yx)l$zwRP&oKo2{vI82o<tS&A98@-m-WPVP)wc+t#y!4Jz-TSBX-ic09n(+I` z&Uz=&`GDg1Ci(wTah#gaC@GFrN9p?Xw1O3CTJZS=slO*Q3yT8JPL(^x-u2Gjtb~SU z&tKQa|3UwwCVuRxxQ1oCq~x#P+{%kjFIX|)#nacB?d&G)&D77;=vI_x;x3nMVh<*9 zH|&-_YR~QZ!)zEw%bT=*-Xbh3gTL8o{q(2x-FgKpxDJ2$*N^+^w&x<f^8ZfjGhY@w za9^-#YBXPdJHNjf4&ZHZl4JC09zF1LrVlFaZ<hbZD~@wfjHRTw?{j>?@9?<4#o=5Q z!ys$(WyiVcIJSK2^+B&N;0z{shQ0Ye6j$ZV7ck(Mgl%yw*_DpVR>i|?b-#8_&{SEl zf*4%*t{+r^4PMEg)B4oS?s#3W;rxOXFVyi5@Az1fDVi13I6K=tdmmC98|DAY#jz&T z%6v<TW5pMj1@#w1`}$Y@`LDY(TcmS6&Q9r{6c2Zdy(VXGSz2}I$n5#&-GR?WpYOB? z$GC$t$KiZvsCD|laQuClKaSvpHaIspoG+)F4;>kfzfYXx#cxPa2RAyLa=*|W+kEVK zZF(F9n<fXv>Pz|-O#0WbnKRbk21g$yVcR%r@Ww@(#*Nu3d+bHQgz@R`iUY4xem9Hn zD}>2fQ*#{OfSFGA41UqHG+%0)Jsad{Ybma4<)&lfZ_+?|{Qj$W%=LI!8<R=#w`a}^ z^(?-h{AbS1FO$Arwqty2{@KytxIm}AI`Vy_7{fhtP7Ev#W<Q>{a+7<$6pj04#cROD zop{X~LA<h!dy73d^GAT=&qKy$kDE8f5xHO(oC)Ki^Uxlz&uLTklc$3Xf7ACD=o$Ft zbB2Ege)C0{W03ZwvP*StR9tLs`u&7|mN>sQYrWb$Bf??L^i%iAuMD>R`04N&_&Aqb zeFV16S=MFF1-3p9w;mkp2(0(wVmLlGJNA9EG9+t0iCEPCH9fDQQr-7Znc1KZY#dpA zHo05v%%;iLN;%Lv!K*95RyHiZeCB^1h|3Cen=pA{*Yp|xX4}fL$?gPP_^uQtFYIP( zJ6!qR1YG!jP?)^1YwcNQN6NQu_knSMZ>KPMVb^f;k?Rt0;d{F<d12S^I3JFbZ-M5j z>6(0*fK~~U7j_LdAK8$ATO)vv3X>Oh^T9J+))wPwlFw^a3zHXiO*da@cqUm-3^!ja z)311Te{i}x7n|%?<uk`09lna68Xe#I{RiT5A8W!1M~APbQR33hc$#FKy;!)sHhQ?s z3)3-wvq{>Su1WrnszjLK>+k6}uwGgpWW%%a616itlZ@Y^h0AM!hih#{B57xMCW*s% zVe;zra9PhxCl@yDOxGmOg&rkLUK97E<B$u>ucw{indBZ_u`qeHdbs(lzqB(vlUxrU zAxvIdJY1hou4CF6o=MipB4P4MJ)Mq2KI<>-49_I}HcptlmV3B-=YZ+t;!8WzHF+(K zgvo20hnvs(OFP3eNx$va`oOE~nRFa-arEnHXLu%w!#-j1>hN$obp38RK1R|p?M&C? zd!+cBFnRTRxJm7^mC?@dOu~1sFnO_#TH8(cjJ)627j1TJ{WWDI`^d7r(Y~rw*WkRY zJ@>i%WaT53)|NeJr);oyubp17f|p^8m5p)E7}pxRzV-6(HP$xZI^6eOn?3W}r2n}~ z<$tC7*XqYo?pB<$;dRU^SaF;x-*@Ekugj*>aKg1g?PbwDn@_cU>37-mwmCnl-MumN zKCEk&x9VEzRoVyKmeA0yh5dVp>m1HX;p}zC;JnS@+&K)6{~5J^Z^Sr()8cTp4uj)= z_TK02t8uT-u7hZLlfx-bz_EL5ZI@?W=amYB`-fnHXV?XY7p~y`h}~BNl9(l7+r5!C zwKvmi)Q@Is!U@xZ-YcSeS+_m0@W)`ISNnWgpZ%SE@62uwXO-f!NPe9r+nkf)$@<HW zkKGfi+^7FXc39vnb~rc0L6kQfzrQ%wp}I~u#tEEOhjYs?IR5wv)!q=@gFR-~1M?G_ zg+(2*V|8%n7<>QX?7iPAJ!!lLj!!=W!#TuL89H3zaLR{D(g$|$torKA@lm5bqR&E1 z^_yW2yjXqc`q5D6qa<t_AFI9o-lp+jwkBx*{1N$C^Tz1=7iz96STRoLo8{sgPxMLr z{uphSO4rU+dvuQSlig=qb#10^TRlGL`}ZN@x`t;u>l60;jL(;9|G|rE0&A0xEE+uU z+{@l(qA+=3Hy=FHot=QoIsF7-^1`m^G7c@4R+ddpEGS%Ix+dB4PZB0C>}G5Gk1KyZ zn5f^>-ZdCL$Emdk&!dFoH?{fwa^qv;(0-?Ti~BupJ}cij80qnw#XWyHJoED;jYB{2 zJLX+#+v^v)W3wNx;{Iy9j6C|r2g$e3@SEvYZj$rA)$1@!)NPZG{ARN&8k%eNJIqz% z27^_4)k$HwBzpWl@4h3V<099vhz|_C)N$Bg(5_hMi9daglzG<=yOxI9Tfqn==8mY& zuDsrHP148~%Ou@#357m?t0rE2=EiS2C)JxCbqf?5#tZi^?KiIDZQy88vpU8fzd=nq zlC_O;`M<}1OM5tkd}0RQc@B)@R*e_N4*oDMsG^+T)#mrt$&;+lhJI7s#-#=cF^jZx zy}aj`p<^q{S7P7n`0{X9PG9=vcCQyZv~8SzRej?nwO3Aa53o=+(!_e<r{M6kZ<H6t z)(iT1i(-*vBdH9GZ2e{WbrxIf(O`rr&fS`+i^5c7gVW{BPLd5P8!!KDp7~`CA{18c zm&K1qqGN5c`C;{iN7_*&1Fd(pZq3WAiQ?BKADB<$6bN|4S8JQA{nD}aW5G9D+|6E+ z4a!=J^?PXY$B+B+_v?SX|9Z+0KbwzsE?DEZSDR6AUN9K+x$#?AaCiaFI~A--@jkRp zg_%6wk~ojFIc;O7qKu~bU}qa6=6-yvTg>D41t5Uky_$1-6+`1-lCm_(q7ltUYnyJD z{V1Cs)*@-FSE^sF-j~=7G<N9sTw}db>%O(6U0;szwa?k~#~1B;We@qkWqh#*U<}01 z?<*A#&SU4PuEE8IxYUkUJe5bEy_G~b2KYVsq`jHp&wOE|OaFpRyVb&~etP)*C*yRY z+V;{Qma>hj;m#+<2g#|6^#UC7CW(jDn@Q?gmn~h;c+;F4mn<%u+_HGl{K-?ITI$G~ zZd?u=ot{VWx}<!zIl%dzRA`&6C|j_yCA#LcdRH6@xJ6{6Qu4*(LmyP>xLJKb4duID zrr&Ghz@;C%n9%2e>p!bQtzUg!SrWCU+^#u(s&@FW^+ozl5ZS8JF*eaz^HQxVFOH7Q zjpEoM*nW(@FH&uD?Z=1O1Dr?7wI8o?T$3QPjjbeIJ74*AUU-L!i5GjgpSySuRm2Wx z+pO5oAIv}I4=Qm?I9hD1j=rh)_T$!;_M=JTkBe-Nr0qy!HoJLj=85@U96Pxs^@s5% zPAwXnj8ob(2C1XG_=9?Gc5_jfr_9F3&(vSsbKd843yPxtL5IY=kB&zFj(xM^OU4U% z?lb%4{ylKoHr8Hw#icb@UUPBn4CM|SD`8=lxA;2LacrhP@x4D|YO~e@?8Z}489Ld< zhUwRO>x-4ev6J#~?xv$I3R8SPWOkBlSXr_Bw=v|G88*_&{j&J+NOY`CHb1OBz8~t) z+B(y%ucl)XyQ}2`b2r<5$kv5EZ+?#j-)wO=dr3AZYnd<@;FBNsh7V=#{cS$ld8f;9 z_xENkFVXKkyYc(KWp8HvmP=+EBe`N8TOLC*#C(tD+#bcy`ott<X)gc&_x_BFsp{7> zr}Pn=J2ZCa_grIrs@8pLNxPmL<7=<8>5nhkZ<0Oa|CaH^e#7?u{yYp65B3@C{p($9 zh|4zZ4>?D&_h26<5w3SNoyq$^!>>_0bV*<%+a{*V$di)JCll1RH>}NkvoV=jI{f*> z_#nCW%z6P1d6UG$>J6K^*2S$!TmP`#aC?6+XdmB$m&<=*!5*A_x9QcW{N*%oso!xU z_8ndvsSbI~x$$kOveZ=lUqzTG+jYFwI_ZK99u<`DKHL3n6$MI9IBd8~)T<~e4&TvV zr+!`cigZ8O{{B~L$C|TVb_!02_V?JNVR5O(PAWRKTZ4tM{r$kC!C)ZdRjs@2zSW2) zIHaNWQFg@dx%T&y#5o&Sw*5$wzMYf&I^q^j#EbpflP=!zddt&xySULG%rToIaZEVc z9@pyVn`^!Oy|p#$eC2Z2ha+j1Pt4%k(tPGwhD*NxRr*{@;|HG@8`M$GZ+LJ_BGy$e z&+NDDiswX?BacTZAz6G9s={`(x8$EkeN3N+>4IzHbB*R2G2k|AubZRP`_K84Kb#*7 zP}(!h_zM-hx8eAEYT=>J->);C@%sk5e-V8)VfAe;_Ou-fyZBG+deZ$C@SW*qZ|;(o z#dDgMrWP)0o4aJuoR%TGx9j^Uy%^birBArtX|Xj)O9%6XcBFl2J5j+X-tpV)AbEBU z$-NaM&*S^`Cn#@;wvDwl7uUMseK0W`I5F)P`0;Zi^SeSiNj8$oz{oaFO@E`s6?-%o zVahh{)IDK}Uu&72BpX)NCf{s*^~-!pR_>R@k4K_oZL;}c_3>-1fmiDDbG@wIm!VzN zv5scjf7%*deNq}@Ecj-NyV*;!L0P|e;FBNsx({bwYuQ}1JwTD;?(c>BCu{HF;_|;` zFYNc-aL3ukNUoS?yVh#bIB!x6txrr+mge#Q|5}T2(XD<>b4nk<c|d&W_grJWTjzRf zNxStq##gh`_s19Q%N&>gE#r&5pIvMD^KiHP;~d7dR<HAwxb&W^cq-36kUh0TxF%Pv zO5T$j{syOuKG?|ibJ8&<Pf9wUbf|4_SeyA~V=}XJ`16VJL9+K{y#R;2N#bGkhD}{- zbWP)~Xd=H~)jW6J!bNja;j;|U{mjOi8PijKyKcp%>yPPYpsa3(;}9sORz`d|9)C(G z3(;XOhz$3VuHMd>*<xUL!%5n%lO6hl2ZBo-Hsx1MyP~G?@@Wm$o-*^*>QWWU&zm=I zUZ_HS<wx}0k)AKs_V>=umdK~D7`q%4pBnjz4$oU6@poX1{ah<M#1=nYY{UL;)YbEH zm63cO!}78@<u^=8m6esvnUZ>4s_cd-Q&JbD$XpO+qE=D6e)-<(`Db+n`i?@z*@DQ= zuox~J6qQ91o$&s+<QXd8=5WTUkGo}uc;mZ^xB0$s5k!<?zAs$l`(8D??*kvz_jr5$ zMTo+5zBikns(=gi15ToY??`;#>Tt%&_mxxhy^q4gcZ)Z^GPWD*rq$2XF)71;t4p1A zZbeib))%baA8hn|aa9FJIzMY=%gV6JabF}0(ZNsTg_2tx&RF@`dYaCI!o<&^*y=d+ zv*xN<*G3<+9O!3QmpWUjVImG|<Y%|%i>oRqc79HkEi1z=$D1Nqhz@=td1klA;f$4^ z4X5ifVqxN^i*4vr<marbR2-%Q`m<)%RjISiIoGeR{J6eH%=5+SUf}$kBwJR7U5?jA zvJf5oL~=iCjl&r$Kda02JcBUt)5SLJ=OtH6yF6QehIMIAi9?_KZ1sFmQJ9W$eiq4= zm0_3T&PW!bgP+K0l7Yh+D?iI#Js1#M{B*HR`#Gaw=&P*`=ug$9y^Q8>>nC(g;Q1oR zFul<EIpEb{m&*1?7NUcnNc?PZx?|<%#543vi7@fg#WwQu%4_Ny>#x+F;gV_B)JE=R z_?lU-A6SbLI^#d7-y3j#xZ+ThIDfZ$b=aq}C6a~cu%AG3ub{!{j+MW~uhH*F2@`)^ zj5GYby1r({Rc^K>`5V=zhQ6i=optiJ!ug@>P&(H6yVa}1J_@rVS%?n)BJp>o(;X{+ z_sR}2#$OlX41X`b`qGQ9bi1h}f1~<T#{I{dE`7(P^Fy#h>BY|9O<o=LQK+p5Wg$BF zi^ShbS3g$%?vfp1jK40%k-t~XsJl{+^{R6(zp^I%*}m-^8#C*NPCUe9hx{#x_$!xA z$2ou3dv(}Hqvp)WUv%&niN9s8eysf6Av?qve_f0tf3Lf0R{e~|X&2+PI#JbO%IM>m zj`qzN<GTG*`ah1y4{ILEiO%n}UL8EBtU4?58=Y4uk9@u4Bv(IHe)r1`vBqx~>&Wlv z(`sv7XQo%K*gh(*Bgbuk6Q7Bn*8lu@zNsio$2-5*L_UUP@Zg|SpA|_IqJ!Val;i|g zKURMC$_}x{Zx`#xZ}x^WuHfH>!j#d^t}b=<S?8V0g|ia%J@Rw6=Sx_jw-cS8LF7|d zj9m_bS&^UUyx8f!OtQ$;kCmVO!Xvi$>0%pko~r95)v>qX^ErvIeB=F@pVj?Z*K7C) z&VYA~Z~DlQq<rsRZ56+4xbSIgUAAQIjdNOB8W+r2)ZC)qER7O%9p}nt@#P+d-GiWf zq$wL$YahQKTl<!AK~2KF4)lGy<Mgj$<o)N~{d&W<cJ-gpeFZNL_BrTejTx??OXVlJ z@a=JWebWw%Tl}6&O1gW*x0lATl#P##$C!HPpYcJKNdXBClFwX_{8u5;|9(q!8kf#( z8?G;BpQn4>;>*Uq`~37cZJe3W?HO^F>aZ!_{$&i6iboPCKD4>IeEYZOwfbybeTZ)@ zRcYU_gH2vtu8*_z%Lb1ZIwvc}>@tzpJ9)8_S0&V|C`{S#t=^ZTiC=SN_V}%Fb@|2* zPNR*}%r*K>O&42mY;F;^S1I4Dv9?vOCLPm95(R5791PZH=?~VL(Io3LY+{?!3X*$D zNcKF)mpeII(vshHm$>r(SN)3RfW`#eL%r%qJKn$keD-lh!=Z8h@N+m~ko$c!<7(3d z*~gVx9L>10w!_KM@NLl;O2YK}Cttp)&+ZROy*SudK1Jh(aaEzUrAx0S9kZTdzjVf6 zP~+P8wy8Uqv1~SxjAbNa8Oc~iGM16tKe7Y|%HZ20u8d{o+a7U*d#G0(z8|pG$H%ha zAoJxg{q)l#Be8e*O;+V(S5Cf4>-RXx(`1MInNFfYexxbeII6iR{Tzy6VXw$#b}KGC z7eIfF7Z-{{yRRDz=;y1IpX8MvaGq_vi6$A`<869`#d(T2?((q0h9h{(=9~Et|BQaC z>}7++x5kBwZl2S!u(`2y&XPGd&D8@OnHxZKc3dnB;Sd+w4~<2C7_Y?r-$lv1vD@zI z@}1Xv)UN6WM~AN=+jbC>8$J6;zMiYGIaO_t)lOdQNgalXwk_2M+GX4&r3&d<c{aP; zCBW_*oMeoVM_Quo&IG%MnL<pi8-ZOe;;?grlg*wqIPA{Wo|$Kc{O6`@e43ugl()am z=I?wdW7n=ptgSDt?bLZk2fVEAa65>}u9#i$mq`bCtCM~{)_f?7-TpiF2dlh!X6FmA zxUOht{wOhbng1M@^%t)|`YC>0F;Tj;YTN58xnuJ;UgfXdejWP82gwZ;q?L1BL7wXh z<hvv-p%Y$Lj9{%;H(l$Sc(Vr|&^Zx|Y+R{}r)=w+>BZLy)}vP0w0d7+x7XF>yH=zw z)BOy^9zS|#X8M6mUb(I%_IbSEa=zla*vXrn<l2IA&K&W26@}?g$8SST_W12`b@|2* z;-ihz+Ry28LpNu@vH3)N%9Y=saW(OhX#W+Sn^d;<Qr&NKZQ}7dnEjX8M9z{OB>OMq zWG73VyhYNI^*4N{iYxms_K1~=C)`85>hS%5`QguDA7?Zi!fS~U%-e`b?)TBm&l2@b z60+Y<qZwaGnDMgF@a;VWeA~PAnWFW(NZOdbz>VoZYs`RNO{!xJ#gE?CYmISj{8&+U zFk{+mA{o<2#x#;KjbuzCuavX|2g(@J#k$|hm}cJ1)C=yRUUm4Mb4(i!GG7kivqSp8 z<cjcPz*$$!s7c!#`rL%?O3Bbkg-ZBP|9So1Q*^&LYUtiC5*OmI)2rh=Ky~%yp)5p) z>n-FY$tI_3b2i>jv>j=p?M&ID|GB^H?rDdyY@EAf$s$f3O6YADAGmRTT3H)$%*S@V z^J4bCV}gDc3pn`6xBEY39>aH~=8w<Qjt_?KfW}Ux7YCci)fx{c%0R99qDQYL9n+WC ztgTbt9s9PaJD7QFHj!NCBN@L)J_A8caB_;IB{)zA-)-W`JZ7ya(F^YA6;_W!<ebNb zgUpwMH>5*5Hh07FRM~0Km@k`R+~K|X3;K=6XfB5Q>}{It<9oMP#~h)4LqjMF(c$_Y z$=sdf>c?vC7GI&YQ2or@b?Zemcey9;Ig20Lqzgah?}RtFnCp0?Dc||qbI;L1mux2C z!)KSP%Xj|HzDl2Kt1W(X*Jt{{|BUczXp64Lu#=QZuT1koXS(|5WG7E^@+2o2WAS<w zg((}p)%$WZ@$2_^`dHX4(Hy5N-}upHv~k*Wr+)9u8}GIj5g*2Rzc^KEY&GeaK9VTt zzgp)FcN~w`!K_7Q6Up-gNbr$II?4Pb@81zL9r(@`SJt9%y;Q8>uB;|g_?~ku0vjA; zz8u1Ra%_%9R&&3PW-OIz-XtLtk2Y7A?^vpRqyAsi&BcN1B7Ey(&WF5m&BYBKFWS~9 zmV5?@e6^G85y_W2d5TxB!!Vg$%MT|<6TfDS<0MS%u5oqw#t*#F#%cRneYR}lRX8>m zi4$Y8S!?4~y_$4PA4wFHs*l#YHt~2J%v>~^Nag|3`jWXwp1FwR8DdMO1K(ZZ%3Nf< z7|@u2d#G0(zUQ2aV1t9qmqTPB_j|T+Q{<Y)?}b-wJMjL$S;6<^r++Lcy(ay<24#(n z&5M`*gVqIXS6!QZTpQQXjB9H<oXi$aYZJfs2H$~0z_;hF{lNxdn_Zhrmuf7Xq{0oF zHxsp|Ytk|M5A=Gk*LT*qHuRgH4rVTyO(c5}By$JJ^RLL4IawiT2@cf3cdEEDmzeKu ziWl5Nz3T8i=Ug%zWWF3?!#A{L`|P1Q_S!?4%>8!f7j@sl_(pWY_nG2C97=S~v0~0Y z9PfK;C=1acM#xghz~PM5e!E@v=zsRxZjT@O7v8JRoVH<k&6{*TU2Vc^=GhU~_*fBC z)|Bu3V9z~XHj@CcJKNReJD>aBtY=xA9}}B0{a}sbmFqm;<?({cW$L4|oaD1f^7I*! zaUHK$QJ4;O{Ax9?&6Y2*8@RfB;|I=Y<FxWi`prN$&cU&@iTH57tJS#b(W^<v^pQkC zUE^S|+8xK^buep_*+lYeC(`<o^E`RxD6&%0lIg&Ao4B$zv3~YxOu#+Vs}A2oyyz%; zx4BEs#~BTWaL=7EPknpC9gk){uF>2{!o-&WSC{X2>Ux`={ZQ;!SN1K8@WCT-j^veV zK9;>D&5O3LSD&5Z<ONQ0O-%WjPM+=6>o81a*Yd;3(Zp}N$J58g?gWi<%JPjLZAKfX zb?bCL$m>&^kHm@by<MDYv_>}Rm_Cvyn5sT1b#3DDI+*!rHj&Inr1d59kv#Jed7-2w z(}8c3xH2DEGny4^xQBYx;d{>c2sSv#d^up@@WToVx>rW`Yl`OUe*yKP{0hh2BxUff zU$Ag#YTmL%H?}QYyePGJN$Tb~OBT+#p=ECBra5m<-7q(`Y|+v=^X8tBn!b3^(uK`) zm!y_0UASm|iuV6k5^<V5+CXu!tpvu>wk5g}Sv=fh5TUOB7TUIk9+tkWWog^oIn8IJ z>KCV)7cLFEta)xL4}sH_<?1K*U)opCn10PwGaB`2%XQPPx?<K9mtK8F>gu_3Q;Qe1 z@SofZ=C-t^=BekK=eEsR*s|2WqV$>k^Y~CjpmSdOdnZO>Bip)f&%(yPU&y|f*y?>7 z;rKd)gUJoqgIa5B_#Z-=VMq>co~I@o&&jFDhmh)IeFxsyjF&ZTAY>aaRv#ZP<arLw z&Lt)(FL&n~VmZ>3Z9FqC;uzypV7#j4M$db$RoM<5ql;bRW75hS8<)O)DIestEL_?~ zq0(6JjF5!ICc#Vn7oHf@E;!H!RD8Rm*>8DfvL0rOt2IdCyYCS2?fA03FTsrqY}+1> z{$U^0tNmP=?m0B+V-Bv3*J#f)yG_?KS;o@A?D5Pd@>1EhF@ogGhpce&a!E@zuHaiE zuI%yHhX#rl+&j2uQXOggeM?FFnhP7?AoJw_UcP(0gkc|!zoGj`-n2-SWz3SHn@RZ8 z@D=@@JbuQ~mGXmq@oZg3Sryk*98bDAl!fTLRC(m7l3N{)#U>sz+Kx2QcIOg}7mXe6 zCAs@oLvzfJ*F@=U)C=r4INl~H18cNfJ=*_YNyO=&d*c5qz5S2(v-@AhW{+cg-fVju ztM@$&$MzxJ!9~^%X05Tk<{_jRl03M1{*T)e_r7;*#*6JOvyB(4kB=Af?1}AMVv_P| zcfKK(BTd=%Zp@1~hQBASYfbNo_vjd1>>3}FRvw-07im*WNu;|`=WNd3+z%~Xmc|Gb zM(~!6yETpPJNeAMZRvr2q3_4+f66`?zNOlqnm@ig7{24bs^3U<V+BmxC(~!=E5A!N z>(n1j+9$K$*`PkE{g{4NGt2lon0>O@L|!c0Hg1qSM}p*k*OB&}V#*GUHTbrOEBj>j z^6S;Va9_uGs#c+rA1m^<7qmLC!9nKB0gQb2ec?ViJrzQJ8GB^v!p~aSFq0YD9*4R+ z)qmUZFP5$nfA+`i(Ox*LWsY&Mswb3%=p3g!a<b%Zhhs5`$BMQiO|<R2MZX`aal-!C z?a4#Vjg761jg51b%)c>0LwBg`=6KmHQj7|R^yV(QdEt`9iz3aaPs8@NWL6C6x6Z$* zwJlm~hRSa73I#M&KJTW*&2xPYnLLZ$uD!hC$U4=!Jc=i6`|sW#w9DV9WqKaHO|j*9 z+NsiAqgRuTi3@s@gvE1w9D@;09r1z@=D{+%NdD&+$#_7%IH6ueVe;E<6yGCNx>kJQ z34fFd3&suUh6nD=#tm5?XEYqb@!^ey_IC^h#ErP`QryhOhI{lpqvJ)HtzRwjlmDYz zFWm`h+oWUqPNHD7^4urkc&y`Yc9DFRf+X%p<{Fac8?0W3VS)!`aIO$P;?DShC;U+w zY1|FRY#>L<p|LS@zU_Udej7qOh<lTcBOdzyfv@ckS{yIREbceS*2|SIm2RhAO**FU zBnnE}b?@Q}sUZx?{M6xR@;D}TW*2#q%i}ZompVyotzL&=^4qQxU*gXAfG7M>8fn}Q zhC^fK(iM)℘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�tN7#K<z*K44zGte}mU)SG?y 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%0D>KF|vnccXy;utc-tBeCKz!{h%$;IoY2r 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%0D&8BrO3}ox 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 LsKE84B1 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 z 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 i!Xg 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Â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 From 5947926a09a53bce30c535a31cad9821b80832d5 Mon Sep 17 00:00:00 2001 From: voed <iwmyc@ex.ua> Date: Wed, 30 Jan 2019 16:19:30 +0200 Subject: [PATCH 92/98] Add player validation for menu_display (#671) Invalid player triggered crash because get/set_pdata is unsafe --- amxmodx/newmenus.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/amxmodx/newmenus.cpp b/amxmodx/newmenus.cpp index 59bdd7e6..b4236c62 100755 --- a/amxmodx/newmenus.cpp +++ b/amxmodx/newmenus.cpp @@ -844,7 +844,20 @@ static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params) int player = params[1]; int page = params[3]; + + if (player < 1 || player > gpGlobals->maxClients) + { + LogError(amx, AMX_ERR_NATIVE, "Invalid player id %d.", player); + return 0; + } + CPlayer* pPlayer = GET_PLAYER_POINTER_I(player); + + if (!pPlayer->ingame) + { + LogError(amx, AMX_ERR_NATIVE, "Player %d is not in game.", player); + return 0; + } if (!CloseNewMenus(pPlayer)) { From 38cd5ab1cd95a0c57e960c3e0eae817bedd7bd37 Mon Sep 17 00:00:00 2001 From: regener <dtomi24@hotmail.com> Date: Wed, 30 Jan 2019 15:57:54 +0100 Subject: [PATCH 93/98] Fix back/next/exit buttons not translated in plugin's cvar/command menus (#667) * Menu buttons stayed english in Plugin's cvar/command menus That worked, but if there is any better solution to get it working feel free to edit :D * Changed language parsing to %L --- plugins/pluginmenu.sma | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/pluginmenu.sma b/plugins/pluginmenu.sma index 80f43fc3..2d7e2aeb 100644 --- a/plugins/pluginmenu.sma +++ b/plugins/pluginmenu.sma @@ -151,6 +151,9 @@ stock DisplayPluginMenu(id,const MenuText[], const Handler[], const Command[], c } } + menu_setprop(Menu,MPROP_BACKNAME,fmt("%L", id, "BACK")); + menu_setprop(Menu,MPROP_NEXTNAME,fmt("%L", id, "MORE")); + menu_setprop(Menu,MPROP_EXITNAME,fmt("%L", id, "EXIT")); menu_setprop(Menu,MPROP_NUMBER_COLOR,"\y"); menu_setprop(Menu,MPROP_EXIT,MEXIT_ALL); menu_display(id,Menu,0); @@ -564,6 +567,9 @@ public DisplayCvarMenu(id, plid, page) } } + menu_setprop(Menu,MPROP_BACKNAME,fmt("%L", id, "BACK")); + menu_setprop(Menu,MPROP_NEXTNAME,fmt("%L", id, "MORE")); + menu_setprop(Menu,MPROP_EXITNAME,fmt("%L", id, "EXIT")); menu_setprop(Menu,MPROP_EXIT,MEXIT_ALL); menu_setprop(Menu,MPROP_NUMBER_COLOR,"\y"); menu_display(id,Menu,page); @@ -882,6 +888,10 @@ public DisplayCmdMenu(id, plid, page) } } } + + menu_setprop(Menu,MPROP_BACKNAME,fmt("%L", id, "BACK")); + menu_setprop(Menu,MPROP_NEXTNAME,fmt("%L", id, "MORE")); + menu_setprop(Menu,MPROP_EXITNAME,fmt("%L", id, "EXIT")); menu_setprop(Menu,MPROP_NUMBER_COLOR,"\y"); menu_display(id,Menu,page); From fd643273136db5ae10da02c90e116a17fcfa939b Mon Sep 17 00:00:00 2001 From: PartialCloning <30499481+PartialCloning@users.noreply.github.com> Date: Thu, 24 Jan 2019 12:11:24 -0800 Subject: [PATCH 94/98] Revert RETURN_META(MRES_HANDLED); (#662) #554 (Revert "Fun: Make TraceLine a post forward") did not fully revert back TraceLine. RETURN_META(MRES_HANDLED); was added by #421 (Update Fun module) but still remains there. --- modules/fun/fun.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/fun/fun.cpp b/modules/fun/fun.cpp index 53be8696..943ff05f 100644 --- a/modules/fun/fun.cpp +++ b/modules/fun/fun.cpp @@ -495,7 +495,6 @@ void TraceLine(const float *v1, const float *v2, int fNoMonsters, edict_t *shoot if (!(Players[shooterIndex].GetBodyHits(targetIndex) & (1 << ptr->iHitgroup))) { ptr->flFraction = 1.0; - RETURN_META(MRES_HANDLED); } } From f392c90729ea35ff05a15563aded4686670989c6 Mon Sep 17 00:00:00 2001 From: Cleverson <SmileYzn@users.noreply.github.com> Date: Mon, 11 Feb 2019 09:13:19 -0200 Subject: [PATCH 95/98] Fix documentation (#678) * Lack register_event() on event_enable/disable Lack register_event() on enable_event and disable_event descriptions * It shoud be m_iJoiningState not m_iJointState It shoud be m_iJoiningState not m_iJointState --- plugins/include/cstrike_const.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/include/cstrike_const.inc b/plugins/include/cstrike_const.inc index df50ced0..00d3b854 100644 --- a/plugins/include/cstrike_const.inc +++ b/plugins/include/cstrike_const.inc @@ -281,7 +281,7 @@ enum CsMenu }; /** - * Player's join states for use with m_iJointState. + * Player's join states for use with m_iJoiningState. */ enum CsJoinState { From f623126fe1ad170ef30337fb4d1b157bc0506262 Mon Sep 17 00:00:00 2001 From: voed <iwmyc@ex.ua> Date: Mon, 11 Feb 2019 13:15:45 +0200 Subject: [PATCH 96/98] Improve documentation in engine_const.inc (#665) --- plugins/include/engine_const.inc | 91 ++++++++++++++++++-------------- 1 file changed, 51 insertions(+), 40 deletions(-) diff --git a/plugins/include/engine_const.inc b/plugins/include/engine_const.inc index c48bbda2..389a7766 100755 --- a/plugins/include/engine_const.inc +++ b/plugins/include/engine_const.inc @@ -12,7 +12,7 @@ // #if defined _engine_const_included - #endinput + #endinput #endif #define _engine_const_included @@ -212,54 +212,63 @@ enum { */ #if defined _jghg_enums - #endinput + #endinput #endif #define _jghg_enums + +/** + * Used by get_global_[edict/float/int/string/vector]() + */ enum { - // Edict - GL_trace_ent = 0, - // Float - GL_coop, - GL_deathmatch, - GL_force_retouch, - GL_found_secrets, - GL_frametime, - GL_serverflags, - GL_teamplay, - GL_time, - GL_trace_allsolid, - GL_trace_fraction, - GL_trace_inopen, - GL_trace_inwater, - GL_trace_plane_dist, - GL_trace_startsolid, + // Edict + GL_trace_ent = 0, - // Int - GL_cdAudioTrack, - GL_maxClients, - GL_maxEntities, - GL_msg_entity, - GL_trace_flags, - GL_trace_hitgroup, + // Float + GL_coop, + GL_deathmatch, + GL_force_retouch, + GL_found_secrets, + GL_frametime, + GL_serverflags, + GL_teamplay, + GL_time, + GL_trace_allsolid, + GL_trace_fraction, + GL_trace_inopen, + GL_trace_inwater, + GL_trace_plane_dist, + GL_trace_startsolid, - // String - GL_pStringBase, - GL_mapname, - GL_startspot, + // Int + GL_cdAudioTrack, + GL_maxClients, + GL_maxEntities, + GL_msg_entity, + GL_trace_flags, + GL_trace_hitgroup, - // Vector - GL_trace_endpos, - GL_trace_plane_normal, - GL_v_forward, - GL_v_right, - GL_v_up, - GL_vecLandmarkOffset, + // String + GL_pStringBase, + GL_mapname, + GL_startspot, - // Void (not supported) - GL_pSaveData + // Vector + GL_trace_endpos, + GL_trace_plane_normal, + GL_v_forward, + GL_v_right, + GL_v_up, + GL_vecLandmarkOffset, + + // Void (not supported) + GL_pSaveData }; + +/** + * Used by [get/set]_usercmd() + */ enum { usercmd_float_start, @@ -282,7 +291,9 @@ enum usercmd_vec_end }; -// Used by the traceresult() native. +/** + * Used by the traceresult() + */ enum { TR_AllSolid, // (int) if true, plane is not valid From ca69c36c1eb2e8ed30f6f80a2f0b5cb1bd3afa95 Mon Sep 17 00:00:00 2001 From: Cleverson <SmileYzn@users.noreply.github.com> Date: Sun, 7 Apr 2019 12:08:21 -0300 Subject: [PATCH 97/98] Updated Portuguese Brazilian translation in miscstats.txt with latest additions (#674) Updated Portuguese Brazilian translation in miscstats.txt with latest additions --- plugins/lang/miscstats.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/lang/miscstats.txt b/plugins/lang/miscstats.txt index dd5df5f5..b01d4ce3 100755 --- a/plugins/lang/miscstats.txt +++ b/plugins/lang/miscstats.txt @@ -520,6 +520,8 @@ CTS = CTS TERRORIST = TERRORISTA TERRORISTS = TERRORISTAS REMAINING = %d %s restando... +REMAINING_ENEMY = Um inimigo restante... +REMAINING_ENEMIES = %d inimigos restantes... KILLS = frags HS = hs From 6bed09db57f3560da353d0c723774fcb4ac417fe Mon Sep 17 00:00:00 2001 From: CrazY <burno770@gmail.com> Date: Sun, 7 Apr 2019 12:08:47 -0300 Subject: [PATCH 98/98] Fix TE_DLIGHT documentation (#685) There's no "brightness" parameter in TE_DLIGHT. Probably will cause server crash if it be passed. --- plugins/include/message_const.inc | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/include/message_const.inc b/plugins/include/message_const.inc index f76412e7..f9b07d65 100644 --- a/plugins/include/message_const.inc +++ b/plugins/include/message_const.inc @@ -565,7 +565,6 @@ enum * write_byte(red) * write_byte(green) * write_byte(blue) - * write_byte(brightness) * write_byte(life in 10's) * write_byte(decay rate in 10's) */