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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 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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 GJOThU?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 zcmeZaWMX)uUJ(95gn>bvkpT?!N>VFIz$^&i!o$Fj!oa|=f(OE9Wnf@XU<gRiOGzwA zWME(b$%AB4m>3vt@h~vh@q>5_3=<g`7#tW34g`0*sBm<LsPJ^hs0eiXsECAzg*Lz8 z`Cp*$zd+`HfkaSn;Qs=V?hq9b#t;>W?f{nV0*>wqo^B6;?g)`?2FBn2)w<nSnvZdG zv#|eH>kb1mMZ^)J%m`88|7y+0Sgc)CIQW~xxfvL&T~t_#I4n=_H+gb1Fn|q!NLryt z>VPEkSh`u*n~!lQv#kB||Nno4`RrhQaErT9>_(9jMv{X$3T6&7iwaDLSp>w)19_y= z#g^f}S~r9pg2Z-_MG^<GLH-H>`Kz9bfx$Wi?5|V&O@&+x44o|E|JAI)l1V6%AzTa$ z5VM>AGM2J-fYderWhr4x18V^j5czH${Z1Brm`gxB5hR{Aikx;QNUoQq3FIVjP`}|s z4(fZH(4Y?N_G7vHp!paF<Aq2_updTIxD}?b`4~$tOVfWfkcQ@C9G4$NGG6$vwwHy0 zfk7J_G=?uwxvyX@ZT`zp%GT|oBJy7i<VBXwA0P%3Sd0b4WG?0E&QTEnr9lvvrIe-f z1c<>}%GwQzk<Jg=VBL^lX#UGo%GT+k0@eyrdk~_Qz4LG<iwY<yHXmc@yZ}yRorl2G zBrw_O!vClFB}m&bmd+3;8)7C@%D40z%+Z}WC<?lBY#A_wWD!Em$5^^q_?r(xOz#$f zFgs5%`?2(99<a<&Vd3w$<6vO0_EF*B@Au+hU}!$Z0k*3<L<N+{7;{t*Dn&RL7{DQt zD+AWr6V1T@N@_AHAg{%MUDo-#lShT|G~DzD><}d&o4ZXwq;-jk2!GQTb_NFP5)}#l z=2z?t44pFI5bBlzDL__s7Ow0tOj)-Mf3J@w%YU`rJdW-%7P$9&^H@5MF_)-_z(u;t zSpKUqmx288UybuX2`j{NAW_Z(rQg9k%L^s%pp4R|P)5-mD5LB$lu>>P$|ybvWz_6| zGWh#e|Ns9V#_6Aj#Oa*~;{<kIY(B<v`9b7=H7N51g82i)?DhjW6QTmjeuN|rRt^<^ z6$wr^LEm3R{a2gRdDZaH%nE+axBM-S*g)~e^8N3BH4yhQ8w11lzs<*3I4_kjGrsbG z>UtFQU#;`1<|UAl4Nx6l|EqN#?YsaHoQ)7{KE?vdPR++yG%x&D`+ft#SA?WwP6%ZP zp}yacJm3Jf=KBo@b>Y7nGq?l>C#s<DZ==8=1v2meScT>#uuStYj^ix)pwb_~)rN2n zK9FcW#&Yn7#DBGekHE}d5@4;C7j}SD@K1r51mjLc<xWE7PDABRN99gN<<3Fn&O_zS zN9E2v@L$c^jitAY1K}*g1J+?65tthxf#U@8<9|fC`JY7_?5Y2tnyUF23naF@;3|3G zW$J$(h{|RicE<l|kiu~p3vwws1H=QD>3t9us3JSX-_*duz|eV=IgiEHItNr86o6!N zz}3N7{-z|5>{Wzp5Q?k|3j+hRj13R#HDT|y5f420lIio($mWO4pO?hNN5b491=0tv zJb6Gouv?fQET~()Fr&KV2{QwOHQX)Nm>C!}k1}3`xbp;x+%9Gmmx%Y;up1uuysU&( z@<8*A|6qqeO3&t}e@a{+bz2+A1bD?)!OXzm3o|?$Bn7uP7G&{N*TC@3m%TRPAP=qv z`K-A{g@>Vpy*o#Rr_&W&26noJbcRNB`YLq$sIYX)sC4>DbjFHw$ANM&q+;lF6#x~M zP=&ERFC&>@RjTC+{&r4gaKQ-594sJppd!>qMWr)DMFHK^&d=I0Dk7b+0-c9CUv&GZ zsPx9D$T0p44GRzNeBS)zL-QMfP9GJX&KMPr&JY!rP8OB_p&Xrm;^X6DK_+*)`ZWJw z;BURj#K6$)q9W5BqN30(qXIGrR4sMKLG9=0M6;g->?>E1&KKPwDk_Y>P%MO6bQx-o zs}HhOc_6D$t$DeM5mY+yAWG!sV?3ZF&+%Wa^BAZC&tqvm%F^x2&|S*Hd9sA3`6!2{ zwJSsE=k8LL$p30Dvltl|x^?(L;l#q<`QpDClq16539r+cbyVP`fAcX&t#{LfpXG)R zKS%Q$mYXsv5g;pBz+xp>#9Xk5rJ#!4cHw71HY<yv^XcrHwG7>^3;_mDg1STaIhr3a zAAH2bai!r5Gf1TiKTGQ+{#H%~28M<+EH_vM7#J8jT^VlXGTi)gTSg@!Dz;Nc<))5G zEX-{jAotyRdH=!edHgP{5)2Fs{O+tWAj*kVgaMpxa#RGGkFhk@@-XnXGJ%C439Xw& z1ypr+x{7p$N_6@vz|&&qiv&b!0i_V0&Oh<ZKNw1QI$eDdyIp-=?qpzKNbGhE=?;zf zuLg-tP#Qn(>chss!0>Vw1Eltc*mK;~2jriZE$E`mAhmhuqU<2i2y{_Uf8eDPx+tja z_EHC3lmldf7`iAoNEB2HfZbav(Cz9I7a1KD7Z=xjgeNvGKKk%x1_lO@iEIqlxnL|d zZWxOf&JuyM{)2)OM1bl4AeKF-RS&WT)X}NtW?*n;U|{fLU|@)3fb?)cVRxK?f#E6x z1H)qm28MhF28MnH28NFe3=BUR7#J8C85npNAw4B!Mg|6bMg|6JMh1rYj0_BG85tOM zGcquoWMp7)XJlYVXJlZw&d9*<i;;mrnTdfxn~8zJl8J%AgNcD5oQZ*9850A;IVJ{% zt4s_GcbFI$9x*X6yklZu_{GG)z{AYIAkECcpvTO>;K<Ct;KR(o5YEiN04nm9F*7in zWM*Laz|6oP$HKs%%fi55&%(d}D%yQm7#N~h7#NaS7#MO`7#K=f7#QkU7#P}F7#Jq7 zFfhzyVPIIq!oaYeg@IuY3j@PR76yhZEDQ|ySr`~zu`n=vV_{%mVr5|9V`X5FVr5`Z zVP#-YW@TUqU}a#4WMyE;VP#-wWMyFJU}a$FXJufR!OFlepOt}O87l+BT2=;z?W_z8 z`&bzmj<PZ^oMmNTxXH@E@PL(p;W;Y<!#7q2239r(1_3q(25B}11}!!Q21_;u1`jp{ zhHy3phBP(?hEg^Lh88vkhRJLU42#$p7&fvoFdSrKU^vIdz;K0)f#DV#1H)4`28Iu8 z3=BWm7#RMsF)*;OGcfS8GcZW8GcYK#Gcc@YXJD}4U|{IvU|_h!!NBl>gMr}@2Lr<y zP6mdHoD2-tI2jl~9h4WG3=E)d3lA3qgCG|JgB%wFgEkifgDn>WLn<c&!(&bc1}Sa^ z1}82ChA=J$hAb`yhB__=hDlru42!rJ7(Q`<dch0~plr*=puzxSX~0>a#1D}*fQy;H zSr%}X4V>iwXSu*x9&nZqoD~3Pg}_;$YzeU~1}>HWXMy_f5ZMg4SPq<30B3>v{Sb8( zaIqRVs{zge6&Mh89dNN8IBNo&H3iO^0cXvDvlhTvOW>>(aMl_)YXh9M1<nFB&mb<? z0~b30XB~mFPQY1b;H(R9))hGG2Ap*V&Uyf6J%O`cz*%qLtPgP37dYz&ob?CJVqk=& z5*9d%1I_}KED#?Fz{N!1ED1PE2F_A|vsB<L4LC~&&N6_rOyDdFILijka)7g3;4BX~ z%LmR1fU`p2tOz(O2F^-=vr^!!3^*$X&MJVjO5m&tII9NEYJjs^;H(Zfs|U`S0B22s zvu40qbKtB6aMltyYXzLO2F}_5XKjJAcEDMC;H(31))6@C1e|pS&bk0+U4gT1z*%?T ztOsz`6FBPyob?9I`T%ErfwO+VS%2UxP+<j0VJu9rl*j>R@xWOEaFz(1B>`v2z*!1# zmI|Du0cYvJSq5;H37lmCXW7764sezWoCT^cA#V18iv_@0A#hd%oD~CSCBRvFX_+~x zpsJsNf#KhOQ0<(UTaj9knw+PXSey%yKpyu5wGfyYK_i=>)(u1+M8d{AL2Qt#m>EH% zo}iIVkO&0pB_<W;=ahnqQU*}FgP9>Qw<5k6A_*0VPf9F?xd);q9yFR-oSF`5<v>J0 z8bCZyn+YNkpOTtXn$Exg8i<98BxiyOZw63f6e^Nd1ojWOh54U>ftevbBNa4E%K&PD zLe*sCl!HtMHAbN##U<Gw5e0B-39PHQ1Z*;>W`n9p%SlWxW?%r-a1arY4n77322f3h z5CPc(s?#7M@u@{c`9%y2pxO%}0@9_#z`y{i#ULW_1x1-4QBZ9L6-mqihaad`gNT6S z^%xi!K(!k}#FBx50aVK&L_jqssJ26h_%kptfNDL2NEFC0B%fwhp~XdRVtQsWq;-kV z1u_-XhDL}KF)%QI+Qbl%_>6dP2%*GRT5)DoDi^}8<b04Z$T66b2=*yb3}!%L3^@kl z!Lb1fS-4%`m`94ig3_d%%;aLE7|cs7$t+7PM#Lb<+w}~{F&JM^npBopRE&th_!4j= zGl1GG5W7ISx)>N3Ky4R<$W#Uf22dLYAp)wyL23~q8$oSmxZgo?`=E6pLd{tQP-<g< z<_nOTd(gH%Ld{zS1_n?*M2LWz^QdtFsxuLB0WwFCk%0jb7a$QsMg|5@e+OZX6C(oy zB6dJ(0vQ<?K>ZPf8c;2U$Z;Swd5jE5ISwRJ%gDeWh~iUFZ6t&u0;+d}QA9v}21G1_ z%mMWvL{Zd$`V*iI6T&^$Ks^u?HP0Ctka9Q398l>miK2#`iGe{1MMR8=fk7HYL=9SA zBJ46{LeB+mOz5Es>dhchFUa;xP|@gs9H*5akp^Uu4v+{meL$E~Arz>Q1gfYQ7#J2a zLHcOm(imhg!+Iu2j}0NRn+ei?Lx`MYg7oGPBG;K9eK~~4Lna0WP?|=Fd}4z1^$;R| zm>3wALtO~!4>K_EGBYrM`iKZMlFSSYpdKSaM3ouRe?*8FGedfl2oX@94%DYai1;x> zdzjGNz`zjA4C!wo)TA>*dY=f9VrEER6d_X2%)kKZnIc5GnIZjDgvd<LSQ#S&IGiE= zTFwmVvm(@NWM*JULQ!*w8B}W`>pH{Cz)+8(<}Nb>LqCehYi0(9Stugkm?8aTgk7K^ zMNm#ai14vM`qBsy8BlK(ZjOIIypN|#1h{{VP@~1d!0;8W29#W^Ss?vygc?^C1_n7M zWM71_K>FthHHj>c-a0}gj|I|qM~GCjKzi~J5s-VFLxOxjIRPS)lU!1i6K}|n0k;bx zV#H90CSuG`gC=6a(2XWy$}j~@#EfAcT*N;hJ{V*>XhZ>GdokE{6Nc?@H4qU~h689K zW(;TGBA^iKV1bNEK+FM&OkshHQ9wle1L7l`J>0<~77!7TnguKj;PDHD$Ql;NXa+)L z2PiI3>^cT&+<;O!Jk4KVfsB1XbomFw2ZRQDfJZ_gA|ShNu|UQ}5F$@lAfqG*k@qZ+ zF%yUgD11U3oxMRLC~y%ESH}SGcnVx3AjsdD0W`V-7YT9=fsC~vi}-;@Uf?3mjy^u% zaTtgQ$c4Y4qcRW?|A2U}P~QOX7!5)s$khitVuKKgat&etjo&~-K<2QqGBAX)z|tzn z9KR^Y_zpx3NW?V|GTMU>@pBCXkNqG-d|ZQrK_fxPB7xv>A%uu~P)HDHln6=0H4r>z z1Q7wbN01dVf&>u(*&giU8VDLsf{1|BNV7slmmnfwHSVr~ps^;nNU(<wWaJ4+BnUDN zg%An$2m+5vK}0|%tFl7Is1PDXpiw1w_<+>dvqHwN5Ndp&qgfCUP)hI(^#PA<K}0~h zKqFhAQ7(uGNR5kU7<lXpA_7vA%F4iC#R`iHkVqjb1A`x2#6KWD6l5}Jqzs}9Bmy!A zWI99yq^lY_iUtw!4~Tbkae<7f!9{{YoggD@5D}2Bc2>xE8$<-8%g+Te`UV&A4`P6f z#lb})KtiCAIk<?Qe+Xop4k6;|4jHwBh=A;x1RcYJh=A;Jafx>Zjp#u{Kx*bd$M+B- zAbUWgeF%|F(6K*=h<`wQlxvVbcq9-a0x}0QRtOpwM2MV#juIk7uCPMJ3?U-^0r8+D z4<12;i-3|mcsvm<0!s4W(M2SYK*(4lTm+Ql!6T0d5s=ZKaY(pGFvuX#s3fvTAb5-t zAp$Z8G-8P);u;7Zzl4Z@d<q%`1&wARMBcDM#x@ZmKUg6nod^+T=(s0D#6KY3)6W?) z3W_We9}F53MG^4?jgUe_K(_Ni$4e0+lF-pph=_kcyo;+dWGod~Bt954vWg<&2^wdG zi}?D71%pRjAtE5VRM;38tl5!siWwUNLokX6Xw0_|MI?%ifuSER;vW$2>>Cga9?M0T zoWsVza2&1%WLF&<1H*k3kqK-J41ZBXK;y`g95DAJ=N1$jGB7Y0!$tf9;@v!be86MI z2)nkhF))DEMIc0uu`w`|!F7Rbzrn`9&<+>z4~X}0^a%lvJ0o;GW@BKO4p#%x^@$BK zE{#z0hYd19jS%5rhm2bzM8w!3qtXx&h?`x(W7=>LA5TA5@CY|V1Z0;IJ7l~YA)><$ z8U03xn6X2~x)CA{Alo@%AqFzXhaECjj!+ZE&cN^!MNKL@0|O@)vaVuw1_sdRIzm?+ zJ7laKA=1ST8F@#DOk;<P!$U;;1LFPs10bXF5D}1j7O_Ld<q;yFQGd`VJwjv;J7mlr zA##!(GJ=l~xyB9|&qs(nVuy_GBSb#3Gcepn@fR-#1H*F^5k(Hjd;mn3e?YubkgKCN zX!Zai0&=q+2LppHH*)xZmh2Rvi1=_YFo5QzAi7eEisF+Kb8;r4s0rs_U|5bKlE}fp zuop!nkAs2XGKxqI2Lr=P6cJF${f{CtnS+5rln3U*_@dO3(xN;DZMaBIeo9h&Vjg(> z0@PK5^d07LK>ETEk#xuq2m`2B3lafg28MMUh`ADo$X*nYvm6WzV6P@6CTBCmmlmfM zfkz?0EYP?ZLwrGEQDSa#era9_Lwr$cacW6CXv7N21PyS-7grX8LMuK6GTasq8h8OQ zGg1>%;)@yLK_h_iWvNBQnfZAP@t`3&I437FsVK21Gqso@J})shwIneqCl#R;Vv?h8 zM7(QIP`sbNpDP25;~L=^0_Qje2fGF#xWS+{r)y9UT;9n))Xyat&h>Tmb#!)i4MvD~ z`h|J=1&1JXfQ|6+4~OdkwOWz+pw_38qq8?$fuCcDXBfhLE}mhYE(mV0kE?3{T&=IG zuYXV^oa^Qv<m-rVewb@eu&2KtT-wh+#0}&DxPYghi)#d&=i=%V>JI05`XPl&Xs~OL zi(`l*ifp_Wl8OMwAV*(BIJo%xI(i~(c6ar24RZ7WYj^W;bdN{a1?D>Y`vy2VLtG9P zaEc6Z^$&1HXz=rQ_HcFfhS&g6667Bq3<(%8KgiX`-x(C;@t{HBc+i+IIElb{pe~-j zqf2~1kS7C-4Jz(o>|hj`;CN&?PX;|b2SZc6#FUhx)Z*g!{A`F3E>7_fDRXqGAXhiI zc_22-G!PqM6NCqqbN2TO4uNTcaG)}dE-pbZ2{0Qf9vtEi7YDPE#o@MqW#Ik+^T3Wa zHbirDa7Yl;KgPz$QpF`jN%494C5B0rC8-Qxo(Y%<YH5SK01eV$5F6$M5F6nH2oEHu zr{`dTZZT*mAl?ZS#wI8hgW5|j5g;Ffg4+|qjCTTY9DO|9{or8&=73E14~X~m4|9b{ zfZ0&-fY4wMm^he?EDj0Ag3{uQ_?-Ow0+0=0HO_EWFqj4E(L&Ns0H|T@69N(i<zcYN zS*5uJ@g<4bsd*q_FL2uv!UDB0L9Ad8pLl1mT2R=5IZ$T=djuiNfH*K27tb(oYAjC4 zEQ?ReOi9T}WdO6&^Yg(rg~C*T3=MSxD+Yy~Ul^!30}1+u`ox3%0&2s<><6=<mVnt{ zKL#TOESL>d;Tni=AD9gl_w<8%2*iYny12qcK}?V+C<~ccA}1`6h`9lV2ukt*t1-e* zV}c=qk~_h=%rMlTWK*yj4EI=|xF;<$CnvrrH8G`<AtN!TBt9=6RI8RH=71s-S{;DG zH!?T~6eb|iU<ezQCm=i*h>Wk3zYmxd<ml(_3T8$6hB&%|SfDWmSj+^6dxkiBFyt4+ z7nf(2BtsJ=f}5I`0@C8_80;G21Tit(F#w_4F#whZK&cp(f!uuj9Yf+lom^1!6U+hi zZ{ZwJPZrJrbz<S15Py($5dA^mIs`5S=IRw^XBNaK=NA>FCYPWo)l13GOGSt|`vx#1 z6{RL-gPRMG=`aXCFF!FUzX+_|(=W`?$J2!Y)PO230W~S$tepIEuyAf_ZentBYH=}` zmy}<cmjYpCq$U=?6s2UAWu~Muq{kP5<m2;F6N^%dOTe{6enE16N@`AKaS5a;fy4&@ D*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 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 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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 IiGhIu07BrrcK`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 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 F3;@TkTUG!7 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_lOZ1_lO31_lNu1_p*H3=ja~*FcyUqyqy3!v+Qh1`rL>55gezAcgVq zC8-r9AQlA2$A`E^gh1FZ5~L5LAI1mMEMO8$fZQR$z`*c<fq?-etiZ^?;LE_k5Zd`P zcn3%Y|Dxs}j5XRjK$h|^Qf**oU^w`Kz4-@giFor5mJ*?ZulSoEF*g5VC}9VydCg>a zAUgK25(5JRA0q>UH3I{K1(a>ez`!8Lz`(!{G7B0GFg8PCZbe1Bb3tivX+c4LQ3*pl SApyO##LOHFWqPT3DGUJRIzk@+ 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?8JNH<QVEcmAj}5UD8Ps?8zdwEA{ZDL z*cliYn4xSC6~M^Apa^0>F~|%MQ;>lH#U%}l3=9Pf3=Av`3=FJL8f2y<nt2}>85m+g z20$^)JSdkTwDW234iJZbQS%SR8tok*1^kOt8`v2b4!&S-{=r%z-u#25MCjlv{^m!F z&A%8**uiREGZ`L;jy=qvSCU#$!k|~2QCw0~l9<GxS6rD3p&@*b*?2I>I+!#I!^i(H zHi!nrj1dC^gEfc)#*7Re3=9mmU^a+gWB`Q=hy}s|42&pY2jVkiq~;W)78UDOSeWT0 o7Uwb~=2le1I~SA&mlhP{7nLx?6B5u%OU%r{P^OofmjbdA08ac(C;$Ke 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{XO0Rr?&QY%UzOfc!sz`$U`z`y`f0~TOlU{GKPNC@qG8oUD} zz`w|rk%57s#$pGE;$NiNz|O#M@CCaqD+2>ViIOb~h>|||iofv@NI~N-kfstYu<Dmg z3=9m02clyS>!oGpq=IA^7#RNjXJANY%t*~CNG&SXt*|iDODxW1U|>LY8ptSSMv&v6 znxK?kVp4H_PAS+2|Nk>EFoVTGZU8Yrx<FPkFo=M-3=9ki5mg2T1}~@xM3*%K1A`A- oB!Gc|Au+e2BHp>6G`O^&Ait=DA)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 zcmb<-^>JfjWMqH=Mg}_u1P><4z|g>kU^{@B4h&ojj0_%~wjkc&uyBukAO;9~>{J3# z3=9l^J}-%n@Mt{F!@$7c(aG-7c$^Ew>ShJWdvvlN4)y4K>e2bhqw}A~{)#XYArSW1 z2_ixG|HatD9y?%$9cBjUVqjokVqjq40Ga+D0zjsNq(JTl$=QQA3=9nBP#PqLtR5;1 z^`|03Gy?;eodT5*W?*1YfwDoA3xgPl0*j%Fi-W~MgbRZr*bE3;3G7A)TZIAUZWjhs z240XL0|SE#gBk-&w+n+hg9Kb$lR*m3)?$!`vvn9`;A~w6WjI@(K@H9}V9<rLjTlTA z7#K`3`~nh%C~`rHYZnH4BsV)TfMW>kPG@jfgLJqsxG`{p7+`S^22nWMlR+NN_GVCI zU|?{=u-6Bw0_68lq_7Hun+Xel5vWQ~S^>o!l*^z1Wq`y%7|La^fHFX0u(SXYdIKUD z7#Kj}d{8!sN&zJls5s1@An_?k;+!A>7|u&9$t+7P)=kV!F*DIiEY4*}%&n-1cd5)v z^vugFv2rs+2>2#ur=keBmF6Xb1mfX(Kq9VrDIh@x2ECHhiV_CBl*E!m2EC%xoJ6QV zaY<qlQ~<&Rk;NrN40^>SMPRw&%3KJY0Tp2&;7$gF6F|;Jbu*GA$O{NbkZX}7(YVg} zDXGPoRjCN|a1p({_~LvtoxvrEMJ0O4i8(n~C35r2Qqd$_^HR`6z-BPG`}jLK`oz0C zhPc9_2^$THQWl1f|FOw2Gq7L?zXgjR6?R}g1H(-)&B6dHTfkff28QEc1`9(Xm_`um zz)ThfPcV%jrh=I)48dR;m0)JTw6`CugoPmoOd|+T86|+l{h+*uP27NifdM2ADhCm! zFfiER5ch?Oqx%<BR)Wky7teyKM-PWu9OB4spoHzjzyL2_k<Dp<7P^R12U!-uHo~F* z3{?M5gi@?5D`<U$E_ni)v^IbeAXE*g9D;>Eth@(FgD`r`L+V%tjCdD7vj|k5K&?WN zSp(&HKxvS7K<d!#XNT5(AbF@#F!cpYLh4y46HI~305hNj$R8m0L%DG350o_nDhVr3 zVfta^v>XEimQ>8ZFa=uhPk@>Oav#X8=<e6V5q~Nm4Gaw6x*ci+n1VV7%mxtvnX2)< 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 zcmX^2>+L^w1_lOZ1_lO31_lNu1_p*33=ja~AAm41$YcfvhA#{Z3?Le$AA~`AK?>vJ zOHwOJKr9H3j}LK;2!XI+WIR+qh#$cSv7dnj#Dn1Y_>{zwL<k#1#>cxjhB$&)5Dd}} zQXUL)Bt!^<1i43ofq|ibk%55+B+JCWaD;(@A++;pw=2hDkP$mT+G7ugc0LUc>#pV4 zXU)LCuv3bGf#J{RCEc|g&Bs}~U3og$<KhttcT|L#2>mbR`CrNr@Lv>UNb?aMun{{z z8e<QGY+~?%ge8kKBwSgb;lonPz`(%A$iM)yXd;wt$H2g_49X5=U|`q*Vly!?fXvQf zU|`^9WMBY^dqUYDz5Gx%$TA%$TZn;yAp*(<sRyfr+6D3_$Q+P*Ij9<tdWOW@ii&ub z%DhC+yv!1YcvLQ&=bM<FiX;i<!X@2G^OBJy!CbhcbAC!{ab^{=ZY)9|J;5c3MaVAj h%`Z#!PfIIKMHU1pbj?d)aQE?da`cIJcMNf5001xZg>?V` 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 zcmb<-^>JflWMqH=Mh0dE1doBi0V-hvrZpJY8JNK=QVEcmAj}5Un83)u5D#U8C;<?` zz`(%HzyP)%X3GIa1_l<W9EgIkc^Mc`TylYtfx!@@0E$6&ftcb93=B*l1{4c`IE)Mo ztPBhc91IY%L3YcdnJ2)^z;Fes2SmZlQ)ggc-~<Uk@dsuG1_`J+AT=QOfy{+UGlX_N z?RMo@4C3wp$;TcJ?R**@)?Lf7&zgaOVW$)W1H+%sOS)@0nvb(|yYh6h$HgNQ?x+Ye z5&B=s^S_iM;J+xykme&iU?X;bG{znV387-WlGKV42ECNTl0*i*;*8>wqLRcU2EF3S zTnG*27p3MvRHEv};DOu>6J%ld_#egw(Wof}6dz0s84L^zAdi9MK`~jwz`$S!;ecay zA_D_MC=&k!oDE_yF$jVvC>CH~WB|nrl*<6(>oG7e2tfrvd>b^rH<JAz`A9TAC?;U` zgXFg&xd+5&$V)8AEK4oct*|iDODxW1NX)IMh<B;XOZ3dkEMbU8<-&QsiP@=0l3*@e z(ycTv8A%cgH@GCR2-$Go{IXR4w6x+>WI>QV*Sr*ji=6XQQj0UIkS&G_x%>D#Ir_xA gJBGMILkmKI^A|G%gES~Mm>3v*Kr}3~F)%Oy09r1PT>t<8 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 zcmeZaWMbI*TOjZ$0|SEy0|e-mq*jzbm|!xVfq@}~fq~&Ln8(1t%)r2)zz~q2my%eL z2o(cSEDQ_`4;dI3KxTpXAnd?ka3HkvX}2rKVi0!+BLf3N?BUSPr{Q7UwH*7b85kIL zN-;1n{Q113yOyK*I7_!HPbYg^JVN1)iZBzQ|D`<tOF07mi-HVkKEeYwVh2cL>|u5W z1_qGTYz)#23=B*R3=C`xK5#LR2EDY*oKz5lfq~)Qe+Gth#=OLm%(B#C-3kjcy~N^N z1_lOXPlFuE%n0%}$g5C|AT>xH2HC^R2(lL;4`S&hCKc!Bl!C+W|9?neLEHzD1(^)e z$-p24;xaHWAVd@yAfgBneGCyh1_lODm?6}Fe2OX(jid(R{(J@o29QpWE{I4A0|P@S z)OLu-G$av-3s+!>?1s7-B+ty?kd~TQqGw<LG8N*};|vT8iMbUO@h+8liJp0xB@FSX zTsY4+F*_AW63m55x|QZ7BS~W62A3ojAsg<SUzX~hmR6jKEC|x)nwNrbk#l}ZYH?;2 Uvc+&AcOQQzN1u3i#}HQr03E%Q`~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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ⅈ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%0D6lXq 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�vv;b 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%0D0)<bDth3ky)& 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�|Nty2CYN*12qShu0U=8sV4`6^gghbZUMy!C=WsN zEjSN(dP2HQAT<@X(k&o&f#Mw&Zy@oAI;oZ`NN$J4`$p(G-~~2dKY-h9AbUV=oM0>6 z5@HJx2k}7|Bi;?9TMBHb7w<6lfM`$}1koV(gJ@703Zg+}D2N8hgWLqdAT=PG7>ukB zSv{`&2n$DKwJ<i!-a9tv`4JW?koHrIy>tsGTtV>y3RjSRkls6WQY{%sVGN6xP0)C; zfTS&uat2V`f*5xkP~!w7h8`~<_i)%zFJ55o0nwoR2ckjl2hpH28$dKK0|Nty2FZim z1i~OSpxlPER1}<M!BriSAV?i7f5Oy*`yfcGE<tJ%>ZMvrkirCH2MBM5=1&ECMA(4B z93;m82`@&F8c^K^qSY7}80J9Dp;rE!;~?DviX%||gq8_lzj_wC7M3RFz!L<>A4Qp& zDbTJUSPh5|?GA$ZP(7ev0($|Z2Od6f^E5!(40S-Hk){HY9;k!@L<VdEBpvEBNVSw8 zg%MPWVGA_;5+Gp(76$nT#F*j?2~&_7&{{(f4LWmr57Zo8=;3!DH-glYgF$+aI7qjE z;tUji&^QB!g|kmEw1k8BA;w9%1>`nRUV`NXkp2mcQY~AM+z-o3TcLTW#S!8UQ2qzm z1#)MJlXQ!P6GR-u2VwNQ1Zqo!I8rY!!Q2C)L3ss4gWM0IL1i3>29<Fj8YB;L69|LU zfM{Yc$dB06;VR=`;fPHS%-#cz=w%!tW<Y8TT%=n-;R=cuP`HB30*Q+>NwxSOg)uB% zwn4|LWT5E_q#hKvAbN!>YMg+?(BlQ<o;Oa^ix-%CKs0Df5JZFA528V38;Az2?*Y*u zd61hx7^DUq5@=-=EWaY;&`UH(dY;iF)e?ae1|Ty*csn#tenFB0g)vC(j0-q?7(r@4 zWg3VEm1#LpwbUxpGF+uwKyd=fldy6C<X>o61NIuoJs=DcFG|iShLvmxKBQy=@nK<t ztX~7FNe4osmt+tVbrfK-AgjRTf=#njiw7hez+y0B2Q=JtkkSyyA0YVz4{*3KfYgB2 z2Y_f-1_p)(s5yF6D$6FgO1FUG3KVY8xB|P`%{K(4EYon8ZUMOslxJXR9u!U$EmAEF zNbZN_nVrzGEWi!o4^Tb_*#+{OgS&JKi#tRd#0O#YJOe7r6x^tnXJGCD(V(&lM1$N9 zqCsUDhz6BqAQ~hOauW!H)PQJWFvySC)Zr@2VBv^O56s>kH}tX$5i=k)e>|jHK;a6C z7f`r@%mRzINVP~Hg)uB%c0tRs7f5oTxCQAu;;9TCI{~p_7(HG<?%Cl^y?BAS2SkI) zDi95FKZpjEWgr?<mVs!HJltIj3=H6qz)_YV<gk}z4XsiwD$qOzGZRGbhUUowNOGVs z2FcCv1gBX>kQz`~2BJY_nFUlWwaPLRFX<LgoPhEqtQ-J^3A8K%dky3s5C(}CrRA2O zlx1K(&aw=wUjwR12STHlWndEwbrfK-AgjRTf=ZiIiwGnfz+y0B4>a6<AjyIJ0g_+f z1r9d`kQz`~2BJY_nGaMgwZhHDTe<}lSD<i%#ueDj@$tEtDLL^4Mfnw#AoqYUDBR-X zeLY=#;+_5df<r)JAPf?RmHo)_kl6;13P@ep(Js}J0`(U}6ha<^h695)#Lpm6kh?(i z6o?ojNDU}0gJ{s0Kn>I!YK4P=k8}$t>_OoG3ww~i;)7h>Kn-=+I5NmhAPka&`x#9Q zY|sIuMx#TjB?RIJkTy6z3ib0BBsq{9Knfasz~R6MQUe-m0MVfJwgphN)bg{8uXGD2 zoI!quhBG+sq22*G1<Z%}6DkggR&Wua0Lsd6bq6}6T09_b2aCao<50gofXac&e30EB z`2t^vUqNa>`#eB2sGNv^s->1+dHkeXK;aAWD>Qt;egnlXs80%+3POyv!2FCR4~tr` z-keUU788j3L0*C5b5Q?YK#~L54^j}}2k|dR4QM<GM1$hk2db7@{{7-7-2w_@kbj|J z40dyns~bvR73NQfI5cWKJzZci3rfQ*T~aM75O;&T0LK@g{@j5i2eKEWz{elrPmmf= ze1m9EzBPfWrItTm_)E8d!WQIDXxM`N35qvx0~Rggg8T#XGlm*y?1I#+>5^*Uf%pOB z9XP%Y_467eIglGb3Ty%(eg>%l<yR05^0Nk1Ew%i7BS5+Z6wV+&L&F*D=O9-%u$Mt@ z0b!6oV19+kVa70|Y<B6EYGHu5AEXtIZ$kY$2T2ZOKS+T=AjH2QHK6t%hz8|d5vW>f z`S(nqbPFhqLH>n?G1$ML_ybqW1mYM)4N@Gx>6U8w0Cg+KKQR0N>gNd%|AB=;ZU8Y9 zf*^hdsR6|?hz7+m4^%C+{JbYfx&;)@AU{LH8SLjES2wVCKyCqHv^WOK;fmvy9;ucm zP<Mj#!tf)ge;Xiv0}F%f2Qg%VA^rua0mU(h2F39Ys5#W~?~Y*U7El<2{0j|Zuz%x& zBZI;7(((QQu0f6={z1XenOsP^g{5z7>Yz~#Hb<vds^toj|3H2N;Wtpf*FgLU5@G<k z1;jWK0`WUY4am<R8g%aC7pOVZ@_Rz4bPFiFL4JpZH`vX^pkooz;Y+{3Vg%QIg=H3( zCgvyvmz1Vt<|`N)=^4a?Im4HKp%@8DJ5Pe8TR`|iuyo5iTLuOW=-RIbq0%iN3<?KO zUvD}C1H*)uvaJye3=9XpBi4Q?ghBK%+Ckz2v|bFP2V{1<r=N2?WaBtU2<(1%d?Dmu z(FB(7=#y%h010=n9vJZ-8c!;r;5Y#bgTf8OXb1<3F@n^9=8Zr!XufL+)EsKXlR&t1 z3n*=X;t85Iz-~@1DoIIAD~3lD$nO-!6S|RLdwN2pTR^xXRJw)9j)5T^dfyQ!3}6@( zS1>j*4RVuB7^*&4{DR~%Oq5$P+#vA}3OnR@M8Bg2q+ZDxG+GRa^BG~%Eub}4Sy1<| zLemh)evn!aO$-LL6R@d!kPBI_hAao##|pwAv4}8f@Le#VF@u~ia9RL|mrR6o3n-0% zHt|;=iO2i-1Uvf%pwt>5cS6NogM$2nK<0ulNF1JKA^O1b3Py$|<|Y=#W+sruS|D{h z`lVVNAZZb#6^`@VAooN+K#~Kw4Wu9<0_<K!kQz`s5JcNEFfc?w)lw_%eu<E70i|D1 z+J)v9a2TQa4HhOSdD3KpREq}GJs>y3a6Z&uJ0N}l3xn(dF+w6C{sO51wR1r<$bTkK zwbb(0he+ubP*{Te1r1BEzv9E4K}+4@i&9HUi}FA&f}~Zre^KNWARXHHAlH!4AjrW7 z&~+DQCP=mLK>PwR1WMLG{k{cB4&)Y)v`-Yo?;tfGzk_I11_lNds9Gg9NXiAJ8IXE% zFi7u<DCrhZc!T^74R46wor6N+eO-P1gCb$^3AO^H2kw7NH7IdjGEu691L6;`UKr5` z_4gX694OC%+yRo0sgnbZg)xHEfYzIUXi&YW0#!?`I2VbQZUKcg$luVghWI--H8(lA z0A;*lL#%WQ$bF#Yl`9g!@d8onn^@tTUz!Ko;0OvEkROP_AV1?%hkm}{m3XF>9nlcG z(e;7s<%ogEk$U#ki*)H0kpDn_TapDa17zNe80i*}ogf@?l@AmrU_YbV4dS~%?FO+y zdYjxB7(nO#fM|aP1_lrf8g~NGpy6{64Z4pVM1$l(`al?@H)g(c%bq^z7La=+79reY z5i8vy!XXI8JRczLf#d*?PE>pai+e!#Sb*$Hhq?!Jk0FQ;I^P#WgYFXn(I9!4X(0E+ zhb879^QV+cx8&qP+!s)VaNmhoY4{z20<jQrP<;l|i%ge5<w0T~J3#gpL)}#drSqY5 zA(Tdz2k8T0klqi`(k-C03<|FasStZX;vjk0eUCcObOWl}K;r0_B@UtwBo5LGat~-> zK8Ob0`2?at_jiEkW~h6R<w5#D7^D|O6NAZ0|48mcwgY7E2dEsW>0c+F{B)iXPkx$Q z5>I}50r{QWxUHEi)xrQx4<K`3^An)B1=X!N3DPZB5+G;JfzlO7&50E076+&vP*{V+ zU>G$20b`RwgUo^138Fz22Z#pkMF7#DHYkV&%?*KQ(4AN?^O5y_NPwI<2RaweAr9hp zusR~ovIUt9@;8Vk)eWGkA_KbmALOQZr_waA-Ozd;#wJ9QnioLj;E_Z`o<%kv<c>d3 zIa2dNNfIJG+d$0#nTKpXjBSyGupgwR8G3gshz2#4Ky(}f0|ST#m8l>)6Uqn4!^{Ec zeUpTl7jTvB8?e}04K){3MuF@phw?#{IEardk8Cf9jh>HimDw7}nEnNojUe-<LhS?H z-3{V{?ivBn$nqe&Kp5m-5KRmwCtch@awoDKAbUkpAbub<T?C|%pDub*$d6l)`^k-; zDO06dbf9S%WDcyH1H}udt_(?)ZrPIxDd#}#ACQ_mnbIvjP(7gV0*S#eCFLB<P7n=R z7X_k0ZF&$5+P?v!wV`Qf8q7jy83K|6x%WmYq?`kl#VN@Uw}X`uS<b=C0nwzoAwD-X zH#0f60Bj%BU7)fKd3_p8ju1_1ng*S#x*-jcZqdyK#nB6>9I0u#ARUpWHK1mI%tN;W z#8*j2*bh?E;>N%b#lXM-qCsUGi1vl@!=N;1j0+?Vk_VXq!XUk%aD&VcL;8{o83=bI zK<&X*_N{@+!^{Gi54!UgM1$%_5M2wkA5<2B_@Fz;K{QAnqz{Ba?f|u6L2XA++Da*a z_zxrwl85EF6ll92SD9#&0nrE21JVn!XD-zKg-{xlo<ZWXp?qX{kUkIw=>^fmU~<yW z2PAhQ+X1pyBNO5WQqxaLCL-QQO+O2e^pYCqAor6SKU1blwTM8|I>;PYnFxv>(E5Ok zEa{dDS&%Xjlr}(W=HyGaSU~lF!V4q@!<3YXFgroCJ~VBB%0v)f3d#qy$3Xl=Fbkn& z4@eB;-Zxp0G7(g6S7bok4pvHJnFuonM3d?USeY0P?H!_r4cHwx2y)W!mTX8mMK=;; z?;EHb$!R!;_%y7MgRmcDXDjq>HV_T!LxX5gUmiq*%03VcDkDKONFL^Hklrsy_7Y0} z3$WM=y6+ieF6cf`5DmIR4@85?IuH#i6G1dc9@$>dxPnA2r0>3EBE&x+_q60nw-B4B z400j*K<0w<g6x^kz`y{aL3gf$=owHxsH_9=k>x@9Kp3P~0W_|Z4snl7Da2fmI7mLC zm%jysx0nio$6j#t-49@K&rYcQ`=RuDD7_s@Bg=#A0%4fFAT}XPPWmm$gZK~KY>>Tc zpmL<9-xqo0r(czPgkDn9U_w6m=>_C}P`rXLsd3vgQ>sM+n%6<*z{+n>8UvMw8U@lV z6AB>ZH)vcBq^6`qy2S>n2Nc#IF&L(#{D#>HqCxFI5DhB7K{TlR2GOAM8$=_Y!3%N& zNDSoOH3g9J8&t>q$%VKb>^36HZ<skCnp8J{`tGn6Eyzt^dx;>(N&5wbxYPa$s2r(j zU!e$*ehIZdo<QvYc@N~*Ht6^)hz6Zu3!*{uMIah9J`18j<Fg<dBoERD!XUjfknAOt zZ(@oN{s!p<nODKUzyP9apfu?GRuCUFh7O`Z<DVcJBoDF^gh6^iG_hs$6)g6G`s5&U z`=R!N3RMul6Us-H2iXO}Fnd94LYSO%(NT;DA7t}E_8x%Bk(w_46qBDWEJ_f1NsU{O z`^k+To7qw=FQ9!8kU6k&4HQ41GK8U2x+S9&Qm%peEg&@=mC`Lgpn5>z1rmc{O3F2u zogf-C-v**VaSNhBYga%tsGI}Q=<N%T7|6XXrI2zBRQ3uKL);E_8<FK2%p4F+svAJ% zT0vzzXu1GwB`9p-JxfxHpetTLe25ybG|o94h%71z3I|jXR35fDtDG|2X?zJ(j?^?R zQ%?Mt{R5~SAeVyt-sQ%?V9UV30HQ(B0ir>DU=VEy6$g!vfcPMJkUkIw>0MKf$RC8} zpd!i<{s!p<nFl(52}Fa+JP;iXwGT8m1>%DSk3lp@9%Ls7gY<&htf00c$ejWW5OYD| zAbDc*+zTx3se;-M8aD;m3raK~8dOGuXk>YiT_6mz7sMun$w@DBDj@ztHydQ{6{sAk z=|!ND{Pf~eNq(Gz{6KE}*vyq`c>?VdfXsoFiJ*7^t#KBql5VM~f|QA%v;k7%Q7_%{ z1*!)WULY|Trld@S*$JXS>*ql<$b1kD>X(3Mkoh1Q)E9%<2~z`d?~E!)nFuPkRVpBE z2djf-GLTv@A4<UH`9WNe9LQ{tIUt%;H^jRXmjq{4p`4QiGM5-kY8u|Mj;|%58h09= z0hJ>;4c8E#hOa>F0QnCTc0Fzk44~T$Ks4x_AP@~&oCKmn85kHqG-y5?M1$l(`al?@ zcR`JGOUoiYFunqv@5VJg=~IL7H%KqYJkan6hz6A{AR1KGf#@u#y~y$)J3$zv_s25n z7M(un7SPHlk2Mf;LE;9rnE4Uc_~acd?g91DLG~|$+7B9^1o1(AbPx?1w*=83d5~K` z7-a9A9O)L&+&`!c4roQV2P6**A42o&IkgadAUz;6LH2Bex?>-dUI(SOKxt%okUkIw z=>^fmU~<y0LLI`L$aaA2jeyFLntrF$k)M7q)RCVCdFsheFCai}+?vdnYB>Nci$UhV z%5PAdgZjr;>ZMz38X)C2C|!ZnbhJpfynyC0P*{V+U>H=s!q}wHAah`Lf@sjWY9Jak z&kmwNd;CB&sBH_PL1RWR^O5yNG(gI4P#v?P7UFiWIwH$&kl7%AgJ@FS5D!{s=IZC@ z<l`Fe>4vf#4cvZ>cg;&o%7GN`AUDT{fM$Ln^DFVrMI{hvPf+s;>}0T-;G$&oIw3bT zw>TBl5rvL3gB24&kebIpYpPlrap$o;P&rcbm`M}ydF%(&4v_ai;jz(;fdRBe3q*s) z06;WoZ5)VpWME(b(V#WFAQ~hO(g(sIy=$6?pW`iPLiih`7i1o26Cj8N)j=Q{H0A)J zL3I>}MwSQJ3Bn+~Ae!j*6&8Cz2?At3s4fE0pe_=K2Gvm@8d)A>7YM`b1+fWXa?-_| zW<>ZPn-8-03RI5NbRp0}e!B2!AwO<G?k6{X)-052`2+3ifXsoFpP+aFt=AE0m2RnN zg_NJ5{t-ycn+eh_JkWFv3NMft3{z5m!t4ampuHO)8dQFQXwW((5Di+V1ftRVZXhv` zduOyl%1=-kuhI;0JJ@YRmY*<lKs2dt0NKOJ%*e2y1F~-NNVjxLN)IHRZH2D4htVLl zps)+cNL2{%5B7`zpYN%VmS3b$l95@gkXe$NtB_f&kdj(Zl$xAalA5BY;F(uklA4&J zqflC$s!)=Vs^A&yui&h$4cbGLmS2>cm{$Te#R@by0<vHf(<B5YbYefx4wq%P$|q1c z4AR30yKD=@0iD~N1KC3XlZOg}DNveGqD`WKY!ZRi$)I^x<n`HL%Lx!*x4|?*O#_MP zDFmmcD&*(oWagzRWTfU4fRlMjYDr>dPO%;VLuoAS(@mYYgxwX5D=uO3$ld{kjS~LA zfrcWajYXSihea5Ehrrwob~9}pqNJb%bBmG!G2s$3g*tHuTFV3SAFjBA$%E9uFen^A zY*3#VR;I&fkocQ!NVyMF2NENMag`IGG>WblG&TTpmq{07PZemb_?|9=y)gH{Xpk8o z_khNwVOuXie2_RX7?=BCda;d5v-CpT15*Q|LH61}<w$L3ZRsVxomBy~17t7APEc5Y z+M6I6v`!X8gW97YI*EaS0Yrn^r63w457Gz1AiXYqn0;JOJb>iU@dqsSg4VBs%muAm z0MVdz6d-yc)ZWQZ8YB-h4`gpgjdTlWzXoVLy<jmUJVD}D`Y_v!p!5jSi%d84LG*#d zKzc#;E`i#&97->M(x7!f=<*<aAPmym5F_0J8m9q`(R`Q#F&88bl1Fccg2pXD;^<hQ zAEFN=4$=#<4>Se?qIW^v0a{N1;)BL$Ks2&ENFNA;^nz$&FgfY>2$DOI?Eu;P2P#Ku z`n8xqe)=t$Kz<tBFoFE^0`fb#al2%(R7(xC9SkxD*2e(FDQGUJVxn}*gNfii1_vlz zU1^nW(U>FM(gW243Tu!)7^b9;0kacCgXZEvG{}4q4Z1S}M1$6-f#}^Z3!!ZykQm6l ze<niu7@&TTPd~)%7L%k~7>Mj+z{~;Bq`Cp*BvShr=z5+^mu_j90m*;c+#q-D!f23M zP<YU$iU*lKifI)BIn$}r9)k5daJ7eE^2q)Gr5SqlOOV&dBf9|?8|*ev(-Nc++M))D z5!d3yWh(8(L2e|b9Sm{_NG)yhEG*!N3oVd4Xq65i{R40$64gIAvz9vf0oKmOl^<a8 zpm=~`P&k0tp!OK7Y=zMvaUN*-3sVOYBZP6aUqJaDT`#Cz3UgP;G(`X4&NN8553(2L z9vBTW10;^T4F$vpi4%iyxeulny?+4ObD}a6;vSe97!9&F1}aBt`|8R}L>r0Fn!OoN zJ3#h=>;#1cXl)#b2Cd5g(V%_+hz4yz1ks?W3lI&G2k8T0kY1lz2zv>w>k^oS@Ha>= z$UM+oD2QIgz`y{aXF_REdmO|Ewbwy3NFHP-2!r&3X!N!jDBXd?(QyYBdqL}zLFVp- z+P4WxgVr&F#F6D;=E3ZR@$u2*qzjwbi10x+8)R<@RF2eiv0*kMen?FhZ;<qo8n+<# zlN&!%mP)nEftD2@b6{;}P`rTVk+#f{ZjqS_X*+|~-RDe_ZV6Z@-LeL%2NYf)eK1T( z+Zkpji1vo25m4NM_@K31AR5$11<{~+c9@+YH-N-I?zNZ;X*+}3_eW+y++H%5__j05 z91u;a8$j+sZaWjx4vsG_DJo7afiLs}`2}PSF&Gp!_|&17hoChrCi8Ho`y8kosp<a7 zJn5E@3_b{k?lr^Zj}=fmK<);q+2h8*0Gjay(V%s8AR4sS4n!w1Fff4VWGD@i2k8T0 zklvE{i1qt~*0d<hNBA407i2DIe=&##t(ybUppB6rx)f?3vOLI65C-W5t!Dv^QGm`8 zx`A}I1xOxT=ae$FM3g}0XmFL28?d+swBH3}KWJ?;hz9Nb1JR&y91x8x53&n{LGA(3 z#9(sLOUeR7xFOpCvUd(tj@0yWV*&Z;MPwoQaSn1nx$)z&T&iUSs2l+q!oUE(n+g;! zplkW=ER=3>Sp+U889-?Rq|9QKbju#79#D9J#9)|`auQ}Ihz1P_fN0P@3=j>P?f}sS z&@?;&W+8Np0VD@<Z^9x-ISDGu-^_=&9jp{&AXF`w4<*po@xjai(I71#npii)yQCI_ z+BhJiLE+-84cavg;-O-YoRYJ)Hnd9xUL*2jk#q~F?YS2^-wC5ZIzj3|G%*-gUU0#2 zz8Gwram^w~TNf06Cy?^~iq+WD2h4pbt0DOa6jq?}1LVez{Sd!^*bAWYAT~@7j0TCp zaLQ8Y7ErnZjnjfKOdLeR{12l+VxTe%ZTb%+Ob~Ba0&y=vg*X%-rxzSb;KCsH2CR^3 zf$dWUOF-?1g@MLWh<k9w8>syQ)`vuZ=JY{akoh1CVk2Xa7|eWPX_$VHUJ$zl>Mn*Q z(k(DEK;j^IV*LbCkBmX-8#(+zW+BVtW8(@Rm>z6x0*_^ou!X6C(O`R5K;)Qs7+663 z|NmjKkU2vb?*mjFh!0W+qKUz{+zZQZETD{rWRSpeh<mWv0TMg2Rk{T<p8=XX@Y#V| zEs~KaOkC~(nGI5i-ba6u&C~+Y(*boCNDU0b^x#X^FtxbogapW3JxJbQl@w^Z69X~n zx?+WNOT#h<o&&9yVD15#g^X>`;trOMiKSs?!OTamV?pT|rUsebLS=hFW}~|qBnERA zh)oEC;u4=4Z26~SB_y4p>jT+)04hgn{`s>K5_h0D1jQf7Y>;^%8Xcp@A4s0uIN(@| zzaD$D3gTB#JqEG|gj=>tw_JdggCGGA7GOkPUI-F_<0Gr2TVQpU05p8yl28WBuP_=U zj9eyy_#h0DM~`zte2_j62I&RS<Y16qLiV7`!|Va+ElJHS$Vn_oRj^Sg&a6s}FHwjG zEn`)%Q^<s@V@WM4%F71{$0w(xCg&)?JBkV#3dtFXMG6`UY6{?%l!B&0G*ox2jzVT$ zi2~@byV6tzO@)$-qWp3N4FyewY6ZyYmni0dwd+9i>cDkbD?kVKK<<S30llvSbq?4| zAax)Ha^LsLX6craEs(Ub5876P(IB-TJt3flXlbQ+$t9Wjc?$VO3T25!nV=QG3b~1u z3Q4I7rFq4PX{mY&pyN9;Q&Ni*N{ch|(nrkdvm@)MGrkO(Qv`=OT0^h{x(*B`4^jie zp!iWDH-exIc90p+bOImWfSHevR@q1$e{(@CL9er6{)Wjzm4PXco0Z^>hIj-drjQ9) z9I2-elCO}GSqx65u*H*^`FW5<li(HZ!LH7sL9X$B{_)|CL4KZo?!m-OZGi0`C1@W4 zF`KEAzF>Q-aHTJpJhG2KX-SEOi3yToA#HPVvoAdP)6ku;Fad`Lxef)b=!1=)Dk;!B zSOd;bC*6R~lL7f3SGs}8gVew<D4alS(0C%O9)-~$@jsg(buCOCNQ@B1)z$^&4|Kht zHayH-ESn%>AWIn-7}jh;*b8$Hj0TxO4flY|0b%sEH)zb6Wh=yfkUTO5*&70tBXxXI z;IMQ{#4gC5#f%dW^Fii4*@_sqB-AFK0JR(BCXilOm=H^Y^nox)Z^>@y7SKLQP@mRd zAHqE#d1Bl73fmz1KzcxC66+3_I*>jP2I&RS#9&<M3#J!ad|p9vCrllP2HDHA9pVR4 z<I`h1`SAv_o7^y7utTaP0lMcEWDaa@4Hl*XJEU7Gc7Vr>IY9ASutvHiW3O~e547D3 z@-s*u45JN&z=R3XAah`L5=+AjMb<lI2V~3`)ZdHQ266iZ&=?D}GYC=((+8rF#{fZc z#M%v02QmYML3%+nsr`%MlA>gcGc-WGEYCcr%92#jR%Vc~;BjRzg9w7uG!2?_Td@<8 zZqbbg`Rf5xj?^?=unUo<37zXMvkPHA$j$@MIX4guno|SOpgA`X4VrTU(V#gu5Dk)t zxf`U{W~+1ys5}DA!-B@IL2@ARp52JOy%I1#fh4iuHCWsOI;#R?ALv|i5Dl7(1JR(h z5+E8`9%dxSUKpDYjVs=8jWfdf2-wVp+52J_>fNHCIs-KR2<j_;Kr5#~YC#xw-Uz53 z$7c44-I#GT3v|zp8v_HV{sn~v=saQ&4chY#qCxAqK{QAnW+u#yFg`vSSJ=SxpqJC2 zG+na?;ZB%35Dl_-3sjEOH2q-@`Dt2bFZt;Y<Ze*hfH0}?Q?W~`g$0`4LFT~9cu;(R z=GngNm2QdI2QK3oKxqS{Cg7NKivd&*D7-*oFic4q53>_QgVz0mXwaM-hz89If@sjZ zAc&p^vk*Gh2NDChw_+cpj0e?2EPEhs2P-AAjE9*6qDgf_d~kkgQ8H*X0Hpsy%DkWe zbS~`>bgT(RgWQfD#vn0V7*}2(G%t8$AEZqTioXX)dEezA_VfXBU(InyJ^}?VsQduA z>&H#Ryx<O~JV+d-2S$U$V7TU>bPFh5fy!hMhKYk{nEzokNDOo?8`^LXNSGi#aRB08 zf(mgcKyDM@Py!bQxwmFF>b#%?)P7hPI2?qy2Uon2J1+<`pI92^Xpoyh>^V?(f!qr- z10)WTC)Q6O^~f012SW~jkXgv`_}I9@2c`#G8J}<n61FfkFdAg9#1V)bp?M9CqY!l< zy&!!cni!1By}0UYjl&Rou-O3;`*1<J1=Mx{^`Qzb<5r8yZMfV6G8?1^y)O@&7hC{! z7f1~Z!}K7}3xd)KNFF(@fcUsD^1R@g{lw1;PB<dnGUE^ggZi+bGksz1LANUe8pj}U zkQ$iVh^0aLKp3PKM1$&A5Z(eUA3^CEB#w^HP}yFP`RHy2iNV|jViUr+;vc3DTmD&q zl=fljKs3nS8&Ek?^N+|eNZf(q5EOqf^FTB@Mvp&`JShA@nAA8}atMDt#saOUK=l~N z9uQt}NxJ0)v>XKS!5GiH;GJXAEwH*v0~$VHJxBy7>_A)?4Pqmgi6A}*gXGcUoDd(R z4}?K_K{PoSq?eFA=<+aoKzd1@7ld_k2}}zn=jRodKqd~g6rc?)>=T4Y2BOUmLYij^ zny?8%kb7Z%LGSZGOo8|eqz=SF?!W&yC*3mRJfs{x3~jT)XpmZv9&(3;LHb7u289zf z=IJ2uMbb1Kc-%w@rV%>v0CEo<rVU0)^bWW`8_rQ@&I2|VhTcwsjkCbykv$AbOEjO< zf%bpNEo)%OpVny}92Vp{Qb_@kO=&z$cHkLx(#srZLco<?VDeC9U<wpQAO>h`4OW-H zXpp!9w7!9<1BnsBxY~W7e1WbP)SiX8%it_zJOH$(>dIM2JqNNE<{lUgG6N(IqKUz{ z+ym2#-VO!Lk!f6j*bh?!qe1poK;=jst82I`-I8(@GDmjf5yX6uc^nrJV|awxr(2+Q zgWLns3kwrsX^=h;2I>8BRk{T<ZwKn%ZMcDO4@e%=-UVSoZC;m)5Pcv$ATx<|2TUDE z9|(i=f@oqeIq~@e$(_h{fb2E61n~o@@tJdp{CESo0TjL<OllY}I49N80G(q6nFAX? zg@vifW$BhVm%-zw9H97}a6-D}#dYbH4LI^LX#5Ri4yhOvb}&1MrD1j;>)mk~GJXo` z`!rmHxcv)gyaC!V0;z@R1JTIiVIVnT?S`oXnE}Eey&#&@Ha4jKN<?fw1Gniw<`9EP zO}n6ZgDqDe=@Z?2ko(_2<w#AtHCGX7m(X08##My<AUlt`F))DUxIi@M%s&tfngavT zpmTaaH0V4Z5Dk)txf`T6;evDvsN4a~g@MLwL2@8*o@>O<MeM-h9?(6PAp1c3zd$r- zq7p=dPD2IJ$nqdNK^SB&s5}OZbAkF|2{$4B1c`&>L3tB|3C(YKT!ZKX=>h2l*$0|e z0@0xJdq6a3PZ5X)?H>lwpgZ9}G)Nw#4}?K_K{PR#oOJXD$(_h{fb2E74)Fu2>8Rj3 z`RQoQb@JmJ<bF`xfH0}?v*m(Riv~2`fXsoFpP={v&F7TdkZ!qi16+PGfYJs?&4CBf zEjCa+pzs2T!7wG|C(KR|4VwD_(V+P!5Dl7t0@0xPClC!fpBrW;$PFMdkb8gJfRvx0 zGQQ;+#O+{pM3$d0b3inyZXjj8sR24ia~wK$0i!`~1^EX=6N7Q3eM0k1CO0ANOHh0T zAm#Ol>)6u+%zbYjLh=SEI6>tF$c-g2GT=RRAhrgyEeB%5^uTD47!1F;E!_f2N1$>K zgkj<!8s>i(4H9c)U|=9;zRBV?#JwOh$ic|<D<S<L_fEKoI^WcB3t~Sk3^qXBgDc+1 zoo|AfPb>}d3&_nNHqRZ1J3;P+nE?_9$rI}*ka}bc>dzpDKgcX(d3<bK;RDly-cJFw z4K6_a08;~_LH2gsgZPioczMNrh&qs7kUkJi494YNT=Pvc?n3OrW(P<t;k9%NsC@wH zk34vbTP-fP;c^eiY>*!GelcvmNdOv7AT=-y(}O(U1WG3$dE~SL;^V@|^Gy$~5<lO> za9_HG<1Pe)`h)o9n~os49pq-1+lZxMZU^ZFu|f4I2ovg)*r25uV(o*e1K9<_Fnd94 zm>i4-i6P5_`1mlc_=oAimVX2uK++jZ4U7ia>j9M`HUG3cfW#dr4ngq;G81GTh(^cg z@duIzg+B<B8V5UW;IGF@km@mzJs>RcR=Onuy$r!K-{kX9x&>Bu%|J>6AhTc?=2sXE z5=Sl*L3|Jf$;0BBSQ?}cgh6^iG&vZgmstB?>R|SO^pZ8-1nMwSb-oE|AQAITFh8L8 zaUlIzh|fU&0<n<$!Wl26TR2`p^2bSNn+-;T)PnSoJG=_gKT<F#oTxS51d4T1!VPRU zB%<SsN9UVJ3A!Pp_QMP6%pbt!lhE5q!(qM&ly8Q@d=to>wBDA*<15nwDi?@N;JDgV zuz4F?=>;Z_Y!A#{(0miDE`iY?brW7f>Km9kkQgD1%YC4Hfvy+SKZChz!E?xX0BF9+ z<psiCn0sI}$P8+@2V@Qiqqjpr^G!3L^(;sp8H4P70hJ?lZ0^W+>6Q=gA$P31{6hGz z;x%H-j!^ql<uybf$W0)(z`}%B8l(?|L3%-M0nLGd`gaANAm)O^LGqyXE(jB9^KPM{ zdqDOQgK?!Vm|kr0nehhVKbRUA4f5{-s2r*BdFKuJ@dmOV6uux#Y8Y>MBGvK%X^aat zUJ6SCOWsPi@Vo<$mvVsOm*KH=%ZiWEEeg<d3-U9_ei#Ogzrom~&>(YQb`nd&%tzL% z@eVRx3hMiOcnxuT$~)rEJ0#X_m^x%PfY_wAu|dr@<onv=gG-7)cfNzn0{II>6N5=j z$DloY2JdmF;|!=Asp**GgLDfh9fI%*P`E?alVJ115~v*@IgnpZyD>0;&b0*5ps{KY z4H_p0(V+V>K{V)W1`rLB2k8T0kX}%@8G$%Z`!2kaZUK!sfy$!~Um^YksRJnixebIL zK<x+B8z6CX?D7Gk4<ruK3$izifq?-;M?q;%C=I&P4I~b_(+xy}<U#sC7^D|O6NAZ# z#~(=UM79HDufa!%A4rYIoR8$kBghS)@C9K~!#L-eRLcx#x&fI3D~~{73OeY-<dbyE zoKN8LhyfJ8AT=6arCWAD^?>{g5`$q%$|IPaAR2UEIfw?u4~PccD+!`Occz1A(4E&X zJ3(#$iGkd^;}fJj0+pE!A0TcAs{>6qK+`Ii4<(St=aJ0;nMbM{ic5-eQu81NgUkZu z5eN^mp9sb#M1%Z{PYrq<2^#b7`3y;S==wnJI0BU;HBExd0;MSsW`UXkG7lt<fxjT^ z2dOy&En7e|=>A6#4JuneG^lI=(V(&gM1$mE=7IFW*o0_u!f6YVJCV%?+4}}6N6&ED z@?5Ir3$*<Pat|#3fx-opp0|9JZjt#0$$y|WA4pBjPw5sB9PvR({)5>GqCsgNM1#T@ zM2j*oFo0-K{sYnI^#Mo><X($!ko*TKBW%7v+zxUxv3G~S%mLA)x}mtFC=ZqaLGcN; zmk0vnM|{e#<+nfI5a}IRFUVe>?+`gs(-F%bh(2`l?tDko4TSPx2h?tm86dY@aARNq z-Mb2+T^JY`K(q;z2CW+b@j-D3qCxT?eIN|dyXBvB3#eY_2A$>l7veUMI7l8;=72El zu4-I$y2KBNK9C-eUXVSYu~QHYD#Jmv57a$@P#Retqz{BadO<WXn4I`LgXB(RJ3#ib z{Dk;{)cADxNq)S6+yDw+5GFN@WnN0Plpv)~SeXI}YeCRF_%G>}f?tp_1r)y^yY~E* zZfSw)0r?pu2E&w;DKI-hv^X?=LFR+_Aag-9=nhm64I489*$Yzxa&ONsNSOjE_d<R^ z+zwJhY?%Tw8)OcMCe;nlG6lXd0pu>Q-9!-Nq{EQkkhF$wJjmW2s2r*3Q05Qu>F@;9 z4v_sIJFi0Ta|Y3%0~J9uXq^m*29+xy8g!pChz7}n^nox)FNiilDvv;Xm^dh1gD|1A z9f4FPg7kvy0o~67qCxlCfoRY@&mcOKfq?-;Bg=#A1YwX~5KRmwC*F9V<s-WJAbVY) za-_yv!(Z~_4df0`_<}I0Vchacs^tW9j0<EAto#6ltuO-vgU3JVmX?3gEui`yG%f~G zvxZrw<qlL26Ra{20QsJQ0d%J^zO^?~km49*77T-Q!|Vjn(hLj?m!S7~f%u^E14M($ z4-gHS+eg+5V}oc=J0Io-kh!_3xw-jesVMonhEb*k<R4HUwuD6neAX>UEl58xnACIw zT65y^A9sGA0+k~*-NZ1+w1E5q^2ZGxgg;6cWLiLX#)B}Sb*c&s5Pih>8@n3m76}HK zmJk0y=E$~ydO)zS1ktzM7#Kk7SwS?Y%LJl9>s>)~Is*d(hz8wD1EN9lFgrkcr|`+N z)cl8x#fk`m%m<myz`(*N)6%kt4~z-j$FKp(e;_kK_JHnT0MVd(MnN>_>=zIXI;#Lg zBg-SZM?_Vo<%zUR3n;uVs3Y7ng;AzOghLRF39YMiV1(!cnG18zR%kfvfYK|V^hPMX z8A^lXLHa-#q!$!6ptc*xJwBWeb3x)Dd06<s$^_W@B9I(1zJSF&C!qFSfYJw`^f4%n zEDtjaW-pA7k0vMov@k*Zhi)#&-aSw`QuEIbCi3zL$W9Yx^3z}eGx_NS<bQJG*5jR2 z%YuK1atK!5gVMYX0|SEvi%iP`7MT`M`3g!`V7oYETFyZAfcy;-gJDp)3}cf*gUo^1 z38F#$6c8-~O<$lXcMx9%%D;$YII`Y7EHW*iJ`1Q$;$ecg9juhdF(8l~Ab*2sQr!Tp zSHRYR+yrJ2L6DmEL1lOYEAF(v11d*q+BaY$KJ9;j+5z$&$glU@7#KkJYJh0ay$>Kd zmw|x+M1#)L0@0v5#y~Vk9;6S1L3&rPVWxdpGXkUr8RxJe{0-6zGH)@|o@G!PbT$=8 zd_I&9TJH_wgXCdmf%Jmdpf(Z+!`3H)=2Jo9==cd1dqHJ1$Xw7JVjy}Q)ILzz4B{ip z!_0%(3*+OX$w?P8*b(7_Y&OW=3s5;y(*+L)`RT%ggZ#J!xgQiaAWUlfSbUIb`2lUm zfy{xGYoK@m^;rZsWm+mYA>|sVy#!Jtz$4Sb0ZrGS@B)d!FeT+0%uWyun!^Cm#?Z6^ zs;5DGP`?U9gYJih*$Hw3NDSoODV&gUt%XCTMS&gScCb1k%QcueAevM+fKHZnadMCM zbqt7i^zrcrxd&u7$bF#mdQ(b4IULds1BnxZNln|Jx&0C@+-Z9aRF2fN4RR}Jj2nbu z?KF_TK;r251=J3ZI7rP?HwFe!zZXP<?rQ_lpgA=V4H{1a(QXV33?LdL57Gz1AiW@( z7)(w$&Edu!PFJ9E^bDtlk5Vmfplwl*pJ90s6fU4WI&*krT3C3Yc@f(0@ez<|`2*F1 z9$u8>MVOr+8Z;*XqCw-@AR5%i1ktk4I0KDMg4_$jAUA;IK<-uGh2%w0d7;7$aXUy2 zv13v&b3inyZUD_;XMieFEc01lH{c*hO-G>o@Prq4I+Edo$dQ_k*6_)|=d1~hXGcKo z0C@=%{;%B_7(nC1AR09H3!*{!3`F}fFff2<e<%%-2k8T0klrgoGA*FKF{r!^5rw!N zBo2}X&Ci3dKrEykjH~VO0*iY<?P8F<pfgKBG-w<XM1#&W1<}azAiF>qW-o|M2$K_U zbNC_tLpK{_?-i&VsqrQtKz_V|+yM$-5GFN@Uwo2ki9t$-u(AUbwxGDYAt2M@AP6Zt zK=BK*t4BnpB?qbp<Y$l=3{z5e!0ZIkpmH8WgUSvNtqDzcpxfj?e9(9X%ubLSKw=>G z#t1^n4p8}~!VhsfSRIk|ILsUnO{yC}bv5XQX|R1XE<ZqVts;aw9mYWANKJ=tgb?YF z(3+PSP&+{W1;xP|HwFe!eGH<#7#J8pG-w_gL_0zGpz;L72g!r<fiOs~h`3A(XzU3T zhf^dW{sM`E<UwU62oqX=p&<;>2hs!53$iB(YA<M?H;4}!#|F`$@&iPJ$`23?k_YJn zVUS)BO$;Wr`~bz<9VB-m+X1pyL<HgoQsXT^g#35|xd9ZuAWUi)2YiugnE@Rq1epUX zKR{s$s>>xrWm+0UA>{`senD!^NXWFTf$9PI86*b7l$0MZJ3+KQG~Pkw2Z%2P<%7o6 zL443SD9lcf8$e<p_s$W8lpmlnE=3sPcCb1k%MX}2AevM+fXa{L+yc<hEZ9nryTA-0 z2y)V4iWnrVp&JjfcMepJ)O4sLPJBAN0ks2UKgiCv(DDOBgUSaG4JtoCG^qRl(V+4J zM1$l(`al?@7c@o;YJ-5vj|FlNe}Tk7@}P7L!i3UxhB!nYNDoLa$R1Gn0ir?W1BeEd zA0Qf3et>9D`2nIq@*sU64AKjtiNWN=n~Vg)oyc~8><xj+ks5CkB*>39kQ+eZ3&Ny^ z@s6)jEjOU;MUXkL@&gp6p!^siDbsR55>kGE;uoamhOA7>8>k+TpFv_UOiB3xvlB#v z@-B!5l^-A)RDOVHQ27C((aR5z7|6YMBq8MosEk`84sko!ZA6wIFmpgOscrz3AE5R} zd=A(~nx6Lps>hZ{;ZBElpmL<9!yIYi)1ibk!hTRXcn2LX0MVenC5Q&K;XpK~+yK#_ z_6djv$wNX3GOpsGC({C&YXX%YEQSzsL1z9zau1=jy#kASK<!kJeV}t_Ks0Fn97Kc4 z4G;|~UqCcS9@#x_7-U*NZ6c6+jwm7A15y*w%ijXRTTBJP^QgGSR4rs6`apU>egWA7 znr8#iAdMgzG^PxqLGy4R8d)Bs4}?K_K{PR#obv1qk~@*@0NJY|3-JS~=_o;#{B$%2 zNiV5!4st&zZa|pS_{sP#)gl4SHz0FhWg#eDKxIpcoJ`9ZIY?OuN*f?Ge-vd}bf9`b z;RO<dVM@wEn4KURw1yu<gUUh>4Jr#kG^i{D(V#h9n4KUufW$!VeIW-a3qj>|i44T; zV0A>6g)nnKG^uU?jpO9!Kng;To51!GL6DPv*T_TCD7x_=d!In%NKL;n3dE;h1qFot zAUoef*A;<i&{#Bx291A%XwbSM5Dgk*2GJmSn7cuGL2OVx4#I@e{tPVkg32?HxuEtC zhz5-lfoM>B2}Fa+JrE6&2iXO}Fnd94LYSQR@liyC53>0ndt0D#q{hzyMe^eZ<OWdq zf-tFJeBp;wiwZPNfy{xG5uh*y<+%<enU)VqkTL?)CI+eDP?u>jf$9PI86*b7l#~%L zJ3%yPoE1ca$_Nk*DkDHNsEh#7=<Owt7|6Xm%8)VwRE}LyfVds(HX_Rim^mPtR5yUy zOUd~;IrM5TT~WrJ4tZ1{a-^oiIV!}bLl3AOpzsBygAdU55{L%1hd?x_y#%5`?IjQm zYA=CkkUU5q2!r${ILovguz;+~iEx9s9VD)!if|91w0#4MdqC|akbR)`5Qqk~mq0YA z+yK#_@&!bL<Uwu$VUWEc(lRZeHWR45^g|or9*{h!E(T#j^>KzOL?1{G$V`wup!N`m z2DO(!G^o7<qCxE?5REJk(g(sIy&#$xOip<wqlR!NvK=6ML!fe`rlSdJh<GD3?uVX^ z&LHU}HO@iq2gMBtlNvt_zoc3`kn$9)ECj_1sBD>{F4OWy9a0v8(gw&b18td>7^ogl zc!9)Vn3A#(W+#XSwN*egs4N80pt2A|gUUh>jow}YiGkcJp#doiLFM%lRfyZcZX>cR zgqZ`PNp%CLEX)KIhF}XJeIh86AVp3ZexQLn4NGW3<Va4#n#8B!5U3p>&w<jxM>hrr zcLoLq5Dl732GLefKB%n(;=4lmAbF5J5C-W5(V)5<gbAhpGg#~e&253q2i1`v8niDH zM1$5~gJ{s1r63w453&n{VfKR9gfKbr)1U>319Y=N_U?enks3c=w8)PikUK!(3&Ny^ z@r&P5Eg?wh4OUKo!W5M6_GrtrsOUh-3D6h-$SxZLnU)Nw9+00wVlYfeIRUd1M1#)D z1ks>!0z`w#2@nk`CqOiM9S0Hvxz|AlQci%%G7c?>+re%lvYddK1ENWF1H7DoHk#1G z2J8+T1Uc!DLl<{Cbb!i{nhr1M5}yuhpmu<~1oG=AHwFe!p9w^R=EOm?4FdxMhz6Ap zAR1JTfM}3BNFNA;^!|yLY1t7j(*oL~nUf0f7f3uo58)m{X`4q6q7P;!$R5zGdLSA! zaR8ztpzZ;c8z4TYd;!rQd5}I32H9(4EYkvNH-XzsrVw*M;vjiYeGI~c>f||C+*1#= zA5_nQ>@9`zYoRo<JjgB(hS>{Z6T;-AqX2z~|Ip0_+1mk?BQ+fz(MQA^p*9nGI$|(D z=p{AIL4E+m4G5DOKQsPHwbbY!!U9$ng5n8Owwy4KX)!Q_l!c(Q0kX@$RHkJDR1YY; zKw>aVNm&T96GVf~I{?w3vJgar%0dtgDhok0=)7#0ogg=W#6a%#F@%(bpz`{L9>ncn zbwrkhFmpgOscrz3g?V&rGl>`>;tlLaC;<u&AE+G3Y1jyn4hf~<4yYX<Ye9B?c4J@w zt;Ye;p#B+%2CWYQ(V#L2M1#(b0MQ_MkUkIw=?yVP*h?t=GZ-WM4blrTubY8^0Yvvh zX;425#BYc4JE1g49%Ls7gY<&>te~-eP?@*G8e%R;93&4~2MfZm{TsN()hA$a59rQS zko}-F&>(s`)PB$zP9Q$AJjgB(hS>{Z6T;+_c`hap|Dl@=vbP2*M{0W6VS<P^Qq#*9 zB)z1@Imi#7xB+2O<HzH_R7(eRP6uQTtjq(&3#bg)V=B|4Vg@PmKxqS{=7W_?%N(d4 zP<VmFV3?9J4`wHb2DQCFG^or2(V#L9M1#sa5WO5`A#^PfNDSm&2Qx^S2P&7(7(?6+ zR!U@<2Qvpmlj;U|nMbeopE>R{>;RP`ISrc=pN4Coc7Vbcln%Z?%RCSbD$_tTsLTV= zpfV3cgUUP*4Uz}x17VO}4-167gwp>PEcSxRJdnAdG7Ut7$~+JaD)T@zsLTV=AbF6T zAPlnif|E=OXuJ+o=G_Q|geOS+hJ{QEC_jNPp*+=M0nrCD6J!slOasxNG7m(9$~+Ja zD)T@zvOGv12!rfxQITl@wLL-Znc@I37bFgn2eoNH7}l=AwTDi`5~2^J2c#Ed-yQ}A z1`vG+N^gSFpf&#>ab$UrJ`e`!1<}M{a?0QnNbW?o18lDq#1EvVUmGh#IwDjCqo>~r zB)z1j!7Wzgrx%dlLGcR0q{eLmqijo!86>Pg=D^BtP@ICw!y0RumM7Mb@*9+{Kx)p| z%d|{@>H&u}NDzuCDZgQMf@n~C5k!N^Zx9VCzd<yp{07m7q4t3&kQ+c^AonuZK+11W z9TQ*)aXUy2vFqDm=74BY-2g7Xkp}ue?gHCQ1VL8%w?V`kvK3%^Z6R``rvD0C;?utk z)DDo{AUnT8%Wn`3DxX0#sQd=epz<3;gUW9Z4Uz}x17VQf4@mYB$~#-I*b6GZLFR(W zXAli4zd<yp{07mW@*6~h<Uw|VFvwmI4JxBSm{2*bV+RRSkRFg;ka?hT7(|20X%G!6 zr$IERoCeXz@*sU64AKjtiNWNgiw8*VM79HDuY^6s52U7x5PR~|#RMe1q{c1C{h+u3 zVN&BqfLXT11}Trg$~I8EfXa#p2bq=w4v?}9)OP{dHNjP;B><`i6kZ@P7^b9bgV_n9 zLGuS78dSD{Xi(V(qCsUFh(>Rlg2X`Xz2g8W+d$=Sh8@K1V7C$3Hiel3qDgfFqHKdU zPND5)u>C|3<fP*jj*zs9ZagSn9zf+tO~(;V#HV8!CxrbVJHNRxFvK!2Fo0;#_#cP{ zo#6taBcbA;v!OtIkUY%YAiXb;>?M>3reLwR2Wmd(4l$7Vpm9DB-2oNvg3=&)WP3d# zWLgZMbIB~x5dVPOQ{hZ}dqc$;q7P&)NH54<(Eel)4N9vZdIr>f(4A)>KC(PW9|(i= zg4_aXqk`I}6TBeig2X}cp!N$06Kcb3!Q!61Q2Rmc0+9Wneas+wH&h&19%L5?!|VmI z31M>5Z-xuRf9Pg|>|FqrBQ^craUnnbO1L8Ql9~oXT**%_Ape8n6@*ERTMky)771ux z2blva!$ENiDidYgWLjF>AZ0ixU4hh`@RVsWfa(E-HAoDGDJjEYc7kZo9%v8^D#JlE zs0;_upfVgpAAwm2Ehj-@AonhCgOuT*dgg;O#O+|EM3&(&b3inyZUC*@D=vVXN`oFQ zU^n0(NKN~ox;n)jciNu=l_NFnYj_~iFQNUHH=uTayae*=cj&r35DnV*45C5n_CPdf z-5!Vr%|(M~kUU5q2!r&-JLl(>6y-w}JVN6WBnO%=1z`~nh+lE-y-b11gY<yR1K9y; z|AJ`HyfcUfogE0GL1Vrk8nmVlM1$l(`al?@7eo_-$%!)wPl!Lz%?H^V0F@&(&U!q_ zk28=vK;a9*q=xYfHrbXt(6v(_b718LC`>{5FvLryWseu6+yIT=fYb<t%Cx+J>H+x~ zBnHEjlp8QRK{RL`9f$^%8z36AUmHY&$_)^WJ}(Ut1G)Ex7o^+(m2C?=AZ`b{jmUBX zW)6rZ)eWGwUuscNei8K4F<96jpJA>LB-3&r2$Ft&K+igZ(I9t%^o-sU1PTfK7!*#_ zxF-lb&hXocDqG-Box4GJpvL058w4f~RR*TO{zq~==<Fnr1W26LcejA-8O8Joffa$& zNn@b;669iBX$&S0QUk-Fw4_AC#Dtt?$u0AcvH%TT3JDQ#c#!K*B?ToUx6=CBB8G}| z>ZBV`{}kkVT<HcT4^jiepl|}QL37uzx(!By#66((A50xcj1b1vP6Oo+biJVVCCps` z0WvM1vw=bV?;in>dKY9b%sns~WClna9!DSnXd5=(wW!Fq7}CN7sewunq;R<zrV;(z zaq#&^!4NmX)WB$vy=$Oyq_!<VW`Np;ApC|v*uQ|<0n!7q6BIuA3=9k)8nlKAM1$79 zgJ{tCo*)`@1{{b6$%FKPFi0<mCI*uePIE$Vhtn0P96iH{gG09E1~hCzeulN9LE!>g zgEuEsriCR8+>Yh|jqPZ7%e2@;$+Y}|>Ol`LO4`vdJ3%yPuQ-SXg)xW*HG@GkXfHd6 z2AzQlaxVyj+yD{-xmO_!(vAkT^;JS3ZjT9*X(4ug2xbn5Ce;lfw~*Rq2I(ONgTeuy zI`ljVI>VPE9CuoCfXb1Y)-Ht0w1DzE2-_q=&LjebKQ_13K<xm@fz<qj&L4qj(E4l; z4GLor4Vpg!(V+Pw5Dk(C=>uVq-W|F!EugVZ(A@x_d)Z;)2@!~KD~X*D_khY#kUTo( zi9m!0$V`wupwSW#UCF?}0HQ&qC5Q$M27qW}d6;=1y`Z(IptS*@e*GP!aaWKUP<aKy zurdo&pMb>C@f<AfnF4jkEGP|{-vYS<H0}$cCqczQ@-Xv2?t!rh(d49~fJj8RA)61f zw*x9iYC1X+Nq#zFh$27ELGA~|4G5DOKNC1*TSUAOVF4>ELGc1Qm-R%HOp8G@xU6IV zr45i>HpwzA6F}t;v`z+z!7wFdCCp9`4H|0)(V+8aK{Tj+3Zg;h(SqpNFbkn>0EvOz z>k|zrD?#P?4bVISG#wLLR>I5y(WJT|-l;S#EfsQD94H-u+A8@)zNy8<iRqv<*&ru_ z#GSQ4r&fV@s2C)t<gBd?@+(LN#Qzg5(*nx-zo7RR!)Ta1h$aT($|EkhOrWi7C`N$n zgRQgK5DjUwf#UTHG%P{xY7xMmZeZ@qNP(m&P#p&<S3nlLD1-O~#9jiG2eDy#U^GY! zhBM-1T0rRyR6c?*OdLdm+<{Dk*r0R)J9{3)Cl+ssg}9ek_2}wAXWpZW;o^hby@yM- z1$M?NNF58*epndj#6jGHE8alk)gXPy7&bNmG9QGI<v?tZ7|eWPX^=h;2I&RS9Z+|H z+zT@UBo2}%)=wby$QYE~ki#Ej7P34(Hm>l2>A}{9@QH_nEldrJ2HDG!2$5srVPFCA z|Nn={qV9qF0#yf+1*rqk#9&<Rh2=LEP)0*CNF)K`9&C1i#5nR~T0rdxP+8?ufLkq+ zktj@D?g5z%Qi$Hye3H%70@Bk1br(nt48!!`OV=>9xafogM0v!+FAFZ4h)LHqi83uM z@etert*>D2LAT2RE$(3Hm{=NS9?X1Dy$ixKpyeYdJ;T%>(>thaFUV|kH-p4r?gFt1 zVNhJ+Q-dx4^dv#j8M;1@y+@#OB<G)GNZf(q5EOqPvq9#8XmpGoe;|2K_=7O1aqvVC ze?9gg8RAz^JqEG|gj@1uTCPCLK@cB|1sIX1;J`vK;zY7c3#{%EfrbxE4o1WL3Zp^d z$Ymmk55gdM^f)KP2k8T0kX{f?4hHEZWDmML%pQ>5lGNOSoWzn;1sjFp%&OG*5{3BS z%&JrcJB7@=oXosbh18;=ynK*wd~!-^a*hIg@F%`lK|>)qBe6(9LqSae+Qw4QREUO} z5UZn*oS#=*0#T!-fYRzx&{QbND9SHa&`{7+s8%RSEh#O^Lo*v{qz=S99drY%6+rvc zKz;%F1LjBcK2mW>5%P2s{H!hHzH?8GOp8t~Bt89x&NsnmnEB)mX@c~R6by<7YRosG z#~HEVcPEoN<GG-FGeCBt*RdTrkU9`14^jieV80_A4(lp_(;LkP-C>RxrD+}lB01Da zW3ag-Txkp@kL)3E8lz!if+bpzJ>-^mh%7)uhe87d<WBO-8wDkVTWLPk#Go*dI_U<q z1{~ylT<HcT4^jiepl|}QL1TlkdJRT{#JA)?>OPn{kQgD1t9=T}ALx2P?QWR6_GCfE zEkJABQ?e2E!rTL+L1uv51B)XNAA~_-AetDA%Z)I-=xu1wIP(Q)I{>BzMuY5C$b-0- z)bYnBMKUd*GX+3>!3CudGeG8n%m$s$3Bn*Y2*bodY-Ah*wHqXcO${jAK;zjU8e7=` z(g(uW^n%2(VRFJxARppCbn`&=dO+n!4L^`spfCbq5F3O+=7DH*j2=!Rva&5MNO1}q zM+Jow=&US(0-2VI0`NF02Plqaq{_71D3NK2fa*cF2W=Pt-FlpSkU20rK{TkH3Zg+_ z45C5z4})mX`auv4S{n{C3|a4#0?0TjsIN04590O<pz#H0M+l@ArVm6TkAH#WKxTvd z4WdbP1IRp5+sz<7#9&Z3;8Ta5S3z@5HHEm-+8L-EscEgCN~Xo72y*tvm3oNzpm2*R zB7P2mqX?o8<R6gUzitc+ptbxU8nhM@M1#&-1ks>#(?B$6%|D0+$%FKPFi7u~LYWp& z`2m`X0*%wc#Qzi#KQA!@i+e!x(IERO7#J8pH0Yd15Dl8I2GPj!AUi=A<Q`Bj&aV_C z3mJC<g%xP53zU`u${_v*sROA8<yR2C0<|Ah|A55Nu|+XNA4nXe7i2$ZfC)r{_9B4j z2B<rmpfs{PNFNA;^nz$&FgfY%4U#*N?Eu-UQUdV<sp&1Dg#2_hr-b}80CGPlZa|pS z_|cG;ZE1m?ivuzTR;GgD2{hM}QYzDOrW9PJGJw(sNX>>?nHCmko&<##NDPK4DN|u~ zf@o7{+5pW>f%u^IEQkipO@Zicn1#@}DUcY*y)Q~3Wh$uLFDZt&9juhdG8JYHh$hty zq|7-LK<8=xL+6}eG{~*!VG0t%g>j{QLUT?kWstTTD83w!^16&F_VfUA-<>*0-T(zB zsJsBVi=!1W=Oh6wXF=jHJun(12E%tMWLiM!2viP&Fiado!~74UL1GI)_q>A`Bw~#U zh<i!Y23L+;=fVYXFhK5QQ9zw@swjup4-10@Q1{@9H*)8kVCEA`!@K};Gl=~M>MoFb zVP=5DLGr}<38WqwgZc`{;SVwkSsou7SNOp6U~5AhsDy+yObv_%*;`Q!ks~x_o>2o) z2ht1D2cn6=xZI0t&Z(mcVh=VuKw=J!GA*F?0;r#Hpc%JXTyDeV9+24}J?MQ-*qjps zG@L+cU>K$cdCm!xPC)X=X$8c`g^}l+mM9ZH=k%dkrsYQ^1cT-*K>K50?m@R}3zFMG zYG7_7mWG)J(hFjP>QfLVG~c0vmS%{x52g-e7YM`b1+igrFd8I=EDz%2!?@xfrUzU8 zVW@?qGng6}4YJn)Do1MmDXE3T9ViY#@dq*!WFCk{$LR3~k_Ux92$LEIHEQ_lu@t0w z3}g=o|7enF@jx#_@XR^c)XB8K>aGr?GypOShGBk%(I9c;G7-cFVURp5u8E~V`al?@ z7eteTL3)X`52g-g4@fV`b55{9AR?xmGV@B%CyKDmG@+PC>_ijD?J)nK_jf?kVmalo zT}_a_5zNnoXmavhMFZ}9cLFL$YG1^oO{N7@hk*K;p!ONa-5@_lG$Q&ag!W3ZG$Pyu z(hEAQ7j#Z8hz9j>K{V(b4-g#$vcR2z0n`@;@xk&SF=+dILxW5Us6P%0>w*@DxnMIH z7#Kip9uS7rFQ9e<R4WQK1&e#Y`{LXg7(nYTLH2_8*Sj+?fcn57K8iflG?=|mE?$b9 z`1ELk_z&G+ki891Ia1?uPZI_4MnM=?7|FK0L2A>(`iG#f1@*UDnq^wvG(-A_p!fy( z*`!;hg#nswL4F2_!7!-50b`RwgUxYgU;x<(vKw@dJ%|SN4?#4je+Z&M{X-B98P$N; zfUK9J1=2qRmGu`IA#Mk&0(EGhX%)<e63Fd;WOG1vkm?3f`iB!*Abl!EcS!jIqe0FB zy92}^0^>@*g!+drEr|YM0#bgJF~^=BVD3xkfuwy<aDwtY$cZxZAbtU{=RoB_Y?vMx z4HAQ4k#?CDP&xvYT_6k-2hlM9!)TD$5;FUT32hMfg3KTXBc~5S`a$kp(IL|U3K!6M z#3sEEyFub1#;E<q8Ldz`X#C%Rx)WD?g33>H`-xf81q*v(X_y@#H-p$F?GSf@+zT@U zBo2}%)=wby$QV@qBgYHKEM$3nY+T_3(}S(u`vd9+m>L)jvUfu##D9d^y&7E*bs)VU zeIS|`jLW^a`i%!VAogIh10-fKRi*`0_k;S4HPdmc#pO0!?g5z%(u1qtXaNl;kQx|< z>4DYjAaPJS0nx~51;odNk^7BrOo{I|g3L4MkZA$oj559!eEr5ZNNxwY8Rj-(X^>qY z4AKjtK^R>xSPVoEiE+gPOgpx8d;lp8!qkCikh^|B<;Y3LpfChsP&mTO1JURhJsfK+ z@YfYDK<xwu2H3U%uyI?a$+R?}=SMt!umjyPEwK8*1L{YxK}ZD1{~#`m2C<RL7Z4wW zLGtMFMu-p62f`q|AetNu(o4u5ba|LPAiX5_!QdSnlvRJhB}JKe>By`8aIfqGcaIb_ z6yhP8pzHb+G~o;RK<<LM8NJO9wI1vRkU9_pc`ow8WSN$NDUh;@30nWbXpmZv9&*>T zfb@?P3<@Xm*VI5l31kK|zM!XkK*Wh5L3+WPz`>~n+(I8+Lq|-&4IwoVlc}>73bxJ# zy?p^&rwNls4jOR!qT$jsNQ#B@zsN0b;CY9J?u3O2I6TO8DD=DrNLE##{V^D;sgrI% z=L&-Sk1O54<Uwj+7!*z*HfRk4tX_f9An_lQA$1Q-9Y~B2#?@W}<qvedp#BZqU6UaF z?4=A03@auf?1i}pMuW_thI>HffG~Rd5wu>8VJgIakUTO5*&6_rBX!(LVwOw`sLu=P zk6f7pF&|_e$b68UAWW!T*#os3qz9xI7AC~fAblVV(hH)A!MNfRrWafIIZT8252gl2 zgY2z<%8?p=ATvN=1j3|-6Ni&*iw|^+0b~wr><$)g4%1~?R!j$v-En~8D5h7Yg=daT zO9!;=1#&k?9}H76b_cVQSQ=(0$PF+(N2Wu@?m&Hn6H_5>XP80!84WOVh^3L;0AiEc zMunIC(4%odegT<73??=Gf!5F+0EGn>!$I~6%!H&(Qq$j(g)%K2Ga+l}Se8S~0GYR7 zCh_CZK2W<sP6O#>c4uG!o!bDSL2KzibRYu*1BeFAAAo4kJOhXZ$%FKPFi7u@88R)P zG6giR0UB3?i5tv9te=97H-O4nkUToRgT*~rQ2RmWHh}B}-QNYGLGuS78d)A@9>_hQ zumO#^fciKsa}nVKQUf~I6og@Cn}X^akT^QdnFY}Y5(k+HvJbQ-4n%|2%z@}CsQW-` z=0JR8d5}I32I&RS#9(sLm%?m>JCW@G*&6|sBQ<?ZnN5B=x-gskI0v~O6gMDDYWy^~ z$hMdu<uzEj3W^ud{KO1UJvSFzt}=kq2FR`_OJrI+pn5>z1rmc{O3GE3ogf-i$AW0k zoCt^pwO>IrXifw~qpz6*iGkcJGZ#{>g3A6CptJ~0$FPAJboU~Ud4uF&=74BY-9XBm z$db8`c?1^dm;j6hg(JuvAetDAEA11S6N#7$X{&+as{|TGAbVB3v8M-^`vjIj@(pNC z1XNyt+}N`d;ujFx2PzL@!}P#tkQfXLERbmdr6W+e2f{FM5Djt%G7Vy{By&zAW<JEd zAT!9p$mxTSevrFkTv6vf*35(04-11UQ1{@9H*)7bVCEA`!~6nrGl*@l0OC%NdtqjP z#6j}J`U#{S8H4I9<nRZXg)EPcjVpX$deGafpf<x7s2^ZzU^K|yHH#qrBQ$0_XE8(_ zNH0hqh$aT(axbpAk39<^_F%IEB(`F`Obe)e04jqtHsMx_%Wb&a12P+=2fdF8TQg?@ z4JVKq7>4PAwM9VUpmYMFk<$u@j|(HueXQ{$e(pnMu}q83LI?)+8Su@0yg+h0$jvaf z5lh3|4$=!^gX&WdhSjN{^b8V5#|da@hFJSx>R{%<>;>^*axfYshAa=_<HNY(AEpOe z{xMksNoO!MFdAfU4pffR{Ig;SB<?_Q2#P<DnIQ8(G&)9)Kae~q{6U!1IB4;~UysdL z3h^tb9s}6}!U-E?T58bC5IplW1xsaGV0G6Xq%;6B3x;8Sh0!2!<T4S&2VsyrEUt;A zLHa-#q!&b!gF$+UwGXBaW)Da&`SUgLIRs{GbQI!q@{<#Dz=uEhfLR14all5RPUGk( z#KW|r%;&)Tg5KAG^>e{%u#nc!AorIytd(gASO-ZztkCuwj0S}bC|t-Lx&-MTDHs$^ zRGrg-j!lpneqeXNBEC322h`U9nE?`~!%#QKs!>db5U^NFopE~D{0({=YS_&0#OKgF z*@N;H`FS659yfS?Cq9Sfha?<0PMvfEJJ%Xlx`D|fX9Z9=f%u^DHdq}4qe0>~)<Wtb zm^zRcA&jeS2+AMmdO>Yon7baVhKw12&g1S_gRmFo9vBTWgBtDunFGS;ZB@|x!2@Xh z3zA31AbSngL)=E{_+86knHHHXGA%X?3=DG)L(Bk~cVInYT#ry2HV0}q$W0)<urMK( z2I&J~kY1auGA*DnYfvB1WCy}MAbC)m7=#J6i~ms3Js^9D!MM^FOfR<h+^_-SKbRUA z4GM=BP&rcLQ)MIh@dmOV6uux#Y8W>}$hOEp=NCZcz{XTzY2XdWU7NsTsvMyBHCQgw zlCxc=B?FqKL4F45gJIAZ9gIy14KfF2C$Tild}O@^n;>JVp#G7?2AP(SO)@QOKw}cn z&J##2Odp6w9y0^U5o<S09mot22I&RSq_(|_ON#Q66HDN0d|>8)%p!zIO}n6Rr<~2W z)9w<e9I0v7WD6qghFs+XO_6}t8)0+*1E?J!Ignr3-5D4%85kHqG^if~qCw~WgJ{sX z!XO%S#y5xt$%FKPFi5Y&dYP6rTOe~}DoADEku5SUEsOZTn9v#H1zQl|0WuS0PYu*P zptHO|{1PZ1G#3QoBg=!_0>U7@;PQB@Obcj^3^dLR6A#&nxO0o=10;MvbtFh018>E2 z59n@hkiA=>?f|V>0P)vB`5T}#NFHV$$UUI20gcUp`i)=E%4Ash!0vE`js3y&!{`ZE z+;bFa-&rUPy2}yd9?)HnAR1X7W)8?bFg78YoOJE74H0h0=7a35fy$AZu6JxBKV5&> zMt&MJ*iL?W0r{QWxOIq@ZFvAHD?x@ZFfhRC0#KZS?&kZkU8W^r2e>X^0HrICvJVGj zTE0N_fWjIi2E&xp1u#27G^pqX(V%<RKs4ySG!Sh7O@HTL7DC5BKyo1W*6e`P1)%!s z%vOlo!Ad~}Le+x#Py)R!fSCiLL0UjGv2KWW&M(aa6&z4|NSSXFfzDBJLdR=hG{~9g zVGI((g>mI0Li24Wc0k(Bp!j=&RBps1V^1G2_sJZB<Uvqafyy3`yS_X_%(q2A<w4>w zJun(12Ez@zWm-V#3RH%IFiado!~74UL1LhCkeqYT&+LM@7i0!G7&*NV(hqX4OAP9K zn+()`SQxnMhPVe;ypcQK1~Z>n8s-;}n?dXaP<Mgc3o`>G4w5I<PayTk7}Qro4u6nY z$nyBuxWWgf2ffV>YWJk<frKqg4U7ia%d!t5M`*qvXFo(8NH0hqh$aT(axbjT#W)vz zFT@^fc3>03<px~#!puPL+r#G7dZ6|rn+wx}Jg){y4<I$jX#&K@g^}mg<|Gn7uU4~9 zre)3^C|)FucTbT6G%i7I0J$0FHezXzJ`e`!{jv{H4{zCr|E`)HRJ0dlKPaz*@D6DC zi>tk8fR-kS^(Ran$Sx2D`4>ckFiZ|cgT#>KL414|SGt4g!InQ+4nWd8Obv_%*=qxp zBQ<|k9Dt@7P}*4pi9e8eFtd?q^mMc30QqqbG8YtgAWUlf?McC3$1XVt2`5k;3$h1< zS<cI}yn&X{AU+u5nG38rDANL~S9_4s4_F_RfQ1u`1_>jV*C0L!gXCf9gjgD+4}?K_ zK{PoSq?cIxVCrD@fb^0)7YOgDqs#=lq!yPT@7zK^uRS=wv?w`M2YxO*xK)UKW)Rte zc#yf!&0Qc0Y6_%LiL~1bvPS~uKlFZHd16ssW?s5RL1}S@Ce-sFzr(~+GK&+Fa#F3# z3`{MN<)JPC>j0_OI4#ox>T83>8qXm0vq5aw{1Zqq7qq<!Rtr@J5(i<BIdd+^v>>bJ zhN=gRWrko;57LJ`o>Fj1rbXa1B>nS3^}=Y7T96&1bD5x!z>h)UME-mR#B7im&~ySH zyMo9NCP8{Z2S-B&z91<ABu4Xz9Kuc;RY9c?_;Hdt^H9Te{t}*d=#c0^d5iq~4nE@@ znpJ7PKds^mb<z!NpBH)`2R82wlSfYOpl|~5L2YeVy#k{_;xkS`>K>RnkQgD1t1S%5 zALx2PePWoq7My^L!GOkkJx(I*g}DbtgUkTAN8qeX3#c9i&A**Fk5CViCkEqkCrmGT zn;kT-xdU1k!_>fNkb5}JK-@s;m@CUAnU*b&AY<sDu_KU~AoFINL5#)DA<&k0f!Ynz z3kxe^X^=h;2H891l1vLIY(e1~a24VwkhsQK;`;|zsOX-CGcqlp_86!w25L{i+zFyV z{S6Q%)aOV!3-Jd?56CaXh6_v`NFNA;^nz$&FgfW<;vB-A$aaA24S>p#n!b9@k)MuE zoFhNZLGA~|4G5DOKN`idEhR|pW7xPnEIuZjmudNN9y~730ZJQx4$HK3T#;#UfaXt7 zc!BJPVbHiPj7<s+G6!ZSu{6wlWW6F6Amj3&e(Qp>5Vr?hAbvj~v3A4MA-e&@Cbdri z>n|1L7r?qn;Q7sjPz99!3?H;l0xB<BK>h()2E`!%gX{d<0<Z{(4`vWSkeYWu=XQo% z#GQ9~pmL<<9hpmr^uOXA{_&I(P&+{01NoI7y7v%7gW7Z;+M9ua0YroL9)f7l-a`-# zk_YJnVUXUMJ2EXFPDAE-dp<z?1rlF_<emrbA?^Xyp&)(eIN}mSA4nXe7i14;eiuZ8 z_Gf`;(EKilZic$66-tBTLHa-#q_^X`Obe(S2Gt2Jw;<+%#6j|){0+jec~wwb0wj)( zUtn<$=#FTR{fnUXPKMGmpfs{P%siOAFg`w-oOCqjGQ@xA=7Q|K0+k~*9SK|^KOOlX z=_NJJL4E+m4G5DOKQ~HbTh1WmX;>KyiZ9TdpvYC3mYS<F;IU~?+5p*Ab5o|}4pa{) zyg*_wOi39GvlB#v=0ZWV1T>9EL1_gjy%=U8bRH6<7UbR;S0QCEsGd-{3~@VHDRf{F z-Mz?jT_8D_IUt%;H-MHe=Vc~COG3yP7T9hg2y)VJ!ZqA!cm`CC<TQMp_%wV4Y6r-B zps*8gXJ7!`GX$bRca?x>Uj_yS5Dh8=K{RNeHi!nvgY<zgNbdq9dkLj~pX&&JgY<&T z>xA0V3#CD8SwP~TvJOOp%0v(ik_Xud!XUjocV${YZDCNE$MOJTE=U|C56Vv<Oejy? z!Q!4dP<MdNkp$U070L&dbs#>nJjgB(hS>{Z6T;-AmkBo@{zEq#WbX;69I5Gr<tF** z#Q{k#sc{bS11N4lnAG^`D3fiu0`2pF%z>48pm+h5Asn}4S_*DK$~;io0I9LLFVpe@ zss|KaATb!Gq|Afa38F#kK0q|6%mdM&G7m(9$~+Ja>NCUa1i1ku26AuDEl8OMDwid0 zK->;iM`W1?GY3SI>IQh32i^Apau?WcA_#KQaL8@kX}AX}M{*jzLwp)O0ks3<J&<1o z-5D4_?K%(*+7}6;L1$QlXi!-PqCsUMhz7}n^nox)?-V3^38jCBI|zS+^n%O-wckK= zKLY~;h^~Xupt26c2bGB+8YB<06NEu}H~f@o0gXq1%DkLE5OYD|Dt8g*9}vn@7qGYo zbdMj%KG6MrAbL8~J)p7<#7C9~xdntl_JYPmKy6Qud)7QfxCbN;TKfyau=T&NwFMwK zWSnppq7NhnG81Iq9;p3?pfqT`AxL}|l#eVA(g(sIy&#$xOiub0xrcBkvK=6MeV}rr zrr(Zx<fq>wNP0<4gADh{PcI<9gW?s0NsZel6|yZSp#2k&Ik55@6t|%A@Wg$Y7J~<n z@*9+{Kx&>mk!iUD)dLD^kQfY8Qhvki1kpy&bOkEEL3~j84WdEiH;4wUBZb)sasx;V z<X)c#kn$T;$IQ74aXVNYk>xkc91u;a8^C?{f=c*Y7sy>;yNMu3P5+?vN+J*Oq<^R! zsp<d7L&Vq@p>^6FP&+{01Nl`LdbU4^2Cdfy(eVrn3?Le`UK>QGK=~kfkUkIw>9u)8 z{90IsM+kp|^n%Q-gqjOlSPtSBLiy!T8d)A>CkTV|o_U1G?}XM}S75PsJ=A<qc?hx> z)Gr6otD)j+p)^PyWG4uN>;;WgfZEHT`S_S;5dVP0LGr||&E<Fu(Ff84(hIT|R6c{~ zQ&4+B<uizX0Ln*}2k8T0kX{f?3??U??m==VvK=6Mzd+?kO{WG=$WNy^PsmSeE1r;_ zUO;{)H*W7#$+mPr`&1xvVC6I@Zb9pq3!cif+;|Epr$Oloq$c8>Ov@ao9#B|=#9)|` zavEkQhz1p_AR1Kmf@n}bA4G%Nz99NE%tGkc0!R$x-Y-uf<us@+ad`}JJ6I{mK&V<U zA4;H)Ex^nH(I71#npiiGvd+2&x;9x9I&KT2LC!)CQ;--gj4R&|T4!zW3^K<DiZ36e zazddAdwPJmujM_YYygD~sH_3G>jJY}3vBH308}0%4$}jpL1Hlc;)P5LC>??3*+3X3 z4x(ZHhtVLhZDgKnWby*yUXU5&VC3{cNI%HEJE~FFS+_ig*bfVXHBk59iZ@VS8QmUY z?sR~ePb>|y1LS59o8u+KognwZ%m9gl<cakYNIfzJr3vKl2bqN|kB^Njd|-Oe=Y&D+ zmNQU4z|_EKki9vtA^sz@j`PYJh&qs7kUkJi494YNSYHTzopsGCh&|Zsz$S*v4Y=%u znSs6r0k+Qi3)FsOb76Xr*I9$o14s>WngH=}VdQnz2@S-rvwregriJAd1cT<-LH%%; zd(iD#0gX$LI7ki5ZN$<beIN|d8}kNH?-E*Pt$>y`h_w%<4rC_?gX{&-pu7&kgyv*t zP}yFP-7q)7Xpk7pT_83gj4R#2^kK`NId36p9;OCHgX~=bl_NEOK6ndBGoZ8sN;e=g zLFR#Ibc~*EWZsb<_aL)DaR<Vr#$Q7-{yLTiT8Dz_Sdcv+yyUk`O9*=ThG(7ilXo&L zuzK|iQu+az1;em#g3%yx<nkKC2VsyrES(TbgY<zgNH2&c2ZQtyYadJ<%pQ<l^43{{ zI@&Z{XAQN0v~|`n|DpHmpko7IZ-e{{Vj!<E(D*LXa^gEA--$unnlKuq7Nlo%-7+X7 z@MBOok-v@+Vm8POXneuPav(B<NswO1x@A!E8C|zbIK+mYiVfeWv;Gt`*8%c9dfN}S z{uCw;QUk-_^hLw<z>pLRnQtezyn*K(8oCoDJjivZ5_H`%IIGfr-Ex4STni}vU~VTw z<7&IX*8k#4H!yi*^I`Ua)*8X;6&MXt7XYn$VCq0(gfK4mf$|5sUQizs=B|jZkTDJL z9PBqpod>cP<{lUgG6N(IqKUz{+ym2#-qr=JPmcHju^*-eMuY5K0hJ?lY*OK;Ov{ab zkhN$LymFu+Y4BP=i=T)wOG0hnCs4aV?g6<47AC~fAblVV(%T^>*D~RUObcjE&_xpA zo)bTbZ&#Q6M1&K_Ok&*uQwMSj2!r%y{Fi9~t=9v&r-KRM9*{h!oesi;+UhL7sOKJ# zy~JR0($@|ocOu&X3WpC+Ia1S?4yccj!Pf#xzoe$4jNjzPImrE>xB+2O<LAvp*_I{H zb(tV@VB^=Y^kMKvre($-@c1<cC~a){Ak%VyQLg0yj&cb!9ttvtR16Atn4QGZFguX- zZutWlzXtX99DYIE{sA=q5A6(s)WY<EXyoxpkQ}jg!_<My0AY|`5KU^|0lc=PI2C?~ z6wDluS%fgD=^ix3x8W}$e<GU?viAj4j?{FY@DEXb61pE<<sZU+ke%Z03=E)qLO?X= z{%H^mx<>>=gYF{-(V+W8Kr~1m=4O!I5C0Hz^MuZdnuEn&(E2%$xuCTqAi9)+fdNE= z))IqgWO-zJL1i|mtOT7E1sb~t$${L{@L#3{w0;|e1!5s<nnCqCNFE*Q{KpIj(3)Y8 zz0;uX0Ig{O@h3w0$nr4rK=y*_G|+k%P~X;q8GE@6Tk8TFPlf4+(R;AC2h<J#*$<j4 z1<|0jEg%}SE)_&0%frk;rKMUV7-U-x{0EI=g51Rju5UqVYRn+{G&CicCxH<p&%m$; zN`vG<XTtP6l>*n%9Sjh8kT__KVGcI~!xuNmnk0}IG8Tez=DdaI1#$mC&AGrJ+u{H< z3uI0%)Ev+nBak{|3^V7$8-zJLlOSvfM%fman?UB|LCpb$53(5`Hq0E3ClI|Lu@p8T zu)jcTkefg>$eetrIiNK=ATeYNGv~`$ggKzF1*rjr+minX@dBthpm{ftJTm5nCV&rC zi1gRO*wnIxQMLsX7a%i1=7DICJ^^Og7Et_vFo+Mrps>egHb2yC7A8b|O)!&bf!TG& z?MaJ`jZ6y{C_P7;h=I%onU}+iP>&q%4M^sI@<bsw1H)GW@s1omuy{YgB->&EH49`; z5!4)f@s1o{uy_Z#73L<8ImJ+O@WnfF`VoM-0pwp$7=z3M;S#7h*uoSRUuWzQ@deV8 z!Ytb&4hlmi*%pv_Fta&WWm`bu3c?_DAPfpKY-YpaYYS5N2iVB8!0ejwN2*1_QKkhn ze|BO@!y=H`AoEgKvB#GI3ql;UF0PcDf#I7Q14ArG6B>r4XXNmK#a9K3Y|9I%n?UB2 zLCxtwGXunhnS(994zS3!z}y5fryOby?3`JUei(+CgPeYl^C`$pAhjTKDxl_o&dvjg zA!C?1$mP!gs9!+g28t_~`bwxd*y08j?-N`R@&4eiR7(u2YzrtZKxTr>1JNM!X0XY& zfZ_*)L3|Jfg*`U2Ve!5ODIN_RWm;f%X{@~7a>q@kg`I(cp)@h)9LQ{td0*HN@e9hQ zF3%xlP5_cPXunGpHv_|WHwFe*kR~*YEqq*-CANro$h3gW%#d2vfTjh`)j+c60o3gv z`>LV#f#$s6ilGdceaP{;1F9F~A5a)Vl`_;o&A}FCu=qIPiHHx7zBg>LEub(0nF%rv zM1#aRIAmKu;ReDWJ_v)t1e@8g_^@F|gzp<SnHHE`0oO`fM7$yOrFX@avvUL?>fUfd zXpq^Uuq#mVZn+U8)56KXz|b_4>mSGsAh{F{RCOskZ?(J$g2eB9ox`B!7f2Zfo`K{Z znB+_b28LR028JJQ3=H`&K_nVmco#s;0l5PdMlj`dP;)^0CtzYQ8W!FHp{U^<!y(%O z@*BuZka-{)qz4oxApe3eh!4UbH)1mz7T#-+!sSnpObg7eDN`WnngJ<%L3<kNxfvLK zl2HFt?1Y%(!71Ca18Nt@oCc^lpnLN`?nK70@Ix*?P~rjVCXhLeP;;gr8vtd)%t0;} zJ)rRbRRX7)pyq(?HG>O68Qd(88_jH@P~+hVr)&!-ErQGhg*}J{X%Uf?Z2|E?Y#0WG z88)+F@nFJ*NS_nJWLl8z>WGG<Q$f22e_-Zeqi00RwD2-8F!(1lfVvCVlrXSx%eKr$ zIvX=14s^aDBSSkkrgDvwye$(hLgEi53)0)n&A{->4KfaUN*>zafhu4EZ9ZgRVAv9i z8diId{0CABYO{lA5Jp!E5(8nFnmOFEEin6Fv=;*d!wY#9Fm~ZagdIp9vG@xXb3GXt z7+%S<fHBBkV$DKU=fi{PUReePhBxvoU<|SsSv|4rC0NV_^(NlQvoL@#$X=LP8C(cA zz{GITf3TP<&cML%L7oMSLH6R(i%&d+7vTn2ygguGVE81@0>&VF@#)7Uw+4&3Vhjun zU*uW97-TOlz4*jg_%PiI3Wsm<EDRtFvKOCzd~z`V!)Q=l1u_$a@#(`Sw*`xPofsGx ze#o<caSR`M`JzAwGaMor7#M!Zvw$(kUVQGtB?ns9!^8wBH;~nU#-Bdy%>)g@!^;&| zI3cUU#Riov$m@+*pk)uSW`Nv<ZZ@dB4-x~FK_Cob!!SA@CJv(=pk<wn03!TBdt+LV z%1xMB7>%v20_9<t{1<+RSs-&-i7*Gb?gZ6K6QFe_%sdd?hQ}NcCP<xk2FVW~J)ku8 zKvcGc@nrzh1gJkj;@EIW3~C(!Q)81X(*p7jtX@WrCy@VO>OkYDJ9K4QM3NxpfbtAX z4n)h`mudm!Sx|hSy9Fc$QiBVF%m#%ENFLON1hu0;G>DI{Eg%R|z`(%Jf)p+=bD&Zv z6tdrtC1BMpC@ge@AaRQ<|3px>1!e~*4nX0BERTzQ0!!Wn)e(Q>Sr|YVl(%7eLGH%o zKA0L9tssn9CV<M^fATC0APlk>rj``C0*kpI_cAE3Fn}<~UYL2Hd_}B#FJLhjG*-!^ zz`_8+AbVlvl0s{UV1@(8y(|hW3?K}$7iJ!){Y0#L8?cxQaxa?#3j+v)?1h<23Vj2M zxghs)D6lYqFvwn*d7$!!Soa!;Vuk~#uH;f+VE|!}y)bi0p*ygc>%zdmz@xwd#vpr1 zF%PB|RA#~a2BV!B7#R2zSil%$FH9||G|W604JxN#=8|d_O#KEa*_Qv%Ha3jD!N9=q zN0|kTEyOU(447VgbdLh2xuA3=rozGi!V}0e7o-p7P8co9z`!7)!UD!G$TSzE4`v>W z2Blvi6&3~%b`VE|11P`2)ZhyPkQ_)KOf8HS0qxyaVPOzZVPTkoWG+ZOu^6NeW*&?N z<qJL)76uUhfMhNy<rzpH%sdzk3I`q)76uUZkU)e3$Xu8jLhc6XgQ<nlG7Jn1Tq-PJ zya35uQ24^qI3aUE`e5e4Xi$B@p~Aud!atDAC1e(|JV+nRJQxk?v$3hLFo1A?BqAJ0 zDbGOqVCKPSkb7BFSQtQf1(LbQ?jghm>4TXEqe1b;q{6}g!VFRf_a2c!<V`~6g7m@6 zgVBv3O)4x53@R)P5lH5Ogo(u<eK7N2G|0XGlvx-+7*sC7%-XY#7hXoe#BkA|_KS-& z#IML{h?w@?3Tatzd$A>6rUisy`qAeVVdBKnFt@_milFxTi(S$!APh5uT6TasHwosv z@HsD--7p$vAB+#9L1ie69U=n>KNz3dG!G8*J9MtJw4_4jtPc3!vNTbHxT8fLLWA4^ zs`EDdU*F=A3mL;sUgh!tG!6!mE09H1_XcVYNF3JY2C3`dW?=a3#=zhM;-F#JSZGT= zq%Q!I&XARD0oesI6Ko#TY>*p4_Jc4?EiSWRV{ki=+!>K8(*m;#HWtbwhwukz{-l$e zf#I(k14A^-0wfyNpF<vVhmD0kkdtjW0<{ZdP8ZZ1<hgyAQ806m=ZHXZSBfBGf*ek` z$F4zodQ@avepJeUF)Tl$r)iitu{6kj5C-L&5Tr1Hg%8M2-B3SaOYks1)gb8wm3<&H z(Qyyd9BgB!uyNTNC8%klMqaiBlukirg3<wq2AOMOA=?7tgV-<(ia%^-!_veVq%_V_ zDANM7%SS=BWdYJS>YWP6IO;@L#|~xz0|Nu7-UN+NAPF&m^!9QyFu=n6mooNoRE-K$ zzp*GF(jdq@P#l105Jp!E5(8nFnkQJ=exUQ3Bve=!Kp50E1gR$#+bAOHEtr2mb%vA* z3j+v)?1h;Ls*_=AU}CuFDOk(}wWVZKSQtPUWG^ng_{85}F&8v0DW}510Ky=9@#)7U z=c0re4xl!Kf(i=*2!rg!r5B(094zL7!a+%eg#m;?_TtlzPYxCrFd9^jgUkeBeERUo z`6y$C187`QMTLa{guf`EreS<$A<J>7W10&ZmsC?>VE|!}y~yf`WrN25aE(jC)|bJ; z2SyWPHYl$mk4sjRL-I1QW`Nv<ZVxraC9kL;!hazH14AEDIfQN>wz3+OhhgeK^$Um% zGN+#ib3k<xNIeLH%4H3t@)aZo!V~bA0~?o2QAPLxqz9CyDzqTuk~grJ2~q>YFUlbC z0OP~x4Ye{YApgMXCFFPl`46TJG<LY9P^P7$24W5<&%oqBG^lS5%Cn$y7u_u&F_0Qu z7-TjmTtM=m_7$j21EN8Ee03pgTv7%pTwvya^rB;Azah)PsxMGj9D%m;kmYOCWLsc% zfZ_lYUdZye*a=wjE~t*sP+?&JVNl+N=>@qPm-}F9VDt_w=7P#xEfp395C+)`Q%edh zpn+M|fZVI2!omQ;AbVlvk<#DJz+x_F{6$ZNg#m;?_QK31g+74AT#$PWR9F~57-TQZ zJWzXt*zlFm#0&?JdyQ0B7(f_gFU(w0=mIR}g4}DO!omQ;AbVlvfyx_V-FpIyxuCkz zOofF3ghBSg%q4|Z(83G{(72?93JU`WgX|^6JeXQgnFaG3j0TNMTB)!wfH25jm|9Y4 zn0YW7R8E1+1YuImf~oh=mu+E$?g53-;BiSc7KT4+EDRU4P|IbQK0@>zV@z{F@g}Cu z!T`b=+T@uF(g$-Vj0W|oMbudsK)8WSb3yuG=D}$OMg}2u7BIenWG*Pb!PF262arCP zS{Mx;msDqA5Kw1fFwh|{96<VD=D}!C`0}Z<Fo19elDVXmXCQqr^WZcCBLj~*3m88@ zGWS3`FFfrK3I~urxOvd@1|FAGXJOz{XJN3=MT7$=d|_#vkhvgz=;ngz3l4P_1`wWr zWG*4IkmW)8(9H#pORBRlu&J{!yg)LSl=2Lu58Yglds)<37(m!T4-pQ??jghm=|eXc zRQ@ulvoL`03?y@73=w&gkhvgz=;ngQCDmCN7}Qx9J|LM($Sh=ekUn&CLGJyh#=-!? zpmGVO9yBfqQwtNrMT6Qecl04)h@6IqY4150$b#F8v>aanxf|482koZ-VVE1KHHJfI zToPs<$Q{TSREEO%Zww&e2jf$lUV_7X3&wvfZ|WgyJ;PfWxj^GPAiJ*^A>0G1^I&Uq z4Uoh^`!^<m8oTZc44^R(kUnG#>-Qj!-+|<>n8~&nbjW})ERCVZ1x%b+8e}dAgZc)b zvJAuq;TA)PKR|As40S8Eg?%u$o`I?d=>_Fk5RHzfK+VB6<^>y1`_TmH*TD3iF_LWo zg)hiVP#A+~kQ|4TYzv4FV#BdJ0|Pd*VdH5s#t=V&)i=nr!0ei1EZYJ)LmRgDPNW?& zo;CyIUa(>W0SY5f-x?vpzyQ)am79S97UsXyu#cxDw4wSf1lc`kXS<=Rh1my+ClK4j z1W_)+>;;V@NvN|hfH0^{15!sS?!jU%sLYpAXJG(gkiDdu2~z(Ai@BgSfQ&i|0|<lc z1*szk!~74ULHQ13CJ2*b9!Sp=Q_S!MjU&mavoL_LjVV%E0%;%;b68@U3mQjKP-kHP zVUWE<8ik?^G+sk!90?XaFdD@G92`&@MIJ|*(F#e!#F_ze7rN1uj3a^Cap>lO_Q6d< z%75tcxXP#sq%s+%XF48p;Nw5$sBsTU3n#20<3Ac`c^YOejOKubAB+#9O}b@TK;=8E z97PUakpE!nKw~r>Z89w$U66PHrFEDbhz9k6z<CWc_K)TkSlIzmhYf?whLx|NdJHu7 z1EN7{@s-{1@gJmcftdr+i;j`~hAamwZb4yj!~!*pLF#HOWLspQcBGigg2M|WP6#Jp z$#bCgo02*U0|<liB+LwuyK%V>rUpjuz+x__tW;5FVE|!}y)d<;&;nMNWdz8*YU(Tu zAPlk>W*#U%5bNFyEarm7Q#90B7(f_gFU(w0=mS{H1-VyCorM8}LH5GT1J$3zx>o{} zr=a~Wm>y7_p`*^i0Ky=9Vdj!T7ho|LG@hcT&cXn~AbUwM52hAe2B5hYG@fDr>N~5m zFo5iZsU?+$`5#7u@;%I4Qq6*?e_=1%!UA<Kj0TOTWazRmfUtrMW*&s;#YaDJ#WWX` z9_n;i7(loJ$y`u+fZ2`DOpqK%A51Nb28~bD=&~??@C77uLF$RcAbl|NU^FP5Rq3)Y zfUt%wA{<C5A3*wG=D}!CI8^AeFo19alDVLK3{ykM-5`B1wJ;hqK2fI2!T`cI(9DIU z8A9fQ^uf%7(V+6IM3;pDgbnNv;XueNWO<N2n0YW7G(J(J%fbM{9Z2Sa(gU&X1?hvC z2ctpmEzo6Q0O1En<|4a?5F4ZqW*&?N#ao^(3j+vS*dxMWhZ7>L6EYX14`v>W28~bT z=&~??@B}1t37Lf~57GxS4@QIBo2ARb0K%Yr4pR>rpMa@>iQ%F_?U5P>h+mQ8gxK~7 zNIxz6tN7M5A-fmZf5>A88jcXZA<I*f{Qw$v=w`mr-rC~R3t2;BYofFW)RzURNpV8B z2UNa;$^?)&GG5NWz%Y}Wfq@BHZX?Tq*s!)P^4P%)s6RpG!`gEowX^V;16%X7Wg4WN z2~rQjF;22AAUA`|1eph-LE<((vMnHgfG~&;!noWB>yNKN@^8l!nHFTbOlCm#+s>4f zHwT#wGVhKHYWTp$R(hNf;wu;!7-n-bFfh9_Fo5pH0qH}=*un=Sf5%I<1$0jc2(v)L z7JY05CQd93G8cqF<6NL}4aBx^k!^VZ^*6|^bD(a;wh0*KRt+Tof!I^LWLtC=%78J< zE!1)=sE?3>bUp?wY(Z|F3w0~LbyZi8+zKiiL4HQZ^PuKn8>@kh1M$p3O?OvZWLrRK z0c0j9J%DJCxeXDrEg(LK4a1<g$7VJx-Kn@D(u>ConHHE`OI&4JRwAvd5?BBk2U-m4 zn7}Lm^{r0wwt)J^NJ0!Cz4N&l7+`Udri*<XC}uvY-(ry512PX32Ot`R(ba;)Kp3XR z#tl*b!0ZK;aSggG3?K|@i-FXWil<;P7t~j1(q&-)VUWF~nh8?>28+3%x~fH&g#m;? z_JY)baKI!1c>5H@$A?|qF~b35ZksL(0|<lch3N;SZ&+Bt#BkAbu$T*K8+PcjFn}<~ zUR-+diGRUjE@=F&OP7TKghBS=(~nEe#{)AQKy9KPT^0rq2HA^CFFx@lSj+{5L!T}S z0|<lc#it*i94sziG^p+anF+%9^x=~W@x%-V(D>a1T^0rq{^Nlt1Mr!HE+^oNX)b8| zZjvqw0|<lcMb|?NA2d!zX#5TqJ}{aXb3tVb^7!4Fd62S)STjKGLbrz+<9DF?7G~}$ z1_p)&NaZF>97e<HLFBpxl!syRp!yKR2AQ*v2y;MnC`dgBgX)n6q;>^J41^cqF$Xpd znB$F_hCpemApkNCXn<CxgUm$6GSGNH76Y-LERkse`3L4#<ah%452OZ!L1T44X2`Vc zSqzC!P@Vya!!W4t4$8BjdIH@oATgLaY&6JhP`H5PKy5BiI}b#I`1tB>*f^jHQn<j( z0qI4@$bLhXgH^YnusGv`8pa@XEk3d>FgrkT017XVI3b*YCGUdjh$*@(3?K~3+b}ag z?#AUlm>L*;0E@YxGIyFT3j+v)?1iZ%g_iKcENejSouSLZ0Ky=9VdjDQ3dFj%0E@Yx zx_y=|3j+v)?1h<23Vi~Lxght>(Pd!(VUWEr^FZxkV%@9Yj~Nai_s-L0VE|!}y)bi0 zp)0VM3v%xQT^0rq2H6WU4^-X|>)s1k%mvkzi*#8SKp12%%v@4vjR4GW0F7HN(Pd!( zVUWF~m<Lk}DzjjIgVCUI%VoMO3?K}$7p9g}8fG4h29;AFGeMYCvta52LS<Vxp?x$M z4H~z6V$Q+<!Z!ji%M6%aeDs+ZOmji$?4LOc0|*-gl4mYRAIzOF8q`MrW6r_=!X0Fq z3(^NO4@QI1?=N!}1`vLLWG*Pb!PMXj1CSg@A51Nb292}+FlS)^VT&O0!U3cYW*&?N z<%@6TEDRt#0m)oa$}^BYn0YW76b@g^Sr|b01(La6mP^6Y4#=<gFi0QFJQxicXZ>W( z!T`b!!H94Gg)c0P<1-T^2hs;K4@QIPix1{33?MuM$y|_nVlhY`%sdzk8fSfH&cXn~ zACSx?r91=agP8}TLGFEH&cXn~9wCTuAl9uQbs&8(^I$Y6-d>rrFo5s^By$ZS5qT4& z7as=cgP8}TLF241%vl&f_y>}?_{>3<1L=dA2ctpmeP+(W0K%Yh38n`$&I(fl6T?M= z+AmK+Az_G|hKOnJd4$P=+l#au4+6Ox)LsXTje#)Cjno=*0*#O18_R{+2XY5829=>O z{+BRF_`&$prq|#xUuHRE9aumsBNu2q3S{@42!wk;bsnfZ1BqK8iLYT`U|7P<z`zQv z%RutT7}oDW9?J#E-)NL=0i87t!mxXF(BlFoPAm;F7lc9PfXW6C8-#npA^rflbtw^U zy#iGa(whQhgTeyVe*lRu!($F?+&N(*q+bJ4-=V#<<w}HX3n+X+W`fKE(IB~!6xkL~ zn1e8g55l;@6F&YI3Gow1ZN@s87G%2~Y=Xq)NB4(@AhSVg=0qdZgW~ed3CLdR1xV(A z&S+lF&A`C!&cJ|thc8G!2*ctMIecJya($v?TOy!lfy`L}H3xM5HApWqhM9w$CP3^n zNwVO*<DmWHuyO|!m&kfy;>6N0y`cPg;w8k-KcZw?VEzWVbtTlT$oKfd^ugTv0_r!A zIEdYnB-=7)j|>>Y+(Iq4g8H_|=LLhp7Gy8Tt*fAJJqi*)!!Wl_i9*CRsLnxC2Ij7Y znghD86)b>6z{an0wj<InNP0@NYzrt&fy@M@D-aD5*C>{40r5d>7zU*wY-YpK?-Qi- z_+^t!3(T$;<qKOt_YZ*j?;d@t{9xvx(>*b=E$fiRxf^yv#<@4bI^IYcK<ygP7!r~Y z14!>0ZUzQe+&wbKKF)n+7it)|#2~^JWF9E4Kr{%Ws|AUHFied~ETaC0*$X;{k->t6 z0fa$qcaVBgaSax8L2V``3l;_t2H8uhnIQF7u$T)vhmpmCg#m;?_JY)rign^J!vWL= zVY6Ui0AY~5Ff%oF6W`Wt!D23`@55oi!T`b`dtv61Lf^q+F37!H7Ay=P46+wy-V;7% zqTA*s@z}$G$AX0cghBSg%>59JPzw{oMfYGa7t}}LvtVHWVUWGJ^x_kLg2i0Wc)x%J z3j+v)?8T=amz+%k!f&vA0cx8IS+FpGFvwn9dhv-*!D22b97HTw7(f_gFFyVF<Y4ZE z(V#jNWF`pX(}z#aB@r_mK;!*l7Ay=P{3Zdl?7?RivYbaMrn!*}3=9$$EMN?>7g;^A zY|ywmuJQg4`yl60!omke6Js{0j71*rmw}eS#F_ze7rH%^jQ4~3+aU8m?Gq3U!s{6r z7}g@yA0RPgjIAyPm1Q6`BFVBXp!NfZ4KimP5$1r}93b@|3@QsiGzi1o1Ttqm5$1r} zSs;BN4645!km_NO7zl5`V-9TIU`aA+S_Gxdj7-S9fdpC|2{IEI_v}QiQ(<x+4#<GR z1=fB+j&G3vVCq0^1DP!{Ej{}o=791ZOb$eY#?C-_A5`z6y9Fc$QiBVF%m#%ENFLN? z2DQ^cG>DI{%><h_h(QV$m^mQ5=or~=$a1je3n(mDQc=Sgq;5}&Yzxc|P#nP05l9Xn zUVx<x0M%hq7Ay=P3@RgF`a$l-<vy4i82tl_xuCLJ#)5?bghBSg)RIC6q+ym>Aot2y zurPoy$X=Lvp!`X!dskpF7t}^juwY>TVUWErb4jApvAb8vf`tKuLH5GT1GPtqb#DX~ zb3yJ^v0z~UVTN?fGy<~+AH4yKxuEb>vtVHWVUWEr{h)G-Sod;dV1@(8y&4uQ3?K}$ z7iKOgbOIK0LGIPEU||4Zki9VTK;<K`?%jdKTu>W9$AX0cghBSg%q4{u$ixf>&^(8p z1q%ZRgX|^6JeXQg84L3pj0Vkf7+A0{fH25jm|9Y4n0YW7RIY-|1YuImf~kLzC)<KP zegm54co4|K0Kx|{$xFWuHJIjt`aJ&vSr|ZAB8xn8LHf|$3+ki&31nda;Q}(v1?fXK z7nCo41+p-J@ChVyNhyCp`q0e<jVb;JWMKedg>3S|0i+MzTu^@d7RbT?!WBs7g32?P zT3Ec}qCxs#YGE{JUgk?63j+vWKr$DX8Q8=@`e5e4Xiz@>6v)B=!Wub<Z~(a%md3G} zg)9cr2Qv>wgTmoMAPWNsHz1h{s)t}|kj=ox2I+&Th0&mSnRkIK3?O_1$y`#(UyweS zc`zDOAHNA?VE|!+Ttqlva~Cc#kUp4sFdCHKUInr+fN%$rxulf8Abl|NU^K|RF9KN@ zK==WYxwzbhO&p{TW*&?N#oMz$76uTu$U}s~luATdg3T;sF_1o(c`zC@FY_djg#m;o zAeoD-j}RNA4`v>W2D$f9APWNsgUV5u8K8L?m>QTEE*jK6tjUM?6*<il)1H2i59z1S za-7qpK(+<chXIZGf-uaD)EY|#jr)Sa2Gr*Q%{729we0}872n(s%s!AikTIy7hVefX zK;j6-r#8I;hxshlyIV>QL)P(ck6v>QG?ojpyQLW69#A^~RJMV{O^OiW8yOfFHgPjB z@DiB&L7p!Fu_rVl#`$6C7!-ye^I;e!PAm=62a0b{c?se_D3WdID1^8d<krnZxb*^5 zJxD)@?a?UP!tzQ6jA3q}mRmu6QBYY4vI~S^VGDBW79!kQgA^ADP<Mmk4c1=;nYk5@ zIk0&umh+H)G)O%N*A&aPfYJiUOptjX8YF(BM79N#K0p}62Vq=s4;$w{gOrXOPRq2w z?3!`&Ov{-IkaQ;>zvdjsY>;^-rI7dnu|eq$c7LZw2|^q+PqU4ifq|dE{s`pof!zx@ z0b~vcgVHVo1H*QxIiUMnL3Scz*cc8d9l*qq=Vf4S0=Z`g)Ev;AS}?UR8fFeC?Zd=w zK*I&(Ur-ps#CJl?!FI<REWSFfAmZzQtxk(hscZ{442xx3K<2^B?kJOO0fj3F!^{VT z88)+F@l}Hq{&z0Ow7~2-;j7+q<tk)e@%wFlUXa-!GoO?p;srUreju5%nSp^}7dHcg zfI9<26i5>q#uh%X_;M(dZP@@d3uMl2s5zZzW`MXbb8y8M%uOJ3_CU><1Ja0wVdfyG zpAM)SK>h`VF-*%|s5#ie6c%4KHxcp0kZ`NzPMK^AI1Ec=TR`T)&90Db0fj3F!^{VT z88)+F@ugFa2>%yXWm=H!I&llK|HwGUMC?fgM4dw=ga(<99A7Jt%-O=gz_5>-fkDt6 z|NXeg;RB1W59P8g2~e{@=In=>(+#o^4a342TYSx_kZpmv31rRzs5$uVNkz_IQzpo^ z_{@@p-=!=8t)tM(ZkRZ+G|UU2dIouo0m$DVIgncqLfwk*4qgjre1P;=K*I|ZH=y(Y z5(D8wP;;=wKP+w8+($}V3=9kwm9j0M_y(B?G7m(9%(7^fZ2_eL5C-u<7!<$Q%!Z|{ z4y3el=ax(h%r1jHzgjvTK+1x@JFSdBW`oSLs76g&ur&rORS5B|3=9m1xfvLQ-5D4_ zcXNaEA!AsYKn@@H8iOj?mOW56fy_AqHK!8U04N(~4sx1+&HqoSl5K&x31rSus5!`O zVyH0;Fmte_QIHxRsNX>59D|y32qb}qVdfy`8Bo6iO&OSb9BK}>`E%IZ{F5iB@orEp z+X9LUkeQ(P0MQ`B-b|Ej0r5d>7zTwsHnU;z-hdR3a~{aF!0oD$ZP|u2=l<daWX}C8 zY|t8J0R!aBZqPgqk`Mz(?+I=O23R}lULf{4cas;We%pcM9*}vUb`yvOVRW@1F%X8S znSo`T2sDSy5X8a&!k}>^ka|+_2Q21-`fE%<EDRtFvKMBi#%?M27#K_p7wu7t=!?R_ z2{cZ`62!s)!XSHb>BT3$0E@XG_p$}CFn}<~UYLH+95&2um>4el2M%*Nf>;<p7-TO@ zFQ~0cthoVonBf2#&*2JUVE|!}y)bi0p;urr7c_^>6U4#*!XSG|F%Pb`9@D*`aSXm7 z76uRo*$Y=o0wV&8xu9?m2x4IXVTO7{*-C=3V5P9QfYG4#0LV-b1}h+g;Ap@M2hbe0 zP!J0P2yY<My*w?L=7Q$1MS@ruKp12%8O~(@%@yOC!!Cf{sR#=n7)^{lpfU@24!h+! zq)a2$43N9f?V-jTHmL6nGj}@!1H(zA@)#x#qp{Ulpt1}k4_dzo>KlXDAahO;VGeQ~ z3MvagdO;ZGCXhL&i7*GbP6yR<cc67J$SfE>gU1}$9Ck(%YTf~*O`Q(N9Ci;{odYu$ zMt^w*iBA|GMn}ApX#s@`te!`XZ;=0B>Ok|%ESF?jzPy2$1Il|aIS>t+7XjscP(6n3 z7LXW74K55a8x$@ec~F}S+zy2L2VdI)HixZ%6fQ7xKxUz1WWOQH!I}f0usG3-8pa@X z4b8GGFgrkT017XVI3b*Zr3?VoVPZin3?K|DBVcBL+>Oh9Ff}lG4;FJlWw%5S3j+v) z?1iZ%g%)YWEVDrFl?q~E0AY~5F!Mm;Ys9)Y2aCC&HiAqL3j+v)?1h<23Vj5Nxght- z1+g%IFvwn*d7wEIV%;m#h8YeZ_bLRjFn}<~UYNP0&?Q*R1-Vx#h=l=!LH5GT1C?9E zy7vqgb3yJ^31VRYVUWErb4j69+A+fc<X*KP76uRo*$XodR6Y{x-Wn|Cg4zfgK`aa) z46+wyE-CaCEarmdu(g6%7(f_gFDd51)Pl-bnBQPDXbxK^h=l=!LH5Gbl1jtOgVCUJ z6=Ws|lWG=B{hD6c7WDA}&>Xf*Gz$X=w{&2ZaWK93=rvO@%>|_gt7sMm5Wa(C?vY7S za5vyH6C?-Hhwfg`8NC+KEDRuQ(n+3sLHf|m1?3B~Xch(#?m;q_l=2s(58YhQ+=xju z3j+v0K{6NQKVmURAG*1q@HL8NVE|#9E<`wh$}^Z+Lgs_?!PLTN&>XfwGz$X=PeC%5 zkXgv`Abl|NU^FNn>qWCLfbbh6b3yKfrEz34u(3h<VCKPSP&nvBvoL_LOE)4MK=lwz z4K}lo#X$OCYGE{J4qGdlg#m=;Ael=_`3uqqGY>|C>SK*)76uUhf@ChTdkC>X`e5e4 zXwV$CS~Lp-2>bLP!hw|X7o-nn9*hRLS0$Q-0fd(znM=rx$nqe4F!NwEDBhH!Sr|b0 z50bfaCLziaWHYd_LHc0k!D!GNwn8)u0|<xoBEkWieq3T8eK7N2G|0Vj(JTxg3@S%q zdO>s8Ff}kSTr{YC=+Fmo6LOj-rair+PZr!Br{x?TN55<fs1F00zXoBL8_~y_VdBKn zu<!tlHG|loJ{M^I8iZkHP|FUGIr!$VVfKOCfs8@rG>pHc9}-6}KDFr_9Of^%$l1E& z17t3dIbqE?(3mI4ZjVU__kh{~pt21l{$m0{d?y0~!#QpS1~KUT07xDg!}`F;<Iy1b zDYFp!7h&lb6ow!<7>0=xOT+Ym%mI~`ApVkxvMoMP_k!Gdo(Q*s<~~4rVK|3XzQyJg z9~kFC{Ry%ICJ&-v;>6M*Js=E9o1n51#0Ftl*n-@8fe5!cOhm+m3e=yVcmwrYLFR$* zMLg!f=0TSHhV-LB>Ot6Hl57hoEr84fnFpdl;$LRVwt&(H2!r?_j4SS8<KYvK($RzO zGA+n<sr-f9>-y`4t~$tUka<g{Ap8VMcd#@5cqSvncQG(9T;gV65O-%_z;|vQa`?dJ zK|&_Wwj6=F31rS?s5$udS|X<jP+Jn@PKGJ6EigBM%(((JXEIn4mB5w{KzV{?mTb!d zHaRecrE~PO1rsNhhS>}n=Rlrs2l*Q$2XgCGs9TZG@dU|%FwCuUkir{OKZ4}Y@inM9 z*yclEb1erL<xq|boHIqX1r*;PGeL0<qCw`aSS8y6;)B>Q42oZDX2a6f8>F;i@mHn= zW>?Ns*_Pc%b1g?$<yx2+7#Z%s23KGfK<8RO<Bdo{3?RMNxfvK>VJ;PoeXd1-71eJl zQxRztWF9CEKr{%Ws|AUHFiZ{0G(;N&W-q9JU=z*40K%aD4oE$zI0lQkpmv2_Gz$X= zgY1Qw37Wfr*$orJMQ_1ju0u2n0|<lch3N&Aam1R-GaWM=K<#*^Xch(#2H6WUmlQe$ zi@Bh=3zujX1`r0>ONx0gwR^Cb3u?c*MYAw~Fvwn*T2g3{8Q8<YBbtQ)ghBR_Vji+u zSX{tpP&o@S6NHh~k-|QL#l4`p3$JJv1`y7fftojnHT%RI%y0nBUHC+^Fn}<~USiEc zRtK6Rz%_RPyLS~9J}??tKQ1<?3_zZ{NMM1K5yYASau>SU)R?;ft>=K53tC%o1F3w2 ziNk1YbpWj11GU{i^%h7i$ef!*m;<WoK<YslR2G0}5Qe!4WX>%j%t5Y)LG^|QQuz-u z4}@>yF$Xqxp)wmaErQbKiv^Imiyv6b1epuN7nmXO3FE_P6K=T{P`JSAP2~6n`46TJ zG`}$6hfK=_PKY_6ya$s5(V+1#P~HdC3+QeEiGkGM!XUFj;R2EewWC07HxLct<EyJ- za~F4JA;JY_4oELLM)n)B9ISc;g+<F8gjp~(HgjZKV0M7w02E#@IefIjT+A{6REPOR zvoL@#sEmN=2e})U`(SEdbOjc3L1lM9Gz$X=gY1Q=C566##axhkgQ8g&Kp12%%sf!P zidgq*%)<-^P#Ym6nuP&`LH5GTC53LlVlK$NVbLrMAPlk>W*%tlj9B;Hz+x`Qy%EtY z3?K}$7iKOgw84DLZ~(bCDw>4>ghBSg%mbBM#JaZwi@6~8#zeC)fH25jn7O3T53raE za&KHT3j+v)?1h;JDj$h;uf+n)Z~(QH5~5icKp12%%v@6F30TYp&0Qo#voL@#$X-&+ zgQ*3Tu`s{EXwck6N;C@t2!rf}sU?+$nFpgm<toTb5GK_unEH%mvMnmmK0k~G&0RF* zvoL_L!$Qn54yG3$?Xm;YTu`~QAfJT+glCXxE=V8DoiG~I#+{eX!T`b_$TSzE4`v>W z2Bot(`78_|?6C+D4y2U7Abl|NU^Hk<Y*s!C0|+lbG8bQXqRWBw!OVlvp!_x?pM?R0 ze;}C)D$ihQ(9J>TgY?1F!f4Rk#k71D1`rNdj0gvGz4-VbeK7N2G$?$h<g+k<@Cqbz zLGFd6aeQWi<Usmh=D}!CI84fCVE|!<B?$L|&L@MZ0qMnymtdw}(A>p@d=>@}jzBV( zl=2s(59S6K4aygN`78_|yaCBvyzWDj1nGmB2ctoA7d`nb3?R(06cG-jl)oT-F!NwE z$h}?pEDRu=fMhP3lkjpu`e5e4Xi&U$<g+k<@D3z%HMSw*0<WPA3=ANBF!NwEXzrpd zpM?R01(qSgfsk3q@*sUM^I$Z{y)F4H3?K|DM`7wga~Ci*Ffm*-sD1bc>L%ngPfU9{ zVYw{0Jx<H<wIj=EzfK+$HlRKiXx;*ZVc|fnaYB$e_~tHP_JQ1ij6vlzj9;*VymSN8 zPl(pQV}1dzTnnhK7s@+h4H`oPnZ>di;U172sErL0-?9=RzK?-{;Vw4=gCw+m2gxI2 zSRWX93>hSEa1L=#j5<^=C=5YzFboqXmWJsA%?E(WOAtR{m23+K)V(0L-Xp@T0Z{cI z{UF@4OSa{VyBrw9@*KKbVdBKnAag+&)E5Pnl^`|<!@?Hi*84=b^$(I;A3)<56mPKp zD#*+Sc+7##UDQZG`q3cuApB>QYzrtYfXoD$2ckjZCQoHsK<NX7L3|L#75A|5Wgnz; zv_nL$1!h-E*z}e^l5#EV3=9k}w04{WnGG_p<|!h5fzlmp?&1WJIr|wH7#?ynFi5#G zFa&`#p<!6MLk=GeHiWqiP_sbhJc62&gJuSZ3o{2fO+-NTg5;6$W2iZ1$bwKdY#jfJ z3~D&1tdVU2`5j~?$lo9uq-D)>*%nxMfcPK`@+&s8Vd1=G4Z?psQgSWGb}7g~!dXJ* z$T^VNAoIRFN2o^*XM?o}@dFGD3{SWj7^De=GjjNJqzl34DqcX{1TyC-)SN_+<!Bfd z&dBj~0IC;FDZ?|UIoQGi7R~~SsNsBOt!xX(?;tZl{sz$?b7!oRZGnXch!4UbzhW~R z7S1y35aDAWC)WbAOGLh@B}NGn&a7*c7J<wLnfC=rJ#sjM<Y4$90|UczZUzP!cLoL{ zm>?33EqpYf=7P+>f)r;jpyo&->4!04`Mp5}HGJNzlWhUH8Du8NJP-}mvq826<PQ)A z^BEv+#AY@ud~DVu!Y4;bt_5b-jW1y>XH?}{K;vsn&ObaDHbB(HKxvTq$l<dC$sEvr zrkC6d46^PF44}R)NG&qP8a_z*y#Q(!$edSDb7GMVfU;rcAg5;!s9umeL16<`%J3R$ z4z~SkuyDSjff~*s8)REReg~NeG7m(9%u{(K+X4;`q_6<_6`R?xa9)C>_KvDt3(T%R ze2FazT99zoa{1u_Hk*NgAqQj!$T9{72IO$|*a(RSkknxY28K7>3=DGa3=H`4DRTIL z^hIbx(*3Kp1Va!X8&*KF=LXd6Ap71z?W@M32^Js7<-!K2UUcQ}pys%tOE54nz{&*$ zUDWt^vQf4L6h<I3LE!_ULE1ew%eKJ64a5gwP?%sd8x|iXn-Jk>pe5G=v#Vm=j+Puf zNc-xb%(R~sTOsPMKxvTKp!j$&y`^P=DJ0(7!+&^y+yIhWvKgWt#0IH@)rSm7;zt-5 z7~XR;Fvt_w(}*0795Pc|ZkR#rQ#v6Z05TsNzJcVg2~al3z7J6Q8n9@B#T#-u$$;tw z`R5H%TKEVx2Xw{}x>2xvw7>#2-sWtUZ2^T5$V`xVAR43>6t<vn17Q#!gh63~&1_h_ zy+I1c4W@D}FuP#k?63t9{-86DKXEfKD3VYg!otsBt8B{;s9hj)K10pH*X}@$FN6J% zv!hKaQ$gNh0JR-K3`R{5$-tm+Hj~NfEac3~RCPuM9(g8)Y={(?e6a_jzr8G#0mN2d zU|>*XU|?X0X8<>6*OjF*Tq#Rsh^b+2$+2c+*r&k6;0V?UA#x^vZAr0#q~jF6rP!h! ztdIjKUBki-<liq)|KdBJ0J)#w08KBTd;*GNu;C003}2z<n7{;(Xjpp5u|rKSXST|= zfbt&5OptjX8l>&bZrK)4ngL-DAA~`1i_L6UdXd?NNDm5DaxE~s6gHn}*<ml&!pXqE zaPhvdB*<)#c{bY->XGyB3?y@oF)%QE<7Qw`c4uG!t&;}nL&mWDgd9GgF)Wyx0H|3Y zbG}2($$&{B(J*t6(-mm!14#*-`2%VWwmTqU<>?eB)NnT0F53d~JIG9s|3Ng!zyn8R zTR?me8-_uC#b!1voLi8>?To!#3(PK-9kMOQk=CVbaD%K%`2(9cgINGwmjaqgMiOEG z>HW#gzyRy3HRNMom-5FI)o*){+ygQXmj6I(bhRKc5QeFlgJrB5G&Z>?pM?R0L1Wn< z_2gifKVUQ{je*PrVRFm^>G9c#7!QM)3tES;B%g%=gum=Sq-l_PV)21JnC61kAuP*h zVE|!}y~LV@tPV8ak82&m1%@=xkN`ZsVg5nZkBbe8bL4dhCeSoNtQjD8p_@&~It0-8 zGP-#u7#J9SA*E+@d0ct^0kq6OR{tB1Ik0(uncb*y4@wIS`yuoG6VUPqve_W^5*O4w z1rh_{3tn<9pm7#hxr7|PApe2XfH0`<@WfTF<%uW698g*ZiNi2xE(w&^K=}^cEg&(N zI&3t^Y*={(DzicL1c(Ny#a9->=KZhiLWB#<9FSggjO;gLIau)p3X7UO2(w^nO!mmO z!0Z6U0Vup+a`<S8y_k6pG_JfNpM?R0L3t9UALMRa?t`g;(FIt{1&!OU%4cB!VUWEr zwWQD|u$T*S@0xrT1`r0>3o{RtABc6Y!amG!0L@FU%V%K#VUWErb4j5qu$T*S?}mI9 z1`r0>3o{Q?XA|q*3s}qr)ft=eSr|YVWG~EIQfQ6+nBf4Lm)?@k!T`b`dr2`5rWRBN z!2AZIL4EaY`78_|46+xdmQ)&M9*hR%dyttROsZKh^$QNmwxEwKgXX1om9Q{?@QwYL zc@U--A8m0G(_Bz`xKP5v0Kx_b5axo?1I!Kh%mm4S^ug4^Xwbarxe^uz5bi)S7o?t8 z4AKWP4@QI1*_jd+1`vLLWG*S?14tjtJQxiMhf^gi3?OWA5D^Zbd<;`V$lV})Ftsom zG;eyMgoOcwC!m=NOEZMb1?hvC2ctpd*|8E91`vLMWG*4IkmW)8VCKPS(7fr95*7v! zb~uCx2T*z-*1aHoF!NwE$i0V3SQtQf29mkR?jghm>4TXEqe1a@poE11gg+peTW}1K z)(M#l(g!mSMuX-}_m!|PfUw75L^u#K3t1kd4`v>W2Dx`n2@3-VgYr2{J!sw(rUoX4 ziw4!NCPyG{LXHz++an<Tw467>H{XctUS$6v&o@4R`VCp0n(P@k%wIA0ddmwR$avxO zw@QmZeM6AFGRGic4Pt}JcTkxCVk6^I3=9l^xfvK#p>u}Fav(OWt&7}G4mb)i7i2!H zJqJ?z505#pafE;{NIMgx9)v}X$+m#p3^EgB9*72sPdG2z0`dn4gZLnf%Z;%9Z3>cq zRYK%iknOq<F4qET4<<j0Y6h7NGSA=y#2+9wD12b!QxA~LInBVp@SmH3L5;w<l*r)& zDsw<)_8gaOnE^EmWDWxl#2kEkgOJDfK<pQ1Wm`@p$bm5|pMeLLKo&qTOq^I6str8e zg?!!}%-<llGD6*oZwy)EI3oN&<rd6bWSR+T4z_U#*qFzPXw)>JaYD8Q6i*;CL2(75 zL1tdLE!zU(gV-<(iWh8V!_q_rQXD@CmurF9_2YzW%Ne9Gk2Ud-F%NcFXA))sbj$<P zZ$%Pf0O@7sVPJrT`Hm9oV;(=^Q2n+6$vq(Rko!>RYC-ZK3{x`!OFIZu{#+_yVE|!J zI|-zoRQv*qxuACZl@b;P5C+*xs+l154yO=x87!PY^~kjn76uRo*$Yw!!U2;6;B7|` zA0M89!`vGsEDRtFvKOWwl)hnh!^CjWAF!AUYPa1gVPODakiEF{;uH5cjTsK0^^bQ- zSQtPUWG_Dbxa1aKF&ETcxmUu%0Ky=9ap}b;{sW7-pm2Cl!omQ;AbauY$0rAi3m6S5 zcR^-?Fg|_w<W`))3}4XL+M^N{1`rN7gD9u)nS(Buasks^(Ae6O5*7v!2HA_QhZsI+ z3=7xT8f=dbEPP-zG3J8G7UZ!t4`|s#tQjD8q1yv14nbuQ2qVj*^O5C1Y*>2(v^ELE z2jR1z`4OaY6C{R=VeJj%x&@SnVQN72A&3n!hm{C(Ky@fcJqUy9kt;}b7Dx<)+3=VH z8>2gL4mAyd($tm9kTJRzv@#uJCNka;i&_W3<Qh`sT0s7R`4u^yK>mZN1C66iiI8iF zNQRgL$}=!I5Dn^AgYqmWKG59)5(BBhg+XS6!UZG`Y7c?hU?3XA$5(g5#^@@L!Ubjy zNH01@_8YPss7(gqgTg}L0%{n8#BZFJZGqVViUUx1F%SXvV9C3ny60I53j+v)@;1yE zkh^iY52gl2i(JGk6F_C|ixL(F5C+)`Q%ee+gT-8sdta5XFn}<~UYL2Hd_}B#k6<wu zRJXq=VPODaki9T-NugyfVTJ?9z3)m`7(f_gFU&kpdze`FmS8a#<lYY@EDRtFvKMA9 zDfAgE=7QY&sf2|AghBSg%mbA-#JX4IGG;h{>dG%AEDRtFvKMA9DRd1Mb3tQ@-%3~* zKp12%Ddxe{g32tI-(WOoOz}qv3j+v)?1iZ%m4=xIqe0~q$V?C>)hw8Lk$X}t=;v2} z;_cB~76uU3xq>J&K<Nyo7N#E;Enp_!(gW@D!e~%B<2t~?0KzRu=7P>EXmMv?0M-4t z%!7%0sLHpj@L^y8m1`gxRG)*~8_>YY0KzbJAo{}uR=8RaA0O_yDvJ>gpt036b6FTb z*yJiA97rk8o?tN-<lb|0Sr|YVWG~EJps^le!`J2-rh7qSQy1p4Fn}<~UYNP0lxI`0 zm<w|6rMWB&APlk>X6}rC2sgmQaM5qDm<uY`ugqm(0AY~5FukC3220~GF<i9Eb%YyW zVfUDUf#KR*7BB|ci%Ty)@i|z`1-bXeTowip2H6YKPfB_A1&g_$vEW;CSr|YVWG~EI zQfQwWnBf45w>xuL7(f_gFU&m9x_DSv!NhRUOR$&=Du3_IWnlnekiEF{;u8mzD=;^} zXwcligSjjWAPlk>re9}@REv!}0|T}-oG>*o8q|KVxCzOt$Z3d}_THSEvf%b2EysgE z?gX{hBYOE;Kp5smYK=L877pMWXNB1ZatAU7jdQ^G9=9Oj2jf$n#$o=0{Vc6J(je=R zPTd!l1dT_5>^8WAa1W@?1C?hW@t)fV@$;ZHqC5-?8qhiiB#(??{T}3TM3DR&S;RR{ z6;QqCaRC!2mIj#%!l1YSl?@;^2tR=O8{}3_BHXHh<i8zIy`Zpw^&dcHa^W!tHYWV1 z0Mf4ksRv<=JF+dH@CBI(G7m(9#9!Q%Z2^Tj2!r?_j4M3h<9|qT!;&Z00<$YXmAkd3 z2r_2=?bq{jAhSW{x!gm<87MAc_g#EJGUozl{VNXxgC>Esp~&HL;w5CQ;DWodEo-1= zfz087nuBfeAGS2XGgrQ)V3mAJM;a3tuf>rjVB*BmAisk!C{2LcJ0La)!~6|$D=*Zo zlRy$^80J=+yNK{>f%+2^rl5F)Y2kyKgKgXvmL@F9P}79XJ=qpeJb}yvnFpdl=D9qO zZ2`p{2!r?_42l<QX2a4%4^kZW6v?%~>^dM9)Y4Ke*TTiX!0_&#+*6R*AoCVHK==tc zO>o>th+kx2VBqIrV9;`BV8FLd5IKBcX(HghY|8<tn?U9WK+S0aS&oKb;f!2Pz~bxA zec2Y6n?U9WLd}_iW(J50GY2`1g3MH5m2XjCPyl0Cy@y`jz{H8ALH2<#Xe<J`yaD+e zBo1<`5Y(-pd$&Mh$Qb6<8A#zh0~%hSxB;aHn0jHTIoRSKmbQLWqo%DH4`f?F@eMK) zWFCkHnJ4p5wgr?1Kp4aaVNm>HGaHt+ULd8F8Rc><$aZnm$+bv>_W!U)xr59GnTL+Q zK=rSAB-;XV3rt>whk-%goq++g78WK3qZvV&mVtqx<{=_Ig5(Mw%C<aVk8%f@39}Cr z2OznMhq5g(b#g7RIj<{7dM`0BFo^OnFc`QqFo60*Aoa)?TYMnzQR;!31u{nrYK{-G z0Z=x~9ON`;@JXuW#V0BFekZ6>263o4*!FL5voSb;)ZJ)A#4E@gkeJJ7sg^q*rCLBV zi0{wM!0_6QfdSioB-ogi%p*iNg3JNw1??pRg<%S^oI3*pHuu2N!WSg9KkDRKVD5V| zT>zu+32F<o9bjPqVTQ*D`$2sTSpO8{etZ}d?o*(84Uy6cC>~(?K;wN|^5j}JG|07V zDTb^)2g&_-EZYLoACke>0>YrU2Za%O-iL{UXiEl28nK4bphy6TgVGF$2Jt~=gD@=J zfzp{uDHHe(FOV7!1_sDtd5|I~hKYk{&^`kY4N5;C+7D_MG9Rjq0hA43>3PW$L>OLX zU|^8oVPG(FXJD{{DMq5Pr9<SsjWJNOK;}q7&51zL4`ag2K`y62`ws=M?7NeKnu9I< zz|!-XRz!LRnFF#XXN_zNX#XgP2J!Ljk%Xn^H&FM3)Pu|c=>_fC1C=qzdm=&MgUvm# z^n3(qAL*4QxfYoFK;gsl3=-bPNa+p~ULZR`7?kezG|9CrX_0GbX-1^Gf@iWVApM{; z2f`pXm}5y3FmVuV#Q=#*8z>FhQvnhO#Vv>i@j-TiFf84H(gWxmUl0bV@y1~XNE{>| z0yP`7cL2nXhw?%34&#H&2VvxNCxf&H^a=w5gES8Vg9(9jhn!xJ%h4;)Fa?<-12xAN zWFZ=cr90$u6to|+0%;E;Op7ek9BlCnOLqr45$O(O4oEL(KO`vKfM^gO-=0xex=TR{ z3y?V=y`Vi|pt2Nsk0>a7u(=18?rdH_(iX_x6K!%WF!zDNrv)l!ij?j^;RR9)!k~1w zp-rx3Mu%KWMLQzhy?7zp0@4pkb07?I1GaPr69>_tbO)kA=?+AL(iw;br8^J};)Co2 zVOY8Yr3YAf2T}uCr-ojp!o)!|DE)zGP&|WZe+EeULFR+Z2VvxNH{~TFjIJ^;Fv#&R zFqpYBFo5)d)FNYS=>>T&p%2t7kU8>DbJCFwfU;rcAg5o@e!mGwd(ogu85E%AU^_Pz zmhQInBGMhm9FShnzBbUlP7n>^<J*%6OLupm?gyy{nFG@M=Cy1KsLVs&g9r*AZ0>=j zyDdojJNI<SwZPm53ZFkvIdi0R2MRBcogfTKcT2kDT6%iqT5`G(=`P{5Yzs&~D9wQ| z$PJ)9kmzXwCJv%OX$C}t(guhIZ7c-QptuFmAU?=W5Qe2YP<jBBbs!8<1G=LXn;jr= zkbE)&B)x!k!h!g?P(CQ$VSJGJAPh=(XV!|g%;=MA5oTauunYSX4hmn896CPo8j>zW z-pRIr@;*#nk%xi73MuSh;vkw4>QJ9I5WOHV5O#PY+XAu+WG2i$n14Oq$hO?+lWRHR z_N!$@KWHrv14AmPu?^CQ18?b<YXMnx^#bU`1ni1hpl<jAr9rB$F)%PF@h~u0yE8C= z@+U|P8Dq;AE-a8e{5Ef8Th>6$0-2)>H3#3`Y2<P}2C5fiAIwc4b5x+_fZ`1#hm2wF z0rl@-;-E3hDN`}q*{V=;u$9NKeA+S@kxxP9fXw_bRjTF2WT_Sq4dTD&Vqj<{(9Ujo zi-=#4IUv0&KFYR$;`R)Z94MTzxd)a{W8NXmInXcH0&`!=U8$C(J`4<?aa$M-nnUww zU}XSdkUL=*wEk!(bSwoXhLZ-hm7!{3ZF7(vEC*N^K==TXdq92sHg^UFUYv#@BtYpR z<UPbMpz&l_Uk?<&Fjb&(WkSDPi^3$imVyb0a%IPRNV>Wb&(s3KpfJPMwuXs=Xi#|q zqCw>dhz?{xq-hu*W-ln8$$XG)0i`)ueFjnkniB)%A(%Q44HE~^(NHr%=^Mn4!@>vY z0bx+N0-`~A1azhl2!r&1?v%x52S^+w589IpqCsgNMCU>6K<0zY1!0gm_{N{@pz#V) zi;R)SpHF;%#1XPQHQ5b#%%3p@vcKGj=eq|euYl}j`Gjx}XnYEk=0M`e_&NgvgBlM5 zg9m{zOXM=b;v>XdkolnU8)lw5)Esx101^!wV`-U-C?i19e?H2#fZPl+6J#EU28j!N zmTdv~1B5|*5C*vso7u4Z?t|pth}m*2$aa}5g^cNTJ;^=?G8<%G&S!`}Kx|O>!0w+v zfn*M7E>(kvfx(}^ISt6+1G^s^WNri0ERZ>xP;>B|-H%+RM?m$0+zARBka-}i1vSSN z#6iQbaJE^28qO)7Wm`ag2bl>n4@85sR(z3d0fh$$gZLl}@+&s8Vd1<5DcoF^%C#Wd z^=3UJoRv2AodcN-GVjV4?BQ&HBz}{DfkB&xfgylEI3tG-ayY+$x(Q^C4%8fc;fx$# z2cUXE?gWJm$ju<E3pEE@Sir*h&L-4wKJ!Jk1>|>-nIQ8(G{~$OUu9cB;Q_)RJ_v*S zip^|TILmxRgxjC>axKVq)$D@gcfZZwJwRrI%=?0*9+aM8V;&$m7{0~8z@W#&z!2!p zz<}I7gvn!T6KFuq1(^@>6HKi>)EsPWWmxzu*n=8AZ@$X5fZPl+6J#EU2ASvaUA6_} z4-f|NK^WvlY-Yp4$L1R%e0p}twIJISas*Nb-gx8r9%MGiyd~ce>OtWH%kMjo%()F3 zN8({%2y$m&C<kdm!`Q+H9?suoTMD3Nfy^<4nzIbe3=kJ)4sv>ijn{+ZVQvDMV+1v4 z2S@@9!^}bMYk5H30P-&=jA2@gq2_@46)-Uv4T~?G6R7bu=eukRI1InZwt&oonf>F3 zYzrt{K^SHRD9o^#4U4ZgNa3GxM6Lzdt~=);<;LrkYtMnq2ALW16E(hI;hgaUA$|wc z59VQD2zF;+0QFHo`j9cU@PVCKx8a9uivrXvkU6GMb4rj6fU;rc;EFGpn?UB6LCtA{ z>P4nt<{+0pKcL|P@-HZiVd~AH=77diVPY^E7GDjQ5%JYx+tlLoQ?>;hhTmmdK<2^B zmiQ&x0t#0UhM55hGi+wV;%g34_`f+X*Me-9!fi<TBc}bs17tSH%#vS-cmd@vSbTxx zVE8Tr1A_$*149T2<<APJJ3!`x`~)-05^4^%G6EJpE_V^(1JalCOST2%W{{a6^FTC6 zyy3TO3&<ZJ4B~?@$c@;{hK0`_B>x)RmTN(_>&X*H_&l}$;Q=xmWZs?M*u%#HN&FrI z1A`S014AeY;R8$0AUi%l-2^hn8fp$`j1nY=jA7{zIX$0%>IJzI6gDvRHc)f0g#|2} zuRKQ$=PSQuTR?sXnF%rvM1#y*@JF@<6doW9;)5{Auh`6ng|o^ZM7Vu<BG-a!SIK)w zIIqb0;Q=xmWZoYn^|;dEeFg>wTOJ06FaqI>96kn6b3x{V`~<QKgzcc_VDkekd}e$^ z4WBQ6WLrRP2AK&m4@85^dhu7b1>_G92Jt}{<VI{}!@|eqFCu(e-pjSX?2=(z+9L5; zt_8H#@X(zj(@uCPVa%U_%m-nU&yezWt^ML+kQ+c^F8>hb;tEI5eieHj28I-O1_sc0 z6i6R3#+J@1pzZ~k5Ar)qy#v%7Etmij4GYJDuc+Z@^G~(~<YthWAoD;pNZT1U`4*5r zKp4aaVUQcKnGFla9wh&|e3om0*|o;!O3R*akoH9Q*C0-i*&y>u806vM2?`&D!YeHo zzR9(K_D0N_J5?E^1{;R09WnTi2;YYc3=EDu3=G-s3@B$w!SrJb#{*FJR{WQ3c>!gE z%yEL6QwP(GM8nKMu78mGg)ldP%yEXAvlvM~j0rObx!nPiBcGOOkzkN(Ir1MA$DptU z&3-~m1C294ScFMXddH`V5p7s+%R0W684MshF?E6Ly#SSC;$vU|@&Ervr~~m4JOm3Q z&ci4No-+lF=dyg32B#H}I6@VIrScDPryWR*2cujIXq*FtC3Zse!p1=mx*)7MXnI>1 z<-qf(pz#=iScqQG_y$BZDyj1y)n1S+$W9Q}iH7J!-N6V_0l|CF^n&iUQTdB7&n1!x z>}S}$Xg*AGEnAr6S`ru-7&iQbr~}=-0=f$gWFpAlAR2~2V_GmaDKy9&n4KURH2(sk zL1Tp=T8{y87oP!?UWa5jvfc|!kiEg6d)gEjAZ`aMg-&3D)Png?;{Sg{$^glM>;jeB zAevM+IBRP|O+}?Z<|;XBYb!y8LHr12$hbD_>}wbeQUa0((Zpa}`Nky|5|7AcfYKr? zUGOl=wSeYWK=Gvky>AF)FX-+ZZ0P~!z62gfo&yEv4QLt$om&Jl8)VlUs62=b(*vVH zVlWK4FAtQCKzAL1FiadogWQ2kgV><^@<8P^h)oK{btfLNW+0~zLV7^%2A!vdyl)Tv zZmtgKeSWy&4U~t`?E%$IATf~nAPiz7V~`jujESXT`aya@>?crnf!qr-10)WTC)Q6O z^~e~MCXmA)WEQeKJ~poKf$70kAFN=5q)nI_7!9)5g99SR#Dl*+*Z{pV3#1pM4@47# zak&?k-&jBy4auMgc8Ghh*?~<ANh=Bym%T7E7|}A#lWZn%+wua`eq_U7dhn%RWcAqC z$oo!ZW<uIZ#H8N?9FRLoL3b(4StJdvZ(#00x2FXfmmqPF8d!QImImnqVUS)6PRx22 zlx{)t==cv6?FE?)%IhG!V+W*O#Z}*zpruJ-{RvYCvI~Sk{sqw>43mS=ATeZl5Fa1L zmF{4Au;ot=E=Zb(se#cTdmEr~q~^~(T&U>=WG2Ww5RHz})6EYq^5Y(4HYn~unAG?K z-BE|Hj(x!m2`5k;3$h1<LH7a}pqFm~jG$>jkTeE9z%ADTt5;$70HP~`g%gYh$s?E7 zAU+6#<YDQASQ?}cgh6^iG&vZgmstB?>R|SO^p>RN7UU$Bq$=1b6lYeY#+N9>2WM8L zD%dGx=H+DOr7ENr73JlFgyWM_Qj>EO;)_d)@`_VS;)@kD6p}L%ixe~z)D+@fQj1Fz zG!>$u+GBMTGV@9l;=>Yibl?U%=a=Sz6qRHY<(DgHC}=8FD-@-closWonhG{d2V#;A z)QotjW^097u=7D~hxsQMH1>wnK7%<CtdM~LeC`W~&C1Nku%Lqv+;(RWk!x8X0!c%# z`zK&DNG-_xkc`Y?g|yPV<dV$%Jcaxsg|ft=%*3ReRE6BcN`<6Uh0?s@#I#gB1?T*{ z;>?uPB8Af8%)E5avB)4JMg#_hlM=ZB1#Rqu%z(vNd@<?42GXyDFaT;QB;FM=^NLGS z6I1jQLh=<-GK;~{my%jgl$x9fidG$k(&AKwc;}#y_+VG(&>+`%KmYh}#~?pXKlflg zh2Ydwg?vax$Vkm8P)N%!Qb<WHNzBYC2KBZ`ck8GQ@<X6QSgr*W*TkBDtNx9F8i3yJ z>&Suh2VwG1Wnc<quM!Ot6D-k!>>)QhA+i7s9SRN&NZukp-zy+zR|Q&!tAi1B(#<@W z-_iODuyg~HhbjY8p!ftaK<!po{Q{#w;u_F82&N7sMhN3d*P#4?t{2o!hq=o@2r`}l znzy|n1gZN#_QKo)qd{hX#6dJM7?*osdePgtpm9S3QHcF8H82`vZv#}0)N#oOdAXJj zF}W7dK8_pE`+Gp<35X%aD?$AxkX;~g5RH!aK<x&JgVeyngjgD+4}?K_Wz^+bKyCuL zXO1Sszaa4iV#K$peZ(O8U}h5Q4wyQSJ`e`kn;|OKqVQ7&96oboA?AX_LGqwBItUYL zr{AHXdqDOQgULx>6T~6@LpLAf-xE+dQqvcU1o`R6L4y1^2l)XMHy})E{DAIR1KrIB zG6RHRW7n|s!67NvQXmN)yXF9;jTT<Wy<ebv)<Eh(;RT{$7;T6KCQOh9nFF(vSQ=(1 zvfds^$k;WguO}f6ar+5LxfaNdI7qz&(+8rF$0m`@A;%3M^GNMO6qghgBo%>HY+||% zWF9U|YMKYFdvB4#o#yvI<w#BQCem^(AhSW3&|J?Cs2w0bfx;Se-yG;}JrEtr0J&=q zv@Q(92kmPE(V(?jAQ~hO(g(sIy&xK7CkTspK*oMRbs0z;9T!L={0-6zG7oeo4u}SI zCqOi4tpJDy?NtWRpfgE9G)Nw19!M{YO^7BZepJxz?t|F@vNr}QM{4}ckRd;QK=y;e z7lcU-W6&Ny(A|q5Ge8(tu7JW6RNp1Y%C(%31(z!fpgI|(26WFI4>XN{{0tI<VM@vs zn4KURv{wm4OF+{b=xQSnA2jO(qLJ4?f!qKR1G)E!ETmik-Fdi18sc`a+n@tXAhlpV zlt3?6VCH~mQr%EoQdE?jQ3N&_-5#(Y4uYICxIzw*SCEYb+4}%0M`{`@kS9J3%E%+^ z2iYkNy$1_KgUSF94Jso*G^mUK(V#K{M1$mEZU*W7Au87bYSVz?&qEbrE=U}t1~f+u z!VxLL;PD<@WycyU?g8Cf2eJ>eM+iiN*7AdBP#FTEk>x>lfiTQo5StJtC*BeiApS!) z8)WYcs2r*Bc13~wcmufu6uux#Y8Zp|X@c$(1(^ZDu(AUbwxGD2qbS$Hq68^BK=BJw z1G)nebXO*b4e~RHhG9y|4w#)F8kBEAG^p$V(V(&eM1#r>5S;?E5IUv^5(BwcK?zcJ zfXcTQ@({O!l@eKYz{~;Bq`Cpr=Pybv16zk4E?_|%1gU8d)MtC5ggXt&C`05(O@kok zfy@SBLhXwPs2w0ZAiu)yIt9_D(0fHeaRuUoM(02@Xe|VY2FZi;fiOrfh$aS;6HYv6 zcca4W0om&Um7`}kf$m-f-75=o2Q0sV!Uc4O7muo3ONlBZzk&LzAa$U-KtXq}g4iH; zgJ>A0B)`Gz1kv))I0Nnb0`Wm}pdgwLDh|q9FgrnR0Lg*eJ3$qa-#}%;6lI9p!Rm<2 zZ!mK}G^uVVE-5N50ByK}mH}XUi6BT#N1(o5h#DkMp&JhhizQGwQqz%#wOmVuja&<8 z&V&bgmlnu86LsS2f(KB$LGA+S1>G|XI#UxwgVxD|Xi(gNXnO|8ox7lQLLfd!9;6S1 zL3%T^<yt`XI7s~q=-sLyagaQyT?)bk+otM>a02NC*#oMxK{Tk$2GO841c(Oh-viO0 zeR?1oBoDF+gh6^iG%=W*_*6l=%NJ%3$le&J9I5d+LxcQy1KAG>Ul1lWj6rt|gYIGm znE}GEG6fW-p!H}8nsO~CG$CaQD1Jd|K=;{#?imKLL4F3&Fic6A0<#lD>q65Ts1675 zWubh~q#THkyq5yx29OxYy-zeDWeTX=TcZwfJJ@YRmMJiEKs2dt0F@~vkmf&pt`clF z0fN*t2#V(wT8O-YY&<9|9zf+tO@j^E#HT?SZG`<GJ3)6MgWA&|8k847H0Uf65Dm)1 zAR5%}2GJmSn43X*<AY0+f}sHi;=eGHYXOb9g36K%ONc!nagZL6-$593&oqdSt3R*@ zi~B%#f`IG?o#zUoLB&6a2JNE)(UqX{C)^nrK=L57K^SH)h)oES6ORQt5dWc@4YGFy zRF2eme4;~sJc8T-3SST=HH<;$XMpY-2blrFu(AXcwxIfAjjmjah#sUY0mUy!4d{+# z&>h(zHptH)8ipw;OJH__XwZIf5Dh9HKs0Di5r_tz{{*6u&#MEu0VD=;uYn$<ECH2w zKeQok2fK~PvIJ%hh$hty#U({0`PqnBbdbA1b|a5lzA%w%=`e+)AJE;_p!5f$L25yI z$en`(=^rT=6i(#NfkHwFWCnViL1gfgAbm<OjnK(skQnV}e(}3&RF--nP+&rxd285u zhT*o}0hat}o#sLLiu`=8fXJpaUg@wWfI8`A4m1hlN-r>Zs4_4G3L_8$w9Wxmm%wO{ zxB#@ifvE$D5yGH)37Z;FzCafTwdY{&QZR<Bb6CQ_z;MJEQqO_xg}DbtgUkSlL(&n5 zN833%&={A78N@vh+Yltk9SKl5Qrm3|=7@P|LStxipmu<42H6P;3(&bTAUczQfdNE= z+S?#H3CahxyFq-AJV+l1gY?F`q~>IT4xNFHg@DEtK>c}8``g4G;!lt|ka|$N5QJ|) z?FYpdNE{v8m_zh|#6fyN_JYoe2GOlh_kiZ?Kzz_S7$6$79}q-?<U#sC7^D|O6N7Q3 zGnig%>sLM?xf7-iM1$<ruz>i1)Obv>AU_^Kc7wtfgh>r!kIk|z3!wQEWDczT4GL4x zd89g)axGIV!R>DjQ2aLN$+hIz$+c{N>H+x~qz{HEX@A4)1ks?g#y~VEen2$noK+AF z8dCz%$mbA%+yD{-xp#vlr2P%*BUG3}-2MjCA0)E<4KoKslj;Ug7?9f52I(ONgTeuy zI&A55h7}|&qU!^N*9E8?sp&Mqn)r0eV~wyMWTzr@z7Ir$=JP-_sE-4pLGyhe8Z=f1 zqCxU7cZ2jkag}T7QIl%{r327@I*=Sle1Z+4-%2R$&%xpz&{_eIeT57R3?Ld*{()%F zS^*FZS}OpeLGmCwK^SB&h$aT(iZ@*Qo<Q{kE^}e_-mr$8+YV9(5{q}v&nro-fKP9O z#6V#M8WRDP$1%>3cmRom^nmn(aEc8?98_<E#L@8?s60p<q!$zpv!LO$5K4p2#|Mc| zh4QCEX^=cf9|(i=f@oqeuJD5C#g@(+Y$5)Dse#cTdv`$PNKNNoY{^gO26p79Ns!w? zaRb7n#!tmo*_IqVL|DMea!~x3FfcIuu#;;^um_jr44||DvTKTyT#Ev<EC7WUNDPK4 zDa&DYf@si~35ZsKrVVu{4Vq&Gi7$d#2yIJ%#6a$?v4@o9p!$Zx7UFiWQX<Q8m^mPt zR5yU;R!a+t;DagXVFPvt4uaG)4BD&j;(&-ZWMe`0)<ES*PQwnwr{Nt?J3w}W>{NDV zU;v#54WdEwCLkJAAA)Gmx-Jk68mk4-AbF5J5C-W5(V#gj5QgoQ#MS0Aa76eUq!(l! zsO$yNpt2c6gT{zKG^ni#qLJl6c7ZTRFNh`vlM_ErklcxE2gqI-Cx{<Njh_f7^5X~O z22l8dFsWhuV4G~q4rm)4WDcyH0EMj%0|SGCvs_DuGo+jVwd+A@E_lhcoPp{A`57bz z!<3X0FgrmsD9?jv&>dVL8Z@*8qCw>bh=z7Iz}AA?01^YacZoBkoB)+&IgSvwgB1~3 zPQc6o(WJV8lrs%<Tp(u}s6fx%gwY_kg8T!biNUziFQGFH9ymk##-RB6gVZLtvI~29 zfVuCFHza+7f)g}{400pro>y3&w(x<-gT!HaU^GY!hBvs$wSdwQsQm`QFmVtK^FNFR zi5&;sBL!lRi2t}E+(V*PuyW+}eP97R1jxNE9&#<9Z~>jEegPU5AaT$=>ae^CGQtGv zE?C%<xIx^BD?UMa8>9~zgVsra_#pE^7{o@#ATgNv#L_VRAiW^=1*p3~?uD5F5(mi> z>nD(UWDH6x$ngR)3t1i?8&~+i^q{v1LG|ercSzX6)WB$vy*{20IYN7>k3iLd^n&z( zXksuf_u^{v$9O>8gUt?**p(2u7Eu2O)RvbB$E_BZ+i<xDWHv|-`dA<A41_CCcY)Nv zFia1=bPZFBi$*>JVaZP7&p-f~cg9_=1%xxo`0$>A(18|ruyjl;4YCV_Vg3cN(e;AF zkmW&qd>B_e!1Q2C$1z@z_=c&0(I9)LK;_6u$Dl9-VNf`N%mkSSqR}yWIGXIiUstps z)fF(a0>b24WYF^?p1t`o-f}Il`r!#uJi^Qa(J=SIXpk6k`2ymDFi0Lf-U#tQ`al?@ z7eteTL3#<<gDwxV2c(y*z4_n{3(D5~;F2QHu5_f$`3jl}IQHPfbjL$9K{w$mXu`JL zgV(3P+>E}44BB4;djaHr5CeHEEGJm5g(n1(mQ|tc9~cc%3(_+>?+gkF{1_BY<j+Sz z%m$eOjW2lr79vBK1nC8D;031^PzxP0Z$j&NIKnO)RY9!~_!2~&xy0c*_YBWFbV&5z z{6=oUs07(-56P-Do`7axV3?Cdopdu7nvl`krLevBFnOplFa-)H5Cb%p4XamRG)R0( zFr@B*sRM}-!noRNp!|WZ7u3Ijxob`!q@TT%fq}s#2w^YGJun(%1~uFRG6#gw+mE2R zggMYU7bK62LH53Z%8@#5wIx!n1=QyS^+yU~5dH(153&=43AHOVLLvG<dO&W0g$c1V zNFNA;^nz$&Fs}H7>BSa)caYo(QwO3!_KJi-{6K2>f%JpI2!u%urvpc2TV6oN7(nL0 z#_nL@b|*}(#U&g(cE<sVqaQwUEi0nsT2!EM4RSX~9}I)Wf?#Y?XplKDJBg)X<|FG( z2#1W_f%*t3p%Ayv0rhb~gH6!+0GK`yjXXAkYz{eY0GUT>8x>ym$Ad<vA#ER!ImBR6 z(;sLYBPIfp#?Z|N`F#ykj@0z$kSN!p5-HaL8n0TA1~DIGo=qh2<Iyjmc7xmn(yQjq zzyP{05=4XcSAb~H9ZMh@G*1AcLGuY98YB<W2f`q|QzGPAKxGPOZWlDJ2opaOi8wD9 zHr@a#XF>AlxFQnb50E&>OpraGxmyqoTC)wJL3=tuG-&<+L?g?C^nox)FDPt4V=kaR zjzTQNT#z_OKBAYu1%$Vl3WE2Rg6bQPI6CHtg6IQ@gY<&z1Fa<o(V(^BAR08M45C46 z$U!u+JV+l1gY<%EVlX-BYY&n;k?jE4`vodTYWgyWCO;kJM3W!qAoqjf282nCpDV{@ zTP}dg9grcQdK-GqGbmm_a||XiaxHUWz~w3fC~bh0HKfS3Jb~%~g%?N+hAAmmVRnLO zP#p`RL31J?8r0(g(V#gI5RJYL9V7;F?~WKqxe6-#U7{dv2fK~PausF{h$htyq|Avp z#6spo)S+VnFdF1m^e_d9;ljAmKA}00FENm|8YsR5kn(!PIqc~H=Dszlko*k_PEdIP za@U?e5Wj%fFQD=uHcStU28qG&ns~VuP&xvYdms!G2hlM9!)TD$88YWYe#AlC3o?To zj9l*$(hqX)h7+<aureE@-UDhsEDQ?bA@0EyZ{*H>z|1F>2DuG{L2d@oXQ1u^xff;z zNE{?jte-&Ykuj*wLJohBS;+GE*to(6rU$*v3TiV<NPvVbObv_%+3S%6ks~x_Y>^C6 z2ht1D2cn6=xZI0t?js@*Vh=VuKw>WWaxI|t0jLZ*QixkEF1O)w56Eng9`rsYZ0_R% z)LkGoFbva!FI~gb;-Zn~J{ZmtKlgDUNv`EY0tAEl450f4VD3S;s|6azAaRfySUM(_ z2I&J~kX{fCs!u@}R;Pl}Ge{gA|Dm$IAoJ1P3=)I63&bXbam7DOAGZ8+0V(an)PZP_ zy&Nf!G)QXxaY=#19ViY#@dq;xM5AN$_yfs<!XJc5je{HK@z-M}(0U3~kAds~;Xeg( zEfVNu2%h;Go>aLOSltzYC+t9GgTfF*gD`TL2;ze<NFF`T3GqStKp3PKM3aL-dI{Ns zE)TN@q?i2pn)n<7Gd4O3@j3a)i8<f{nti}50+TpkBT=VubQI!YT2bb6V17dH>%jWC zkX|mLpNrgI_Q{oNd6Nst4;s++8;k~p4Jcg59l8YRA1N3VPE?)KfsRd(8h&7Rz#_gl zJ_pp-0GR<2r^8S;$f{9HhY+}uL!EK@VL!hUpF{Ix56WBQ=Y6F4o%kFjTF>yzm`0s+ zGas79(c9jz`5l-%R2i58g%gMY8gGNuF)$h=UIML$VCq0(gfOnQAt-;K>jkxWVeYEQ zhKw03XJBAZ$$`{=AbVl%fzco{K;j^p7>vt3Fumw)RnYuFO&-L4m>L)jviA&Bj@0qH zJxy{g7L}0kqZ^G7^Fijt<RixQ2(@83@*(;_?g8nAg$c1VNFNA;^tzPDwSdN~L481m za)`MgagaQyO$@?>+Ql=d=pK;0#9(sb)29I9KXmg!{%wKEks6-|3doN)kUK!(3&Ny^ z@s-=MEjys|3m|h~b5*c3&`~JY@}Uqsrpf_|-!o})Ef!^REiBM<3-U8a9}I)W=wNJ8 zXplKDJBg)X<|FInDT3q)Q2*#kKE&-FMZ}*!Osw57b;xc2u}N)v7nc-Oq!mF{&4c^_ zGJ_aQYPtoD)v*-gPPaBtIa1T@nPNn`4Y>-ry9Jj&Dxh|N{0CB_>CV6a+Ajj4L3@`$ zG-z)hhz9L#2GO9s%^(^i57Gz1AiW9=n0^6?$CM!Ub@6<FxCc}(fb^kbjuM0!AiW@a zKzo@%bTb131BeFgWd_lpz04pQw3it~gXCf6f%KlJlxqQvgMrGw12qtHLE<1aps)vF z*u9pZ`Vl0Kj%Q$T4`}Zm$Ue}XJ`mjvb=L$ajVuo{4`wfnkB=rN9r=_({D*EX$leyH z9I5H(Kq>j@=uav6aSrkWC~iQQ)cARESGJ`FRJMQ&L7I;O#S>_L=SZ1ci%vPX>|_9? z4Un=Q)p9L8P(7gV0*S#eC1oefP7rMbO&g&3C=g!}$_LFyf%vmw7DDIlL1G~HdXz)T zPEh%Nr3B)3uu|y26S{km=NmwBFmpgOscryuX+Z@ctXm8+4{SFP1UYF~paORq_JGQf zoQ5liPs1%xJ3!t8`BlrEfdMq<4WdD((SvBvo;nZ>Dg!|@sH_ChAbF5J5C-WDs3bo9 z|G{D}Xnqo8F6ev)5M9c^zyP8_WgUnHm5Cr4BoDF^ghBRh$&+gVm3wv!3=A=KknjYF zKd3~^4-?8$J(UoBFf&2+Oo7@DIxhso?}hR~WgUo*EDzEL!XSG=?O{+m6f{m&Pzx~^ zBo2}XwT(a+);@yGb%5lMu}l?2A4m+O7i8ZisQo*j^a?1w0ZJpwgY<zgNH2&c29uM1 zFCe)S*$$As9Mup%keYs7s>x5k4b|kQ!9CUFrx%dlLGcR0q{gkw1KE}qXkP_n4y^49 zigQqT*is|c@}>q_enabKP+w~XR1YYuLHb~rlJXm7Cx`}}g$$xW<u`~1mERy5RDOf# zoiGcb<u^zS<X(<iNcjz_V<M^`ZU-wRviydb1ENWF11akXCe%Xa;B}$n(RNT8<W}@B z1&QIpxbh95^#m@pkg)+!d?g^26Y<Ug0r7s0K|%iE@t%G@o_?;u@h+}zo_?+_U?+gw zrks+R2D)|;k6O@Crf~H#4`o|8pk*Ui5K8E~GcbV8Ro;Un2P(fn(s%m6`Iix-1{CKY zT9tu;K?kZ9R_}t`15!^8CPgo<aE957ZOo&f9_$C05;zUAcLh|A(EJ=+6EvM$G$6_+ zLgy$wf!YBw17xRxI|Bn~?HY&%Wd{%qYO8~2(7BNy8g%{uhz7}n^nox)FNofP)OP{# zVd9|k^+A}>8T%zj{S}a2kUc&O3=AL|bgl}B23>>-qCscmfM{fSkewh5(hH)A!Q{l7 z26QY5-F%R}2~asw<84kO`SAvF2Pk|&nA9+qc_iBs!wb2a24oJbd<TUs=*-ZRCb^ac zO>!-u_y)CQKx)pk%C-D}<}(l<j0HfxXJEk9W&o>UU|`sQ6vr?z5Dn4|vlB#v&L0NR zp!fmNQqXh&D(^vj&>0ROeIN|d3!-5dl=orR+kxaZw8^!A+|JFwzyNYPNF7KVL=%HS zZosDwTi*6*#+|q4K;=kHBO)!BW`g{o(?WdOxdF8s<R6e;BX<S{P}>wlgU&Yx(V+FT zAliz7fdNE=?sEXqAbF5J5C-W5(Je^kf%q_S&>3DJOz2GR3?x5+^n&aGt-l4)pm7cm z4LVy1M1$7ff@skCTM!MB2iXb2AiW@(7)(xl%CusJJ;*MQy&+IJQsZ+%EBWyTvKth> zAWUi)zj-3tg6-ZTP?&=9d_<dE%ak@qo(GMggX}ucDc5qP2`vnW%=1f-;uvHW41>ZB zW+#XS-FE?^LGc5kL3tiTgYrCx2CWrB)(c~UX!Jb4q)V;^<aSV=2e}=j24o+ICI*At zfKMH^Jnzts7Cuk|K=w|6%8{BzI65%R1evGML44Xd1GO9E9FSfUXr2erpgawtL3tiT zgYrCx2IYAW4Uz}x17VO}5M6;}9*7SU2h~3yOsEcuLGlwwFUTHW1_lNY4Jy|`v?r7g z%KIQbvOLI65C-W5(ZpbK;!~g#GweZjf$a5w%8?qMEuG}Y8^~@@_<}I0VVv?@wguaL zMWC<+<$0ejxt5MDNS+7Pmms^g^vboIXhRDFBJ=zVq&Nnd1;e1QgV_n9L3tiTgW?B7 zgYrCx2IYAW4LU~;SuczYqS5nwMZa7N$nBs!4{|$54ahzaO$-LP0iQZ-dETTOEqtH` zfb4C7%8{Bz{y_CXjRI33^F(@xPdf*Y%mC>%b7x=x<slFa3R4gbI_DikgYp`P2IVyn z4Uz|23hh&X*f~h%f%qUZK{TlT0bxSt<p=a2!U?1oWKTK+0|ST#&Fp~aC@3GazXikx z-E#q=LGmEGKp3PKL=%I_iBFbZggcS#0NHB;l_NDiD|*R~H;@}Z;S0i~hVh-3vMt!| zBmjk}1p@<vL!VqrO&=uBgX&9=T`iO4TK06Ig#nRyz6U9eL1w`)DC}T%f@n}56GVds z0YJ1CG~PkuGax=_pA)iP7#l>R=XvlLgRiTvvqupAaR^j3Age*ffzN_?^IEoL24p+| zECwU2pyLlV{gChgr6*7s1Cl>+ND;JeiV>s+R91m#&^;|%pyq(w2~r30JBTI+gY-`5 zmumsV4XBL{9rFOYxnYW23&<^?vJMnyAoD@$<3Sx|XugdPp#7a{SK^skEG9t02jm81 z402BgRF2d<!!QxkOptjJ6XjY!c7pI0XuN>Lk?n=Ck3j7P@j+^=-5D4_?F$eM+S3Q3 zLE{M^8dUayXiymmqCxT?eIN|dJ7J<+O97I3F!2==5qBcb(1+}$!!?&0g5)QVnIL;W z_rrkbI0gm=5Dhwm5JZFa7J_JGd61nT4AKjt(ZdKP4w|O};T6#E!8Moq1dDq>Wi7~F zP#y%)p!pOK4Vq5@(a7>(H$c-Gj7^9J<sp1((Cb)GJkOYfnHE51fc$#_Do1Mi;+af- zI`WuIew>5c4T>8OCN+Lq-paP<BuazI9gr~$u(29Yynxzp0#oE#e5OFkb5OYfQq(e6 zuH^tU9f0^?Ok{bk01aEP9wY)3?l3z+G-#{_M1$fMM1$IJAR1IIg6MoSy+~XJP&tV_ zRs$R7MxUQ@m@U@=@)M|^k}(C69zgCWE-6YWEr6H^;)7Vo>q|Oj$+c+AhN$;&X8@1W z!f23Mke-l?RD}TlV9yAJyu{p8g|z%4g_4ZSVuj3-)LezkVuh5{f}+&q#FEq$Jq6Fa z;*!+F6di@q;#7r_j8p~BV1ET?ZEc0*{JgaMqTIy160j*&@EQhW%P6LH2rQXSoi&`{ zP>11K!wHjzDg#rXG^0eDL<3u@4zA-t^ZoF|4YnCOAux+NVFAyFFb32**m_npVX!PX zET9gBIUXdYrx2W)s*s<T1DXiRNX;n#XRDOdlEloMVo;|Ktb5=HkQ<foI}+v{a9q$P zx}gDw-yPsU0=t(sj)0!7lTuosq(Cr8zAT_lS_7>W19=QrzJtkw)W9$(3_xs9dj?j9 z!)TEBhFOqu9;OZ?MhJuIENp5(c?w+|)UJcOYbIoV6jT|v%tY7=a}SILnE`SS#~is9 zP@5ezpXM_Up&lep494Y7m|paD6KGBK1!%noQv;(x?opTnaRaIAA6k~lwSekkkUv;f zLd*b}2QnMfM+ITnnnIX3NDdjtK<x&Jfz*J)3e?U7(V#VqAR5#T2GO83jvyMez6V5u z<U#sC7^D|O6NAYKKY_Ur|Dl@?veyGDM{4+i%mRfG2$LF4D?ZA$%z(CiK<2>Of1q%2 zXJB9um?zg#F%P^Jg98*tE2hY`*sPFiiGZd9kh?+pU>G#F4`Y);gUo^138F!Bupk-~ z#vmFrM+~At{d^D&I-dk)KC<2^^B`+6KyB0+b0BWN0LmMn$wn;w3Q$`Sn>ipmNOc3q z98%kf=z40F$hF8Ug`^RGXxkD-gVcijN}D1ZWcnzkRS2*wp-vqKYdhkq<6!d0{s5&J zdbKT+a|@7*Q)FjgWrN)YYO;VdLR&{5F(R5TSk0rCAjpjb8#YkKfYj0^&%y$ZxX=Q* zgI4JPvfB<EiG&+`3=9lwR#PWG)WX6Tts?>JU%=#{%D@yT96$_En-5mD!f25Ak|mJx z7p4v*MhJuIDQs#$`5s*y)aHY^>&+ran-8?cw`4KGUYL7eG{_8)dx}enK!FV6g8L9) z1`z}<_rbKHxAj2tfqS6!5KIk>2DyW08N{umwpA>S$+f6#lxqRC^}d{dm;o|x&N9S0 z))ns{<53`Sn4QS92h?tm7)T8$j6iF)K{RN72SkI`b%1ElSSN@Et?K~MAbF5J5C-W5 zxdqgY2DxX+W`uh{@}Tw<2tRlaaStfoK;r251{U{#+Vmj%Kx?=`G-$jEL{~5{Fo5VP zC=HT_nFn$Yj7^9pCq8?YL;QzsHpt#1P&rcLlVJt<@dk1SD11Sf)G!wKEZbs&ls;kY zR#4cwGB7ZlSRvP9uoBX41;sDRe7Tl8o8($tpn5=l2H6k8l(bu6c7kZom_LXH#Se%E zwOc_nsND*pLFe1S>;$<1BnEP?&q_$U71XvCSq^b~2dFPZWV;n+4u~ez4IuX*w_Ay6 zgQDv(SufXeWj!Q)1wh-aFdC#5<X76%fgsaIF|9&i&pPVV)3A2wU~RW%Cg(y&{D})m zP<jTR^$yZF+HNIr9s|^F1qIw-X}5yhLc~BN0|SH4HtOUDSo;rGet^j%r$$hk1Mxxa zR#@2zqe0>^(DE0i4kShhgX$@4YC!oOT^!W@fw^nRT12~5XC0*62iXgA4~zzx0TM4R zDFOvDh)eT!Ysm(Pd%%_<5g>Q0fy$BE&av4@d^_g_)DDo<AUi=}0cxLuXi)nTM1$I= zAR5#@1<|1PDToHigY<zgNbi@WaxI|oQBeCdV=u&CAaRg9sNDp@gxXFO8zK5YdO&(X z_JG=_AR5&E1ks@ODToHOPeC-OeF~yM@*sU64AKjtiNUzi6-+O-{)WybggasCKs3nS z6sR1j@wQ+S`SAv_8x+1EOllZce35N=1I>>hb71XLP?&<+dl{SMS}tscv`<0tyJw|b z%Yr>}Eq|bTKz;`4gJDYAr!YG~G^lL|qCxQkqCxFb5DjXdf@t*iDM$?D-Zz^e?Nd-2 zddo(L+cmZjf4&3E91u;a8$e-z+&(3yt%<JZ$WFPIlwFYY6$st;2BSf0LE$~xJ_Uuu z(84}DsZ$>h_V#H`c@a?&14_r>c4<y|5wuwfu5XEJX%S@wO%#FMjo*<l?|}V7o4g8Y zm*$ig;dckv|6uph#u3oDb5H~l9!eEBK%MjtY7c-shO0dalLx7RVNe)=*r4_(tSp7m zAn`XlA>}Ph9Y~B22GvX0)PV9ix;Usk3Uimu4oG_xG<SYr2f|*Mdtfxk43K+@ON!uG z3d9GA6N7QN52hErT?3jkXW0#L4@?b=2H9%^l_RxX12O|-HV6~ilUo6`1EdFJCnzjH z>+wM}XiXf52Cdfz(V#g`5Di-L3!*{tAblVV(hH)A!Q_OK&K}(1lmeBbXE@FHD%(;6 zZ8L!U3~R%I!UeR}U1zUc%apy4HXLXiIcAGoi_QtTmL8}c^zfpj4F|ImM1$IDAR1&o zhz6~32hpG<P#_xAw*a{pgkfqx?%l8#(uM=IGq>!9xcv>NPeJ4uBgkx!IUt%;H-OxN z+=e5jJ%+Al&SAM0n<J1k5(FJ%gwY_iAivV4NCufcifI)BDu=04hYj{NTpoM`g!qsI zrD<?`4y+l{1OkZ>(L^EM5*nxkxp8pJkAnk_sNe#-nKlIov`q(g3sD1&b52tyPk_#n z0!1&bb{$L}qy~mT;Q(TT+I6t<6-I-^j~s@S!7z0oF+vzudjOR8(e;Abbuf4F9D=m# z+87uZrW``p3v&;Q2AKhJPjN{RIFLbn5C(~XXksufH^TIyx9vc4<PV_r5ljt?2H9(H z6yjb|+blBA<XU<zLgvWlynvViGVj1q;>WUbpmu}Y1JVl$r*Z}c1`rLpOAADU*3f}y z&{>Nh8g%{`hz7}n^nox)@0ZVVEg(06#vm=eA>0#i4B;MF8x$0GAbsfg4;J?<gSuxW zl%5Ht7eVPIP#Po;GY{k*P}qRRMM3WIxPovGNDXKY3<wiE|Lhn<A4m_#Opw1p=Zt~q z15kT6Lg{T#8d)Bs4}?K_K{PR#ob=^z9N|u6J3#hUK;=kHUt5kN;*HQ+3-omK0ZA{Z zaSn1nC~iQQ)cEoEF541<l-FQwaZr4L_8jjxA=jdC64Dk2r45CBaxD#)<ytbJdO+a? zvLA*iX^X?`1ks?qeIObXw;&pH#sP>1?X3jS2VoXM*PepJK<>3U32BRi`U@wHLEK(( zlKAmdm^mPtR5yT}gxnS<rd^G$N9DX+%aQYtv>6N?PleGSwV?2(O;rjqeH7Cw1lF9R zPP=2!x5bN7OGpVrP<n>6!;4c(AkA>_I3!UGOHwSNvRbga@jDXg8^}F2w8^uean-!y z)Drv-fq5P5X4*Ie)(!_nBH_VR1_p)?*Qk>pVDsj<+Tk#HSQvn4P&j~SP&*t}w!&zT zxDT}ag{cFH5yGH)3Y!{GzDE}awdG*$nsOG>4hOAMl{p6~_d)i;+ykRQW`M*&?QmEY z1MxxP#9&<RgXu+YgM-FDQ!YT<15*Q|LH5pp%8}Ye61hnH`5HH%c7W^!*$D~@&^$hf z2AwSoqCtD{K{RL`0Eh;iM*^Zj@*sU64AQ&gB4Qu7KrH@srvVoc{s!p<nFlJ=Ks2bW z528Vfnm{yY_6S5H%Y*C$VUS*lqjD{vwYi`+HP1bWxgc?nJgB_}!i3sv53slg)NcdX z+sDAb0HW)mG-#Y2#7C9~*#*KddqHeMn4I)7<r2hy=w^fLJp+{^HN9|LCO^HnTqZxx zL4E+m4G5DOKR<rRw%mc1As};LZE8@wfX?RRxgyt6as|?+2BnQPC*@jP?#i{if$9N; z7f2rrQ_`k}*$JZUp=ktUK8O!G3jjpxL&f`H7DC(9AUTkGCtQKFsX^_2nM)A2p8@p` zi5%aCnFFFpbpyyr$Zcw3+Q;a6GH%JWaNLHZ%@Amt8b*WEg2IC~)gs9BQB124_;8at zZHU3%rY=f_oDD=M96{+A+?Fm%ErT^aL1M(U4hfk~J9&^B2gjIpQEC|xfdzIiZ3+x% zI~o*$gqzV@9#AL!!{+*NwV`41$SD961|UAD4Gk+xVKhj5!YxR73sVOYBZP6aIY9Xw zT`#B&4RhCn8;~|MsO^(-6JamRJun(%2FN|dB}MQo1>%FmiNUzs2h)qK4ZQ+d@4(c+ zXpp@RpmL<Pi9lw6+UFn)8!H5v2NFleGIt>10TKtP0fhx<jRJ@Utw8|Mpfw608ni|M zM1$5SfM}3BNFNA;^nz$&Fgf9L0m+@nc7W{VxC`+EJ;O=jmu!myG=4ztfwkd4;bOtS zz;NNNT#Lm$NE;3`Zq9I3uI0*exfTPc9+101`e2xnHXO`O5Di)%0HQ(WgJ{qi1rQBd zqX44O*C>F*K<*8>2Wi8B+L;k|Aa0)k>W>iFhJ%{}J$D|&C)N$1Fkoe7WLVGvxxb2- z_87VzohNcFXP!XPK`68h2cto1!EPBn8wwN@Lke$sOr1Jxu(#o0V>W~$2b7M%ZMb6i zaOmiGDADJ*fyP6L8x94BGfmrYpa>+~hI4sMo%9cD3z6G~gO#N)8k9~$pye$ntU!EX zFs`~El+V%iBe&s}JVLbLG#*3Bd62y@_rPe786ffEk|KDP0`WoO#9&<RgXzWAhRb;h zaSu!lj0V}e1S&^r+r;D<@#9(#pmu=l1=$G-3s4&lM1$IBAR5$$1JR&19Eb+B;XpJ< z9;6S1L3&plm1_ZwNrJ{B6Fx!w1ri6zgVtSuFro3$f@ctYAUz<xAbUXjtUxsA3@8u{ zIujK{gZ5#8Xk>YiJ`e`!1<}M{a^g+pIl`UDc7W`Sfy$8@Z!?~gA8#NxfWjAqNe$zM z-?A-Fp!pGG4y-*23R?>X28M(eaxEubK-#0A_&st@u4TqYxt1?bJs>}W^uaJC?NOMW zAR5#j1<@e$K{Tj63Zg;nQ4kFpkB8X_Qv-7ElNXToD5%Z6<{8B83NMMDrw5r0G6zJH z>IRT|klUlgv@Ox~?0F~G67wFCzQUmGQ5X$U3-T*%suz&yqnK79;PQ?-_3>bDkCqmI zX08Z_A}Ae$+oPogqx+snK35pj9xW{x9Q&R?5lFZ_`hZiR1r+CmQwBr@u6mi$_9(0@ zh0!3}p1gyUx72VSD4&DOM8?SNQIofb_UMkc2zz1ffzcrSAomoP6v49;hz}Ac2IC4p zm|kq{(Ld072c`x_gX}f=0C6j+?HZ67pz%ZyCN!p40JQ_82V^HGEI{p15DjW?f@n~C z6hwpCqaYg89tF`Ld5}I32I&RS#9(s5N#!FXEYQsd*&73uqh~lR_#@j=f)sbKHXJBi zKy4Y7PjW3ipCD~G(7ND|mvSuyU*%d_pn5>=M)nIOZ8(^nAR5$u0?{DzK{Tih2cki3 zI1r6KrU()Pxp&1UNE;5+&Rp{W;`S$?J_V6uiZF9PG^uU?g#&UMj+pjXe0Xq3kf)zJ z%H<=_x$gM#<YL(Q-Joy)nNJKRHC^hYGqvpbj5}TOe1XW3nl5+zkZS?;?LhsylHU+B zVE(W<#n%GDgz~iq)NYW!L3&f%85ltM7(|2eF^C4O2LREavkO2p=qy_h4Uz}x17VO} z5KRmwC;a{(xf9tAki8~fA$}({{6OY_!U%*(4W}1>Wm`;;;uMyzLE!?rFXzu!xt5e~ z;C#&hiX)I+YktYKxIp!Q+zk?gVM_8f%uWz(z`(!&q9vfT9FzuKcK{Lxt#5|e333BS z4CLO1Z;*TqE_=Q}+zwVpWWI)(1ENWFLwRy>a$-q5XzK*nN|3wagEOmAJ@dlzi&9X; z!3u~VNKIo~*73C@e21hXbmKwp*#MOzHI2<+P-xNkA=d)B7vl%30%*DtJhtobL#_o> zE`V^zRmdC($R2dNLHsvRyFqM_nrwFl2GD&kAR2TJ42TA;g#*!`JG($M=-^lo4Uz}x z17VQf8Q<kvK;;Ig?A`MR;$M*Xg&%S)EsOZT_yTla3aD)a(ua;~en9kr#6fyN_JH;n zf#^;K1_lrfTD<_GL2W`1jVuq+2f`q|ps)e$i2=0{RFK>Qk_Y8W5Qd$@4VrfbiKAnl zpP24h40Q)+Uku3p$x!}$D7_F$gXCf6f!qUQ6QapUUk8xfiEKW|-XBmoQqz~oFY?n- z!7uXT9OQmb+<-8t@gu<?-?9gq#z5x4%1%%`f!Y`rzvWsM{DzdBptJ!}bAwr-<pop^ zD7-*oFic6=39}PKgVw2mXwY3fAR5#b0@0xI3`8%7SqN=EfW$!V-SZn#c7n=xkDm~? zgOw6lcEZd7(WJV8lsoHP{y^@m&xMX%!Dx_M(ZduZh703L`-JYS|M45rzXHXV2vT0( z!iqgTz}&|IEjK~I2`VqZ?ov=_ft61VP<fCzOb?6(iNWxOe{wCLbOb8*Ko}+tqGA4r z(IBx$3=9ltM<IiR3F1G05#<p<#aI*|pQDdO8bt`?-Y*RDEh*4C1SIJLwI3D+CI2Aq z!4+?y^{ya&$e0Jp0htfNP%fMTiNVY#mWF8t=>@SbK-~p$FU$;(I7psYKY`RE15lbk z4u6nY$nyBuxWWgf2fbeoYBNmv4+&eC8W;_-cL5`$z9)3|*#sttI+$MaXxSD}x%%h7 zd<z2u$UH`HJ7dN_S#X;J-AorANIeZIztH8lSr|ZBjR91iA<N}3$hU-l4dMiud4^5C z1w@17*9ghCfcPLb41>xtY-aOAFQDJU0CFcpHK<&N*=55h-vY{ausQ*hXPFon89ZSL z5~2l6YMkV4*>D2Ye;~cCJPZu5^mJ-2)IzWh1_q{P2m?8dfJ8v)4Mf8*DE?q<bhR*X zn3^k$@+~m?U^FQ7-_2!V0O1-&gkLpwOTpE`%)v$LFkzZ24%$aEmxbZOTowk9y}0z^ z6K}y{?gIt}hEH=@z!+pNKK;1l?qD%jjDdmS%Ul*P2HA^CFFtV-X6)hcZ7vG~2!rg! zryrjjEWThgsJsW63BvgF;gfrU#l21p3=BW!vVd_9Ga^0UGY4I60Xt?mfbQY>HJ60} zghBSA>mi1pkigW!#01&1hO8b`4}I8|2`W<I`3V+I$m(#hL3s*ay@X32OdRAc7#l{z ziUCmG17Vmrh(_mw#E|iq<x=3XFozWp{*M_L7~GJ`3uN^mwh)M5U|^VWA5qSL@-S4G zK?Q0S$Q*Yf%yF2AFb7nAg34@|SuolIk2xYtkh1v?)Lxh#P?{3pmTzHv8NhS`scePG zBh%<@ADA4dZ3OZU%&*9C4e}pM9jN^V>PK#X)?1)F1Cs;MCRb%!KzSAvALwoYiGkGM z!eFzZbyf+3e2dFJ*%lBDQjf3B5(Ft=U|;~XC810PQ24^w=rpq5kmW%4^@8}Iu!vzt zq!W-B2#c`Gx4`TG#Q`Y1K;ne(4=i~XR7d=o%fbM{pu7z;1LSU8?t`g;(E%KoWdf+o z{Wq6|0fa&J!qk#NufSq1$h{2nSQtPUWG~D-P`)D8y$qa~?gfoSFwJ9O0AY~5Fmp+v zBe0kYaxcp~76uRo*$Xod)NUZwy&JHY3vw^pJQfBJ2H6WUmlT?V3o{%*?&X-r!T`b` zdtv5*${S+cn}Ee!P@92k9t#5qgY1QwOA5UMi@7cg3=BN;Sil%$FDd51)Pl+^nBQQu zGXnzy-#ivD2H6W!ODYXB4@QH^DVVvWngvt;fM33)0@{Cu(Ki?v7z|djfN=&lW|;xg zi;w;yfoU!%oq4TfVF2L+WSR@o2XiNk7G+>y@L0(L#u7Z_xfi4lW*&?NrC+y|EDRuA zfMhNxzrobt3j>fGNFPisj22;FU~pN<0>&qh%mt|@7K8M`%!AROeBrc`g#m;WcoE@1 zN_hs-2Qv>wgTldKB?|)xSD={-Q$xtzAbl{kFdB4Uv)xJ-1`xi0WG*OtVQHL@xgdQo z^I$ZnzOY%z!T`b=e28!$WEQeKNFU5R7!7JOSgmAX0O1BCb4e-BK>A?j!Dx_sEmpEH zfbb0@bCKOchz-&QGY>|C;>~O&3j+un@FT)OM+}iS37HGh2Qv>wgU$grS;@ix!W~HF z5;6-}9;6Ru9*hRL*JvdR0|<l4C7Aj>>v-X16if^k4QjuX2tfRboQ6Pg2h#&?lYN(K zL2vKf5Rh*H=~rM-XaQlEe)MsAm^iUC%wAYq5!7A>jWdHV%nWMT0qWc&nDc`B1u%P& zX_$S;VjwoC3<c33+#(1GKM<Q1*anCBYb2#w1lSZ>K=EU{q(TZb4g<2ELm1&6P@M-V z&p_fSLJ0Av3=9ljJPZu^(7FsHkBnjc9*x_G{t77H!qmt>%>tR@O@ui%cM;}%f%*sJ zPFUL>WUdb$bGV_yI2Hn+u`Q5lC>EA)0r?$dCdfPx4U+LNR%!u-2MB}sAdJheura9s zq;PZKRcL|PWzsmkWrrXnoUN8sNP)}-nK!{$37&31;q3Ap(!V@|WX>}N1_oaq28LpH z1_sc)IY=KehJ`b7_;jQT!Od-fngue)4{A;*vH?&w%pBzSih=5dDuGk}P;)flA_xX- z>~Dn#YB*<z$hUy}4l)zuZx9XARU<0j0t*iiAA~`E#b!1voOg&I(%}g~g%+4y0onUn zzKBA?dFk>BDUjJ9^KOVD)Pusg=P4wdO_0Q&GcYg&@GvlxxHB+-##%u7kTJIK`2#fv zr0xyWO(1guq2?rjB+xL-9OU>q0@Vw0X91KA(iQ|YM+L+|!?5)HL;^LOFNn&wfcy?J z6J#EU25I$?mu~@u2MB}sAPn*=HnU;jtRRL6Hx@C47MNWgzdyAYNGY^{!ZJC14JXKK zka=&!5$Zv5Z%#nU#W_gkya1gW!Nb5%=FY%?eBKI3KL}$Bp99eTyob1aO9<2~kU1ex zbCAzS1epQCFmsU8Gl;!JR=!0*Spke;^&om(023#c2H6L~p!(*-ONgIAe3-vMZViRH zbpc2M4a3~}1nM`CG^ou0qS0{})EsPM<FLH<K^8SlJQ0^~0mT!@Oi)~bXpp%RwB=hs zd=MLkLGgmkY*?BwkwC<;i<CkO%&sjG@+~hx?d(V<aM|-k5j4NX$Pf)1aD!REz`y`% zZ-U15kc1dOdc%1b7+_(pw-Q=lLlwcs-5nHB{g#8|9*|N{9DryLMpp|G17VmNA4x>J z3}&wv=w7LnEDSy?Sr|ZlDv)|o@e(ZNg4#oVD_Iyo7-TQ0W`flJ!D6l~sN7n~!Vs{M zg#lzQNFAv-L<%z;KyAaIl`IS(46+wyCa4aFg%wN;7rh3Hxu8B%$VwIlFqT53C0u4; z6K9debT4TBA#5cJ0|<lc#ioytSPT|(L4AdYl`IS(46>Jy8QA2vU@;dI4pA#v7(f_g zFE)L|h{56lMuW;-keMJ%jDBotQe-g07gQ(4tYl#TVICRs;!QyT)7(e~28OtmEMN?> z7n^$siGjxXam_!#=44^v1EUF<36ckuEy(i^6BHn253y!|+yycR8N-T0P#FZm$a3g> zWH}HU)((FoiwOT$3=9krNaZF-9WusNw}A36Obw_$1hGNpL=s^Rs160G2Vqb>G6AX1 z2Z@1j6drS6^A9z02tR=IfYQ_iWyt)416r95l1IVNct8;Y-7~AE&;s%gtR6*<Cy@VO z>OuXT54;L33sfQT3Cc4tIS>sRg9GJRP<)`f1tbPigA0Sq289bq9@HKJwZT9%h>x%C zhRr{iAcYIe9FSggjO;gLIoSNe2{nb5JMySu3{p2mUcLop2Ph6e;RO;Wge$P*T~Hm7 zu#$xVgh6>5W(LUJxZDR*1EVisF&9+kCaq*)0AY~5Ftw!68j6@@4amJID_Iyo7-TQZ zJW#$O*1Zi_%mt0JrmbXQ0AY~5Fmp+vZ(uPO<lc;xEDRtFvKM9^sQpB&dkvH@!vW;p ztd%SbAPlk>W-cjo2NrWd?#)@r!T`b`dtv5*${S+c`v8l%pt>?|B?|)xgY1QwOA2kF zj2RA~`G<m)EDRtFvX>O|U}`~S7R+xj8Z`e<w33AZghBSg)RIcW%!AROatdT72$O0S zOnpQdZ%Yq!%mzk-;*H?|3j+whP)3v)pnL&S1JjR-&X7=VS?$BXz{<eD0HQg;YaAIF z5*k>+7+GJ=GXc0-WN~clfJ~*9J)glYWPs5io>V(O0|?JhLAVz*ZV6L^%`9XwkUp4N z7!8_-k!a^<0O1cv=04$LZkY>p1F{*|*bXZ4Eh~H&7(nGYj0UB%paxb35JuM1QYzKL z<H5iHT3e4Sj*ZPR?|X~vCy>t>7+^HWy>7yM3?RHf6%h_^=1R3le_~|l#%2(jSb&;5 zMtT65`(Zx|0|@^>G8auNUhWDk=7L=RX+H}C2!rf}832kmV$&IeI;ML;<KtiUvoL@# z$X=Maq|gyq%mumk+kO@X5C+)`GjEO&!VNGnT=WJk=7Q?CANyGtKp12%F1`4~IW!P% zfQ22XkNImq3j+v)?1ky?NkohX!o+aV30TYpx%bb076uRo*^5grK5<aF0&^#f2F*wP z+t0!P!XSI`>Bl7pYQKEZfTVp`ISEorOnWavQy$!2q~&-J$St7uI%w_zgkf%^)|eBa z`3IPNAa@{R<oO2{ElBtw%TtrRM-z|vnvn6@&J`6>pz$b>y>GM;>OplLs2&1|dmxFw zVPIg0;bCB?gw|ysd1MUh_aKk6g5)D?<Xb@Nl|dMm4$<QRCQd93G8cqF=78EdAT|ik zfrcx{t+7P7^$AoxNN)+04GIfb{{bW(hsPY)n6QR1q+bJ455iBh<y%1E3o;XA9*72s z|Im?d0fjjTgZLnfD?H)je>#Y`F)&bQf!W1#R=s6~i9!oI0|P^%cSaA$Y>;^&x(M~4 zxO9Qeacn>`=Pd&RLp%=yLzO!N1L!^ukUnG#i%aD2(O^T&2W3Fb0-2KlH3#_&5tvyp zbCA=715_`_ouIIRsZE5MqYe{5qG91Y!yFOLEJ6!ge01eoKz;|A2{I2vgS1KL$+v*Q z1B5|*5C-`bo7u2%o`V!_J4_T>V0N)^9cp=E0m(C45-O!YW`oQt(Ze3jAUPO*$H2gl z#KXW)?asge+KUMjhtb%=X9d(9AoD?ff~if0nuE;`u<+rqMuZPYUyh!93&_nNGePEo zXpne=zI+SFA0Q0kgD}XA*vy87&mJWIez8z!f!Xyy`BqDajRH6wN-?eM0htXl?~Xod z_`t^LEs(_DgZ4V|Ffi1+GcbVK@F0E27+d)8OoGfMfz*9~x(Q@XD%2c&b8X1!`2<ui z$ep0D0htHFX;5=u<5(au7>0#&j6G^NU(uIu0r?$dCdfPx4bt<%K)wYO9v}?jgD}Xi z*vy87vx)&C+)`{5T9EBp;h@k0YUdxhrNRX=8)Tk~AwoSUzr(_L0g^c%7#JARc^DX4 z2+V0BhYxZ%M?lR2nUeuE2Q-cdvL6{^i!TGHUXVLMVFOd22{i|%2PO`pxj~gI0|Ubx zXVh@EF_dos`5j~?$UG1YQoqAiz6BH>APnMzFvzdi%;pD4GB7aoAcfl=2Za`xT_C?+ zfy%Wa)pa1hL$xx1#+;VeDzub1DYS^#LgwW_au!DNEg=1%b_WQ9+yL4~3aY0-@-Pe& z2hpH(528Wk1BeFAhk$6%+%t#<@nQO4V_~4U1=Xh@3{n%sz`%gb4v;uV9(2wPhz7+O zhz9LF1<}ZSm>r;?|L}TuOM?p}t<Bwd@fRq3LGm1?sA&y0-^gQ(5dX-)z>vkmz|iH+ zz>ovdgoa^pf?OxS<{Nhy%eNdcf|vy|CmU)G=-vc0V;ErOAg5UnTfjyhypJ9f{;>80 zdf33kiKSt7gTe-uzfw%(TVVbMxitssR?t0ZF!eAR=GG9Ta00PUSj)G>_$h!f%q`S% zD=4iX=V4ITg4_dgYcABSr$GW}80J<66G%LOq(S{J5RH!Wpyptkzl6<=+IXVoVFpwA z7Eqc3nF&f)AR1(Dj*ol`h!0}JFenXSGaFV`1|X%!H7*J*FuN|8%C~$%nj3ZSh0KkX zz$OD=7C`4lLGunsLJT0i`8*5^usC_QAN$;Bj}NNfI*{B0G7l67AR2_x)q=!87^Wt} z46}a;%KJPASQtQ9zzh)|AbrH*16a%j^;`K4urPoy$X;U2LRKeXj_F>|+^E0-76uRo z*^8{6Satyxb3x+*LI+qFKp12%%q&pb9~MV2F<kTsEarm7Wkn9KFn}<~UR-+di7QxO zh6BjGVh30lKp12%Oh0H`i&*zo;4oL>01E>MgY1Qw`ypBuKBfc{!$n`fVlHUBSLy%@ z0|<lc#ibXYxP~QWIDqDeWe%_~fH25jeEM<8HDECpG(IACfQ12sLH6R(i%<Lp7IQ)2 zpm2bN0fa&J;?s{$4i?8S8q_WWnF+%9^x>21u)+*q&>XSS0Tu=jHn1YEeCV;mG#At^ zP&vTD0Ky=9@wp3^9B3{U*BtSOgnUp{3NK$_;e^X9WN}a#i#$hs#~V@x6Ke*@UC8Ev z*sy8=R2G9UNDPM2`7m)94I3)~wL4&9pBWe!3Xtj#m^h5aR>y+MGLSrIyad!P0I@;l z6cS+$s4W3f55l0b07Qc@%uOJ3iij`=)P4f#17T3TyauTa01^Y?Vm#)+=9*vFpr%Do z+FauVnQM+gt0O^XB4ZzDd?Jg1*c*ZrTEO7~brW)YgZu|l1Hz!T`5RY-7N0;!x&Y-p zkT?v3#@9i49~7_XZUKqG)M2ARW`n{7BnN5>gZdyK8pOxf76Q#pfYdBN3Ky6;AaQhz z>^EdN*jzIxEIjN`!x*g2PQC?Z2Ph7};RTk!Pdvd=27u}?wF4{+APg!aU?zavjmv#7 zH89%79<yu#mE9T#SQtPUWG_rDDfAR9=7QX-b%2EdghBSg%md|5V%_@&i@BgSg3bXJ z1`r0>3p1A#+Qk7g96;{XJHWyK!XSHL=7Hv#iFNNBEarmTYjA*t0fa&J!ptRw{({9^ zkb8{|urPoy$X=LvpmK{?_xd<uh6BjGCI?s;Kp12%%v@6FC0NV_x!3Ff3j+v)?1h;J zDj$h;?;kAYg4zfc2Ur+D7-TQZTvF%|C(LjF%~@I<U||4ZkiDds2U80wV_|-S(V+1K zn*%HiAPlk>rj}G1W*&?Nm8&2#L6}stVCr=|<Xfgf$5>!AXfD*^0t*8Ovp8cZ<6xTc z(02kc%?0&&!Y;5dfN%_%=7RLW+zF#WeYB7ZEDRvLg-mln`e5e4Xi&Zgy1>E!!aOdB za3H1p1?hvC2ctprPyrWM7(h4$$y_|ai6I5j2Qv>wgYui-1r`Pn-h*T=s62zI!7vC- z0HhD57Dj{i68c<VVE|zfS423VX~oM0>4TXEqe1!D>jDb{2<IS~3vw?kjpH?xfq?;} z4`v>W28Dyi1r`PnK7wQ}s2+l;A!IH{A51Nb2F=~NU0`7VVHr0>IFM5Qg7m@6gVCV+ z*yREX0|=KOnM=rx$nqe4F!NwED8D&fU||5^Gf3u=QvQPU!OVlvAon_4U||4Z6?a59 zAiIYU8>A0r9*hRXo81K#1`w`6GWU!hqAVd~E=V8DJQxjHD`9hig#m=GAel?ZEM$3* zKA3qh8suK93oHyE3@S%q>OpHeU}|7uxM)!O@PG#-43X13G3{v;PkC^AoR;I49iH+n zpgs&}EEj}fZlu;2DYz2~TF*=4Icj|S6=8ltk0Vey4HGl*g2WMwPi^{*CvNjCLLqZ| zi(OarfW~M+cAxM;s0XzJKxG?9yuuqH{*{4&p_GS#p&wemgXEDhtPhMl4*-%c2}i6K zfTd&f_=brSOM}b>VURhX@)E>W@sV#i0}WS@Tg!-Ws|b?+Ky00G#9RZ+Eg(BU=EE>d zoLCyB50o}RWhIOc3tNy|%ZYI70VKCBf%+2^Z?OI<$lMA%=D_AUPb5J4(IE98e85M( z1(X&*W`fKE(I9adKlv6=`T$`NAB1tmJ#745z!#BTSYj1gV0Jx_(P^2G1W9+?o-2Al zW`oSD@I$Bvr90TZ!X6}ZzA-Q`RPrz|Omt^p0L^=W^dVzdx<d{h*uKImzVa<DP_sbh zR6)%Foso)c28aza2b2y#d=N&SZ-Kc9WKK2IoH-yxXc%S=az2oOx&h>0P#D9s)IiO_ zwucZFUp{H5@m1g_-vSOpU-=f0c`&oDM98;*!WD#J=7Yivo7u4VI)D`Z3z8ICV0P)8 zyVNox9Wr0IQd#>q$ZU|AR{~Ju3pQV9<Bt&k&cMJ>%frAh*`0v_bOtU+A2P-kKCt=1 z7JvDcFHkpu%&CK#13JSN*$faHW)5<E!RGP|0_0m@ZUUK84>e~iNFy4CnS-2uK<p=B z@+~@r3SbP&>(nX>K;u%#X$$0Ukh4H;ZGgJ<1V{i4!`ylXDZD}L88l^JZX?tjZ1Zif zxjdd6)U<UbK)wYO-ykzVaSozEhIORNw}AK{HVlK}7n|9zv?UXWNE2()6<T0+%?Xrm z`GGW-Cr|*H%WH=X+QKY=&gFr|hmnLBKzf^a7#Lu2Vs-)hTwY8*s^3D8+ygQX6bB$0 zgwfT4#6TFP#v};QW`x-bnj4F_z`_8+p#CXHJ*l_{i@Bh7VAKT`1`r0>3o{c`&%x}5 ziQ%H3U@;fe|BSi7!T`b`dvWQ-CvFpr84e)##$8}x0AY~5F#VvpF=E|21&6r_7g!iT z7-TQZTu>cKthsNnm<#GBCS71*0AY~5Fmp+vT|zL!0W>$3a)E^bghBR_VjfKG94zL7 z`bTLOSQtPUWG_rDDfAaC=7Pc@;{po<2!re;#XMxSu(*KHpn4o+CI};|BZa*r6f=B5 zb7NT-SQtRqClpb(kYetNNKA7<b7MIdSQtPUWG^Y^!PJ80pm5ENU4Wk72n!z=4bzK{ z29;UJb7O1rAY~e{W`Nv<Za%D-1(j_ej4Y4NN0tMzVf_M7I~l|W;hzi)49!U8F-Qy< zW2>`3Wf@2fxNi^!iA#_<Eku|Ds+&Q2K^RmPfM^hgxd~)WD-q@(w;Mq9Tm@3w24o%x zx8X4dHaEr+0dYS_JqUx+=80Iy+?WPhodc3b#xl_OL>2?F8%h;gK<y7$J&zpUApe2X zfG}wOYD=s_i%bb5U4Zf)NF0Vi<E@~)4~kcGw}8Z8>afuuvq9kkk^{B-Ky6JB4dUZ# zTfpYV_JkwC1!fLNFFHo{8?qd1ZVVI_DUk@XU}|I{<y&BOfZ_lYUNAYlbQES80II|C zF0e3wFsO`x=?A$Rm-}F9U~~i)b3tWy!37ou5N3$N^aD&UK6(Qdb3yJcy1>E!!XSHL z`a$`VSod;7V}=8$jZkudg#m;?_QK31g-*a?F37!Q7g!iT7-TQZJkZ!IvF_c0#axhk zD=x4wfH25jn7O3T0x_830CI2D1r`Pn2H6WU4^(au>)s43=7QW?bAg2cghBSg%q4|B zfW=&pd+RQ+Fn}<~UYL2H@{w5gO2lG@1E`JAaDjyZghBSg%q4{`z+x_FZmj773j+v) z>?OrKm|9R73-cR{2F;DNTwq}UVUWErwWQK8^I$ZnTm_j4!lar7Q}2;1-?A7wb_SzC zb7M)*Sr|ZAA&$KAVNMCAxuEpW@SKGKge#EDJy48L3v(AP8l(^AP8c1=z`#)VoCS<8 zAeoEH3~b^ceK7N2G&o;8XJM#$&cdJ(j|c}+%3qK^n0YW7H0E0MoP_~|8<5P!<}O@f zAbl|NU^FOvE1t73fbb0@b3x@9ObsscVB#QsFtsomG&ffEoP_~|4H6LH0MkPZ4blfQ z4@QIXamjNQ1`zH*G8g1tSQ;l}Hb@`LJQxiMhoa{!3?Tdf$y^66S$J9}WG+Y_%sdzk znj0&4&cXn~7Kw;(Af@~T>4TXEqe1m?-g6cP5T1Z!E+ID}%Y*d6%!AROxv`w*EDRw0 z0?Axb%3qK^n0YW7<le03EDRv*kc0>aWcLtagY?17gVCUP%XrSh0Kzkn%>7V6eE9&< z2Qv>wgXYH4p0hB3@CPJw3Aqtj9;6Ru9*hRLH|04C0|<l4QJ8wr+!#y^ObizdY9HQ7 zhJ+z<nkS|`?T{i5ZjaM)Ja9>hd<&=#1DY2DVVE1KHRcGKe*lFIxX+cv1m43*Z9712 z#Wyzwvk&ABWDF{&Vf=tpNF2fV)TTLbn7=}}z2!nVWRBv!=ZYTCm?y~YC+P_HfZ73| zHa19nN*Y4^Hv<Dh2M+_oG-&+}l1Ij{J}~l}z@0StmN(_{Eeg97z!;W}L1Boj7bZ?D z4buzi-+{_Y5Z@tPzU2kf-ypYk65&<@B>#cTFsYDlQ7L5tW0+g0<yKJI1eKK_dq5Z# zwjj555#d%)Sc3F{@ByelLGcFbuY$z8@t6afYq`(_=|_XqgYcbn`4&)G0GSCg4@85+ zPnapSfYJvDgZLnfEAC<A;W`<J^uklG(1L7NKno<@T@l&R12P+Ao`5;_vrShZnezv< z?~R9nVLE}iG34+;-uIgTH49`;FVvh8kmYC?mVS}bgauSDno@>7s5#i?24M3J8tsU1 z&Um5I;*u%f0`fb^Opw1pG{{^BOQjZAc!2mI4Du^Bvti*pB@+?O2`vgOFuQb$|Fx8K zK*E`Y?LZI6Y>;^!me|8tAPZs6Uj_z-ejWyf83e)^Ied`MkUar)6UdwiP;;_CmZM=< zI3vf`0;pazr3@3H=3om8SU9J2Bf=S^e@&Kr3&`&vGeQ0a(ID{y+43#0@Br~a801%M zX2Zhy4^sHFbSSjI?270KYT3{O*<aoFwNeUXHpo1g97K46%25~SKK6=ig!n%O28KyI z3=A^~?5{=+ALR6G05uC_&Sa=LNg&J7Ff5#r<BJ2T7v#<@NPe3FH3!>XYFN3kpdU4y zMRMd@Kz;|A2{I2vgPgF#TB!vT9v}?jgD}Xi*vy87a|%+p9q3VLf!XzBzEsPb36OB! z_N`J1WH!h=1{>_@`2mtS{}~t<rt&Z_%ptIU7&&|tHX_aom;p5lWX?3GIVoVvQ3+T$ zBga<(R4=MZ28QWSbFiIT3`@^<CZmRPO|E<k$nRh?ZIoKTGy?;}jy(Amcz8f90{Io2 z*|2avlZ!})e<moj!0a-S<!sfM3fU9Pdof$hp#Y+84wMEN4@%D-4fQQCb0F~{%vB`? zasx<CBp;$4#0IH@rTc<BggEG;xEVYQ40ECP%7WA)V{GAgV-q4iG+<^iGBC`9n$v-7 z0F(_g2RU9Dpn5^>Y(WZxSx|G3@0f-f!vIV7KJ!uIgC}3U1>|>-nIQ8(G)NC9%s}A* z!XQ2fgZzrkY*>86Acb4b9EBE`U9j-mfF#ez$iOh0hk;=}3FR{^{C?!iw`4%g0+}-h zY7V}75IH?_Y(>Na%uOJ3=0eR`3i2!(hQ$MNd+-J{>_O=Y9ClDW^PuK{?ihy(!6{fg zuq;K5hbaZ}EugdtG81GThz4ouD3osj#RUk1_#g}lGi+wV;^7HWIzO{Op#|BlfMp6T zpmF+jbAHxMsf48GoMH$KG8>fMLG+xpkhLV|d>?3m+yD}LQi!T9L=F*-AbAjGVq{>L z&%?m5(4Bz+UpbB(juKFFLFR+}4l)OX7eLMN2XW9aEF6!lM-9h2h4L*RH-pRsnFpdl zT0wpV`2&POd=Lh?5u4etaMUS6_;<rvg%+4yQ>H-9zi2>`XJ%wzSjfY`u*jW(f!K3c zU~6bj6v?+(K+OV~vj}QVDaes%7?uu^(=&2Bz}y5fXED^A9yBvRT$nk?<qBvl0VIcx zmq5+YL6=})0F^7?doMq1L5+u$V)+(O8UvXL3VRR@(jL+(-vZ);*f0zVGi+wV;$aI? z`gGZ-(1L82%{EB+t$9QabkqXONEAAzM81WEk%0krKPJmg$oiF)u!&V9)u8b;&>Sw3 z5Ccf>QXU2dSRX3kIrjA{0XtB`K%@kben94d`gb52gwfT4#6TFP<_nfFV$hgi({mOE z5C)AQgVd9XeM%AIMKJ$>)<Lv9XJG(gkiDdu2~xiVi@Bh&u(szc3?K}$7o?6<{0ED< zpm6AT&cXn~AbUwQ6Q&;Ke;5ra`#@%bFiZ`p^qMlv@CB`d=z7k=0Ky?<sA+;&^E0Y2 z%>}K4=y}e<0Ky=9i8TvZ9caA)u5}Ow&^^Mi@PX0D`f;&AX&-qV#DeXRyg{rPAa|jg z4a=^eJOaYV^5}eIIS?B(z73*5V<I3LgjpFG7?vUBYmgW+##Tmx=3`)LKx085Hprai zM3{qIW`oK@0i<#bWDW?gz+(<<{lbw7)HDQ2Q#WcM>la>NF%x7i3=2Tx0mg^XH})!k z$F^Yg0dhQn{0CD9T4UhTpwO~m4<tT8c?Kp2qCs<FpgaqT4|KPH#6W6rVUXFNZ~@7K z+9aU*8$^Tn`060o`h^;#aDkZv(u<Cf{e~<DY8Qd{ps-M>LJeb(_?=4m7MLBNIDo}J zNDd!9fF<vO#>e}fvoL@#C~w2`gWQeFeK0jJTA~`WOaPU+6P~j$fH25jm|9Zk0xaf& z+&k$x3j+v)?1h;J%2&j?_XHMmLGy@Hp0hB3Fvwn*xunnvHJIT5a__X~EDRtFvKM9^ zsD3Bby%ku@1-W;|a~1{=2H6WUmlXN}7IQ)Fo%NiB0fa&J!psAeH^jPEqZTt9Ky~Gu z=PV2$46+wyE-7>a7IQ)C0p>ktVE|!}y`-22Qwu7yV19$qp!EO?p0hB3Fvwn*T2g74 zc`zDOPJzq>VN%V4sbA3~-?9ukUjU;)>jCz>VPODagF4JI1Ev=r&C!WzE-0N{d&9y2 z!X0Fq3(^O3CyWNo+gy3W!T`b#$TSzE4`v>W2BqIiZ&(;W*rFa04xs!7Q-d!IKyn~` zFtsomG{1h~4GRMZPe3vkq@Gv|(g!mSMuYOjxi>5fAp8Q!TvEz2kUp4sFd7sNXWp<d zfUrXYA{;>G!qgCQH%K2$EsO@uub+Cu!T`cEkjw>zFD#7{G8d!|W*&?N)fXq;urPq| z2PAU|nT0G5(g!mSMuX<pkG)}G0AY_tL^zOAo`Lki%!AP&_a1q}!T`bxkjzDP4<R;4 zAIv-$4T`rzZ&(;W_y>}?ds+~AlaRR}eK7N2G-!VPz#A3@5DsWUgaaY7kmW)8VCKPS zkbC#NVPODaP`LzC51L<xsey^%qCxE!n`Vfckkb$`?Y#xfw4VzFxf|48r{x?bzPWGY zFafy*hCyX0jP26`2|pO0+B6Fu^LY*^fR<k~XzdZ@P3VWZqXSAaFff4Xya!MHTJ9WI zXyF3gU77o52Wb2S<i-uHsOn&2v>-VcW@ltzSjEG@u*98#p$sO7M8o<=$YXg=pzZ~k z4{N)Fw5*1j69D3%Vc1xn%qd8p0w%qpRldb5_s<THnIQ8(G)NBQSCBtI7{mu*kQ=d? z4I4xHf#ly0#}!&&c7e)ekp2yANa4ZAz_5mgfnljT0|UM}5@dga%wXt4>_vs;LG<}{ zm^iUC*jxq%2GD#vY`ie0UA~0{>Rt{;28Ojzw^qUwBhj!p@`0)cNrBiqdgWUht|)*p z%q`S%E2y70gB>w83=3P3Th~F|IuGO!Gz@d=4<xsO%3m~PVD5UTIXYk-Dgm2&N;r?2 zo_@5;w}A2r$V^Zg0?{CyOJ>WrfcPLb41?kxo7u4R<bjmW=A2e&f!TGUL%xL*X{<5j zGGwfA3vBQLW&w1s9B7;bNr(ZYcLNUt11wH<y}>@#xZx72-x`qI12PX32Ot`R(ba;) zKp3Vb0ZaQ6bf(IUH!KVw3~HZ()RT&LU@;feF1YoEg#m;?_L6EQNWDN8qE3c|6KHSW zoi{8DAPlk>q>faafyG=<J$vsB3j+v)?1h<`!6ggt3&6y1(Fd@Y3u=Epc*DW~!XSHb z>BT25(Ty1npt0OXZ&(;W7-TO#{kY@`u$T*KcRhK-!T`b`dvWQ-Cw>Bpxu9@(_J)N4 zghBS=(~nOMmJVPvsO|%q3BvgF;ghTA!3<x}Sni8AEDRv5(1WNm@R@@yXEFiPT+mqV zt2ZnRAPlk>T@NvQ(3mN%v0T`B=dkdB(ZrYwDqE1pav7jy53y!|+=XrrtT+UfK_HAQ zkIqMy1F>OsHmJS@@j;l2k%3_&Qn?8dL&n(Z7Em6BsR7l8AU4RHO+=UjszX8QK^Rnz zENRC~3!Cwn0~^bo(1)rIl%|$UhK%Kgpq1$$yO43gMbtU~CTDR&p#|h0SUrjyPayxn z)PcrZea<Mf2waDl1IjZnIS>sR&j96FP<)`f1tbPigA0Sq289b)zC*qR)P7@t`UhX# z4I9h#KnfSQIbg$331q(^%fQBRL1FO$);2~`u%chS1!e~*4nX0BB#o2VgC*~R>WDXQ zSQtPUl(%7;LGH%oKA0L9{RE4-pfdN}8x{r-2H6W!OA2i>5wolTx%a~x76uRo*$Xod zl&^?&?-VTNg2t>qy<uShVUWErb4j7!U@;fu-Y;)h7(f_gFU&m9*axxhb(w@24j}h_ zd&9y2!XSHL=8{6s!D24Ry+7WtFn}<~UYL2H@`hOVe!*fcsIL6=hJ^uyLH5GTC585x zj2RA~vD`mzSQtPUWG^Y^!PJ7vESTS5G-xdM-y0SN5C+)`Q%fohGY>|C$|;bUAWW)R zF!d!f<XhH4$8upbXe{@_KNbcM{xcc1T!!f*L@O-CG#8Z4Uj1WX0O61+<e3Z72XiNk z28~0!_{YKk!fVJh7o-nn9*hR1-)H|=7(ke1D#E>>{037)C>%igU}|ABXe{^1KNbcM zjzKb)kXgv`Abl|NU^FOSJo?AN0K!|4%q68f1L=dA2ctpZ@ZcW{0|@g>Lxcn93>}yn zWVc~sgY?1F!f4P~?!A933?Q6>WG*OtVQCzjS;%4_eK7N2G^oC~^N)oAg!dqsi>!|j z8>A0r9*hR}+5WLG-1^7DATk{h4y2T4Abl|NU^K|RH~z6OfN&0yxrE$^EDzELGY>|C z;_cc$76uSLf@E&VB1GOqHUk?Qqz`5uj0TP6Uirtu0Kzge5aEDLKQ1wlKA3qh8sy$f z|5zA67*sC7^n%86VQOGvxM)!Og<~efO~`48nD$=IOnGp7k(T2@V0Y7ad<@@ME^?TF z-2x>*Whj)%ATbLPelR|@=?l>KK{t0vGh<7~Ey#Lh)A*G?LE}+iHFFT|0o8f1v({o} zBgA<a85p+mFfgoeXJ7!;<6wPA1gzhKJXQ%}YpjxQk@=wj#;`PoKK=(2Czgg;3+fxd z&T|8aZGeU=$gSI;ZpF7Y^aoTuNN)#>4GIfr{{bYv9cm7?v(jMW$y4q^`ZXZ+ApB#t zd<!Ui!Dh~pZvoSwwdZr?TR>qB!XR}Z3<^(dX2Zw-K<)u41l^H!OQ8j3SI2v|mIwDB z<L$P(yMlMjg~XM}JO~Zaf*hAekj&v_WMJ6A!@#hTz@31|;R6fjg1Pc7HBhra=In%; zL(2H|j#Y?rA7OD$tuz5LCxs1hCo9a~Ah+&<y0s1zIA|D_etDqb2$Bwg`V$<cP&P<> zH`E+#@dis13m&1S37&cKEueS;nF%rvM1#!Am@nS~iaQVn@j)0AFWAh6rHL4%IR0`^ zp#^4F#iQLVZyrO|Q#((1Y6&tMWZsea*we%fBy;!}85s8PFfgogXJ7!05rOm}V{G9A zOA`w7<y$5|%>tRT7itc+JCb4MfXW7#`N-$p!Q2EgXCKrYykq#Ve9OSVkO6fA$iJX4 zhMB(~Y7VwAg~ivD=ZN^K;AL;wGhe<19ES7cTR`T)&0Z+q0t#0UhM5lvGi+wV;)`bi zBK#SiD6}Bk_230$o&2;3mB)`Pgs4+k1ffCZBj@1`By;!~85j=mFfgokXJCj1DMZ7t zaK@I0FD#I6ae$fyGUp)FoL)3DKwOwP*y5{Zp?nL>O(1g)LCskJ(ujs(<{;;<lAZD` z0f*#Uwn!*~@kVGr36zJCwZp`TrD1wO^#gKQ0P;6T4&>IuP`B;_37}z^TP2|J0g{%0 zh8HMqK<NP_2Es?6=3t9|SlSACi%44_JraxLTR`y*G81GThz5(Vk#7N|0T2f9K^PRj z*vy8dtqi2J^5um>3(T$uuNYevyo1yav44whNUVXRDTyTz8e}#oZGrk2Aodd^a|9R} z7>@EVFsyNBV8{hYqG4>|1Di9{SuEc&2Wl3`oMTXP@ZIZ&oF<My@BA!TEZ+ii6Udz7 zP;+LXxdp_9xd&Ss1<8Zl1foIaoPe6M1|)!nVdfy`8BkjuO&OSb5^4^%eUPwu!9Sl+ z<6U5hd<!TpKxTsC14M%iJF`o^1;hujVHgzl*vy8-dje8CZh5EB0<-JE68RQEq<KMx z?~r-H^RR(%m<7;zLC}~xk`Mz(?<pPz23Wm(?jQDfL7#7^ew%^h9*}vUya%E|7+oz$ z41{57DzJ=Yfck=O{;@ECFlej;q@GlK0gJhyKG3^=EDRtFvKMA1DBZ#Q3=_jeYb-<b z?_hdBV=o{6u`qxz$X;A}@rgHJF&E_CPybjLKp12%Oh4!hO_<#<F<kTw9Oi!c$HD-@ zAbVkYL3J^)<{B)=3<uB{$+v$j3?K}$7iKOgbO#o5LGz72{;@ECFvwm~%!8?YfW=(U z*ubxUEDRtFvKOY76xw11_Hg*~kA(q*LH3ej9<o|kT)=2hnGG@%gpt*e!hV6py`cHV zfB#q*KzPCmL>)njxo_5Bh6A`Q`JaV>;Xexl$X-&+gQ*40>*1VlOoZGo2MZq<4bzK{ z29;UJ^Nn-9LdrB^%>cOz-F#Rv3o6?{7+D^jk1Pjb!|LLKRfzBxVq{=AjZ_|k)FESR zbrz^B1E~S^vq1fC5F2F986wQVRfodd1TyC=5#}J*>7aUU&tin1K<)wIb9l^w&0Bh` zM%4#On>-sK^OiYibq>f(WXuDNPh>F=yWo#P3n*M*^*nNXgZu|l1Hz!WMVSW*Ej+&= z=>nAZK;keA8oLMOeNeojy9Fc$Q-_TPnGFgTkQ}H@25tvJ{e!P<0h_mEKnfR_IUuvp zF|yx~<+!07P*|*hwhf^|U@8G52DJke2cYl*OAsJj)?$_cpgN4{KMMm0gUSe)5g>Qt zavw|$jGlwVTu|A~@}GqPghBSg)RIDf!D24Ry=?zk7(f_gFU&kp{v_7DKI<^U0n|p| z_|L)s!XSHL=8{4$!D24Ry<GoU7(f_gFU&m9I6txO{e#6^kb8OlvoL@#$X=Maq|hPj zF~b4mUcUb<3?K}$7iJ!)+#=S!Yp|FLa<9OD76uRo*$Xq56q;oNcJ~VXXJG(gki9VT zNNFp@U@;feRucKo!T`b`dtv61LT|xhE@*sK>^}<w2!re;#XOi=P#Fu03m6TWXO;NR z!T`b`dtquxrD5j5Xi&KdG82SJH4CP`XPbNr`uG57p7jbVD+36pY(%X`VEPEs`!UT0 zrQc7itPCK$2gzJe`h~fHkhvgzFtsom)aUuY%E|!3BAdu_FGwHEJQxki7w=eE89+D( z$y`#(UyweSc`zC@r}2iBl>vm0Ael?Z@5u5XeK7N2G$?#uv9dCNu*_yeIDpDCm>Og= zu(3h<U}|ABXkPdQD=PyCmmryoO+PL%kUp4sFdCGPpRuwsfbbb4b3yKfrEy&5!NfuO zVCKPSP&hncWn}<il`V*HaCt5TPwO!KxM+|*n0YW7G%x&!m6ZX6Ymm$ZrC(y*3(^NO z4@QIP;|Hv)3?O_3$y{7+!zK>W2Qv>wgYv~aR#pZO*4c^(2U5ykkUp4sFdF3EJFKh> zAl!mvE;e`J5(DXjnFpgm@pg-ql>vnBAelR7527r=Wgbi%qz`5uj0VjM-(Y2B0AZ7D zh;V@EA%+I&gP8}TLGHcA%E|!3pmG#u4rpE&rUoX4iw3n16}Cg%gq((mX-~Iomj}1U zX*o~$V!M0`s1MVT#?%7BFgK!)HN(V-rD5R#+BX4WgZf-gpl4{p%%GMXAan4|J;Uq+ zxdR!4%4ryX$__{z!T8jseQ=onVZL3<j(?E3=YQcReuBn4L3V5GMz{ym4gi&HAn_YJ z5#l0@3=9`|7#P+;=LbOY$QafKMjo#R$<H_>4~}b4e8bW)C=5YzFboqXmWJsA#W$$D z1o2yT$+zf0-3xN-MIzh^n)?9hh2v}TEhR>ZV7wLTPjt7!#EGS0W`p{opt2IihlMT3 zt(S;!tHLfsT(Cg>35qvRzZGWYWjyA<=0TotDYn4WgJ^}_@-3jW05TI~9*72szu7I{ z0!kks4B~?@uDFMdhZi8FBL#NF7MNW-T3A|BcobXM85kHQ#w{rZnGG_}V-Lbl$mtFw z2g9O_3=CIz7#P;OGccIL1d(W1x<d}18mK!!=7anMQ+^d{jx<aFiH3zw2OnzqIP8&c z0l67uCdfPx4bt}GuzU;1A0Q0kgD}XA*vy87&jcj@mhdRH!0eiE@O;Y^e#I6}1_p*# zXIz~?W`oT8u@^ObKz(13I1iGz7$XD2H68|r4eksKIUq?ij4ga%^F$$g<y($G-2^h{ zI@BC|bMwe~My8Dyo|a&40-19IYR*hFw}7}X_aK)OpgI{OhmLPT&A~PY1DoHOB8(be zANI<(fWi=DCMX<1G{{_=3-T=>K8Ov&pfJN`HY~mz_94Rm1;1ho%&r6b<Xgm%=67a@ zE4DB(Ff!bO4LrgufX?rL#yF9L7(jY&@h~vJ%DYRftjN*~OwADP6ERf3RUo+sqyki? zfM^g#R|^sYVVIf-EPW_YoB0bXD+35K>__+&q>os<0gJhyd4g}OtPCIwvX@x1kkxS< zK(y0f;RI?c{$OQg0AY~5$m)q@Ctxub6b`>wSs6eWWG}I1p{s+r6Gnr|G?1AfjINeg zzQ94uZ~)B{{9$Ef0O1`6$cwi#M=;F=%@h1%Wn}<ikiEpZ5m_B*JRavf0aPI@d|)(G z7%v4%`^fVICeXY=tQjD8p<4jUuAn>u!pQRId}KKg8`eewwQoRt5SCzMV7QHxuR&tS z7+cu~YrlZhf!1MwXplK~h%g7aEC!WxbCBu<kU1cH7mqox@qLZMsA&k4rfg0?#`k^D z${diH$ask;Y8eHS%aKt8uPcF-^T_c8@*hkcXbk=WyJCxrG{hWGo`K1MXwaAuD9?i8 z1KlkkF_0Qu7-TjmTtM=mx)fA@gJ=*RU)=&5-+yoj5iT%uKzh+Jvfq&9VB`Csu;@5~ zFbk%};fQ<-%nnc-z~Ub!kBe40ikWvo{YM5iRt69T<!zW=kh^iY52gl2*I+RhROT|V zu`+-#$X=LQQs^sK%mulZg^iT~ghBSg%md{sV%@8A3^N=+<7{kftPCIwvKMA9DRc`K zb3yLqU}I$fVUWEr^FZTE#Jcwm7IQ)F<zi!H0AY~5Fmp+vO^#!R1IWERY^)3*46+wy z9;mz_*1bJg%mvkzd~B=?APlk>W-cl86D;O}#>)lRSQ$VVWG^Y^!PJ7vESTS5G-$kB zh>ev2ghBSg)RIcW%!AROatdT72$O0SOg+z8`4;qkBxt<+3>PZ{2v0eIS!TfW;-fh( zW10(!w`W|e3?Tf5Omji{(A^6f*LcFk$^gPHC&_a!NFTbnj0}tnkGNRDcn*@ep!^0? zi!Tg7av*&$wJ;hq{``Q8l>vmmAejqNPb>!MgP8}TLE(Fki<JR{eNG|5ft2zLqz`5u zj0T0n9WGV|5MF|0?tyk*c-kT4Zje5hc`zC@{(Oszl>vnRAejpaUsxI^WG+Y_%sdzk zsxNMEu`+;g$Z1445Hbr{9;6Ru9*hQ!KVRcwWdPwdNam7Ko`Lki%!AP&_g>**WdLE8 zGvv7!qz`5uj0VNqB`#J55RO4I_ss=F-bD5@Ha18f%sdzk8h^gP#mWG}Tae7frXQCW zNFU5R7!7joIWATP5C)Y?FukDhXP6q87%m#repzr95{AfWh?w>s%Q@PwLk77U)LsXT zMS?KQjp$>1FmYmOkhvfX8jr*`HViWlq!t;2%1{`8!#PO!!T8jsGw_%{MGi7Xmr%T< z7&Kl2vU|n_gnK}B9;iG6iGMkd5SL<PV7Sl2z_1BAW(tx=#;|@5@)#XRzTmHXOGK(7 z81IJaMUM-ZII%RyTo4BJ4M1fBhz-IXQ1^n|`hW<xPJpTh=~aNTL16*wKY+v^;xPv{ zo_In7(ysxj2jK}9<Xb@D3o;XA9*72sCtR0r0fjjTgZLnfD?DN2QxA~h=7OqX3$k4v zT9EO?#g^C2KxTu?W4MHfGvv68xrh*#W@KP^#KXX_#hrm60jvp?fW;+p_`t>!K`KR{ zW`WFk3^k_+B!Pxu<{+mDP}zv449tB3H3!=nO|Wr58(q|J{&7*h1>|>-nIQjzXpmth z59M1xd=MLkL4L(%HY}VykisoSOR)uJ*NIE=Eiy>sfDwj}aljX_fd!Za&~ZS}7zUCM z14!>v9tH+j`Fe^A`#9hd1602?Ah`!*9w@DYXb?tM3lalin3@DEZ9~v_-3u;O1`r0d z9YN|z#XGQ=3#waRaj`OhFvwm~%>=0zxPquJVc`U7YrWxOWdLE2y&!euV3>I@8k8qM zW`Zy|=7IDaz~Wxec-=cLRt6BxxPr)QAoavzlN*@f02;6Rz{Sb{!XSHzH49lCXk3iY zcpWT!U^KFRTx?JpMINuaqYp{L#F_ze7rNQ7Yz0coAdD=J&PSF5u|e%+5RHsw85tO! zA>}`0IS?CH8MOpj#(~tp@N+!oz{c4oTtkg}P+ItM3o_0Yf|jRY=E7(nX!ybSFuKB2 zv4!Cp=$=A|*~sAw@*hkcXe_M9K(VFA1QHLRv<{O4(V)I2D6fIS5#22yF_0Qu7-TlA zd<E4ppn45NgVf_IyJ6#O9!TK=HwUB{4I}#vSqe7J1`3N0*CFA6EWhHqd<)DDa2z1n zhpY~r-Ge31f!fKRxL6rL7?dYrdO+^R<vy4i82to`xuCN03l}Q`2!rf}sU?NBxrtdu zfZY3yi<JR{LH5GT1LX%|-8%(~xu9{YA6%>qAPlk>W-cl88!YC6-201*l>vl7_QK2q z^-GC$ugfjWZ~)aAf4Eo~Kp12%%v@6FIatgEja&WWVr2kfkiDds2U80w17LoG(V%fF z25wdc5C+)`Q%fohGY>|C^F7pDQq6*?7r8IrvIE*)htZ&MD+@tZ1`zhSjhP2wdhyW$ zPch8}r3XJjRt6AWf@CfzJ;3b7XC_Dvqz|SRMuWzId<0n;K===mxghn#Vvs(Vc`zE3 z&b$O!89+GX4k8>#DIY-kVCKPSP&jx9vNC}18YFW;`52~#kh?+pU}|ABXdK8*kd*<1 zS?(g-3o;j$W(b)J(g!mSMuW;T7eQ7A5RO4ImylV=@*sUM^I$Y+9LPzKl>vmeAejqF z55&3`qz`5uj0U;aL6DUJgn8~E!U5SmgxDZ`F!NwEDBkP@Ss6e$1<Bke4-sjdkhvgz zF!NwEXdK8!kd*<1_aK=|$Sh=ekUp4sFdF1uD?wHU5C-LQn0nAS5KIkB3@3d}zGcOI zNEjl=3DNBl8n45`H%5c(US$6vkI{rYfcOnro|<eP9Of^X&)71>95P08^4a2IP+t~g z?}Ud4_khZGP~HWJBV&0+28NeB3=G?#<u<Y$hz)D&BKPZ$K-~d0AE|x%3XeIkagRR^ zkai}>Y!L2vDBl8dGssMkc_11jp7C0~1>_G92Jt}{mm6XI@f%3~y<n%<f^1iflOp)e z!#}nuFF<C4%;R{18a}WwtR0UK;tGrm46k_@7`79*%Mdwyz-GUaZ;9yT2V+?NKp(?` zi4#kM%mrc4cp_|UCFQYv3lG%2Ah*7Ox)t9&m?2R0AhSU1125%UO1u@p80HpgxfRq$ zKtAUI7PcU_zJ<DVD##&d7?$oB9wXucR5qe119RU&&A~QS0~-elaYIda3{T`+KxqMF zCMZ3CXpmuRzRS0O_#ie6gW?{W*|2mMfRv6VI4QQk?7HwozC{sv9LNhY4)ht;VTD-$ z9R~vSjgf>HKziTvFfhR4#7q#!IFKi*-#U=o12PX32Ot`Rm!PQyiGeUoO$L^>7O0F1 z5M*TlVNhEPq@GlK0E@YxzCw^7D+36F>?PGqka~${i24#1PN2FfM39vMghBR#)PZoo zBmsE)6vW4e3vielCdkSF!XSHL`a$U%W;aX>7kvVYxuCXTgdi&e2!rg!r5B&L!gI`U z0FB>839>SPFvwnf`f<rsU@;feCW;YcWdLE2y}0z^6Tg7PTu?Z~39>SPFvwnf`tixZ z;sQp4>OPQ}AdF8RKDmY$nBfZ=ze^BgWdLD~7l?8SpE>AqHg7P^1&!Y&39>SPFvwnX zJ;d-q<79-!?_l8rqlqyWRJI_G-+l3bls&|n0dg0*J+R^sR0e@CvOGE;Sq{X8wP`qB zA;MpYk%8d@Qn?9Ihm5h+EucIMQv<3GL2QsYABivrREL7pgD|KbS%Xw(fy6-g6CQJ5 z<A5`e`~cDeN>gjzL&gDP(8_d>JTgv!#sjh#h^^zV*aG$s)J@3o1o9t94G4qA>KvRE zTUh)c@d?T^AaNK5_1!^v78D=oZUKqG)M2ARW`n{7BnN79f!cW>8pOv}cf-a31CYW6 zW)4U%I!5*zvK(w25EK?aUL(>8OwESZ@+~ksKyd&LFPJ1AdJ2}j3#xlk1X&qC7?ihR z+ClEd<vy4i82tu|xu7yPO^}rVghBSg)RIEGyu~bQK<>>DWMu$hki9VTK>3PT_s+p$ zE~swL5@clnVUWErb4j7UU@;fu-W)+z1`r0>3o{SY&nMQsKJPHY0p#91K~@G32H6WU zmlS#l7IQ)FEf8d70AY~5F!Mm=4YBV1gT-7>U0Ec^$^gP3dtv61LWjJ^3<uD-Wr-jw z0|<lcCB;0LT2Pq<^Bar?ja!xpvNC`$$X=LQQfZiZFd9@&fy@M9Qq6*?ulXY1g1(Lb zG;VoHjFka|Sw3Kv88E&0=!##M=7Qqwi5M#b2*;3VE=V7`dqHjVM`ElDAiRZ4b3yvh z%>||32V$%YAk6a-5e}gI22+bK3_x-qeK55!8Z^#&PmGlTgj0~r1*s<%gY?17gVCVy zy(7lT0K$8a%q68f1L=dA2ctpZa7&Dp0fa?9A;JM<E=&y}cZ2l7)WT@cIO`2DRt6Bx zK{6K<zOXb-$Xt*<n0YW7R9{>ZV`Tv0BS_{FG7DKAqz`5uj0TOfUJ+wu0AZQWh;SgK zJOk;2nFpgm?!6?&$^gP8NaiBDhY%a24`v>W2F2S2F;)f;K7(X#%nwA~BxEi~AIv-$ z4H{=XC&tPE!YW@7;XueNWO<N2n0YW7<lZx4tPCIwDwkmDLF242H83$;G^qU|@D<`F z<TOM~d#~iHJh;6`%kdzPyFu-BT8@w58_Puw6OdbA7*vMB*b3hu;RoYWo4x^!A8h7k z1VYwm&9S_01{#k7sp0s6a1W@?1C=`<@s#ffaTP`ehA%t}3_D2}%N3Xx)p8@Av2}tV z6BtK*0;NC(2K4bim^iUC$Za4D8mk1A4InlM?|_CY$gN+Aa4Q3n|0Y27g2DpUe*l^J z4UajnapyJBkbVtFJsAIxZvllb$V`xVAQ~io;h%g9D9k|^#0Ozq;RzrALyDU%5sED^ zyCQNnwdlk`;!<|XOIMKDAoB`-BH|1bm#}f?Gf3vBGBPlH=V4&jMc~Y5<nRI286fjP zxCLq!$ebTgbFx7aXc*QPMjpQgm5pf1z}%lubFhtt!p2z@5>UfA<EMNJ$nPLCLH-BP zAj1xDD7Aq2AT|tx{EE$NSUB%M3O9#X#TJ-d7Qf_M)R4wmZBiiPtbbtx3or|y<E)@D z3?v~2kltTB3=FXH^@JGqan_DxRKI;dau3Kn<bE)^T97;l!_-{B(l!K**F6(sWdLDN z+YzLmRIKqEQLn-L1FBnJh_Nz&Fvwm~%>=1$z+x__t@TQbl>vl7_JY)rgJJH3(V#p5 zG82T!F%P82;16avfX3_Ih_Nz&@QvSyJP1-xEMD>-(_GMa-8(T>1`r0>ORQPQ>OkXS zgvRS&;RB<Q_2XiL(kSwH-GL-X8Yb2Zkh{>$hGi>IS_WZcd2~Lq9Ec68w?J$dR%c{j z_>GkRVB#<uR~aROmj6KN|KKqPHqOTI4>j&VX`z8hsfF=n0MijHW`fLxVFPIR!T2yb zCPT5M;IDiOtQ<uSUy%P`>Of;*1<8sn1?iA@0Ht-99Eb+>H9>g|6prX_0f~Xs;KCrY zVdX2RjsewcAR43|U)c>CXWQ`?5iT%uKzh+Jvfq&9VB>6{ut@liFbk$e;=g<g+>U?p z;P8UU;iDxOlrZ||pjOHUF;)f;2IWbZevrFyxeulWm6mIfU{GlJ@eg#4C@4-qCPP#Z z3U7!i2q^%eFi6-5-7KKUL6Y6T0J4vP0h=8lu?9YcmKopWTFgLt1aYecNn^vf+yiQl zfz&ghB|Ol+7myweMu=S?H82cv4~UIij`;kQ1E2Aci=(XxQjd(0%MlwENZP<xj)3%n z?3G|rXi;E*;5mz=TR?jcK;j^IbbJTN?I1NUw-HOj%me8Kv29NAwSe%JebQjR!om(D zhm1p*5Mc(=ORRk`buhC)dSPss9E=8uBg=#M_%J9g@yRoS4&6aguw@-ziv}~oA4pQ* zG@1aFW8z_80lDM<e}oDUAI6)278Y}uA#n$aLs0yI)FG<}@nIM}{y^fO@CRX1<3NO6 zzGcrhNE!v1;}XdPjzd^@_OL+w>Hw02VhaI<7McGDJz!x0Mh`HJg-BshXxZ}zqJ9IC zzmb)~{0gH%a(|$C2gHV9kUY$7#L~!mVQf-qO6@I4%`M1DEJ;<cQ7F!=N{ug3h!4)J zN>#8^$jr;h%u7{BEh@^(2MNa~r=%w5D3m7`CnuJ~7b|EelqY8-7R8q+Xeg*D#Ji*x zmndi|L__t*>L?`V=M|U06=^BN2j`a-C8sKADwJdt<(DgHC}=8FD-@-closV78w)l{ z2VxG0g6gtXsD%a&vY&$)7#LKbaR?HJI1i!_#0RlhnHd=tbnt=GPX~`eiv}+w?c_tt zJ{S#B3(^ykky)&eR+^Vwl9`{UkYA)wmROXTn3R*MkegVkkd&%Wnpd2dma3=VoS#>m znUY$hP+FXsm#zTPKT<F#oRr87C?!ZJfy{u!S9~!<gg6qUPYI?G$t;D;yyBA7#1uV+ zkbH%d%wlkqrKA=Vr6wnWqEbhpv^Z5E-Z>~FKG@YcG{`mH&p$rgG04x;&plXAAviTv zAs>?HGg5O36w>mG6jD-45;Jp(^@wxWs4A+3fB=s|3n-q6H4s;Q83Q$d5xu>X1F277 z@=#@93S_Sm4HFYI$%5-;a<dRD`P0yuh_E2nkxB}PY^p%p5WS#7o%AvX>}v)FT<HZS z4^;-HK<Nd<0FAlA>Jk_Y65qfBsc&HFKw^Y2uJjDb7wCFH?OK?-4sa>7fck?=7#J8* zxDock+ykRQW>CXDAag(%y*;Xv&eXC4TF-*ykuk_#4nBz6nE3FwN740lC@Zw&NGr5} z&WwDa0Wkw)-V8p47Lc7FOsJje0<{}tHb^flOo*jH`al?@_k)l^%M1nua6hj=6yY9_ zJgD6Z!i3tsSE%S7kiEoUT<Hs@7h8OG@I(9uQv;(x;cx&dM{0cj;U_=dK=y;e7lcU- z<26F^Edp!^|G@eeurzQ)K%qrPPyy6m<p9O60-Hk13K4}C2WXlG`59zC45JMXz=R3X zAah`L5=+AjMb_&f2)XMJ)CUp(g{h!IOABb+0op+VsfFnS(f|J=dVnA~V(o^h1DOHB zAiW@()HXJ#{>p$JAOJH1WDX%rYPtob4F@4aJR_SAvbO>%M{2s|5LN(>Er85t`3xCf z0GWquK8(EuY6pl9Qd8{Cz~IinzyPAXpfspF1MxxYY(TUtR2(D^(g(sIy*lCwEugU_ z(74hXNr=Bd;vjj@7!U|YqzHriI-q(1B#w?<gdzGs;vl^s`$D1ig+pmyC=Kdgq058x zfiOrfh$aS;6K_9|+=*-l$X){xh#yFew;U1j;|=5nQ22r{sbMT4BHywDlpjHcFfcH{ z${SGFYBDe|n20L0%n=2bHw>Wo1u1(Xq0n*yst4p}kQfY8Qr^Jq1ks?L4TuJvQ4FGG zq46#cr6XV#GC;;UL25wm-60AoZ$M>YgD}MHV5LNsH!yQRG^uU?l^wYSVB5fLXb6ii zNopEYDP?M@5rd>Nbkjlcu>~qeY8rGAN2I|O@9>u$AE0)C><8Id;?BSTng;{XZVU_z zAle8@+d*ki6oAA*@*sU64AT2YTA>BhUICRIJLDk#0*Qm<LFE_-KX?yu53aJKK^&qF zqz9xIWDjUe7es^ZsRq#jP<Md(Rv>;Hln;^z=>uVqUJy+TCMVuZBoOXIwgY5u4pffR zcv~Sse!PL)0196aCN+#}MCDt)K--oeb6{l$C~QIZ*A_@BwA_${lpUb>1*!QUtI)y% zO*<ezgT!E%lClG4Cx`}>10Y%g8oyFd8nh-3B%TVh5L$MC#6a%-A_*xwK;_#WafsW& zN<j%1sus+L66kFem^mPtR5yUij)F?WcoTZqK&`||k(v%cWAb~XaHqpBP&rc5VT&}P z%^Y$SGOmfs9|qD0`$1~T+!+`$7#J8pG-y2uhz8|P5Dm(oAUX|69u^QFy&rfLT0mt8 zXstDa0>oU9xQL8GOUoiYFunjCv&U6_9Khn9YN&l}P#QEC2y#ayl#eWr>>f}*5Y!$5 zwNWzU5$*x00p&9g=J@~#A5h;MB#w>)WFY!L;vm0(>;>Ji4WbuA?VkXpL49nHIOxuF z5Dk(C=>uVqUJy+TCMO-S$RgZ{YzN3*8>k$q>8L`M{B*QMmi#yexgQiaAWUlfOc0lE zF@WY9kU6lj5ELJvGyiMk6k49hLCQi<+5o9Jp{CH{0@VWwFOV1vQ&JYf>;%#F&@`d} zr9o{PkhlSq4;qhw*$Hw3NDky)26;$X2r938WFT$_t0S^3gqZ`PNp*v>wl>%*bOPi) zC1-7I<Z;RldC*<g3=9>}ITIKS(hE`#qKUz{(!NVBWIPtx3{V-u0u`{4hm321;wu6v zubaqWPY*EneNl(x8&Gh9$_tQjKHd<&fY=7mF(eQhrUyoY#9;V~qCyKO9f8X|XxRso zgZUpugT!AlFfgDEIfH}=Vh2TtdkHGUp#ZtA#GwQ(403OdgnSF~x_}8#zrn&_2h=^d z;tg~k6Wl;3gP3&zF!PC}p+>{o`yxt^a00m(W(G(NDSiT}N5-J^h8+GNvykQSv2leD zOb_~a8mMh>1L_Bu8W;_-cY+GUe}v}i8&o0cKzc#?Kr}HJmwRFP4Sl`K0%eFj*z5p_ z6&NbCfZ7M3zQqS)+-h;T4VQaBaRSnVYrTsEG@L+cU>M{c5F1~*2Fc^Y$m?D9$PmBY zg+o=LML-#XLF3S%z7fnl==PmKayv*3EFBX|!^{Ke1+hW(DF_o93w1$DGsM~lQwOpO zgkkoA*f2R54H83^2l4S?T=5UngDw9^s6o;hObv_%*&6_rBQ^i@s6pZm6o;Vr1DOdj z4@9G5^!NkGgTfz#NsWUk^7!kq8l-v*WDf{y7%Q|SpqC+d*1Lp&%z&2f3y{(P$SfF! z`4vWk#F5KH5Fdm=^02rjmImnqVUS)BO%4X>CDuNeI+#5my=1L-0d*K@u-*k~EK%!S zV17aG>p=Rm5Fdj42Vx<Q#aHMnv`830@<}DM?FOSkYC(F)o!$lMA1N3VPSjfO0*ZH1 z!VPRUB%<Ssp^b8o7_I02Npa(-S_(rzpE~OoKx3{Tm*85z0Fwu)fniWuqV4Joh)p1S z$SrGN$)DC~9^^*y^EqU_3n+gp(RjT}OC)vD3usIW6g#-m3rrrQ28Kal1Y(26)L?Z9 zj0TA>(1+AFFm)g?LKtWJ4{8>&eo&tP=B^F8kZ}Rf_)3T#!d{qrU^GZSRonwI2sB2G zw*DHl?qmhDo`oubQy_bPK;=jsqg!ID(DJ|(vc5#c0pY(6L&Vq}p?0c?Aw(a@K_Iul z!h~2Fqz{BadO>aht-%5H^Aao|=7PjQ@}PDv2oq}i9-*RpK=u-Yai%Y*X7v6AC_XEU zApV0Yfm0y=Zh*>>8lP{B$d5OW13=*m!lZ`r1a0{i22F&2VB@B+G_b{3p+&|7JZ{PX zieCXug_arS3M~fEbPMt`$bJ|Gjl;p%q|hL9V0IEq!^}t4YheNzHwE>97>popFELSQ zVE_&Ef$}Fz6O=|C7eh9O95;ZBB(;rQo?M(<T#yIS3LnD)a|jTmrd!Z>oPjAKo{^0Q z`8xwDM{2tLVTzdhB(&aT3Dgdd-5@)w+!+`^bI~B$lYxN&M1#r?5Dl8k2GO8%Yd|ze z9;6S1L3$q;D71jamO$z+SVQ~;5(mkH@&O2oc*x*g?_y#G(Ff84(hIUD8S0KKC=KdY zfyCpX{6r`Xk_YJnVUS)BO$;U{-d-TN6WI=sy$a?KKad)4G3MmQ8^{fy@C9K~!}y1e ze9H<@egqkUwB7|2#_FIw8x{&JJr>~dh5;16AY~lZ3N1UJdO&^#iNP=><qgbE5UmT1 zSJ0d_h!0xt0-{0dT|hKwP84P*$PFMdkb75HK*}3XnOI;3aXVNYk>w4{91u;a8_JW5 zb5bEi2hGcl97{+#1N#k$0ENX8s2r(j5M&G}4S_JBvf}~N4v-#@oz?CP44}1eAR4rh z3q+eTFff2<M<@+iGY8^><U#sC7^D|O6NAagt5d9ShtnCT96iHHLQlTs3A8;1@-wV{ z2ZakL{Z6q~X!&Ce$#0-G97s)!y+X?us2=q2q9nh;>;%y|&^Q9+HxM6`-#|1dzkz7< z@*X4xa<7C9B)@^m1Q{!c+d*z7wtk111ENWFLwRy>9xTJ5hYQ#ZI0$mm(H$Gy=}5;G zB1dXEdg2JthwMy{Kla!n>H^rjJ4hT^9gLj;wHw3-si}8oU;yPa5Dlu!L9{Ug0|ST# z%{zl=P<{l_AbF5J5C-X;;-b(3s>eb5%jY;l+y)W{$%EP}AgmLOf8E&+EbalVSq0e_ z3w4Jdlm^x1AaP`QkX;}QvlqlBgvp7|HFgmHp_>h|_X$*v)c91eCqLdm?f``^2$LGd z4f^seAxP;HR;GZ$78Euw>=jx99H3<iw4VTq-xR1Gke@;J!!RXf3d~Lr4LT16M1#x+ z(I9g{G-$pZM1$5d!R&;o0l7EF0aB)b$~_Z1h}*&Hh^)gwW`oQD(WJToTBg7ko`Kv2 zwwnk7WG6ml=zUjET$^Ai13+eg?9GA7k(v(wI1--@S3vE6+1UbJ^A4gxYuZ6HXw5r_ z29+xy8dT4NXplTe9|(io3!+7k@;`_V69@SfgbAf>3nxUr1nC9Y13LEwM1$J;AUcSF zfdNE=*1&^kWO<OCAPmwAqKU!e#M>JrcOu&XvR4IKc9I%z3C`rl8^{fy@C9K~!}x`P ze9H>xm=(wzSor}8ThN&>8ZHVgDK4P%1sE7W<6Iy$Hl7MCd!Twi=jnjN7z9ARXJFtX zu%@O2PuRii1ks>%s*Uap450V{@j>MWhz6A(AUX+bDTIL73}J&v&^Q7}9f%E*1LbS* zet3`oblic*U7-c!A5fo_#S4<|Kx&~%2vQ(-;Zua3-$83hR9qqUpz8zKTLP6MHQjiG zDzv<DRcNtcU|>iHg_sXAkHrl!hDB)o=?19XAa{ZEcDXY!<S;NWfarWE4GM1%AG9tN zM1%U=AQ~hO(g(sIy)mu|Ej4b?y?-GH_e^mkel4Pd8$=(>OprbGP<M1e>2fFyI&T17 z9;6S1LGA&C4JfWb>tR7_%3$Iu?wI)vG*%9hN5>bixMv5{{@qY|1(e<brME$8kUY#h zkb6L318Qr5+CN*+(j9DlE-Vkj*7?Bn!{`Ke%<wr4weK>NJ`AN#LTO}qm^mQ#z}SRn za?-nq2g04m=7a3@fy$AZ-a9<VPuE90$WMa|p5&(&kl)FT+chTgEe$S+aD<i5pfnF! zn|i`ip~b)p(!K+wE0A3qf)rZTK=pva8YBk8pmG$(CWQu>1G5uEgPLO?8nl)cM1$7S zf@siMS`d8&$#7)7K3<Ua9jFeO;|_5<SSiRrXxR+rLkUn>4rPMJRX}Eg{0*W(T0k_h zZXjhX?G-P``qLihdJGs1atp{mAetDAE8h@WOWWZEnKJ{$*Ak?1Vu20z^Z;|;onS~> z0fh~ytO2=ECJ*8l5L*ITCWF{8Jun(12Ez`%3N4^?1S&H@7$y#)Vg85FAhAyb>V1$J zY`Dh<;$CcW#E2oM4?^le?(Hx|T}yk%8)82!3|M?2d|dGcYGa|>L(E!QnEAxgFgrkQ z2C);M?gF_NW(G(cBu}iLK<be(XpR;+{6S_R%j09?3LlsrtnD8^NZ7*Ez-W-YNBkjj zgw_J;1VYq-^n&z(Xksuf_rmH}^tH5Cpl-!x2R1QWZop+PDC|LcaIKm3frbZ24GhEV zMP4%tN)I4;<TL@|<HE>mW*=A)zh>4ZK%phZ4}#|qI3tcB05y(aZX=e4xgF%+Edhvn zm(YA_1r_ZDxdD{dL3qaw$lMjK_TdLA+Y7QAJ*+@tpzr|E#9&<M4yG4d{yc(|w_xf( zG|1jRP&rcbr$rDX&4AJlDBZx!1JM{5EgVaN$d7xF*`T-sVN&Cd!47{Nn}Srwg6sj| z6A20}YoKK`h!4hi*7@25E40AsRUc^Bg7qK~pl}CqVKj)1Twa6tAPka6PcMY{AblVV z(hH)=!63ba>_L}@*#pu`&N|;ba7Ui(g}yrQ6ZD+(OY=a7;bA}L4sH$Bg}*uq@lfsX z1Mfiof%z4^Z&#jJl$V*8u2E20oB`Sk3km~}dYCx$7&I$015-;B`Q&1dJ3z|8ZQnOB z3N4`iHK?yY0jaMKVndglg4Omy+pHk93{Z7o326H|AxWVHS$!W=J!mXJ0*iW(UgWhD zCNT;vS7IP#d_Pn#j0UL%`HkE)gdqJR1%twg{B?|wPy(5OKE4H!Axwhwf)4)zB{JBe zWsn%H*KZPb*{BL?g}|O@>a0P9tx3kU1{Efc>~2t68UkyUA<3T(i5?st<Q9yObNV1| zrS-yP1_p*D)znEhbD;?WSGs}8LzRIkP&k1Yp!PPbUV+gd@fc{`15*bQBZP6ahe7!R zT`#C_26I<R6l5G`DFXuoPc)>?1KA664~zzx0TRCwr_chbM?v!n6A}^XLGr|4T<(PF zMQ^u**1*=pLhOO5fzcrMoPo-bI?j3`S)s)z6Ecp!qa0#B$h??1#P}<r_B=-%L?6gK zAic1#B9;c}17VQfh!lkuP}qXPRU{o^E=c@M9PxdG8B}zSOPoRrs67U1i-FoxFn5Az zP@e;Y3H3WP;vxP3=>hqL*l>ZV1L*@{kX{f?3??Ui-9d6EvK=6MMG_!>AT@mjB#@tu zdJ@QwbCCN%aRb7n#!rrqe2WEA`xrJB4~vhGM1__;iQut#4p7=S5USAPlcvzZ0?mV< z@B-Nn!=SNU7@HItWDd+uVriK9$a-%iLdN1jeb<zDh}%Vyh+m>lcnm$Zi0!N$pd> z`b!1*1+Z=sxL+g?uYuB^nE>sRfXWLGkbgjyK{3ex;Px`~a54}dDn*bYHSd7VCX+~p z<PUViLG}hf<w(st50Vk-pU~N4Jy1J9_Ji!4=+3|ZS~~%vqZt?&Ks4x_Ll6z>w}NQU znk*0vk_YJnVUXTC4GJw=Vj=rnW;8?m1rjevLAZy|xmhwP5PdK+LH2Y)-O&rBL1zkq z#9N{Kb|?*!2k8T0kiB;@6<R>$FsM$rk^?apBo2}X<!=y%&833c5+HGOyatPVK>L<J z_Jj5-f#|7F`)5IEWO<l*FneKqd^9=fC?OT%KXh|J_RfIHk(!RKq$1*t)N~|}hR{oD zoP+!TiW?9nHGX9L<Xa{n<!M+M42mbvxn(!f6j~h8!DTQ5C~bi3;>l5HSpd}o3NMft z3{z4D!|VjnTF|rsT0;xsgVwKrXwW%pAR5$ugxLvl14s<y-k5Yq84Ri?UZg<W4ps-6 zz=Mw0fca1YdA<wT9FTdWx&d4cf;K`z%?6nVWfG)FO~c^zFB!Pga12zA<TRXtXh#rQ z=Q0Co2gq|EzfN{%V8~=(U;xpe^)4V9w6_FAgU-bR(dkI?AblVV(wmY={8|EmOoYEd zdO_yaK+Oe}Z6JOLlwSp<k>x>lf-p!gsQd+$d!Y3!GI<blLE>LB5&03eZWvdYw*ZTK zwnFU%t!n|f2b5kx^hT)oW+)Ak2e}1=LH2_B2%xq(sP1UVMYsnfPwbipgDi+XkRFhk zAbU?h?YjV_4?yW-P#Retqz{BadO<WXn4I+c1j(Jqc7W`a$%goW)btyXO@8{Fl1+XZ zypT<PdI9;J+_<d>kZ+j*?Z1J{ftBB&I0vokm;tKCb0Ot7C|!ZnG?Xf|tbytQg*8YF zhAAn(VRnLOP;m>QL2F4sG-y2whz6}^0nry>7DCHpkQm6lGP#iQ8&t>SfYJvv4-mTt z0%i_~Ce;n3tY=x03t0m)71}n2(I9W3hbc%57si!u2(4#{$c2offa0qJ8b%;{_k?3l z4>0$wDTCxIP}qRV8j!mLwnO{^V!wdOgV-=VFd8HV!vX~gEueG+Dl<VCCJv%O?m(tN z>>p&VXNk#&xEEvwIT*QqC!`<b?vOy#^(<?kbpk95u0Y*`E8akDFm!u}S<eD9pI91Z z2guDJwm|_ToIvh{nE?_9$rI}*ka}bc8n;6Ze~?+o^7z=e!Uv`YecTPyp7{dx156E! z2H88M2;x6N^W}evA?iSSLHa;6F&LM7ajj=rQV6jJn;qE1aJd1Oy`ZoM>A|(0MFtuk zAT=-yvln?i3n)E+<dM?^h>r^+uV?uaO8j~jo??X-ok9qnLts721thnF+zfLYu{6x> zAiXWch<caMdKM3~v_Y(WFm=fGg4m$E4#I@Sy$(>>UXa}|H^FF-7$`hIG%*-gx`XM( zmOrPIK+-%+4U7iadj={;YX0OXg`^o!+5x2-keML!Kr}i=Pd6^5<i|b8Y*5^RFsbn; z6N$f$HG$TlpgI<04+vjqQfR3`FW>O2XW=PRXpw=|Ju=X+1(}14Vc`U$L2}6DHHZ(w zAbD6iA(jT|17VO}5KRsS=_S@am^zp}Aid<RX90D<>9C#!Y7HstSzvxd@7qDg4ZvOp z`5VMQ9?K1>Q)u~82g!TWpzTc<4N?ozL+&&vNdHK|pm3tv`Vdh3lNfMd`=OCNx;})& zz#AgU@6=Lfo*%aU1J^u1OddH{!0C&I>n>nx+(7n_Ti(EvKMmap3loq#$<OcLbM5ky zLHV2x>qGv`pia7ht+T+DZea4TFapt_a01bw@l9C00;56VHPE^TrVb=V2;*vBg7OEt zUQk~L=B}0+$hZb*yi}(aQs;r}g}DbtgUkSlgJ@zfF89FnqPKTJ>p)uSA@;-6z-W-Y zSD<pFj!&-XRA>Rs`+?@zbb27>gUm~5K#W_?Sp+#30wfNz6PXrhfan8>fz-glgjgD+ z4}?K_XY5jF$=L*1m-1yl#9Wa0mj>e7)(fcUo;~#nEughBpz!(7j&Kjiy`Z)_2oq|r z8#F@nf%Jg<LTtFe)PeMYFi0<mCI*v}zMdet6WI=sy)sP@KaiTfBAUogM^l=}k8_aw zL2(1Zq{dH2x_rw8=$a^yIj}KoSbW4ZE3_PG29IHLfYQc;a)lO+c7+xmXdVQG7f2rr zgT_Q*Y*J{DIWRkkrD5hH>wVA+8N&wk`EnW|ZkK5xejNz0cEi*my8*-|weL`#TwIV; z1UUr^<PVS;#9&g>Jm@T}8=!E&VmQcNfmZU;d`BxH-4Z%$%Li%)$O#}jr$g6ofaoX& z1_lrfTE79JLH#rk4O+heqCxT?eIN|d3!*`O0%1aD#T~(7FKCVuWG?8gClC#~iwZ=8 zuK5GepsPYbG)Nv~7YM`b1+fWXa^k0=4H5_FW`peA0F@)POnTEse*A#k0SaFbCN+#d zWXQJ!Af-20xdIAP&|K4&c7+z14sf}`0IHKgcBOPHv?M_Ffcy*+gJDX_6_}kM8gyqN zhz6}~0MVecx<E8&jtoSD=Bi<Kg4_TS1G(3t15&Pl%07lRh}*&HpaV@HwO~G!K%V;m z$-&G4(WJVeJh`|i8G3mw$SkN81SxXT;GYiMY0#t-B1dW(Jkm*g8Z3a?0rDKkuQQ-! z1c(Ne0U#PwMu2Eg83Cd}Wdw)@$%FKPFi7u<UWFD=n+DXL$(R6fJ4hTP54uwogbCfN z%FqST2hs!53$h1vUI>T=t+N2ppz}mPH0V4L5REJk(g(sIy&#$xOisLQL2@Uu9Uyz( zK;=k{H;r!c;|=5nQ22r{sbL(ECErqlln!BK2PkYodGSNHLQ6ysr0f92FUYP1{R%BD zP(2_&gT!E%lClG4Cx`~+TM!K@J3ut3>;TcAvI9it!YqW&tAoTq?k(wolpUb*&87?D zcCb<+%MO@1AevM+lqVO%jsXU*F9q961VL&V1hqXadJ%aA*$Pm66hP%jO@j=5#HYbE zP&+_&gY29MJ<AhBgU;#%(V(+DK{V*>KoAW&3k*bq<U#sC7^GKal0plpzX&QjmP~>8 z3nUJb2i1olOsGz@>4WG4=>h2l*#jyoKs0Er7KjF&0S2N$XUKtQ(EUvy8YB<W2f`q| zAetCVPP~0UawoDKAbU0XA$}k=-ctI>k2jDTK;a9*q=xZ<Z26WA(7rv$99Y=_3RBQI zpE?s1TBb~ZlpUb>1*y3+S)t_sR1e6{ATb!Gr0js%38Fz|1&9Wf9UvNXE-8oxol6R$ zL3IYqPLLZwVj%Z!m;fm|K;>ISAH?lobwrjOFmpgOscrz39VMWKFtj`a+e-vNY8nK^ zbIC+VIzu-e6c%fsa-^m~n@Pl{!52_FK=y;|oC7^S5JZE{2L#ce^8-ONsLTM-pz{Mk zG)Nw#4}?K_r_5Do0ku6qWrxTDh`&JMAbF5qK{!HNt_8#gjlY3tbX+kBq7Nhv(hIT& z)JFl)ptJ&_Ll_tsKs2b#0MVeb1w@17LHa-#q!&aJgUN|EoyiDyBHID7Hw7w3YP>C& zOn$t9+yDw+5GFN@HFD)!-ay-lAah`42PjNIn=~?}D70Ld0x3H{@e5MpGhd<Q4^$7x z&mb`vrljnE*$JXS?F$gi35{=1*#Y8%$_@|>89jj53UUKT4CLN7Qy^srsC?Tp3F3CJ zDk94cm^mPtR5z3-7nkH`!;c?@w>^-@N0!W1XmObXNk4O;=Oe;skUK$sA$P6=q<^Gf zP&ko4*8&M8kQwN429d!}g7ks*-Gd_=I!Of*qr(&veus_9QY{2@W>aT=3^s3yYkmwS zkL++zS{efT?!n2Q)@dFb7UUL)kUjTcchY)F)npZQ(hF#B8YnH`N-r>ZkQx{Ug%OAi znoot*B`_K!er7hLzJaL&i4nrM+C`vzfvy+So`bpT&P>RBDroOr!z_foF!#V{kQpHN zK+0bbj{#m^LU{N|T<(ME!ZyG91X}OH)WB$vJ7nfU+)8S@ZOvT7{1>6QfC#7^AbUY} zg2DpSjsel2t4BaI=$vd24cfN^qCtIP5Dk(C=>uVqUV+65Euj87sJ(q=Da7p{agaQy z9SFiV%<#9jUtn=h2Ll5G$Ue|sO%PoH<%1gTAbuN^50VGj1;Q|UL2N>poOqiv58^*` zvqAP=fy$8@Zvyklk2jDzK;a9*q=xa1Jo%Owq;v>tZ-c_thk=3N#(aeqhXvsFHU}tv zZKf);uq;(*$${zt`59zC3{%qHhS>?C1EKK>iXRXk)LaJ9pu3|$bRWz@XulXF26AuA z0!Vus)F)7x2XXrhQ2!5P08}lKRtEGr0+=}<np8J{%q6vL4bnpl289DYb=b-mmxZ{~ zX$@44)O5<Ti1>8618N7z-Jo<bA3Bc!qCxWnAljFKfdNE=<`F<NXdVGXgXBT_Kp3R= z&nATyP#FU%Uv_MT_zNViu^7=$C6x9(7D4pE%mmp3nu7$<pgrOs8q~iB(V#g<5Dgl7 z0ns3NkUkIw*$bkH!MNfL*S-qSx*J^P!t8BXq|m|zRRj|IvQVJ~G~NLUo1P62KZ3+T zN<eBsIK>81_JZnUkT^O{Sq#w!5(nu8`5CkZ2}G}f#t~@0I*7jj%3lPfLGmDdAPmwA zqKUz{!Um=nTbh<wf^a8H9f$_m8vvCfHBI*{AwNx@SVDgK1GyU%Hy})E{5TZIw`fd7 zgaxeJ2E`939ZXoN(DGv`xZGv{r45i>N7gH}oB@@ESjs_4%59jPAR4rf7(|2iqJwDA z9&!*38utXzYe5cyVo;oc#6a#9Sq3S$L3PW5#SpiHl@VEP!^{EEq`D!#Jh?cvs3^Y( zI#dF37szhpvi!*!g_f4Jknmmz9Vda&AhjSp<aP@{`bP=|g%dT#Nzmhr)bInl1IZBR zunD-$PwPG;scs!rPkspGtf5Xn7&b0~s~-%LM|LSVjnObMA*We#%O0dGKtq>8LIoTi z<T_MIK?%vNv>rZT5I97gbTc2~bp~AN1||<x2Btva1Y&^NYOp#6MuWt8p!E<;9Y~B2 z#?{sW<qvedpz#x!yF^w)#!r?rFfi;{4XOV?_QKo)qd{hX#NlxS62Q{VfC^)!aJdnt z7+ZT#V;#gzFf}k5<dy`e9I5R=kQtz}wm|qw5#+3Pka-|+bUX)Y2S^;G1{5BkIY1B% zT8jjtLF)=YG-!?xL?g?C^nox)FNh`vlM_w>>v4xu2UL!p;nYzm-!cc9jzNBgwO>Ku z<Iljr5U@d^Wyc0^`;`OK?@L*x(DGr6LdyoI9`x{{r2PuB6GVf~G6T_|Fb2_}d1ep| znr8;lpz$w|dqEiF29OxYy;n9s+OMEC_KkHAw+n0}e$6w?91u;a8$fO$wXF)$LktFm z13q==c@lJv!5)ymv1kH?*B7W9scEfc6QYl1lZbzRh`}aAS_j#=$en=!boV!iPGewT z0MVd({y;S7d?pYL8s`MjAbFV6L3(`}6k0%I51>8;=$sIc97tSbvqB4Ky%h*w_y*}) zgUU^iJUTvr#XY4^cQin0(0D4y{$eN}SsrE{$X?K16;OX4G+t7%4dPFbI7khsyaHiZ znFXppK;q~)U^7G?NF1aWWN#1D-bqjzH0}x#2i=bbqLJl6`al?@7eo_-$w@~nTM+I< zwgY6Z4OEWQbX2j0{B*Qs3;A&laz7|;K$z6{5h#{#30Q^*3s_kRiWgA7x@N0F%ag6( zvXTLmHb8dW*sIXu0?lin@B)d!FePOr%uWyu>bHYv(3x}~8q^*I(V)IRh@K3y5ZVp^ ziGke9unkgHg39wAP(Ff==Mj6x5zHJAO{yE>T|pgvh{HhPLduy(Gqyp_30e%@gASuX zrh&`?(Zpa}d4bTGM?TviZ81>%WgzAKnhNac1Li&!=)N}4PztF00J*W?BE&BswgXfi z#D?jC(I7DxX4$FG0!mk)au9@J;vgF4e;5rCV_{@qfZdx3;uDJlb|BI^v3iizA&==J zi(_Mh+$&OodgjrB?GXE6VQ>QK9$fJTssqr?Cg#i|nEAxgFgrkQ2C-FkLfi>*FU$;( zI7psYKY`REV^AH29R47)kmd2QafJ^|54N_#3#cDpYG5?T-UYiM{v&jz%7i@-bs)VU zeIS|`jLW^a#^yKdg4l!24v^S_6ACS$_5!F(dU6W4T3l|!<sML+fb`%x3rPbSP9QZf z3~~>MjeHgoD4l@Bkkbl?j|(H8g~U=${8>m6dlXs}c0q7Qv`h=A-ve_Gx?OjW+zwI$ za~rWV%sh}@5F1p#g0Ky=e1wG^NDdi?prsjN?SrX<nFX^K#D~ejXpk7PJcy4E<BETn z9&GtXV=p9~!PLNLki7{|Ia2e_oV}2^1H~aI{y=7e%mdNr7(M<#@}TesVN&DZP9^?& ztY;s@ub_GiWDf|-oKk2hKrch^oGX;FPoV`?cWppQ10b_t80J?P4H8E#6G40s2Fb(X znphg74}?K_K{PoSq?cIxVCrD@fb^1lt`K}sC%zc{WFe>0w6xSB1x<x$h4|pis#Jwo z9fi!i5(P**OF>fs%Y9g=#>GR7(1GaJf$M}{g#{jyhxr4&-xH5y7_uKhY~((%%5jC3 zBgY}>X9;xv21bL_g2IK|p-GVbk%B?tM3wm)Eb&Ha7?vEN&KNB()M8v?v@m(7GB5=W z2js*D>ij_aIW!+g2fJXDphpO-IYyl{2AdzkmBwK5$bJH+F&ZW&Xp#k&ujH0}$XS4f zP6Y=GI6TO8C}{o&sm!7E1kw&>#TJlz!44;az}5Bxt+fGZ$CYki@*p)Z46_$B{s*h$ zU^GaL540YHsRM}-!noWA${*-@L2YiByF!ja#w=DaFfjZ%3aNiV_QKo)qd{hX#1ZKU zBtrW&xEUuPZi3i`AVF@~0hJ?lj4|h|LJR0zAy7Y1;{wEdka-}}L2EQYn9$nXFHpNd zdO&(X;Zz2?N6npq0kjqk#0QO4gJ{qiH4qJ2%LbxB@*sU64AKjtiNUzy7^WA!{{dR7 zw&Enje=s#L8f5PSs2r)`2QmW`Mj%XTIEA#zx7>lIZ;&~#u~JaD1TZi#tT?66B5)c! zR>}d2Bb5UREeYopT0TJafZPqz2g9JTHW-@}8e|U4P7n>6ZvfGtFb2^s(71Gi(x7`9 zVCEz1)j16rD+Tp)3{FDao^hJ^c_oltAb*2sQr!S@52<ZvkRD<%C>-#qLr-g<c_ooE zxYJq+RF2fN_T!2|%bhcj^S=siLCgn*|Ccj}c>+Rx-~~{-LH+^hUFy!j09r>1qCxvW zK{RMRD~JY-g@9<#959Fm$%FKPFi5Y@8HE;5`2m`50*%qa#9Pi1Klfm87UB<>UXVSY zG66(`*3E-xP?-Uu%NZCLKs2&ENFNA;+ye?5(6|<;-*p2=S@tFfGDi-oZ$SFc@c}IE znFqBOv@Zi>KWIHShz6}O1<|1W8z34a4>J$s9vGVtO-}kMIfn>0Wb;Axu7S#tn!a9~ zBR?IfoF_ldLGA~YpCC+X{48mgZ{azB2n$#l3W^WV{LP#53N0ZQz-1@{C~bi3vbdqp zG6z&HLHj@;F&L(#429VVqCtDVK{RN-2}Fb1uOJ#U-vpvT>y=@4g5nG$26At~1xOhR zD(C;4g}5E84mywoQVZro3FP?$kQ~e$5KXEZNSR;yaRD+XvkW@F1fxOD0=WZ36N7Q3 zeM0j~Yc4?AYM}T!ft1%h`mm=5nEO(0LedH-I6>tF$c;Q-A$|d|7eM7fY?vMx4HARl zl*<Y&pmYQ(_dpmX4x(ZHhtVK0PBQ10He7<Z7i0!G7&(0q(hqWPLkH^o5(CtJSQuzr zhPVe;ypcP<1T&vl8s-;}n?dXrsJlS!g_!{o2gwubCy;t%4C)&ohd;<HWO;mST;T)L zgRRZraRm~#Ff}k5Z0|LQ9HH^?4^VX=y<mMH1`!ySdvVP#30#G^2b&!ru{*aFT0rds zP`@JP9&WX`oQBIipf~~P!8O0s0d*Hh4Ge?a17ai3FM-ktNDMixfcUsD^8C_;9^&Vh zDy}KCG+cpTP}>aDrh>T#-7XunxP!TkSQ=&?%zRLN3c@p@A#EO5*um7n=q*&X7i2EF zn?YhQcY)Z1Fs}HA>BE+PI<7;~8B7g~2HAT6Do1Mm`Ewl-cc3@~#UIE_ka-{)9izt| zNFEgaAWUi;tmwyIkG;78@hhkv1K9(@Q|>CXT!58>AOR4@Grx4?hC&Oh?h=584@e6# zhWQmngXECQL=Yc@LGtKvPKXcE2f`q|AetNu(o4u5ba|LPAibo|FCh)g5i`M*oS#=* zqEMckkysR8qM!wxGV)C=E>28O#WClEY6bR5C%6fyb5Ah8qW6J7MrI~MFaE{S?uCU3 zHk#DD2%1k7xeZC5=;ndKJOwI8YX3y$fkMlf4+<@y{wAo+1~MCD-j~~meQkv9a$Nwm z8>V-KI|Bn~d;>&-&U6FOCZMqwcLwkhFAyKJj~7IP<U#sC7-a972MR5qJ~^n4%Xkd& zFGw6D56bf(Oz3`CgF6s?AUz<xAbUXlZ4eC_GXv3}Gv7coXl*u#2Gt=T8YB<W2f`q| zAetCVPJBK=awoDKAbVx*Li|8#d`8?QKi)uY0EI6IlN!cLX3Mv9K*vu&=D_-lpfCmX z&lK({v~=8q^cg|%3sSS-kwVKHs2-4?L1Hir>Vv@8q|hL9V0MCNZD_g!o%sghgYMA< z(V#vghz6Z&05cz1?~;3vJ|n37&$$C}J6IjGasa6X^PvQCp8zBWG8^P?5KXEZVC70Y z=x|dylq)&+A!!Zj6*vX*#}cR<sp-(<0rBbZ0n`qV#UMLZx-&3<#zjFi=v+4t4Jr>n zG^pGF(V+4LM1$l(`al?@cgib;7N6UY@w^59ApQc0A3<^tp|oA_0HP0OCdeMpcpiub z?dbr~pmX0qG^pGF(V+4LM1$l(`al?D?}DcaEueNg$o(-dAm)O^LGls3{4F57#Z(Y9 zEXROr{EXotL?1{GNH55qItB&?5Dn4@qCsQ-AR2UbGKfZ&2k8T0kX{f?3?`>M+k)gy zWII6izJbb-nvOIck)MuIko1xo=OFik;s%6Cjh`KJ<y#&=`)43?U}YgFUO;7n&SQm^ zDUTs#At-Ht)J%D<(DDVU2NYf)F&L(#EQHw!qIIEZ22>V;_@J^7M1#sg5Zwy15L)Jd z#6a%d@EB4Sg34=~hY+`el@eJN!ps5Dq`CoA7Um%}ve3f@><%0RIcd1!2_ml{8w;{` z15}RWH2jqKH2el?2gq)aovYj#7(nwjAUc+TfdNE<S)h86ZArzYvH9$%FKPFi7tX zBzp;^|CFZ)e}nXb%<G2Q(+{OV=kSBXL3fOU=uW6ONFHP-2!r&hyjExdwc|i#p3FOl zxgc?nJZLNngmt1Jdw6h_d0()&2Q+5@vUeHO-sw;pG*<u;N0tZK1;Q|UL2N>pob<Bd z8N`3+W`pc~0F@&(y~sQ#KfOdC=_NJJL4E+m4G5DOKN<7oTi!t1>mYMrWgaMAKxK%+ z3x$@B7mzX!lr}(WLf$I0FhJ8gD7-*oFic6A2eT7IgU0_sG^or2(V#L9M1#sa5DnVb z3bPaB29OxYy-Qv|$~;iHZ14=?cCb1k%RHDlAevM+z{@;n0}$jcu-!xu<fP%8m$=jL z5~v)>Y4{cKY4`!u4v_aieqHU(z!1&AzyP8_`}07wH<S-5>p*-^nFyjm@*sU64AQ#> z$zDR~KjIa_-yppp^FZf_f#``)`)Z*ysH_8tgUUn@4Uz}h3Bn+~A2<|SKz(UYnYV^p z5!5ULudA|ojhMqDl&4-`aSv!64ah#w`WX;C6Y3sNSqI`H%Y)nk!XWp6`t+c-C&)cV zK12Ko5(mkH+B6^xYuCWWqd{`WxZ*WLA4m+O7i8Z)sQpKv^cE<+2TCK$gY<zgNH2&c z29uM1b>1M{iEIbR-V~@Dsp)sY8}ifd9VES^ra_6f<fj*q-$C&T!lcISk%jUt51{=M zkU6mO8x-fD^6<f1g%*!@kn$Upu0U%3d{Sun0@VWwYmgWWQ&N7z>;%!EGmk+usQd=e zpz<3;gUW9ZeH3OPw9N_<1GzWl9i;pQ)iGOML);ElN@V#BGY3SI>IQK6U7T71Jx&N* z4uI_@f*>{hgVx39yvLLNp>m|A|2yvy>lQ+;^1;h9Y+hIZwF4vvN(XD)85ltKaDZsg zIcgvpwEr4JgZ9sZXwW&6AQ~hO(g(sIy&)eE>7UTPYKadBe}nXb%&TW$U;xpeeaj#k zbY3Kg29@I=8d)A>CkTV|KKY=~0=g#!gau;pw@oKtu@|&%1!O+x9!C%j+D8qdXF%P9 zEDy31ghBR##wtMVWzg7i$rp%!K;j^IP&*8SVf6;Ca$4adL?1{GNH54<(3xx?8dN@m zXwcdS5WNcO9%OltJ`e`!1<}M{a?<G)BzGd)0kW6p6T}asrc;kk<fqe?Pvoby1E0uG zFCf2z;uVBRjoUqo<y#g&`&1xvVC6I@ZbA3lbbMB5`S2N1PJ_}FNKL^Xg_bQ)J)p1# ziNP=><uuGr5DmJ^1w?B=(-)}B1n~`^{H-txq2)A44&+{*FOYH?RF}kjgt#57l*n=# zW)6rZ)eWSq&6)BAvYurvbZrid2DueIOhIC}Fs^(<Xl;(i7sT3}6y$PZHTLuXbKji5 zkbDISPEc6`a@P`3#TMAS^$n;zNF1gIMuWuQ_`5<2C>??3h(H)F4vkL`A2}QZ$y}S` z^9|x&ka^@_<Z*aH`a$lUu>^H(&YZ6h`(a^l1nM4K@dnDn==Kn^_ZwzDu{6vMkefkl zh3^n|g4_!;10)WTC)Q6O^~e~MCXmA)WEQeKJ~poKf$71vw%`fW4=^<_8f0(FPl*2r ztu1)-3!)CB7o-nF6N7QN7goozpcRZ$en9NOW(PJgTyDT+FDUFmdT_15;emz+NDU0b z>_uLK14<7ddE_(!;^V@|Yj7M^62AuL&rgLGnI8}gY9E5;L16Adx9b3s+d*nzZX=e4 znFrEa@(Z)xg@qkV9gMa>OB=-62U7<#2V^gZ4a(~v46Czoja_b_vb`X?VQzxaATgM` zKx{%7SGt4g!<Ii=enZkcObv_%*}DfSM{553@f(t6Kxqe*Za`*&%mdNr7(LyX{2@Q? zL1u&E4unaKzl1gT>sS?N9SW*rLH2;~6E4M;9Q5)H&$^*Me-v6^^(qfEY(eHAV^}!B zXpkIoc@5%&Fi0MjPKc#J`al?@7eteTL3)X`52g-g4@fWR>xRmci}S!8ZS++`F2yCN zd(vTxh2p~!b95AnGpkbLOBCXL6DyqaOY=Z#aqLrv8z1jdT!Pr64mJfzJAA<q$R9Aj zq4()v;{wQj2C<R%*krINws5dR#t+v)+nO*Mq;?d5LO`KKf<dw6#(z*aDYbxh34+2M zBm<(!-69IoKT<F#oT##oAD#tC4>_<KV3{Jm7_^-OYzRo4)_aM;7L5{g34sr+)Y%IS z+ar%_FEmUZ*;AmjG}!O1LSzBjr+RRBkXt~4_Rz!gJFR!nGcaT*Q77Gi=E^{60#~|$ z$%E9uFescrY)~5?R{z3ikoW{PP~8Knc|bhkFs?Q@D1V@v0P54g+%<zmu|<%9fdRDc z!GRTFFU&nK8e|5{-5@q0jLSVRedv7x(0=b3(6$Lo4U7ia`vNLQ>KLw$q+*MJpkfPX zZ(WTX!haPUiY*{JL731!a1{=SK9GArZh?gfu{1~@2!r%45L9dd&F6yVPGdwM=7PjI zI2AGG2te@!(ua<>P|-aJ9EvTVb&VkR1n?u=1F{p;p8;V)eHs@|h(3@WkY9)m7nnMb zJ`e`!1<}M{a?;liBzGd)0kYSC3*rY-(^n1``RQl{7x{4xaz7|;K$z6{IkQW?We0Tq zD##qzI6o{t3b++pZg4At&er1qrHwQH6k0m?6k8Oac@Pv{Abl{5Hk<_$CP;(Kf!Rqc z4Koy3?-y>x7H$Rx22j7affM3(10KZ|@P+`SF=Uut<Z)bNbI5T6$V^iDSRngAb#hTE z=)?``l<^=pfH1Z)^$jQ-K$2(}<PH^H^3puWC{Vcx!i37s1gIS#Js>;RyE8C=%3=_0 z#lXM-qCx96L9{WHZwjSB@*sU64AKjtiNWNQ4I+Gyus}B-WUmiYj?}UNWELolK$z5U zdb3-;B?T$&V0jc2PSOkv3?lrBEj9e$Jjwv7Pe67}5msy|f$9Od8zct9l;lyEogi8f z8aJT3szH2yC?C{@0P(G17DDqKNDSoO8T^nu3MxnD@Iu@URtg>1LU%8E9)+0$qDgfF zD8GS6a=;eSHqU|9Oe6^4PD?YOa-^mu4M9XbLuhRC3e*mecR}I0!JUBtwA}+l=QA)c zfN0R30uT+_QvjktXN7=hkUU5q2!r%qU{`DbwOK%WxIlAzF!3FNibS7LpCX6|50IH4 zdq8^#Ks0FW8;Ay-6#}9`dkjD{vOLI65C-W5wdFu<7SQ+?k0``kkT^&lw7vp_BT67^ zN<i&vkT^R2g2g?cwQnGMLG5A?4O)W-qCx9`K{T>F%siOAFg`w-)G`T_j#dak{D*EX z$leD~Ia1S+j4=7>C_<S0I0yLw6gMDDYW&REE8lVj+BOB511k$b@dBFXR}fKb=@5aG zg`l(nQj;U2*zy9Z2NYf)F&L(#EQHw!qCrI$hz6}o0MVdz2_PD@E&)Wt?zsWk3vvTU z4CLM=B9O8WR9+hhLEH{fLu`8mW)6rZ)eWSqOVEMN<!^+J6~kzdTS5K-(Zpa}X`j%# zga;y!z9}fa{vh?09vs4+9$@a9Aq&Yjps)dz7a%wK=p)u8T!G4i#9?}1G)N4FXNW7d zfYK4D+yh~lIEaS%A4Y@3#K~Nj@I(yaUXU5&VC1@zkbaPREB2wTOE7`j4-11Bafo|x z#T%&4fo=~m>k?q*6HCMF0J#~&-T`$N$h|N#K;j^IV*LbCkBmWmY~=6<nT0HmkBuvQ zV0zHo<DfFVMgkJHFf}k5WUq-7M2^tBr;0R09Y`-oABZLf<8m*qbqOw#5PPuM0TL5X zS8M^b4?trF6EtzF#pO0!?g7OKNDr>{3VWdL0;z#vkb6LE<n;=mbOI7XPAecjE{wch zA>$zN>lM~WDYk5pfM8HNAK!X~0%#nA+yHVj%x%QdAblVV(hH(N^(hF$)|JA-4kU++ zUr^azklE;N28qGk1!5DzxZ)qC4_p4(gOv7R>OeHe-Y-x&QuB|23?%MAaR`b(n0X)? z9izt|NFEgaAWUi;I2^%Wk10UwDNsEIvIm4uXehR@pqC+d=Kg=kD7L`rE*EI{fXqS0 zps)k+VKj)1Tqc6}APka6k8?tNkUkIw=>^f`V31xy_Mpqd>;dT|YwjQ1VML$$4=zDF zjvjgHAIIS!<;le`v*LqGicseH6*OU!`yhA1{D9uKf%ad)UIM8DF_6ccBvch!cBn$i z-%ZfA8jJ?11?eGoS_Y(lq+n1uQET2B9OWbi9N2znWW%PcL1MI@xg*h`qsqw+fdwkm znRkTEN8_4zgvld26qJ^R!hAJ2@6aL9gTsT|f)P4j4R$N-r>hw<tf`Z3KzoQlX#!We zfysl^z%VGBKy1)>8mwM{(I9aLXx#%-2NENMakc$G`2$@qs7(uVmxnTBOaQd!=z}t( z&I8#Ca}SILnE?_9(Zpa}?t$q=Z;OJ)^gYxd_QTY`Xpp@#pmL;+&-EB6wzOy~g3rtX zjah)q1evFyju^Ki)JDAmwHu}v7AC~fAblVVvKQnQ&>T9bkH?}1@h?amBoAuyf-s?W zZ;CoZA4m^KFR|``sRQW)VUS)BO$;U{J|#2|?nJf&WN!dej^y~%AV1zfZUBWZ2$LGd zHW%bura;#_fXso7nZm*}L{qV4k0yA`lmisMOXL(=Y;+Y{F5t+^pfNa*IizAx*um^1 zmWJ7ZtoMc{WXu%Q|5>08al42X@pHVy+6_~O>;@2<)b=*08JAOD1ly)d^L@HkKw$xL zC>jQZA&)jBU6Y!2=V%k3c0HhWfUF1Exy7A<0W=N*qCxv}L39`c0|ST#wM{@Y=zKg7 z4Uz}x17VQf1~tVN(AW~FAG8In%mIx(f-s@|yEm}72Xrny$Ue}1T@Vf0Ck&!N`-DL> zvOLHwAPjO3h$aS;TIPVp1ABBJaf5C?$lfDRIa1?|L6`h^1Gxhfz939$7%#af-{OIk z4q;^uC~QIJl$_92Y%$OSmpKfe_yyTjVXD{?1JwiaGe``EDJgScc7kZo`H&zQw67mT zgBAmWXwY7M5Dl7ZgxLvl14s<yULQS3nFA^pMRXu;2dje)$bi&>`A`CR93CVGGY3SI z>IP?R(8+#KgOMnZxk}F3+8{rGghBi(dXTw|t<b(djE2dBXksv~^h;=-rb7?XCIiLS z5~Td<aSeNVfVppp86@q4f)kYIL2gX(fcOQ(egKsRv0-{(G)N4FBMcQ=K<Nn7UIJm5 zIEV&?4>Ap6%aA!wv%~=6UXU5&VC3{cNI%HkZ;TXMK;Z&fFH>U<u^S}ba0zw(=8ir@ z4i+{th7dlk_ypx`bo+^!zk!)gEDf^*<Yo}N0_rZ1dtqjP#6j}J`U#{S8H4%;$ngR) z3t1i?8&~+i^q{x-LFKiL5hQG3YG5?T-Y>=wIYQ&lIVKQwAiW@cAetDA%e}bfZ&;x2 z!Da_YtifKf1=QaFwe62MLfixrC&n!xHMraZiW87LuKAl9sJlRFU>IgE^85`boq*(# z(+Y@>3nS0pNL(d;{sv@TiIHLp2xpY>f!00ZY_A!h#U0FT#L^(UKp5s<5F1@DNDNsX z#K(tm#RE(awsg#53W;x+8W;_-*9Iy_PC5pKAqa!Q5o9LFJP?hJ(Zg}Yb^LXO4zw-+ z)fF(a{x~SM9D$Z8Ffj%^b0I8diY>7Ep$91*;d-HK)<Aq@cO#cCAUO~Q$)m>`AwEbS z2!r&3XmT(}FClx-<ze=K^pZ6f0`ACQnG4CxOGn-biF*PBW&mgcBr`7^ItPN7{eY~= zgSi{M-4E?cfxQ9p1BijrAG1?z*<lAs&)cAFAQ%l&3(`aGFds<&NWq|RqSpKeIL1i~ zII#WD$R3^lATjWUi1G!t)EUPHjUj-%jB6YlCJ#~r!{GEq!+8bdJ{h^?4LteN(48pZ zL9Rog^B>@RPKWsqpHS+g8`wMou5<&FhlLS{2BjMi4VwRe)hjR>B<=vMdtmB7VuUcR zHXA5^pz8&-r(y2$uz~co!Sf$BkU9@!FU&nK8e|4Y97Gd?ak&Sk7rhM$p8v3i*bh?! zqe1r0fXb0Nc9r0w*aGVJg8C#f?hx}q=7G!x*$Kjg+Ll+Kc7ybQ^uoe~SQ?}cgh6^i zG%=W*@au4Z_z&HDki7?>a-@bI$ShD8fiS7zWb#nHWeRkh0b~wr{0<gw9gd1E9~{Bs zcO0NNT4Ju)65^)VasfyB2aN}T%pnzn{13B}SQ=&rvR)o1$oL(opCI4>al3~T@pA^m z+6_~O>;@2<)HW)-?5D%o%%HIh4rkoyF9Iq@YWjQQt=MwG8M5CtAP{0cC{A8D6F(+B z1!^}a3_*IgyE8C=_N##CR0akH5FG)fL30QoK4`81M1$l(`al?@*TGq_1yrVh_OF1( z7GdHQF2wI;P;r6y1Ev>b59m$|5Dhx>6GVf~Bn8o+IRp@mEDzEL!XWp6!Ui<%0_x+O zK`Y-tXX}D6?0j8NeFM^mj<;ZO&s1o5%!bmSv!p@pm<;73%frkAxd+B3M3Y*+fznro zD<a&G%?H`L04hgn`nuyvematHBR|eT?gzyU2$LE=YaYwD)PTwzkRc2V46t$)6hEMO zh6iqnEgtURa+Lv;HbBaB{1sa!K=pva3nT`^l$5J5J3%z4js?-6c@Yo|YQKVL(7XtU z2HkxCvlHY7kQm6lDejPR6;$?raDliTtPVOj15yj-LkZ+@Z;%|!91u;a8%UWKdE*Y5 zOV|M&6M)emXMx-SqKUz{(mtVikp=FMwi+nD_8{f;fLGYl1I&F90g!wH3QkaY0dk{3 z62vbc_7tc*hz-*Nqd{UY9O0$d0!l}qau0-I;vgF4e;5rCQzUm@#1rCPkQwA)<n%#E zKghiuPf+JSzIZ_FhlPQR7le;1-pHN*fSFG$4f6}g%^-FK)LkI=!ps1PgXD?z6G%NW z2K5b=Aca53EM$3nY+T_3(}UjT2bJkI-jJ|`se#cTd%yTV<Oq!$Kk<dA1L+0n1JT4_ zT<*m={{eLmHakFKUm_J-K<xui8B`JjaT7?K7`K4b;BpTrPC)WF=RctC0;z#vn7zpJ zAE0ysl1EM}AU-aPJpXay1@ZGAIlhW5CEgGW>N9}aQZV<R+hu?jcQCgROT)~AnGdQ@ zK^Ru2!om)w4o0t_vb`X4(cKIZgSiXDCWLXtKTIFC{8QrxNoO!MFdAg<7N{Jl`R9Wl zB<?_Q2#P<DnIQ8(G&)9)Kae~q{6U!1IN0zSe?9iVAL3U~JqEG|gx5qXwj6<$gCIT_ z<C(MB;jh>NtGigB;RDu#M8NzCqd`*0Wg>_V!XSC{I48sh=>uVqUJy+V2I(ba54t?e z9*|!0=WOD02+!K+D8%RFCnx5B53Te8vj|M&fK5f6%F$7XhiQfFXo1Y>!2E^Y-+}dY zLFW>H{0j0Xh(_)+{|Q%YnG*p?Lpz~uI2a953(`aG@Fht9NWq|RQX)5?K%D~UyeKTr zilO5Zq=p~Z9Y}^ijRw!P(_y%qROgPWCo=?E!l^S>51YfmHC7LkM|LJSjnObMA*We# zvlLPmprK14p#lyMavh31#}l7J^I0CBJnEzy*tr|H(hW==5<(CX6iy%(Xv_^($G~Wi zxC*o$f~f<E5yH6IhoJm{t{2qqg}F;73^Hy2x<Bwr7^MCK*$Z<Ij0Twj5(m-5U|jBj z=|yj^g60r(A|dv})WB$vy){rdQpfNLk`-Gr;vjomK;s%9GePF@L?OoZ2(@E(K<$R< zg@p;RG)Nx^gX{&l1vG9A>Ic3^fcO_A4w478i$R!B+t?!tq7S48q?cHCz|?{CfiOrf zh$aS;6Q6&O+=*-l$X=6Zh#yFf&uH@F4dez;_<}I0VZ7$Md`kv&jsav2Y+Mx<rWP@Z zEem46<Ek8>_^k<4Y*9#1Y}tY%FN4PEK<1E&L1728lUN#N2eRHhF_3XpP#>u!3gY%3 zpm7Ok2MVMXrVm6TkDGzyh_xH04rB%hgY<%EQrq63daSg7etTSY#6r?1$gRj2<o*v( zIa1SZLmVRQ653a%6Nj)LWalpE{mCF2)D{8J{tOHZAR2UkGKdD<DGH)N@-R1p^rl2A zwt&W;K>eZ_i4b!^;vhAk@ktPdjRk?~29P*9-h;(Gpgk=h`#|TofoRa(@*o;?Hy(&a zmWP=Kvlqt4N0VCSfW{09;vxP+Hy32@3aA{Z@%AL1{CESo0~Ed>Olla5{FHCefu=Q( zIj}MZ6t<wbku?d5Eh35FGKT>azaTX+8Hz0qP(2_&gT!E%k}?NoCx`~^F9Fe@xf~D; zYNvu|&|D6P2JLZz*$Hw3NDSm&gG5M~11cAP#6jE+R!3x+12YFilj;Ui=5lr<Lgqhq zL&pJNG{~(W|A1&>Fs}4VXf7uw5z;0D#a9PXe%<jGdwPJmuOkzZ_Cdi3%JU#MdQ?OF z0%9M5%7fT2Jun(12E#TfiY=gY1ZppVFiado!~74UL1JoT&gFC@L);58gB*-pClS&Q za_@yy#THPwfcCf~WI^l(iGTQsI>&P$2_gp%n-mBiSA2r<HoE=9>~VpaPb>|y1LS59 zI|k}5kb7ZffW$%a#QF)O9vOqmf8=-pnT0HmkBuvQV0zHo{Gjq$Ar%s~Ff}k5WbchM zh#a9Y>VR~JI*?wFJ`ha|#^qjIb38AgZpCH?NGzpDu?5uM0JZH`ltA1B5+}wjAT_w$ z1Bw%nJgzyO1ZX&c)W9&zURa$25(lLd5RIHxKzv*nd5)*!5Akz6AoC(p6<a_U)VIPn z$0LFkcQCgROM~nJVVHkGY;?UKF=TlVA0NgQ4=_F0((wx<f56m%Xpp@M8IZI<PC5pK zAqa!Q5oR8UM#t#kDDfYET_FIi3qW-R%&Z5+iY+UkWeQ9T-yWA28Hz2i`k?@i|3PMf z!U05sFmm|<;)5_q9zEU&@j?1P7^D|OlY>Ee3E6`#53>iPm#p~`a7TvlYzgkE5tsp} z6C>z*Twv}-Z}&s{Qeba@`~YI0^v4PmTjmr(((E2+8wf^&)PnSoJIn{tKT<F#oTxPy z0*-MK0}gCIG_ptcxR4llLqvH?0d>Z)VPgik#<5}Y$iV_mUo@Om0QD<D_JQmnx4eNT ze;T?I<VFw%xs&|-uAl^WE6ry=7#IvXsFQABdqr@i8<;#Od|((9P9QdD{sUI8z-W-T z3bgKlsRM}-!noROp!|WZ7u24Hxl1P>($@y<ak-KYsq;Yg!rTL+L1uu&K{PQKmwRA( z(c6&V`Hv!q{V+8!8f0$`RF2fKE0=P`7Er$z)F)x6f|w674`epj&UB_0LT$?(P`g2T zKzd<eLM#o^2f`q|AetCVPWa^%L;QzsKFHoBP&rb=4`dd(;dFpQsigus&Hyq8Hhu>S zx118imMbOT@jDJs9Cc(Vwpdguwrs(X{z2nGAah8?ApgVcB$kHRfvopK31s{Z)KB<Q z1aZ4gDe-$;h_xH04%rPLHmPk?czFt4Ljv*($Q)uYsp$_imhlD@7FY}i*=th<Nt>jm zzYBGWEnCVUdt6LfAZCEfJ5xsdm~;iyZjjSJdiT0BFhnyjFo0;#o)!=t2<3z35J3D$ zC?6yb(g(sIy((pjEub<5w8sTBwg?lCDM##gfQ>nT%2|*+I_4;c_yZ&kG81GUXip1> zE`-{f2BkrB2q1A}d5}I32I&Qb4QSj2)W_L?R=$De`9K&p*9WR^K>E<}3@q+xhuYr@ zr9tO-f!xsw<s-|(%mcXx#wJ9QlfHZ^5aEVwKFHn{s2r*3>p%th>F7@d`Ed?%KPYZM znAG^O;8to$K+0>daupOmpm~NPm5MDoRp4@!0hBgCb_p~owv<5ifWiwT2E&w;t1vr3 zG^maR(V%$|5DjX-f@sjZ2#D^3SqNR@1`-3g*P{wju7b+`E9DTkgOx%DXVBe?JnjvW zgP8-ONp%A$^CB0jAae=(pko3s8st`xJ3urs7+2aSG%wOp1!=2+;%fm?UcV!VJw3qO zXVVPHH=y7Il@}m4zKBw8ft61cP<fCzOb?6(iNUZ<tzru(9f8U{5Qd3^Xqf+DG)PRF z+<B22h<ib1kb{xa2O<3+_loc+wZO`3kop_d5c}a_Pz&MXiZ^oSKVaq)OM~17!XP(; z=oqNGK<<T^0TKtv6YD3CdSnbr6CFt54>Ai`9v>T5_`vj_xA{SB28B9E*uvDnXpp@( z>LGH3#*I%jK-7Wsg7krCVlXcE;++40x)qxpAh8=giY=h_0jLa$=!duoBu<Q5KmeC} zKyd<+$2tE24JVKq7>3!4H(kRN<Dik}KT-sgT0qK(nb!+wP;7~)gJ4kK3h(>}THL|X zF|jnrO&|>OFQ`5RVOX6C3p<b+WZXk#dqHNSyBQ<~a~FtB2;+)>m_BUzC!rCN&R}X_ zG|1i=P&rcb&y_|<+=1c{6n`KyLFR#IbS#1vjv#qZ_=7O1abP2izaBf%1o11V9s}6} z!V~%wTUJ2JK@cB|@$7M#)1=q}tGiwxxgD$zO2GUIqd~&RWg>_V!XSC{I48sh=>uVq zUJy+V2I(ba54t?e9*|!0=WM{cQDFD5Xeg*DKqp|3PbMR2j|+HMA8abrB<OKvIQO`~ z{Dt1%f%SFq?Qwa~rP$KY4M{`$p=~%A4GJGn*pNHU3erDPFeseJALoUH637f#oKd{T z1)7RL{SA=mAhYQ(+zqm76w@IDGP<ZURu7xQ!8KM7lSlRvC@l?zdt9Jdfab{_93JEr zlF&UaP`A>2mgmP+>ZBXkUJ+dB1}2Z5Za{p{m>aB)fzcpw4ro0D3QrK97>uiZ2+AMm z`a$hpn7afzA>#(1JuW*sA@v`~UYL7eG{_8)IEW?&<8lv7FM4|wG>;(A1F;{b21bMI zO@PXgI)=AlfnrO{bj21>zbj`k#C(u>A9@gDdxYAtbD(yE+yl}J3lm~#kUkIw>Af*g zu>~}44RX(vDG2v~<U#FX5GK?%*6D@l1L*;oNvu0y>OlHH7^D|O6NAZ#&j(2EM79HD zuS6fj52VItNFVv}266)^d_kDhFt(6aYVm>2F@Vg0jjO`KRHk3CrKKM{uF3(5--H&$ zmNSzTTV~+M%b;;OkU6AcP}srjB$kHRfvk5yKV)1L)JMwbg}D6=Xj}r?fdZ+8=>yTo z<7OZ^V(o^h1DOHBAiW?OdA^F6ws(1QaYb4YXr=?QpB-cdF__eJ3mUJRF#(b`(ai_B z{Q^{u)O4FL5s_{~uJVD$OF-tK+X3S9OhniZQggtafgzoNfdNEkLFrg14Z5=hBn~=n z4Mc<FL1ut3NbjG0iY+l)Am!hegAj8;;vXg|w%DBF17n^K5ch!U1&}^;JO_(=Kpp_u z2b${v(V%nIKy(AtT}@CLBo8wWWG|>J291S*%D<3V2={>0fWjVxb)uy~#xsEGN02x= z)|mv+2NDOF39@$@)V_I8x*tkUfzrtGAblVV(hH)A!Q`Z)2T1NjwgY6Z#AJvcNKHo} zlgUp<6DE@%=OFik;s%6CjUOLHr4|8bz5$s7D?35)2D)7(Vv1tRfhpj!lL3@AKx%qs zDz+#<^?<?)BnHEjl$|g;L9`(>ZGh&aKzv0gUl~fn+DIUKL2dx40lD|i6iC?#D&I3E zLEH{f!$4%&2{Q*olj;UgzZg^yLZ|J)XEuQCCW0U*4KJArNvG(>gTmtuRF32{JdOA? zEHMpXKgiC5?hFi|G7dz8Y6B1r8bb!rpm}i+ox#As0HQ(iFn5FWKAA>*`k#Qs-ZrSY zolv?QN;gAk(EK;ZUXVPBy(<-4K<!XanYUmK#6KYSluSp=5fjQ&3ezF_K<0w<g6x?A zwRZuOo(QEuWgWUaNFNA;^m_Ctwt(89Aoo<vgP02v2g!rlMj#ApAHn83Kyt`<0~Yse zgWA6bO0R*^Tc9+uJj^VZy)ZsLnw<2TG6Uj2baO%W&VkC2ntpH0AV2+z%p^Yz2FxTs zy@31=idPUOHEvfZE44^K^E${JSosY~W1#X-VwPe{!z^g|4Q(rIn5)>L1JwfxYmhz| zrlkCa*$JXS`y4?usQd=epz<3;gUW9Zy%%O7bWH(B4CLN9vmoU+sE&Cv9pZMdQX<Q5 zm^mPtR5z3-7boZEKt`g`!v*XH90aLpU!|0(C1E!1v_AtXM{3#^n1e{aE8aocX}J7x z1!@P#OCU9e+!+|085kHqv^$hGhSK&>+7U{F<U#sC7^D|O!`iD4-b3ug)n4_PgYY*< zFUY<`sJWnaGKdda(*>eI?Pw4kk0cMW3xq*>K{PR#ocLjwi*P5h9UyxxpmL<fPsv>J z;|Jsha>H0aRjK6$v^@_p2UbRa!WOi~$7Y^l%aVDJG6K{G0I6BBNU`MwR1e6{ATb!G zq>O;s38J;2@hSnOrJyvZ%mB%Q+6*u|L2dwvf!upw9;A!_m17-qAZ`b%BeINunFFFp zbpxo42P!1!(Z&On6CLw$r^5qKIa1T1#RB5f;UB0SpzsC7!C`j>1~&!<1`zE9r9o{K z5Z?*PcY)F%d5}I32I)P4WG|s|qGSQW-yppp^Fik{fM`$~5=4hU?E$qhL445p=O7v+ z53&=4L3+<jQ)~gXt3d9YvK(SANE{>&s&hdYR`25K*Rm{x=mY5i=>^#Xx)T#bgF3_@ z8r07Q(KS$aA<KjGfiOrfh$aS;Q*P}*awoDKAbUSR<w#90I*Z6pFBwRBNsV)m`$2I7 z!lcH}0X3zTKhX9w$Q)Ri2Z|q18Dg+lv1P_$NSOyp8z41jmMOLfK+`)Yyg*_wOi7ss zvlB$?LemDQ%meX3WgdtIm3bf<)K7ug333BS4CLM|iy>tms9bhf2yr`D9g$@o%p4F+ zsvAIMUM8r}16xSjF+Nb4SF;3>*PvE{DNuN9fy$AbhL;kbhCe{<09gvM^N2eGgDV3A z1Bmv7(xy-v)FuLngW66Y8YB<W2f`q|Aez{EJ7X!r-yppp^FU*WAR08r2%<sjCqOi) zO$4GrZ6^>7k_XuZ!XUjMnixz@86&d{;Z9^bK=y_}<w%X63CqZjACMc!4Py-rrIruS zxhIf0uyO(vrl5Qmv0Sm`z;Z}A0U9R&skyOQv4sViMnHZBiNP=><pj)55Di*i4WdEi z1c(Ne6CfH?PJn3iIu0ZTa_^nxka7Z4mMvKdaXZ*;M3xgUb3inyZh)5)(8dvZ*nr)E zgCHjzE?I#)9o~V;k(v&3RuZ2MB~~Kr2l@4=I|Bo#Zv>*f85kHqH0aD05Dh9HKs2Zv z0ns3NSWtlU1{_70g)IID$vuSX&lOnQ18OsY>;t725DhwW3q*s;4G;|~UqCcS9@*X- z>l9l+?Iv)WX(PmKAa{b)fa+rqCR8U|tb*tR=>h2l*#l}5foM>h2}Fb1OduN6W&+X3 z@*sU64AKjtiNWNgqc=$IM79HDugYqOA4p9{39HFZM{|($k{ahA_k-dFgh`E`8=6Wj z63~1DG6z-`g5m{Kwxq04Y&o+AQWk>J21w1B4T>!~P(7gV0*S#eC1oMZP7tjJ%}b!N z5X1+Sg&-PK7J_K>HWNq;<lYx+AY~z_ye?S<aXZ*;M3#jxb3inyZUB{qd30<uZCDFQ zr(pjf5uiAE0hJ>;4X-0U4Xdm}*blPv81&pf5Dgl~0nwng5r_trK_D8mXAeY!<Y7(* z>HUCYFQN252aCPk3=9k)b3yZrAi5gL2hDea_@Fre5Dk(?wih%P`(!0#J~m`K#6KYS zfYgBI)<BrhT!7Ach(3@WkY12Ipm|Ray$tG(=};PUcMwP%SstVhgh6^iG%=W*GVcMB zJCW@G*(<RD;s;XGOUMTD)5`=Ty`;uD$o-(W0bx?(r$bw*MFpBaK<2>8JW#xV%8-bS ziY*5=LdrZ)+5oBP*{0ZH0o4NvFOV1vQ&Q%^>;%!Ewik#7m3bf<ROW$bP?-m!L2JTb zc7ogh5(ByS&PGU?2P&5{)<fJ5R!3x+2Qvpmlj;U|nMbeo-zG>p1^W+)0ENdLs2s^@ zcr)>7SYk86evqBVq5G3TG^l?DqCxFE5DhBpKs0E7GKdDr!<-D#`vl2eLg{}37JEVa zeL?1e<{3dWXx}f029<Rn8dN5NXplUzy>E^yw&d)Cq#2Im5dVPOQ?iAG`K&DveIRo| zdO`Mp<~>353I+xS5Iqx0gUUJ(A6Xux4}?K_Jtiu)fZCp*cBjD}h`AtfkUXeO1H!O& z4bJ&bEbiF{wf_i|2F-hd+yR;o1<}azAiF>qW-o|M2$NF=r)-7z58Z5#y>p;)q^92+ zTggwqBHIvpNlk+R+sIEZApe8n6@*ER+Xh{w771ux2blvazd>;dDi0;LE4DOjhm_x- zbOlnAv0Jf42dW1Y)*vw$rlkCa*$JXS?L`m`D!)NAsQd=epz<3;AB9;6o&N-hf!sT1 zJ0vfH>X<iMAZ`aMC9?d6nFFFpbpyEkMjGft4;!#Ma1dmr{~dVJKU9v?^e?g#k%kG) zf!=`H0rC>auP59Y7@`;$7(g`W{0I;Yn!^CmVNh|<ovI){NFJmQgh6_HknAOtcLH`I z{0-6zGOq_}{sbru>JNj&JD~h7C=HSa*$KiRy&xLY?g3#!ZJ!fZ>;<i(0@(v<Pk?C9 zx)l%&I%fz(Bg=#A0%4fFAT}XPPP(Ysg$N&H^Fj7*fy$AZE<WrcKV9hTM(8CqZb9w` z#SI9P8b1d5N-Z~_{Sc5ju(AylFQBsG%WlP%m_3lP4b*o5snI#8*zyLd2NYf)F&L(# zY=hYeqCxWqAR1J*foM?K2BJY_8;Azg`7k>{ZUBja+*`2+QnrE0UzS}Ew}aIYS+>E< z0nwzo0a3O=8>i567i>Qf1Uc#0WiRe@TmzLOH64H1i%5%v%C{X*J3!t8#luN=1_sbx zDG&{sGX>E;3=9k)8dR=<Xi)hFqCxT?eIN|d+p-T~FQGhOun*yHkY12^pff~3^dzW# zpm9DBA5^Y^Xi)hFqCxT?J3$zv_snL+7SK9r(7eZl!w_>p;v)NrZ*LsH;+}<2cdUfc zv!FDnyaTxdSsvsT5C+)`YAb`<sCJ<8_z=Q9AbC*x1%wH;VFLC;^nvt%%mmrDA8J3S zT>#>5h4Mk`q(FRRd5}I32I&RS#9(sLFUtXhJCW@G*=qxpBQ^b296+QaQq%7iB)z1j z!4C(>PcI<9gW?s0NsU_#L#382(0&Za99S6+ic?UTxZ|K=i^3sD84gNUAT^+V*cqrE zP*{V+V3?9J9A+no)`zAqP#F&5gUWCa4JyMy^f8!)&~g$a26C^>AxIexs%LukL);El zN@N)hGY3SI>V|mdfPnaLPZ!sCPd^_|KiA-R7gsk=KUdIt6ObD~VWpgsnwFWDs(@3i z0!Srv4%<knr2?9VA)*lStUCh(Cj$e62DH2ZiGs=?5G`{LoF^DTYC!vzK{RMh;~c0t zu)R1Sw}8}>gF$*pIp1i*VMXwnK<A))<8MQ0kli4&Kr}HJR~bR*e4~`ZkbR1vwAla+ zGiulib2GO6hzpK@;{m1wPJ`^d0hJ?keg<3<G>vB*MXVhrbkB_l(tI7r&Wr904Au+` z3?Ld*H-Km(DBl7~TR~}%Jj`y8UJyG3Y3>fhhlzKjF|~kjM2awI%8UWmy2>S3+yfeK z2e|_@1_h!)YZX8=XpRy@Bg->D0nA<~7cYe?y}&eKi?@hlxZ`aCRF2emJ9CWucmuf= z6uux#Y8W#ZE4AzpQ~<{d$Q)SN4hmaPSvlpnV#|f&iY=g`5!8+WsrhqCu|)%#K0$mi z7J!60uJJ6e8U_Z22S{-Y69ds8-7q^rv?es2fyyutUku6zmGvM#sLcn`2f`q|AR2~2 z<rfE(1Co1iTCoM>c5Vg+29Vo9QXp{<O$;U{jntgLokq?;<w#8<E+;X~1o<Q8B=Kp7 z1IY}K-pkN6(;ynOCK5!0@;HbF#W{!ut%(HDAbD7Lf%JmdTcCacu|XIn4qMA2;voZ0 zTe$N43@q*ejVpuf1Ff9}(E$t$3?LfR?g!DJaSIR)k_Xud!Z3S5Y(kiv`1Co28TKH1 zK=!sk<w%Xs1E<K3H;~=rhH-<LQcFM!W}XLyDQN#f$7#iuBc~yG9yGQNvg^Y+#TFK{ zxMm<S&tE}`V~|-e3<^7#ogf;tR}Dmi;s->_LgQT?O5<A}hMwoIoL6iCxgC_}L2d`x z39=7F6N5o+z^4vdy-;ulcN#eWl_NEcSe(T)6XcJ8v&5&JKTx|t{sHN|3eEE%8kDC& zG$_x5Xi%O9(V#pJqCxT?eIN|d3!+ybnFr#-#6k5B2otJ<dXW4C(hIT&G&TvML49}- z?Z?2t0HQ(bqd_#XJjhNE2I&RS#9(sb)8QOu*n{i>*;@gXBQ-v^oFhNpKz4(|7lcU- z;~y4EEhQb8c^(wDpgdo5Ua@7zc}SiI)t4Z<o?KFF`EeR842aD0Cy?S8WEKpA!VYF9 zhz8|(5DkhS5Dm)nAR3hCK{RNt5m_&c4WiNW{DaGiEg-jp@;u1xAT=QSKr}HJ<OY1| zu;uxb3uxg3H2`Gq7N{JlX+-BDrkNn~TrLuyc0NGu1~~_$_a?M$528VBcMuI~+k<FO z+a5%N$^Z}zk_YJnVUS)BJqO7=5FaKEtAir6<?z<?4M=_h=>^#XnokDNptUm~+Jk|C z0YroHJctJ6c@Pbf2iXb2AiW@(7)(xlnq0yRdyriqdvl<2q{iopOXSBJ$Zm4OxWHPe z<;?`lJP!&}P}{!XvSQ1c%aA+|sxLuy<=jzhd2=2u42aD0dywK7WEKpA!VYF9hz7Oo zK{Tjs528VBdk_t3+k<FO`wm$zj18jE^E_;v0DWv#<CbCz$WNfPt0yi)`~z}Fd2(?| zDfE&|5FcbF@>wATHx*k1Zb8&Pb7x=xr6Cv%QVY@(l98$q;2-Q6p^%rDo2rnOU!+iy zky)&eS(2KokXfvdl3Gxdnw(gYnxd!RnO9trnwX-aP+FX-P?C|V;2G?%;H<5!ker{F zmS2>cm{$Te#R@v61F~ZjQ$GZL+@Q{RT%a-w<T_mEalzz4YG4?YW|U}?Xh6evU~52j zfaZtbi5o16n*gZ?UwV^LS^zTyB&MejoSLeTpO*s~fXqnEDF7$$l+=>M%$#D-WIS#o z=^_JiqY{2c!n^}MyMi{s4h?Di?f{1e*uAuI1oT8ZPy{Lv43ZTOsFVIdbNV2U;Y$B7 zd5{_y2898L4ceCoD@$QCNPNakNO=oW2NENMLFF<wHK2TsE)E)dfVu0%b;vj`sIiiB z17R=BJun(%2FN`hZYj2a+LfTSTqbuB>Ou0vU|jBm>BZKj+ySkBU}|7A$UPjlA#Nab z&g#b##THPV2x{9w$N$0k17tR=eL-lv*ad1gNDs&@ps)h%xd73iyFx%TsQ(6{L3=hp zG-!+lM1$l(`al?@7eo_-$qBz7NbW?o17xqk9rD5tWDdFE)L^I7@&noi0ht3EV+Dl^ zXl>4qJBlp{cfs>#9H2PjxT4s?@j|i10h$g#?gr_DVbB}}j7<s+G6!ZShz8wZ528U~ z45C4414M(y06;Y46bXn8$a-t;LgvpvZN-M$5V!9D<qeQV=sW~O7lZ`0*&r;)oE6Ay zkiS7Rscrz7Luz}iJh`|$xfrAqVn1wt4I-{ko?Kj9QUs9(=ZOe=rIt4!|3JlH)LZDB zS`B3W3@i*PA3%%@V`Wg0!U$3W3QrIXYS;dOnga_1P&k6rlY?P;k^OJ*M6u<<6G)o= z0Bx_rXpkKsJ+!HQK&FpkT7|%l$JD8>VeL^|^)*Z$*&m=ZL$CH~W^yjHH-_v2+-$Jh zK+P|ZMrcb9Bt}G247Z_lkO8@oU?UCc4v<>f<XKq25f@q@chD*wKyKUwM<U_ID+2>V z#cS&12hg4ZP%z`l4={O<8W;wJ1BeZ3zrxB^7!4ASfR?{7bs#Z97*t1KQv=HP=;EOE zE6iOB9zoi#p#6dxk0Iqg$X=LxU^K`Kka&4=F({BhTyWhM@Jz7<RA+(Ovlm_<^n(=; zLEv&XOe=bO7IYRu$5V(sFf}k5<h~nFIa1rRYXp^B?)-u5bJGz4*S%o>WjrH(ZI;M0 zgu6g)0fil?-3p>X?OG5G8jA$cptXb`8gxDjhz7|c`=jHdVhgB^4GLG6FA#G<W`fkf z+Kq(Pdo97@9?&_bAp1aP1A=H!I|W38)*gar(0QmJ8YB<03xr|zg4l#GIq@0s9O6H8 zvqAPwfXa~?pJ$$vA8#OckQ>Gw4oWRAp!pYM4y<hs3RBQN_bD$FTmHO&w9P^ByW^f> zOU-A+76E9w1^F4I4~8jeo5Sn`(V+D%AQ}`uAR4qT2SkJJegx5=eV{NqL2dwvf!r(c z64EvY^&cKQgSb89CGq!!!ps5Dq`Cp*9#Y$;=z3V*E4D0o4@qAiq3u~14N?p8D{bmV zkm;kCRw2;yjym->ti6h>{)WjT`va6_Xw{B^*#oiz)Vj)p*S0Vj!Zb)Pcq|sI8Pcc) zi4oUIBWymcRDj$#ING$}fFmlnz;32Z0RkP51-nIwm`3fJZ`8>Xptb-gj&bD)m^?@g z41>Y}#0Ir#VdX1~28ruH%V3x~kQgBhs;jW60p)#kaZsBU=B|>rkTxx-4fE$Mr0fUT z3v&;Q2AKg8FHbH82Qr8c!XPmaO$^56Mwnh~?N^Tv5I4cpz-W-Y4Ny5!+dBduiEr=h zf!YDG7i1?WJgOKN7(g^A3_&#L%xVx_1{JS>(ja+|J`e`!?NC*20kxe$?bI{sh<5V= zB=-<%r}}(Ega^n>kiDR@m_hUgsJ)<bAwYc4J}MBs3Mvkg2e}1=L3%-Lcu=1N<enM- zA?AX_LGqyeW*|&x&)FR;?g8yJ0oi*TYVQsx4cdzW5=WK?*#*KddqHeMn4EMp;S<Dv z=w^fLJpq*?H65{hCO;iHAn7GF&Ov?v#SI9P8b20JN-cY!<qOChSeqLZFQD~i9A6Y$ z3cf(v+@Q44@lvtn!av293s60v@B-<BVM^NEFgroCFEovS;ugfWf$~A);voJBn1#?W zZjczry**zbZEjG%K;jd`?I%EeKqAM(Vdj8nQr!S@5^|fHnD#Teo|0dREh4`mY4a0w z-vx{YsRe~MZK_O=>7$rdA@JuXb=nuOHZ`vH1xy~<AD}ctw>EciD(DC{Wb5&=!EOUL z){9e1AkA&?*bz|;NW3P~Rub%P{EmeB1~Sh@n>-5(IQ$NQg#_5mv~dWmy$y;)Vw&3w z4NS@{AosxBMu-O01K8BS#$s{h2besvUYNb0_BO0+h0!2&bACa}Uzj?O7$J<yeV}}g zt{2qahPms>4@i3(G=`k>6JamRJun(%2FN|2_BJewf%qVCVlXcE!StfHwLy3EZGqN9 zFf}k5WbYfO9I0)jlt09;zts2x2@jCHAUi=}0b08NqVpIS7(g`W+({4(+K&LDGoj)j zd5}I32I>9sM-ja54YXccAQu0f0t>L%3u?QA%x{F64{F<k_@K2cAR1X7WG4uN>^<;Q zu>~|94Qf-*;Y76YLGqyX8VD0=vl;xw3<uD;9Uyx_=WBpy(78+?8niDSL?g?C>;hqs zdq6ZXn4I+T1j(Jqc7W`a`3La>sp%!+ANlEJ%0Kes9OQmb+<-8t@$<r2sYM5xKS1Wd z+SH(U0kvae{wuZ|`44GRgVM&IFN!T!IFws#pn5>z1=0t@l(eZ~c7kZoJ`xZOG9N@6 zK+`g4?Ky}KI#UZ~Crk~<y$TG<EueM$pmu-GUx?dd7?fLxxdRJk9)4QBMS?-8WzT=5 z76y>H42<A5KmmhN%Wh~J7)FEEaeNYEWdLE29{lEFmpy^ST#$`l#8??X7-TO@=Ye)! zxEo+%xM&4NO!tE32)>E2GJr71UR-+diC17T7v$a_Vyp}x46+xdU*jb4?!AD;TyX{l zhF@Z=U<|SsW-ckT1`}pDfcDh?5o2WlVUWF~m<LnafW=(UImrLSSQ$VVWG_rDsWdEo z!D!H)Rgjq=OsZKh^$XaPT449o!{{3f3=C$ntYCbD36$Pps)?uP@L-w?N)JA=tPCJ* zz>F{#lpbJq6S4uM52hAIi!d-Sc*(MYaR-vQgv>&g2kC>E2ctph%tMxy0fZkQnH%#% zp6L7r(g!mSMuWn^O_r4bge_PQ;Q-3VFg3_-!^Q^bgQ<nlG7Jn1F0!m(JORyISen6R z7P1&fAIv-$4Jyx^WLX(N_yv-=$odGeLHc0k!RW^f3=9sktPsqK2nSGlAlAJOteEKx z<X$^jRt6BBfn+WrHzLb}^ugQ-qe1azBg@JF!XJ>#E#O4B0oe>}Y>+;fc`zE(UbB*A zWdLChHbgjJ(~nCGqz`5uj0U;aLY9>QghBZnrgzUeUU;5|iQ%FP{>rzQutVI094G3a z$``5$RQDGoE4CD*L)uTEatSKM0MZ|ks@MX;F#VuD4NM+H!^DZDL3%(K<b(usUeG#9 z5Elc(%tMzDMG|-b^&659Rhctzm~SxWXiG(wVhcM11B3E{CB+9gAYm-S386ub0EHu{ zOaQTwu_hw}!#^GdhCR@B2eKT9Ed(M!_`5tjYyyzXFZhWN|BuHUZs_3*4~il23NjLe zML3mOKyC(^334xp28n+WQfdMD1B5|*5XR+3eyG_gNdDbYsMrFt>%_FzEeWNNanfU4 z3rs*}gUp-4jT$~K&!xbAbm2mXYk?95F9X9~cLs)NkR~*YEqp*qrU)vvfX+JtVOSnQ zPpdF-Vrh`MAPnkHgUU4!`vaF!%M7T$L2hM)x)u3;P>?zhhPm|tR6R%x#P$KXwN9}m zqD~Q>m#O7eQ1GR&34y~EWFIVSL2hM&x)pgn2}lhH!`#|~6c?bf5hRC>nW5%@&Ra&8 z<7R=h+AS&(>F&eLl`TEoN-dzY05TJl9zZlmFX%3G5Ff;bVNl#-GaHuf?jWV3l2XMM zm|ZbEN-f%q3=FXTkWDS<oFPUA4qlka2pSZhACU4ANCu>rg_nT=mOe~mSwX^Z%mlie zm4ShwqXywOkfaC?BK?B+pf~{0AdIdSBnHATHD9o_wLoQ@pDZf_2!q;UAoZkTA6`Vg z2J;W7uMi;1$^gP3dr37Dq<#q&b3t`gkSr?$2!reesRQAFNdoZn4dUa&e{h%^BFoAE z!XSHL`a$U%<|mjKE;@t{GaNu|!!TJ^1`r0>i%Ty)@ikb?eZauL5FyJ7#vps~>Bl9< z!jI`*P@5=9mX!g7LH6R(i%&cTi@Bh1h>>Mw0AY~5`1IqGgT)1m2GxBaGeH=iK74XK z0+`_d8efQ$Wn}>2E&Ql?4xd@bawmi_%>|u1kRZ#-0Ky=9k<}B+PDo&CVPb-e#Utwh z?FE62b-}_1MkA}k#RiovDOdU6<@t?jNZCWI86bC|o6Q3i0F^-?4CR6;bUs)RiGa0f zK=mz5Scj2;ffcFTgo(pwY;_AL55wd^^&yB2GKY-_b3k<{NIeLH>Jba1`T!&b!t8j= z5n+PVQ7S^HX$X|2EX0*s7+(f3y})87$XpoqfW`xi52FQ|6k9<4fz_kP@dWZ8OdY7* ztx~4g@}dC}pP)PglLOJ9zB?$-g5m?+Eg&(F8eAA;HYi*`@}M>ssGSF*L4165w;)IX z0|UbyK}5K~%z;XwP{@8mmf(hRKw;4$j4%r-%wQv|)B>{u6bGR2g2~~d6+|%eE~xHF zl4WH8VNl+N=?A$Rm-}F9U~~l*b3tWpiYzMw2!rf}sU?NJfW=&pd(&iD89*3hFU&kp zz9QDW8lsrt0IJ(FWLX(N7-TQZTvF%;EarmTn<dN20Ky=9VdjC_PsF<S1{QNc?#+>9 zWdLE2y)bi0p$)_^!vW;pJXux-5C+)`GY?eW5bNF!Earmh$^uzd1`r0>3p1A#`T-Vm zLF1N1vaAds46>IL^I&R0WfshDFd8&&St85I0Ky=9VQNXGVdlYTP&oxM6NE`M3#LBf zoovfe9|i_cIRT=D!E0<78QdCJ!5F3vL~r3!hpPqg@!=^ZN-Yb07#KifiZB`!zDf<O z3?PiGSKxwp%Tyl*2GkZlvI+$Ig*e1qkb6Pq!rZISz{&u^2$c*BB7Ev#H-OY4i(_MZ zNGi3=hq?hogY<yXuTTRk0|+DQ0l62Xh8XwGkWgxw=fl7NI%Wh$gW6644Xg|xjBf5U zs2h;Qv9T9G-3#hYf!qRW*MQtB(!k09!pM3&WTe1;1F1z8$Hx8vH5XL>fXoHapm-B& zU}XSdWIYdr)LUi~>D~Y-rIrOywICXF1`Wu)5)G^jAdGBo&NBhHT4Zr->=jURLGcAL z7Zwgu4Xg|xjI2jOLLF=_NG-BBR<<<6y&(UC%mvY)aFA(WWdLDhJvjpEEwiA0Ll(!z zc94LiUr^csrC(S$$ThGsfH1NiP&k0pfYc(3V`FcSR%%(~!@vOQtAl9J`N*K~HECdF z0AXZ34if5cwaDVw*c>ttb3yZmAag-9C>+chSQ$VVSr2Fo>6SYK1L%HRWN~cl3F1oN zvIOKeP`LvO2bTs`1`tNp0}2O_8jxCKacpc*`(=&{q@4pRCqe3nYVXM^f!m9qu^<qJ z>8Iv+5Xdc{_Bv>641}p|2WWf@-&iipK9D<*F=(6v#$O`~2|pO0+H?vI^F2h*wD`0r zwt&)t*p!#9pz$b>-BaWd?g7<#p!OL^{DT}qT#u1~fs>bkVLu6Dxf(D0S|XSkTW>@# zfU))`P>x|>K#y;jII%RyZ6FMa3s74J#0Fs(sCz+f<s!nZJy7)^y)sZXC@f(82aq^7 z9&=#h&J+3|{Th&Z5blvzY5|2W$V`xVAQ~j@qo~vZ3Ud$!@j)0@c*4j3km6=Ww_*#- zt}VjzS_CFQ#^oP9dE5gs8)V)JMMRu|;_}T2$h<>@0zzD$k%57Smx1AcI|Bn~tq({a zGKTkIp<x1&JMj`?4vV5vivZLtkU6|ibKsqJkYXr?nZtlIz7LgR_!6(&0>ZOAAayr- znt+KT)1XCwAig>S0|ST#)%h?QW-h3|$TJBt)(#Sb`5WX`KB!x#fh5o{%&iNcegjFr zfQCINOhNGo5(8m=s5zkXB|&^-3`-MdCZnc_1&T^7pm+kA2{I2vgY>OXR%!vo9SDQ? zAPkBZY-YpK#0R7}R+ymJ0<(+7_e_h#RK*r91_p*e=9Fn5vq9#us377VIZfm!A;b+B z85jh385j<_GcbVmT!8c;V{G9AOA}j^lv-4vW`WERgqj1|_kwH&hz&CbIZeRgD?wSQ z1?DD@IYLl#K<lzVdXX{A9OOI<k{7UKYz6Jj24R03<qb@nSQ=z52!qlna(M&tH%J`h zR$-`Hw}AxEFwCugpkV}({sWCeP~3ph14s;nMWE(ji+@<!>Y0g}w*Dw9wSeLqWG2Ww z5DhX*Kvk&)lm<W;#0Oze{9-d3mbQG5(u&Sh#TJ-dHUaNiZp?y|H{ZXd_khd>nU|xA zNJF5s)$<gR_f8<0W5~$BAj-?Ya0q%nFGwFU#u`3Qb3p1Epk{&05rdioTB`_>L&h+3 zkkdp2R4>S#ps<0d7l)byIxi9?2BTr&ykRbCIH#y8wSfE%G81GThz997pr+IU3J(wl z@j)2mS8Qg(!g&i)xV@OA*aEXl;^onnKl31YxGZZy6Uc0kc{1wQ!`VO$A#TLTz#zfP zz;M`|fdRCC1EdcbV+)@@&~UC$Q)+nubrZ-ONvJuXa|4jg0I^}_Ag5>Kd;xP4$Q&uC zIiNM2Aic;KW)5;$Z~*ECkbgm83{x)+H3wUm!s2VmBGmX2QCDgKhoP!c3&=c}*%}&3 zEue4(VVL=#FvDgxEWT2Z!e3y%VhhZ!CE@Q{J}ic`so4E}3_)gt%xuv>#0zr1cz|S% zF(U(m3@-!25qAa#&>nY?K4gq7d|>efQa1x?7RVe~s5ziJ<3V!B7-kM~d=)_Tg4_uT z8<=`Is5#ie0v66^mZ64ojfPSS$nPLCLFR#Ika?gx%R%7*!XQ2fgZzrkY*;v-K?*mP zC5kODyS8k(1-}0r)VI{$c{CVgHpn~^E$rd!p@|STVPs&C=Vf33-4zbHUjw8M8Dk3{ zSU67rnFGQM3=AN16rkqd%NNM$8986T+ypX55o!*;e1Tk!-GGJ*$iJX4hPht}Y7VwA zg~iv6)u{2MqovdW4nqy47La)`vqASQgTfVrVdjIv44c`o_^Lq)f6!g?FuNw??*rf6 z4C-s>yg6hEG8<&(6KzDiAm@u8NamO_GB7CfLhcC%%~yf+A!As4A%_nvz8tibS~ft< z0-2)%H3xLZF0vUQHq0F4_=2@XK=Lp*fy_~bnghBc7bJ&_Vdfy`uMVgiK>h`VF-*N0 z)EsPK3X3n${m?M=Ao`BBQVTc?wUk;w=E2Mc-LDD?R}coN17XnJ(Adm|#g~o_BK$%3 zWW((8d9Dt=s}+>Lc67|x3o;vI-W^?pdgS<8fn<&uBLjmvFXS#^eCt?{!v_{$A9R#j z5};;*%+Y|F1G+OAWIr;7g)_GJvd~p(fw>7}jwaL`&|SvJW`Ni*bCA;yay|vQ38W5W zjuzA$&>h4eF=Pxg2f5E+0rd+g+(2;!Q?Cs*2V300;vICaEKEI!zM`wt0*VWenIQ8( zG)NqD_arEOKp4aaVbGnj*vy8-yNVtn9zpl(!t9#BUj@F$64Ym?s;@i_G8<%Gk3K>@ za=b4<GRK^efkB5CawjY3ZbFbgWQ;9*VDbJ!PpKsWY8J>GU8p&ry9SZX0I^}_AjcPS zK83jnWR4!x9MD~XAic;KW)5=tF@U-O<X=!2!_@0T&A}F?u=oPql?hW1qFeNpTEJnb zr_=&64`w##o;gssf-p!O2!rm)#AY@uzOEpJKj_X-m|dW<8gyqJXkHsshJ(xonb%^7 zJ-z}A5aJe$3=9UmkUJ$ocg}$HA!BUe1B<U221+d)P_sbh7(&ef?U6w?1H^`zgDt)u z7$~*C+ypYm2x<=KPDhYlWDGM0Ie#JNQ;?fL>OtlhL(Kv0e+P*nW0*O}<<A3X_=3U> z6jw0yCQx&*#SJXpLHFyy)GKHywbU3w>Qj)JAoD;pSl&pf1r$FZ4CX`c^}}X1EZ)x` z#UtpRL1eo?_u)x0FfgPf?^w%Vgosy|*&zA`RR08Hr52D|Kw=<l%FDn2x(^RjAA|VF zm=QFP#=yXkfM#Zhkx~oDF0h$UInekDNN<dhQp<@$iY=fqX%K%0R35~(WMp74<AvO} zW(^WR!`R}ZBOS4huK;Qm$Q*O1IiUN{(2QY#nS-1@Vua;eL_`qlMqzp^pypr;du}$! z8VS(djxhBgb3p6@5&0GlVfhvi4dVOrFfbImGcbV8`Umlmu^^0NjEEbMIUv0P=1MJ~ zIP*Y~1Ksz9%{{QRa05v#=w33I`}WAGw@AlB=JP-_sC)*EtS))P$^gPJXMpG$6)m`0 z5FalNRciSb$G`x(s{};D<~Wu-WMu$hWW7ChT5z?<;@H>`(76-PcpYetLkl_wYSh5W z0K&+6G{hitCm^-R;@H@rbfRGj3F}MHGi*WXK<NfVgD_})2<VQq2S*iKK==58!U`nb zW2)2w(hu633BsVb0PWoZjq!lwVHhS3qAj3zwSn#v0r5fSCxB>B8VAuJK1?4hpMdfO zXrCkqgVccT`NL)hNE{>&>YspUP<jW^ptH(AG%_D%2PoUZ@}GqnBpg6;R*Vb`mb{R= z#Xxi8ATeZ&E#GLc$-;+lKS0A2WR4Zo9MIim$Yy}pFmsU0Rf`PymJb=2`Og|^4z{r; zSpI|EVFxlBWDbb-$&_z-k}lr@qCxyV9tMW#?hFi|xB&5yF)aUq?g4{|gUkWx?XXm8 z0hNg-kirRc7Z*17!17-ND9=I-0^Jb?a~~*t7C_~$Af-D{ctMpjfYKf4o-WWGVW7L@ zVCjy<La7C$AC%@m7~}>}dO}YVFmVtKI&K3*gXXnCG-zxGM1$fMM1%M+dtvDglpbJb z2ZGdq?wZ492S^+w4{8s9XwV%cAR2VOIfw?uJBSAHVRj&=yA2kIbZ5=Tz+l4*x!(%p zHkf)CjV-+(m-`t|vq0w9Ld^l)l>^fcqhaPCm-`Dc<y#`MFw>nK)EsQ_3`=*gd(=SY zgUkWZTe2W&4n%|a6L}aIW)Mhspu4C*YC#xe4p^^^QVXc;cd$f+6X^aYZ0>=jy9-Ea zLHAU_+y@FD2`h*>*O1a3D7-*+f-orEf$oX|-BSg+&kUCCYOIu6K>9&x4unB&z?SY{ z;vgE7?m#ps-GOLOIs?(5xCPN5KFCfGhNU}DdH|JmAPiCiy6+4<-ND2`H0T^s5DkiF z5DhwKA4DVbLFR)na=O#7hJ*u1+=h{X!JZd##}cS428khKZ0SW|Bci-}01Z=+ISx>B zu$}z@GY7f6E69;=(a6P2caBhVu+{IdboT^$?-IzZAag);ORjv2OpbgDhz9Ye^Dr>X zA<*6c-G>BH3&J3CKzc!E^MlH~9Z2B>x`POtdtm9#!v+zipu3V_?gNF-1gIQn{Q;~E z2?{TeogfTKcc6QTKzAj9?$m;%yDv6MEg=1%GzY>UH(;x0Vd5YfRJMa?Q2GSXpn4TV zgW?uMgZLmjK^T_qK<NQi-htGB?%YC8cQA1f4N7+)8kEjJH0Ula5DkiV5Dnsk%m-mm zy2Cf;e;db~IP#qT0$W7bg3P2gj=*C+=#B<Z{OsFTAq7eoAiM9_A>0FsD_A=MBnQK` zj0_A;ybKJW`wWoJ1%}CE%MSujbHV0A(+o(xGt?Z={RkjFGKTf5K=&>ni(j!*Y5}<! zWG2Ww5Dk(C-D3dq2MB}sAPjONHnU-ATg4vXU(o#%$aaD5L;!`4l53R|$ZU{#=-2?N zA9SuR$Sp8=7hVPi(47ddJOL92(Xf8i0jOS(7znSiS84&-1u_$4A0rzB1MIQ}SbE-K zuhas%&*Y8GRPZ^zp#67zv%7jg_JhoL;(+iEDE?scZVpJ|c8m-RuDlEkpfhjrjaMU= zXR!W0$c`UScZ1AvgPH?6w;3ddjA7{jxjw!C)eCYb$d54f?oe~E&3C}k0qBfhn0gR> z$3dwD<adynAoD;pNE~$D8YnzK7{mu*kYBNx4NC_)j)-sropp?C7wGIZP*|!gl$QaS z4Ki<v6GA;m4i?TUkj$}XWMJ^%g`8UmI=>L44;f<%A6Phla8znZfSLs|#}jJK8e{{Y zY?wL7@r67N26Ge0951Lj_{Kw!$7d{{ZUFfg6vj|18N8w9AlLOUIaqvw&WD4Ef#@D5 zr511)Ix4k*%!8Q?I?DqTt{@Cj2g0DU;jozvi?2IK;SV||57{ozxgel?aeea29+24} z^ITj|;|o@<MK~kG9T*uHe0U*e-hj@)0qH}=uy95WpCiyUB@3LDS_GhGfz0uRnuBj1 z2UmQ-+ypYm4{8qRtQlmtfY>niAm^_a&~O3y7Zk=Ibs+2yHOB_TLBp{40-ZgAEM?=O z)B+AeC#4pUc`&m%T$Nft;R?bq^`Ns&u$c{uuO6iE2c5x!Y}W=h<rYvmyXbDE6v%9l znJKP_cmd@vSbTxxVAzq7fgymGf#I_|0|ThOhKa*yY~eEl>JE_kAV0y>213mNwIyI; zFd7y<pz~v3Vjw!kRjCE!W{{a6^FTC6yueMV1>_G92Jt}{<VI{}!@_3`l7A1dDTB|d z0qFzb5&=l~6n?6d0+|gGJL85ud^C{6ofsJyf_NDizK{?;u=EVF;{nu7AajDD<`7$7 z?11V8xf2vNAoD;t1Zobpuz-bgiZJ91Cy;s&KH{d-0`fb^OptjX8YDi!U8w~W9v}?j zgD}Xi*vy87vxqw)+*$;bTafKyk%olxt<*{>kl7&f-XN*Rl@6U585lx&85q722xsK{ zt^hR`WIo7GAiF>~3~CNGKfuCALl!lBp13QufZPl+6J#EU2AQ?NL#YMi4-f|NK^Wvl zY-Yp4$HW5>J|fb}Ey#AAP=SPxiF}n5$ZU{#Je~;kxWdPUk%1wcmx19M3E|@abqC0N zke@(yfp7%W9Bh7og%1n#oL`W75N7dIY5}<!WG2Ww5DgNS@KS04`2&POd=Lh?5u4et z@CiZk?+q2@7G%42=qa~=!r(=Gn=r_1ka;CusNn-^CtN@>$CZ(RA(EGY;k!En1M+wZ zNIwX}$}!~h18XOM<U62dfy{}5ngbuS11W%Fm^sMxMFLbW$ep0DfhuK)hMI$|4u*yE z5ku5;nB%3?0`fb^OptjX8f4xHFQpbxcz`g755ge7Vlx{S&U=u;?Tnss3(T&7zmWcU zfv-{v$PSQMARNQX!0;Ps>;ohQ!?5<YhBqQEKyotPN-c-(9GM0(6XZsa7_6PG;;qyI zz2l65#YDM<pMinliMr-GkQ!WA2CA;=s1IIsCML=)p#2iPUG0BxnT4-k$?Ac*#};G` za=-EinqNWk)WjR`nBQWe+yWYNJ@#?&Wl%hU>^<X)2zyW-(b&q^^2HQVo;;~8-wslP z4Nvfa=+i*b@5ac$5X;NJz~jNdpn*jbwsa0sHpL8L-%~vHF(BEq18O(OzBs6TpfL!L zS;!b>A9DW8fa(SL8<w^}dg7tx@PRmJm>bjxVqjp1u|UmNM|_o9Kw$|o6J#EU25D6( zP-+2%F9?J9APfo<Y-Ypqm53iCJV9!Am?*cv>^dT^-Xa^%zyL}^FdDSqWYZ&71`r0R zhhfmZkZrM$c_x?`E_y+*Qp@K!h`BHtG;TQMAu9t2BkTL%EY&hMjyQ80{FPe1#xXE} zj$r}Op!Pm!u4~RiRt6A8Hn-%t09-AyI5xILpi;}PI0gn)&>3w|8Waw<9<nlkFtQ%d zezcuLhQo&-h<icnDM0R(g3fi#d&tTF!pP>P*lB^?3sQ?Lj*Z<AuhdeN%D?~`X8_Tl zy=I_rs9<7a0AXZ3pm+nR0jWh6$HulXfz0`V!WT5>Ck=J)qKB*uAdIZXz#1~=2U3eH zj*b1qSgA!ko`C^0-Uy>X>0!bnRt6A8*7L(jtA#6`fdQPJi7@<69Apm(j0Tl64<52I zfG~==`vh8c#4<2|!U|a&8~Z_kQVYmDP`v=7LF3#YGeH<x4=8*$5}6(xf|OdyQWzL? z85kH~G$@^|`pwD!!pP=|<mt4mPG(>L)j`POxY!jbkZ^#}pm5mmo0S2Ck@c{cXtgXz zCN96d2vlkTnFk677!3*skeMKiY_7&T0kC_C**B))56N$!^Z?3tAR1H#-FV2#0K&-T zGDv8(fbttL@n#SJ$#0-^3(9XG8Wg?@9<nlkFtWLz^5G4U<<5>UrIs&o3=E*W38F#u z94Nodc*x2C!pP>@*lEGlB8y{Vdjvzw1toKkxv=tV+Cx?b5JuJmaxX{?NG-BBHg-S= zBz!@8`9a|eqCtCuFFa&r0AUn8s#+~+M25qRAc(o3J>ej8K{N{k6T`KKtYD06?uJ;U z7VS7l8HFs4jr}7SVlF6rLFR(e0w{dXJ!EA7VPrjb?6kmTHApS8I5u_!bPWS&A0?<f z1JR)Lu<Ri#0|=w&QPpZmCo&vXK*JXl7a;e7@*2p!XCAULfH1PTpz;Bv2Ba2Q92+|z zMyaJC6|#>TMuXO0%wb|<0AXZ3pnCIS3UT@PhQCrvWhw)M1Oo#Dj0S~6850`=2qT-T za7CwOR|*3I=v+o*aa?S<cm@Vgx`ol8u-Nj5l>vm2^?<^mm&o$>f*&MbfZAA~G!LRd z?w$3Jl>vm2%>|`1bxSSqK1O75Z0tG5)xqVjJhc1;(V+CZ>^Ca|2qWv6k)+hJhRAYK zARJPz%R$Wr(V+ac;5RD+2qT+olcxhV7nH`4#j&wPj;Xg4LE{)igX(ZlIxG6k$^gR1 zdO+a|QbSDndmvn?r7(qo0pv~?4XTd|ezP)wFtWJ`SvoCqlNlI5WgfCPHg*Oy96;#| zRKJ1JF37#}ezP)wFtQ$<Z93q%0I5Y5CxyLGfr$aM_7SEB)W3qUk>x=9zhL4Z8g$Pk zs7?d1LHN!&$ySj6mN76ew49f0oe&AhFQD)S<rh%h1M)`^6B`2vgY>}gf=A-uyaiGV z6T?Mwgh9*&)#)H}LFFgN+!7`>1`tNp*K<=HY%WMGvN$%jMWj+oMJnW62^bBIPbM~o z0w!n&1FA9Mx=zc{6o^`=5Kihtlu}DsDgy(^oiG}d4-=T!7(f_V<C?oVE!T)N*C9!% zr8t!V9CsiZw0;g04jxQw3?Phbu7kKfTrILVHuei>IDqm1C>%g>0@@pv$Hc|}!pM3+ z`32-&kXmGMY-|T;IDpo}gTet+pMu;Q$Hc|}!pM3ai0gyH45SuW92@&bv{FlHDx{wT zqe0;t#l*${!pM49KIpWFrZO;q&fq{6$Hw-EhQu4lZy@)A!U5#o7$!Cb5JuJmO1~gA zAhpQi*w_ilkopN!c7f_AP~HWZJCBKt0fdqD7)a=Y>oSm9WN~cl4WSToL3tTuE~vZ* znLCS#jRAy_^;{8!m<v*iERK!60$QJf{01@?)Mfy!X_~>r#sI>|dO-E*8E9FHERK~O ztJG4T%D@1sKVUQ{-lj3JF@P|#9+0`0h&2~kBN7|begNe`m=JO~hb)I)&Vkf}$~h1Q zu^AFHz+*I^wunfAMoR?LAE2}f@&~9s0EPP$CN>5T2J3+m91{9qKZDdlg>X^|aggu< zg*(VxSo)j9#Kr)^$QnWE52Oa97Fiq{yCP1hr8<=Xyq*q5gTlRmiH!k-k@axcOSN1k zGTbjf%>}suWG;vX^>gZ&*cd<<+1!@9I$(2&$%i+f{d7<n4(fx0@&YJ)tC-jrKp4eb ze`au>9;6mo92;8$YA&c80+|b<LE%ut#Kr)^$a+|wi?^I6G8`TxD7BP8>k$wQ@*~K- zK}>86AdGD81aW=1T4Zr-Yy+sdpl}753ri0HOl%AwjI0Ng9zbe9YLUgUu_q)#+zV=J zf%JfAP&kAzu`z%!vK|*<{gy0for5fnjlBR`E`!oKs9Xk_3krt_CN>5TM%J@KTpwJ9 zgVZ96V`Ez+LdtuP-$3TV!Xb=_jRAy_^?<?wqz0rGSsWX?BLPyMS~4&&fa+5a4GIT8 zCN>5TM%I%ftlyFijbmhSY;2BXh`FHki6C=9G^kDI#l*${!pM3+^=VEjas3fweaLK3 zn-Nr|!o-lvIb=Cf%efbc5PyKq>jC)#G@c8JPah^W1`vkX2ck2e?G2Dx5Fa1r$cEHg zpnVvi`UOOT!hHb~8v_U<>kT=q-jWvzsq2x&aj`*XS?EE}wgAzfe$|siRt6BprH7FC zj%1}4kh!4oCm0PXlR##Ius{l8oS2YV$nqe4AoD<B2BSgY`zVo>0faM<%-zxfaRW## zvKiReAblY7K<N%fgYx2oL{<h6K7eE{HvPE7K>9%Df%YE2Xi)unFOii2ge6kR3kQ%s zka?i?EQ|)3dnb{V0fY<4G#8`~WFG9S6A%rGw_Ay<3?O`hOmji{K<27J(;0{c#oLWU zRt6AONJE4JEZ#tBaD^*O9Hb9qE@(U*MuXz*S|Te02v;DP3)4dk4blfP4>Vo~qe0<& zC6Sc@gfEb3u1AJaO9!+}1koTfLE*56iH!k-k=+I=A3$n|DesZ>A+wh&FoDnNgNY%R zb09g8{XL07El;wUFs5|jZ8^|+rD*-uh%BX+_EZK2&^!Z-2K57XFtIU!Fw8y>4JxnQ zh#a?O$by6qsJ##JJBS9AbNiUs7(f_g9t^V_R&U86vYgv6_j`*h^jsD=&A`AAB+LiK z3o;PtuVVYZmNg$4!DHtzyKvDda_TLe(D($=uy)KLCN>5TM%D*v$AHuj6Q3OAye)e^ zgHi?q1B?dUgCWz-&j7*!nF#kj;bU%D4pob6A2#-yLgCh{a!la6nP4=iP3N&$m;r=W zAeq~cuGDe_sur7B$YMV-l)&KtYD0kh2y1T~U}9qcVPv(S^Z-%=Qj08(jjfRmNe>{k zp!5JUcNY^I0|+DQ0htR@15%4Dj*H!x3Yo`%(V%*75fd8&2qWtOjfXc9Ii9#7OQ{89 z9w_g?Xi)neWF`nBn+r<6Aag<GE3!B?_Ks{wT?R52R33r)RiM3DhZ0#CKsX^Aksh$= z$0a6^12Gpgasx6KM1#`9kwjJo5C+)`(+ip_7xy5pU2y|yE@-?KWG;vXwdal{vNC`$ z$X=Ma89C&+9i|^dUs=rv9&-k<K^VE5LzW}dp5y7+0PnXd^lWG`$c2OtC~biJ0n6Vf z5?L8Q801foeIT6DiBJpT<HHtt5VfGX3S=&b28H{nL{<h62H6YKZ!=4(1r+X}u|b#^ zE*exXfy`5e*0UfQG`@Z*k(B|2J95bjYmh#Wxv;a)Ks3m`7ZO<+K==WYxh<tqEutQf zx&fCvVd5ZtAag<cE@3pN)H|2R$^gQkaDu62fwt#BYGGoyXwce<GkFld@*=Hg0j;%w z>0x7tVOU_I++t#`+`?i8T3eL?+H%2QkgwDN(w||f+ycU&H4h*=(f4)0#Iez!b}vXA zw0;CcgZMCeL3tR&2CX>(nGeDsHJ~{oY<7UeVe-f{=zM1oAJoSH(I7s^To49%1e9Mv z>^u38Z~(F085tN7co`T#@dJuOkQg!sjfa8w$ZJiI*Q`u|nguc^5o!)-UkykPGKQIh zycUe15pqUXLxEBYXq^d6eG=3h@H{+B5K6<=tOVE~)~v8xvumj+P->AaUbhNlCdfPx z4c1bm)B;+!0>WTE1H`Y`%!aL5IZ=QJp9o9k7MNWizX}vW<iwED5XkQ^vq5Rd!BV+J z!&<q8!wQjxN(z-)K>9&(3&NoA2DO#Y;}<55jRv>9Js223@dT0w@nQDD(hw+aLFR)n zNDZi;fz1w(I7}XyHiw1}C=Nm5AU@0vP#OZUO>C80Ky}ouQ}v)G2uKJ6vouJx=rl;R zY$#G{0mTQ14N{cM%fO)PfqiZkwr*}g5hRR3>O+c@T4IWn!1oFlWoD)rGB7Y?K;=Px z28n^($|%6V;92ZiSelsQ9_s1Bz@ovx!p6wJ0NT^Sz@o#zqQC~aDFPG}ETBFT$ZU@y zrIvysrIs1C$}J+zQY|*kQY{;bm0B2zl)!9|niO6J20a4q4FKr@DP~|`U@2B=;VFi? zH#w&m<YEb^JlMTpF(U?Y-20<QsYRh!sbz+pa?6A};w?V*$}ONWSH-|c2<&dC8<43v zuY_81?3G(U;{(hId`pq#kl6`PH)@nBf#VD&m&(h)U_`+G0wsv}0_kHZQECCX31lYB zT_C@M<akPyT6Wk&@@|fUGWd*0kT}R*5ZzL$)B+j{2C+eP?2|9tEgp`_;CsKAXNhCm z{smIX-~n~R11Jp=^k8IQNaJN-F!NwwPy`8}VXS2m0|UbgM`iGw?(UBTm(jGqxjT^T zDS)y;_N7DZ1Eop0VkiS<A97i$0M!ffH!Q3`$}^zmU@NC!W#ATPNH~Jj+wd^A)RaQv z0c0k~JP-|%n^LaS0t#Oc2Jt}{6eifrhLwS5pk{&8&Tvp}f!PJ}t4JBd9&@BJ5af4| zS`Y@6fejAIEj>=kEfJ20GO(gdsRg7TR5pPy$PM6h3DSgwVdB_mP?-l32gN6d2JvB9 zVQCDM20-S6Fh~uktOI3ym^u&*6URn__IrZFL2(G8L41%N5Qde3Gh7g97ZkoAxew(^ zEwC{}P}+s1NuP2^c!AV-GBPk^@-i@36G)TDX#_c~u|UlNnUe)I2jotW*~l1{){yJl zJJ5Ioxf7H=VCu7>=3q+?u(Y<v9g)@wN|jn(K-~c{6J#EU2ANk-snh}r4-f|NK^Wv$ zY-YpKnneX7e2%y%x4`TI`LzKmXM>d1Kz;|A3&NnZw#G%dWr~|}ONlEYtv#twY60m7 zr2!BIxdB^RgNb9KL1_yl4oYhv8pH?L3Bs_n28vsd`5+8ZgDtJW#Iez!v;`6e#UY3W z@j>Q;Ff6U@@lb97#pi){+?PP%3z9>}9+i+V<fu|=0mTPQK8Kfq!JR<)eF3T$rsqhd zQVYl~keM+1VE#Q*snqhv1CkatctXla@1FK*ki9VdFd8&Z`T%P7k!qzDm{}nCTwVqS zPY>*CJ6NC|KjNv}5>N&47f25^Fz9Y5Qp|C1hukZVtcL~EfkGCbGTWtEsRb0Kps<65 zYmPUh4xD@U6zC`xoHo{YL&~KG@j0h(Dq>(@nBWb{D+~-ea}UOX;s#wUsQj8!4GDXX z8l@JPJ3#94co`UcJRoBwAU-l?hQ{3<Z%7(}$w|~GwSepbnF+IRfe*w_S{r`f1K9yn zi%cujK-}=6MyUm+4<w(@%fR4IAYE^O>IJC>;W;%*Eg-u<W`gWvWMN=1sIUNar@-T1 zAT>*Blv*zMK-}Kq3vr)Lc8V~_evmvmJ^;0&qgJT}WF}0$fR}+GfPnh~Y9W3D=@FRd z*J4wv)B>^#WG2Wyi2KaJTXbOg&!twWWs5JweHng`I6TvNdjrURkU8i$0cwXvol*<P zOqhHjF9Sm$0r!1?>ILaZn627!r&g&2WEaRxkbR)GH7NWH3=sQ6p42L}%<)rh`OqlT z65tPUU)<dti$L~+%)!8QkT5t=r_=&66DD88%fJvsz<m>-dSQBM>XceQb}`f`wSeq{ zxX(N-Ee+wmmO7=D7Jo?iSp-1h_svGb`yl&a<{;AxpmyZcL(GK974tGM1QT$dNj=1G zFg-H$N-ZF}KxTsMW8{LQKLap8xKX8EsU;@>;zor)h#TMK%n}B<0cI95?E<w&ph2kx zWG+mugqMLKgn%1wK=p$3Tu@uza-d$R1!Nb<OptvLH-f@24J8~;)GM`w1VY@%5d?AL zrAP6?AUA-_LdP$l_H1ZSY5|!GlP~3EU<f7P#)<~ia7<}XY5~~=G81GUB%gp{84-p# z4N5H*K@j)7fx2(e&fCHu`(bt?(;ZMd0veTCKxV?^%6J(V!U(ueq7l`7ER9MnAiF?j zg6xB&L)7r&X;f;F35K}uLNFwsT;pHY39=t%H!`gOwc|{qQVYmTm|Qt814B3g_w9k| zh3Q$+sMG?o3uGq9K1dvc+y}ylFkI89)WQ*>++tEC4xS6*X;x|hsfU?U!OOr9gUfDc zgZoMoYS<_=DYe+#esUUQCde-)O-d~(O_2U_No7GQ%<MfO$}OOA`<`~W^)NAXx&Uf6 zsBBEjOw9r96=u{1?a>1D{(b!Y+!<Ij!6N}6c6>lc5SXt97SaHd;2{Fg7%q!~7Ff~% zOzPS(uz<%4K*Qf4Ghjmo3>r;JEfq~lEefHKxVsXn+yZLbUVo);2MQl_H-h+2pzh>p zQECDC86*b6mAniLNw~rfT9007Mh(A&W~CO8T_7_-_LVd%wbV4DhF=F%4@$U*fWxIY zvnn+|4eWLD0wAMVsbxa5Qj1BLa?6uO#+Dah$}ONdInhg|r6B)-{DqF6K;2`|s?-8< zGfcjUmw_RJfd7BAApC#AxxOW#MX3d37syPIeI+eQEj2A@{)g(p;(s?!S09&ne>b;a z*AQ?hfD-^Xmf>SWplJzEoGWNEuqXtD_{2jr1$#!h;?e>(KogX7Kz_?;QEHh0a#uJc zjTl5g+VAW;M7%*^08)dFIa(q9e9@-V0`eD3zM7YTp@2XbZD@n&h3RQ&RcZm*1u_$4 z-;7qJmJ_XzFbXayDorkdsPu_YZUN03HAjC11r<Y0jvY9kLu4W3l~$#eJ21VOpcP*X z3@@N=1!;1F<vRs%`ci<TDh&pf0A~+JNPg2`V1Z;ga9D#T>_DLl&SK0A42+<iG9Up> z1{QFLqb5=8dO)-AFg-T53@kXT1#1T7PN-UKNc@2Y0zvCBp`r?~%-z$f)bgQKspU-s zB;FQ8LiWvGy!~@OC|)2Tf=V8MhJ8%8QVS@oVX`&63=EY7;_XB`YP{LBE46^^0+|W3 zZ%?E$c<d8&E+forbh-j+4k$iA>KOUJae)+&;D7)P6@t91&%lBt1sf*?budA)(F`mG z3@ovrv<w?4&1qL^scBbg;fPXhDd|vZ@j|-q`%kQL3ljqqLj#V<D2Et``$6Yif!wXr zf$C?F7-${`MBhP@1KCl_%fK+x1F|P&M<S>;0I7mtX6U`(J~5EE0*R`0Dz%`S4+;~I z90((;1@U1RrY3_`y+tJ!;$F~saUgkQH-Y#d3|fx@qCpsDAIQCRQ1^nyFAt!(7j}=i zM=Zj<ApPj(!`uRrLsttD17Tz}GI7c+pnmpSkK&D>GzgMM#-M&&0`#6_P<lj`1NDUk z91?3lVxYM;(E1t}4H6@SL2d_y7fjuRXo%lHaRv$lm^dyP<SukMkY7Mzpz06VpCB=G zK1d81gUkcn2OXIRaR*Ee>`y2M<Ui2*FBlCK#!C_FPvkjfWCKC&Lgs_ml=u@guM9H7 zrdO#2R!)HU^}LY#s6cTJ;v-|wd@_i?q#HB;fy5c#1~A=#mLniOHvA$AHC$n8HY7vD zVPlP;umz2Sf#kiBB8`zjxy2w>x#dU_L_J6z8H3g=fYu3uw4l2MB!;XO7rUWHsRfi5 zKw$*R4<H(sT97-jg%xZ)4#-~@dN9MQqerO)WH!iLT;U0lL&q^j;w?R?kUHhk?VtNW z@rSMk#24v>*y+%Rum>dG$jiVmhd`b30IC<H9)u_KDz$*@0+|W2ZwXW$6rSL^LJ7UD z&|+W-D#<DEE6q(xE%Jx76~XlftmcNdb7u4^wX6W8!Bj|mwxlVyfYy)cMyvx-AnUQ> zC27hnpz30k@`E2BKVnlP(FX|wo_?hkkh@`Onn35G69|JVP`xlcQ~H!zKz4!51lhL& zDi03>Q3eK3JI^oF*U2>~-rp@g%n;I208Jo*Ix?`Dkbz-NpHj=3KBbl~X%IiJNQaDp zS}pkS2;^3noyhbPsC_s3m0Cdd!{nNI85k}R@XLaJNI1asB=jq_fb0U939_#QDv!r6 zM!5Wv(XZ4}(XZ6<Azis;Nd#-lk_^b$A^*qrxgfW~>_nzFK<!&HL8%2~KTHl3p_d8x zC1(PvUvwrYwSepbnF+Gb0V<EjFF51HWP(zQ%LJvCHyMz4S&#|om+_h!+JW2(b0;!g z1GR6;M5Pvx{V=&!UIvC61pE>+5!Ek0CMdOl>;jnyvX5t?Qj5q$NShnhuT_BR0r?N! zU*!bnKS;9~oXx-uF|3_Yl$1D8sYPR=Qp=A_h=12)DYt<7v9%|@dw~1{^9wSa1GRt7 zB&8OR8)0&7ybKKY3HUc<5~_b+OjK$C*#$BaWZ$2ON-ZptQ2i?a)q~<+4X}SvvKu&k zf<z!4t&qq7oE<HUGU&rZr51@vN-Y}MkZ`z@t=s}ySJ9xwascE{m>-ep5~#aErYg07 z+zyj#=Vf4cMIanxrlN+!he=8;AiF?jg6w0NtkhyK84?b#HZMaCsEy3Ppbo2qVHP6M zHj|ZFGNAh0K#Lq07#Mh<`ZVz9E13*&4=9Y?j2IXg#lhjL!N39uOx#^v<i3}J9RrI3 zAq}8z6KE<7)Jp($*6bnuE<)N+?9nCC9(W%dqydpM@b$rwon}Rx(?C9gbw3qAHWA|& z5}gL}K1Ql#VE8dfsik7FQVT~eB;D@Gg_KwAy)}zK=@Kbvz?nMGv?nu7sRfkQU=kgm zvoQ&z+b2-HAUzGzZY?XODz$*@0+|W2Zx2)+l#XEK6(c_bLvnszaY=k~VsQxriw$&1 z4Y(YF9)7%Gs#435sY)$8c@Tdb$Wv|swV&oPpFRe1C&)f@`~_;4%ygv|klir(PF@Cv zpM?A|4U*nrdJ3i~wSepbnF+J+N*<(6{`LRWCYU;OdJWVZkbgnFVgEG8BG4VQIQq`8 zK?Kk!p@Idda||_b!8E0o9n+LrH1Z+-zmpF+i|WSxMg@@npvq9FFHpNxW+=75+ze9C z1v*oVfdAi2NAv%5r52D~ATvSswM<uP>6s2Ge_-)A1F8q)S9ran1}-N+S<A^YBskvR zjgnHBfuUl$Qp*BRd=@~$fuj%-4$`ZuOF{kw`41icfx1g)wo(ho?J)UnUIqpxPyB1d z3TC2)L&XfG7LZ*aGeP$8ycKUzDTK^R^hvWFf|-p@Z<(RgvS$V)yb@DVic*V<8BWYl zYPkRvgN5Op84&wW!jKIdhM*A?P)PzV7(fXGGUf~#lR_B;1J~}LH3Xmn6kObBFtCK8 z3{As_%3x-Ks&p(v)7T4@6*H7tp3G2cSyKp!g9Am7IOursbs{K?(ftnU`~27^03P%E zfE1oSj0_AtybKH?o(v2i_oC|qwNOA}$ZJ#-_Cw6En5ERR0%{h>oL<mcPEQ5~Y<**x zImqYRdO*#2GE1oi<|dFieY^||VxEw5BS3Z|W0*O}_i2ILcEW<O^~gB}FoxZ+3o5&i z^}@u7rD1wO;}Zo?w}Qk#{sz$?xAyZgFo+ZIbHgl1dIITbfQHwG*-9;-v<ngg;R(D9 z48op>`52HG3^PMLGN%+0*D&#h*-9;-_y(B?i*ufG$oO+??k7Qz9Wb>p8k7z?W<%U# zGDoQerVk`Pk(Yr%$`kvUEU>wLjdD~su*^|v0oesI6J{Sz1*FgCT^czZWCzG>bj&jc z;)WY@lv-f=Kx!uOGBC&zC=V7u^@7xcaK{{_7LZ*aGeP!2=C~}tGp)$;)f46@wFFc^ z+|N=838#I5>M<ZUfXqS18=&^o%vEXunG2Jj%*((aN5G9Pb0Pi%>6szX-l8*CsRd*g z$V`xZ5I34&xY1;;QcFN3)Qwe;K6dA4?*Nb+KxU!i5U4#0^ORaZ=ECHs@G>yS6L8}T zs9u<!3v-oPKz4!51lb31Bh-n8h_rcQu2M@x6~v7^)ygfPCTqs*tGpmLz|2CXe?aXy zGEb=mWG+l@DlY?r0s%Mn%tM4DNMFf3r52D~ATvSsp|}y$CI%^DU|^`3r_>Tt4RNDD z4aAKGB_$jnH$au3P;;R6WXxA;0htSvoW{$*ph&=t2J=zfC^28D1!Nb<OptvjZZtuJ zqr!ZpmV_GRmOrghEh4p$xwUh91Cu~*fZ2~sJ3#H>S)kMcG8ZN{otJ?@iGUlgK=s1( z?3u6B0<sHaCdfV%H(DUvcx1j(OHM5$92M#yd1ghD?^=)>U}hoHPoVZ}SfJDbG8ZN{ zgO`CpnSdKB7NCY>!UClhkX;}%LG~fL(GY1JO2z`EmYh1M8|#%@Kx^iuw;T-wxdCQB zGTi~SCuE^g3&>oU+)Q2u1{DHslv#-CMwW$2Eg-u<W`gWPcB2uJ8+jHgwe-|O-008% zNslp3=XpVHfZ2~s>p<=Ku~4Z6WG+l@7B2&XDgiehfa-<mS+P*51!Nb<OptxZZZtu1 z<A#MwEfX3bZggpcxRK}ob#9OwU}hoH7ohgcS)|kgG8ZN{o0ow>jer|d7NLft&myH3 zkX;}%LG~fL5wvOx)D{DoAF@cPWlAH&jUG*qHSrrBUGW6D0VI!(OQ7~RELLg(nG2Jj z!^^;+PQZ;EixF<z^T)X5!y=^?kX;}%LG~fJ(Ga<w`LRf;Wlj^sjRDP&Jma#&bS=mY zF#C~d38+0!7Av)Y%!SF#<z-;dAmGL|P`xlcQx+?=fb0U939=8#jYi0BoCC6}S-GX* zEMrSR3*-#qg@31YfZPBx3z^;nwWni=QVYmjnA|*G1_n(6ZVXt02uF}UizP}eAiF?j zg6u<bqY1Jb9hNAyOlg6HqerW93#id8Z(v;yas$X5besUSM`x*03&>oU{Cr*p1}y?^ z`~uYr({pEuQVYl~keML+klbj2?8YZclv>ubLfn|prrZKrF3S8wH~{1Zm|4g)%Th>K zTv)2q0x}mSw}6*{L7RXZXF&DB^fWA0Y5~~=G81GU!i|Oo$ZqUds?>6z4dTX<c1S(5 zKY!_YkQ-oTA=4|M_LMABY5|!GlUvBkz@S6GjW)|5{)6dJS*FwivI}G;$UcM{jZoaE zvrMVwOgqGl4IL0S?vqYQ0=WTZ7BcMvwMSyPQVYmjnA{@Jo+AQod;rx8({o~(QVYl~ zkeML+5N-su&k%Ltg=I=DH##70?CFGz!K&VjUkh>r%q(R31Js^9%avL{=ECF_gZ3E_ zaAV7I)NssMuG9ju3uGq9K7<=V?OcQ#OO`9O+~|b5u?x~CoOSiycaR%k_9N3%p!OuJ zP-+303zJ*I%fMhyz>OL!P~9l7La7C07syPIeF!&#+K>o0N~}<7xzPo6V>e`uO!&>k z?;tn8>_?_8p!Tq=RB8d43zJ*Q%fR4Bz>R01dSQCDtWatJ*#$BaWFLwfk=nR>Rw%Vx z=~iyJ;l|t2(E};NTMD;a2Dt%d7BYPYYR`(5N-ZFBVRFlO85o=hxUpa*YB)x$RB8d) z1u_$4ABr21+PDcTm0GU!K*F)37gArV7Ks{y+yJv5nQnmE<FiVs1!OKvZaFUlgEIj) zimXC)<DZpEEg-u<W`gWPaicLJu31(owcO~1xUr`X5{{huRq-G<!0bn+RiO5KSf$hg zG8ZPdf|r58g@7A(K=s1(ELf$~0<sHaCdfV%HzKveSAg8ur`+<Rh`Xhy9}<pIKST^c zZh)DEOrL<-Gi9|>3&>oU+)7>s23G=Zj9HBujxMW}T0nMz%mmqo;zm<MIQpzsYPr)7 z3C9T&AbF;%^WJrk8({V$(>YLkEY>KsfXs!-t>R^1a3kPGhBXK`dhoWiyjZQ&0<sHa zCdfV%H<}^b_+hnD%Z&*TH}*_~^j#YnZWVys0J9&N7J%AwXN^(|$XuA*YS2Cw0&ZLa z)eF+ICp)&KXN^(|$S#nXAp20<XpV5>lr>5%4<;(N1mrWfOqm4PE2*FC7zc6#$Sicc z1!_;jTBR0{xiI-PybKH;1l;Jc77>mheFkflT0nMz%mmqo;zp!Cm&ID8mJgF4;kaZn zq)l<+&YT}0H-OAR#}QC_RMsiAfXs!-uLbS9A>hV0P`xlcSJo=Efb0U939=8xjh2XT zyt7uRg=LCzONNYi%Z@3KaJ+g{BMsyRm|4j5AE-Si)+x1s%!SFV<7Hs*BH+de>rlh7 zVx3Y8$S#nXAp20<=!kG*!#brFk*SbyJTVp0#=XS7WhclDF#D0|1yFl()+@Du%!SFV z=Vf5<Cg4Vs^{8%?S+CRrvI}G;$UYP|Iw9PsvR<i$XPR=$A1<ku1Jjhj`(c+Yh&u>! z1I&J8+68Klzy_rjkhw6q4WNBG1l)K7su!l`z<Q+?kX;}%LH41z(HY^!6QJ;z4hhE_ z(;?~c+n#ylAUD9wLZ)9p?b)(HsRd*%Ol~7D1A{LCH`Z)G4abxXN-ZF}KxTsMLvf=E z!i_l_lv*riK-~Cd1|%H!=7!D%xdCQBGTj5UCt{;g3&>oU+$LTI20sFBRM?2>Mvje2 zEg-u<W`gWPaic53jRG5$S^{Q5+{iKu;zlQ@khvf?!0bn+4WRb?*{IY4G8ZPd8MGgY zfE$lM^}_V5*{IY4vI}G;$UYP|x*^=SWusC{#w>^%WoAR_>)lJ|`~bNDW)?Di1!~WN zO-d~wb768@KzpJHxG`fBYB&aLQfdL&1u_$4AF>;f$9p0+fyMxpTNG|Hw#dwZxN*(& zfB!*lfZ2~sS3vD?*{sw8G8ZPd6|^skfE#%>qq_0SCZ!gTT_7_-_Mx~Dsr~o|<i<JB zaGVPnr^vecO9A8tnElAK4Ah<%o0VEX=ECH*f%ZlbaN`E3UYMR4o0VEXc7e<U*@xmr zr1s;2%}Ol=b0Kb2nFs05JX*KqGRO@uvykZnP<wi|D7Aphg~@FP?T;eh#*i(j;b^l( zsRd*g$V`xZC~ib*Ke}vDYAKipb>n<Up2=VHq8j7|nEl9f3e+Bhtx7E*b768jK>MQz zxbX*6FHFyaElMpQyFg}w>_c%QQv3167NwSs`4BhSEKmmT3qO0zx(4J1m|4g)$5u#K zT-mDB0x}mSw-dBKihvvEK=p$3{4nrtY1yjO0<sHaCdfV%HzKtkd$uaIELfo2(y^Mc zC1jy;3+PN6Zb6UVAUA-_LdR>M_Ec<BY5|!Glivl}BSpZC4%;C9gXz)Orqlwm3uGq9 zJ`^`1wI2<(DYfib2nol6ManIpRUQgKr|y8<05c1j4uIMtvt6kLWG+l@H)x*}0XIH@ z>V@e!vrVZ5WEaRxkbNj_L~1`?*{0NTXA#7W6Ba|lQTzV-J0Lf}%tEHWK<zoOU8x0R zE=+C@F9Sma0XKGRM-9h<?Mf{myFg}w>_c%QQv0!DyHd-K#Sk~HS)$wm+CecX-FF4Z z4KVwW=^0RaQg$e{fXs!-?d4@)h$P@fogJud6xpHF0<sHaCdfV%HzKtkWk7Z<g}Cv; zQb_suC4)s5<OZ1i$g~aA9*&(#Eg*AYa{G807@`Qc@d8vYOwW!TN-ZF}KxTsMLvbTg z`|-dIr52TC5I5df2I&`CU5Pyias$jPWcmTro;5p_T0rK)<o5G2Fhmn@W64g`aE#fh z)B>^#WG2Wy6gMKZA5(TJwP-Adxbe<%NL|=rp&$x!1I&J8x&>-az%Hd0khw6q1EBqV z1l%aG3)PJbyOdf$c7e<U*@xmrr1m4nE~OTY6;L;>fb<KQJ3Bc+Zh+a3Olv^x`Lau? z1!OKv?jSD%Lo5L|?t$us=~=Q%sRd*g$V`xZC~ib*Kd#xO)MBs_;>IT{m0Lh(cYSVu zl@4+P%q(R34Ah<(yOml%=ECF-@iH*P5pZL|Zq#t}*sat8vI}G;$UYP|BDEg_b}O~S ztb({vV6}1!Xb(qdy6*~*8({V$(*;m_Z1yO%fXs!-9p+_Vh$rAimOZF$e6w4r1!Nb< zOptvjZbWK7e%Y<m(z05)rNN4~#bS+e3usMAZ>sMKkQ-q3Bhw;KdmijjY5|!GlRLu8 zz>q+|jVqvfVR|O)QECC%1u_$4AF>;f=i+AUQEFMUM!Dt0Z`PKCwUEAR&)3r}AUD9w zLZ){>?P=Mo)B-XWCU=yVfgzEA8-4bohNH<|r52D~ATvSsp|}yL{b;jSsb$YvNL&}J zQ*Hq*UCf``@E+s_nEl9f4AdTteM%_)I0o8xO2CaDpn75E-Po(t0<sHaCdfV%HzKtk zAM90XIkOJp#)kEfdDn;L>Q*2(z|2CS_d&wq%s!<Skhw6q<Gc(E$pqXu1*#XMXGv{K zOU*u|7LZ*G`;=Nh_Mx~Dsr}fpPpRe2dWahrY=Fdd_AkR_AUA-_LdQ#>_7v=gm<y9X z!OOsqLcom{`yu{==~39P)B>^#WG2Wy6gMKZA2s$XwfxxtapQ)KkhnhQ@hbx42AEmM zv<K84kpoICAah}ICwUndQVF>64pc8p&yoE~Eg-u<W`gWPaU)Xu@yvdu7M@KIHy+po zapMst&6OZGz|2CX-$3ozaX_gBWG+nZ6fXlq8UZ&p96*F)M_p%2#sQ@kkX;}%LH41z z5vl!Ha6qX=W;4W%7dAuMW_<0ddO>c0*^f+5fZ7vtP^krEE==w;F9Sn50XM1~M7R;8 zkLRFL3&<{znIQX6+=$eE6gjBWVzC9{#y49a{h0)N)u|vifXqS1CNO&rDYbyig~^`* z?WZQ-#uG5TP)!>SDz$*@0+|W255<j0?Z+Jlm0AL}Lfpu*4HAwbn{I|O976Ro)L4ca zP<xgfQfdL23ll%f%fOIHz>PU*W`-P6Y5~~=HuI2D3yK?&+K(}Zlv;AOLENaY9kQN! zXLsRFkQ-q3Bhxiddpr&+wIKWB94`Yy76CU3fb>8Oo1r_Y<;NkV7LZ*aGeP#DxDl!S z$Z%MxC1pFrjS@SQTR`Wr_NWIGfZYH!51CSc+VkeHQVYmjnA~|@28L_`ZrlRZ3)3^_ zuu==iE|8fZ`%v77)P7uYSgECD2gHpQJ0X3AF0XTKAUD9wLZ**E?U`^ysRd*%Ozr|N z149l0H%1&mO+OAtlv+S`fy@NihvG)0_M^uUrIr;tA#RM>rQ8BK@BOjH21}3|VD=-^ z8Blvnjw-c)%!SEa<Yi#UCE&(CP`xlcPmU<Hfb0U939=8xjY#dsH%F9OF6>fnnemRX zrDZpyZB`V#x)<aIm|4g)&rwKN+&HS#0x}mScZrvQA&-C?7eMvG^mH6mY5~~=G81GU ziW`yIj}wk6wfxu(3CA^iAaldZG!}dTxdCPtGQ9z6Pt7r<7Ld6xxy!r^4EY4y=yD9= zKbRh!V@fR`yFg}w>_c%QQv1>5m{QA+Jy199h4i_kB@LE?+yFBRnGS*4qi|fQ1!OKv z?h5EE1p;n-0o4oBbK#g$3&<{znIQX+-Dr%oPU^-nrItT?A#U8T57Kw#DYQ`qxdCPt zGW`Q;&ynLwEg*AYa#wj77zzovvFA8yIF=k&Y5~~=G81GUiW`yIk2S}YT3Gf&+_+;u zWS^9p@)3QI8({V$({rHqWSmfH0htSvyT;4FP(;9u1}6}1l=-FAB5^{g1!Nb<Optvj zZbWK7Dx3h-yAU^?H~<+pGi7bO2XX_<eq`DKY7fszr52F6FuCiz3=G8t+;|157p7;= z38fa0T_7_-_Mx~Dsr`85gi?#nL5Le49E6NX?O(o%0ptdlS;+Jgs687_Dz$*jg~{FE zWnd^F;KquRh;RhyOE{_20<sHaCdfV%HzKtkGfpbC_#A?`k>N0;?1{PRod$9P$Q*Rs z0ktROlu`@GT$ub#UIvCz0&bK!h3ZC@Q%Wr$yFg}w>_c%QQu~qTlu}E{VTc<wjzHFO zomcZb19Ah*eq>q)YR`{TN-ZFBVRE;485qh4xbXl~FHFyhQ%Wr$yFg}w>_c%QQu}ek zDW#U4BM>(_9EJ2}th6+&KyHAUg-l<7+B4_0QVYmjnA~k%28MD1ZcI6i8je1vm0Cb{ zfy@NihvG)0_G8FtrIs~EA#O}K2FWu?DoMs5H^A&irc0pqIGj;x0htSvyTi-CP(i?r z9A{A7_~Eot3&<{znIQX6+=$eE{Bc^T<;XFJ8!L`O+7!+Waj_sb!0bn+C7|{^Iiu79 zG8ZOy7j&))0XMFJ>V@f<az?2IWEaRxkbNj_L~1|IIiu9_;yA>Ob51C?fX;=HDVEX# zxdCPtGQ9_CPsdrM7Ld6xxqG|}3{?c&7;qL5js_E_wpg51Y5~~=G81GUiW`yYLWi?T zEfOaoZai}m((bvuZ1xY38({V$(+N;}bj~TYfXs!--REUss3zdXFHpTOJ$KG3wSepb znF+EF#f?bq$0wlhI0bRzms1co9#5V91LOvnS;#cYIY?MsIH%MCG8ZQIfR}-xhJYJq zK=s1(G@Mgv0oesI6J#HX8<E<N9p{u<GEPI>D02ofw#UEZgapV9Ftd>96;OLh&MUQm z%!SE4<Yi!}CE!Mz^AP{R^r)OyY5~~=G81GUiW`yIk2>d-TBe*)ZUL$DIE!#2$PF;F zkZB*NJrWm`T0rK)<R0-dFw_xn;{&K(kRFNiN-Za#ZUmVLvJb_LNbSc9=apIxoP~sA z$vMax&74h!+8{T8%tFT>p!V#!pwt2~7bgFhmw}<4fE!ybpoU}41*H~{T_7_-_943w zc@2BX1*MiV=OAuuI1gDTb^P_AJ0Lf}>_?`jK<!DmsMG>77bf?Fmw};yfEzU~BHXy; z*3=e(i%KmZyFg}w>_c%QQrk@8A}GuuZmhWgX@}3%Snvhp2AKWGv<1{2mP<-4Aah}I zPk9*_8VR`Z3{)>n&z6fyEg-u<W`gWPaU)XOY!Aqd7ocvu2x*54{tz()xdCPtGJOYX z&x%V*Eg*AYa?f}f7@7#UvEULS96|abE-AHu>;jnyvJb_LNNux(OG+(gE<)Vca0${5 zf1Sai3vvU<9CX|Owa4eOQVYmjnEZ2I28Lz=ZWOtUaHG%PD=mL6DYby?0+|W255<j0 zZ8Mh3N-b9|DYqDC^R{$chPaWr&_)&H2AKWGv<lRo50{l%K<2{aUhpz7v=DIP4yaz3 zo&}ecT0nMz%mmqo;zp#l*^0|bEq5+M!g0bCNL(9Ui9HB%1I#RB`UKRTDOZ$QK<2{a zUh*<9v=VS*%oRj9g7mpuQECC%1u_$4ABr21+Gajilv*BKfw*zXRmeP7y@i4($PFNK z&~Xmb9*e6=Eg*AY@~?Oq7}^N9k>M(;8(&;eY5~~=G81GUiW`yIW*<OqysF$1(<{_6 z<r>6|e`-P`KyHB9k4y_d?YVPRsRd*%Ozt%=149P^H!gwdh3V<Js?-9q3uGq9K8PC~ zot#}j7_q)*%2lP72iG9s_~Sa{JTWcKoPQuUz|2CXw?OTwxu(<tG8ZQIhL?e16#+N8 zTtf{<gKJ7HAiF?jg6xBw<qF!VfN-D1HKi7l8xZ%sxB(g0JDk5u3S>XbZe%(HYKP2q zr52ExFuAw93=FFYxbF#6FHFycYf3F3yFg}w?1Q)u^-Sg)*OXdRZbIC5<0iy?`;-=# zgY1WygG_&c+Og-lQVYmTnA|&F28Oi++}Cm)HT(*$E46^^0+|W258^&!Gmx3E{ZSRy zm0Cn@LELxZmNMw59tN(;n!_ObLF&-)6sR3BH<VgHX2Rs(^D;23^TfX|U*!g>`vh(% zwSepbnF+EF;y%M<keM*|N!(CsVYv-)-;Uc5_ZcTWJPfiQqz)aMK<)T*L#YL1CQSYV zF9XAR0`5Bk)eF<J;f7KR$S#nXAp0QhvoHb4!`!#yhEmHHsQXsjf#i?tYC%Uq_Jh=+ z<10`*=G;_j0htMt|H#Y0uz`U4Qf{J#U%*YJ7LZ*aGeP!2+-C|tCl}_vh?`0+Pwqg% zZ^m87`5Vo~x;h~HVRj?aB~UwTZYi~Z%!J8(;$>jiNWgt8w@}^p;iggx$S#nXAp0Qh zGXS4p19RVxn@TMg?n2zxat{)}$y=VD1=$a?8<`e?+HvQWQVYmTnA~Sx28K-p+_wa( z7p7;zEu|KaT_7_-_CefdlmwE8xo^fTrIrKtAnq%<4{=|9*sk*+`$6i^@fN5ZHMf;o zKxV?^zwk0JY$o77m)oe}XK-7o1!Nb<OptvL_nCl>GKQZ?Z*g0xWy5`l`%)f2&gcsL z7^4HSA7(c)9RjsO=8jSe$V`~rS6&8&Ed<>61gaON=fZ8J7LZ*aGeP!2+-HQ6e{bAY zYMJo>;y#~;ko+M(@v;ucewaDP^cScdd+sQ;fXsx+edA?d*h;{CEq74Eui%bS3&<{z znIQWh?lVIPzlu9bEgcUb?z4FW$sa3jROy23huMuxPl4JIb62SaWF}1RJ1+ynHUjQb zxr^#PfxAjAAiF?jg6xC1&j`hR5_gqaN*+Pnr|}rFCSCO8j*TGuVRj?aCQv*6+*N7; znF*8o!OOs~oq+p}K=s1(Y`Ck`0<sHaCdfXh`;0;Iu>7&(u2M_JV~G1?o<QQ)FRscM zWIsq9I=%w6W6nLL7Lb`R`JcQD3_A$8FXbL;_yyckY5~~=G81GU#C;~FATwd^i@2xM z67dA$KAxwL_?`amzAngqkUDf+0=2{DzETUwOql#HUIvDp1l-4RAK|`=d52m)+*4`+ z*#$BaWFN$R<|yU!k9$fjE>9uu`|%VKe*a&#x`6D5*^Nw#K<&75U#SITCQR-(F9X9a z0`6M^)eF-z;l5G}$S#nXAp0QhGfV`@!@_UIeWezYXAt+jcm`?fze-%y3$h=i4jpfS z+EMdBsRd*vO#Tlq1H*0t?sIv72tSZMg9l12AiF?jg6xBwm2YkVav{up77vtKOrAsC z_Z-r`vQB-P1+pJx209Lb+9C5$sRd*vO#Uw~1H&Ey?t22&3)6Gqfl>>|E|8fZ`yk<G z0J^RRUOwM=pwy!BLb>IR9dpZ#7m)Z>Q_flevL9v+GW`W=$DW5uEg&;ta{qW481@oy zU&}+(@GE!-npeqM0WuS0AJly)`M2VsQj5q-Ncf$232|RcFXI-F{V=<c=_yb<Vjd~A zfXsx+{pV$1*hj#9DvwazC-6wA1!Nb<Optw0_o1|}BpxZXu)Kn}Z^tWT@EM{dRh1ba z`(bt?(<V?m{yb7@0htMx<6~ghPr!Xgpn73?Hat>l0oesI6J#GY_w9J3)WY!^;=Vnv zA!A%+(!rNN_QT9UrmsNlnDbbv1!N{n4s^EI0Rrwzd5ju<0gshhKz4!51lb48AISzt z;|URum0ASeK-_oa4W#{&$t!RGWIxPqWV!@uhs_hE7Lb`RIVL^^hJys$$MOW#eIFhx zwSepbnF+EF5`Gpa>F)=~zPAwfZFviEU;1XDqagcXb|cdwP&@8CQECC136o>yV_-N$ zz<o=gdSQAdJW*-^*#$BaWFN$Rpwb1=znt+zspSLIeM{a!+E@OQ_UnV}hna&+Z-LrT z^Hiw?WF}0Gg^z*ZFah_uJVgyZgQrR@AiF?jg6xC1&j6)<vv{i1a^oE&{CeI)>bJ|+ z?ihgVhuMuxhd}L+d8X6?G7~1p%E!QPgn;{=K=s1(TzIO~0<sHaCdfXh`%wCqH=ZiB z9C;6MU&RN=*?S+&MNWe3hna&+e}USu=b2Iq$V`|V8y^G1Q3CF3d4?K(1<#aPKz4!5 z1lb31p9M<$wBngk%bE`m_a%IUgrDhOZbOj$FuRfIDNs9No-4J0%!J9Y^D!_SBj7%j z=cw)zc&^j}vI}G;$Ucbs%uwQ2;<-}GjE@la`Fw(;KcoB*Ly-M2yOC)Vs2zWvE46^k zgvoL6F)$n_;JzbJy)Zo+o-4J0>;jnyvJc`uLzMix<GE5x!zYOQOg=;E4^Bb*tswhh z<{;Bopmxl8q0|C06DG&W$G~ucfcsKjpoU+-3#As2T_7_-_CefdU<oo4);@@Mq100F z8R9;bFOc%(`emklAp1e;&~XXW4x5)sEg&;t@?3lj3?~V=kL4w*`#!u-Y5~~=G81GU z#C=96@%!V2QcJ=Y<(4n|#9KtZLfq$Lb4UtgKg@1qS_EpxotH{2ATwcd+<XiSrwF)j z2~;mk&xDssEg-u<W`gX4xX&1LMKrwqGUKIEOTbr1__2J0q`!P~2NRI}FmsUUEl@jZ zUMaPJ%!JAD@G&r)Cg47oSE%7<@Jgu#WEaRxkbMyM8KK0l#Ve&2i*FG3z4-<SzmyGS z8X)^&b|cdvP&;H^E46^kgvs&pF)*AV;JznNy)Zo&UMaPJ>;jnyvJc`uGnDqrjaN!7 z8s8!AyYn5AKmJT;(g4{HGY6Ue0<~k$Yo!*DnJ_s%J_d%f1l-s18a4b1UMsbL>;jny zvJc`u1C;TNiq}dl5<ejBJM#ll{vAHC!~|qN%x+|Q3e=96H%cuaGhuT4d<+cd2)Iw> z4XXPD-YB(z>;jnyvJdJ$l=4~PjZzECPl)?={Dg#G&(Q_uAp2o<Bhw~OJN~>;Y5|!E zlM~=$U^q{}eMg{rL3*C7+TF6@jZzE9E|8fZ`ylQ!Luuddc%#(v1?s*PzaZ(ae|gO` zko_QY(D4<h9dq6)wSdfo$qVu^FkB$uzLdA9;TP~$sRd*g$V`xZ5cip))V~pLm0F(s zQf>jQx0&%9;=X$ag6D$lhuMuxmq6{Xd8gC@G7}~z#K*vJk%0SH-l4kh!&{{mkX;}% zLH0r1XAHhJ99BO6c&pTM<u@dLJN`h@pVMs)Gm!l-yOC)Ts2z9SDYbyigvkl>F)&;r z;JzhLy)Zo!-YK<!>;jnyvJc`u0~Ghoc&F5I;19%oC4V91--3itGm!l-bCBsRP&;bg zE46^kgvp8UF)&;v;69i4sNrYuUa19S7syPIeNgwIl+PCLm0DK(g}5)~A7uV|wztkQ zko_>bk?9bq9Wo!3T0myP<V5)x7_Ja--xH`_n4Syom0Cb{fy@Ni2XUVn%AJ%qKz{fK zabL)PNcuZJ+iM5NewaDP^cScddp;<&fXsx+iSaQoTqWSXmJg`mSMWip1!Nb<OptvL z_nDx?Z^Z|tmI?orTMlHiwv;fafbSfakzQ;LvL9wQGCc)qN6bg17Lb`RIdMJ)hHC`e zr}7cieF7jeq!*im%mmp7ai1AV{7QUOYFWXc0zQW~hEb&jbbhw#^j+p4`(bt?(<V?m z{(Mww0htMtli*`uxK6-*N1%FPdNzDiY5~~=G81GU#C--R<C8l+Dz!{ugt*Ux2@-zq z7%!QF?1!0yOkaW8G3S#~3&>2EoFpFu!wmxNOZkKvegU79T0nMz%mmp7ai1|t`yk?z zQcDdJ#C-<LD&YJ0YPme}K=#AzMy5-kcG!GYY5|!Elau0OV7N)ZeJr0*-S^>>QVYl~ zkeML+Anr3j9sm2J)RMytai0PU#C_9!{;vbs53?JY7J=Gv=d)4^$V`}=G#>-QEduUa z0@VxCGvTvR3&<{znIQY1?nBAHGd?S|#IUHev{Z?=2(YTOfR3y8iZeP1vL9v+GQ9<A zN6i<d7Lb`RIT=0%hT8<(=kf(L{0zP*wSepbnF+EF;y!bfJ9#a>D7Cn-Lc;F{t4a$$ z0|UdH*lB-2_QUK(rbD21$b4050htMtljUPzxI@5wPoR2XdM<oXY5~~=G81GU#C=96 z^IJE*D79FyLEQI-4HCce*xV#R_QT9UroTY#*z;AX1!N{nPL7X(;VuF9wR}Z{-;&*q zEd^hdT0nMz%mmp7ai1wl{;l|`)S|%-ao-(wNd8rf-C+r`A7(c)Jq2n<%r~VLkeM(! zc|Hb)dj#C4@(tlWkUoKLN-ZF}KxTsMgSgKawf*-^sYQST;=UssD&YIf4$f^|3$h<% z20Au@+VSU`QVYmTn7jfX1H*j+?mGh23)8dVn^FtNE|8fZ`ylQEoh*VFAKC%Z!wGTU z7ETrL{CV?nS5A=qFmsUUD<JitH2Phs1!N{nPLYp+;Q;~nrF=&Xzku&bEg-u<W`gX4 zx(_A&MSNFk`2cm_5-v#ityVbIG6&5pm^(_K;x<2&T0myP#Fh9M7#<REAIlF^_kH-T z)B>^#WG2Wyi2F=X`X4{OE44h}Qfc|ntJE@u8xnqIl`mRA_QUK(rbVE3-1(t|;s<3u z28Krj+_wa(7iQjsA4)ACyFg}w?1Q+^45fUT@k6QQ0=G&F=zgdc9!UQ9Q@Y&-WIxOt zWO@tKj+&oJD1K1kV_<kpz<n-1QNz#Rr&0^ZE|8fZ`ylQ!Mk${yek!%>;DMyS9A1d~ zc7DBY1F|34T`+bC)DD?nN-ZEWVdAQM3=B^QxbF#6FHFycpGqwtyFg}w?1Q+^6lHwq z#!sb|1-uaVh44Y#_f7Pv4ak0&Imq-Es2zKLDYbyigvqJ#F)%zO;J%h$sNq-eOQ{89 z7syPIeGvCqp!AO_ekrwd@Il;X!>`f;x{DyJ_`E#Gewf|J^c1KaF~5~sKxV?^)cF_~ zo)K`L%5PNn3H(-S0oesI6J#IMeJJfyiQh^s4g4xC2_oVxCIXQB8@-}t4#<9(-N>{F z)Q&&Dm0Cb%!sImg7#N-taNiNAUYMQ@zm-}*c7e<U*#~i-DT@1c{8nly5P*cAiXfzY zYH^#x7Gyun9Ax?m)Q&lSlv+S$!sImh7#Lm<a9_$F)bI=VqtpVj3uGq9K8X7aQTpc* zAbSKM?h_D#xNk?gi!I20nBB;93Dgdoze+72GhuRCd<+aP3Am5tFRJ@K{84HF*#$Ba zWFN$Rpw-8S`s2qRr4|n%i2MEsskDIZTX_3{y&q&h%x+{_1Zu~fze+72GhuStd<+b) z2)J(vR4+`=guhBHAiF?jg6xC1&lF|+YQ|rs76W03`<@6x(%+NMbqpZ;VdfyyTcCE- z{8MTHnF*8A;bUNUO~8FF|4_rv;Ga?p$S#nXAp0QhGeXI~7XOr56ht8IyCMQ<|9#L} zzZPUa%x+{l1Zs!Of29_XnJ_tBJ_d$21l;!osu!l`!at=JkX;}%LH0r2hmt>T{8MTX z5mjk%c*WUrLR6&%bRWsdGn4j!?1!0yOn-seA;F;90x}aOr^m;@@Ror4TK=PkU%`K+ z7LZ*aGeP!2-G|cusQ9nc!XpL=zXM_r_hkzdYzEm6vzz*~Vv7WWa?6YVpm70^-Hh<@ zX3)6MCwB%08wLgj5bXq|Vd9|586*zM<RE$`lH)*XKwMU4Mur6)eBeHF$uGqgk>847 zHb^~44U7h<1@S>NvYsET$}Kb4KyG7T`0NhJt1ud*7NjR6BUK^5KiD%uAulmERUs|E zNTDPnvsfXsBsEtdvsfV|wV)_9Ik6-)MNh#quec;NF-1qAv^Z6vBqLS9GuU6jSzB8n zIX^EgzbH2`uLNw073h#HkOiZdCLz$kstmp_n^?m^Z2@d*!=ZwVpu!r;22mY3OyG0| zlLv{xFeuF^(I(L-A=?pOo?Kj%S_TusOM~46)c`XDB&MejoSLeTpO=%Fm#UDFno|Hy z-YKaiiJ3XYdU%bbizLX6O86ZK^A5ONp-r$u0}j7Cz~KRQFKry5q@V<Khmr!pAaUWL zPWlI53eLd5fGhpO<iVbY5}+^uF+o>T!OBt?4H8#?mbWl<ATdH1SN;U$b9B9+JGo%) zDqw-^p#o*rFD#I99%L`fJun(%21pz^OM&<xabhqo_rdfsvcp&qS|^>U#eyB;9*78n z1ld~vm1E*#U;**}|3{Ta@DMDJIuH+JHVCtPmIiqnoG(D)=y(m(4v;uVFDNX+7$Egv zB$W1n(m_xfbeAbe9Y`Le4}?K_K{PR#oN!9uz#UFApmOvKCk|JomJQG}4Dz!}B&03? zg^M)<149C*a?1%$<(32n297&_6k8@RD7T~tE4Lhg>Ol`LHjp7?V30X5J3+JqG>%~6 z`cOV-kO(9ng=7az4amJuI3aU!S2&bgUa&*luE3?-!T>T5l=qSJftdgQBT^%>IUqYg zT0k^RoRAwp=8@VSL)Wv1U%4el0Fp+&K-+LI8l)EF7TOfaAk#-NtwO+spE`9Itc`}N z4ui=f`va6_=+%ZRPAx&U8Ydg<CQuWgIJE@U=mCil(JaAfCOsrTZY0=XfjR`FmNt16 z8gN7e7RU{>ihD>K4itfe+i+LJsFVI-Z6RFgA0`it0x$&%0}un$hJ%%*Fd8KOgdbAg z!qkDp2w_}xKPaE0>qTzEneZXna69-A_QKo)qd{hX+*6)h49`*^K1iGxjLUs6z1Z4t zf1vdaObv_%*=r&QaVx29lOux4Eui)r2oq|<6+rC(*$c806c(U19Eb+B(Lgk)4F{q@ zZ8#7OYQuqOkUU5q2!r(g_@LNw;HhE@XwdD0EX3^~agcmR8dD1h3&cX&l%V(liDO_P zh(3@wNH549&?F>?2HmR-qGK2s7(g^=atK5t%Y*cRFi0<mCI*ueZ(ESuiEIbR-ZxM= zQsYfSnEZGHxd9ZuAWUi)7q}_4lpv);SbG!{wxIUi2Vv!w2oXqo6coQ9T*@sPvdS$j zP(2_&gY1W4O4_3^J3%z4EeN7P=7VTZTM$Hp+M^&k17;z#jR_J1xwk|F(jEo1nQeq1 zZr>n6e0vmT4u~ez4In2Ww?~O-TcYdnky37XBL&F^U!m<$7!6Vj3J==UaUj!2F|9)2 ziX?UFV_16=SA7hVNA?FO&Cse%0<#BX2dI^lQ(goU!b^kHgNLMY%8N$Zqoj`iLqmE{ zv`0Y^NVq*ZLxDQ!AJ*Q)mHuJ!$cYb>)<AqvdlXid!f23q3ADV0sRM}-!noQEpnQ(5 z7u4Q?x$B4oqCM&%2`T46_QKo)qd{hX#LJV5;aLjA2Z<Adak&qs7h8L@M;hWDm>L)j zviAs7j?{Jy$P7?h6od)2M;T-g_JiyMg$1ZR3Zg;nO%M%gkAi4WdlW>2+M^&EBoDF+ zgh6^iG%=W*aN2_8PGmbk_P&A2(KDPTxGS}=K;sAG9#|U=6fU4P(H2?d78yB68*YuD za?2AD<rWro<rWdB9+101`e2xnHXO`O5DjWSfoPEVAR5$$1JR&19Ee6AQv`{D+-o5R zX~TiqnKm*Ix0lEf--d&k1ENWF11JoT+i=9R$I$f%s3^B=P=Tc7Z_qXzj0UL%g~w<c z4ipkY3(rudP8|koqv5K<VDiYJ14=XWYQvQlkl2PREf{UXk-UZj)P^f9C>j)PI8X!< zZo`#mQ78Sw+CsR}KTIAy{e$?RHXN)hh0!2!3ut)@$|oQ`F&J0f56b80`jOjk9ZHBc z9FH=joCnzpa}SILnE?_nPcDXMDG(ndP7KE7KA2u?ZMXnch<jjaU^K|y1yDIs+a^2) z$}OPrJ<!-*j}gRtka-}pLG3yaCe*gO1GO8Z2c#DiMxeGGhz7OYKs2ar2cki3I}i<O z+kt41JV+l1gY<%EVlX-3H$e^JKXmg!_MU*sks5v=vp``4!lZ`N1`nl{6VS8`G6&YS z1BDBytu#Shx#fpCq-_U^qZM+>Ek_KMTW&!0fZPqz2g8)K?O=9-Xi&QfM1#x+(V(^+ zhz7OoKs0*W4kQM0uZRYuZ3k+9N~l5H9-u*d+YV+9h$htypfEsg+Y!@FL)XKgr`)nY z50XZ{yE8C=(in^esRf0{Xxk1H5<?4j=u)R{gSFjo)on0&<j?`78G5ztGL!Rja*!=2 zf(>>bsJQ~x3>mEhi4oCsA;NUpDFL~0aLgTp1CFTR0=t<u1qgHvAlNNLtO8_U@cHqV zD(hhDpizt~Pr&4%%D@yT96$_Edk<E=!f24V2DA)@sRM}-!l1Gmn;KBwM;8aR_h9ZS z(1En~+87uZe&|5TevrK|_rPe786ffU<YI6jgZLl}5(Cl1U|ep5=|ykzsgyFcxadRN z1XBZ}LH168%8}Y;Szw~v0&4exHYo&{K+Ff3r(&SoVsnZQj90va%;$o{VRj<Z7oc{7 z#6W65;RM>02BNbV7#Kh_s0|3BLG!sF8Z@5^qCxT?eIN|dTcfYs(xIx{V#mP1kYS8) z4@e&7o(JzC?g7OeNE{s}7(n!a#6f0)>;Wxu1koK(_kdQ@fcOnieiM`i$%FKPFi0<m zCI*uepCX0`cOu&XveySHM{0a_7?K}vAUBX3#u8piEjyrj6=V*q{R#?WHwFfV03+p= z9Y&D$D=2<jG?ZInER<W$K=pw94AKX~l(b)Ac7kYMXuN{r2gC>MBLUH%^aY|jVHQH? zmqB76_g*oAv|mAO>^TMyw+n#MBd9S7Rg0vR0e!tA%p4F+svAJ&BDY_OX^SeSq^5zE z=f{T!hXi^0xyQS>x_SD!y1=%OfWr5Lmr{$wXE{(-09gUYzuh6{be{nE4=M^O6F|%v zw%|0%2vQ@-z`y{ar5G3(T%c-U{sx&3Qcn&B>5Y$1EKbhMjL%KY%}mZM02_lWUR+Xy zOFR!Q0gV?{56B*!U<L+;iZDo70WxcWhjI(22LpqP2Lr=o1_lNTJ%pSmcz1(mv1?&z zVvc*LrwiBx5OW+Xm0LjN66mZAP?`lvfy@KZ#9&a`!>0~gS#Mwp4tES~AbVxZAabBH z7(sl*N?Q!&Z~>4yIEMfOmwQ>D`dH91=L8ExI6{@cDVV((rphg_@){&olwO*d0_sFU z<7^4kPjHP;@jYhBEg-!h`~?~&ApOYdVC)DaGeBy1JQx^2_i%$~T?PgQ5Dm%?*l3VE z%p8zju=_xp%AoE5$*~}r58{K=foPE1KzIsN9_CMw95Vg^l?RD|^n%=B0d<!xls3RY zgXBT_Kp3PKL=%H?#U)HHwzRj#9Fo3ZYG5?T-X~BwQq!J-1^Mv^vL6(_AWUi)7x*f* zv_RW6Aah{#5-9BX7#J8{SSYusSc2;%22fiFq$a>dxn&2E9*`J=0Lb?Y3?Myd+q}Ti zFv0{HJ}^Fv2I+>`38Lko@eC8^f$~A-gXBT=6S7_y8$^T3T$md``c3SVTR?6Hl}{kI zgVcb;K{PR#oHTO55_cL=u!6{unnq?o^&z_%<c|$j#HXDYBr`yIMLif8Ks{Ly4Z2Gn zM1$%tY&1w7W;aMLh|Pgy9*7SU2c<<2CX^oEAn6C`1=$NKRzNhU%?+Zp7#J9^(I9z{ zogfU-3!;g^<izI!Ye<}-n-8-022_sJ_!O}rKi)v@0EI6IlN!b<1xhU|>>+g$$Q)Rn z2Zb>xf8DWBZjrEs<atot4pOtlS-B+wJxvpt=QW_=12P90gTfAGCy17S#xqPDl;=U> zAUA<%P+b7i4^jhTgJ|?TA0O}O=i}+;8t)nG8W`&66OYzrfwc#rEgDZx7mcFK%oIZ% z5NV{T02K%6f=VbrWI&d|>bxSQmJ+0Jgi0~!dO+HXKOk*GurR0$0x@RTLDCUO4JhA% zXwZ0Y2vjY|A0Tz;{sV~-i$Qu#?3G(UaR(|Vp>0&~9yT<8JNpEKe4d<B4E8&iM)y5f z&`?LA2+S}7-Q);q_iZRrYVmMEq$8O7^kDvn`V}M&au0~!VGr>?NDZj%0is<Q7#Mt@ zYN_S_5C`QJP?&@L4>cPUF7d&U!QiwI?;qeA<QU=~6z>`s4{{mAPw{^K_>`c8A$EnJ z78Jy+4aG_=K2ZNcY=DqP(D0FPfP@7|6y#nI{l^0=#t2d)&%nR{qCqB3fSN<C@M!>r zk3D1@0Tw5q@X0SoElMoOFS3O;s6b+CT$Ect?gQ1IpmG4@PLMc=CI*vJ-U>K^!vVv1 zki7*^Ia148P?Op}4}6>hI3E8%%|W&VWWI<KqFnZXssV{3tAnxEK;=PvkQy@&1_nh2 z1_lrfsxLt_s9%VU2FZi;fiOrf*nK4#sjyWCATf|!1d<&fK1>``_Ji;Xs64KAb$}Bh zEJ1ofZUNP?AleG*R!|)a;-k|bd61nT4AKjtiNWN=Ig2yGoyc~8?6rZ)ks9X}&g91> z$PJ+I1z}RdSff;_B?l>g!|GU27=!9F2N&g*8W%_%3(AWiyY{#%x6FX+VPycdfr)Kb z_aMbF$SfEJg&oXJ5G@XkZ<si!js=N>+ytUQbrG^&7#l=`${yr)HLR>qL@Fz0cq+Gm z`~xa0K>h*g1K9<liNWNg8yi>L>81xNM{2rZal<qd<PRA);?vU!sNEocgY;TM%LWh) z%KIQ1R5oCvLGmDdAPmwAqDzp>1My+vp!5mCgwkjPlAl0&LH2^m0T2z!=O7xC|FO{^ zd61nT4AKjtiNWN=CyzU3*n{i>+3Nz8BQ-u7+{uqOklmp01z}RdcuKia%M2HUe_-VR zD2zdQ&cj2wrNskM4uI-ekX;*+m0OO$^{_I4+5yCt15=RV7-SX<gTfAGCx`}>10WhE z4k`yge2|+!G%4l48cEF-R}Th;%^?g7&zTt*PVfqX$526L$H)6SdAT}=c)GwwTp=z3 z$-&y9m})>R9!MLipi-%252Q^5(Fi5op>3!bPej;)${vvP1s|{&BS?)j0|NtymSJFE zxB)c>RE~kvf!qM1$-yAK7T(G&pg04yF`?}?aJvHTWvIa*wH#GSEgO*B3QGr`9t;eE z3=9l^yp&r4yp>x5K;y37VD~fZfznW8z!d1-Q4j;UuD9`ms0WE7W01Ybd=ML(7)Tt3 zLGA&CnGbY~m<uLB1`P{mVzeUr2c{n6R*-u@;RB*UWhICPov90=L4256bQ+|0iMMhK zC{2KdV~;??9wd&e7UV|cI?X3DFEue8(MAl-%PcI-Ov{8d%0T*IDH>)DNG!)!xdoIS zKz7064J3Y~TB&6MQar-q9TdKxIo%XUS_K;gaxaK6rxY_j89^BoBnibJ|CsnFw;X`- zktvY9$b1+Z<X0FQnFgtcxd%jp;v5vdAaM{43TKcw$h{yMBoEUMQse9C=j`Da1Qr7E zVfh*=u3%7M0UEZ2%X`!)wJbpLH&}v!fx#b|rwx1&{s)CCNPY`Mj1i<p6si`~&fWku z2j(}B{UG(^V36JbKjjusJb>~vv>XBFX<x?(?0$rZD;QKj?y&{g3o_?LjZ#Ys#LXZf zI1YgNQN$17N06N$1#=)`j36~2KZ0nGAE!Xgp_U&l{FPfk;R^C2G+ZHm^z;k%@DBnl zHv~BcEQS=9U^#GPLar1B%Xic&wPZlt4b}rA0-^r=gCqyC7bM@}5B57FNDauJAR6S) z8mL-o`BNc4xdjxqAb&!`7VKtU#|W@rKyCqHP<+At36%p!Xc}mi9#Ri!)G4(DK->+| z0>?p6e?CEy1KA5wkP`s$CrAy*pCB6K&lIRyYWb5RP`L#Zwjh5(!xrLCPd^`jKX;H* zz<jtLA>z=eG%$chCs@siI;9p1h`Yi1U_>y~pJ$NdK=y*<LjocG1gQb}6GVgj=>b(s zEq{IpRBi!<tsMgc12k;GZuWJI!0u0oI5aBL(xA}^){|4O)S>`!H^>Wc90K*{79=^4 zy&we^K@fj})PVd6qCx&NfU2dIKd%HSw}8SH<WFeWg5B)v7~vEd0vauYq)B*uLc|pe zDquc@$O|+mwQxY(401jkheG{014#~KCrE)zFvO1_H6TBNXpkQzplYe*#~s1SEue4( z`4JkfFh7R-2SH|+(efoo9PCG!FG2Df8kAbzK-~s%KMaRK{a6F>4_FvvCy2oj0`VhA z4akom8sx`6P;;o|$0Z@kEue4(`4JkfFh9D0JOgqI2!s5A6qjH*s7K+67NjPiQK{tu zl7B#YK{y=h*9?fiKtc>4yFm<vP>5eaYCwJk(ICG*fto`tzwQZDZUKca$gj}w1^YEE zGc^aamI>q*kRM?Fbn|reaf$bLa|?D2(I}}bNYw$W)Kt*W0Oe&(Fc}{Z5~Qi7p#fH) zprvV`scQ#O1{s8gj>Dg6RBAbpBLVJnfb4<c7-+aOK*9jLMj7Nzki1D4I9wP&YSb7Q zz%*zb${A=FQY&08gekXx;sO*d(6|7HOHhbUJR}T)J)<C58Y~VAA5?j80Kh}2II}7> zKMi-VfWn!lS*hg;)ZZZg!f+BaOr}8n4-yBt5k%L7L&5~4MwNkq0Yp18FfhD<nnSHH zk%&-k0mTC-OknW<ax=)!pwRGlix2S#@(*?QfCLf9Z6FL%gB(8C)S`wIB!rPunF1vJ zC}=ByY=g*y%z@~G%0g2Y$UdGHrIr^+VFhvr2xmaU@eVZ1Kw=<&f#^38kZ{cOU|?Wn zU|;~zAiwfJ)lw@QJ0g`^Kye2$8y0sUH-miU?C%%i=;;@X9D*RZ;LIvW=LVX0ki!#I zk4A7wQE76C4oHWN8z>uVDrhKZXlMk08p4_yYET85x^@s*O$BWQSki>(MUt|yMbZkD z)zsDi8Lp|R010rA`wUu@S`47!2MS9VE`Wx&Pb4I4LE<3)gJ_N@h*%*syg_svC{IJp zp;mY=iBfI>#W5(nVQ~y{Gbp_MLVcZFgW~<&;=`b;b|7^yDF1-m2vUa}*2wBL95od* zpdsg|sSjmoIBG^4#A-r<23$70Xj5ugfaHIWxgcB#4Vw&TIDo`JZUxaVQXydjQX|X2 zzyP8_^X4a@=1?naDx#HJK=A<z8(4gR{Oqi)4RQts2FWQoYion%KtYlqeoVJgi%cBE zy&y4IUwI~UEaFQFL=LpX5M&=njmFCV@O4uLP``r2@!>zQ$}ONVwiig@1yc_jhXA?9 zAXd2r6po<%UMHY-gT!HKy%-r7U}Fa`F=A+sSmhR<7>HkpQID<$7H8<<*!Up#!a8&y zwoZpqivyC~6QUvR0EMv#XuS_q4%fIX$PAD@p!=6WG%`K{)r%|!V#D-+*q}HD(I5;G z2Voc+<_2UMG>-t{gU*2msl$drX81uRK<o+W$}OPu0ZNOo^bZoh)1lO&5)1J!NIA0K zL31q!pmMnU{v-=>Mkz=y48w+HK<Nf#2TUABgTz4Y2bqsdgT`M$e9*Wgh(?x2)(c{r zK=TC1y&$z9GeP1YI;bS4z^^nnDYeKS(piO;>%_)0$Q&4Mh=c6?K~9?>JBST8m^m;S z6eggw4&#H&g0TtFxZ(iU8p|t*h<HUen;Q1Q%tT)gcqUG{WlubIyFvEGK;6Z}1E~)N zdM#>B0>rH#x54}bqp^v><j`qc@dGmheUA$$O@Z`0f!dF39!w9uyoszH8#^HZkvDrf zA@@2ElQ%(TeTi3Y0bvk30h)h6Y;-&W8kZn(keg?DFff2-D)7;u`VAzHZ9WfV4j~K* zGi+)=_JhRH!}&=z6ZlRZpCm{;gVew<Ob;>PjLTl+a4zX0Eu3NQz(?b<7p4bW{<BHO z^ead`$iF2}IdbwJC{2Jc$Se>BnFpfLF?zb_=)vBO0i^>_d!Yx~mH@S5U}kN|(r9sk zmLo{^c);Y*X`2+~7HsVoWOX2OQlNIh#6kHG#)i=#bs#p32C<RLZ4e)XLGmy^fM{U` z1_lrf69<*eAU<dg1Vp2+8Aq<WKuZQd?mvPfor3g(!U{x_YEMaOZb43BNveX40%&9b zeBnrl4!Ca;U!vfrV8@l5kyxalp`fLJTzx8ND1<0zD5xoDDnu*zDa0yh!dTGBP>?^- z+WMgBb5PKL+vhmi_eRL=do5%eH5@gO+xIrTN-aHD+OTt=?R$?jL^=nxO+glafr^3D zfZF#U8q~gD0W}BKRs^{nq@ElM((CHy=;Y%XkJbAic@zn#B_MIEVFC&e6b<oVh8m90 zo(`m*bm&uRSpxMN)HpD85*ijE>4>lZwf8`hAE06&HBt-=3?Lem2KPYCp;lP*WGJ_Q z!XMPWgoQuIuZ}@Mj*+0j1dwB(^$5)Wa5*e~2PF`w7H~S^=~rr50rd+^97JD&`aK{6 z;dhW*Kyq)OVjwl3`8p7-!@$6>2Wk$r{N9nN+yV-3kl$h94f1<D+=C$3K;jVQcZ3`k z&m%=V$ebJfN-ayEeu0<-AumJy?vsh|JIE~{*&k3bkQ$KRK{UwkJD}!J%kNXNlv_aI z4e~oIyg_aTC1uD+Qb=R~-myH8JY=K^It&FJ#6uq11o;ROeoH1OwJd=84I&C5Z$QH$ zA`1}~Ah&^JHL@XMAT^*dJP>Wcz`(ErY7Vu+;z+h~3n=_SVF3$&SXdy&Ho&0*auzsU z!_osNywKF31`3J-4G<4(P&^{|6d>UTD?K6MHD#hw%NnFG0b9(#z;GWLULDY|0f~d$ z52878A>jp516un8qCtCcPe9F~R(LJRRc-;r5h%Q1aRdvm07n-W(3V6e*N|{mS3k&* z9cXhNv<z{BjwpfDyFqIl5F0r>v74b0qT^<$<7NaJR)+*3bSyMPM*$>ir+^`9sHv%7 zub_b;ZltN8i%qqHF8W9+$ZU`)R#;3i#A*uIY(zAJick%ZDMs+>5uASJOj2sOgA|9L z_ygfr(D==O#wAD$6y6}3Cl3<8uc2duZ#@_o{23S+Byu3))QaB~dCD!IGzE%ZSegRG z5y)50{(iwB@y?FH(193`IC9(}<iXiM6Lim6aY=k~VsVKLr~v~q6XX|=zL2R(Eqjps z2@(h4kI*p4f%+FD267XK*2stW6{H3<&H$o8*HT@9nnSHHIFhg20t$DKdtu=Yax*9l zoIFE<<NZN9haq_tG|1_n=2!$e&m81NkUHcrfvN`&i-Of5hDhOBH5IfJETF9hkbaqI zN-YPF{0}l0gnvTArUM!dATf|zL3Bs~By2!xKz%t74QfBVfSN<Cu=!A++yaUZP}soY z1LS6;uz}=zkfWga9!q#Y)PR!-d^!lp2;$31ndwR`caXvZYAwTWXjpB5h6_j><aQ9f zrVtWVAT^-98z36A>gNa49BPG?N0D+1D1Ja;1&be0SV89}Kt*Mct21nt7?Pe6Q&Ngj zi;F?d1eX=Cu*1-!0ad93%31I*1c#`CmZpXRY<dH#3{+lego36d!IP01YS<<tk<y^b z45bzhXgGl#10|R|A$x*&iXdSK5(fDbL<dwr#6W65MLmlr14AeS1A__F9BPH@og(EH zP+Wq-6&9DEa80d9E-2B1oFot8J6pvB6y>KECFUx)W#*(7D`-?$m}$oNW+oTq7w4yy zD1>DemnP;Y1ecViWacXv8tECtggM7#<|XHprliIo8wZXH*9d3VfDliAzxW{k&=5~Q zXcGx6x1?CP1r!dTJ|k@18^{fya3KbhI$mJ1fWIZD7!uy-=7a3r1C_&et^{cP8@e74 zAEfV1g>nlhd_n%uD2JF25;rMPZt+;g55^{I`N4D4AaRgBbo>KqH%J_$M#PhW0W@v| zqD>hX7(g^HlvaV#pt)<1I7l9(4}?K_*OVx?ypWazV;`u!pz&CcJUT8Yfw&hW4$>>? z2|3RTM1$5IgJ{s2KM)OC9}J>F;SQof@*sU64AQGos@$Tpf**`Cp!VVlw-;#kig_}C z_dI}TP+JT{gZvAkL2FV$G^mdYqCxT?J3$y^FNlWuw*hJ|XgmTWj*b(M)>ne`ibMSi zqCs^4hz9u=M1%YbqCx%z(I9!4c_6(yvz1y7AmwS;oRzRAq+D_-gM=+eKPY{G^n%jI z52!eZ55nl{JHHeuw}_NcZ+$1sJs=vio|X^lK0!|g2GF_?At+zM6EbHFauW!H{0O3n z!5}|kQwNI&^m7ql`5l`cn7s{U$}OO{0I30q1>h)5Kyn*qE4A=I^Bzb&EH0!x85ltG zEEkaEK;;fdO~FbvaGnIQVHiCwKyFx2PQAE*xd%jp#wS2D$o(K1)PDuhp!5!+LGo~S zF)%QMxdz1ty9R+MKWK9jT#mx(JCFoi9%F?cBu$#kQEK6V);Tb<L9{Hij@p1E2P)S< zasid#bj%1+19B6H2DOt^plYdAN4=?3ZUMy&sE&fwi=eOp`77K%$U8X15nPkNJP(pX z_B*N?1%nC`(E3LB5=U@Y-I$})!UFLR$ZK#c2lGFY9LPN&1rb#c|AW+k{12i*{#Ssi zrI!D{R4KQB!W`^>sM#Ptg8UyG>KWo1AMESs<Kq+>?CIwk4Cy3-<dMSwi#i2^3TQZh z8W_;_WzAfr78Z!VKwgAnd1yH7K#~Kw3#1^X8WIj5HK1?+(V%cpfvTleIQ*zqZUKco zC>)?+4~{!TIJo+SxCR9Tc?QFp6JUAFa6qU-1OlWJ4GK4fc}guj5I=#u2geG~FxZ16 z2XYfgK|&2A3_xl?VF02*VW0z5ORX^YQ={Ah3U^Q#K*JsEM?@GnIXZj$ySaHf69@x@ zIz$+NudN50cVwPYivYw=An(DkA~XyRAjyH;1X7Sw3kd^|8c-O3Xiyj!K-E$!3^?kP zTR`Cs3Ik}kgWZe>1809<-%vkKXK=Xy$q>-=jhPlu)gr<IG(rX`8#CrBwTM9c2J$8x zD?!8J43ZqkZ6F0Xb&#+CsR4xrhz5m)1yn87!lGWe1r+|Euz-d?T3Cd*2KjpWIf4!l z#u)}MHE`b>!Zv4s@&nHTr4|K<e?VS?V`Z5Ck>oh)!Tx6GfzXT~H6Z_kXpsMHplYe* ze~kv^7EqXj{SP%8<Yq)#Kq(vJgIqypeL07?LY5PQ!wNG^;L-yRA0y=O*#HV3h=1W> z17fH^!{-f>9LT*Oxd{#6aAE|h0fi5U28E9gR4ui_N2gJ_1r#Ts@PWn&*w2XYarJd_ zb#ZZZfz_UnG>;i32zBsKFoA>uD7-@!Dz!L3`~>nI9IHaZ-~*Bz$W0&xQyL**08#@A z0}u@gg9NBrYK4J8lX43v+(BUg4R^FKaB&QAbOu)nAa{W<$WNGIfKUey1L!s;koq4B zm0DaNegYW*$7;|p_<|${auZ0woF+&ZfYgA(07QerAO)(HT47+(tlR<$cTgBW!yPRQ zf<67*eOyC>U4ufPB__yEm|=jd4i*ZAu<asXGv_Q)YVm;h3*<#OR)>beA0#=DyFd!& zG(*Axqy`iYAQ}`78Bn!U3x^iv7EsuO!T}ogU^gT3Lx5{gus?zF5~c>`e<KwCJ1kae z34r(q<TW_ffcYOu&Y}hEZ-yxlnh~T1<bMzi@_!CgEw%h_(5l=53Ujdkp=N{P8R35? zA4eBR(*Y!o8UJ8;n8!_E9tWv?0`fP+A8<c|7@AOje?gK1xdSA(rWNdeMvxkizd<y} z-x*M~)bh7Sn{o>%tU>;UhBaEe!^$^|DgvwyGaRs}hlPp-EL0$6X~z<!77vI&L0*Pq zEoiv#w1L9_EDmxfh;aZS#t2da3KtL!3YP+?In)Z5n0DnBP+Wk*1sWG%|02>uu&Z-u zkY`9_ykkIskEf#_p>`#vdT6j1!g^eww4$?AsU-p8N04{nSQ{E93hjt60l5*R;0#2J z5u^qbCLkIVCLK_7s1+s|9m*}BcmRb7G#=2yB*Z_+(cKl=>jt?EghBqoOeeu8YN26a zgd7$ZmMXQBK>P+W299;0VWHE32n&$gKniX^#27(pKw$x*L18fiY7Vu+qNG!~1r+|E zuz-d?T39&y`v!!9`k>$u2$0)A7<*Wts)dFHs5cJM0yei~nNmvw#BX3R7@-Rd3yV%f zSb*FHlD`2FV+5%Ig$0NPg~bx6IaCXaF69<b_=Ca%8vbB6Bl1eP2Xd0Y9tLnVQ14s7 zk^<N)iRDTyJrMtZyava5F#mTU`5(%@0ihW|YC!%6(IEe?fSN-!|9305fWjQ?f2i3Y zKL!N(yM#K2#E1Gp5733W8YBnH4;X5oz6Xs!K$V02zX#-hh<{+hVA>w$|86AzL)lj# zG$Tk2Xv`Z#+cPjQtbm$BE&mtvD7Tb!LC(j5hB?^HaKHJ4c=|d*H)Eppwb0cdybl?C z0fkk<3Z<4Fh+n{dh7pcXznk<R{0?#pNd5{$j1i;;<aZDa_B+%Zs`<TFxuv8V;&*6x zqxjv!-`6$X$uZc|8RRNRy@ww62sH@bLq=U7>RDDQwRAxI12F_jI>G$ki{yVO`v!z& z1gQb}A4G%vzXWOywftYwr`!Sxb5PochB>DH1A<(AJwriT2Ei@|#VOV>fT}};f-zkE z3Q!n8`~((*5zf#su;@dC0mw}t`5O>1Mvxj%7=UO{7_5MrL$xsIS8gfjg`@#!xTAyt zxC4bW`i9N_2sH@bLq?q-X~1WdQcDlSKOnEcu?x)q{Yd_YvhP4>Mvxki|3Ng^|4?(N z<^PHa$}ONU2c-dMn4|a~k-p<$TTj69SknMFuf+QyLILD*NEmzog#pA*aQ}lCuFx>B znSclbkefhqHy~n+AT=P9Kr|=})<DgnRv45_RBkEhhok{$xP$!&E8kECp>dRfFf|Cj zgLYFv{61y1Qp*I0UqIf1V>hVZEhZxT4sr`f!2^gGBS;O%?;slNcc?kk@_WrB<rYwQ zgX14+HYkn5{2m<Q=;z`X<btaWfI}T37(kUaG|Vj4D7ExJ`~~tN9J@oq!C?|296;^@ zDfj>pV+5%Ig#(BNhXd3cYK243WaSo6*n`3W8uln@05M8}91@WDMb8TuY7wCU8Gwa` z$DK7wEmI)=19=sWJ)q$cFc}dZAoqb3uuK7qF@n^9!UIHu!ea;29BPHff+@-^pf~`9 z2Q&^)!UJ_Q5i%18avunT(hqu=U{j9>7E6#eu=x#Zm0Fe{`5P?3z`)=M4U-gz|G~l_ zH-Z=<Qz2mjQUeMT5Df~GGf;D=6($>|Dz|{*0Td?CcmTT@mIn~^0O2%(p%xJsu&uOU zvsKn9wd_FhGswRn>;(;v5{TbHLJT1Hffzi~AmIU00}2li4GNDtP;;mi9xJ9Pw}9dR z6duqx0J|9$9>F1wK_RZ7l~dUB2~-~8b0?7NA!<*oQ))SZ<Tr>61A{lz-#HLJf`viu z05MdiL;MX=1M)YB2KoB|)EsL0`@nSN7EoA&{0$9j6n|sn|9EHrAjt3&SRH!az^)z< zEYRjBSZ~gHrIrIoeh2v*gngjl(gFzskPrjNogjwA3`n?u)PTYTM1#WR1=JjBh0B#0 z$}OO{0EG)QF2HU^N)O0&2~wy);v79((CQwrdPJx|CObf7jlc$_mK#X^2KgC;eW778 z1LA*>5Ch1KAV$DUNSJ`sfWibsgTjOXs+L+|@@A%T3n(5yVFHZ@lrX_42f)4rxe$Ap zU{{X_6=*U8+p%SXQp+2te;_78NIz(}Y=DFTSP<k+5F=w2BwRphK;Z(SLE$0-RZFdK zVVSMm0*VVzxIp6q>}FV6!Stu6qZzbO4T^L0w1QndB3vLVav@<Fu~Dgo1>#STm*LnS z8ZIZ0<UsBODae=&2^WwWP`H3-P`Kzo)lw~7<|wy-;sO*d(6~Se7g#$J)*8na76>(P z|D()({@JM1A_MUc$ZK#M0P{bR9LpTAzZo(hG$Tk2$p0W3<bMmOTB`Yfu5t?~%)$PL znho+JEM0`VI-yjqAUX83fKY?*KV(D#68{S}DYeKz`~&wph!F_$Kaw2FT!{Y*AT%RL z4aol>8ti|lT59>9XP$BkD9pkBhnfxYBh3HKKB2)O@U>AOS3~@S9tNoD5aED4HsP{a zsYM3jFNi@<G6)(D7m(yY?gB{{%mar9BS;M>96&TE9BiO!sTL0Nm0Lhz4+;lp*rVhF zaK99(*$E0G^e{kDg9re~umsqw7n_w@R3QEVc@2((Vg5&w<CzckH$w-6W(27L`5#1s z{O<r&OD+GaEKqI%g*n*&P_sdPgrx)62)t`VK#*&2Fu^>5T|FXLphYV<Tza-BwWvV+ z2@ewxBLo^QFOcLw?gYs#SO5+mMvxj%xPWL-xcETTQY&0+7Am)Z;sO*d(6|7*89iLk z+72Kmg4Lm?5m>mOsYe71$TQIXn!#4378{5^!REn;P-wU?ECh!ESQz9^5MvKSj1i;; zWE6-7g-Z(59BPG2#3JPuP+Wk*1sWG%|DuNrXx*TDkbh_ZN{Yc=hQPuGT@NB~5Mvxy zwkoxRK>P~wHXMgR!$xKiB5Xiz1u3`#5n}|Y0fh~S28B%n)EsJsO~qp67EpYE!Uh^2 zSi=UR4FPf_H12Vw8w@>&z=4i@K*F|Sn^H>w#J^BeAyhatd~6mY!UyDDkn9hL7$Zmx zD11OPD17EX&7oHKOj)Ab0*Vt*_(0<XHGIIcVDWDLL0A@L;tC%edJw?_843ZFX)@cD zS|&jJ3i37_M?k|SVhJK_KyC#okXZ^AV+5%Ig$;-Xh0PwQIn)Z99ZQv4K=A<z8)$r> zh7Iy6RcM}yhmM7V+zG-UKVqaGJo*q}gcuh&uwAKT4N^FO%mv{{Xc*N%!UH740CF>k zp|T7TMj$nyFapt_FuDUZhgxBDV3~3YC|*Ee1dSJzFap=Z&@jQ*Zbemx2nE=H2q+v= zb||%6K=LcdpCB9s4TlzppFu(lAa{Wn8p|Q!08#@A2M`SkhYwJ5s1*)JmMgb_!X6Y3 z(6C1d2c)tB?^rsrIz%Wy21h_)z_C-Q<pz>JL4E|`XlNL8K>Q05VgR`b#L!p)2?LNC zP#Az{P#FAxnnSfPSfShk3U^Q#K*Jp+3__vviTKh1LJh+A$YUUDb}F^pLGmNWe;^zK z^FPF|AR&e$P`1HJi2p%qK>i2OVE;qSp_c#8tW<6Rg*n*&P`g2K2CIh=eG^1SA0&@n zKA@>X1O#N*0}`gYlv?gU?ErfgO2k6LVFJX@U{R2}K#Z7GkZ=I00fhsI28F{Ps5#UM zhaanyTR>qC3I}M|L);9VSNC;w@eK8a_f#P*`FLMPKSy_0UsvqwHeq2%NG~F=Afq9m z@cpt&spSb$c!0tJgyW!LwFeR|ARz{j+d+($)sV0PsR4x*hz5m~1XL}x!b)L{atkPa zKw$-qA0omEwk8SWQb-#EJq=+GCzw7&C?SuH%-F5eA^`C>#9$~H4-Ka$NOB-|gQVB2 zfrJxC4Je#IG$@=LplYcVP9AHOTR?FG3MXjX5D`wkuED{M?w(lA2Pcr8VEW(z1zR8u zN>4U>lv*qx{ssjB94A1-iDxZ1Ou*tGcY_#vAYzOlHK1?;(V%e3fSN<CaEe%`+yaUl zP&h&31|^)Jna#~V)XxRHn*iiELhU%1T105ThE%|2KiH$xk^u1^)HDc{2n`RJb%^i) zxep|J1|r4?QUeMP5Df~C7N|MY3XhES$}ONc0EGuM4!~}P#Xm~B0}?nO=YiFr=P4{| z5g`H{Tmhwzmc2?X1rYy%&4Lk0(D2Y%j|dNt`#|z<AYzOlHK6bS(V*~{0yT$P;nA@{ zxdjvlpzwgk0obpw@PGsXW_v##bYKXfbb{7Lhz~;q4|M1SY?sD9rIrSWe?eY{<78;~ z_-sIg56HbB1%Du7j370j@Bz`F@L2;jhg#t?W215lC{94(1C0}~o8jSuIwuYb7O)!h z^ny07fE*mKAs4W|Gy9ZU7C`(5@+ussK*J+uBO*LN?gJ^{*#s721gQaq2Z#oR#}TMG z)C!Lko0MBXaR3SrXdHmu3=0p;`72050p$bq@W7%Lkw8G6fTpj4{Yotxko*ktF9@eX z!y^accaRVR$bBG&%w|Y<fYgAD0@0xGxB@kYTH&!{vvLb44nW}njRTbMKx)53vl8y` zz@ior9+2S`u-PI9lv)lT`5EM25Ke=JM-9a9ARz{j`#=nfEs*d4sR4xthz5nn6R0`V z3XdyWlv_Y?016Li9Dv=7JAHuWL*dy5td?*(f#^X54rF)*l*V=(P-?k=<bROgK{y>6 zHZvgM01{#VxfR3+*a`_7kQz|ffM`(I{DGQ7t+08sRk;NeAE2;-#s}EHu&_ZdA0WO2 zxe$As4!e3ps6a+lAbMjCDz&^p@;k&-28Il1xNLxg0azI1P7ot!8zfvnYCz!vqCw#z z0#!?`aN*dl+yaUVP`E(j0wr89^96FqK>UZEW^n02gbrdnh2fA=3k$@rAaBEQCNyl$ zAjyH;3Q~}=9TGMmHK4Eo(V(y~fU2cd*f8u+ZUMyyC~Tndff6<zkpZqjkRk;vjvfvW zd4#W#$4{0VQfg6v_ygo6IL?Cl`v|h!4zPb2S|BtdNDau}AR6Rv3#eLZ`CDP9atkP| zLH>q@HQ0ZMyaL&wfI8=azaI@7!^WZq5kQck6|h|%hm~3+ApV7i4TzBq4WB1Sav=AD z<W}qihZ7@64Jdp-G$?#rplYcVJ}$eITR>?86h6>60lOJJe6W=fAa{Z=sJui^FR(De zrVkNFkP#S={x^q}S}Y)b1{n#*InXfT0J#$?3U)IC1H%P~7$ZmxD2zZfD2y_o=1?n) za&{}XfZ_!dM$mY{8b;`I8i-Vcy=;Mn5mtSOK!T3WK+KqMM5!eP;%{hZK&V`3I2r5) zryH;!$lV~u4~Q5eNDU~QKr|?vdZ6Y|E1ah6QEman4Je$Taf3CSu$QSImqPrAD=lHy zhX^Rh$PB~`lcP#4Ef9Z042F_<&~S>_g9s;(yFt=FAYzOlHK1?;(V%eJ0yT$f;j~w| z1r#@+aDv7SS~!8%xWR@q!E%^k0#$?XK5WPZtp3JPrIs}i|A4#($N4b-??v)Il>G-n zGlJBB{12i*{yzaVhg$xhu}`@L6y{+6L(K-20kASBAjsd%H8|K4vAYx!r|4mTtPUOw z#)!SvHOG`%)<FCO_dkeH01bnfeTXmsxd|l4vL7tQ2vP$I0}u@ggELTbs1*ha_A9qc z*$Y`84h?s3ykQFiSV91W5xy`$S|x7`8%P1^Q8=#DvH{7jAb)~zAv7FPAbti3F@W3! zVu&1ogab$oC>%gEC>$<8&7oE}Y&f9Y0t$OjT7ZT<N;m{N#RvQQgo4klfpmO8uEU-l zFx4Vb1#}n%Z1$1kN-aB({0uRXfuRT*9wiXJgM~rv12J?CLc#;21{5A38WbLPpyp63 zJWd=`ZUMysC_JEX0CqDhT|mMBGLC`>8puX;P+X&@4;<<d0RtUC0qM;+q118$$?qV4 zgK#l4TzVj301{#Vxf8_jIRpt8kQz|9fM`&-e1Mumt#Em9NVx?R7oc!~#szA)ppBov z5)C9|aHJPpdJv(5GM>V7QmN$uQW${z55gtT@L2;13y=^4$h{y&$ze$NfYgA(2SkIy zhX<;bTHzybM7aeNC!p|w#tCuZgVaa?r2&legDZ@{`VavH@*Bv%ATu_cRBB;>_!}ey z$EDD4x`HGJayLjp&k;yCfz*J^0@0vwGJvY3Ryb)KRc-;r4Je$Taf2F8h)e~Wd3S|v zR0H`9BYd!_M+6IWv;~s>LQW~QXh8f4@-iHkLBr(@k{rmLAO&lVLc#^41{5wJ8Wb)8 zP_@(w7ms7gEugpng$pz;P{Rdj?FGWi!SS%b!5TI=^&kQWGU5UWpC6}`S{xw$1$iBg z%c0@Ja||37U~!OpL5w31F-DLYQ22moQ269P&7oHKBpg?60mTU@e4ufH8a}W}3U=H9 zq~HZP5v&d)-C$Rb2pH&~3n*OYoK|W{fcO(^9*n4fhKtH^M7V(536g&S5n}|Y0fh^Q z28Bxp)EsJsOUnu67EoM(!UY-^VE@AFEA0LRmmVN@f-uOBM1~JoA0m(tV=oS8lv*kv zeg+u{$Cc19@;HGABaoXx3M5W~#TY?qKw$);L1DB4Y7Vu+Xv<0E7Eru^!U!5Ks9}U> z-458pAjd+-urb1kkX}S!q4W=)oKb3-gA^uED;TPv;Z*?%8?Z3Q{UC<JDM)yM)PTYZ zM1#WX0@NI8h1Z=^$}ONc0)-bej!?qOH8|MSFT~Rkev%)or1o|9#dfYEEG^>IhX^O= z$PJ`S>Nu;^at0|ZK;Zzw)zENS00|S25Ch2FAV$V%NH~GifWiqxgTm<#)EsJs6U!Op z7Es)P!U-BT#D$ZiiwpFaGq8H}G=(#qK>85j1R1=6rc0f3N-bZI!U7ZyAY20trxTDc z0SPgH+znz(IRgnNkQz`pfoM=TsX*0IE1V3@Dz|{*1{6-vxB>f{sB{q=hT>16!wQrZ zgTtH=!37z{0hM(Z&MCFXK>Q901~{&ThSe7&Igr~y3J#owgcV2)D6Bv<D69gYYN-`g zG3S(9K=A_#D`@->7gnIOL2g(<^&-LwGLi!dtCI6dEglfRgMtB$>!4w!a1I<UU~!P! zL5wpHF-DLYP*{OzP*~MK&7oFUWt>-T0mTm}tf29O5>}}DCGgKpp{s?51=87Z5*L(O zN+5m%c@vK7p<$tO9uXEGw}BL#fQT`I)PTYQM1#U&2GksCg+<B*<rYx*gTewD{wQGq zYZigr1j3-W#mGz06ZQ~(hm2x?)b6>U)Y1U)3rIU0H$eTaaRK3XkXt|sPC&#ML25vL z2hkwE&w-jlHNRg}ZUKci$nVhbM)5mzPij0QRYU3(bic#ZAUqEnvH+Wva8aqH2I3!( z*WkDj=KqUG{)e*9Kxjsg8j$}%G|2xmpyp7^{~4E*TR>qB_CM5YP@KWaSMd54$T<$M zAOQObJq(c5A%X!iKmjt3<&siM4a84y|AQD!&@j-sga`wWn?Q0`AYzOlHJ~s6(V#Gx z12u<QVNh^cxh3TyWIPWV?qENngaK^5GBgxGe!?0CaCL}KfDJ@|^sKm~)Y1U)7s!in z+zbr|lgo&30J#gK;0{EL5u^qb4j>v74hx{>P%9iNt|+&F!XA_spka>^4#;D+unYn6 z6M8tHszZbW$n7Bifb{rWR%+>h_zNTi$1Tusu(^T=2avl!3LZej7(r@4W`Sr>IIMu0 zL#=SAxvJa(3VTpEK*Js-9FXQRps4|Sxqz$=5ekrD1yC4#xUAGN0pcf+_u#k{8U_wm z5n%vw6G*`Wh!`VC4JZsiG$;%<K+U0A7+h0s0fjp#44~nT5(e-!+0YOG`3F56Ak-jy zk342D<%&|v6o`L7UW4N{nE$UK`5(%D0HGN{YC!%6(O~~W&7qqAuPe8J!W`^>sM#Pt z!pekDKOawLSHECvXY69CQ81`*baHk9VW=-bW?5WSYMBD@4^$LFb-?_89m)Stw#f~! z7$Zmx$p0W3?0={^)bjs@8_F#;*C1sgG|a*AU!0Pil9FAPT13jdDZwt@#WCTTc`5nj z#W7{(dWMehOH;6!=i}(-9`ENG8WIFM(HS*=A<KhP79`lf?z?kUspSVWtf0bRY85n0 zr$E9FEC%u;h@o;55~d(Ep!+pIH0Yiv0jOGPh3SEt$}Kh5Az=!QN3fg0{_*q+a}4ry zgspT3r4LwsLX}rAs4$0Ic@0uib4{t`1=O7&zrgTnsDE1^egg}G><2MKZbAGDQUmfY zhz9wW0jic-{@rj(xdjx)pgaT(V}ySl-GV&59Uc9kgZv=Bp!gRquV7GNj3_f@t}C_N zfVvap7Z_d(^=}EpZ(w1N{U8R*ZHRwCYC!%4(IEeRfSN-s|1P+#+yV+?kbj|JjO1S* zCr3X|N7zOmO#edV6$~m2lR>VAr1?G9m0C_9`3WM!z_1SL-xP@7z``K=L5wdDF-DLY zkbglm$iEMu=1|MO6YeOtfWjE$UuYO3`#0Dz1h0P~@}RpqpbaEYn8e&rYS{sCKgcU^ zydLV`kUQYG1dD_02Qi*N#27(pK>h{MApc%~nnNxBHr!Qi0fjNhztAv7@~^LlV-W0Q zKuFx7re}z}f<c98D#+2$v6nwLlv-9m+z%CnP#d8Bb-9c1FUWq7>;;GzBS;O%zaSdq z-vdx{sO8_Bd&(`KFb4S-8pcTe4RUmXdKVOLsD1^@fr@5GClKn_IX9JBW<cBy@&+7l zg!<Ls9>T96yFm&LK*Sh9YCwJk(ICIBfto`tzsB5GZUKca$gj}wMfR(&E8e^t1d&%T zs4z+bxf&AxHn)^oS|IL+2tvtCQ2#32NB9?HKS+85M2r!n2IOB54f5|Cs5#W~ug?SJ z7El<2{0j|ZB>x5nJNml9FBrj$U#Pr-L4`>Q$kh=4-npgJQUY;5L=Z}DhWc0F0m8o^ z`$5t(AYzOlH6Z_jXpnz<pyp7^za|frTR>q9@-H-uk^CFw3Ocs}<Q`1Fg5*FE3n`RA z@-?@WT2dhH25EugEl_{{K#~L53sTVW5bSqGkQ$IbK{Uvp6;QR*@~6rp<rYxbg8T^$ zTZBKI9D_Z)Js}5hLGvU^zJ<yw7*v=+qZO=I=8jT}55)Z-ufXwEsDED|$${(#DJXda z@h?aX$iE;O<lhviT59=M;IVQGD2ze=g@!TM&EPhZlVfmTD5Qe|iZ^t>28OzVA{ORV zu)aNalv->cZU=b-j<-SmdId=iWH(4b#$$+IL25vL1<@eC20+zP%dad?lv_aI3-T*8 ze8Fyp_|?_NF(@<`R^wv&7cLL-Gh|=}ng(L-Dz#`p`~dO}9B+sE`2><2$PFL`5l<j~ z2B`u08AOBp>;P3uEkA#GqTB)sXON$v;f(BOKX*sa>17}nLCPT1ICcfggNi9rh!U{g zKX;W{WFYQ`ibALzQ2*{gk^|Wfl683s@h?aX$iE;O<X;o0T59?C!BgcHP#A;!3k_qi zn;~%=<Qn1+X+dJfFIW!LIe;}U!20IgQ)=OXxE<sTINk~M>k=e6kli2!CeI*#1*rk~ z6-0ylssL3>Ex%rPrrZJwUyxs+;R|*%#IOFrNL4Oa95rqs@}TB&BFNFuv}|)<spSXM zols#gwF~OsDG<Mb#X$Ch7$(ml{spN4`4>dTF)%O)K-E&szt5FhKw%8>FEot7{zCRI z!G5n3#NRM=pa{1xgoFSnP29P!)baxAZjj$#csI=d5Wj+jFF@HUFChL0sR7+@3!*{( z=YYyn%l`*nD7S#Z9PEFn*&sJV{2%J$4(<ShodymU)cA(UgPN6);dPMSng>cPFQ8^Y zbVA5IQ2(|-{00^T*$-lfyoC4{qy`k<AR3gu8K7#Z<=+i2m0Lhz4Dv5DjKTf_``6hq z#L)-d9R!P`_!lY<@-3{e2KiU!p;F5Ys5?P^f#JPS|CT`f1{Ma{4`Q&qg7_Dt2IOB5 z4f5{?s5#W~?}As#Eub(4`4<|-V1GgU>jApB4^kOJ^D3%;A@U&qLc4=ty?Y)iwVXim z6UaXxybtQ%6o}tILJT1LK@5)95dVVIfcy)hLFxGc)EsL0cgbtz7El<2{0j|Zu$z(n z8z1cH8{p&V<_R4r1jQjXe<P_w4g#=wF^`m5b|Co^<VO(R4-JD1h<`ys3?Mgw7y@q~ zVE|GC3Ih-g3WFO^bEp*tYu+fgfWjRV2GDQ^yBQ@6LV_G!JVDEV@r>s=L*hRkNiC>s zOE!R{22i;Dd8E{`2g$D>e}eD<XgCx={0tIe0J#gycnb*!kQz|g2BJaX@BnHKwZdV} zTjdr|*n`3W8um!x;2#w1=?u^8Aitod0jNA^ECia_L2BkaR%$td<R`Fy7#J81Lj9Wn z@f%neWIu@U0V2i-QUi*25Dm)fccA7_%fCJElv_Yy4Dv4n#7-pt2KnP1`*DWKBURoY z|JpoJYS{uc3*;9VJ_Pk|z&mhUf`vi$gBUj;VvHa)Ape4BkbloW&7qcmOWrHDfWjE$ zUuYO3`8Ued*#qPnENxI{kQ^vWLt3C9f8Keb)UpKPZipr*c^K+Xi}whBg6suJAAyK5 zg4BTg38F#%+yOO*TK-J<pxgoqTaZ7YVT<smi=&@sFvO!Ef1spch#bhHkilAL8DH~M zsig<vc91vV_z2XmDjyJj1=$T!um&Q=2vP&`D~Ja9bpg~IYWdaUqjC!<d_jJNhA*;T zVM797F*Lshd4lpPWJmxkFY`>Pr2^t^kQd<iDAb=k9})fp*$YxI10u!<QUmfQhz9wy z2Wk$r{Auz@xdjxqAb&!`7VKtl8SUa3<_bDA9vWY${shZ`h65mp7pi8@Go_XUh}%Kl zfa7COzy3gy1KABy(C`WDe@2iRkY7PG$gd?(wbb&f%xC2mQ22uU3JqT*zlMh3%%?6O zIZ%NFDS$!gJLb7kix0%zATPl2ai~8ZAjyI31t}=_4DlyO4alD$8syIes9I|Iljn<a z3n*+s{)C1t!k?~w?mn=L3XL<Ac!kP?GAm>iE~MQ0^IWOL1mb>>SK#;r)V~*y<Usa= z6eN6s_!p!G<X;dC@~;n6Ew%jn=ZkU+D2ze=g@!Sbe}hB(kvfZ@xI^_XR30?)0Zqvu zHFI7lwWvVc5Aq5epM?7N0FoTYevpEIuMq!&)PVd8qCx((fvTmJf8TsnZUKcc$iL7q zM)=pw(KW~)&-g4%9yE1^v=-gwrBaIs#Qh+z!0{=le>Wh>f$Rq<u=ob?FGvl@zaSdq zUmd7gYWerdH{}*k7=!!^4P#{g27%7i1-S<lZzyr=<`@(VDvXUFDH$Yx=cQ5$3&h<Z zEpU7q>dzTSav*y_3N*e${0UM6@+XLnU|?X7fU2dIKaYG@ZUKcY$e+-#Me?Vok7t0V zpFhY!*z&C#R320!Lz=~4y*00tTHZk23DpXw&OrU!0r4AH3}iouA@Kv^UyvG*e?c@T zURj`Ospa1-Ka^WQVGQywG>pM+2G>1qo__EK1$O^}<w4~XbXo<hSLU@+%N?jYL4JYZ zvrzw5K>P+42H6i{u>6Gh7o-N{Ul0xQ?-!^!)bj6wpUN$uFb4S-8pdEZL;M@$>IbcW zK<N}U9fRdSUWK+QAZ7BN*GesCko*Jk3kaWs`ZWdOFOU!e$Zinh3q*_&qz2?y5DoI{ z1E@LF^6P|O$}OPq1^E>kzQ}&{gbzkzjoTowJSZtcMspzkjd`QgvIF9NkXPXNJk-A- zzrgVb76;i6VmyI}F@n^9{0pK%{=EP-hg$w^_^sRm3S*Fep<#^hFK8gz88-S3@e4}) z!sI~{z|a;lC=L91qtvnj;(m}<;P?X6zb?NK{sq|&Qg8(##t2da@-K)6`S$?S9BTQu z;E!?(D2ze=g@!Sbe_j29-0}GrDi5lIpo_jh{+;tysbvPl{UEQv@kOYAP5vPK3$h=i z-~dF75u^s>Ul0xQ?*^zj)bel4U*#517=!!^4P#{g2KhpJ@F0Jn#;q$z4wQGHK83`; z%{!%*4v5=9-hksvP`@htMfeqDH%P$>h!`VC4alz`8syhGP;;o|SC@avEuioP`4t+z zNPZ1+b@c|h2I3D?zk=jIUWGI)Kw)v`ol;8)#N7~0Q1UX=pB(=X{sh?zl3oB2V+5%I z`4dEg{Mi9Dhg$x$`LEmp3R{prp<#>aPd^_=KNsji25jY&dyuOuR1K)Cf~>rPgiFnP zrIr|oKR{lB<10{qGyF&R8{`g<f(Z~YMvxkizd<y}-xW}EsO9e%29*|2ScCix4QnKS zhk7{%If9Pl2RR8WjvB{MdC<feG)05rS>}UMO9;gMV0|#+D%8IU3@R-!F_8Tr_6mp? zBS;O%zaSdq-yEnpF#m$oVq)bM2?mvxAOAt-s<wba9pny>Iv5RNlZrulT^LnbKyd;J zA84F_!vS1RdpL#$Lk~#;sYMAJupB5QAkzPy4@xa15PzaL<r*|xI2b|hhe(0!1+k_; z#27(pK;Z(SLE+K?H3t?hAp1e;$-yAK223g~ptu0}6B-vt{&aN;at#L?4N{BhPp}*) zqod4^$9z<3iGjEstPe(9hx+vkk{rlxkbDgj*#C?mH6Xu&XpmnEplYe*R|#g77Et(t z{0a?UB)@w4f$q!%xd+p)AURM)h3G^4`KZ+50dY4-3mo5o`tuHw9LQdff*fXuKS63h z{shq=f5t%7Qp=wlEGjLaum$-O8n#IO4E4i1kLCfB2SqJpsu&a=b3Q4x7(m<)@(LW^ zg!=akk{rl>kb)Q%h<`z9K>h{MApd$m)l$p9KUh>+Kw%8>FEor1{`GWrMJ~ZXenCmc zaCwk_A*DA+jm>AJ76pj=L0*C5TTuV*L6QU64^rU53h^&U4amPB8suLKs9I|I_W`R) z3n+|1{)L7yl7HQuaP|*9-JSeFlO~X3bijJ<d{$}^fVdmv1vtJ9_2&{KIgq^|1r}@& ze}dG2{0X8#{#1dgrItUhu&K0w!WQIDXxM_?3@(E`{apP0T;W{^P@JL0D_kBls)Mr5 zu;z<W%MYkqLH>c^J5WE*fcOtA3~~dAp}`LEGe`}{&mbD)X91{MYWevHyGjcvoI!qu zhBLCCL%l;hLqee&p|SWGDi7*JK#FCM8kw(3EpMRi1o;Jq??V0C0r4AH7-T<)A;1Cg zFGvl@zaSdqUlyoZYWa5!he``5j6wc|hB1<VgW#i-Ab+67FGvnlCPTWzAo)FCm0IpV z-3Rgm4BvzLvjE~JurSD8FoP4~PmmgrKS4C8)cXK6hg$xe!>Q5&3R{prp<#>U&k#o+ zL{|wcj_Oy4JZSV8nsvcyV!kQ096|CE*gp&m4ELe_O@R0fEDW+A#P|RaV+5%I`4>ck z;`I*H9BTQuhfAde6viO`GC=GEyBVB!y&MA^{qT%W!sJ07hUQ#Q{Qmi-)UpL?7RWC! z`~d3T04{J`f`vi$gBTAWVvHa)Ape4BkbloW&7qcmYq(WfKw%8>FEor1{`GeB^K*28 zwirRJR0al=_=U=Yn$yVRSaZHBwJd?SALJD{ehBri12@9IAp1cIE<nT>L25w$1<@e? z?tz*^E&t~5sI-8>8024Q7$f^P*u&Qo_xzZ*BSaq5Ook?CQ2g5bP->Y1aX-i_aQq1B zUjrV5e?j(x6zqVAF@n^9{0pK%{#^q#hg$v(;Z<n?g)zv#&@e{!Z<Hgh{;;=Wl%qGO zoI<oM?)*?{X@R&K<OMi>4E3i3FT$T7dqD~oK*Sh9YC!%3(I9`$fSN-sf7<Y=w1C1E z<WFeWBKgz97kWJ}SPV4{gXBQ<4q|?+=BH9i4#eFcFTn8=s6QF_5dH+&3sTSl5n}|Y z0r?X|gZ$Y5HHTXMRN+@?0fjBdpU|)c`w3h=d3!p0KvyDx(j}@tL2{tUUC1CENM7cb zQcDQL-5@W(@l&WjUm(eW>;)-k;0ODi5u^s>PY@0AX9iR)wfrd~pwa>gTaZ7YVT<ff zzevZRaL|qIAUA<9$UkWQg{uMi8rt0lo3ZDYQi~15A0Vx8{0!>v2S{=tcYqWW2tfP| zQUmfghz9vP0;-l;{^k)>X#s^b$luVg2D=#&zy5ySj-Z=rK`z2p9z*0osTtY7F~5~s zOd#%uXoQl_q5i#qBnPq|Bpo9N@h?aX$iE;O<X<1CT59?ChoDLeD2ze=g@!S*e}i0c zjZJ#{gXBOpEo_(_tnbfnr4|*4+d<xd;}=lB?m?0R*$q<QAq4R&NDauZAR6RX3#eLZ z`SppAN((4_L4JjXFWAkHxQz^QkBkC22P}q~mceqMY8G1SK;nMRAEg!nh}*&XV8lzP zUsoW>f$Rp!8wf-E3Q_~|D~Ja9RRyY+T7EqvtkMDsUyxs+;S2T`*sng0u&y3h48^ZL zj-aldDRdeTEN}ByspSvUeIP%;@GGc4CqVoJ76#c1Vkn3}{0UM6@+XJ}`BMO@mRkPY zBcjp*3R{prp<xSlGt{3UVffm|K8|2{P)83^DnsJ+&R?aLCs22S`~t(Tq5f@v_zf%! zvLD0{5ry~{qz2?)5DoJ0AE-Ih^6v&wl@?GKgZv8(V<i82hIoV`c7tM+$v$v-ke6Xa z6j*=FKc$u{Nd5x(354H3{aga^A4rG+<OUFfM-1X;kQ$JmK{UwEZ=mK-%g-ysR9Zmc z4DvHHoWX8}#Ib)k=$c~xASZZCWBMCe4an=Do*E>sW&SI*oIvs$$X_7*7V7UDh#x^h z3?O%a7%bute}mM3{0*W({(b^Ahg$w#Ag<B^3Tu$Rp<#{W@6ZTWUnl?2Aa~q-T_0pM zphh#o-x3U}EeDYN2J#mOzk~Wa1>#4L5Cg~^AjS`f7$Zmx$lo9u<nKFBbExI-DH19z zps)t{8yeOKfBQN*ySgA&<zU1$LLL;+kj67~{$&S)YRe9YA3)xL<M&WMM@WF<6)X;N z1BmeeBE|?(1M)M7js=}F4>gBcey)*JX#s^Z$j{JlM)tFhV<gBmkTi=@Ui&)wI7Wi{ z35d9jU{q~c193M*6O{Y_^{0a*!k-{}LDCl>VvHa)Ab)~rP~0AXnnNvr=18fufWj8! zPiWYp`P0$I5qh{PmbmqCj0DMps$#_W%@0P^mMIYTgS-OAAEEv=kV5zuWIss30f-nQ zNDaupAR6S~HBfV?<=+@-l@?GKgZv8(V-){}Acix*;^=V;k_W{uWG4<J{%0_$wzNRp z5Aq5ee}ei~K^oy-ko_P98z5qgAT=QWf@qL`=RnP&mVbR@R9Zk`4Dv5DjKTf_m({+G zex3oLxcm1oc~AoyG7SdSYr(AAQUY;5$SZLC8R}mF8H9g9_Jb76fQT`I)PVd8qCx)c zfto`t|C-3Ew1C1G<X>nQgWU}EuRqMQSkkgTWU((~pb8{^gITpD1>$ay7vT5{)So|) z<Usa<6!ge~{muwd1M(+`2KloBs+L;*)R0qY0fjBdpU|*H_Gdt-OQ@fFD2_dZzK$?? z&@2KhDTDP_u&B29K>Psm4jg}l`uPo#9LNnI1vPRIKZDeO{0yQ&eold^rIw#1<W*Wg z;SBOKG@QY1hQ@7>V+eGCGqip|%e!ECP)P+TnIU;sf>pJ}0pfm;SK#;?)W3I-<Usa= z6lBOl{0mY8@-K)6`8NWpmRkO0QBY|Cg)zv#&@e{wufK<5IApL2lvYvw3YG)KEu>I} zhQ|(8)fNMY+d<xd<L^+vo<NcV*$q+<p#bqKNDauZAR6RX7pPil`Spu}N((4_L4JjX zFS1|#-2D+F>sb5?l?N46kS-xeO$3{2iwwm5Ag{pj52$~4AjyI32Ptq-g!mVv2IOB5 z4f3xER4ujq`#@2p1r)|0|3bqU;a@-30N8eCkUvo379s~~JVFX8Xx#o_Q*GgaxE<sT zIQ|Ls>k=e6kli2!CQ1;$g4BTg3Zg-NRe-9cmR~O@skDH?7vxuH_#*k$KPcQ4vA_(| zzc6{w&<3Oz3{o?LUA5&0)SV!|!0<1qf2TnF1{Ma{4`Qe&L;MR;1M)A32KiS2s+L;* zJ)o@80t#c0f1zQF@UOqKvu6l&5C<A}DDexG2aVCe2690Dwct=~c>#4N$S*Mb8|vQ{ zh~L1%Ap1cK9u<gxL25w$1<@e?GC<W*%fBmBR9Zk`4Dv5DjFJ2s<QWN_F#-7l)vq8q zP>Bp_T!7?naHzK2fVvOl2N?bX^=A&mPheq?y&%R9h!`VC4alD$8syJ6P;;o|&nc=Z zEugRk`4bwp2!94R2781+hH*gtK=CI;4wPphgX++Dui#W|IRJ4x$Qy9{7wXptRdD=) z#X)w17%w1Vj36~2zk+CxU#~#Tp_X4;)KpqP;S2IBG<=c#>KX)}u!s5u)xQvVP=^n) z(gs@Ba;dhgfw&*!6*&F}^{<B-!oMK<K?<%w#27(pK>h{MApahLnnNxB7O1PVfWjE$ zUuYO3`PU!5%?2}W!E&I&3A*D1;@2Hqsx5OMZU=b-j{igbYNC$tE68q;f)fxiMvxki zUqLj;uN$D|P|L3=8Y(TI@CEr58otPW4GIZ$4~2Duu=p1y5Ari?m=3Hzf?Ktv1L6me zcM#Z%fq|2Ofk8t9;b)K=Kniw1#26X87#Ki)2GJltFMyguEkB27s<eQ@8RTbZID_2` zZaW5q`gu7zd4k*n!kB)B$b(8Mn1?}XesHU{)Ii)1(gw$jQ2$D3BK!-oAEaOfM2r!n z2IOB54f5|4s5#W~uZxyS3n+|1{)L7y!oPu`uFf8z&{7$aUQzNdR321dA<tva;8AVK zfw&*!6*y*s`j<ls;a`ybAO$lZVvHa)Ape4BkbhgC=1|MOCfX`3pfCpc7aGP0{|5Pk zdb03J7Zi6W{)NedQZ%G00_(NlRc(oZxF6&dIA(_W_Xm<3$bOK54sCE4FoM*8{0pK% z{w;y3rIvqHbW~bEVGQywG>pM+2B&ARf1n$9v6atId60KugU+BZxxuU2;sbF%$SZKn z0`>0;Bsq}%AO#gV5dVVIfcy)hLH<pFs->2HMRZkKKw%8>FEosi{2LmKw>}Dj$b<Zg zTpv~NskYca+z;{!9J50Gdjm-hWIsqjf-c0rAT=QWf@qL`L!fG@<=;QLDlMQe2Kg5n z#t8ogJNm*3D^R?lq-BsCXn+cuaY6DD{HiTF5O;&T0LN@le;z=R1KA5w5TFO~CrAy* zpCB6KPY0-4YWeexo=OWSY(f5nhApx`{er!NJfX|vz~X3rg~)>nX6VQ=$iF-IRa-<L z?gx1Vj@hC9-GC$qvLB=%Kp)~?kQ$JGK{Uv}I#9J#^RK>23n+|1{)L7y*k9m$8|>^K z65<)`5%2Ek>Vs#m0-8Dng9=MnXAtE72m#d=7Knd9UV~!}nE#RF-ay$71`z*))PVdC zqCx&wfyz_M|91>jT0mhA_CM5Ykeea?cSV{t!cs2<L*zmE7&d4H()$DCUx@qReg!c& zq5fTfBnPq|B<ElV@h?aX$iE;Olx1X~YN_U5LzNa#7=!!^4P&JEhWH0|#uLb0APn*o zYC1<%2Oii#ItyxsplZt(sJlV>VVDc%e~4ef!gru-9V3YUL25wfrGRMAc_|`Ld20Fp zgpo=MD9pkBhnfxYA0)m#{am0!b|5iSKZE5!13IuG8ys#HLaHrapyq%*1SPnke(izy z3oHt<8^n+?hWHhv1{BvI8kDv<plYe**B!<xEuioP`4t+zU^m13>fz`EYgU8B(ftdN z2YDHk5+UjThLCE@1E@Peet}^gsDEo9egg}G><2M8Od$RRsR8*HM1%bM18NSn{JX?N zr3DnmApb(c80;^Ie|`MJpo{4+;}$Fj%El0nLfa@6!m2G7ko*Jk3kdT<{h9&s7f6T! zWH*TM10u!<QUmfUhz9xf3Dg{F`E`n^N((4_L4JjXFREXW4vxj@U$8u=M~oQ5k`PgC z*#mJu$SZKn2la1+DL5X%;voA$j0X@gMvxkie?c_JzgM8<P|LqHW-2Y9Fb4S-8pcTe z^$+oY40V9TP}4C;4%Bmi3_XLwVuy%o%NmHgL0*7keyBek%n<$r*$Yx|0V2i-QUmfQ zhz9xd0Ms06`7_5{r3DnWAb&!`7VIZT8V*1lgab{ZsD6dWgLa%C*GCbesx4C>?gx1V zjs>9pH84l`7i2$3!2yUEBS;O%zaSdq-!)KksO8@n3zZg77=!!^4Pzw#hC6zA;yGtC z7$Og9ZXvffeu%2Jv_RYs@(LUaLj9{?f$%TLevpC<5HUuO8jycMG|0bmpyp7^zdn{K zEub(4`4<|-$o_S8fv?tpl((qy8xEES6;zO27!Wlx#8g{KAnpfw1&)QF{uQu9_!ne9 zNWmP47$Zmx$iE;O<li2sIn?s6g_TMRD2ze=g@!Sbe<OoD9U)hxf$}A)U%_&q$_JK| z!TK!3Ra;UZZU=b-j)kFq{evV2vKyqJ#R}|yMvxkiUqLj;uN6?W)bgu>wMq*pd_jJN zhA-I7;Jh2+=;aBS9s`S^_!TS%DvKeVeNb535LaypfVdmv1vnOg`tu2r9LQdff)Z<p zKS63h{shq=f2KgyQp=wLHYzQkum$-O8n$3RLH+6L80G2i0qrD#{DS6Js5~fYA)O?U znhFWk77K{`L0*AlQK)~fAjyI32PufLf%q4s2IOB54f1aQR4ujq`@=@11r)|0|3bqU z#lN1=ixENoK=-Ss52$p4G#Nqi5|XMd8W4Abya2~yP=D@0k^|WbQs80>@h3<P$e$n@ z<WC!@T59?8fvrjlC~QIggoZ7$KSLa$CwPPWf#%N;#~_eD5p9VblBz8N5O;&T0LS7` ze=b3i1KA5wU|<LFCrAy*pCB6KPZg+IYWeewok|NRY(f5nhAommU425`LqW~~i=p}x zEC=!^N|_WPrP}fX>PE0eC?Ns$>ja3uz@i|#K@16dh+jc!Kz;?$AiwfJ)l$o^TkKU@ zK;aAWD>Qt;{(|IH4@aEiHX$C4pyQ1Up^FnhasER}wdD!aeIP%;uq4!<6%apxg+ca$ z7#t1|e}dG2{0X8#{`>(ohg$wz;-Jz33R{prp<#>UPfsUTd~=*35P49EgxrppA+6eS z2FXt#|A4R*)V~=Jzk!4pK=y+eKOka^AT=QWf@qL`pFqu_mVc)>s<eQ@8024Q7$f`F zJ;>AD4>q6<iaXSF><N(vb=;vdfFLy%GO8_mAnpfw1&*bm{*7=1$0b-CWIu@U1R}-= zQUmfYhz9xh3e+5G`M1GIr3DnmApb(c7|FlE;f_$>g8YH%SFjvt1QIrV4c2!<Mzv)P z#O)w&z_AR}uP#mqzk=)rDYya=V+5%I`4vQi{CWUt4z>JR;H=UD3SW?4q2UX5GbGQ3 z26^LaBZffaL2X1x?FwllR>-Qh%z(Hb<P|uUh5FaT8R1`${U8NLAYzOlH6Z_jXpnz5 zK+U0+e-m6(T0mh8@-H-uQT^-d3RyUYt<MAUudk~gs8EJQFenX3$f>q;K->@V3LMKp z{j1`F@Gr=Ikb(^mF-DLYkbglm$iEAq=1|MOKCUV)pfCpc7aGP0|Au<HdxSzNT97|b z(lSI2v=jrfs0bP!JLFVbDj;qLc>|8+p?(!`MfeqDH%P$(h!`VC4alz`8syg=s5#W~ ztBspV3n+X+euaiFl3%@p96b>SC}R2-CJ$;GLt+=CCPH4dB?aPskXPVX0qS1{H-vvd z_Jb76fQT`I)PVd8qCx(xfto`t|C+d~w1C1G<X>nQBl$NVfZ$$)P-HbAe?ux@kiUP( ztG0wd`~mV394kWo{R2r3<PMO626u2+FoM*8{0*W({w{#3rIx>CJXBghVGZ&(G^~;Q z9pnOOQ9;Tg)HEIB5(@GrG)05_IYU9U#RuYUkQd-s3F^-WNOB;1K?*WFApQiY0r?X| zgZ!BQRZA^@vUsYrfWj8!PiWX8`7_E1=lNBkAURMe1*vdB{<Kh3Z83qk8{`EzR)+fX z1d<%cUXX$qPl!K3YC!%3(I9_%K-E&qpFccRT0mh7@+UNG5&jJGbPe%C+|&f}3rd_K z<Uuiu(pJ8qsM;a}@dL;^aI6CL^ByEQkQ+b>T)ZHD2B`u08AOBpYywqFEk8f-QfUE& zGsw@-a7Oq!+|>s*gN@-|upFrMh$y2flvG;;Anpcv0ghFn{#=422eKEWK*t;6Pmmgr zKS4CepDIwb)bi&EZ<Q8M*n<2C4O=9C`uq61fn0+nuZDx<K-CXooI*lbwdDuYeGpv` zQVr_Q9*Cd7f*^ZA3=toQKS63h{shq=fAT=pQp=wkd{kOMVGHsnG;9(6jPUTsdDa$K z4%B2s>dz{xwmg8k599|JR)_kt1mY*KFvwmI;}1lP5u^s>PY@0A=NG6s)bi&HUzHY6 z*n<2C4O@giBOSeQp6ddZ1H~s~sTe3-N2sW_oPf9+<OMj^fci7W7aVtBage<r#si2L zBS;O%pCB6K&pS|asO8TZKb00x*n<2C4O=9CLVB_wKcJLFk)U3zIV8bC+e<%GR9iMc z+zfI)9BV@T=-`L&BgjsWf-?{?MvxkiA3-$8j|ZUUP|J@Q{wgh?a0U4h8m>rw^bZPk zg7oSz{Rx%>O?04?w=+~#Tc$wV4)O*ZYeD_0<B#ww$Zn8=Ef6tAkQ$I*K{Uv(E1>33 z%dY_eDlMS!1^E>kz6ifYh5F!ZGl1kk*%Oj%!FnvzR9hM#?gn`Qj<uow6bV516J#$) z!3u~NBS;O%pCB6K&nZxIsO3+WK$R9y*n<2C4O_6AgF~IbT{`3|hmqqIO&&C@18pTi z%H|ttsx281KY+Xg#}-gOa|9y%3~~cV!5oMfBS;M>_&{_30|P??)EsL0*&;}#1r*L8 zKSRSA#m_FTZjPZokU?T>eum0}{0tkC0qd_&S8a)b_yOb{IJSiP`45sD$PFL`GlIb3 zzz9+U@-v7A4cV4J)l$pPCc!E#pl}BH85+)DH^bsFI5IdM>MxM9z;dv%3X2+$-ysbO zXt^b!q1qAv@e5c#jIe_G{Rfg9$SolG8Nm?0gVcch4x&Mw=^Ut9s`))cr3Dn;AiqPy z8|*)rznnvZL;QVFybqQ~_dlvSP!J&6%R4kwTYMn?0eKCMtzrI0k~0Yb`<r0_gk}V( z0r?+9gVvSgK-E&q|2Cm2Eub(5`yXmHC|#rZKh!Tcz||RXEfc;lKvD||2Si&WLQ}QH z2jVYy7=Rcy&~RV~h4>vT24$~+(2O88pl|@uVGIlm1yFOS6%H<8DlMR}2ZaMP?7@D7 zg+r)kJZcn!90^U|=xG5%Ehrd3j)$uMp{d#u0`V8r6bNMt4F`@eL^y!l1(MwX5n}|Y z0T~6NL5n^rpyp63974iXT0m(66b{g^M+pb`HRJKY{-Gfr@gTl4q-qDNLk|m(Jowsj z6!oA0ffSFRv^GOawIv4PKaf}9*Z~?I65)vO0J#sO-~dF75u^qb9v~Vt;?M#$hg#tg z6QR-qiUUx1K;r=HPguHegkD1)4`qPd2ErhJVT1*mT0|&7>O~7})s`HHzd%O7u_H7b z6e1Ae0CE>d!4ZfUBS;M>96)qD0|UbZs5#UMhlEI#7EsuO!T}ogXyE|4o;=<y$kERk za#$4hFhEg<90XwVZfL8vltBCh@*W&JLBl{L5)lR<H-QwKfrv4J)PTYOM1$_4m;yD2 zT49h8rP2ZlcTgBW!yW8qcv^s5Ssw2i;^FBZ;0etYkhsN23utPQ0|FFo6*{Ud6%c=c zya>n6&~VU+LWBdzT_6QFAYzOlHK1?+(V*iM=0MG%RydSItF(Z^9uyAHutyCC@O9?# z!H%IWp7D+#4kRc*{=x_ckhC+3TI8Srn=7HK+R^~=8_1h*>;er7i)chxfZPUBa0Md9 z2vP$I3lI%zmoI^uL#?nVh*4<)g+C}Ppy3a8GdxW|{O1|u7zlC}SPn-RfYgBej?#A8 zp{v@`1Mv%3Ka6mN`rRZ3;dhW*K=M~0VvHa)AislX(9shspyp7`@3AT^pzsFy9U9(X z|DpNa)jcu*(qM+xe>nUPRtE|INXrS5ZzA+mTRI^A0eKCM-C+KYMe;wCeFZ`@g4BTg z528VB#}!a>sOJATl@?H#gZ&RR8<fV;{O{xG1lzd@@e>aJgVllj4{0$$)cyeZAL1Xl z-$4v_nE&ID{10VcfzXT~H6Z_kXt4jG=1|T5@hU9^u_`TK|3l5j;(tdUch?|TX$X?X z;eV()PzZor4e|dBebtr@h<`xdhGP$y|KpMT4`pA0(2O88Ad^5esIRyJY7W)>pP<rG z5C`=?)NGLd(Bj|MKgi$N8Ou6P?CL=NhwP36nPp+1+R_2>58Uq{h9}Jb2}u5jvadjB zMvxki|3Ng^|4?(N=Kn;MmV$Vw|Dk4s+>GY0kWfF+)ioejL*f)i{6p1&{BI6c3^MBm z$o~-kfW=^h7tH^ONdAYiFF<HUkQ$KxK{VL^P;;o||C}V1mVyMR|Dk4s+>GXb(55-C zvq5q={0>qB@;J(PUxlG+O9#X+VEr({8|rt1B!u5VZUM<(fQT`I)PVdBqCsW<5~w*; z^Lw&NOF<&U@6hnZR`y4_;+O+R3nQ>PPyj$yoI%owgpq1X3&cMlufeeo%>T(q{)e(J zKxjsg8j$}%G^p%b0yT$f{!dY90fjlJ?1P3mHvb2MR)fMEjwk-X>OlU74T6Hy?g058 z;vbk1VA>bv{}d$uL)jM~G$Tk2$p0W3?0={^RP%qTN=r^MH2$GxgWQZ3uU`H^E?D=A zVpRtU08pnE+D?ctR&8m4_y_E77~u!=e=3syq3jC~nh~T1<bMziDtebd&7qqA(^Oh= zQlS2anvKQ(KCVuVe*T~cfcgnX{)egq1ps2b{|}J=A^w4R9ZdVf{GW#8e<=F`gk}V( z0r?+9gUY@oP;;o}|8$j>oK&d)p=M+8zjtW3Bi4O~Xz>qG2l762fjG#l878VNEfD{J z{S6}mVE#`>@;{V)0zxx_)PVdCqQUVGHHTXMPsvbe$w`CyA8Izp&1n7#b%b<<!DR!E zxDR!71$i7adI2f-EKF5fS|I*_c^OOxLjA3gf$%rT9U#dQ5HUuO8j!z1G$`3EfSN-! ze`l(+<fKFV4Gn9s-_ZQ+<mdrfA_H<6#7{W<4pj&8KV;PxC=73ys<zZX`~xunN(RCF zpNZsuDEkD2W(27L`5#1s()}E$IaKq1mP!jK%t7ToG|aL2KhP1r>KL#8!RkP3-e40X zApcjGskYQW`~&qlgbIfFKMTqKQ1%4~%?MHh@;`_M#s3_rIn?rhPPR%*N+vY^p=N{J zjEH|<@D8nb#~?5R;&NPJ09N7$QwvH3kWoR1dI@vYmKun^V8(#y5NJ3UWFx`><Svlp z1&A0UNDU|)Ks0DPYys39s)a+2N=r%>Bpje&kD3mGgTV_;;z3s>L54rT@)-F5MI9mp zKw-MWT(zYI;vbOL;5ZcK{~RR$L)m8_G$Tk2$p0W3bYs;Ls5#W~e@3oK3n<J%`2ZT` zVE@6>L6mEdXS|PNh$ko&LgEv{?+7&rk3;Lp2n*Gg7KmTq{su9^pnliMMfe@$7LeQ- zh!`VC4an~x8r1e(05ykde$P{B$;pAlJv6+r_}w`&$kPYD`y3RX*!>Sv2MPkn&<{xM z4-3_n28e$^UW4OsnE&&T{10WHfzXT~H6Z_kXiyor0BR1^{GYGV0t$0b+(W}0#s5x@ z!5-e8LGeN0<02qV2l)xz|ETIf{)gm#klGoRsx1u=|3D0Yk`XZf=Og(a%02_389{15 z{s+;ZGi?_@&7qqA3shP%@}Th#H5=q+SlV}T3=Rx+jfYTBcZ1}y_#dGT;eBveT3D&J zG(h|VH333J!u(%=<bNpp3WR0^sR8*PM8_~NFf4$YLoNRo6sojj<U{=rH5=qVxc^;! z9D_nZCyB&6L6{J?gVbPz0YrhPqaREyA|OEOZ-Bx9;xC9HP%;V{4km?&Z~(arBz*-U z#t2da3I`Ak>Q^m+nnSg4C{k(3D1d|mH0;4~hX@Bh&@HyeRRCBXGYpW_A-oS(TVbu* z(gE=g$ZK#M4fB5ylK-LXI}n-?qz2@F5DjVruYj6EE&o>(tF(Z^98?ZK!yN2pbpJa! z`nmf!y0~InhlpD(C?F8!p@fZUO9#YX@Gt-|VxZw*Q;Y})kh?%~EG1wuMvxj%IDlx- zK=c}@In)Y=1tlsi1x1i_01bQ8aPSWXEf$Y=0@Lvxu0c_*?*3t(evU{LB(&bcNE={1 zemM1lLJ8zIkbgn>WrvMw%LJsb0EvTeEHs=_AYlR$VgR`t#4sp@gcC>&$Se?D#lXOD z1Zobo!s$$@N((4%K<Nb<H^hb$tdayd7p#YbaDwRt1r^HpT7<1?%MPUQ02|K0zz_!w zs|k>B0SklN4q_OTLBa~81{78xx|V@~;SJOrs)bdVN((4{Kw$-qAF#jS`6b9T#NQ8j zwiSCD%L!Q>C<Gu?EZD3cwyG^pko*Yp9|*_8{15RfNQmJKlx<NC@jpln$p0W3v>t;6 zDo-u{Uny5<0fjl(|4_3*=^O6<P#?&(o$*dk7TB3!e_^Bzs0u&0T0}sA%$#AT+VTWy z2gDQznE(xk84y2%1wrltF>ERz;Q&$t3I`A!&A`CG0aZ(_aJW&S(gF&5P&h!t9_&Y0 zI5<0oIQlsH#Y1V3)4=lRVE~nfsY3(+wA`_<S8aI%bvxJ)D3J&agE<iYf<-}Y0x>)) zAz=Vg0}2BW4Vri7fvTle7(A&|X#s^hC=8(C4)!BF3_LtRx97!&1Ub5RhIsn>If7Qn zVb2fFm})V?;)cCy%Lk|*K>mc`BxqQyfcP6M400QY5l{sQ3y>O6Sb%6y+fxLpmRe!) zrb?v+6#k&FfQCQTun6|_4e%kfUJDu)2(_S~K-9Sv4yrAGpza6x5r&hY;jjVXXRt8H zT_8q8H6$EBYCz!tqCx#{1*lqTg~OL>l@?IggTetC_E^Kg!{5){+uzR}<Teln<#&v{ z0SyP3T2Lq;&p}H#s<yB|`~@-sj#HrFumedB<Svkcgc?XVfYgA(0YvA6&hCV&rB*on zsZnVGg*_-7pka?S9D+Ul+#Lh_gP_BaU^TeH0j?Gl5YWkJP`K@IRBhpb_zUDkI8KFz z!vQ2Ykh?$%5^5pg08#@A2N0dWz`$StRZF#Ss8wkJg*_-7pkWX8BYGL(>*(wVS_cAh z8^}+%!T_ue<bRN(p=D%*lWL0y#6KYIaGVD7Ka$)ZC_AMN;(w4DkWnBSG{SEJm8X{f z8R}J9Kw%E{Kh$iH|KR@j4+{2lc0_40faEd!kE#w70?-x%q&)or3Im9r;Qj|O(xG8+ z1X->g?01F|2+asm0}2BW4XP(hplYcV1_BK#Eue4*g#k3&QPV(_tFuSEGnfo=4G49D zkIq2+h7lHEm8j~G0|XR)Gn`dhBq06+1p^#sK*Qq-k{rl=AO$rI;Ba9CsR4xthz8Xa z4p6n!3J-}!l@?IC0EGuM4p74*$loyp)bn<RFhFhtVUWKt!UCeiFCMBEJsd1tR9iG4 z{sI{R$C=P@xPv4Ib{7K!!xE7D7#J8qYCz!tqCq=|eV}To6%GzfDlMR}2ZaMP?6HRf zfesqpaKWV)6i`TI=nWUu76XXC;b8<~WI@A;r3suiKtc>4cY_#9AYzOlHK1?;(Paz_ z3@K1^s1{DmDlMS60fiGZZcxI>1$>HEyo;-!uVWCFGl5`b4XQd&06>ZmQ2152s<uQx z`~&hD9B0G)-;CscD0>ZrW(27L`5#1s#<VM-=1|N39xW;@pfCsfA8Izp%?N)5dB!`s zxqE=Z0mr!<xYQy-0aDgTxT&^8K>P&{0}vwz8V)=yh;RV83naGzBE|?(0}2Na4azSy zP;;mi4nD0aEe_3)@eF9#qoxDTFjo)Hcwa{!7tb))V35<m^5|s-NES&Qau9&k?{HIX zNr3nXYzB<Tg@%DZD<TX)ZUV_KfQT`I)PTYOM1$Iw4N!Ba6$UnKDlMRJ2c-pQxP#pc zkKfP`XAh8rplt&Tzk}qFd<;rQ5$>ujDG>KVbwa2-sDByS5dH<(50YH~5n}|Y0r?k1 zgW7O4P;;o}-*%N2P#A;!3k_pT|AK~S5m$_W<+1u3rViwPNOuCP_J_M_O9;e2Ag{r3 zKFt5^NdAYiXFzC1kQ$KxK{RMAvjl1mwft|=q0#~hbFlxRW`p7k7T>OZ?x4F1;zJ?H z9qb=;za!LuJdP;yW_YN!gh2cO_cMr50QL6|Bsq{fKynj0z+u4%QUmfghz8AN6+qQe z%ilVkDlInckh~5JYp~xi{Eer)hx;3JueSjt!a-qY;i=l<1MvsQOK@BW_4fxPIgmR* z3VJ#r{syT5`5Q!odh;1jwbb&rMwdzpD6B#84Gn9o{&s{$ILJS^;@dGa7!={KE+g2S z8=k5yE)c(fyamTaP`|%Hk^{K~q@be<;&+f5kl#TxXuLWBs+L-QSLs%10fjfn@6hlD zyBR&souMnY@cG@@5p;x&0knk!soN^NR9hS%egSz4j*Fpwe}N<iatla7LpQ|lAT=Pr zgJ@9Q76VmFEx*h3sI-8>8{~Ircw_auUlhny5dYwccfTl5w1Zp=Q77T8+F}Fo2ShWJ zEP?v_0g@cZ9U$q39*Dm|YCtA|Xi)z&0;-m3{_a(20fjZl-_Wqe>Tg$1_z(eD9+%%i z>Oj7StW<{he}}hfiwVR(Ag{r3Da`*!ax%SOe=|&g(2O88Ape7CQ28DLRZA`Z>-4F# zfWjQ?f2i4@bd8?oF?Y2={DvzWkky021F~`%q9?*fwZ#PDKX_Px7-i7#_<$q_avw-; zN*_2}7(r@4;Q^vS<Lfa{wbTj^gMO73P#l250~!b5_(l&8FGpWTPv{0eP<Y`A2dFww z5TMMl{P0n2ae?>=<UKephlaryBsq|qKnmvcL&5;01{4M$8nk;R1*(=>VPG*qr3Do3 zpfG@jJJv98b`0`#a)R9$4~bh`;Q&_)3JK_9W>C1z@KtT`fcOjKML4d2hQl8uIgq<R z3g%3Jgab$oC>%gEsQHltRZF#Sn5fbM3VTpEK*JtuI5@fbct(L5pE%mQuyz1M9Vh@m zv+j`avhY)F34r(q<TW_1g!vyy&SE0i-waD2G$Tk2$p0W3w4S8^s+L;*cbKHo0t$1m z|Dk4s;tV}6gamo|dAc~dz#I=!gDV}t)Ph0*x}+H#rZ+(00Pz>h7%*K04F{G<5Wj;2 zLGA+4Yan8bAT^+H0MVeju>@)kwZg$;vPugm>_OoG4STSg(ZeCi)7Qz-DIA&-An}VU z9AIie;Q$)<1o;OPZWaEjEfElZfrQ|=8X68flM&$nau-O!4u}{dNDU|)Kr|>EYM|y& zD;z?msI-8>9uyAHu*Vt>0iZ*^0|G#kPax-k)!+&TB(<QRfUa_egq=iyYD)sdZ(ws^ zL=7}7B&Hz30^~N3{0@j1BS;M>EI>4<-OvIxhiYLlRiy<K{-CgchCkS!=xG9JnIl*p zS2%#xAuV_XrG*^<sx3JX|A4#($F(s3Pet-Slzjj~GlJBB{12i*?S>wxIn?rh%ruo2 zP?&@L4>cR)W_17ig03qMhV62L#4D~afT;xq1EiM-Q6CYg+L8nD7d#9=j5=sIC`?0y zLkyIC0zxx_)PTYPM1%6g1gJUG3Wt>GDlH*XA^k*X*n{I4JsjY3M<9n2s3+iRK>-2j zHiFIk5vbZy0`V8r6bMxh4F`?sh;RV83nY61BE|?(0}2Na4XP_=K+U06IONPwX#s^j zC_O;K9_(g#I0T3IgBSa_LKq;ofiNh|V5A3#62Ew;T2R4&oE~NbskYQW`~@-sjvJui zU@!v_4j^}d6g+^4F@n^9!U05s#>W;w&7oE})XY?A0fjv%9H3#35)N*Tu0j5;!LIRc zjzRve@t(mxj(#qn2*Hsiu&YOe2q^q4f>m2uApQe+6^<LB;o&e75gs7-ffRgzh%tiH zfWiYrg9_g@P;;mi9zC;ET0n6C3J+);poWL1k7t0VpMN}3MF4Ui2!s5Fo;KXDs7Hhb zq`bHhtlBaK;y;ivaNGn9kAPW-@Bq0Fq~Hrgj1i;;6doWN6drq^=1?m<Cd^i80mT6* zJfLxa79M_npc}f}JpDi^1LQQYJZ3ncs6!3{u=<J+)s`g?KY`7F5zWvr2$_ut1CX0Q z@=qXQj370jFaXh@`N$(sbEp*t4RcglK;aGw18BH|-3%)$+=5*FV1vk5(*Rf=;bo8- ziBQ#+6%hA>yaLB9Q2)BjLHHMBKS;q7h!`VC4amPB8gx|R0jN1t^Y2`h7El<2{0j|Z zEdGTJ4uf0<Nyiv*4)!-p9mxNX$^qp69igf%Ga&wf7yu<(Vg8?s<bNpp1%ze<sR8*P zM1%SfJD}!J%l|F&R9Zk`4)#CPY>=B#<2&Bj(a+Jv6VKQhBwfJOfdT+!Y%wBCwPgmx zPf*`Os5WRAc+5kD0mw}t*%uHoMvxj%7=UO{pLz$>9IA!Ee3h1lxsY}OG~BVJf#7h@ zU}$ZCHw}Q*fdT+Fzz7P@A7QF3b0Gc!c@2)+Vg8?w<bNpp1B7M-sR8*PM1yvw?17p? zE&ul{P-y{$IVcT4!yKFceL^E#eVzP6gJ27jK>os!4-jfW0ReJ6v<{sSuG%sO;xBj@ zfEXRna0pm{2nUe6Kyn`-VvHa)AfrGuC?XC(&7oR2EL3S}nGZ<^(6GlA4!-_=j<BN< z!16f40HO}$f9QZCD7-8pR9lun`~&hD9CyO}zYxj)Q1%}P%?MHh@;`_M^&5^r&7qe6 zXDm`_0fjjz9YDhz>_0?V06G)FFW%2J#KScRR0V=!0asqYPzwqPSW^*f?hQ~_K>P*| z2N0tR8Wu5&5Mcpw8%U02F<6Wdqy`igAR07QaRO=%wZdY-VwIMjg^;uW4S%qkVPOH< zB;gENhXP}O90yI~=;;BbBp${<3JFk}sEAZ;*?{C%s8I~v&~QkB_!%q=au<lfvjh?j zAT^+H0MVc|YFD7<P%9i(EKz9zg*_-uK*Jt299;c_K+~)7?hppZZ6FNt7e+Whl=#8a zA_W83Oo=GfmK{ib1(^fFJ<xE-f%q9D!~k*^i17y^#t2da3I`Ak>O0(lnnSH{n6Xr) z1r+w6aDawA*v;_t;2Pu$tscSRn0^PzBYX@BpB+)EEe9a(2YCgKd!hb~SqhG0usFzm z5aSO-j1i;;<X;dCY8TyrnnN}JE>md%g)zv#&@cx33)R2z;JOavE)WL!3A?``>Oj7S zw2B~QMntq~%La&lK-%HB59a@6NdAYhmxIL^L25w$2hpH9@dDHwYWaW8a+MZPn1lTf zH5=qVH2*t>28RUUYZtkL(?vW?9ViG;+C@J=VF2?RJOmgR`k`Tv0P!za2IM9XgJT6G z3_xl?VF02*?V<}%bEp*tOIE0~%vc5~0~w(1z!C<Cx*p^>TxB3691v<jApvb5fy|r{ zquR0sY6sL9Ff{=h4jB+XgT+AZ0x=|3Lc#&01{4k;8dM|QfSN<CaM-d^r3DoBptJxD zdu(~Z$J5o>BgEA&IK&mYftWy8Agc!j2gnZ~e}TfoB389!50alj;vhT`8Xgr8zk`Gr zK<)!EBvwJf1EdCI7KjGT!##nTL$&Z&rP2b515kKC;{Y{0f?Qp_<K2T?U7?36;tB^O zbs+!48V4Z%--uOhIfLX!kpDn<63qV)zk-Aqwm{h$t0DdesR8*PM1#tPH&An^<^LnA zRa!t{4)#CPZjhVdWkZmwD|m#!(-|BJU^dvLka7>BjKroMDL_DGSH!8doPpW}H402k zhK5H6#P47+ko!OkjWv+)0I30m2Z#oZn|y(qL$&Z&qtXJ315kKC;{Y{1gnBs!Ifi&5 zZz=`(2_qa()FA=@q*fwcwdD?yA3^>D;VCfxL;MO7VmJb2o2-TSAEXB4e-I7Y&+rFo z4z>J$VXaCFD9pkBhuRHtGb}xLIEDs0#`}4?gN~F#+CB+VgB}K0)FJ``nvZsX!UAd! z*uzj_Dl{ynK>Q6B1-T8xFj)r)3y>O6Sb*pZkOWjM)xu((N((6bL16(6f0VS~;p!CR z8XoT%9OUQ<S|bH=0@iRqR)-V<Ahi(*sx2>|?gr_H;b}1cL;MOBz5rz#tcUm?qz2@F z5Dh9DIiT{?^8cCjDlMQe2m2ptHptEJv;dk+LdpmrIgB)bP=n-iNZIiN<aemKU=Kox z=}^B<fcO(E3UUjGVX*<?caR#8-$68JsSpcPEw%i9WrIo!D7-;_hlV$5+=u!>_dj}o zS)g-XLGHsE24EGS4i;1`Qb>T*&q!2lc>;Am$P5^s0S$*45I=*3LGA)E95zD20i*^L z4j>v74jfRm)Cz|?8&z6BVGjxiXxO8KgQv4AsPpXU91mrI90$$Y=xG6}0-+Wy94wMl zTi!t34>bl%&4h--0*If%Vjy>c7!I2t;Q&$t3I`Ak3I_qGTB?P^CY2UY*n`3W8uqB+ z;O^uPD;7cS0%1_xVuS&bIwbFd&AO4K+VTbJZjgQ$o(1zi#IIoCJ5YAOW{CemYC!%6 z(V%^>B2am1`Txykl@?H#gZ&RR8{|J&S>WmC;_v4QK63)j1UnR0TEL<nJv=IsRa?G5 z?Sh#FqGv<HV*|wRARz{j`#_9{Es*d4sR4xthz6~Dkb$bDR(O2bqS6A215kKC;{Y6o zi0}yY4)F{L4S@_JLr)-rlzSLy!Vgs~dN@d=sJ5^``~~tN9M6G<!ww`lkh?$%GPXj( z0i*^L4j{S!wEq#RmRjM!vQ4E06!xHSfQCKZa6oD@fYlKS3y6A9h(LPVpftB5MYV+o z;y;jA;dm}IJWe3Vf!qgDkg*LC9w0TK@Bq=Ea>4|vmTKX#U8MyS2cYnP#sS!$@N^Lb znsxIG0+*T~hvCW}$m$T@2b&d<s@ft0@ekAl2sIDpe<V4U?O=a1#6W09kQ$KxK{ROG z)ds4TTK@mBU8MyS=3xIr%?8C8-2WktKKRBMJR$NRAH%v(U_bu=`5EE|h-abXe5jxI zAjyH;0FsW`0rop1NDau(AR08@Zvs_IH9zlAX#s^Z$j{Jl2D=%}&yay5ki&4rImGV} zb)XP{Bzdq|GtyLB1R(x_ngF2|!2FLS_XEm~*$MGKNDavUAQ}|s22gpb`G2QM3n<LN z{)d{49Oqt+0gm7U0>BK2yFv2kc^@ndTC)IVfC2!L1VCyn(p6goApU_E03{c~{EsB} z1Imus1@S*f4aol>8nkcC04h&4|L;<10fjl(|4_3*ZidCbx1*n*ql+U_OBs7TfT9lJ zeQ^BW0Qn!{AE?hE)FPPwk>q|r*)h8z{s*Z6`5#2*g7$tx<*DZX-6}1hFbDe|YBs9> zgFSpbgFNGd9pNjqK=SDE@9l`J4io^83;<GFk)hfm0PzpR<4|%j%>PJoKcMWGJrMtc z)PVdCqCso)450E<^Zy=|7EqXj{SP%8<Yq+tL;VHn3qe}~AbFhr2dhK%zeJ{LivYww zP@hAnB{2UZ$^C$`Q}#mq4^jj2KZpj^c?M8<YWbgGpGpfT%)$PLnho+F!v9f@-tpd! zQI6go!36egf>j}@1%(2n6oBNJ9iVW4_zMyMP;x0W9F8E%?F0LtAq7G+g4BS*0Yro5 zmrS5)sTL0VRa!t{4+;lp*n{&fJRCfHU4!DC9ethrU0^E}LE(gv4p7t~LI9*TB1^SJ z0^%R2&mq(@nE#RG_Cx%i0ihW|YC!%6(V+eA7Era+@;}P~l@?H10Q(<mHptCz|9d)n zxW>DOI)=FVI{H8|0!SXi|ETH^0RXKxe}KXO;wOmbq2zLC7@R<o1G@=yUlqu03=E7Q zHJ~s6(V%sj7Era+3Im>lDlH8AA@dB-a7Rr8o_>*zLE(;mE{^dK3gUR|;ef6d5fmWx zGqP1%WFY>67y>0%K*Qkzk{sAwpl|@WkAZ;^qy`iYAR4qwzyYe3YT<B5r3DoBptMi` zH5=q+cv|rH^LF$@8Ab(%6GmD<R)_FDSgl2lYKscQKTw}TsFg7PBgyd`g5-q+2+asm z1M)wJ2IU18s9I|I|IZ<n7EqXj{SP%8)&D{84J{yXOn-yq5grDqxdHMo#QhMDLdjK7 z{~kb+1KAIf&NvMAHzP<5$iE;OG*)E;RZA`ZvK&!q0fjNhztAuS#}PcfBZJ%{qvE~6 z6jCJs@)w5R!HSU7B7y;IW<{=QiwMMDATPr4YG^o|K#~Kw3#1_C2qYXpYCz!tqCs_l z1yn7y!r{jel@?IggTetC_Fy-|!okPUKi<a?)Cz~xXXt*1$|Lz0qD~@DwM7Qv2atE* zcn#FgdywQnZU8BWISTPJNDau(AR1Kvn?Ti4&Cf?wT0r3p@-sA?(fk||1{(eJaRkvI zmqGl5>35L4AE?V8=IMwC0#F*+k*C@s0PzpR04TW@=6@u)A5eD4F^K;`YC!%6(V)C; z0F|ef|34g4X#s^f*#A(oL2ib}xo3z+s3T}qI>gZ+ISjwU)u8%2B44#d0OAjbW+=H1 z>hCQ`av*nrq*IPV{0&kA@;8X~Vqjp<fvTmJzZp)bw1C1I<ZozLqsF^`xNA^+uz!#f zDE1+%2S8;H$c<RT0GoPHa6q~NV6%VZtF~}J{0A}yj@LuO;|Q|c32-<t)IexPkQz{U zfN0QZ{{~RC)Cv!YlPWEsH~@tQG!DRShNlDgqC?Oa5MucN%oA9{1cx3_upqaKXB4Qm zNI?7vGY(8|fQHK*Bsq{fL6SWu!QsOQQUeMX5S`Azz~BN^ORaFxIHl48N-LmnfyM<& zxcE9cyShMjZNQlz_kl3BFo7%bi-$AO!^5IbwZ#D9KaeqSyb&56Z;<4`?qgtJ=mEKt zfq@aE1{5A3I-7xkAp)wFYT<EOr3DlRpzwgk0a|$YI7WhwcX5ow+g}DXq7mv4Api=q z8-=PZ4iNvq{SIPmg83gwPUAE<9WX3_(2O88Ape7C&^qk|s9I|I-{y=;3n<LN{)d_k zax*NSK>Xzt6zb>d8Ser*$~xH5#}Rb;2KIUbhk8(eKuZpYzKSB%76*tQK|uk>o1tOC za0U_%APJBgLG%)c7$ZmxC`>>!s0_=1nnSHHaX72e0*VJvm_XwJGfjX(0cjKo6lUo4 z2skVd>Of%tD<;6^NffKLgh2cR@*W&-frbIgSwt9s+yqjv1R}-=QUeMD5M9K;z)%7; zhiYMPPNfAD?w~M$hCA5JNa-R3G(70*=o13zJwoCYOBf*3A%y@ayml0;wnRYu1M(Ui zZ-x2)9FqT`>@^UY5u^s>e-I5i*S!L24z>L6abBeb6y{+6L(K-c8R38bAkTO|*YNl# zSJ0ueu#M0lHJD+5rWP$6B1%+SA|U>PhXIJO4H^zS=Mmumau-N$3q*_&qy`iYAR5$$ zu7R3Et#Amqpwi-S4$_B)hCNz32nclv^>YvPi+A?$^ufCi+Sd_PEmAOm&HPcK+L8eA z7s!inyd4@2A{P+h0CE>d!4`-ZBS;M>96&TE99p2}P%RuTs<eQ@9+V!SVGnjQB0U5- zhIkO}L;HeOEWy+v1pp}B%qUfD$$<C=<TW_n0rUSwB>zL%TOc$eNDavUAR3e(I-urI z&HtBFT0mhA_CM5YkelKD_xErN_m1}kQ&5+K<T3IBSOHWWn*S}zR9iA2{(+hRp?1Rj ze+kL|Q1%4~%?MHh@;`_M^(#7{=1|N3IhR#h0xm-G0W{1}<KN%U-5)fY77sgOJ>C~8 z1oi~>u)wJYDP$n!>J3oXK>P|e4@T^QhK<2xMA(4b3X;D75n}|Y0fh~Sj$>e8m;yD2 zYGHFlr6u4JBy6DZfg@}Jf}BAPgN_|yrVUtl1Oz#QLIB!g0EJyexoS%b#6M6IAk=P{ z|F0nVAIiP}p&3DHK>i2Opx*uxs5w;g|5cS1P?&@A1~kl3{O{));OK)|G=SyN{g12; z$@^fn5*4Z~EfD`eJPsxI!2Ev|$^TIH1qjUuQUmfohz6}&T>>?SYW}~b(voup8vjtU zL2(8v8=(FIQ&4Av{e;8+V09q>!x~E<vvz>|5AhGo2r#`D=KpI*{)e(}Kxjsg8j$}% zG-y4}5~w-U@_)&7m6n{VQ2#^C2DusTfB&FxSMX*QCx35W=z;7w@_-+jTJ&&;s8nrf zf%psTe;Bb38V(lM5#a!G7fAjAM2r!n1{4k;8Z_R%0%{Jm!lCAdN=wc)NH{>l9vsh@ z;oukP=N}XdJw^|#1|u!N!vU%m6c9+|!H-JSmL7<|KwgC7{m^i5xPb@<kh?$%9zetx zL25wZ0HQ(b`Zqw$p;|cHRA~W)J*Yf@hCSGiuyF8qcJ>TGJ$@Q2j~)i7>OcVi$q}Hm zHKR(kWeUVUAg{sk0hs@9BKaT6z5}5dL25w$2hpIqatqWPYWct7mP!jK%)$PLnhkO@ z-2XwIk;pUfAUO=bBh(-~4$U(b)v7I1Abx@S8^kyW^}Ee2gx^7K0m(gqh%tiHfcy@k zGZ`2dHbBjxmfst0tF+YIgyaEec!T2>=Jx={V2==g%#(Amg#o5oL{Na#->6n?nE>$@ z$cu1%2pSG9w-Mn0au-O!6NnfiNDU|)Ks4xF#Vt^Cs1^=)R9Zk`4@v{jutyCC*C5CO z#UR-3Hb^@MJskufsYCc4qPC(&wPgmxKOnEc@nM+%?;!af%6<Z&89{15{s+;ZI$;OY z9IE;Mu1X6i%)$PLnhlCGcslS0AE6rH4_dJcbvZ~L!~e+YkOBatR-#t5Wd_7QP!k~3 z5t#q)BKaT6z5}5dL25w$2hpJQ>N}w3P|N=n_f%RM?m+SZG|W-s-#;iM)IHQS7}{e5 z`3KYQFf|~LLkfS8x*Z^YL;L~pFqAwB^|#GEgug-V07<`rh%tiHfcy=jLF4dSpyp7^ z-yQc=S{m*`{0$9j9R7}X3UZ9{1a%oe?gL?v-*ATkLOm!nAT<FbA4JrtwoHKd4`d7+ zAA^R6&wWIAfZPXC@CG8r2vP$I4-gGb2T*gU79I~&T0n6C$_LOmKn;&jKQBio)W$K^ za6ndv6aXN#Kk8Il7C`(1@){f;hxz{jlK-LX4-lFWqz2@F5S_=sz;FO+4z>K>^H8M) z6y{+6L(K-c8CDJihPpa?ggVAM`TKZ=K^LNc<k8asnmVKqfTV#L^{OokAbx`TAH+BT z4TFG(h%f-T2_*LgBE|?(0}2BW4chN{0BR1k!eGK9m6nbNkURkmca$^$^P8)4sH2NN zsAUTA6Rt3Tssn`qq)>ph3mQ~gmO%Uj@*W(YgoZ)LBSaX0+yqka1tP`>QUeMD5Df~0 zBT#dw76y-1T0r3rN(azz#~KC!u0fz>aUiFG<#B}pNF68uV4HqHY34?QYRd|Uf57@- z#3`8nA0zo6%KihP89{15{s+;ZKH>?eIn?t1j3+8BpfCsfA8Izp&9HnB<nIffm5qlo zU~UJgK@S6{5<i$)P&go$hZT*gEh`}Yf*Av*Pea2Y<_RJkK<)xbay$i#F@n^9!U05s z<`&LC&7oE}EP1NZGT|{KFF?Z{9M34>5bOb3cN`K0ISd2jJg^$9;ee_ZIViw-B$`xP zHX!*IY#0Lr!x?B;WI+5476!Qu#Nc=a2@8-KP*{Ly&{-H)pyp65ES{;ffWjY?CZORD zb~8LIz<1{Q#S^+a7a|W+hX?{t+S$>h+Oh}9k0Aen@L8DuA$|o3F)V?yC7wh44^jj2 zKZpjcRlWl?hg$yM@?50_6y{+6L+u8+8Rq|BM_<o)KmQ=msVIIRMz|v=NrK%9Qiq-% zu&GCc2Bb`lXjX061GNim5R^Cv4UY<l-@&3F_kkE1FCgIoQUeMP5DjW8Jb{`+t?)SV zLZt;12cYnP#sNxtK=og6xT}jRsHg%t5v&e>ctF&H!UI-mfWq)cvuev3BtL@<V_;x7 z4-JnFh~L4&Aoqb77B3;;0a61B4-gFsk1tSjs1+VpUaGW!;s6vL&^Q456MOn_LpnVU z64&^{1F9YrAkaz#6dp5LR9o&K`5EM25WWBnj~NiZgM=7B?gKF#UO~bGqy`ioAR3fk zSfFaD6&`n9skDIN02Ch3IKT`KpHLrHV)F`;T2L@RkBtDEY0;|M@&@XDkRM_AA~YNp zK>Q3A2DuBw@OTXg2ap<2IDlwSYeoR7mRjNP<h4o*DC|Mu01bPvn^DpQ*l&<D4{{p_ zgW?x!nm|$u3I~weVd`(Rs<wQAx*sG4!<V4puma*|urSD7AV$O+NH~DhfXo8Xpm30Y zs-;#qe0ihN0t$OjI6%W5GaSH&(z^x`U4Eje2Zaapm@Tl`6>X|5f1v&V`4xsQL&IYS z#P48Xko!Q4jJJ^R0I30m2Z#oh7b;M-)Cv!lcPcHQH~@tQG!DRSMoAZN{}Gus(A0y% z1NmHkiFVZ%9*F-yUWMZ;(C|2cBnNUINI}6nNO*wMfWiYrgTliEs+L;e!Si0F1r!IM z@PNhvmhkZQ_X&xI7KR|#;VC<Vk=24i0&=`RC|~VpS8b7j_zPkPl)MTJhYLt@Aa{YJ zE8auG0i*^L4j>vd7Uuv}ORaDa`JmDQ3VTpEK*Jt096bFTgFJ~02NboSaDW`{4+@8f z4%HSFh`&HygyU<_aJYda2XYrkLB$71IDpiE!U05s!odTomTKYfQKbbG_MmWphCNz1 z_yv0hd4?b@>jBGSmYK-vK>mmHK0yBe(V^O+1Mv^YYjAuW=6@tPk&j@1Gt@w6Mvxki z|3NfpT;2z&mRkOo_@vST3Ujdkp=N{J3@;y?{X;@P%OTwzU18Tjg5)v$kE#w40MLH; zj84@S9f+Uc{s%E`K*Qh;k{rlQAh{)<z+u4%QUeMD5DnTN=L1zstuS!-tkMDscTgBW z!yO#Q@Gx+NtdPZZg(1kTAdEF!2<Qa`6mnf+(WTmA0P#1-NI1R;4JVe*;4lG;gWL^b zT!4r%g4BS*2}Fa=TS<YML#=Si`J&PSiW^WkLF0zlaDpv>067<|2P6I94kwsiP*B0D z8L$~Qx>Q>tAbtm%3nOkp!^+?bBCJ4e2g$#Hh%tiHfWitygVvDtK+U06ShajrX#vF# zD6F9I19mfdn)3Dc3vu;xbq@k<I|#vlmRB$|jL`Lf0tVC<2l)?_1}nN%TUsFg1PQ_M zZD_c7d_{x{$ekbsEZ@Llj370jZ~@VvIgkxdbEp+A3%;qefZ_raF3`9j6fUs%2RRe0 z7FXIq3Ky6jP|$#mmw@Y)=uvH%gXDj(1Oo%Z9cb93K*9km400=oA@Us(HXt>iumRDa zb01GY&7oG<Z1}Fy0*Vh%*g)e0>|gXW14##<Z5YI*7i9II0D;uZkT%VZ9@Ul|NPY(S z7liLZ!=nV^caRVR$bBG&#t%q%fYgA(14M()2Y&!Hhg#ur<cCTNC=Nj30gVHE;Q@<t zkQ2e`aHSJyc)-+yf&{e14z4evSGDB?lE1+c3=9nSpkdMh@jqA?<VFxf=O-jgKx#l? z0-{0r=L6InYK6&(pDHb&cmRb7G#<cyMNcEpYluNk1IyzI3#d9!7(f~<(E9pEuWHL3 zB!7YpVqjpn4-JDJh=0MtAUA;+I=>)c08#@A0}u_$Cx4*kP%R98skDH?9TW!8a0mMl zJq&yt5d|u!T*MUyV0EAnfDQtI)XwNrZFzv?N09$O_yNrS5Wj+i7*0UhCch#62dM%1 zA4G%JmN7u(spbC*zg1d5VGi~`)NGKO(ftog;9y5W;}usJz|?|*0Xp;p4pWPM)s_cP zJ7DI3=!ej7m;&)LNQeRCE)c`y4<sBwYCz!tqCtIq7N}aPg~K0}7EsuO!T}ogU^m0V z!PCzLwyYN9E)WKV6Gj*ysRQ{RmJvW|Z}h9SynwnJq#uSK!Tb;LD_Hmflx^`B;(w4D zkpDq6XpJQYRGwP?zw%e51r+9B|3l3Nxf#v>0gm3D@Ex5Xc^v+SsRIQ8G$%mnh>8iS zEia(vgFOl*9z(-m2E@N$QIMNJ42OS^FaW6mg#m~L6|x*qwbTlOJO5N#K;aGw18BHo zO9L3UQsW5+B(;d30I8RlsM_)d>VA+PVfYC&92P+Q3>F5t3&imG4+#g58c;ZZXwV){ z0jOGPg~N;gDlMR}2ZaMP?9s!)!_fz{J0m#AGv3G1&l|Es1LQ9(=>c6WC?H_j0&MP% ziK;DMpnd@P6NaBc!(t7@-(X>o+dzyC2DKJYF$7Wr3JVYon%I<ps-;#~s4%LvfWjXX z7SQkqS<k@0pwuG4pxW~1ziJBu*e#4;zfAeB1acR{4hGd087Ld1L7$I-;hiS~11E@s zh8dY40u2lxvmk5`nZuykk}XiM8Du8NE=Cpx27?MS&~`?!T_80j45}?G;^1__utQv> zg&(x{Ga+aT$bOJKI-UTvBZ5&C?0%TM0UraydjjrLU_^Bv52I>}PD0QYkeML+Anr3t z1DOd*3m{sAQMKiVxJpYyA$!Xj36&NuP}}FbgagQakUTmzfZFkcQMCnRCQROtkAdL> z0rwq%>V@f9!>HPF@4JKp$V`xZ5ce6Qgx?lM)s_bmkno!#snWv7z`*eMc-di){V;Qo z=?hRhW-zI?fXsx+8SybNd?et$1SZt*^I=kL0oesI6J#I6eJ0>O1}ywSm{eOXNJ8A# zBBj#8!@$6BYsdX+ko_>bk?8`c9Tv>0Eg&;ta>jfN44(+NkAWH0eQ%glTR?V!%mmp7 zai1}$=!K`hFHEW}2c#hGE0I=d;bmZ8xc=l#HOPLL-N>{6)Q%g>sx2ThVR9yX3=E$M zxNiYeFHBDlvuX>-E|8fZ`ylQ!1rM6S!fy(*YRd*`i2G7xAn8xaTG9bzKg=9tdIQvs z3KrECkeM(!Q$7ZUF9h7@z=9fnIxMO!AiF?jg6xC1&jMWb!Q5xUqS`V;2I4*+SxEl< zoxbT5$bOjJ$aDbI4hdG(7Lb`RIWs;6hOY$N_W-IFrsoWcY759NkeML+Anr3qiQg+M zsx3XT5cfIALDJuZZk8I5{V;Qo=?_plcCf0pfXsx+ne#C)d?Vn#23FMY%VAY*0oesI z6J#I6eI_XRw}e%-rA7|oJ_C7`7H$RxhDzgX2ax?RyOHS$P&*>nR9ir1!sIOY7#O}2 zaGwGjs{44@R9irHfy@Ni2XUV{O8ymLQ*FtRS7`}(uhb%=04ZPCS3l_h*$=ZDnKpph z@q<mZ1!N{n&XSLT;RgZt9f0bE=~=_3+5)l*WG2Wyi2F<pK=QEkw}nl$B|-rbemshh z@cXUy&=F)mNF6%90JUQVyJ`!_OqjeC9|OZr0`5y-M-4w8cGVV;T_7_-_CefdhLS%* z*i~Cx6jfS6#F<-uC_=(d`aQ=4ko_>bk?8`c9Tps_Eg&;ta@Kqd48I7tkAVZ#eQ(%R zTR?V!%mmp7ai1Z08W$FRU)WV!Oq3wu_d*GhKQ_DQmx1hu*^NvKK<&7}q1pm66DDWF z$H4HLfcq9e^}_V@aHzI`>;jnyvJc`u3vhcI=DsN$sx2zY5cl0shLnHP{2n-i?1!0y zOmBeNQNgL&0x}aOXUoUH@P~l=95_+KPlr>r1!Nb<OptvL_nDxS&nBFzEj%g^_Z?7y zq`!L$bzDLA!|X<;1E6+DaH+O{%!J9=@i8#`CE&gXP`xlcXE;?`Kz4!51lb31pBcEz z3Jbq0oT@E9R8(3@-YT`MQH8|st$9^nLH5JUL8d=I?byMk+5$2YCTGvb!0?ZN`x>}V z!!L(RwFP7s$V`xZ5ce5@humQ9E8$XYd7%mkzd34<@Y{Q#-W6m&%x+|Q0@RKOZq*i$ znJ_sAJ_d&W1l*^<jp{xgZq*i$T_7_-_Cefd2x^YQ+Xo`tsx4R4R9dD)iMMp9L+Urx zOW*oI_QUK(rVXHW{NPq?0htMta|AWap#1@u7>tIspASIw!o=5btG0mb0+|W259&Vf z6bUT+ws5PqoKS~^UyTMNew|Xv1wi)0%t59vK<${pquK&86DH@x$H2fyz<miksNv_s zquK(p3uGq9K8X8FP}~>7quR1V1LD3MO^ExR$X)IR*$=ZDnJ$3ZVZp1~0x}aO=gh~z zz(l}(47{lBd&8sJ0<sHaCdfXB`^>=81F-P>!lT-<LQ|z>k1}&hj25K*_tPu;FUWqF z-N>{6)Q%gxsx2ThVR9~f3=GT!+_wO#7pA9&SG5IX7syPIeGvB<qLeRFK=x=s!p}z= z5`J1cvj2kYhna&+Z-ClS!Kc~+G7~1}%E!RKLco0ve5m24!>8H;vI}G;$Udn1!1GS9 z@H634ZRya4xX(rh;=a%u+t@+&!|X<;1E6+D@T<0f%!J9g@i8#45^&!Gs9u<!GkmHo zAiF?jg6xC352bv$!l&9&p#yQBj;=}zsQ+5+kb4qjKg=9t`UBLC9sH^-ATwcd?tBak zYy{lbz>gY!IsB?EAiF?jg6xC1&ln~BmGG;!B<MoiC!z;Qe<92Pi6Hx7b|cdhpmszE zsJ4L2gvojEF)*+baG!zzs{42ZR9irHfy@Ni2XUVXYX4V2wIx6g;yxCAl@<{O1_tlQ zj#nW2VRj?a22eYG2&lGz%!J8#@-Z-Q5OCiCs9u<!H3F(FAiF?jg6xC1&l075wFTrp zeW?2kAn9+apH2qIewaDP^aZFLGXzyzKxV?^y!aRxI0?8fK@c_kd<0cnKz4!51lb31 zpCL;BBScWO#lb+OWy^h~mM;d7@OzcGsuyHG%x+}50BVPYkZKFaOqiTE9|Hpy0rxQo zA>60(K&j=8plS=qE|8fZ`xx0k<1gmPAQ!^&?-!8!3?bq7#Sl{eUf!SY1+pJzH!>{% zwd016Y759rn4AwE0|Pe!_bq_xh3V-LQf&d*1u_$4A0+%tQS$E;A=MTgBbAm3e;8XH z7(v?4|KGGN2H6iY2btagwWC5<wFP7*OwN~&fq{pB`y7N3;Rn*EBdpp2vI}G;$Udn1 zQ1Y*duxg8pF(mvh7(>D@n7P>tWIxCZbQ}P+LqbHg1!N{n-j9!gftP^$9zgZN^qdh^ zZ2{Q@G81GU#C?V+?z<wa+QMO?(ju{%v1N}5B>bL)+e(1!hna&+e}LMtLqxR&WF}0` zpO1lokAV9cL{P&oM?|#+WEaRxkbMyM8KLw)N<>s!ewaYQZ;dIWeP6$7iWkU!nBB<q z1gISmqN*(*GhuQ8d<+cy1l*?}it0WdQPmcZT_7_-_CefdhT8uXRc(1-3US{QGf4ST z{5`b_WIxPqWZD2~#}84}7Lb`Rxj;S!1_1)@I{?)S)3ZiYwFP7s$V`xZ5ce6NlrLLE zRa-8YLEP734sqWdbNe=s{V;Qo=?hRhW{9b_fXsx+1@SR32oi8#f*2zFE<{wd_=u^t zfb0U939=93J`<GkIYdmg<$yWFeI*tU_u2gjYXjL2vm2Q%fZAapuG#`J6DAkT$G{*& zz<mtj2={^Xy%AGw0oesI6J#I6eTJZ`xZv&kFJh`K8!RC1OR<FH-(vamULgBHW}ssM zs2w-NRa-!2!sJ8v7#M^JxNiYeFHBF5xM~Z?E|8fZ`ylQ!MTy@j;;JokELB=0ri-@( zSV8i~U7=6jAp2qFAk!P5c2r2Hwt&op$%XPUFo+OvpMwNy_~}Tfwt(ycnF+EF;yxpk z_Nj@4YD<e1B>XI_A>~Wy7WJbb`(bt?(*aOBBqUW^KxV?^!uS{%L<zX>0aPzc&lw5T z7LZ*aGeP!2+-Hi?ez_u{+EQW-ai4|_B>VycKY4@fhna&+e}LMtLsGQ`WF|~5oR5J) zjDY(ZBvHdJM^d!~WEaRxkbMyMnV{5fC6cNwF*XqQ3D`p1ckIC@Z;<^kyOHS$P&*=| zR9ir1!sH_O7#PF}xKBX};Xa9v3tM=kR9irHfy@Ni2X!Ax`79!(+Tvmhao-PHNdDNe zmCFZYKg@1q+5l?D4=L3akeM*KNInJz2?Fjr0M!fAvqnm_1!Nb<Optw0_o3vEEmEp2 z26hnlJ+Xtd@8kCsp9I+tGY6Tz0JUR=v}y~;Oqg609|MCV0rw?HBf<})&qrFd1!Nb< zOptvL_Zgy$?}kXLwn*4R+;_$vQvT(NsJsH%4>AKC7eMW>kWp;`nF*7R=3`)xBH%s- z8C3VZkydR1*#$BaWFN$RrYPm}7irZN4hM+)_BcTLAEnzJUV-d~*^NvKK<&68quK&8 z6DAkK$G{*>z<mp#dSQBcWK>%~c7e<U*#~i-Im-Ce6i_%o-M7XOlKxg2#`u8jhna&+ zZ-ClSA*<Q~G7}~j%g4YVL%@9wvWV~#D9~!rkyUL0*#$BaWFN$R#wg>HCbFt6PaGlP zH^T`MzpHpJ{R7z#vm2QXfZ8D;r`iHC6DAkO$G{*<z<m#(dSQCb$f~x0>;jnyvJc`u zL)7w5R<-4d6U2QT&Jg!~i@Ed<WIxOtWcmZtjvaEUEg&;ta`Ai&3~~hA*C2-oKajp0 zIn@@BT_7_-_Cefdf)aiua;hyyoFVS3aDl|H_?}C?Ap1dPpyLTpJ0j#&TR>*Q<P-Q9 z7~~1KPeC5leLV82Eg-u<W`gX4xX%J*enCWDwPk|~#C<8Qkoql9!et@Iewf|Jv;owP zAM&a#ATwcdiF^zU3IyDD0IC<JXN|mS3&<{znIQWh?lVFOzb*2rEel*#TE6^KY6)>u zX%S*zU^sbZ(jJigFmsUU3s5^|D5$o8%!J7$@i8zc5^!IF0wVlU{wuZkD5$o8>;jny zvJdJ$)bdY3wPl7IB>a5bA>}h?ebq^j{V=<c=>n)77K*AZATwcd$$Sh9N(9`;ponlE zNZ%U;)fSLlATvSsLEVQEzh4woTN>OU?lbX#)W3(7&HX_3gUmq30#G|{D5|!A%!J9O z@G&qb6L8-Gs9u<!9!1p_kX;}%LH0r1XM$S(DXO+)c&M~ER0*}nctXaXn;a%h0oe~T z2btagwWC5wwFP7*OfHp=fkB0U`y7-|!%s&^wFP7s$V`xZ5ce6O)W0T5sx2{|knj`m zf`s4Pud;z4`(bt?(*aOBB$QQKKxV?^()bt{R0+860aPzc&lx4v7LZ*aGeP!2+-HiC zKdvaLwzzmf-1h_OzQTaWK#=_~bCBr|P&;-gtG0m5gvq7zF)*kRa9@KmYWU?StG0mb z0+|W258^%xl=gFpvTBQtH^hApydmLN8u~B@WIxPqWO@SBjtCXi7Lb`RxePuA26Y1N zQ&2&5ACHP^3&<{znIQWh?lVSh|EZ|9i1<L<cftqaK93U_At3u<b|cdUP&<C8sJ4L2 zgvn*{F)(NlaNhx_UYMRWDyl6YyFg}w?1Q+^0%d+?i;8N?AE^5__^Pz9GcYh@pAJ6; zvL9v+GJOGR#|%}~7Lb`Rxhy^g22BF)OHf4(KOa@q7LZ*aGeP!2+-HswzagrsEf0Jl z;Wxz(QojYQ-4g<`A7(c)T>!PiLJc%;hp;c3kAXppfcqHK5b8l@zEM?e0oesI6J#I6 zeP$^6_lv4(%Nak2`x^Wq<@3SZ87D#ZgUmq30#G|{sHwJq%!JA3@G&rG6L8-Gs9u<! z9yQe#kX;}%LH0r1XN(fRQ`A&jw)jKbmk|Id|DH<l9tYVEGY6U80JWn+U9|;dCQL4u zkAcC0fcqTOQNvG1U9|;d7syPIeGvB<pwu5G>Z&a(0wC^-352+>^WVi|Ap2o<Bhvv; zJ0vtzTR>*Q<ns6!7%U06?*UXVNY5J{sg^V9sx2V9KxTsMgSro;eSbw=wPj8q#C-ul zDlNhc3=GSzpKJ%&4>AWGe}LMtLqoL%WF|~LpO1mTih%nXG*H7YM?<v*WEaRxkbO}1 zp_I=h8mcWbf>c@_yk%|i307$lV_;yAt+B2L*$=ZDnVtZ(BSKTP1!N{nu7Hn$!J2^k z6f{xY$D^s*0<sHaCdfXh`;0+m!p6r%G*w$>1Vh5lCq$)1ih+UQ`1jgYko_Qa=-2>i z#}7@=yeGoGLOuot8v^b-0M!dKbB(5I3&<{znIQY1?n5b`w`i)iEC_+PFC<i@MUsJm zVN&1k;~@KC<{;A-pmxmAQf&d536m@0V_>i);JyScgnvN#e6&<sKz4!51lb35A4>iW z(Nb+$5eji%OqfcG90LQxOMQl;Ap1dPpyL9l9TwWEEg&;t^2K}%3=Ra`$DobszBgK` zEg-u<W`gX4x(_9Pe9=;E*%1bDUrxA6iv$A$!!FySM?m(&>_(;qpmyBQR&4>936m?~ zV_<M3;JyV=y)ZpJ+Nv!eyFg}w?8D~1DcY(n2f`ulD~V8P5ocgvxKOMg53(O-4l=y~ zYDa~RY759rm|Q6z1A`L*_c`dGhM$g(Y759NkeML+u({7fN44ch1jKz6k&y6vu(9hj z$bOjJ$aDbI4hdb=7Lb`RxiUTm24@29djQo7({n~gwFP7s$V`xZ*xYwTN44clB*c9U zQ7SFc3=9l~XLb5P_QT9UrawUK*r5xWH%5d<IUfUq3jy~v=pxjE%*@eMZ2{Q@G81GU zHusf)!XXOczMg1E`P>u}eHvsx$P9Em0cuBto@xuoOqhHH9|MCc0rx5Bp}LPpPqhVP z7syPIeNgwIl+Pl1sx4QdA@1vlfy`e%`E2qSWIxPqWZD2~#}7T#7Lb`Rxk^3;1~&rk zI{?)S)3ZiTwFP7s$V`xZQ1_vf&s#w5i-Ec?7UI6y;>M3b_QT9UrY}J4n4z!Q0x}aO zSH;J`;7-7O3Hqqv=cBLM0<sHaCdfXh`%uc~5Pj8_E3r`b#X;(~qK%~+K=#AzMy3m( zc32pwwt&op$yM_)FnADfAA<p^``+lQwt(ycnF+EF>OPe6`3uN>aZvZgL)_P0Ua|pX zKg@1qS^#Rt4FlB{keM*K8a@UFPXg{+0M!fA(_^680<sHaCdfXh`%u;oO)*eyxe^a` zUjoE^&c{kOfb55vgG_IL+EHPs+5$2YCRfYHz~Du|eGZ1G;iqG$+5)l*WG2WysQXaY zzZj~vTuFesFA<V|v%W-~2H6j@8<`G(+96@2+5$2YCRfMDz~D{5eGi~|VS3IOs<wda z0+|W259&UY{>K$V)s_p15cjntLGs7@Z^n;7_QT9UrawUK*kPpF0x}aOSI@`5;6uQD z4MwQpmt&;b0<sHaCdfXh`%vdUj8t1LB&oEN{84IYNrt#jI>F>I$bOjJ$n*rL9TCQ= zEg&;tat(Y8488>1r(lfgJ|1J$7LZ*aGeP!2-G|aY5;0b7xd3uk6LU*Tib{(p0|P^m zmGNVc{V=<cX#=PoKa5pdKxV?^8u=I){0O-308}qb&l+RZ7LZ*aGeP!2-G?&2zXjyJ z6lnaWLh{GQ_|gp^`(frF(-)w2%rH@H0htMtYvN;I@F(ED1QXQo^D$9v0oesI6J#IM zeJJziAttIV7gAMPO71DOw4_18&-b6vW03tYyOHSvs2vujsx2ThVRFrU3=9DT+{a*w z>b^H7sx2V9KxTsMgSroO{ukuFG-&vxL&i^E&Wb(_vL9wQGA#hL<A$kf3&>2E9BAWB zAOZI+fa-<m=`mGp0oesI6J#IMeJJCnQ%qG`PNb`}T$n80Qj-CR-+BHe8$kBM%t59% zK<%h7Q*8m636pE(V_*m(;64X4)bP_WQ*8m+1u_$4AJly)^9v?ssx2onAmLY&3CX{0 z?Iw>w_QUK(rURgMNSLd(fXsx+wec}91QT%I1E^k@o-<~uEg-u<W`gX4xX%!!e|`nz zzD%h5vLNl#xLWqjAp2qFAk!b9cI+@$Z2_4HlWXT=U<e`Lz6NvD@XIk*Z2{Q@G81GU z#C--R{f`oJ)s_oc5cjoYL*iFcf;ApwKg@1qdIHpr2n*E~keM*K4n78kPy+5#ut0Sm zkA-Rr$S#nXAp5YnPsBpC<w7>peL0Z&?dt8nH$e8o>_(;ypmzMQP;CL336tyOV_*m) z;JyP;y)Zp%EL2-Sc7e<U*@w-2TP##t&g4Mc*N_VdKc{(Tc7p7OnS)GUfZ8#`QndwS zCQPo2kAWeafcp|GQNz#2QndwS7syPIeNgwIw4XyPRa?&FLfw}Kao^m{m$N|j!|X<; z3!rvbSgE#v%!J8x^D!_)5O5!Z6{`E*SgN*w>;jnyvJdJ$l=Sz-Qnlqw9@KsLkn*`} zX7*W-{V=<cX#uDmH>^}!KxV?^diWR^A_=%}0aPzskCkc*$S#nXAp5YnZ;F*_%b9$r z`wAfAFJT9ZSwZ&0%t59%K<%ioR&4>936tyPV_=9P;64Xy)bP`>R&4><1u_$4A2#=y zSgW>NDS)`IqYx5)Oy_=W0@)9<8<`G(+96@1+5$2YCfCQuzz|KqeGi~|VS3J3tG0mb z0+|W251ae0fZSIIbzc!A{1_f29t7DBGY6Ue0JUR>jcN<XOqg6h9|J=S0rxf7AcfzY z{FWRL|3TtGkeML+pzcG-A0;-bEq96_?we4o(xSn@z%ccF8578UnBB<q1dy4adoFEN zTR>*Q<R<VjFvJpYpMout`xqD)cx+W$Kz4!51lb35A4>m7#8$P1r3B)>9VIF)+6)W~ z(LYXgN1&MnbB6&`{D-Y-3&>2E_(VPihByN5I{?)S)3e4_wFP7s$V`xZQ1_v<@3+{h zwiuK`-1npulK!&wQeJ`Vhna&+Ux3;%!%npYWF|~*5+4IYJOTG5*dfAi%g2>1K6a`t zAiF?jg6xC352btwu~Tg^D1*AM43hquZg-sq*$=ZDnJ$3ZVPUV@0x}aOH<^!tA%TGV z80-=51L=EXr`iIt3uGq9K5Xv$VyD_-Q4Vq6n{vqb+Oe1kw?OuT%s|HiP&;netG0m5 zgvn3gV_--m;JyV=y)ZpJ_Npx)yFg}w?8D~1DfX%@HWd)}eW-wpUp<OU+YPcGW)3pF z0cuBugK7)NOqkqMJ_d#)0`7BgKn*_~2h|pkT_7_-_F;3MiGym3M<v94e<~sI`|?xj zZjk*jyOHSts2viHsx2ThVRF;>7#NZXxbFc}FHFxF2h|pkT_7_-_Cei;QodYqP;CjQ zg1C>R8q)q#5tsP`vL9v+GW`K+#|}r;7Lb`Rx#@fi3@HTM*Wid6emRb+Eg-u<W`gX4 zx({Xis>D&XC88SQKAsxL_`REi%pZ{bFuRfI2~ayCoK#ytX2RrV@G&r?5^$e_6RP`o zoK#ytc7e<U*#~tW%J`LtlWI#s4a9vSwUF}VP*}Vy$bOjJ$g}~}jvr2{Eg&;tax?iD z7}5y1?*LRUOwSr8)fSLlATvSsLEVQ^K5qfJuNLaQI!OLqmVT8HWIxOtWcmWsjv3CX zEg&;ta<ljt7}5#2FToi#{Cu2MTR?V!%mmp7bsuW^=d9Y2QU`ILM7>Ij3~2t%w?-Fa zKg@1qx&Ug2g^Own$V`~rY(55t3<B<Ba6xt78<6{aYji<og6zZQzAw(IEhY63_h~dh z@<-aLx933i!|X<;1)z4^a8YdmnF*7d!^gmoNx*#zpn73?dR$anKz4!51lfnpeN$Xi zTWT60?lWjqY0+e0VBo*`z64}H%p7ET1JsTRSJf7fnJ~Gzd<+a(1l;G~iW+`8uBt5{ zyFg}w?1Q=wC4ZQ>s<td?gt#xF3DUk#vVXt?vL9wQG93W5L&8n91!N{nZXO>4LpA~T zJ%H+k={e)7+5)l*WG2WysQXaT-xZMinp9d&JY#K%Xoke^H1mghLH5JUL8d=I?bzX_ z+5$2YCO4mtfgy*0`x@L(!!O58wFP7s$V`xZ*xXm*rrNTm84`X8Es*@neJlP3$bOjJ z$n*rL9TD!TEg&;tatrtv7;*`?Pr)74eLU`}Eg-u<W`gX)<~|X3)s_t{5cj3Ds({Z2 zX^lDdA7nqwZe-d3YR3<E)fSMMFu8?%3=DY$+;;$~7p7;8yJ`!_E|8fZ`>?rhi@R#e zf>wz8LfRnZ^SNY^GLZc+bCBr^P&;OLsJ4L2gvl-9V_?W9;JyS8)bR81P;CL(1u_$4 zAJly)^>2uWYRiH)m6n2C;w>TVkny!{=D(Xj_QUK(rVF5USa_<ofXsx+E#_ljC?McI z22X_hCY;S_dE=ql0<sHaCdfXh`%v=77Z25z8SRkp^XY)NubKJpCXoFwyOC)Ds2w*v zRa-!2!sM3lF)$PoaNh!`UYMR9Pt_KXT_7_-_Cei;5`I%WRa+)>sI)XNiMF_OLdIWs zC;!?6vL9v+GQ9z6M}?Pa3&>2E+)_RUh9Uy)bMQihA4s2$mud^hE|8fZ`=IVaX}_3w zskZcVLc-6X3*x?S+kR~V*$*-U9S1<|knmP*0htMtU&hD4P)xvm51@Ksdd_&Mwt(yc znF+EF>OPe6`HGinOGg*PeKy^Y_?^u7cN55dm^sMw2dEu8yj5F3X2Rr_^D!`#5O80E zH){Chc&oO6>;jnyvJdJ$l=e%Bw`xm6H^hA=J&^I!;>{udLH5J!My4k~?TGMEZ2_4H zlUu>Zz)(uSeF{FP?&I-MZ2{Q@G81GU)O{%PZz4XbEe$<T_w_>BFB@liW`pd9*^Nva zK<)V9quK&86DGHkkAb0#fcp+W^@8-UC{Jox<D=RFvI}G;$Udn1Q0CvZ_^7r_=!Lk? zr4LenDEA#*2C^Sy4m!R7wPS{_Y759rnEWa}28MD1?o04R4L=`W)fSLlATvSsLEVSa zKM(O$ZJE*sai2#&q<#M{cRx4Cewf|JbOF>33qREskeM*K)qD&L6$ISJ;D_qIH@>PZ zAiF?jg6xC34`u%Ci?3?SoPLP=0wzG(FWaUZT?VorW;Ze|0JY<WpK1%pOqkpnJ_d$L z0`6M?)eF<p<EPpJvI}G;$Udn15<&8?^;c8;R9oguP-*#-DAW=#5z>B9j@-`;vLB=l z9dCfzQQ@!J0x}aOzm|`Ip^AX}9Q;wkPsd-i1!Nb<Optw0_o2+cnfR-=ESU%izlcc? z_nk1^&keF4W;Ze&0JTFRK(z&ACQNP}9|J=*0rx$C>V@e!<FDERvI}G;$Udn1Q0CvR z_^Y<8nFMiP!eq$!K~3hal_2|J<{;A_pmyvCP;CL336opT$G}iSz<mt?sNt6rpxOem z3uGq9KB)Up=HE&JR9kjThPW?h3Z(sV(j(+Q$bOjJ$n*rL9T9=5Eg&;tavS&<7-|W) zPazQ1eLR7xEg-u<W`gX4xDR#yNF-3TWych#`=&zTclqQ4+#vg5b|cdUP&<Br^g-PU zlHbV3z)(lPeFva=LFz$xO`vKE$S#nXAp4;1LutQk2~=%4Fcspyl4+3g<%iP&Zjk*T zGtlt`s2wwcR9ir1!sIvcF)-8<a9=_YYWVpCf%>QixIt!u?1Q=wrTr2Tq}p;~8pM4y z(;?wkA+xp(WIxPqWV!%qhefbz3&>2E+-5!oh6V!eV+cld-<u%S7LZ*aGeP!2+=n{< z_9aNQ<-&A``&wo|)+gF=nWcg3huMux3qb9-5e!<lim-1B9|J=p0rxF{>V=ut6Rg?- zvI}G;$UbcDn-Z+r@?eHai-xIq%aoar`nN4IcOl4rm^sMw2B;ksA*wAPGhuRD`4||Q z2)NH71mPc$KAjNN7LZ*aGeP!YbDv3wYRiY2knmeF3sV0k)k|}O><5{Fjsu`}NQA1k zfXsx+Z{uTNXeQvk2T;8*J!e8xTR?V!%mmqo&3#uwR9n8xg1B$RY{>qtbkDoTK=#AT zL8d=I?bs2j+5$2YCbylBfuV(f`x-(~!!IXPwFP7s$V`xZ*xXkVs@n2owo1!|C!8%a z=0NJ-iqglMK=#AzMy4k~?T83dZ2_4HliR_^z|cy-eF|Zy?&AqlZ2{Q@G81GU)O{%V zS0qfe<;fhC7Lb}5b0P5y(gU&|W;Zfz0JY;sm}(2iOqkqGJ_d$10`5Bi)eF`WrrNRw z>OPQ}Ap4;1L+O8P2~%x(F&7fQbLK(X&vCjAuR!*L%|RnBK<$_juG#`J6DGZjkAb0` zfcp}{QNzzCT(t#c7syPIeNgwI^glwvRa;)ngSu}%q<oHCQt<<1Kg@1qx&Ug2MTBY# z$V`~rZaxNv4g&6Dh(LAUn{d?@kX;}%LH0r2htmJ}60X|vVZKU>OD|)~k_C|Z*Qv?= z707;=-N>{6)Q%ewsx2ThVRC!;7#KPUxNiYeFHBEQglY@OE|8fZ`=IVa>3>X#P;L3J z01|#n7DC!D<>qPKAp2qFAk!P5c2q>Fwt&op$?fH1VCW*?K8Hxu@Y9J@Z2{Q@G81GU z)O{%RuSuk8%b$f1_ib1NiQnT#SM`DHhuMux2SDwRh*E6<nF*8I$H&0XO~8E*pn73? z&P1xVfb0U939=8H`>sT)wy-RQxNpZ|Nc}7Nqvb8gewaDP^arRNJEBxuKxV?^_VY0? z^bl}gLlkQG<wU8rfb0U939=8H`%0ozTX>d0+;?CJq<mhi{P-Biewf|J^aQ9K5z(qG zATwcd2lyBmdI`8sAsXR659h5dJkhExAiF?jg6zZQK9OkEmOoJUZCDB^Ut|@Z>;%~l zvm2Q<fZFjRTD1jaCQR-i9|J=l0rwq%>V@f96Rp|;vI}G;$Udn1P|D{mAoneWgx`i` zkn*`|Qtfw;{V;Qo=?hRhX2htrfXsx+9pYnP=qKR5gcwBlf%N&rsJ4LY0+|W259&UY z@;L;gXF0@uTb4ue#}S^Dl_2{;W}xE&ka`9N28&qL7Lb`R`NMn+3=;^rk0BP-eQ#n^ zTR?V!%mmp7bstLk{3S-Ug<}Q8eS20w+E@E!zNmxjhuMux3qb9-5v$q)G7~0ugpYw? zA_4a;fa-<m>4{Zs0oesI6J#IMeJJJglvvdkiIplXOC}4ooLLD;f6|#;uR!+0%t59% zK<%iAQ*8m636nd@$G|X&fcqTcP{U6rPPGMO7syPIeNgwImVa@oEfT9B;df@0N{cK5 z14F`Xv40@@VRj?a0Z=<6;#FHfX2Rr-@i8z=Cg8pYP`xlcXW~>_Kz4!51lfnpeOKaC zTQpWf+;?X+q<!^u8!tP^ewaDP^arRNJK|MaKxV?^j`J}vOd;UDhImBy-FV*Dk`u4m z0<sHaCdfW)?kkB`ZP8ex((+`wP|KY)koqn9>B@&7`(bt?(-WX}L?o!TfXsx+o#10& zm`cEX3JD1Jf%NetsJ4LY0+|W251ac$5>#7E)<VMX#ac-Fp!V16c_8~iW}ssOs2x8N zR9ir1!sJi#F)&Oc;JyP;y)Zp%5>#72c7e<U*@w-2TR`qx2X)^%$oTW|+;~}#{V;Qo z=?hRhW+bY%fXsx+o#JC)m`=cb35lrT=aZ<~0<sHaCdfW)?h8p&Z82C6ao>~mkn*qK zbo3OE{V=<c=>n)77D=itATwcdr}-EdW)N^6LlUa{-XyBFfb0U939=8H`@STqwpeUX zX#wS-Hya@C1LY}@{V=<cX#uDmH<DCaKxV?^&hRlX%p~Bx1yH>pJqO}cTY8cp`4?m+ z$UbcDo06p3;;<1CeqT01%D=jGf2M-$2bqJ8H$d&ENLFnDnF*6W%g4Yli-7wal2OA? zCt0-xWEaRxkbT(PXOgVi;;;$ozD<z&V@6ZmZjk*jyOHSts2vh1sx2ThVRGmA7#L;~ zaNh%{UXUJ#r|VnJB&)W7>;jnyvJad4t|Y6r1Z;-5k7Wy_{WoFH#6=+cLFS<24^TUH zq^P!l%!J9G=VM@)L%@9vDX8I>lcL%JvI}G;$UbcDD@jppiP!>hAJ10E_{*nnv;KhW zhuMuxPk`DHk*eAPG7~0ufscV<E&=x`q@ucyCsnltWEaRxkbO}1p|r0=QdL_rwnE$| zvkg-I-L6&o2(lk$H!^Jiwc|&sY759rnA}A^28MYA+;;$~7p7-Ts%i_!E|8fZ`>?rh z3&?%jpzhla*?&H9{kvlz`(frF(-)w2%t%vh0htMtyTr%9FrR??64Fq^&nHc_1!Nb< zOptw0_o1{8Lef-QVzxuvC$Iw&epSj7Zh`EF*^NvWK<%(dS8V~A36s0b$H1_FfcqHI zQQh|@O|=DN7syPIeNgwI#P1i7`*uLxw-eGnnBgDw24p|XZe&^jYR8Rq)fSMMFu5yy z3=9hixNiYeFHBDl$PE9eHy|@X_Cei;5`I(CRa;_qLfy9u5`MkXkB)%shna&+Z-ClS zk)hfGG7~0um5+g85drr(WT1whPKIg=$S#nXAp5Yn&m=>&C1w}YeY+vycYf0SERg*$ zyOHSts2viSsx2ThVRF~_7#J24aNh%{UYMRU8LBNHyFg}w?1Q=wC4R4f+_xL*zC954 zO^CXe1+pJz4l?}#YR8UD)fSMMFuCh|3=B&MxUV4-HT-fiRa-!Ify@Nihs}K@nW`-@ zd!X*y3n`yhgqs`y*$=ZDnVtZ(BO*(+1!N{n?gk$N!%_n7Q^-PfA5WHQ3&<{znIQY1 z?n6m`B3Y^}DSILAlh_9dKa-6u4Iukrb|cdUP&<BPskVU3gvs6HV_;ZDz<mdxdSQCj zWU01*>;jnyvJad4wt(EXPo?FJ26v0Zen|g!!NR2*LH5JUL8dQ2?U<3R+5$2YCU=XE zfnhlT_a$VbhM!NiY759NkeML+u(>ZJTeT%)KP3EQ4nWq&>My)|8e~7rZe+RuYKKLR zY759rnA~kX28I;`+{ciE>b^JGsx2V9KxTsM!{)v(*{UrC2O#cKIS46V8nkz`f$WFb zjZ6zb?YNPn+5$2YCU=LAfng;9_bq_xh3V<ZQEdU)1u_$4A2#<*$x&@7I0$v$A;|bp zz4fnSAp2qFAk!P5c2wl5wt&op$=&5+U|2=KeGa*(;ir?U+5)l*WG2WyZ0<A3Rc%Q) z1aY6pVMzP=eXq`5ko_>bk?8=a9TIt}Eg&;ta`*Tc7*-Q--vg*#n4UAasx2V9KxTsM z!{)v#xvDK0hav8hIRa@PT-d{K9ArPt9Ax?f)Q%l_sx2ThVRHBR7#P+Na9=|nYWU^k zskVUZ0+|W251ac+@>E-5jzHWea1>I$OjYOp2eKb#H!?i|YDYxAY759rnA`(C28Oi+ z+^3L_>OP)))fSLlATvSsVRN5IzG_R%QK<WlLDmo5-f)x~WIxPqWZD2~$B%r~7Lb`R zxrclV4C@HE?*LRUOwXEp)fSLlATvSsVRPS>eASkaV-WXo9EXg*toHEt0ND>S2bsPA zwPQwsY759rnA{^i28Q(n+?P;*8h$<nsx2V9KxTsMgSro;{tYQmZAm!}ai7Eql@<jC z28O=sQ$-;AVRj?a1yDOI3RPP`X2Rqi^D!`NAmBcRLR9y?DNt<z*#$BaWFORhDD~Ty z0@aq96DlpBIbws8kp3HJ&KP7r%x+{_0BXmLLe&<KnJ~F0d<+a53Ak?oR4+)+gCNzG zo<hj{G{{Vlec0SLrBJn{=OiTj98N*<hv}Tie<1ro=Ah#ZP&+D$R9ir1!sMUwF)(Z* z;68^U)bP_OQf&d*1u_$4A2#=y6sflKoPxUVv`ULS0|P^;dXhWHewf|JbO6*2iDK0j zkeM*KXM79{n+dq@0aPzc&zU0C7LZ*aGeP!2-G`F?t`w=ZEI6&w0?OkdXCUo^Z^;q= zK=#ATL8d=I?buPQ+5$2YCik3=fnf^)_cauwhF?yxY759NkeML+pzcFSe<j7LElbWo z!Y|@1r2g&MyZ9i;ewf|J^aQ9K5hbcEATwcdFZdW3wi0lkLJ6w-cuG`TKz4!51lfnp zeIg~QElbWq-FFUBzp?Mk{0OoiW;Zfz0JY;siE0bTOqkqDJ_d$u1l)H3su!kbO^Ip? z$S#nXAp5YnZ%c`4%bIf#_a&T%w4Y~*W<`VShna&+Ux3;%qg1s8WF}1R6(0k`b^`88 zC`AoFpHkHpkX;}%LH1#DUr4EH%a-#H_hnpw#IKKa)M=3YFuRfI0;nApWvVS8GhuSC z`4|{>5O5zu8LIo<l&ZFX>;jnyvJad4zJT0!0qVYs5ch>H4XFXy53?JY7J%AuqfE60 zWF}1R4Icx;P6F;*0M!fA(^IC}0<sHaCdfW)?weAk+Op-MO3RKrj4c_LR9ci77#KL5 z_N#;Jhna&+Z-ClSQLfqoG7~2EmXCp97XkM<l%s~9PPu9e$S#nXAp5Yn&!k+n<-#RM z__bVygkN>$!ZwioFuRfI0H_@j6{;;DGhuS?_!t;=6L8-Hs9u<!Gv%r+AiF?jg6xC3 z54HRQx$iR6eODmkr|Yg-ZUfm5GY6Ue0JURBg=!1POqkqzJ_d$81l-q9ff{}}6{;;D zyFg}w?8D~1k_y$93s<1-y9#li?OCgBAp2o<BhwS0c0^RFwt&op$$j8sVAxB*eF~MR z?&GOcZ2{Q@G81GU)O{%Bvq+_C%Y~~@_g#aOFW2|J3<lW`vm2Q<fZFk+QndwSCQR-l z9|OZa0`5Bi)eF<Jrc$*9WEaRxkbT(Px200G<;FFL`+BZJ%4c5fSHU3rVdfyy7oc{` zs8VeKnF*8o#K*v}pMd)ks!+qvr%JU2WEaRxkbO}1p`^c%D%F+;*CFnkas$$S@!;CH z8Du}qZe+RuYKKL&Y759rnA~SR28II!+{aLj>b^Hssx2V9KxTsMgSrnTe!qa+cLVCa zn~?dVOVbK_LH5J!My3UzcHF2|Z2_4Hll#KQz;KX&`xZd;!u0f1tG0mb0+|W251ad@ zRI9e!xe0OKgj<mDgYtkapFsA*%t59%K<%igQEdU436uNE$G~uifcqS3P{U8BMzy6p zV9O_vnIQYHxzD6VwdKhzm6jMy=9U?^A^G=d3CAvw{V=<c=>Vu561A!=ATwcd-}o39 z4ij+S1E^k@o-;M7Eg-u<W`gX)=DsT+_uW=$>Da{BGUE=UeCEvZYzEm6GY6Ue0JURB zt!fL%OqkqvJ_d#(1l-q9iyD48wW=*3yFg}w?8D~1l3LZ4CwCz6JL4{-fB9mQG7HFl znBB<q1gISmb*e2OGhuQ+_!t<D5^$eF9jg0y>Qq}mc7e<U*#~tWO8yn8Q*F6(7vjDN z_aObF$J<_R1=$a?8<{qM+VP`KwFP7*OztNi1H&-_?mGb03(|8yBEMx#ooWlnE|8fZ z`=IVa$-i6bR9oKMQ)zkN!rHRnJ|uo)XN%^5><5{HjxRv%m{G6V0x}aO|BH`-;Wz>J zCDbFr&*2e!i%-333&<{znIQYHxi6$%wdKuyNcb&y0O@}uEl*wmvL9wQGF<?*!=gd8 z1!N{n?l&I;!wCZJV`xCQ52Wu+y=n`{E|8fZ`>?t1OTB8#hX)Y%EqMrWU%64z0+9V6 zGtjXB)Q%essx2ThVe)_Y7#L0xaNh!`UYMSq2GtgjT_7_-_Cei;lK!SNsJ4802yx$v zN09R6x9x@)ko_=okm(IjJ1QDgTR>*Q<o@z8Fq|UbK8Hp`_`ML=+M?5_+5)l*WG2Wy zsQXaXH<>i5wtRV{(gHfeb;V;y`v7#NE69GB-N<wR)DDRz)fSMMFu8wx3=F3UxbFc} zFGx>=wrb0nM#%ZGATvSsLEVRvKdv;Yw)}Yv3BL_bAnQxs>GTML><5{Hjz2){*wLig z0x}aO|DTV6;S2%yH8df@52P=rNwo!J7syPIec0Sr(xlqL@f6~|Jx?L+gRsQ3T9Ex9 zGtlt_s2vf_sx2Th;qv?p3}*?rPoWv%J{$J6Ej-PtEg-u<W`gX)=01^T)fSFtQ1?B9 zlz+QeSa?D9!|g_57(ng#(X846G7~1n$j`uVj)40PK=s1(tZ7zl0oesI6J#GY_iX`% z!*huH&OC>>FQAHv7i2%o9Ax?e)Q%Y~sx2ThVRB6T3=HQ9xG$jv5q=<jJ}scLHJEro zW`gX4x(_A)hP0@*XuN>9@6HRz_+*M56EDbqkQwN>0BVOtt7;3#Oqe_~KLf)B0`6mI zMRnhs7S$GzT_7_-_Cei;l7GLnsJ2+Vgt+g`OGy4*eo$#2$bOjJ$g}{|jvKA2Eg&;t zaxDA|3>OKwZvj*<Oixd%Y759NkeML+pzcFipE#vewZ-8T#C>00LEL9+uDB0mKg=9t zdIQvsiZ<02keM(!R(=MCO9b5K(1sd*I&G>gAiF?jg6xC34`qF#Nt<em$7_|A7Iog1 zKd&L_PiXOrGLZc+yOHSts2vjRsx2ThVRCHz3=EeExbFc}FHFywHq{o8T_7_-_Cei; zvVQzZn`%qM8%X%^yoI=Lg~anRko_=okm(OlJ9f0Iwt&op$+7b@FkB(vzJ_+x@XKje zZ2{Q@G81GU)O{%XS4-MeTQc54+$Zx6(!Mw9GWP)453?JYo&dEYqC>R>WF}0GgP(!n zDgpN?bfCJAr$e;`WEaRxkbO}1q3mB3=}>Jccn5Kx%6o|WHp|7BgY1XdjZ7Or?fB85 z+5$2YCdbLoz;KO#`wl?$!t|`^P;CL(1u_$4AJly)`&YMgsJ2wRhqzDY1El`gV=+${ zWIxOtWcmWsjv1Y*Eg&;ta$Nij4A%*`FQF4P{Cql9TR?V!%mmp7bstLo8`7!TQt<)m zzK@Xhm7$*4M3DV3yOHSvs2vtvsx2ThVRGF33=B62xR0R=)qQU|Ra-!Ify@Nihs}Lo zI#pY0KB}~U&OkHxggAc<WIxPqWLf}f$Bi!47Lb`RIUarnhMNT3w*aaatjAWhrKbyW z{u;<kkbO}1q2%8wU8*fhKB=^T&p`W(IDZXfKiC{JVguBUif+{wkeM)PUVa9KTLj$a z(2WSc1-7a!I^B@-*Fa{1?1Q=wCI6aqtF~PD42j>CFOd1I505nLK=#AzMy3Oxc1ZN7 zwt&op$?@?sFx)2Kz6VgfAU!UDn_A9vtG0mb0+|W259&UY{mEClRa;(sQE3ryWNn%A z6*7Lh<Z{$Rko_QY(D4VT9XondTR>*Q<oWp-814{oUqcTf{6PA0dQ@9Lc7e<U*#~tW z%Kqe%9@Q3>Zz?U|If!qN^7(S0$5D{|AT!YM1gISmy{auBGhy-q{0t0t3Aj(87u9_{ zy{auByFg}w?1Q=wrF;?TRc#UZ4vF6r-y!o`v#jMbK=#AzMy3s*cKqm7Z2_4HlN01; zV7N!XeFva=VS3i|s<wda0+|W259&UY{qb9RRa-QEsI+WZ#MpA@2c&%I&E$UyvL9v+ zGJOGR$BaJJ7Lb`RIU#-qhWiBEm(YhAem;GwEg-u<W`gX4x(~Jd>r-vf`3VWX2R|YG z^JUu??*!Qovm2Q%fZAcvui64K6DB9j&%p42fcqHwQQh~ZPqhVP7syPIeNgwIv`@c) z-1iIWzF&~`l~~t$bCCToyOC)Ds2w-@Ra-!2!sJBw85kZCaNh!`UYMSqe$^I`T_7_- z_Cei;(mtKiui9er8{)nfzajnK+jiOuLH5JUL8doA?WmZb+5$2YCMU|z!0?EG`y3{q zhM&#^)fSLlATvSsLEVQEza|q@TTK3_w5YriYI*SolK#T)YW@P*53?JY4uIMrF;TSz zWF|~bjGuwwF#-2Ifa-<mIWs}E1!Nb<Optw0_o2k^6;L?*g@oUmzmWFJ(S=84LH5JU zL8d=I?btC<wFP7*OirAif#C@O_ccsJ4Zoa;sx2V9KxTsM!{)w{iK;CQ{~+%B@(<EK zUv|suAjp20-N^I=s2vfLR9ir1!sI0Q85o`taG$~?RQK^rQf&d*1u_$4AJly)@hdV( zwZ-SZN(<<WXaxo}@ci4<qy}b?{V=<cX#=PoKPIWRfXsx+N%Au=JR{(~15mv%J!>YZ zwt(ycnF+EFoBOs*Qf=vAP-~I+%h+PWs0O|t$MqZg6p;NebCBr^P&;N!R&4>936qoJ zXJB|vz<mjmQNzz?vT6&+E|8fZ`>?q$WU^{Y52IQO=nQZNCbbsO{ZXJZ!9n)J>_(;w zpmtbHQEdU436qoNXJB|iz<mr;5bjGbS8aJS8FKzO$V`xZ*xdJJvTDl|CbbrjJs!+z zE&L1&49f+yj)Uw6iJ@Zws2w+^sJ4L2gvrbBGcdd);JyV=y)ZpJQ&d|(c7e<U*@w-2 zQ>Li4bTC8QXTt)C-<Gf=M?m(&%t59%K<%iQs@eiF6DB9i&%p4CfcqS#BEk=(PiLxX z3&<{znIQY1?n5bGOs1-~^sqqO=fJ84zQ62$%aJ1>`$1-);{d1~64O*$KxV?^<@gyG zUK4QN1E^k@o-<QbTR?V!%mmp7bstLoaRuZ)R<#xbE8Z3dHnkSe{a}l1A25OJhna&+ ze}LMtW14CU$V`}=JU;`&8v^cYn1&jDInz{IKz4!51lb35AIkVf$u!lLDQuAN^I(VM zkHZYRR)Xw@*^Nw3fZ7o;U9|;dCQMF&pMl{m0rx3PM|B_1bk!D+T_7_-_Cei;GQJ@) zUA1KnJH&kf9FX{RG&phuWIxPqWZD2~$B*f%Eg&;ta*F&64DSfI?*LRUOwXF>sx2V9 zKxTsMgSro;f3yYUJ`Sk+IMrH|7#J9CU9q<W*$*=ZnZ5wEW5x{C7Lb`RIVFAuhW7;A zmoNi0{CsApwt(ycnF+EF>OPeIQOFF{mMxqR_hoQF(%-WQ512sq!|X<;3!rvb%v5aw znF*6q=4W8|K)`(rGg005W`=4D$S#nXAp4;1LmA)rGDEdx4;RFJ1>9=j``=~+K41db z53?JY7J%AuW2R~g$V`}=3O@tGM*{9!0M!fA(*rUi@BtIZOptw0_o4JZrp#1rIl>Kb zUj>g^iwFY)Lv4QK8<71lbCBr`P&+DSskVU3gvqJ$GcbH2;68_0sNttGOSJ`L7syPI zeNgwI^gm2yf%aIdwG>z|w^Z;#;&;!J2TUOQVRj?a0Z=<6W~;V<%!J9Q@iQ=dCg8pY zP`xlcXJ)Ckfb0U939=9BKGgp2EY+4XypZr~;Dgj3;rU07fb55vgG_&b+OcD{Y759r zn4CI41H%^r?rWHh8h$ymRa-!Ify@Ni2X!B6|97@(%LP7&`&#(b!1oLNJ`ni^WIxPq zWO@SBj)*y`Eg&;tavJ;$3||SjPhk$K`*`N4wt(ycnF+EF>OPe7xkTouwp`$cx=#QS zevW649s$`8vm2Q<fZFk6j%o|YOqiS|KLf)z0`5Bi)eF<JW{zqL$S#nXAp4;1L%APk z%N*5~D*_PrbqGT8@9SF+nLzf#%t59vK<$_@SG5IXCQMF?pMl{!0rw@$MGZfnxvDK7 zyFg}w?1Q=w<$j!yxvDL91R?I5AOs0Nrzb~`fb56ajZ7Cn?XZ}q+5$2YCa2BM!0>~B z`xxe-y6??g)fSLlATvSsLEMLWzS)<#sx1$MAnuzYtOmXxQG3qLl_2|Jb|cdQP&;nS zQ*8m636s;|XJGhAz<mp#dSQBc=Bc)T>;jnyvJdJ$l>Wz*d8#dMgdy%*AOeZsqB#$l zK=#ATL8doA?WmZq+5$2YCa25K!0?NJ`yA$@hM&%S)fSLlATvSsLEVSi{+qAb@<jyV zz7?X7@=tQ_116CDFuRfI0H_@j3shS`X2Rt3_!$^}6L8-Hs9u<!GxJqjKz4!51lb35 zA8Pw=zG}-KQMDF>EvzjY#31o|kzv<Lko_=okm(OlJ9aEkZ2_4HlhfyCVE9A8eGLmx z!!KunY759NkeML+pzcF$|1D5$;Sg7A*`v?ivPWF4MTmic;p<D~3XuIUyOHS$P&*<P zs<wd4gvlB3Gcf!m;68<gsP5xgsM-Ru3uGq9KB)Up+kYTE5|H@aA^|C%yXv%jLH5J! zMy3rw>KPaqek@dN0htMtGvsGr_(#Bf2cUXkde$sdZ2{Q@G81GU#C--R`C|)6kEB`) zs1LP8648GH*$*=ZnZ5v0&%nSiW07hL$V`}=5kCXNe**4HScC|_hAFBoK8qmzH;|bi z`>?q$WRYsi7fDF?t&oD0f6q-N7lG`D*^NvWK<%(ttl9!H6DDU2>X>>nFmS>IkZ49G zC}%OkeISuHi&R@cc7e<U*#~tWO8)(_NVVmM6vTaNq#^CAs7Q%Kko_Pt(6Ip2jvI?r zTR>*Q<W2Y)7#In-Zvj*<Oi#~Z)fSLlATvSsLEVQEzf(ZrAPse&45a+~aBasNko_=o zkm(IjJ1Ul_wt&op$(iyqFfb8tpTiQ=@Y7kM+5)l*WG2WyZ0<7w>5+xFZ;PxNc>l+T zQl|wV`(bt?(*Yp$3=9ksOI2GyX2Rsm_!$_O3Apb8R4+`=8Ib!*ofd%11lb35A4>dQ zS)$q^BB$0OP{7`DLQV~Q|GChLskcD(!^}aZKS1r+u~fAMWF}0`oS%V#g@F4SmLkGW z;9*ru&QjGDkX;}%LH0r2hZ4UfOI2G0<RRgAL>`j<&Pwb%2eKb#H!?i|YDdH})fSMM zFgXi;1_o9F?o(KXa34q?&ob2(kX;}%LH1#DpU5)R76ApQ`xGGVlXHH(9%Mhr40LP& zwd2P!)fSMMFnLRU1_m|)?mGb03)8b^nQ9BjE|8fZ`>?rh3&?$nQ1>Z9%IE!WxABAQ zhna&+Ux3;%W4USz$V`}=6+Z(5I|274EJqDLpXI78AiF?jg6zZQzL4drEdokV_bEZr z-?O*(pM&g&*^NvWK<%(tq1pm66DDWP&%nSzz<mrW5bk^8)!y=ExoQi@E|8fZ`>?t1 z%W~Bg9%YF84k$y)mp=>dd;r-Gvm2QffZB0mg=!1POqiSvKLZ0N0rxF{>V@g)Sphmb z@6HF1nIQY1?nBAHQ&y<9h^Ro^cR~fye%aeT_bbSLm^sMw2B;ksD^*)SX2Rrb`573v z2)NH-B_jMl`gB&Rwt(ycnF+EF>OPeGYqC<cML`wfzALJb@u7=TyuN_!2bqD61E6+D ztWs?OnF*7(<7Z&tCg8pYP`xlcXI84Vfb0U939=8H`>uf8rv`POni}~28U6mQ%^>?> z<{;A_pmyw7rP=~A6DDWR&%nS#z<mv?P{S{0m1+yfE|8fZ`>?sMWR+@*fjY!}Pt+mp zzcbo>$sqe-b|cdhpms#82Aw;Gu+M>?fq|ER`xI6q)Pv0AS*_XvvI}G;$UbcD6Ird= zqM-qC-yID|`~KbY>^&g+L1v(11E?K8R;#vv%!J81@-r~-5pdrDs9u<!HLF!yKz4!5 z1lfnpeOp$mwisxtwSe~EKG9SIpT7p$lMAvRW)3oa0cyvLHL5KjGhuR0{0t2I1l*Uf z1`&P^1*$DRYoPmoSF5&w?8D~1kTt3;4qA}#`=SLYpAWe2d;zi_W;Zfj0JXznEyPTi zoHIWIg8%{dF|0+n52WwS8r2q%T_7_-_F;417m)k3q3+X$q(5(u?L{E_L1v(10jM1} z)~dFE%!J9i@G~$75^&!Fs9u<!p0%niAiF?jg6xC354HSTtJ-3r199IQ9Z3CQ=WX5q zvL9v+GQ9z6N5wkT7Lb`RIahuL1|b6Ob6AHOemd(^TR?V!%mmp7bsuW^w@$UiL>J<| z7rK!0uV=QZA;^B1-N<wR)DDUDsx2ThVRCN#3=F~q-1h*g7pCXTI@K1CT_7_-_Cei; z5`I@e?$d+1PY*J`&?RR46=Xlm9Ax?f)Q%nNRa-!2!sOif85l$exUXS7YWU@>S8V~= z1u_$4AJly);a9R=wZ%ps;=T|1kn)+uc8xd4ewf|J^aQ9K5gSxnKxV?^Jop(HL<zW0 zVFRlBcs8iEfb0U939=8H`$RUVw)hx8+{a)D$-g%ma+^W+!|X<;4WM@X*r3`1G7~1} z$<M$bM!<aspn73?)@%T+k<V=gnF+EFoBOta+-IoP0$Rh(U<8TZS!<3x1lbQW2bsPA zwPVIc)fSMMFgY)N1_p5g?n~H+8h$<-Ra-!Ify@Nihs}K<8&z9Ej3D91VGL<MOT7HC zA7nqwZe+RuYKO%p)fSMMFgb621_lWN?qk@5aNi2Hg)MJ3s<wda0+|W251aeGfZS&c zb)ShE=o)i|W%ho@LH5J!My3UzcHG#c+5$2YCg;P?z#vJ$eG8y^VS0KtskVUZ0+|W2 z51ad@Y*KA;F@d=6hY6&7S$~C(6=Xlm9AtU})Q*bHsx2ThVRF9w3=C2P+~=?v5q=<j zI-6BnKz4!51lfnpeI}b#TU<<`?lXn756-<3>;%~lG6Nk4K<$v&qS^v76DIG+&%hu} zz<m#(dSQCbY*uXn*#$BaWFI#7UD>SK;$sGJAA`AC3lHdgR!fyfAp2qFAk!b9c5K<A z+5$2YCg;!3z@SFJeKlK9!!KuxYD<Ep$|I1OAp01Z85j&I3>aW{yOeBEZLu*|Yw0oM zZTVmhsoPrLG`E86hS`fu_dv}L*s9tBG7lyfz|X*-LBMSiTT$J{u~oGNWEaRxkbMxh z8N%HruvN9i#6qnFboSm03rM@*-t6UdAiH7qBGVdB^WSV$Z2_4FlMCc$V9@f$KW?=J zsu!kb$yU`CkX;}%LH0r1h6uMcTUA?hEFp3Fz!Fj>Gqs3q1KABT1DQSoHNRt<Y759b zm|PG)1A{gJw*_oNgj<65`WA<6sx2V9KxTsMgSZV5ZXVlITXd|TZnJ{)*CxLH+X=E8 zW-l_G05xA_yJ`!_JeXWCKLdjf0k^$@>V@gKvrV-HWEaRxkbMxhnZV=p$u`v%6Kjau zURbNO2r@7*EM?V+2H6cW1DXB<HUGeN)fSL>Fu4$Z1_nI>ZtK{N2se<vitVZ`AiF?j zg6xC14H2ge+f`e1Y}8s-9Aa&GU;}a6*Zn%tAiF{O(eVtZ`7t|GTR`T)<U{!x81xCa zO=SnF+eCJ#wt(ycnF+EF-EA@;J8U80cEc7@hdJI)C<WOKvlp2*ftvqghiVJRJeXV< zKLdjS0k<81>V@gqutT*4WEaRxkbMxhA=29pklXCkT0Tgqw%o8&YY|{zVCbEt6AiK( zW(G2S0c!q~ovJM$^I&q}{0t0+1l$(06E)m?cB;03>;jnyvJc`mBY1iX*{RwhV-E?p z3-*wFdiQ=pDadY^y~uP9)O>?osx2V%U~&=s3=BpD-1Y;i7pCXMPSqBWT_7_-_Cefc z40qcHklP%fZgYUNo1W&nF@WrbnSo4m?1K3H%r4ayka;k<NPY$eV*+lQ0@VxC)3Qso z1!Nb<OptvLw;}Rr&o0##6-S8MZa6~bG<M$!aR=EAGXt4k0yRHlw`vQ>JeXV*KLdj) z0k;|KhWHDnM`5>W3&<{znIQWhZbRf#joqp(B2Eyuop6HGSphY2;UK$VW+2lJQ1e;# zsJ4L2gULnnGccGDaN8NEUYMReyH#62c7e<U*#~hOA}<`-t=hul3~}25XGmLVmkj$O zklipdkm);6^B3$<Z2_4FlZ)YJV6Y(Iwv0Wf;TEw+wFP7s$V`xZ=x$5cquRpb0(F}U z#BEErY+ePj8)h#uT>&-UX0K`s$UK-_EI$K-6#=)g>_v6kmp!U2AiF?jg6xC14H2h* zKyGt|y3G|b1{!iO-W6mw%wA+#1Zw_`y{auB^I&pu{0t1%1l+a&su!kb!d}%DkX;}% zLH0r1hKSP{dsSOR+#qf{;Rb16#yUCGgY1TxflP0JnqRU{wFP7zOfH_Efx(u5+idos zhMUel)fSLlATvSsLEMH2H<Nv;Ei w_R|D)C*2lHPIluVfG@^K2Y-o_N%sl%!A1# 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 S88oCj#0`7@;4Y0-&o>5xF=`I^2-EeUx= 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�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 Q=-eZG;kN{;7p7-|gLMnY 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�JUw1n<GuxpI*=L=UNH?)#<d4o?MiUL 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.z-XOn2!yDD_ZvH{xjzKQLg#3@9 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�+mxd~4hmYB_QU(oe5lP-F;l3rH_A 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Ⓢ+Jgs6882dbfbgg~{nDGB8{w;KquTsNtBf(z^v@ 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ⅆ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�|RnAbYPs<w%V;0Z#Jc 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ⅇ^u^&U&EcP%FGv=*PE!;s_L8&^RJ8yhzWN;qiF#B{aZ5 z>8qwGwq*iRn1I3qgeO45D+dxbARz{j`#}sB14wv*)PV9Ohz5n%9;i9g3a<wS@hzY@ z0)-bej))8|((`3_Jb`=}u7r{=4Vq(H4j_dMC|p2zA~f8VK*9(l!~pUKh;hXb5^f+h zpnM6ULHY6x)EsJsTY*u03n;EY;RcN>qQWf%DPI!G!y)mAG)Y)3>G2T~@2Eh?T;zJ( zp(VEE2U3`W!W)EVK;y&22pskxAqG(RfEW)TVvHa)p!fjM0id<aka%LCR(#YL$G3pe z04P47X#gA_#MT)h@!>>-1tLDKw8XZkK>YynCk)SohJ}MMA}l~|1IfREh%tiHfWiVq zgTkT%5=K-Diw=|c7Et(u!U7upB!)!@5n+KyZyBwzEdf}<Viq(kd`u8w0dgBCEF5gX zVvHa)ps)bZps<(%2_ve71&?Wb3n=_SVF3+)a9DucfIil81?tWP&~YLd4N?m#$6<UJ z4HFMeEpaX_DoV{O!M-N(ifMcc$lsv(3<(Rczu|5GnL!AX+P?#h6V5S(*n@61$RBT@ za-{a}-dM)BfWi~x4+9&B`5^N^c7X1N0%1buSZJ6*^nvt%^e%y(vjw6-Yk5I5Xq**9 zgXU#GG-zH1M1$l(`al?@7eo_-$qBzZNbW?o17xp=Im8d7h9AfrP#A$Qso|8<7TfX$ znm$41!1|Pnp=tGwd3=kD1!SBR6h{k8;#)GT<6BgqaSd`eNFNM?#<$SLU~>3qkRF(w zAR4rv5SAYnLdRJbLEW?z%Q!1Y56FxJ3&=PtXe>Cz4C3}Vpu9okybR175KXEZK>i~& z?_<-$VhKqH%b@;+(IB-TKf?Gh8YYgVyns|J(Ecq*9Wj`kbiD=YW_0sG?q#up_=nVV z?O_++0xIJ`Wh}H@hnH`lyQ4suP<nTO+6{6S$Std&^R*xvbPf}U29*mS8su*f4O-&? zqCxT?eIN|d3!;g^Aan4kLmxK-m8)Nn+=;9gWUr1jdEo~#2NXsiOlmmww8yr{AjK)H zTv!QBlV7akTViY=<pL;<E?C63L^#H`*g*Aw+zqlHhAAl*V0MCNP@aUP`{mGbVFlDp ztFe>|AUz<rRM<eu1yI>lV+C>h7EoP7WVrw{2Sk(V22dEFmkWgQIF`H&G6tOfVQo(= zY80@D!KO{XdQ&=LTV8<t4K@uytcSL#7C_ohU<pvY3}XCo2d6(qkQ&fjHHZfFwOOEQ zsnym7*@YfX0(M}#8IC~X7)FECg5nj%htV)`cLHsv1@`eRApe2d912blJ3!`v^b><g z&Euf+u5Up7f^I&@UJZMQ8%Ql9H+aUk<hVfgd3^DPm;o|xhkbkt$W9O@be4Y#)NYWw zKzdI==cqw6=!`TF4Jso+G-%uwM1%YfqCxT?eIN|d3vvsn+y;f~8#jb|K=Pn{)*wvi zjOH(B?m4*>a+W`c2A$;(qCw_^XwVu>5Di+N4WdEvAiF>q<Q@=B3<miJpE~q18x*c9 z93cKf*9Wrq0aT9E_>^%ZKi)v@0EI6IlN!cLI%8WjkkTitygv@jcTXJSTYQ`#<vl2V z@7Tt-sJO+qBtZ3m{0y=mhAAoUVRnLOP+1Gh+ee}0`!T4SPC@xFJ3(#$=>gFhPLT2* zR3{lYK-|6rl+TGQ?_uVEXj0t(au2EH7&bjT&XDwV8tPvd4N?p8Ba9EDVd7ZIKDx96 zL3v^i)XgBbAY+hwzd+?k%@Zvy#ODbE7f6_a>;~C+9$J=xXi!-NqCsUDhz6BqAR3hS zK{QAnqz{BadIjv`TR`;$sQn481HpADNFKDu8iWbuvjb@Exv&&+ray=Vo#_vvL1h_; z2JM*x(V#Q^K{QAnWETj7+ykPC!65(OQ-`fAD{)1H8?s)Iy=$Oyq{iC|SMuWx<OWdq zf-tFJ%+np)q5@58Aah`4**R!F+Ta%7BH<1x%Rupa!zsQ+$2-2o1*!++XOKP^rlc%` z*$JXS<p?aVo`IHKXQ6Jo2<5}<1i1mE2Sl5=L&`ExdHcr&;`Rbin~cb^3}z09Ce;lf z_n?<$gvuo><qyahaNdEnU9qSE?d`xj-u0wAwq*&(-(b@a#8qh9HO2#xhC%HRkP4na zuoxpq4XEu3qCsuf15k5l*>*hxb<aC!9K&dkyFl>@<HKl}cyMZoOHK~<F+Y$RVlb&? z0H_aI;Ry~a4C6s=Jpq*?wG24o8{YydM?qyAM*zfpka-|WK;u;)OsH?l;swzM(gV`_ zX(<B(=*(ac4T@6`4Jyk)G-zKOh(?wN=>uVqUJy+TCMW!MAh{FS4v@VcpmL;!AIKa~ z7=bXU;dG}bw&e*l4T8*pm4hFl>2Zg5e2an)q#Ojr(F~9H76<?M76xcsgWL_$2g8(< zgD^WmG$?FgY5qO55B~w`rq5W)L69DhTWowF<shi6cJP9@y~2n1HIy)OKs2dt0EGd1 zIY=mfW7G2h<X+I7K2ZODfzlwgAV0$RFd8O~RwmG;JqIcidVCRi59AgY2D$YPRF2d% zEf5sn0_wMd+Evi<8C*Aj%m$5BfiR)8F5!o87sxF?mNGDa)=PtE&^hKH8dN5LXi%L8 zqLJl6c7ZTRFNh`vgVGE>b?EIXQ23oeawoE0ki9IRyvD%5Kx+7b%mIZF2$LF4e|lqE zen8V8$Q)Ri@Ew{C&-ll;m;^w|1W+8U@riFy2#s$MfyOn+-5`B1Oi7slvlB#v!WNe1 zze3A|Z%{Y=#8M`J^nlzF5CAC?K;>45AH?lFpn8VLwh_!65KXEZKw*GhCJ@TsX!#gq z1UT)(+C^ycpz%DMZGkI&u`LHceg&I?ApSzzLphMP4_E?J4}%z6qQUuw5u^q*?**bk zXJy}jnnTO>&>fh2mO;-NfYGq|2^b$nL&e?kw1+Z+<6A&}1GO(+go6DB4o{F@iNT;a z$EOZGPlNin3xXi_pz8yr#}80BQuB09Tzrc`1mp~@JuwjTLFP3C6W@o@35MtcxeKJ1 zWf^3z35W*uZ9z1s?+c<qWh00N`5#1s<U#sC7^D~E7En123fB!$5OYD|AbHUE5(pFO zm+e7w59>0>I39=wjnjc>koh1QG>!+NLF0HJ8YB<03xr|zg4l#G$UpehV2jU!5QzWK z^?~eN0hJ>)KA(h;A8#OcfWjAqNeyFx39&6-VEGJbeLXWYPptu!<zbNW9TdMS0^?g= zM8>yhK+`SA&mj9@n3D1xW+#XS#|zXAjLRT*<uF0{Y*0STPLLZwdO);67^Hj$)j>ak z<6A_+;#+dUh;Q@3%mLA)x&h=K^zxlx8OFfCfUf5X$h`~<4D3+<!f25BAV0$RFd8O~ zR_@WI%?B#q8p3hshaFHkQuBjH1o8Rd3)Bu+IB-MDF%S(Zr$98Q90SpyatuU+;ub`M z<U#sC7!<ZQg5q01bp)ub39b9!^#f>Z34{sdv6cu#c!130Sq2%y1JR%{IuH#i$3Qe_ z3=c$u#_&KiNFL-C5C-W5(ZpbofAFcpR*qRjBHW3r7i4b%RF2emTN6osyn);R3SST= zHH<4J#<skH<{OYXuy!gJG!K<T#kbsvf|O&R_+1bd-x81<-@*Y+J0L%U^uaJC<rvIP z5DkhKSU%-|mRp=qH}OLGFgrnR0O<kIKcXPz7^tj05CL(!38*bbWIGjR4u~ez4IuZB zS|*{DJs=~%`3BZbMUw}O-QjGf226@=$pHBkYzl%9Tn4$*MFiU30m*>c9UvOo24V!M z0ku;>G^m~005ykN?Nso=gTbzjLCzlW0gfRa@veT3PCl;j!H#aO@epxee-~GflTiFm zq&@|M3eYNRNPG9sq}Y}KB)@_UWnf?sgNB1lEF%Ac$}N!m1&A0UNDas&5DhwGuK{Wf z&BDROGZ<$;K-=Z8w15#7IP`)7!@$4*bo~~{YvAylF*&v+0^&!o7>p2yhKWHOB1}MS zWRUzFh!`VC4QMPEL|Za2F!Vspp;nkw#K*UQ;sI25K;r@IW(@xZxCZ$;`nmc+mac-; z;0znMS_Oj&3q)Xm$_R@ou`MkSzk$37#}d%6u!%>61;}k61s@<{j370jGde*uD4(o= znnSIy=t+og0fj#(ETG{J_9sSIc>0Ao`gpp;yZJb}2ZLM)N&7g%14X?;ok4}6g@FMm zr9<@Hm=fDE0pdr9VNg;M8YTe=h%f=U5hQ(}7%avJQlr7ZzyP8_iEanf9BPFLPhxxv zC>}sz0*wc7n1I}XUf$k-x>FijSHNhHT2S1>_%IqK9-LYdoSImaoDq;%lHr@50@}|D zle>}_-vaV8sO=$<0`@c9evleM7*vnoQ-j{d0F7tONrc#gt`FpgH&8iJ+ZYQn;#)vr z3G&C4Y>4?F^FVfh+M^(RL|7Mo|1L-z9cv^(^nt`ddgY;QMi31e{{zvWHY11zwHZM) z$p0W3BoERD!XUjMniveyk53)8@VkTLPGr3xdqt8VejqjcK<0qL2!u%urz2BiTRuS3 zCdeFEJ4+6lPVXegx45K0+F77DT9Odo!jm1}q5_R;kh?+pV3?A27R*i%4O*KG%L_8g zAb01<Lfxc*rJV)R19D433Z$I{Y73?$LEJtElsAZMXTi(?(WJTo6b7W`du)1GQX%O; z3F==M4N?p8Ba9EDVd9`RS!QvzTTyCia6w{nDs15&NDoL2F_@e*y#eZ8bo0UXra}Bd zYMM?ck8f$ohpcOhsDhXQGH*><d<$qU41`%uL+%d(iKE*M;@d#&2C+eE)RsZ!2tYLG zu1^pR+6w@pL1h4l2F($GXplTe9|(i=<`e{{CYR(F6$hjiIp>rXm!uYfq`>9vhxGWC z3AGTnYP2ET8j&8~lEEqn#uZSv;JPRL1ymknD9AqbWeg0UJ>4K0w0R9ggWL+DL35iR z8d)Bs4}?K_a|)a)OHx5Dg}50c4#FV0KYj5n1sxE#?wE*hD@O*xtt#mdaa?zXPl3wA z%+!Fo6-28sFff2<kXu1C$gLn6<W>+3k_YJnVUT-r3j9iQlTwTP(?H1<8nVS8SxEg4 za_f{dh<iVDLEHt>w*$$&7ohHeotpsBjUZhzAo@TeAibJU_kw601_lNY4RSAt2DukR zgWL<ELGmDdAPmx*QxKA0l9&T?G>U^k@}M*es+U1^*^VNJy&!Rrepp&)fVzhjB!~rn zfy#rVKzg;H?gi1HJxw4Q<X#XBaxaJmxfeu(<U#sC7^D|O6NAag_bW0X{zEq(WbXs0 z9I5$UCX4+19g&4d!=&c7DM)%rP5&2=^pctuL19O3x>zzJwnYZ1?1k0cs?d642B<BS z1F5?~Y4So!e9MQz_!bMO9#A}i?1y1W>TZ~wAR1I}!s;evXx*&>b(1!hx*Mbi<QAD6 zNZk!;Ul@SWPfmPGL=N#|y)bh?G^uU?g#miqO{gBmrsn|2y$lQtI#B<@XpmZvA7OkL z4HHMNyJ3U9AUz;8#9(sra854nJiG)dM{*v{i*EtVO@lC@I{E?B4v_yqel>uWbs!ql zp9RsNvJOOp$~q7YD(gTrNFJmQgh6_z<Po3$Bk~ab2I)0~+6$sV^(}}7*$bjU_JU}T zy&xJS53&=4L3(-e5%v-)J1(HvYXr3yM1$%^5Dl^yM1$-F(I9(4G)Nv~CkTV=or7dA zp>oF~AJxCcP<uf%sEz~CAbUYH$X*Z)vKK^y<Uw|VFv#8)sqrnKJ{zdt3+-!z+d&|C zV#~4{XznqAx(7sq>M#%uau0|Gxd%jp+ykOP@*ulF7~~!hO$;U{fAka}!VTFDkiAEs za-`-DhC=f5hfN_Otr4o@(9?JYl3r5N=@ultq^31cxRIMKp3I7ExdAOxLFT~fIDKgO zT2mC?@}vk-$AQvhPfmQxgv$7qFHk+8cmnBzVM^*an4KURRKLK=a9wB}rw4VDDV918 zqzCMlVn`has)t1iAa1t-jaL!bKZThCqDgfFC=Af+I70Omdc6cP1B5|-fsN^*s{v02 zVCjg0^z4}(+fo4XFUSxiYzZCDQz${?H&9y|q-07XSd0;*2DB#=M1#tt9;i9g8qWjS zg&sZ=pzg7O#x0BnsRj85#)r``ar7{8t$_5#L3(lu;A?yR5_2IVdLVI-UScpg<yc55 zI1Dk22ie;Ll_Rwr(<wu=)sH~K31l9IB@7G<C!ltK<Und1pnY)=4XVdMG^o4>(V)IK zhz9k=K{QAnqz{BadUFaueMN8|*Rd=yGY52bbx6K*VonaUQx2V<I8qkhvf+v(7_*c? z{Ew^uodK1H+2Od1fdRCR5JZF4rhsUW`#?14{7n#zEDzEL!VveN^bx@h1<8RhNWP*R z;jSf6dvW!(8OkB<hUs;Jx(h^u<~~3)$Xy^B<Sq~mau<jO$%FKPFvwoCzAHQsLGmCB zQUe;t0M+lH{%c1A#BPu{NFElJHc&U=>Thp>%7gTP^g2V`45C5if@qMNK{UwCAR6Rm z5Dk(C=>uVqUJy+TCMQp1R6zWPZa&D~1yDIs^TeGB^7Dj5B_dsrnqEVY^pcvUK>jB; zZZ+n`wyc2WeULe@`q>^@UdmL(x3pA2>Ss{8iYbY2IZz+patEph6xJYpFic7P46_qN zgZ2Ty%4Az;{cHzylM9ym8Kei~mIYOi`We)Q_y8J%tcq{B0~&uMvVMk{1ENWF11Jng zt$(oTajAx+Yged$VKhiB$d52SjE0G0)>)8VC`b=T4KbLUeE0$CUUc(8_G;8X{6cCz zTu_5(V-u>IQlNH#><8KD3GIu3XjKLV1`rJ@uRt`YF9M=LeGw21k_YJnVUS*lTH^EY z9W;Brpyecp2Guzr8e}hs29=W_8dOe#XplU}P7ns!y8_8xLis<W780f~z1~oJK{Tk& z0MQ_OK{Uu-5Dl^yM1$l(`al?DFKBEQG*%Dl3qspz@V+3iWy%vY_xM2F1EN9o0f+{< z2SkJ11EN9h0ns3NkXt|)<Q@=B3??U?&Zt9#8?qfBdoMucNKL0a_2j2hk9zXcS__h1 zQqv2_@8rg<!h+bA7^M6Tt1mpDWtC4ue9M*wNPPiHR|3`XEeWmhEfr8bps)tn55tty z7ce_PG^nhGm4|N7`obORCSNS|1xOFbEf*Rf^#!O-Q>cTuod?ukA+o-JnFFFpbpt32 z(CZ6AWj|&a4>AQZ*Mh4*=URc$ql0y4z<K@0g4h-Zke?w&!O1{qpY98i9H@N>Qt+i4 zoR=6uYCw4!M1$67#6Z>3vQL-N1h$(Y1RB3E8ssieoWl4p8Yb>sl$uzQ3h%o?I&{#! z21pGtn4EG)pc&#`bn`)O^?=HeTJ9WZMzm82?ICJ`+5xg3WM{-O$o@+Z4cdPRqCsma zKr|=~gJ@7a38F#rAblVV(hH(L9Q9}cVVB5o@R|->eX>7j_C_vaU;y<6L9{so0|ST# z*$bjU$H;<cWO<NXAPln?#3qEviJuKExZ~#qRF2g6QE4SVen5T%g)az`8pbAzVq0pU z`2%DQtb7iK=9M?C@hu^3kn$N+_Zu|Dw`g?5x6FX*K@V$6%4e9JAQ}`eu>2SbEuX`n zZi>QEK7;gt+)~g6DW5@gh(!y;?Q1}D^hB1=FmpgOscry;AA0#rsO-U}N2DE+zM`T2 zh0!3jAV0$RFd8O~R$f6G^K>Y$4nW-tatAU7x%CHBj@10n(Sc|u5h|}tIw0W%vKwS) zJanuHM1$ImAR1I|fN0QI6Nm<lHGyc5JV+l1gY-J2$G3picYxZr&^ilT=Yixw`3r;z z<*_4Z?n!`_V;~w-j)7>9dq6a(90SpyatuU+<Uw|UFvvY1nivd9tN7GmTbowVi3m4j zy&!uxK;=k{w>O>S#~a8EpzsA@Qp0%8;@B1)Xj%iA11rbkpm}IZSA2_1H>4Z`#qWc* z_?8b7;#)kRdO&^#>4RZP$}yOoAQ}`euzVT=EyrS^Zc4;bj)C-m++xuUDaSx%Ekh^7 z?IoZ#6p`f^%p4F+svAIIfL@LfDwEL49*_~>d;@D^qRA_u@lo1VB}-ykR)G8pHU&YX zLfe-iJ&1G*S}z1r;V=U%#t2da+CKoILF=LqK+U0L`|=3XJvGpHh0!2)f#MRzhtV)` zv@k$vW9Jlvq~;dnAh$n3+Q4B7W)MMu;vJtdY-K`EFE|`Aw1NC_2P#KunJ{H`d`ra? z$eOO6c@XnK=C$-8+B`p?VF(h(u$+N`L81?$4<rXt(*SLgf@pOH1_lrfDpNr;s7(r@ zL2XhH4Uz}x17VQfoC3epa(J^IBns&dmCTB7IkOPr&J!yk_JP!k^dsCE0(A$jHtYeY zJjhg#-bSc9K{TkW2hkvRf@qLCK{UvnAQ~hO(g(sIy`V4y)kmN)50mK#_kiR<Wh4m0 z%1K=F2?6~OeIPv`Gn=4w5r_uWH6R+~9uN((A4G%dA`lId2k8T0kX{f?3??Vtu}na? z6WI=sy*5xeQqx_<1Vp@%n!dIm=_NJJLGA~|4G5DOKOW0sTkb&f0>~U#Jys7ZTPDW0 zJedfo$3SUgLQi~4&b0Uz5oq27g%?O43{z5%!R!Rlpfhq|<yS4V9;<`8sToT>2GRp| z%OprW2C8d&`XO$&nMC{=FPJ$Xnp8J{!T`M<BUDyn)3XHRUeG;fQ2(|-X^>iwA7OkL z4HL&G-=QsXkRFg4VlX**DPS`0ywm}eBQ-BEOhL5k2<4?CP&+{W1NpTB+8zhdp#3=@ z8dT<hXi$3`M1$JnAQ~hO(g(sIy%Uh^C6o_srXc(c(%T8O7es^BcY|n<y&xK7FNg-& z3!*{tAUi=Ar1wZ~d<$spG^if{ZCk+WUQoUUVM2NP44Qkopk*(J29>QK8sr`j4Jvy< zG^p$a(I9z{TR<4(9uQ3oCMUf#OhtqnvK=6McR=MxO)p=jlAm4-rXlo_8s{MQgW?8+ zNsXT$%VS&iK=V4t99Y@g4$bdBrp31;Oox=cptMmiDZb^%-1wFoP(7gV0_lTcO3GfC zogf-i?!n5IR%qGV26a<6ma-S52jrHT>5#G)R6lS`g}8kOs2xFM9|C3$h$htypfEr$ zdkK}J8096%5a{>?j(&t|1$s{c-in5_=`O5@ZFvLoGt?{?)er4UEP(VIz`~&R7Krg; zDL6kcg4BS{7XZ<E3=9k$P_?w|O9;#a+s!Zq8ow|a<StO0!uT*6CXN<%Aw`LK#fix! zsVUH&6-X~gEiss!GUN!<-RS0n?EM3kBee|anMHj2&0-cL+(7n&?3@8@cY|n9`yWJu z%32T&YIlQZP`evMgXBT_Kp3Q#Wp;c^P9LNnaAYmST#&fTY=nCVl}jhk+%psE9uN&G z>p?WgJs=w79uN(34~PcIgWLkbAbYQ@k8c6>O+a<giFF9~teG7T9#<!(tc#cp(FZeg z7PKw`(V)5pM1$M|qCxh9Xi!}QqCxT?eIN{S52%j>svkl9k|RqX=7PjQ@;9bSwt%q8 ze}C{;Kdv=HFVNgG8yY?!T7iLq0Yrn`1EN9U1EN9U1EN9lAiF>qW-o|M2$Pep=gfil z58Z5#y;q=eq^4_uxrlT`s4az_u6>a7l9~oP=8~UYK>i2CD+rSsw{up-wrD`h0FXJb zdUZOqj0>0--?C#Kq+SK3t2;B|TmCGLZ}EZZ0fjY49}H7cufpsE(V%f6SUEZsTCYxn zx@iuUdKIJx<d!S*AoVJ!?pK)ual62L;`=l(b3inyZUBV=dc8`h&cLRp0_0u>28Ov% z|H5dHT96-Md>9QA$63$Nsc)mR0C#>&fy$AZAMY$cv^NRm#|2P3VBxV4+Q$IVpuP); z29;YN8q~)C(V#vChz7}n^noxaj6)V8>?M?!B^Dz54br;^YA=We^<6+T$X*Z)vKK^y z>;=&vd61nT4AT2#A@SwF1T=dWL+cF?4XPJFG{{~M4XQUlG^pMH(I9z{ogfUd7gVQ$ z#sWe07_^NA?^A)w6%Zy=wkRw@4TmMrdILm*>ID!Dau0|G)f*rhRBwQ2kUYpOAPjO3 zh$aS;Q*T^BawoDKAbWWhL;OH$I`vqLNH3(O(-tJXq^7k4i^)$fAism+6@*ER+bL^e zTP8ruDUdm^dSd~!%<5PY-|}Gzq}~9fD;JR3mGLcGKs2=90MZA;l++tAJ3%z4%!ZYV z^Pu&{e5jk2VyQPkdcg6%6jE=1>b96g5Vw1P`Wi&`$6)4wXj0t(3Ip_dgHRoSv#bXh z1`S^v{W3)V1HFHSkb(A0ApNwQwXrQVps;|N4Wm{<`)MA_AbAEP4r+gbXlPrQ5u^rG z=74BW*|Gp?4lVm>JD~1a2aR_a4RRMKu3>x_4HFMa&CM?xfHg%a%MsxRatjQD+&Tv; zM{0QlG6Qrj0|*nEqrU;Q1EdFJ=cZ*0450l?AR3gGK{V*R77z_u`w60v<w5#D7^D|O z6NAYqw|iFL4yPkfIeLau#=6*+3(&L%@-wUq+z3r~JuBl|zO00lfuQ=eWm$a7pEdC< zZ=ib6!;6wK5N0Qc28AswZLf!xfg7N1+Ki<P1nB{}MPL=A3}jdt-y*UC;&z`^#J8Pc z=74BY-2e(d^fHi8KE|eJ3&_0;3=CVK{)N#XwIDyj_%IqKj+XbKEoMmh2U0@}2KgDE zI&5>g39E6Z=^0Qta?&(tzc&aI%KKNKc7WUs3ZEUz7#Kj~i69!ZzYj!%@;-<L`42=R z%Y*cRFi0<mCI*Ad!KV&eICZSS9Zm<Ja`X(Rj`guEXP{{f<QG`p-wsW89c$xTKCFf0 zebD$&!>ag}C!6A1UO@GrhZiMzA7&?r28AswZEuC<{cTV;?ZlGzL3%)L;aLaC`=Ihk zU=76W9-#3oBHKSOb3inyZUBWJdfq3LkJ0ig$Ov$M1=i+4lUG3FqqJ`lHpI5nfcy$J z1wrhEwr@1nBhnsd{1K#L!A`IkBS;OXjs(%5H7!%1=FqZzGXv_LL(q7I(I9t$;u6M( z(J*neFu-W-f%NKZjBf$?5j1|dW;582;BW<*K@0}PJwA2V@^;Dwh&|}~K<?QBl_NE8 zFWDR4@@Fe#oOsRwi1{G%Ts9)c_Xw4ZAE0)F+y&Bm4B9RN(V#d7(V(&sM1$HzAR5#z z0?{COkUkIw=>@q3G*%1>*P0y&_kiR<{Vx!P^}%qhUuoC~(Ff84GV?gJe+{BR{bvvj z>R*FsQ2!c4gZkGX8YB<W2f`q|AetCVPJEhdLbwyz4v@V$P&rcLbHyg|;|=5nQ22r{ zsbM^4V{FR?Xnq5k11sl`Li1k1=J=Kyn<3>qD1KAc$G2?R9^di?st4p}kUkiuq@0J@ z38F#i3zokRL(BOiP&b{xQqF_)fZXzBGo+jc)kS+YLfme!h4?le%p4F+svAIIfL_iM zD$B6y0lAlff#D?7zc3o47UV}5A4bE(ah8A3)*eVNNG&m#oP6Q46?eX9fy$AZFGRK> z#+?Y2X9u8mfcyvY>se@94@867dLSB9o`GnP|3EaTtp}n(@*sU64AMJiLwpOUt^oJx zA$1|Vo&e=D5GIt@0=6N-17zkoXn6*rLFE;Q29;+Z8dRQvXi#|uqCxT?w}3E6FNh`v zgZzb09k%+3Wjn&1$a+Ec+Cb$<jkk*J<i{Jx4WRG^VN%1GWpixH259~PnFA}&&Oq~$ z!;bit6+0m187O{Jw#2tw*&p9>1*!++XOKP^rldTB*$JXSWeF_5o`RNVr=e~-kEJ{V z=>fUr$PP$(1}bxVwn5y^07{QUwp(H5fM`<P015+)@(dbIFu%ZPkXn#?ah5?K1!&`T zIMt%JW-(fFkbdi(&9N;eps;|N4WlkY+qDe45a}A!J^{(coB)e4g4BS<?Lagrk4Hew zp=G<a0P3C_(0GT@Aa{Yn4#tPkFmd<P61UQv9MGxEpfg-h+V&td#9&g(1<?7vGP}WH zg<(9%tvOIRQp*L6Gx046M<DIinDY?xLFWD0jcETw7(0RI??K`imNPIgtbp1Lk^`x^ zvy6cOv{nX0gZ9XSXizx{qCsgML?g?C^nox)Z^@qc7Lm)4yO2U|Al%cl2lFlpT<uni zJrI2`Gw&{AU;x!8AR4s314M(|1EM7v7#Kh_vOGv12!q_iaXP-`$!>^yTy8?l1&Qz3 z8{Y!DqX&dx_gmmvcYOlQJ@=MD?m`05pu3JhG^m{pqCtE6K{V(tBoGaf2e}1=LH2@Z zVlb}s1zUr`0xC$63<CKBiHpL7*~_vwz6DfYgCs#>IR$Q+IjI4OMI|5+NErZ1OQ5<M z<e!M+i0}fb0O<$e340;pFt>o@kns<wJV*>=&wXfm0@0xK1foIl2ckjo2ckjo2ckjp zAblVV(hH)A!MMT;rWd`Q2Ia>!`yl>+se#cTd!In%NX?H5`^nFDG5g8SBQy4spPoVf z2E{7~lNz@-w#K$}K+9o}Ik5J@ZD^UCa3H?r!~sbA0F<t5cEz_$I2PZs1gZxV)*yW_ z3`*AMVlX*;G)NE3P7n=B53q9oCbT_p3+ko^P(I8&WW7%gK-veOHjK$Wh}#to65rne z*$p#~R5yU!gWf(MRL5b{(*bfX0|UcDsDEKJNG-^1Fg}ciiKEqv&|VItTmY#d27~;J zPaU>=XmSX5KFop2k(v*m974303D$p5J3#IRh0oJv3=E)i4L~&L+)fY;Dz88^sGI`P z$nqe4APmwQbC~!%tZ*3NZ;;++(0UF;gX%dD4YC(RgUU$|4YD6ZgXBSWf-p#L#gX_H z&|OU+OsGDafoAV>=$%*~8g%Cshz6DaAR2Th7KjGji3OrT@*q1w7-TPqCI;h57qB`6 zy*>l^1DClld#@Zut<OSs$G3pS@j&fQXuA~N#{{VbVM68GmLsTf@&cL`Kr|>VfM`&h zfM`%#2t<S0LLeF>4|6ljjW9kw8duoB^kB;~8AlQBgsB73AbS@;<w(slcaD;uXC#i1 zpYB7Bk)L)M7#J8p@e0DE#_fgeu`LUrWhKZQSl#smT5if5k8f!?4yn69=_=%4e9M$` z@hy9xdO%?f(g(wo)Lk$;K{O~mz{=)F(7Ng|)J-p;e3+deH-Pkj=mp0ibr-09{cr^0 z_B)_99Fcunm^mPtR5yU!gI;$Ls)x|(8;}v;{0f_sL6Zj^WP`Kcwqi$YivXlA3N{Bu zyoL5%_aMoE+PEP3oa^8`#0XLY%F7@cG$*40RZGjhtIkQV-3%Y0@d~3s?gGUnj1Qw> z;%H%l(US-11*s(lgW?#UI&9_61E{;v^?~e_I0f+&spZauQ^dEKL!fqm><8KT723A| z(V)Hqhz6C<AQ}{>AR1IYgJ_UENFNA;^eUVtzRWs<X74v>T@9i^buowr*$bjUbv1|v z)zu&xBoDF^ghBSsI33>t>L-KhDVtl6FawEiI8A&TKISw;AI!|}&^{@M2K6~XG^h>- z(V#vlh_+#1U;xn|d5}I32HCskPJ9cfpA2%3&TWXfAaRE?@hzY}0SFT+Ti>9$=La-i zKr|@aK{P0QKr|?PKr|?PKr~1m<Q5PH*$Wy!0M+Fn_j_DJxCbN;8p8x(*f=JxdpK&& zK=gt1fXw^}bq|OJ#RrH6xd%jp(g}zLr4tYhk_YJnVUS)BO$;U{KN*}wxD(k9ki8jD zIa2e}lC$LJrw3=r&l57|$WOl!=g3cMpl}1F2@obVUF_Kv+v0*$roq|(U!di(!uj}? zj`NT<04PoVI1%5{a5cUq1F8oUPaykYn36UC%uWyuN|Ug%{}Z&%{|t50FDM^oC&&#T zJs^6?c}N=o)K1xP2IBSypm9MW+W;_gKs2dt0J#Uf4M3=#!=}gM0whoThWZyqgVcij z2;;+Om^jY55!#al=>@4J29uMQ|3KZ1Za&CflZy~Pk(!s+TqM3tUI4WNWIxEx|Ioe* zhz9jdKs2b#1JR(e7es^lu^<{G57Gz1AiXM=h%X0TpxMi?95P-DqQPb9a>$u;AU>$< z2hkw=K{Qw%WGQqmW6mYw`vM7<AYls94stW&a>(7zAR5$91<{~71Vn@Su^<}Mj|I^n zd5}I32I<wg9Nz-!Lx3=$y6y&=y-dp?;{_lZ6pkPo6wV+Tl!rhxsBQt#AbF6TAPlk> zG&T(y!w1#9(Do>}4GfY8m1iJKs7%Yaj2aHi%OT_UAQ}|DAR6Qz5Djt<hz7X_M1$l( zc7ZU+Js_GGOiuogxq@&fvK=6ML!fe`=8p+i$j={Vu8^O`Ij)kQPF=2&pVmO(21*kk zOlrFLvnRGC0jZ3F)ph@%<t)#&_?D7ukh%_(CPgm9w|G2^Z)t(*0mT!@ei){tu7lYL zqCsgAR+j&P)@^^GZem%^z<}Jw1GxdD2SiV}2C3^n_3@I+5VxNJwHJx3>tN=9Xj0t( z3Ip`Ij!?aYvwi{@1}*<^^nDTiJoH{LLI!0X^UB`X76wTF7HT?#;#dy3xBCo|9H_kw zl7-IKF@n^9=5j$as9aKks-;$c*u}*qKFBdVKEyG|-8BS!bvMX*aJdKbKNd9#1{I(i zs10CO41?8o?2B#TfX*|54S^E8P=9Vgk^_~sAZh44AR|Z(sP6%y^%)o#RG@09>Q7f+ z|1j5h7gsk=KhF?Pe?O1|(Bc~GS9Em<-@=dW2BmqO{jn_{pzeek1*Z6*{#^o{;{*wU z`j{XZ+Q(!BsR8*HM1%Y*098v(|GGvvI)}vjI)*rV#QXcj2Z6l>as(DXV^xdrH|VN# zuuhP_FYJ$Pc>r}USP)9^L;XDm+K&bagZi={8rqj-1gQb}8$^Tr%>q?RO@I6O$2$f2 zJGwYK28YB4M+S$u`huJQPNT?a8jCuFk1fDjz<Np!#J1dkx)UM_AqAlR?Sb~wL874X z1Q4xo2VB20g4BTg3!*{({Q)(Hn*Q|(^>jh<u}hF=m@CK)APkBxWItn53-`1k=;Ua~ z9FxSs*p?GW{sNf=!h%pgH$eOc5@G<2S%4T5UO@Z|QUmfchz9xj4b&WJ`Pt@fd<!U? zLFFMdoWbz~aszrjz;PGsCI;c<5P!jFkXlgK!1yp4Chn4&mYJ98l3(nST9%2p0vK#h z$o=>hke@;AS%F6o^Fd~T^b&(fZLfju3qJ$(2fFzndu8rH+(2r3E#h^2%Y`S9^(rFo zAZCEfJ8}=v7CTamf4xcs)NYWwKzhZOGcbVmNrPxmJr1Hl>i|JCXgwl`MwSQZ17VQf zoB~K-gBAjT#6TD%e&SVp%Y_e+bt5@n5$?>nj~H8-0(A$jbu0|`A^KouN<jNTAR4qD z5k!OB38F#k6+twpoerWw@*sU6402CSK}cdzdTI%1(Go}ughAq<umq(|P`c=O4zUj; z4w47$<pW_Gs5@}2Z&?AA2k8Onm4vzzM1$M`qCxHi(I9t%XplQWG)Nw#4}?K_K{PR# zob(v;0OCJ%^Fj7bfy$AZ9xpr~Ki%;>BtI>H`~Zp@5GFN#o*as8Q9#O@uy(u{w7j|U zFuuj+5u_atN*h=1#J3!I7T*#A)dLDIko_=BNjn~9Cx`~cDXdHrSq{1PT@>mjDJ<=H zkRFg*A|657@u0rOllu_2PXU#2M7HB$=74BY-2e&$Qp;~_dj5di%fP@O4fQXK2B`)4 z5ypqnFmbdpA39P6sW(7sh`}H~<5Pz|j{_>(S3Jg@mmWanNX<(TPl(S;GEWfpgThB1 zT84vYP#F%QL1hkz29@C;8dQdZXplV2zaYIYo*>2m2$jiG(Ck%M4!KtzL@P2dFo0-~ zy&xK7ABYB>y#b;@^2qkG+>37k)ytqZ0kj<guB$<6Kzk`cm{8tUd5Rhiict4}Xpns% z8sr`j4RQ~N2Dt}BgXBSWfiNf>Kr}I!ob+-7$(_h{fb11`2Jr)_>BZ+6`RS$O8ToMz zaz7|;K$z6{nQ|nyMFg5ZK<2>8UO8yK4|pEmvg0|V>;<Kb6OZCseBQ>l7(n%a!V9Di zhAAm~VRnLOP@KZb78z*SD+_g#5|*+TqzB}dE6*WiFQ|S<cnWd50H{q(WZ4Td2Sk(V z22dEFm%W6_QMB?BWCS?R!TTGiZD<8F^(bQ`IY(n#TtI#Wn}Q(Jp#6;xNOGWd7Dz?U z7jRl<1gQa)Lm(QoW*`QtmRkJ{kX`6ulkgI3H-jcLUSTvyEhsKwd>9QA4=hbBszmEn zfYgKJiNT<F#itIvegUnm<#+{gE4n_Ay$(=0Qp<}6uQ1zNAoI}e0P$;}c7WI*HM-C? zEr<rSSwS?YTm{jfHZ6z-wP`^#NFJmQgh6^slan)i6DvSma9VrvE52pTJxCvB!as;V zLFx)#Bj!J0<qEF8fy`@&K9Hdxy?V<T7(fF(AR07B0ir?o<br5W4;e%w%Y*cRFi0<` zp8~3jz<q$v5OYD|AbC(+fbb4zc;M;-tU+^+KD0gt(V%n=qCw#WqCxdBhz8Y1AQ~hO zvI~S^_JY`iFgfWe;SI!p=w^fLodK02HC<hKLw>pvcuRhqgZu!B8xSTnek6{^wp2jN z1CTkedPoOaHr#j{-{SBNQV)UBhR)0QmLs3yTP8sDfWix;4~8kJhhTPsXwbf9Soxy` zt#`DcZZd%KVRnMt0MY}ZW8OjPAy8fU;x)wWGeF}5MAkzvb3inyZUDK5)Up<v9)|aj zv}p+SFN_AM1^E%ihtV)`)bbh91puiB$rFRg$ww=oZbdgAWbXs09I5#z;sa)z3}ha< z9U#8U2S`|f*dR5g&~`6~2DNKJG^o4*(V%h$M1$JBAQ~hO(g(sIy)Ql>=HdvIyHn8Y zHCxWWV9db40HQ(dcn}RLcR{ovR2*3zWG4uN>;=^Upz$n_K4`lDTt9&1L3tX43FT{* zkEr2b4lQ><G^kt!(V%bu(V%h{M1#TuM1$l(c7ZU+Js_GGOip^af#gnPJ3#gde1iCa z)b!%>iTw1^@rnF62e}^<Hy})E{G2!u+adwYA0TsJ<*o@d&j);tZ`tt~QtpD%#+i5V zEhqlQw-`Y6fWix;4~8izcVTvdXi%94D_4x5<*YH(O%_l-%ubLSKzcy*mCulJ7gRSS ze1y1N0My1MvfPE41ENWF1IRt-<u0Kz6t%1bnE)9pfwlip<rPr5(AGc5-wRI0wzz=& z2{8gr+Cba>Z;<3b?JJN1=r}MVNDXKm3y21t0~!NWORcuQYeayfpG&-tzq6xHJa}d$ z7-T)TY=QX`iyC;d734pUQ?V@?&~a<9W+-6~_1_sJIZ!zUl6K%o0PPcH1gQb74*}7j z^+7IBwbb$-$S(AFxA_JsLmZ)L7Dj{Ag8T#H!)TZ|<Xl70K1N97g4BZKh{2?mgP=7R z51{TuHy>oL!FPxsNG%7C@Flb?U`}WOwck~Q!EpeN>jU2r?NUN}m~x<YgWLsjiyO4R z1EN9qc!Fq9Jp!UZ{T&bu>hFMPkUU5q2!r(6{EBZekc7Brg9^euDL)Y7H3@zJptQn( ztAFzc%{}hWdJRN_&XxtyAoqZ1P`w7CLG>Dl2FZim0>U8oq?89|Bo?Lm=BK2Bgur3b z^E1BX&JW1^jEp|QjbD)5Xz>FQAGrEF3!w5KLqYa<K-~zUL16--L2d-mAUA?&kQ+fX zNFJmQgh6_Je#Ezc!VMIM0(uDdEcuCf-YRU*6G$&IHuwo~FGvhzrss0Vov9!ibp9@g z2Dt}BgTe?zgVt$)XplTe9|(i=rj&zoMrMAVOJ;FFesN|=W_}(>5;_kbz?0Adax=)i ze~b|B4f%zL;~c1akk{WpjQ~>*pz<IN$WAY4_<?9pxd@^`?gi1H@B`7H@B`5xd5}I3 z2I);HcgsmkFLumJaV#k*%1kOPNi7D+fiOrO6xS=hL;Bnanh5v)L2|FmFG%=->Qs<E zbUXnn4-yBN=?!%+hz6~L1JNM&f@qL?K{Uv{AQ~hO(g(sIy&148-9SYTNDvyXpnMFP zI|PNR4?Du0ASIyk1BA~&-N6nL#DXn;L;L}f0@>vQ&C4Jf)b<6@Aa{ajP+kVnpu7yC zLGmDdAPmwAqKU!el!b4Q+=*-l$X=B{5I>Mw7AE{5zs#HS2a$G3EuU^6=_R$?5cx}f z9uENNeb3(lYKxMZ-+GYrlA88G@dZkYAWUj{tT-Fn5`t6@!rH*D(7HS1Uwq4+e~>mX zC@*k)i*IRROK8b}>H(z>ko_<W%CG2RFgbiQNDs_T5Y5fNzyNC>I4@^l0GaCob(1fa zHZVvJ$c!8RAZ=h!JH6yL#O)&giQn@LGY3SI>IM)XwJn5APYuYu3=9l@Q2)YckXn!* zVSE@369?B4sh~m(GVTBpryY)Okzhz@dGjAsE+)2sTJ9jXf$W3PAT}XPPFXdB0c0np z$sl_#K;=j+t2`JJT0nD1AWW!z#>0rPA7p1Rbi4yZgYGQ`(V#LNM1$%a5Dgmd0MQ_M zn9D(W4=^Tx%L`DML8zQ-L9;gmTIYdiP#Xe7gX{&-pgIpkgX{;<AbDhaEtnAY5-KDA zpxGM=wHHK#+D;%EWG{#Y*$bjU_JU}TJhHtTK=z{DJCCakRl<ZC&SB6t6o>}3kw7%a zUJwoPABYCEp+Gc99@$<EW`utUmCbL^><x$d7es^FIv^TkFNg;D7es^n3!*{t$oB3) zvX@Y~p2Cdk-w3F^AR5$W0ns3PK{Uu-5Dl^yM1$m!?Unc*-vXN30F7rs`-0%MHb@Pq zo&aG&b;TDn_e4V5E+87zHUZHf_kd_n+XX~}+Abg(BoDF+ghA;XL=%I_DGye#Ai@pV z4v@VMpmL;^2QsYWmj@B7h_ps(o}PlFm(+ZD0i>7Ayv4(Ya5Jg-!vje#sc9S(U!b%I z!lb50j|;IaQ=oMv$Q)SPB?ww?3a}@%RIn$sBrq^AfbxRJ|M->|p@bF%XdMAcA0T}& z3~FPbi^1gZ(I7oAJ3%z4-2khb1E6h}K&YFdu(Vx3dO&7OVNYlQ=>@f~3|Js;zX0lY z5IKGaGY3S2%pt`MApfDaT?n;95bX_+Zcqz=fdMwAg^+_@Gy!UsK!$a|<&eU~*cKMZ z7!^b_l#GLpX)QpK1NFl|(o5vP`J54?22{>~XwX2J1XL|8$Fu}E!FDqwL*o%fgWLs* zI~X5E!^9EcfVsH?qz|Ny7)(yNcmV2Vbn`*>{(#DnS}qoFCA5InIf5{uc9IDfB+Nke zgY3*$&cGnfz`y{aLGcEnLH+{Kp!fvQ$nqe4APmy`f(ubT5h_#HpxK)VZJ&W?Q2PKx zgX{&-p!yR;gW6{x8YB<06NEwbCU7I{B~%`(aHIM+3u-Tj2Kg66gX{&-AbUYH$X*Z) zk_Xud!XSHZfb1o*ET4mBZ}xHq2GHI_5N*l8zyP8__JU}T|3EadJjhNE2HBgzgYYk* zdO(B+)xSAV|AJ`HIvNlSvKK^y{0pK%{sqw>d61nT46^qDPeKc591t|t^1}>bE=c?b zl6wf%ElbeclM8hZh}L9aU;xn|_kd`Sdq6bEJs=t+4{{3#gX}HfO=tm)tAW~2EEWj& zbnqsC?@=VCzB1v3=!2P=2TlJV8g%y;hz7X_M1#^lhz6y95Dk(C=>uVqd(K!Tw1C10 z6h0lc5OYD|27Czj!1fSwfHYyjN6_4p4|NZS2DP6-G{`+58sr`j4RQ~N2Fb&W1le0q zTI`#dml>8?R16=C1c}>NCA5S%B(#9)(l0Iuci!PkX!&!EAB-9JAmW@b1JURls60p* zWM;u~1_lWR1_lrf+7|+%LGA?6p!fsP$nqe4APmx*Q{Y-rlA4#2ni7y$l$e`Zl3E0k z0@p#HadA*P85E`yWFc+>=>aKtAuZVg!YiO|ft|Gol0(K4{1AO0F_7LuXqbX%P?`eK zAh&{OP?`hLpfCl|AbF5J5C-W5(ZpbodHB?!ui*lxRU~&J>jl}%A^`CNsda&a0Qq%6 zjR2yYA+<c;fuxtzGWiQgFPY`4fgr-oB$tgydPyzERtO^UIH5K&dYSVCNiV78gMtwG zc@~t$K=}uRNzFq~uEe%zK-(uEb71ZIbZFb_g-}9EfH0(856ZuHI1*Y;$RxCQK=pvq zG)Nx|gUTXwF_;`a8l(qiCx`}>iLmxvDzsgn26a;rmUcZz56FxhVMx0k)b|MChq!$O zXl{_mc0J4-5KXEZK>kB-*Ar^XV$~x8DI<!Z{)N#XwIDyj_%IqKj;;L*8=VB{1F0hh zlT+p$fVvsoe2~3ApmL;^c?F`xj|-THLc$DWKgiAsXgvm^LE|GJ8ssk!4XVdLG^ic} z(I9z{J`e`!eIbe{dkB`7X!ce@+d&{2)cym}AbUYHs7?aWAp1cyNFHP-2!rfR5JT8Y zu&fnB^=}o_UJwmx--2k6y&xK7FNg-&3!*{tAUi=AWbX}-y~LK&X!ce^+rJ<h)cyt0 zAbUYH$bTRj)cyt0AbF6TAPllMKpf#;f@Qoos()*s{sqyX_AQ78*$bjU{sqw>|AJ_c zJjhNE2HAT8$zDSBLl2t0wNQIOG^kAhqCxh8Xpp@i8e}hs2FZi$1YwZ94id!IEi4kK z{;h+ybwD(zy$Yg1_JU|oIR&CYZ5<E|k_Xud!XSHhAlXZ(UaCQ}w;pOQhz7MwK{Uu- z5Dl^yM1$-F(I9z{ogfUd*F%!{I_(RZy$#U(3!*{oP!J8W7es@?7es^dFNg-ogX{!h zkiDS!ZqV8gP=5kCjsb3ig5*JUBnT6#CtD;@!@m(44j>v7uOJ%a9uN(RcMuH<2M`UC z2iXO}AoqZ1Vlc=&eCn{ZH7%qN?nKrLvbO*#M{2pdMvDA$_k|Q9Pm@}9sz@XBl3M;H zfb^1ChRp%#C2}rV1g$){fuxtzvP49N{PG|GNiV5+x<`imd<jZpp!@^Eq~@WX8?h}K z(6#``99Ubk9NNwakxgjXBMWJ3g7WVj;e?hK$_XtVP(7eD4blh0l(aQrc7kY7IR<M> zl|tK^Wl%RYVQFiE^nl!QLl)B31ht0`NJ88$0vb0ZvaJa-2Sk(V22dDav^AmO1oI1w z2B`(P7hC%fBnQGEdCc)-#5gL_$TC6@X^c7LW^9WG$nPM-kZ>DxjG09qQBHxz0zgWj z>(3ZLYCv<fAR2UdNe0v$T8=T7K;6>^jb|7Qau+BpV0;)26Aw!DFG$S;4X}emAmi{E z{zaMTnR$sh2w`}A15t&aB&XarP(XwyvgshVXF%mhE%zTNAj+c!(C`77hipEKy##6p zh!0XTc{$`hQxFZBhX&E0aU2j0THg$!LG!2}8YB<W2f`q|5sHX%pHQ74qloY~NbeM= zy&xLYt_9H`dqFg4z7#}*>;=&vd61nT4AOf6$zDSB%@j0yr$X%o(V#WIAR1&Zhz8jU zqCxh8XplU}P7ns!3!*`55I`7KXW*Kb=TSoS?=+~rAR5%}0ns3PK{Uu-5Dl^yM1$l( zc7ZU=UJ#oQCMP`}KyoLt`5=3LK;=kHk0#3Gr^f<i^3&8BB)z1j3y|MI@e0DE#%;{) z*p?n>z5|&9s~;yp%cv5SgqAxhkopnS#&wWSXqlmr(6R%n2Nc#IeK1T({Rp!YM1#^7 ztQ?#Gtsf^s-83Cb{Rq+na?1}DNc{+|!<8UzH&IP!VIZ=8gqZ`PNp%A#4AARGLS;TS zJ##?rWnf^K4fQXK2B`)45ypqnF!A8j5>Rb`Sd@!YSAx_KgGtSYpz|p_)DYzbvK=6| zHbCV_&4)kKh#!021GNKWH^|QU%OQ8%gJ{scD-aEeOArmJ7eF-VE>{o@k_YJnVUS)B z4a!F#%pe_tcip^+I>O%|y$hBzFo41jM1$HEAR1&Zhz6CDAR1X7WETj7^nz$&Fi1Z> zb?E&yQ2e|=awoE0ki7~T5I>L_KQS8Q#}CL2pzsA@Qp5Pjo!FKw(EI^12UcFqgXR?# z&4iX7O-OkKTH~Lgn$Y5*o6vFrst4p}kUkiuq`ZRJ38F#uA1pu4fu89w7wV>kSjsDq z9*|pBXhO;>P?=hw4srVv(3*K7%PW{UAevM+fWiR1ydqTgVAJEH1xZ7Tp#Fu?AhjSr z!uT*6CXP{FK?jaOdO&K3!Q|wJA5izAn-8+rKpWy0QuD(KZQ{o-a-epA><8Jo4BEZ| z(V(-IK{Tk`0MQ`-foM?Nf@qLDNFNA;^nz$mJ_2DvdFct7z00BH6^I6vS0EZ>FNg+} zS0EZ>KZpj&gX{ufn7tr2Aq>)wPYt&6YK9IZ4$$?1?7aY$BQ<__bjgn&kUK!(3&Ny^ zvCh5NmK3D)1}m?YLi5TM-Gmk!JxF;4+BYMimC#~hl+e-u)dTV~$bJ~6q`ZRJ38F#i z36>uhL(8irP&ci>QeJ`dfZP(H2Pv;WWvYS>#O+f+d#H#kuVChYXj0t(3Ip`=icr~u zQO1A_f$sl-jXhwfQNR#^wxl3^Z<hP9Ehj*JhMEPV)<DM{YM^`EK;oc%TOb;`#)J{1 z2GlnL(R!eDi%@fDIqvWV>Ynw`_=V9RcY)#*#)r``anKpanK`L+ZBK&o*bD<a`5!7r zYW@fL3ACmSgbA%{<1s|o4+@{n(Do#V2DKMKG^m^e(V+Guhz7MMK{QAnWETj7^nz$& zFsbDvD4Y%;xf9tAki9>ka`X(RANONhSfKF(au2Mm+XPK_2aFP0G>jo-9cV4s4*i4{ z1G9t{1*jg7yFvP3n3A#%W+#XSl{2uky#ZRbZG^gM3zQGD6XXVv9uVzf3@PhC<*|n$ z#O)2n#P=m(=74BY-2ieAdRa#(A7j(=0_0u>28OLr|H5dHT96-Md>9QA$H@D1Xq$o3 z^b`|B-UGP>hCyyU1C=8uO@sFRfH0xF&tZzNA7tlFXxj`#gW6so8kF}zG$_x4Xi(gO zXplUzdtq!sG{_u$YS7zApm5rQ<W6M0AUA)3%F#2NBp$}LFhJu6<Q`bw-vLc`d(0AA zRLmiHAGGdri*Z8B0h@#t8K@qRyFvP3n3B8?vlB#v;s%zsw?XszcBq?nLHRH{L2dx) z0nrZTkh~8npIl5KZm%&XKJUZK0nwzo0puR^yiX_}W8_zmA!zL!3^m~U39!}hkao_8 zhp{aiKz@dr1*7&s+c_!Fb+aIG(ArfHZ2?&m$_P>eYUhAxP&?-g)Erv2bFM($a~K-G zFdF18P@KZ}Fd8O~(b~h9ZGwacNIfx_)cgz@qv^3klsm|FfZTlqDo1L54zVJBjE2Dq zVL!;u<IufeAR07x0-`~ELJ$qw3kIS=^M@cBBoA{lNbeK3gcb?Dgci_w69R4!bHU<P zi1Bek{iq3O?l}S7D+i)MYfV5j$UPt$l)peUXiWr&2FWA42ee)pwB8%E4p_h$;U170 z(ArrLhRtW=I)6gJ8ln%R2jrKN(C`7#pgA584RQ~N289oZ289oZ2FZi;fiOrfh$aS; zla8(+xf9tAki9%M5I>Nbjy!D0Pe&~_<i|P4{h+u3VN&C#<Z*1v8)$g|G6z;49fOt) zKDG%hTWlfq5h!geut;d}a7t(qf#x+(c!Bi6FeUX7%uWyuDidMl&k<<9`zX{+r?AvV zAUz<rT(E`IN1!@0#v0;w9y{XeBbYfLnp8J{!T`NKB2?C5(^CR+F9QR^X{di;G)OJT zk1#%rhKb`TpP{W%+LzBd_K>^-auYHJxjO|aM{2&hV^92;)B>m-AiF_!o`<dp1ks?e zIS>she?T;-90bvzHESRmBoERD!XUjl4#ek42?vC~L3%Gh%V7`=DrZ47$X*Z)Du+Qd z$bJwFk_Xud!XUk%IsvrL1++#E+D?G4Spem65GIt*SD?A)BD5R^(V%h`M1$M|qCw>_ zhz6CzAQ~hOatjE9+ykPC!Q_;~F^-6EL$(8C?-ZyUsp;i{Bl+ot$BFzn2e}^<Hy})E z{HQ#QZRvsLdyqM>a`+sy47lQy&|>2ZDThI6!@(}0#lSD2WeZdfD7--WV3?9}7-lDk z29<%Za^?)Q96k$m(<LnBFh~!`EfLO;au`%sJaK@yeF~^eLFD)+%p4F+svAIIfL;z0 zDpT>4ogm}D`48tfD54#VIU<UXLm3<W^E9^Q1SmYfrXz@J&_2TqNdEvV0cw|l7%^es zyut`l16sEYqMaBR7~Vk5p;n(E9(045o2QSfYec-KpPPTYk87B#58}MOEze?Gt{}M& zmR4^sXJ7!8DKlIXTCTVzv;;6PFo4Q3klQ6Zz-|XI8DQ&aSU?S5un2@;<zQd{wS#k9 z5o#eaka`Q0u3&t8G)NuHEg%}S)*VEH_SxNord?e6L3)wpKw%2oM+lOG_6=PtJoD1> zgG&<gQWA?&pc+8(5zk{=J|MXt7B+XFd8Gr|&Ie@!&>lgkRxtI)EujUrR}d@!CYZo! z56r|tfb4~t528WmIO0%>Aq>(B_mgiT*jqlSWvMw(l_2>S?g=d*w}PSz<VKJbNc_(8 z*p?$u|A53`e!UCzYl%A~9zlKu^>sjMkTEX5g3Lx%hs*}a!OREIB>UAhBpyf728S~! zeSrElpz;&uK9HRZ9tkZVKY-3txd8PSNW8!^p#>B^AoZ{`4iZmz5!<o>st)9SSlGbK zKLE`S;5rk^mYE9)FOYf|X5@jfAT-EL6Fd@H4nVjlB*<PA0VoHQhM`Op3Zx$99uN&$ zvk%HAFmV_S3J;h(%m9!ah>c#(8hAqd@CcgEU^GZANDqt;qhaFEG>Di(!BK89_$0J| z;sVr1{ox0(3uG?H9AYpyyzwYRA43F<IWTxZ>_OKCvNr%KM`{~|B{HGKCJ1sK<$-93 z`5^OtcoE-+?19=1au-PNGw2vBhz5<Zf@skB7a$tsZx9V?dxB_?JV+l1gY>3>$}@1r z_k<N^;QY{#lF-r;2XQAuI>MbD-U%(B^bW!&pzZ*b4<Pf<v57ZCA4nWz*Yo8J450le zAX=A!fdNE=+zFyVZBG!5EDzEL!XUjT@)KHoG9m71DT0^_5|{8vXenV61mg%r$a*AD zx&`S&$4AiI^8y-fAR1&Zhz7X_M1#T&M1#T&M1$mE=7H=5#UZE+0HsHhP=tFxYC!Ek z5Qen{Vf7wJ4jG4l(lk^6Wadj~TOCA$!UIHu>QxX8YO8~2P+J{DgXE!F!SMxS6QV)> z!lwpXKH%_$_zztl$juH=Ia2dMjW7A>eTOgkY4D3L`RN7Ze^9)FFsX5?^D4H*16oFc z%z@PlPod@I9>0VZ6@N%OAC#{CcqFvsge0_dK=pva8l(?~LG=#07)%Zy4blU%6GVgB z*swDBF|?ik1nQ<&(E1!^9<p8se@HtY)EAlH195weKk?%&AiH7ak?IDJdq}N+u<3aM zaxVh|!)vI2VKhiB$Zaq_jE0Hhsk7)d-ZCcucb>cgl_NDz`UDc+e-;Qt*bfS;_sba= zKxGt&2E`|c29>2C8Z`G0qLJl6VF|(@y+;Cx&(9rb_I`lYDIgkDr+{dXy&xJ?MuKQi z*$tvW@*q1w7-Vlq5b<RJLlCNeKSJvc5DhXPM1$-F(V#LGM1$%M5Dk(C*$KiRdo4iq zrcXi(Xq*Syw}Y4Apt1#o36(Ds(A@J0T6chGkiS7RsO|vKpl}D#pt=J@gXBSO0b!7P zKr}HJ<S%^cu+<$d!H94})(f(?1}aBtI^7XWemeaUOnzE32q8bcfcy@MR}dyOZdKmI zw)}yXRUmU<b;mnsx%DF?p(P;{Qg?vb$s7C=T7E<&w5UMK0Z>?j^uaJCbqCB&5Dm)b zu(I(DwC;Edb<<}obq7cf$SpOYkh%j@znuw!xP1qx4F&2jLg!>*ZUxcE{TPsbm^mPt zR5yUkL$5ms)dP6SdysM9ybBv6!lM>*HW^1>=g*timN%gA0Go~=zC*`|_CUsiz!IQ# zD2Ne|1kPuSAT^*dA`lH4BNBkBg@qv~{6Ol-!7#n(;inT0wwvJ(H11(E$PSPm7#~K% z#4*CkwE|_V45W@2OisCU2kK^Y^Fi(viGcWr)N-jOg7`LV0MrhU{UAFTRzUXZfoO0a zZ3P1Zs6GMl!Tv*+2Wf=n6`4rl%d`_{_A;)3^vOUpsD1>|AbUYHsGb1Pp!y3$gXE#s zg3~;xe+a6}Kz$&GL`ax{{ldV&Ky05ZA`+qxWG+ZA6V#s|8e}hs2Dt}BgTetsgX&cf z4Uz}x17VO}5KRmQnS)Oqwt9>w3gJ#<y&!vCpmL<9mxd_v)61SH^5Y!jesbfd=Ur@z z3sT;J)kXiIdA}t(q2*09q%H!bjUQnNEfom~Eh$hvpzs3O55ttyMKC)-G-yr@R=)g& z)<yrIZem`+z<_-31IP^^Js_GR22vM+>dPsS5VyO;5Z{l1nFFFpbpt32NG(gT=~)AE zF9QPu%L>SNIgAFW1^E%ihtV)`EaflV`Y$oDxbxE#s2r*Ji6@TucHsr69k8(ASOMw3 zfM`&g0z`w#9S{xbzkp~^I~qiT<U#sC7!<y9;)u_S9&reNgY<Gj%U=);Dqle~$X*Z) zDt|#VsGI}QAbF6TAPmy`z$>8zG@c0RM?mX;aJdYUCpLfIKywclwEP9pAbUYH$UPt$ zRBnQ3Q27g@LGmEGKp5m65KRmQnS)Oqw(_?p9uaQHdO`Lcfy$AZUKkR{PcJqJ<i|P4 z{p7}v&4<{QBhdT~G6z=vvcvLzVnRz!BBcBUrHzW1gcggmgq9~zJ)rOc>4RZP%3qkB zAR1Km!O9ob6%63HJ~pVExUrPKAUz<rbR<H`Ur-$(5)X0v5l~x#$i4u~91u;a8$e-z zUj7m)OR<!hAY;J!4rd?0wF0y4kJi=|`54>s1LSY8X$XRU1p@<U{&EAPeGirZwYxx! zCpq9e!3a_VT4M;JLHFv4K-JQ+&99IQwwpl+8pkji<StOW!uT*6ChneE;+&sbP?TC+ zoSFjKjUAj>l?rY3gY<#a5rauBLqKc7FF@UlZa&CfjueQ0NG(HVq!8bRbAj3cvL9rp z7__Vf(V#Xzhz6ClAR6R95DhA8K{QAnqz{BadO>p`pz<Ho_CAvhaXUyHB%i@5*aE^1 zT9Ek=T=O$m(A*=w0&>nQhz6Zg0ir?scR(~~><C1I<_bYHNFHPt2*d0Ju?b<2zwoI+ zFZ)69){zSFAG$t}y$7Ijq{iEyRPy5u<PK2yf-tFJ9P%l)#R4fE!pd(^Xg)fUme8V; z4k^Du@%ttzp@k(op(O&U2jpjv{V+^P`3<uZM1$7C!Sbpww7eF9x=8}chuH~o14s{u z_DF}6-=I21AQj^F7SMblk>xkc91u;a8$j+sFTV+uOW5?h0lAlffk6`LUl<Ki3-Tk3 z52In?Sj#eK3mT*kq>dO&PM(;PfjduJfy$AZCsHzrZx0D%BJ2nGRTkQQ2GOAQF^C40 zWgr^Veg@H?_A`hE$-}}0q_@C3p#?PG3~I+h>ojnE3Q_~gV<1c@pDjRhj~uit1JR(e z3Pgj-G7t?a%Rn@!ECbOXd5~Qo3~~>MCI*ueZy{NTa6`5OWN!~tj?{QNkwt#If!qKJ zUl1lWjQ4zwZDE0?HIO;5vP=e=k0xX%wEW11lx3j!-I1QqvZpYiMFpw{<Y$mR7^b8w zgV_n9LFEW6uS!A7E@`Nn<e_|+ogg=W^nhrQ97tIPDsS&(LfjqzYGV;umch&c(WJTo z<R0|0j8M6Rwfq4Y1RWPdYL8;Jxj-#aOi^e{3^I-|<x6Z!3&{UaGhvi6v`y-gi%83$ z_6SJcr4lU02vP&;zk+B`8)XU999p(Xw?N&a0gY=I4RRMKeqnqV4HL&2jyT5VL3)V6 z<dh8sdEl_aFdpRg15i0q%La@5gqDy}$hsMsT8Q}|^8)gTZ~y#(+6{6TNUzQc1_n_2 z2GO9k^B@{jwt{F-9}Gkz%Y*cRFi7u{x`dV$c@Xz#G$P#dAU^@zW+kQ^>dA-bgPExd zE$cxvs4NH3AoqZ1P+1S6L1jIN2FZi;fiTEDps)eeKcF-!PysO)Bo2}X&DDW0Y`zZH zx+0kZh(3@WkX}7#_<(58Io2Q=<Q@<W3Lg*+3Lg*+k_YJnVUS)BO$;U{eO*9uC$b$N zdpQarejqh{xfGJ0jv5Ndk8_awL2(1Zq{ffTx7e05(6Rz#4y@kNhL#&1MF}k%iXinC zC~Y+4CbW2zC$#*4>H&opNFNMSQg6ZR1ks@K5>_^8LhC6lsGIbme3+deH-Pkj=rcu- zdJ9yyMifBY&QVPK7&got5KXEZK<+`Ww+NNP*z^>D+{?hgU;y<mj0UL%`4Ps4(J*lW zWjC}n4yn&TdWgZ~<Sm^NNd7@LALRBFs2r(z>rM&r?Yad}J3#h>>@-;cxoZkUgW?oK zgUTQf4Js2sH0W$>5Dk(C=>uVq-keh6^QA;7!rvghrqHq&M1#s&5Dl^yM1$-F(V(&z zM1$l(c7iZSFQ{Gst@8x+1EB2)cs~G?&q0__USEOc9y4fJ45C40Er<rW2SkI)Vh{}~ zi$OF<9^@7f2Dt}B6NAY~FEM3^a6`5OWbYKH9I5H$LK*q#g{PeSI0v~O6gMDDYW$q} z9^29Z&HEs8U}do}v>donp3q`b0V#_?X~U*Cp(Ugyp=AqH4=B7q`e2xnvKVG3hz8{e zSXpBTEqjfiZZe1RVRnMt0MY}ZBPt+eF{r+HQVMbV6i~Z@$UX$j91u;a8$j+sFN+D4 zs|3nVkdfd#h_^3+Xe(pyRUqV1`WH)n#I~FOg$>vi1Yr&BUo3(2CBPD(b{dEw(*({p zj370jJ0w7~7Xt&s2dFu;>|cmff$e5+fTjZ&4RRMK?qPfw4HI`s%}Ff*-%AbgK1eM{ zju=d8*#g?PumkE&bn`*>et^o6TDE}90-X&7!i3I<(W!=n6G#upPL~ys^F~25==>)T z4LTzRM1#s=5Dgk50?{COkUkIw=>^fmU~<Cg0g^kB?Eu*;Q3LS<J;Q0m&)60nX#9ZO z11k%iq3P{GO+t%DEu<_2)s+t_6Iv1)5?UOfdO+?5>4RZP%0if(AR07|2TRkA(78P) zsGD4|l!YKYAh)E{Ldrr=d7V)War**LAC$<l5M~aDCe;m~FhDO03FTjGdN}GJ>A(%@ zUl<Ki3-Tk352In?h&&Hzf`Zh7<cPuKq~$eGccPmQviA>Ej?}cQ(wxu&8b1KF$Drjd zxGn$z&{<I+OsFidsE33fNDs&@UeGx&5Dl8s0@0wd07QfQ4WdDFULYDI57Gz1AiW@( z7z{E8pE~q8CQzCA2FabsdO`N8G(h}7YWRW70fi9=lNwGZe#N#ZK;sQ$4y-Kjgr>tc z4GAqFjgYbc6h~KT6Ix8#5?V~4dO+?5>4RZP$^w|3AR3epVQJkRS{8Uf-Q<m>ECA^N zxuu{HQWk*9tCD(%+t+}`e~2s#VCH~mQr!Rw1N5?hP`*awUyyD{{}I*(LdYo~n2@R+ zoIe))j%|4W@*6}eob-pbYib~E81Pxxpz$z}f;&CnG{y*01L`M%Xi)p_3)CE1wrk!% z-4g<hM;Hxq7bxyvd>9QAM|d8yfd|r8(~{5v@*iky?N1xnf8g)|=_dx0laIGFL+n8} zALJgE7Kj|F`Pg7$LW@TyWXv*U3d9VMc~e@5ANz8E+6{6SNN>an1_n?(gJ{s&4G<05 zuK}V#^JE|zSstVhgh6^iZUL3epm06Wjc^Z09@GZ|VOT#5*WCXFH1|Y8-2<XQ=?+AL z+ykOP?g7yt_kd`SJjgB(2Dt}B6NAZ#&z4q*|Ip0`*}DfSM{0cjXeB@1K<)sAF9?$w z##jEtwy+?jPgt2A4$XH5+7enc+972+D1LW<@@02Iiw#r{$j>1AVVIIK9cCwp2E{8Z zZ-+w5^f0KKqOg?dAUz<rxU@scbWpv+(+Y8WLp$-~jxcjTG^uU?g#mh*PN*EirsoC7 zy$lQt(NO=wXpmZvA7OkL4HL&!_CZ>Dkh%h-ju=c%o|w^rJ5OAI%8{BU5;}<=JL2g? z*bfS$c<2}#hz89EfoM?K0ir=;Y#<sm#s;E6^006L>3!3j&;qI_Ky6HD9SE-@KzR&= z3FWgnXzodXmSrFsR91m#kb6Khs4N4~p!5c!LGsA%fw2kE<iuM*7b4t{%?E`;2UL#K zcstTXe!PL)0196aCN+$0{>8R1K+_t?99UTv2hB%4-3cvUx*=s5D1NuJC$!9&oY0~G z)dTV~NFNMSQkKE&1ks>)h2_;4Xjv8ubyFgivJ9jL<Q9P*NLj|vozQZl6XJFsP@9a% z_9@I95KXEZKw*GhmJuqKu$4a`b3hp6AI!EYqK$^sYDEYlwO>X4$F?+p{0=e<38zBa zuQt7ibPQ^XfRv=n0gEw$)PV9hhz8vow*YDmE!(eapzf)M#xsltxeF8)Fg}cii92Vc zCTII4=BE0jrYGjO_y=3K<d+yj0s^EDq>dO&PFWDs2M#X`<3aYWfy$9u7Wnihv`EZI zXaVIV*qJgQ^HTZ|?VUGa;ov)aK;jsdGcYi`fZ7d`1F30-mhB)K)E@`YpfNiT4Jz9~ zG^lI`(I9z{J`e`!^-s+Og)V4?FGvVnuICg$MZqGFy7EqcLd%ps$a$zH^B~~@(*LC& zw0B6dr6NJH#iAb~j;lSp04fhM7Noaj1p@=<&Q}m^$iTn=qCw~FfoOFoA6Xux4}?K_ zdnP2bfWi`N*L;Y*An_#=5NE`xK<&e|Cct0<L?6t|R%o3BqCxosM1#T+M1$%i5Dh9f zKr~1mqz{Ba_7)_8g3&oYuOu-uuQ<3MF*&suBnQGE`8^8~T0mh4a_<!+_j*iBXgTqn zAB=OL?!k2y$pff7%*-~ZdqK1Y0|Nty2DukRgWL<ELGA_7AbF5J5C*vi;$Cp30ttcR z9h5FXbv>xh;xii(HXyYi1u!?tOoWId@6`gy!*B~!9>fRfZHKxMM1#T%M1$N2qCsv1 z(I7X1XplTe9|(i=f@oqeIeFV+62u?q=7a1lfXb1Yx7SP}KM%i{M1DR}nM{6~Pnb-8 z`U8a>x#>cIDY4}Uv`zq-18bW!LF)&NDG4nTra;;zpfp+0o6yoSE1~5HR1YYgK>A=9 zRGy-X!Q}AKAU!ZUK{RN-9aaZ5K-(sbP&aj8X`6ubfXrAk1=2PFwVw`5gt+|$XdHsb zwh7D}5KXEZK>kB-n-HpRvFQnz3ds|lQ2)YckXn!*VSE@36USahLwZ^ueIRwjU~=*? z!!(GS(ai_hYXOxbH6L%7hG?%7s*6jYc7W^$+1U$S(*dGEYp6jqsJsKwpmGjGgW?xN zgXBT_Kp3P~V><C=z#BAs`=E6xhz8ZAAR1Jcf@n}(3Zg-EDToHigX{!hki8406JLI$ zOh<$_NN+#1d<W5>@*6~h{0pK%<vWN5`5Q!o<Uw|VFi5Y#4C2e4J81S!fZ7Y9L3JC5 z2H6XuLH2@Zki8%pBoDF^ghBR#+A*N<LQsDe+9n3qe;|2c%d?yrsNpaX>K+gc@+XJ} zxd%jp+ykOP?g7ytd5~Qo3~~>MCI*v}KNMyn+=*-l$leI39I5$Z%1rX}$Ay{Xr*WQH z<fl`QS>&fRP`HtsE)rN0TQZ>KD##pIJ=X&*V+Cd>v{cN7)N`OTDKj;p#b9GXO9xaB zD4sz2V3?A64rV8a29-gua=Z&#&virHGzm*R2hsy_%aqxWdJa?<ub2UG`vp*2k;r-u zW)6rZ)eWF9K(FTr)mhl<CXh*xehsV-j$NGsc40{O6I^CkuqL*!K>F1XL!sm}Xg~Z2 zk{qag4U$e-0nU?*AT^-%Y#`c#fq_8<s+L;)@OU>*KNlS51ixTSY+*n;(-f92=d6I7 z6MSH9Ld&1IkaL1T<t517Zx(>v4Pt`#4ucrj&Itzf52qlR4N?cfp!5U6AT}WkQU`Mj zhz5-Tf@sh_+Xc{cipva;USv5?cp{$@?3S6Ag6)uCkiH(a#1;u?{}yBhEL`S7^TZmc z94NVi`kx>*a6CVu1=gpBi!l&)Mlj5L5Dn_9BlP2Ef!vJnk5giCW-?d<NL+wDvE>ES zy&yrDU*<vmQUUFUg8TyNn}XE9FsP4;%P%0aVd~InkQ~f>5DlvP(AD7LgY+W&f_dOE zNPY@?V#^k&yFuo_{4^ixCm(1U1^EdyMgUTSjB)u1)GtR?hs*}q3o{=?Bd>o#R)>uZ z(u*S-g3Aw3T4rWoU;vftFt>s9Tv?FN0&+j-Oyea`KY_&0EJ|nrjU|B8!}23YT!JI9 zr30!C<PKQ4z|5br5R!L6Z3vLrAT@8GVjwmQqn~LEa#PAe>YZr}a}S6HjZJ~_G|2rR zK8yy12Z#@nhr5e`fdN*Y1-m*1IeWzW2SAQJ2Z!Svj>MJ=NdAHOe-X4io3JRM<;fyQ zc?JqYkhu!WAz=by!^T{&m1h=<6IxOhA=HA@gD}XwAPiy?!XR}pw}5C+8xTZ;%CqG} zlxGTy6Iwv=299^AKS5?9+l#%N3r<ZeO3na{PWdL5BxgW1fb@ziNoWCu1t{%<{0Nc) zi92v6wlFM4_!kzIi=laJ15^%_$3X4^>4RaNB?&E<>58~A5N1AzCiU!aNVx&=t50Tb zW=TlCOJ-4Oa!GzsCTt`Q<TsY32`wNugZvC~E6Cj-@gtmxEpMRy0*S%=yaej!B}*XT z0rE2_+(2qzSY|11KZDGMsY9nha&YsZXUw3h!NmvZ#pdVKvP}5MBS_7Mr3oz{_k#Qj zawo_<khlj|V#@=lpFm<T|1O34cgj+Pe?egeQUk*r%W(S_WDiUoIt{WHW<H1pt*Jm) zgNqN+i|k+D#0p4c`xk(<faE_cOK1VP732nx8$l8v@iSbBEf=8v0g1u<x(w>qhGhu9 zg2D@=1{vc@&!BP&SsgMPWG~Eo5RE+Uj;szF8>AOnXP_5#;Ia->UV!XIFAF%9C$xav z52`b6K>Y+Vi(zF#3n*+r>S1LbNIZZ$v1Jcb9mpN9aDkbB0$M(T>I{(CAT<>%N#MB& z5F3Wk>kLqM%~(#oIs@h&5DjWifXYpf`$2pd4GIqsA0!WV7Xt$WC>-P6JcEKm;$0)+ zogIT+<AYuOf;~e#!(5To!TJIC)GHWN7(f7I1O;UG74F0q7D#&@W*nGa32Xl&%dLc@ zvl0l+2vP$Yn*h<EGhuX~YC+{V$PkeEAetNu(krkkp#>Cg;BgM9*&uOLKl(TZxx2=@ zxrR7<KrI5P!5$t+Y7v0}aynQiNM8j{Vv7XCe_$~fu?iX<SCHgD?gPnB*#!<4Mvxj% zcz|e-p*B#p)C!LYs}fp3c>xq2&^Q3+Cy*P^`;{>uwG0dlYoK*Aj0UL%`4h&6(J*mP z8ReE)R9pf&HwW$fppJD3Eg(OG=2w1f1p66oKS)0z49bW2)S$1K1+5uSSPiiUT_4B~ z1yDIs$A1F$C$uPRgRHgta|mKS$UKHMi1`mfYiZX&?FP9Eq<159+!REE`g$N5<X;dC z8aD&cpz#6_4Uz}x17VO}leGygOO8X`a{=L=6>Ab&Ky73YCUg&i%^HY4n3<baFff3| zPeC;3?oSX6au0|G_1Qr*vOGv12!q^{QvgW?IjJs*C5a$W$XLUHeF-gh)<WEAaT{VE zNWITm#F@nvP<MdJGl))9@(ENPBnr~I85(XN8g!Qqhz7Y6M1#T&M1#T&M1$l(`al?@ zHw~o*g}4#qz89+@Zd`E{;l?j(6IwuZ2N<t~h{M{<AoGxM2UH#;2C`=hv~2^TLHmI~ zG{}u08Wfix8gxz_hz7}n^nox)Z%zTkk#3neC8<RqQHVPytVw7A#XBf3ueb(r4@muj zb%?M$0(A$jxk`g|5Pcw1L3+1B!xBV;!U{x#+zFyVVF{u^VF{u^@*sU64APrY?wFF2 zS(2Hbmzd+0lb8;h`~}H@@(QTz0p<G%J0W(0#6fyNXD5Mh4%986IvOO7j_*L_LE<32 z+n{s)AR2U*Fo*`Z6-0yjO&}UHjsT)T@*sU64AKjtiNPTA@TtRA-b`2z@gKTAki93M za-^0wEE~u#R~$BwUk21{K%^y7^W}~W<mZ<!NcNJNhC$&DN>3n6YMRR7Pi!fH)_Wjx zVC}&T&^mC>#)KA?O^~r_P<qx_mC$lxM?%XAs2)%pgY>~LC@rIl!Q}AKAU!ZUK{O~G z!s^*|D<ESf>!EJi4sFB3%tO}eun96&4H{3ESPyY~%_id4zJlzAnMbM{K<**6O@U3% z6Oelu7#May{R^W(YC&#;@nJMf98v?p+aZw2Sm>EEAT`8bke~6X!<zp$<H`R}Ia2e# z!xqGR6QOnm%NB(FpzzrX-RlmbLG?C>2Kfs_gUUw`4chAtqCxU7|AO@H*g|~SQG;gh zK4|*^M1$H7AR1&Zhz8jMqCxEk5Dk(?w%1@Q@#W4JG<)|$>o5=vs-r+O$X*Z)s>47u zs15_sAbDhaS8OG|%*xq{8qNoxbv%d$)!`r-WG{#Y)$t%2RL6s8kUX-z7TXa1B~;!$ zL9_QD)W0Aa<R1_XvKK^y{0pK%{sqw>d1QMdRwuN8+T@@%1hfwVZ;yk@PY@<lhL&tY z4TnR}dKpB6>Rk{Gau0|G)yp6nl<q(@NFLceFg76?WF9^>*z%>uc7!{T^@7rQ0#uIF zd^u-3`T6q3cJlL<$PPq$AyhA;=Z}CL<fri-Bzs9sr=Tzgr6&+3HBEgHOl<iBtp`Bn z!0P2a&^jSxXF|)KosfDNl%6+iN@y`Tl+YppEpI__4AKX~l+?>GJ3%xk9m49JUC?@Y zH`GmsvDC{TJs`K-*a@kZL2ZW(+aPWi0gVBG23N7vQLz3$$o(MwFmpgOscrz7fnF~Y zs$<dWQjihgasoa^l9`u+)aO?~QxBajhV)y`2qm_7fcy$J1wkB#j*omnk^}V{Kq_+1 zfb%XRNDXN22}Fa+&;+PjSona#2Be-G4AYAqHYvNob~BuT#w&~l*#Xi6<HKl}I7%2` ztYC+P1xPJ17!=3&)L|>{B=$hujjj*m<^ZT1spZ{?J;e7zdZ2cI><8I-5n4}yXi$9! zqCx%w(V%(?M1$%n5Dk(C=>uVqUWdKJmz6Ag5&j10y##HCfM`%V14M)D1<{~(2#5x? zLqIf09%Ls7gY@p$OME$7gJ$n#sDD8;sNMz9AbUYH$iE;O<X;dCk_Xud!XSG+_7Pu3 ze?hbN3bY*pqCt5CM1$-F(V%bz(V%t+hz7}n>;z$uy)&LBwA9>%jD2vtgoGnV{Kh^+ zI1noLTlPWp!OXl04F?bn@+XJ}xd%jp!U05s!U05s<U#sC7-TQVEue7@(73^$`w(+M z;u-r9>!1kLB_jJF`e0^WgSJmVG^qUnqCxHf(V+GThz7M!Kr~1mqz{Ba_JYRPKy4<F zdjd{F%ms;q<UwPNAPn21#10a~f|sDV=Q=ceKr|>`Ks3lbAQ}`tAQ}`tAQ~hOGZJPm zjE|27nTJmvTlo=j0OCJ%eIR=$K;=j+Kh7K=zx?1hNPZdMauAVz3ALBd^KrvL^7G;z zBzsBCH$M)NpT<FP21<({Olo>85KU~Uf!28-b6{<)3()%Sz@dZ|jl+<(7AP+m>`rLu zIF-<{0ICO+K0x|ln3A>@%uWyu>Z8Ky*mKaf)_JI#ZeVF^f%Jgf;&K?$)&jK$AMA&? zz2PwNV<0edKs2dt0EGdm?FnppUVz-oz`$@5>R%WQQVa4Uj1Qw>;yBtMbQ=qqa|Cx8 zas?_!Y8m2ll=wcEz)^(#pm4ee9SZ@`pt>JKgUUt_4Jz|NG$@WiG)Nv4jvx%ud*mqb z<xdBiz4xJQ5D*P&V}NLoy&xK74~Pb}K|nM}9%Ls7gY30AMts@Da17PI51@4mhz8ZI zAR1&Zhz8XyAR1J+fM}3B$W9Oj*}LT!@#S6xn!OL9Z4eL*YGZ(Cki8%p)CK|3pt=l1 zgXBSWf-uNlo#P1q5-Kx4pxOHf>R%8I@(+jx*$bjU{sqw>|AJ_cJjhNE2HCskIPv9e z#&Oheehh6>fM`&g0YroB1<{~31&9WvFAxoq2iXb2AbUY`O`!Qi&=?G~p9Ah&f#gBu zHwY6d!+)T;=Ls|%Kr|?vK{UucAQ}`7AQ}`7AQ~hOvI~Sk?g7!nV32wE)M0B=tT}-Q zH)Opad!In%NG%T(PLf|9#GE8QPtQ1sNT-C_6zKW#%1QF`mcS{5y`<(3pHt+gaZr4L z(jo|xnjRe_5?dIc<vqw8SexQ5v_2C#ozPNq8q%f!<%KPW6Ix6zB($hN^?=d`NFNMS z(x!mf38Fz|J*>{W4Q*50fx77_mNo@Q56CSuPD9!hpmvYR35eUTfcgVOj^Dt{0nwzo z0Tc%4Z3;r|103xDkWt{W2J1KuV$1?{JO?3;GOi;bnb^Vs8K(i83nN}a$92vi$$|P& zAbIG#H6ut3s2l>(RtyXb8c?;g9M`cq3n_~}K;s)mgWLs*V;CPs!^Ba-5*h*^^&oj- zFgfMs6R2C!%?H^la}MGUQp?RL=ZNo%ML_KU*$=YwEA)Ik5Di+_2ckjeoq=eO|3Eb8 zd^`{hk_YJnVUS)Bo%1821%zScCTP7PNE{tsK(qJT3I+zynn@6?&A`9_qCxh8XwY6l z5REJkGY@7jjE|27xgVcAwtB7QJR}a#^?~f&1C=8+etw)MKYl>&0EI6IlN!b`Qi&}g zNa+n$R)2x!lLHqLS~M;~%4$&Ch2v~O%Y!QkEjds<AU}ibhha*}YM7lM8gw=eEH8e7 zmerr3Zu*X;tOn@;xy9uoq^t(jCp_mNZg03qeE$z-4u~ez4WKYUFRKZaJJ|HR0J)ce zf#C<#zc3o47UV}5A4bE(QOYW4uMeaiBu@+`CofF6ggY;sfXb1Y7aT4V-^OFPjIbZ% z*T2v^pFlLIi~!M~G6O_|&hrJ)pf$4~8YB-37m!{MTjpOx3kVa+M>S~n{)3iPAR1Iw zfoPDuAR1&3hz6BaAQ~hOvI~S^_JY`iFgfvKa0L-Q$mWCW&49|08b3>}kRLxFH-N$y zgh>tKBhra24A3+MG6z;x{ek9_oT~{fSFS?JD$rWFEf*773T`E|NI>;~{0!0u!<3X& zFgrmssGNZ1#b3~}>NnI)|FM)+AUz<re7FiJt3c)Hj>{0Y>wwnw5!tSUnFFFpbpt32 z(90@9<qk^u0x|$PcZsz<iQ0;UwwxgIU~^;=TM|J2gqi`Pm{&sX73H{&NVA~znIQQe z55QuKAT^*iG>8WEtt+7B(6a4V0d)`CN{IVmG{{|`c!cp`G)x>6UVf<+;HA;9005~6 z$rFP~&F`QygB5Oo!wJK9ki8L5Ia2fcg&PSipnf0-i!?y)?*y5LVF?2R!xX3;AUTj4 zu9XZ7ptd212F>MyXi&KbqCx%x(a7>3eIN|d3!*`78W1K_R`A?J_#32`dnKgp2%<sd zEr<r$3!*{gF^C40#~>Oc53&n{L3%+nF&N~2eCp8Kj-dECfaFeOy&!vkK;=k{ACp_; z#}CL2IYhS4(Zl$PY+}m<Xx;#s11pa?q50&`t%R18+mP}YG_U7!J)y<qenQI%s2-4? zLHb~rlJXd4Cy3?+?JtG8fqf<9-e(RdpJycl1M>Q4kQ+dHKy<@xNO=sZGdylW+`b32 zZk@>T7-kNLCe;m~FhDPl36(q8^r+l{<O5!)e_=F8Ey#~BK8%KmBbQasrXzT)03=Tg zCMPePfw~ple2_a??n3-QYF?Ofm-xKk0JQ^TKgdo&XjuiKL1h()29+5g8st9^4JxZZ zG)Nw#4}?K_4fZ9pfc86p#&w}}6+HYvZ5<FMREAwZbB_?T3<J@iG73b4+ykOPWf+JC zm0=(nBoA^62!q@MqKUyEf8kSytqg0q2Z<YWeIR@HK;=k{w;%V&k2jDzK;a9*q=vDL zd}50YQaXf{VFJ+nbKrhLi^c;;83u~q54RIq99|@}gh2Ix{0y=mhAAn-V0MCNQ27DN zqkPaZj34SIVJu}BNDs&@E)O7O7^s}(xd(B31E}ppWEloC2Sk(V22dEFmtlm;Bjj=i zq#uMq{y=V1!rD;aCMApmZBT*KiYO$uYytTZq!|f|L)()P4-x4Vw8jLaq~{}8j1i;; zG&cgGL32cBpytrBJ$VA^9%*QN!f24YK>mU8VKht}vNI?ku_OcHd63$i0uUdh0@5~x zun3c+=6ldO&YDNyFvBn$<c>2?Ia2d|#gl{<jkl0BND|*6=7Y?Od5jnj`vMIwkT{0r z3=9k$k0JU%av(MGD<OA*f@siqB!~u`O$DMs^K&2?G(QKTLGmDdAPmy`;&DO?$5Y68 zrLeufAaRB#2=~C&<l`F0oPp*Z1*m&KH0T@z5Djt<hz7X_M1$M|qCxT?w}3Fn-kbv0 zijvg4;>`R!kPx^|Y2Zw1ad`|0vkyFw{mCG;6Oi0^1?mP|`|50-poW<u)Qun-G-nH< zL2d-mAUA?&kQ+fXNFMAMX#WosURxeP+*9%gVlK!%3QrO9Pd4u(!TYFj?V&q^<{qV$ zkh=&#G-%EoM1$M|qCw*~AR08c38F#r$nF7!4JciK>f)5Y2={Dwia3jF&OTqTdyw0L zFf%}O%u|Ry5F6wd<&_K!HVh05Aley9gVu$C_@Frq5REJk(g(sIy`c0BY9D~q&-ef_ z7bFgnXW1Ly0>Tsa#)I7hsy{&D==cqqdsLwD1)@P|21J9x2SkIy2SkIy2SkJ9VdlZ? zh4Jyx<dhK$o<aPFZZ62)8&Ek?%LtL@h`dK?SrCAvm(+aQgQS<#{B+_u`Dvf!1^MX| z6z-t(1j3}IsXa=GEf1h&Eyx^LTSyLCPn~&@&|>lu(iQ@x=P3^pS}wd#Xkmet{h&Ao z>4RZVT1FRx$>F0xdSG^fXi%FMRu{@Z+di^TH>pDTF!PZ02E2r{g+T2!jb{+I_kh;9 z64@34*$p#~R5yU!gWeV*RPSTc^9AHy1_lN-sDEKJNG-^1Fg}cii6hzyklq|fEl7?S zOisR^@d|gozW|jZHQ#%@MvOBP%J)345%z=ps<jew*DQzz^_4(0sC)#`pmGsJgW7!{ z8YB-37m(fqNcIvcGg{E>)rQ&&qCxc}hz8jUqCxh8Xpp@i8YGWwuf-dLe+iX0f6(mJ zf!YhALG>Ys2H6XuLH2@Zki8%pB#&(GhBw5QRV8mw!&w(vPlITXxgZ*3FNg-!Lm(Pt zKZpj&BirlnHld|PUlNQ7)yHqp?A2Szz+lV3zyP9Mpfsp{1@Wz+d}MiKdqHg#(AsxU z`vBSx0Jp0^YOWlPZvkOKWoOM>)Ns&;hChe~#Vd#gg#(BNwVyyVsQm<@LGmEGKp2$X zKr}I!oP25U4&hE@J3#hkK;=lymrLFu(kZF=@&S@wQuCI~dxX8D=8uT?<fri|@5xW6 zpfCreClDqzO}VHhw(vm9PLMgU`dAZM7sPx>XgTr$QXhlT^MRKMEdk#WS`?sqKyeJx z2g8)q$1poVG^j3w)i>(U`d0($CIcuRW+%uEAUz=Z!3Riv3~Dp%cnfj645%MYWPJ=X z2Sk(V29SHu>tjN7E20hs>4x;LVdD}AIRyk0(k%y<B{FJ>Ede0ELA1h26X=-48zebU z{{W-_+E-x&sR5OlAR1Iwq(Ifua!exT6QrClhsGm}2Du9qcQ8JThKW1p7gU0d{(*WO z>~~O~HM6)RGcO$^13HNhq#6=_5EfyQ)UpmVw<7Zy;s<ooLGBNM%8^>uJ^762dvrj< z2xK0*9U%S$s2w0SNR9PM$Q{EV8noUGM1$@X1<|0o0Yrn=B!Fm;JV+l1gY@PU_@$Pk z1|K+VOTHl7a|UW3u5k#3FNp8}nP~%c4~Uj!U|;~zAoqZ1kb6Kh$UPt$BoA^62!r${ zxg}=ic&52lWEPhopY;Ng2ZcQd$3X4FHRiAZDi6{FGShY?0|Urj5DglK0ns4$fN0Rz zBZx+p2k8T0kX{f?3??TXrF=z%8?qfBd*?vqNKHpKz9Qm{)N~~B4WXCRI0v~O6gMDD zYWxUjB({`5(>%x=Sp8!KEhFxHOK5TV4yk`YZ7PjV2`y`WC$ubq>H&opNFNMSQvbm0 z1ks=~L}BHS1$1oO66z*9EcFja56CSE-y!u6sE&N|1>*KOpfN`x>mQgoAevM+fWiR1 z{vlN6V$;L&1CloFq5g%@AhjSr!uT*6CJrm7A-zG`m&Gff?gZJ7j6rUE0F@&(4@LY$ zwEqa@A(@|$a01y4veOwlw+Es@dv8EAsH_3epfUnPgXZ=?G)Nw#4}?K_FCf`VDF01C zv)2V`FNg-s)q!Y`y&xK7FNg-&3!*{tAUi=AWG{#Y<y#OYly`Z4q59VqTDF2{P}vHi zLH2@ZP}vHiL1in52FZi$0%4fFAT}Wkaz8#b*yauoAh{D+FUZ~>P&rc5g~@O7(?tQ2 zUQ**0<bF`xfH0}?b3ik(MFyG=K<2>8Rwrn_w)m6KvfvM-Yz2*FU-+KTqQR5YVgS_x z3NMg87^b9bh1m(BLFF2(>~MgVt&UJPxnU_=L3%)L+4Bcdwt~ukk6#eC{{YPe5Lvdu z%mLA)x&agh=w&ORauQY^g7ktg$Pci#Jxopk#(*|%L271bCAR25=M+HtVAu=Vu0Mh# z2bvcF$(M+N=V%x~YCvNmAR090<N#Gm&2~M=K0+8*zJ<-ruz(U1k|9(6A<7mcVK5UE zCO!cHLH_PRuED|aLH?m3o_^4iW<hdbMMMy|+yv8#UY3C7BYFN~cNfUs7^obnWl2bW zNn#GD-3`AX5K>nvFeJ6KoRb7&7pU1FdtmNEre{FqL1G{^=_?r+K=BQtLFc`KXwZ61 z5Di*K0-}-SLHa-#q!;WSr^=GlV(><swA7-a)D(~;Rvg<R!I0Q;<bPrd0|O|{F@nQl zO+XlUZfOGpNF1WEfQ5l!gEj*L=#E6txD-SbL4xWe5U=HlA6PGl4Z@&120?xABc_us zfcV((hh28yyAeV8_+OCkB5Z0vVjWQT{9s4~yBj11a@R&}$lZvb`<p;w$Qb6XhFMB* zcO^j0$zV)uf%y?+&L(XJ2GHGwpuRM+86Y;y9ER`m2y;Z)TR?Xbg2wA4cg8OSsl$dH z7$M<!gE6rM<aUr6kbRrA8NhcE;<N99Eoyjz?iU1wCzDgF8^|1NcmvcvkQ~U5AR1)f z7HtLw&^?0q?E9mH2&Xy!W5Ir{VM=TP-KPpN2ZXn3GcbVeVFRT%5FZ(HLkk7aJ#Wb3 zB}|DeZ$Es!4>A*E9*73XgYN$U-E{}TAU+7=GMgW2_7NsXc!Jb|?z=;_3v`zdXxy6l z<JbEjvq5V1uprcf?m2;_ZwF?Ccp(b|!!~UO2GG4@ApIbH$QTy?$l(J^j~&d3EkB@c z0-3X2n}Gpzj~Kr6h#ar5^mu_eu?6NPkU2ZF85ltKg5irV<n#zjXA&%lEg(06+z&Em zr#1rv=$<cp<{;+}<n#k_6U>}l+6)Y!`?>I$gPi{_K*IzS{-8JqnFGSRwHX*d_Z#6$ zKcM@QKx$!l3rk`PC{96Ug3JTaAUV+eLZEmCVGtjLahVNEKP;fTeLxBs7#KkJNWtvt z(c}i-RRk*Ef@god4>B97422Sa>IdBs1ab>Za*s9x1L&?IP&oz@gVBu8L6;3sy)f|} z*2ET&T_7_-_A!bxFyOjW2^L;cSQA@7_p;5{q65C82-HTH-c+atau3X07|p}Lz;FO+ zC+O}TkR33&z1j>6p!-EYbqh=kMzcZP3%cLLfDMsPVDh-=7`DU~kXt}@!rTM8F9?)> zcvN0Z0J#BOFDOr@K<xnE$pdvSNZmed1_scbKiJk?FhSi2x=#tD7KR_NCANU<0+|W3 z4|LBDsQ=P<z-t1?4wzaP4RXT^s2f0c=)m-W<o9bcFo5pr!RH1Bq&s&&dQ#XETR?V! z%!Jtox|au(wuGL1%K+H{QiqH|ZpdMWgf-~C8kjzingiMl44}Jp@VNnWClN?348LGc zYysH?G81IqlG)ziJ8(d8!NTgg3}gpPEsO@a;RDnSpgUtg`e1SgwHX*d_s%fG1dwQE zs37PpaU@}e9FD{mkX;}%LH5o0W(>ZE2IPjw*nO`+b|9+<u|a9JgaZ-|pu1K;`at3! zd`O#t0d&6szBCKEU*QQ<KS&QDEWnxA0&)w;PLO*7D#XF}yMW3$OQZYlAUB|!0SYGx z&^<5=3=E*VQ9$}&Y7T2NFo5o8!53Gs`($8xrf?><fb0U939}D$-wLRY@36A!1;`GV zS{My-!yKp^K=+lv^nv7$XfrUt?oI*mkufaa!0vZ}$w_b}wt(ycnF+HGbO#Ek&8Z}` z?ia`om|7SOa)SaFB(BbICAPryf#i>BGcbVeF~JuOusc^k>Opu8S7HmuE|8fp`#^V- zfa+u!85<#x9Uyhc803Z}P&a_??11S5sX3<2zyP{m1fLsVccFmPgRla3VhhMFkeM+1 zK=*)v#=0L^i12~z0I5U9AU9}mL&5=c=LJk3NX>C=1_sdG8_+BQ5`tq`z5$&Z4;N%$ zU|7PP*aET(WG2i$&^;QUcE8W{@~a>_kk!N3YoKlb-7^8x2a-FX&A<S<M+0Bo<iG=Q zKS(_YYw#qtfb0U939^roi-7_8iVs+QWWbZy0==`30d%(o=x(BjFYLJ>H-OAR#{p1# zK<8<L%!SFH)Mj7+-ED!-jZdI@VS3K+B({L;0+|W255<i}kiHm5?G>KH7TBE@pfkKd z{l_2kGwy@j0Fpn!kMKJvF6Yd21h;)tcoE`7EDQ{%v>6yccPxO?BS;@I29;?bK5`pK z=Ov^KeT6r%MFwgX$eh#K3=FV45<q&8G0Ys~Hd)JGtrpN)bx^ry9J9S0Sv@j)4b%=7 zzQh)o+d=l7(Pm%(-En}=-N<dpB_Y-=3TqQuKymRqH52(59%SnnWcVQAvxP6Q1>{GN zB*?zA+6)Y!`wEcfsX%fd4D%my8~BAtYzyeT5|IDAPh?L9sl$eQp!TWoC$@n62vP&G z@0>OR1L)oXeEvgjyBl2aYyq7O2+Gr2jsJt=8e|qa{sXlSBo6W;hz8krUYmgdbaw!# zJ_m^*W0?O|_(0MSNbU<X-Gb5?D4l}DK=^_-0|V?Fbr2sJ!}?O7^VyNb5AY|pfYL6= zOptjX8YB-o2N#r{K^VjbVO(az+QI??koW_s1)Wn5vunx>Q}CI(pnSr&AmcvBY>=7& zA%uG5eA0ttPB9Au!$oZd2GE(|puLwMeaIMF_`vgtKw^sv)GUxWm$VreKxcp>kFmqd zf|-LHudwtlBbe9%a}&s%%i0VKpfkPkr4Quv2us%~f{86xklb@cn}GpzMmN56jhv5Q z>2-}@VhhMkAh(0ub5)yx0d(dzKKCH!f8=xsaudv)YuXG9ptG{^r9<TMNCxT`P&|Ut z4#*r3zOK!{06H%iR;Gi*U>KGTLFW;}#6Yx%P+|)xZGg-KnFpdl;%9^sTR`argh6}| z#$`4v9nL^XSD<s5VRo%Ca|53T3~IaY2(wBCnGG@z9WR0E2c1s{atloUhBgBO=saLh zIR+Dh(Xc+5gD@gZgX9#16I(!bfy@Ni$0)$S0NQtgbcQi_gclZ88p4S!u=CMDXCs2r z{FnB$RFGRh=A98mn2(%i4j|cE!ot9CQ=5SSbiOUVG=UtKusp*dlGsuKH49|UEo}w{ z(0R4^@(gm?g5{Y2k;E35n?UB=)@EP;oj;4uJ;-StmS<*&B({Lu1oAt`oIBbK450I5 z@#Puhya&rO4@44MKyHGWb61;z0dx*5KKCG(1+YA$A)43%audv)d)f>Ppz~Yt<r(C% z`${un3=ZTbm^t^g85lt4uHti##tVer0B9V6(gP@6fy@En2ign_pz|YP=?NqT!?3&u zI-e3I2BMFMCbodm7|2YJc_11j4mwK<l<q(n#0OzqX2bHHh!`S$g3jqgvFk`e3n)Ev zb)=<&%m$e^2XtN+hymJ5!@$4*Yb#AaGN+V<f#IPx0|V%+M38={aySJmyOF~OmY#2j zCAN4#%>tS8NSlEHboL>>^o$%|u=K1Tp4b9&6Udy$+6)Y!vkdXY7jpW6rRNOs#1@d7 zK#m8Q^F*700dzJYsp)xxcw!64O)ztwYBMl^&Kkt$9_0K5OV2;V6I(!Tf|>J7n}Gpz zb|Aj=jGW(*(=*6TFms-3GcbV8{KMxS<nl)W8b_e?07`=(b3pioHUk6b>@s}m8FV%p zNG%Lckw|O-r7@71AoD;pNDg#v7%1I=Fo+MrxXgy7=O;+%6Ldx#vR$Av$Uy!pvH9{3 zWH!h=bo>FTA9U6c$SpAWm)Z;rpfkwu)g@CT5qSxuFGn)51!Nb<Optwy5@>Y^c$y|L zxg<3OrA{f4Ol$$2_qfE}4Se1bs9hZK(JC3_CXl&1q!9KX*C`@M;$<uh46n2q7(nN2 z!SWkOFAT%PkmD4VcR*^+K>Y$T=e0KEJT1_81V|1U!^}ZWV@sfVLGA?k8>aq^HUk6b ztR#GC19TP>Og)I+AeGnx@;k^(ka-{)Bn~>?1r#124B~?@F0)~2g8_6V3`ijZ0|V$x zDipgeCA5ITIq#!YGRSO@G6fmz;ar1cPB{w$!&_|z2GAKnps`qxK4gq7e2~N01Zoz@ zoOjv`44^ZA@P#vSeDOf_g4_uT8<@TCwHX*d=e*zxXV5t^F!dl>LME{V<adynAoD;p zNE~$j3Mf247{mu*TxP?<IRh!&K<DYe>`Hmy)&e@q1+=DQZgL(c$ZU{#=(q%`A9Q8} z$SpAW584b2ptD@?<v|`<M4W;2eUM3P0oesI6J#GFA6g!CM2r*skV$NTo;%0@I;#TY z&K34isvviO%rcNem<`Hz3af*_ea9XoJ1bZi7(Qw<Fu=|#0qH}=u=Ic&kI3o41!@+^ zoKM;e44^Yd@TCXjd?y3d3vwsOuP}Q*Ycnu_&Y8fM9zf?<z|@0i4Y|Y?kl#UOg3JTa zAaT$hcu;tNFo+MrxXgy7hYF-{1D)pqv#X_72)v&j6wdqXqf|j=gUp*Dk3F2fAemFi z!ocuFn}Gpzz5*;vL3&{rCWah7$l<&OY8J?xui6X@pmP!Mg)?$|wLtZP+zARBn4RCW z85lr&;qiqtXs<m?J&2wlpV$KOJIG9sc_11j4%(*<3J(wl@j)1u*|2bafD~?^GY63E z0_}MRjjcy8N2!9$2APMB-$3<)_V$6?0+au)&A<TK^NugywJ0Fs45TkZA+ZHy7syPI zeT=-2eCLOB#t|%>3KSAsVCP_f_7sBVxC57XWrExRGD|`kVKyk=fy6+2NkB_aEDshx z0P(TmJy194C?fP%u`n?F&}Lu&?dQhVW<ri{SQ~eaVq(h^sF@&herhu?fc9bIGY2{S zf!qk%ivsdrS;qbf5FZ;Zfx7pJVqy!-?I8PpX)`c@_Eh7u54p|g5fB9~pLCQGTR?6H z*#$D^w>AR<XfHHqjsqlyjA8i(xli^+2-1%!QA%t9xe25mWX>OL2Jjwd&|YSc7&3;L zgWRUh*a{gB1*rqM2}Fa;`K!&q0NQ(u&tJ%G{3*~l0Hq61+5(va!vC}x7-0J_L40Hk z>q~+5cOr`mC?~dn(i+H2ka-{)BoEq814@4&4B~?@F0*0zF99i?g7�+XdR21B&<b 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¨^(Dt-r52YN5dU>g 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%0D@d5a^nQWb3!*{(0ns3PK{Uu- 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≫X$4ukVynk9ODlQ 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�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⋙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�!c5ab-YS2 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%0D!-U}j!`iqE*Xz6E3^Ox!tw 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ϖPY}o=jOo71(^q9Bhvv;J3wL} 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%0Ajeq>lW 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%0A-q!+h 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 (sTxm(h~VTxfq$UQ6>5IIuYxiKZjTPEZ| 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%0D{ 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 |H@B|NlQi9<<*B!9%b>>T(KP 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 W<`AfZ`NnCdfPx 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⩔fBO%_bpF9kliqQk?9#w^J8jmwSdfn$(;qAX->dx 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�X2tOVdmlU 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�X5Pl3+}zelYor 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 p4G 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%0AY~5FmplW5-iQY#Bk9wu$T*)dpj4z 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®Qr^jE(_p7V09>A08tMP1PBx4 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%0D?GVdr^xZNnn3O4@#1a;sRii=;ihH=hHnJy z{ex!j3s3G=kK3OZKxTsc0k<~?Vebb|?$!)>p4J$sy)9nctsu1^J3+X)nStRu0eefl z5aA5cli<bO`lj8%6=WvJAE15#IGl4*;O*HAFYZ<c1)kOxsJ(x@xLZMLLHa?srI~@@ z2LXHEpxJxFi@WtpyMrspOprei_9FKGKJemhl~CkqT?4hZ#GAVnq!wf+2)8yfF#IH7 zZ;Cgne*?U^TU)yvTtQ}n`~kPO6k%_KH+Sm?MV{6xP<uakbGL%jg6st0wq^!~Uj*!Z zfM)LrZ|>H}hV=a)GeQ0UwJX8lT$+Qj_U(c<ck2lyp4LB5yQlbYw}RAz>;>WWW(J1e z1nh3{LG`nX4|nSe?N}p_nIOL?>{M^5QHG4~%`Q5u4Kf!S29585-I$r1Sb@}LEAioO z-J#6W>az`!?<{<|TS4Z+%;;!lVE9A8jT*kFZhYax-71p4#0X?2$j?h8PqgHyK-_qI zEtd|=Y;+p##!^%_O89cOu2A7=eFJsl24C)0khw7Zoy`mke+js80h$|oe7Re%oNQkV zG85!y(AZdFNq!p0Ojubs#h1IaLY1dgWIH5mH2k<*L25y2K)9=!f#DwkdnNo3VbdYk z*}~$--TItk^FolBAb()9m&cF0)kBS^)dp(s0zd9nkXn$PAl%)|!0?}dy%Uh^1?j2r z<8FP+v3ViLOprgI_M)WM7C-J*33Z;<6sWxt{@kq~wIKZ<+|$g!z#xo&4FiWi!oMIr zU;MaR8GCqTKxTsc0h&8XEXfCF6j(U_@#AiNqt4UX1GRU8KX)rgEl58I_ck*yFcPr0 z0nOeVf9}>-9Ge${%mn!Z>fcO|c`$oR{JC5AXz;Xdf!fOvz}*T`3sM8Zea#FEOa$!x zfoAU$f9}>L^X~iynF;a-s7#7aEXmI_Gl7@EZ~VDir)cuD-htZN62RRGQVX&Zg!`Kr z7?=szTM~d8&M^Vpt%s%3_Jhm>`2&=f;=vg{1!cWYN&t6jjuuZV%MM7IW(eeN1*r$w z3&Inc85mdy*!=;`?i&Hzt*I_)`$1-c{DQDM4aM#U0o<)F+B~f~P`hgaxm!W%LH2_1 z#AXHtRsweC1fu#oB#^t+`(WCBu$h6}tq8kwQ0$Hg<ZhMG;b{$l+WiA$4hVxRW?*2L z)Xc!ZM!@bDNa`o_<g{D}<Zj(#muCbr6XX}jnif#QCI=kouyl4Kkh}GV4o_<h)b5fX z?pBa`sMQRUn;96`3D}(ygz9gfAnsO|r+G#oGeLeqvK#DinB5^k+^tu1d0Ll1?fwwN z-3n3<vwKQ20|N&EyC0z0eIkgvb!p%dBaoROzaZ=`MX~!r5O?baJ)YJxP`h)2xm!W% zVRlb#W?<kXV0TO~!ryy9eh!A%4Kfqt7sz@nP?(qIfGmgk+b5X2wMU<))nz9nor{EU zw}RBe?4H)lz`#YoZk7;)-5`Ajg1KA6_^bDU%mn!bB<5fM88eypk6{vsj}3#zOu%^& zRQZCFCA=*75X{}$V!+cn1?tW{A>6Gnvq5G}Z)RZNCg9FBXzt7i;ck8O?$jlanP7ic zhqYK3Lfol!FJKwSTx=NOPEZAm>dqM<+^sc+JgrZl?lcMIZUvbQGiOFK0|O5McdCS< zhNnO%cdJy+o&O*+LH>r7m7r1s7LO94+^r!-Jgq#tAn~{+l)DwA7H03vW(Edc0`|^9 zv$q4pe|hIW$V`wwVD=)Xp9!Jdtvbd$ttL==HNv=CL26<4&T3|0;3HtKL>R)q8ye@d zFobcphSdE33NjPq4^X=iR5ySVE>fF}BaFM1#e}Cd25R?$Fz!~6dYIj_n;97R3D`XW z$!?IonlSFx-c@)0gUkf^1?J~Wq&18!VW71TJgqHIdu778TS00;`ayV3GXsMF0egAE z5q|zsu%qQm7<Vi4()|q}GeQ0Um(Pjd`VgGJVDbDXjJtJ*DNpMfsNGY-xm!W%LH2_1 z+-3#_Ap&-{AlVJlQxMMG%9)mZ4rC_CFJM1smgFZQ@BawrZtXGSX}toqmnVX|6{HrV zAB5*MGcX7fu=fv|y)VMKTaSp!I)cmu`2%ck4ywH$!ns=$%z0Y>K<({_;BEz}1=$J0 z^P3qML<rbh5rGKn3D3^7Bt&qxE?lW}8)PQPAK>&=3bhz1ePu*&w^~^6w5sfe<SB+o z?pBa`ki8(hpqYU|lz`nIkn9HOxf8+N>R;!!7-S~MFQ9f_JSeP@?0pi!-O6Ff)9M4Y zw<40e6{HrVAA}b+Gcbq|us0(T;b)MZkVx)UDc^|2U^64RTfz2%yo_XTOeA;f4NIQZ z5~#f&KxTk2$N&ZghDFT`4C2E0+qDmn)PuC0iR5lgKWDWVWG2WTpgw*)IIIzU{40^% zt!u1!TIWFR&4}V|1*rw;2jRud3=9$k?2U**^{-15ckA_&?TbNXg8YH4UF#FY-CASK z(|QDI?}I4rR*+hdogloVnSnu)fV~&c?A;T^-FoX}`(lupAb&vZMd?2riQ;bcvEgZb z1GP6In!6RG7Gx&~FKuREkRo8OM>MK`O`^G5r}ghx2r?7o4^aG~_aAJcxmy)%d0IvG zK+^MtXzo^!T9BO}ysVjlL56_62hi+Y6V2VKxMYDW$V`wwz<C%_Zo%vBEz#VqUu=0= z=Ro_VJ~7;_AhjSnL3nvH1A{C9du?J+{i_ng-TJ;PZ9m9NkUzlXC8X_OW`dNabz-<% z&)D&_eu1{FPQ-Axg4BcT1>qIV3=DDv?B0Q9_ktMi)`J}pMj$gmenGUYGR;ho>WLLG z+^s9@d0LM^{p}LV-3n3<vKNF`HZw5D6R_JP7S-P}vD~em>`RP5W`g{J)TRV=o#0`v z63gA%;=t1?18s*KiREqusR!8$!mFAY7!(NDy#>wg8L`~0zgDch1Tquk7o>I&#N$Ze zz95#nHN}yq)drf@9OAfJL3%)TgYfER1_ng}_8Y{Z`duQ9yVZF6lbawjLH+^9d8U~O zq{cv$Ckk=gtu{_Pttn8u_r!6xg4BcT1>rT#3=B#H>|TRr_mnv9)}-gTZ$M^(`~nX5 zQiSEO`gu+qcdLXmPiqg<Zj*TKR*-s-y&$}{nSnu>fZZzbsQwm+=WdPEmrenh3Gxd# zk3p=4$G1d0ck3Hxp4Kf;dpE>$w}RAy>;&O;%?u1G1ngaaWbXma(w2^R?pCwI3jaW6 zg8TugC!rQ2#r1@E?$#qNJgs{&A?1oj0(UD&J;+`VUf;~XpiRJTi3C(Xvm|i07M6Zw z0GSE$3#i^GE-6Y*EJ4IGPXc%A3|F4kJ5WC_N#Je;sRh{y!W)_y7<35OI|a?&ngs6F z(-(Xffy@N?1LS9jy{L2HEeYJM1#Ud8KG_gI%OrBQg4BcT1>ud&3=Fyi?B+>C_4AJe z?$*7P9~nSqg8TyWb3rA-&kTv&tuF37tt@*X_RdJ;ZUw0Y*$Kj%ni&}M2-w?!W^X|v zck6Yh<%>XOg8TvVb3rAlpDPl%TV*_WS`CUJb_*nNw}RAz>;>V?%?u3s1ng!=LiO{T zMDEs4{T~@XW`g_zPTR#LMJc6-^FzKQa<_i);Awr31F^RwiMth~7Gx&~Z)s*=Fd$%W z1(LmY{4cenByqRCF#N;-G85zvXjtc@<{`p5CyBfDh$m004m7M8lDS(!YC(2_@YZGq z215e&en7Gpq~}f&ck8>AGOi#qLH+>wx45Jz4`eZ{40)2o-8#pMr*+RWh<_`Rxm!VM zLHa>>TQdWL5dnKMl2OAsB$>N)TTi$v*vw?^R;axdX+^p4G9)G$H15vR`UGn47myhs z46>Agfnj?y1A{REd!Hbw2WdN#%-y=|{R}~nnIM0F%gy4FB9O(Pjt$JuSCY9~1AKT| z*X)P*xgdqR6{H?y1_<wHW?(QOV0S_as-HblxLcL2M3;fg1o;J;u2YMO@<GeU;r<Rt z;cnIN<!QYFwfjv9cPmIe$X*cM+04LTO2F<rXm%e-;cjK_)cXZ86XX|=zl%$Xz;=Uj z70lmfQn*`L{CHabK<&;*<!%M32iXh4yP6po%m~;Wk&5bXhg9y??*V}<ATvRJ0oRi- z%aO`$k5ul~2Yx)QDhD88&XdO73Q`ZU7ld~=GccGFu=@&{-Fs5GTd&X0iU64j@(ZkO z1oJq|-$zopTMzj2v}X8MwUh+#fbX#=xu=D5uiliy5I3$#<8B3+3vwR_?`dXWuqWWg zIcccjlaR*UdgoIi3&>26pCy)=wsZvWfY&WwSe)GfG8Y>Ll@al&6{*Qc^OF<OxLbDw z@U%XGy3Z$_yA@<6O#j|y1_lQL?z2fpbss}IcdMdfoeRiJkbgVs&a~tNLe}zZ-L~-= z%xrWTl&2x?L#z`uNat={5XjSNas(27Z_>G2L1x1A?rUaXa3tWqJ814(kj~wz<5=ec zG85!qkXa!?5ceG*%6*8k{X#l-Yex`IYYWtU6Ee74VP=BN-QUc>;6%WE4H>B6=a9kO z`f(~l2gpp2f46L7ZLtZ4tVvLnU3&s#E;bA*A0XjZkP4EArPYEA?$(lEp4KZ+HyUJe zw}Q+CsR7{w%?u3A1l*{QiR#8D8QiVUJ{7Wn%mn$FW69bUjSxs0yhThJEJM^&BAMK+ z5g|OSDn}u4d?Ay&6=WvJZ6JKGnSsHDfcp-hxvwRYyY;tooeRiJkbfECI9qu_A#vQl zlZZ4}hDd{3GPzqFLU~$CpzbTk;%)_-3340*1H++a1_oCG?n}r*4L_AE?p8LJIv0?c zAphp<<ZS%{b>A$a+=obmAz7gDJD%1fQ1^*sbGL%bggTGma5Dpg8v*yRWTU$8NEUai zbQ)s^$V`xbZ?v9ixf2FSgZ^)cNP}glY4A%HcdJM^Ppil=NE~m;=57U<3v=U<W(Eci z0&ZM_=EjU{?$(6dqd!1qg8U3J>qIytj=wzmfqShRI|D;}aY15v9%B8#jBM`KKjA#B zDNy%C<Z!pb%mkTxw3&gylYsj?a!|vNBZs^7sDaN1keML=g3Q?v0SUvO+kY5<_}DNw zA4A-Sl8-HNxLaRD@U(7$y75mAcPq?XkU7Vi85q0>xbY2|8`tD;w_Y&t`2aE#<mVX& zv|8pwLfpu*gD5wmoJV#ihr9JkBu^{LaY#Hb$mMPYnG13s2p?}|VDKj3#tFHo;TVw1 z-74yS`#Q)>ke>y*R9iZtAnOb|E8lzrnTriW+6~}%1}8>XdDxK4-FhU7r!@rXMu$A^ zR*<<cGfp%!F!&H~qd^|38^7dow`S!Y{Q)u)<mViY6D<|dkhJ)ZsI*uHZ_laZaks9C z=4o95b>EXb?pBbQF!!BoW?=9o;JzzJ?o(O%uVqReck6s(pAR52LH^ytbEPFA1`^Mg zcM%iMWhiO!NFI0Vj2NEQFHkpj<a4)z%!Rq}R5JsE9|1R3<fDe6MLu`yDr27yATvRJ zw&B0h;u8yT<2~Zsh>{jF^0`}EVtHC!PC(M4P62l-$Xu8kPd76#_!DrWOaZDJ@8om0 z+Kb=04l)zu=PSppTP)%rX>qgXTO!gTq+o=lMV<og){;1$)+taoE-Bz{1(^$T<C$g# zhCl*toPy@Yh63)^6K}FPKxTsc3~KikR~DC~<|69cjsoshk9eNeJy3gH3PJbEBK&%` znSmjUfW0P#2=yXizgm72aJO16_0|HJ3Gzq63C7kx@sK>=mT~hh%unbvsNI)XoLrKb zi>Pxo3b|Vi5_np9PD0}DNg;PD$V`~tbIlA4;RM`w1<8FNeKQKVTYaB?X8@TA@~_2@ z^DR#jc))vOPwDxr0;$1<L1WPn*CE31L?L&pNFq;b4AgxcMcl0*GhzDAH#0Cq5O7~b z5hDCR`YejLTW7iXXn@QF`4=R1A`z1Q&z=1NUS|ptL&xCy0_;FzBaj>{ZDoMWPvU7^ z19hWLF?TD>T#&j8%?u2Y1l%Z7jOxZaMcl3B?mikIGeLd^nX@Gc;>OkIh;bu$cpF~U z@f35nzDeR~{R4I5g<|ejn7JUcFE%qUL=kY~0W>!@6mz#`Nj&}qG85!ykU0yIA#R*E zzuy|f$A-b-2pYRdEI}#jHWYKW-bm(Y^*IGeizOx8tuS*z=3HuKV2CE*#*`A&a8xPb zZf)M?^c!R*$j>_7lUjOGAa2}l`<|d1!I=fAFC0?B-FhU2r*#h0jUuJotsrwj?gQb= z%?u1N1l-6{it5G_CETs^x8%!%%mn%Q!?Now6{(Om{^Zom#UOLBVNiJ!UkY&{EG_;h z;ci`#%G3G=>b@PN+^rxpVfwE$Gcd#waNi0v_hpoFxAuJSO97b)^6v@bl`S!8kT5(@ z{(A|`Y;+nN&tUhV=9d|z+^tj6cv@{vL*hB6jJp+NE=>Q`W(I~h0&esvLk&ZoGVa#Q zkA5j2GeLfyaN~T7M>@ofb1R5(BWixJDdTQ!Natzofx3~QoVyidF3gSBni&}43AphC znj1Hiaku_ke{ng;Opu=sxJk8`WI)_#r@;6KW;Qwv3diD-qBKZMBg)1HW!$Yf89c3b zpl)1J&fN+!7pDJuGXp~c0XI%5M}%XD@YI%&a_&}5=hqcrGt0SKO*UL<QOJahyA&D~ z`oPRar(xqaU`Ha&ZMA^hl*!Yoa|ROE9u?fJps<ALztPOVkVL?Z79c$^4GatnKgzjV zCpR4L1(^x*v&eC~7J)2C+hD_%#klY0<YZug)_<U(HF(*mQNi8nlf~0o19jtz3hq{r zxiBklHZw3J6L8}VG&jzv;BHM1_R#>D3HCF{uxv;jT_SetH;9W3gX(B-6@#><;!Fj1 zt4TIb>lvu~dMdeF;bt;0Fx+ZpU`Qe0zM4uzJcI1DspM|0J+u5i$V`xbL1HhmdBFDq zzi(?i2jXMHpz+Cgumg>aK!FG=cXBGZTUBy+T4l~c;@O~zyA@_G$ei2F3=F9R+^A56 z>c$6^+^zE8mfr`N3Gy>b-}9CmIS@C-)K4bDjb<juZWO5EZWYPpY0ZJU@k$kUE67}s z`#|_kGXp~!0XH5&awE^Xtt~B8+^r#>{=Np83Gy?@oD;baH@ewm;NBkux?dSu2O_(1 zOBHu3OCC?_9;h2Ds<~TX=7P+=+swd_PQZ;B)u`d9QO(_|Gt-G3WG2YZ3JTn<JMtiI zT<>%VcUpwH5mfFVyD_4gyY)*RPb<$kNL)+QaJPcY1-TD|?=>?pWD{^BM-8eQ&s1}_ zes$Qu05TKg=O5KyTUO*l>cE#DR}$DGn~{=PgeVvPRCBl9$meN|fx2%;4R<TZOpx0^ z_<l13Lk<D=tw3{MP7Qafq|bS2keML=Mohon(o+D*&ub47u_wPAv1epX4R`B-0-n}2 zQ1`{ua<_ua1i1}_A2c&C<Pvb7Pc3Tr@zip+nsO+<1DOf(Z%54ZmXbn9-ICdVRu5z@ zHVmp;KzqqklFL&-^054DQ_J1DrjV!g57dn;b=<8Wb3tlA_+c{xLmmM)enE5NhFb2{ zl}?h)ATvRJ2APvk1leEpNZ<T4h>s0}_gAH-mVn%dzQ5`L$el$ztv=@=X>my%cPq?n zkXetK85r^jxN}M!YFI|pakp}LtrrBD3Gz3{oP=UXTKxBG1<nIh!R@i!Y?QRvQODgn zp_r$24%B^n>bYBCW`fLp+|0mGK)`(_^{DRqQODhyc+5}=WG2YJAah(wAnpq-*PaLB zW5Zzg73HG1Poo~xKICcrvYfF+qZCrlhutxB!KNQ1=2FkyYEueX`-)E;NNq?dByMMU znc<AvI~O4FX3@Y6_X|kxlV%2nDgxo6(SRB*0u9`)=Q3xog3JVkGk9Dotu!a6Ah870 zse`3$i3aZ0DWyEEEEgemZ)o6d1*r$w3&KyE85pVw*u4PF?w$tjR-5AU(jYTIegTDb zdTL2(9@6;xlm_nBj53~99jLuJjohsuwIDk|_*pXpLk$6YWg1ca%+ko+s@PB@1Tquk z4^V!F*b6GL5oIDzBX_GqIZtZ{)b16H+^rz>AbUahc{2k;Edje{pxNEf$la=?(wYx4 z6XX|gc&C&Wq~?`@Er*47M<aKuOa)JC4b*OxChk^{dXT*!{GyqGp^kvvB25T?cckmI z{AuKFoqBVxGRRDjU%+<fCT6Fi#WhP4ck7P|p4KH$yB9QZw}RAz>;>VM%?u3n1ni!G zWH(4pMH6@HjgAEYATvRJ0k?f&b|bah8bInQd0Njv?UrcfZUw0anE}GDni&`x2-wZh zjPN%|&zC0dR^3Lqa*&xIzku3{@dfF*1to~HO8zu)w{EE7Y5fAVcS<vND@ZL!KM22W zW?*O}U~dbWy*bU?tvcUWazSQ-`~miJdTI%}-6hT3trMzwT4gRl@)l1EcPmIe$X*bB z1G?j$fZczP>{eJ()bgU4yR~-B&pwcuAiqHTTnf%yur&6enY%TkhNsm9YHvpicPmIO z$W9P`3%a+SfV~whs9~MZ!rdx$wb%e;CdeP)G*$q%7bSgXv~ah&)bh0EK<#E}<!%M3 z2iXh4??89a6R`UWn%#F=xLZ}vD4hqH3GxfL-CdlTSd^TBQl>m<;ciu^<7u4&wY#O2 zyA`A!WG@K62i-GI!0wV(RDVaba<?AtD}Mzt6XX}j`aPK4V6VgbP6;5r^*pV6p!PGg zakql>fb0h051>2b3E2MuWClnv6yE@a-|9wwkeML=K>S{ilUV}E+^{%*(8}F<r=F+v z3DoWjZQQLO^-yCNK7#IsCt!C$8>-(!+PGWihK8>Po7u+Q3h_J4ZdAX=v~joYY2axE z*;mjAIa^`Rhwpztd~Eo~70;Fqs5*tdxC_|SfW+2ZhUA@scJ5YCc!I=0_!H=EWCH$4 z0O<iKhGLa=?pE=m1@k~=g2KmP{gsvljgWThYO5s<P-PetIFF^J<QJso!Q(oloxAl) zBTwresQUyuxLZMH!Zd#d-HS}XeGDC_;eDi?yR~i3mF*xiLH?aEg|W4x3F1B}A&w}R z+2}OHeZ?s5`_j(cx~GY!)#nN%{5EuOw}Q-s>HPw_6PbYf7NEH=rGvY5^}ctkATvS! z1({XQ3>nMT;Bdx&jw0A~h&p&m2Y2g&W}enLQ1=CNa<{_F1eyC4bRRMS_c?T;h965O zcdM%6`8tr9ApdUBKHn130tr8(Cow@FbFpDi_@#l|hg4sgbb`tbp4K-|_kHN(ZUvbM z)Bg>04>AGwJwS8cl1}bcr_-|cL1u#dyW!2(7MoUx`~3S>Z-SYPPJ`W7lnQboJpEni z<Zdl!<!QCK3W?t-UEHl8GhuqagYG~k;J%hF)bMlZ;%@z0wR0uNOpt%i_)l+9X@iU< zahB=2!pugeL3KeI#C_mG0ahlJbaA&PwDGj|K;6jG&D{zz7pDIQ=niB8Zv2Dh#ur`O zt+JbL7K6+L`5Dx<EC4T*LZqz^UEHlE?L4hpp!Tlm=57V4h1vTPbgwZ1d*^f`!sd_a znU;iZ?$)nAZi|7;1o^{b%GQ<_?T~)P%avDg&-=46FvJ&tqYfT-6S}!uB|3OoS*}6i zE})0I6=WvNeZN5W853}yLl44zV0}H@t))?=A3<h<{0kC0(*f!8u6(Eno}&SYp<_@R zIld${w;(Su7bFLZJA)qXR+dhl))1&0KlE_7!psG!`whC&n1CA}pt*5L4|i)oz^r_b znIJ!x><ntz(FqB|uP%#sfXu~)L2+CHbs@}sS9-WxUv%=cE`hplPcL^X$V{02Kg|pb zvk17ar57~}U3$4&kM3c10+|W&Z@`@CEpxgcVc6fjt`254It>a#i2K0FA0E#oz1*!= zx_DYOW_)Vt=!WzYPsUzYi>@EWe{vm?9%A~qTS4~2#Q%cs@+9CFpFUK-2=sBce*3$D z0c0j9Y;5Guv@Ga`g!QX+s|bxD<szS-;?T$4dZC-A)#L`meSiA6TR~>R-1iT3hbIB| zy+Lx{2G>n38~V6gtJc3}0GSE$?}_XaEiF9|_vIx#CE&iIROB`75Bj)UxAgF|wm{vt zpr5-HWG2jg|3UY65^&#ye$?;_=;v;A`t{`<$V`xbJG#HNWb{JD3A3zrr^C!fr@`&B zw9LGew9KMnq;>ZV{oJifdU;x}K;7sufx8uCE?j>L1H&=`ZnT(y>c%hq+^wO{4$Fbe z1o;_cRzx2poh`Vk3Le7(iJ@a~I}Ywf)cGit3EZu7`gmGZZbIVv!vyYDnAsq67+V+^ zmJ@L212lKenZVs@^!%_K$V`yGI~40%0{S8Dti498J5lGP&P?ELozl<KS^{<FjEUT> zAhSVk1YxEY28I;`+}SY^5uP6uj9XkLa<}@n=}Lpl1o>NG!uJ-B36QpI(?=ED;mOOu z5DyPe@RlM(88DH%b;1Om)+11NI!xkj1(^+UBM39MFfgnn;7)@{2zO3lKhg4LB6q77 zui{*gnIM0I%yF3r8DFZekifmx6?9f6+?~coAeX|*Q<+KJtrI5lw2It<#QTd$+^sOP zLFTixFfgnl;LaOJ?gZ(XGKsr2mq&3f$V`yGRi5;<xJ-h$b5S|5?ld#WG&X{V=Mj)Q zC-JnVK;79hnY$HaHpo5@W^G|$SWUp4HIotH3DRRTnY;B?rt*7`nIM0&Y`fCpG8xkD z;lC<{`@V3{y*Hrn%uB5(L7ErOnathVFqx-y3)GDUQ@C3}=7Q`3VYU_qhBXA-s4xZ9 zjSnVsxBlE?rUNn)<mU?uSz1k|K*lKbH1tYA=3>L(u?d(Pk-|}63U_PC6rNU=+mQIa zGKISpWG>7M_7(<)wFKOF1kH^tQ$S~<n(2Vd1o>Hm|7(lJREQh7HHma1(pe^3rf|1r zOyy|}fx59~Dt9Z$T$md<S{NAC5pZM9RMc?Pn9ALH`-Z6w$V`x*4V;QvWTrvNqC1D# zanF~6&X0zLBPin_#dpM1?$(59JgrNh?o^q^-3l@r=1$HQ28Q(n+$k~*;m$Xz^(_~s za<?vz5cmi(6XfrV&F@-7rbEuMvyx!Jea0u~Tw$0yAz2)rcNnH|x5iB8Y5f9q=b35T ztst{u?&NA=VAw#woqLen3DQ?Fjl1<!xWGq{nIM1vm~*~GU<SmUvEoF!6OzT@?p!gA zyES44PpiuvNZQPq&fN+!8)P2{bGI-sY$V{$nCXb{>~K8VqA;DiRr633H^@wozb~Be zYvGv*>3i)p@59+91NFV)bF)D$WVrhRrgOJC%;agE0(GCj4DMEtnIN};Fi#5u!zKdm zW0-+(U(KwkEeED^w|e*-ss@<}^6v%pc`aXNLdu})31w$N=3>L3z8BPe;KnDcJpVAA zyVYP8PwNw?8#m10ZUvbOGlRE<fnf^)H!eVOBS>G$4DQz4FS8bc%mn#4<#|}klUb1d z|G}ep*5<G>FvLT;K=3e}GK0HSWHwK$%XLT`2h8Md1(^x52ZZ@r7#Ow^aG%3WL>Pkf zu*~FcJ=(U!2xKP6zo0uaPRxeHapa%tS3qj8VQ?HLCMTyBBkt}rnaSPyXEsmk6sY^Y z%;atbnF-U+-@?GKjez@}Ah}QB_oS93Gr3!PG!~SA%mn$@p!`b9hB=TpHWuN*y><vx z&p_OV6316&a<{&j!_#VV7ZQe3W^uQI%!Rp8poM{92LU&>%t8%Ak6GNUh0pI~fy@N? znd8IrmIZSm?Q*d@PdCHNMyEl2w4&79e9($rSQ@OD#oc;gE>CL<)O{wixm!VI!t@HZ zFfi;S;69bvsP20)i@TM3<HIbFnIQkpFllLNnFn#-hNZ6vxGyg;Hx)5XATgV}b;~@S z)+<o=U75|@3NjPsKA{!{hFt{QcLd3OYh3oVbj;>%z476_G{{Vle|63ow`9zRxbMuu zm-As}qtl@9i-!#1!Sl$D+1#x&=JT|w+=Ik##T@QdkeM*O!YvF8y9u~2V-9NgY0Tkn zeKdPZFUU-ge+9DCTYMHk`nY1siMZF1fX*HTyAPZM;ckqW!`<4lfTy(t>PCsV+^ryU zVQv&@VPM!pz>OSpQQdfE4tJ}Fz>zl~GeLg-V8z{Pu@I7vSG0b|eMb~%k40%-PG(*< z+<kxMaJS|x<Y_$ub>E)3+^rxpVeS)cVPM!tz<q1b+?O+#yLFnYfi%cWkbgg@a<?ih zg0yo^Z&1hGPvD036H*dO65~tYZk#ihyES1EPpim%NIa*^<8B3+3v;7b3j@P`0&WbM zhZ=?g^SE2rJ9mnK%mn%QgKJTX$YMxe=E=GS-1j8H`Z6Fl8XLtUw`(2daks`S=4nlV zx|3%<cPq$jm^;N=7#I!^aOWR1ckY<S-5QwNDF!kV<ZlLv^DP2PAnk`GkAH)#hZ&DT zgU{@Z2Q_p+4mC3YITTjzyqL$`8nJ|@bqmy;Tjq1Og3X4SAko6WaFBpIm&`|m=bCxk ztqJoX?gW_$@;AsRo~00XCO5V7fcV%j*qtzEf=+xu8WWf>pSv|=DNifQ14z6lEZ}a1 znGG^avW0=+5CL}vEI_yuq=#bxcdMTGgu@^+LH-u0Z))LK#?vamz`$V3$RQ3=gAFqZ zAf-)kyAc$kh_cdR0e5S}GM?5Ds9Sj!a<_uahnXeS!oYBtfLs5dxpm6|?$(~S{f9wj zg8W{Q`MiZ^ImE4L%Or_&E4b~5>eeR<xLaeE^R(K$goJCyLhe?O`7pOiw=ggqBjDDG zg{a}0u#mg;fL`x+keMLAgWFy4nZ=34$(f*oA7N=PV<C5|$qJs<6sX+{i?~}s>S1=v zv@kFnCt&vnG`sIC<Zi9%y8H`dCde<K_DW`Pa$ZRhVlUZ~h1{(?D|uRbp!U`*;%)`0 zh1o0H!oYBXfW0}35Po(E5NZio#NFCo_4@|c%thR-;IS>J#mM{6V-|6@zF5iAYVrmW z-akO*fH2f@xfTY7lLYL3futU!?ZP7N);X~&UV+R6`2{q_nps?tl9`?fE)!tkePa=K z>w#4~tuau$OBQptg4Bb|0AcwS28L4v>`qyX@OO`$P>auE?pCpvC%i#sg8TyRL&Gdb zTF)D@n7ehsYM$05&^#fsgu4}_9%L^FE3_~$oF!m4%Myg$AU!7*bGLqH*}M>BCde;6 zyPaD?)<D|W-q#v&uYU)%v5QMU!=mtd<;P;~)|NFqtzV$-+p>ha6=WvJ9uQV+VPH5% zz<o=Q+?TS$yCq`@cWX*U*ME?iApe5Qu~-YKn}6KhyAZ_3hCyjI9^^ixF^CyUxLb49 z^0c}<gru8@rQEGBGeKr3wJ<Q8C*VGhrKsV@u@rRoZpKBBnIQjy%u!ee8Mi(4m<M<J z3$ng5u>@T9A(eYexm#n_@w85Xy79+S?pBz&AhVTQ7#J=PaN`R!H?CRA-RhXx^&ey= z$j?(2E^HB44++Do_lO8Xq%o2^OSxNJ*7LMJfx2(bGVWH8nIN};uu2O9!$kt_>sf{x zhCa)<Th~vmx(G58<lhrsPg;JghlC;1E*;$c6j&IVfrsqi>9A%QXze^ttH~osJUcAs zZUvbOavun*wlFYUBH%`Y<*07_u#CI)lV;65keMJqZ<)f``eFm59jmrcLmp%<HVi69 z!08Ze3`b!(cdNoip4Jwq8(CIyw}Q-tnW5Igz;K;_8?T_bamsS;*7t>fK7h;w`T5VB zTP;^MLi&3>{8RN|W~0-fx}`X^Bqu*PF$c6M2v*h|S<c-mu!*NN#_ns&kxdYDw)5V@ zc}KiX>86$&n;`c`gf^Xn8G~*e!<}8vTV8B}q(5(mBW)N8paKczpiu)T2aS3x%mj~b zWGPW3&XN_Vafl>E6=n<$^XK$RwJ5CQZq-<H;+4)y?p9`~ZO&FP0Y&-gMTxlzZkai$ z#R?h~7G|0;zM08I`NjEZB?@7g#ifZk3c)3%DVg~ShDLe@F=5UznR&@Mr75W~xk<$( zMVWc&dZ6``6E^d-maO7#oe&F2<4`N8Mu9pN5-)bQyx9zC!^<t1xe1g;u~~3uB_y0} zR&%$4(j82VdJ6-?cLHfRWfep(Oi#or?pBapATwe1!4gu!D(+U5Ej+CbTOsRyDxmhl z^iqok`90n_D8$n@0BmGIBKX=>h8@?MTHb7fga>QE>&-IjP~8qz%)r2~VM<gB%XUZ~ ze2&NOK2W&8<X|+Y0WY!|qW{2J?pByzLGl_c3=Fw4Obi?#4jN{GCMJ>XpnG2-`q7k- z&HexX|9?_6PZ8n*ufIap!-Dh1Dr8mUu`5K*v{bC&ZUu!YDC|Jt+9EZlWzP;snX^~T z7Uwv%#MAngGf;IoVm3I{8AShUxw8Y({@Ii!jkEpZ5}DKT2CD8OiwRD3AfNt$s+)h( z7_T~>osjw@>(7x1Abr^ImV`Mi3OgZX=P$3%dDzr|#MYcuZ!y>jDYN^f%=$rM*s#Kk zAn@EbC@q7+6Q)M9g@K`5hKT`Nr-&IEdNDg8`4FZ@WF2>FLg!LOkeQ$~{RW!1Q#Nq7 zg7`3XS}hC=6*BnGD6K)tTTecywiK-6ZUyBzkeML2g3N-I3l$)Hck#4#FfDBn*$wF< z2Qmk~0;$1<CoKEkqO%*)zF07s3+fw8l_q7IS{!ym=4$3CUBsEP&nRDMiP#N^I~Gnx zNlcR<A~wuZTXJ?o;*MqJ+u0CNOmfLo&eodUkhpUcJ&p5>>z+fqTP8r=mtpt`=X#co z)-x?Dc0<aolu7<L_Z)#-a$q-4s~`gdL*Y>`QI5^R82KBdW{LZ(mOD^?eDd{~2Z~>i z_<;?G@(5IRxjYB;(m^r^+{Vkmpxwg2FiVDsArv7DXTdJ8jCjZfxBJU_h`Av1VQ~-A zpaV4r+aV*|pbKOf7#J${qo&av8@O9RZU&hNG7m(9%xc-l-3syt2!r?_400njv-zQB zb8LjT3#6814^J!1t}{nBwH!GBiNDgcT@oO(L24c#sRxBmM>=T47bJtg?Ys;Ox-AS0 z3uKrWJQ2ch7Pjyaftm|4ALJ*PVm+uix-bDG8Wuh*hf%}l#zyW|kefkfg3JTaAZ>3p zakql}0m2|Y2!q^+&1_isXlz1+&y52-tuVW4eyFzu9D$5qwwNa#0GSOk&to$}J#zRg zK{BU<mw`dQg@IwA3=@MlND~^y7CtF#h;WX9ngue)0BR2CzHKyP7+~fEFd@>R2~;o0 zouIIR=`n<wgDosz;T&@uHJlwbbGL&04l)yD9*72+SF?q?6%-yI4B~?@$gkMUhK2J4 zq;N|)!qW<~%O+c@WyJ|dxzxoK%?>gfWZsP}*u&WbNxYMnfx)PSfnkvh69cw|%Gkn( zr<1qk$w^4N=gk~0KagG6Fb|SFN1$#8*=G#351U4qeaPj)9H?H9e?Vafv&#f(jtWcw ziH60;n$xK9abXL0D=3UWW`fKE(I9O)+qhdn;ReDWJ_v)t1e@8g_)yr22;V&?cv@k0 zX&mZn`EdqP?^tIgTm+d7GOuGBLOpW2pMzvh7cT>YX$u3xVi_g|Cy*vIj4ga%;rwJP zcWVgLERZ>7P;(%yTU3K!<{+ng<opA36UZEMs5#lFMu2%RbG{rz<R2ZV8$kXAg)vwm z0|SEv)EsPK3X88D7f|D?VH<ZVI1IOPw}Q-rneDTkyA>3!APh4f6lU1WhQ-$fr10lC z%hQT%7t19`IUf7XYYND0keMsCV~;P891M5!GB8-SFfc43P>v&q&mE{cK<0z|1T)JD zY7VwC02V$vS5U)e!FKLekefkfg3JTaAoI5D;BE!^1B5|*5C*vso7u4N`GDkKiAy}K zFuM$X2DMaNg_Pr)l@bqt%m$e!uoHXu<m^C*_wX_>Shp}REG1BmBZm)iI#hw01v1A5 zY7VjG_#dc$K<)&E4am(PYzs99TUfxtIp+pyICJdeZUy-rWG2Ww5DhZRWfylVC_F$I z#0O!JU$L1D3+D)=aO=6s(+aceO#YLW9XBEAF!kauJ&@TT^A_wvgeR!n0EwNs3F!+N zc3a_W*TULme~|3!<z-;71FZ>_VPfzA8H9#m`5C!f=t0uI1<D4QV-Gb4+XfPtIVkZ8 z)eG_uC=6j%J3!4r9@Bxz!Qx}j9n|=kv5UJE6h<jKxm!WzfoPDPFT1&0LE#3%AU+5$ zlVM`OW;QH7ULb|<otr$ZFuPhlooL~>2TAv$(qAP&W`oQN*n=7$uy9V<jS%nSWngdw zt!b5EV(<cKLc`d?2Nuq2c5}DNK+OV~;{-J)2F(l*7iJD}d?Du_n43W6I77|Bwx|zg z4syNw1sX0O|AN98WFH8-K+VAxrm*-r@enn>Joa$6g2QkZcPq#|nAtN9a<_uQ6@)=% zgYa?!@ihY}{AKR(w8HHA5Ng>X@)(kTPQSA<0GSOkk6|AoUO@Th%?ZeOqsU%_ct0-# zgDYrluM86dwn=Pk;Zv~_((j4c%iVeg>L!pmZcuXy!Iq;EFmsUO>%>cldq65-ZUUL( z4mD>ENCFMR%t6jyOQ3E*Q_A20HAfX)f`Ng7n+4MB+w%-HzJBcGZUu!Q$V^Z;f@qNT z2}ikGL3|J!hF8ciF<>(rmcKlZ!e8St=qzoBT_^T&w@%<?U~q{9t*T~VIPi+66*SuG z3m&O}nGT^fPV%-SoI<oQK%yYMo}hKkG9X<H3^Ff3Jz9_q1T%r|{$pTZ;CThH4<gFI z(17F~kQi)y0mMdE3lalin3{wHrWPh928NmK(I8<s292q0_@vCw@Z=QhN~n8aG+YrL z2FOh*S3#@OAc|sMLflNO86bB-bRtO5*dvGsaytlv*f5OFhl#^zSRS!BfXE{gc^MeI zkir|L7Di)BlNJ{l;r;s$`ypn5%<(3|9OOI#N`Fg`@+-_vA3WxWK)W<2ko*AB_lJkG z^@<Q@E8~X%rVzBW0Fp<>XI?<!0a*;hp7Nfj733dS{zHx@kpDnxK$wkzfx+cIPixLQ zh&iD02P6)|8tH7UA-tTep!h&{3rGy64jT<J8x$^JxqXmw6;{^a%k!{Y(ts2$aC5+h zp%Tb`Lzdx&azJ6BaR?H(P$4k&;2?J^%nnc-fWiwbL4c4E<ZN97%|kG{k%56h>Z2eS z=U}mmfRSKnkUp4sFq)BpkwN04AQ&G(GI!59-WHe|ux302$X^kMA^t}WD`L{Yp2OVW zbadx6Pb&z+^h1aL;kLrWiKSs0VQC1Ij|=wlw1P0q3~Jc{YJlRK!-Lrea}$h4Za-uk zfrKASj@q;W4)a|eTDH9S2pOv_H1?SXs^36%zd4F<4=B%mSq`b|J&?pF^D;2_f%dOJ z(<(?GGKQ6h$ZaZ(-4JuY>Y!$U%<(6}9F|9j`tJtRKVWwvm0<yR%z?GdWd1<PBCs16 z7#N-$<!%M}9b_iRJP-|%<GIA$3JMPp2Ju076%N0`>Uxu7h;UQ+$<qq6D?&@4WzJtn zTe{|-eF?~Hka=rPAk>4x8CLIXKr&|vF9Sm$X#b526GH?@6B>qvGjjOA>YbS5+^rc< zvq0v6W<gfVFfnAInE~R$%t4MX5If}pH#pyb@(!#_K+iicabjtZeIN|VJFxa2#|iFM zn7=`84Tk!821p?qhPm|z)NdeZ5L*W1R(9Uj0(M?_8A>g;g31!)z6B_3LH2^&8Ul6e zMvwp+hPidgaYS4@Ah{b^c_`EzY?CXnwrT(qFT70w(!1mYcPl7Ofy@M@D-aD5Kk$IN z6~qUzVHgzm*vy8d-!Dk%al>DpR+wESC%IdvBDGaR*m%Kh)o2`TRZx2lW+#XS=?w$z z&w}P3k&m!i7$nQU0Bfr*U`6$t&Pha=fmDLx07Qc@x>}GJ2*cFyoZ^P30a&`UWnf@1 z`X~s-ThPn~=_LlIU@;fe$2IvV$N<71dx<dzUCkaW<|Z*PFqnN51Y?lB=z56Zi=4&` z2hg00#YaH~5C+*xj5+9Pa<G^y%fP^3^-&OvLH45SA%=ehi@Bh7ip@ts1`r0>3o{2) zpTOc4CWecaIfEGvp!8t(QIG+ILH6R(i%+}+i@6~8I(!sl0AY~5F#Q3O1c+`|oxx$Q z(?>xD5C+)`GZ$1Y5gQIFXEDP8H2>}LQIG+ILH5GTC55iRV(tS51_rl}f?y1?mlX40 zYOi21SB!yy!Q-PK7=!GEsU?NhIfp$QygmvtfH25jQp`hE3yTXF4XWEgW`Z!XI#Sqo zu(%gAN8<BQkO72S&Y_l-#G3u!5@t9=GB7aseG~*^kiEp3g{%(LCkKrcz{+Eo9B8Zn zv~C_WRsahh7!6Z{j|SBV$YTW`SRi!<v1WkWg>F72V+F9bF{qscGj|#<14B4ceFqbV z(b(Dqpt1}kzvcpWE2td<VuQ?yAi^9_+Xti`gh6Eihz4Ppn?UA75@8Ogy$8|<!k~6U z08)DZBnHA!c+7!~IoMo8O^e{Pd7T?P=D<Lp-c5kUC&(^je1w}994@eS6moon{0CDD z8W*_nkEb<(3z9BCc@HKBqHBaWTS0jroG#Ja0u}=)!hu0%gTe(Q4QjiC`U@Z$#K+fm zgSB?PTtI{i%p8zjbd2mbWI5QF11K!!Ttb)yQxkHDyA@^!C=Ouh2quq<wz!O027v0Y zfRBO<APg!aV0uCB#^pYk8W=qRi@Bh(JLsbz0|<lcg{dWleu2eYkb6Tu3NnB&$X=Lv zp!`X!dmXM|h6AXL5cW}!0fa&J!ptRwo`J<&kb5IO3NnB&$X=Lvps`+J-TMKHxghsO zeH3H>VUWErb4j5+u40A*$h|Qi1sOmXWG~D-P`O2{dlz6a7v$c!kAe&!46+wyE-Ca6 zEarmToA6PP0fa&J!psAekHoq+;2LH)fZ9q)9|aje7-TQZTvF&2Sj+_-h@0|JkO722 z_L5>AT<vvC_c}8$Fr<AH1Y?lBaJ3{dU||NMLFFpUToR3fD{r{N-MSUpCxp>AKx3UO zLJU$YLJSetG0Ql(W;_g;x0vRF`e+s`LJT0hflPBj`e5#a(V+Be#v;T3!W=iqb1z6A z%sdzk8Xq)a5n=%01SE4wDStuwVCKPSP`)r?5n=%09Z2Sa${m;*JV6VV0_lUPh0!7m z3=9S=LSQU#6A=!il)oT-F!NwED8K2k2r+<g29mj8hY(4C^uf%7(V%e9VG&{g;R8tK zg4_#JL&$iLKA2h<4O&2}#UjK2!V<R-;XueNWO<N2n0YW7RBvjq2r+<g0g}0-l)oT- zF!NwEXe>aDMTh}}Pav6#>>fgFkUp4sFd8&=p~51>0Ky8l5#c~e`3uqqGY>|C!a<2e zhyjEvkjy3IMr3)AKA3qh8k8OsScDir_yUr-J6<8m5@a*5u|fJ^=D}#t+>IQI5CaHn z+(Co`HvPE7K>A?j!Dx_sWmtq5Kp0ex!t{dXZeVI)Vz_8f`%vUA#7(er9i*0+_H@Nv zNIwNM)(XNf{nQ+9y>pkl71W0TjXi@fwe0|nKZE=W>T^Z(^0$C6we0|f2fq0sn0+93 zAY)MZ594>-gTxVxPi@)(hxr>$TxrqZ<89?+U|=}%&dLBZrVO%M<{`p8pmqSL%mj&_ zxsMQ^!OOr913K>tTEBzjkuj_fj681vk{9`em~VikV^A1^<X{*kPAm=62a0b{c?sfI zJm79sfVvmt)>tCkngLZ0(htHW+<dK|Gy}prp#DU6D@>eN8e}dAgUkVyl^`|<!@?Hi z);J>ED)Imk7eAo!3yL>be-&hAJRWmk^JNy2kbX2s{RywW7LkYCt)R33G81GThz7}t zR0+3&(gz5G_#nI%8YUn%GKS4Jq#&iE5>eh(m|Z4I+go->@wT!vFfinq`pg5F4bmS| zh1jbBN_VieXAh9fnaRt*kN`TvOooX8w8ssk4;jPK9dh^}?@^cmH49`;BGjB3WCNgV zm^sL4q5!HFssv6YLCvv;iy#=Vd7TNeh;Yu>u%o5s5qB%d?;tZl{sz$?T@z}BTVde= z;)C!y872m7X2Zhy%p*ivI3dN`3bU(YS8dB3IY|Bv3`#KonGG`UMlJSm_IQjiXBIC5 zLo(<LHW?;{G>|4Vj4ga%;XDCk4hS<aFo4WSftrKuFj$y5$nk}oFJNv0nUe}NXBwJY zKwOwP$mPuqq;LVLf#Ec$IoQG!7GHCe5b*`lr}Kon6%>XbGeO}8qCw&gPq|xR;R@n| z@OlFARr3T9&L8A>TaoR0p$y3vH_d$Jfy@S(H|HrrJt$xFJcZ1&|3ETlHZKE1I_NAq z0&BIA!{-mw9FQFwpk{&0$$**zKHL~2iG*R{j2vGbP`w~`nn2kgEtybru&rB%l|Kj6 z5aC=SVcIg~DR(Q#?;tZl=7DICSs$Kpw}Qe0gh6}|-XO!ofX!@JzIcKZZa<WHTVZyY zTrO|n(SYQOHP;#qKxTu?^LdUvoD-fQ#OLrbFl2$w(j&0u8##Pn;k@D*cdG={ERZ?b zP;>G@mZM=<I3vdwa=w7M31m(V)SON<GeBIJImqSM2WYr}{0j<WkU9{~g_?scOkweL zMjH`dAU!V6xm&?u_>{X9WFE}yh!@<gpl}6YkU9|FNFctZAcenz25&3Ot`gfxEfTuC zt)R4j`pj-+kl7&fw!A>Z3rG%@F9eXp=khWz<blo>B(PQ)IecL81+wD=)J-6B@}cHn z+pr1?XXN-=0M!d}Cn#({=7Del)Es=_{6!x%oY%bIZUy-rWG2Ww5DhYm;}v%+C_F$I z#0TL`1j6|bQuyfT^0p$|<zUDQzQgZy$)RqL*&y>$USSXCikArSdAtk^g)IyWn`M|7 zd_bDeFt+f4h4X=z+^q&svq0t)LCpbQ5{<(g<oH6)7ce)0%qfPN(}iXRhzoNMaz5pN zx&h>0P#A;Mfp7`b9DMP`V2T=FF|W8=!D0B4yA@;}%<PiS+^wK+1!0icAPfpKY-YpC zu{B8HA7aSc3bSj?hbt{UW{`61dcqU~kl7&fMBX6c1(Yvf>y9*DBgE(PGBA{a&a;$Z zV!*fd9yxqqYr+d&bGJT#x(Q@X8Pptn`2sn<U~7UvZiTrCWKKEMoS7gAGz^O`<opHd zyQ3)sb1R_cU|Y8htKYv^BI4^ye_spF8}3$67=p|Mg(HXt879HN*9zi;*f6|>z?$$F zr0`EL<86i6b>|It>jI>8Ha~13>uhRqtg`{lg~IFv(ICB*pff(9?QRJcSg3$x5$kMR zY!Q9~$xK0V4~UOE4~DK5BoD$cH6>WaT0vt!RxCmcAPgFd1*s<$pTS}-XspVHMTh}} zLH3erCP=-?JH&Vntp5mFw_?X4!~nt|dqL_*#Wh&W1&z@-um~}LFvwn*nV>!>%x;(% zF8T@<b3tRGPAozUAPlk>mtK70I`1*V0kmGjg++(~ghBS=(~nE81&g_$F*`RFAqEfz z*^5grKJhzP%msym2a6B`2!rg!ryrjjEG}R)s7wTz3BvgF;gjq6fEm7^^%`C*LJS~m z@&QrS;xh+b&f^QFxuEqLJ}g2EAPlk>T@NvQ(7Fgh>os8E1EYyC7gV+&uh*Dj11Wom zH3Q@>bbF|=UIR4F1T%LbF9SmrQn?8ehtaT76uE8z<zblonU9dT1esG!ggMA{9jG4J zfmH9p%&fs<4s4ypl1~tOVR}GmYR7lTI*SanG99J{MzcWU0mg^XXPkIjLH>dH6*-<j z{)4Flt%ayD;%!~x2#HTno`K1MXwcjpD9?iG33RuB#6W6rVUXFNZ~@7K+A5&-5r_uy z@zve1brv<;eDF20Fmph9(J`{$kmX?OEI?tw@&z@FLF)E==5CFFhCL__K;Z=vCxjPZ z$-AIB!jDCW0fa$$8)gQ`-MHKbQv;)aU@;d|<_53`F@P}0UYJ@^=zy=7Wev!^K`cTH zAPlk>W*%q^m{|9&z+x_F9yNqThyjE__QK31iT;M&y<sdu3?K}$7iJzQ^PLe`%mukO z0yIYrYGZxFOd~LR@X;Hvm<tNuC>9|G5C+)`(+?_dhz(zk@0j5Lsw-nygcv{=WG~EI zQs@LM=7QEO#IXo5fH25jQp|&?1(jJazrkqGx`hN5AqFu1PG0ze%!io=qe0~q*i2Bo zffSH|JN|IDqL1f;)-CYy3Ne7Nzz_1=Ys12aVJ>JMNP}010faNiG#8`~-Myf6rp7D8 z0Kx~5%mw8Om|8+X1JVam3!_2n091H|7(iI!Cn6k3DbGOqVCKPSQ2JHk6=DG40wi+@ zxe-|&qz`5uj0S~+0<RDQ2%kVQ7gV0X)F7LIjSbQVQwyU(>j30<g&06s;TIwtu<6Go z2GR#J4@QH^bs1hE1`w`5G8YtYur!X#JeW90AIv-$4eDD-@d`13@C77uVS0$6LHc0k z!DvulP=Z&80faSvBf^1{@(iR8W*&?Ng@YKc5CaG|Ael>yJ7H=-`e5e4Xi$0(;T2*4 z;TuTig3>Qc4NN~S8l(@V7Dj{C0SNI5F@UhaA4E9dG6S19NFU5R7!7i-0Iv`O2!qNc zm_E=t0GJw>7%m#rev$bLaT9VHBBs69@Ru9hUKFwCZ3SVNe$f0SvVAadVriIOSX&X) zUI(oK0AZLJ)UpFKFN|-F9%diRO)wf%HpAFD{~+N9<5Qb{0*xPZb9s(^ZxL{X%n9u^ z_n8M8j{>PFVL-HjL3JLeJOhar{71NRF)sr{9q7&#=y(xG9vQ>>J;-BxAbA;6zSfM* zykLADsuw*jVB*BmAag+&6yKn-0mKI3BhYXKxwW1MxAGwQ52T+un5$KSfv5Guf6(4h zP=5!M>mVkB+-qaP-6~Otc~0m>A;|fU4GbWC5cPYYY#Bzd7$ZmxXipx9mSbRG*zzA@ z4rreQNC(J#5KRsS>D|G|)7tZ&s}*#hu>#a?ka&DrdTL2>d|rM|KIGt6=-pe&DXD3h zd8rCudAI@y7fm_%Y~nj6+^rT^{C)}Q_Zo;l!OjP{1;pTCg7_Vz2IO}Tt;WE>@CNEW zYWaNy6HhBByg`14hBw&FV8112Bo=`jgWca5iA7L9Bb0&lwwQ9aW?=E}WvG91Abtaz z46+}@_y7@O1gQb}7ep(8_8vpShFbpZVdiNCg)zv#&@cwO85GsUActV}Yq0{lyoMQf z>jW%*yaM%O05drLz$Sw11Tn5a#27(pKz;<#p!9qJ;&%pW`LTe7rxg^gAU{IG72?N& z(h}I&SfKQcNXG@GB_+uUX=w5%%(z=OVDaNss2@#O5Pk&N3G(9wh!`VC4akom8sx_< z5WiE+k2$P7t)OrP`4JkfU_Zu#J%KOJg8d3rpny#|*qjV=?$!%f{C*AUcLP?0-$8Bx z`TYPyj1i;;<aZDa%Cid~VL~;($FT9Vg2Ef*cW8Kn-3;*zA~Rx%V@RF_#WO+~Sg(Ku zcPm2?q+A901%|If{j0!+@Gr=Iko*#e7$Zmx$iE;OlxJr^!hvf3bztXd1%)xlztAuS zyBQSK*z+tXj*G$R8Ciad1$V0k7C+vA`jLel;YX02AU}3M#27(pKz;<#p!D1V@jKQ0 zsKUY13JO<{AEDt2_G5f<L1_up6DaWs5-%xMK$j1(<ZkuA;>Vj%KfZwY2jn#dkewh# z1_#*Rj36~2KZ0n`MFtsAwbUw?SU7oFLE#GWBQ#vWegxIBAa{T;iXYQcLB$eW8YK6{ zlDl;S7XRIX`tJn9FCe2BK=y$c37ioBfz*Kf2ckjqSw2v;)bigSPM%g!n1cKV4O6iH z;z2%umN+2yfH24}@bVYzPpAR~Ow}N@Q>?gKFJSTaZK%HwK>P?YngQev5W|HF;%|@| zkiS7RXg=2js+L;*e!#`k3JPnGzoB7`@Hgm^0`xi+?B5KCPm$zpthrkmiZRQeJ5WC^ zf%pgHH3pEKAcg}s#E&2~AU}d=P})_2s->16?{M?9g2EN#M`*Yr`4Jj-AO~UhD^vm0 z%TOLvIoO;#*4(WMSp0q$>h}c@e}c7u+yY`~@Id?yQUmfkhz8X+0#LQo^7|1Uo>owJ zgZvH+Z?K!eDK!IhQwZeV8r1ZhkqY%KL;*BhT5Pym1F-n>9@L*55I=#u#{jYy#8Bad z_!FcC<WCT-z`(%30#!>be;(lFX$6HX$e+-#MfN93tby_*x__YxVBUsuK|X+lkBTjK zYXug+--r6W1>#Sz29R4o3?4p+-$80Xeh1O&3=9lksO<L@d_1k7@CNxE8s1>PgNiO# zQvr*g6N?m(RWN|{oU!F@U4g})51{_c;RE{#<UIzEy&wh;KUj<rqz2?q5Dkjs7tk=F zRvfS3=V=9nEy$nHum!srl9m&TkRuJNf1wJXk&LPVn#ObNxLYq^@&7}Z{~>+_d7A;` z9uVUVM2r!nMv8%f0YqyuFfiPJh84B^-yy)$3JP<u{~>mQ{hyu+Yh^Hi`6y|-7!=8n zMhGZOMC`d+IZ80g=|@oi`3QjH667rgkbNM=1&A0UNDU}{K{Tiiz5sOtwfvVO$kPf6 zQ;`3lVG8yS$bXO<M6vlV9^yl&0+1iK*mJjPVDaN)s2>dk5q<>O3G(9>h!`VC4akom z8dMi;fcTwiZN&f~o>ow}g8T>#SFj)BlR>@&xdhFRAaQV85mi3Kfx9&WOPk^e)Q=)U z2tR`C1ev@5BE|?(1M(w?2KjLc#P3w|qm3|6D=1t+euRcAk{_WF1<h~pv<mTOJg8L+ z@+nLeC_cY9aJP0~@#|BlUm1iEeg)YL@@oS`j1i;;<W~@_$iTo*0|^7F`Bg@Qrxg^w zAiqMx7wlJ1Hx1+t5C-`H?oUwnCRqV44U(JT$lV%%CA~g_`tJe6FCe2BK=y$c6(V3i zGlJBB{0E{zc`^m6mRfmIM3ko$6s92mLBka6zj%-jpyesZJs=G73#vb%3KTF^gVb6$ zakmy=@%MA6zi&YN2r`-h<PH!cK@{R|kQ$J`K{Tjc>;qLxEr0(J<!J?lHOSx4um<}Z z<ZY~VDmY$2U36p>ki7iBiMw?H7Jt5g`ttz9Pay9xfb0b^62u_>1gQb}6GVgRR2!&T zs`*olrxg^oAb&!`7VJ-OjAfu!k)Sw3jbDTUNE9RZAU}XGNKb<^ck2l({(lMcKg6#f z<qUtIY!`8e|3PX%bt;Gk)u}pAd20FpfjCbqD9pkBhnfv?GsOR3CxOEQ&EHV(BIGq( zxLX-YG3(V=P(Ln#_y?>3WG9H>AOZ0sNDU~CK{Tj5R)MOemLKm(@U()$734=~xPtuz z@gp>kf*gciCPUIRQ~}h>P##n{*qjqC+^q^&{Qes1_XQAtg0+C$0%9mgLi`R=1M)kF z2KRrUYN_S-J(4`FpzsFy9U9(XHzP)7AbAueev3inGosB@;L6<^fW?1rp#E!s_yy!G z29SLq28$HLe;_p=|AA;w`OE@UOD+E`km6|tg(=8?&@cu2uQU(Twg<Tc&3|Btl4J!i z4H;1erFQ{0?$!b<etZk{V+zDSU;{yRf*H~fKZ4YN{0O2!>Guhh{WwROrxg^gAU{IG z73{}&h#yc=B*-uDxCF~1P4a;GsIxpE^&8x{Tc=?0`#Y%L6CnNsdl}>w5aSI*j1i;; z<aZDa>f2p_h7+~ow?l@f6%^hezcWDWMD{y$1O|H?XDC2J2&xL?*9dp+)+1Q_`X1_6 z9~p3*g1pE8vKz#B0}*2csR8*FM1$H=C!p@3nqOskT0!9p@+&laQT&P=(ICH|$8!c$ z0o>bAKFALs4AS$*oxAl77XN>M`Ck^v|4{Y;2+asm1FDNaG^j4x0SOnXwIyTZcv?YW z4)#CPY>=Db{wzr@F3C?(C@v`~$%k(K1<5b*;BHkZ!>oJ0K>eg3hwu}~4p3N3frv4J z)PUysL9{dj1H%G{U#aFN19_g-4p|=X{46va!EuV}r!<J4pc`#Lev<LzZZ*N;r>{^y zeSx?i<P`>x9Uw-AJlLO%AT=OAfoPDQN}y_~l}=d{cv?Z>2#P0YIAZZr4#ZD6AeTY% z=M+!wRu?RO`UdsW35ff_8bEe{7!C>$KY`SM`~;#we)52-rIw%WDDbp`!V%;rXgFf? z6EyMVKvN&YUp!vitsz+a^&RT31rR@gyu$#p2gHz2g!l`j2IMag4O&ws164~ce{E6Z zX$6HP$Y0Q~#O5zpWI<yK;;$Aj?$!(}{`vv+R|UimAn!1M>;W-8K*Sh9YC!%1(I9_) zp|Zbvlz3V}VF~gVG%T_Bs}$<5QWSsv@#1c+!Q!u<P=5s|f#U|`9R`p+AjS!Z7$Zmx z$X_5D<gYUj|5B~INKxi#1%)NZU(m3`>Myv*pgseY871D_trM{L>lf5t8p;TNf$RbK zYX?M(5u^s>FAxoCr!9f_mumhBQQ>I?g(b*e(69vi3tX0G<|bBv9E0Be2AB6BNk~xw zVnLOG^?vZ?Ze4=KzrUgWl~6(W7i2$3?+S<*BS;O%zaSbkCprNV4pj56iz-hmD2ze= zg@!TM&0znQ;`1*^65?MF3*=@H2F33bAMVyOSp543>R%33gnvQygY;EE#27(pK>h{M zApbT%!hvf36;b191%)xlztAuS`xjBqmE@->B$nhO)o~WS+^sU@nDzEwsDExi+z#>v z1IT<3!$S@1M@Enukbgils7)3FRZFdM^NAWyD<}*>{(*)entzH>JOqlL4Zhs1I#~Sk z59*&45VwQ8!2mKJ#E?*j_y?p0<R1_X@{bNwEw%i!MV+S=6ow%GK*JEzKRKWXf)pqq z|7iGex7uLw&wr?YDj;qLd4mCDK8W!KBE|?(1M&}u2Kna?mHpG9!P5!~Ly&)<VTi>) z5D!6o1gX;&_;I)TVDS?J^p1BQ4RCybyutvo1H{+^5n}|Y0r?3;gWADoAbzD<9*WT9 zX$6HN$WPF4#Pm}pD2_5g&H~Fx_;a_$VDS$l)ITzs2>*c02WgxF5n}|Y0r>|+gW_lb z#Gh32kAW6XD<}*>{(*)e*v*JCp|~VJ)67I6J`qfV+y=s+v^T+@yEO-kznGx@`U3F- zNI3(@9uOl(3+z`$kQ$J`Ks2b1E`X~254{^6WIjkeIT)muLz|}+6qX==LBkTwU*LX9 ze2zjqxVTS=honHT-T>~_1}y$!hWhIa#1CMnf$RY>T(lwn0;v&aU|;~zps`R7s9I|I z>wz{;D<~{M{(^=j7JsF|{gsB~ua*Gr)+t#0#RB!$5{Mr_-eCaQ17gVNK>P(#1M(M$ z2Kh??s+L;*+M&bK3JOb*zo21>#a}saf8`+giy@G^bp;lGu|oY-1MvgMI}9LuK#U&{ zF-DLYkiS4Q$X`FG?5`=hJguOx1o;aZme~B2g76qDB|^%=nn3Q>Jy`t42K8HnE;xQb zUSa^*1!7!*h%tiHfcyrcL1Q5oAbzG=*-@a!(+Ubtkl&!;iOp|Fkp_!3h~It$a<^W< z;x~4v-%RunegoMB^4kW87$Zmx$ZsGT<hL~tKU2+bKKeYZpzs9w4H}+U{8oza8;A*V zAhdm462#s51dHD|pnen3NB9k77f5RlM2r!n2IMyo4f0zD#Lraon}z{TD=0iceuIW5 zR=**84i<Bu^6^6uck2%<e&dAt?G3~qATKe1>;f@b48Z<n1gQb}4Mc<1a;8AlQmY(M zFyv_kg(t{w(C`HN4N}U3dMD6=0~$|=dJa?{K;)rS0)zu{JXCE?Fn6m(1!h~A3+nGD z5I=%-fZPFM)EGki4N?R0H;7hdU|@)Vs->2{C5(7lL17K@H#Dq~{0-`*;PW>`9_nuh z2jqCDzePg0TQjiun;YuyI}ksDb%5LfVuTn${0&kA@;8VE`8xormRkP)V8qi33Tu$R zp<xa7HzHm^eE?AD3hLLOhQXc??$#Mt{KW(H*A|E$K;B^h*#lze7(@I8QUmfAhz9l5 z44`VM<*yUQJguOx1o;aZmYDtmXVAowd|2j$#+OMbck3D~{^EuDs|Vr-karkB_J9~H zCJ=vt)PVd2qCx)RfU2dIzZRJAw1UDC<S%GgV(}N;V{o5=%AGZ#+^q+&_=^wfuM~(M zK;B^h*#lzSfrv4J)PVd2qCxXN52);~3R9j|P*{Te1r19~e`P|`VJ2!i)Cl8ly@JJG z{7`?{n1bU5<Q)c(Js`#oh!`VC4ai?08WdkUApWIVT@hl&(+UbpkiVc|iN#-LCNQ6Y zSRnU-FeuIzgmJgNz~VOnsNW>a5Pk#M1=8085n}|Y0r?F?gW6^jAbzHr-!#m5T0!9n z@*6ZfQT>)#l3xN^?UPxOp9o#-1M-thICtwGEPfJ#`soeC{UEO}fb0M<63oH=WCW=J z^?N`xsNa(VRZFe>^~ap26%>vjKS9G0)lWH4KjonMX-YVED^De6-6jn6(*cP4L0(}1 z*#Tl$SU~&)QUmf6hz9w|0jic-e!618(+Ublke{I8i0Y?On5RGtSWH3Mm^=~Otuk2r zB?9%=42T~<-eCaQ17dJkLi`0%1M(M$2939hK-E&qUrQ``T0vn6@)tBLQT+u<e+u!S z)CY1FSgs?2yVU@Te?+1F$$+>WtR7@Oh;aiV#t2da@(+jxjg7pavVTgfcv?YW2=Wg! z48d-O*TtY{QiunoJdm@%atx8&tqxfHBL?-4g%vn1!0JKfgBWWdVvHa)Apd}9kbm|- z{7JR)!NZ!T6%>Xb|3JeK>}I%sK*_B{As$2}f*b~|e=8!nTLZB8NgV1Y9&3c3Kz4w% z)<DD<L25vL0@0v3v>u3GspcmM8=h8BID-5H4M$Wzm6YTo4PSxfK16c2CSdW81k^uw zAZ`bFg8^hdh~Z-c_9G)m4ah$r8Z>^D098w^JoLhbrxg^2Apbza5bS1n9F>&hLq-@u zu7Z>a8ByG=1z7we3H8q!h}*#$K<0xO3bqjcfYgBe1EN9xF@UP2mVfrx^0b1&5ab_d z7-ISd;vvX@6*SE~h~jQ-z~Uz<sGk}j?gx2=0b~b=@dYBr2vP&`6Nm=oBL;{#)zaJq zJDyfhID-5H4Mz+=p${>F>e+~B?$!xd{3HYQQ-~cnPC#B^0NDXzoPmfjg4BTg1foH8 z(iJNEDZ`$p6%>vjKS9G0%}?O|Bxv9iJieG|W&&~^Sj~lK?$$3@=7?mW{?f5W_zPqY zNaG5K7$Zmx$X_5D)ZSYG@h{cl%Ef`F6%>{re?h|%>}EuMg8B>8;Dh-L+MET&nNJLN zD-V{oksQ=-91aM-f$ReLtpy^+2vP%T?}2F0*gyls&s6i9f+J5WC_F)agN7#-zm<ZM zBG_vnCdh%%Ja!_6yOjgWxQ9H{Z%-ip0P6tR1!AN)g8j<~QUi)N5Dn^o#6Z<jtK494 z;%NniC&+Km@WkOac*KEx2aP#Mx#$wh-Ku~k?i8T@I|A_w$Xg5``#=mECy4(*YCv%Z zqCx$93#eLZ`R|4kPb(-)LH>h=DXRZ6%}k&zTQCdO3IwIeBeC4A3$T<Uico*ef%pOB z9R`p+Acll9#9tsapm+n(p!_BQRZA^@Z2{Ti1X+6o4NFvifno{jF$fdpGf12{#BsN7 z!QwY1sNX6;=7T&0I@bcqegmNyL25vL1JR%~`GLxQ>u}*|1%)Rl&Y<Cm>Njvql_<o6 zX-EqS6kmJdxLZ$P@sl#tPd+Z-xB>eLWCw_G1R}-=QUmf6hz6DWXCQv1S{ahy%F_yp zGmxL4;fU%dNF;$;g-E`F#Fa@rck2x-{!)SZOT`u8FOWSTf6ai1F@n^9`~{*xeUSwa z|5D9gCT={fps)n_3mTTF{whf>PEITVEqX{!ECIO;;-?Mq+^sq$nEgg=sGoj7+z-|O zvIE2@a0C035u^s>ClC#4>sCP3QY&xqxbw7v!V%;rXgFf?Q+zShSI{m#SdB&kck3H0 zais(G*9C|lK;B^h*#ly@xI_E}QUmfAhz7-#4^%C+{Pn<{rxg^IAb&x_66|K=Iy$+a z66~vjN|4JSakV6YyH&*uGp=-@ep&)?KUf3E4iH1e1L7x;8jznrG$^iAplYe*ryU+V zt)OrO`3V}1*!%>ItAa}8xROcaZe^&#^p_sgUo{XvfV{&1vIoTY01;yZsR8*5M1$h$ z2bKNR<H^$s3QLf`pkayOuawdP@X&ioDdaSLP#HKQk-JsE0n<<VP(KBDg5w3`6$X$U zAjT1h7$Zmx$WI^|R0dvv_?2p9MS>SkD<~X6eu9Q0hM#g$^FZk@Clz|&JjhQ1N!+ap z7MOlAfci<r3*je_9Uwo=frv4J)PVd1qCx3z3B<2d^OJ=)Pb(-KL4JaUBZi;ypq>KJ zAh&@q$X^{v+^r&5(w`yJUw<He04Zkx*#lyfc!T}Q2vP&`7l;PMRRvTnweppK4^Jy7 zEJ6N)h9!o-D$<H_L6HTbL2d(KkiQs`xm&07W5$;e)L&O1egG+F0NDd#1o%Mw1yTd@ z7l;P=D*&pNTK;<D!_x{1OOU^yVTsjW(AF-<Ybb5qie&EA6<GXc4E5Uvh(ADHVgT6% zVrck6{0343YU_e%(EO|hR4ujqcEp#b6%?Kzzd^$j!*8iYMfpXbNCPuKu7i~EUy`|7 zQ>roJ%mnJM4u~JX8bJ1d7%YAee}UA1;tWKC%0d>XT59=gfgevRC@ew#f`%n_e?dxl zu+Nao`GOSg)(R|sGllvs1>z5oml!~Hffx@UVvHa)pg053pg6ljWxv(<^R$A(6XZ8& zc%u3(z9hLA>?3ed4`zYf2g0Dd_9lh9wFise%%FaA@CU~cNI3(@E)e4YM2r!n1{7}~ z8q`PG0r4}{%Ep)go>owJg8T*zPaJ*&O_mgw6oGvQi#bTT%t+;KU4X@Z=1~7B1R(qe zvJd3H9S|`_kQz|jfoRaUz!ZqTsph|sK%Q1mn1cKV4O6iHKx+n4N(<sslF~uWfrzD6 zq$Wd0-azq&Xmf!j6ym`YSUFfdPa1b?NiAl6w1@gzA`szkkUKy+7eK@qL25wp3Zg-E z-V8{1P|e>qK|HOXum<@X8rEPpL;L_aRt1Y6Q=y)OD1eTQtV!c;or1-m4p4tG1R?wh zvKQpf4u}{dNDauJAR1Ix)Ij`CHGirE^R$A(7UWN8*dqB8(dI&n%L1rBAqt@W^hxJ# z-GjxSj!=KTfcOdIJqD1yAVx_r*zb%WH6VY2XplcsplYdAz6yl!w1UDG<WFeWBKs31 zzR>*&i_`+BDp0(?N#|~Tg2k^+P`_S*_zUDk29Vt#Mnnk2uOKxbzk+B`T@nCQOD(^C z3E^o4g)hjj(C|h0wG8AENV$XR&oW4qBFRt4;BMuq!_1$~P(SW~_y=qt$W9Q$Ar#_A zkQ$I5K{P0TT0qrO%a3<Ld0Ii?3i2Z~T#@_;i6~G!q4^OSm1PhG&~$5%$=#}h#h)%v ze=dOd3FJKnki8&=Mi|7OAT=O=f@n~>m4T|ImOqb#@w9@%7UWN8*dqB8lKrsw6PiEE zAPS)VypYM=8iK{2u26q=K>P&q9s|f;5JMy!;!ltokUv2*$e%1wwbb(GhH#!%P}qX} z2@P9hf1<<}TAUWZA{9A*7G!a^)?o3g8`Q5Q5PyNZ$N;h%#P|adV+5%I`4vQi^5+LC z`*lVHPb(;VL4JjXFT}6K1&QT(kO~wvP9YKs@ems1RuBfM5y|FmU4q4*9#DVAM1bQD zq?`d{FNpC1BE|?(1M(+`2F2+Oi2tcpx3om^w1UDG<WFeWBKs3ZoI?DV3iB*f709n! zvbkH&VDYOb)UO_q2)}~t2Kn_0M2r!n2IN-|4T{qvkT9T{UkjpmT0!9p@+&lak^PF2 z4-x4X;#bfJ2RP=Tsz82?$l-4Ng2k_1P`{c)A^Zxm8|2p`5HUuO8jxQ>G{~<TAYni? zza~WUw1UDH<X33;qWBdWWneK3zrrIHmRlip(VradR+)Oty2cyoUzKQte?j(x{JRDs z#t2da@-K)6wejab!hvf3^@!nV1%)xlztAuS`wfyEAr&Sl&d~f?22H{c1<*2hK`wWz z3l@L+K>f)RgYYNFUXVX$K*Sh9YC!%3(V+a=0r5Z8{Am))(+Ub(kUybei|kKWw1UOZ z{R)d#Sj`Fw4~IPN)*LK;^@aNN2gF|>FEW7a1~FP<!Tx6isR8*FM1#_B2~;h$>KlbP zo>ox!g8T{%U$DQRaSF|ekhF>JS6F_9)vh4FKFQ;5or1-$eo((Yf%psLMFx=FAVx_X z#IGPVAisiWkY5v^YN_Q{fq0%)Q22uU3JqTrzrrFG<PQwL!Xp+nzjowvx9-8>Uw^27 zuR#0;@+Jeweh|YW9^zk+8jycMG$_CNK-E&qzfa<MT0vn9@-H-u!Tv?^TV-)cYOX>t zm;yNsEU#0*-TDNJp8}zNS^;rCSUt!N5W^q=;wO+Ake@&_sJ*KJRZA^Dok`$n1%)HX zPtb4#yE(Bqxg;|e5`(Dm2bEEP(jdn|%b+C%+^s*b_%jUZ&j}DefpviF1u;YtA^rrZ z0r?X|gUTQts9I|Ib3-CeD=2J1{)C1t*q;brqUTAli~^VhITY$gmqPAVg$B&}Bpm9; z5{Q4mIzV=U8A%X7g4BTg2%<r2e!fuIk8_fET0!9o@*^}{!G4Sfd&1ZV>=vj$5NQ@F zseq~q6z5M0xmz8u_%#CR*93^az{Y~?1~J}1#27(pKz;?$pt9!<G+d|^pB>3Ot)TD) z`IP};Cz4;G3xBZt6|_DG>}i-PkY78BxLY%@_%#yhSD$2X9D=;a0J0mzxB(Gk1gQb} z6-0yldIIVmYWcM!g{Ku1z97Fs!x!S$;*z42#1cp*#qcXs5<K*YPzCa<PBC}u1T21y zg8J1W1>ska-5|dnfrv4J)PVd7qCtM$0to}EwG|Rld0Ii?3-T*8eBpkD7f9Ir3X%l- z6~q9!7?Pha6mz%kz~a|vs9#l55q<^P4br&+BE|?(1M(|~2KjXXBn+tLSC=%NR#5nY z{0a?Uh+j)l{eZ};U<rkIFa>fc#E&H<+^r9=_%R0RM~*avA3=74bWVYYF@n^9{0O2! z^-BlD?^N@nK{`(>C|p5)goZ1UA90mQU=JD_L468S1xmXjrQEFyjhN+cEYz=GApQb* zkpW~kh|!P^_CF&?4alz`8Wf)eP_@*`r!pBlt)TD)`4t+zNPdNtHjp?&i&IdU1okvc z709nUO1WD#u=q6&>emMle}TNn0J0mz$jN~C6{H5_R}c;IYYbE^wfxGF$<qo7Uyxs+ z;S2U_aY<1cBK4yCHMtlp37SI#Ge9nesEH}#ZVkZV*LbL3&p`YI)&Q~_#E8j+_!XoE z<W~?4@~a0_Ew%jmBa^2U6uuz8Lc<sASI}Gq*c;GUPEed7;uY#w=wv9mI)-xY)(R~C zO@R7$55#XEZ!&=F2QhrIApQlZ0r?k1gZAi{K-E&qzb~?QT0vn9@-H-u!TyD|_~4UF zsQ!h^!diwX>Xwvqw=Tfq-z2Di*FgLR@+Jeweh|YX8{%J(8qi!6hz9vr1*(=>{=JaR z(+Ub>kbj|J4E8U$kpT4ts$Zcpkk%no1tcANRB*SRz~awjs6VGb`~>nI1IS(wLnQ~| zPmmgrKS4C8{~`cYOD%sM$l+-Pg)PXR(69yj6V~#Bc?64Jjg3Ilj9_nrm>^d}{QIJU zyY&MW|E56w+XC?$SOds@5JMyv;$M&&kbglmXnyz)mHoRRm!}mJ#vuPf!x+iGW+r(2 z3zCGkh(Sz{t0DgFspM{zXu_<2Qlb7Wf%pxq0c1aj!IB5@FGvl@zaSdq-#5^(p;r7Z z$m3}Rg)zv#&@hJh7upoW?q9ehxb*~TDI%*gsN!yQz~bLDsDD!+egk=v0c1aj@dYBr z2vP&`FNg;D_YO2{sO8@Y`8=(lFb4S-8pd${g6be-e;~?b&?@uH+*D9{hBHB~hQ#lc zD(=<{EdEW0`ZpvW9G74XAp1d#8xS!@kQ$JGK{Uv}XCUD~wYF4A0Z%I^j6wc|hB3sy z$r&k`&`aIW@-9e1As$V>qMEyP0v11JL;Yw`fbb*8PLLlDK*Sh9YCv@?hz6}W-vRME z)%+M!$kPf6SCAi};R^91=-Arw6p&NEd_;UgBp`P;Kovmy2NE^htsAiTGY9HVg+hcs zLH2?SUjq?i1gQb}6GW>pFfh!4_@8S2^eEzK1%)lhpU|)c`wMhuMM^TNKT!M%k_3Ae z!~nS%l5Tg@aJSyT;@4cLUwMiUeg)YL(zymA#t2da@+*i2otfSN2?Of+wV0<B6uuz8 zLc<ruugJ%-qNd;U)Dn<4p$g#MhVnsv0AY}xm|E^uhGxuiIS=OlVkG}V*%Kf%BS;O% z{~%h2fq|g{5-wEpzfK8HD=5st{)d_ka&vrcHjaD?mQX;KXQ|_EwZP)Xe5fBkK>Py= z5(bc+AVx_E*x!sGH6TBNXi&Z_fU2cdSu9Y>)9O(S*;4@xS4bQe<>K%oSVAElOo3bq zNykg-xLYHz_^|-$$14#3fHi>Z1Tm(RLi`9)1M(w?2Kg}rs+L-QG$`X~1%)dp9--k1 z@gt-NLS3^2OS-UyOwck3mcQe3vQg9{@_1TlPEJ8$Nrpl^j0N%|2!qnho_g+9ffmek zUIh)GFOaYRDQ5t=7sSXYgM<%A4QT%)hz70c%7Ln-R`{@#^R$BE1Qb5dI01(b!f)xR zC8>F3pqpn>^B~h#AU|0&aJQ;p@l!R_PbVPm2YH17WCw`hP!91ENDatOAR4rv#sjLB zT7J4y&eIACN06VO;fU2wklSWb^U9!&4v@b#G;p_CVDVQC)L#oAegJug0b~z|AyWbI z7f21rUmzOPmXLv}rIx>TRPeNd!V=^!Xjr28E2Xpm>>Y)87z^Y+5C-{8r;)qW2aDfo zp?<4@_yeSz0c015@dF~p2vP&`8;Ay_!!K0!+muS4R#13?{00qAG{5C0W~V~(7>osS z9|(i|wxW@{H35s?>Y#p$s07CmNI3(@E)e4eM2r!n2IMyo4f5Lsh@Yuemy}fTw1UDD z<Tq$|;_w@&feZ5;G*Lp!AeAQW))FlKtB3l}q6*<ZkbNNkZGea|g4BTg2ckjkqBRhI zQ_X)q)jX}BFa`M!8m4IeD@e~RC@E5ihtMFmfiNiE7Bq3U_F(Z>1Jqvv)d+uq>;dVU z01;yZsR8*5M1#f{dLaI#n!j{vcv?YW3Gx>-EK&WHo>~%L0`U{LorA@H63yJL3$XaF z5$eAW5Wj%D#Q?Go#K@=t`<W4>2IM~w4T`rEs9I{3CoHu*t)MUk`41YVsQxP{C<T}O zpvy&Ig+DYsPHE<D-GRklO;CTGfcOFA9R`p+AcjjV#9tsaAb){qP`tT7)l$n}4{CW@ zL178<7c?xf`U{lXAU;IRYdkI7t!J?Ktr_aKB@lmryu<*q3&c>UgZK@k2IMyo4Ju1y zplYe*w>@<{t)TD(`3)MLXnreBO)N^z09D!Xa3;uwkhWS!3wP@SEPiW&`mF)t53mN1 zU0_B%#BU%qAisfVP+RQ>mHjrSo~IQQo*=(L!xNX^Kv4(x9W3@h<q1nGck34{{%eK$ zF9G5gu(v?=ff#onVvHa)Ape1AP@n1wG%TnUcNGmht)MUk`Hul&C)mx1wpMXLPG$+D zl7llrE`-EgODlIPPb+3SvJL7tn+9+^fi-~a0x|YL#27(pKz;+!pt#!twVzski)iF& z1%)TbZ_x0><u`EL!90o_cMNUZtqNHD*ADfcOe4a7Ap1c6y8;no1gQb}4@86FZUV&L zRI3XLns{14VG8meG)%$%gE#o$Jp)Kw!5d)c;%O=Q1<=iYp!AA}dx(TWJcI`M4TM2z zF0^sC&cG5b6QJQ@(u4>XkUK&8_CUlKL25wr4j>w|Mq>jcyr>o~5zRcUptt~q3p6gE z;ZlstpI`}v_%tvLaw`af{8`Y>-Fg6vKPN){DbtMbC&*rqz6B65MvxkiKS4CepEDr- zr<y-)T6kJPVGHsnG;G2COoRIp67NXy36fDjmlx>ZZhe8pkCUK&WN1P75o9OGj~x&( zMvxkiA3-!|ElLB#?^N@nN-Iw*C|p5)goZ1^kI;+?iYGKb#ur0;2~`0JhYcOvtsHHb zWz}S;KVLxn1o9pO$X*bmpcU+QMvxkiKS4AoE>oatsa00-wDGip!WQIDXxKvhS(FNj zGmuljd?bHDWE9dMG*|`1p8=iRtp-^9IR)y^3lKknb%5*zF%sG!{sgH3`4dEg{OJQ# zOD%u?Y2#@Hg)PXR(69yj3+fA$_`>ijC{`i9MN#*mle;wni+`s={d)l7H;^|OK=y+e zChZXag4BTg3!*`DWfoAi)bj6zcAi#H7=!!^4P&r>5q>KG@3>QdP#~v)<)?IUw>Dt$ z(=@1`ra;^eRu8fR#E|HK_z9#2<R=gfT8kk9RZA^DZRy}?1%)HXPtb4#yE(o9o>akn zBtL>A6wu{)y184YVDaO0s2?jJ{sDQ70c0nL!O{uwBS;O%k02W4#~)Po<AP3}R#3Qt z{0I$Ku%F^fQgaLP5_3Ur0b$g#2P&z6stTlLO*ePz7A$_90rhJN#9tsI89;V}7%w1V zj36~2zk+Dcxa0$9xKJxTTe^5!LE#JXD>Qt;el0=rDaa3q_=LzPKq!z?!RiBgxLfaF z@#9RWA3eIjaR*ipvJ=F(0uf^bsR8*BM1$h<1jO%Dt49jDd0Ii?3i2Z~T)}RJcmZCV zfW^@L8D9+bDO4FKEI#ybx3aWj)+Mu`el_Vv_!VR~$gdY5VvHa)AisiWP<(EHgaOt3 zn$yG63JPD4U!ma(_7^NwA~pXY;>j7g$oIV={127@&HJIq@9E`kU4zB%i=lou=t1}$ z<Q9<Mw?M=gL25vL2hpH--T(;`s`)*jm!}mJ-XOn2!yD?yqEzIwZ;<>5l2C|G22miF zLh8_%KJL~tSp2vI>PL}Ygdah6f^;r{h%tiHfcyxeL4KS9@jKQ0=+MX03JO<{AEDt2 z@nc$MUP@YKQ8CgPKL~%qB^Bb~OpvP~{{7R(-TDTLf0si2%hHGNFUWq7&N&b<Mvxj% z+Ydy8#)N7h;XpP2TJ-a@g2EW&UuYPk`4_gb58@Xreg>@pg!>w%8kCP0^mDh0bYSM= zWl(?rf%p;RT?UXlK#VE<;ILo>sR8*LM1$^@Er6<}R=I32fu|J|)*ydF!y3)suvLCI z{S8_V2=_NkHOSu{6S!Mlu=sm9)Zbqqegt`!0pt!4W5NW8zd>q1{sz$?e`i3|Qp?{u z6M0%eVGZ&(G_2A54Lgw$r@z7H0Kz?vP!2Zd!vyZu5-fgS0rmR_h(AGIW&pVb#F#J< z;&+f5kl#Tx=swm2s9LJ|eG*SAD7-;_hlV%U&4@f}Yy|TTC?2t<byVLYG(g8mXH4X7 zU4q5`D`EbJ_!Z=B2AxS@e=|&g(2O88Ape7C&>f{QP_<O^|74z4P?&@L4>cR)PlW%? zOfsPv7$lCx|6m13g&dd<_6*ej4wJZB?_lx&DwzKveg$jMnGErN1B7M-sR8*PM1%bg zRZA`Z%S_>E1%)}-|4_3*{sj9!FSP<%w1d+Gs^3A95MP5>V8=uK`(hGzt4Jqi8Mhkh z-v<!Cfwh3_2Qf;ffc?z~QUmfYhz5<(ML^Y3%fA9sd0IhX4Dv5DjKO|``xj?igM0}q z)*)<=yFnNfUOkh!TWzrTc@5OhS0MfaDQ5t=0mR6d3h^^Y4am<R8Z>U_0aZ&aKeJ5Z zX$6Hd$j{JlM)fnapa%H^Gmc?JI>^sZh0u65n8MwfgT>Elp?*FA@gK;m3?Mgv7zxuL zeg>%l`58om{A>eNOD#YDna0x!3TKd?q2Y|`XIP;I^$VuI;e{H=<8alWFuF2@yLAp0 zf3Ji3`vAm`An!7O+yP?5Oo#Xzqz2?~5Dlu!OrUD1<?kQUd0IhX4e~cMtWo`qR62wF zg6VIt0z}3Jb3s0U)O|Hmxm(X*@%wtH-}gZL3Dy8|3y2Xh1LAj(8j#;Xv<3qMgAP<J zwfz2N22U#}yg`14hBvC;kxFLleg`W+_#Mmz`2gZ~m1*3qf3Wy{1Jv(3ApQhv0J#Ok zaF_}4J4g-4?;slFcMYgoYWe-nOrBOyc!T^74R46wbF)E%1R$q?`H1+2NPre=!4*LB z!kKB@tvX$p<@ZLYKNmp!1U3_7FNk3<3*t|Z8c-h-M1$JqGElYD^5>aZJguOx1^E*i zwqSq7L%aj+F+<`D-LIfY7c^yHy*bmlTSKt;cN5gV6Ci#Ad6NNTKZqeR8{%J(8jycM zG$=oFK-E&qzZ+)rw1UDI<X>nQgWVht8sP#t1R7@uzk(zbkfp)u1!i!!)?o4D7N{Rf zApQZH2(lBz_yZAR1gQb_FF`aY4S%7sA7{+rX$6HV$dAx)1-m&uF*!N4xESOVFdyMZ zh=c;N0%$mFn8Do|gQZ`&73$BJIpBB$n+dWP#CQV{V+5%I`4dEg#-eXP{7<!hWyf5e zR#4c2{0R+Pu)m<*z>#(#eg&mn7z^ZP5C)ZD0W-N<Td??d8`Qr(a}oXp*$>ip0V2i- zQUmfYhz5;CAAy7e)%=??kEazB#vuPf!x-$}qSV}c<Z}@a@d}YqfKVW(g4KVS$=x~! zOWNH5^`pT&gdah6f;4V{h%tiHfcyxeL1QBuAbzKs9|Pv|w1UDF<VR?@g56w{nwJRO zh7RT<`w=9gfTREvk5guGw;sXb$DL3=ip)p&5o9OGk24@*j36~2KZ0nGAE!Y4PBlN8 zEZ}Jcg)7L9&~OF&DIRI|666PjAHfm|=<+7Bxm(|0@#8M2AAdmn1M(UJ$W9QWWdYdV zj36~2KZ0nGA1k10sa4J@EaYhgg)7L9&~QcaBRp$@#nAi-%9>yg!&HI7;>v99R-SIm zI&?SGuTLQU0(p@EWH*SBvk>A}kQ$I*K{TjtNr0-QmR~s*@w9@%7vxuH_=5cvUz(Sb znU@W63Yd@ZCqzO4Spl@Xt(e2zYJ$a|d!YV21Mw5sOpv`GM#3V9KS63h{shsW^40^Y zmRkP&vxuh^6t*CLLc<p9uXxZvO-f=(VmzdG3yLp<UlEd!h9HtcsGlX~a<|4{@$){Y zpASI%2l6Td$PFMy%wmY2L25wh7es^F3noyt)bjI>#XPN`a0dAq8qTPGHa3F#8oiAK z^EXHV!sj3!$o(J;3a34Dxm$a%_<cXr?|UHr1Sw|#xdp_CSOW1oNDavEAR5#L)`6;} zmfycD;b{ehH^}eM@P_yu9^qytFwcYhf*I!^d4+f^%E9KO%;Rp|gT?O$pnl&0@h8a3 z3?R3F7$Hj`eg~-m`5i=q#&I;DYN_S-4@-GkLE#PZJ2bq(Zif3M6XZ9Li*Us|SOFs9 z!CZuTp84FZZ?O3NAk^<$ApQhv0J#Okh*$>kJ4g-4?;slFcNM5wYWe-kGM-jYc!T^7 z4R2JxgZr?sn8)RRs3JrNKm|ZPf#}&XpSxA22eV8+1Py~75dVTTfZPOP#4Lw|0Z0uf z3_!Ft0|SE!R4ui_;Ky>FR#3Qu!T=iXs9^x^%MuC$s3JrdKm|ZPfrLTA0`ArjEMagM z8U}kH{sn6Qxe3HDSpf+HkQz`JfM`${Xh79cD-15I;AsVgJ17jG;SLT1cs|c8E=ep- z&dgMZkIyUyvp~)RtKnJ5-MVH1X51cw`fCcr4`B5mdq51Hl@Nb{)PUCAfoRZrR{^M6 zYWZu$N}g6wSc3co4NI__k^PmNS5lOtkXa0-L5_pgRUHetTMuCI*Kw%7av**H>j2pU zV!VKeF@n^9`~{*xYm{G5*<UTIcv?YW3Gx>-EV26wbQS^BYtSPL!0H$lakpN<;<pn} zzj>?z#}CL$3?REei~|rcMvxki-#|2IocRF6&s1wO$E@aQ1%)TbZ_w}ryBRsoDpE4j zGfNaQiy;h<^T29q7IC*~Ou|fyC!zjQSdH)($R3c!1rRYtkQ$J`Ks0Fo%^Zk-spc=6 zH9W1Lumt%F8kS%;WBLmcX%Mf$VhvJ;{8+@@YJ<gpr=b30ScC8%$Ucz&S|DPKAT=QW zfoRb9QVGQ0RP&$0TAo%=n1cKV4O6iH;)_dQ)A?XN+`lCt3D6dFxHMS4WHEPZ50-NB zEYy!rApQY)jR9mQh>^1v>~BVp8c@3!M1#g#QlM(7Ri1FH<7owjE69(~a0R;=>_@Eg zA0R)1<~|@a$gLm@YD0-E;ci`n#h>S({yYQm6G%A&$X*a5W*x+zAT=O=f@pC2AF7sG z{`|3yrxg^oAb&!`7TKRDWBRD^39kAfkqTylTn$OPTb6LQUcutu^HBfpf%pxq0c1aj z;j$j$UyvG*e?c^8&z}iYEw%jnU_DPOD2ze=g@!T0ztE{0P@JLq6*RvCidU!tXuT1! zl)Lp07JpuV`f~}yPay9xfb0b^Og2FL2~q>{Cx`~cs{&LlwfuQu15Ya`Y(f5nhApx` zVbir>F?7FX!jdt#Wdm|GBwl|k<!)8!#Vm6#Lj5}h;y17cko_Qr!bXUHL25w$1<{~* z<$<cDmVftb<Y@(kG04BrFb4Y#oL}Lo7~&69|AObRK#>bq1&aSU%eY&8u=w>7)UOQ? ze}TNn0J0mz5ZDCqD@YB<uOJ#UHt~nbeqFPPrxg^wAiqMx7wp&K)RLV1<is4<p>ZI8 zAo&$0tAI_N!*cG{5-k3`4)t#V#BU&PGJxy{F;uod{0mY8@-K)6jgh{9h7GmiR$wzv zD=3UX{)L7y*uTD|IVG7%mGDFIK>qc0at;Q$4TM4b<kF&|)I7u(#$#b7uwIa&KT9BK z8KmyO7M@m+zswmJ7=A$g3KGvvDlRF?%uCnH0GS9$Kh9P$0Y&-gMTxlzZkai$#R?h~ z7G|0;zM08I`NjEZB?@7g#ifZk3c)3%DVg~ShDLe@F=5UznR&@Mr75W~=thFwW3!p3 z6@)c5^Rzw}W@6Yb3vs8zR-RT62HDQTz`(GXfq~(~6xCKxnK5IjYAZ+_<j#hz5Pd(P z{+qBF95-OI<30VH<9(fiLxMd0+(8<k<rh3{Aj^Xqu~2!IRoty_pyoiefvNA%G|>Wy zf3O%R{6LI^U0{0|L2ASp7#Kh_=-d<*s9I{Ji7Q)qT0!XolqR6*5bW3FqLP%<v|?Cv zfyF3{FLWcpX1>|N(+a{jw(zw65@uqEmx06=C=6g26kjklG7XBaIa^Wn!QvPsS8zzA zH9-cF21FPb7?9(#ATc>xK|`USv^YaY!9oEvQ~)*_r0>c$o>ovi*f20Kyx9tl2e4av z4vDmKfmK0>G^kraVYp)}Pb&vR7)*l9aR##x1V~KD8Pscor2m+0Jgv+O3=El2b2dTK zDo6)NEr=!t3*b=nAeX5HU5bf;fdPa;;xgNKS_K&x7+4q>7!0-{{MoUCrxoNUP~Nsd z5|4ND^l^=Madq?bb9Dh308QWVnfXbjX%GRByKPo;x3X-9m<JMdiG;W#SB8lJ6h=Nf zcv=_i;AstDU|;~*1yU2U6QLf&2Vq8NU^9VT2ohmn=s_|UA_5^n_Ci<)5}O!8mVp7} z9)1P}hB6r@22KVB2B>w&N{D8|@*^=CVBwFf7UWitdqCj>qInr0?t_Vg_{i#!*&sD8 zJ9%0`>6VRwfk6ZsMj&xybs#r_%m;~q<l+lTpeG_h(qnuww19`jYf@q{avd0-mXip% zaR{nDEfb}Vj8D!;EP|&5sG6kGwBpPvkd@#(6kn2CkOrER0*gS@{Mp6R3Q7kcx5Lr_ z$bARaa<`uF41uR%SUM_~VPXK6g^)55Y!b--AjXozBH*$d#D-x;v;qVaK38_~v>t#d zK%znRB5~nNP}spaNDPpAn0r7ps1F6AVd9|r9K;8?7es^PVcJ1z;B^Ob-a@K7WY%%F zzJcaJm_86)0Zp?9kiq~Ijv%=;M}$COzz9+Usyje5$bJW?T9{uz_Jh=ugF$-V?B;0& zg*&M3fYw)#I1cd$a&>g^b#nIfbMuFo4pN_+l$@WET9B9yO;jMU%wlv=NSeq^D$U8v zOUsAohKVJYR6>tJ2kFgCN=__J%}s<I7!MJHG~JMr7}!lE8AYjyDY;3>NQQ#c!|QWw z<yvl1G4kD)fA;dUg2LF0fq}u{0HnMEnE`VnAsSaX4b#WS4r4*+IqecHHG3fTKtvEE z$X=0s5IH731{M(i|9@0@1P{RisYCGav(Vl9VlTu#m@f2u_2D{yi_Tu2R%~`)69bt8 zON$^jG6ty^>5ypIg5-aY7_u6CY;?E7)Pm|d5Ss;5*nk*NjBF272u{K5E!fKgum3?} z9S3<@L3sd_9?l$wgbhd>q!FYRgjqgIgUc_NI7ki|2SDQxBnDD5ONNOdl!1W(L`Ohr zdng?UrGud~NFJmQgh6^iG%*-g*ueB+ONT7`A^wA@fzcp)ZJ=`Gq(e{`fiS7zl(K=l z_0DdDn_zVVDBKJ{ZJGl-tvLsHS`$ERIH)?7!#u4l(DVdyH_Q(p8Z9}1gowf*b6|FY zXi!=J(Gt)&0*xDj_@Mb$5FLqRDze^=13azVpmWvs^R)KtgSZ{6)B#L_%P<HFLL%oI zWOG1vkm`o`+@z$E{M@8uh|w5!L4~nWq^6~W1g4gNgNS%THWcKK1yDIs)6$ZoJguPe z8RU1B6A<%3=7G!y*$KiCDZ+U3;vJ~nAUz<x3uKrWJQ)}mK(sfM2K5O*d{F-nL?g?C z^nox)FNh`vlM{Xu4nh2fZa&D~6Hqx)!w+N@D2zau)NpFq$lZDbS|5VUf#pR|_~?TA zU59yEe;kJ7MNk}p)WjU;X}tl}19CS=42CJmi!eJuv?(;sKzR|w2hF{JXwVvP5bXoA z5Zc}aiGkcJas-kWLFI+SA&A?-N{P&iFmpgOscwMhMd&mJdf0&7frB6?E!{bSJ1yxP zg~*YbmR#=hw4Qjv(`w7Wz;NaT#0-!>_8jGD1*I<#CX~i9pmu}23evk!hKT``2SKzi z0|Nty2DLjuG$;>(Xk>YiJ`e`!{c@706;xM)%7&6N2={>GBYOE;KzNI(Ah>M6);9yG z`+>zhpz;!AZzj||pt2prPlWQ3<w0hEFvvY1nixz@e6BeL@gKVRAbX!c<w%WBh2!MM z8^|4?@C9K~!}!f6?$!XL^a(3hKw%8Zr!S84v<94jlq;b41=+RcG*4>^R1e6{ATb!G zq+Eg738Fz`n;;rgu7GGzxdNg=<qC+-f>{VHS3qJQ_vV~{lq;aJ&*T`y?O>%umMbuG zKs2dt0GBJU&J)yKV7rMRNKJ<-rA#d*Cvm649H<<r>5%6XPb;X80m6jJj}=fmK;8qT zgGDk-44_~J(M}8u3?LeG*$;>Yl_MY;SstVhgh6`aokQRu2jU+&$I}XGZ-B~^hKmq? zg2X}UL4F6}Cs6xwl_wsjAo@UhKzc#;`$63WYTtwSUQj-$o&xca<w5#D7^D|O6NAZ# z$3IB!M79HDugPhMA4rYIg45*3BghS)@C9K~!?<P(ck2ph+Yn?9tULjQEvTJtafYXL z!5K(-0*YUdnjIH-TK7Qpfcy*+gJDX_6PTSK8niwMM1#r`5Dgk50@0wk2@o9uvk;nZ zL1G~H?l}V~Pe5f}%PEN4!Ae018LAe{hZ5+02ADY@np8Ky$`fcag{FN5P+Yg1g`_p8 zSKt&VPWC|MNKJ=6=ZH^-KcIGiEC$)RScZuKRE~gX&{#N#Heq030MVe}2hqs#AblVV z(!1pvPb;Vl0hJ#nHzEE4iQhTL(+ct{2op-%9p@nWU}l2s1C6JHXwdiphz6A#AR1I| zfM{fSkUkIw*=ur+rxnyj0=ehQ6^OYYagaQy-UeY<-3^+r0EwexiSrPBAaRghkbR)l z-5|OU8ZMxA5r_|JFM()ed5}I32I&RS#9(sDvolEUM79HDFUtjpA4p9{4j0HzM>QA7 zk8_awL2(1Zq{ffVHtyCR(6%th99UThiWgAX;&PFvb<IUcSqMrSAT>Hycv^X&`2ZAN zATb!Gq%4Hl38F#mBoGZM3qdrfECkV@vJgbWCoG`l8%PY~-V+xgWg)1%4ml5TJJ@ZY z%m`Hr=0geevJhqth$hty@wrLKpz)I=sM+XY0~N+fk(!1<eWwYRAn6p{K#;vBpmL<9 zVUSrMvq6|p+lu8f!hVpQOQ7Q<AR5#M1JR&y5)cg<Cjrr*J{pJy$%E_yVUS)BO$;U{ zoOU3&6WI=sy&s@*^b9AT?cA*_(D(tl2bSkR;Q~r?JFf7wDqMx+IZ*uoQj>For&R)~ z2jp&$7z|UA=U{e%XwVo1hz8|35Dn_jfM`&E21JAE5tyAIH-N-I?zOoJ$#bA`!QnE* z?O=68<~f)-AevM+!1Elm0RnOt*lr>Sa?%pZHAI?6wgP0Y4OEWQv~=bg@%`!ws2w1? zL3S>Mj)#C~(0B-l2K8e=G$^luXi#1Q(I9z{J`e`!Wx37M3aax#^?l1-h`&JMAbC(- z0>ZHR1Xurs<2pniNDoLa$R5ym2Z#pM?;sj99s;64^*)G3mIvtrVUS)BO$;U{-u585 z6WI=sy<ebmq{f@U4f5j+<OWdqf-tFJyk!S>YsFPWxWmd1P}qX<;}4L#ZbHfrQ2c`I z+H;4ewFjyP<Y$l=3{z5m!0ZIkps@%L4JtoCG^qRl(V+4JM5B*~fW$!Vt+@#)KR{)i z%XOaC1ZZ0r+)*c@&W4!-qDgf_d~Q;45_~opGQS)jkPq1aj>T?Rm|>$yO_!kdeaJ0D zJR+M3ilZK=9I5G2<~C0&Xf6$e3C*XSfZ74F8)WA)872k~1_lNY4JtQ4G-!MTM1%S_ zAleN{9;6S1L3*#;=V=A?X+Y)4ghvp6fy6=bPqLU=K==$aZgG_-5w{`wKzcxWLH0#K z?Tdxdpm7n9IB4DzL?g?C^nox)FNh`vlM`<|cM$GGwgY6Z3sjEOcx$*re!PL)0196a zCN+#*c5%1vfW`~R99Ve*3R}>+6_2|-tsCw_$`erhg4CRN$kTcUst4p}kQfY8Ql7x< z1ks?iz91U3CJRJ^=0!m?XblvIj)PeU&8HwSkbBSEg_I|tGH=Rlh}*$RiENL+%mLA) zx&dCE(4jp7DnF*&!<`P#K;=kHhcWkwPlp`$5%z=9!EzZU2GDpVhz7McKs0DP1Vn?% z4G;|~UqCcS9vm;w_zQW%(<*Y5rxjF&U-$?y7i8v}`#i0nbPd9U()J82?ulVwU;x<{ z52ZolA|O7f+yK$Y^2qK1&0T@oNTBkp<vGGVAT^+R8-!tXH?HvzjRz2YAUz<zfb1)U zx}zFOgT_BV;-E?gL?g?C^nox)FNh`vlT)7EL2@Uu9Uyx}9zy&;YB~ydNPar%c}RYo zgWL~_8xSTne!lGHZsmaH8<07$vJez6pt2?85l`!$N071*lr}(W_B`Whm4WI3g%?N+ zhAAlvVRnLO&>jyE4Jr#kG^i{D(V(&rMAyJ9gytoX7|6Xh9zn`NP<fs50OEGAQX<Pj zm^mPtR5yUi!sNsf*bx;p9UI=Vj<03GV@Ns$`wxi##mNn*9LZ_;2~R6%{T&F0T;&7L z4TH=>G9Jzpd4jMXq-KQ-69cHs0nwl_ArK8(1_`3085kHqG^kAjqCxU7gFt#8JVB&? ziJg$OW4PK(Jy`4ojkSWz1*HoR4QhLXXwX7R5REL4Y%i$%1-0WqZ7dU{IeU;AP<s-D zc|JhG0auwP^As~2=0N>BA4<1D=^0RZ7L*3bgX{ufP&j~SVlb&?9w@zBKyoLt9Uyx- zo<aOTYI<>bMt*u}ct(DlgWL~_8xSTnewOUzZWV#%50E*qG7pqaKz%ol=RB<&o<qt! zP}%^gnev{eRRgLA6kZ@P7^bAmgV_n9L489I4JyY#G-w|`hz7OEK=cBbh0rn&BnEQt zndgu)4^%EkJcYO&tdz(y4`vRCCe;nj+MpRUux%&=D2$YxwY4F;J|O+fkQY3ypgg@2 zy6*!<gEWHFgJ@zfuC(uhW8VjC?JLI%$i5Fye5oMi^@ao3(*w+X2R=aZ1}Hc|<ps!% z2`s!|zkt|(pz<I#Ob?6(iNWxJS3IqtbOc%(1i~<J(B1@?|6w#pZUQd@c;5(!O$z3D z1#vGadXUv3&k-PtV`GEd+pv$jH3eE%fYijigxC)YgBGZJaK#&_oeR>3jA2_BK<0xm zvK)vF5`&pfEDh2J!XUjM`T^8kAos$|0EvU-iS-jmJu(KRZ{+X?nT0HmkBuvQV0zHk zCxgoLC9ff24O0W7LH5SHg~&1S;9n>2^A4g8q!*+QL=%H?xfhn-(AS#hyn)z*%?^-Q z$}gT)&>A{W|KrIY+-h;T4VQaBW`p!Ff-)M20mY#8G$1`spzeYSgDIFEeCZmj5Dx*G zQ-Voz?B@pUO<^D=U0-?2(|YGM1cTaOptamE_rT19(KDcN4B~^-z|t|XG)Nx^gY<%E zP<;x*A$OU;?ggc1kT^OPKua^k+6PkyGY@7jh!2y4(I7Eoc@Q5T2E`>ld2IRT36ejM z^@8k`c@Ig0q~@Q9_mH>)#UUvEK<0wX1JURhJ^n!QpzsG_QsdykLHzZY2eh67)ng!g zKv?DvPpb}k86v<48nOUMV_=03Jgu<0D+f>5fixof8M#aZ$$>CP9v0Wc(ja{x4AKjt z$-yAK#M%c_2eSvH7j%|yPGU)_f{j9PW>so@i9&pEW>u<!okAw)aKBWA)S{xie2{Q_ za!P7)jsm=6sGy-xnpd2eo|l@U0NOODprN3q5bsi4qM)e|4K*cJM<F>suebzFr50En z$R5u;r^=GlVg*fwl8mDKas>?qO@(TOqSTVoqC6C<KnCkTOx3~EZLLrX^%TfYFn^-= zgP=|as|2Y7F<6-y85VRv`b0TDcv^XWLh{KfXuA$ZgVcibgk)qEE2Nd?C6{F8=PBeD zDU>A^WhN%&q$=blRw^W=f_$2oma3=VoS#>mnUY$hP+FXsmk!+x2r^~(V^BCLksDCZ zMmER{XneuPAcze)kX|LYW{80xF@?;$;*!+F6g`EIe1(+EVsNyjq!tvVCMSZTQ%9k+ zI8`CuIVdDP*wr~S$Ti;2KR(<s$j{TyJy=g6I5kxvACf6DQgaFv((;QGQc_D2Gjodd zh;`biIx2<0m+#p3DB?06SA7Z^KL+VRZ%=jPK=!-C<Uwj+7?hTjXqcEFDHht#B(uDM zCx05c6D2&z&hH9HSyh4N!OA1Vi*;`+%rEFPu5>dOst{MYfyqOafhkbB0Wm;hZ?Jj= zMuWts{D9OwFm)g?LKv6(K=}h*FR1+sbJv`2knw}13=9k|-x2o0+ykRQW>CXDAag(% zz1<2Lo1Fu#b3yXR7-a7os2s^-dE&gSH~#Uog8E+!QoP{yKghhAUx+cjIg21;vmkL~ zdtq#iUyyJC@j+@}VL~ho(g(sIy$TGxt)MwFkb5MU5$*xWgWAU+yk#H6J)n33iKF8k zRCEuz*|_+)(icoUw)o8XjR-fGIuH#Chb2%sQseW%Z}Q^}WH%^$L73Dqo^X`A^#yc3 z6J!o-d=-`kR{Y^<75EDtU*!PB?~ji>tpQBDtt!xT3-U8a9}I)W>tJkBXplKDJBg)X z<|FIX`3o6e1@)D_{DQbW<1bGuvFmk+wHu}m*$p5zsqJleJw}H)dC(Y?#y{L?HvuX~ zYTEtq50Q2W^`YlL?Er-pDBf1fFfoAE%7AFlyc389b!b5}Xio`<4r5?o0MQ_MkUkIw z>Amukr#0h0WKLdy4^iec{71}H5bBrf{6~Zb$V`wup!p~eT>-Thv?dV52OSFrqLJl6 zZUJGCUQl@qDhEM(N<m}JFmVe8Uig|PLh~Pcu($^_4+XM!Hq<>$P<jfKo(82s@*q1g zF;A-m18?h{|DZ79YX!BuK<)*p1JR%`1dZo``jaQn%5Km+H3-Azs$t`WAic=AgaKqW zL<D3e$h{k(?%EEemqY3GP#Retq7&pY7>h7XYS|4=|BMKCBHI9Ra{^S3)bu}xk(cOs zSoHLNgOL}$euUJtD#Ap5x&rwf6t5smYTO2#;BK7*DpNs*fZA8kv$H^P4mykW4ij&y z3o|eHTnkXT0x3Jf&D**Gss|L-ATb!Gq|SiZ38F!3IzcpO9Ri33otp)sLFb2o=p8T% zp>uK|F_3!`n0dkHT7c@c4Ga*sgOx%D-_YHQJm&(EgP8-ONp%A$b8;`3A@f*kpkp^M z8st`xJ3urs7+1a_G$%KQnHPK(8z{bZAe9qeE?`d&F!z1nf#f+*aDvJjkQ-TSAbtU{ zb$B82AT~@7j0TCpa0nZ3D<~a-%2p7DiG!vJVE%{EAi1ez&dDucMYsoK4yhP9eGt+M za<9%w)H%5iED-x)VIaW<;p2)oa_8h=<`YZ9`~q?_h+P787s$OZGeF`Xd1CzpQjd&5 zeFNn12bqN|kB^Njd|-Oe+w!3Lz=9nTwlFm?8f5Pc4u~9~IRytUh&qs7kUkJi494YN zSRIQ#C-(yCR%~`)6T{^OT=v4uK=1Rz=H3#Z;el)}Ob_zh8z?=1)F7t`5FZyto_jMn zPyF0l04Hy20XqbP`nve$-b6T2;|S(9VriJ$LH<1fvUe|J{UD+KRu2{J1-SuKUxP5L z&IXOOfW*-;3tE~a)}JtSF!MnEg|T6BFd8I|EDz%2!?@BNOb@pFc>~EGFm)grWUl}> zBu+`qpFZ4>Gy_UIpmYN>4@9G5^mNk!(o1ICgUklS9SD;ee<7Ff*Rd5ybu7pp5Vnxy zZ9M=jqd|Ny#xq|Sz{A@Lt5*~7ggeL_Q22vr5JoPqL3|Jf$-~kKu{1~@2!r&3XmT(} zFR}K))WPfl=_P-@Fg^#zjA1H~Q-;C$rA5i9ItuYQ;DfzEbCNz_7J=DAu*LB%sl_FT z2}HPAFcV-ih#)`0{Egn<gN;SxKm!D%7Q{pz)7T@z+ZrPZ$#-j^?NAsEQVY^U?oc^M z|46~0aH8rQB6R$S)bInl0~Ybc@j1wIGjy0*A=SB~>d6cN7ZF~n%nQNh3(?z%!)87) zK8NPX9-QaMEhLqY<`d&{lxRJp_{4)c=?1oT9#^`7$s;FkP&k43pf)b7j)Bo2@h2jX zdI+WtBt{71YJ-CE2fAKRUliu9H$srH56~Fq6k&wDF!#V{kQvl)56B!4MsE{?<`dsQ z>tB#OG6vaeBL;CBsbiQc6nI-*#CgH<i7CnuGeG8@5krh^5^5_~K<x&(38WVmCdASp zeIN|ddqb1A733z+eBu-xgnMGd5o4Z&`d%F35PdK+iFF4|9Y`MtgWRJc#@h;-ZveR` zLJndsNE{>&YR`i(p*H;tD!K<`FEJQbdWY%7mcD!>ApV1?fzcrUwm{`bO<xBj$WKRq zB*>3*1_lNOP~3npsqu5*0e7ngbY2N$4s31|mOhS1^0w+ofycQyKxxB<kGFM#EN^QG zG=GA^3#1Q*LF1+{HYqg79GIQN(lGOp^?FD_#<@ZL!Ykqsx3_@S4uA$`p=07OeIOcn z9240ba@+tikJNqyxLKM3IZX*<KgbMXFsW%CG;i)8jXTX(K;=kH^B<%U>6Xx02V0<a zfcyvY>pB@Gh7<+{1`rLp&jLh)&PW5%pm8n`4ceCnqCxT?eIN|d3!*_|Y9I_dCka%S zfyB|Vjts)zAiW^-K>PAQbRE=w(7rqnA9O<oh(?x&nFrDfV-upuiJu2Z?nE{pWUquQ z#1Ev#Plzn}@dI)LD11Sf)G*d~#NE0Bl<z=>AkCkF!WMLnzKk4iYl|GXTwws!$slEO zlz3ZDK=pw93=)H3O3D?Oogms38sDHfF%aJv$_Jf$1mf4jEQFR7ATf}87sx@%6;Roi zAp>zcSSgX^3d|f3O{yE9WdywUiyk&$ci<q%NrxHokhF$wB*@+cP&rc5p@9PN>F^HJ z4v_sIJJ-uFF@UZ$0@0u|jX*T$3`GzPDjz^Js2l;&AbF5J5C-YxG3IRrwX;BNniHlF ze}TjgDDYyOfsL#D$WegkgP94k2UKo==mrJ`1`rL}&kLeK<pzjGmIvtrVUWFB#CTgl z?JSUcI@BTNg2X}cp!yqx3Dx0$u($`bJ_2MfXrC{L?t!`sw0;7_N0tZK1;Q|UL2N>p zoOHB75#m2|vqAR0fXb1Yj#QM$Pe%z#<i|P451_aKVN&Dg#$)c*JJ9wt$Q)Q33luM) zvPDCgw{?Otq$~ub4Un1xYP_u<pn5>z1rmc{O3Ff*ogmsBnnplnA&3tu3qdrfECkW8 zb*3PDL2dwvf!w=B8B!L4%4-Wnh}%JGh+TgMGY3SI>IQIGm<zdS2;?TPy+jbCreDz6 zE(I#M)9(tX9I5G7K^2jHSG<F)6~*O`Cr~>;-UF%G06pIkM1#(50nwm11JR&51w@0w z6GVgLLHa-#q!&bk+JGSZ;621%T;*MiD#G6&y&&^)85kHqG^m^d(cw@&sJsR7L1(Cd zXplU}E)WLk1<}M{a^goo4dG5?J3#h&K;=k{pB6Rp;|JshQ22r{sbTE!l)Lo>bW8$d z4y=p-g(>J<RUdWU)-CFgG6FPa08(>Co454`R1e6{ATb!Gq>O;s38J;2@eDds4#WqY z0}G--=fHw!NY4dgE65EXF_3#Ns6)yKP&qb372<ZVDk9rUFmpgOscwLl5p-!Ufy#*) z8o1Np1*jaU=`cZ)_;kpliLf6O2ODJ|cXWVg(0L~y8dRo(Xi)h8qCsa<f@qLDI9{Ob z-5Mj_Rt5`R@SP!`^-CZ*keMHl+(RgB&%xpzQ2z>KALxuF5Dhw$5=4W_4G;|~UqCcS z9%Ls7gY1=1;B5u9nLzEOJq8eeg2X}cpt=}@3Dw6sS`d98Js`axdpa2y7(jGClm@l? zLHu?oA6Xux4}?K_K{PR#obv1ek~@*@0NE>{4e<l1=_o{-{B$${NiV5!4st&zZa|pS z`1$aRyOjr;Z$Re2%0f{5fXbE#9p2UhI*_sulr}(WzUcF|DnRvs!V4q@!<3YTFgroC z4m53m%0dtyR2G70P+16~C%`O(<|U9A$h~)TAY~z_yw1>qxE-vN$g&V-4u~ez4dAjc zKL<A5P17@=KxN?)T}V0w`wxi##mOD09LZ@|kN7k!p@*;^WalR6d3YciG`0kyLFeIt zXwZ3hAR4q5A4G%XVNM3=1+hVOIS3O<{}Zs-o5#Sw05TU;M}lb39sm#xT3ZjIL6HKY zLGmEGKp18(h)oESQ^vUHBf<ySe2~30P&rcLXNNxd@dI)LD11Sf)G&^C!QCnWO;aFq zVC4iTOhNgs!GO2*g#o0T0F42F)G(Oxw(3Cjfcy*=gA$aK6EHhLH0T5(5Dh9PKs2bF z0MVdw0z{+NaUd~}dsz%2<piiKJEI42JJ@MNmJ={@Ks2dtfRz)lMiYA2fZc(EASWH3 zF~pq?SwL+N(EZpX-lsani1>8q0JQ_;C6He?%P=v3&Q}M~ps^(o4Qg|MXi)h8qCw|s zf@qLDNFNA;^!C{Ewt8stg3rzT;R5j&NL<Aj;T}S1`vMmCfO@$g`$`xX7(g`Wyi5=c zDmOqhsC)s@AbF5mKp12%sQm_NH-X&0#|q&dkUXe924O;Va)L2LA4m_#OprZYP<Mdp zIS?N-_64FlpyJ5#AblVV(hH)A!Q`YP5fg+vk?jE4>jRY|wLI%ELBt!OK010jI)bE^ z)HnyZ9~3trOltgayy9+kK+03FvJezMpt7aMl(+SZDWog}r45i>Uo3fBL!f#<;RO<d zVM@wEn4KURbbcF%29<>%8dMg7Xi!-Qq9?*EgtnPLVj%Ylm_f=yP<cJa7~*!YQX<Pj zm^mPtR5yUj!h%ZpnHA_^19k@vg48q&TAzQz40jq9Fo(#IoQBO2bJ2wMEBZj~0C@@I z*DW$k44^eoAR2UjCWr==jUXD-h5^x_vIs<j<U#sC7^GLi0<qVN(7BmMu-FSK(?I4{ zGB7ZJXwbYLhz6B;AR1X7WG4uN>;;v-ps{|?de0ndNSJ}dLGqxs1qc(`ml$FJ(Ff84 z(hIV0Ce$6Eadi;C8OomurKdw_kUU5q2!r&3Xksuq>4n1*;Z9^bK=wL7<w#90HJ0S3 zmmQYm$2rLTptu2HQsZaGYwlJbq`U(w^FZ+gI)}2sinsNJ6{O4qr45i>XPkIj6QFuP z;RO<dVM@w8n4KURRNjDS(7Bl)8gy<Zhz6aT38K-*)j?t)_p(?+$~;iHJi!9ucCg!s zEc0OIfM`<PK*}Dy9&5<Hwyn^$(J&h1R`f6hiQ&Sy(mtU*dJfi*b!wpaib2ZjF`uxf z2blYQI79LcC^$jo1;||q;Sj%o*e1}n8;A|l1EWD=F#N-ow-uC*K;vT|3=_w-M{fa{ zd-PmvA?}5lPb!VPwuO*hP`pifgStm=iVehmSQzYqx(8Rhk-J9^W<Ier%r77}gV+*w z5O;#y3o`>G4w5I<PayTk7&JG69R47)kmd2QafJ^|5BhpEP#fS5)DJK<FdAg<6bFd^ z2<-uCafGM?=>_Qn(Zpa}?!~o7Z;3s`9&C1i#Cm*rTS4Q<p#BF>0B*Io+=k0NAhSVw z(AU?(_U_3*!wIAYhGBY;_wIqx2}m9}t$_HrFlhY?Ozz1C;`i?HIP$iN*h4UAT`6cy z6U;p@^I-G^B)5aqz}!YG4KoL%7sLkDryxvd{ip|8njzLcm^zSMAPln?#D>YiXpk7P zJcy4E<BETn9&GtX#tD+nU}|7A$legB9I5$df)ga}Kye6)KaiOq^FTB@Mvp&`JShA@ znAAAf^BI3V)__!xf$RZc7k}Q?6!bC#&px;aXWmv=-L(WM4S>voVVGZGG)Nq|Oa$>k z7$gsiYhr1TJ`e`!1<~YSkX~Z#gQ<hr1JX<0J~&XvkSe?2@N9X5+JSY$n}R0tJ~x=Z z(EB~mJ}lU~Aishb$ZJ!lc=NWJ_(1Z^HfTEzMuXIX^pLxK1EhbXU{E+wZI2r$+DQyJ zu>H`;jxUDnYy*kWe1i{(?i^K4ehA2TQ)hn?XiNv>3iS5Vu-MlI$~$yO^q{;&etw7U zYXiBJ=DXS$7&ua?lWt(+6}Zw3OdgcBU>FomAU0@U8?0V|(ID|X-jKQnrVb=V2;*uO zg7OEtUQquH=B^{2knsZ0Ihi?L2zz1ffzco{sNo)vIUtPQP6h32I|8k9LGs8LWUq)X z#BHRG-8p3OwlV}k_O<=VftUd@Z;3BrOpj3eH2`Wi$W0)<urMK(2I&J~kY0sg-d50@ z7^wdz5r%LNNFLN424O;N;s;c856E6(Fs}3k(~B)Wr}#nq2U7#1LE&%)Do1L3a`=-U zZy@_Y;S0i~hOq<#U#oyC!auO_R9G6g;LqD?5da=f<p9O6f-7%pKqzmk4>V1K{0y=m zhC$<VFg7VP$Q+oR#L_VHk@bcIK*m!+eIpq^h}$QC#v?!jfYA9Sm_87VJYI%u4moZB znMZ1S8{UkAPQruS05XRdOlsN%jX4DbBH|j^4v@VaP&rc5u0#+b?Gl=IIs&x=WH-pp z?J`UZpt~VKG-#d)M1$5fgXlm81_lrf>gRxHkUU5q2!r(g@!@Tq5CoZn=ShV43nacG z2r)N7=<LCeAc#JgnIL;W^G_febSET;294o>=v1hCkmW)8Kp12%s5}OhgWz*A!y)E^ z#4UmmbIXM0JDy;14`|*AWIyP<Ob`uPw+Ny^^Qa(tGSpold5~K`7-TOfY(V33pzu3^ zRwjeyn?V>h=L{S71L;M^CBYDXfW$y%g6vxdwQmcQUIL}pKxt%okUkIw=>^fmU~<y6 zMhL>4$aaA2O@PXgny%-Bke{w^gpi*GMMB9>FCf2z;uVBRjoTYce62@7WhKZEr2TuK zI0x+)xf9CU>JkR73m8D@3Z(2v9B=Cls2)&QgT!E%lDYt9Cx`}}Jqe;g=U;+o(D|1j z8g%|8h~5gb5L&*2#6a#%2!qrGp!#Y<FvRU(r9{>RFmpgOscs-;ZtX=FWIk#KbW8?D zgWQT9rXVp~7+1a_G`BV<4ANEx#n%p`a-xQt59?ej%zYo?A$blIoS?D><SvH|5Wj%f zItdVY5F4fkMuWs)I3$v{6_k!Z^Ku{z6UQ~Twv^1dwFMCf_rUBRg+^{G5Yh*Vw=K+k zD0k9*fYu4HFp!9ZxCd9fkvq2rGoM%*<`<BgLF^K!yFl)RnE?_9$rI}*ka}bc>YE{l zKgcX(d3<bK;RDly-bM$tb1b4DVGC0Oqe1rGh=#}!nj3J4g{TAR1?dCP#9&<Rh1Ibb z=U+nIip>seVz}IZ%U+ln=zV$E99jZ2Jdn+W=|P@D1EmL$8sszq;^V@|b7*@wLFaQb z5Ow!lKn!ndK@<do`mmt(7tB5Ac8SEG#u3bI#L_VHK<1wS*-Pvhh*Y!}<OWcE4Z^TG z8#IOj5=X}@XlasIf5Ozk%meus#)iqkXplIvJcy4E<4SihJ=pT+4J3cS)PZP_y#jHN zI3+cI`ouxf3@Gh@(hbZ!5RHz}(@h6RFPU)<G8+_kAWUlfP2s^`$5tTKu^@Xu*d&Ly z^#HVt2Jyid&%9qiJZ~$kUQNIg?jUnO;SZug7`eO#@j)0Q4@)P+(ja{x4AKjt$-yAK z#M%c_2eSvHcYx>pNIU%!G*+yjp@4NNP)8vi+u4^eKcn~cVB-s*wUnUn0EGpJMjofw zk<Qy1kpanbJE3h*7!6Vj(la_Q2nq@O7!*$A&l5n*2AKhivtsC&5JZM}5@ZJCaxPFp z8a?}x_>db~Djm|PGuJch=Lm<&*_Y7lO6#*P6ZTLi-N4R}MDJI?=9Xdd$hitsHi7t{ z_ARWAfzcrG2kDS{2&N7sMhN3-e}eJ{x?WH}6y~lMsgQ9G(Ak$0(h&B-+ykRQW>CXD zAag(%y*&(?BYXj^e?jud7-X+SCd6%|j$f`Q=4}Pd6N2XCQpzA^fXq9Qi5S-;)J`se z+6{6ONG~i*h^0aLKp3R=MGbE&$W0*kEU8DhCn5_m-brZwiUl<92{I5m)<>*6VCtY+ z!F!?=GI?7;a|j^!L=+<215yKO%Y!hX_WTqox(8%0F&I~Rhv~(ZzC5xa{)4H3(V%!~ zfXb1YzV>93pN@WHlON|Gw}avagh`Db25G)l73f?M$Q;;wCoFv&$l-0($OVsabAZx@ zMIvwOgaY2y0%-mOg%?O441>l@VQf-pkU20riKSuYBkOg^g^Y27`h*v<AZ~BS<t6%F zKw|BNsY7-Hh)rrg0^GJOE&y%m0%-^5LokB~g4A>m8b5W&!=3IcpmL<9`ww}Dv`g^( zOQ;<n?}6fNmkbjF=$s}H4cb!-qRkl?7(g`Wd=?Px4dsL6LHa-#q!&bk=J-Ka#6zY9 z#0S-9AQ~O(<RknI(hD*dw6_>UmqX15?dJpWL489I4T=;H4U&hM2hs~;6Qaq9p9e_p zL^dB}uS5aF52VIV2q?co$8t!GACMbB;S0i~hH-`rU+Wf7-UAteG=ByPQ*{Og2AM+M z)|NtW*}?#-mqE(rl=8Nofa(GH86*b7l$0$nJ3%z)mU9pd+K&sOL3`3bv^+E&RKP5R z)~O&lkb4&tLdq6U`InIoaXVNkXu=1o7R-kd$nzs0zrf4^(WJToR!+dWz##LW))1t~ zNrxFlkhF$wILO`wP&rc5p+Pb6<-{GR9U%KbcJ7v8VgQ}f1fqi&7#KjbC6or04<J6M z90AcFd5}I32I-Y)<81}CwLtBf8yygTfy56Wxrb2N&MAiIgP94k2Xtl$hz9M`1<{~> zBZvl-8z34~zJO?uJV+l1gY4aq$=eEQYk}M|qY7d!NE{>&s>4B;P(A(!i+e!lIDzZ~ zt&afFpv$5`bT2fVkmW&kfiTQo5StJtCmn4lf%p&IY>>S#pmL<9Bb8F}(@_GFUQ**6 z<OfjPfH0}?BO%AvdI#F32AKnEXMy4eRJLf8@wQGVgOr7!v;k6cp^~@t15^(vyg*_w zOi5V?vlB!cK+^`OEClgEWg&<Lm4zT0bY?2dPLLZwVj%afDT9=Spz_+H1mbqEIwH$L zm^mPtR5yUi!jx3dZM~3tWaEQN5{sY*fPmZxb_Wpzsp%QiFKsBtot}3<<w#A>1{H|( z`~#_9ip>jOpmu=dKz`jL!^8kOKMq8L${P?3T0aJ&LF=+WH0XRv5Dk(C=>uVqUJwnc z*FpHqP00PoxY|!S6$pQW^n%O-oq+<PLF=tRH0a!L5Dhwa7ex0lFff2<kUYpP5C-W5 z(ZpbK;zywp;Z9^bK=wvJ<w%X6DV5~M56BIm@C9K~!+3=}U+W8KdH|UND>Fc03d%Dv zRlKc7svu<sXdD5g=1v`ND+e@<fcy*+gJDX_449oD8dPtAXi%8}qCsbsfM_*ne1pzg zhS>>n14s_!-Un5XG6Phut*C&w9juPXG6QA~h$hty&@uzoe4=ST3sg?5sK%WRA3)_u zO@{?F#HT}<8if6zIM^%0!~p8ofN0S9v>+OE-#Ul}-FFV6L1(goXplTOUZ8E-fPUUq zP#X#q<~)-i=7P**s71JkP}*LD#XX?)njrf?=><erGcYiKXi$3vM1$HZAQ~i(>>i0? z-d0c>3gn(M%}DMc;SLa+T8KW7xgfuQ>{$i1e*=_W0Hs$zX=HhjJ`e`!1<}M{a>}z0 zNbW?o17xp89mEf$rlXWPM7$BIZ_v}x0wlep#yQCSptchT6KX%9$4`VJU#ko>-+;`4 zm4%>q1C=cq^}MYY>LFzzC~bh$ur%|w8bI}c!V4q@!<3YTFgroC1vG7d%0dtyR2G70 zP+16~H^MB0<|U9A$h~jsA!Q+`ysoH)xE-vN$g&V-4u~ez4WP0xGZ}h-IMiKWyNMu3 zO~at`Ft;>7(kZ&}pg4I0l_NO~HzLw7q4UW!8WHw`?A!-E4--U#&btKBpz|<6H0V4` z5Dhx-4n%|GVeSU$1+hVOIS3Ov+iU?AdqI6ekh!3~BZvmA;Rn&6vKK^y%4iS`k_XuZ z!Z3S5Y(kiv_z7u3gb%X$AbWeDa-_!3i6-*n2jm7&_<}I0VSGS|uT=w@ra<Pv$_Y@I zg7W5sX5Q8x&5&{eG$sI2BhbOyY6H~+@-s*bhAAm0V0MCN&{>oq8dOezXwVsOAR2TA z9Ee6g4-+H?a<51Wq?`biWp^4OZU?)K$Z`T^4u~ez4X|<o)@VWx8?ZZY5agu8J1w}= zp-3x4j?{Fxq?Pz|7yz{c<Ry?__e0Oa1ks?eXAli)bAV`2`2eCp=V5|qkUU5q2!r&p z%;#;jnGV^H*s>7fc96J98^S$=()I%^?g91TK=y&UyC51gW(}f2<pzibl`kL~BoA^6 z2!rg6sNrn|wVOchXXr(^2P6-wk3pDFom|ic(Ff84G81GE=)6l14eASmXwZ3>AR2TY zCWuCs2k8T0kX{f?3??TXsk9^9iEIbR-WaGHsp)7&J0ji))i>zr=n9fvQsW%teo)+i zFsboVpu*Q0fRv|TWg#eDKxNCE4&GLlPDoh@N*f@%EP8lbQ=oc4;RO<dVM@wEn4KUR zbS@i+29<>%8dMg7Xi!-QqCx!vn4KUufW$!VRp^A2g`o0!O&i4RV0A>6g)nnKG^uWY zl!b^x#6j)?+f4*PP8xpEi8~D|bV1}uPQzWqr{Nf=9U$+4{CWU-p8|*mjl+Xz(0vLZ z8g!omhz8BqfoPCCNFNA;^nz$mT@J#8(*G4K_JZzB0GSJ_BSAFi-UJX08utRxpnDTQ zG)Nv~7YM`b1+fWXa^k0>8xjZTW`pcK0F@&(e*ScmA3q>>fWjAqNe$y0s(h_6Na+n$ zPJqG`l<$u8@V4soLdpryH~`2lmx;Ws1yDU8KZC?zn38e=W+#XSo%0W(LFEL929*;a z8dOezX!JS`BnEP?M=zwD0F`9|-4M5f-9}_N0W$|glj;U|IRR}np@$9F9XJSb(xE^f z?sVt@l_NDB-smGf9kxL20C@@I*Mrdcd=L%VuMDC=^Z6heR6c-c(0m<;2FZi;fiOrf zsJ#RlYXY@V_RNI%3nZS=k8ls6v@OyP(FZdVWDjUO3q*tVFN5f41_lNY4JtQ4G^l(5 z(I9z{J`e`kd!UcE71VA5xu<3-#9WX#NFG!lgD{~wc?lNxbVKb2)pH<w8=-vAeJdb7 zvOLHx5Qf<cViUsTq@#!l5dWc@4YGFvRF2eibY=n~-Uzjs(9;nIsC<F0Ss*peL4E+m z4G5DOKOO3Ptu4^@F~}TPSqO?3P}y=}B5$k3BuH5ZN*f?GTc+@~&VcFxg%?N+hAAlv zVRnLO(0Tz74Jr#kG^i{D(V(&rL{EZQ2p!J>iGkc3G6_-^g39X${Sdc<l@eJN!ps5D zq`CoI7Um)5>A?09L6Dk$LF4TblX0it0H_?P=@;ZwP<;x<B3z*9be!`BJy1J9dO&I5 z5cC`e5DgmR0nwm)13@&X+yl{|y(u6XBoERD!XUjMnixz@I5|wg9ZnTcIeLcE3Jt#2 z3D7wOke^}s4HPb*aZ-n=ysayyLh>7^ZUCwIGK05u0aOoqcu|tyV0MCNP?-;+LHP|t zgYpuH294{2Xiysz<Q5PHxd9{wa_^C;ko*QJ6HZKqxE-X1*n1&i=74BY-2lyR(3S^e zZX9ek5d=ADsb?DQv~&b2M`~IMnU1J43JBymhUp0VL2+<chKT`mCnJakjf;S2M+OE4 z5Dm&}AR06`4x&NwuwVh{?P=w01=aVUFxQz2F&88bQUj_-Kp0k+;F=?!fW<wa@fwhQ zWl(p3?(hZiLE|(a8d)A>7YM`b1+fWXa^lTp2E>2pW`pdlfy$8@Z#!m?A8#OcfWjAq zNeyEGExuL;Xj%iA11mp3VGGKS4KsOLU(AG*AE5XJsY#i`+bROp1M)LS42CHwKVWu( zXwaMthz6A(AR1JDfM`(p0iw~@l!C-S?q!(;DL+7E+?nYRw}ahAWPJ@Y2Sk(V22lBt zlL|_iv@JV8>yS^(!kq>gW<%siO@p9t0@u}hd0GjrbG3om0n!6X1IM9by&xJiegUFE zWdVo=jrD?P&{!{s2FZi;fiOrfh$aS;npZ*L^a078$aaA2)tE#7a5B*5Yjr@1J6L`L zg$rn1*oQg1tr2q}`3=;c1G#z60^ZgDs2-5JL1HjWNq&Rb38F#cc_12;-#|2I9UF)S ztz!ex=;QMsF_3#p=0frts7$Ds4RJfzZA9ibm^mPtR5w8L8(r#aP+GE?2T3nr{~-~e zIO&1Pk(%dPmh-lXtl(`0)vqhoL(B)6Co>;W9}vomC!ltNoCMN)LWYR}H17(cL2YFa z4Jyk(G$;>(XwY3eAQ~hO(g(sIy)KJ+TS0X>DDNIwif|7|9#p@8FrhjoVm?G4NDs(N zkUgNabRZfuW&omN85kHqH0TU85REJk(g(sIy&#$xOitOrvjE{vWII6ix<KVfjn9S! z<i{Jx4WRG^VN%0*h7Mor257qrWDcxc0fj9npL#6hZQZaCQm%mF7o_IT65iG$P(2_& zgT!E%l5z!RCy3UE#xtl~0r5fQ3Wx@kD<B$DTS9CFxd9{wa_^aika7i7_Dz`&aXVNQ zk>v`^91u;a8$jhs9;_mVjt7A4CW0U*9Zp$<I~|^Z%8{B5V-^#i4mlPh><7icN$40P zhz6DWAR06V38Fz`kRTc~1_`1;@~~h5=>?T#pt)O6`Eg+t#9WX#NDZhA1!0|N{CCIC zz~Uaz9bq8*K;;C82KD(tG^iW_(a7>3yFeIbFNjSDlM`<~OCbJ3HydPc3sjEOcssC! z{CESo0~Ed>OllZ2=<&63K+_t?99a1Q3R_Tq>{!a%`e7-g`~bx-NDap--c}i?9+00w zVlYfe`2n*NM1#i6Ks2cQ0MVfG14M($4-gGndkM1><OYx!$h|zvAms<BjJvWJ;&!k) zBFhh$IUt%;H^9mdSi=P5F0kE15agu8E6Z@FL!RXjIa1T%oaMx)Ll3AOAn$?vdJ4MN z2t<SS5`k#YULz0<DmOqhXs;272FZi;fiOsK!$#iLl6jE3<3VTt!Nhe|AkM!el(uhR zaZe%x0|UrD&{}>F4H~}y(V%hzL?g?C>;z$udq8dhwTVFG*^hOQump*N<U#c`2*c`X z&=~|Eade!q0-_Hj4$=#<4|L`#hz1Rcf@sj(35c$Rx)WI*qz{BadO<WXn4EMZvl8J> zWII6ihCt;=O-B<}lAn&wtRz3qLGA~|4G5DOKO6M<T0M~R6s#-+#Sf@#nX-zv_0K9u zSqMrSAiE6K@wUc5^?<?)BnHEjl!Y)mK{RN514M($LJ$oq3qdrfECkVQFbkn=7LXXo zy%MV-Wg)1%Ua|t>cCb<+%R-nrAevM+fXc$0@*=w3gZf}K?ldg11|mmt8eW4qmw-@T zECgx?D11Tb;G7H-18AQBhz5;$gJ{rt4-gIN^MPp4m@0?{$%FKPFi0<m2G!*tEU^=R zo9PS|dqH(0$Xw964iF70<3KcM3>8Ep%Y*C!VVJ!jHX%%E83Q^;vtcbH4$#d8*}DTO zM{4|hSxbKWfZPEJUl1lWj3o^DT0@Z18?2lFg)Qj3;63YjTUFLW$_Y@r7-Uz@Hs00@ zs2-4?L1HjWNjU+t6GSUAFff2<(D}w78g#xfhz6Z+45HE3eSpM3?sZrXDJMW>8OK_P z+re%lvYddK1ENWF11aYlpI8q$6ZkyzY&jSWaw~e6g2ZrPT<Mq4`NlQtA?N&n;%f%d zm`#c)_VfUA-;C{$v=0hS(6|rCT`?yiegUzsK;=Pfm>w7n5`$r%O}wq3bOdT2fiO%Q z*ZIaf$UNV8#zu&HVdj%cBk$iQq!$!#4>t3*g2DyV*DToqu^S}*#Srz};|m)ga<H%w z*aYF@ice79Mz@~_DgZJcgrQtG1rmdqPb>}74AKi?=Rn;BaxcsbkT^)5SU-W(BV*9q z8FIXU%tDsO$Ho;tFg@t!{D8`9gUyhzg{gtjAbVeIfyfa$S2bZPL>)*kNFRtM2IF!s zu5*unK;4SX4v<*I0p3<n{{qyO-*X7!CXhHWZUL#m<sO(B=;xNf&O<JMh7-sP7>4OV zJ`Wj`PC)X=X$8c`g^|xgHZdXoJY<l08Jl@q!MKdC1>bqdDrj*Ba~rWV$Sx3u`4_}S z*9#IumIv|iVO;S5(}OJ?|3LBwOdW^@*=w*3k`~BG$KWsog=HBZ`1~A@c_4GqF?u*2 zF~eV1C_w81P+b8t>&rpj)*a9?1t!LT=bYXj+jv`H^+N+5|AWjzb~keQ0+It^kUV<4 z5#odNfiOrfh$aVv^b)cMT^?o+NH1CE^nyDq*ze~IE-A{)OIOfTh*pRX&a6sRh{b&c zC(M|5h$bDV4wSn$VQvTY1(4@|p#3JWS3v#%F_6#364=k%x?w*g-ClsUgJ3jBElAJk z8M~m6z>h)UM6EM+!SRjXIt*E`{m{rBy?YZQc!q_*jD6HO9~E>y5-32>+ZnL)QDO2R zH82cLUo^ba5^`HCWW5Wy<qbUf)6ktL;X$rLl^}O-g7Y~Y?%wpcMxAs6yTcM!x`D~V z!U#lz(hZ0PjcLQ`6&MW?w}93?Fm)g?LKs)O4U|97^@932Fn2lZh4i;UcW=Jf3#s!! z_QKo)qd{hX#6dJM7?*osdePgFpmov?2O##t)WB$vy%V5vq>f)j9OZ2V^?gD85|I-S z^Fii;%m&#B!WjhGmuH}MgY<y(!oq}D8l(?|L3%+nF_@h2Yd8q;AG-M<dv`$PNDV)b zS)eciVN$~>z=5x|2RhaOG6yz>2Mf1`L%gjo4uQw;I6!eUX9sVq&vD+?6FAa8XiNxX z4yhRAf0&)b(l9%a^|Bm>jNyU$3LFO^Zg)6L{Q0fK+6_~O>;@2<)HW)-?1xU4g8Tw9 zhZsz1`U8z;FdV_1{sN$Kq^7?oXLwsr9D&>$>2nEUKFA*rju1aC-2=57<ZqDPi!w|M zpfwI48noXEM1$5|fN0Qs0f+{z)dtZZd5}I32I;jp!rKZeQ$Y7dg2oqN;sr+$^J#>} zx@C?+`~lMovIlg=28agDRf1^H&J++0nnwW9$nqe4APjO3C~QDuFQ7io5w!9RG(QKz zgy!hhU~vy<pBKnp&^|B_4cZ3=qCxw>Ks2&E$SoiYau0|m29uM%5{@Cl4cQKmy)&S4 zq^7Sc$H-4d0>{aZbCCN%aRb7n#!re9Uuy}d+yNPabapK$UO;mVH;(hRI-CHPs|=vD z0aB)Nfw#2-ss|KaATb!Gq+EsB38F#wE`n&#+z5yU&5eL)(A)@!M&Abp5(Bw6<^-f% z1(p3TjzZiHb{lkn2Hm~LW8WY-m^mPtR5y?^H}d2JWIo{%bW8w7gWL*o2Z$yH<4XI4 z=0;|mfV9;>@wEjhuP1n7PY*En1zd#W8&Gh9$_tPik350+1;p-w%7fT2Jun(12EzfT zd0Rp02vqKYFiafR+{j)s=SJq7g18rEKB+Wv`XHni6mJgBsB<81PD1R5g@MRv2p?Cx zkvj(hGoM%*<`<BgLF@vkyFl)RnE?_9$rI}*ka}bc>Kh=3KgcX(d3<bK;RDly-sT6j z8BESV!WO0mMuY5qa~2{;XzcjTIfy!tUXVTzO$^56UR-k^f1qx~W(P>@!!6!cQ2PMX z*C@CPaT7?K7`K4b;BpVl4D>!GY!0LZ8crZHU>K$cc@6}WPC)X=X$8c`g^}k#UbquK z2a<A*w>9Ss1cUkv_~t+~(Bcl}HezX*+hP6%)u$i~t5ZSg8KwrAUO;7gL1v@786*aC z7l=&=<BETnK5Y4?<UAyu!PLNLkiBc5a-`;;7v~{y2Z}>b{DI5_nFpfLF?#%g<U!#N z!lcH*0WbXZ*o_Mizk=#9kUb#0;tp@?9%wlT;)5}sd7BLvcw1q0*B_)b0M-X3V19+s zAYtS(5yS^!kUV;v6XJvPfiOrfh$aVv^b)cMT^?o+NH6*GHt{*c&fJi6i6VH=4{SE- zbPkUD6JdTs@AJU=yP)&NK>h{!6+|QVn}6KkZJluwl8!Dz+i@@&q!y%y+#yVm{*i(~ z;Y8KB9q1SZso@892Q1=?NAFK0HT;H(`i2|S8Lx-U<Dj>thRr<B5V=1QTIADwrYGkU zb<z#&9ztB{1}2Z3pFm|3h!2|Qfz>fE8YHd&t%qRhKw^Y2t~Melf1v9HwS8gk(zp&8 zI{@9Ec;Pyv{sY+ya}SILnE?_9(Zpa}?t$q=Z?l5t5j1W=?1!m=(I9&(pmL;+<1P8l z+nRD8a;9m*FNpad^EhrJ#`g%dWw$`>2Dt~M7ZxVO(ja{x4AR^3fVUMib`9za);vbI z2P6+_8-p;R_OZ)th(3@WkeS4~1Evn74}?K_K{PR#ocR2K<W6KeK=vBkf%t*c_{_OO ze!PL)0196aCN+%rgz>eeK<61i=D_BxU}0)<m$!A!UGUf{2Pl3kF7dW*dBoeg0Y_d2 zjn#q7Ar*td4rV8@G|UcUy*utg##TZ7qy|u4xXau61vEAR?L>jp!t{Y?<gqi59I<x8 z)Pc+ZVUS)BO={a4)RfChN=__+?rMRV12T&cCN=GX#-Fy_gQQP%vqAR0fy$AZc5Ch< z(r(CA{A(9A?j!66*?C2Vi2<~i1VpDWFff2<&^ZDi8nho5M1%I#foPCC%-tZp3AcD# zzubq+l@+{$m<tl;0hL8rOf8^sN<wo}JFvJ1w8sTxUmesvp#Bwz4?4RLL?g>1y9ZPr zgUUhBTp4J*86*dC&zuK{eQP`)AmIb5BSG@$*y91jA0Tm%UXXqBpzc@*r9tO8gT!Y+ z`E#H&NFJmQgh6^iVFMbY1N9qqo<Ph6iG$=pVFSXj{g1FQK#&|VzJbL(pgTE0_V0k& zyAn#TgVM<IFtcFx!ua@Ta?*9rLx}&-%>~(e1S&^rx@LGpe!8}KMEqPCdK#>FM1Fb! z`5zRoAWUl9)<p8PYCy{XkU6lr02J4%3=9kok9k{HJO<YV44`xcQls&Px77x!2Nc#I zF&L(#E`ZqyqCsaafM`)@`jUpypgoHq@trUWp?eiUVj%Y(c?_uwK=qZ#Lx|hKN{Ors zVCH~mQr$qxJev=6Zt5y@d<I5?+=?EiATeARSH2-M&&Kcs(pCn=mkd%lp^$_<J;2-- z@)nZkK*0$rYe4Q=!NlJRYKMc^6QJ@SHcStU28qG&j%U2BpmYQ(GeH<8j%%Ln5SjCA zEYBeBg_%z(joelsq!$!#5mBh~Y#~n}_QS%U2I?MM@dnDn==Kn^*9c}lu{6vMkefm5 z8&G$F+zT@UBo2}%)=wby$QYC+ki#Ej7P34(Hm>l2=|S&vf!aB9o<qVKrUpiX?6r9b zks~xuu;dj)9Y`-oABZLf<8m*oj%5L5G$ez3UO?=@W(PJgB&{e+T=v4uK<~@L=F^Tq z?MF5YrU!XG4U`^0YLL?eh>r^+&!;6M5I>)`<t1<HmFEyVXOT4CJw+AJxCFTY<Yt)L zh^0aLKp3P~=M|#f-Len=9_bHMv=?MQD6fO?jvbJ@vvIW#Gtkl`vHpaq1K9<_Ape4B z5QfRYXpk7PJcy4E<4SihJ=pT6&1*=ShpB<lAbU%oa-`<Z4X+_-29$O{=>}vb$UG2@ zj?vT2o7d#WJ;-cO+<`Eu@z;=yzmC201`<x7Iu>LP2+#P*+p2<IzTuez-13IE6;`hv zK}tU$vtSq&PB0oIj$B@Y_#h0Dhouu@X^=h;2I&RS<Y16qV(o*egV_VpOV%79v}2Ba z4$vjFxCD9cmX1PleqM2jLTO%cW_n&~ib8TmVv&NDLVR$3X;E^jjzV!}Rcd^RLcDW+ zX&y*tNk&nAxq^m*rb4wsQEEwPQJw<QXn=x-LOjR{=uR&X1vLj|fVBeXfEQ?+7v^X5 zz8>5}XkdWC0>nffr;z!|+q&l~B%NJ@wn1SuNG(Xu=o}#^B=BQUI8kek5SsMxTZlsz z><)Ou!*+r}_SMi~TMQ0YjS5pc1eScE&RoxMo+E_jBbq0BaGoQ#kc939gSwUGbA$$h z{H-AO5}O`zweMhaZRq_9*xWKq9@!q4y`c6jtd4=vAayR#dI+WtBt{71avvyvpz8(o zLt*an`3xEN0L>A8`3$N5K=#7i1EWD^fW$#GF&LM7V0zKp!=O1rpKlQRVQOGB$lf_n zIa0?jUx@LyUibr<BYYsq4>}$Wd}oHvcf`0Rp?2~OsNEp<fZPHL6JlwQJ`e`!-J!_e z3UU)@j&Oqt!aaMw6W{jE_>KrCkeS4~1Evn-77zyM{qUE!6*Pwca!&#y!aX2)P+J~^ z3AN{cP|-agdx^p1q^~tU5aEVw2Phn#K;=kHUkX3TPe(C7$&Yi8`$2I7!lcH}n?k<U z4(MDF$Q;-hH!OXq{Niox`2`;1<^ZLQIq!H|XE5-$Ucpf=p$+ALj3f$!!X0KOu{6wJ zWW6hXLB_a2eL|BT5Vt=8tp|X17(r@b`am@D7$!)LSi52BKxTk2NH2&cwI6}hEQPOt zgP8>~j}Rs`?SsYwSNz7E_8&myNKN|@e-LS((442tAB6oNzh0MNVgQ{P3Zg-CoFE!> zmO6+Ao$m*tLHqSUG)Nv6CLp~p{vhU+Lhdqw%XCnk22+DfPr+g@Xf6|EZWRLq1BeEl znGT{s`|Ut9vOLTzki9M6cv}<xLgrdEcoAh~#a~1|CN#IH@)t84Ky#QNdqMlNK{V*# z8xTDW>b@CJ8YGYG9#FjoD!)N<t)MvvkQ~UJ9RCpELumeM3l{gRf!enPN`v-^gWR(U z%14$5*$KiRdqH6XT9X6ne+w`n!UrS|T9*OBu(cViAVDnH<sWAFoPyeW0ZJc$(kGxa zvOLU4kb7WkLNqz~=?9WKk<AC$Yw#c92U7D>&VTar(~AFyI43nvC@}E1!tN;{CH*4% z8#|l3Rf2)9^~-<IxHl+0FoN4&bN+FI^K1zNU#rL)2pgoop@o5A8+7ai#7D;5(1`;V ze@NKE<Z>AJTKAg!%mbMTG7m(9<ZdwWf$av_58{I`F0=WeX76DDxf7(4fx*Xzw-siW zO-x_QkpM^?^P>4+FUV|=DidaedeA)Gn-jdCtjl1*h!9`G%fQgs!oaW{djA?oA2Jq# za(MnD!olJqBRG7XF!Hs2fVv4}P7~A|(3$N}ZEy-^j>rRqIUx2ME<SkN?tq3ZsNVtC z$iTn=6DO92=>?U!CtgDQJb{U?73Ob{TbrS7oeEQoM8n+LfD}$3_7ad=qj*~jqIg?j zZlRW2LHRO;O$Z!6Ag6%B7DR*G+5&YeXzd0_3>m}Rs>6hc(-Y7*0mVNk&B4^SLd^l~ zZ-t4$Xju9U2t`f5I?Q~npfm+C6J#EU2J4aLYXzk<5C-!ZAZZAj*|79mgOna`1n{=P z?E1sZ*SeIKfdSUe3yB2n17&3BhKB~s1_lO=le{fckn$u*2Bf#G1(8m8cwwOel4W3E zYKG7YB2fLd1<5@i6`(i((IAYj79<A3Ff~(H_~2;(mKH$uoEEPT0|?u&AmRh0k68Q$ zi@Bh7hYqh00|<lcCDtrtbuO%!?oDD~V9?_g0%MT9$m)q@&%t6Y=-dJWULgh$2H8uj zS;*?XU@;f8mc)oxhyjE__9Ck%mhHoa84jRQ--K6)0fa&J!pzdxE!6^xTbLLwdI=VD zLFvJaSBL?GLH6R(i%<Ly7IQ)Fwcr(E0AY~5F#Q3O1c-KT2s`$0u;LYB0AY~5FmplW z60za128+4k3=9l5yh30MvKMA9DKrZQrh6YSFfiEh3V|`mUQ*11sg1#6t{7+?6|WG3 z1FsMR$X=LQQs^yM%msym6R!{h2!re;#XMxSu(*KHpt>DoCI};|BZZy9i5b35pmQ8} zg&16Tg&24^$t%wkcrncdoqO)aE5rc8AbUx1CrmA9-2xL6WWEF@2BJZIXK;J@$thM? z_`qn8JRuCK6Oh+ad<cis8N`|aau>QC_|^l#>JxN5F#eb2Qs7z;)J}qlE#qZiXh*8= zVB#<uR{J5h2|#5TNZy2-uNBme0kJ{mbP!<<sO<w%55l0b07Qc@%uOJ3I*Bj`)ZPQ> z1K}O7xLadBA=-i<F%a&;V~z+D<W|@t+^A_0lr|j%`C1u21Tb}=)#)HJk#PbvK9R*h z>?3i!;BbM38FGAs{0CA4!r-x_Al}x5SV+16<vox%3=90=ZUyCiP`skM1tbPjhm8iA z4GI@*av(8eH-Y#t%nfCL{BVZ{HEcjqQ+W7VYoK8U3OiW*gXHkx3M_dSRQGuB3Ne5% zC~w2`gWQeFeK0jJ`T`bnL1nHNuMh(WgY1Q=C56`D!z^n+?)BjnVgO-~y)g4Y`HEQg zHefLqRJZ%_3Ne5%$X=Maq|i68m<w`m0Iv`O2!rf}nFnh366;<Ae#~$Hxi^SchyjE_ z_QK31h3>#&F37zhyh02h46+wy9;mz_*1Zp~m<w`m7_Sfm2!rf}nM(?7A%GbUAooV_ z3Ne5%$X=LvpmL2^_fEiKE~svg;uT^5VUWErb4j6JU@_N)fq@~0R|t$j_L5>AOf9Hv zg!v6dJ2Nma#PJG&G00w+T2g74c`zDO9>UBe)hw9$17duwuyc}O^bH0E1}=ReFrFcZ zS;oQi;-hPfFwF(EAvN@c7(n;~ndXA@!Q2U>LFqwFUx)#OJ%q?}FGwHEJQxjHU$3Gs z!~ntzkjy2e`~~TQnFpgm`9euwhyjFuAejp)cVKGpg)K-9qz|SRMvE{oFevB?fpLH^ zA{<C5e?j_S=D}!C_{!-EF@W$2By&OTAQpr4!OVlvpm31U7h(Wm1`&jN547{Pz|;^l zUj#Fq$uKZ5Na+iKaRidN1kFNH0MZ9@1B?dMn-cm$3?RG#$y`#(UyweSc`zE(hZoZq zVgO+dQA9W(Ifoz<qz`5uj0TN4i0BJ3fN%nmxulf8Abl|NU^FNkg!F|NKzIj|xda`F zqyVH3W*&?Nr3V3hAqFrOLxe+u0V0l(jKIniz*3$yGB7ak=?j5z29mj04ZtA?(g$-V zj0U-vM_-5mghAyfOzWO?#HU|S`!GZt;#XL?4l;+BcJK~yNdE#fMhe0({nQ*Mm670U z1@%2(a{|=112k?7@-L{b1ey~9VQSj}3XcSH$k;T<E_4jD4_zEo{=>vhNI>EU#-}#j zfWv%^{kK|F5_wxeXDVJum}0;n4RJ>dlm@v2)D8fZ@gO#j6ht1xUct-2(9^=euoF7g z4-!Mhu)Ztud;>`SMj~G;Xe|K<!`9J)!Vn|}!!U7TX_!8cIiT_q#NQ#s*P0*+aWBZN zy+pWm1ynsqKL|^B^0k7}3<$%{1p?Utl7nHGII%QLA1G~t%1Rg?7PcU__7UOM5Tv-U zfVvwLZ=kV#n3?@}%z@1lnB+kEzaTwJ{y4UTNb|LV(gMg#ka-{)B$pw>*9uM_NNEFC z+{5MxmLRDu$lz^-*>%K>vvo@@Z!0KmnJVs42Aj>mz;Fa)2gou81_qFv%X7$>i2{=N zN?rzr2`vl^yP$U+LzTlRSh_<F9}PBH@YoAT(G94ZK;}$@no|IhK*KO|kkiBls9ume zL16>aG6`x9=*~u%7>tI6^MnFKID_Q&$ndp-{0=e`WFCkHiA%`wwSvL}gh6}|2Kg16 z*|2ctk%gplklGWuysgM~-6`a4<zir92wgsZ63A?jni4sLdgO5KKr&|)F9XBm76yjh z&^uv4`j9cU@PUQ%1zEmU2dG&fbEZJeDMB^?%7&SP9AC)!0_G-=Ia8tL^h5O`Q!sOo z%Nq%(8$kXAg)vP1G^jb)!W0%?b4n5M<q=ogk|W303JybAzE+TVFtb<4^R<G)6@+2t zgTf4(*|7N9gB1QB3VB;$c1cX=Y<W?}+sY1#FHfI&AhSVcvM8X&SIqu>EkDY5TS4PY zs>g4GuEqr^!@wV)_9Vz7^snY+V3^**z_3S#i6I+92Ll7PaO~NM7~hkCngudv2GpDh zc+5eL*Ar0pfcygrLzuRiP;)?cl)}VdG%P+YR3hR7B=<+2uQk-uXCBB*ka-{)Bp#v2 z*9r<Z5C-u<801%MX2asc2RVGpd0Sz2Ih?)KB2x{iA79L6G6I<mGH;6_B0NF)2NupJ zkjz=b%fK+Jg@IwO3=;!roexMKGKPgSa`?c)SwNAmwE=1t$eh_wb3o^1BbxzY!^}ZW z_sIDN<|dFibD-vc*4KdaB4e02$mLxG)D0m2g2EW4elFA;Y+(wEuRC?9@wG;guN54I z3Vf{~^I&ElP~vL^g)0cd%m;-THnU;z^#>{Z4XSxtVRp?q_^(By0aC9#D!8W%G8<&3 zj52C`^*n{tD-}uz@wL1R4D(tT81~69F@WZ2LHdv}w($7_H3y{50BRP<ocU05@<0-3 z7-kM~d~rbag4_uT8<>^_P;*pZ0!TD0oLQPt!&yX`uNCBXkeML!Kr~2OfeK$MC_F$I z#0O!JU$L1D3+EK1aI<OPZH3vj#o&BPKntW^nPh$^24ptKyfZ3@@C4-xSU5jGGG`qx z1H-}=28R7IObk9CO=uWf_`t$hLxrz(2GlH&Ig6m?5L<sE=L?vdK;|rln$v~m77!Qa z9^`yl0CfY%zo0M%sRQ99P;;<_DJ;GOI#A>5hzegTI1H8fT0!Q)%)X(@*9r<(5C)kI z!k{q2W;QIoL{t&spVGqH3bSiQ{-&0gPDnWx6PafPG8<%`i5fyZa(qodGG{$61H;l5 z28IJNObnnq;6eJ3F}Co5#TQ7O2h=Q(Im@8t<bx#8Fw7j}@<#!x7vxS**ub<bhnj;e zEMVbm(SsV!I%<5aAismm1eph-LFRR+^R<G)1B5|*5C-`bo7u2%u0aa7f==F6m|X=w z*SECvLe_6J9DW`HG8<&x6Lsw2`~%6H4ZI8tD_R&B4iaeBB8LwwoE_BpS~oz=0-3WC zY7XcO9gzLV7#7aR=@~g+z}y5fXBE^O(0vTZW`Ni*bCAoi4yYSI{so0GNF4~ThMI#d zOkwfmG7&Yt?x^#%g2PaauN7n-%<L5!e665x1!0icAPfpKY-YpaOGg6{{xf=cTVZzj zSX^qEFbUG$`n}m_9>{Evc`TX;^`Lwq;>!tMCkK*);f=fu3~O2#7!HxL-VW*xkoh1# z!OU6<H3wUr2MeDqQ&7X_j|N{W$jufSe61k!Ks3la0WH2(kUu~e#0O!J8?l)U3m+dO z|1Oxs+X}PmjQ#Z%hG~#;BX9XSE0EbB^K!JXhtCNlb2jlZFsy4~U^pzp!~nYQ1f&lc zV@p5C>97H67Ra3SP;>B=^T_Er0;(6}PEgpu?A-u02U}Rc!uiV#)NoGG;%f!@9b_iR zJP-{s&p?~66%-yI4B~?@$gkMUhK2JMq;M0N#@h<B>yPZp7Kd4obok=E&peRXAoF^( zQNtP59|p<6@Mc~HhK(%@495x7r^w-R0O}5q`5-^R%-RGs2V36-7CtF+P{XH1o39n* zW{{a6^FTDnycs%ttssAZFo+MrAU9$&8x}rSko+4ki?<bKS3}08mJM?u>F~99pFPNI zka=Hpu!m0olK2*028PWo3=Ah^m>B#(n$R#T9U_MhaysOIngudv3)CEZ>td11!v|3R zfZPcR8<^Ewq2^!<3s^YsS%4bOZ*=%tL4F6B2{I2vgU!?9YXyY|2!r_y5WiwG8y3zs zx`=Q)GMBd%*)EPnkoNPt>wlCP^dRbDpft#QP<aSThdYqW*~-hnu&srG;Ut0j3pspv zCPCWaAae_#W`WGv4mAgK79B_q8Dont52#*{J3(OsQ@;ah4z{p>h4Y^!sNo!<$JYw- zJIG9sc_12O-UfZXR&aPAg$2m3*vy87^AaSrGK+XyVRkJE4{PyQ25CRXdF;LlHk*Ng zfyV$6-XQys!&w1jH%O3yfnggj1H;Z128L4v#$}MxGc24l^!ZwEK-~l~XBX5Q(3yZx z<KYx6oRQ-TIbXos1Ttqg)SP;_ZUh5n4syF?1Jn&5|AN98rg{(59Bg3<i!Y8<sPV;O zz}E^6Lp{D$ka;k(Ys~msLE#F*F!MoShRtkPe1#x|f6Ox8R+wE167?-1t0Cpj59gou zAhSVcmKb7>uM0@#Z0BWQ*xSOua88Da0kq!;qz@Tm3!jReh<wojH49|UKBzgMd%KX$ z0I^}_AjcPIZVM!bj`u^&!M4Vmn+38q%U~TMoC}g}wd5G`wSxQ(G85!~5DhXHbPpeh z4`RbG$gkMUhK2JUq;Shv&D#pI%f^VWbqCV=ai2|)_2Y-(qqi^{AnV6LYy1!*3=AN> z2U-{yU~_03`mj)esDiB@N53cg3zB<4Dv{TBp{oVSgD_0Z6)bBJKy#Q{`a%pK3|gxI zQco(@F-FWw!u$i8E7#E%VgO-~y`-86Qx7u_MuW;4keMJ1Q$s3!2a9__>rVCbg&07% z#Tb!SNHIIW95Wn1>rM^yg&05>WG^Y^!PJ7*cM@863JV_?4bzK{2BjtBb*C3LK=Ki> zW`Nv<ZayXJPC@G((9PS)%fN6DDW9Or!*UIJSt5a!PeA$(;V}oc&U1|^YTSd;f`Aod zo#zQGW`fLxVFzgV!T2ybXB%&;j459$%#Fz53-TXK9cYZaVIyyA!&XQ<fYLfl4n%|2 zAc684C_kgS1tbPigA0SqhLwY$x&T!FfM}3<d}S=?&N`5q6r^y0nFA6>$H;y|mV>Pq z1%(BVIcgY#)EzP7YlYbXiUUx1fy4>n6<G2dXgz|Fz7PWlgYqQI43N8VxeulWPFrB+ zWl&jZqA$b%!XSI$YDr*3U@;fuUNe0m1`uYjK!gn_KM?EQ4Oq+tt!K2*7h(Wmki8^0 z6RwoQ5;Gh??zPevVgO-~y)eb3tlLV!VlJr8u+bM{0AY~5Fmp+vcVICWw4TvUUx)#O zLH3ej9!xE$41mQ2j0UY|bkG-K0AY~5Ftw!8F!NwEDBpw31YuImf~hyK<7-8q=LfB4 z++!ld0Kyqoh;#<iLkxYw8Pi<Qdb>*|LJS~$fJ}2i`q14AN)H!Igcv|r!kRqyg7l%A z3rfG|OoSLfxB$sqP=14{B@`AQeK55!8noW-jEN8f2%kVQmylV=@*sUM^I$Zn+&N_; z!~ntyHi&QlxfhmZkj=ox2I+&D2ctbf{cjT?h7%@23>8S`V$+XH45SZc9*hR9w>xGc z!~nt<kjy2ed;sZ#nFpgm;c&!6hyjE(Y!Tsr%Wc@iLHc0k!Dvu=IAkKk0KyH(<~kzM zIySSA#X$OC=D}#tdb<NALJS~$1KC_;jRe>reK7N2G|0XCOoSLf7?jUpMu67a!PLOS zaM7Up^@trL43X0ivF#C%{*2AMtso53kG|drCQd93b1SGVgKwQ0%siNS7>&G6t-v1Q zH<%o?X$>6acYN|}0p0ZuS{K3h)n^{4&k3@7jRV3xpz<A*cR}LFcsDNt!;uyS2K0N+ zVQOG)UF7kJ2T*r_%!jq-K<ba;F$Xq2@#P?-oe5G8!b=?ZT0w3GnF%rvM1#aDy!cu{ z{s3VRAB1ta5!P@1g5+P&J@zoWbfmwwfbMJtwFd(|+CGBJ2AOxj2{n9R<8}p(2=P6< z3=GFw7#KkJ8-vb40qH}=*un=kJ|W}8*Qx<E3uMl5s5zkXO_0q1v0>&Qk4u5r7d-gj z_j$td8G4$Bi4#kM>;qv?nnxb9g83Wd))P>-;+xyr0reZmECysYSO7wtgqnkGyaP6t z0=jz|q8dW(aN=tP#S_R(a9lyn2Hg(>=0lW$Nl?6CGaHsBIGho23A%$DW><$ZUn}U2 zWY}JO(EZ9x42%rtaEzsZ`mJCKp#(_psTKwXSeWlJfyE$10c<P<{q9Q8-M|nP5E2vz z5EcUix>}exOpSsIqHciM3o4hdm<Ta|FsPjb(*vsaU}|7uxabNj=7P$#YbHVrAPlk> zmtK707qFNM>L1)N5n=#gkiGcy<C4>G#U2i~OoSLf7-TO@FKDkgvEk5w!`wS2LJS}b zvKMA9DBlok?hP#Fg4&t)OoSLf7-TQZTvBKQH_UJV?elqHBE$f~AbUwM52m&Qi@Bh7 z&?6He1`r0>3sXx9{Q!%(pm2C%BE$f~AbUwM4_PfNE?_jMz5|&F!pQ1KVNY<!3}4Wg z-7^y*1`xJ@-pfpinIN@3-k9b_GB7Z_FcAV{ki8&vq+-z67@;vcSopwbV(b8wS;%8{ zl-y+vvyU2McA)j=F!T2DGBBJ*Dvx2}Fd9}mBiC7=JPeZu)w3Wr$ec4om;<VtLF&QS zk*_rcsVxB(V_;x7i^m+;*xw3IMEwNP2TD_W{2*h0B1m-?NDdvt?ovh<SGmC33i1!k zugGx?@*hk+XnYQIXFBXIW>B7i$$@B4e;t%(LG=&1TR>tUHMlUyY*76Tk_WZ3Ky5n^ z4dUZ#6Trs)5|G0MTK|LeqGM#gA<Kc<dLTY1EI7PT!x$tEy6+lh2Ph6e;RO;WgqL8+ zyP!Jwm5C4o2!rxA+zb->a(}Rx3o3Kpm<Ta|FvwoGxg;<`d@#!zkbB>m2r+;#$X=Ln zp#A}_@Pw&>(QB}n3#!{cm<Ta|Fvwn*T2g2hU+nJvWFo`>!XSHL=8@9IiNRtn$h}`o zgcv{=WG~EIQs^yM%msz-HxnTS5C+)`GY?eW5F5Tcewg6^sw;n(2r+;#$X=Maq|hl? z%ms~A{xT6_0AY~5q?iX&3o5f<euL4VvC2OtLJS}bvKOY7R2pU;j0TlcATvRjRI^~} zdxH5|(f3b*#wx#A3o(GOh(BhT0n>|*eh`IeE~qUnU?ao;!Z~D`3(|+~UQjyYvk_td z;Uh@qg7O7SEk3t`<UsmhYGE{JY?a4GhyjFU0+7Oigz^le4`v>W2Blvv8zBY|E<rXI z<Pah;NFU5R7!3*s4jUl`5I%!sE@)pKObsF9LHb~7VKiuLmCZ(o0fbcok-~wHVMy{I zeK7N2G^ku>u@Pbb;Tj}!LGcDl<48teWrFm<%!AROu~jA;AqEh>f@CgM18@j}^uf%7 z(V($a1{)y;5Y`Dogaaw%8Au<@JQxiMhkw>W3?STsWG)V;VHF1HgP8}TLFwU-wGaac z-$61rCmfMCu^NUX2+{{L4@QH=R)1LwF@Ug1Fd`g~v=L;2^uf%7(IEH!uohwfVNkgQ zGXylY3R43U!$pJIFA5<LHzB7XV%mExA$;KWV$K;}@K_T}KQ+ghK<<{H@qST!<F_zB zf!u+NL1i<HZx9LzKNz3d^b2VGpqu+9kP&?EF=(IhN9UjRpm8pc8i{a(dq8y_sC@<! zF9}14AK+zRIN!p+fPM!sNF4~n`aQ_ww^IuET36H}_8H%R?omdMZ<si-G{`;>2AKmY z8$fIjJ^>9^kXtVh;Z^}8|1E&(1%(By{{S-cA|7*KW6hv@mqBV_SRkCQ6%@W8GePEo zXpo#mGG8kw%t08$2Vq>{2^&{TK#CjC{nIeJSn9vFfbJ~?^*_$9K6C_RHpsjik%%}0 z#U<>F+B-<*9OPwSxYPo<cNpKAL*(#*jWu^f@U>2XngufFGSnQ<{lFmmkukP30ZJbe z5)o(A!pa>`Tq5g*i4#l1^fH0w{h(*mnnd!o!u$<#>lLV5L3azo)Wc|)TU8<u;Rj-S zB=W)U<%79}T5bjPZDDIdLGA#BEr<rW^(xe@pnHWuV#pZg)(c2(1=TsoYGCYZP;)?c z!@|U1G;CZPbXP1)Y{#M#Ef*sBT0v<FWF{zGfoPCC=pF$OAH;@X&^@u(%!Z|3g(yUL zg6_<P*|i{wuN8EsDQsLEbRQ~cT>K7>adFVt5X?>x4bpqPg@FMUCts{#p#qXcoKcH@ zpBv~dPlyT#35o*<i-7@MEleDy#v&R~ufyyG_3eaggcv{=)Fy}NA%&iR#az(dM-dw# z1`r0>ONx0gwJ)%k3u<GD*$6R!Fvwn*T2g3-7|d`0wFxC`gcv{=WG^Y^!PL&cVy-Oc zoF5w@1}PgM29UilwWQD=u$T*K3(43BF@P}0UYL2Hb1PtR3lqadd&FXf11LSn*$6R! zFvwn9dhv-bz+x`Qy$Uu$3?K}$7pDISA9D+_?)`zoTqPSJ1`r0>3p4jav@Fr)2E<{8 z1E>$CVk5)=!XSHL=8{6Mz+x_F-a*YqhyjE__L5>ATx~q2dqI5!4I3c_5C+)`S4#pT z0*kqzaL}?5VgO-=ctlx9g0WzwusDX%pt>DoCJ2KSkU?-HV1@%|-a*GkhyjE*km+8Y z6ijnL^A378LJS}bvX>0!G7vNG01F=&O^iLDIstj!fs#9aVfIln?*JN40GR`7CxK`X zKFrI&a098n1BoGHSnY@0CIFRXAT^+~en9OQ5F2F9O(M(zwS7S9K^RmPfM^hgxd~*> zEh5YTwf8{!Kp51Hs6lF<g2X`hHXd_e^A{OOsCfsJHgz%}^A|cuZ48ik=ooenEV?-8 z{&i5ez`_hU&4By|QxBSBNV(733cE)Zl=onAAR07=2g>`Pb^^LvKw=;@xG>0UP`H5P zL2Y+Xe*r{;`1smxu=xwnef1!<APh4H#74)+enXZ6^&dcdP*|KuMh#<-IOwikm>r-v z0EHJwoDfdIQU-wPFasMQ1`r075im1A?#AUlm>L+p2aCC&vfIc;hyjE__QKSXLW`tg zmRTV8n%D?2fH25jn0cW5NvwNwu$T*KBbeC;F@P}0UYNP0&_}SC3v#c8jSvF}gY1Qw z2O94q*1a-mnBf3&ua%7u0|<lcg_%nVU4q42kb7-xgcv{=WG~D-P`O2{d(U7o7vx?$ z8zBY|2H6WUmlRqh9Wxw2?sWjQLv4f@K=#7S1C@`&y0-?4xu7<JlZ_Aq2!rf}nM(?N z1&g_$`4$%&AqEfz*-MIfFtwmE7Unk?4VrIpvk_tdVUWErwWQK8^I$ZnTm_j4!lar7 zQ@<vcuN7k)2{b0)D#UQYRfwS_1G9{S>BUD!lwq0+>Z3h#6=DG4J7k&*(ueL|Q2Kr1 zD#QT7CYj{97o-o}T+kTgBUd2?5bi-Tmz44sqz~O(P`-HJD#QT7Pms(7l{+xC_`((> z2hs;q3!_2vL-$;T7(m!23lR>al)oT-F!NwED8Jot6=DG4DM;pm+(9e`>4TXEqe0<t z%T<U0gx?^U3vw?^4I%SE`e15dG-!V4hN}<*2)kq>!hw)k$nqe4F!NwEsNTHhD#QT7 zbCAp>rThiygP8}TL1O_|T!k1w_zRM`$nGJ;2I+&D2ctn_7nfXx7(m!32N4dWl)oT- zF!NwEC>$=h3Ne825+rj8xe-|&qz`5uj0UBLbFM-RAp8f(+&M*vvIN--Y;2G|n0YW7 zG(U94RfqwELvj(}fK5LxF_1o(c`zE}-cznZ3?K|DM`3zF^FuH-Ffm*-sD0>=2XPau zTnDKoraiqRkFOP^|H^Y-@R%!1KQ+f&Ir8~hL46q5S+~@-12p~&@-L{*1v*<5gsE)@ zC_M1ZLBZ?;xdR!4%6}MtOFkryV0>!RIXKK`asSr>x{DSx2gS&B&j~c946@s!2;m-3 zI{;K>g2aCmAjFUIGBDh2VPHVNmldQAgkgPP<arB__=j4=`LVEc3<^V#91O$6iKSus zKvxNZ%1aP`Ng-dW57fONx85Vdt)MwFkX{fj=;LecSd5q(d5B}a3?@!24Kf>qL1`0I zR)W|d3=3P3TkjL$R)<1FT&O_(35qvZe-&ir13c!y=F33$_JY*HutO1FD=001%mkSS zqCs*2^?a?M^Z~*kJ_zHAd)R!#1f+BXy1y7^*O#=TEfT+ZTX`867^=J%{sx&1GB2PM z;U`eKgUy%m6eGls@iH(xY=PVz3%bJ=qz@Ux(j9X6!0vPmDduZE0(BF}oJUY|@SR18 zoF-uREi#nwwZhy4GUqYW9MD~|$Zi3#VeUcB2OxGrEh25f(mA#A0Vr+3=Can5@U?>c z4RQ;}txuqC1>GYH5<|u?x6VNdZxCCemalaOD?b=h+pVB68RU6mP}qXp1aj+Bs9QmI z%!0&_G0d$VC5W^Es>_kpz}U~A=3v`10-JXO-LVZ*528Iv`C36~6J#bReS&C^c*z95 zRuCV=hGEeCyx7c!<%1bW>Du5o<UVhZUWqck*5gQLd(2_sZw1Y}y~Q!_1{xa$>4RaA z-sde046ryk<_ZfHhzi(#lo!mP`(GhqAo2o|dq8|p9DryLMpp|G17Vn&4OseKptj%( zS0M%v2KCKA>Pf{M<%o6|%s-&E>nm3w1`r0>ORAY5^$A$a1<hl<aTQ_!VUWEbb)@1Q zSj+{r+1|MdF@P}0UYMDnItk_{m>4cvpaL@-Kz+~;u0jkT46+xOUVP#iSj+{v_mis- z0|<lch3N;)V-f4#131k6;wr=d!XSHL=7Q=wV$GGP#2yacT!k1w7-TQZTvF%)Earm3 z;fJdb0|<lcg_#H1M?|c9Pv9{3m#Yv12!rf}nF}iKh&5NC3Nsu)eda%|LJS}bvKMA9 zDRc!Eb3yZY|6GL_Kp12%Ddxe{Uch25s87e>Cd2^3AbVkINuf2Wv4;bbn-BvCgX|^6 zJY==7xPZ~1wg<>e5Jpx<3i}2Y_k!m0SlomdK)9hAQE!oAu1W)DIDqE!*xZB|Kp12% zDdxe{5;LC%3m+H_(~FM=)iucTc^1&Rh*&c~?m{=88uNLe_7}|D6TA!zFOcd{m^h4v z)vCyC4N#d5k_WA+1GSGpY>+uGi7*G$rUI!4VNjU}rfd0HVQvDM^NI*_K<!A7UJwSA zDIgkzL2d%kAah<5VGeQ|7u3%Ag4Cu0nFGRa@R$Re7i_3QP1B$>{-p&nFSrD)%>gnK z8LwbMZKJ^C4sh|eg2ERT_Q>f5<Ug1?(A?dHKfJ99oDg$Bc^D=KqCsQLpfUv1jzM<| zNDQO~7Y3OP3Kx((sE-2b7lCLHA79%NHZN#_6fQ7xKzh+Jvfq&9VDo~Yuy|098pa@X zGwS(TVRnGx02E#zaYDETOIZS{3pw0`7(f_Q*1*gFxf_@JU}|9W6)fh0>Hsb`AqEfz z*$Y!k3a!(KS@wb4%i|`*0Ky=9VdjCxEQob)3l?)hZ7x1HAqEfz*$Xq56#5Ppb3yJE za1&wxVUWEr^GF$=H)+BQ2atP(+=LiF7-TQZTvF&BEarmTE8-@^0Ky=9VdjC#KVrl8 z2^Mof?iF(rVgO-~y)bi0p>3Km!vW-82{$1I5C+)`GY?eG66@Y6Sj+{vSISL@0fa&J z!ptRweuKqakb7m^gcv{=WG~D-P<c+QdtF*E!vWMrlyehe0AY~5Fmp+v=U_1xG>@s^ zCd2^3AbUwM52hAWC&2s$qe1hSN^U|7APlk>rj}G1W*&?N)dL_iL6}stVCq%6`C8G( z_dxr`Wa5MvK-i}hvrLBR#YbDr!!#Gv=e3IyVgTVKWSR@ohwffbAKfNShyjHEkZCSR zAG*1qc~`4AAqEf*X+wkqDfI<NAG*1q{ALj+!~nu;kj%vwp6GHQedy+b#@)^0gcv}W zr5)j3QtAtkK6G<I`Pd{*hyjFSkjw>@>oB$G?nCE;^ug4^XwbZ?QJfG12ya0%7na7+ z%|Yjb^uf%7(V+6dAWnz@gn2p;;ef6eA0MO-W*&?Ng@az45CaIOAejpaUzi$vW`g8E z`e15dG-%#cCr*d~g!dqs3sO%k2I+&D2ctpl60JBP1`rnMM1%t=^#w>D%sdzk%EuaU zLJT0BgJdqTZUw0W>4TXEqe1ytEl!95gpVMZOG<qK(g!mSMuWmZB~FL|gk`!A;Q(?6 zu^6NeW*&?Nr3a-rAqEgGK{B^zHlpk!WIjkA%sdzkns-%*6Jh}2Gf3tVG7DKAqz`5u zj0U+^E>4I6ghAy#Og(7c6{ZFzhKmNZzjt&)!Vo!+64PIi>EQ$ScW61@-p~W-Yr^JT zVQ!@6{KJzT+V3|5g+Hz56Y<UM!om&Y4rC0fV_^IVy^wSO<5QdVz+wKKnS8Ady!@@8 zzT=72hmL^eEkJf(n1FB(sBHu)mqFrJ`Viu$co`VpwJ<Q;gwA<_<dHFKJOp`;4J3bI zF=BrqEU%!aDVR91G{{^K2AKoubAZ?l{d}z&Q1^n|`kn~4g64BUdO;ZEZimHutu0Rc zU<`8$$PSP^48z2UrD6I&;|ZYp1H{*vz}E^3Taa5n5aCvtenedKY~pKOupbewPoQyv z?pByMu{6kSAPh1GRCj>bAPfpy5DjwcM<U#M0?Dlm&^Q65G1&MB$gEFz%z@2AOGrY- zZ9wWl_{0RhR#3VHnF%rvM1#atCh@g`(lQ8x_#licox<kdBqk!lbAbqdE6lDt^|xAP zNb!U3`px9M=L9kvWM0E0gnCdOf!*0Q1<9P#ybKJVTNoH_5x4^kIecJuQ{9=!*Xjc` z3uMk0s5$uV07Fg_u(@53TVZYjne!EDP7_E14a4#*az0Rjx&h>0a2P}Ne1n>U?fxiO zd}+v`##hB8zE*G;PULF^nFljlW(r>`C|p4pYCJg1u$c{uuM<e&zeb9`6=v6!Z--h+ z<RN8ROT?igAhSVcR!qSjUoMjo;%9gn7{0eKFx)0^7YlOuz~ZZCGGFT-sGC6M{D7K+ z?=CTH@pWY~Un|T_Aai~~&A~F=3%_#|IsG8#Q;?fLeg~QJ3u?|HkN_Hn#XG3XgGpV1 z`UMnjptypG|Av}_EpA}({z4fw-V3JiwSwXTWG2Ww5DhZ#%v8QsQ2c-}h!4V`u*YUL zEZz?w#bbv&e=E!`g}NOrCaV14J9{(S4;=xS4Khz-8X|s?^Qp~Lg!oxr28KT^3=DS& z+y#XkKCpOinabDt1?nb{Ie($%;Jb4RIlhqdDa=hEbN)fiX$E-$4a4FKIsKf0x&h>0 zP#D9s{D+!@ElgqYbwmRZUmCwSTNI}8wSvQN3STS8Jeb)>rt`Ie!WD#J=7Yivo7u4V zDnJT<4^{qFm|Z1@+FJy)_*+5qG>TU~{|1>2GE-p&B3_W=>kX1Q=Rk{sS{WGb61bZR zIecL8Wip+wbqUlgkU5M{bMW1<j4i%urt`JJ+ypX*32F|;g?9{yyMd9@4{|;Qxe4TV zkU7jya~6XH&@e3Ck;|VNs9!+g28t_~78a;E*y08j?;U!Gcn9f|n8DWyiVKjLAoD;p zNL*(oUn?knKp4aaVNlp(GaDA~8A$P{p~c^dY}XZiNPW7E_ns5TY>;^!Gg0H+1$u}1 z6C`ua^D;27wlXl>lVM^2^>IP^kTJIKLC#-upk{&0VS}1ef@}bk4KoKhzDl5aLGA>F z4OA%uJJcL(_ani=d4myZI5*7XYX$ioWG2Ww5DhZ#&MdxGP<Vhah!4UbzhW~R7S0!t z!tI4Ve=E$coQU-;e~cmZAgGN5G8<%`#cb^1>@y1?eu0;Pfuogy;l2zLLkdU}8pakr zuyCF-i?5XhY8J>G&<&6vbIQ=n0C8dFAg5>Kd;xP4$Q&-Hd!~RiqG6ah$oUl1w*e^w z`4<$%AT|htZsZ2J2V0oJ;%kXHBEI%a;A=IQ4QXeB%mkSSqCsXEEahtjg)0by_#lkS zY*>6XAcenx34bfhE{AK+TRvDo;_Hd<;UgfkLFO6EMZ^oJJcO-x{DWl9MP3F5o>m5i z2Qo|yaUe}-7+d(j&IfUs!`He6Y8J>G&?(#?bMVz)$ngbR@7ObkuNCGdkU1b%gUp$Y z<`xha<{sqy1xr65d61hxG{_uKOn}T;3lc!XFmsU0dC-^<nldm~02)5n&c1-H?@O@- z*#=e)CN$>qwSwXTWF{y+Kr~3=$!5M*5Ff;bVUQcKnGK8g3Z!^svE*-s+4W;CU+X2L z^?ezRkoA3HSSk|GI5B9g1k6ql4bm&v%D@2Ye@ex{LIos?I9Fqf1FGLPAh`#m64W0B z(IAYj79<A3Ff|jf%t?UO%Q?geF@P{=&H|*KRQv*qxuCH&r#K-75C+)`GZWO$hxr*M zhKqKXj~GXU=>g3hxWoxDfH25jTzc_|&%k0X$h~fHLJS}bvKOWwv|bKoH%tr{{Q-x$ z9&thpAPlk>rWZ7ZK&-hQ3oye0G{)~0C&U24AbVlvl0q-QVlHT%m`|J#0|<lcCB;0L z+8<cV1&u-b#R)NhFvwn*T2knMh1kO(AWnz@ghBR_Vji+uSX{tpP?-%f6NHh~k;Gnv z>0Zz}v7k611`uAc5LDWdWFlBG%Q8%JLF>dq;)EDLm|+ol=7QE^5jt-g7CtZ<>>vUJ zsLVoMC&mIT(}*<#<Suk8K>ZJp7^rLmVGtXJ(fKfO7!4a21?>TWiCyMpU=Ttok7434 z8df?Z*IA&l3?vU48wHIyg4iH)go!W*xef)D1t7g34099691$YSL9Ww5_1u*?m~k(P z#~j%Du7oA1`ao$@Wff$7R|{I519B%aF0n_gqhNA3-1u8T;Q|XY<oE{p52g;Z2J3`2 ze`|>=#2irGgUNwt&>TD{?}OqM-7O$7kQ!VVWHu;VK=PnA8K@lyqCtFoZ421?E(xS? zftdr+i;j`~hAamfqX+RpVR2w7Y8ZpWE0*%L!t4OW0Vupc;)HMvmNEcThlRxnF@P|r zjDVQ|ayKsb!PLO$Em+J2mE93>LJS}bvKOY76q;u_W|;+YZ&aKR0|<lcg_#G+pTxR1 z1&g_$HbP9C5CaH<?1h<23cUx5xght(#R)NhFvwn*d7$<kvF;UFff)`U_a?*%F@P}0 zUYNP0&^cJl1-UmVPKW`7LH5GT1C?9Ey7vecb3yJ+i4$S~VUWErb4j6PR$_(&$h~QC zLJS}bvKM9^sC*>Wy(L)81+|qj;)EDL7-TQZTvF&WSj+{jm&%G0VgO-~y`-22Qwu6% zVSa<rp!HHYaY76r46+xdmQ)&M9*hQ+s~|H$m{hZ1>X)qNYek=j0<D))$q-@y;hI&L zWgJW|K006rrn#W?M@|_+3?O`kOmji{(A^74zYZBf3?QttnmqS{^r4#znj5yu5Mlt~ z79?{?DStuw(9H$q3!4lf1`xi3WG<-OfvLq8wjeo>KA2h<4O)L>l_A6c!X|4F;Xq3H z3(^NO4@QIXn?;5Y0|@sZnG13Uu^6NeW*&?Ng@aj!5CaH5K{6NQUYHs}=7aRX)WT@c z`XiGJAqEh(S&Ik<LS`Y$gY?17gVCUR(<noT0feU@nM+Ff3(^NO4@QI59~oo_F@W$J zBy*A7Lx>I12Qv>wgT`j{GK3gF*kv6e97rjDLHc0k!Dvu8=wt{nfbbk7a|yW-SstVh zW*&?Nr3bAHAqEisf@JQLEr_xN*$ixKkUp4sFdDS}NFzgt0fc?lBf<fjeq3T8eK7N2 zG|0Vb8A1#o3@S%qdO_=tU}|7uxM)!O&|(9`O|Wtuq?VZW^qdWR;PyBz*G4dGr2XD{ zkbgmaF3_0|APfr!(0T`u91O$6iKSusK<40E8w4{CrXEIv%6}Mp%|=KZ!T8jsQ*fAH zGf|+$!V@x2<I8u?2{h&jvfE(`!abmN0I19aiGSFH5WmXHz#!hr!0-sV4h1BSjA4CX z<nelt{EPjFb01*o7!-yeIT(hC6HCMNA)os&XER@`3)H<Jw@MJ<R?r$7m|0-@5n{c~ zYp6fb-3k*YmIj;4z`y`92UJ$V_^_}AxmA(~w_0pQ#DxshpP+by^;bdWO5rgFHV@(v z0_jJC)Pu0a7QR+cS^${|G7m(9#61r3wSv+I2!r?_j4SS8<KZ1h>8K@uzZGWJiZe%B zPK5G<&wVHi{q-AUHpo1W?Fc`C(j9Cbgk>v2{2DI<gLEqc!($mHhH#K3Gz?33$l(J! z_rYf?U+W&In?UBsK+VZSGXunhnS-1rVDlh9w(_;Y+ypX57HZCPkVZ5NGY2^zfY=fH z5$8U@(m5ziAZv$-6HCMNBA@%PWE)>A$loA2kXz-TZe0lyK*KP%PC*K95L;kBU#m_6 zKN!Q@LM^v~#$=G^13_U6au&#~@=&)P2MM5Im|GpTA<_n@E=N-a<|;tV!FDzSY+i^b z8j%k~9KN<VZ0BnQrA?5Tp!5l%L5AgA;%f!*L2MWXrA2IJ!}7rdq;<l)n{bm%t9b z*6T>~LIUxSc_H;yn8^ql)P4tzjUq%C7(jXzTNxN&aiWv~3l)ee*trieaR|SGWKJNt z2gC=(0f+`+bhRKc5QeE)fu-*SY74q#2r+;#sBZ>RPcq(#Xotc418TdvWe72VFvwn# z&17I;h`?elXdcTWLx=%{8FnJl4=Ltvz+x__&E}OM!~nt|dtv5*+VC(x!NhRU9J?^X z0n`We$q-@yVUWGJ^x_jwz+x`Qy?z-&3?K}$7p5OHk43C|ci=ELAVY`&ghBSg%mvkV z#F{Ix8+$keWe72VFvwn*xunn;Sj+{5Lr8`Y0|<lcg_#FB_kmdV9>8I4ScVV-2!rf} znF}iKh&5MY4`w)k`pgj-LJS}bvKMA9DRcoAb3yZYQ5ixEAPlmX6!TzePhc?@)TfKd z5Mlsfki9Uqq|gd`v4=xkh7bb?gX|^6JY==7xPZ~1wg<>e5Jpx<3i|>U_k!m05;BAs zK)7NrdF77GA<S?9&F3X$2r+;#$X-(12~!K2HzPEk2MZq<4bzK{2Gupl^LcAxA$1Y4 zW`Nv<Zay{U^FZw{n7KE285oq1>QR_DjE2>!$ZZW!nGTW%t;q+qk3ejYIm$$s18P%& z)PpdnOa#&3e$jqNngE%jLWDV>b|gqI2!qNL5Dmg0H-Tu7IjTgMgWSdiwR7GewW&bn zfUp`Kb71p=6$c>h2dM{PP#S-83^Fe`2d&Kkl1Iie&~$+;24b6}^0$J*7Z&!&=?3IK zkQxvM&D}MG^S4e(hNLf09tMfSFlek9REB`sG3agqiNVxiqd{ha!UZG;>Z5@AMIai) z$Je%m%?lbJg$v9akY03*>^EdN*t{SpEN&b`4P%hH2?zOFVRnGx02E#zaYDEROIZS{ z3sW+L7(f_Q*1*gFxf_@JU}|9W87$_4>VUKiAqEfz*$Y!k3axS&v+M)8HzPxc0fa&J z!psAWSrF^q8Z735+FV%~LJS}bvKMA9DfAUA=7QXtlOe<a!XSHL=7HMx#JX4K2xd5d z+?$sn!~nt|dtv61LbqTs7v$c83?T*(2H6WU4^;jU>)tz9%mul(C_{(=ghBSg%q4|3 zIf@w$AorGJ2r+;#$X=LvpmLU2_x4~h7v$cu3?T*(2H6WUmlXO57IQ)Ft;i5!0AY~5 zF!Mm=IkE1wIffYypf+Mvh7bb?gY1QwOA0*&i@BhA%$f`#1`r0>ONx0gwV*ly<~JA( zn#Zim5Mlsfki9Uqq|z|+U^J*60GSEGq?!d&FLRc!6@7dUG>^HYN{9i3U5;ax$uPb6 zXo<U+=7Q40u__@35T1i%?vY7SEigCWGZQ2S(g#xuqr(^&7>-m4f$<k4b3y8f#UOn! z^I$Zn?|-ODhyjFsP9Va8l==ds4`v>W2IaQ{RYD9PyadTyV%-W-2hs;K4@QH=-S<@q zF@W$NBy&lrFF^WW=D}!CyzQwHVgTWglZbEtmFqAyAUEN|Abl{kFd8)Px~ocv0fg6} znF~wf_{;>!f%L)5gVCV!VMmn^0|>L6Lbw;Co>&ah2Qv>wgTi53l@J36#~_&t3SXES zLgs_?!PLTN(7fxGDj^0iMlzR>S;+ERPGROZP`hMPl@J36^PEP611a?dNFU6dFd8&= zwV_Ig0fbYK%tdw&AvQ=K%sdzk%5Uqcgcv}050bg0)E6LqF!NwEC>+*Q2{C}M$QeX9 z5OO23JV+nRJQxj1538z#7(h4&$=sY<h`2yD0~;Hp4`v>W2F<&!s1jlT;Uh@qV$+XH z45SZc9*hRLcUhGX0|<l4eVAU*yemu%ObizdYJYDy3kgHyJW5P|MdTbGxW7Zo@%D;y ze667VFYMe0m>a1zrVpBbxO0y7`_)0=5AHYj^0!3v^0!diAE5a}d~>@n`#|nM#-KU| z#_u=}Ne3`KwP^<&=4X6**RmxYve)RY@Zlq%c?*!;CoUn}18N(A%4LxFnF|Q<Tf7Vm z8m$ZrPoZ<3AbDgA8xKLAW83qAuT|kMV!repR4;m(f{7DL!|Vl_1L|{t_!SrVS{0z~ z1-Vs|2)AZH)r0gOxX9O9@Q|<d#AJRjhUIIJ9UyrahKUnP!}Nj16F~I`h_7;quN4-y zAh&7};Z~80h`0cS@s5Xlt)Ou*5Qe#hT5bj9RZ!glaw`af!WKk>+^S84TR~w7QV+sE zplK15#$e+kAaNZ$=D_Bmdx|0BHX!vNeBcsaD=6K9%mkSSqCw&^SNK{%X&Hn;d=SQ! zPGR$J0+$itDU#3M3bQNYCua*!DP%u+{p%-3KxTu?tGI$t56UC3b02z;%(>0Wz@Xd8 z!0?Q~esbjSf$dMea+$By1!@+^96hKx`1a!=rwQbJbTBu8%+ZIMgKs}Maz2oOx&h>0 zP#A;!4#EadbFl6Gg~ivL3PgNq%-z>gaD}fG9EO+qT0!Q)%oe%E*9r<(5C)kI!k{q2 zW;QIo4j_fULMeYM%&s$>o-HpbA^XYy-@d{MG8<%G!8PphWpfoFeutNV!LXHq;W>f* z<jCOzi?5cee63%gZUUKO1T_cWesXN_b>=ExE6hzGbBv+pV43cPpZkEEevtDi$W0)> zgUm63nuBjYIj9@~sR!XRP``k}4HQ=(F%UL|nu9HFVDX+%hlqEOo{VdJt)RF7nF%rv zM1#bST<2>A#SaLB_#g}ldu(RI;(Z5FJTg@Ax5DhYv7^3aO+BP8`}gGO5s=v+^Av6% z;ukrenp{VS-{oasFl%LCctPO259IKH#e2<lzScKTH-XGChnj=$ybt8~Le8f!H-XHt zfSQBvybt8`a|G%Jkbgm84Dve&TSCpj7N)THvS~(*FNqs`t>7@c#@7lm4`%kBn|!UH za0OwI*&qxGGi+wV;wu9w{14Rgw<6os(E?fDv%BL8E68k+c@nn}@q!#*Pms*H$IHNA z)ylx|Qih4aAEXHl!`dFm;RA~=otu2EbD(B{%&~@=Q;cQ?hzm0ZTYQz=<ZFew31p59 z)SNbuMl=jF2RZ#9=TnfIKw3cN*h0-&0un&OFmsU0pAx8FK;Z_8E0`8Ls5#i;1{UuO zov86HaEq@M6c->fLFR#Ika-D@`C38o1HvFa2!p~No7u2<Pe6*t1uguo$aeX3LGo$* zQpKYnvq9zw+(C_Z*t)JeNaoz<Wni#xWng$E!^DsX(u9Vwg%50hyUK08)+tc4K;}3= z&A}J%$nn*YE(FesIk)**VQvDM;|MipGMZaJT$p>Xr5}(y$W0&`WR4Tm9DMPPoSs2_ zV~}2S><l#r+a7e-I;ItUh<NXDe%``yhp!bB7a%i1@d2Vi=8AmcYX$K^Y#0WGJvOsp z@g9K`j|pA;tuVW8+~I3|fV7Tj%_PV=CQmFC8)!TXG$#zR6GVgcwlXll+O~_TV4(|= zMeJ|?F%jW6kjw-m_kj4Ib~lIyVRW@1F%X8SDZn!J3L0}fQ6<Cx!l1EPka|+_2`uJ< z#uQFf2{C{$$X=M4pmjDdKf}au(F*qv<0UXXAal=D2{C{$$X=LUP`v|F0~5nVS70$0 zG&XpyN{9i3LH6R(i%<Ll7IQ)COD<FiF@P}0UVQp-$!Xlj3<uEI)uk#S1`r0>i%Ty) z@dhmBg2LfSl@J36gY3npAD<j7E?_jM?gN<#!ua&zlQVdL84jTJCD*Ei7(n>OeMFgy z&m43)lP8$wg4UPZs1jlTVUWG(dWhkJ`mTi5m%zdYMiXN$s0=_}U*Z8RBZxHv<Sul3 zsIk6e$3sN;KjdX#a78NL(CvejcF1)AXub!m?h$0H0>lQH<3@xzxauUBn?UBc6JZW= z9SN#8w%kVe3FICS_P}EfY+cBNN2vNhX*1*nUn}E>0HzeQG8|+kGTt!(wakaf$;{vf zkKw?=3^~3*{)4Flt=(8q&EL9X8pIq>-h;`3XwcjpDDQ*n1$4K7#6W6rVUXFNZ~@7K z+Bl$g6^I7$@zvF^bs-)|;Q})Uq!%3{`wdwRwk`w|79Sp?hA~LpipPAdFgrkT02=cG zi4(#-SjqrUU305ShyjE_WdzI&kh^iY52gl2Kfz)ysO-K|CBy*2AbVkINuh0?VwPDT z_ui`#VgO-~y)g4Y<DJC1cM2ABL2ZNwRYD9P46+wyE-CaIEarmT`>0BY0fa&J!psA; zmxy(*%QMVy0J--`l@J36gY1QwOA0*)i@6~8KC2R90AY~5F!Mm=7P0RAg2h~rdtX!u zF@P}0UYNP0&_2&G!vW;pS5-m`APlk>W*!d-^Xf~mm<wtnyr~jm0AY~5Fmp+v|6nl} zw9evPl@J36gX|^6JeXQg84HUG7!6uy@u5nH0fa&J!qk#V!_0%xpmG&tCJ2*i7EJw> zw|uSW^8%oC7L%HV7(jT<3(PVOrWYUG@D0;k&^+pfW+4U;W_d}TxgdS$?ggdab<IKy zARI%cxgdS$=7Q#w)-($-fbbS1b4e+GLHf|m1?7uX%|Z+y%<~En4xn-erWRk=g5*H@ zU}|ABXx+k!W+4U;PC+u4l=2s(4`v>W2IaS9%|Z+yya&l#kUNOQAbl|NU^FNkmNW}7 zfUwAGL^y!l3sXbLe2_kvS{Mylx3H*LhyjFikjy1y7P34@AIv-$4XQU6Gz&3+@DU_) zNhyCp`e5e4XwbTadCfu$AT09+5e~@iA;bphgP8}TLHTV?vk(Iammrx-O8E=Y2Qv>w zgTi4}vk(IapFuL0kQ<TZLHc0k!Dvu=n9(f60KzJ75#ey;6QV3ZHUk?Qqz`5uj0UY+ znAR-B0Kzp$=3>*2OAMqBW*&?Nxpzvl5CaH<%2AkJ(7FYf8kiU^8q_|_cn9$-tXv1F zC8j-n<{hM;Ld!W-gZF%`pgs(!&j!LUH&Syh6y#q98t?nXx26E*C$Kw^2vGSC<KB4> zi6a=F+Vm70=Fhl#zNKUqWWTs+#C<2w7$V5-f=>wdfZ72E+Ihj_sR|zv;*WV57`$2; z7~VkF1%UJ+V^|*;dHfqBpYa#5UmTW>(c>E?PAm;F7lc9UJ3!?nh<)ZGUu($+h<ib9 z^(MltpfwL5y&%lPC(v3VA<(+#JU<wJg!&WRtuS$7X^`0<4C;%5%1RI$gkfO|a;py! zZp}c73m>RILGcFbuY%0<#bXX^UZG_vq#q4Z55gIr_*y|}0c0k~JP-{MKk<*R6_h?e z7{mu*TyYN@U*3U~jt(s3Z-v=4WBSw<mgSK7q<6;W#6V_)%&Yhci7yZvl<r{j3MQWs z;!k)P82nlp7~aY-F+_nBqG5QtLkb_*e({>me64SwZUUL(4>czT%?uD1W)5<ifXypt zeBo<_xd~)W0Mwj*kVZ5NGY2^zfY>+wAl87u(m8tCf{7DL!>k6a0fD8hD_{6pLH-8G zf!rDhb?X9<02+q5^$1dUgV+=P@U>=a<OgGzTd3t$P(DDOUjv0L$XOt_20`7r4<vww zVQww>f=C;nx*Sazm>Uc=2iu-**gT8J8q|DH@RhF>lr}+Tg3>351{o$GAkYfpgV-<( zN{iUchUJ3;Na<Q;Ie#n6E{AV?txu8WS$sA?=2@a}%(H;TMqze>Xpr8JRt5%GoJ?qj zg$hU(G0!q%J*wY+Ah`#m5)=m@8idi+g2X@=rsf8gz87dM`le<f1`r1I%|Pl&#RlII z?J$^sKy9Ec%|Z+y46+wyCa8>usey^%qC2pd3+mHtYZhVvVUWGJ^x_kLfW=&pdv`Po zF@P}0UYLH+yb!VOwfKQO9CkGeF@P}0UYNO{JWi~+6R?;I3Wq(-LJS}bvKMA9DfA00 z=7PduU$YPc2!rf}nFrc`O{{wzeqs-Y1I<DVAPlk>W-h4wAlBR&Sj+|WK@T+xF@P}0 zUYNP0&>ygv3z{E0(k#RP!XSG|F%PEJ;}>Q)fci+snuQoZ7-TO@Eh+Q@Earm3;Y70# z0|<lcCB-~swXnE=(V)5<WF`nBt0RRS@EbE6K=Wg#nuQoZ_{T3qJwS@NbN*wR3z{E0 z(=5aQ!XSG|F%PB|)Sn?VKL!gQ7!A{lj|P?9$n#?_)<Md4V$A@#3*CHb%#VTEGca?X z@iH)kBGpSUaTpD&rBLebNm7tL#$UcxP<sQU7GzEs5$1r}C?NG93@Q^rG^n2ea}&s% za3ahBwaY+yK^Rn~fM^f~t%C;9Aaf#!FbBEK2x>RTpw+h^vm)`B1Dj|2@fS5sgVOi} z76I@)+Zilog3N{C2xz*1@nLkqHhysU!onUo-GKZDQwN$0+p~hd^}-fN`U2%)m>h@( zjopIE5Ky}S-7O$7kQ!VVWHu;VK=PnAKd7GpqCtFoZ8g|D+Xkd?ftdr+i;j`~hAao0 zX9I;r#DCN<2B{PH&({jG0~80a^azr}hb0&UFvhz<b>X>YAqEfzl{GN^Aa~<(A50B) znzvPgfxq>~e^9&#v@$S&Y=Ec)g?kJGe=F!*JP_82mImi3P`?<W0+rnI7j$z7L=2=C z!~*TR0O2jBf?&O@AVDnH<sYivFC~1f62B2*E|E-N{nurf7(i`f6-NHn9!CDw1O^6% zCEp?H4sh|e8bI~H?1xzeN+U2fDKy9&n4KURwEhW1b22b6fM|Xw4N6NO{zW9ik@c=% zgsgj;!NA|z@Q)YlcCb<hFv$Q?3t>UX|NsC0hp<2~0<jC^Z;&0Ny1`jn8)g&=4YE_o zSzB8PDhlEoFoF6E3=FV4OJOuf2}mA96N3eCD00b##3QmasDBAdQ%@NATR~w7jxQ!q znuPe@q7Hj{fVuAtH$*KcI1`}h5OkJ2$ZU{Z8axnr5F4fkMuWs)cn%AHD<~bUVB&8D zVVF3myn^{3MuX&zgYHQJF-XKOm=W$FQ7c$Ea{2%Z;2}Wn1>G5gT+drT?T3Xy0t>`F zxZ(|z|Iw|$SI>jgg6xHvPb>}62f`q|AbJnfT_E?u%m9gl<cakYNIfzJr3vKl2bqN| zkB^Njd|-MQ*<maQy=5I=O9Lw;Y#|~D5@fFeJ4B9&hk*seN91})x`(Uggs21YLFzy> zF&LM7Vfl>(oY4>_8L&a@!Da_GF@#Q37A|{XW-x*>6q1$?*ZEsOdR9Q~N0Ne<jrh_p zvU+T6<aVk-4Wy1HCjHJ}=Wm7Gu{~#zbPK4yf%yU5o)~Ccg2X{;VCj`u8l(?|L3#x^ z_*-H7FSqQ2)VrW`3zA32SEy)j2M40Q-?2jmT<4;X&B5&V;eezS5Fg}bV*LqI2hs<^ zAiW?O)J_0lSX%*>MnQ7O_z0El1(^+V6O0Cl!Q2I66T+ahi%$)<a$yEio<`OSviAa1 zj?{92hYK~mg3JY(2cpq2dV2NXB0tTwaFL&GK<)y?I|!2+_cQA8w+l*;+65qcKp1qd zGY5K^EWqdilEa35xDjmu1!%mWtAm9xj0VXg*D)YI2!rHdX^dDJqz{BadO<Wf7^Ih2 z`(Wx|_JH)3q~;dnB$lKq*eDcdR;9+5D8vV6R;4P~DP-p5WagzRq!tzB<%5LdlT%WY za}?rplZx|_k`qhfi{o<?G!#nniZj#mQd1O?GZKpwG!)bn;$2dUOB6H}qM=5`>L?`V z=M|TrDb-Sl56&+wN>0^*+w7cQnpdKu5TBEuoR|Z4iw~Hkps7%jQIub<prN3tP_0mu zT2fk+hv5>iy*dy}K@`;Rc$ld$v#b?rAt3<rKP*gw85kG@klLjPZ$f5$Kx#p{SeY3a z7Ig4|%g-0W{H+}#kg^hX2RV!esRii?$;d2LNGr`tF3HT#Q^+q;C`&BLOiap2Rme@O zR7gq%1xjLCs-A*#eqM2AN@|fpX>n#=x&lc5NWq|RQX)5?pq(6$8HhM5j)%k=`5_20 zPYK09h(#cAh0MI-lGMZ$J%x~bg_O)<aCD}m78Io>CxW6`N1?PhRUzIvC?r1E)j2fC zHQvuZKHM?L&(qI6SWh81HB})WlDRTca|#sF@{1HwQcDsubBguIckrlAvO=Ihn7<Vi zr^IT;)gFj}8i3yZ?Z|=ji(&FmWnc<quM!Ot6C}k#`WxhCFO)1mL$`thgaP7K^2-7R zv@EMY^Wc^7rB3=;2n_&S=?5kcRR*R&=?BCBwc}y+4vYqg3qb28m^zRcA&e`1gYpTw zUQoXU<}Lvt$oLNEeEB^>kU9}$FU&nK8e|4Y97Gd?ak&Sk7rp&Gr(L2&LKI>@Obv_% z*&6_rW8x#wFNbM@rpX7Q{H-9f!FUm*-v%-dNg15k1GNJr08#_<JFzrK9|(i=M(FUj z?oi}!HDh342+)W43nX43MtqxIMhv14W+t)jfT;uN17VQ8Awm4DpnDiW?hy!um<tkT z5GTH$u!f565&6#B+VYJT96lf9klX`010H%l5TU+@jW|Rf%#SdC6H9~ifiO56Knx-< zIqCWXk~@*D0NJY{0r3N=={iM%{B*rQg8VdiM}qwH0`fbkPYJ@L#%;+2zE%fbNLYc) zfz3a_;(CcBe=Cm^c>aL{l&(T}`CB#Q_*)m?C`-|X*+51Tg+Xx!vy)gFW-zi|4JpX{ z1E}v?Ar5hSiWGk<18Be;T6V$ofoSCMWn^>6aRbOaQu{;D_Czl1%o~s!K;{sGNzF4V zrA#d<(ulZ5wgY5u3{;NPJaa`Fk?vQ#!(SK7fZ74F8)WA#872mA1_lNY4LaunM4LkS z?ob-E79S)Ik_YJnVUS)Q8HBwL-b3sK)xjWnbSxl)@Ha>=$h>^0`JnR=Kzz{p1rVJL z70-pzAbFU1AiW?qXr2IsVRMC`HU~%?9d}@{w+U))7nH7s(hX1=SsrE{%w8BDA5BiW zu#rWC53<=HdrP2lq^64vvWWO0HC?<x(o1UGg4_>^8xSTnepDv$wax&Q7a&6z7#LvX zAt+sd&H~vY$KNU=4=xWGUO?;Z7s~vtYoK~S;RV$SrYI>7VRnLO9cbE+fYMS>8nmwl zB;O6T4MKq201^Ya*Fqjr9)im3BQg-TgH;h(9>UB4(WJToUbaC;A3*K`+f4*PP8w!V zz@3IIpmHRqVFlvTa0%27koQ1-y$wBU2}B1nFff2<b0`fe(?EPs*$1LQ@*sU64ASeM zh_IJX`hSDPUeMW0AahHh_C-T!P?-i22bFyw8YB<06NEwbZZPF<1+}q3?b#d)NO*$8 zFDN3~Cxr4;jUq%J%uJ9ypaDV<-2-(8Xvh)72bFao8d)Bs4}?MXo)G141+{5G?&;Bl zm<tjI$%EQEAWW#u!=nVz2hs!53$kw!)Ez6J^b9BsTHlQ>57Gz1AiW@(7)(z3J%Hp+ zWII6i{(#Dnntn}`5$T9f8H}EO3y}1Zng-V>lb>Edeh0-X2$LGOGE?|kOXLyp4J*Gv zaSAFAOH}w<@2Eh^Z&11d*>yyNzqJFZ2Nc#IF&L(#{D#>HqCq2>AR1JDgJ@9s4WdEi zH;4v}6Ts{Qxd9{wa_<inNcjz_V?2}~ZU?I)viydb1ENWF1GN0k&w&megWLtSn+Sre z^skDDH)Jb7_Wpp%k(&Ms)QC_2CTa-#L3ZAOo@oi90~i<>Ks2Zv0@0vJG!PBCZyQ8| z<Y8_G>3xA@FQL4%28+F*{s73_5~#hPJv$&iC@Mg79#kA8k8Cf94Qls*Frji<MIF<> zpffW;=7ZW3Ai4%>4`{z8h>t7}vI~Sk{sqy*U~<yM4J3CW+X1pyKm+0jQqzTx2Knit z14%EbaSL)kC~iQQ)c83wm9NzVnh!wcz{)mIynxDz08ReZ9h#7`4KzjuQq!Tw-|7L? z0}3yY7z|TVw!!QK(Ynwy0xH`;d{Eg2qCsUFhz8a9FgrnR0EvOzdqopcwt>pu1a*kp z!Rm-C+hFE^Xj0vPDBGZoQ!HZxV7K5P$VtZwv><5}-AGWF+<?lFnvMgsiBHEO+6enW zcHV`a0Slso7#J8pv;~v~m1`ir50np*hq)W1_W_c<gz`WS7JETw#)8Z*gPIST4+8N) z<r;_vm46@_B#&%wgcyJ85-a{zP&-<|6XG9`dkS=jZ*R!xK=gsk1?dIZ1KK(UqI;q4 zse{s>@(v`9EDzEL!XUjGiu|phHY%uIs4#|@3lay(gW4}3OsEaB28(+@XV`-51+@!6 z^h~IGK=TVAKC(Q>E)a&<3t|((<fPvOU5NkC%?8;!11d*q`n{q{e)<*AL+B+n4f^Pj zpI$)z2gNH0lNz^2rt`H5K=V4t99S6+ic?UTD5B5bTB8ps!$Ii^q-KK=f2#&m4=Aib zVlYfe84j}(MC(J-7pM#e@j+!chz6D6AbJ(dLTEV&5(Bw+hCZYW2h}q#bRcdAD<!fF zhnWMSNp%CX49|nLfzZPS><%0Rsp%h7UndygN&iqeQq#YHAtDX4e1?o+;_}B8s2w0L zfz;fSVPXKCCjz2V85kHqG^o4=(Q!~dXdNer50VGz17VO}5DoGZ2*cVTxW-O>3=#eY z=>?ew3Ud$*Y9E4V(6|DK29@g|8d)A>7YKv&f@oqeIq}0_gm5Ra9UyxxpmL<fPl*xv z@dI)LD11Sf)G*eW$=7-XI==}r2Ubpi!d9Jufx*U@zjcW*q?`ba*MQV4G3Rf60o4QY zGe``EDJdslc7kY79tF{$asoty?vMu2^3e1K8rOl@333BS4&>eg#*lIXRF-uZLfj5k zM`SqxGY3SI>IQf@0d4Am+y%Cq2!fn+*kOV@9Ug$nk(v%IOo>m2f1q}Nya)2@eHkW( z6b1$c5S<RC{h&0cd;p1q$`KF^k_YJnVUXSvrkM34u5zNp6ya}>UXXd9_8W)>wWmNd zXxtG*gUSaGjVuqc6NEu}O|1D_L2WBgyGq9nVlGG=BoC^0K^Ru|;+lJ5F@xv>=>h2l z**691?^#e9GzS9`p9JM2%Y*cRFi0<mCI*v}UUne46WI=sy&s@*q^1`gbMn(mhB^6h z4st&zZa|pS__;HSuk{bK4Gl5}R_1}?2ULa_Sn#*buz-|#ptJ!}lVZ!?DgaIIpzs2T z!7wFd9?VV<Z3s;ppfV4{2bFms8dT<i=-Ds}p=~3O7|6X_EFfhbs9bh1gSZ{6l*lp< zW)6rZ)eX=xub?s>GJA<0Heh$)AV^KapuImemWaHDY%Iv$El@d<)36m{Ek?*y$Qomi zdC2C&*dL&FfcPLa4`i4aKy4rp4LV03M1#sa5Dgkj1JR&9Cx`~ggY<zgNbepiMEaN5 z32BqzD)Ta|5dH?~1(^rxyMk!Yye^2&WME(b(V)I9h(?wN*$KiRy`XhOpmGm%z65Ab zA57fG8j+WIK0v|&SDE(%i+e!n6J+l^s5?M?SrC6Zln?4#g7_eLkewh5au2AV4Vn)E ztp&e>RtAIGG$0IX*WlX2(qWAmK5L=&ZiUjzp!8}ejVupx3kZYU1EPt+<fLC48-zQN z?Eu+Z0+k~*{cf-!KmES3AwLaj*pi=KKz;|sD+rSsw^!!ywSIuk8G_7#mEWMW1=`E| z!Ir-@!VXe?gVGg9%?&sHRu*X91%)+842CHwzhQQQXi$3*M1#(b1JTmZbOtKNLHunn z3!&vVNDSoO5<5uw4XR^~SVP<nR!U^~4KoKslj;Ui_A>vmgY0E~2t8{JMuXgn9;P5M zTo_lrA+(oygB@h8D=5CsAe9pmOR%R0nEO~fAbAcHoS?D><Sv<5h+jZ#2dF%V4buao zL1HkR;mF?#N=KkF6NF*npsklM|HEjI+$A#iGH-E!xEEvwIT(4Z86o{3_imWW*NVIs zlm%)(EDUrUA@0EyZ=gJkZVxegL1E?-OT+8{xf#UnfVvChUYHpmagaQ*egdgS#-REa zIs8FpA<N@q;|d>`9`rTSp!ST96C`Y5YG5?T-Z#z=IYN6DLtG*1Kzc#?Kr}HJmwRD# zEc#yNKTx+~vjdwLE;rz^7iI?fT71}E<`QUlAe#%*gD?FetH;Jh-pd@Zi1@wCDK7l2 zElv<jXfLyd3u+v}(krnv%-taW-f=<HyM*>KFQB5mAUA;WItUZm%PfJGCW-YYOdZHB z5C-`dM1wF)4n~8-kmW&qd>B`{gXzJRKi?qv1Evl{gX~ptgTyJR`7^-{l4d|@2b6AL z=7DH*jGk`hxRD?CAhSVn2g0PrU&T`Vb!?A2BrHI6EXW=Z_6Xr`y#g(xL3}XAvoAQs zoxc@Uua@8mcaS-t@CVT#j9gxW_#h0Dhouu@X^=h;2I&RS<Y16qV(o*egV_VpOYXj4 zPzRhAyMpm<0ft(NcLT73Cd$5Fn4i)6dhl@sXkdWC0>ngK=YGbYzcnWSlFlAM+n_KS zq!y%y-2HYS{UZf~!ioI7evnWCnE{V8=-3ZLhIkTW25jRXC@CTDo20{*N8%kis*<7* z2=S-RUQN(A8pt8&?ZaWR*B6upXrAoBd5+vdQVG7#7vxqYTJQ2*l1-g-Gar;_Kw~bT zjyjYLqG0I;CJz#WVNf`M*r4%GSRDhSLE>NhA@vYU9Y~B2#?}4=<qvedpnfRKU4MKb z;~vXFXY=_X?1i}pMuW_thI>HffG~P{7_<lX548RT$s=Qsy*_~uw~;!28B@sL+7J%e zYa3DmF#}}Yoj}C6CZTq62h?tmn?QPDVL~ho(g(sIy#_V>tspmn<^(nB5$?$eBEIb{ z5d_f(Gm}_%z|?{CfiTED3nKViLF>^#?zs{TF&88bk_WZrL6}f`egzfX1G1MGj4Qpv z^kPe2F~Jc3!PLNLkbkE@<w#9m7lO%8M?4|q$2rLDptu2HQsd{zX1-Pn=(<CYIj}Kq zSo*jU!ry8W3LfL;0HqBdPySY(X#Um~X#NC+7f2rrgT_o@Y*J{DIWRkkrD5hH>x~G7 zjB$hdginGXZl40$#}4f<g4DwFfoSA0OpqM0cEi+x%m87KUJy-cKLV+33ti0tIU@sP z7BQIAv=15!j0nS>_9sB)NKN}3;fS<PXm0Zi)DDpUK;iaShKV7Zfq?-;gXS_pG-$6Z zhz9lFKy)aQJV+l1gY?b_N6agQ++_ky1u}r@G>|+xb_qxL8>AOxE@&<jM3+O&2dx_c z@j>fGKs2&E%sh}@lR*Affe6UD-8tzHb3x)75r}+DXm0Zg7WaVWFhTZ$)^mVp&^`qa z4Z5owL{Ejf6C{u99#FjoD!)N<t)MvvkQ~T8J0cL_LumdhB?96Pm|l>5p!K>SdLz_c z&^|K|AJj$w(a7>3eIN|77Zf(2vm`+A*AfFU7bFgn2d$+5Vc2>KTxSb^!Q!6dP<Nb# z(tDxwQ7DZp53&n{VfKR9gfKbzX+<Q&f9Pg|?0o>0BQ-zCM3JALBBBs+PHLW*5=DOc zy?|sdsc8)qcAzu?!lb5)H{1AHPk_pJkReEWoI&XmboTNLP+KMjT!%4$(j-WkNh*Kq z1E?NQJb}bun36gSW+#XS&AEbT(3#U98g%9~hz6aL45H7$EClr#py?OnUYQt39R{jr z4M6D!ntzBr^8sWw$Q%$&svAg|r(F^QncI8<9V3I$Aa9|EDM$<##+By?&C^E2K>917 z_$q;h5y)PH1K868%zX)Iko*d25`fAnkh?(lQN!wuIZ%0!I7|<W28qG2Ks<jdC>?>y zTM&kcgSvkpcYydX8pOU%<~(go9K^jKGswZnZ5%@SLGC@V9d({|O)SKISQuP^x(8Rh zf!d+y_7F2q3p1Zs8fFK`%^<cxJj9(K_rlBoiG$>c^%F=vG6tmy<nRZXg)EPcjVpX$ zdeHkNptji;s2^ZzU^K|yDTxsO5t;`oNrtEc=>_Qn(Zpa}?!`4vyCeZ(4>miniQ#es zE_-2SppV1B=4oZ1;el)}Ob_xrEhs&J)F7t`5FZyto~PB=NBlf3PZEEtP67mj#t}ek zkzwvZx9b9u+d*nzZX=e4nFrF_l7y(U3C+`bBthZ~q#vZ0So>h=K>9!!r1wt}qMbpg z-+6$F_JZsOwG%)X)>eR}QIH%mwm{1ZFn<tB!^{Ht7sf`{3lc|`2l4S?T<IOA2V1$o zlY)phm^u&*veyMFM{2pykOE1opfn3guQ2mKG&)94uX|F+Pjf#~$WJ#QcY)#^gh`G2 z2?z1F3tpr`!Wh&p0NDe=J;nU3HRxqBp1I`%sr;?5w!jpmv<ET^hCy)#V#8<<8@Y}F z@j)0QkDk^D@j?1P7^D|OlY>Ee3E6`#53>iPmy)^V!Exp^Xxahn61-E+ItuYv&zy#Z z4SL@fG1db*^#C!>gFI#wlgHosCl8VipF-Q!Fd7ubpztMkS_Pzkq+n1uQF-neK0Zfo z7=qn|NCd_4IgpuXkT}gJ<j8gOs6LWI;7KlZ<`YN2Jal{x9TGk$f017npv*<b=g@pM znt>r=9(B?W=xha0;zjR2!RDi3@*p)Z3<@g{8#Esct9M{DNW2AFH^J0_#0X(r?Ojkl zLDviFZ^PWxk^>pv0gW*m<U;C1ki9VXz-W*eAaM{)494Xim|pbuH)uY(Cm&)zObv_% z*?R;kN9q`FNC9Gumr(ngp#Wh&$WEBwiKUU<d!dcL6*Tt@n&&;y2{9LB=92>A+w>Et z=$-}D{H+x|{H>t53(z<m$gLpvloS%*Pf#d?_yeYw*l>ZV1L*@{kiAC&`CCErJD~7M zsf3sd5(mkH`W+xlsPD0XitYi~OAIC_U8fX5{D*En$iH)-a-^o~8%5-&Yms8|(_la` z`RN7Ze^9)FFsX5ybBV8Y3v><;WDaZ&9hSBvO88qFO2G3E9H4Y{BAvf=P6dCf2(;V) zg*8YY41>nAVQf-pkU20riKSuYBkP@00-1jR^?l!f*36Xfx84A)mw|SSL26<8Ks56B zGDwbCyJ6};W`HnAFNh|!KLlw~XC}iAorakMGK&x<HP3*~oSspNJI`Ez%8{C9JjxL1 zp3u3LJY@*`L4JJ(J=YIJgU;;((V(&mM1#)t1JR)KuRt_N9u_7by$6u&C3NOc3l@7p zdw)UZg3dnx(V+Qz5Dn_#g6KR31_lrfl1H`|#0Je1fG}*X5Y*-XiKF8`SnLIzV+Ar7 zbgmzW2A$giqCxZJAR1X7W**4DFg78YoOH3F91$<b=7a2g0hJ>)U8q!$pDq%R^pYC4 zAoqjf282nCADJtBtvt|t05S(w9)jWpbjFfKC4cLLN^p6|09yYBQj<`}->LxB0}3yY z7z|TV9>VMd(V#Q+Ks4yw0}u^56ADCw&V&Nd=;!)@#6a#{Qwb>#L1nf@ImGQ?w-H$$ z!ps5Dq`Co7wjqWe(8CAp790dQ>A0c_cRJnxl_NDBYg7}Tj^9A-0C@@I*XPi4{XjJ6 z+&&NuI@b?GgUU4!4LT<ZM1$l(`al?@cL$Qagz`X2HNxK@y&&^I=RbjH(77%k8q_BT z(V%h-M1#sd5Dk(C*$KiRy$)^st!D}#>w{uuLCgh-d(<G>D1`FW7cA}pEpP(a2Rhde zM1#(u0nwoH4n!l%gWLkbAbV{J_*+5kT2Q^f(t>agNFLPY0bxSzo|YPjK9C-enIQW> z=k|eUP#+CMgU((6(V#vYh(?wN=>uVqUJy+TCMW$`)FRx8YzN5R0;n9R>32;n`RVrs zl3r5Nph_M2=>_C>P`rXLsc|cEjj#0uwC@8l2UdoI;uKUSzNzDH4XKBe;h=N{Qe)H1 z-^u{ZyP&WJiNP=>WjM@E5Dhwa07Qeza1aeD!$CBt3<uHZ=lX%fK<+K5hm_%<dgee4 z#O+|W5m|=A%mLA)x&c;(!w#NC4;!#Ma1dmr{{}qiA1X&``hU?teEMGlwFBfOkY8Uw z?+pOapnCy8H0Zoj5DmIF07QfC4FJ&~d5}I32I);`MA%Cx@2E5){0-6zG7ofb0Eh<N z3jm@)_XdDy(D{BK8gzaahz7}n>;z$uUJwmx`+zW^a(WIHdqL;_gUkiBDL^#n961mT zx*q^UBg=#A0%4fFAT}XPPPzzaLWB>p`5=2cpmL<9iz7{l_#xD9K~EP9%?Q1u#x2PG zptu2HQsd{yb-va$(ES!5b6{l~C|*Ei#ffJAR)ZEu*#;UX1F2!?<ZnFy)dLDIuo#q} zq-=xP38F#g*@I|M*#@FPWgCbFm2DszROdsj1mCR=5(Bx{rv*~Bfy&<-jS#nk)e%{? z!OQ{Cq`CpAY=bvY(ZdJq790dQ=~$u_cRCJ$%8{CmPqZS^BB6BL1GNL>C6HfV$}lm2 z?s5XrpgCU<ZOOpE0HQ(V8i@9V@<H+-eIN|d8_|Zamrx#HX+!uMq!(l^=rlAC4O+hr zqGO@<fXX!xA5{K<XplU}P7ns^ov@g{6*TS&Y7hD>gP02vf6+#Kdt(X~_q0Ln?}O6y zP#RR;f!u*C4{{3#gX{&3|AN}6AompXBisX$2en^7m{1!=r5&OVqz7as$i5{|`$6pj z5FfN|9z=uIv4d!2d5}I32I&RS#9(sL?+qk(BHID7SD*vp2U63oPX{6$k(z!xko1z8 z29I=*pI$(I2gNH0lNz^sZt}HuK>INub6{mSC{96TVoxW3>z7VQ84gNUAT=xc_*)l1 z^?<?}BnHEjl;JQtL9_uhy@ASb5Fb>AgJ@704x&M4!olnWxd9{wa<4!aqznhuGYRbw zw}aIYS%$;R0nwzo0aAt+r<OqX*Mr;zwwnlo)btNp<9eeDlE%@E2iYso4Ur=?{daUD z<{Sv^Kk|Xv0kR)t=PMZ|2GE&_AR2V8EQkiRLqRmCJO$D53=9k)8YB<W2f`q|3_XbS zPv~sLBUtPOmERz9LH&3T4H`EE(V%i0L?g?C>;z$uy%T!)TS4noK{z5s7*xD6;2J-* z>4AhPOfSe>(0(Ei4cboxqCw>{h@J@bC$c<99|(i&1&wKd<_|&jn8E~zxgc?nJg6-O z!m#!jt~Hrwu($_Q4ukAp1GRrHlm?a4AaP`QkX;}QvlqlBgvm*#4ZRTmp_>h|cL!9C z)O7l#m;7{U&_{k+%jqLOy@31=idPUOHEy@u=4<sq%I~mp8Wg9Xy(uRB{H=5PA>}kE zU4iV9nZe(h0M!EuYmgWWQ&LXD>;%!EK0Js9ouLS#L1!p}XwVsoAR2ULC(KTe8$e<p z_wMM2l+&QPgaZ_p(6$P(dvjpsfM`<PK+4`6hY66qIj^B>2w^nHPayw*Xksv~d_!n& z&X<13+6_>A2_Tgd9*?l62blXjW<v5DsM-USH6S-etb_Ok#BPDggV-=VFd8HV!)qq- zw}R3UXgvW4!^Cmz&3QoP-kcv3A?}5lPb!T(cS=YvDBdRALEW3<0kt0%1_hHK?!gsr zpgfFj4>5alVCEA`!|VXL8N@yVbr;CJFf%~nAbDc_1X7QTL2HGO!yjZ8vOGREuJD2B zL0<y|YPU?73<+D98W;_-*I+6{j?fzX8Pg!@Kzc#?Kr}HJmwRD#EczLW4pSiZV6y|8 z7%n&9vKM9sBPc^5X@>31*#Wg5NeVn>0pcU?%>ktckQj2B0P%5QP<sa^*YSY(y*VqU z^0%It48fqaR`~Yj<Ur#RWDm%nFt-s)gY<zgNUy>)M7=8zi~sEHCsec-WIrgcgD|Yl z#??NIK}(aw`V*!OWETj7{0pK%7$yg!L1M`AAU-~fE8W5LV9TEd(;;adrUpiX?9G76 zk(xi3OoyZyP}%{d8<3eG^FTB@Mo%{nrjsA{AhSVn2g0Pr--^fh>(~o3AmIe6V?p+S zaLZEuRtfa-4bMK86*Kr-VfE?`r1S$a3x;9g1fxOX$mKPN55gdMSUMq=2I&J~kX{f? z4hHEZ);^dzm^~o9WbShTceIH;L$NfkI5RyjHANvauS6j}EHOt%p*XWDHNHe4-Z!zr zIlnZo1mDq#FuTz9v4G7%G5~&bBDjo(`4zp72OlSZ1_CGyKuqNIS{w`cTURWEq^~#7 zwkM1RsRij7-M<0~3H%roPUNpyhnNjA10HA4u^osE@g&F$=-G+jv;^6)0@=Gnho$?( zJ9JbfMIkU@0d@8qfY!%=9D?31gzY(i$%E9uFgT6TFfk#gS#rxBq<lm}mqJ1W93JF4 z6n=IhB)ii3?8F;;sFQABXAt5_H!yif2ti0tIDuH8b}g)qfzcpw186-2QwI_wgmJYy zLHPq+FR1?sbC<<@$an|nT%-r{A@v`~UYL7eG{_8)IEW?&<8lv7FM2x|v{%Jq5yXC& z8W;_-w*x9i>bT{EL;S6KRzS{9>^KTBA7q}yV#Ii6Mj7NTACNfAPGtHB)NYU%NDVAZ zh^0aLKp3RA;2?i%&I!n#ku_%!?pd*z_%?UQVu(JNnZ&vSrVgYJghB4Pvy#6RwB`>q ze<`pQVlGG=BoAuCgD|0X{1Ym=2V^fXn4I)AV+q86=;nj`djTp(YWm_?N`5->SW14J zgZu!B8xSTnendX;wU$8Fc7n`-jcvoyhrlxa){14|v26}e+US_Y-|Df3zx4o)atSn6 z3NnXO3<`Icoy5{GJCOBGSq2%~2K5CMmO$Ko0kk#%+EE0lh3Ny)$YYlvIb!XGsRNk- z!XUjMn$&&-Qk_hfwI`r4z$wddr~NZfIa1TU%L+u=Cp34-u>xT~DBRx4FfoAkT!3iM zTqTGGt%(NFVGIlmAUXm{gXBTs48kD2S5_eAlL(y?*MP-d&|D?R{3@vVpgVa%{46LR zSsr932!re`Sj6Azvl6m4`oa!~e?a0XD-rpa(43~gN{Bv~nIL=nq4t92FhP9KT00O8 zS~mrvk>x@9Kp12%s9pn=-=O`6pt%N^_?MN4@PU;Lu<=%q8f3fxi+dJ8-LnEpgVsia z+yT0m4n!l%!^{G?2NX7-^*Nya_W`uJ1hiHHgkkF?aGjlKunIGL_Ceio1WIp#(tDsZ zvOKbTU~ED(sdWh`KRrQmC$jmVaFAII@dK&(DPlGG`Dw~(M4XeFCoZfeKmGEoLD)-b zS_6d}C{2Jcsp&%ID_<)MwA=!j1FOS8=@WE@;FUG}tu|}Hbr=IEO@h=EY~yd0f$9Op z6G#k(DXGI?c7kZoTq}qMot+4xL1!m|Xwcb-AR2VuC(KTe8$e<p_eQLR)M21{HfI&Y z?O=68)?qMnKs2dtaMsoaTZK-5+^6KMt&Q9deXtfXr}+*#Mh2rndO_+zG%*-go+C6r zJ7q1TzXFP{4M=6ohQHX;1I&GMwnOqHC^$jo6v&OB_BW_61Y+NS%7fT2Jun(12E#rZ z_*+5g2vpvJFiadYodokgj0VX)C3Aju#(Ic*L1vJHk=r<g^n={{<16a??2B~}`(a@q zumQry6>p$+D7rnw%+JEiCzgiU0dg~lodb0j$h|N#K;j^IV*LbCkBmWS0y+FaW+BVt zW8(@Rm>%?gFQ_gt*a!(*m>L)jviHI!h#aB$pAB0e>Oguy`am=>7?*ot?FIDt*#}U! zVzUFA7%n&9vKM9s`gjU#el`Lc9?0gx^dQgAg3<#>4RV?Q@o{0~`Pmh}iJzbK*v#LW zu@Qnn^KAI$XL&ZG#u3bI#L_UggZz77GosEWG(X!yMSCr_VAl7baV(hIkm)~Ev=?M9 zsGR`9u(kp$je_KmaS2*pAU1qq>R@Jp!WqVf$-!ulII=v5j}PNY?=U^s$_0<Di1Y$e z2ckjtHbCV_Ef@A|g``zbngyj-n0X)?9iyk$A6v;!b0*u!Pd6ZUf#My6NsW7f|M=Sl zD$sf#)Gh$o1HuQ6@VD-O)+-=B7~`2!{<Dq071kEGfRy&Y`k(|T&Ol5U4PqnLF(5t& zgXCdpj940^4}?K_K{PoSq?cIxVCrD@fb>!_rwl%^5I$j?oRL_hprN3q0G|6*&{T+4 zh!4)JN>zx}QGhGLJ*%vv5TBEuoR|ZiYK9$is8EtolwYo(p`fWytx%L&Qd*R!fHDfB zpaHQ?2V$2Fbjlh&)r{@PMDUz5EG*Fbya>}lqY03CM^Jbnj}=YW&);fr0FuYwL)+6Z z8l)B!uH;Uqfb@?P3<@VI&pE@#<;V>~u$vHxVD!vHaszUZ>yy||oq0sq{4#pGcNon- z51}&?!E?}bIWsZf7Io4O=-diWR>75iVDca}FbpcAKx|O^9aitaXps1h{gAo|rVb=V z2;*w!g7OKvUQj<9=B^!kA>%rr^EguWA?$^@2S$U;poV)u=72DIyBjnQeE?b~gXEDh z$lf1NIa0@VI}Reob_vZln;eArA7nSkPMF_`r9t{Y7^Iis5PvJfV#u6D#5IVyAaRL9 z#JA;-P|-ad_xW2vbKs!)W|v0@_pCTXeE%Q><R_2^q4&=a8!j+)P_5wh8)z;bG_M14 zPs(Y8dq8SH{S6Q%)aQ6YMfZU0B?jZlXE43k()EnP5dXo{z-Ul<xB!(SHC^)@AwOMv z93ejqwj3cpy@31;idPUOHEsn21X^D}=l($Ez~&ubY0Kv*f9sZ`;CTlQP`diFgTHmo zDgIUuXt@CjYmhz|290CG*rd=Pb6|E7OT)}Z)_dV7WZnVP=T$fiaXZg3{#Ii5g%N8v zOdYZtKx|U`L*OQLaw2TYFE|f_%pnGonrA>`vu8kIfyHo87_uCP<R?<|OwDmbo*^`E z?f|s|<OGnNA7q#qKx2#`I+=li0Yrn&Mg-BIHYA9SgNlRXLHa-#r1#5lM4lnE=XVDd zdqHQ4fy@V;2?L_Dq4t2z5(Dv(<w16WFv#AP6No+jgzgqJH~|S$m|l>%pgpx98Z_?= zqT8YNg65?`{Mk@GNFJmQghBR#>OIi<FHqlH1Zk}mNFFp_0m6jlEDvCD&w8kR+o3dQ zo*d*3(B4ZBjVuqc3xvV$0WpZc<fPM*lZbFbwgP1D8mJtp>GZ`(^3$oxDe}`=!YT68 z3&`)Fcm-in<Ca56pw$5>zr)IQP@ID1R5ecXw@x?>F54ME=?Y|*z!m=15U3tdScAl1 zn3A#`W+#XSooxf6L3@5dG-%H+hz9NX1<^ZT7DC%YATf}8*PMow?V$SS&k2az!AhZn zo#^gGo-+i=!OQ{Cq`HBWIc1YGkU8a#&@nI=4RR~U9Uz(*j4R&|np1vp8q)Uw#TN@w zIpHITJw3qOXLA*j=fJ@UT>}~L3gQ=#dn=&wAT~@7j0TCp@Pc#vt)O%SnvVuym^iLE z<yU0RDZe=jaWBk#QfcJ$K}ats-kt~vv?9;R*+A`wg+a<Wh<k9w8z>K>+e6HpGR%Bp zX_y@#H-p#*pzZ>>7iI=X93)SypFrx7F{rPL9R47)kmd2QafJ^|4|-c4)NW}x4+&eC z8W;_-SLGr^j?mmu&n1XDkY12J5KRom<zCo)9r~QI$pwf#*zCY2hRY4O?1h<uJ~jfI zQ(gnLAK6@(9(?H+Sv@v3@|<#yxB%#gQwCzv@0^SLt$WTxFlder)ZT-+2i=|oXk3EC zL26*>l~@|24}?K_MJ^%gT|)Qq-JqhqAp1di9fS$p#}|N>CW-YYOdZHB5C-`dM1wF) z4n~8-kmW&qd>B`{gXzJRKUFS6(mYHJj0V{o1C=8+f6llJNi(3d14=g_GePEoXmpI8 zZmwJ=Kkh+hgW?W^NsYfXQuyoGBUd2d1g>L27BMg|)I8*G<v}ms@XXK7xx(KHt5??` zr5~tqU<wvaFd8I?Twa6tAPka+r4wRlkUkIw=>^f`V31y7?SrX<*#pu`-ux`MqfP9V z-{kzf;u6FZEqESROCdfuzqBYh6|w!7(B5B|o#5$T#C$Bwn0Tmu#MWQ%7y!)A=zTrd zcmZ-)fY`|64h(nsTNm7gq_a=ZHYkh+sRf1K=sYYaB=BQUI8kjL7Mu+5+lNgS>;_n* z#}~tvu7cAD%{M?|bI_<5O+ujK4t3_uKx1Yg2cowPhsC@rI1kZ2)r0dKxdkL_-!Is$ zw7;b8$`9(K8_-@DeCY-z4^jiepl|}QLG!J!`UOUV#5JIG5KJ9Nj1b1v_5|e*biJTH zD9l|3w;^L5%NQ6KZrp~{eIR>b?t#%DGeF`Xni!1BJutoKZDG)StHC{p{V+8!8f0$+ zRF2fK%a(uqty`Wz_WjOb6a@FZK;{YDM~rC_Y9sG~+6{6KNG~i*h^0aLKp3P~LP)Un zjglbvt~ecagnJf%=0o@Lv=;2;X(iO>^0|))Cy<%Mx&x*T<Q5PH>AmulzZEn$44U`k zcnL8VBo2}Xwc|mUP+R^E72N}}ml#Y=`kL?n;y-lrLH<1fl_NEMu{<O{9XUKCzORKI z=O90T;s%6CjUNe3fz|@(8UT<vu<>nJ`rvrP-&*hpJig5VN*gWL_*)%b@VD;3Q7(bT zOF`z4ib3HHvy)gFW(Ts~o=1@JZBTzu;sM0%CqQcopq)jKT9`f%jXZt{k|Wk`m^zRd zAPmwAqDk#TAeyC!<%KY_K;{v`q^5n)IAG6X+-d&^RF2fNZ}S9^_6f~jGCV=p5Ay40 z8778E1_lNY4QhLVXwY36AUYH(9uB2J@~|)g={@rVF{eamk7ETEdqMM+AbTpI=7Y{e z2JthYd}MiKdo%9wx4Jxqtf9H^1>zr&dt#m<@-d-#O%70b3pEs^7i2GJ{t`sbf!Ytc z3kk#roox)Fr$fa-@=&edehjEy1C`&PeZQdj29O-c%r{RF;X`QdYX%ngfX?^^*}EBP zFX-%I5FfNA3q&K!gX{!hkiDR=0j=u+^}TnX)g_=c79b2;XMt<quf{V-xWdc?*>@7^ zj`L7@Ka@TWrIF=9`al@u9uQ3oCMQ4LL2@Uu9Uyx}o<saVYJLiMPJVvsd5(y4QuD-# z=j5kfmKO+nNlj~@a08_Y5GFNUDCh{Z{sEQoAVU}!7+`f6D7}F8(Vlt1-)iy_T!%4$ z(j-V(#wY$(5olQliYJg53{z5v!R!RlptJBnG-%&1hz9NZ1<{~=zaaVo%tGiKEl3RH z-hh{oIt*0LraXhV9juhdIt*qGh$htyq|DLYcnO);`~n>xgV7+jqK7F+3>U_g=LpTw z_Pm7jS3vQ#0;!BiF~y!9VD6jp8ImVK!3ip-K<)yyzd?N=5c>jD9>j*}fzco_7<PHX z-wH}cpz;=kVdA*vXy21LM?2v)#Jw={Nu`n7IE3_q;_Z(P>KyHZR}lMQVZiYQ!p9YF zpmr#_J;cm$!OSO?hS>pfGl-o6br;CJFf%~nAbDc_1X7QTL1_Xx{6S_R%j09?3Llsr z^nNd>ZKm-S61FfkFdAg<iFXh=LUTYXK0wrg^n&z(Xksuf_u`tPy#aMAHaoD1;c^2m zdtqjvkHf*{Xak_(fov{J5Aqx>C_RAGAg2is9~VZRqm3~peva1RJ%4M$TL=b?BjB5( zWqFSpM=-Y$OT*j_^6!rKh&r3lctH&n?KSv-sPA{|kimOz#}_Kv3-UXtodCkHwgN1T zg5;2K4q9FyHhf{~U}k~B8ODam!Dx^;vOI{7593PjFg@7H1&5D_^a4`{qCxgnK;=j+ z7q)zaq*YLw1*KP*c_11cqo>yoAIVR1I-kf-Hz0R`;vIxZjr${J_}c|C(0U)#E&$mB z!dDmsTQ@-K6%Zec@ysiK`NZD}YYUt}N_${^Py!TZASR3kv61T-5Fdm=@~|{UEDh2J z!XUjMnj8$$ORRk`bufECdMTJ!CVty5DKpEY?f(VOI)EL5ce)wt_Fr&c92O?%eP8%k z4`ll<SS={rkjIQ#e)G4g{DI{4uh4cij0UL%g)h0&Dj@wM1%twgy7SJ6@i}tB5bPd! z0)TJ*1*ZYp&&HAC;!!>1gaFTP>dYm=#yQd3zQbn@n)X|N!Fi6{!V+Z;n)cg%FPI3n zg4|1Nn#0wGgzb01m2P12$o9bO1<gUj>KYggQn%(eq&|YF1BnsBxZDTIALx2PeQcP! zw)}*Q>45gn#QZ|o3v&;Q2AM$(_khd+Ve~dPXbyS{v>pb@BV&-gZ=iCdj_cO^MU3kb zYIAG+h4>$2H^@$y--)F``al?@*MLK?6*T`1n%jNDg_vvR`A2*^eg_rZ<032Ax<W{> z733Zp1%!L%{3E_^;PH=o;gj;0zZEp619Hy~R)l*%;Rot#fH0x{#tkaEhgg6spTYEF zOV>UB5#a_?2ckjg<Oo!b)O4-DAlM4ZGhn<3ayJynJdnBQ7&%=-<oH@87zA3s{0EJ- zfWn>;+%76$5NL&+r30hI7#J8XGz)<-NDo9mY2*nk=7Maz)GWjR!XSHLCVp8i)dI5{ zCWebvV8nDUXg=;rvk(IagY3nn7oT_q7IQ)Fz1A$m0Ky=9Vfr;r@)GUd3s}qrx%Wo1 z5CaH<?1h<23a!C}84e)#-f9+N0AY~5F!PQ~B0hW@u$T*S@115L1`r0>3p1A#`UVzr zLGHcREW`l9AbVlv@sQwN17^%{0J--;vk(IagY1QwOA6hA#axhkA2kaxfH25jn0YB| zLPV#B2UyG%XJBA>(kukVAbVlvl0sXsV1|PW0|UdeW+5;J*-MIfFtrn~nCr~I!0@73 z2#i7Y!qk#V!}2_g2F>Zf%q7(<nEC@;0<Ew$=`i{R0|UdZZXqy!!2&A(V5*6ybA&O? z1+AaB(=EgR!VawDnG4bfb0>^WVqjpn)hz_ZGsrX-qz`5uj0T<aexqB60favwnS10D zAG{7A6e1vfF!NwED8F6n7GeNl4>t0`0i+LR9*hR<yS>sa!~ntzkjy2ez5wZinFpgm z`S?<|5CaJRKr$CpuEW$23I~urm|7Su0;)H=g%~b$3o!(+Bf<e>E-Z}`G8d!|W*&?N zl@I5-g&0711(Lah%tDq2>4TXEqe0<trdx;sgc&#x?gfP}ObxObSlJwy`2uuz{i$vt z1`v)wG8e0U9D*QyFgL(xP`l(rw-5seZ$L7al==ds4`v>W2Ib>p-9ii?%)yBW2OLhr zDh$#GGY>|C^6`;wAqEgmKr)w<`U0d6W*&?Ng~Oq4AqEiMfn+XLhv5(e>4TXEqe1E6 zK(`PB2n%o_!r_1bB93tw2NwqEgP8}T8yOfF_H_$^aR!pPa7{!oK>A?j!Dx_s_jC&} zfH0`shZ(bH9d8Rv4NMFdJ>d^uYX~>QugH1y881QyXzjzE75uHRGe$x66i9Xlw?HdM zKj=(X5Qgao_3=USFboqXmWJsAwe4ki1X^$W;cErWmx3_N3~Jc{8W(8b5olHT%hw88 zQvkx$wgcwYjK6%XpgtZ5Q`-*E++>0|FL-_w7JkSy%syl>5F1p-fM^ib;f16F5SteG z2@iJjGfdlCKxZ3qGcYhjELA)TI_n5ze~th`Jt)l`XovW(fDa-5f|r3Ix|M+e{hS|= zeh?M{5ey6r86P2MYlFBu_yk(_NC<$}zJu1k!}1C&o<M3q7$#0E4blU`pfm;QbAZ?~ z`~s~<py3K~YYY)?<w5cv$P5-q0eISkxrJJ81(^e?KS1`J;1_6xg)PXfu|&8P6qX>p zAbdbwp!JFg!mY45Dv%u@c^HO?6HCMNfy@Eb9WXv9Y(Z?0TjPjuYYIOi-OPc;2`G(K zd_|;<cs%BCgEAQd0|V&HDv-S}oFX953QD&iGePEoXpmfrlt3#eErT$K55l<8DL>Tg zEl6n|baofaE|mg4@EI{&3=9l*@)^fKW`oR25kmM0lt<p2faDPaL4^2AUIvDQR>+x6 zp!FgkeaIM=N07s(Vy6_iEU6F_Xng^76UdxIs5ziBmypc>v0>&Qr->6UA?`UKD9{RX z6Udw-s5ziBmOy%uG0Ys~d;m+MAax)&foPC9$xw4ZXCHyYkTJ|0<h&26%aPT<*eOtR zK<C%M#9%Zx3*=NX(0Mj6F%TUiB+v?q3y_(h_yEx$anODT5Ff;bVbEDN*vy8-`x>Np z1fA;xvr9)<pcQoP3T(Y8=*$)-21bS~@XjKb=@1&!&Ia8*0pUSNklxf*1_oHUv7;Ln zDiC=l(Bf|f1_ty!=b-aOASxgvs4j-EFxA4uVQP+G=_`WH47%4X!~nvez9dW!DYT3T zq8$eF52y|Fpj(ImghBSg%+uH{MRXge1dF+#KHZ~kAqEfz*$Xq56#5Jnb3yKX(k;XQ z!XSHL<~`wKCfdC!qS(XXS+@`a2!rf}nfoDHmS}Tpu$T+#d%fruVgO-~y)bi0p|4;u z_W=U~!>eu~Fb3I6ig_@#I%1gN0O}jO=@w!DVUWErwWQE3Sj+{5!@F)F1`r0>ONx2O zYGLUXMuW<1keMKitd116i8y9BIDyWH>lR}802-eWL(~PNm}?=8X)b6F&8Kc51`r0> zONx0gwV-x96BFWWdYCw94KaAG;mIjhSopwbm>PUEsLVoMlL<OU38bD_GeGVFsYk~6 z))d3aJ7o39Y|uCYh!1LOf@lza&C9@$hEyJd#E>zpbVjbTKxG+74X7PhA_0j@kU8l@ zn1fu0g31DrIUo#k6UdwlBFsUq(?Rtd=*&8hImkE@k2xYtkUDgVB*gtNeRsqJS|j8I zS{XkCFzrC917Y&WH0&%DWHAsMbcPuyTwq~_9N!@Sfz*I7s2>YD0~mG|3n=e_#9<gT zHVVr7pm;@h3rGy64jT<J8x$@eIZ&Gn)D8sEU_PF<1!$iJNDb)BHxLcNFmpg`bd2mb zWI0gZ3B(75#TO~mFb0W(&bxux0g3}qc!9(T;R#sE08kzFrCW#rgh6El%nXpbak&qs z21dWYVlJrc{?;wT0Ky=9VQNXC9b_=eERcJDbPF+nFvwn*d7%7Btb1o*F&ETE_|+}M z0Ky=9Vdj!Tf52ic$i08Mg&05>WG~D-Q2UNp_j<@;h6BjG|GI@3Kp12%%v@6F1z5}l zxtF0whyjE__QK2qm0QHR_XiepLGESh5n=#gki9T-NudMeFv9`lUX~sq1`r0>3o{Q? zJ`(HR6<Ev#wGr5Qgcv{=WG~EIl4yBM_k!lJIC_K_Kp12%N#;QngUVQ#-(WOo9*e6- zhyjEd<T1+(s8)g$%sdzkDpx^ff-phNI27Da5okpp9{|l`^-L9F0O1W}y0=9a(_GNJ z(5k6I3?R&*Kwdb2^r5>KlzvxC6=DG41TxJ9=|eXcG-kJKst^MR??5t_l=2s(58Yf) zzF0C<hyjEJ6cOP7DtBONaYPqf7^DxT7Dj{Sg%(W}VgTU`By&kAe?j_S=D}!Cep@hA zhyjETAejqy3=s^FKA3qh8WaxmrV25Du!IsK96;`csUc)ENFPisj0VjM&6z610Kx@G z<`OasSstVhW*&?N)tj@X3Ne822_$n#DStuwVCKPS(7e!$sX`1Ote}ht2W0mUVuSR- z%!AROd7)`jg&07%0?Axb%3qK^n0YW76b@6S3Ne821tfC`xe-|&qz`5uj0UBLNmGRw zKv+Ws5e_Fb5oHOo8Q9n$eK7N2G-zIE!c-v!5N<#+7n^=uVjz7m^I$Z{y?s-K7(f_Q zj>7bU=7nHtU}CsvQ2Q`P72;P|xeiiGOndr*sz579Kj=J25Qgaojo*UIfMJ+8u{2B{ zs4Z@yM*A^*kbR&&7idlhgkkQamOnt|;G467*#~k5G6t3ZF#ZEINF2fV)TU?PFu!Km z)E3a0E}*);T>6hPXv`C2cZnv#Js>$ynF$hC(Ljj5<z-;VZe?IVKi>qT4uoNSVC3;= zkhqMg0DS%omX1MT2$F+gm^iUCOdn|Y9aLU|_!l$;S}W8c?ghCuhX}WV<~~4rVfarJ zVjko#bdL?XTVdkF(lE0@=77pd7#|k4Ah+fc;np0axCnsy6BKW-{wm1aJUr&W=0QN` z-+<J@aE_)xD=001%mkSSqCs*sW&*9C^Z~*kJ_zHAd)RpR9;9>xItK`5m%}k`@Hq^i zahaNb_9Y;*LFU!yK;jF;2BkaLJcxxBLi`;s14Di*<O~?lI2K4PGKQr)<nXb$$Os;3 zZ_pBG{Qz|n$eaSGIiRy!kj((GVdfyG3D`V{j<!H6%uOJ33ZdqJ&SU}UMaD35kn;hE z-D857yM(24P?|v23lk@nhUo>(UBc#CZfFa%g8U7V1G%*b>Q>NsEFdvt40G!Vr0@o@ zT}%Yv`;}pCp_W@g^#JmGASi4>ZUVWr80uEgSuG$jWDIj_i8dl_fa-E&H86Gw)Ev;6 z889&z4VxDNouL5}n{k4>wM0jt6_hqXW`fcuhz7|oa2IF=@j+}D2A!XQ&1_gcID(X} zL1&4;>~hf+Xa$}10Gk&Aof83?7pexQR+#A!8q|IVjg3Nh5E7)fw3UGY7AIX(VW9$% zhs_J2?->Q1aR5;PAwh8fVKFeEtA&Zf)ZD?+_X4#A*Gv^+0AWzy45o(^+C&f04ukmz z)OKArRfqwELH3ej9!zZy7IQ)KSR1AaF@P}0UYJ@^=qFgr1-02WO%-AQVUWEr^FVbH z%ug^eT(pfoW;lTQpj)O2F@P}0UR-+diBG{|F37#xrV25DFvwn*e$YG?vF?3?!`vNH zg&05>WG~EIP<=<Nxh@9S!(rD{AqEfz*$Xq56nYL8b3x&-XQ~hb2!rf}nHMlgpoLiX ze!*exzNtbCAPlk>W-h3_Bi39WL(Fgh^_dS$6=DEkki9T-NuifuF&8wScW9~*0|<lc zCB;0L+CNy#1@-BUOci1PVUWErwWQD?M%csQ*i<0~5C+*xih0OtVQ~SYL2VC^nIMd; zjubYFF{XP#^LZzx3Ne828Y4u#MT)rr=9uP!+CitL3Ne5%$X-&+gQ*40n-QANgM|-_ zhUvvegX$XO`8-O_Sb^CCYBz$|pgIYJL2MXC=flKdG^{TJYJb7RKJYRylp)olFmV_S zt5uQP8lW;ABoA6E1!^CG*dTMti7*G$rUI!4VNjU}qCx#4n43W6R1jefs2vH?3&Nl> z1w?}|$W0&`WKJa!=Ag83H3eEh=cIx3BjYMO=D_9!*O;QFX;2zhuz}1AUO;LCA)5<h z!_LBh@nJOR+$>P|!onUo?ScFUQwN&61D$Pn0(zDPC=bKrKs0Eq8B~UV(g(U*Kw=;@ zxG>0USo;suM*;PVKr~1_zP2T7UJ!K77)UJ$!^{D((J`{$kmX?Wf}pVAF-Hw!kUG$L zB``ZcaR3T0kT@Z{0!vu}steCd6=DEkP+0>r1LSU8?t`g;(-xRz6sQh3H&uuMghBSg z)sn!7z+x`Qy%(kmF@P|G1tM%f`J7nyZopzLsLge0st^MRgX|^2nQ)~XmYCrHa_^O? zLJS}bvKOWp)V?Ryy$M*%1-bXyR3Qcs2H6WUmlS#j7IQ)Fy)jjY0fa&J!psAef5f_1 zzzQ=QK<>RYRfqwELH5GTC56twVlK$Nccuz4fH25jn0cUbmRR>5z+x`Qz4xXHF@P}0 zUYNP0&=S^|;Q(^)gQ-FcAPlk>W*(?KC)T|MSj+{r5g$zzVgO-~y)bi0p-*5j7c`Ig zWU3GY2!re;#XOi=P@Mqt8;l0cV?LWI!~nt|dtquxrD5j5Xiz->G82SJH4CObz)7GL zeS8lzkNIG&5CaHT*dWRsm>y#2lu%4_L497PbwUgve1S}JLHf|$3+kgYtP^4YVGUdI z+zZl&ZZ2rv_1{_{1`uvQGMAM40;CV!Tu^@dvsQ=!gl{03OH8=J)PVG%n+qCu|Fu?# z0fY_g5aB>deF4&kZZ0Sv|5z);0Ky$e=7P#~m|B>-aM2)rFtsomH1GOttq=nUKR`1V zmd0_J2NMVBgP8}TLFL1jwL%OaY+;WG2bdmWXplabc`zCj4xiQvF@W#{By&OG3sXbL zY>+;fS{MzQcm1$dhyjFOAel?ZEM$3*KA3qh8q_X%w^oP&gdH3Z;Xq1#0n!IE4@QIX z@td_m3?MuM$y{Xj5MqP$!OVlvpnUvltq=nUe?T&ql==ds4`v>W28F|mwL%Oa?BR$A z2SRQ{mIvvBnFpgm>EYR0AqEg$fMo8DAVk@RYz8(qNFU5R7!8_teX>@F0fc`bnTt(7 zE-{ckn0YW7<laYXg&05>RPMv{g63UeYG7ixXi)q6i4!CYk@F}q{S^;qfmV=y&{>Nh z4AW1|@%A;&0<ECFCTQOj2vge*(ENjd3+?w2fx;iuZwBqf17T|W12mtAZ*CW6AIKfZ z7*xl=_<LL+=>W#3HeG_le3kPnTV8zOZw2i&GMCRd2Aa13+5N{I;T}-i2vjbE#2MTW z;-7dK7;0J>7+~iIf#s11*mwx?92<zeB?>X81<Nbw=@uqVEDf_3l%_y^4iJBhn?P%b zE5yAZx7HHj);Uo1ApJWs1zOLPA?9`&WI?ko3=HUQg^3eQgA8YYm;<UmK->sWctgV$ z<kmVO-0A^U57G~EcTSW*tBsZ*7{kI1-K{WjVrh`sAPgG&0M#8JHVA{l7DR*GT2F*q zzaY6)2O7qpGzJ?V0h!f+#~j!^H0b<PkXji2;x5n%O1B_0LFR#IkQ|4nKr1LMgD{8> z!no2YZ2rx~1CmxiYHj}Tx5Di5(O%dR!X(%VI(Ogy?_(#B*&sD3o(T1zJmT^kvXAZn zk~yDw85kN{85q9FFfoAYWRN~&49g?P;RBnK1*xlmnguea32IIWNCFMR%t1~Q0Z_dl zcY?wOrllEbjyg;LiH3!<0rbo&m{g3XKr6`aATvScfoPE24ljXLP<Vhah!4UbzhW~R z7S3ys!YzYIuoY&P&P|<`8aBaJ&^T7+zv5#cvq9#Gcw-M|4KIZF7hVR2mR1Ia?=nmb zpgUJU`j9cU@PUPMftNt*1E`xo=Cnf1DMK~@%7&SP9AC)!0_G-=Ic-pLra<)~Q!sNt z`4%R=1L_8le?egk6K{u_gDp&9@udPigAJyK$6KHk9EP3(tswJYW@q>aw1UDFgkfqy zVTR3YSbW7Gh5rOL!B&`E0-y6+3b+MZL23WK+#h9-*&s8I_#om1B-is4k}qx`ne&yG zfuW<7f#HV?69cGk2-1g)v4zhcs5uHg0<9CEW`WG<gqo9wYygxEGY2`oVDS!80&^3{ zoGz$2pf)2&4jIGDLC#+pP&a`53kqYH`fjK>pt~|)VlWyOUlRPFbID+$3=DgG1X{si z=q=C+G7n~Uf}cPuC|p4prWzDx*vy8-7mqI@{9CvMTVZz1S@^XjML-Z-*UPi7KL#=z zWab_}gnH!o>OeB*8!rPxPb&k%PZ=f#ACM+Aj4ga%@pZvhpw$6t7Ra1ls5u2_W`MXb zbFjsigr7hw%uOJ3`k>}Ox3z+_!!gVp<ot!4PeE=1DF&I-4>e~YNB|AP%mKAqU{VrL zzktFG6jw0u2~cye#SJXpZ-}7A`xZZeR#04k%mkSSqCw^f1PHW(;s=C5d=LhOJvOsp z@y_Cph{p;6!B&`EI-gIpsE9%8uf}groIqxS%*zQts7H?X1|)O7^D;0@Y-M2hCBwwv z4bp^$v4syT-cR@ov|2#T0+}-jYEC|y86Ymq9OU>y&ZjUpfy|i<HKz%r5e>u4K~6sc zP&a`53kqYHmMKtku!SiszP3mr;>&|^YfDOiKr1*5{RLV<=E2P72oh)og)0cd%m;-T zHnU;zwFN2sEyM&{k?mrThSY<+lXo2hnGG^CB?x<b83ZE4fABIeOl@Ug_$|Z4;0w}( zhOvbYEWRoN1zKM~-2^gc8q}OZG&4Y4m^s+u>p-ADE6hzGbEZSh0Ut5|(u{;*<{;-U z<a`Qp6G%D8oEcDa7J&rNFw7j}^7#PNFQ9M(#T87;OsF~7;szG)CGv=P2kDCm5@-d* z1;|X0c_11r9wX2SiXRXL@j)0A_SnpZ#rqnhcodNqY=zkskelCfKmk%ddrdreEG7mL zuQ4GI8e}#opTgEVY6K(1fATUg%xYy|_#?x_5DQX>hOvbY?A(WfV1d>LP&a|hnGH1u zUp_^SFW7p=9l-*vFgJnBnFBRv7Mfc?T$p>Xr5}(y$W0&`WX@cuIcq=yXc%S=a()Mm z8KEfybLT<L!FDzSY<-`MDr&rkgb1{P;sRtQC_X?m$S{FyfmRS7#D-x|*kdyr7Vk@t z;_-@tU@Ocnl~94!U%ZHW#uPLKTR}a|B{<gif!0dE>;%yuz4Kcc7+`(6duw5#0+MB5 zfUWP#(LnXv9VGXFRD$|=AR2_x)q=!87^Y?qmN^N~dO4PLLJS}bnzI0@Cl!l?A;$Y) z{sE1(v8@wg0AY~5Ff&2@e3%-T7%n;oi@Bh=1CDh<3?K}$7nfdq;zzKU3vw^lIw1xS z2H6YK4_Yrrtb1j`v4;cCIw1xS2H6WU7c_=Ithpsv%mt0{^Q{wN0AY~5Fmp+v&tNeZ zv`$Q5oe%>EgX|^6JeXRQ2+VK*jX?{o6Jh{iki9Uqq|h~3%msym$T}eg5C+*xih0Ot zVQ~SYL1i|`Ob|v^M+#df5;Gh?>%_#?2{C~1l?X&#K#I8rv6$w9)`>~16Jh{ikiDds z2UAPTIx$%Iz-X9Wd^D)cLS84f2YSynv1WkWg>F7I)`@|}G-2lc=4D`5fK(pC#9=h7 zbVjbTKxG+79<-MPG>!*igUne-ggMA{D5xv|=>=h!n?U9)BElTxIvrfkq16u{GZ*7A z2e!VeCmJ;^g3@L{B4mBn1}tWR%!Ogly@@b3GCe_0uoV<8urNc8Z;=0BYC&tTK=+{Q z=tAl`P~L;dfoRYiJSgvj>M?Y;fW$y*aAA<y;BaAJV2BA3Xa%(cK{QA`zP1HyeU}ST zxWLQ-=|#uLenXZ6jf;W!ps;uYZ5x94FuWv2pcQ5ZC=Nj31(U-^cVH<4Ky{eZIw1xS z29*&o{UCSaavw|$jDCQ{Tu|99vrdQsghBSg)RID5#9@|MAot3x6Jh{iki9VTK=T&F zx_1H=b3ttcg>^y<APlk>W-cl83oPb>+^e)shyjE__QK2~WgUP+JZ3n6+^e!qhyjE_ z_QK31g`R=MT#$R!)(J6yFvwn*d7yHO*zo;;#axhkHP#6+fH25jn7O3T9toJ?0CKO^ zIw1xS2H6WU4^%!9>)r)e%muX(bk+$mfH25jn7O3TKd_h!S}&!yPKW`7LH3ej9!xE$ zjD`6PMuXN%8LSgx0AY~5Ftw!8F!NwEs9Xh^3BshB1yg?^O`sKh&J46(DrSce0|>83 zM6E|)`UufA`IzQ{#+a*i2r+;#LlSxBg7rb?0AcP1rQeDjLJS}rL8iH2eQ4%_=7!65 z2r+>01|)MyDSyHG(98wpi;^8e3?R&rj0gu%xdZbPq3{LkLo*k&{-|h&5CaG&Ael=_ z`3u&EW-chd73>gV0O1`-<`QxvvOHKHnz^8G$lD>r0Kx((h;RV8m)LLs>q9dawEie( zhY$k@XCRr2>>fgFus$?%LG@<V4j~2*K7eE{DdjI%ADX$K^+y>ygcv|rA{7x1gxrWM z57vifE@-YZZHEv82p1rkOG^0*)`w;;C>&CD2r+>02_$oo-9v~C)`w;;C_N<Y5Mlsf z1yH#JHRM1xQdt5O!$pDhp_vPsOG?-w!~nt-Nao@)1DiNlADX!!_r~oIVgO-qISSPX zT7N`r`USNQQ_>-E4lCC|#t_q<K9Mc}ZjaM)y@5`KKr5&Z16q3o!Z0^dYfS@atq91! zpgtGq%m)yrwjCh1;#(U8vk&ABWDF|*Vf-5zkT`<zsZCG7VLrzq$CeKUkon!i@_&>; zW1b+pb3l0l#9&}x0JQ_aWhMgygG?5}oqu^57?!p&F#Lm_hX7R$r(k_x<neltq)0j9 z+y_`X28AI=4vx|C0!$rF8mbYrP773Cg19HL1X>F+A?^jabr}(E1+51H=>_2_?E<YW z^90~$)pJALgzi?DII%RyY!C*eO;A}0VuLU&Y(Z{aPJ~-ikmAAv>Q7L-!TPHpGgsg- z2R0A##~RX)2B`<(lx%@kP+9<)2{I2vgTzZJ1X@Aq1B5|*5XKevu<`IMNa@JJLa-HP z*9iu`)*4&ER?xW2i{^v9AhSW{mE=L<3&aMcJJ>vkK@LLvA1?#L%2o!3|1wMrVIYNQ z7?$pk!v}WmLq(22>kFuxK<2E1nv;QM28atY2RTi^=0Q|)1zKTl0-3WKYR)u}Ml=jF z2RR>r*ezv<HFB_Yjh?n(;zZL>yFqCSHn(~qSD+Q-Z;%wot!toe1>Khj5<|u?w;n(W zZxGw2OrZ6FyC4|D+(Iq4g2rT!=L11u3vv_4t!trfJq8j$!!Wnz<Ra1rxGqOi2jZ@S znuG0Z2H3pN0VhO0P+;b3&B+sJ1*J`pnV|FuqCsZO=oDxL@j+}D2Bk%8X2bHq9;9?V z#a6HtW|vLAK<j^`d7&e2ka?l4IOc^wW1}!TK{QD3dXQRZ*%Y+{7AhcF#JrGz8^UiO znJ-B00r5d`0HQ${T`foqgkfr~VCj2-+JZGZgc!gWBoER+BGxHDYKKAn<H^9lP`5(} zjKTJjXeLN`3l?)h^H>c#gcv{=Y%fS5iTDl{b3tvkrX4~IAPlw_Y9_c&g8B(6gp)EU z#0&>eAGBqM5CaH<?Zv4Zw?q#Xb3yKH+abgN!eD!$+ClSJuzU^`!bv^BVQ$9`AqEfz z+Y8kVuJ4Ep2b&`7;n1~1hyjGb_Cn1ig_?rJTu?al>=0rAVX(bW13~9L5E~9}aG2Y- zLx=%{!S+JU1($b3hJ#BnW;lTQ%oBD9F@P}GUZ}aGP;;=D3!2ZHv_psigu(WbVjxuQ z7cAz2`gBuv2r+;#*j}hwQYfDi?BOtNhY$k@gY6~7KxDPBxPa22wg<>e5Jpx;3i}Th z_k!m0X6z7R0O2Jdc~T67s`aSE3<uDB-mD!$3?K})7pj&N3N&v<=-dZ*UVw%ZG3JBn z8sz!B1XpNXM5GxYccI$@YBz$!Ky?xbgV->P&WDM^Xjoqc)c%5rG4L@kY(T0<;o?vR ztX4&CYk<pi1_lPu{sB<?2&|Nkfng&N=78E%VD+GL{i9{U%cem6BDkCQ7#KDYVGgJr z2{Q*=ra(C$H-VXa3=ErzFbBDf3u@;`ptTP`W^KV^4s2d<Njah|2GRpc;}Ug{dBGD{ z%mk@{;R`O%bO959(l2}jTS4Iq4}0Wv!v|Hwz`y{SyECyDZ1wPlm;=hg2w4UO&{#95 z3<0GNbhm)Skkz8IL1u%(1tbpYqk#HFAR5HS*S3Vs3&tRY3(OplUJQ)vHzY~eydWqn zSU~w7Ne;x^Qz6g_vjY?dpzs2T6T%BXX2I-)(xAF<&JH045C)euP(#4(hN^)I;iP_G zF&9(^%-bQv0K#B<aq7k`5m1F$_JQ2HV22O`2!ri~Y6s_YBHg<Ji@BgS*P<Ol3?K}) z7ium^R5f<@F4-Z(0K#B<p$3vNJ|BU_T#$R0?GR!BVFr*q)Lc@i4Iq86FoV*d@LjP( zhyjGb_CgH=mw!+-P$8TYM-65;fZV%khY$k@gYCts8@EIP7IQ)FU9&@o0ffQ!Lba39 z_S}KRT#$R$?GR!BVX(bWb4j5DYB9qB<lYTCgcv{=Y%kP6aCuH-_-0@+7t}`Fv_psi zgu(Vg%_W68fW=(UJm!`iLJS}bwwDwGp=v>O0(x5lG>^G$hY$k@gYAW?C7FVS8I%Uq z10XX&m}Ik{8a!GATG7Y%K=YU>mxUNWxS$TT-h*l*NIjW}X)Y)|v|Scr0O1oz=7R1Z zgt>tb0O^CNh0&m~vX;w23?QsfPo8^0`e5e4Xi(q3>9P<52v;DPOG<qK(g!mSMuYNO z!(|}`5Waw9E+M}o%Y*d6%!AROare5*LJT0R(SQgCQtAtkKA3qh8We9emxUNWxB<yr zP`M6MgX}hJY>+;fS{MzQcdfcC!~nuK(9DJBA#8>riGlRN%!ARO@}c6g5CaGsG$O(Q zNgF{XNFU5R7!3-CvdcmYAl!juE+~9qY6uw&(g#xuqe1hoC6|R5K==WYxrEF@mIvvB znFpgm?UJI)LJS~m(S!&GQtAtkKA3qh8Z>rQa9M}}geM@Gi|igkY>+;fc`zE3-|{XC zF@W$3By&lrFF^WW=D}!CIOJRwVgO->W<)p;awD=lNFU5R7!67fS(k+vKzIg{xfatA zWgoH`*w`R_F!NwEXx=sBvJe9Ze?T%9n|@qkAbl|NU^K|RX_ti<Kp0f+!}NmYU14fq zVz_8f`}<A{Gz_8j5Lhh{{S}8+0dRkZmgDV9S_N7`eNE7uD+t5N5o(R;gXSMN+GxMG z9u%gaelzII2N0&VKS1+|_~v$D_JQ1ij6rn_jK8G~nhszBRHk$An4jSf*=yuH@!&Dg zyamYWFP#YYfZ9f&av3E4qa7j6#K*v}t(Ad+5jpLG6hSd;JOp`;4J37D9^xzoSYAO- zQ!sI2X^^=f3^E7Y=U`x9SkfWT>H~Ez$gSIna4Tp&7i10ycdQj?eX|qcRz9ddL3V)T zVHhS(EDh5KG6!6LFfcF#bPBY>!WQJ#9Yna*p#u>YpfI+XC(xSHBM8Q@a0A%^vkyeW z#EGRrdO#R7_5rRtKpbe;f|ww;?j*vkZ;;%o0*w<;8iS3GfXv#3#~j!^v`I8%+y<l` zgx_=uw1Uzt$V`xVAQ~jTqf4L_l$Jpl#0Ozq=@d5qX48cT&ply+t;lw5iGl2!^`89E z31l|NJdtjMdQcvLo%;ZigJEVq28P|O3=B-NObnqgK_nWMN07tE1L_Wt`5-^Rl<$F> zqYD#2qG924Ck_!l8FuU~Jlz7VAUA`|1eph-LE0301X@A<0AUaxgh6h^W;QH*VvziM zB1W(kW>-$(!WNAL$UfEZmw~51W`oSD>A@a8H;~L>;bUOf+seSeEQ^1h9yxrF)8PcD zSs-)vLCwLpUlBRaWI*+T+zARBkefkxKhzv-VF3$gmSjXYgY=a22(*Iy4l)yD9*72s zU+5KR1%(F)gZLl}@+&s8Vc~oPDco!l1Y42q3P^#Z!x^*Kok3=U%+u*Z4QJRn3l6;q zaaKMCh6Ak(3@ozv_irPI4{SehN3THZ52%|!<{X5YgD;$s;|sRN0OVGfn?U9qf|`SG z|2A@Yd;#hPkbgm83^EUd4@1qtw$~OGUjiAZ@ukuy&<YO29)VVnc`&n2^b53t!WD!; zW`i&&%&?gai?0%-@J~q*Y=zmiMB;f%OeQ2>yq-1t0?2HTc`6eS@d7G0VDa?<$s9I5 z28JW83=FKY`1fxkhYu{iEcyjnS3u1InR66s4!-@{*y5|9U!WD{CXhMDpyq%lB0wHN z!mx4-IsG8#Q;?fL%0cEFhnj<L|2C*T1E~k$2B=>^;RcE;kQfM`fSQ9XZea0#As02? zWhMx;g5m;XCdfPx4Kk}@qChJsen1$+2VqdyV>25T?>R{ESdb~$3bQL_EpLlVKBP@` zzH{~kkl7&fu1v%p?=O(dVdrCDIN8d;z$T0Td=2FAfyKMQM1j@?P_sbhoPwHz?|cp9 z_(IO7FgJnBISn-j-}xHI>8Aqf29SS2VGQy+2%mwPgDp&9@wKK1HNMVF6lev9;RJzJ zka;k(3nmM+g2EMqL1u$6D9o^#4T~?CNr><_$QNvd+0~)O*ZQLvvd*mG@begu*&y@I zOh%|j&Zjew%;Df;U^v^#z`!oc#NY?ggoa`H0y%tO@%3PmKx+WhERZ?ppym{znE~R$ z%)u648j}TDVQvDMa~^6AXeth*7a7CMK~6u&`4r?Pkb00g7og@W1__{Hm^sMhj|S8) zpl}1l6->)Ts5#i;1{UuH6^MAhpw8ENWU@djC@w%|g3JTaAoFfa5oiU)4+w+!APfq7 zY-YpaU1SO(9tBDSTaoSBQwdqu$~fnbGRSO@c_vd4>Ot`iYu8OcGKZ6of#Fgs0|SRF z6GJ*k6B@=AKCrevNT~<ZERZ>uq2^SAB+xL-9OU>?fa(Rg6BITuEmxrC7{COOXjnMU zs6m9YMnY|i&QyU`kl#UOg3JTaAZ;Df1X@Ai0m2|Y2!s5J&1_gW*C2)4g-XFzm|Yf9 zXIh@rLdwI3*Kc0{nGG`U$u#WY`~%4xE<Of^tE~(SoU%*|nIKJQ7+d(j!r5V(K<fsm zSs-(+LCvW~GXunhnS-33k@E%2O(1iwL(RdrjuSbbc0k<#@-HZiLH2?04X8QT!W0%? zJ&lO?3Q+&ma%Y-AD>w|N3bcaEgPE<fK%f;At{@CD8-zh&hRtkPeCbR_g#V9P!B%9u zZZtvSYZLp_haj^-=G~crP!Gx%Z%*)nn*uA4%;Dx^V7S@Jz`!NT#E<~egoa_^j2u3& z^G7~R7idj@ngufF7StSk<sou>f#yCy)>+IDXoa~6WX^4<Ig>z=Xc*=m<otzP4}#nT z(gHH)4%D0_AOSQCGY7ex2aR2#DFbuwLe0T;MhI-3sZTp1-b<$ZYPm8)pcNDsATvSn z0ir>MJy<8u3gUy<FboQNY-YpaU1cUB9^W(xw!-XMGE<<HhYxZ7NI*Aao#|sN6$xm* z0<>laW+#XS>Aly=zyKRtNV*IQ6_6}qo#~t|gx^3iF-YzK@j+t^AR2_x)q=!87^cQ% z7GiuDW-n+?sN=E_0|<lW&Oqu(#Z$1D3mWt7x-7&1!XSHLW`fp1!t92L;iBK*Ft_Kj z5CaH<?1kwCr9)!Pb(xJB4xqW4zRN-kAPlk>W-cl894zL7*8feoEW`l9AbUwM52p4D z7IQ&!3zIGjF@P}0UYJ@^XrDRQ!(qy0AqEfz*-MIf$ZBD60i!`>AjnJ*Mpj1(`wtfP zg4X{{yDY>2!b|2L@+v9jGAzUl2hjSz8JC3^Kp12%N#;QngVxy*TK@+N9~ceQikAYF z0m$qB-gH9B2x83uxeMI_s;vK;hX{XOJ_d&SNaY*4eX!CFxekEUNuV)r(D*D!56GMc zM3{rCP6F*Wf|>J>2y>9@NKn1efK-oz%mLv?c+7#V+l!fx2n&!NP})>j3R$;jfL4Zs z<dJa<G(M5VK<on(1Y1Gj0t++b_y&a&NDT;s*4Aw(6>N>^holQo-UErlFlcQBDDQ*n z1$4K7#9->M(IB%y;R2EawQ)f0Di96g<EyJ->-I#D!UbjyNH01@_8YPsY~3CxEcPrw z4P%hHk_7^-FgrkT017XVI3XN?r3?VoVY4m^F@P|rjDVQ|ayKsb!PLO$4Oq+tmEChL z3o(E&$X=LQQfQ7vm}M5oz4I;$F@P}0UYL2H`6y!Dn}Ee!P#a;vWg!L-2H6WUmlS#j z7IQ)FU36K90fa&J!psA;mxy(*z+%jB0J(R`Wg!L-2H6WUmlQe!i@6~8F1swm0Ky=9 zVdjC#En?k!0E@XG_pZ1s!~nt|dtv61LQ5>c3<r>VS6voj0AY~5F!M-hD-~cd7t~f- zb6JQ1ghBSg%q4|BfyG?VI=FS0g&05>WG^Y^!PJ7vSXf-ZXwW*i4VQ%&Kp12%Of9K2 z%sdzkDpx^ff-tFO!PGBUCD4jK7YbSj7j#F60fZ}-VwQ0*z4&OK&6wtb*0~hi5n=%0 z3uKxL(ueL|Q2NcgBg6p08q3IYFGwG{xu7}!oI64cAl!gtE-B?NNFTbnpnQ>aM~DH0 zZy=cqDtBON@r5l&4x|sJ7Dj{Cm1W!!VgO--<%n<~rThiygP8}TLHRB1jt~O~cOaPy zatE;(qz`5uj0S~6${isF5PpDUF37zwHH6Fu>4T|-(V%r@Nq2-8K-gjhA{+>rg)9%! z2Qv>wgX+zMJ3<T~JORmEQp#VDKA3qh8nmt~?v4-x2){rw7uh|8*dTo{^I$Y6zs1}U zVgO->m56X4rThiygP8}TLE#W}M~DH0XCRqN$c@PIAbl|NU^FN_MBEW#0O1cv=1y3T zC`*vdz{UpYgP8}TLF>xG?g%k}u*WJyIAGI{OAMqBW*&?Nxi{pF5CaH<%2AkJ(7H01 z8kiU^8q_{CSq*U$tXv1FC8j++W3>RdJx<GYB!5=Z{>%iBe?fgN&{-ZJ3=0Qpt%m`b zgKy0j%s!AikTIzIhw)defy5DvPi;B@hxu<VoNp1C44L;>o%vT8G=>PW+h#q&J)m~L zfp*CF?whp;aeh7qh9|8I3_Q@aP#}HC7}f_y9^VDYo9sfI=K)K{pfCi<!7xmmSQ@4e zwEhlMUV`{D)(NyaK-~*+>r*1!3R>p{(hJ8@!mS?RLSU>8^(VSpVdBKnFtb5@QBYY4 z<HN!h<kn|IxYcAGA}%DL{shGvtiK8}_c<POVDkzJ^C10bka`d{SufBEN(&$}LFR#I zkoc6{0<EC*0m2|Y2;+)-*!Xe_QaXy6CD;nHi|3U<>w@`^dDaQ;d?p~XLFTz^Lih=k z?qKr@3>y&Q0(=Y%FIpKGcx9OwK;u{-eaIM=?vTR=cAkgF27%TcP&a|hc?mTq8`%IT z8)go2nt-LPFCh1TFarYv$edSDbNZlqktvut$oT-oUa}K$Rtzkiqo*yHII%R$UeJ14 zSlU{!QJ@v%Z;%|wt*@bOT>uh5!!Wl_fcgz24PwXa6li5xB?!haw@}NipnQNlzXlFl zXt=(Cx^*AOA!r!pR-288v;nHi(UgI?Z=vR3J97gz&+=pmYCf>pB+v><n;<hm=@UeQ z4BK%=pcTXiv0)gL7O|NP%LhG3>3YX}!B&`EJevht1(D`iUaWx3vwXoZ&jK17h1m(B zL3-b{GBCj6B;XD#R6w$bc@~ousD3+w<Q|YpP#l105Jp!E5(8nFnk88JUZA}~MR$Z4 zKp50F1F0t!|G{D|s0~zdM~DH0LH5GT1m#1RpJ8IS=#VXl_8m+Qs83gRM~DH0LH6R( zi%)zF7IQ)Ft+*q^0Ky=9VfsPyLNL2wVz_9Qt(fiwnOk*7hyjE__QLdn@;I^P#$YiQ z6b?0agcv{=WG~EIQs^yM%mul(?v4-x2!rf}nFl%_gIM?SY{MQ74R?eXKp12%%v@0U zL9DqcSj+|WL7VOfF@P}0UYNP0(0j0$3z{Emxg*2?!XSG|F%PCzWIJX!fci*ncZ3)~ z7-TO@Eh%&k7IQ)2&~ZnI0fa&Jl42gRT3B4bXi!}aG82T6)se!M*?}1jp!u<`J3<T~ zd}O--mQs_j4H<hd%>}h9dhQ4@fH25j!lq!V0L?=YnjeFO4~)h%1ycl6b|cS^wJe8} z?Zlb^au>R()R-RwwP#@F3h^;8yho~+VB#<uR!bq*-JmiZBoEqW0cvl6*dTL05Md6e zjRH~+!k{t{M1%SnFgJnB`ACF0pmrHZF9?Im6c7!<AUA<%kU5`-FbBEK2x>RHKx(6a z%mLxgc+7##vmM!mnx;W%+~Oc)o^1wN9S$-R8Gl&@Nf*dsAU4l>!B$ZC!onUo-GKZD zQUk)Exv+?Zf~`4gA?AScFi0GRL1VX|G6d8vKz9pB45khn4Kf=PE+9Ejn;+EA0MQ^m zzP1`{o~;HcTwvya^rB;Azah)P=Gj1Dp|S@xj6v$|>=tN+*#U|JP<VmF3E=}+$`Vjr z*mp;W0fa$i4a^LXyK%V>rUph!?8PjjKy|=`J3<T~46+xdmK3@Gi@6~8PP!w+0Ky=9 zVdjxCZh8WXxuCYjlsiHUAPlk>W-ckT!amG!0J(SC9U%q~2H6WUkCgH53M}S=+&klr z5CaH<?1h<23Vi{Kxght>x+BB@!XSHL=7GvTV$*}he#~$Hxp&STAqEfz*$Xq56uJS6 zxght>yCcK^!XSHL=7GvtV%>WKi@6~8F1RDa0Ky=9Vdj!T8yvt42atOg-4S8{VUWEr z^FZY}vF`1_VlJp{wB(Ku0|<lcg_%nV{Q!%(pn1V%cZ3)~7-TOg=E2m0>I9hIU^Hl6 zaK#-V1`r0>3sXxf4Koi$gX#g0nIKH6Suph(#|2u&q2p;V8Z<AM^G=8XgeM%tER$h+ z@zE_eFwF&}hrV}03?Tdh$y`u=gV~MGOpqK%A51Nb2K9M+-U%^)u)`tp+zZkNGY>|C z=2g1h2{C~13?y?&sV_kKVCKPSP=4!pC&U24ACSxi`Hxr((g!mSMuWz&+ujK=fUw75 zL^zOAUx4(%%!AROcx!nl!~ntzkjw>@>o7Hh+zrwPQwyU(^O#NVgcv~h2b#ICG)~A| zkUp4saGHUEq2Zkn7zZ3dgaaY7kmW)8;O0T|2Phos-U%^)@CqbzLE#Hii);oqHb@^# zEsO@uW7fPAVgO-=qvW|4qz`5uj0Uw!s@@4PfN%toxunz=Abl|NU^HkRv*Mi)0|;+G zG8dbFafyNS!OVlvp!`<$PKW`7IgTO1ft30Jqz`5uj0S~6$vYti5Kcfc7nj?xiG%dP z%!ARO^icFphyjFmAepOh4N>-CGYeS^qz`5uj0VkP7Q7Q;0AYdSh;TsGM~Ds52Qv>w zgWQ|<PKW`7LFGQo4A49#Obtv77Y%BE|AD#*Igb+4Ur9J20PgS5a{T(p34vBnUlY`~ z24R>RsWnCp8qe1_N&7PhK;aMSH-pZ`0AXtT12jK}Z>|((AIKfZ7*xl=_*YJnmo{Pg z3DG?`%wI8UQ%l1}$X=M$>{B0t<^e!viJV2a2h=u#&6P@=Mu>~>F)(~>WnkckmgyjU z$QU*rf;?vhl0WeoF;^-D)r+2{VB*BmAag+&WDcke1Y#dKEzp{C3gTXnTfY(E)-6!= zApIaLa|bb>1<ThUJ3w+U3==1ohUo*Pe^C7a;uo9|XoZC>$gSUraBBimT!7eDZVR-o zc_;|RFt<?4t)Q_FP~8D?D+q(a7DR*G`hy6!@|=Oh14xexG>k!M3^qOj690+E9N4_B z&tAy54M;r*^PClE1*Kb%nPBsvX1g>Bw}R3#2!qstFs^h8o6m|tO7mBC2)4rPk`dq9 za%LZ7J;91s>?$C$LFV-|3d6@{L3sqWkMahRIih?F48K|#7zAXQ7*au+&@e2IAcv0z z8{{lpkkScIvq0wjhMLm>l0d^Sb3o|;CY1rz3**D+KTvb*VFE}rY~FCiLDX<AIVaEx z@;k^(kiS7RNE=Iwa4Rf4KztAe`4yYluy8(d4v`if>=SH-*;VsSz2(axNLgedWwQrl zHpo1m7VP2da2{cf7#{<}-&O_&K?3_#k;4ZT&K>6kT7N*@1TyCz)SNDm<!Bfd&dBkF zoG)N*0-5t4YR+;rGeBIJImqSB1*jW9@+i0s;xBAr3X88f$57)-<$^#fC=5Yng2E3( zgUo!;Cfo`OR}deBL1Bi?Y*>7iTtI{~$6>)%m|as&H?_Pt4#^icZVRh`%m$gK(T+X7 zJ|LMR&d0#O*v7yhL?B-vhfhbk5O_Z($c`0Ivq0uBLCvWJNuXg^I3veb15_`XQU+$I zIoQGi7S2abp@wtMMS)h3-$7=A{0*W(<}T<IZiR&hh!4UbzhW~R7S4ArBEtF4aluxY zU0*(YZ4o#F$rl-iE^h&u4KnXVC-!iTxP&lAf{%fLrHz3>SeA()4WtPTV+$WxI4`&) z&?*2m3uF!})SNmrGeBIJImq#aoG)N*0-3`GH3#4RV&r`K0x4WTcEK<^)EsPK3X87` z=TYO!=CVL5C=5Yng2E3(gUsW&BG3v8R}deBL1Bi?Y*>8tTt<Ym${E2{m|X?Oue8Wq z6l`T@U|_hG<2w&zHpsk`D+u+-^#w={h9&tJ7&zJ(7(`^57(ioPFmV_S3uol;nE`bN z$b1(l8>F5SYK|g^gN9-Csl#Q|@QJx1&<b)h$V`xVAR45#;Hp3?$R8jK;)5{Ajo8eF zh0hu!|LR;6Y=zksBXGW@=L+PUAIo*yJV9oI%sX=xd-!M|iA(V@FmSaoFo?=BF@VMx zLHdv}w(vnthYz4`0-3`NH76F?04N(~4sv?l0o4m~Cn#*7N*Q>d=3om8SU5LaM-AsA zR|Q%@eg~NeG7m(9%&WO8&<Y9<5C-u<801%MX2Zf+<QgK}7F-c*h1s>@?)R26Hz46` ze?8qBWH!jWn(GMlpmYdZk2V3x9BDoV2HrLX1~FMChIo)BG>k2LVEf!}ToY*ZfSLs| zhYxBFzVmsI(=)974zd#FCXhM&P;(}NB+xL-J;>!eXzTz@8JH^oH3!=sa#*?1a|boP zO0EmEg2E7FCMX<1G{~@+mjbOIK8Ov&pfJN`HY~o5Acg;f8-lGcyIgJvw8|i@o0{+d zvTjPW4Q4We28|bj=FAZy3=AN>f^7^8u(p5JJ6NbdR53vhxVdv5)o*{0+yhbxYU_h& z5Jp!E5(8nFnmbs=ra^NG6W$3ifG}w68l;|7Y;qGZ?gR4=Xx+)AcR~yx46>J0GePQm zu$T)P)0*;5hyjE__JY)ril1OH7ZeWD-U%^)Fvwm~&4j6k`5#7u@+`<q5QeECm7a17 zGkihoPG-ClVgO;ATZl4(6te^FVVVnCcQWgp5CaH<>?OrKm|D>I6QOk{u<(J=FunL_ zP})acccKH$8^oFcau>S!)L3@{8h3!1E6c~gAcT~!Vd5|vmdlaLKIAeKG%f&A3o=KT z2y>9jVo*7!fL1<$%o4$44s4yrnmedz2$ZG{JcO+CxPZk>khw5C=N@Vq1rtwsD%cA0 z56rK~@dWZ8OdV(~#+=!Ltu{{}=791HOb$eY=Hftk7F3R*y9Fc$QiBVF%m#%ENFG#| zg6eM&4dUagTVU%vQjo$0W)4U%I!5*zvK(xk2PiCf?xBV;NZpaU0<ADRKyd&HFOWDP zyaG$!1&wphc_+jG!l1kjGXvyqT<(LZfz$Uf%LGuFJMWzk0|<lcg{vij5rM^Akb4)r z6Jh{ihWm)HA!S}^0~T{Z^Nfq$2{C{$$X*hh30KPT05cpw?p^XuhyjE__QDi{>UUzp zHvx;eAonhNC&U24AbVlvl0xsmVlK$NE8Yn)fH25jn0cV`hFJFsJj4tKP+hs|oe%>E zgY1QwOA4KV#avJyVa+=s1`r0>ONx0gwV*N!<~JA(>YJ^5C&U24AbVkINu^=t!Dvu9 z1u_$aNi_?me!??>R`hXm&^iQ#Z$b<pEb$1DFJO9zp&Q;}nhTo4u=*y%0Kx@inhVm0 z?p{zjv-l>&0KzAb%mw8Om|8+^2I+&Th0&mSa<gwj3?QuV7!eMnlxHA)F!NwEDE*pz z6Jh}23M6w0xe-|&qz`5uj0S~+(KjIm5Waw9E~q?%sX;aa8yln#rWQtn=E)7d2{C}M z#uG$1VAGFF45SZc9*hQ+>w4dW7(loI$y`vp!O}P`^I+m2eK7N2G-#e&=bI1%2;V?5 z7p8|88l(?q9*hRflWTnwVgO--r-*PMr91=agP8}TLE)hBO^5-6JCMvJ#+@)VAbl|N zU^FN_sC^S+0O1En=7RQ~!PLO?<Dx<OU}|ABXr5f<n-BvCTRcOA11>YLiG%dP%!AP& z_bPo8VgO-KxdhV(nkR>;fr;UwLG2fn=MXm`ry*k6dmYaO!0km^&WnNE4Qj80`T`&f zb0f9p-azw&_~w^k_JQ1ij6r2HjBoM+5`Hi~wdps|_`zoGoad0S(4~#O^FZSzAT>K) zBHRP2^I-GKB1q!$d<+a?Z43+&&^cm|K4c8*_aKkaf$}X(%^9elLFR}PVGi;<^%AIF zkUL>*dyu&jc+7!~^<DS~>2rY8gYbrz0<9pwgUke(2ckjZ8eaukLE!<yAU+7=@+)lY zh~X6?+-|%RY=zmSu%@ad;4|bbZqWWdkl7&fD&8Q}gTfg$)>ngMjshP8gJc^6gQP4I zLj*_@8is{4a`?dZo@%@nXf=VF1u{npYEBlK86Ymq9OU={u^T=k=Gb9n0(#zoi4#kM z>;qv?-hriwE3XAwVg3fWRT}EnUXVgG40G!dsNX=+AhyM4f!05N1i={Q7HYW_)bB(d zs|JNF$X<|JWuR_d1`<HSFt--GM#MF!K0s3j=E_3N!M3jxHuibvJ0krWY!YZKcmvrp z3NjOvu0S-{Fc#rf5FgBj5}-7M&1_iuJ%E%RQ$7o}!t8Q*E6}QlH1_%6H)QNn8OPWs zXxs*BC71%~m1|>QfW?X2H(02Er5RvjpE|!0egnz;KynX=4~hd24Z`SZL1G{bQ*#4L zdl=O3viT;&0K%a5GDtnC*x(&zI~&wavHK>(0Ky=9Ni`Fsz5|Q7p!L2E--H-I7-TO< z9jW*M7IQ)MzSB1$1`r0>3o{dx7h!P(6T?MYyvGa&Q24rh6Jh{ikiEF{;uD{M#axhk z-M$GifH25jn10aSPGa5r0*ARC--H-I7-TQZTu?qI)?9}VnBf5GZ+LwZVgO-~y)bi0 zp=V$*7c|E1^G%2WghBR_VjfKG2Q21-+QWX|gcv{=WG_rDDYVB&?BNjbO^5-6LH3ej z9<o|kT)=2hT?sN1gpt*e!v2B9y`VAnpl?D9AiUrsqP!->+&^D2!vQqL9`a3y0fa&J zl42fAEvW5EXp9{eJ}?@l7at8OW0A+$Ykon>U}DVxxeMKVYK*ai+8r=+mG~GK<dNzR zm^h4v)h5VwET}94$%EE2g4zWjHpm<WBFq7`B|z#y7*rO3Xb^_E31p5U5$1r}Pau6D z462u9(CRagxDp<7U}N<WUr^H`C~eC8f{fLl!D1%JTo``y6B3^=K8$W*6lw*93oOi# z;~V5Zm^#pSde0ZZRs{wj@OnB>-h;`3XwY~SDDQ*nU39mA#6W6rVUXFNZ~@7K+QOjr zH;4xD@wJ6uWAy?^;Q})Uq!%3{`wdwRHdYS`iydE4!x*Hl;Hy9@%nnc-fWiwTP6&s5 z!z=?pby(OpAqEfzl@TyAK<>unKA0L9y#|Z9pt3vSn-BvCgY1Q=C52}Bj@`Xc--H-I z7-TQZJW|HCVz8JCY9qva6Jh{iki9T-Nujr3F&7lRao>a(Kp12%%skN87O~;W^8+&+ zK<-WWCd2^3AbVlvl0v6oF&E_Cq;EnDAPlk>W*(^ABG$cou$T*SZ^}0z1~C4CnWka( z;G;!;Vul0Ay=mWs7(f_gFHAqEd?ePrIatgEwUsiy2{C{$$X=Maq|isOm<yU)$oeM4 z0Ky=9Nih$m7F5Q<{05^za|=1&gcv{=WG_rDsWi+y7!4{{L1uz5sb;~{&-pLVihd>- zXl~(^xG)0<m;53xJtT+=W0(tSi*iT^Gl1|JGR+0)Lw7GIJ+Mg#Gk~zlZ}Qv=(uZy? zXuOR@LYM)BYmm$(rThiyLpK+cFPJ2R89?|7lDVLA2c{MlKe%X+KA2h<4VnvKkPv17 zVVysSa3H1p1?hvC2ctpZ`%he$0fbwS%*Ew4Y~mn&F!NwEC>;KX3p0T59VBx>V}~#` z*vvu}1L=dQh0&n7kYD1$3?OXs7ZDD~`UtT>`e5e4Xi&ZRLtK~vgnN+8C8hiY>4TXE zqd{{a-^7I(K==ugxrE$^EDzELGY>|C#u&bc3p0SQ%|ApqkW&7F^uf%7(V%enBrePV z!c&mUMRpG%Hb@`LJQxj14<E#Z89?|AlDRITh_Zx`xgdQo^I$Y+F65oKFarp?{6~ZX zA+wO>LHc0k!Dx_s--rt{fH0^Wg{cS4g}~In#E7H$TO}9-Tc7*~wZB1aXOImLouGDc z41-`R=w53O-m*^`ymlTm9tu%`O78f}4{m#dL_vCIfXvNeY5|=sx?_h7STFiGCrB*_ zd;CMy3lanEvjgERrh;I-pgnRRaddnGP45DCfz}sa5azi=GJ*Afm0@B4xhsKDu=NC^ zU~2*c14qU^{?<QV_*)HF1zT<YK=gprAlm_I|0DB>WrNIt*-0!7GaFg&6Gq6G{1pbl zR+0bwV7DtU3AQpgKvaX&LRb*;|NsC0AuI;4e~GmlrVd#zh|S8($grS;4;+Rqzxi8L zpy32l52Hb9L2il9O)AbyPR=U<2{1t10A&)S1PG{LWJgs1N?Q*=VSy?P=7HQI!3;{* z3=B+s3@ji%B4lv83#4uWGa}uye1@cZkT}?2G$I6Q2S^yC=9>%?1E?GX(V+cWAliq4 zfdNFvL21yvUm!k69;6S1L3%+n$WI`w6AiH!SAIK##a>XDgUqdg+LH^VLHC1!#F6De zc7ZU=UJ#oQCMSLxSRiqLZZ^o?9Z)$^<L3(t`SAmC2Pk|&nA9-l@DykbK}v71vIP{j z>I@7FdsqcqRoK8~3quRETvFi@Y|Vh`0r?qZKMYe+w!rKJ(fZJMmVnZ-P+A^JBkyYh zxdEgH<X#6hNZA4^|2SA6ZU?)K$g%}y4u~ez4e)XzJ_l?i$X#Ft5d=Bukb@m}I&^@_ zk(v&7uoIsSYoK<3ya)2@cNr#z6b1$c5DmH?6GVgVM+MQK@&QDH$`KF^k_YJnVUS)A z4#8GX`UPP^Y4{5kd&{8qg7#s7%m>|54WdEi1BgbJ2iXb2AbVAK1zS`8^0%5XFfcse zhlD3c93&5_t3eo6U*oFlTR0&4KzcxWLH137x@Q)Y2JM>!iG%JV1kuRyAblVV(hH)A z!Q`YD3r>VPk?jE4TL6_KHNC9iBtN~p;3PlJLGA~|4G5DOKRdhxT5H%4VF4@iK=A@9 zLpE>;wn}hA$~;io0NEwMFW5Q(ss|KaATb!Gq|Afa38D?5X$4f~f%u>@4@85?JP<t_ zW+Ai<0ulqc*Mu8V=7GxP0~`>ygOw6l=E2MX(WJToQs(8tubV~>8?ZZY5TvGIl~Sgb zKir6TLpBy<uL%!Cj^s4VgGj?G-a*<ZAoGyThp`Kwc7XUGH9usS7`zx57(g_rtOL;| zP`(?K_JGnLd5}I32I;loMcDh`J;YvIZKD@h?9GFk3u+62>;<h;0nwm!CLkJA3xQ~m zJjhNE2HCqpNU+s_Ll9i%Ef9r-8Au!?4=R5_7*+=3D)TCMA^JdiKzc#;fcl6ax)bWI zDkxnKrIF=9`al?@7eo_-$w@Cdd<b_U+X1pS1u92sdRf4Sh&NKx%N-=Wq{cbO{h+u3 zVN&BK!$+XC04eXl$~;hff$q^>!Y|m$BLFG$KxqSH*9{TD))uH9P<VmFV3?9J4`wHb z)`q4HP?-nfOF{Xd@h1=;RByuU1i1ku26C^40Hn+VmCIXrA#Mk&BeKkcnFFFpbpx!- zgEsTPeNwR9L=fbp;SU11)3AmhM2_S%EJ%DBPJ!A1@*XG-e#$U0fck$RI)H(J0Yrn^ zPaqmp)`4hHnFyjm@*sU64AN^Lgs_)T`oDw4UQk5?G8fdY1JO}X`$1(Lhz}|gK{QAn zWG4uN?A;<G*!trhf2%nI1H%miNSJ}d4+vqlL2#9MIYJP9Ff&2+fVPi<=x(SxK>bt@ zA5_+XXk>YiJ`e`k`{gfxE2!-W3bz_5h`AtfkUXeO1H!O&4X$ybKUmze5b6%l`5GYm zr$hPkp)|5Q$Sx3u*$ZM5!sMji4Z;xrp_>h|_XSjr)by(&f=EY%%3$>Ln}DR3)HFCp zg#7dZ@;@kEL73FIP4E+FO+hLLVC6R`jzQ&Nil|`g8Bs|24N6xayS7LQwpKv(fWjIi z2E&w;-!MBtv@SGVfy!?XA5?yWXi)hLqF2Bygtl2hVj%av5QUWApgP7v7~*!YQX<Q5 zm^mPtR5w7%@BAE4nE|pBJ#0W?xG-7iUkp$Bhsu$f{u9KBPyZ_72>U^P{UyW1;LX6m z0HXb&v?-K!hti<=6qr0LEI@j1AlXYO@65qsFQ{J*GPf9N4`_`Rh!47#2SkI$_dqmA z9@$<H8`SOrVM1*m5eZEHHbLzJwI@L4S3~&?P#RetWETj7{0pLq!Q`Zi6G-kvwgYUh zB*YJ-rVATM^3z2Hl3r5d7UX_V+<-8t@goo*(5eE>2Ox7`Wg94-KxKu4lwj)$DM;A{ z>bro{l*kLVT0r%H!wVz`#gvq7FgroC4m53m$~F)mRJMU=P}v5eL3KXVN^lzxBnEQt z5h+O71}c98Bp_}Ft0S^(gP8-ONp%CfY=bsV(ZdGp4jcqIX}Cukl1|Z$1lfB8Do1h} zmLWb3Gsqz92if^shKa$Kfq?-;2SRC3n-9bXm1!UvRQ7>rkUY%YAiZah>?M@`E3nuL zI?DxQZYk8>XebRT(?H^&vJXUq<dN;=uo7&Q5Q6l_kJv!`19DG{Eb(m(4q1pkkhvhe zAbUU)Tp+p!>JHGDIfxG`>p(QJJV+l1gY>>p5^M#vPeE<dC#n#0LE<2JP}>EB3AJBl zU~$hPs5?My0+9VPpnTB%WFS7WJjgB(hS>{Z6T;-AUmrP$|Ip0_+1mn@BQ^aVkRw0+ z{z1}9Y8teVCqKP_{11v(5GFNlIf4XQ8K8L`WDczS2E{3;JY-N1Y|T)Bl;5Cq1yUoU zD%dIl)dLD^kQfY8Qhvki1krlX^aU!vL3~j84WdEiH;7&dvk=-g1&M*&+oAv|zd?1( z6<LVe!AglNzhUNpXj0t(DZdLU<Dm^8^soWD0|!BB`ropSuf<0ZPx^<-k(&PhC<?aD zX_sgL;gGA4d3Id>H~_T+<Ry@rKQc@VptHw7G-%EUM1#t65DjW8f@n~=3Zg;sAblVV z(p#d0NdFQ$@sFokC?Wg}(hD*VR6c`f(6}Xt&R}3*0MVfG8$=_^gX{!hkX{yLM1JS_ z0P!!bF@z0R>;=scfy|!^wGUJ-gZQAc06{dUoCMJzd61nT46+wAp5Y=Z*c!~hz%WG( z;vbMWNFLM<17TQO4A&TfgEB-PNDoLa$euM&cWi;uOQG~CD2*%+(g(sIy&#$xOinue zg5*wQJ3#j8s6hNcYC6qOAwQiiQ6WFAJy0P(y@31<idPUOHEtO~1X>R$K*9=S4y>F8 z#X0C~wiT*^tpaM0avGGbKx!uF3ASE=>H&o{NDPK4DW_p}f@n|~38F!3MM1PQG@XIw zzd-!0FbkpOG)N5OUL7?^ISr~yYLp>v2P-AAoQ9bLqDggwvo>hd7;GB~0SY4}XKigI zs3?fPMGdrXlY!wcbiEdg1}Oo_gJ@zfu6*N?3t10_YzAl^36|$G)C5~WdpAJw)q+$` zxI|-54>0%b(TAiJP;i3E8j$%HTp)e{v4242L2Q^F7!4AGVFgXWR!}<9Q5S3lVVF2* z?KRB*Fd8KHi<f}`BnM)Xf^#$=?j=PJvRdSIX2{~$*dX`b2@z;T-ov#=9b!K$44y#U zgDc)Zc^KVne0#V+YC-nG%qNxx=>uVqUJ&h|32`ULy)ZLC;vjiq{RC2vj6vxQIs8Fp zA<N@q;|d>`9`rSGpmqz37Q_!QH82`v?-Ff@91{=zHF7+<5OpBEAblX37>vuku>8gX z%4kRiZGpNKn;qE1khG#OaoGzqgApy$e7Mfv0@9-c4G(0)V0!SSUu5;z*vNYjTOuKA zf{97LGCG2-Hd+uoXOVOZs2vA$54t@MklYSZ152;O(lGNtdZ*|h>Rm!>e<O5I(+08j z!PFt!3u1%vItUY5H++H0_JZt&xd}#t#6aNzqKUzvG=xtbw*0vSDQ_X`1=)KCDo1Mm zl+c5u8Bp2*r5ljBAoD;pIz~@7A$sJ;J;-cO+<`Eu@wX%fe;w-rtwTX|EXW=Z{$nlJ z+5;`4L3}V4U<6IAf|=-qj6R}X)q#dBx*AwG!Dx^?a(NBngD^-QmQIMJLHa-#q!&b! zgF$+UwGXBaW)DbjNosCEPGU)_f{j9PW>so@i9&pEW>u<!okC__PG(-JLTXV_UOq@T zJ~<^dIY$A}(N@q<D9tO*OwUVAQAo~6EK<-=P*aF^Ni8l>&{T+qniH#|ker`aT!N-l zOCdfuzqBYhRR?aZbAD+aNM}h#QGU6ChJvO-wL(#9Noi3Ys-0jPbRfoqD5x><Q2o{l zpy4{O7eW4m`5C>h2lED4A+&uAVk56{Z!i~ZRj`1RXaAsWP#6tT3o<_>BePf`tu!yW zBr`uxA-_nWEU_pvF)1fiAvdv7At@E)@5HoJJq73dyyDE1)FOq_;>^5s1(5!cf<fV= zL~cMqI|LvzU~vW;;~^#dK>C#s20%@Pto>KW%quQQO-#{K2+3DS$t(s(UrK60QEGA` zC|Y$CN{dq!;+=y+;)7kCLxWu7{ruy@9fSNl{oI4~6oOMz74jjOB_lPbKp`!^NFgP) zBr!9m7}Pr=#g(IKDGdP*bHP?nToY>!t~xpfY5;oMup<Z3XN1W^m4PXcy-GApOt3@? zvWML4gvbIkbSOA9AbE@Ye6N6<T@`2@t|7tHNjLLgen;z5z|sv&9;ysXf#MUy0F8aZ z>K7Od5?^5sse@qZKw^Y2u5=B`ALx2PeNdRYHkd-jJV0lIMVKM%g}DbtgUq0YdqC!Z zFnU`UGzPu_TK9tFkulg_ONiS@9lK<S6l^uIhs+uNiH4W~GH-$<VoZ}z8`%bGH^@yO zy|6GLmImnqVUS*#G{M%A2#9-bWFXw5U`2ep`wSJ`6XGD)3R?3An#1gHMz{y$UQjz8 zgbB6fW2_+hKzcxaBsN@N>OlHH7^D|O6N7Q3cbHym=}W*G;ZB%35Dl`|11d*q`f9Nz zKOG&gCO^(W?gqsT2$LE=0@(tsAE0YHLFT~5w_)+oVI$c3!3I3O%>haqEQW%u2b=_3 zEui@m6kZ^GFpM^g0~01lgUo^1Nh}RB6j?8iEo6Kf)E}H-1#!EFE%EzgiM1Q14%rPL zHmQ9GM4b#>e1g;;0hvb#lbZHH<A6MNxYNE1RF2fNzsC-d_6f~jHbCtF`3)3z|7DmM zK<5X7XwZBmhz9Kg0ntGW3=AMT1WJSCLHa-#q}RtDF{c!AmkGT098{-)<k9gDEcSxt zD?#Ri_PT-SM5sNWJI+9SWO<l*AbVd}2(})v7X+`34)BMBCrJE`Jt7|yn%C^Ghv);D z3(^a+4>W%XqGv+g0a|MZ;)C|UfoRYkI1mkz2k8T0kX}%|1}eWnXX=3F8(`u&4v6p} zH1{RpfaxC4x)YFn8=&q1t%U~hL2U#OjVuqc6NEwT0fh}{jSi^qZQ%kj7bFgn2d$R? zVc41pR*)bTyaJ1RjzQgV21@UN(np{)vOLU4n7uGQKAN2T6ypf-AG*09d#6C<NX<_d z9Ldj5JWhx>CpAxaIFX-zTafG}HLZcd4wNQ9nACJ3ktfhv11jS|hA=QN!0Iqi`UIUJ z>*Flgy2Tk>hcSTCBuLo{AHmisP(7e{0*S#eC3P6gP7n=R7XzX>p=pyJN`vMVLE>j& z7DCH>kQm6l7n~t=7^t3o0&0^%+hW9?^#C&mM3d?UQs!tQVDp-=bG2bK)IUhx!^^~# z=LpTw^0+|yE1>w&Kq_Nm%CV;h2B`Z){2=)iG=2;!r$CO2=|s%Y20-OO;xIjM8Y~DQ zj<^Z7g3=MFyai#1C}bWMmZo4dNbWzGbF>0(5ch)2AP18=NBboYb&fW{6>2{;{5qiS z!4+?yb||_#iJ9YqhcVP1f_$hYurPiCbr;yZFf*WOkyt-Ljf7L6wghtc!|Z}9z{9{5 zJ}@ol{Sr{yY=t{CtYM0vG{{~LPlz0$IUo&hh&qr~kUkJi494YNTywM$9uRx5*?~<A zmm6@|3o`?K91b=|djV=cvbiul$aA#d^Z-(XlqNu2To`$dHl&pJIoboBf~^nSAs94{ zfNzer1saziH-Oy?a~rWVNFy|DTX-SrY(jIif2e5h1}{WAgHXS-#0!#EK+dMrzaTR} z?F0~pwH07#6eNd?-%#0Ju-WKw1dRu<91#Sr^bXUCtz0;Ol&4|pKr|>Ue?a9(Ef-9D zAZZnpW<lu{W*&$}$LQ&`z=!-ax5kHpbi=^F0E%}ICN=K&RN!wH%<+Y!QBb=8=6{oD z!BzwGG8xaja*3~CE37Tx0gV@!Suh$DXCO9=2C<Rr7!V(X!Sd*7jSwHCk;L=})dHs| zwU>f<<@g+0%q;6D#OLHEC+2{sxP8DZ1x*FKlg(g<;GJ&PQHX~bg*NXDYqy~Hec@w0 z&`p%!aAsg&Kprz<2@`Bx5(Y_!jL^7-(Vz$d=^=Oi2c&<bU{E-bKmP;?C6F2LI4ees z&p~8KBSB^%O=`vGKqvG-;<TTQBh9U&s>u(5o>1z{CBo*I(c8YTxkQ*evP(f}iPm$a zAp1b}kXr^J=O<dHdyqTHF9VS0pyP9tXgmx3Wg2zT4QO8=IF4}4LBr%hYG4=?P9QdD z4jNY1z-W-T4y--`afrmY+PI+nfo=q-j}3E|NeE<22Q;pHCj?p#g4#1U>Oyq0aPe`u z2c{mq%?+A^HVKE=4^so9LE)7Hl_Par_fI%tT$fOrdj-@Eki8%~VR1q%4blg~AiX+s z1Y0+hLgt!Z%!Bv~B;FH2d^_GE0-_IQCb8~-sRQW)VUWEQmV&LI`FPM=^O<Cbxgc?w zNaFhjC#dKi&^$b7P6y<kCGiONfZPk}Yk)AJ{zgP3L?1{G$S*K|6H9~ifiOrfh$aS; zldgH95bi{_17xoYRF2ei-4I27y518-ej5A{MSgk#`5hFmAWUl9&gc|q&4AAPfy{x; zIl$ujK(t`1Mhtk)fdiDTYWxLT@5BkV?!i%(g2u2x=8%d(aR#%KSQ=&rvR;=M$eaVH zzdI!o;`W9Z;^)nYwHu}m*$p5zseK@DJ0i8BBpIX`R6jszVklDc3}`&iAr^O@sesCn znrA?61)Zr5!i3J3-U77)qz4plOtMT2p$rTRAR2UrA&9nz@<C@bfcT*PCx`~ggY<zg zNH2&c29py`8F9G7X#rG@p5e5kOQ3ZNC>=vR49lmWZ~>ixlo2o3dLbU1PZ>b<5l9(J zvS8~8s2=q2q9mWf>;%!Evx7i1XrDcZR))qMXpbg{kG{?UBnEQtn|Me*1(hWqVj*q^ zxtZ9xL6|upnp8Ky^BlA*j2<>%ci<q%NlRN2aHpj=P&rc5Qc5DCt|64?G!hZ^gZ#=Y z3t6WEqCxQkqCsPYAR4qz1w@0^seovZJS-?cdO>VZJp;n9x(3wl1&O2M1z79_?V|^o z3pxh{M1#(Z2hpH?_8=Nr9%dfQUKk%AO-}rTBq72F*=&%#Jy1DP<L5*Y`SAmC11Nk! znA9*<=n-hufTk&sIk0j96t<vzHz8TD^+z(KoB*{IL23jt1Y2#OdO&^#iNP=><pj)5 z5Dhwq2SkI)2@nk`CqOi)oB+|FbxSZiL2dwvf!r&S0x2gzW!arXh}*&HKnWI0eTh6r zjBF0bJW|~NE+;aR;RhUp%mdp^1VLf6euCk1yp6iJ21k(v&dq$1KGp|cVLpmu<~ z2l6Y6Eaa>>5Dhvj4n%{>S`ZC7D-J}1&Q$`@AbF5J5C-XWC=+a5kPYdlSyV#Y4iYy> zL%4^~88;8GxCc}|fb0VukpiMY<r9boogoLJLFEXD2FZim0>U7BL2d!{)j<8C8F>iz zfaF2*{2&Zl>jN4;0EwgHf;5OekT}RpkUgODlt47-Y&j4OI$I7zgVwu&Xk>YiJ`e`! z1<}M{a?+7XI>MdEc7W`Sfy$AZj%K7I;*HdFbOlK-sc{Z+KPYZMnAG^W&@0dyfRv|T zWg#eDK<kO-WC*shWJ1b9P}%_5bs<-<H3g~%6kZ@P7^b8wgxLwAbr={JKs2Z<1ks?g zi9j^yY$6cd4YLqhzJbI*?p4Tyl!c)3dQBR{?O>%umW42LKs2dtfR}}IXfuJz!WWsi z)38DoM2_S%oJD*Zj)B?%3SUq<V3mcOEeE1O{Spujs!u>Ps0;+rptI#bG)Nw#4}?K_ zHL?-*5=#G9u-FSaTMlF{sLceTL1!R=Xi!-PqCsUMhz7}n>;z$uy))_sTS4V8sLTs# zf`l1Jd`C87tbtITO38-kgP94k2Xsaehz6Z42ckinRY5eUtOL==@*sU646?T;Rj?Jb zR|Mpql46LtAaRg9sI3FSu=WnFbr4^$xCeB09LQeKSSyGIotXrpL1VEX8d)A>7YM`b z1+fWXa?0QpIS~J$n+>w}0aT9E^edB#NJoUqVD$7GfuxtzG&m)f{PY6yKPX;7nAEsE z(J#;%gH#T{%5PAdg37~~Ji*o@d64oOl&(N_ttk?0Er99)g*8YFhAAn(VRnLO(2iIT z4JyAuG^qRr(V+4hM5CWA2NDCh_dy<{{07xA200M7gWX1C`3*A%M3d?UX!#94_!vEG z!0y07kd^-P@uYvK9I5F)qJa4HFH?Z9ALLgyS;)EdAR2ToJ%|RCLm(P-xB`d<om&s0 zLGrMm0O`GeWG|t-GX;yipmXa%=7P?p2hpH&>p?VV`2>gtom&s0LGsA<g4m#T4+s+~ zr+Er7{R=vO9%L@4JprOY=hK5|(E0Qr8d)A>7YKv=3!;g^<fMxONbW?o17z<Hs2r*3 z!UUA(_ws=6b|h3TqNj@jB)z1@Ey(?#xB+2O<ELVxK&uQiAArn(m2IGS0hJXN#e%I1 ziXmkisP6(&Q&1t;Y5>&(3NMft3{z6J!R!RlpguQ<29<3f8dSD{Xi(V(qCs^&%ubLS zKw=>G?kR?pZJ_ekqY&bDusR~kHkdgenp8I+$~I`@6xwbE+fM{RPCD)=LF6}ND?nj# z04hgnI<_b!zI^)wwF6`~$WC@yCI-+QLm(P7h6kc87#J8pG^kty(V%-fKr~1mqz{Ba zdQTwPODGSNlp_2M(hD*VbjJ{g294o>XwaGt5DhBVKs2cQ1JNLPkewh5()%P_u(hWJ zviI!IB#5~n@rW|w+Z!xp5PdK+LH2+)&w=P(sQ*Ft!h!gp@(x5J%Y*cRFvwnkY{6Dg z8x>S9B-BF81&M>?LG2e1Ce((Rg2g?Hq3!^+3qbaR_Pl{;&>l1pjVuqc3xr|zg4l#G zIqBD<9O6H8vqAPYK;=kHzkABbPrpBq^pcteO)AJwFChPe;uVBRjoX6B0<Axw{TPrr zureGJr=T+NPlaG>N+qNW2c;{Jni(~Mtpd=z3kqwH7z|TVhQsUx(V)94K{Tig2hpH1 z97Kc4a1aeT%N1rP$PFMdkb4^{A!RtIp1Dv4aXVNYk!3i{91u;a8z5zP9&8#Ee5O9w zZXyU$(?4iUj7Jro^beIIHU0mnLZp8}b259Nc7VJGiUST=CI-;Gm>?Q-hZ~3njU#|) zP@sTl&|C?K2FZi;fiOrfhz7MmKp3`v0oR<2Nj1XXAiW^-Dj66UKs2bF1ks@K97LBx z#gXMfc7ZTRFNh`vlM_ELklcxE2gqK98i*fAjh~nr^5X~O22l8dFsWgDV~RlQ9_Sc2 z$Q)QX0SaRS1_lO|TEW(yT1Yto8m|GV>1h;fy#Un%@-s*bhAAm0V0MCN(D)UI29*;a z8dL^=Xf<fOgYNEw*$Hw3NDk!Q6}6CZ0#ue2R72bjR!3wx0W$|glj;UoIRR_wf!qbQ zn+SrObXZUaNo(lFgX~=al_NDBD%2C74xd2n0ND?+lT((7A(MfD0YroPk02VfJ_1C8 z$_Ee)Dn~#xNFJmQgh6^Y)FbLiLTNar9^r40UXXd9xeX8vn%e-;p#Ca|29*yW8d)A> zCkTV|%Cri$g4$M~c9lp6#9WX#NFG%0f-tP^#WnZx28(+@XAFSsodXRIP~QZ^2c0bd zqLJl6c7ZU=UJ#oQCMUftXn^<+-E5G(H=uH)rWcV$^3zK|Bl&R-@&hPtK$z6{>6j+a z`UKjB2AKmZ^FZ+eDnlfi1X~-LAY~pXZGhDHv<tTWfa(E-7f1|-DJk<{c7kY2Xj%c4 zc_2Qh%mdM&G7m(fpR*4V1G#rj6Qs-omCG6p5VwQfMr4@>GY3SI>IQI`SDab`J2MbH zY{2foL6Dk;L3?*onsKM$IZ!#0({Kx7T_vG&Rc=7-0C@@IS1ws52GAZ<5DjVzfoRYe z9f$_?H9>S70|Nty2FZi;fiOt#k`_ezCv-1FKnud(AiW^-Ky4uq4VvQs(V%%|5Dn_n zf@oxUkewh5(hFLn3@Z0P=a_)@<io^GS_NA{>+nEWAQo~@1+Fsh0T%aw&QAf^I~D3* zP+u0rp8(|}%Y*C$VUT-3{cO;D5U8#=f>s8D+B6^x8^gji_fpV`89qy(_JZz(0J#H{ ze?T;7&ILpx%Y)nk!XWp6Xksuq=~tx<;Z9^bK=#H!<w#AxGup^czgODGPlE#O<fj*q z-$C&T!lcG+!wiAe8_+pJkU6mO8x*IYH9I%j1zR0DAmukGU4hgbm>}5t2C4@X)*vw$ zrlkCa*$JXS^By1?bYBFB2Hh6{qCxjXfatX_3!!6xATf}8V>%$^H>i$T(+Y7rSSgX^ zH_RLmO{yD6Ig8{;2ju(?Zs<M{7!7hOdYFR5aA92ehR|6gGddvqRzUH!1*x16nU6g^ zz})v{A|%g&f)iBMfZX+E8N@Fjwgz;355$J)fzco_7!K$bYz3twP?-tBFmcc}AejGQ zG)Rtz4{}Zkh)oKf(*<!aDSD9ABCj(;7RSa0xi@Ae>RBXjIwAJM!a$@O!p9YFpgfFj zHZf<Bz|1F>hS>pfGl*RPbr;CJFf%~nAbDc_1X7QTL1Poh;SVwkSsou7SNOp6pznVI zwP#FvAYltr1EWFqUg?F%5ju0grXQjXq!*+QL=%H?xffQ)qTd(s1nO37c3>03<px~# z!puP5j|n@ABnBED$mYWIAfH77N)I44$Y}z^$Av-d9hh9mT;k6n@#zz6&FO()&^|Lz zI}qj`n0YW-pbs^UU~VIphM5C0|41KZy$edWFg3_@2NmrFnG4G6APlRsakUQ_(9$Ha z{)DLm*#*KN|AJ@`hRMNbkQlN&h>s8BN_Q|l*z)HUB!9rvfoPDuJQE;sN^1V}m;gyL zptJ)@H!$-+G&)94H!Ty$k9&~Wptu8JQsb{=0scC+1gVY%*#p7~^8{P>K+9+lAB^#w z>)|s|uoYIX#^4EekU6062hkvmTwa6tAPka+r4wRlkUkIw=>^f`V31y7?SrX<*#pu` z-nky&4mh!=dcZH0$jmEIh!0E5LEI7Hn^*z8<^ku)9WblV&g}pj6OYgjJFWxdCzwCc z`**Oh17!b$*vR|Tmdq4vb(sapXFSk$CyWNE1({FoK6#M-k%B?tME*W~NGO5KfW;YX zyaysf90}47IiCZZh@hu)K+dtJ^*IH^xo}h!H9|mVCUwqP0F9r4+=Jd892VzufU^MY zQ$0A(ky}72LC@y^yOq|bb1*REY^6@Rf!(!$E8W24L1_zyLE!{qgW9vO`UOUV#Lvux z)Il(HATdH1S9=qbKhX7p+V3!TU6~FU=K!7mTr&e<FU&nK8e|4F+ygQPgwfl-ptT5B zpmi@u9vOq|RhbQO8>!=!GP?y^BNhs_g6G`!LCgS|w`DeB95bT~a$hk>9NAtNI{|7p zh!0W&3lm~#kUkIw=~a0o*vfGWvev8RIl?_IbBJ$if1sj!Di#U0g4Umb!e`A=gnK~l z1-0Elm{9w@VGcweNDs)5#D)t@9Y`MtgY<%EVlb}s4%3S*eVNQfxD%!hM1$<jfy$AZ zzE;d7KOH@pOMaY#+zpBw5GFN#9;_2+6`70(3)q-8EI!uE6KoZk4<6Iz0HqC$$%3s< zmI$`SK=UUkyg>HDFldYv#wLXZnFF(vSQ=(NvR;GvkTGp=A8-!D?K$&_KkI^6yJ6~( z-2h^f+J`{2YhkN5Anj6+S;Syc(>`eI&tL%}zLD(!g<}R(j?}dOU;!fS6Pn9h0<{BV zH^@$2StbV1o>dSHYI}ib(Ec$H4LSz{M29mlFo0-~JV+l1gY*_GM9d=*IuBoFA;RAv zy&&^IbC)0*v|a;5r$FrittSETk>x>lf-p!g&uqcg7YiX}cg9ADxgc?dMVR>*RJVil zq2o1J+|viOe<G9y?Mnc;1GJ6<L?g??%mdjAs@Fi}H)w7ZG{*pv1Bp)nmFZbbEy!g9 zY@8LO1{vEdg7^a@2GR?%542wlM1%H`foRY=T@VdwGk|Dhd5}I32I&Qb4d`4dP~SUd z8N^(WI7l9}b^?T9>nCvC5pf2Kd-g%Y1#~9_$o?%*KIpCp5Fc3{WETj->;<t2VRG_Q z!(xd4(9H(fy8|jmYJU2%nEd=?u!Q_Pk+X#S^t%GdURXUuY+3__9VktJFsbR{#YTbF z1)wq>WC+q75uo${x^tmmsbK4krQkY@0hA^|%6Qfbw(fxH0mTzY42CJG!(euTXwW(u z5DmH`0z`xEhyc-`J0d{zQJ96$d0CJc$h}{dLh3M3J<G8e;&!l7&_p6sEtn4_kmub% zeu0?-qDgfFDf6;5(78-L==d0n2007l4iHTY#+By?&C41rgY;KG@#TY5#?<V>o*rQC zv)BO1ub|)rl~W)$&bfz}mo0(HgT!HaU^GY!hF`1@Yz3twP<ac&FmYV-vVvsJ%bKi! zxEE$VsWfu>Afy)*Z$~zv&datehu9AbgEdh1;EFd;U4w29G4rx8^NFQlc7WUrVsos7 zxD(`Fm>D2(kUX(|0;xyFp#Cv(_=C(smdD4&6+SRM==~B<+w2U~4=^<_8f0(IYKZ>` z&HMPQg{TAR1?dCP#9&<Rg_Ysx^RhLoAogIh1DhBwH{h}tW(N9r3T$5X3)FsOb76Xr z=Vd|Z0i*^wO@R2gF!H=?$qwS@WuL4TY-L#m!JzpyeDks^pm7Ou1IW!Vw-HN&^nox) zZ_FCZIvbR3LGtKWVGShCK;j_1#M%c_2hs<^AiY=CAlex^(fHTx&7h*aAp1e>1Q3R` z6<}!;B!`Rz(DDMzAH>oyvq1iZvC;K{#F6Dee0&&JdWY%3RxUh2@&`;Ehz8j!vknrc zq?QX2>mX?rlx9Kc6=oiYM#t#sb;>&O)7*u1<fj{uyFl>{!lcIio!$7`1qaqc!V%Oi z0NDe=K6?dQL(t1)Jafr2)(f`6+5$Ov;tXUqDDFTs2qV`qAU+6#<k8a_AwEbS2!r&3 zXmT(}FClx-<ze=K^inXF48EEHK2e;Ukyxalp`fM!p7d4FRESoH56-MgRfyG5fGf(x zIh#z{)ezvx2C)5L+jJmS=|E?y;Zw|5u7&{l85SPs{ayI@4s_!QNG&L=kjIH+b_lla z*#Sv={Lr>Ej0UL%=?TfmELKP>%}WMdT(6K{q)?VvlnK7jJ~y#aAt@CU9*JqGdJ4|@ zdBvG2sYME<#hH2O3LyO>1%twgx^vBlF*$O=5bPd!0w^B67lNEX90GclY^TorA#7|D zy}dhp=AGknXg%``&U54zmMHViw7(ak;5Bv94QLD&ludA@8<;#u4Ge?A3B(4CO~dLM z7!4A4f!0Sbbs#Z97+1R%lt0k*g8C;gclm6CjN^dDn7?d;)Po><VeWy^ATvPXAetDA z%RMl?=<RIKytB_vi2X1%FdAfU3sjEOv0RZ|h_PHk^UDXIc7W^!*$MMIu{1~@2!r&l zI3m~zn)3$D=cXKo_zNVyWEb&m_kdjxeK0eLbq7oxNFNA;?7eeVuodJckb7oafS3ys zH`z^mf8YTX-ScOsU@K@I2jrfDLkRbP+zaYofH0vxM!{}~K9C-eUts<wmImnqVUS)B zO$;U{U90RtxD(k9ki9WbIa1U0j6LM1>nnT6PlEz`$xkmJzk}ixgh`Ft9cKhu8=!N2 zAah`I<*>NEu~)FwVIO#&fdiDTrfd{!U2#yb^$L!%lnrDE85k62FguB*Vb&n)joAm8 zX8`qa*X)M4eFkV<4739bQVY`uqLIguL2|^}4O0g)1B5|(K{Tm-AW&1fAgKs6B@5C{ z)ALY3_clcA$DL;;K;=lyGaLtq-?x4SY6r-(pfD4VWnuuGX8@uz7#J8pH0X?J5S<9+ zgZBD@_#k<ZJ`e`!1<@csfv|{&4Cpvg22dRg5=X}_2N3=S=>?hB0X4rLN`v<Jg2X`v zf#^1<I7l959!M{YO^7D7OauAj2a-FH%?H_Qa1i1LQsXD*Ao=kFas$X+AWUi)E1VN( zJp;;nAVZMmFhOApy8FZAkYMYaL*TN70aT}hl+8IN*!lpf2jpjv7z|TVw!rKJ(QeRq z1<gx>_{LB^=*)8vAGF6BW+%uEATf}8cN~J0EuiwR;Q++#V0A>6EiiLHG^uWYl@qYu zJIGyNyNMvkNrw%GA!!ZWc#yq2pmL<9LxUs4r^7E$J3#h>>=cBan*^dk=OTe<(78z< z8dN@jXizx<qCxT?eIN|ddjQE^LTNbX2*TeWy&&^IXTF1I(E1e+4LT16M1#r)5Dh9v zKr~1mWG4uN^!Dr$Yz4K)Ky9&}(-3n(;vjiYT@Avp`Wn<{0g0pIKUmzeoPmJ>WFKe` zG>8W6#Rt(#q2kE$F!Nyc!ua@Ta?;C&qY(e0n+vk{1yqjI^rCW%{PdE5q?gn<2l)XM zHy})E{9HIM(E0`1?gp6yYfpjV2ULb=92abza2!(Rfzk#@&5=`rtsKzw4hk=j7z|TV z=E3X)(V(+$K{Tk$1JR%|4@85?JP^GOW+8Mf21pF#-ZjS|Wge(pwm1rLJ6I`^Wgg5N z5KXEZKxJN0at5ec23v_9Hef*<1UYHA<OJ?Cyap;qavDBKd>VcMwFBfOkY9zMZ6gp3 zYWsj_P}>MZgW5(Q8dUayXplTe9|(i=f@sj3F9=7Z2!on5INL@EClUSz=>?ewItK+r zgU$v6(V%lsKs4y=ClHM+53&n{L3%+nF_@hA5jll$C$b$NdwrmCq{dIjDe~h7<OWdq zf-tFJY;jSb^#yeN0%Q)XoB)L_DBlH~7Hr*d8d6Sx#uq?pE}R!^{R7nl@-s*bhAAm0 zV0MCNP`d;~gUSgI4Js!<G^m^a(V#QIV0MDs01^Ya_sVHVIRPrm=A4AM9juPXasp-! zh$htyuyTT4ZKFA7aHqp7P&rc5Vai$J)1kmwg#Dm65SC?PNMm4N0MVc|z91UZHUiP0 z@&QDH+D0H6BoB@kXgPo4s$eT<3=7mo@wfpo7i8v_vxu<_LTP&e7WdRa-2+N5AbUY~ zTYzZL+2kM^SsvLvK4%46LG31xdpNEj+yhbrs*gdKP@QaW4x$gF2jmx!ebb=s0i7WS z;)B*6gJ{qhav&O69;6S1L3%+nF_@h4><N-Pk?jE4D{~&=2U62f#Ch`5(UkM#$2rLT zptu2HQsd{vC4p7}XubiN11k$b@d7GaVlD`_9=QN13qffEq{iX0V5<sL4=B7qVlYfe zSqQTeM1$HZAR1H_f@n}#2%<q{A&3UGyJ2>M+yD{-x%a^ZNLdIfuXD~p+zwVpWLXF^ z2Sk(V25?!J3ORur<R-AaL=dE=U(me5l8cZuif%l}-aAk^QqwQUERfkCOz3P~iAxCk zL3WDBGBG$aFff2<P#prIL2(A6LGc2j9g*Zgc7ZTRFNh`vlM_y7klcxE2gqKQ%Md@% zGn_cC2(-#T;|Js(SbhVAk0JvD!<oy1ttM9>`3+PzfYdZx7i`sm>H)bMBnHEj<Tsd| zAX*(7H=woUAU^2qFAyyb6$jl#2eT9829O-cy#ZGs`3+Pigj|BS9juPX{01`zM3d?U zXnun=J!m?93(6A`S0U*I>^~#|6dnOkIa1TogR6)+4?=ma2Wkh%YLK0xvP=vv3=9k) z8WcYu8dN@lXi#1Q(V#pDqCxT?eIN|dJL8sME2zE))%78FA^rl1gXBT=2nfUK5?tfD zGS?vbKzcxWLH5K#-2-a-fcT*GOCTC_pB9KlmIvtrVUS)BO$;Wd47h;gPGmbk_HtZ@ z_<_`TbGc4_yn);R3SST=HH-_c3bgh>+h!nhVC4rWY(e>v=Z0Ww$qh*P0g7Lcnw~p? ztqY)fKz;^^!7wG|2h2_otqF~HQ27DkgUSyO4JtoCG-w|j%ubLSKw=>GPPhRnKR{(% z#5IW9!Rm-CKVas7Xj0t(DnG!h^uQL<exGE-O-NdUS_h{<;V}U!M`}7$xP?fEg!W0E zf!YDG7-XlIEE7XK0|NtyPJ+^)F%A$PlwUzKD8GVekUU5q2!r&_nJw4~Dnmf~13`OT zVB#BYA?8vEodp|n3lSb5GePzgLfrxCtAO~R@njGUx_=KuBg=#A1YwX~(7tz2e+pFI zu-t=~3lay(gT@Fzn9y0UZ?L!rG_DM?7t~h)(V)Q`5Dl7_0@29wAiF>qW-o|M2$Nc# zf%bGPxDD|iy4fImZ$RZpO-CYk$WKQBcgT-(kRL#C1Hz=nkHU3<)-%w4GsqlRSqO?3 z(0Qa1cLiG;?n25!P}%^gNqH*R`T(j26kZ@P7^b8wgxLwAL3b;GXiymlqCw}Uf@skB zsURA3t}x6_kQ+c^AotF>3n>dh<+a9bh}*&Hh%5_X=74BY-9XAdJr(HQHgV|MVi*l_ zE66_}niz~L?GxIkcjGQ(eHSRcz96+-Qtn_+4>0#lcm~Ngpx^|R7a%vj`H9%4cLpjC z5{K!5(I7Dxp721h6_k!Z<sJyb#BuG@lOc1T-ktjp_rlC4l}27)K}ats-u_%i-KVDm zwI3D+ArBz#!4+@h?$d*rPb>}d3&_nN_6DfCK<<T^0TKtv6YD3CdSnc0^CE{o$Sh=e zd~96d1Ji@PP7qY4mpp`oEldrJ2HC6g7$Qe#KaR{3h&qs7kUkJi494YN*d8eKeR?*J zAogIh10*K#L9i9nJ^=MCW_-e}7MI&_xd&u6NDunDRM`H#El_uX)W9%I5Ayy!P&xt0 zBc~M*9~TDIO)$APw}{`rx8$*4>zaoU4B8KcZ~tBfG>$>`fZPmo8?iJ<9|(i=f@qMN zK^Ru2g3>cc934NPvb`Yl(cKIZgSiXDCWLXtKTIFC{Idlq?Zec8Xpp^cpmL<<AC0Gw zxC6x@DE?sPfoOD$9)BQtQ22u|sc~@RF8+E<0$NXj>M@W#AbjDYVCx@fISAr|F`j*8 zAD#-f!s;#?X!wBjAQ7Oj194$Ah>ct(g7_c|l1GnoLVS=u5C-W5(d1x|UPAVu%fsve z=_PAl8Mwnp_7SBDnz#-mg_(=FSxi9_b_gkS-U#L=^u7+XKMVFE$bTRP@|sA6cY>`4 z-a*P^32565MuXIX^pLyN0i=JVU{E+wYhM^R+DQyJu>H`;jxUBBKME3~^<EefojIzU zf)H5omO6WRhVvdUaNeOqq6g(I^7A|7>`|~=X@B%6!vS`oR*-v%O?tT6TCn+5^tLu^ z?;uPb*&dj^p!JlndId&<)OkSb9+*0i7$J<yeW3h-t{2qCg}E!>4P=Y}v@Y|<8%Ui8 zvKQta7!5K5Bo3m9!MNN5(~I6V1<e};yocBiQv;(x_AY?Rkvd-YgGZ>f=Zhft?9na! zLZB<E!1G@QpuShTL<`7XLVLsRK<x&(2jmu5m=H^Y^nox)@0zcIt)TNqL4Cd@KOp`E ziG$=pZD0^4)DF)10MQ511JX;ZJ7DTS`al?@7eo_-$%#*ej|g`n+X1pS0xCypd`|g@ z7=I---au{ug)az`8pbg%1zP7o&x!?^0~<qyg=x$u!PX<6z+<Q!p!i+$T(I@dcfr;h zIPx-ROb%oYsTdS?FguB*VRj(veeek~h6?Hrt@r?OyUb_e&+8=CZkRe`H-OlrwzuKU zIOr@k$S)vsh{2?$UC=nw9Z*<cF&t#C$QMYuCN=FY`GQEhgyx_Epmu<q0J2k3mWd&P zfq?-;gXWw-G-%xohz@~@he2tOJV+l1gY<U17i^XJ3OO_L2s5G#H2I2{k05l0=L0P6 z0nIsq?5}{@3!2LY@j>f+K{T>F$SoiYau29H29<-LIWf?<GEDr)SH#*bSpEdnksx_= zT<{eV2Ox2fnIQXmq3!_fjREmN>-s=+H&h&19;6S1L3%-90~(71^%FyWLd*q;gXBST z&mat&e};|qf#gu|H;6uv7)US3UeI~oAR2TZA&3U8>jTlCdk8@^vOGv12!r&3Xksuq z>3R#2JCW@G+4}}6M{2s(_)dPhPWeuL8eH(5{PY6yJ1Aa3nAEtHc_YvofK)!f>H<)l zg4W?>{19xt@B>^IFo4n($gUPfq1F_r9#B|=#9)|`x&US;h*pNCbI{rX5Fd2zC5Q%{ zdkLaJdvRcPg4_TS1G)Fj4@g}As;_LmLEH{j2OT&AsRi?)1oC_dNDgKWh$htyq|B$4 zK<A*Opkp#H8ssdHJ3urs7+1a_G@qvN6Vg@&#g_|GIU(=`dwPJmZvzvg%moD}sH_3G z(IP~s71Ry~vEM-DL2Q^F7!4AG;RnA3TS4gvRAz!OOdQvInj)F=X*$0VWf{y4QfTD# zK}a7c-hRA6olmRz1+gC%21}ss!4+@h&Zoi5Czgi!1>|Nh`wzsOAos$|0EvU-iS-jm zJu(KR3FPnxnT0HmkBuvQV0zH|T%dN&5vU(vYG5?T-jsh3{}GxGIP)K(4x|^P4@47# zak&>($D+@tmHdU+gUt?XVz}IZ%U+ln=zV$EyxAM5{mACR^dQfhfzks=4RV?Q@o`~L ze*`8M@QL_&vpfF;TmSrlV9>k^zIn3+(6|KI19CIWZN$<beIN|d8}c8s-UX#wkUTn; zKua6M+6PkyGY@1hhz+W*K^RtN<7yvHpt8LnyJ2pE(I7G0Sg=)sL8$e@e^A*k+zMJX z2lE4r#;q42gDb7VRA9@~GZ;X2!c-t=ki8e6a-`;I9!4RQv<5O2WFCk{$LMLzgHZ_M zo^fK+3&?Cxe1kBlabEBhf4yu0t#?87GRPhfe#0l!>VsY;;+Y>5U=nJD)x`?Xumzce zjA7vfqd{`WWju%v!XSBA+9H+)=>uVqUJy+V2I(c%KA1X~Js`d0&kur+eT1JVN#e1S z@j3a)i8-n9B?|FAU>1Q%L$GC-(}q|MmW0k9!u*QfFNBRnK#!ILk0*k{19?oNfJ>-V zfE$tzrJ?Or7!6Vj3b)ZYL{LcJ$DnW`e@+2nHpmQEoE1aIk03I{lOQv|cNu~wDBwp* zg5#bJQ!B(fbW|lpA@GBfI`cxqem;@*M@oY87WsJ}X+DwmM@llh(5FtinGa39=zS2_ zd?HL9stinl$|ev4)E0)-F)$h=K7$KV55d%d#0X(r?M_hsK-UXu%fZ~WfJ3MiG~NU{ z-^GIyVK2-*FdAeAHQWO-2ZYhv!Jv7)1<?8zB#(?i_I`lMkvi5HBPP@eno|VL-$_U! z{MW!E)C#f_gbB?{>F_}Gf!qXg3oJ~Cr9t{Y7^HWCyihC1O(6I9C_&5xi3{)&-{#&! zMfcp`7HS2}H-Oy3BZ6=b$i1L8JO~qN$NTU?^nvt%{6cKFz|?{CfiOrfh$aT(O7Aee z*wPmRAHtn5bs!pKuLV?&)bv%tM}9imz(;<ZgWL^@8xSTnei&GUTkk;Ul|bge#=~Lp zQNb_N`hZ`kHGzSF1C%yCFblQ12n)4pK=U9dyg>S37&N{LW0OLI%z@cSEDbXsS??cy zp;m4N1_n@Hu!9%kb_)TaRt9KC5u_HT4@4u6cY@@IwHu}mWCjR>^nz$o`w`%_Z9yJL zE4a=CGl(EaP4l2})-RxNz+yJY?K*;x{6K1&Um_^f3Oc(FgbD5K&4AhgastRs8CfO< zZw3Yi5bX!0L1hn!51JnZ(Oyt-kUU5q2!r&3Xpo&COz8Zr2UzR{g*eFkQmFZ$`B@Mj zH17$bLH$Dz4Uz}h1;Q|UL2N>pocNg{1c?K5vqAQrfy$8@KODm3#}CLIpzsA@Qo}fd zRk$?=DZRnU6;POh_P}2d7HYK+0hcQbpgI|3SAc|2YYkKn$j=}#7^b9Lf!PV7L3_qP zv;;KXLHpG}e0eAza<T=)R*)M&av=AHh(O8}P}wIV1aUi96_Mo%%p4F+svDqX1ibeP zau?WcA_#KQp^PZ*bQl7aBQ+g95hXqyPJr40@*c>qva(DJp!^S_LFW#EXbT1g1`rJ@ zA3(GZln;^z=>uVq-U}K+t)O-ms9fpMhWHC4ULuBY523WJAO_I~GZSPVXpb(42Cbg} z(V%r3AUYT74$xj+5FaED(g(sIdoy^1T0!kBkb4|tA?AX_LGqyb8-xkf;Ty2H2Xx0N z$Ue{>UJwo1!waH8=MaHtWO<NXAPln?#3qEvNk=K-5dWc@4YGF*RF2eibVD2wZ-nX_ z^mHU5fzV58oP+!TiW?9nHGU-6g<B^;+tVO(U}YgFUO;8b9SNaU7fDE22ud3uH5D>K ztxKSKK;Z=vgJDX_LYSQ(S|6HLL1iI`4=M{mG^i{D(dc`4L1G~HCP+fcLQr}AMhxP1 zu-k|%3t{GfXj0t(Eek=%1%j<a4;!!`4uaG)4C)VRNa0Sy2~atb)36jG9j<r>xdRTD zKjuK~0C@?dMoyNA0kl>OL`N|&Fo0-Ku!HCzC?B+@48#Y?gY<zgNH2&6)#V`k;621% zQ2!q!j*dm75&j101(^rB?-@jc&SnJBpz|(3G^ox5(V(&pM1$mE=7IFW*o0_u;^zdC zJCV%?+baX{1F7+2BSU`tfZPBIUl1lWj2k$FTjxN>B|zrD$_Y@I8Za<0u*eFv=Ey?I z3DCF!NKK2PQ0oS$9<ZN5f>2CJIRUd1M4Lm?6{ws5@j>_Ff@n3UIOwcBsFmP83`h>- z-VRwvIRPrm0;C~s2de`mSm-<rm=7h;`(iM2Ks2dtfRz)lMiYA2K&`||k&_Ms<REDc z-9V7N9Z)$^)1ibs@#*jg)DDpSAUow{nHWI#zk_H{+XO^AF)%QIXi)h8qCw>dhz7}n z^nox)?*Rv)R#3YM)JCashWHC4z5>ZTgwl41JVYPNOprZQQ2RmY1;huP8404xq2i$O z1;hu*gY<zg$lf!eLam^76UaRcY7lcl;vjiYeGI~c>f|R_+yiPWf$W<FwI6g2H;6w8 z%14$5*#*KddqHeMn4EMpLjmGHbhAPBUVzGxnvQrB$xlZfNP0<)bC4fEaRb7n#*YD) zaO)9h`xs;ntSkh@52$PrP!ejbP=b_&ptJ!}vqM#=^#)WAD7-*oFic5V2(uGJTSC(Y zs4N8WL1iI`29<>%dN#~LX!!;b1G#sK5~M5ymDdUi5VwPs5?L0)%mLA)x&d4kmOzfV zMh_RT8*mV$re9E<7om(h{Z4?&k(z!bR1oQxP@De@)DDoBKz>z_WnuuGrw^h*<qU|9 zV_;wa(V#{ohz5lWhz7}n^nox)Z+viRQZZV%f&2)<94Zih;%YyIK;>a(fy|!{wHLI1 z3&d}P@+U)SP<tCB4w47y17VOmKr}I!ocQ8Uh4=&Ae2~2kP&rcLt45Xl_yV~D6uux# zY8W5j7H+)&okszg11mE?VG26)%SBD7b&VRN%m9rEfYcn(5^8+_)dTV~NDPK4DKlVp zg6L3a{DRJI1MxxU6@qA2sQ5gXh0rnsBnNWu2{lNW0V>xfs6gBfR!U@<0W$|glj;U& znE`7)f!lRpyNMvkNrw~Eai_x*P&rc5VT1<p>5xSOVLvDxD9SQ1fciBc8q_WU(V#V& zAR1I&fM`&;0-{0kuwVh{JrFL`>fkNZ3Tm^4#6ZjiiN8Q{523U@1&e!TGB7ZJ>;ui$ zg6L)_A5?CD_@MFyM1$m!-NPU+)Cy`tf!a?W%n<GYsR7l^AWW!!R?&p$1L*<z1!T`w zsQtU4^lB)*8A>C|gY<zgNH2&c29uMHZXmf6*$$As0$LD1keZHsw8&3K9Y}gfjdPIu zL2(1Zq{dGHuW&01G~a;Cft7`zcmtI!0op>XJG3EXAt-Ht)M%IqwMszsfWiwT2E&w; zg)looG^kGkqCsULhz6B~AR1H_g6KUk3!!BpNDSoOE838<5L8|#XhPf$R!U@92r~yn zlj;UgSy+;v9bXK#5VRT?!a$zun_(o>YGDjXUrMq}450QQj0UL&h3Dv+K~PBG$DnW` zf87woY>*k~aR!kgOoH@+*9w9oeDvHA!XY;FR45oxXT8^OUMC1n{&ZLz3(jxk7L3rl zr@?Ne!?`0p*3?Niu>Kvcb%HQ?<eUWxClDXBP7qeFz-W;80V7D=15*bQBZP6auR!?& zT`#Dg3v<^A1IRi-(77W8h6sCM?t#%DGeGWvmc<}0P5Tj``I;NhIv8vj5&?3DfC<E{ zq_+P$Oc3k32#r7ZK<xlo4YCsy7NGtChz6ba45C4I<bY_<+7b{A8g~HEAbF5J5C-W5 z(V%`X2;VT115N4TykqMK7JET^)<NbjWME(b(V+VTLG%nLA2jX>;)CQtc7ZU=UJ#oQ z#+80x`mn9Lt1yMc0Za{y2HCp-Do1MkyfGy|en9qv!WV=|4Pyp=;no18^ag8VgTfTF z?_`UaP^*kNxQ)#L8c$cz5o+DyB-EM!)dTV~$bJ~6q>T-;6GTTs;}_Nj1>K7P68D6P zFM?SJZDWJvK<>3LhqSRl{Qw42h}%odiC;ShGY3SI>IRULNNrC;%awT8z7SY=BAa7l zC)9e!4wB}Sq3v=Q4YCuYhurE1q<^GfP&iSwT@D{vA}s{L?m&uoNDCd(C!<4ig*3;G zswO)Gj@VMCtu^f1=tE>L54ep^hrK)w3Dik9urX9zZFHDCasmgHO&~rq0|NuBj)Bo2 z@f2u11XBkRBZP6au|W9)T`#DO4s%zI4Wx|@+RGzi3#tD=_QKo)qd{hX#9>7$Xx%eR z3`7%yak&wu7h5~9!5-o!m>L)ja?1{=9I5R<4+rAgfnT6@fb0d?2?`HT`x``q?xY3L zptYPJ8q|IV(V)9&K{QAnqz{BadO>6T7rcd9L2al7!4Q9e#BVqt#*GQJEn6HQ`e0^) z>;c6khz6ZG1)@8l=?XN*4B~_OV;~wN57Gz1AbS(sgjzvk{-E)G8Bd70AaRg9Xe=3o z35_R<I70M+^nmn&?AZmi{{WQU0Ht?8X=HhjJ`e`!1<}M{a?;TWBzGd)0k+o(;s;XG zk&P4i>8Qeq{5S`>9~3trOlthx5D;$t0xe%a=D_+Qpm+n#{W&-bwXSf6^hH2vV~@E| zYlw$XD+e?mfWr%<5sE44i@@vz(V)APKs2Z?0-`~E5D*R8_W`00LhS=lAUA--K<+)_ z4C#x2`bz<h5Vte95Z@PpnFFFpbpyyPr1l{|dWgZ~r13Q%e`7Hm6kboDa-^p57+2!c zxPmJrAAy_zvQtHti2-z8AczLt3k;$`Ysx@0XpR&_gYMD-(I9z{J`e`!t#Bhgf6TyQ zFK7${WG?7jKoAXD!vUh37#J8pG-!|nM1$l(c7ia-UJy+T#uY!f&NTv!IpH!FX73eO zp;j)aB9IuUt^lpE1C`Gw{2*Zq5(g;(sRiK_8_0MMs4W2!N5@-0Wjs_6q!;Apz0fc? z0;NG`7lOn=<uix|mCqm=BoEa}^YOS0cZmOB_Q7b7n-@UkNKLzU+{sV75+3BIKakr& zaRb7n#!rHfaI1h0A}nC#Gblc67#J8HcnGz6c!JAk22k1n*~Q=|)M^6F-=OdUi$MuW z%4e9JAle0*RzU06Kzz_zH4tqC6+a5K4@8070Fnc_H^mcDK7;Cz4{i{*gVYea&k|-1 zh$htyV0(xlaOGu~R&4E32`@w(!PJ3hklzEKa-^o$6JErp*B+=HFgsOcnHWIp_(3$N z9s|*!Jx?GSw0;*vgZ3_hXplTe9|(io8{tiST4(V__#31bWFBZ8KZpjEtspv`fq?-; zgWAI&8q^*J(I9z{ogfU->!2ajYTzK$3OXYebXFov{DrqrD=6=PFroZ21&e#OK<x*u zHv!qZ7|LG{r8h!pkUYpv5C*vi<Q7ny7*yVV2!i+%Bo2}XwY5MP*4~1Z^B_57tl|UF z2NDD61=)WQYTtDzeH==khtkOMAblVV(hH)A!Q`ah8%XX%wgY6ZfG@-kq^4gVU-Hv$ zhcEeQ@Q5$@=>_C>P`rXLsc}0+M7VVYXxtlQ2m=EHtgHsbIjDT>@e^wO;s+_KLFo#l zOe09Bbpcvm3nUK0l$6ylJ3+J+G+lw((jY#l%m&e*wZ|a(2FNlf2E{i>4CGz`e@Iyk zs!tMpAZ`aMBXaEw%p4F+svAJ#3Z(@_7;9(1_7fmTP5+=XF>m-o(m1-&pzsg~fXI=W z{yPGQPyaqpJ3#h>>{OFwVgT*S0@0v;4TuJ<c>>X(bxj}|v}YAWgXBT_Kp3PKM1%J2 zgD|0cW{+U87qmYMWG-kgDu@Qv4<H)UHV4tj@*ulF7-lbsO$d_{KNW$HI6yZWWbX#3 z9I5g1CXoF20l5Pdz939$82=F!ZuLP*Z?JL#6t<wVnYRQ9waNrT$_Y@LA7qzLlu&B| zR1e6{ATb!Gq?~}+38F!FPJ?LBS<)aHbe1%T2A%B#qCtHon4KUufW$!VwFrik6QHt; zArRtrusR~k379z`np8KCa+dUgV95E)>d>?KU^K|BApd}9Vlb}sOXw`=l3>W#Dk#1t zAdUBVNMTP8F!xnNL()DdI6-5EAUE3NLi_?^Z-L5#*f2dX8YBk8I$=VspmYRkTY)f4 z9M@UW24tQkT@ea#FU)*WY2^KUg!F>q?S`0eEAm;qCqf|h!@}SL)IGT34U~t`?csq6 zfXoMBC>KtF#9-zVOT#pS^n%zvVGwtM+zT@UBo2}%)=wby$QU%1j~xCWvykQSv2leD zOb>d$2UKqgghTuQQv;(x_MV7<$Pqes)*%w24x|^P4@47#ak&@P7Dqoz`Ucdk*z5p_ zMWhI|g8Cq!_WqnSh?_v-#JB~d2A6waW}wdr!OoZtfQA#u3>b##!I!RKYH`uXXG}{- zg3cpmU?3)4gUs^?7itAz(79%yu{oG~Kyt{K1ugDi>6lm=W)`yf=z2kFkmW&qd>B_e z!1Q2C$2XAt0aFK}LG}tnLDB*_=@=A-APfpen0X)?9ixZi3Tgax0t2+n2h|BMv#z8H zwa$Q+DKIexJm(nSh!Sdr)dLB5{0}k<6b>L7gptb^5Fdm=^62qKh!4^S!XUjMnj8$$ zOUNE{d6+#Qy=0wZ4DOg<zvnc#q$o2lT|rYJS|L6-vno{~7WWCoFk|8&nslH#;8&W0 z+y`?z`Wzv&e+2dlNF9iQJooS+NvL%~G9=w<K-)Vo8l)DaXLS7%C?xP>P&iR*{Sr97 z@mq%>3$`B`*`xQFVg%2y5U5C^&f1gVyk-fUcj&NC51ik~Ef}Hu3czlq!@dHID(a*g z(0UM1MnZ3&!p<Lt$%E9uFescrY|uO-tX_f9AaMz3-2+nx5+j6hwc9}X16?nup96E3 zLL#JJ4cb?5A`w#Of$W932S$U;0EvTWVlXcE!1SWGBSCYz3Mml#VQOGB$ld~|9I4|} z7MVh=puNGMe#w_?i1{G%KxTvN1Ytt$%QaBDL3%)XVPQfn4blg~AiW@(7)(z1C8R?9 zhi*Q|-WgCiQo|2q7ATBBnAC7GQ59~@f$qfynFAZEgN0i{no#SBH1Jp*2PlqeVuV_C zvV~e#;7I?Vu^*5*q+*c&VRjNr!|XuT`y>rARtM@Uyhwq#T_K(L^)bZS4O55g1`wOn zHY&X716}tG@(aiuVlb)c4>X?f02CHj3<ue3kO4`Xq^7?k1wySWG9df<b;=-SfXq9P zLHzi04%BXt(?EJPWtkX2YiB?-XkRjj2JM9g(V%$&5Dn@xfM}3BNFNA;^h#t1wSvkN z&^#+>91$iSkSWv(8VdtqLSx#0u($`bW(Q;+=!{Dc9nZkP0HQ(j1t1z(9%Ls7gWLlO z8_?Jb$h}K)5a9!o2hGEQFl;UkRNsKa(Q!{EL?1{TWG2YIcBuWJJ3v8v(7ZH=23-gZ zqLJl6`al?@7eo_-$w^-hSqOI`+X1q-0xCyp`r493emeS)MSh%v+z*Ny5GFN#o~Q}8 zh9KoNSh)&{7tox-j%=Y;g&c6X$^c3mAiG#fgjzG8dO+a?5`$q%%2k-1AR2U+C5Q&i zfq-bx90-U8&4GYu(0QmZJ3(#$iGkc}lLIMNL1q7mOo-dT>YxKOAhlpVlt3Qi2Fbz9 z0nwzofs{FrBRP<H11;#70E`AX3*-(EO$^4B_6f~_ROCR~YM}U<f|S=E=weR~F!vdh zLh=nLI6>tF$c+<LK>Pw?=RoB_Y?vMx4HAQ4gM6V@P&xvYdms!G$2A9HO6D9$O&-L( zF!M>Jk<$kuy`XqIppH5RawZpIKP(KsK;45Y-autOx;?~<6~oLYmWJ5@ax;h>kPmSu z$h|N#K;j^IV*LbCkBmWm1LW`rnT0HmkBuvQV0zHo{Gc|2NCCtTFf}k5Wbc_mh#aA@ z<2^+Xbs)VUeIS|`jLW^a=0NU1-HOc)kl2Mfp;l1)0MyqAXoR>4Bu<Q5Kx%Ng2WAF( z9}_kQ5&{h;kQp!x(}O$*0!k+!dE~SL;^V@|b08Ty#Lt1a6bZHZ6hJVj&wy_Zgaa+^ zU~VIphPfT)Ur>Dt!mv6Ol%8Q~km&|0+Y2%q-OV5|n7cr1LKs*4!}MXxKOx1CbOuuc zqe1reK;=lyKPQSIaR-V+Q2c?+1eph-(J^}bf#gBq55lCzfrCE&dTd7t#IK-w3}g=o zcQgpK&ViPLAU+u5nYWoxBGd}2yY3*R0kA$O0rM-21_>jVi6A}*gXGcUoDd(R4}?K_ zK{PoSq?eFA=<+aoKzhlaw*g-XiRJ!D$RrH%%#Dr$3D-@62mQciqfX~wxoQ&Rewg3T z`#iAzF8Y2t<bLyw8ll#TT1Yz5hPLBiG$@Qf=94>w3DQ4OFesd;I=2HIqaZc>!0v!W zeDUZ#lca{<P*I;yL!I&ZVL#6^ME0gbi+q~T^sMNmPPzf@3kKyC^fowbo(ComQUk-F zvI)cnjl03>7#Ix_XMom2Fm+%t0tBu$A}D{LYX!A^VeaCnhKwD6_NH&BhSYx`dtvT@ z(I7KG;vkwBjLSVRz36RL&^!W19mIZ^8W;_-Hv%e0>Nwt+HlbEf{|nUj^67+_4>IpX z9b$ZsP+N8i)NYV_Kzd<eLM#o^2f`q|4s}AUps{O^d%m<F+yjyawT(fTQ2SV=9-<GV z2V^F(?trNS=>uVqUJy+TCMP~`Ah{FS4v@V94G=$&8lOI(c73}<3n;yi8gC#sfWjAq zNeyEgYvEQG=sW|+9N5?@EKEfjg<5MG!DFi&p!kg_6Kd6I5o(=)BQJx->Okg@ia}uq zvy)gFW(Ts~8I6#!RZu@Ep&sJ)E1<CnXeSD!7N!qGBafYd<cPH!rVeBV2!r&3Xj0qW z@wrLKIjNwV0wL!Mfy^KVlbUWpV|EjoAZZibe308uK;=kHw;;1X=bC{qp>yk4ni2Mc z?9_+e%?P4FcdvnHQ27C(L3cBPXwW`H5Dk(C*#*KNy&#$xOinoMKyoLt9Uyx@K;`He zPBAvZtsKz!0l5d3M?v8Nx+`l(i%_dVD>#obfa(O0nwAcsRtcyckh?)*Fic4vh1m(B zL3a#-XwY6U5DmK93q*tN_5#tMy+<%RL2dwvf!u4;3dy6Oa>St-;&!k)BJ(KB91u;a z8=(0O-unW%3v4$L1UYGmr45nhk*xsP8v>OhH7#+>6KXxM7&1p}vk788$h;?Qh<%WR z^5O)j-5@uC^cq0#KLpXBIbjeDy8jSFgYqDV2Hk%MqCxT?eIN|d>oG~F6;%I&^6rT# z2={>GL3I)c6RMXK+9CQtdO&7^>;dfs2GO|;3=AL|w6_dIgYNVJ(a7>3eIN|d3!;g^ z<izI{BzGd)0kW5;1L6l#<I|&q{CESo0TjL<OllY(u@!EuXoa{LWDcxc0fj9np9*ve zwN`XO$`w%jg48ff5o+y$>H+x~ECwYgDOX^2f@siveIOcCu7GGzxdNg=<qC*~)RquS zL2dwvf!sT#6H=~#%D$L(h}*%ch%8rN=74BY-2f_Ak_##^_MjrS2O=g2wf>j@32zfw zCI-;FF^mSe6XciCu{cmj;K!hFqS9DgGIE^Zw-q4^wjUnhkkcVSVsuz?ig3gzi>4v) zpr1P9D8qRC4U%{0kmx~qi~Rhq0J>@c;#QiEzA-SQ%%o1bfvs1@HU0*ZN6rMGa02l` z<8QEf1xAC!8=!R$OdUv!5XRL;0_6{My`b?on7caqAmeYKb=C&`kU9@!FU&nK8e|4Y z99o=$xHLU4$|sJgWyVB^d%%_<5g>P5fXb2DhD(@)7<UV~$_F|k45vSMCL!zx*$D~@ zP+Jy6XE87^fN0P<Ob`t^0}Vuj+PokdBoA{kNbih!Lam^&Kv3H|WFf>{kT^&Us80^U zJRczL0mTnU939WW;vUdFl_2{->mflj=pHH%4LTbQM0Y^l36h7I2eTK($4BEzS1>*3 z<EWr`3z!V?A50C52HD#Il_NFYj!Y&$-az()!WV=|4dW1d;Z^}?S_7E_YkPyj7IgPw z&lI87FH^v6Zw^rWKIs%{?O7nyssPmk@-s*u3{%qfhS>?C?V<4sYny`F!60!%s5ttX zMvxrHy#iAqZEsNj;Kn3~+kK`Izg8S(4u~ez4WKX}wVe$uZ}6V$E;2``b;}$`nlpvA z*I_isPEZ_-w%0)+fggjyiTwH-Vm8PO^f-ga5Kn^4Kr{wM=gx@_xuK<U&TQ(m!G?X? zeQ3;`L)z|iIM+SlwMZ+dj373(<7&ge=Ad!4-C^>`_Q31~wcTNL42%Y;vw_w_Fm)g? zLKv6(K=}h*FQ{z@bC=63NZTDWcm8G;r2Yfh3v&;Q2AKg8hn36d>(D^*gfK2Q!t`Nl z2S&_=xCy2PMuXfk0V+poJ5XUB@$JAfP&+{Og6sr^2dG^RqCsQTAR2VvJ%|Ri>p?W= zJ|++ik_YJnVUS*ztwOCfZ9=V}_It$+h`&JM8|ER#gbB4RW9C8h!OR5N)5E~P0HXV$ zH0b^(5Fd2DJBS9IT@0c@@*sU646-+1iBKzOJRjs9kL3_^LE<2J&=@la!^W9GX%!@n zj^AK$52zmqvJZ5BD~JZ2FAt(Y=WBv!WO<l*FneKqd^9=fXu*7l|Ip0^*?R*jM`}6} zSwMa|3RpmXoP+!TiW?9nHGU>I3b&qtmM<W4V0{r#yjU|ZFi0#EYHe5u>5G8U#+0c- ztqseBS|335fWix;4~8k}i@@vz(V#O7K{Ti@0-`~E5D;w)P1B&Wr(t%2+yIgTxp&S& zNM8ihU(%Qlar+HW-<ZgG0GK%-np8J{+=JW~A*K%j(nAa;HI0Mzo3t##oyPY-<w#BA zCX0zr<3FHwfcyuFBQseh22i^SM1%Hxf@sjZB8Uc^F$|(XXAy&FkUU5q2!r(ASWNu> z!-B;Ke}nXb%md9EfoRa#!XO${HiKwTy#=C?<w16WFi3BFfOCF9W-4fFDo6-Ct^+Ew zL1iUqUo2>E8At-8He-oUYs?@177$(obpx()Qe+9H8$snZ$Sso@7#Kh_XuJhPgT`Ax zG-zA~M1$l(c7ia-UeJ6nXe<b{M*Ig_xeXeh0AW}?0^9Ec(u<6jU~v!Vo^6nQ+o0|N zjqic@p!1MHH0V5J5Dk)tnFVqWj7^9pCrw8zMT8r&`5=2IK;=kH(`S~FpQbsMk)JMI zmXV)cKz;|sD+rSsw{M(<TQ5M@4T8*pmHD8!RApdb;8`xzTCyBm<}-lO6-dpO^+K&Y z(EJPvYmgWWQ&Q%`>;%!E^&B8t6q??op)_a?7$m+OW+C)mL68{8y%Uy0%6xFWv;^XI zuu>w+e3&^Pnp8KCvZq!8x)0SHx)%dRgWQT9rXVp~7+1a_w5RsWa!A`A6kjip%83^~ z*wX{deF_^Pc@7kupt1(!t^+#}dun5#@*r`T9vBT0gW;A{Lam^51S&H@7$%NuPpuu9 zdulJNgt!-GKB+YFx<EpDLGgCN1$9rY0@Qw37<jCLxCd9ff!61t+e6HrTA2C7(l9$f zZU(WJK-~p$FU$;(I7psYKY`REV^CibIs8FpA<N@q;|d>`9`ybosEw1c8WOfJH82`v zFUMMl9HBjd1?wQ{Kzc#?Kr}HJmwRD#Ec&^k5^Es#V6y|87%n&9vKM9s`q%?(@9YGq z{mACR^dRq@1*Hd&8sszq;^V@|duKJgiQhZhuvVyb!D<Mevq-un0a~tOv&RJ*mmoQi zn_+GvmImnqVUXS*YccCxP`U-lqvJhPv=?MHsJ;f_E&HUw^MttChbCxgl30Jj)Pd{* zVUT}8Gzi1wU^GY!Ssuj4hjFDlm>z8TlVd$3&BN5dXpp@QP&rcbXU%#@ngOL9P`Uw` z2{I2vqhs`RvtvE^aSt*Z6n7v@YW#Wl;jd#?Y=DFlsE!5M1Hv1&3$=cLmeC+S7~|RR z+ps~X6;`iKKuSMgeNX}xPB0oIj9gxW_#h0Dhouu@X^=h;2I&RS<Y16qV(o*egV_Vp zOU`~@$RIQJb6Q<ei%U@V`ex>pC}=6b`h_|Q$@zK3B?_n;g|!sogY!#^l2dUW>I%0r z9%KXbNLL*sW8nr^D}c@;0{Ic-KbW7f_4Pn%2w`&a@EPbjV|24Y?vdFHNw=i-xqciI zYMruKsMU^vfnml`h#4UB)@&xeFBSo{8{{sKUJF?!2GG6WAR08z0HQ(n0fK1I-4`Gl zw6+37gXBT_Kp3Q#WwTJL$`*)w)*L~&$7Tzne;0C>33MbB1FpK_1s3;YGcYiK>;sKE zfN0P_0*D5U34>^4d5~K`7~~#M*lgJXS?BG5<eoEIFv~Aobx6e)h(BOvg6sp0F@R{$ z7y^g}jWK{|&=>=V28}U*XplTe9|(io0}30^cr|Fu1Jw41iN|ck9JhqEe?V%GF~?R+ z_khM2K=y&g5I{6&i~&T0#uz{}Xp8|wgXCdmf!qTM8_-&KP(IMu2{9KW4pIXe2L)l+ zSSTw<5DT7x#XV=B@pTDGAA-`Spfs{P%t)BMFg`w-oc!mr4dOp^b3yjDK;=lye+Raa zpU?hmqaaUgCqMm`Y$rdhfx-@yCP0|fbnzrsxU~Vao&{tG(tS;!bO}DwYll$lk{yuo z5>T21DZ6n{s5JyyZi3<oBnHEv{x^(G3Jo#`W+#XSo&N=*L1W|~8gvF3hz6ZO2BI$` z8IG*?zz)cG38;N>Wh=z(V5QK;2S_cL4<(TM!yq}3*&u&|Xj0uk%6N$fbd13gI$i>! zLCylX14I*papgHe<0XG~AjV51kjj{bbnNK?=029gko*b?PEa`oa^sx4BCW7`!vQJ} z5{K!5(I7Dx-m+V$6_k!Z<t+%q#Bq(6IFUJC!mu0SUYPl$(#Yw9kX}%{9f(66FA3NM zu^$!&6;Su!iZ^n{OJL>`OT+vEax;j11?n!4dtqjP#6j}J`U#{S8H3XV)Lf7_$Se>| z48|2cFumCNV>9+Z!WyOqMuY6N*awj#)E|>L08t0h3(^OoiNUzs3u`Z+kC%Ath1i45 z4s2q$+<?nom>IanOAbKoM>ZFx2YI{%lpa88kkbT+j|(G@msF$@KVGt7pHS<CJrE4) z_u?BbDS^f%$PFMj!`wzJ4blg~AiWy<G3#t_x&<jf!*8f)?}Gh^`kqjKJ7qs4t$>^Z zax=01gsB7R17VO}5DjW4fH17B0867FIb?i?%JzcHhPeqwgT!F&0<j5UT<IOA4_mpg z0Vz+z)PZP_y)U40q?QXR2O(({lx9Kc6=oiYM#t#sHQ^xnX>QIz^3x5-U7&aeVN&D% zK?eSILC+yb8U?irK=y#J!YQFv1@tl*&lpe2A)!`STfhPuFCcS}F(}SJd>9R4W2@sq z@~|{UEDbgb&p0hi9v@Aqz2uMafX`h+9jeh#P*VVp!B8;DL&^bgkbxhtL%`PJ9{Ry@ zA{^wL2v}U9_kF=@@p2)zFM`5YIVCkMGcQ#EDy|WqT##(210szyL4w73$+-m@5MfOn zFm0r%W2gy>JCGR#<-)BI(D4VDIEc1_u8HS?j@^L7Kw}ml8aAE-QUltz3!*{yx@JJl zfwdPw=7ZFegF$-ZodW{meVv?x<30U+JpEjQ<6T_cJpEij_kDxR1gU|C0WP%)AeE4C z&8QG=^+56uM23OE4(it*NOGX@B9MGSfCy+zh!La)v>OyegZe}{P_@+ZD=Gb^hGUSq zS$k-|DIH3K+zSd55KRomRgVzrH<=tm^qT^XLCQRky#mLDT0!9kO1B9};w-0yT0!H1 z+zbp1pz;vpHjsJ{O$^56PMBWw`VMr?&Vu6*cfr)aXpp@hpmK!jJD4624bqo!0@F;8 zc*6<ASPP-^eRPn_0O@s*WnuuGr2(QrW0)WsRDXbI(Ap^w4LTnMM1$l(ZUJGCUJ!i) z>K70jgkj>KHYf-;qzQxPp>Vb5_F!=jXuT`QKG2#e5Dhw;0YqmoFff2<WO<OCAPln? z#3qEviO+(Qm|+jH2W0OGs2r*B`Q#+|@dmOR6uux#Y8aoX6mH!i#S1D|K*qrD2M2{M zXdUF5Q$npTP6@Sw(g7$>ffPMBC)BEe7S{{{Am1}E;A*>q^nvgXq&NogVHl(vW+#X? zhsG}`en5OsIR~OaYj8j`=pJZfy)ZV229<-LaSIR|WbTpkLaiXTgYrDc?J#i=O$-LP z0iQZ-d49@i+-c+qRF2d%5_1OAOpyOd&Jdq=6p+jS>2;N5VgQ}90-{0l6(HJ)fq?-; zgYr6v4uJAO^006K>3wrXsPzogFUaC7XN6ipX%U18rN<3e+yh!C39=W|x&YCj^_d_V zl-EHtvOKcAAU1j!f!qla2eq+57}n0lHILzN77@lEy&(HQ^A;c)G@k*YYoOr)D$GE9 zWO<NXAPmwAqKU!eq^~bX?nJf&WUtOSh#yEzUm54fPe)76kss$E_k-dFgh`Dbk6Pi@ zJ93!i7bspp<yX#mq1F}WA>|jS?g!cR;*wCS3|hJ+w*0EW6YelOK{RNuDu@QfEr<q{ zUmzM(et~Fw`<c<puQQj0T0w3Hm0uvYgZu!BXAn&c2Dt&BI&9@v$OT9mLe~efcL`LE z)bwR=5z|bNc^(&uPj?TXc7xmn((5J5!~iOvKy(-b0|SV5gwnoH8q}r%iG$=p`al?@ zH{LlTu_!ndwB;Nm1YU0qV)P){0pf$yf@siM3=o!q`U6)xrUfbw(gV^9vbz-O7Esv% z;)BN1Ky(pQ9OMWPA0!Xb2f`q|AetCVP8?fY!i*1)T_Af4pmL<f@tRBI$0f*aQ22r{ zsbT!5LAdqIK0%Cj3@A)N<v_`0q1FwTA>{z5Jpi(6#dV?9JLl2DfXH^t0i-wvnFYh3 zu!GqNqCsbyfoM?tfM`%T0HQ(V0EmXIw*ct}=>^d+j9w1(+z@I7xgAsvfZPsJhpq=C zh6{t-fJ+V}j;$Psxq=oxAcfE|nKe*3QqzdaRZKHM{;;`9eA;;dwHxFdkY0aTCWase z1_lrf+TQ`9L3?UIG${XrXiz%`M1$l(`al?@cgt0w)+tEl!Nkv8MU3qcN{<ytegc^Z zvIn#m4n)^M-IWBTL3te{UIyiZ<Uw|VFi0<mMh_#HIH-;UVM6sJ$2CM4gY<&zn*z0O z7L*39zW|9(g7T5&L2dwHkX{f?3??Ui?Ll%UvK=6Mzd+?kO<xAr$xlZ)*U67_ko!S# z1Hz=n&z@%C)-Q)J%P&y;fXXkE8$zuGHz4H~s67C(YtC(<)+d({@eC3pwjJXF4O_4t zBmxxfFgrmsXe<pxgW?uMgUT-u4JyAtG-!V%Ogl&~j18jE%ddtzLaiXTgUT<E+d*p3 z^?<~1VUQbe$$`YNm0vP9(ZUC$5L$laK;=kHUr(U=phkfykU#$1BtG4(Kr#cQHw4;_ z0nwm#3Wx@^V?Z>h9Rs34<rs(t$%8G0`UAucK{5}-2bl??L47a~Ce#nJxP=HOkY12I zp!H%P8r0VY(Qyn63?Le`o(x1I%Y*C!VUS)BO$;U{KHng@6WI=sy(+gMejqhI6K<0q zZy+~-!WV=|4dWSY!mTfkW9E5K*n;xB#vP&7lsk|-532h?cEvmpYF%;z;!hACjEQWs zl;8<Fn4KUR)Mf$Ep!fmNpga$vL3tiTgZkxQdy&!~jE|n@9Ucm`g4_<u^B}i_)Pdp( zL=%HSZosDwTb>uVixxgm13>mBK;=kHBR8P>phkfyka-{O5}$VFAejNu8wqW*fM`&g z1Vn?{EFc<`*FiL>%>tr9@?cA$VV-eMsMQ0>Jdhm7%!Yf!_rrDWA;Jly7i16U+yD>_ zx-S((gZe2T8kE;TG_pL%P7ns^1<~kX1QQ3<hagO-PTYgVJ)rwgLH2_B%OD!mUIx*i zhCYZ!mIt{3gkkoA*n}`S>8s#ABHWP82idy<Do1MidUBuqbfoZr{5S`>9~3trOltf@ zbPBf$oWU%=K=A@9zg|2LYE^j%DZfB<Kgh0xCqk_=?x2Mqk>%G9r1SwY3x+}A4zm+P zgW4=08Wgu68dQFPXi)hDqS4P5gP8-O(aSHFr$VhDw}Z+rklR6OK=y%XVlc=J_|#!5 zzb-sP3m>QfAbS-aLF7nHUn`*cphkfyka-6l5ufg2kjwz-jgw_!0FBLpXwbQVAR06l z1EN7|-a#~|%>bf7@?cA$<yX9KVo5S+5(ml$$#Ec=58{LD0MVfF01%!5mB%&i@&_sp z(gV^9vKKT)3!*{ik$`AWTLwfoGB7ZJ=w>Jlk_YJnVUS)BO$;U{em6XZ#38!*AbVdx z<w%WRl_%uKBgh?~@C9K~!#Ji#xb=b(!auP6-Jq}qwO`*n5o*<V3Mm6XZ2^#73NM9P zBhb@0k!64dG<-njAY)M2!R!Rl?$CGzO}T^kptC$cv?){^)c1wy2kC{eK{R?9AoEJ7 z736kM831xSNDaCkkQgpZP8zxL6cMJ#=7Q{1c?OXqHI2-H>O(hg%QNEBP6Cn{Ah#sT zGBG4FFff2<&^Z?%8Z-_AqCt5dM1$H8AQ~hOvm2yW=ebZT50ZHxIgq%^b3`AUP<s4; zq#vXgWDjUQ21Iv5-34mPfcT)i4x&MA2M`UC2iXb2AiW?OJ&a)Dp!yMn3DuDe&mnOG zG7F>^WY0pVJ3!}Lf%wy*e9$>qAU?7@NFNA;^nz$&FgfYV<ORZ=$aaA2&4J31n!Z-N zAU_>Fc|m@hgWL~_8xSTneq{QETUpc*VF4?@K=A@9zt+4IYJKq%QhtHj0wBA3-UzkE zpyy8_%db61=>udI41>ZQW+#XS?Ii=zpz;eugUT-u4JyAt^a_|pr1}#kgkFBZ*5shC zh4FYL)C%$wXs(^*6(kHm?ugGU&P_^A%*iVSwe}(Fl>}Z3wSvk)(0N@UZxL!?b`qjV zO`|HMOf5H{ZbCO3<VKCx5I2yz7s=qgP%FsaAb)K52r&a>9>@+*A0C7wQXuP8VB#P- zWSj!E8zcr&lPk-_0Gcxg(V+EUAQ}`;AR4r80z@OrgY<zgNH2&c29pzh5^o^>LpL8} zZva$|)bInD1qve&CN-QUOcHK2L5fpYUIT@X3h4Z=w?eHAZy|e|Kyd`J>%|A5)&!^? zkh?)*FigqbCYYTdT91K&0YroD0RhocP`(V5c7<68&1)bvAotFB3)$NQDi0RChPWN9 z6cp)DwO~G!0Od<46Fk=lGY3SI>IS4dN|!r^K>0D_9q#nB11d*ydipNZ3d)n9{Mhgl zVm>IIJ>Dbww1m>x7pUE!um$POlVxH6<wFqd#=yV;qCsUGhz8|D5REJk(g(sIy$jw6 zwSvkzkb6|VBHRO#2h}ei469>s^+Q_TL-c|4fXoEh2kH-jXwV!Ghz7NhKs4wKG7ya{ z57Gz1AiW@(7)(z2VDSOrPGmbk_7*_pNR7`mp!}M^)Iv=8fF5rkH-N$ygh>tKACrY! zZ$RrMkU6lj1r)ZRyjt>6sP)cANZA64Uyz!ZFG8&!pn5=l28qEiC1nfDP7rMXO@E-W z1;huHEg%|Hwt#5Rx%)6XL2dwvf!zD!BcyBrm464`L);ElM`YOoGY3SI>IPWZQjh^^ z*+c4ou-!xu<fOv`pKzzcA5b|`(;>*Ipfm`=gvt+-&j|ZLagYzK&p|Y(oB+|F`W!@q zf*(YK$`KF^k_XuZ!XUjMnixz@IK4n}C$b$NdlkMw{6Noel9(#oY66WPkb7Wx4iqk+ zH2mU=P;0<fNS*_g@gOxjeh9UCK=pv!4HAQ4O7a}cP7n>MOF=X!&w*%Ao&(XKJO`rD z>vND8$h|pVA$bl|E);x*xE<^^P^1%4pTo=n(WJToDbLZZKDYP=Ni$$SA`zf?>43_S znw~EF6KZAn4moFd1|xXC0=TUs@tyek{0P);kdr`eDS+1JAR1JkgJ@8F4x&N%5JZFW zA&3UagY<zgSnoHXR#2S|s?Wdtf%q3B4w47eGayW;t_k@L(Ff84(hIT&R9}N=P<;-f zLG?L^2G!>v8d)Bs4}?K_K{PR#obrL=2g04mc7W`4fXa~?pEW<ok2jDTK;a9*q=s?B zG~w12(DoO|99Y=`3R_TKb@?gOy5=XOYyrhDNR7@Pq1FRXJs>}W#9)|`vIS-*hz8ZA zAR1J*fM`(J0-`}>3y4Oq&p~1!_n!C(DO*70--PcFw}ahAWZ42U2Sk(V21wbGl9`?f zT6skK`h3DK-0AQHRF2ei2ns7uT@J#8>T{Og2>U_lpb%Q0gJ@7W0ir?mIfw=YKZpjE zBOn?i53&n{L3%+nF_@hEx&z6b$aaA2{Q#AtXE-gGF5JojjUSMEV0jJ{E}%5L<Bw3Q z!e2<91C{Y0H5V8}S|y-*K<);K!7wFx4rV8a2Gyk?8kFZiG$_x3Xi%O5(dhL#NDSm& zo4=4e2PzjFenZ?2b{i<tiKx$E=74BY-GG$m=vJR|fa+eb2T=)7yhK3dNKH>K*hE@E zbvmg2%-}@S=P&*dUoT97+6{6Q$Sp<C`W!@q>T3`Us?R|*C?A4oP(B3FAbF5J5C-XW z_$Sm_@D0+w;9*6$2P6-wXF!-xU8C|JwR`~C1FEk<G^joY(V+SqM1$&c5REJkvI~Sk z?g7!nU~<X_1qO)!h%q0x8i7^`2I1Bl|3POzfXrhAx5q3#3$%tXfW#OWq>%P(D)Avq z0_ESHFM_QK43O}G?Wx+qAlwSl|L2cjD+t5%qwlGKi4#l1YzBp^45M&s!)F2bJ|dVI z)UpFMc5~vhKr1NCfH1Y~0J$~6oEJ0&4f7fb4YLnLkb!{#bS5=S>;xkuj$nLh(+zmc zzr!rl3O?`Ydb&3Q3&b5UP#WY8P<lAf4)GrkGejOFuENK_pwh;`AdQr+K;keg1Z9}4 z697%cfq5a!!mR<i!mU09LSU=~)e8zkumUIn6DO92Y6GYFBa@`Saj}D0xHW+Z;$Dzj zRf%xx3aEORc{6l{;pqnE7HYW_lr~e?gureE*#`?-kXzM=a4RS*LHa=00_tv1yj8qG zgts~#bGV_KIN$I=@;%6$o}WD}AuPhJ7T43gL1u!?1JNM43|8S*aQZ+>8@S@0A8Pgz zB()mcLai{ncvc&?<Om40vNJF+9BT2M2R565f#C?q4v=LG3=E)j=kgp9mkLPYs(cI# z8f^>=GO|nz-cYs36fE5#hmQuEEIgcVK-~l~M-yreXx}li86Y;y9ON{y0jd||PEgo@ z)Pb-T)Ev;g;UGRThJ~|>Fe02m@_Sf?TS0yYnF%rvM1#a7*o9j`;Q_)RJ_v*Sip^|T zIP<VU(m6<Njet-q%&s*)&s!#lK=Sv~r7OHaW`op}up`tXhjRy#Icj_i4BBlB46?FJ z44^%tAbrRfTlm1j`2w48s{_<5kU2U~b3k+S$Yy}pFmsUO3proF+ypX57itdj+Afe8 zAPh4HxxA5px&h>0P#A;Mfv_Ib9Bg3<i?09))cDF_7j6ZIA)9b3$UK<Y4IIL)pl}6Y zkl7#%3NvhG!{TcXQur?s5o(3m^<&oemN}9_t)MtLbX!UVWH!jWI~=I-)$<gRFD#J6 z)%h40^xGI1<Ybu`kk^ib^n)<A@c9EZ2PFRi>L!pm22gWAXN-d6kTJ|0<oG%P)eCYb zC~RQr4WZ_M`m!)F7!3>O3K`UJzQQ5g3i3P1OptjX8l=a7OSlyj9v}?jgD}Xi*vy87 zvkE67+%`xGwZiOLBXFqYh^$a67Xt%B(T@%{kl7&fdbkkkL2&>J=LJaSXz(#G7_~7l z$jdS@An%n1=?7tK;R6fj7o5Va5m2*0<`_fGsRC(4!!UD@(=&3ufVl}|jtSHp(B2+2 zV;ErOAeUnXP&a`53kqYH9#g0}*uoSRUoDEL@zug5+zJjuPT^LNc`&n=^a!_t!WD#J z=7Yivo7u4Vx`Gt`H)MrcVRm(}Om6|LKLgbluUdWQfy@S(`KAXozF_r51vf%mlaGPH ztc`&|L6(UDGBN_viNM&x=fj!O77i6i{lul13|i)j(164WK(dDe$_CkI4z&-o1_((x zm<h8FIbI(i`5UYVN?1V60j(2<3c)FE76xz+cZVu!e2DM}w}Qe5WF{zlKr~2GO22R` zEZjhR5C(+_HnU;zk-~!r#|KJ6tuVV5{K;tnt)~IC8+*4O@CKO;GH*>kLOm$|z~bWp zk~vy@3=EcS3=E30ObnpCaUgxj7+d(j!dZh?xOE29ERZ=?P;+J?8vtd)%t21~$oU86 zCXhMSP;<6I^&(R+bCAos0;n61)q&VHP;;<_DJ;H@Xrac}5nka|P#A*D1ce`n2ARdc zFWd?XS1_Le5@y)UhQ*f%A0qrE)P-7Mc73>5+9IF>X$Lf(3ieG9f~eaAr9tL{;tNCv z7(>#%`%K??AUA--V)!BIL2QsZSiJ5)vQL|jfx)(ofk8=@iGkR9<HjaLyQ~0e7RVes zs5x^$7NTKTd?3fG2UIV}oo9FvZncM+16mV>W()(YJku~kjgJt1;Z~5}L1u!?1JNM8 zHw1)R!Qp`v79hW3GaD8kOOVti7z?$+>{_rpr)7mXWZWugY1n}&A`mx!fYKoQK;e8~ zH*d=qJ4n1$oeK5^y8(1}wje}3OdTvfJV0&)2{JG+=<qQxIJ7Y^D9bW2An!MaN@J}T zVDT{lWDW>J&2fa916s=n(+{Iz@qwH_kn<VLO(6F;LCx6((~LyJ%t0;}Z$QJ(L{PXD z6c;e%&QNoZ&nJS(!Qyp`6KcHb2nx4?!;oLN6=WXFY*1bRg)0cd%utqPV!&oLEM9An z!{1)06=oMK9xfos>+&%$xU?}asK_!gAkQ1X?854AXugmT5^n8)ngue)6>1J>?JG<_ zjE0$m91k2@5%~+|CXhL9P;>UeG$YY4bCC0w0yKYt$_r4~!IZm0&9Q+AAknaR2=PFT zhb=<Ft)MapWG2Ww5Dn4>$^)Rd0AUaxgh643&1_gaum~gafr*PyE6grfJVYSL>+vx# zc(gGvsLC=ifX4ek<|AWl{)Xj;1;WCu0#LI+=6FKQ0qs*lHUq?lnS(7Jd_;s>VQvDM z;{`Qm3rHgxhM9w$A3#bL_z1Ux*6@Qc?Cu8iF$tJBu{6kB5C)lpoOeO~28n~*>J4@4 zMUVg*hPm|xG>kyf8=!d?RHlLA86*b6K2US8wF6;khQSXt&Abp1ZUvQ-ATvScfoPCf z3DUx?pmYPmAU+6#;uo9Qury;KibyjHJcU|ec4b`q)Z*h0DQk=7ar=YJ2ALNjhENYG zlVNFV3z9kdd<+b}Z43-*(7k>jeaIMF_*CqK^x;72a-e2`%<+So1G?7%B!`S)<{+mD z7pPujbs)As)Ev;c>L5NchP6dBf>6UbKuow5<adynApe7CkUkSt;Z_hI#D-yzU$L1D z3+Dw$;g;Yp)C#jpL0q`i08}PMGJ(frbizPq3o<eUV=2@$PV%<=KpM{i*$vVg(8j=^ z4jnsuAubFOhGQns1^@;IhKf*BzuiD`4@fa+{24@pFuGch7zo4E><|}jh1mzA#TXbE zxFm$ZI6)kdMnL+A#R3wT=8A*vOOz01;E@n!0NG2dS?KCu?u5~xv<os5gwfR!%Rhj{ zy`Z@qJ_%t45YCVwFC0u{Fv9_K?}~tgFarpK>?PKX$m&4z$V^O_bK#&hx&{gPpdnaz zI)a50vVL4_P+CGhulqy@B&`u^2FP9LX5+h`50(zm^}zVB@p%{@L>uxkFa#py6Ob4( z##NU5!BU<C;W0;q3DOUpAcY$DptSHsPPmovLjcnnw7iGx4iMV{8h#))GWLlQYGsfT zZiSV1$l(j}A51N14$DD9s5K!H5)YuX4wD1XCBFn(L3s@nj_7UyiGkGM!XUF@<shgo z0M$Pr8l)ay84J2I1Ej_SDO_OYfW*-;vfq&9K>N`^d{9_?kVXw-koXE|;Z~R(;5b0C z4<wHZ_h89$pjks931J2h2IWbZUXZ(SxeulWMnAz~E~u;&kq~A8VUWErwWQECvY2HA z$h~3`!VDk`vKM9^C_fPE-YHnj1>H#`AtB5F!XSHL=8{6c!D24Ry;2gw3?K}$7iJ!) zo+H-1E^?UR0ID-&B!n427-TQZTvF&cSj+{@&&x>&Gk`G2UQ*11sRfk*Fu%cQ(D?@n z62c5146+xdmQ)&M9*hR%dyttROsZKh^&-l`t+2U17=43*fnkoUFc|yDW9C7aUVOBN z2Bx_p3=9mLWQD<a37O`C^ugQ-qe1CmgRC$E2>&6|T#!DPc`zE3e%HwgGk|c20wNqh z`3<H9Ul@SoK>A>6VKius&l*`_1~5i47o?t8yhZ^td_m>TDp_F$5N1(CbuTQ<5HcU6 z59Ur74cfQ2LROdogkzA*C1e(|JV+nRJQxjHm$FP&m;r>hAel=_`2f-fGY>|C!eNQ5 zFarqlC?UcD**%2VAbl|NU^FN_ERq#w0O1rQbDyXp;)0O5Abl|NU^Hmo{sLKH1`ytZ zWG*4IkmW)8VCKPSkbCFJ3NwH(D4)aB?^(y&0#gGM!%0gCx2{lzgduVoBDy^yCEV%} zE(FFf{h)p~vVAadVriIOP+JDyS`?UhF!eARc`Zta3dC<PIcn29ILtp0XWfz$0~veH zSm!$r)aL}*JwX-W9#HuXDr-RE$k>>Vfgz-gfk6Y>Cq$M5v0-gp<nf6kP<MdLhqdQG zYD4ju0~?>Xk_u^Og4Ba>hpKQZ$ju-#LFR#IkoXTh;Z~48Kp4aaVO(y6^_y=X`FBOK zP%F$Xm5NI(A?c7YV`<Stwji@X<~gXNh7W9fB18=#Zo<dF5Z1=Ppef755CYPKhOvbY zY<yylns6%*)GUxW;ZSqZ(98gFVdfx@eIbu0!Q2EgCjx2?=xiU5USte22YCz<RHh)S zfw3c@=3pC(fQ@tLWFz7$V~==?g}QJnC=5Yng2E9*gUqwB7H$RcL2MWXg&8)pVe!?0 z6#g0MLai{nI5dP?O_9bq4Duo49C0|tIY50%n4KURq&KRKfdN)7&634F&QX(x@Eb_q z0VMZ;_@FWYM1wH8T96nB!_+Lm(nbN5nOkIq89*4+h5@MuVNjg}a~p_{5C6boE~w1e zCM(PU!XSI`>Bl7(poyqwU~U1m-FL_eGk`G2UR-+diLbz7E+`y!$qF-oFvwn*{(wmW z#Md2KnC=CcyGK@-0fa&J!psHb8<?M9Vz}rCEarmRfcs>H89<mp3sDx}G6S3V1}x@2 zU|?W4AS(>UAbYXtBP7P5jTsK0Hp(GcVFnNe*-OX_Z1M?M%mszR5m{jd5C++cO&>90 zu(*KHpt=ZTCI}OwADbEh9n5e5ji()x6=ne89opo@+ZlaKb3x;2CuD^gKp12%Hun$` z1C3kZ8c&0*eTIb(j3#6zNFG#XA&;k>$%T|@#F_ze7swoBOpWn0(E3l9nPz+p4ADsC zF-#mrW2>`3c^D=STK5WKgUpE`!W`r}6jVPwf!4twGhjFtk2$b$ISoD3Gz3ahHpY-~ zxhZIM1<YI+Z3B%57#~KnlnAwg`~$0>k>d&EKbShu*qKCzQ0tu{NPL3w3``D0gZk2- zJPWFS(A@$O1F6A<L1u%(1tbq@1A*FIAR5HS*Cv3C%RSIVgbU0ZkY03*>^EdN*ti@h zEIRZNX2H}r=nJ>P>;T09D7;{D_-GXa%)AS#BTmT*Gk`ECZ^QJ1+>Oh9Ff}l`28+3% zGWU$EFarpK?1iZ%g}#EtT#$Ru$qF-oFvwn*d7!pCvF_C|#0&>e-F`t<m;r=A_QK31 zg>J!OF37!?WQ7?(7-TQZJW|>?cd(cXa_<#cVFnNe*$Xq56xzfHGaNwfy(TNn0Ky=9 zVdjC#8)Cz^2aCC&y7GpsFarpK?1h<23jG9&xu9{xTe89oAPlmX6!TzeL1h-qZ!j7( zj(A5_m;r=A_QKSXO2f>9(V%h)WF`ocY8FgAkA-k6`usa+9PyU6FarorF~%%2V0!V< z0j`+lg4)tww1pW!_zjung7l%g7nIIEX$v!eu!{-8y`X#nQ;W~7AUTjem|7SO8u$F5 zEzAJIbCAp>r91=agP8}TLFxCMwlD(-e?c-A<PKsnNFU5R7!3-CH`>AsAnap`2!}7r zrCMNW2$>Jk2U829LF1mUw1pW!cnOlZgv>&g2kC>E2ctpd`U`Dg1`z&(WG*P)U}+rL z3~X$WKA3qh8Z_?tOk0=%ghR{_;ebs)E-{ckn0YW7H17FCTbKca*C3foN_hs-2Qv>w zgTmpFwlD(-vzU|TUXVVRc`zE39v)~5Gk|amlDQ>zh`fo*|1fcoKA3qh8Z_>CPg|G) zgts7>3)4dk4blfQ4@QIBdq-QC0fa&263iUXxF<{vObizdYQHS7fP^7(8X~5>$6`tQ zeP1AVgWBt$J$@hzb0hlLDomVM8e}dAgBA<m8(W2$2U3fSL1i<Hzrhj`elR|@=?om^ z#|VbCxRgQGHf7J__6Ln~f$W}Pjc^aB&I7g2K;mDl5aJem3=HvY3=G;NjIDykStERe zTVww4w}3D#jiJW{Oq^I6<Teln#RaHr0I@;X1L|IoTN8+I>jbEJkX{8S8x$6>{sTxn z5sx{rao~;yNWTW89)u@Y3%7#87i1>LJP-{MkFgPM1%){XgZLnfD?DN2iVu+DW<sq{ zE6lDCp|vd>O^|W&h;MJ_g3Jb)x5EYzXP~%*jRS+^VAzt6fg!1lfkB_Z-Z|v(c>{F^ z$b68WU}hyl&B3<M2^Ky&EvVtM!A7_h<YthWAoD;p$h;%A!mS{GfG~&;!XP(dGaD8@ z47LdWN;C<z!t8qTkh8U-6_VDYC0pA-W`oRAutTUv4xbt%bFBCn7*g687z_yPc|#5# z<aB5PH49`;D%2e0^Ke1#0Abiz0Vtn<_#n&!)eCYbC~QDtAe;s@2U}Rc!nvgbHJl~v zgj+#=2bl>n4@85^3b7Y%1%(F)gZLl}@+&s8Vd0#C6mC7OLai{nHe3;Iz0e5>XZNJ; zat1$0_<FcNXpq^UaAw$WrbS>PB)#g|y`2kk14wRzJ*v7lC!l+bk;JX}7#Pyq7#K`s znHY!-#}h9h=78)t0(CpcoD8Tr$Y(->)POK7K9J*e4pcA5ouDuTsRQ9ms5zj!|3G|X z42utjDTw$8nc>{B!d|!)<adynAoD;pNZ$lU;Z{(1fG~&;!XUq5GaD8kKaj#lVWLng z%&r630<8^GA@f5onh*BQ$bf{eLmY$#nGKE)1_p*Rb0G2Nkknlcasx>2jU%c$SbWTJ zK#1G$F)(DcF)*0QGBJSe=>+LR#@NCU79SoUze3FdnUf7Q2Xx;ivKb&Y%pBzWp-?H@ zI_0f!>x*5|Eg-yEjtRWq8@*0}i4#kM>;qx+ItAu$kXv)0Ze0peh=yTqeFF6xNLmNV z28AgozCmIjoC`I_8pJ`vu(Z>&0Fib;N}f0hw}RpcWG2Ww5DgLs<u_2=fiRfQ0EriD zX2a5si4!6&AIuSIh1ms*>kcG&TRsMcyfy{~Gg&4E(76~eJ76?6f5YYse>e%ZIzY_= znUfDS2j4zx<hWjPZ%50T#gKil((ApkO<97SaRF+_5@+F7nA<`26+rF7m$s1eI*2Xc zBiy=RwGbG?+9T*`3nor14R$2-3>sKI0EvOZ2SkJ1S_pOPW{?0HhJ~?%Ga}wVeGD{Z zU~UoA9MJt2U;!ioHV@jc43W0}$Z)ngxCpm`%5Jcke!{I_nt_1<Ty{XqbC@xpbb!rl zSlXI^RPOUE5^9CnCEzODYKJrr+Oi5V4_bj^9uzbe0J9TBgY*`+F)+Zw{DwC6dC&_h z5q<;dJAvdL5FdFw8C@+%9)w|PR$v)p0gdH-(-vj`VbB;1NIl8eO&DWL2((xGhqf>S z2!re;*-Qooh6pU?$}%u8{L&T%V+J=w`XR;q4Oq+t^(Fsk3p0Q)$X=Lvpu7l+BbXR2 zn!_D496;gwPg|G)ghBS=(u+?#0gJg_APqXg3=BHL3?O?!TvG84Earm7ESPkJ89*3h zFR5mN)C+iEh68Afg+)i00fa&Jg4B_UGq9KoN)K#0!VDk`vX@jdLFx}+F&C5`I6z^m zBg_D@7o-k^HFgs}HYVYT84jSaJT4t!1`r0>3o?^bT!6(~(EK%zjxYlVgX|^MOpy8$ zSj+{DHSy^PGk`G2UXVIcv4R)&a1hWDW&mN3y`-86QxD6VFdEbr1epoKFg2vo7qGY& zG=D9mBg_E86<*|(J6HTL!vQpZEutgL0Ky=9Np&koJ!qbo(EK$ld|)(4A0Z5?Ymn!! z6`*wyv1WkWg>DBW^VgtpX^?rKF&GdH!uEU&3?)eQC`b$$V{2=G%5;z#(4Iq3`v}Aa znNv!HIiNNbNIeLH$^sA#!Z0_1%qb(n9OQN(sD1JVsVxLD4}{C{m;;*!H}FMGi=edm zB?vMPJ_oI>05TI9PgsH4wt&ffSufNI3Kv-W3^~3*{)4Fl%~jj93AIjG2Qdef_h51$ z8Z;LK%KM=92fAB8VjwlRFvx6BxPatAeQ!`70YroN_}YZ9dGHrLh;V_K1Ja9*k^P1& z2b%{6g~bH4HX}%#ho5jO%nnc-fWiwTP6+GxW0nD+x<*V#m;r=AWdzI&kh^iY52gl2 zw_q_BRCY_~2s3~%$X=LQQs_Ha%mukuN=KLhghBSg%md|5V%=*JfEf;;wvvpFFarpK z?1h<23f+UnT#$R^bc7i|7-TQZJkY!mvF?3>#axhk6?B9dKp12%%v@4vn?THP0J&F5 zN0<SGLH5GT1C?9Ex_1f|b3yJ^(Gg|<VUWErb4j7!U@;fuUNs$I1`r0>3o{Q?J`(F* zmmth=0JW7gbc7i|7-TQZTvF&cSj+{@+iU3vGk`G2UQ*11sRfm>Fu%cQ(7e5ljxYlV zgY1Q=C6$Jm2ctpdD#%O_Ce<vM`jQCYR!ity2aE>I+s`o+W&mNIU_^Nd(?bmH5szsu zsPDJSP?!OPmyl^LNFU6dFdCG8cNhvYfbbtO%?0U$nFpgmb6MLAg&9CNBm@x-q?ErP zeK7N2G$>zeF%)J1;WbF+g32A38bV<V(g#xuqe1HoHW>;tfG|ra!o8%FzaV`u^I$Y6 zziluSW&q(BBy$P55m_Fj4`v>W28F{qLtzFG-hyN<$h|N%$Yx+;gY?1F!f4PsgEfZ2 z3?R%Ch6o32`f-VY^uf%7(V%*Bm7y>L2&W*KOG^0*(g!mSMuYmmD-4AhKzI+5xwzbh zO&p{TW*&?N_1Tvh3NwJPNH`)KNGX3o`e5e4XizvTF%)J1;T$A$vAGME7)T$?JQxj1 z4~q<i89?|5lDRAnh_VEic`$L1KA3qh8nn(}fuS%12+Kqu!U3j-7#gGxW*&?Nxp$tS zFarpK%2Aj(pmhc?H83$;G^l;Z5eab<tXv1FC8j-{6DbUCkJEA-_d=v_E2s|xn%4$l zm>Zcvjzq#RabjthR?s{Ihz;s<fzEgVVVD`zvIArezO@W6`#|nM#-Q>a#;=Kj#1V{7 zZQ2Bf`LMZ)8PN#)9r+j-D%%(sEM%D&K;s1HZh`e}k>_YYYAn(b=ljCaCn#({axe@N zCzgik108{Dagh;x_OVNhaO)eWe?V@ng1QxS-#Sb^jE1?@1j&CO_J=gYxj!(sP|K|# zb3kP_$PFK2gj-=@3vz2U)UEjDQXU|=6~tbVhFJSSZMTB*2W&27PONY%C~QIQ2D!Bc z>Q;PnDLpZWbOT~1qzSiP*dqkS)OIVV?~c4a02H<`x7I@4dIltbhGA*IA{OCRP??XW z49u;AnuBeR8f@NY!*<BH14u(co<OTboNy~>ju>PnXs!oDgX9Xzg<C;<5F3U;c?z4^ zuz8;jr1|BLO+u|OyEx*7Tb+>ReYWg|%=@(BnD+sVp~36~(ICC`Z43;sIGJULecp#* zH^OfqeFu=-1LA|?07Qc^np&_Jbbb!RUVx>I4jMP#V<^l3!k{)hNFAy82NrWdb>%)o zVFnNe*$Xohln-HkhKb>#0}>GJ0GJ+7+y8)}FarpK?8T)QpZE$a=7Q!?4jBqFfH25j zeEM<9C1Sc4)FwM(D9ixDAbWA@#Ul}c#avJu@|dA80|+xDBJvR)V=$yPU@;ez9!?kv zGk`G2UJOk{2yi4}h65-)oH7(<0AY~5Fk?V%Q&`->#Bk9GSj+{bhckx43?K}$7nfdq z;ybXI3v%x{LtzFG2H6YK584k&ta}BLv4_J2LtzFG2H6WU7gUZCYi<S>b3uK!ONPP> zAPlk>W-cl80W9W%=98`%3NwH($X-&+gQ=BB!3+mbpW>RKFarpK?1iZ%g)YEiE+`ys z7z#6hFvwm~%tKZSiwhVH8hZhm3Bt(gNMS3aVuk}~KIxXBFarpmNFgsD=VW4<3u-6c zF%)J1VUWF~xD%!pG;c#_J_!~+FdC*89}TL*kmr*Ec0uYmV$A@#3*CHb%qM}`bue?C z`4|`)km_fcIE=>Dh5^-WAbC(*7S!$nu|eiE5@8Ogtp-vL!k{t{M1$JzFgJnBX(GZL zQ2P|57lc7&3Wx?_kefg>$ed;(%mKB@LFz#m)P8z`)K&wDfp7~Rb71pQC(=>VG$@VR z<U!`8rl7TDKxQK213Mw<0$B{izHv~f6%@X(_9Jq-0r?N4282O#M=D!{S}hJh%mL+L zkT?v3#yUY|2&fH(?iP?3OdU2FWHu;VKysiph@d$s5DntvYqP@Ur5cdJ1!fLNFFHo{ z8?qd1UJ4Wz8kwkJ3{v+XL%0=Y2Ph6e;RO;WgpXh;OF(tuJwssz5C)YsFf%~z#^pYk z8W=5;g;_>{>VOA^!VDk`vKOY76uJb9xghsGG8AS2VUWEr^GF$IJcGqtP+Q}Pp)dmo zgY1QwOA4)$jTsIg_dYWeW&mN3y)g4g86U2}VlK$NFARklKp12%%v@6FD_G10x%ZW! zFarpK?1h;JD*uR04>~!R;Q(^)8$)3R5C+)`GnW*)1&g^L_r5a}W&mN3y)g4Y<t(x8 zy@SPEkb6HE3NwH($X=Maq|he0nBf3&?<YfH1`r0>3o{Q?o)hcd9xUd9+D2atg&9B? zWG~EIQs^gG%mvM(eKQnh0AY~5q?iX&3#t=feuL4Vd9)vf!VDk`vKOY7R2pU;j0V*M zATvRjRI^~}HzcvOqOZXQm1i^N2{VB3lsrV44BB@TC<{GE6lMSp`b)krhPj~huxXw! z0|>uCGWQ7|a|_H3IE;e}`xIcB3rfGs<_R-^uuDF|y`XgFD$B%xWhet~9*hCf2Xh0A z292XGnJ3Hu!gG+!EqKV?x>}Bj0o3M&>BmL?d5P&>P&jOvC(HoCpm2ie{SYlnbU6IM z5)Pog|B89S3?K{&Cz!dQa7dM9VhDf<;GseB0`otN28Hj2dBO}JyrcjTzB%E1tsCT+ z7+`HyJjOC8q+zBrP~U&mJYfb92Kfi3KjNlvYxGUwR%~Z$!_>g&6_TQ@V)BqZ1~3{F zz8$xP89+Fs5aC{*1DtTRF#WjbjxWNkSD||sU^J-Q@!BlR0K#jK%<V}OB0An;iZIgy zXx_SKo-hLlvlJoRyFr?-b&VVogFP-sB8jIIW10&JhrW5j3?K}$7p5FE&jX8Fm>4da zr&zf42s9jEG|1eNmBI`lyama<pmYXPgUdXa_#X~Y40A!@Teeb|0fa&J!qkHD#a5^r zU}CuFJy^m4G><l6o-hLlgTe`>*CI=(1(c7m-5~)}1EWPsu!rxYdBO}J46+xdHe@d+ zyzGOC;i7Y}m<uX@r_2*(0AY~5Fues2gu&%bAWQ%c4Jx-`aSWqD`EA-fVFnNe*$dO2 zaaN$!N0x~}4kmzy2DiUUA!!s=4}p{u(_cv`6$bZrXgQ95qExsQ)Yk;f`GGLZji9*` zkUL=*CQd93(+8T@&?ysc1@%KgbABKUGlN=oz{~;ln?ZY|L73WhfabmM%`L+0gZUdq zgX%;W`$icg9l-e1rYGPq|BLhUmWU&ey^5Z;Z|8#ML$KNHQ4VomMul)ItWOJ4*Ve|s zU?t1M0J;|o#7D-Apa^DQU@)kF=!MB0DHm=9*#$BaWZ#W);noM`!mXhGb$oIG`0}wg zQ2StFMxZ$h0S1Qn+@#{X<lF)V77Z|BV`N}p1a*8_G#OZQAVQ$y??Lq_RLGElMH6iG znR4OQFXh6mYmNxDCd^*j;&D`{6*SM2lDuOr$X{SZXoLgQ?J-rttsu9;q}$sV80-l6 z`vg=kNRNk+Qp=tS;Z~4cATwe1f&2%OKT;vwI^(ENE2v!v;<r>H!pxPAfuW;~fx$tR zi2>VPSg>&?^ts+UZ-rZ*WHGgXFs$5y<p+=*APf^HmImnoVURf+vJiK<-hlcQ<kn88 zTk-9e1nq4EnFGS0HlW5MZt%P@h!4YEP;;<dM#s$tIfGx}6l5F+qz7aUh;Dhr-752t zyA?!(_(?4c4C`dD*Zr`umorG=4KfF$_eQO7D=3~sst|DjiUVx!fz1srK~k%6T&NZ9 zJ}J>wD`?vaMuY191@D9zKzIX^KAAS&7ML24`|)8=xVuzC+~){g!v|6iiU$x4!k}>} zf#X80KTZg>-Z&1~V+ayoQ7zmG(m$tNq6LIOegj>w2Z~#eJPgCcL9`D8Bprh8M+Nag z^*x9NrArVE;=}a8(l#h9gT`k;7^Ehafq?;=9UyU#d<N7GQ2GJ!L3=1cG%_D%2dIdF z<(ZHgNH~Dx-1rz6y4x5SKz$Z$bv!K3Ag4okdaf02<$;<7GN%V>P7cUmGz>EbIqwzx z5pHea5ryYHSUV2g&oFUfX_(a@b3pAw7$4?ukXw79ZpGG5gSmAM)NdgDHy&}f-gu0e z_xhmbU`y+;y!YT7BJY9B0hwp=1d{JSG>D(p!oaYeK;HAHMZ_D(9FX3gM&VXanL7bV z4iuNz+yl#d3Uvr`WKIjU!ra$VhuPi)t&?0ZPnZFOb&&Ld(h{hDM@&Bf)Q?3kH$i!N z(L7-W5C+)`3Ih-ZjoZQ0g829_DD6qqL;T`~l&3-Q3)2V6(=4ZjT5HY<wVpYR$kR3T zkhBZR&mas6Gf>|elxARhK{QMpM1%4&hz9j(K{V)&R}c-#Hy|3s2k8M}P@aBJFWd@B zbD;bT!XP#ASn@PX97KciE{F!@ArM`_0Lh!ke31Dd49e3WnxPi4RtcmBbf+ISe}Ke6 z@}SF=Kr|@rgJ{tD9T1Jo2b&9ZD=4l({4EWTum-W+`4|}b+ZY(UaP;x9<spymPc1SR zA#u<-aS^tr5XfkT9wd8QplpzR6QK5$f>ogsF#C|p7f>HV;T+=5bC`~aP;;>55m=sm zaS4%ULFRz;)|?Y)6*()=3Zg;$KdlT50<!q)%Rf-}gVck}0qON=5pD(5nJ$fp@C1b; zHuu2t>=h)ncg_p7!rTW6ADJeIIo?Ql02E#zJ3$zf2acQ<YCUjKsI}(;B>X|*4NbzW zApM~955gcfI6~tbBoD(daS-jx0Eu%@JqF@~)~SPNP@VwMAU;eVC=Y<xpmYQ3vw$#2 zO#%)(K;j_zBB&jpJ9$BTP`U-tpm+z-AU?=k5C-J|So+jyhJ*u1+=GvSVNx3dgFk_L z*O1c-EZvnf3%5RjhAGIL$xw63K?b8?Sh_>5E0F6Pn43W6Oo5t%?=EKKdiKIOfz}J> zG1Ko<s5#iu3oQMvxQ<A_Aag*@*0}&lyC53G2MtmR5=g&$kiryX4oI&?yKpP0-eGA$ zgf}RhvAGA9ey1R*eR5f-73MxrINyQF1t6tgP<Vme$iM(D!_Qn6YIV6L)H>w~BK<nF zLgEROc0m~A2GF=Sdf5jP2hpH(3!*_~Hi(X3K%@~EA7(Eo{Vr)0ZUx05DD8qUNDXLR z5;i+P;vjiYx&_goJB&ee9n=m``hoFbc7W0^hz&|}pguPUgVcb|qQPbdNE{?T32G)N zErIy6u<$|Vf-uM&SRM&zL&TXU9|Oa*HU@?e0%bUInuNFg7#J8hpk{&0nGQ7v-?~-g zJkoGMpw;3cX4;+sH3wT-f~D;_w-IR@WDdxWQ!Wa$g3>042JxBO7#M^Ir0p3{_k+}f z%mL|r(J9;tDxV)9$$`QLn|oksyPzErrb})JwZhy73ZETNxlp9E4GJ%iogfS<n|p2u zwU*oxY7M!GNZT?U!mS|vpmYtwAU9wun_=Q08dNreXiypl(V(&zM1#s^5Dnsk>;z#@ z+6K{}^Z;s`fG|i+9G0>fCJv%A86fEe6we@jJ{CU6To4AOZCJWH(SZmfFFpo_nQaUV zkp#+S<n#hdcLJTltqoAKK<3PXnv)B%5Dml1X5{pXTsFhp1Ttqf)Es<wP9WD6FD?qS zzPN;$e&;~V!IoZN={M#9BK?BQ0Xf^{vOp^+{efr@pS_KNL6|`Ljp#&#Daag<UeLYn zpz?VEk{l?UvAGA9ehs=1=FGSw)CzMSD4Z*xa#2X>7ZhF~H-a!I{WjbYYW;CfsMX^x zBK_X!g2WRj?Se4K4cN+Nm^g?ArCSgUDw{zxsB8w&K@5<z0^)=01YuD6b?6pu1;rsK z?Se2!EvO9vD(^sQU>GJ2qCx2vM1#@`h%SVhjm(GX1EpUO8<gfi<uV9^^nmX6#byUc z93&4KpaIdKv;?Aip>`niLFR%m$Q)Q65$Qq1gEt=o!`wCohB#R!22h^?q!t;&(l&CM zbeS@#WyT|+R#2RnOmo4e4Q#}lZiGEcplpzR^Pu*D`UhZzNCeD2<h=BNOSts_H^MBK z^7&A6K;;!o3`WE9K*AG59srpGl9%BTZtdX`ZUxaGzC{}Yg947RJlJ?t3{seZ%mL|L z(=Xf#D#w=~$$`QVn|ok+z@!)9kBEmttuXh2!lwo*7mt(&K;Z>)BM5`S+u@;5tHooX zR*pxAJn*1bxD})yl>R{&<OWb#42pA*J{X3HgJ{rsS|A!!4uj}a21FWw@nQNvc>u%) zr5jM&1cX6qKxHyEJ3!(fdC=Sxhz4DU3!*!rc7Wm?#s`@T!k|0=OP@V`h%oZuV_;a& z#=wv)%fyffQiz7Jr59MbyV57z>H;+jWX?jUIiUV0nlbRZ=#kSoav2VD6UdxJP;(Zd z8^XW<HwU>+Dc})qE#O7?38rl^)EsQ-1(tplULw*j$Q+Q~GrW+r3!*`Mn>GdpMFQzp zrXOKH$Q+Q~36q3dLFIS~k{l?UvAGA9e!n28jd?263UePQoNXpR>_|aMzo75}xe<gx z>DT3{Q0t!OLajW{5b1Zp1V}uA(k=*t+yE+z(bE=897KcCEr<q{!yp=THY11zr4bMf z;)Co2VNm*InJC-}ibGJ^1!0gHP??O)4v;uV9+YlDG^m^f(cKJ?bO=g6Fh0n95C)}R z5DiLmpz<4pL29OBY3IPiLG*m6nV_@;;xEU-2bl}PAh+V1*GfkUcaVA*MxNK&FcA_* zFga?|892;e(kIYj@(OY`r03CSFHqV8+5Kh`!ablhKOO0aISi0I2>bFeFf3_fV91rl zzAgn;1|a7-1*o|o^Fie_$Q%$}3N=Rs#6iRG^AF!3@*GIXlS#s@AUA`|1eph-LE=9q z3%7#&0m2|Y2!q^+&1_iyF`10;Z^A2~)*h%`YqYsrZ@d+1<z--C$bN9@5Xfwhc_C8} z>XE}|1Clv@d<+cB+87w}WSJO1>%2hvkTJIKK`z@epk{&0Sq?P^R6ih_0b;|<K`tX5 zpn5^>1cePq9SE<0nu9GYVB!4Y18O+?Oc8Dc`5j~?$UG1YGD~8ra4RT0Kp4aaVUS<3 znGFl)IY{C5;jK_BvRx*hAn8!+b+i}AY>;^+Q?Z9LNDhYm`4|{hwlOf|6G(^1;j;qj z4v_gEKf%me1vLkoA7J4V^9410a;6Hmg4_%;6J#EU2AS6|O}G{04-f|NK^WvlY-Yp4 zXAhEpJw6Gw!t7EIj%``-6_O6;KRbB{WH!jWJJYa-j|Gx=03QRx>NW<30s`p}Ied`Q z;RmRjK<2E0nu9MLBIoxLP`w~`g2D#mW)NNrH3wT*z`}XQ57cnJGEKM@<adynAoD;p z$gBm^g<C=40m2|Y2!s5J&1_gWt4v3P+kvk_tuVU;F4(oO{DP#zAOCW^KxTu?`-7w& zIlqJCU^tMEfni-614AK!bch^222gWB=7anMGiyE69Bh7og^$i3)bRN-UAPtGW{{a6 z^FTDnJdT;dtssAZFo+MrAU9$&8x}q;GZ5h;@k^)`*{+JekaTD@`|NR$*&y>$W+K!h zhtB~dbAtF77&f#qFcc9;hsfcBoDM6XW`WGv2sH;^Iz&#-0Z_dlcY?wO<Yo}w1T_a+ zSir*h0)q&ssR2?B#xXO6TS0yYnF%rvM1v$WW(l`~!UKdsd=Lit6`R?xa9)EHZWI0r zwZiNwcrd9&hDoFqv}EH#P@NaZY>;^^v#^IVNDhXB`4|{Bw=pmj6G(^1;j;tk4v_gE zKf%n}0yPJlA7J6*!h#5&J(@W!HM4|UL2d?_2{I2vgUp*STeubE4-f|NK^WvlY-Yp4 z=M0j64VXk)VRl70)VEAv6#>`Fn^?upg3Jb)_hvTs@bN$r58-2A*xJUxP(mObB8Lxh zI%I&F1u|zF)Es>25IH^HfcgjIPEgo@+zi6oq2^!<3s^WW;6Q{kNY9hm!mS{`gUke( z2ckjZ8|DbNg2DrYL3|Jf`4yYluy8h+g9x`3tRk&2yK>&Ex4hwmq{D*BIbI;MLFVzy zMW{#4?;trC4&`HD*wMzoP)Z;jB8QIy)Eyx6L4JanwG(O%Hb20^M}!A8d|2iRw}RXZ zG81GThz6M_F;BP^<PQ)A@j)2mMr>xo!Y2gDzYJU=t;lvI@IumI*lGK#AhSW{mCVB) zJ{OS83FBj6*wx0sP(~mfB8LxhI_!X&1u|zh)Es>25IH?3K=p#$2?`sKn?ZOF)EsPK z0So5>0n~8LnJ3%|@;k^(ka-{)WR}Hz;Z{(1fG~&;!XUq5GaDApdyvAdf>)#!*{(f; zkaW1}_*^fL*&y?#%*P(iAUPNg=VM^l+s439P9Pm3htCP9J3!`x`~)*=AJiOdet?C~ z6JgZw>6tIw3UV{ZOptjX8f4yr1;VW$e}FKE55gcfVlx{SK6jA(dqGg76=s)<FJr5L zC?p-4Evdc=G8<&xp9R>%Cjv=4f{%e=e;Wfs1%Y&k96reDPylKc$eaUEbMU1@<n;Uk z>K~9hL16=OGYB7qnu9GYVBzc_ff~+V76`Y3{0=e`WFCkHnRQ^Ha4RT0Kp4aaVUS<3 znGFkPmxYLM^AHtjh1sRyUEk6p2}y^>saw22W`oR=S%grJt2~V4V_-Pc#=uZXARQuy zPXN>%AoD?f0@($^hoR<R^8+k=wn(FfkH{k7R*;)PW`fKE(IB%l77Mq6`~kusJ_v){ zh|O$R_@p5DcY&lxE6lD55sobkvXFGB{ygXo$ZU{#EsL>-&jTcLqWBmXj<hi_R1rvr z$l-&W4rf5k0-19ZY7V}1h@74apn5^>1ceRA%^-XXY7VxrfQ7Sw0%|zdEEaAB`5j~? z$UG1YGRtF$a4RT0Kp4aaVUS<3nGFl)Gf3ekAuG}fv+K<C=PfackaVbeYKs@hY>;_N zmS7KOkQ@w0^D!_SZ)0GnCXf!1!{-Ln9U${Teu9~G0%{I6KfuDLMHw}G<}49z1-Thy zCdfPx4Ki=TQsGvRKR_772VsyKv6&4EpEpSUEl?C`h1q3s&aLHw3M3tV+M03)WH!h= zo@Lm>Cu1o>Jcf^f;ba>FLk)p+h#Wr1=}-Y`7Ra1aP;>C5L*(@Q1L_};J3(Osax(~@ zhMI#dEMVdMKphdzA$_k~Se6O5g8U9L6J#EU2AOqXnQ$v8JU|%42Vsz3v6&4E=MbcD zd!ZuI3bX4+CR?kHCL|rYEJ^SJnGG^eXE`D~ag~R$d<+a{+87vW38X{h@JWEW17tqP zPawNM_$<^MY<_@+Plz@md_a0smJ7Fn+zc`kWFCkHiCe4?ZUy-Rgh6}|2DuTN*|6{_ zLGrJIrbsKyu7b||mIXSHbeP3ia|C2I$h;{lu!qkFBy-~U7#PmAF)-8-NQcPbgPaam zK+OV~a~^6AzI2G3o*STgLGA>F4am(Pd;w|>wy=PO^9Fs?aPC<l+zRqL$V`xVAR1&= z#7f~-P<Vhah!4UbzhW~R7S4B&!fl6+NGr@P9;+uUe+;1Mu<NK7$ZU{#TUKHZXOJ8W z$MZ2TTx?@ts3(vPk;CT&)Eyx6L4JanbqQ(?Hb20^N5vR5eAcWKZguH8>IE_rWFCkH znRj57a4X0kAPnMzFvyMA%!Y-}A0+<@7>cyQ>~eWNwWYuWk`8Ack9-I+8)Tl$YV6@t zu?iucz{kLFxs8FLfj~M$4j<%nXaF?}WX=_+Ir!2ca(d=~>IJzI6gD6?gYZ?TIoQGi z7S0Xkh;ZJsTcAZ`wQwuQ?;tZl=7DICSr1kVw}Qe0gh6}|2Kg16*|2a<K?=7H6OmS! zT_2_vwVbhlq{EO!m%Kn`gUqv8g9uMt<zXTp1H-j828Kog=@2=53ZU))nGf<4$Sx4R z4mAgxA7J70#R?HVAU!5)gj+#w2AK&m4@85+J=O}hg8Tu(AU+6#+=$I=SopLc`S*c^ zNGr^)n8jCG9Bd%zu%deJ6Oh>;^Omf|5k5%bNqh_pH`*8&nh2yr<nTdGhdZEd0-19Y zY7V}1h@74$K=p#$2?`sKn?d*%)EsPK0So5<d(?2AvsSnj<adynAoD;p$gGTY!mXh2 z0AUaxgh77AW;QIG-ynrggpEimvR!i=AnEY;%a{Wovq9z^S%)K>L6T6M%*ViRyN!XN zg}_~q$l>z?>JE_kAU{EkVz>h}M;9i5M8m@8h!bk~>{%z=3UV{ZOptjX8l>&Qdf`@( zKR_772VsyKv6&4EAD;CH|88&)X@%LP@xZu6zy*>HTie?ML1u%@)7gMfkDO0CkjzQp zV_>-3#=y`j%ftX$a|hCgjIqtfA*VwJs97L$?m^7~t@A)O1H^`zgPfivpn5^>1cePq z9SGltnu9GYVBxIbjvCG?8-!ayeg~NeG7m(9%=)lFxD^y0APnMzFvzdi%!Y+?2~xOe zxQMjE?8=z_x+TX0k`9+1nRozXHpo1mjo8B(BnQK(d<+Z^+87wx2&6;g@M(a$17tqP zPcX9{Le0VE2Uz$_@j?wBmyN=$AUA`|1eph-LFPql5^e?g1B5|*5C*vso7u4NnS$is z1`m-|WV;@CL(<{#xRVJWvq9!<*@QiO1dznj_!t--wJ|WX6G(^1;e(tGPe9!SGUqYW z9DL~zIlnJ}>IJzI6gD6?gYXlmIoQGi7S1315aH|)I;&;PCgE0)-$7=A%mdLNvp6;j zw}Qe0gh6}|2Kg16*|2c_gA_hLyhU1JcAZ%d*}EmMMYt7Y2gocCe%i*s&`Dr_YQ|<n zT&xJsY>C+{+*)|lOB7@#$c-R#Kx<h*bjoJo)`S3&R*41jEq?+;T0#4#nuDKSe6SB; z21p$Yzu@3*l?fDS<zir9Q2qPL1LQuCT+SARdgO8lBnQLkd<+cF+87vmWtkYTtqp>e zA1Lt#^$W;+nA<_-J%^fut*(K^TTCz_-avX%wg|U^+`M43a4X0>5DgNq*ecu#@&^cm z_#g~&BQ~>P@wNrYzXpLKt;lw*2oY%o?Nfd_WnCo5Y>;_Zwqg$-10?YbJ_d#tZ43;3 zvP=x1wWlC`$QWDrAm@)4P&a|hc?mTq8rc9S8)go2K05%_3vwqYY@kXRUO~;l78bB@ z-Vu%(&S$m?w}Si*G81GThz6NAW1Da*C_F$I#0O!JU$L1D3ul>ah;Ta)BGL-8>jL+t z7M4gzIsH>Z$`fQZ$h<E|>T#vROg;vN*KG_8{Uo$oHK68#%m?`iWETj(ftrKO53umj ziAD{dH`|0;L2d?_2{I2vgUn*sA>0b`2MB}t3=lVBGaD8@Hro;5BM~Xm3bSj%*Zh`> z7)Uv7^}8({WH!jmm>mf9$l<dC$($@c28Oq73=9*<Y_}Fb%>tS84r&gu?N$${UXVLM zVFPkA2)~D#gDosz;oK3A8qOg*gj+#=2bl>n4@85^%GfE~3JwpXumJfLo7u2%UV^MP zMx+&H*Op4_mMaO6^6*;a##FG`3=9lMKz4vE1MNFuU|@jVVXlBAp3TR=@S%-?VIqMw zsmSGF&rV3a05bXp)J-6BK0?g_t%(K6A!BU$eFIc4$ep0DfvNulH3wT*z{2@NGHN*Q z*(ux#@;k^(ka-{)WS+!s;Z{(1fG~&;!XUq5GaDApJi8F-^F@M4E6gsLke(KiR7klR zr|i)OG8<%G$!>&tP<n=ia|e<+IeZKZpW7H1Cdo1}B!e`eVQk?83+D^Fgj*e;W`WH4 z0yPJ;b`#AQ_?lhh_(Cq9VQvDM^A&0iXx%0*bCB1rOF-QK@-HZiVS2tn&A}F?u=u)> zff`>qyM<f9VYo}U6=WXF?1nwUt)OrPVVL=#FvDgxEWY+2g}+X!NGr^)fb(-&RI(uD z^Qxr}QbA^e%)GM)dwf|SiRbb$Fnn)gV3;h+!~oi(2GWO&Vey3=KCt)#srvwR6Udw& zP;*cg#DEkbt+7UquM<$cAa{bo2C9_dC)6BlVF3$ghFsKezOqNS736o2nIQ8(G{`)I zeZsAv@Bm>DAA~`E#b!1voK^NB!p$N}q!nhDi_onWpFBu8zqwOk4#;efc|Az&H{^V= z0Lh#@J_d$gZ43-kWSJPSog)SdXXNmKh4YKO!mSZdvq0wjhMEJ~GXk<78N<v$jxXeV z0do_`oIg-=79bk{Wy8!tZnqdf-2n10D2$;>8U8}e!4{^l_!1~Wjjxt{!mZ#i+$-D) zG7n}ps4WZ%R}hAo4+=AEX2as^3R3u|<cYMx?5cpaXAkU$*a0)|UmF9%R08dKhy92& z0Mci&U$_<2RtK30awA9#)~>hNFWlNvEYhkYys|~11X4fMyln9T*$Yx9a{yr$D1BgC zFP+cF!0^9~fngSb_BwKW1VG&gG9Tt9kbMm85Oc7F87w|L%24A&<bZH1$ju-#LFR#I zkXafBg<C=X0AUaxgh6h^W;QH7Qjq*>QX<j{vrFX@XX})5NWEemHSrwCY>;^^2eF6G z10-___!t-%+Zh;U6KJm^hYxbPp8+)sWDXP59DMC{<or_r)eCYbC~QD(24QBXIoQGi z7S2nmP{X<Apl~b5?;tZl=7DICSssUkTS4Ig!XQ2fgZzrkY*;v-K?=7u<sz-fc73RZ zq{Bd=X<i_+LFO$vggu-=axh%T$H2hS&cHB-KsrPYpBqqjfXoN^31${6)EsPnfQ64l z9cuW@IV9W)ax=(Gka-{)WZs6u!mS{GfG~&;!XP(dGaD8@Z;<@UQX|p|vulR()|Qld zNIDF=T6!5|Hpo1lBiO?y<1j+Jh>wARt(}2kE`fB296reDPyuQd$Q*X4Ir!2ca(ey& z^$*CMps)eC8H72Y=3om8SU8t7p@uWd5#d&l-$7=A%mdLNvo0JFZUu!02!r?_4Du^B zvti*Jf)s8w^&+h>yBd_=wH#=MgtPdszK0;QLFVZkMT94=^01hXfq}D~fngqja7GTF z1gJYe=7anMvI~T{pypun11x;rw4#QO%2DA~kefkfg3JTaAhRrv3Acj$0m2|Y2!q^+ z&1_islpy){MzcsO%&r~0ms%{^MOyh77#MC>R4xIT4Ki=aG3?><0m+;aJ_ZKvb_Ry| zvP=xFAWdi(Tm6lk4p%_U0-3`DH3xKd6q+&cb~bW)Zh-0qxf2vNFg?6bbFhU4ESx>M zP{X<Bm~bn|?;tZl=7DICc@f8jTS4Ig!XQ2fgZzrkY*;woK?=8kc9B+?T`LURTc&i2 zw1U!_WQ<cR$ZU{#TaIH7XOJ8Wm+~<%@U=5AEWokf8WzsT;qwCO4v_gEKf%o6hnj=U z53umr(~Ah7Gp154YmN)Ig4_%;6J#EU2AOx@gm5d!A0Q0kgD}XA*vy87&mScJuILtN zh1r!c|9cBZKcv3+{(rg`$ZU{#GAFTzPsIs@co`o9gFrh2!$K133*>ZY05uC_jv&+= z&>b5f`;jp$oRRZ82UIV}ouIIRsTYEpgDosz;Vd!<5zZieA}57gL4F6B2{I2vgTx=4 z6mA8D2MB}sAPn*=HnU;joPrc?GW{a0FuMv$&$lE@hNMHO7^hf}*&y?5P9ee*lt!_& z56k%&7=+sy7#0yohsfbm0Cfk*e2||&c7d=6)EsPnfQ3)TRMhY>IVIc*ax=(Gka-{) zWR}Ni;Z~48Kp4aaVUQcKnGFk{79{_cOcrTHw(H6?NIE<rGQ$gGHpsjsr*VW2l6VCl z1A}Ng1H)nh=@2=5kkjD~sGC6Mh(XQ4mkyEh`vj<7kUK$P19CG6i$l%978bB@elQa? zoadYtZUy-rWG2Ww5DhXb<BV`CC_F$I#0O!JU$L1D3+FdT;qzjeNGr^)J+nWx=*)(s zL+Kc&SdiHu^NyUs5zZh<D6ZsVV325MU|2#R9U_O%52!mp=7anMHHtwJY7RC(z``eF zE^7GfIV0Q(ax=(Gka-{)WZs3d!mS{GfG~&;!XP(dGaD8@JZBO9b(k&Eifq?{d60BC zQ*(wF$ZU{#I_D7Tk@IN>k~vj;3=C533=B&Nq(kKJK~9GbP_sbhNJGuRmkyEBvjkKx z$ep0D0l683WuWF@3kz5{uUUv1&MN1GTS0yYnF%rvM1#!wa89@t6doW9;)5{Auh`6n zg>wl~xNVsy(h9Td$yS!uAB!OE!w;oW6(F-g=J}k*9?l>+7_R1HV32KRU|1&0!~i-^ z6DAI$vDFt1P<MdL2l)x6Rt{<owz)%C_^2#J4Ih{D!mS`TgUke(2ckjdMO+YW1^EMn zL3|Jfxe=S$u<)6J<X?fsBCRmHJpKo@6fA?Z519%>d_iV|%-eDSd-w<-iP!KkFvzzv zFf5m4VgQ{@2-1g)v4szEIy?b&6UZC|s5xoK20+;`bCA>X0;pb)J3(OsRmz|UH3wT* zz{0s<C2BaYxggvM@;k^(ka-{)WM0KZ;Z{(1fG~&;!XUq5GaDApe~`kbW0^=R%&weG zPg>5bf~3QOEiq{zvq9!vxrjZSL2@u$%g4Z=)Xu=Lf<QV%4j&GvxghgFeu9~$3^fOv zA7J70V-0HfoVh663UV{ZOptjX8f4ysOTw)ne}FKE55gcfVlx{SJ~EdO{(Z7aq!nft zD9l~fA<`kpY>;_2ml5ib%flH+=G5^qFsQUMFsvky4w1tLIUNQ-%>tRD3N;5`Iz%oH zHK2My?gWJm$ju<E1~ms;Sir(LWFsP+7hDi-HMtB)hafXS=7DICSqxW%TS4Ig!eBlF z#IM-QhJ|wrQn<ye6KO@UYZIj2Im_*G0Ax1E%$O_K!x<z8!}WX&4C?I+469_B7(n-K zz{FuRET1BW&jhGDK<0z|1XHU4H3yp?VBvFO3nF|#`a-S<w}RXZG81GThz5ygTorBw z`vb`jAU9$&8x}rGkkoG3B+?4A%V#@FtH?G;KJBud>jgF&H2(*(17sO={twoERzMPO z;A3FWY-eCtO(35lhYxZ(ya9C+$Q&)GIrzr$k<;@AsNN%2g<C;k19d8cHq;z!VF3$g zm7S>JyyvQLE6DF4GePEoXpngw*MwU^;Q_)RJ_v*Sip^|TIP+XXq${0mBCW`F73_kf z!$l^c2S8?n%zJ{Q9yz~*<Y2gwkAXp_oq=Hufpmx*J`zxKLFR+}1T#w)Y7RC(z`|$7 z9@Ox;b4|Dv<YthWAoD;p$h;5Ng<C=X0AUaxgh6h^W;QH*bgm=9r)8H&E6lDr`*yTE z*$YXBOLsK-gUkk*=W_$09yxqgAeqy|$H1W1&cLviKsrPYALMkH05uC_jy}{JeCZH5 zJzGHag4_uT8<3kp*Z^t{wy=PO^Opmt;p}olxE17gkeML!Ks3m#gqy;xpzr`;5Fdm= ze#K@sES#qxh1;LKBCRmH@SU5piHLJ^ULctZatF2X0vzTSBqoE7l4E$%!wH@W-E&j8 z6%<A=`wiO}81~CDF@Ww(fQi9qX6T_rOAaH#`-k1pmMu4hTYsu$WP!{Cg)vVr#B7OM z!mS`aOutb(1H%CVW-mB`FdL*#;FfT!i`wcUkeML2nn2Aixh32R;)B$HuyH#B!$AUO z&pC=}cFrx~*0$5UWgs&_ZjFJOec_gHD~Jy=7lcjP85j-`Fnh)^RI^Xq5^l{rtXK^) z6XezwsM$KVg<C;<khvgi+Rngmn1I<+j-#5ba$C4n&hOYFkeML2?t#W-&mG}b5FcbN z2%EJtFdQK;m)LU~Q7(Y=G~5<${WmYL1!N}3tspVjTw=#<;nq1PL|Q$L+-eCp32Af1 zF3vImslkT-ynfP>aT3y(|C24EH6=_6oaRpWKxmL2P+7EKol;B9Nl2M~$L(y$l2V9# zO%{ZPsaunl(=y?tNGm@B14GQw&&bCqgOtGWf-3cv6(=EO;Nf;zWw-<yV~#9a>w%LZ zt)Tl|rZ-zLfx-_>37DI52NFgWcZFMFVFHpc2aV;);kX+Gbhs8s(OrmM5VPcROUr{h z!mS{?KxTsMV-#j!D9tO*OwUVAVPH{6&PXg`U{TOwfQ9*sJHo9$PKvbNxLn_|=9EY) zD+2?=tRIPsKyCq<iH-%J_Px0)+zK)uCT{^6S0muoEl|B6Jq>kXEj@RITS0b#%mmrT zD9yl-oS#=*!oZ?{&&^Zr3b(#ECDQ66Ij3dLX^~b?P%OH@&H!=~$ZT|c1ZwYud%~?C zdtmaGpfM@}ZjQKz2w#vshkL@UAiF?jg6w1DU|@g;D(H?GkRk>K29JBftw&Cav|hM9 zr={WyBwWucBrO8D0jdOr%7EJAa$mR=WG+n73N%hcz>PfjQQi3Do^UJ3E|8fZ`xqq{ z7~-A%{enZ{gIq&GgZz*a0+O5G+!Joyaz><e$>CWo8D}Bswzt@l3FIc2dyr`vsJ$QV z3%7#ofyr5e##{)vc?VQ4NY9i*S}il~3%7#o0+|W2k5K@T7O;iyg8Ra)bIyviIxt*s z2{;Ey1EQDM89;6UnTd{1K<zV_FVzY%A0}@D8vh{R)`SPB;p_51xD{j<$V`xZjC?40 zEHkf!0iM5n9tgKKoD*pc*pc7ja~|T(?py3I>oI81y<#B22S|3d@G&shg4)Y+ObkjO zNi>YDe*?Nt4W?`c)GUxWc2INlVUkER%pBzQS4$S8u0>J?X4*r|5dia03D{YX0hdtg zm70gbt$F1i89-)M%$I5f(IA~u9t*dE;swNpVbEQ0*vy8to6bB$#7V??kye;pAis({ zg2;i)Foqfk@;j8tz{U{6U~*ohRpX*aE5`+qR*qI{a9LmRNVpZG|HUrp77zyMm&I}( zB1{|`4H^psiG$(^M1%M+dtqfRC~iUL@`5l(jW!NDK;kfY5Dkhm5N*J~zyP9=`7k>` zO(<9z@_7si2ap_SqSXP^r;uY}Kz0*I4urAA{THUMEj?EtX|@MXnpHuv=MFUNLH0R9 z?E~Gt1+oJf!|X$Dql@G~(%Of|!mTYx@#_RN2X?kCvN_zKLpm847y_=LrnMK3g<DNO z-*y3+2{I2vgY?<F7j6ZmHxLH#K^SzeBQ~>PY0csZA{>1#i?qV*0{OK8DhD#d9Ap>+ z0|UtKP$nd;T^4E8xGK{6=Q1L#J$WMB3epcsXCMsHFOMZ1z{Ii9Y77hvAaPK9f@lyQ zW-lzQfzklTd=Lhy0rf>d^(9Olh=z${qd|=?kT@s~K{SXD(gVVvv}W@T5@!>hBEqPR zkAcCtoq=JU9R4$Kk>frEYR-+P!mS=qvq0v!K+UNJS%`*VX$ZNz0^Pq1Qr7ZJxE1Cm zkU6eUb3o^ng5;4g%pBzPhak4kTjAC_4@AHicJ~f?*ulh!rD67h;s<n>CX5gAH;4^# zs~gm<dq4tc80J=mXNd3)*$asSG^GsgP;*q#B^VeOU}f~3+lYMAVKS*j;kj_D9b>fx z$V^aP0ns4sC;kezg7_dd41?kqo7u2@Q}7(&MxW~<tuVVl@w)>mw_c73URQ$r4l^5E zMqd|cwYeqI`sX?#-^jdxq>qpcz7`M$xdF6>2t8h4;vgDy_AZD9oxKa9L3aj$Xwcca zAR5Gn*$ax7h8K{u1G@JPgh6URcUNGu10)WTuVjFvcThS7@h4*8!|VX%n<p=XTS0LS z%9kJv(lZ-N{)dT!=p|4ymqF>ZP#Tn`LGmCz%nq1aLHPjW2M`9S*^0vskT^(w7t~Bp z+5_<qV&TK=0QGD3ycBM2=VM@SiDUwA2{>?Hq!kpSzE~FMg6^<75Qj(;Aag)^J=z%< zVELzOo-jxlj+sD*8Z$63@Z3kFQ;=lIOH^|}@dgqHVRW@1F%X8S33-KipBL!9+imlN z89*3xPc%q9sdx<*b007;FzlEo48|aPNi`Fsp5-;BdqMZo?wTje0Ky=9LF!1wF<8t6 zg~OhC!VDk`vX@jdVd`P=38O*%aFCfG3{yiY&GQB`96)!I?VBge0K!{dqoxUB%@_E9 zX)b8q`M^A31`r0>ORQPQ>Ok!~CeUS~$bt+E4FCWC{|{^1!omkeqbbG81*QFzt9;=6 z22$X150W>CH3Q@>kUnG#+D8cDgYpOngV->P&WDM^=r7Bqz;2oH77_j(d<+bpNckG3 z7Di*M$6$3g=-yFK-3w9+GRKPub3pYqNIeK6*Q+o$fz0tH!W`tb1gP#igH+Fg%m!f} zJm!cnLGBgJd4~uKkRDLlH25Oi%J?CG$pfwI0?8xeId>uPi7W<Udps3s1%(T&?njPq zkpDnxKp4~{{&G*G^~qz1IiS1;5{F^Xz2>024~kcGw}8Z8>afuuvq9kklGAuD+zM)2 zgJ=*RUwZ@AzE(jB7nnI9z33R(Z^&|>b6-JxP*|LKj~d1x@s{_(tuQ-4aR3T0kT@Zn zfu#%p-Nkrlo-hLlgUSe)86bD#avw|$j6Q(HTu|A4WS%es2!rf}sU?M$_=s6%f!up+ zo-hLlgY1Qw2g;wsy0-v}xwZ@p3@7FZgE7cnn7O3TC$N|ca_^~m!VDk`vKM9^sGUHp zdlf!mh6BjGXXXhrfH25jn7O3T6<Ev#x%b>WVFnNe*$XodRBjRL-V0dF1-bXaJYfb9 z2H6WUmlRs#GiEq|+<R%BFarpK?1h;JDj$h;Zvz%{L2ZO9^Mn~d7-TQZTvF&8Sj+|8 z1#oSiFarpK>?OrKm|9R73-cR{2JLabF;AEQj6Y+R88E$sXqb608dR==%|vUn5;6x} z{wlN&1fxObdTkbF0AXac9vPgi$DnGF#j&v~{t36D-wO;%X9+8X89?~K7eqLK`tS$k zm>59gP1wvr76a)+Hy3nYN8Czb1`xLRiZB;hA0akKAG*1q^c%BMm;r<*Aejp)A7E+; znG4bfQwyU(XHP_}6lMV77f9w3G7DKAqz`5uj0WY4h?T+&AnfoB5e}r3zaV`u^I$Y6 z9Ku!#Gl1|6G;?8Uklluj4blfw3!`N~chs#EW(Zj+%<uup+&3q9TXxDZF@VMwv6+P| z2GR#J4@QIPx1g263?S_B9T5)5`UtT>`e5e4Xiv~M-%4SIfR(}w3y{nurThiygP8}T zLGJZiDa-)EKak8N<VIw9kUp4sFd7tZJ}ZS8KsewBA{@@_<%H)=WHYd_LHc0k!D!Gu zRbDHF89;ailDXLQ;}QeugP8}TLGJZfDa-)E3_lU>-LsCj1*Qg<d2sQcnB~q51_lPV zmBL^gfn=^q0beU9oq_TrTt5y5kEUoVtbBygpuV5aW?=>p-hgB-Xw3+*<s_(m=<*BV zS6I0Yasn~!=@q|(!R>KcjuG<w7H$RgVL)R<APjROY<vggRuG1X6H9~ifG}t*3PgkY zT%a)`5QdpSEjvKw;9JiEvk&ABWDKfTVEi4wA#nubQ=2ZpVLqrV1le`v55oQ~J_ZKA zb_Ry6IO<|p-xhg%8)U{A9?{l_Uj7ykhUF(v*ns3<7$#0E4bul2ivyK|Ab!JN;Z_Z( zdqHmXC&H}-Q1u}FDzc)jK3bx!b7aK87?$7A-3k*YmIj#(!k|7Ts0|8YgD@;?L2eBo z!mToY5pl617c%y(@=v%G)(-`l8HmRm*ql+%CrJMoq#lH2{t361zm;|cnF%rvM1#b2 z_(WSl<KG|*;)5`*xQC5>=lnys@x(ikR+wEEu(ZoSYgUt13NwH(sNDuKpH!^zAG6#A z)t4zNg&9B?WG~E2P&xsXyWTJXJahvVb3t>WX)A>pKp12%9_=`#Bp5{Dbs#LQgX*7* zmBI`l46+xd8RTA=8kiX6v{0)AgGlR(|DZG=+6tPn2c=7pxga_MdbbS|9|H@B|NlQo z27*C+2n&@2iBDk=X$6h1fpA2MFnC-HB#x>Q!kh9BaZeFU4XA7Y;Vq_uV7;*N8KMJ0 zs{BXQ3%XkebpH@c1#CPXcF#@>qe$x!Mv+#~97w@8h+fd0F`&D3Kzd;IgV-Pp8s`Dg zq+*acFgrmsXs#MWOE5t0H<E(VptdJS9Qm9aWW5g<A!oXP?)^#lF9dcw*ewoV5<X`H z;X%e!VQge`Kz5MohWO0l+@$36qQrs>u#q71zziY?*tjk(rHp7xKU7MYT2?TD(jcY| zki8F}a-^n1kZGVa2*QNYp$s#^evqA@yN5t+D-aFplY?ke2FSfhpx_7bk>x>lfiOrf zh$aS;6HXV9+=*-l$X*WUT}$)~C(wOOpu4DGZh_@FQ22o6<S(#@v|6x2^4tYzUI*PD z1iG&YqzB|~5DmkW<T;p~AX*O^SD-ux;)C)Whz8|35RJTN9^?j)7|6XLtdKkhDi<P{ zA#Mk|4HW4}>%_of(0L3P8`&I?d8E1lDbK~j=3_x-!ptW`larnl*bwO+*?f?_1yDIs z)6)(<k=7S%BCTc&3=9^65c5IiF|ZR~FRX#u4RRAmFX)acP(B3FZVZt7xj<`8KzvX> z1kuRyAblVV(i_1h((3R}2<)Ca(0iaj;vjiYJp;mo>KYq%h(ADjKzc#;fzH_j(V%m) zKs4z7TM!)ubsw@kNFNA;^nz$&Fgfx00m+@nc7W{FfZh>CYJ8?}kRNX#H-N$ygh>r! z&>dx<d)z=~fH16V0fjLruj+7$v`*oKlr5n61*rkuy#>0X48#Wc8AQV{C1nfDP7n>M zOF=ZKYyr`rvIRtg$`%lfUY~=+K<?cDy(<k={#CF;+zxgdk!1_a91u;a8z5y%PHK80 zq+~%48?ZZY5agu83NA!`K{gg-?*^zGsp$}84yY~%VM6u!8>k&1Js>+lcesJd2@nk` zCqOi)J_pgD;0Mvj@*sU64AKjtiNWNA(*kbX;dBEkN6&Bq-FpYR(+}ofSe^rg4=4>U z;1Ox%;DzKlP#F(WR{*;64I19);YCTFgV_n9L3JsJ2IV;r4a##M8kFZiG<tmw5(Bwc zg%?tvgUSUBZiw4KZidWIgL*t*9-IKJOMr1eeu0?-qDgfFQl6t*eg1(LcY1Q*gUFGZ zo;t)tT0wO>s6OYAgqQ&en+trz*9$dJyFp<K(hIul50no<G^joY(V+SqM1%4nh(?wN z=>uVqUJX8xR#2S|a?ctOgnK~ppn3*`3Dq?`{1AO0Js>kd_JQha5Dlu&K{Tj72hpJV z97H3_gY<zgNH2&c29r}h96)j>vK=6Me?a9(jZYH+^5YHU22l8dFsWe-y6X{iA125Q z5Qdd4ps)qy)jt9vtto<#vIP{sAT^*n3_*82g4iHGgJ>A0q-=rN38F!DDToG@Eg%|H zwt#3**#e@`>vND8$h{5FJ10Tqp9eq0?O?ZoDik963NUj(G^uWYmM!_^sYPHb(ZdET zh=U*}9eM~M@(Z%DAbT62a-^n1kU5~b9E1tg=X;=bfb@Xu1l@%RDknfRsGI=Np!ys{ zgMuGKBg=#IfiOrfh$aS;6HWza_j|(Z0ol6(Do4+70^J`9x*HYd4p^Q8g%2nV7l??o z-VlN0IZzo7Qs*Ec(h9mi6vPI(8$`n}C3y~JCx`~sr63xV=Rh<l&w*%Ao&(Y7^*Klk z<lZkLkop`{F8mOJxE<^^P^1%)=V0c5Xj0vPl;`MHpC1s#o$mz1AabOprwBQbR#2S| zsy}Z)@23RC^8zvA>jfXE-Jq}s=>^@H3d)Bd8dRTyXi$9)qCxo(L?g?C^nox)?+;Ot zR#2S|a!-v6#7`h`kUXfK0bxRQ%^fW60oB(adqMR%hz8Z?AR1JkgJ@)VkX;}QvlqlB zgvlu%CWu4)hi*2=-V;zcQsa|Fg8X;`xdRlwAWUi)gYL`)-75?-1B78^3n*+sdG(Bh zNUMn?q-+7jFGvmOE?Cf=xga*k&mbCxDJffEc7kY7T?(Q>WebP~l`S9|RJMR<^!gkm z26Arz^zL3z`6nR`aXZ*;M3yZub3inyZh(|61x4VElUT|zusd)N<fKChDctEW04hgn zIs`cnRF{J=q58ZBY6nOUC>?<A6b6+OAR1IofM`&C4x&N952BIfLHa-#q!&aJgUJae z2ef;VVfKLRt$@nWGn_#8FoW)xhPeZl=Rn~DO2ZB^BCRWAAbAc{#)H&>?ga+j!wh1B z+zp~(n36mPvlB#v>QWF5%5xwZl;=P+D9?dt^!gkm26FEa8AyE&Di=;jLEH{@8z|DT z<OB5nIm{doO{yD^@*Lgj^9i!J^W6ie9I5F^LrtU=RHuXL&lMUF^Fi@kAV++?AR`CS z2MT+TUeMjspnM3TLG?L^2G!>v8k7$~G_pKM9|(i=o{$x31=Z;w_xPwl%ms;q<U#ce z2otJn)?jfDsJ;f-3#!jSG^joY(V+SqL?g?C>;hq!y&yIrOiuZbAP?~$y4fImXF%mh zjn6Cc<i{Jx9iZ?9VN$~weD^ps4T8*pl`WvK1?AN_3L>p6ijcAe6u%%fpgXlecaMYE zAU}g>7^b9bf!PV7L3JsJ29+%!8dSD`Xi(V#qS5PfkQm6l3eY>yLFL~IIf&cAZX>d6 zftdrMNp%CXY$?r42JMc-9A^Z(0|!A)I((ssI~^)0LF7nHhal&H>T(b!RG-H{?EvWk zr3292?4WW2M1#r+5Dlu&K{P1%K{T>FNFNA;^nz$&Fgf8QfOg+J%pQ=v9#A=Yh7;&M z`xvCSgXK9;_<+)|fQm?Kg$g9kfy#K0dqMZBgYL5ju|e(z(J)L&o`cy5qCs^jhz8|3 z5Dm(6AR3hCKs0)N4iW>ocZv$6J_nTxGn6212fGav=|t4$FmpgOsct~Zb9AfE6I3C2 z3+zWE0u(PBpmL<9rysf^t)My`RDV_&K+Ff3=b%P>z3>KVH^@mKy*1GL<v=v3J_pgD z`W!@q@*#)@<x>z1k_YJnVUXS#sv@nRIvwO586AXsK=Pn^280RKH8pAweIPv`GeP!% z>T3`Us?R|*s6GeLp!ys{Bg=#IfiOrfh$aS;Q$84|BixB>2gu$Gs2r*BxkR1(cmufs z6uux#Y8Y==D%^Sj+WrEW11noVVGGKuIT|9ZS2Q4H3n+d;YC^O{T3<l*fcy*+gJDX_ z7MPtN8dR5pXi(V#qCsT~hz6A{AR4_s2Z@2)`#}Rzwt&jN9cmD_gWX1C*#a{MM3d?U zNZFE<lb8oS+7Dyx9oQW>2y)Wl4o%$Y@B>ti)N}}P9;hw{VM6t}juygxP&%lE-rotL zLFEL92G!>v8Wj8>8dQ#eXplU}E)WLk1<}M{a>D5Wk~@*@0NE>{4e<j#!|B2@;Z_}J z{D9m8%X6S`0j1#w+9ItUI*>dED&s+FHt37AIzaV++zk?gVM_8G%uWyus!KsMD9?dt zP@V(Ppgaen(d%=N7|6XTI*>dEDi<=eAZ`b{4HW4_)aNjBKs2dtK+1D;tIrK|A!!Ee zM<fCiFAY#RQq$83Q;}9soeru$JuD#RgUl1qBfehP1GO9EB#_=ZXnhW%LG?9=2G!>v z8k7$~G$<c}XplTe9|(i=X6TBvg6edTd)^o$+yjya)iWSWsIKwRgXjb40htN12UK5! zXi$9)qCxdJhz8Z?AR1X7qz{BadO<WXn4I!~K_B5xWII6iT0rGUjn5K&^5YHU22l8d zFsWf|u|l|Y0kr)EG6z<+fWj7(S8WVLT9+6=$`(-kg4C!Oi?r^5>H+x~BnHEjlr1nj zK{Ti?1<|0g1w@0&77z_8TR=2=eGU=>x%Yqpq-+6|e;s-dw}ahAWZ42U2Sk(V21wab zT#%Ryxz!#$Y{2foL6DOUI}CBB!vjz`Qqv*Gd7!!+gbCH>f1q}N^nm<Y53SEZG^m^a z(V+SqM1z7KM1#r^5Dk(C=>uVqUJy+TCMTRW7~u}57f?BRhEv2!;nqLUJ{ZW)usjC} z7f>4BU@X!qVFJl>pfVn$romjKRR9{^=;1|4o`cy5qCs^jhz8|35Dm(6AR3hCKs0)N z4iW>o*Te*p=RoCxg%QN<AU6}c9u8&>h$htyNO_KK^*Mtn?(`G@l_NDh&9D_|1=Z=G z`cuLIVm>IIAD9wfFZ4j|28BIHZv(VG2hpJV8bpKYa}W*6haei14?#3Y9;6S1L3%Ar zMOs01I><eHtP$=3$%E<{5GGXD$e2O&f%JgP1la?suR%1ZJ_pgD`W!@q>T?i{EDzEL z!XUjMnixz@`EUWroyc~8?By_r_<_{;bTKDC-au{ug)az`8pa1!3AYxQK->&62UfO# z!WNWQc`QU)ODrH|3n+d;YQ9*Bw01!Cfcy*+gJDX_7MPtN8dR5pXi(V#qCsT~hz6A{ zAR4_s2Z@2)JHY}{wt&jN2s4P=!EOUpC`9xXVCH~mQr!S4TS^NG=(HX#!V(d0U_U|$ zP@GJF%8{B5K}LY;au6m|pPzx+0n!7qvk_XKgJ@7W0ir?mIfw=YKZpjEBOn?i57Gz1 zAiW@(7)(xnZLq=}PCKA-^bDs5tA$(7K>J`IKg04IC|p2kxWQVa^@TMg&w<K#keUE{ zk=6%LJ?P;@NuGn*38F!DDToH;IS>uXb08X&=Rh=ieGU=>xtGNTlIK9>0*4jE?I1T3 zTc5+s0nwzo0V&VXtv<hCgF8Jb*h1t;O-~uFBCVi09aMk5aEF)yisucs#McWkP`g24 z57OHNt<OO;sJ;f#p!ys{gYqGW2IWH#4Uz}x17VO}4qK5{P@N8PPmeRgJs^2dJp;mo z>Y6uL+yknwLH2>_a}W)x&p|Y(J_pgr@*ulF7~~!hO$;Wdd{|%y@gKVRAbW2><w%WB z5qt9E4df0`_<}I0VeGM1xYYqEeZtBXP}qX<>K%KLRu>0I*#e4RkX=WdL|P-DdO&^# ziNP=>Wedzs5DltJK{Tjr0nwnc1w@0&77&eIpM%6e?oDujlr5n0Ps0x4cCgz(6$%mc zIm{doO{yE>bCZ%w@^k32z8zHGYB=IfhY3(QQqv(QtUzXiFroT<4%7~i9#A@Hk!4~4 zolOCveHj=SK(rl{2AydE;v>t0^nox)FNh`vlbT;a{s?fw9ZnrkIeLau#ya8FInX{B z$j`7m2MQn1Iqw0^BCR`|A$bl|#)H%-xQn!Ifa*aHFG}(p%uWyuD(gWsD9?dt&;>al z8gy1Th(^AX6XXVv7|6X>oFRD*R4&|bgt#5#W@77em^mPtR5u{yIl9#6p!BrB1$TP- z0F@&(Jz4mQw1Vn%Q2n{XA7VZzj2m2uuNQP&A^JdJ57OHz%ftZ6halP?biaWt<d9ns zACwP4G_pKM9|(i=-f$6V1=Z;w_r!QZ%ms;q<U#ce2otJn_F!=jXyg)PFK9**M1#(N z2hpJN97H3_gX{ufn7tr2AxuvBP~ZmfAG+Bfdsjf^NR7`YZsf-s$Q_{Y1z}Rd_`-VO zRsm=l1epUXTR>q8%BySKMOsBXAY}_EenD!cc!{)XK=pw93=)H3O3D_Pogms0n*Km# z3y2RYTR=3ZYyr`b9o`UIL2dwvf!u500V!KR<=+oih}*%ch^)_H=74BY-2f?D=+i$3 zl`B6yaHm59Plz0;=@1lFAhSW3P<@^QwF9IF6bEh4`W!@q$_Wq+s?R|*s6GeLpmGF6 zgXBT_Kp3PKL=%I_$*&4tkgz~EA7pO?RF0nE^kIW=YYtM}!SWm^TtI19!CR!Y!yA(4 zKxI70-5>l!S{tBxK<);K!7wFx4rV8a2Gyk?8kFZiG$_x3Xi%O5(dhL#NDSoOCEk!c z2Pzj<ctYF`b{mm-4rUIBCe;l{d5&)Nd4Uh^^mG6!M{0U{5Gc|Ls?$OBr%DLKd{8_G z_!3_){DImH3VV>=c4&PLqCxdJhz3Oohz8|D5Dm(QAQ~hO(g(sIy(@e~T0wO>DE}q| zAlw6z2h}qmOsKBu@rCFE=>eGuvIkUOgJ@8F4x&NzIfw?;=O7wc9;6S1L3%+nF_@h4 z!NCvVPGmbk_EtdUNR7`ee&oj+$PJ+I1z}RdIAW7<>jP-}3uF$gYypKWD6iJ|i?lxR zhm<X#_ywtn2^MMn0o4QYGe``EDJffEc7kY7T?(Q>WebP~l`S9|RJMR<^!gkm268V$ z0HkaIm47FEA#Mk|4U~|H=%2&P0nwzoK{+KgEi*4wA>P+1I3&o^&pqD7)y>n-)kOj9 z0`U4cj?KcY2X^y-?<0kXLdZ_&eW?eac?Tp4%HJTmr5K#v7(r@4;}jrTnt_4A2C5de z{|7xTKzfPAAieRvPCl-VE+IjVo<1<A!}NpYLFeBk<)kJ;FINVM!Q=_iq~<g5`FDX} ze`6R8viAp6j?{d{5GK+JDyu-{W<vzTe2{q{OF(TH5GK@)F$sd`1L*<j?UiL>aAaU$ z0MVc`<v}#)J~R+*4;4q22k8T0kX{f?3??W1ULd&>*$$As3c(ORkQ{yt3=E(!0%20a zNnnd`s|+;WK<<H+HK1?;jjg>17HJI#fs{3%I0C8J5iZhd0M!F>H%JVIDJg4Uc7kY7 zxdEa<Wetc1<uMQq8Vdx`pfPEfogg=W#6a%N34xR~pz^RF2;z3IIwH#&m^mPtR5yU< z8NhiF-i!g4FJSwLAjnBi7NL+dgKj)1Ogf-)q^73}u_CRYJPFE=0SOTELFP$>5nmr3 zf!Ymn7f5fPEE5ALAA)Gm91(~HnGd2t`4B`S%Y*cRFi3Afs7NcQZ3R;QB^u!#kUXe< z1z|#UY)BYHA4m_#Optw`b_<A3WME(b(ScAJbe|N6k1P+;2f`q|AetCVPJD8NBixB> z2gqIrs2r*BSrblvyn);R3SST=HH<5^3b(F+wu3?Dz{(a-*n;w^ON2=4ng~eQ0*YUd z8l7m7)&o#IAU}h|V3?A!1!gCR2HlkaqCsT~hz6A{AR1J*fN0RX6U<JK8$e<p_nwG= zlr5n0Z$cQv?O=68mMt)IKs2dtfRrsIMTwb^Ru;%zV7rMR$VrD2B5|j~6Hqx)(;>*I zpgIbK3Dr|9Q3(4%e(i^@8vxOuvL8f))(wDYQ1F9j(0nC`2FZi$0%4F|5KRmwC!BU5 zxf9tAki8$Ea`X(R8QX+gS)lO)at|!efx-ophId4Zv?|0v@*Jp)2dU|Z7ipD%>H)bM zBnHEj<T;p~AR07h528VN4n%|U9Eb+xIS>u16JU0N+yD{-xz{EJlIK9>f<qL<?O=7F zNGGE205b<flj;VfJO{7PL2d)vPXs|udg1`py;#f!*&6|sBQ-tA6o|AwNrRkod!q=F zuR!L#h$X&Wm;$vM<TQ}p3D9)|AR4qT07QeveLyrQAA)F5J_OMqd5}I32I&<@5@`k1 z>7e?2LJGn?AbC(d1Hy#r8kIPRK9C-enIL;W>jFSDsQd=epmhTv8nkWzL?g?C^nox) zFNh`vlM|meklcxE2gqK5c!(cJjZdF=^5YHU22l8dFsWh8utT`DA_n4SkU6lj1r)ZR zyeg6)(pr-MDO*7C3sQ3;S)_FWR1e6{ATb!Gq-=rN38D=c7#Kh_sB8hzpt1!-gUS{V z4H}n%*$Hw3NDSoO83~ZG1yuee#6jE+R!3yn0y76hlj;U=*-}iuetSY9BHqA$gc6|e zm;sd|H63bz^6_4t)`Gn}tt_9V!FM2l%!3+@LS2E{0TKkMnJ5dnZyZE}hAu!fXgm`{ z$1*T5farKA4Uz}x17VO}P+11*qkzhf1(^_kfy6=bAh&?<nVXRD99(xYq$EM~f%Jg% zg6so%07QeXLk7`#Q2QI8bQ6>Y$%FKPFi0<mCI*vJen=!E+=*-l$ld^`9I5fvlPm&` zGf+5@8gC#sfb@YdsbQS4Q@HgCv_A<l2UdQ7!WxtxLsCRq_oP6|4^aGq)ZEArX?+3J z1M)LS42CHwKVWu(Xiz^NM1#r?5Dh9nKs2cQ0MQ*V3!&`|kQm6lH&P(w2dIo&kOXl% zSSgX^2h1E0O{yCZ<p;cJLi4ePC8@a6;vJ|QscA7Mjrg=Ek%q7zlolq*GBJS4b`YJ$ zz`y{aL31G>8dP?GXi(oCM1$nPaRZIRHx(kSJ^7F}QBF0)T#%W6klaHkeXqdco;IjE zI-zs{lm?X@Aa{Vu7!VDTM|O`xtVk=UT?8uAPUIro15yL3t3eo6Uo(RQv0#gIh(3@M z$S)v!=0ojY3Z<t)>A6rESstVhgh6^iG%=W*GVKkLJCW@G*{hNP@dK&pC?SLVbTkJ^ zFR5`3az7|;K$z6{k=QNVDgw<nAah{lAt>HJ<x5JYNb8wQNO=fK8z40dxgxDPP(7gV z0*gTjO3Fi+ogf-CHUXkR<spa$m4_f2R33upWl;M-6vz!AF_3#-WJ1bAP?=ql4skn3 z4Y6y&VCH~mQr!S459v2PvLOqSPQm^|B0%Bs0xCyx8qOv@4Xb1$><8I7S(b?b)b9b& zp!ru2?Zd#p0HWidH0VAl5FaEDb23OThz+XGL6}hbpM%9-(8L+YTu?m;qVu8lf$qKp z@tdK1kUYpP5Qf<cViUsTlraH0i10x+A7pO_RF2g6Ig&$u{D9m53SST=HH;hf2)C+0 z(-g=YSUCX-TTs61$rWk+k_#y(Ky71?8i68_Rtu;eke@+fFic4~0kacCgT_-pG^m^a z(V%hyM1#r+5RG2Pfy6-W7082>6QHu}MmEIlV7C$3Zi1NuqDgfFQaJ%{IH89R*ey5+ za?;|RJlttfBp)J2YFb>9PkdSofZ74_63DMpWSJO1eJT*0&cMI`qCx9|Ks2a~0MVeb z1Vn@6LHa-#q&Fl@q!l!t1Zt-UltbJO5;rM8xQ9^set^Y2pgtAIzAmVH3ZXQp>;Q>_ z$`}w0k_Wj3ghBR#+Hjz@6KIVKbWR@L4hGf9AWW!UE+~Nb17;@3o&`|*L3JI7KMl&C z2c?naLHa-#<Q@=B3??TXsT3mIiEIbR-WaGHsp)7&AtK%g^##$>(G?`Uq{cbO{h+u3 zVN&DAV4rZS4^p0jm4~2s0+lawibPsjiXr78C~bi3@+cE&O@ZnGg%?N+hAAlzVRnLO z&=?Si29<{(8dM&FXi#|wqL;%gg!Vx|Vj%Y_6hq2GP?^1^0OEGAQX<Pkm^mPtR5u{4 zkHJ`H0$m~l&QA~a3Ag@%u5AIk4N6Rfu90~HSq}pi1(gpV#+(!2^vVcQ1G<M4M9VQS zFvLLBQf-Y4XbntqMrIMHvj+`Zkp0A9a`NGt60pB8j0dHwCr~+3^C8GE(7YH36Pg=S zC`H&0vU3)6tqX_-&7p&6&{`J|4O;60qCs=)AQ~hOvI~SkdO<WXn4ECBg5*wQJ3#jG zltKJJ&u}`hU$|8P8b2WSz{(9!xPbEEl`@f5n{r6G0jgI(YL--qw3<NmfZPodgJDX_ z4VaxE8Z`C;qCw>bhz6A#AR1I|fN0P>3d~NB8$e<p_ePXM$_-H27E=mwJ6Ii&<p#_g z5KXEZ!0jk-o`W}|z~uzkej*5R(vwOBB+Z~34+@hKs2r*3X-|VlD`+eT)Sj_vhL{gB zkEN3MIhGAjyFu;(>75N->jI)d^O_(UWIl)n<wFn+%7-8tBoERD!XUjd6(X&mHWo<z zgF1wJK=Pov5`<y(C9bh;hf0V(kRFhkAbUV-SwJ+Xhy>A~wJsnUwAKYgBg=#IfiOrf zh$aS;6Q5s@+=*-l$X=Z)h#yFe&x|Va;|=5nQ22r{sbQ>fP`Gspv^@+m2UfO#!WNWQ z4XQ<2XH-MV7Et_x)JW8cw61~b0r?pu2E&w;EigMlG-w<JM1#r}5Dh9@Ks2aq0nwm# zKFm$e<p_im|%lr5n0uci{>cCb1k%NCe9AevM+K+2Zv#1c?qr9*vQQv*qBVE-Wz zpzzoNl_NDBf{X#x<seL`KK}r<1EdFJ=NxE#4x&Nj1c(OJ=O7wXpMz*nIRc_V@*sU6 z4AKjtiNWOL*Cn;M!|4uGj-KJ<aY(rJ19a>j<Y!o(1BDAH4KJw^Y2~Sh<T+3o4^mUo zB+|+P4R7@Dq9o73>;%!Ex)el%@*Ic;<v9=y%5xwZy*>wtf!wQ656N?&azUpS;&zam zi5)+MnFFFpbps;L(XT%LQja@5ximoJNKH=@Iz(DQbvmg26zGPS0gC4<4aC<A4N$v5 zVGq(f7h0c#Xi$9(qCw_^Xiz=`(V%<?qCxT?eIN|dtJ5IT3aZmV>bJBZ+yjya)iWSW zsIC!cgy;k50htN12UK5!XiyOeqCxdJhz8Z?AR1X7qz{BadO<WXn4I$A2$DOI?Eu;P z2P#Kud|EV-A8#NxfWjAqNe$x-hlN{HkkTitYypKWD6cX!i?n7mL&_FV{DSOy(<;(h z1JwiaGe``EDJffEc7kY7T?(Q>WebP~l`S9|RJMR<^!gkm26AspGo)+*m47~s5VwQf zMr3^sGY3SI>IO*JQe2svln+_FN{2c<paqd<!2X01pm^zk%8{BDK}LY;a}Xv}ryqgZ z0n!7qa~`w|0nwl`0z`w#1P~1>LqIgB3<1#~d5}I32I&RS#9(srY(*>XaM}Qsqh~l> zI3nD70NM`&`5Bh)K;Z&P#}#cNtq<BD`3_XhgVcC*iL~B;>Ol`LO7b1dP7n=B^B@|O z??5yt-+^dQz5~(dYaBshAou=hgXB9<*}%{WaXZM(#MbFBb3inyZa~g=uv#5Ge86tO zL6DQ4PPF4rPZAvvIa1S8%mk5EP`wVyFLx$E%mDdgMF;V9LkQGvkXJ!^=gTrNfbtoL zc4uH<0MQmu8k7$~d}Mi$J`e`!W#|xT1=Z^y_q6mO+yjya)ioeYsJ?lE#XX>PZy<X? zYg#~bFw{Mux*WtumIv7d!eIA+7(`%l;&VnP#DD0<gY3Nkl_NDidAi7tH;_9(;S0i~ zhOxyl;Z_Tz^a(3lKw%5Yt5>>2T5Y;TT0wJQp!fyZwWn94H2|sy<Y$l=3{z6J!0ZIk zhR}Ehl`SAXsB8hzpt1!-gXZdBc7ogh5(Bw6q8n1SfXY9GPKevV>WHk<Vdj8nQr!S4 zTXI0t4PYxl?gBH2AjnCF3O%^fVFXl;)N}}PDyS|8VM6u!6sR2_Js`g>kY!>3^~FIn zsQw1gMhpxLAlep6Bg=#IfiOrfh$aS;6HXqzxWlOdDo4+7ia0LZItAJf1Nj-2=Rn~E zO2Zy~BCQ+xAbAc{#)H&|OcH5b0o8*ZUX<iHn4KV68yZKTJO|=~@*Ic;<v9=y+QR^H z3kZYU01^Ya_e>uo&w<K?3q26GgVYdPpTo=n(WJTomgneImrv=(otB<J<w#9S8Z$&% zLG?MP?p!eoVm>H*OC}IsCn!vS=mUj2Nbf@Eco~QW)!iT(G+qXxL3t2FgYqbd2FZi; zfiOt#8IV6ZAnQN_ra{aFiG$=pbqoj-s%JJ}aSx~;4zdrl4i!X$&gKBo;S3B6AR1X7 zWETj->;<t2VRFibl!*}kp_>h|cMepJ)cCwHk^FcAxdRlwAWUi)A2=c0$^nWykRc2V z46t$q6t<vzx?qw>E5~F=xdLjhfs}Pj6={`$>H+x~BnHEjlq)bhK{ROG4Mc;=6%Y+7 zS3oqVTmjLbwgt>ikQ+c^Aor?FhLkIyvhU3Vh}*&Hh^)(D=74BY-2g3DKurL!l^}P4 z8AK4|q{BCpai>F-DG)hQ(;>*Ipn4pH3DxBZP&+_+Kz>~Wt;<0)sGI=Npt>AHgX(e+ z4Jt=KG)Nw#4}?K_K{PR#oNyAE3JD8z^Fj9dK;`HeP7h8Bw<aLP9W2j*!UdFuMW%_g z)=Y!sIZzo7a`%IoBCRD*Js@|3#9)|`JO{HAM1$&45Dm(6AR3hCKr|@NfoSx)93%#E z?~G}XJO?Tl=1hUO9qcwD^Bl|^5KXEZV0n&Sb$P;c+-Ye8RF2fN^ku$CE2usP)#W9N zAm)SO*kK0ob;28{-Joy>>0J!1%Rw}#t_IPdx*SA<@*s!?<v|b)k_YJnVUXS#(?wcA z^*P8rGV>7b0m*~v7!W2@&(zF-=mY5inF+E7R9Ay&P+bn9L3KHZ2G!*t8d)Bs4}?K_ zK{PR#oU*}SCc>S_c7W{7fXa~?pG#(vA8#NxfWjAqNeyF<)55J+plvUZIk0jC6t<vz znlnqJ^~x+rxdMt`keZOWBCRi=dO&^#iNP=><qFJB5DltFK{Tjb0nwmx1w@0&6%dVH zmxIJW?)@+eQm%l?z8y0lZU?)K$Z`c{4u~ez4bXB0RDFT1L=PLVAP$0@bhu+S?sWJ8 zDo1KM1UU~>kApCwx?E=t!hVonmq6=s5Dh9PKr|>YKs2Z>2hpH%1Vn@6L3V*KNH2&c z29py`50Ko6YzN3*iMbFz&@-Ge&Iq^aK;sAG9$20Og$pPRKbR}h>M;+J=RjpVNX?ps zBCQTkJs@|3#9)|`JO{HAM1$&45Dm(6AR3hCKr|@NfoSx)93%#EZ^}GKo&%K&8FL_R z2fK~PJO?ueM3d?USe~O-U9K}9l3u|6Ln1(NQUjGEH7%W3F479B&p~yk$0~^VAoF+@ z5ML+kfZ7dm5=ie-Xk8AXL3K5V2G!*t8k7e?G$;>(XplTe9|(i=rpy;<1=Z&u_q<t( za1TfxRL6iYp?bz+0Yo2256DcAJ)pW8M1$&b5Dlu!K{Ti?2hqs#AblVV(hH)A!Q_+; ze~{dXYzN3*lZ6mJkQ$!_3(1c+kQ+eZ3&Ny^@rAR(tqY)SFOWH~as?E&pnPhvNThYa zB1pLcieHc#m8BxBTcCPCeg=ubFeT**%uWyusz*UIs9XWjpmGI7gUS^Ujb4|7#6a%d zvj|eIfXcp>1rWD`-9}`&0y76hlj;W0xwu)G#U=S!xy4{RX*_QZs&6|ML(&_}J{S#( zmjh5aQqv;H43OC%OsGEp1GNLB2W00mStbV1K1L7?+M@)bL1hPs_F`aQ0MW?uAblVV z(hH)A!KCI{kUuso!5vO7pmOvKrw`|ZTYo_NU?4xk@*OCAK<RG7Qju1PWsrOaD(69J z8di$53P8gfJ-jH%cQ89aG-ys0M1%4jhz6Y*3!*`1#)4>2`3rIj2!q@J5(Bx{WEmvi zfyxGpB@nlR)DSz)4l@Ttlj;WKd`FKu9h9CJmg7!O0Z=(o)6<;wBCVi$9aM+PY=W2% z3gZXMiLV=apmu}89;A1<EE5ALAA;xr1_lNY4XVRIG$<c}Xk>YiJ`e`!wOB6F3aZyZ z?m4g);U17YsICEFLiLTz3Wz?C9*~(J`#@(qfN0R-A`lHa=LtlE=1oB~vOGv12!r&3 zXksuq<--LecOu&XvX^5e#1Ev#r^`z6;|=5nQ22r{sbL&(LAbSG8N|&Xb6{l)C~QG_ zm1mVmYso4|*#e4RkeVNBL|QwbdO&^#iNP=>Wedzs5N!obf1t7j#0QlvAR1J*faqM9 zh0uBvBnEQtgjJBT1yue;tbn*3tdz()9cB)QCe;n#vLzQ(r)ScwPLElQh&!-9p#&&i zra<LLO^YBSK;;$)6ROiMK<xnO0ol0%TBn0(P+0+@L3KKa2G!{x8dR2mXplTe9|(i= zf@oqeIeE5a4eoH-1C^s^I8|H}Zao9-i-G(M%Xgq~0j1-XwIZ!=)<W_fsGJ9>3E3#p z`UI*6J-jH%cQ89aG^joW(V%<>qCxo%M1%4jh(@o|L1G~Ha;$^oJ5brcvj*aJkei9E z(_!X-Xj0vPobTvWr(aozJ3Xnahscqdo^rN}w1Vn&P#yYaC&Ua;Ja1V~eBF=$wHp-n zAiXQ0bvlR!)#)G_RHuVzP(B3FpnM3TLGmDdAPmyWvtFbXRIh{FGhr*jJs^2dT?4{| z>YEQ(+ykn!LH2>_bPx@y(?K+-P6yG*@*ulF7~~!hO$;Wdd|0vp;y-lrLH6E(%8?qM z5*x{nH;_9(;S0i~hVg?-!mTby=@VAAfWj7(S08K?Y4z9yDO*7C3$p9P7LnE%s2-4? zL1HjWN!bFk6GVgRQxFX*TR=3ZYyr`rvIRt=*XbZJkb6@$LCO|T`KPl1;&!mxh^*6L z=74BY-2f_EO7iKm{~T1`>TJfH4pX3Vq^3hqSb@w2VM6u!0;nAzJ)m^3N|uQMRBwZ5 zP<a8OL1XP8+Jk|C0YoFqgY<zgNH2&c29uLtL$=@!ryi&rJ;RCNig4=!Xg>_(XIP#C zg%2nVhinyT-Ln;v=RjpVNR7%)k=89xJ?P;@NuGn*38Fz|H;4x1IS>uXb08X&=Rh>* zOg)fWKp5l(kQm6lH?~6Z9H?Blvl-%ckQ!p^bC@|Gnp8I+@*J!-XQ1i+b5OomvJH27 z`T~_BH9gtv7ik66=^+2_IS4Ty6vi#viLVz7wnOxR!XBh|HMD&VqCxdGhz7N<K{O~I zf@n}a1<@dRkUkIw>AkZ}q!m=BgWQv_7h*0*93&5_XF!-xU2_17dqDLz$i6HF1_lrf zI+GbhgZ3+dXk>YiT_6mz7sMun$tfR7c0l}xZZ^o?HBdQH<MYK1^5YHU4p8`lFsWgj zaaFig1eyjx=D^ApP}qX<>V};ntrEK+WeX^NL272~5oy(d>H+x~BnHEjlr1njK{TkH z4x&M23y21lEg%|Hwt#5R9bzy$L2dwvf!u4d3sSa#%D+F`A#Mk&BeFh+nFFFpbpxbq zq0jzvP`UDF7w&XuvKt~tYB~gk707H5CRCpnK<xnO0mZ=@XnhW%LFEL92G!>v8dRTy zXizx<qCxT?eIN|d3!;g^<m6YCJ&>?KHy>ng3{;Mu;nZ<WxU~Q&?qGQi6fU4Ntg=_6 zwP!CR&w<K#kh{Me5NU0J>H)bMBnHEj<T;p~AR1J5gJ@8m1JR&72ckiF4n(8Z=O8hV zdspm*<T+5eux2;J?O?YNnde~UfM`<PfXH+7tItdJ;Z9FSpmL<9r;@`Wt)M#HhJk^h z=McnvP&|k1C%#@_*bmVM3VV>=wb1$;M1$&U5Dlu&K{O~If@n}a1koUQkUkIw>0Pr= zq!m=BgYIT<KynXA9#qeOFrm6;0v7jx>T8gFp!ys{gX(h-4XV#UG_pL%E)WK}2SgKt z$tfRP4j{q}*$$AsHBdQH<8#LW^5YHU22l8dFsWhu;kt0^6KMMjWDcxs0fj9nuQnVM zX?<}JQnrBN7o;ZOl1S?xs2-4?L1HjWN!bFk6GVgRQV<O)TR=3ZYyr`rvIRt=*XJNH zkb7AULCO|T`FCbN#O+|W5m~mt%mLA)x?z(n6S!{x+D~b-4RS94D0~VMld}~x6bkYS z6g0tZfzA_za7(xDkY!@XS7KriVP#-Q(c%K1!vWF*QpW`%pm;0PY*0RnfaWi#6xdGW zbuA!qkQqwON+2d!{?8$iR?vCgyP)P|D?!`}QUFp5qKUz{^2>u<CeV@NC`N$JjRIki z;GRPwt%3{;3@i)`3>Tp82ie<mSfmx?Cs3H(K@#scBGL*f<3Q<Y$ze!-1F28ADcmZN z2ni>Uxv=!QUzUkMl7WH2=LkeCNDgE+h+cps2I7M-BM*o~;3wHkEiy+$S`Q$E;4F~6 za1Ig!cCH|j5SR&44|5NQ2AxF+qG947t3iB_dqFfv9;^|XE?SO?w1V6Y@;l7!AiaBT z3b$%t@%sU&-#v~Z{0<5~kePFk#6WxyM)!L|r9_LwQR?{}<{l6&&%nR{qCxHl(ZWzZ z$nPLNNFL-S5C*AfI405xay!WHFt>xmC2k3~T43?}L8#wdjv@RG3O|r}GmykUd=N(W z`-kiNEh5LL=XaQUKs3m2AR6R;5G~5UzyP8_eh1MYd61hx7^J4=xJWC=?I6Fy+zt{i zxh34{fyM8Kpni8aj_^Au{6OYSK@tP;K^U9g1&&kC?=bg(XprAPG|2rR8sv8n4e~pP z2FZim1i~OS7AHkoL2d{69p-kB_=Q`-tr1xKei-U^8_3z8AY&Ln;Rj}5A<+E}>aXye zpq}4h?g7!DGe|)+$o(K%gn@wpM1%YeqCxU7CxX<#&qj?8arSTwf?dB0I~EmOe(T&8 zZe>6U2blgN&~s7$AcX@cEJ5-=PJ+_~BS;OX9tF`LH&j5?!pbj@8$jyG!63a;PKmUF z!X9)sGW0A~u$$w3o#K5R1L9pggIt|MAf|)V$Co507gWZh%uB<>V6AenI+x;-;LNI2 z&phXh#3G1tusFIPwA_pj2!&UJAa(F?4G48sD9tO*OwUVAQAo~6EK<;dxCSzo*K<d> z^#CNSV8UQ}p&SzfCj$dR#3^t%GJxtnkY7QPFCb!!AT^+R4Mc+?>;lvrYK3jfX^~b? ze1gIj8lRA`bw+p=#jhZ7h2;Fa;u5T02C22UE8MyU;(m}<;CK<#zaFO%{sq|&Qg8$! z#t2da@-K*1V_;y|12u<Q{!KU|(h3S=kbj|J4DoLOBx*tKN5rc$N^FAU-rN;#oda<z z$k}kb80t5bGYG$d>;fs+0uf^bsR8*7M2j;pFsy)@LoL4roE2#Wg(t{w(C~!#%{d6_ zJ4kwj`wt|p5bx~o7aS5F<Qfth<cHzk3HO9sD<JL%c?FJ_K>aIn7U5rz{U8N%AYzOl zH6Z_jXi&Sl18NSn{A+Peq!kp#Apb(c80ufRcfovwe*>JMNf#xPg5uTXzHn;>#N8k- z!0}S3KmS1GKzS5oFGxYdIk4XuL25w$1ks?fw*sn`TK<$dFVYGMTaZ7YVGH(Ge5fbL z8DKWtkD;E3e3_Y70#*Pmzdqa-ZViCA872&-mqGpb04fLaBgjsW<dvI}pgsd5NDau3 zAR6Sy7^qrm`O)OONGm8@L4JgWE7)Hqmql7ZZsBHNU;y<CL2d%YS9~#Kn=gnB5+eqK z{Dn^)BRi_>i(S$!7tVv@7*zrqo(dNra!h=XeD(i7hB6ERkb7r9^&v}w#5Y_JX$9E{ z!ah)YLE^~jVC)zqGeBxq%P}#4dSf6OwB8#;gW?Gr4U&hM1JVm(b0C=q;={y2?HCYt zNfQS5zhM0>kQ!wC21!3iFUVfdIZq%ObhrwL2JJ^drjg}gW`Xp=*o0_u;&Z`8NSvXY z4YKzJRF2g66uCrxyn);S3SST=HH<YL3b$&QV)j)*VGIhJJC{USB`!n8RzUd+WLLm7 zk=6)k+5+*xSODaE1_nL`1_lnW0CqwH8b0W<Al)!KL9`fXZcGl+{|E6w;|$0&B<Dg* z0qKRXAS9?ffw=)BXL4Pn736ks{=Wu^JCHa;HDMAI4)|1|=lLgDOf5$)L+nA<2eMb> z3Pg_7G%^FK57|tRc^j?}pLPO}%mC?KBge!5%F7@c)K&t~pneZF8YB<18>BbB7_^%Z zQf`67|DgF9qy{7oDvLn42WmIY{124}=>h2lxdCJYhz9MI0@0xHGi)?S9;6S1L3%+n zF_@gVU2qi=f9U3e?7ab%BQ<VCu8|*yAa{Vm7lcU-<0+4YTNTVP^FJtzL3Q<=Ya*=@ z*P;0z8ozgLi?sSc*&w^YnArRe4Ii)`Bmxw6Fgrmss4objVdDG@3=AMX$W0&`bl*8l zJ4g+T4WiNWf6HBwR!|!Nl>b3)2dP2V0}{i9NlhbL*73C*xsE%Hh}?k4k(x$&p!$&A z3G&C18zQYC8GJ1utTP!BmmqOubue}Sk{KX1>*OGJ&w^;s`a%#5I%5w+gYHTL(V+cc zAQ~hOGY6zs=B7yNA2ff0#7%CBw1Ub&5O#sO2UnhdfW<x43=9k)`zAtZPy-aiuY~fE z<&oX9=B7w1dKiJ+bL1u>Z*AEJxtkX>&J5FwOc&gQ#0^Lcq!(l_=&l+Ny%uW!Y$&}1 zN`vl2g2{vQfiOrfhz5lbh=yU9I4EpDc*hPIaGMA;<_uGVLf^u4&mO3~2ch&<D7_0x zBg@0gg4qk><D<z*?^}@EiEK8=-ZxM=Qq#M}ZSvD~%5Cz~;DX!arx%dlLGcR0q{i); zXTq%-RgnA(G6yzq07_e+zHi1Ik=7-5pk*;M-+4S0Y4w4!L3+TL$g<c58ZTfyNCYU( zV0MCN(7kdX8Z<@-qCxXqAR6Q*5Pb+uFA|ply)1Ut2DRXkRY2GvJC&TZwL$$4kO+v+ zb62DlRBmjBwgX`_OddoNgK?#27aa3Ju)KKS4rD$EG~RpX4kRCf+@*6*q!rYr1kDG% zK@wMahdusa?k;%-F#|Ns2QmZX_AkF6egv^MK;=Pfm>w7n5`*Cb_eEMk@jmCSNGk}# z#6dL3eK7jVJ&{&W-3MB)0#gT*2dQc2!{1g1slkSM?nC^6O^z5bP?{h{9Y_txy&(@p zT0!9jnzyfc4zU{~Uh-17HRUQFxcmgEb-4$TgN0cO)SbBEACyNy`j9bb-V4MBnGeDs zHZlf@!OSO?hUo|C1+gDM-34+l%nXn?NS;_ffz%^oP(DG97m!)V^7z=e!Uv`Yy?+C0 z-z<3m32T@d7!9&F<`G1WiHCsM>}0P$gJk35E`1M!i?L414|mwRFPmIahykqpRr z2(bs79U!p-pG8_hc?Hxy?D>RSEs~KaOkC~(nGI6N2<wc3I1CI7pm|)7o+nUuL50B- zOb@<v4OWPU0F48{q*LAqgT~$%h)LI19*MNxc>uw47D=~&+I=whz|4cuGoWz{;)B${ z(lN0#NFNA;^!hx;tZzZ-86=O61<=wAvG&2#!OR2M3u1%H01$@N)wtS)9aOd#WH-!B zFd8HVa~FtB2!qlPJ~i0#ZOju$`bO6WvUdtpj?{d6;Rz(ofYJ^q-GIynnFpfLF?zb; zc}jlVgUklS9SD;ee=YCv*VTWXLc$4DSA*;UVNltigI?|lFoKqWf}}C<m8XdM`3X|` zK~@M0Cm0QqLoUZbd=Li7!_o<{G)Nx^gY<%Eaxh3QvG&2#!R!I)ElJHS$Vn_oRj^Sg z&a6s}FHwjG&5SD8DP-p5WagzRq!tzB<%5LdlT%WYa}?rBl8f__6HDTY6*M3-Ng4`j z3h^$f#U%=w3eiyQu{tP|FbeU(`K3k4sXA~=obyZbKpILiit@`9G!!%ysuhY-OG=CK zP;CGktOGF>L_v*-hw8UhsD=0j<QJI#(A#|=6|BsRj0-v-Z4rTYBCQ+VLDJ7wXxkM= zgVch|3dzVUR!A$&OD@UG&r`@RQYcF-%1lhkNma;AtW-!!1x>&trlsmBIOpdTXQreU zDU=px=B0zCZ$U<k2n-4*C2|7_+K~X6fk;xM2OCJg62btesgN;Gh0MI-lGMZ$J%x~b zg_O)<aP+0578Io>CxW6?N1?PhRUzIvC?r1E)j2fCHQvuZKHM?L&(qI6SWh81HB})W zk_j?Wa|#sF@{1HwQcDsubBaMdF4EmPs)PIxnDJJm6%^ORnt-eB1?|lRnStKs>&Stu zJ%q`F)W9&vUL_hPCRm~c*+Xu2LSz9NIusfpAa|0V?-h`<s{*aV^#rFFRniUUE_IOi zaitrWJV*@;gTe{K2DMpX^$Uy!iCaMHAecIk7$J-+U4!xmx?WHl9p)~FH;}Os&{*h; zH;}pyWG~D;FdAeANE}2HgK@bBrWd`93mOA=cn`53rUpiX?41CWBX#XN#|KO^LFOrZ zK#Wm_K*u6L;xIdr=`&EfL1G{^urMK(2I&J~klq;|L|QA5%!7$<_&|JnItIy4ATx<| z2TUEvP7ns^1<~kX1QQ3f&q0__8~qKH-2-wHAxuvCTJRAwEr9F+`S%7?j@0xe@`?O( z6!3}sI0v~K6gMDDYW$q|E8Hq$i8)>kOCJ)SMOs5XgU72mKx24Qo{O}a{1j<D0WFt6 zc7rjI<JB6_um$TuB0%8|vy)gFrX8dg#s<-#u}Ro)4M?s$u_!MyFI}Ucv^WE{F#=f} z+U&D3v9vV9CSQ<W022nUMY{7#q!knvps^-USb*#VnFpeY!K9{F&{$o-7u@M}0aT9E zxfzMCm}Y|fVel1^jtR|0-htW;@;6BDemN!v(0yMZI*);Y0YroD`2x|Pu_zD?+EWFh zLGmDdAPmyG;;Tq&2a<U(@dICpp9ji8@)O8RkUgO8ABdg|bx#?T2F*c&#F6Dec7iZS zuf;c!R`f6ei3fbc%&VaK8>9~%|H0y(l~DWFL+QCt8dUFs+_M782g$?C1KE4xn@B4t zj9_9Q8YKSU8zOvQ`5!ip3Q~iNd%hv!9HbXy-#(~)hoSU#C=Hr}M3;w|1=0&*gTe?z z!!S%7v_}ktVf(~bVG7V_neUkHxe2xZK9oKWrLRM2WO<lzFneKqd^9=v?*fuLk<A9# z%kcx^2U7E&%MbGNS;G%RoD-U#N6!;`evqGje<0aQYFYz@8z@bHFsbPxgH^OO1<SlD zD1CzFFc16`Y5nsPTu(88<^n)=wJ?jd-uMiO8xS9iiL9q0@WeOFP7n=R(+HwL^Qs^k zG_MMxL2d%k55Sf}2vAyquplIQJw?jAY6^7D@d$Km3PyuWMz;qfh704$3xwuXC4NEr z3ZQ8klV6Z92HD&4Tci~f{-E(S7bI~JUhMG)bN2=oG4LD*Xsi}w2FSfJl49VwV-Wid zR35~J>4DK8F&LKkE7A&z_b<OhT0s~l4x&NsgV8>JL|Q@hIA~rKrVb_#Qqx1`ylToH zNLYZ(AP0le1hM)+?p^awq!koipn26BtdKASiI;GQqRgw#`3-RwEX?je-H9vyL2XHN zcMvoG1T&vl8fFK`%^<eLUx+(F?uD5F5(mi>>nD(UWDM%#BF78JEM$3nY+T_3(}Ui3 z1+~@wK>Ywy1EWFqZut-KAHn$<Mo3(O^n&z(Xksuf_rlr(=<}*a{z2S>%?^;*7a_4$ zP+kGGbq@$a+yoLQ#w{Q<xZDFX1AVLnHm_;}4JVKpFbva!Jg*8$Cm?y`v;yMe!pQTg zJlvw-GKZLS9m62jYVuD6j6w5bptdZ`J?M5RFhIfyT^zv|Zk1pVZT;{cWIsqPBRD(? z7(`oP{(#Y-@+oVjFarpK^dQV2o~6KuX)egdoRz{1APlk>X4(@z<`$UUFfm+o1r~Eb z?k!j;%mBhC7(o7m=nj}9&;qItL2WsR2yPOj59S6K4RUYZN?`^N2Kfi3`$M!W(eB++ zB#aThAajdW3NwH($UiW1LGFdw4HLsfYy1&z<za&ObsMxk2C3}=Eu;rA7#JAX7-ASe zeMV6K7c}O>(P~`-k}6;lZ3XEEjd_7EtnZ87pMZ%IOM}b?VNe>q!X(;y<&Q9YPYKKn zYS{rQUqN;?{1t|;8Kt%zAh+7Q;{@l|24+ZDgY4|)V_*nshx9W+{Z5b=G8TezWd1_d zP=L58P;*W&i?&)o%>tPd3^fPT9|WmG#xQdV{vgcJ*ewNKw^YI++6r?M$ea+UIiP+X zvKb&Y%$zwj2y;Me8y-=3{J_#3$j=}>FboqXmWJsA#SbW-fcOfmqOBl*gV-RqhC<y6 z>H~trkTJ}y0xXE|2C=_zi-OBRP<aS*3$@$|O0OwwLf~)(xdjxqAR6S>FsNHW{XdWx zGKRTz50YEY?1iKkWOX2RIMf_a8y&<)#@uX>)Ba%NIxx9CtfH+o4}zY7%+%o%Z3WRF zISqNyRuCV=hG9@Shs|t$XeG?Uh6qnk{{&_iC@qFS<qjZ~BOt%S%m$Ssp!PMWe*zjS zft4dW*dS>cREB^s$PJ)z7xZ|6iGyfR9R{M2$74WzP(A|D=;Jdo?2vR0Y8!$uNDXK# z1)CipagaQ=F&2<GD35_?(3lL&Z=iJAzz#{DpnVV^3{nFcAHik^NE{@OZQKMT4$6NZ z8hIQAWX=<I(N<8p0{H=iL25u_9w0fGTR=2S97JOq3jv9P@(qXvjh%q>fG{+g89;dr z)Yk=JkQz|khs_R<I7lAb_y$NEl-@x!XgmaDJ_v)xQ}%F(wu1U8ur<b@z7J@(Ra`qr z1uE7!$=g!$5>e)WWI=i(+8G#NdDvwo=+q353<NVZLull-Ge`u~4hPXN49c@GHo97v zI803lCuUpZ0Rsa=#Y$l?{=<RD8!)}Z&}*=m3)+8HwNjV?ghBQaV-C6+7A{Qpg7$3J ztQ2MdVUWG(dWhx2!W~9~#;ieRf-tdWpsU-0#l4_A#_CoIGk|am7kS~!z>gUYpu43S zRthtKFvwnXw-Cbzwa1y5AZsy@)r0!Mu)YH<d|))PI$Uf}8l_f00cHojegZ6g!_=bF zUzS7K3ZQx(CfCcyzz~U)|6t-U8e5$PYjd>lh_-_2VUSvoIZ;HI1FE}0>OmOR9yr4z z+6r?M$ed^*%mKAmKxTk2a$OB_6G#kXP7D#|Ah)GJ^(knK52PO%$Ko+Zgb7kt$MB-2 zX;2!!AS~L-_#uGFgFt!m1v*BBY$u2f9z)_5ZH2WbkkcN>e;_p=3>yCe^^c!G`|F@Q z3=)Uoh@Zl(pfUuMKG59)5`(G3MuW@-g$qdT2&-tT%0J;&5DntvYr}x{*MZc4#@s+O z2*b<)vC%QI-;m`%eSQ!h6c&5<P{SA`Ucx8Z3bO+g2e9-AlEa51u#_dBepu5=VFnNe zl{GN^Aa~<(A50C5-hjniP#w^+QkVgRLH5Gbl0tI`V3vI#_qMGRW&mN3y)g4Y`J7ny zCSWla)PL?+Da-)EAbVlvl0xsmVlK$NT`PqdKp12%%sf!LfLQkm2x5i<$h|!)g&9B? zWG~EIQs@jU=7QYYw^En^ghBSg%mbBw#JcwY7IQ)Fov>1v0fa&J!ptRwmJq@W2atOw ztrTVeVUWEr^FZY+vF<IvVlK$NQ&tKyfH25jn7O3TC$N|ca__X2!VDk`vKM9^s5~du zy$ZsZ;Q(qI%~&bS0Ky=9Vdj!TS70&Mg@J)#)=FV82H8uBc`&u0IsxW47!5k@XU<At z1`r0>3sXxf4Koi$gX#g0nIKH6Suph)6}&B1q5VJ@4GLeE&B6>ItRaF~Cd2gNqi@KI zw!+MV(V+BTuvwS^gd32|1(gplHTcW~$$|92)WT@cyqMl*VFnPsfn+X7J+T<14`v>W z28DypW?=>pHV{RG188jLk{lBQXg-9H`5=8T^I$Y69JDqIGk|ahlDVLA9j1nmxgdQo zwJ;iVFQ>+4VFnO>fMzZ%%@8sdqz`5uj0V+jYMX@_K-fYI5e|gRLY4>VgP8}TK_?2S zY!+q!;R#6Qg3<%A?gi<CnFpgm?p4|>%mBhKkjzDP4<R;4AIv-$4T?8~&B6>I>>!Q^ z2bq1G@U%|IT#!DPc`&+>fq_A8voILXKr)w*S;+DreK7N2G|0U&n}r!b_ydx;d)6WH zJhB<s*dTo{^I-H11_lPH&B9>pA%O@7Z2EDD{g4oCeFiOeU^K|R6ZQx*fbaq&b3ye5 zObsscVB&jRG0g?#<4Jpj89*3hFH9|{-n<TV156ATZSY96^@2QT<b#0$MuXgY&P;>> zgaafI;Q$I>m>OK>!NfP1iMEPC&4tqp3=Cbjg~50QlDS*naketbGcgpwG~=OX#E7<9 zLCuBHpm139PM86N8Ke;IZAe#YQHQF<V<cD#)c&3V)r*`*iRrKWkb?9lL1Vfg4AYN3 zUIh~;mIgZvdQMi1G^DQy8rK71m>JZv12lekKw7jF)DH!X>wz$}?SQ!z)Nclj>wz$} z?EsA*CYbZW$G~A>2%};4!T2y5boMEXog;%tLohLF(keL2e{%xj?haXm{r!9l4Dsy@ z499TfXV^Fg@*K?tS<%)hT8KFjSosDEf0$oj;>6N0eW0`g>Pvw5CUT;!ccA_Oxix_Z zx2hod4`jw2Em8Q~7tAfxax2IjP<aTl=YgDPD=ch5ZcQY@t)Q?3=>_2eOVL&rPlQ`x zWjDwUkUR{-#EGS0`atG@>I4`c6t*BX$gN34xV1(Ok#1_B^EWN>qVRDKkXgxi%;5$N znt;xJhOSirsR!X2dC^vL#%c?YnIQ8(G)UY=N3<0*hXcYOJ_zGVr?B~(Gx7*G8t{s> z!q!C?C}6g$L3z?>voHe)gWBC7^GU@WSj+|W3r#i)Gk`G2UYMDnbaG0Li6ImwfQNp7 z#az(+3uc>z89*3hFCOhUr7RRN!vWNuwAd`n0Ky=9VVXf{1>|1PTop_V7d-)sxuCNR ztu_lYfH25jTzc_|J1Akg7u0^R*(}Te!XSHL`axv|EPunqaM7Ut8B8sV2AS)$S(pKY zUnnBd5h&hZYH*nc6Q6;_y`c19w^^70ghBp+sqLA~*9z(n!N#s(;@D`Adth#W(IEFa zY!+q!VUWEreV}zBFf}kSTr{X`)lr7{^*B-;04ft;dO-7<ptWoY0%ENXc*R;_^O_Ts zA!RdYP7{P-c@tF5!1RJ>m^iUCNDl~u#$dlFL&{W8n*@YmW>CuxP+b$DBH9Wn3qfrX z5T>>rFt>v02T+>?gsE)@s9geEgTbN-iBC`%PT*r;NNHzaxFE;G5DyYS!?5}txoijZ z(?QC7R7G3&s6fmDnUe}N2XsytNFEu(%t5ZtK=~1*W{Rq4E6hzGbJC#ZfaZol^2iuw z4ssn1%6~95AUA>7Aal~8=77%S0*N7Gm^sMp7Epf^Sq+Sx0W}BPx&YXkgE``$wO|k( zTddhz4Aewhy^60`fXoEdQy>~7d%{Yz6~qUzVHgzl*vy92Sq*BCFb1jT5f*EO*#!#w z6HvK}NO=?FcaT~T2IWoAI>0}oVy%0G5qVQb9TIn-d<nuJH$*TnFu>9xNG}M(#6dLZ zTsja9D(^uw=)N5g4N5m48pH?b0bx+yoS+VgS5Te-VUQY79}AluAaRg<Iq2>WIVJ{B z8UpeAvG76WgD@y>eo+@~1;sfi?}IQ%&rBTt0EvU-7eUPgogW9{uYvMG=?%sQnGeD+ zw}R3r$PXY4QnML{9UyU#{0^v@ptJ|#@5jOinGeFCym>}Lv~?mM0|RV5K!Y@B{WK#( z9<KEOXmevAy_xL{46t%tVl(#j0B58S=@evliv}WXf%u?!1JNLit`;N)!Z0-gx|nq@ zXkOWGvoHe)^Jt=)4bn>tCT3n4=1&++jJY7cBF`(cK*NGqGeGV_w+B`?gTe%ak>%0( z$Z{YyXj~FRgZfG!8iXhDF)(By#Un@z8DlHAVC5*NALFA133HG+*+iIws~m;731m(V z5#}J5>!7mk4pJQhbAK)#b71qqIoc5S!}M(UDcovc2$>I#KufDIH82{q=K#h=ra2VF zT0!9gE9;Tt8{|KjT2S|6i<DUF5_w1-0nG!z<UllNOs?aLFnGT?x?2dvHOOpGxPZ*D zP!nwh^<zLZh>x#+fz1c2AcYIe9FSggjO;gLIoNzKC@jwCpoTF>U5k!rE6fg19Du?L zBu)rtU?~GY?aqMB!VDk`DkETKfZUDCeK0jJ`T!PlLF3Osn}r!b7-TO@Eh)5w9%h*Z za&O3HVFnNe*$Xodls}1eZvhr_LGAjm&B6>I46+wyE-Ca0EarmT8?jlK0fa&J!psAW z?-T1@1%1qL0J%46voHe)gY1QwOA1|q#axhkV>SyjfH25jn0cUbi&*zwz+x`Qy>Xj` z89*3hFU(w0Xbl6*Z~(bCVY4s;2!rf}nFnfT66@XuEarm7iIX-9Gk`G2UYNP0&^NG{ z3z}a|*(}Te!XSG|F%PB|RK~*m2BSgqt7)5s89*3hFH9||G|W604JubbW`Z!OX2H~N z$iqIq-*;P>0fajY5oKIYqEO2Vr1mk)3~Y3THRe1AD4o^p5oQ442T10E`csePm>961 zsETSjNFVxm9B6#0YL74j2wNB-+>5FcKM$l2-CR)mt=J>X0KyZH%mtMXFtzwiWncj5 zgQ<nlp!wjkJ;Dqi`~t~bLS`Y$gY?17gVCUTQL;yv0fZfl5#c~e`3uqqGY>|C!l7u7 zFarqBKr<Jn2H9=c*dTo{wJ;hqA6&3Um;r=8AesB-1aHf2IVJ|sofz26LKXw*gP8}T zLG@eS9$^L$_Ao(&1F}9sY>+;fc`zC@ewVXHm;r<rAel=_`3uqqGY>|C+?%yWm;r=; zAel?ZjmYvKeK7N2G$`IO_6Re8aDXWy9H#8!gwJgvn}LlD(g!mSMuX;q)Ak56fba?= zbFt~iB?i(5GY>|C+?%pTm;r<t%n<Gc%~!(I;4%*`ZiZRzfaZgf_6Re8a0HUMGMo5X zLFo*XAL06OFhJ!XeEt(U7YRxaJ-3A!Ko~Sn3eyTozrylN4DbUpU=mnpQ2Wru9O744 zxeiiBOnZ8TxhS|jK1W8Z6@+2>VSR0oIUo!ZCzb~30bx*EoX3Lpb5J0=Kz%OIm;eaF z+(|8efXu-+mk6^D<PKyEs#jqA9Tt!{g7K+M7vL}-l$JntU9m*iKZTEhA-|o00oU39 zSl<?TtPx~JkEduWXiOA@VfhIZHXu0|hKUnP!}Nj1UO?p_h~Ho(+NuF{FUYM0M7R|+ zCkN6C!YjH&TUBNu=I3B@|LAUoi4#kM%m!hQIiNNuhz-K9um!obkO;TRSRvw~BoDH` zO2t~V71j?0nOTI#9N7Gvj~=9d3{nrmGS;H4hd)ZYg3JV&2ckjZZ@ffXLF1hu4B~?@ zuDFMdb>>(j+}NQd)(W%h0+x0eXuhj%k1zuWgW7E%^GU@THkjousC;bLBg_E8AbVkE zg3<}7-1UYD;Gr9^m<yWkYT6^r0Ky=9@o2{>bpwmJp!%m}k1zuWgY1QA2DulOA7Em* zXaif!Z~(P?+x7@EfH25jTzc_|Kfq!x$h{qVgc(2>WG_rVXkLm~_gdItcW=)gVFnQH zutlUJ(0<^Da!d?oVHV+`LHb~BfYBiLcI^>n0AY}SVA?@>5vB$vhKmNRyMn2O(I9jC z_6Re8FvveJy&(6()WF1W(V+6`j2*<UH<0=`pfUlb2Q&vDA}iMVLPxCCLK`s$U|<g^ z??B`KAPmc!pmGML7evFviKRh$Kp0dHPq7zm1(j2vv3U@NnL#Z(Kyv^fyFg_(s162U zYTE&FE2ysrvd6&z64oI0R6YiV;&uiGP})ia37}zEeTH1_!sgC897J1x*h9<$nNtEa z2ejuB%@_ulImmSlC~t$*nK+8J!rTNhrxa=q=o~7LJTiuvgIvFY*nd0_Yjt4h4&-NK zy)bcNX_#J6{DATai2uM*v=!uU5F6yyGN@ZY`!hje$Qb6<3rOJ&VsG&fZT(^?2F5VA zP|K~L^a@(j0CNW@Y(Z?0Tg#zt1?}?$i6LW{TWcI4@d=Ux^;JMLI<A14gKfSKHkbIt z1hsyxaT0BPk$UAn$V^b33Zg;gzK9lW1@S>_7zU+9Y-Ypi*E3ECH_p%(YlYbbN{b@S z5V=Q4<p{{{Ftb7BNQ1sutAw#wtA_!i9I0@Iq-9VU0>U6SL}8g9gNcJ^&>SL&2F)FU zXwcnOAR3g9Ks1OCvlkREcbp;V9F)I77^DVtFBN*+!^A-}XburXgYp!J2Hj@`qLKM9 zJ3#5w!3B~&LFE((gVciVn!;uWNE{>&nnMK9pt(a3y^aA=9)R*6j1RK|WX=*7(N<8p z0{H=iL25wvM}g#E>OeG197KcW5J5C3pMYr4y;C3>nGezf!l3pnhz8{~P<t7KL25yD zA2vHc;vo5}P<MmUH;8{13m;@I2!r-7*SLzdPD7fnykP;EudK&0UkRFf1L=ifklxC6 z1_oFjPS}HezEZ^kH7}UBLeePA98lVTvC-AS#9?Yg+%Ve=4;UC2rtA?0W6&CBm>yE- z94zL7#zv;?5oQ2kkiDds2UB|li@Bh&vKf1X89*3hFH9||G%Va<G-yl~WF`ocY8Fg= zi92Tag7z=Z+9S*W!ZPltaR<{!h(6$rX)b7<dCneT1`r0>OUMjt@}T)#Li?9t;RB<w znS(9{N~6g0%rWMWG)$}+Aa|jgNsW1CP(2SbcRC*fLlsi~gNegvY;_u}%>i123aW=e zYC+~y6JZXh?gps`VOV<r)USuR31m(U5$1r}D<CsK7`d(nxd|i&GN+aZbCBCop!!q; zsa^z`1HyH9%z@2U%Xp!tX;2!U5CEC4=0Gc}KxQK2EoP8(fh-1Mi`a{`g2ETpo<L4F zApe2XfG}uIna4t`wZs-;4k!<U#9<gTW(X=nK;<90TR>tkb=YW-*`RO%$+b9%wu1Wg zAR5HS*M@=3S6}f&gbU0ZkY03*>^EdN*nBl8ENZ+FX2H~$c#F2e>;T09D7;{D_-F|q z%(4X351Y3~m;r=AWerR}$lbWy2U7#13$U0Assk465oQ2kki9Uqq|hg@m<w|6qCLV4 zAPlk>W*%t1gjn|~_+o|wsK38tk1zuWgY1QwOA1|q#axhkm+cW|0AY~5F!M;6kGg=x zT#$QL>=9-FVUWErb4j5!{4m1-<la?#gc(2>WG~D-Q29q}_%>iM7v$bGdxRN47-TQZ zTvF&8Sj+{vcikRg1`r0>3o{Q?&Jych1AokL0J(R=9$^L$2H6WUmlV1Ki@6~8ZrUTv z0Ky=9VdjC#b7I~50E@Yxw$YY7!VDk`vKMA9DYQiZW;lT6*SGBvW&mN3y`-22QwypS zV19$qp!xM3dxRN47-TO@EvYojJQxkC2S8?mFsWw2)E@}LoL>jcH%+@O%mBhK0uW^~ zDBk$wnHaD%{b9zz>58?Yt)HOtP%s+Q25<8gVE|!=K!mv(lLT5<$}_?5&Vw6*h4CQ} z)4iZ{w&=Dn0|?JRGFPUJw*@vQhQ%lpA&($Tb3yrH$!%c<5C+)`({P}jw*?dqW-tLf z^a3pAg5108wlD(-gY1QA2aSso>)szY%w2I?m;r=A_QK2sl@G+48xV{c4xs$D>b5Wg z2!rf}nM(@20*kqz^swf(FarpK?1h;J3SZDZP2{`gVR9IB2&Q{M_3^sf!VDk`vKOYO z;DK=K7da*dY<B~})WGNnEarm3VZ&`<1`uWlL8RZFcbu&p@=Oe%^ORxw@zJojfYG3Q z3^Eghk@aoh7j6ZmGf8AY9BhtI%y0np$u`{<W&q(0NbUvYV~~46XUpL*4lbO4#avLI zY|Cw71`r0>3sc;1L7?@s91}wjOaKo(=N22rzFknh*mhf(0fa&J!nFGw;DoD%iQ%FJ zu#{&Yb9dbqW&q(Gp@?_`wWDBhfXh6X_=<YW@CB6*du|IefH25jm|9Ty^2jqWY=a5l zp+Cf6nhQGXZ{BTT1`y5&L%0`|j|JtK7+`k+;W3uMpcK<wP&mxEEzAJIpmHCkAJjf0 zHXOEih_;4=L)-+bhd|~K(_h&UE(-4N&~jW?CPK6o)Yk-!>wz%Ljp$=yFmYmOkRL%9 zG=A6+LHqrgAiF^QX3)4E2*cb-Eq{Q<5Am%zfY}Ff2Qo%pbD$FmNe9UC)MP)2z-~Tl z&4EW0LVhM614BbQ0|T!0f3R^5<T)CUTT5yY^Z2klfF8y$abjtZxgZQO2h^7UvA;x# zw$6cu7s#!RM7Z?{R6R()O|)q1lN!-hhAuHMhPee~2S^@<VdBKnFnyqL0#Nw^;xC96 zZH0v`$gNF8xOD<jT!7rIQ!CmE8s7q8m|LjjR!|-Um9ZeVf-op-K{Uv%%|y5r6qX?M zAndXavOdBkMzj?+?g0{S!D9|=eMEpSWIP6>9)xXTL|dJUuULT01eph-LE;w{O0|OK za6lNu2Vq?46gGd;6N5<G2Ry`DVRjv8!aSD()Q(#6PM86NLFZP0%m-o6dRSQ4gZTI` zsND=x3!}pr7#J4Z76xNbJq6PbYM+7H4@9-kUSmJ^<CB>P0|<M>BK!$z{}Oxd2dG~H zb0>@jwa=#97G?n91xV(C(#jh-CI--46wD8}=qFP|ThZ6+fa*=Xr@{;%`~%5ckb7Zj zahV4b4=EIew_#xJ1+7zTyDiKB!U1uJZ~%qxcR3~o&>R^|KQ0=i4`v>W2D!K8wlD(- zuRt;vv`!JG2A6p-agaY@euL4V_Kwa|VFnOph)1~hND61G1hlUQ(~pY=xd-M37!6wg z*mPT%0fZxv%muZpLG52+_Q`|F);CbSFOlXoL1hBWEueYL94oQb4c=m{1)hj`&42_* z*$kS~1Yua-L@%#k;>6N0dqHLEmIO$d3Tl&pG1QIJvIA5mN+gQ5g33bBd?N_M+(|7v zVCI182T+>?gsE)@s9gf;r-8!mNFpMQ&EjKVXl-X;_$0@~U<8sx!?5}txolT?j5tfV z25J__oHnRApnGi4jDfGgK(5am@*#Buy4rTAIr8Wd3=9mgIsPeusC7g_l4$FSJ?gF? zGbI*DwSs7nc8?`et)O}W#D-yzU$L1Dt0OifA;M>lpI9r*E|6b;K;=MYxIzsC`5npx z-*wR9C)S!1AlB;RkH`x#$)c?w{opjZOS%Q5Ul+?9KTI4O4XPJF;-Gi}(I7s|UQk{D zu|aW*Y=<=tJ3!(fGtg;J-xeeeibD_$;)BcuVNhOxr6G<KL>SHHV_@iLXJ7#JQ9*74 zsYS-HG=v=Y7FmdM?hhnG%mSIy2{p$a*#IaTW)5;%<SD?OhPt5UV2fv18tMo|O+!mk zL|bpHHFgD=Ibn%ZD~JYJJta-F6_k!ZY#0Xl6`R?xH1q{2d?o~mwZiNI`PC*B;$M&% zpfOC4nIOM|Xb=XKrxihBtqCDwtq#G6G_)X9v=yWu7QZ0<*wPS892*TvGazwLJb`Es zA7m#8!_p8aZb9u!5C*9Mr4d*e1yTpXFmYrW6lWklDD8k~WIjj_2qUK<pEO7~fW+tU zF)(zuGcbH1vm9c9nguea2Wk$;9U!xjF)R%sr^Or4H1r`&v~>+qy!ArOQ9w2T%7(R7 zYa&t8(2F$D)<efWF@VejnFpdlS`I9eY6Ybu5C-u<801%MX2a5uMLHsUTEfIyVRnK1 z+5nXUnE@+@Kz;|A3&Nl@loKY_8WJJaY7&k}Lr>C0TS59^X$YhrTN;9iW1~T71|$wj zLm(Q&2iXb2urvgUTVy-1r6G`BkT^CPRPKPpL2(G8L41(;AdH-bCS)MOXf7WELti@s z!&f;b21AfSG>k3ok?S%Ks97L$`l054(lDAa@VX4S99mF_y&ReVH3wT+0V{_JVi9R* zK}k`IPNrz<tK**-KxT3*mudykAUDWli?)K&5r_@LAirWW8<vJ@G7;fZ5hd0NvkT<c zBTzYz8K5~DkeMLAgJ=*2rJ;l<u~v^5u~v;}L>kh_5^V+Phs7^QzYdmq1}2V;HfBJ? z6G$G!2iXb2urvgUTVy+|aM%G72bqCRJ3{RM#UV%@#0QxV!k{z+>JNa}SF#XcG>?yg zVPZQ21Fn7oEDa&YJ*YhmG6#fvpk{&0nFKWlbl(R^4jIGDK`w_fiXdsIB3rc81R6IW zJ(Hp4z~Trb2E(v&XhH@e4T0nevPE0nZ+~I{nF%rvM1#av<chX}(h&%Q_#h1OD>k!X zY3M*UB7A0~inYS*0{N9A2O{?a+U^FK2l6|J24PSdYDg7p%}5t(^+-dcp`0AiR*-&B zzW{_mZoszY5hf0zLH$e+4O;UEqSF}=@dV?8>;z$08Un>FEDeFw6kth1FmVtKTJs2^ zL2DdAG-yr^M1$fGM1%Ms^FbIn4N2re!T}^cpO1lIN;?C?e>vzO{UAXkj4keAX(%CA zwDkfsOhM*Mg_?tHZUtrza#{qP#R;<t<|dFi)1c<`!6cDrm^q;FC7AFN==cpwo@gs5 z{lLVhL(Nfy2_Vt1w74J_H7)+h6>V)?leQmZCdfPx4btXODB222k01=<gD@z}u$c`@ zi#~aXaK4i%)(W!=G%f+__rhpUe|^$zVFnP6K+;Fb`~*lJ%sdzk+P^yCwlD(-gZ5E_ z+zrANshq7W@=OfVK^y`Y6vr<4P`@Dc@j-C~(+bKvM>54)ZF0m~d$JIDXGK0FjeznE z2!q1R5=**<iGyex21t6egVJtL8dSf6<UxFxy`a3qQy|(3N<Xl?15)FU!w!%*NFH?l z5r_umV-TGNwF8uPVSJb!pu7WOgVOsAYq=H>2B`t%FZ8x1OdLdaLCx%e(x5pTkT@t^ zgJ=*RWG)DU%z>5hI|`s-4H|pnV_=xk&cFbQt5lFeG>k1j!15<Up=fIX)T{-33=A`& z=77eW(2T*_P5_OW!PLRr1Ttq9)SQJdNhBKP9^|@$XFsH_SW+n33d&P3<+GvYAjc<6 z4wgS>RHEk3IfbIFRcq4rgUke(2ckiG8cIZ4L3tE}L3|Jfg&8)pVfph-AtIcwl!~>& z>;i?ENfAVj6)C-g{0=e~ghA<jPpMd|NrhNzOBo`)&nSX~IVi1zFvtyYSkfX)97Kc0 z_&_x1J}(fR&47q+7$0OO2!qo5pCZv#P<+7BJ4g+-_3<!q5DlsmKy*FS>~1IxN(&%y z5Fcbd2*c7lDE)xOcR(1V22@sn(kVy{48z1h^n9q9pmYJ^FUP`%=>wSqOYbX+Az=-Y zTgb=2FsGe?0W^1t+>QpxfiSl81xxQAibY!!pk{&0nF}=s6#gK+$QWi0w))7TM6?y= zCXhMvpyo_KHUP?onS)#(A?F*An?OoI=FEqhgKbV2W)AY)R17rV+$j-l1*LV6IUu|M zY7Vx#2bOP2>QVE}l@ig`r1nfBkeML!Ks3m#D|Mo+pu7XZAU+6#!XBI1uzaIZiioc# zRbs6$yE?GUH-qL1XWbTN0AbL4G{}4q&bh_c3fg}TTk8xG!-YZf->~`&MuWzo=iC-% z0AY~5FukDhc+mVfD6PW8aM7T&B2xzO3olYW2gMak4=A6XsS<0wQY+Rvr5cgX8_FPQ z4V1@07!+op{vjw`!}Nk^m^g?A)n_0YRF8pZ4+ca!hw(vrKp2$IpOit;AuOMR)C6KF zOJL$48dRTwXiz-{qBEd&fbsy04>BKwLHXRHT(lLGMnQEN2!qsg;;;iG4w47eXCN9> zkAdg~P&+{R1I7oL55lnU0OcuAIRe5UHK23&U~(XJAPf@+(OaNqg7ON858D3%qLKL^ zJs=DkFNVzre<_E=CrEq|9|Oa}b_NDedI$#zpkZuzu3{(j{;vwr)-_PGK;|rhnv;oU z28atY2e}N8X@i`v-BKai3Ud?4oW)RcKw$~ei;Q9BAeTw7`B;!Tn+k~EK;|rgnuFYi z0I30Cm^sLGFlhY@NDdt@g_?tH9~rFA&(MlmmMBz;wr+a4JQ!pqsQduYU~_v!TS0s< z8%lt}9-G;)vZSCA;wO;uf(Efxm|dW--vN~qLdu&Uzk}3*Feq<EG>Ek(G>f$=G$Qh* zOcf;VK=~4cL2d}ZlBQweAR4r83q*tFnLsosAAx94x&hH3KFCfG2Ib9$DoDJ7=2$=& zqz1HR2R%*0#6dKu4+x?`X$VAv>TD2=%m<kd!b}Vd3{R>=TS0LS8ruY6kXq1X#MtZr ziG$=pZBh^oN?#xvlt)1{G9P3<2*b<)rBRR{Kp3PJRCdDTK<YpkCJv(KFhKGYDD8px zi?Q%QdO#SIH}_PFwk}56KlY>pvVUwf$gv<rNEoyZ3ACpMNr(ZYcUe0F1FY<CxQ%`P zm_Y|>IxVS2q%Dwnpm+n(AdIdSBnHATHK6duwO^><_X<$-z}*9L7f3%L4003lexZzZ zh?|Ku1LQ7rJ79Gv$n7AEERW7dmIJXt{YwxHTB`w~L3jxt1H*Ep@CJz?V{GLMth@uS zr2(x`VPIeYnX`fjb8wY+FgJnBSxJOB$mK7nOgaNCFOl883XeIkeLgI8sObi@ZZe|@ zvd_l@ElnYt4PqZ?gTyC@jf`{p#K3EJU}Z9Le1rT4Qw!RQBhew&%Fzok2ed8}CI_NH zbK{_Osi1g8cMC`iqy`rTnGFgTki15vXe+242%<rJeDwfqpU<9JM7Y4r0qI4@$bLhX zgYEMHg+)p|!Yr5?nR?Mym>r-v0Izj|N#dg$u&;C6cUzbNghA^zVcJ3E3oiG;)WGNn zEarmRod<3UGk`Ed1EwEfdhyX4u$T)P|2cG9m;r=A_QLdo@)fb}<!HnV2atP@+!kg4 zVUWErb4j5Su$T*S@3Gs$3?K}$7iJ!)y+W*ecVICWw0`HrZD9rw2H6WUmlRr{2{Rl( zW5%a$3p0Q)$X-&+gQ*3T0WiP8XwaPKncKn)APlk>rj}G1W*&?N<$I8sAWW)RF!e9m zG1rNK*2OP-C(HoCpmk(0wE`)et(r*fESNYpnxhwUeH192sXP^C0AYz{^6~{pA8efw zj0W`|m7WSSfN%ks=7RLW%!ARO^sDexm;r=OAejp)A7E;*`5jpdqz|SRMuYav$UPNi z0AYm|^1=b64`v>W2IUKxr@{;%T!CaRsC<x-XJRl#b{GyeNFU5R7!3*ssi(pWAbbJI zTu{3JrUr*`aAA->m|7SO8h4g>D$D@F8m)+M0QJ*U<cT{+6QmDj9*hR1U$Ljc3?STq zWG>t>L@+@5VCKPS&^b^dPlXvk_y&@>p#C7pz1Zex(X9gMgP8}TLGBfLD$D@F25pFN zK-Y_p57GxS4@QIHP2j080|<8@nS0~_Cw%Q9J~KgbAbl|NU^HkvkngE50|-ArG8d$t zSPaq!GY>|C+{^P+m;r<>+7aOZT8{`*L&$uPKA2h<4O%zI^;DPvgeM@G>+^xH6_hVP z`H_&h9a}NWNl<=U@lKclghAyf%nZ=j9<k*lsQpsY0r4xWTnCv$OndJ^hbXwcNXxa} zE}f#Spf)zBPXWR(H=_6bVB*BmAU}dIxRb=dzyR(OWHGgX`j;>>sAUJp9DI8iVD^FB zgN#A-3XK1u6B0)-KDFr;ILrr?g&@0lx)Js-<6~f0)6T$vYb`CT?}a>03^F5U7UJAQ zSl$4I4M+}#VdBKnFnyptJgA-l@pp8KwkC8z+zWE+S|Z#EIx7*R7lz-MNx<)5gRS*O zcPmVsSQ=(F$Q)1`6vl^zEy%6wh;VBNQe6BfhRj>V^oX{?`bi*j*W)n<HvYb0Hl+Us zQqRNusU@UGv~{($tSiV&ka-{)BzI=EXe&bx6oUj9aK}At%xnorJyh+R>0+%gyArUp z%RuY*HJ%DHfba$+eV}val;oKhHbTw8M}hRAry0;#m)cWd1`r0d2Vwe;eBx^b)t9g_ z379xmIv%qf392Wwo(eO7FvveJeW3IQa|28a7Y$0EUwR>FR1&F83rYhpJ)p6}iY~EM zpIKt9b7mmM4kP*?=^Hd|2*R*@2ufEly&xJUPAm=51Hzy_`kp?~R#3VGmAN1cGlN=o zz{*`vUImr8AWUsLKyHPVUm5+7um<^WIUfVVhIR%9P}&0R5e11MV_5lxoX<dQERdQF z{i3Z3P_sbhY=oKvnhyoZBV(93$Yl#Cjeyj|Ob~5_xd~*>Ca5{cbDSV`APh4HxjY52 z@61H(U4o@Mke@+%U>GJ&EDh5KiXT`R#W7K|736P_9LTMkp>74user_gG0d$$pkV}( z1F@&f6m5-IE(XRhw@}Nip!5oA^MLFEVNlqDXpmdCK;60<B!GrtZe20~kv2eWQ#55@ z?pCNd*yagfa}W`W5alUI(~^mztrIjAmx0U#m7yRSBz|IzXe)>hV#6>fEn+hpR-S&D zh;ZYdIby9ayFh8tW)ehB8L1or`5k69s2q7RN36AGfmrLBxrlOP!6Zmp29+To3~~c# zPc(YGz{Ei`Xzl?-gXSDSG-wVFM1%4Xhz9Xt_JZPtWilk4gYq{BgVdy8ndg9sgJ{rP z1BeFYDG*)80LiP!e3%`ebeb_4l0HG@6bOU#)ZwrLBo2}X%{72%P<{i^pm{+Mjm(GH z0Sb>ZlSNxW=?dfr5C*9Q-QNY0gQ)}2FmVtKntK4zpnL+NmqPu4%m?WKVNm-8M1%4g zX#Np|L3%)SA2vHc;vo5*P%}a48^i~l#RsC1`5<#a7<5kFk}0CCE0E?nY?eXhIriX~ z=K#$Gfb_yJNbk0G1_oFj=6H&Io}*(aYF>z$0!gDVb3kbW#zt2Q6Njm>nTov*Hh3z` z0K%ZXa4<cfG7IK5m>4d43KnxgV?;(zg&9B?WG^ng_{85}F&ETkFnKD>0Ky=9VfsOB z9Ae$;G7Wn;m^~F{0AY~5FmplWA+hGp!D23`Z)x#Vm;r=A_QK31h5mxYT+kj+tEa*Y zAPlmX6!TzeeWqiE185Ax=BY3P2!rf}sU?M8g2h}=IM_WEW&mN3y`-3jtQHm*Fd8&= z3NjOfk=2pH4w-=&4xsf&4o`&{K={ve)I3M5*$d`inhPr5ot_FafH25jV$DKU2P&I! z%~uLQ6~e*?Mni@1QlPR0dA{<%5=hxYtQjD8p<4j!8-U6n5Jr|q=OfF3*r0Jq5DjXd zfoKq3$;ZI39jV*|i6LWbZ4p>o5p;$>sQm;|4>D&55$1r}Tp;xz3@Q^rG^qa#a}&s% zokW-eYG;D<f-tB|0ns1~aubLKnX`)sbCBD>pmtCIQhNqu4hZkYV-9TI^Uo~QG!07Q z1q&hbo(5=j49HAmECEdy$YLON#Tv0zQ24^yfyn6w<Uf!a5C+Xn7AzHOy|D_CzCd{x zBo4!%u{}^30!km~ZUKqG)M2ARW`n{7B)4XwXe+4y4WdDOd~HwIyyq6AaDkZv(u<Cf z{e~<DoA(5TMa&%3Fb1g;nIqZ?vjY?dpzs2T6T&~RlqI0L(B-Kx0|<l48kiX%cjIy& zObv_<n2T9Pf$9Lar@{;%46+xdmK1sg7IQ)F^>`}G0Ky=9VdjDIIkE0#n1|_JP+P<6 zsW1ZwgY1QwO9~x<#axhkeVz(4fH25jn0chk8*RX1F37!pPlXvk7-TQZTvBL``IzAV za&N#>VFnNe*$XodRQ?egz6n^&1-UoqsW1ZwgY1QwOA5UMi@6~8hCCH!0AY~5F!Mm= zEV1qtSb!N0Aoqqn6=ncoki9T-Nue{am<w`m#8Y7g5C+)`GY?dr6YJgsSj+{rjiR0k zGk`G2UYNP0&=LzV!vQo89`jU~0fa&Jl42fAEvQa_`3**c=E38h3NwH($X=LQQfZiZ zFd9@3fXoD8Qq6*?-%usoY6b1T!)VaB=)8Br3?O`BA!eBj(~FO;SR~r&4K)`=gUr43 zO_%|M6&4}PjY;N&y8)k>Ah|VXFwF&}vn$_(89*3hFGw8-gYq%VZV(?I)>w==&jp%4 zYj`Kj0KylL+zU#-y7Ej6?)VIZ$~9my7v$cicft%H46+xhlmRr~2a5xk7%ut-7IQ)K zlP&Lr89*3hFHA3}d;qx@w0{yNhKn{>f*B4V_qM$gW&mN3y)eBZ2Z@ij4lL$^>dlUK z!VDk`vKMA9DBeKsHHQh{p&wu|7c^hp^-h=pghBS=(T-EfVku@gfZW^jPM86NLH5El zgT{J6?j>d(d;%78LF)nf-U%~+Fvwn*xuno9u$T*qw+Zir8NhfcBENy!55%Uk8Ot!k z0aX4@dMC^P!XSG|aVJde2Q21-+&k@^FaroXEJL^#)P5k=y&!!swJ;hq&pqXxFarpK z`~!1?!Zm?bb0W`G^;nJ>4xo9`8SjJ{Kp5m7n7N=adsBHP2GITjm>4d40Ty#X_3^BC z!VDk`vKOXz4zEBfD4l`)0~5nVgUW4~|6w#}UTV%eVFnNe*^5grK5<a{+hheKZeaBg zNIfzAl^H8U!TlXtj>rF5A=(P+Yl8aLAPjRO`dB7RoLCy<M-T>$`zEZU{rz?zyFmSB z(0D8e!`w+Ne}Kk)@vRMj*#~k5G6to27@ubqBptx`)TWQD#BM&Qyam~%u^J)2nva2D zZ#x46uJtFdaSr6UwSv{6trgovTi+ZP17lb|K@Ve?II%RyZ6FNldxPpS5c|q%(bgJh zc!Auyj|jIOfvN}T2jK(T5%X>^w@}NipmYstCxGl}SR>jB3tNy|_Y>h(P*{TW!tj)f zh&30mHW<2FVdBKnFtb7CfZAX%J}7KKY>-<I5aCvtHHdUmasaZ9L1nFID{R~YWY$4E z=D^l5Y}o}Fj{&I%VVSj}t*c)y4+fbDG7m(9#HVZ!Z3WG}fiQ><!no2YY~C$rEy9f| z+r(PocHPE2HyqS1>F^d|0AbL%;vn-uxFKDs<sq~U4&vj(0g{;K5Q5sjXUs$xK==ZZ zdqSRzwyu+BVgT(I$7d!;PT;O+tB3*<11K-RXpnnZ;zSrgSYsW+pCI+bVo+Y%1J$dA z<VR2%fSCcBf4s0<tW{*ESnHK-i1|l_^^m*>ntKFcSX_Y86-+OPhKUnPgY<wf$geHy zA$bT?2Z1om3~Jc{%C9fhi?)K&K4@MLgsE)@%&nmE08|HoFtzOf)kCne$UtES!)y2$ z7!I{FFc`}-F(|<Vk!V<Xj+~c|ltA+GhYg~wp!^3@ei&*FA4~v=hUI0QeW-c)#Rk#V zYwJESfXoD$2ckjR6n2WXg7Py6gZLl}aw9ggVR_kNBT^dQBi0JD%V&dVYXejcWQID( zFa`z&kl&$9@HuoZc8j$->=kR>um_QbLGmE|p!5sEApLS!=AL2V*k~07MEHW_L41(8 zAPh>wuzFT!6T<y#`4||Ev@<Y(+P9$oJV-4v#uhK2_Ap3I$tKa(Cs6-_%sC1*2U|NC zW)5<_0;@|wX2IM9GUpi7oDPr#8itvJT$h6St!T=?+~ZJlu&sxHt+jY_2sNDuY!+>` z-&wU6WF{zWfM}3mH;#z5g7_dd41>Z9o7u2*lCT*O&Kmp0T48p9!fXXp&J3xn1Nj|h zHmIx<*e}-FaZs%F#(qRP;n@NSb5I%qVUQa@<u)vD!}P<%K{RMB28a$}fW$Ls4i3Zz z#W#os@nQNv>7-zbXe%f_KxGgJgVcb|ZNO#+NE{>&I#UEhgW?`U7ennr=ELj&m31IC zDE)xSQV<5|0iErG%?^+_NWKkfCMaEi_`O*8Aag+&WRAyH(bjcHYZNXVgRD_FgJX>X zX#NkR7luK4PqZ^Iz}jYY@35~?kU55$h8VUY;vHlbC`>^#2xF)P2{JH%>r*HbZXe8E z(6}IIZ8iwQ)R0PBY{TsDg64Qvy%S~t;Rk4LCf58fJ2A}#rKdITgc(2>WG}I1A*%zW z2|{zcu<(J=$og@zw~DqR&+&#Fg~T1PW`Nv<ZZ<XMctL#un7Qlu7#L0>r8}57jK)?5 zBA2D0J`hMP$edF|n1fs<gUY)-Nc98A91uQ@#~j$4YQPTEbPq~XDSIJvs#mt4%7M&8 z#%qp1;sIF<#9ne*4BV%KmG{W;1o9t94G4qgJz0*4wbq=1m;=f)AaNK5jrW4~K7jHf zx?4bEFm>2yklCPc0m(^h7HtK!A3!vSkFSn_&8c!Ag$v9akY03*>^EdN*qkaTEH>=K z49AR}qOCAHKyd(ze`GVTv3+)7=3UU3-MV+e3?K~3+c13~cjIy&Obv`)g2h}=A7R5g zVFnNe*$Y!k3jGI*xghs$dMC^P!XSHL=6zW%)k3U$Lv~|^18B@{%R6BP5C+)`GnW*4 z4Hk1j?%noIm;r=A_QK2~WlWT14|ezNcqhyN!XSHL=8{6kU@;fu-d*p689*3hFU&kp zc|&aYZoy(MXv}%fJ7ES82H6WUmlT?3FJ?G^=KS`(6J`KmkiDds2U80wvtWLM(V#iM z1Mh?xKp12%Of9K2%sdzkDyKkZf-tFO!PMvc!0hXT;_aQ82m=W3*^4MMK=*UN_L;!+ z<DwrN#XdK8>YFeF2#f4PGWR5J3vAp6mw7O8kUp4N7!4W&Kk-eN0fcjq%!TP8h6d?_ znFpgm>Fn4yVFnOBf@Cfz{W{1qF(99Bipvg=KA3qh8Wg@qz6mpcu*`l$IDpC>m>OK> z!NfuOU}|ABXzu9HH(>@4E<rLE)OQ297jz~tOg}Cfqz`5uj0Tmz2fhh2fbbb4b8(r0 zO&p{TW*&?N&CTumCd>fBDhCkZ0CKN~JQIT^HiOW_K>A?j!Dx_s_k0s(0O1-WbJ4Wo z<%0CV%!AROc-!?&m;r>ZAeq~9kP|+?jn_~H1_qEmn0YW7G*`Rhn=k_i>l{Rc10l1J z<w5#j=D}!?d$)ZPW&q(9By&M?%P=*_W?*B3^ug4^XwX>TmT$rgAbbbO+$AprT0!Xy zlpnE~g)HW9L$nn(9topC?%m=j!T`c1hY;Za8sCMfK{f*$8`OR|0o4mDCqe3nY47PA zru`fM$St7uI;bxI!Z0_2`kWv+7>0=xOT+Ym`p5X@a$x4c)Wc}xxttq^5n&ILrzSlC zhxwp<53*;%5rq94`4||^wlgr;AdPi^)W9&TKZ88>2P&Uo@*YsLK<1ny!W`r|p`KF6 z7^2Bh(N<WS9c1o#Jm$d05Pw{U^d&&*Q#M(*=o}SoU3&Nv1ISE}c_11j_vMmkD`<QO zgh6}|#^qPo*ig+;MEEdV6>Ejr1zJY~%cC$FG|zkCn=k_icOdBl<taCLCI--c5Rjet zu*EUVx*U{V&U_PQ0AWyF57W={N}v@~cEkF$FmY@&$UQK3!e~(2`P?^Q1`r0>3)2VM zqX2U6Y?uHZ8WiVejzPl67Af6;(f~{wXpAi7gjnl^YhtY%t|G?B433Mog7kyN$3Pes z7wGvDCQd93vlrH11f_9M{s&>08Pu`^R0hEE(w*awZ~)oAiI0KdLOTNkC>%lO`hvue zF)S}3=K<JwZN~}G)+tc4K;~S8nv;cW0F(_g2PIFg5pDIkh?uj4#W%X2VdBKnP%9Zg zeum|Hlar#YFn@#GdI{=Q&^f~}^)MRdR+SToa00PeE{e8Zc_aqLFt<?4t)Mgj%6~97 zfWj8U2D$Yz)UDX^CCsfCklYGtdw}$!<10{eu#GXp#;>p3MU+u9CW^LRI0@M+2r?5? zE`ex}xeX6RTS0sf8-_t?2%FikGD_hTB0ODginYS*0;Qo0sGK`e-URs_W;Q5q>f97- zHMt|!`sF4fZ=N{?NrRw#3Bn*ZU_0j%CJv%O<JKS=G+qs&qZttCAI68-3yK$m(~z_S z8oLHzkQ&f=!{~7j69>_tacU3^$_pU66lw=DA7%$AolZF|+6szuP~Hb&kRH&v!`SQq ziG$=p<JKS=l!ifcKhzFnKFki7IiP$1nx_L{kRDLk36q1Vg^7b`(D{TQ8kF`x^lGRb z$b6VS&|F>48PV3wNMqzX9zw>*Z{ZjtM<3e;>Al*{zyQl%o4#QmBWHPtNT(qCRn8#N z7KjguHxLcN=xRY?APiH(au%~L1Jya#z6mpcFlbFFNIj`I28+3%_Uw&s!VDk`vKMA1 zs4j!~8778{-h#v2Ti=8kKp12%OfRTRA=X@;bC}@(>hIq9Cd>fBAbVlvl0v6oF&DJo z?%p?H1`r0>ONx0gwR^Cb3+m@R_$JH%!XSHLYDu9*&SMXUN8f}QKp12%Ddr)og~bJo z294K%%miU%b)>M5U~w;KF6PNMVFnP+Iggq*h&B7fWz28@&BZ+XCd>fBAbW{53t1hg zd?Pd$0}CG*jjSIR8&n1$&&Ak0fRqu$ngMbby4kQcE2yjhVPtu9KC&E$4H~-v(V#XC zhz8*;d<+cNkjgiZ7&69IpTpWPpfyvVHV8;P$eim$m;-9JfYgI9s4M`{APjR8$ebHQ zn1kGI1GNEaPGY91n|RED&FQFILe&RKn=h_I=5&6XMwJ7(6B$pr4~b7?F%a9~xmYVG zTwrY=<oE{p52OZ!LGvze9*DKxc?vNHl=nd5Fbo>E0Ofs9yrR1WBnDH5jRu(w3Kx*v zjgz9Sp#B_)2J!K=yI^xVcP=9Q4l@U&7ab$}4OtF0rvnO$mdgmUU}|hGi?+h-0L1|) zykK(pXoV}7WdNuSd+|+}0fa$i1WZ53-MHKbQv;(bu$T)fyI*}1W&mN3y)d<;&=;_n z3v%z9Z^8^946+wy9w>hj>t2nknBf3wBfR@2%mBh5dtv61LN{PB7v$a#--H=J7-TQZ zJkXpDvF^Qr#axhkKYbHs0AY~5Fmp+v4X$B^1IWE!z6mpcFvwn*d7yHOSod~dF&E_C zZ{LI&Kp12%%v@6F2UyGnx%bC6VFnNe*$XodR6Y{xUW@CP;Q(qY{rV=%0Ky=9Vdj!T zPrza>Xb$SnH(>@42H8uBc`&u0G8X1H7!8_(`u9zk0fa&J!qk#V!_0%xpmG&tCJ2*i z7EJw_KnaYoU{LsOa};3!VbEAHOf6_#@+G8xBTO6{9dHYCZVOcITrm@20O1)o5M}2E zJ-*fxMDG9iaTC*AP&&I~Cc*&1ACSxil{>`FnSu1d)WT@coX#yX5e5+UxQTEtDE*eo zGcioW=5aJJjyss{1&z@^FcV<_;RQ(Mg2H#RJQD+`pNwV<1{b6c=1v$5inn`aA`Bo5 z3MZJRly{u1XXTj~%wPg|=oMJv4K!DD%}j&=ghBBN)2{NEv-Oxf69cw8H(_dEG${OF z?u5~x^l-yWgaL#>_QKSH!uK$d?ww&P(fSFRCSf!v9J;(k7(kfeHX`0Y_sqlWhS`OS zzK|r*Y7bp64WmKkzAF)70O1HEb3ymHm?<zZfXY!^=E1}hu%rjjc<vK35e5+6fMhP{ z?jcaV(1U5lLxc3e{05^z`Qnk82m=U%(jiPcsD6W~fr;UwcVKZZ$e+*5L>NFA<R6&c z2lbq-+lfpM9gi^cg%<+@!wWMJFb3HRGk1@=1h{-4W*=fjk_5&&cTl{s#fdP0FlZe- z%v{jAd}e4I!^CjWDaI15urPzsAalQ&i7<e0#$7}@1Et@M@=Oe%b&j~qgNcLMhku}Y zVdXkVj+pjz!aY%Ndz_YIrAO}3e(V_JUr?V5G*$+}uy8;hFN28_OM}b>VURia=H+1K zfz%>nP`-rm3+^N07bZqcS_6mqu(^bu2MGJO@i8#mZf9Wdg_e8h?tt}ek>?V2d=qVr zF_UPuDHR7}SQ-X}4YGciII%QLFR0%JYKMaO77s;RA3*&Ba_b!;+^T`(zXn%{){s!d z`Kz$`XLPs1#EGRrZUbSEIiNfWVuLU&Y(Z|lON3jmAi34%AY`8M&O^~wSU(hG<~=;- zz~(7?zCilNAoU=8<)LV+#m=g|ATvScfoPDp!Bf#z&^!PLgZLnfEAC-)04k3V>E*-+ zu~wK}53rQGpfwN|%tRPK*Z@f%D2zb$dlAS&0$2pgS|(7t;gy*P0|<l4dzcY_9&xrF zB(k0WwG+|PBB)-wWG2D@!XW>^%q@A$2`{5zVz_8f`Yd@22_rwGd<04ZFg>8T5TD0l zts0-jS}Q&x=0a{fhNN%MJO~KG;sTVeV0u9`Oq^I6qz8mSdCBI9Xe%gPg2u`~7-j~w z>;TP$fb0V0RZy7=!qm0{<W|_8q8CpfVGXi#J0AnX{dNY1aCs&MeUJbehLvB)`3(79 z@dZ$`K;}GvngeQ+pcw<dFBG|K2`Pi**Pf@Mt)M&x)AJB&jx0<7iH7CZ3qMfvYs*v7 z)|(X{89-)&%mdLNZAYGqwu1632!r?_4Du^Bvtjx5%2P!6-1sWi3bPC3SD9xJIglBk z@n(>DAislX5C)~w17F2jS9}+1?f8aBrwz|UTS59^ck_YtYhl@&1QW+bgU(U_iG$(^ zM1%MsJ3$zfPC+y%ZjtS<z+neS9ApMM4LT14Bo2y05Dnsk%mrakI^EEErsd2}u~txj zS6{0abnPBU3IjiZhEvURNO*x1?BHWyc+}3o5Gl{Z0J_f{B!-M(X$?7zEV#9{Md3HZ zJ_9`Vf%ad*%;JIC39|1o)INOk{K#orrW}$c6<&z8g3=Mp%qLKDu%#PVntbyIHBCyq z5N&<r^v?xkCdfPx4Kgp_m1rv{U4k%(55k}@!DcorO=i46gyVysVy!T{Kz`i-m5V|u zJ3)R2nG3?8G`Z!cSnHABVyzQ?A=0GCOVL)4epq?|xdF5`5>!@z^uaJp97Kcqtsokd zZa_5X-gyuWicb&?;=}a8(j+JiAlu=MB~60#g2X{IXs#MWgXXG1bUXtj&4A(%#)sJf zN|Ug(cHku<jCS%dFg$H%V2G1vVgTI_4O0)JVQCFH?qO+&<CSP@1=K8%InSWxAm8bS zZVqyq1=ZCsd6=6(<~)a*Qx20vqG9eqZYSP>wrAG75^V*gADHqNP;;=Q7g$>S!zkVg zQxBq-yb^7lB>Dav$V`xVAQ~io;H_vYC_REOh!4V`FvDgxEG>R{g$U;tf5lp1c7gg` z*xCnQ%tRPKnBg@-A8339rWRx;J`9SBDNw!fNNF4trZ9b=G=AZ)SnCW1@zxpt5NZ6! zYe-ze(jUlgpz;$vjl;x2G$?I@Xi%C4(V#Iy5DiL4AR5Gn*$YbJF>gd$LGg@ihcA{i z4$=z}2hpIk4WdD58bpKk0D@>x8UxWFKFkhK8V9jK=@Qg70AY}tTpV_Q#6j|)^%o!- zl-@uzXblC3M&^Ue1z}Klz}g2KZxQjdi;scfWjg~yvOE(5a(x5R1H#zSEv$V|@m93; zz#E8JAah<p%|WhHKxTk2%pBx=B$MCMa)L#?73BX`X^<-HH~`7LFt>y3dkwV@w6_yo zC(J(N{Qm-4_RG8zZ3X2Kn4ULKbFk$JSbjUfhRAPA68l<2-ifv{-T$@)WG2Ww5DhYK z!w1n;P@V%}5Fdm=VT;XdSbj@+2MI%v+8<2ftuVVlVY>z@2QmY6Cn-n`$nPK;ghBb@ z0h4%Z3afbQ3TE+Ej#g{X)t?Lk?;&vmOS2&TI#|*ZOdJ~xTK5kU2c-)T4dR3B1YuCV zD0wg13W^V8J3x5~l-59MU>KwqB#w;+)h8fvP?`bJAU;eVC|!WqpmYXWqXfbrHK2Qv zvDpC<2g!r-AczK~3lI&u>lH*J^Fii<FvuKOzEJpph=<*L3=D7E85mOJnHUs73ehmO z^aaZo86QMjZ@h<?1v2Ly)ErQ`gk}uZb~AE%hq(!4&U>gips>Pa4s!jnr2^8{;rS@q z3QD6eJs+UvVB5bBOYa@ri1ZH9$MR9M_5KHGSCE+?^FTC6{KRL`R#2J;VGtjLL1Bi? zY*=~^`3MOcklG{c;;k^dKw&lqDhDzHRt|&w4pIxkp!B|mUA$F=OT4v&1CibtK0(49 zmKH(!L30YA_yy^MVVF2JTA2Y6-ynGqAEpnK-cvq_wu0gV*$!-Ne2`v{I5rxTmq6m6 zv;d+(e3%`u^bSftptKIcAT^-+3Y$Mb;vjiYTOLG%(glbH-6syBk@+w?K<2>OQv#n6 z@vw)Ff#G92149~t_7rmZg0-g_K8v=V_yjQvWX>n3IiR`@W-p9}<s0OBz+)<JO9-EM zD`>v|tD(*nm|Ao?0?EBFw}b5a47INST>}FHJbxkA0}Yjse4+A1v=x+=VcNbx&B0by z!}3Lp0BXLF`6Ak?ps>;cWG2Ww5DhXf<-2GrC~tr;h!4V`u*GIJEMMe&frKGQZ3~Zh zE6grX*lvN!r6aYEKz;|Q1z}LW$l(!h{lO>RYQl@i7ZP6~aRW=UAUA;09w;4v^uaJp z97KcC6^I6v*&rH}4?#4jeFUOGe3(8^zNq;s+6syfWII4*Fg80t;vh3X?IREkY9E1U zP<seOgVGF$2JvBb!14tsoq_TM2!qss?ykUQ2S^+wpT_`6&!BVx;#Xne!|VW=1Irg0 z-w^SzmydzrYdZr&wmcJq9ZWG24NK3+=?j)G3ciW9KKKeT3uMkWs5!{@cEF5+nS-1! zVCh}vyJ#!SO(1i=L(Rc9RtPf(C7*VSwk|P~XobZOtX&TBGt7Pv4HGAp2I&D|Q2ZeG zi9r4aiG$qw1M1dEAOSQCb1P`P945tb2$DAsd>3s6<tLc<PpCQA@((O;z7R#^%@fK~ zTXuXGZGGWe@fl<$$UG1YGB4w|Xe%gxf-r~=!l3xYW;QHua{PeABS>w8pm;0HF3`SF z^zZ_i^Ttes0fa$gwIDqp3<{$Y@=OfKZ5)s|HtZ3LIcEnd=RcT<Fn};<KPyb%0RaK< zoHJ})A50t@4Ni|gA%4k0Doa3d1yc_yOB@8nTRlX?TRDUfWl73UNP32)BT$%u>M!(k z1QQ3*pfUtRgUSvN?aF}2OE5mnUQk(b;wL1nBijLLw_&pbBn~nIREB_PP}u>ZLF?E- zG$@~eXb>M}2Pm!T{1R;irBP5h0>U6Qp!;sH*#Qy<$%D!e5Dm(6AR5%j2GPiTm>n>4 zK=~HbmjhvtTF}~dm>f(kOdLdm?!^Jopu7U2XF$UWnGe$kT9*zhuWtN;#3x8@A0Gq5 zuXYB80(m9|YmfjM#+K(`<(0y3(bfr2vq0wjhMEIfAB$!Tyk12vXJF+ONG;4wAanje z&B+HzpkbJMkjp)vDo7b{<hN)mDBr@g{DqnW%3m-s7!4}}R!AYr0Fd0C-=eKEYNWP; z%mkSSqCw&d{)x7N$^j4t@j)0AX4uSzl>t0|5aIkpOuQ9l7bwg^pmK#sc?#rrkhvfX z%2Q{=#9Lh?#apL{Bl6UaKaenorFW1UKx+`t(+Nx*M1$t$L9`_UB%VRz)F3`6zCkpI z53&=4L3v8%uV^bMK9KG3!O|B5=>>^{XwcnLAR2V{6o^iM+677rFh0n95C-Kb5DiK{ zp!@{FAT^-<BG~)^5(mkH#xX!NC|!W)N~j&ke2}>y3^E6n-cS5R#KV3*28Ms_3=E(( zLZI>yq!t-tOJA_`F7QvZwE=1t$ejOBbFi%mf|-LYy+`~LZH2iBWDY|I#65+`4uP^^ z<{;O3pn3r+%>Z%}hz&A_5o!*$wNEf}klP(P(7N-_KhaiDS_hc}!c0(eu%&HSzA;fi z%{O2EiMGD3S?2^Y6J#EU2AOq*QKA);cR(1#2VqdyV>26;Z(RN(;%kYtcq_~<P}uiC z<;sxq4an~xb3quCZ+fJ~Tc^m0w}!|d@{I(81UT+sX&U4P11xD8CJv%O`2|FS@(G9r ztw99QpmYPGL41&%APmYkAQ}~mv`R3DwVwD7ng;-d7ie}Aq5`D;h#ch1M`CG+PRO}d zR~W?L?XxZWq+398uzUq#BjXtiAp0RAl-ldVC<ecKb;k}Fu)UzX1~DC#6kw#Dy&#i8 z^&$vwF%<;c3#!vV;^?@8%JzcHM~@?r7$_`3G%*-<hY~KejO?f~Th{Tl#4sVk4_Ovu z?-ZyU6AuFmi2wgTLIsEq;~hZ@iwjI*ttS6Oz<ACgNV-8*57P&t70}WR4>S2`&V!l! zbOUk=DBeMs)VMF<6KzeY;)2h8xI{96(+(^?Em$C73>pIg*#p7{1jSlg{))i$fW#OC z7(v5@U?w^tz#`WA<rhT#6QuA)RtF1X7!8t3`2*1dV#6><9_BV;X=J@HHmNkF_LijP z7UU$Bq$=1b6lYeY#+N9>2WM8LD%dGx=H+DOr7ENr73JlFgyWM_Qj>EO;!Bc?^O6%w z;)~;R6f_i)GZKpwG!)bn;$2dUOB6H}qM-)F>L?`V=M|SgRA?#02j`a-C8z4Zt#QsT z%`4GSh|kGSPRs#Y>;q;gXeyLs6y=vIXeekZR4WvvmXsFdp<4^KO$TBXh=Q6O4>J^I zl(hnAvIKgjAS_-$<LfTacn5_aD9l-z85tLJ@PX4<1&>&(1TQ3g9fOwjFdC#5q$eaJ zvsfXmG%vX%Ge1uuzeu4hu_!Y!DJNASH?dM7DOI5~uQ)L+RZqb=Kd(45CACPQv^X;_ zotS04AS;Fi28ELnxd8<|7#Cy)a+0GYU_fRmAsdEdheBpvaY<@oik?D9zCuc7F*qty zQVWVwlM_KvtfNp`oT?D-9262C?CKmE<QnhiA0O@*<mc(<9;~MjoSLeT56LhYsW}A- zY57G8DXArinK{LvRz4-J9@R^72=Iutg5sK3eYom)(6|D~3`Wo*84v@CJ8~d(5lkK` z45mQ#D$y`8L6a=_j8t;77IGG#p;HmzL9RoU6i~CP0&PQ9L7h7326PuO$n&_;4NM-S z28KcD2E+!n$zgR3j0TA>;DOXfFm)g?LKs)NW`LT7tRK_|fw^l1msl%kZ|4dI28IA` zguO8Lz-W+us<;Pa5U7quYfFRHfv$ko!%!t~3S{pOs2md?{<bt+6UYwG*aIKLPw3(u zd}6I2JHhxWq%8ol2U#7AZGvP5NDVAZh^1lXfb=r(i?u$0`UP2Bf}i+y`w=R-X9B-i zYXOpZAUA>Bxq_egzCZ{+B8)+Li47N+I*^?p4AKjtL16@@p#)4E)VBa(Lj8*;)OHWl z9r!4m`46fIz3&K0cQXVK;RaO(ra=C^0F@&(z4Hi?pRPRw$xnkVg5;+ckf%ZM3c{qu zt%kg4s|}XEBP?zC2#K|J2#K{OFfeee`6tr)fmN(^j<{H>0a_kp5CDZb0|RJ{16mUR z<UBZ5fW`}40LlRAhS^Ch4b=*+-(hSJ{r~^}|1dXz%q>qW%FE14*C;40&VZdOi7XCn z!djVFTAE>#FUT)|34`r&krZnMg#~DC9uyWJJ3;1wXksv_X&p39(jtsItzUu4G4Vmh z&5*}QaJdKMULO%mGeP1hB8WVoGZ`|j020S$mH?6&AT<}{m>587S3xxB3?vW@nu`L_ zpfO|+9m~ML0HQ(iFf&1V?}&)C?t%IRS^SF#B5$}r-2<wFVQP@+1z6kz8bb%!2Rb(i zM1$t1Ks0DgAc#hmhnWR(PmZWqD|#4##9Kr$^Es$30@I638;Byp7^D|u-!iEG*Ffo+ zP<j!RUIL{-@-VYNdO>VZ7=dUQhKYmb7eE*`UWsem@BkL~?1I|2A4+eA(mS9uvOK!I zFg`w-ob+BIh6p!gvqAn{1C=8+y}uA6KV7Sclb;3?#K})DAism+6@*ER+dHbFty8d+ z?VvOWI=@XrLaa4K0$jE;d=Y|#H;1BFD-T*8B(`k-gOs*F?uKDdoWbk_(V$*Fhz9LL z2hpH4Wgr^lCJ=o9rV-i(MdC7`m+j8l+Q`yyHposTXKiidKHwP%&>3Y63|FD!R4^K( z38WrG6N7Q3XO~<^Ul-X7P&oz5iwzQxz5*Kq1H&8%NO*(neIqH>3JQPFSlb#TaTRUs z@dtCai4w#N(6}zh43NEB%piUQu?wK`AT~@7j0TCpaD%j1D=6M$B*j`m7$y#)LGFXm zTcpHVL3JN!ZV09hCJ$0Gk&l4^R_}uN#Nsnj5PuM>9$g(MO`wb6;)C2PA}iJk3NO%{ zv5hjsZjgA32I?IjEKqmB!pub)q83;DgYqc4y|DEsAoD>OT^=L`GoM%*W(G(vh`j*n zE|7a+W`M*&^2GWHq#hZA(k*hlfXqUc$H&GMJ}^D#ZFx}pCPfAkwlFm?8f34G97K-L zJWz`~L>)*kNFRtM2IF!sEZ?$#GAxooI<gRZu-O3;YtR>K1?3e``_M-Zw^}44QJA>g z12P+=5PhuVNj6gpNY4_eyFhAS7^VmLyfjcc0m&n$6%Zd62JQcZ$)#vQ=B<fI*Hh%g zTIa|>@gnIK(0U1&dtm0l=m=;WgZLmdFt-s)gY<zgNH32(W_=4v&mehpe1VGgg3Jb$ z0U!*kt8ujpJ<!rBvHpaq1K9<_Ape4B5QfRYXpk7PJcy4EgVGQ_d2IPsMgfw((e;7s z4S~v$nr|m4K+_B;?GTv1MNc<p6v&TzkRL#C2g0PrUyBa@x_XZyB%DBXHOL+i29*tO zpk+6R55{=rV5cY|>gOd$=?AP2N`S&0#DvixHgY)*;)5_q9+pmsr9t{Y7^D|OlY>Ee ziM0==4rUKXFPU?&1(or|l+VE8n{I{LfOoQ0K@(+;73M$mb|1*U$aAb0G{ssAv>@r{ zI<)Nyqd{sx;X>}T0Z9Ky!Ju%W-W)3^!buM~up1zgN+1JZ-4pP*60PT#NO$e14st^v zLX$f4W3YKs^fuq{m{$d50otc}aGoQ#fP~Mhg50V^<5^V(h6q>cq?>urgo`WPz~rII zz!WH)Knzfu6;{8%Xps01O-LOCQwI_wgmJYgLHPq+FQ|<Ucb5iatOPVxx<UhCFU&nK z8e|4F+ygQPgwfl$pm`<+ZHWCKd1MT-HvlR}>O9j4s6KS_9%v)RC_@O$tM(w70dfm0 zOo*jnc7yar=!msiAeje}1Bn;t5Z|7b(Lsb0NH4MOfT;u73Bn+~AR0Z4VB(<mIS3PK zqpzW|dq8d?gmI;Jm_BUjD?t|#ZZLHq8sy&@P&rc5*A-pz(~*E4`Ed?%Hz;mEnAG?= zVI|rsV+EOS0+|C_#|ldyH}u3>MfAbr)f}KPybxuv)-NVvtsT&|F-Q*>6FC?80x5lf z^+5?xxWnuumWFBtx8q=J5DglegpG-U%%%2R<Qy}xR!~@g#+pE30kRWh4~QlPlbT*Z zV|4-sxYKI_RF2fSnHx}j$ZiJt<AVVr9TS?1oP%TrNbf^ACI--+SrDDWz`y{aLHprA zG-wVIM1$rkK{QAnW;aN0hM`!i2a<UpIgogRA@TD-I);dF0_g?W1G<wOM1%IPfansa zyFhc0AU?7@$W9Oj>HT3S)`}iRAaMaB%)AP!zd`!Y@g6Mh0j*mC*}D$v4$wU@AU<dg z5=4XQUl0wFhnWYmx5G%R6%<A=F%S(BUtoj?A6Wi}jiZ9pAY&gR%<$O*b;m&{y%kD> z<{&}tK$eG@1+o{!289ubhGCdEXk7#d!`4Qy!W5v<cd)qUI@JEVQ2H#Cz6zz0<zdFb z?1l01(d6X63C4(ULpB>^?+K_Jsriq^g#3KwV1kHqLi6+Jd7{RI{Pep6$zD>^8YtXA zX##{vO&1zYqOBLO%&UUZCuk0{!Bnhuk14pGVgStrfb0^n7i*oNj}~u4)>9JDI0c!5 zj6v}YvlB#v_IiP6(7Y;$2F<I2Xpoyg^gSfaAiYRjisn^SpmUDTpkq@o8e~4YJs>e$ z7*}2(G_QKY6w+4!P1Afag@iH4UKew*R#5nZ#@ATP5aL%nvBw|G-3|^AwV<(DkQpHN z9%w_%tJXl}LE<nyFd8HV!#6C%T0!v+nv(@#m^g?AxerG3SctWP>T%G#Doh<r9;9X( zne(bD77%}c%peDY+AhTE1GzWHN~{$WUZ8o^3`dCFAaN5{)OpnybBG))%;rGdi7Wm= zZAo-@5HtS-GoM%*W(Ua4AodTayFl)RnE?_9$rI}*ka}bc>f<8E3&<>Fd3<bK;RDly z-nRg?)%I9I!WyOqMuY4vv4+SInx6@=g{TAR1?dCP#9&<Rg|!FJ=T%#*AogIh10>es zC)NteE1<S+fG=*fxZH-zJs`6|deFy8VDqYfpzZ>xfnk^)<at$4IswTerxg$%7e<~} zJ>yRNyy_ckvDPn^5DePih;LqX12m37ZUDI%<~Cw!kUkIw=}oc0tgAuk86=O6HEba9 z0}==6CDuNeI*>jP2I;+HgJ@sC>Umsk+yzv$7i2%EeE`C+HUcc|g5;2~1X><}`GZ&* zW){f5FgChgkT|kDh>s8BO7Ac|*vgAHNdADS1JNLRRqP;fN@{tLU<XO7pfn3guQ2mK zG&)94uXF6kPjffy$WJ#QcY)#^gh`Ei6L0+Oixc*ca0In4K=yzzs62B)FRSs)1uw7{ zYlXEHO7O%P$ZSyDfoKp$u6say5C+Mkr!_)+kUkIw=>^f`V31xy_Mpqd>;dVeU@mw7 z_Tz%)55U&qog&szh{w7g7ZwiaZCOxwAkP(Zc!;&G@PMSR7tr=Nj0UL%g&Vn3At3!D z1%twgx^u<x$U{sd2P4=$h<W4q9O%q3NSyXFXe2v#R0EkIFu|QV^MAvC-Z(yo*6ALU zx5zI8VEb_)<vy)vjwO<)lWt)9TG9JLu=NHodF12`3MUXB)Fy}3H82_^ZUC*1VCq0( zgfOnQD=2@U>jm{eVD7STgNy}%#<d@~LFz$}y)gH{Xpk8oaS%-m#^oNEUi7v!Xx`Yu z6JkG14U7ia+X0m$bzYCb3)4)Hc@kcT@moUk#z&xbgWLns3kwrsX^=h;2I-yPCDvMi zWFAa>g%|Pd_7EgLfy^Y<9WZquJ3$zvSHWAX6+MhV;uhY-_XVC%(LEq{fx-wx!!XD_ zAU3FP0m6j(7bPG+fiyt(!@&GaEDhC)F*gYl$3~Nr-ZgwM(<aDlkbe`Pa-^pBIX>j4 z>l;4gr$G^4^3w~*&!Bh(VUpuETC{ZqmbnF3T;K5(YnAW=&n<9(##<X4#agEXinShq zma!na!I;Rog$+n)3#<=HfZ_~hC$ThCD@Hm4jU&@?4!j~rtQ8a%pm9M^Sb*FCazBVB z29uiBLFem<_~TCNDNs35=iu%@^&z_%<c}}@h;;089&(-*NE}%mjJ*KK43L^na!d?H z3=9k)+5}32?z;i;(P@x8%p8zj5ZedIJP;oy4hjPh?zsYS52y|X$)jU~07N)}^n&aK zjeCG-(3zYd8g%v`HX0-kGY_N}#wJ9Q6Q56z+=*;H$X=O1h#yFe&xk<s;|=5nQ22r{ zsbS2MB-$!tjk%5n6vpxl3=9fEVy!Vj;4*{(G^P%+t0Ppbb&emzpCCRM6Iq7j;0ZgJ zogi8bn*KoX1L8|U`7j#&40W&@pagmuk`pG@3UWIr&x70!QU;1E5KRmQxdER#^!6Mm z9yo&0!Ut*q$leI39I0vK0#qN=C@=*w??o{2X=e(O86dr%p?MxegYq<p2IX~ZG)Nw7 zDYR_?Vmlz22jYXw1ks@R3J`Wl69%9ChAYpjgdoBRq!(l_=-veo4a)l<8kFaeX=Hhj zT_6n73!;g^<izI<BzGd)0kT&h6ygU`<I^XU{CESo0TjL<OllYhq=>f4*kI;)P#A;q zyhxZ>Yd{zz&x7hqkX<#AVyzQ`ApQjL!I;QApMWRqV0MCNP@V_Tp!fmNpuCPuBcJ;Y z3U{y@pagoJPlyt01-TuR=Rs}<DMQx-62pZ-Zonl65=YPTpn2y%VQAq4QV7i}KH(5K zQq#y0s6MDsU<%}qJK@Bqoem^3KzhGG^E`+K<!KNN%JbN0kUZE@s6Rk#6D0FMe2|$S z8dUCqFrhj~A_5W?AUz<xAbUZ19YllbaS#p4^Vn#RJV+l1gY<%EVlX-Jc?QXy$aaA2 zWr>9Nfz<ePh$KJWKyCnqF9?$w##7QnTV-r9^E@bwL5F8@M2WS!L_zXAsJ;Z*RS+xI z+Jc^@iOlmMc)|{5Cx`~+c@PbX9}q3az`y{aL2d%kq}1~bsbZ}lw}bLL$n79MfZ_^7 z6N5o+z^4v9&x7LOLlh((pz8zK>kti*BQ=fefa*gw6J*|nXyVgO4U!oky<g=Z_tSxB z&^=@zT8Dvw0UHgHhuIC%3u0>^nFr#-#6e*I!i3TzPYfh1V0uCJg6eS)4Jy|`H0Z7i zY&1w7qz{B)_JY`iFgfvg0Lh)m=7a400hJ>)K22iDk2jDTK;a9*q=xa04AE8zJIp)} z3S&?`|0h<g)glg(=Rx%)$gT+)VyzYEX`0A9?*R=TkU7X06m~E>K{RNMA&3UW4~PcU z^T;&5G9JC22ib!>r+FeptTiJQlGeV<F)@JbfYBheAh(RpX@WumKL&*p`STeNvq5Hn zrXfr6v*U{)LPV1wz2HMi!I~ixm>@A)&*Kp7z)^)1hd@9Ib>^Xl^ZX?^`O_iMgYp*n z`5iKU33e;3CodTo7($AulWyihQ!uXiOPD-V8JGfv6Nmwtzl7B*Fd8KOAq7(Rz|?`n z2w_kig-s18f1rzl#!+DI`jG^gzg)_|z_1`0VK2-*FdAeA$UR3g#aco2Jg9vPs^?+i zAetDA%bhU2=<Q?Byrw`J#9c5oFdF2Z1gIRT?Wr43eK4~?G|0RUX^8osj57S^49`I_ z1Ed!eR-pY~AUd6afdNE=_J4tB(EcwF4ch+&qCxT?J3$zv7esp?nFr#-#6j&g5KbX* z7Nt%)BAh^aLH2;ISOC%OQ1^iDPy_Kn`@cXmX#W?82FZi$1YwX~5KRmwCq5q_xf9tA zki8Na5I>L_pCK9K#~a8EpzsA@Qo~p#TeMZg9<zN63RBQsMlzXVtr4I+!@$4+>RX1y ziM1}s6>FW53h^h%ZZIaYeVl<O>|l0+XfJ4dgW?Co2lbOcG^ig0qCxlIf$c>alY#Nk z+sD-2L%OF_tQ8a%pfUs$79e{;aSx)2!5}~3Q-`e#3CThWZ>RwvdzV1vNKJDx*_dX6 z%rnU*J}o|g+6{6JNbi3+CI-+r7KnCZU|;~zpgXfbH0b_D5DmHm6-0yNLHa-#q<2lW zSZfcGc`)%K*@(U)q4ZsV<R_4sAbUV<BM_Yibr0yyM-U%$&Mt@sm2n^%BoDF^gh6^i zG<q1p#BW&3wSaI1v`holg&_49I0q5NAiW@a`k?Lro!tQ9gUT)t-31lzfzlv(n0X+* zFg78Yob<H?$(_jNgY10+l_NEMY2=chj#6^Tk8_awL2(1Zq{h#RT+vpBYRvKw6hELl z+;#HAS~Kz>;{~9$1jw!#m13=TG7<3%5+n8uSQ}{Ag7qK~pm2xT38Fy<YJ+G{+=6J( zz2qPoG*$?r=cDOG;$rMo1j!+f7qFCywJs@zxSvHHGF||qL25y6867VGg#>;K3McaW z4-m6KX28b_$Xo&qG6OMg0AKnHUS~pwZWP2Lqa@8kpr?d7eLztC2y!g0J|IjUqy~n; zX^e)62{PIRIiH{0vIi+2(a@!k5CMk=xekS%nFSs@h|i(<=t0XA>ZBW3or5dgz~mtz z1R+7;1Y&{OORzcyMuWt4p!E<;9Y~B22Gxn!)PV8_x;SX;0Ol@}V#wIRas~#5JH?Rt z4`eUQJun(%21xu&l~^mN&Ih&oL3KV%97Gd?ak&$w7hAjErwrmQm>L)ja?c#79I5Rx zk#bBkLFVa{6W?CD0ks?C9*|y8Sfw&BFo0;#edi!L4$23ODS-H(JJdlmNFJmQgh6_j zl#8{tAejdf-&0O}8!!XOParcv_B2B6?}pN#vtvNwpfLpyT@Mup$%E_!VUS)BjUGlY zanKr75QeQ&1*Kz<dUX5)i+dJA?E|GZkp0u4d{BA>@sZ_W=E3ZR@$u2*q^~s<m}voI z2gu$hP&rc5mqI1^=_sa>{5S`>8x%JnOltgi6pFTrU}^V*;sw-CRjCqdO#opA1`bgF zza>wswWMCG^$N7S0@)45M2>@)K*JWS2Z;cMJIqcH?FUUGptuF`LE|4F8nh+=M1%Hi zz_f$(!q_01*5e=%4PvdJumF{Zps)bhiS7oF7%mL*6D~QBIJWXIrW$v8T?3UPHNC3T zV44Z?hfNLf>G%cIZm_!<7#MiunHWHGxF8yINic{8t>*#Jpz#k74H_o_(I9z{J`e`k zyQM~~bqbPsF!3`r#OI9)BtL=71la>Bk3n<>)O~?a8Z`a^5(l;OKr~1mWG4uN^t#lF zwW5a+NIa%itQFM924O<|Y>rw)7=!eJ?3n<yAG8+<#P5XiLE|4FK4_c-M1$l(ZUJGC zUJwlmBM=S4FmX`c2Vq$L$94X|3@q;12DKk_W){d^(0xK6dJ9w>SsvY97#|-^PI~vL zLxdZ$*&zS6K;=kH?+5D0PuG9y$WMb7_2j1)kl#V^3c{quZ9|D@s|}X29Tc~qF&%~m zu~wS~$e0eOjR&%ep;fH)Nflby6Ir%jK}uU-v!Dbh&R}+eXwXeOAR3e|Ks0Df2SkI$ zbU^f8s6G${(hH(t7`<#?(I(akayzIj2Du%i4qXpO3>OBu0hb&|9K9?Cot5*V0WEw$ z3Zdii7L5=&Qq$%Js6MDsU<%}q6OD*8OK87d36dEgy@K*g4B-q63?Ld*)`92%C?9k_ z0Eiz7<%8tGmO}mE&?MHXfMgy>4rFFT6Jo!U#7=3v>$_Q+AYlR13$ia0Y9FXg3gRb0 z`Jj0<5Fc3{qz{Ba_FiZbYef$ukob!xu~yJJXb_Glfz12iYMV~M;vP`h3$hnf=7Q)N zsCz(T(;z;wJjg8|46+wQgTe?z!!S%7v>q6QVQ0|bDvMQ`F~bKm_6@RkG1MKPwlau6 z2g*m5N4FQo$48Ts-ftke6WMH#e+60~ejqiy`?Qdst~*-DPlHEV$WJdIzk}ixgh`Ft zGZmt(JFt|+ptuFCiR)<<Ydz5lDT_hvOORbTePXQz=w%I&WpM(YID^><qCt18foRZK zfFK%l79fZQxd}vr&i4el1%yHI4WeNfy(}i>jx_`5IeB98OyKcZ7!5KT-5!t_E{rQZ z6FLj<Nh@Rw1auZ4LmMOwgX|4x7i$HDKd5{ZKoZ|mi#`5e?w-*PF$2`L1(^YIuf!6> zS%6od@*r`T9vBT0gW)F~Vy&Qf2c07b!Z2|V4RRlhmgo>`1=W3^vjAc0VDca}i^)6- z(4Yh250Dw;U{IPMRv*Z{6<uPjpzs2n1-M`W#BPvyNj2(OfEn!&IarvjfVvY`{Dbl+ zx;uzD3lL^Lu{6vMkefklmQIK}LGFc_0TKtv6YD3CdSuMRz`%eUFCep!<?*p`g%3;* zw)V{ls2^ZzU^K|yhHi-e2%YWqq6eZ5q!*+QL=%H?xffQ4qMrpgp$lRUHakFKPv(fV zg7ONeeYjyZZne1FhRZ!5vq5^$$ADpH0dhdY38V&wVS13y0tBTKkUVl)0r7ERP&)@E z_otfpvjBg9+ye@$F0oe7*=qRC0^9>q3$+B~W|-TErJ-8E<$6I6W_=4v&oDK}v<X_8 zA=W;aI+$4?H-p%qG5~~Obv3Sb;TkI23$h#LCKwG8gSiXDCWLXNJD5If`L>}KlD=VT zU^K|y9Z)$^^X(UqKBRO5G81GTh(^cg>BgXs{J0014T?JuCN=(K>hagr3edV3R9A!S z0bx+t5P)9p;W=0DN1s?Ltls4Sg%QXQGz<$T7!8s}F2_N95C+M^(h0FNNFNA;^nz$| zFi0=4_QBM_>;dT|?_9m&)DnVstd-^!XQt<+rYL0Ql_<oACFYc->L?UvR;9+5D8xJG zm*$n=xnd1w0owU_P*Y&q;Ww;7=2~I?LvQzi{ENJ1#ALcy>y_z{d?o>HyTWLYT2Q!< zI~@wrKT<F#oT#;CBo7?pq=y{X4WP+#hyk#vcW}K$^NDlPoja<7%n;Z!jXLxGpm_q2 z6VTgyurtqK@*p)Z3{GP-OiZvu3$lmYatDzGXy{OAfPmade!hq7HGyVVn%}XuXA^bO z4QR{`<b7P}1||<u1H+(j0<l4DR#^Q4qe0>^&^idF4kShh<7!ia@&~$JP#YcQu9T^e zu@cZ7FFeyAbsxxHn0sI}$PAD;h$aT(at}-|dK(wCrzB+t#D16>7!9&_3sjEOv%_>| zVwwpu&t)d@W0W7Dc7xml(hCa{Vrh^*5C-YpGgGW}4w88=@hdZlZ%;QM`3YnuvF?DW z1KA0}AiW?OJ&a)Dp!PWk6KbOi%tC}QNH5GDVrh^YKp3PKL=%I_Nnb~h+=*-l$lgCt zIa1S?#ccA^QORub;~eCEP~3npsqw?mBihR2h`Amd7GE}V#9AxnfXAyjKx242CWy60 zED~#d11*<8c7rjI<JCUUum$TuB0%8|vy)gFrX8dg#s<-#u}NB<FUPP%tQ8a%ps^-U zSb*$AcLPWa7bZ2mg61Mi<|6VHvbi98k3i)}otv?lhiN9rypVasr(*^rGeCNk<e3;E z85kHqG^m{fqJyA(&>SR)51Ok4(I9!4UqE`#%oA%}1N95C_>+0W&jU@s;vUd?Jdk~5 zP<Nz2Y0w-bNE}%n+1{A>Vy)<51afD|e9XKGs=r}+k!gkbh%g4}1=$B$j|ZYb>q9_v z9n?LbIY<y6SsrE<Nbj5ZVy&Psf{B4>kT}Z%MEJn+KWrQoqy`ypz~Uaz`V)}7pgpD_ zdM4C8pmqU>k1P)}3uG^d4GJR=4Z|>T&^iVXhOK45b;p{+0?hE)4YeP1=NriWjZpqh zD2*(SZZC|Fk0vMoeL-?3ve_X2>MVr#fz<q$v5@?Hwqzk9&I!%WqvweS3&~HvGK&!Q zlA6{);RZ?*AWUky2$(3^`UT6pDkyz`<}jZu5^Ggh46dgbKyv{gyDHX*wf>m{i5n0f zjEStLYVgE2%uWyux?>GQgXUF1G-zHGM1$M}q7Q*Bg%F^$0%1W&^m>YvdDV`^kU2+n z=-3pD2APa*4@e9b#+4Tc&8ylhhV&Ic^QsYxAz=)%cf}I1R#5nZ#@8~C#J9}C9)B=* zFIfvQ12k3(G6Uq^HAf(R1hF4L<w0zi9vBT0gJGLxVy&Qf2hGWXFiadogWLzB3zmwt zg6eV5yedo`Odh0W1)1}z9UyZ-29SwCX@Xd-AopHaF4hVPFVMW|nRSpb1c}E?L7i7U zummCp53^+uKCbu&wI$KrLCm}=%zR>Lm>nQDgV-@pcY)jsGXo?Jk|)+rAoa)?)W=1R z7m!)V^7z=e!Uv`Yz3&QYt0^ppge^=Bj0V|zV+BNx(EQAfRS<O`y&!!cni!1By|DHG z`n>83s9Ukw0TO$$TdWn7S3qsuExRCY0*Mpj7LXcT?tz(sK2`#oS51J16UYo0hUr0` zR|TaLkUVl)0r7ER<ayOKGl-v84Ol7G8nGOL3C*jDtb~LU$PFMj!`wzJ4blg~AiXD6 zV%F85^bC?m$30ZE*I^ZAJ&&u6%Yv3xiS;K;9n2pf|AN?{_5ldP+6b_;3z9>|HB`12 zWH!uAFd8HVa~FtB2;)lcFn!p{i-6UL^a4`{qCxg{K;=j+FOIB+q*YLw1*KP*c_11c zqo-GfHRPu`n>FO88<4v|@eabI#=XcK{Ot=JX!`-wz5v++!l3eO1+=~a@xd6+TrkU8 zu~t}H;RaIL1M7nlpg03DVKj)1T=#(ZAPka+r7>b@kUkIw=>^f`V31y7?SrX<*#pu` z!CWx-va{rj#3BU^1vLfmtgV8kLbO7BaAsAiLadGg;n`pvh4`HO<is5C{4nfZG=-9k zqWp3N4FyewYK5ZIlG36)1;kVb*jBJ*IuM(5;1kV|DPn9ltU>0AVg5&N%YwoKd9FBT zt5_?~Hb@@Ugto_FG)OHd+{m4?0qGwp7!*$A&ly2N31kLx<U>TsBSB_?&l!MBM8OXl z0EyFn28}#7kLn^l1ioyc&io&2JQKZ5JACGihsYgk;B_LjKWJdaMe3v*(D*7S)#6Gw zFnN#~7zUL=AU3E?4y$WmG)R2PR!DsWQwI_wgmJZ9LHPq+FQ^X!bJv{Bkg*`pUR{?h z2zz1ffzco{sNo)vIUtPQmIlom&w<v%AbDgAviA*Cj?{U*l<g2dp_^B;o%r!v4J0!_ zZh?gfu{6wXklrub#agdG{empcvxE3{`wl9)r)7s&D|#4#+&O0l@qGc09f&Xn=_NK? zVCs;=0mKG{5r~FikeMJhsBZzng!&gZsO%n)-Gnf%{0GyAExq^bM1&hm9f$_`_Xt#u z)b!4<i~MwLvy1#RSh0)z^aAoTC|*IB)VMvdMzr+|mbnF3+H%+})>^Y0Jh#9B8gG5F zPOMdDpIEC3S{@|!Of(T_ynx({j6rb*vy)gFrXQpi#s<-#ab#M~feY*xYXyY`Xj~8! z79cy(-2f89g~>_l6?<@}^%GDzQs>~Xxew+KP<;Zzgzi{l*^6)&NUyOx69Z_y9*9<9 zU|;~zpgqsnXplV24IsTRHX)jv@Y{jpPGs{z_I`lMkrRHPFalvx!)eL}(N-QO%(W+= zaN=WNVA!!wto6%2aK2*zjYEUn{N|8YD+4sHL3}VKa!$_y>PN61Bm(4rn4KURG?xdW zVd7lSIE2xlxjmS6kQx{pM5E`sDM!RwL2d`-6R_K%`>sK1iNU1CGid%{!G1(~M79Iu z)(=oQQsX(}0H&EB^BN8iUsvcLnE}#kD$m3a#=yV;qCsm$Ks4y=QV<PVGXkPRkmO;0 z0qOm5K&<r!)Gx^50tXRw2%&lLJy_fWIvWIJFX%1<5Dhxp2}Fa=P6g4(^2qjr*yv#d zawkX}H0J=qg!Zlb97KdMNH54f&^f>$x)&M_p!1+X{5B{bSsr8;2!r&3Xksuq>5BoB z2eB9qveyDCM{4>iIYfRs+Hi>cI0tzH6gMDDYW(ckB-*M{gIRuo;s;blR2&v--EtUG zeu3&skX=hoi?wQ?rCVa#4IN1717sEqgTftVCx`~!^97<o<rs(ttw{jUAUA>NKA1)< zWf6M$Mar548R&ey6?6;~MuV&axe-JYgK?!vLTeH(9ES8mL2DA;9ERj2ki9lX#acn( z4;sh)gCx$e1AF|z+<oB;#0=1!0muxH+o#+|tV!TG3y}wj!}P#tkQfYKI40H#ig(a@ z1`vjcgJ_WZU^L4yu~txh0a}v)QwNg=saZ$nngp3+2zP?aAr*tt1hINR?oBx%)(Q$Q z(3*rj&@cjtGi*g&lMr$g;x1U2O@X=-SNxN^CIMzXu{6xDU^g=`FnoZz3*=sy86Y)a zc_RG;Qjd&5<0r`R0yYa-0UkE4@PTPT?<a!V1Y3?n!WyOqMuY6lISG*?G{+co3Zf3A z7o-nF6N7QN7dEepz9ymO1jHU}c7VimZi=;n@(QR;_2W8jwYc1d%RL~oL3+@~;b3bL zzChgtQUk*<J;-YkK<NY|kDOLOd|Vh*_rT;PY$JY6!jqF?t#6J)Flde!-(K$(&^QL! z19CIWZN$<beIN|d3!*`824Ps82};i(adfPJmS%{x52g-g9?V`4A0`K*L1M`AAU-~f zEB;}6u;rgGNdADS1JNLRbxuRlAgTE$<1{4hKye6)KbUzS8Xcp@A4nb){vb?h9Axao zU++aA)q5a&Kp2$IY|zUPJagp+XT(}zbyy9aumhP53PTVL!pLPJh!4Ubd01Q%OM~=* zFi0<mCI^G`5^En!9n2n(Ub5!O!E+Z18VV#%l;hqf4Koni9JqoeY<o1wy)ZwZx067A zLZ0vTxFXj2;tC|q+d$iTFdC#5WY*|>Hz*|VV^BCzYrY#C%lNIskOkWhnk)xv28~!j z);)~QZDR!0kQKOanL2Zn!+CBSoc!sK=)w7o+=3B$hCbM>G(SO~fg#~7b<z#&9y|0l zHEc};OddIdfx-#I2hDB6>J=Cb5-)((Jur13F+vzun-7#f(Dj1avM_g5T!M@#fc8cy zT!z$nAbVl%fzco{K;j^p7>vt3Fumw)P|)~##Z`#?Ff}k5WbX;69I11C4%aZv1eq6c zjrj3679=x3dSPKgERF0B5PJjEFCaDugUkfcptddu6Kd~Hp|X2Gb`!$n#HR<e?}~0V z$iEFxIa1?u&vo+S4df0`_<}I0VSM9=Xe);^=2$2!4Yb@4YdvrSJQm6U8XvlHR;=~P zU9naMw74dAEc60W9E02q!=SK(*-0#otQW=x(V%fJTF#-?+!t#Fg#~CF0~{7u#$!S5 zz=cUobD(jcJvTA)JIH)cxbfVA$dNjB-vZSKG6#l1=FPc9d|LECG6SU7O`eGXbblR) zj%HwB0MVfH+(9&GP6$MU=8ix#NFLc<k=tUeU(oysGE?U^@$&>Xu(&4+>W)$<4Z80G zWIt$52t*^xBfDqGZLwDLFao(}&uz@L5}-N{rWcvcxDAOLkQhiW$Ue}0dLX(V>K@R& zA0R$xP6$LJ%Y*cRFi0<m289ubhGCdEX#E5T6Iw&@1B-h=btK5%)lm1$hSH!jjzQwc z^62)$`1ojY()*e_h;TzT8|2?7P&rc5yTV=a({;>U^3&jqyX2=Akl#V^3c{quZOuv1 z)&wl`T%b4w%_$|^6KkDw4_vl0fW~G)b~!v3Yjr`(gT$8YCeU~RnS+c$aR##!MC(J- z7igXf#0SlDfoPDMKs4xn1DJl0UKkrhqnGWZ%yY3o=YYJSV;?XYWG=crATeARS9&Hi z&$Z(oq)iH%=elwalD<Lqsyq;D1%*Fo{N@Rg_??T`;}7QUoEH!?K=WK6GeGYBQz+gF zY6pYZE1>cqHcStU28qG&j)!8cpm+z(k%2Hw97KcM2czFS5Nie1eV}<Rm^zp|NX=$4 z=ebxOLi_<TgB%P>6U6ERx!32hSSu*JK=WJ`FClh=#8u9q&U4v3fXKnZtOn{%T=7rt zJQvJ-VriIPL2d@IZ$RAzaxcsbkT^)5SU-W(BV$k+LXH=ZS;+GE*to(6rU$)`1Zv;R zc?1b-m>L)jvNz-jM2^rn{hp@~bs)VUeIS|`jLW^a=DAWHL+rt32T1I|SFu)5UIDca zd%oaSi_2}e+ygQjqzAoE4x8t?19cZj4GhEdAkTAw(g{c&Ijw;BxG<<+0h5!tK>R${ znI~ecR~|tyXr2V$Jl6zh9E0ouxf$j*Vrh^*5C-XWd5T%zg3>cc9vyR_r5R%FgQ<g= z2eKE$2G!Fb46CbgwF?`lY%j=en44fUNDSsK5StLjmF{5ru;ts3XOQ#_Qv;(x_Vz&K zNX@q=o<Y(KDD8mK4aiK8c_11cqo*5|=j6vd$ZSyDfiS7@XLA{UUH#=bB%DBXHOL+i z29*se=;a=sxw$jX#adzY?j5A`12PMSVc`U$LE^~eIEW9zAbD6iA(jT|17VO}5KRsS z=_S@am^zp}Aid<z&4D+Rk~lj@(!N#j5HHvkY*ThvwyT2t1M?$#+YjVt<heV64`Qtw zK0wltFSPv%qd{sxW|2EY4bneSFesd;I(J9uUD(i61DVAeoyQw)>2St->deOs`*}Rt zZ&3xG8%}=Shn#H;%dWIO-1tPjcq^!^A~rwZYP*5%@CBKH-e-W#<H6)XYG4><FR1Mb zt7Bj^NR0)w9)hU@i4nrM+y}}Z=z2kIb(p&x-a*DpKz9?rcn7KfK=#7i1EWD^fW$#G zF&LM7V0zKpx}bSHhmR2ZVQOGB$leK1Ia23+I6h&T2{KRN6Y*n}XP|b2+yl}J3lm~# zkUkIw>7DUOthEBkJec@~PsF#YW03p=GLu+$z|?{41YwX~5RD#2FmX^j9fS$B)!$Ir zJs>v`!sMi{1)nj~0>~bae{VqLNKIcNU&v2K0bj_EbCA11aRb7n#!tgT(N+sA<JPeB zA@NnLHRLOJ+?oS4mN((0SnGu!Vy!2j<r2tlFeY+;nFcg$!FrGgP`JbFB$kG02kC{e zK{RNLl9qFlTYieQg2Dnc<^&20ke%pm0Eywkq^4JuQl^%GZ@AOz0;n9Rb2Jj)G0g<| z!{9sOeqTcS74Jap2Kg1FH(Z{H0W{|Tq74}s7(lcZ4jLp6(g(sIy&$>+$vhArCjMfV zbPEXgToGvniG%7b5RHy=ko*MF3$h<Hh7O|bq3*E2L4)LB=7IFW*o0_u;#1)VX4r%5 z0ofY?l_NDir~Dv4-avMP!WV=|4P%3+qOB}0nCluqVJ^$Sz!39OtaZjua2dh?8m|S} z_2!RQ>y58yVL)UVvH~fNL1w`)DC}T%f@siO7l;PM4~UkA#yiMOAU^W=5J)e~91x9O zhFth7)(UbvD9?l34pIZs6CYesl$n<fPs$)MkQ^}><Su;b(A!0zav<UtT9`o%0NJ|& zDo1L%G5L*YCdfRW--z^d<|jlANE~V<3iSkPH%JhqCQ_b>!HR)_0Yp1OY0#cK5Z?^S z2jxQ$A0!Xb2f`q|&@eRu@j)0Q2BIe**#Y9i#6f8mgcYFvz*RPMK;>b2L3V@IPk`un zsGGc@G-&+<NF20&0z`x4LHa-#W-o|M2$K`XHh&;tjczu`-V&%Bsd2pF5BYHkatA1U zL73DqKJr|&mBAIWYygERC?8h*6>Ht{7g9EW>Q#_ke;CDEA3)O^h!4g@mJLUc;ux$C zN`S%+W+#XSohbmKLGc5kL1hDo2Du4DgXT}5TETr;7#l>Rmkke?#9Kjb2bB#Vw}aGx z>;uunV2~T|sl!$dB>cmjMm9j@NKGRe|1r%3`NQEq@oDD`)NYV}KzifknHX#s7#Kjb zGn59k4?uiS{s+;Zasoty<U#sC7^HW{f3emXNan%B6&S=@L1__$38lvxBtL=71la?+ z-yKAQ_N{|xU#Po4c^$+Dl?fmkBoDF^gh6^iG`27TiIaxKS|u37TmSqQZ)ISRXa$W# z!pw)!ptd{+6Kc=LFo4W}*bdSQa(6k@KcKZvAbu{C4_cE2;v>sLbb?#}V-cpwNv{Ho z2zMge0CKYjRF2g2+QNuP2ZZV;^mKUuNiV5s2;_cH+<-8t@e}Y$w6z0Ee+v{Zpt7ff zNxbz4lXxqr`~kH&Kz5yA6K{R-7cFlRSsu<nN*^GzU>FqcFgroC8Z?c7;ugdQm4_f2 z<R%aex_<*%FN_VM(aXa%?BcB;w}Z+<klR6OK=y%XVlc=J_|#!54-1%ar>_H0Ia1S? z1q-H`Ab$j~AkrP7{?Q+(-5~#f^d`$QF@PG2AljILfdNG8;GjYBAblVV(tCwPymbYV zc`)%eNbVujcJD#*6Ua=E{h)pihz7O8Ks2a4#zuqWL3V;LNN;=|h=nLS(8CL)2BZSC zRtJPnK<x&Nb%Mmvu?8z5yg_<FZUCKi0-^(;VdMd&L1i{b99bS_9!M{YO^7BZt=&O# zC$jk<dqvnFejqii1%UE6w2w<_n(9H)OKSXs+z*Ny5GFN#4!jj@WpKl6+kxT*RBnW@ zi?>c-hm>WYHWJ9L4sP+*A54%i0`b9^$g(U2Pq@SE1ks?ijUXBnw;&o+mVs!Hn?N*Z zjWpO^ENjWp%d#9E@m7%AL1h`p?I3-icm~nLV2~T|sl!&5*>IqR57YpVy**GlQqva; zC#IPo^JF-QFUw9q?FKmqq&G#Li9wNpfdNE=`r05`2FgdLLGmDdAPmwwg;Tt>1j#&@ z_!=bl5K7AtNPYsD39=v5wgl0jG8ROG#-6azAbF6TAPmwAqS3<$CJxFQAWSHKyujif zP}vHyA2ikgqCst55DglW0@29wAUA+8%w7<i5GE&m&EdjK3m|(y_FjR?k(#~)xXDjP zK1g~=jdPH@L2(1Zq{h#N52CFs?wI8lC|*EktBLT4w+8S)$}dox24q)^fOzW>cC_## zviwqkhAqe(WDE*-n4KV66q<)%;-EWaK;j@bfoSx47}+fJ^2<R`ycOhjQ27ONJ4h|a zTo6qRCMSLU;Xw-@s6`-qeRv^qq^7SUP<>FNz!b>5JG_W=N2m|bfn)|qZyL033Zg-M zPY?|%KR`4npMq#mTL?sh<iVCg>x>LO@m3Qg^FVSSGaL92?jh8#kl=%a1xzo<9#G#D zM1%UCAR5%p0nwnoDToI3O+hqB9;6S1LH5QwXCxNICxfno2MNK)EYQOZq!y$AlwUwN z1nLG{ZL&R3d5|8EUXa}d3=9k)x(Z5z?g#|&LCrxBjVuq+2f`q|AetCVPMRy=M}#G^ z9UyyGK;=kHb5HmYaY<_0QV>AsB{dy@+z*Ny5GFN#PJ9+^W%0l)(?Ib8YX7_t5N}lx zgp_HZwhhRx7oy^=E$Dfc$TIB*Qu+Xy1;e0lhuI0DLH$b*4T@V34Qi8tXpoygH0aDe zWW6vph(<5d&WMS(g4_-&(?D(qsR7vsqKUyEH{er;txa}85O?}g5Q4~&n!aX0^&z_j z<c|$Ph_pi}-Nhi80n(c-&%|KIz`y{aU7<9ntpnnN$}$iQ8jl0fAbFVGAiWyG;;kG= z=7Hou;ts+H_Yg|UZ;<qZ^n&aGt)~LfpuK<~8q{Y4(V(&nM1#sa5Dk(C*$KiRy*q@( zThYS^Bz{3yycLu;K$uYes1b(54a`iCJw?!Pse#g<yG=pjpmGaDBg=#IfiTEk5Df|= z5DmjHanM*02*bvMVEY+h>R>dF2&Q``LESL}N`v+$g4_YR`xHbY%frlp*$d<2qsd9{ z2aw!}Y&OW=A5b|`)4Pc%A{~*Mt_zU#l9~qBh?1XPKz;|sD+rSsw<+I6TjyXI>jT9p zsN5?N6K~xh1}Td{?KF^GE2P9*BhbqlBFkbAXuN>TLB^msgV_n9HK6GXlrBJgP+1J3 zL2d%kpu25h`aybOY!HoJ7WYVtw}RXbDvLpG2dP2V0}{i9L2ke$2NK6t7RQJq@(@T3 z41?@l1C=8+ZK_CMnh7$`MuPY>`vPh=$UPvv1@cS`)(i{`AleB^>p^MIemIc0C6o`6 z2k8T0klrm4;;mDV%!7%aL2?hFd{BYpCy<#S`#@(1gJ{tBGKltp+7G&S8pH?PI}M^i z@*q1w7^D|OqlXbp98?a2Frl)TLlP0jAiW@a@}c%uLTS)GagaD@&H_Xu%Y)ni!XUjM znixz@`r3o!PGmbk_I`oNk(#~?q{vT4IY@d*jdPIuL2(1Zq{dIiZ_!o`Pt3L?C|*Ei zg^9FyYk@SR`~tPfKz5lZh_^lwL&P&kjMzQRF3_+A>p>zw;SRGCM1#inKr|?BK{TlR z0?{BhfoM>_1g0IN7sdwB=;fD$qIfIF?V$1t<aUr6bUh$3To~jATyh|BY~`1X3|jbr z6hixzIZ!!L)7KNIKB!S(3gnMJGQ_956-Z`)^p?sqF@VOYK(q@30|ST#-Q^6TLFE>R z29<9h8YB<46zY!>S@G5oB=bOWATxVp5$++BmMvrv;RMnPvIlgI1&B_9y2lSngUT(C zIH-IB(I9z{ogfU-%OWS<iXKKFaT$<!7E=o``Qro@_Y^|y2lZb-_JYp00MVdw3q&K! zgWLkbAbUYHD2zZf48z1hZ4D46)ZU1Y!wjE^Q1?uS((O<hbp8d%J;?It_QLr1XmZj! zk37Pi$Yz85>jIS{HN7{;BhnF}wj_GG-h-r<)HL`*p7^#TdU^r*9Tcx1OlsUN_$S)B z1xs5J6sMqa?|_1M>mLP3Sqy5Ef$Y*y5pP{0jTZJqwk4+^r7e(IFbs+_n4KV69h$yC z=>o(DmBk<$<R%ae>eC?Wg|R_2dRfe)D&7imJE$xMxgDeiWFLqo27}yyPaU?hc!eTb z_&^N++4}=3M{3$EP{K45WL}37@oCls$qbO*D(HGT5Dgmt1<|1ObRZhEo(@EV#w<ZJ zNFM49_&DGLs9(^<L2GD0m{2}Ag2g?c{yWG%(Aqc<4O%+~qCsotKs0E~5=4XK(d~ut z@zLbOXN59m*n{i<h2aLM9I5g7Mw$G01KAA<Ul1lWjIS_CwDNdiw!c7O3d&zwRK#09 zs6g^Os2u~gOGCWX04=VGZGSO9!v|yzG6sbm%uWyuS~~}#LGc5kL3tiTgWLq7vGpBb z=Aq~LGn(S9Ah(0^{0j|8+=1+asV78(+<;FFwmd&a6=Dy%K9Id{pmL<9krXvdGePFn zs1cubG?2^y>8*#(Pk?C9`~!#v%};=6P+kYopfNoV4U&iX2c-9lnt1CKs9%u9dDIc^ zA(S3>U~vy<tPW%!X#N32gXSkdG$^lwXi%8|qCxV=_JY{xVFYp~NE}ojf-tO3#5EV; zp^gY+kY12IptWou8no68M1%T`AR4sR4MZc$gX{ufkX{f?3??Ui{XudkvK=6MO`vI< z)bv%LfrvLk?H%-Vv<68psc{Z+KPYZMnAG@5V3BA&fu+p?iWg8>QKBi{x<M0Ceu3(K zkX?6l#9LL+(k-#&R|}qShuI0DL30rx8Wgu68dQFPXpoygG%0J{4(N)vg4_-&zd&vW z`2iHqAetBqasxhf*vhXMEkr&*)(f(C4OEWQ^rfPWX(q@#8*Sp#-3zGQAUA>Zwm`?f zKs0E43q*s)zd$r-{0l^b`jH?SBoERD!XUjMdJ2+xAU;eSRF{G<p|o6q<R_3`kUgOO zA&3UmQ6L&L{sp2z<6j^e)Q<$wAbF6TAPmwAqKU!e#HWr9X4r%50@<4al_NDi7wC{5 zZy>ut;S0i~hA{`bL@SRsW}5{Rrl9<lp)20HL>H3hL3KaKt~rL{txq)3!hpzr$`+(J z2AKuJps<7438Fz`Mj#p#KOh>E=Rq{cO&}UueFZZMz0J~KB;E>gJ1EbC+zwI)vJXTP zgF$Y<rw&`5570vkAE*H!dlx|ENKGRW`j}>d%rnp@KJDCr+6{6JNN*=}%m_q-#)LpL zXv_#igYr6v28|hkXplTe9|(i=uFw~6?LaaQCVl|PJ%rL@4w9chW`gVijTwPx(3lX2 z28|hkXi#1U(V#K`M1$l(c7iZSFNj7DBbYd-J_KPxb>bf^?x|p4U;x<%s%JnnXx#*e zE`y3A%Y)ni!Z3S5Y(kiv^tHhNGcADZ0onTkDo1MiQZXby9VH;?B{j}L?gqsT2$LE= zQ#d7B?_g=OfZ_*KR%jTBx270D$}dpe53(!9OuY4mE?W2zS$<hS!xm%?G6sb^%uWyu z8fO8~ptuFmpz;eugWLq7>yb2r^dfN?(916ebMaP?+d<_Q$n7At=z2h6xG=~Kxa2_M z*vc;fW3=!ADTIy{CqU&$O<y;l`k+REDUd%t7!#lF<{+5?(%T2^bAf13p9(~S`dlCy z)aL@xpgtFf2FZghh594IM7-4l$vlu8$jk;4gnJ03WgQblIDzzn>;d(;Ks2b10@0v8 z7l;P+xj;0i&jq4E@*q1w7^D|OqlXbp95mhy!aH`zw1Cv%>T~VE;vUdC36OoDJ{E`u zt^WeipmGdEBg=!#24R@JAT}XPPWmb^MT8r&`5=2&K;=kHUr$UC@kXf6g`SQS%n*7> zjdPIuL2(1Zq{dGRk3_404`%xd6fdB%;)R)btBN_K`~tOOKz6;b7H^$lgcg28mR~=R z(g(;a7zTwq%uWyu>T`i;P~3uOQ27O-L2d%kpt=uPFN_VM(aWzhHsY-yw}Z+rklR6O zK=y%XVlc=J_|#!5zb=@gg%8vKki7~P5IIuQ*9@pWs8L`FWZnh~MA{*g?qZP40O_3! zUH=85LF>CfG-&-7hz6BgAR4s(3q*tD!InbHFAYoaRt_ZdKyn~69V`*<A(WQiAn6C` z1=#~y{{^B!>$^ZSX#E$629;YN8dSc4XplU}P7ns^-C-%-iXKKF@e7uSIT%9uqs9^v zH!w3n_JG!RfoRa!5Qqk?{{qpVatlNw%Y*cRFvwmI4GJR=4Z|>TP+J3pVeJi^>%Xip z-2=L}7-a8c1_lNY-3+C>p)|5Qy1g(yKAN2LegMgx$Yz85`vWRRYI--ZMx-NB({%xo zUQ*NG8f)^?3&`)Fcm-in<8}|fMC%7EZAnlZgUY=U8}Zf+HjuIy)FuPjwZcKXH3Ge? zA+jv?fW`~R9ApfNGnkzq8npfkM1#@=hz6C#AR6Q*5IqG+Ge|EI7o#oN<0#$=ayzIj z2Du%i7F`cW3>OBu0hb&|99vl&V~fZ`AT=-yvUd$sj?}cNVuxua$UGZ6;?wL4sNEp< zfb`CQj(>q@(D)XJ291A#Xwdi<hz9kEK{QAnqz{Badbik#w@yJa4<>#F$vuSfK?RbZ zKxTsM0rho3G-!MaM1#h^Ks0Fl3q*tZ#2^|Z53&=4L3%+ndKkgPLG2U}CR7%4*dxLi zq!(llXq^OzE@5C`0MVfJUmzMZjt`=d<w0%$VUS)BO$;U{eeFSVC$b$Nd%r;CNKIb` z4&<k!93;J@#yQCSptu2HQsYNJSfW+L7qcx1iWg8>Vd5y>THpvNzd&s=kX<Hj;;m0? z5b+EWBX<1W1sb+sJxBy7++lWtXwX<5hz7+ihz6BkAR6Q*5Dn^=z_f$(!q^}hy)7x> zF5U`qJE;5uxgDeiT@OeM7Y4ZjmmEkOTlpp9gcd#^h0r!w4pffR^z{U)4{8*c0{P>Q z6Y=S81(F#cy>p>sc_11zRtKU%V|gGNRBnN2&{!Ub2FZghh5Dn!S-dp_$vlu8$jlyR zgnJ03WeaCSIDzzn>;aACfoRZJ9f$^v<$-8Wxdoy@<r|0w$%E_!VUS)H7x7l~Fan9o zfW)EezX;`z6Ik2>THgh-57d7F(V+ETAR1I|foNoTkXt|)WG{#Yg%OB`VVF3mtpUP> z+8YrrnBmjIz`y{q7qn*pL^nbCpnHx$d}MiadtrQhG&$*=#}(mDWV1p3b%Dx}n%)~+ z5$T9fTM|88??KW_Y8w3EN_<-qJ-vYZ4vJS0CN*w7#3WidYB9@VP@ICwy#sFIt$*Ag zWihBt2D0mmmw4+EN3^gfvMo6UDQ$twf?-gc!R!Rlpm9kM4N4av8dMg8XpoygG^kI5 ztQW=x(dcFI4R7&QklR6JG05#8H6Z&yG%*<D27KzUmBlOE(ZUC60Lb1SP&rc5W`PH$ znIQ8zJcv)TCP-$0^e%#y#UL6~)`DnISq!2<Wif~bmBk<$BoFllWc`<?c<TeGUy#Km zJQ408ln;(zaSy002H6KHYe6)qEC$h_vKT~z%3=@=l1H`|#6}MzkRL(fpmquf6Do^C zJP~0G(hIT&RMvuMP+1J3L1i(B29?Di8d)A>7YKv&f@oqeIq8eT3*k;=J3#h2K;=kH zUo~Eccq3Hyp{JuANP0<)bCCN%aRb7n#?Kr{iB=gu%<>BqFQBrb!CSm_k2j?J0=3CN zb~OZuw;G_OTVmUi6Ohse$SfEJg*(hn5DhB7Kr|?BK{TlR0?{BhfoRYe5wczw8$_d* zUnzm&tsu99$}f=HL25wufoNhd$PM_^VJp8fd~m0)9Z)$^)0crSrkNmrc=!^Z?!G|n z2Kfi1cey+h1L&*^5begmzyP8_2RwpkP`L%7L3<5AG)Nw#4}?K_5BQ3=E<iF5CVm6S zJ%rM73zDBeW`gXAg}NgJN`uZA0*QmlEf5VV-#|1-9%Ls7gY*XYiMOJM5lB44kNCEM zh#w-1L3%;<6hqwsn*RmybD(@sxdq}Q%Y)nk!XUjM8Wct#8irxwptc4G6KZcP!Q!4i zsQsYvAdvl_i6RgUYD0o(WO;OZVSIcvIq5yZ9}#ZIW`q1Y0V+podOzb&e!AueK<Fhk z4Y~x7pI$(I2gNH0lNz^IWF%T;u(TyXaSAH;cml;+Jpv(RF{n)jvdbY<y!C@OTG$iW zmVAJewm@dVFeuJoc7kY4XnF&s3lJYv7K3Pzn?Uqbm_}$H6N!s4E~yeG-U@O%s4ND# z9i$dyABZLfgWP~m9k#OgOCVbKKn(!d>k<T!BQ<UAf$D=A1*SmeT?s;@J3?)M1|%~; zde=bbxIr{%4jV*+=D0yLXpS31gXW4rG)Nw7DKyM|g2h{Pkjw+gfy_(^M!1JiJ`f0o zgau45$R5xf5QqlNVS{MU95;vt&2fWh&|DFS2FZi;fiTEk5RD#2FmX^j1%wH;RTf}z z4`?n3WFKfO2}FbDxIr{%jvGWH%Y)ni!Z3S5Y(kiv^c50<2sdQ&LH71Q<w#9mCqfYM zMrt}@2}S57HO@iq2gMBtlNvu73KFd<{+Mk^P`rT3iZh|&tsG&H@(a`^1KD*ZO1!lO zJ%18ee%(PzA0V?}7!>X>J3%yPjvGXS;ub`M$}bQNaubLK^-GZT!q^}hy)C&RTD%qH zc2M~Rayv*3$UYEF3<kLYpE_*i*OoBc>5C;CB1dZas)6c5b_>WKQ^FBxhfun6Kr#cQ zcO!I;8$`P@Fff2<&>T0229;YN8Z^fZqCxU7yFq$+BE(zYp!pLdt`dQ8523Vt0gHP; zbKD^NKy%n28Z^fZqCw>rhz6B!AQ~i(?4CIh;;ram1ai-o2;$oY2@#OE0htTZ3$h0^ zhYg}Z{TC1on&Sr1pmGaDBg=#IfiOrfhz5lbh=yU9IH;`w!i3rzAF#LwG=~kc7c?FO zqCs=qAR08s4Wg0d(d~ut@zLa@_a%{ta6>j5<lj3`Ia1TRL=++&k(#bUko1z81}8+3 zpI$(I2gNH0lNz@P$`Y+6SlW`HI0cn^5z*qUQ=%bdF{n)jvg=E%c&iOs9wfG3uLF%2 zkU7X06lX9yK{RNN8$^TB1&9Wf#UL8wCJ+tk)4=qD^upL68oeyO5hvaXayzIj2Du%i z23-$G3>OBu0hb&|9K9?C)rk%<xYOnYs2r(j6J!@UhWP`u)*pm3%J@LtJjl2qx?%<f zhBHvRK~f;S+o9u<AR5$G1ks>zNe~ShmjuzE{ym5W$%FKPFi0<mCI*ueehsm>!*2&v zj-2oVg%Jpo8cr%|60I5mm~9qNxF|3%Ff_!8x9*99<P%Wc4+@t*iQ=s%qS5?8WSfNp z>PL_{$QTsvFgrmsX#5LAgTfd@%P}x8fM}4LKs3f!GLm8F`Q$;8cq_>5pnL*yJ4h+W zJ`ha|2Dt&BI&AqQBOWb$pay{K-2s&&HJ)7(FwF#+7n6V}+X==07pUDJ=YaI?fwoyd zG$>3#G^ou2qCssI5DjXxfM}3BNFNA;^v3%pR%GUuf|f*pgy4B|0g@dc36NS44JtoC z*Z}GeT=${OfXajPfb@dw2HlMdqCxEy5Di)%0-`}@CWB~Xd5}I32I&RS#9(sb*e4M) zK0tPX>}`R{ks8Mb63LHCklmp01z}RdSVu#mbxtp4IRFY<P@d~Z5^p_{1StnV^$y6c z52@m<AL7u$fXH&-3Q`<{%z|N1*um@s(V+SgM1$f7M1#r!5Djt@hz5;?BI|{*K{R?f za3xK=736kMIRJ7yNDat75KRmQxdER#Y~?^fGFtdR4FK7D04hgn8nH;hG!tZAKnn3` z=MU6wkaIwK4?@SmK{Tju0-{0V;2;`QPl9OBI5>y~$%FKPFi0<mUV&sDhz}D7wcS7% z)_%j4=X;R+1kww#2Nbs;8Z@>7qCt5bM1#h`K{T>F$W9Oj=>^fmU~=NqAr&+1L3V-c zt$@mr8lPKI$&WXX-JtLVVN%1mKue-^1C~4w3R_VAs!0=X-H`^#^PoBuWY>l)@zx(n zXkkEPo<D&U#~`y{7!-CeJ3%yPycI-);s->7@;rzJxd}vLo419Tg`Vf9WQ(_g+z!g~ zAh(0mf$Rg(#9)vc@TtR==Tp+r!Ut*q$lfhbIa1SzP6no#AoE-@h)+8opmu|t1JZj; zo{0f;{yT^U&252b(A^#&8dT?lXwaFhAQ~hO(g(sIy?ZjmTjwB|2NS=Nf#~lMs)HJk z`~)%+WDjV)Cx`}(TYzZL+&zc})$br0Ssr932!r&3X!J0GiG%V62*dIRu02HpnTRk3 z=>^#b8jk?cpt&y)4O#~ZqCw*oAR1X7<OUE1=>^fmU~<ye5hQma+X1ro4^)oS^ktDn zemW}2B0tVS?gzyU2$LE=e{>{Tk6<akK=A@9D{QjGTPw05<rk>#2iav)Al~{W4H3^E zF=G4pKG3iQ>p>zw;SRGCM1$^j0MVeh1<|1L3q*t51foG_O2V{*^upL68om5_QYhXE zayzK}0=XTe23-$G3>OBu0hb&|9KHP7vW~AsB?m2hKnkJrEG1AmQq$KPs6MDsU<%|9 zmR#{x(7oCqtTP$X{sf7G6`&Ctkjwz7IW5n`02;Rh(V+Pc5Dh9fKs4xVClC#4JAi1A zJj^(d-kMzT))*x7Kyo1QDY=NW>;iQUt~QH9E+U*jdO`Mp&U*pTpz%Zy4H{bq(V%nq zKs2&E$W9Oj>E+22Z$%Fykhn@7B42LVCk-A0!Bu`;z~Y`&3=9k)dpAJoxlno;lwJX) zLGmECfH25j5Df|=5DmjHaZvvPgkkd|xb_q!<Y9)-eyDv%p!5zXy%$O&%cI*1<Kv^r zN$(>02zMfz4f3xKRF2g2-jPp!x;~Omei~#bAV0l;{0@p&5GFNlO$;Pj-(V?=L1_=P zF8)M;cq>aGq$~!t$v}3ks1$EqlZ_VkM7Aa8Af+vkSuhNWGnkzq8Z>_lqD7$T3v}NP zh!1iTh&~F_2rb``xEOQy&f40@(r`A&P9<k;Z6&A(h@Vp^-U=!=F32;1$3<W?NC`+D zL=%H?rDvC1CU9ARYzD|aSYA{p6mJz|U|?WlU|_H*goH83-ku`y)+yQIt)TXl50bcv zIrjL2x%)~L#0*e-5o89)-k5%fA3<z^YKT0D4buaoL1HkhP$J$6iuXT-;;kSI69>^C z_rd6pV)0f`-3RJ(!qma!L254YF)+aHQU~#g#W}?YcM_`ySskc;M&{#VgWS8NRJ;`w zUZ8zd51?TL62D_4(VB7<GNuhOV@VOjU9d2F0(B>@_y^@tkUnG#x{n9M2bmATAT}}v ziNVY#mWJsE=>@SJN+9k8xff;zNE{?jte-&YkufOUBF78JEM$3nY+T_3(}S&j!%_<I z156E!2HCr(3?j$G!@vUK|Njq@McgL{5>csur~|P<>OeFx7?*ot`IZHgVUY|v19dAl zJ3wL@9pbH^yaH+;erbca2_%kW1YRaC_rT0xM9XAPvYA>ydR(C4glsrW559DbtR5RX zApudYm6(F=pk-hnCS9A9i?`a8LhzhL(k-BUf-v`>+w%j-?I1O<bWAJ_GY_P9O*v+L z3rf#0HOO>9IV65SVj#W5+6Pky(g(sIy&xJ?27oZEuEy0ad_iS<L3YF31fxM>Fn592 zgfJ)#;ZuVx-|j)mbI5u@_I`oNk(zG}Dj{hGly*Sr24pVCJP?hJ(bG*%CHZj=G8+_k zAWUlfO|igVSH~dL)gXI77*sa&K+A3rAB+VULD!aondpQ`6{3E2frc%*8dx~NXplT| zIS%53Fi0MjPKc#J`al?@7eteTL3)X`52g-g4@hrGYHmSJVo9okjY4r|Rcd^RLVR#$ zRjPuWLS|l0W?rg7YEe;MK1et|IVCkYM<Ko>xi~L5Ik6<ZSV2P}IU})1K|?`JA>Jjm zxI{ryAsVVbR!1Q@Kd-n1qC!g{J~+R$C^=OJZi_SMx-<n%g_4Y-{Bi{i1x<x&g`(7w z(xN;xE5Ih}K#T=ZP;=s;23RYAx|?7xf&2sWBYN8pq=1!~k#Ru>q&-s6B;G2~3@NKF zLEEn|8l)CvR!Bx>u|isDUUErhex5>pkwRHwQD$ONPO3s~Vx>Y-szPaAabjAko`Q3J zUU6nhYLP-|ab{jRXb1#k#E8J4a8e>SprD-zkQqqHimY%0nW2Pa2-IkBzeFK3uec;N zF-1=yBwryVvltwODX9fTsmY0;sMS#@ElyR4cMb}P4|a794RVe5^N$aA4D$2za}U;2 z2u@8^$cJQxjMSV0g|z%4g_P8i#LS#x(1`+MId@bOxu8kB6%^ORYR6RvgT~N6W}vtI zI&vUwGnhO`4Ge?qRia^HLQb>fW+|jBKtq>8LIfNh<T_MI0VTUC&^TZ@=20iz%!hcL z0av<#$wQTaDNs0p7@)Q*td4=vAn^rFka`HF4kShh<4V^IP_vNrgWBpacdclEjF~KF zU|<MnMA!>+4~z!sr;2+(27$(%*r5z41sV%q0j+<bLU0OX?+>UP6CeIQDqIuD4$wVT zEf7DUi+8jj#wtUgV-g^Hkk!H1CP-$0)WE`oSQ=&yNH0UHc<TeGUy#KmT8VF0AEBmu zu!IrVoeT^NpmsV46Kbo6v?9V7q?g!mfvH0d2N;_WjWfMNHKO;WK<SGEI#vKx0;fQ3 zc7V!}n!ak<$WKQ*+Q^S{kmEsd1Hz=n&kZ+;R*gW&yc5VAmq<t*2aAt}cJbCd?ci~1 z4$xTMk81JOIlbbo259M)*g3=rNa+J)9}I)S9cCx7G_qb88$^S~C}G1kAalzTi}Et_ z(lrW7i!(rLD?n<H#i7kUD-%mgGi>q&`2{dxaGTMkU%V9*7N9XFP*}js1JT4_QqwDF zPI5;FB3~if0rCe&Cq$0aIhqEjK6LYDbRyC*p*cwxBr`y6xg*cSkjlWo0HQ%_1VD5g zln<JV1o1(0mLM7=53?JjSD;J0^#hteLE;)+#Lov^!Qvj!8N49-K>HLyG-xdYhz4~I zK{T>FvU?VEiMOJM5y(9|x-j!9sQ!lOMW$1_AaMf{1L+0Xw+0#>o1iqP{soDH<|08f zXwDKugXBT_Kp3Rgpj*5Z6h<IE41>fyx)I?6%m1+PRG2y#{RNAA4no~=3`*~U(xACW zkUNm&VdjAB1+hV41fpRWCJtK90K%{}4XiK)Xmm?AX87EJ+W!bjUxL!Npfs{P%s806 zFg`w-ocw3egK#IZ*&urhpmL<<zcoGN=d%|*h&U%SPmi7_RC>uzzX`nvdr3`epl}1F z2@obVU0C=@w2Jg$)>EML37X5)=o4>E=>ykO44^pykX?JGi?=$Ul_$j3QwNaJCCDro z2E{kbP7n=RD-NPT^Q#~lG`|X>L2d%kk6{|2ZBQgGMf0m?`XF<U5252zFdAe&$c-SH z7>p|~5Sm|Y=!5hXK+`pI`XG4&Wbd1P@m5gygT~m_Ac;Q-#U6h!cfXhcF#|Ne3Ni!a z_9bf}egv^qW<umaY?vMx4HARlhKb^>pm+z(&4MsY97KcM2cx%45N`$5<DmIfm^zp| zNX<1e=U2~6K)4fR4yhQ_b|F>|$h{(y#alt)1)5(KnFX;MB<>Q3I={*Sbr&qmTqZ)) z;);JzTN2$J#LPp%%qNzH*#UAhh`j*nE|7a+W`M*&^2GWHq#hZA`nbsP0x}C(9v>T5 z_`vj__botewUkMau!X6C(I9(era<Hf&C~pu3Q-5r3(^OoiNUzs3u_Oc&#&rChS-D6 z4v?75a`9GBUIDdrIhNs8i_2}e+ygQjqz8Sh1UA3A1nMr38W@J@L7ra)r4x`ma#{iL zabe{7)jPq&&#z9IBHlV@5)>1dUyXpqF~|)dH^baUEDh2J!XUjoQ!(pmP<jT*qvH!y zw6|p{W<8Iqjq8DyR*Cf|OdZT0Ape5cp!NX>!`cY2v<s3$#s{cuFUV||n_x6Z4CXEn zn-Ip8-eLN%l^0W{LGl$$4U7iadj={;YI(si9hz1_X?780-6Y67nAylQdU|!4PJWte zm`;AW0l5hj?;uQS+`EM1Z(kH3wJ$*SfH0^$djqX+KzuO9GbijZL%bE%R*-?l3s?^l z0SjXo4U$5xdq8{;2Fb(H7_l@+9|(i=f@pFuNH4MW!PLR*0qLb=PB=b?@>yXWh4`HO z<is5CY_t!UMR1}RY%kuaVjYEem|19Z#;`CzZ_k3l1bNQ*zyk5sgoTiN{21CMhtVLl zps*u%Is~MDq+n1uQF+cd9&}zCCE*8l6Vl{ad=6wb4kS+Vi8M+aKB||b5b#()oq0gm z{4jdkb{Nec$LG)?;e+xQ`DFph9CCb)60K*E85jz7Qz!i_gr-_t=?5kcRR*R&VFhA< z+UT%)2S$U$Uo3#sO)zyJF+vzuTNad0(Dj1)Brtcqm<JgfTFJn`Fl9c%UYL7eG{_8U zxCdko2&1>HLGyecpmj1x9vOq|byx&(8>#brJD~c|&AYG&F`i3k9=Qg|43Jx3VL~ho zvm2z>W3hOv29kLoIgoh5V&dEJJc}V=0n<yYJ7DTS`al?D?~TRct>|F{692H6_`bm$ zD!K>cE>IYOXcz{$2gC;TH9(k9e?w;p^}+{aFEJQb{)6eomfjyAxf7-iM1%Y*u@vG5 zQqz0LQu5RFgr(%C!81$APcI-pgW?s0NsZed=@P9BSmqjFX?@Bv@zx8=z;g{8pz&9o zS>mlvR*Sb*pqDj7?&ZqB6K60xiKRjQ24PTqgJ>8AjVse~PP}KWcq=F@K;wj<umIVM z?go$;E=+1#2aU6ySq@3h=w^cKm01CiBXv%03REAmnIQAltU%-eLUZB~NM?ZazLjTU z0PV*B(V+AGKs4wK4-gG%D}rdy965*v$;0dh=~Y=N-pYbx9!L%(ZnF}RHwexDy+G0r z(hIVuih+RvL{EUypfjvNe9+uDh(?wN*$KiRy<1j_x1xs;Nc_x7%zO@Ni-7c@<BFA# zxB-cS^n&aItvLhHYoYF$1*I25>7`H_BoERD!XUjM8Wct#8irxwpg9Z>CNxjUu?o{Y zd!Y7#=DtDh+6v`^=EgyMWO;OZVSIcvIq7{5k~@*j2Ko03RF2g2Zm^pCbe*%B{4}^? zHTmfU<abcKf-tFZyCzSfRR>Gi4vJIIoNd7x@zynKz-2oFXzl}KSHM>B))4fvhRCwr z1sX3PbC5A8&R}+eXwW`g5Dl6~2GO8-WDpH<6No;9q#2|aiA&KuvIumJ^%Hc=3Pyv> zN4Ezgh703L&xGcYPppCT6+rXIPu4*4A;?~nb>gj{@CS{%eL)icQj9(RVD7Hj1~CIP zj|?&c<X)E3h<W54P<fCzOb?6(iNWxR_2R9dcn8fvgD^}SM1$N1qyMZEZw1wTpm}7N zI+#32&22L0kww-+`~fn991N=OiPZ;kZ_GyVR#13>=8-$LL+l2LhZLgDBm1m_$ic#_ z2kK5-@ej(Q=<Xn99vNmnu{6vMkefm57f^SB+zT@UBo2}%)=wby$QabeMUEGcS;+GE z*to(6rU$((4{G16*#HS^m>L)jvNvTDM2^tB(3#B;bs)VUeIS|`jLW^Sxj6KB<dTgL zd$8F761#9%ycLvJK<&dhhj6RK<u+XI0htZbgFaRQn@4^Fbr(nt48!yw&m)7<2}m9} zt$_HrF!DUINfGh$$agl0w?5eb!Jz$?pmrh5J?M5VfW|RM9Ha*3HezXzJ`e`!4cUxY z--6OJNFE(aprsjN?SrX<nFq2L#0HfCAPlRkakUF4P}yFP-7q)7Xpk7pT_83gj4R#2 z^kK`lDO(`v8>R+EgY2CHl_NFZ-q-?3GoZ8sN;e=gLFR#Ibc~*EM7EM2_aL)DaR<Vr z#$QM&{<@k4S{H-rYLGo33@RH;(91nMbFz1~inqe*-8V?-2V@ou!@>zhgT#@`aS$Jb zLGrM4LM#o^2f`q|AetNu(o3v;Fm*6{KzhlYlP##E`958!6?i9K6*ST2Tw#7hZ~KA# zj6CP6uur`8z&=P``vPsh!f23MP}q#lxq?ChKL&*p`SUCgvq5G+r$|9@4iO}g1epQb z_y;lsGRq1%cZ3epO(eQ@R5`gJuwpND=E*=~XCODAxBZ66JS!**&^+0L^BlQ_Bx0W~ z$gMP=Vcl?(I_U<q-v(d0fysl^z%VGBKx|Ok6;{W<Xpp!Ev>t+~1BnsBxZ0MW{DH0) z)K-VND_{>~%mg%M`eP5I{sY+ya}SILnE?_9(Zpa}?t$q=Z|j2QR|ED#?1!m=(I9&l zK;=lCZ<08GX(q@#g9C`MN<#Cicc6BI+yl}J3lm~#kUkIw>0NO^ytM<#Jec@_1H`wh zbCCQ5GLu+$z|?{41YwX~5RD#2FmX^j9fS$B)&Ef0Js>v`!sMi{4F@sP0>~bae_uf5 zNKIcVhsaMy35Up!bCA11aRb7n#?OpqiB_E;%>7TW^r3NByfx)8c-)!;G?uquyLhY1 zN%7Vj&~gc6Hy9H+ZfyY#Td*D^0u=5rJBg)X+Ch3@Y!D3^qon1W<eO9Ct)Q>~jX8nB z0%Rw;8$e>XFsbPkG-j7@1b2Gf0F@(kjz;4srkNmrI2=W!V?uM1Z=iOA{0h?hPo9YZ zbdEfT23=qRqCxiwfN0QMB!~u$O@U~TJV+l1gY@n=D&9H+$vl|&g`?uFptKFbgytk` zko*KP6J$>f0|Ntyo&=>qcRYglpt(p8jVuqc6NEu}J&uXDqK6SkJmDB-UIo?PAbseV z=NKZ4L3%;<fz~g9==D(d%z@INxk!*WsQv}fAbFU1AiXz^iMN8n2qp%iLE;~dA;Jfi z|6${)AT`K%4i@+9gW7)>N^ghKpt(qpJCNmJW`XPlu|Z)3qG1>&4q6`p!mu?Gxc2Gl z9LEfwn^61jL+SHS`Z|<GmPfZ2#>YpKlm8wdxf9uJkbfmkK>R>z{tG!lem<LU0ukq= z=7}>W$WOl<ClU6Nn$|$!21*kkOlrFL(IwFuf@OXcls-XonHNrqxAL3<*Ha9jIRTJe zDVN1tUmS+S4TulMMAlOoc;XvoCx`~^(*@C>`Be}NnqLLcAUA>N2VhGf1SqXQSP&Au zo+9NO<dRd6xkqLNCh*x2FdAesx;-E<To_kgAT+<KaSGB`0L`zuoPvZg$lfWZ#alt) z4;o_&K@wjw348p(+&$q6#0=1wEyxUzdwpI){0L&7fy#r}Fg-9DBnHD8XT@7V@eZ1s z1!0&thz7Y2M#r2HZw1xkp!rppI+#32%>y#$S4+-7`~fn991Kbm#OedNch5QTR#13> z=2!Pzh1d-eXX!(oUtMz=A_ohzH&A!tihodDi|!6$=2v0n6HCMF0J#~&_Bac1C&;}p zGeF`Xd1CzpQjd&5eO%;t0hxs?kB^Njd|-Oe`>vq28qYb1A7E-=G|1i~=OJ>0=4qB( zgs21Q1?dCP#9&<Rg|!FJ=U1;l-HOc)kl2$);;o>(0&44ScnEP5NSqkAfYjh}56leo zF*exzst+`rKxV)&Ob_z>Dkz<R<dM?~h>r^+&#%szK>Ylw%?0sRmvaydnkNIbVPWpU zu<HUOoIv6rH88gkOM~=*Fi7u~3z&5^C_RJZ(QyS8?bW%6S<mBY<9?u`y&yk<+6N#E zYa_tYE=Ud;XQ1T~V#61v4rUf8oMCL39E=8uBg=#M_%N>Y4%36Jys){1NG~vTAR1(E z2~>{M@?yg!NLmG@Sx|a~nFpdVFk1Y*xkP@N)3{82x&gTh6z?ERYTUC-!QZ}+fVLk% z?F*1SAPg$cra<c(5Fd>3%n5(EEZz!hD;z;edtiM~0u*N;CX5ELk?S51AA~{jurx+2 z4blg~AiW@(91PM+tbH(bFnd6HDVY-n@0X?U^k!1`>4GK@!1m&uD#pD}7ZwKS?O9Nm zAkP_R+!1f(xC_b0tk5<&j0UL%g&n!mAt3!D1%twg%5%n4-KPslPmmd8kXva!kv38y zeh~Qc!)@x!1CD_C<Ds-q7n)^hzfV`>J9W|zY`-gd-w3w;049%|Wk6*Sh!1L`!|ELv z4HBPl2U0h|)PckZVO(ulP(DG|3+j`=+%@4AWNZjD&TVrWVK2-*FdAeAHQWO-2ZYhv z)}VRh8PGZzB#(?i_P&71kvh+pa1Y`qbn`0iA;xnF%_FNInE`SOEKG={VRnP`ez+&z zdI9PeWO0uB#JA(OP|-aN_r+V$!wBTg8TX0r8@Sv@gfU1jvEc$!ha3(dHYkihGz^2x z1hGMV4G<>O-?&0$_kipsgmL9Rm_BUjz2gBQ++gZJG|0aPpmL<9_dgHFPuCU?$xnkN z56Mq2AU}iR6@*ER+Z{_JS{<;=HNeuA%_H&FibvqN1`g2p>y@kGtv%1hTNTjqAhBnH z3P9rp<Yr_HiZhs<#L_VRAiXd)hz5--({fJS<fV8kC@etZgrKkh*@^B3kQgpZYFY=4 zvz9!@oz{;)<w%{Avw4DPCdeNlPY`*4(405}k{KYq{0dAApgC|5oyNex0HQ(nZG-3t zC_f5HgXCdh1k!uviFoT8s9%u9pFBb24T+tQbJ#$2FiZ_HJpqe*Ky%<A`x~J4g6{DJ z@j?4_K{T>F%q)<5VxEe(qK6SkyyU5PD`;#Lgd<8I_Z@-SA~3zkw8B$F7=!eJ>;s*l z4WdE&b3t?m)Lo$aenEU>d6-!sy&yIyj6gID!^A;z7$8h&o^k^g_kh|iAbZzA-LVKt zgXZQz;>hyo_QLr1XmZkf$}>c`A)5{I?;NNcsp<X3GxF25$aC`3V8C<o(+kM&pm+sg zQsXvfwM1(Uma-ibr=U4oi5KFnAuqsXI|FF$17z2a58|zV9-)Ojk@LuJkkS^&EEopG z8O%-)4cey*qCxY>AR07}45C490@3JeL15;9X!Nq3lzHSmFCcTQBG54_7!5KP<VFxp z491n73C$xHynyr-K=a5wFCbwIviHtQ@m5gygT~$FAc@Cpz#e}vcdLAYm;oB+1(^YI z`w=!t@SVXRb^=r$#D?jC(I7DxE_f~83W|5o95e{S#6dL3eK2~-EAduP-3OXShN*+e zgVa1Fa~^rmD~LZpW{`tHX@XdNAosGo6>kNF7ib<?=QG4^khsV?)OqADFClWUFf(}# z;p2*bP##5h2Ql-=F!PC}VRnGr3}R1!x(no9m>D2(kUX(|0;xyFp!yX#UO;9c%j09? z3Llsr^tL>xeG~Eq61FfkFdAep&pU`5p?RT__Yid;y&!!cni!1By|B4B^m$~Nw-9@< z*#QzO`7hoI$}6Dup~FAiYH_&@mwP~FgY=+}mB8kar$F5WQUk*<J;?LOpmYL~M@}ms zJ}wMu=fLFVtRsFNx#gXBYtI`92F=Uin@9G5#xckqkegv{BbEl~17VQfKkqQ>TTpri z$)n=~RJ0dlHmD2$VOU*_t6gY;mR5=NCrlm4E)WL!7es?FOb$ka#E|7de0&&Jx`XM# zmT!4JK+-o%4U7ia>jIS{HQzRTfTS5v+5x2-keML!Kr}i=Pd9r$kRSITvq5nO!lcIE zo{jkH>NOuB;RLFyLH2+!sBE|cExSQ{Fvc?{+wxJo6;|&~K}tVheNX}xPB0oIj9iX` z_#h0Dhouu@X^=h;2I&RS<Y16qV(o*egV_VpOXi$xaVp{abW8J!Gt=`@Qxr1uN)+P5 z5_3vPxlR{m1KQjx)EJE0bU}WB`47F_2l6lSeCv^);;kvaAn8X8+IEG}AhjT~M(0~W zA%P!*!ijqGt>6g9Zy^p@usa|deZhu6W>`n}=;8>jAuH_jlR9%`!+VYuoCRpUv;dsv z$Sow{dvw8WrTHG+98pQC+`$an>x$lAfX%JK<dHKND4aliP`edY$G~Wi_?w@QdI+Wt zBt{71YFC2t2fAKRJ00e(FW({KC7^N0IX@8g!rTL+L1s|HJs@*H7`>efnp^z>t$#uC z$QWd=%WsI=NS$li1J#Fa-j&~oaY{mSs|`qIfZPHL6JlwY-5|X_f5cmLkjw+gfy7h( z5Z|U2_yY+Gm|kMt0aFLk2f`qGK{R?8!NfsrbPy)gPG3M}_ki3)2;)lcFn!q4SIA#P zxWUwcXpnz<pmL<9uM>aCPe&~O$d7Z7yFqaS!lcFz!vTp_gJ8@(y0G+d=AU>g$A9pc zH3w)M&*igtD+{Y+YYlq-By!C94pRC6xf_N-;SRHtSQ-XEdSPr34H}=M<$UBCHpx~{ zSb)ZxKw$y06Wt9UF<h9`^a>iUQ(%y6#crNxs|15Y>z@ChaUzf!M)01k8U~5h6Mscp zU+j`@0pU`4CI&wS1_n?)gKQ2=97KmRFff2<&^f;#8no9IM1$rRK{SXD(+jFM9xzC> z3j7mo1*JO>2C2!yVFySYB%cqpqYz40Luq6_%nq1aBmRlDg67&m7-U8}4m&{NAo+f% znG>P(bSRC?huHxdbA0kl6dblajG!=t$Q<BfU|{ZGV5pL3Vz7b;p^!pQ-jxRsy&!JL za|GK3Y8J>G7N|L(`B;!TWDGNB$2WvtiE2);dkmN)TL1h*h_gb?kwrED%H{@5axgG3 zXs95SYkH+E8cY(cr{~>v0htLh4@85sB(O-dUSWh_5Fdm=e#K@sKPZqG7#J#;5aDB> zDBcRQ3*^@WP`PU8nN}e4Kz;|&Ak4-P!yut3-pZgX-uggMyp^NX8niW<L4{eO6{H`O zMnM?l23;)i3lj&?W(<&cv4GN!P#P3ZAbAiUWG4v2@+By4LFR)nNR2lRJ3!(f`4Fg? zVNg0AN`vAMBoE?)%m-mmUVx>c3(SZxI>^Vsz}CUQP%qEKU;|Q!hOxyxEDcGpNVIl9 z%>tRj4mAffmyc!)1I!%cw3xys)B;lna}&rM4yZZhFi9jDW==>qBF%*yf~3VgEE27t z^aE4Q2{i{>dV!_I7aB-uk%56>3yVbS>9DJRL1u!?1JNM!IM^jxLFo~ML3|Jfg&8)p zVQG<t6%o!Vs^YCMyFg*)1C?t)N{b-BgUkhCP+H_s6>n`(7jM0yib#taSRr8!N+Tc) zasz1Y6jly_^nx%<97KcCAczK~JrM28fQWAxAEXC_L1|HhO`;VPA0YEV7^KD*OIn19 zgJ@711ks?h2ckiDl7nbaS^&`?KFE9!2Bk$14N5<t@)CqWYCz{9VDkq^93&4~lL4YZ z=>kN9?imNs$b68wAPh1GmfjDrA>!c>9|Hqd2LnTkJQIU8NFf@=n!b?A%nGPkAal5( z=78!VG-I%)_b1RYGlgBE6_mDMdU&AbU`tD|bb3bzHJ!$=OSHyVH?9Gh2{I2vgUp-4 zDbWf_s~`;GgD}Xi*vy8d(>3gf@Oh#s-U_n|<kv4yxmKif3i3P1To4AO(=(dlty{Fk zTc>Ct(rE;TL@P)?DE)vi$PIc}(hy7>M1$sDL9`_UBz~NrG$@`x;vhcAP7nsAQxFY` zTafu63{vBR!w!%*NFKEA2t<S05g-~g{{*5zaR{P8e2}>y3`(c4G{nM*2&2P%3=F&- z3=Ey}ObnoTZ;)DK3`;}EWgV={^x>3f-NOMf3uF!-)ErRz1=$P`8)go2S%+L^!rTNh zhaYMV=$-+PUSte22f6;PftHycI3-#^=?A7>0BR1l^a4wZa|}__;tNiR)`q3O&VkGX znFpdl=C$xhw1Uzj2!r?_3<@)BX2a5=1s5c2Kx%L3inqe-0)<%vRIUptErR?GQVYVM zw0J;Qyw$=$ytP9QkrtnDLBbrAMnD+k1_LbV1SSrmL1_>~gVG*|c40uoH;fOm6NEu& z(Suu}6%-#J^FbJ-23uPeCJv%OX%Iw%(jJHgwOv6pC@p|!5Fcbd2!qlhhz6w}P<aW$ zAT^+MYoM|YBnQJVaS&YwbvGzofcSM-_%MASb71NH3pXMjj_@%s2zD?q^pVj<u;Gzt zT>~`>WR4Kj98kRgvlm9g(kXI!{}3$;ZzI6m1Tse$YEA)6GZGCm2RZ+3sDZQ*9`H!C zg3>5Vxd_x8Y-tjf-eb&A)B6n`iB`^<HVcrMAoD;p$h<xL60M*#55gcm2!p~5o7u4R zuEC24=NU%gtuVVlVO9W@>qkoOAismm1z}KnZ!i*X{b3^B>S2sX?^k#sVGc@%APjN? zwl)Gx97KcK2p}5NMgY;EHUfwSwFyBqh!3(8ghA=uf={9q6dxe-K^UY4TN?o;4x&MA z1P~2sBY<d7n*c<E(gKJE@j>Q;Ff6@;(hsQL2ErgUnOO2IOdLdm@&kwlr3(-ZYBPXn zWIo7z5Jpb#Pxuh=aFmaML9~N`VX{0EgB?gA8pf8sVCB0GzeMXCs97L$#GvND#_N%d zf|-LYy_fJyw8Gp3GDjS0P7$&JP&UjQ<nkT4o&dQCq!eV11k{{fkN_HnnWKT!Ut9vM zCnN+UT0v<YrbQBJ4z{!n%Qr8q5&4Egyr)G#K%$k)ZTd@)nIQ8(G{`&wVTo2y-T`3{ zAA~_+kIigYzDW>3#8-s5cq_~<P}r}4%1uGaHz2=*%mrakzHu-YZ}qSeZ{@H+<QpDA zNZf(aGYEs+06O0WlukhUU>GJ2qCxouM1%4Ph<0T_q#GC?rVo^F3IrkX3NjyrL2CT5 zq-mHqhz8{s5Dm&FAUYXp2PjR!_%J&_`R0nCL@OxHL3sv*L25wvA7S$cNE{>&${!#a zl)gYTs7(!`k@+w?VCI0*D5xF+VUXHp9R2`_gXFuR?gphj5FfO*8AK!VVRnGJ^RT+8 zK?o7o$M_f+q&gTFW)Nt<Bd1|l-aH{B(P{xT3uKNo)ErR#3$qtS!}0=ho<gpRU~U4L zBLg)DG;Rdb52In`Am{O#T1Z`#BP`Jh$_FsDvQTrdrF&SOTH%1mQwK6iTT+B2S{rYC z-vTldWFCkHndc!U(F)2}APnMzFeuEhnGMTRTZ9qe{KQ7Q6=oMG%>F>-W+LS&kl#V( zf-opgov{&bb+H$3onni~QwbuFFbAb|5C*vcTR#9M4x&N*01ypogMnyJyB|b@+F~FY z#0S|4!k|2LL`0$$6dxe-K^UY4)ZT}sQ;<3khKYk{P(J`fgW6yq8r1Fw(V(;dqCtF+ z9uNlQDG&`xKcM^s!XPynSkgO897KcqtsokdE<kh%10>xd^Fii<FvzX2^j;u}h==2R z3=DD|3=DG#^fi#v7c9N+5S3`vfSLs|M;>YpsC@~t6B)zODc1BZCeaFW6UZC|s5zkV zP-HVeY?wL7`471+0=WsK4rGoZ)SMoW02+pwgWQHY1Fegeh)J}9(mG6w64V@QX&aVr zOxzIp2BdF}m_#dY=~)YqnIQ8(G+10xq7{^PKp4aaVNlp(GaHs~-iRUMYl)+HE6grX z*qew$<mMse8<5{Y=7KON-}E?&w@z^pZw+xm<eM4dkhlY-XAlOt!2nBogNcJ^P<{c? zpnL+NL46hw4eFzUXb>M{CkTV`%^z_{yn@UJVUQYZeHNHFhz8{s5Dm&FAR5$10nwl| z1)@QGkoh1C$~OrT60M*(2jv+M2B`s!vxCw*NDU0b#6dJDe}HIE`U26QJ`9LP=EL;C z%@LD;kH3S|HsJ^>kT^)bivg0SKxq%e2c3-xqLKM9JCN%l9!W@ig5*x{F)%21Ffc44 zkT;RjFf4C|NJ_LGk${*5GDih!4k#Q!W+P)*UO>)M$aN9SO(1hrq2_?X3fT-08)go2 z9`~q&)I~oeC0arG0Hh9t)u85JOZTum^~DP{PkoS-Xq_*)$^v92$UG1YGV6+rMC%+$ z2nO*%7!+pM%!cJD2PsI{fYchei?_n;0)<%zRBka+o&xzDq!xrhc}l`vymf-7c<Tdq zM4oyh1qpLdS_ff}8?famm^g?A<tY#i%2Oa3l!rhxC{KZC5FcbG2!rxefV4y_C_X^u zgD^-9wmbzB2hpHB1)@QD3PgkQ5Qqk)1rQD5gUknEP@V$Op!5UEPaq6ZgDp?N#6dJD zPl0Gqx&YCjJO!eW`5<#a7?h`Ab<rPbL_D12V_;D4U|?7-&%|I4Qiz7Jr7u`|caf23 z-2ycWWR3>ZoLDq7KwOwP*wTBCj6^HUO(1hLq2_@0?Sb?nW0*O}`471+0=WsK9%POd z)SNz$02+pwgIvdcf!0L^vJ$PJv<}mv4K)W_+J@zuh5*!jqaiENy5v{+XONj7^FTDn zJPiejR#4snVGtjLL1B;0Y*@ajkVVAT2XFCKm|dW-KLC|mfs}7Reg~Ng!k~O}!&|)d zfuDHm0v|-aQIUhh9Vk76Fvtx?SjtzJIEV)27Z44~Cm`C50g-NCe2|?W49Yhha*%ih znGeDsH32y60EvU-LHPwlgYpT8PJ!A1N>eaC$b1k6<(oHh60M*(2jv+M2C2!xVFySY zBoE3TAR3guKs0C^4MZdJLFR)nDBpl+P#OjGi9i^n7BqkblLN_vFiadogX$a*4N7|; zdJ5DZ$b66<5Js+xX2>Jr`V=1ngH8tn!x{o(bjWEKmNy^BOSA?+%>tRD3pEGS-vrr- zjA3~JIZq+iMKCvk%+Z6I1L|8Mn*n0O%t6lMBK45Es6|1d6_gJ^>Ofc@Y7Vw^56e>y zp{RMPMnR(WeD*pgkeML!Ks3m#1Z9a<P`(0T5Fdm=VTR3YSe`ngfC%TBK=D?XU7#=% zQH02?Maokkzk|#LVNjk*2^4R=6D;1U6NJc96^f8B2c>lo2Dt&-7#&O;M1#iYKs0E~ z0Yrnw<UllN>;XiB_#it$7?h{(C`z<~;sazp2!qsM8>54XgJ{qg9f$^vIe=);m>h@( zr3DZT;)BcwVNjj|(V+AL%1<B+QiE-b4kiwwL1T0v8k8<TG-!+tL?iP-=7KON-@xjk z4kbufgTznsF)$c(FfeQ+Fh+-*zF_J7f|5k51Jo>#IfhVkK;tPOvym|@onlMx63P;- zFgJnBF@l-{8Z$vQ1H^`zgPi}6>mrbwK<Yr|7(>kgjf;T9kTJ|0<TjklVMxB&qb$)1 zO6xH7CQx&*rEOTgITMA*H+MKCTDK@e=5j!0g3JTaAoEnzBw9gv2ZTX<5C(-kHnU;* zhD8MtUp8UltuVVlVebQ#+k}*FKz;|A3&Nm$qY@_GsuL;R`X&sKZ#Jkv;trIaK^Wu) zY-4mVaS#p4FCZF}Pe3$ij1EMD#&$t8h!3(8ghBa6L=_URAoD>Oqz2m<9ZVcVgYpZA z2IUhF4H}~Z(V#R1qCtF+`5+9+Hx;T9t)Msu<rxqLsR50}fzmrj4GhD?K{P0TfM`(q z0@0u`IuMP_hv|cv14^TydI*F;YC&UhFgci7m^g?AjnRQ<P}&30pfNfSjm(GX1Jy+b z+Id0M8%zjHpW$O*FzsMq*iN8dgq(&SK+FCHHHlVGx&s@;z`$SzHAev^fJDR6@RwLb z8U{&Ms7bU&$K7@TnF%rvM1#b2G$dL<=@^7Td=Lh?5u4etG<-r0k%mu1i?_n;x}z%5 zDxeOL+kupZL4F6B3&Nl@ydhe=l_OTXwIT+QhCy;5{h+i3!XP(b>xaO^K{Tiz0-{0f zDi94S>p?WAeFdUHe2}>y3`)bWczFVKBS`!#9|MDV2Lr<%0%az0yoh+@v=}6aw}RFx z<|-}G1et>k??JMs1j+{4X92Yjw4VuGAFM1xE)%ajf|O+)8WOFbxP$4jgqnjbu3+il zPa<kMXwZ;o-5EA(5y(uCc_12OUV)ZGD=001Fo+MrpfJH^HY^=n(164>NbQF>@m82! zAiqjzLge-$r2~-PL25x5ln!phiML)!5N}-&k4OhKni8!b{h%}e!XP(bE6ZTwAR1Jb zfoM=!2BJazPY?|%%Rn@U53&=4LFoWQgVF$~i~(Vg8f;^uFmVta$N)(rpg05ZL1h|< zM&^Ue1z}KG21{!iT99x6iJ#+RV6f_7U^qyiuZSG?$o1g^XqbY`v4)xhYUhK@M#iu- zgq&voK-16}Es0i8yu;MnK+VAx&#*M~Ar&<Z9nq3#js89T2gpp2c_12O-X9%_R!}+u zVGtjLL4L(%HY^Q^Xd}YsN0N9e%r1~$W1w<}kkSyy?;vwQ7?g${B#F14ND*&ck&H+~ z2ec(xLHa@I2ZTXxz}7c|iGyfR83Lj~We11`)qfxw)Tam0AU?=W5Qe28P~3v*5D*5b z0i_Z2dITm8qCtH#5Dkhm5DjWKf@owu$b1k+PD435h%h?O$G~9Q!N71#o{0f@k1R+J z2xE(TSUI#sN1{~)Y8J>GJE%FJaet6rWDGM0S6YO*31p5v)ErQqi);pn4KoM1t*G)C zQl3TVO0<H~4@eydJ3!6BmR?|KaYGhrS_}Z0p{w!-WG2Ww5DhZR$3mhNlpaAC#0Oze zm|-&;mKGQ2BEtDins_VBE>M`gfXW?5N{b-BgUkhCP+Gi_Cf@3kDc(9K9g!A&^dMml zN{1i}a)U9J{xwV-M1#sP5DhB7Ks0Ea07Qf08$^TnAUi=AlomJWNwk9E15}oQFh~uy z@imw@hz6BgAQ}|+AR5#r1JTHQkoh1CN{b*Glzu>I9fUz@vCZ|s#6dKuZ3d!2=>kN9 z#tA?)G9P3v2!ryC%{xfCh|x#H!v#JD2FDHthSTy)49M+8kRA}mmcCM;<}A^dXcd8) z1v1A8Y7S_PBuFnZhM9w$-Zgehf!lF!^d(whZUUL(3^ivJvH?&w%pByh7kMlI<R*|( zkU1_;bM}J-&@jv#<i1)7G~b{pWpIU>13DK7U5=X#QcTzsAo7jNns+T71`@3W585n1 zW`gnxhz9As;U>`v;)B>Q3<`T}X2bH$4Fg1ct;rT|h1mrPdj&&?+!>^N1M)k}Y*4<L zk}cjkCr`XJCI^vkS_~m^2ij8x!XP(*(kLjM!1RJ>m^g?At?dTUpmG&NgZk7U8kBB8 zG>8w<1Hzzu^TH4kub?~w!XP!EF<@+VfW$%apnVS@8kB}WG^j5CqLKL^^FbJtZ+wg- zT0wCR%KIP;Qacw*{)dT!=w%F$^u7X0Z-COE^ahd#@j>Q;FwCu>Gz#(q2!qt@z+neS z93;ONY9=V{f%r$T@ImH-FsM(XVl2^mk&l7FC6Wo8ClpFRXGAeFc!LgQ11Unn8Yg*M zRL&sQqJyMBdfhr07%o85!6`G)sa7Bv2xbCx!WbABa*7e@6eM%U2$Ft4Y!C*;8;AyB zbhRKc5QeGQV=U1Mvkyjt?q2#~Cc*&1DaNQ~gY*)EMNBZw6=Psv_+=&n#vpr%F$Y~u z4i<C885kJ;n2CTf$X;|k#PVVOhtZ(E3(Q<%%|KTtV~QCLpmhlU%tRPK_=pL4;j3VY zX)dVk#9%JM0Ky=9(cMA}A9Ows6BFe80A%%`eP^(}U9j+h(a7p>u|a7R`P`r-MUXU1 ztQjD8p_`5GJS<rHM%M%5e_0Nxx0aY8!v7K<1A{wK{)4H7(b(!6c>QN4(Ha9a3uKN5 z5$52m|B%e_B*Glz`WRG4nIP3QFt>Z*F-HX2Os+9Ugat?+C~Z2}O0+V52w>WPR>pwj zk@25GNPHrTf!Hf5L2FYbT48lGa(sir38V&u*%%lYLW;#(T`C~vfbt$l9ELBf6>SCO zeNeojy9Fc$Q-_TPnGFgTklX|ViB?b>7(|2k_}T@6AO#Ez3?@k70y76Hg+d|w4Os%T zmlDJWg~c5U)G!8#PqC0_h1mg$16Vo&$>GBlSjqs<4oN0+5e5(jl@T!gAa~<(A50C5 zzJSGCP}$95F2Vr9AbVkINuf2YFv~2Ed)drI7(f_gFU&kp{v_7D4Oq+t^-(#@MHoOB zWG~EIQs^64%mulZ%Upy3ghBSg%mdZu#JbnO8Z#U~?&UETVE|!}y)bi0p*ygc3vw@? zxd;OYgY1Qw2P(ISb?*Z#=7QWSU@pP{!XSHL=8{5N*kFbO$h|`5A`Bo5vKM9^sDD7L zdnaHq7t}@&F&AL~VUWErb4j6JU@;doZYE|f!T`b`dr2`5rWRDj!u$rKLF2L#<{}Ir z46+xdmQ)&M9*hQ+s~|H$m{hZn)qjGvQDHR5+%9hs1`tM8=a9(R`WUJfSsWX?!(F2F zAyh4l2BotFjv@>o{J|Dcc7poB_vD!vw6Gb3CI-?6GY>|KGB7aAa})t%4?BdpXj<`d zLHc0k!DvwWo#QCN0KyB9%mtMXFg17$Wnf?c>4T|-(V(8dEJqOr5dMK=E+Mm!<w5#j z=D}!CzL?=C!T`bn_K0vGrThiygP8}TLE$jXQG@}6SD={-Q-ka_Y;2G|m|7Su!@$5W z#Zd%|85|JqeRG1h<(fPb189vfHnUK~95B-vsD7K|D8c~35lH5u=p(=Z>4UiwMtd?a zFidb10pkrw=8{tWg7m@6gV7-O_Bo0$fG~$6A{+=f5k(rL4`v>W2E|*CqX+{CCm@-7 z<S{2aZ=x82g#*$DGY>{LGB7Z7If{Vs4kUB2XvZl8(g!mSMuXhj;V8lY!U9f+aM-hs zw*{sKr-4ujkUp4N7=43*fuYS&1dKC~%neW%Xa%J+P=17J$4T8OlxT&Ok1!h4_v`T% zVF2L+Nalj(Fo-QDLG8m3XNX^6<vPd_#I&b(I79j=Hl^aNAPmzF8zTXk1Hv$IVrh^b z5C*lyWn3g$LH#PwSPlro%%GMXpfMwmU2n`J;OBEt+YXRh6U;H^s6qCEFw8y>8ySP@ z6&U}73nY$Ud}`ATILrr?g&@10xFYPo!pFei)4{-S30l8`<dHF~Z;Lz!0g|5+idY{F z%NwAu0m;EIOq^I6rVlh`1}X<Z{0VLntrk%Cg52s$gj*Y+>OuOyq)N2P6ic)|*&q(a zu>6MZR+u=kG{|fa2Bm9I8x+I_VOZFL-0DY!TXozJaj~WWGKO#BF3}3>hl0%X$72p` zZs$uIq<;)j55hX`60Ngtf7=2w6J#EU28sU(lV}BvQ-d&w55l<O9yUf@<Bo8nL9=)( z%&rGm+GSo03=E4LMZg%;ZUdQ5Dz@;ztcOAM<q}5`1`r0>3o{dxPC(@@$X=KjE_wnM zb3yBkmN|+rfH25jTzc_|zrbQHsQy{uD8c~3AbVl@LGFd+2bdTx+QAbu96;^fRgNMI zAPlk>mtK70AF!AUa_<^P5e5(j*$dPEgpZl%`qIM-yL&e{iZFoi3{ONl3Ya9&az~zt z;S$UuJTyojEX-gu$i3?vMHoOB<R6%JP+o+ofr;UwO%92|+b%FYAagf4iZFmM$UiW> zAos%5z{GITpz`XD7sRiZk;+w2nE=xRn!DLjD&9JwRlM~<Gh*(>!5dQEf#z*M7?wBD z%PW{Tu{6wHP<ge)TcQ<IPJ!xR5QdpSEjwWKFsSSX&8dJewe0}871Y-Q`76K&64oI0 zRXzrWfDQ%*P})ib37}zEeTH1_!sa|@_(-&JK+OV~69_e@9?c987iJD}T?5M7AUPLb ziB_1KK;{HN%~=DIM8hz1kn2|vn<rEPevTO|-GTg!tQ{s!EDh5OiXTuu0r5ZhO0<If z4Pt}b8Vq&oL686%hPm|tG>kyfAoh_EiPkxj#K9Qm7HYW_lwLt?V31uP3<_Hi4RUJ; z)U9_w0%#cK)*fF(+5q)c(3F9>p-^+M&C|l>famlg>Q|3f%q=~B60OO5U0#CB1l6e^ z8f4gybct3FAH;@XP+G)hHmrWV<A-pgLx*@P%q~z`RPl$%-9;)#Kz@gr4Jt=8I>cKK zbc?rs=s=Vs9sZEC3@SrF803aHEc2Q$aS#of`vuXUIbRSBT7v+hLHP(ogZMCeLGkj& zACk^N`5S~mYC!80(BmE^4x&MGy&xKtr$9959x4!x%!k<lN~Zw<kn{;Er$88_7Ibzi zHakG#AbHT-FNg-s`GV+843P2wl>cCSm>nQ<wggDDg3=Yp4<HOuvkOO9fy6=bpt)ZV z4az4V`WVy>WIoIeP<s}{2IV!-`VSBW=>gS!Ap1dbFboq1(YK&xg3>pL{|E~orjM0@ zfuSc*qV*cmJafZD$UJilj(KL#+#5_khz98m>tJAj<>3}b)ZQ#?p83oKL|y>ta|wi` zQ4kx1L1_a-gD|>UkQfNV)Tjhuwi!V4%sU)K7(n<8n%N+|#NZk%=7PpXb~%bLfH25j zV$4BTa|MgJps}(&jv@>o46+wp53zh$xWj1B*eS?N5GK|PbagGknBfZ=YuM)~!T`cL z!KiVEt{)fwLO7<mpn2v4jv@>o46+xOUVP%9`CLNt%&_o*(fG`R$$`=+@;oyOGz}AL z2FP77vtTqe=9xkDJj}f7d<+cXNcj&Y4x_QvX|Og&NT@_Bs2&EX1(_2;ggKzP8>AkD zVeJ7>zaHi$kU5b=m;-9BfXo14<hmN<CXg7&oG2p9L2gTd>Qf7(dJ$v}2uI^F2R2`= z6NZ|mL1}zJ3}n7qf<So^(~nxVf$Rj~J=4X(;R|a|Ag3FU|3GR$7&NE6WrBFC%ruBO zpgar`hhfl|A*c)im4E1N0g1uXVWUB2gTe(QH^on)71XZ>(I7s)HVkaO`bj7vTwvya z^rB;Azah)P=Bq(r(G!j^3#P^;T%r|b2Ph6;=@BN6i`Iz1EK5NButSa_3?K|DYhZdo z?#AUlm>L+}fW=%;9dN`^gaL#>_QKSXLf^n*F37#d97PyF7-TQZJkWdzvF<g9#0&>e zfB%G|2m=U%?1h<23f+OlT#$QDIf^iVFvwn*d8EuoJ-}iv$h~JAMHoOBWG~EIQfP}P z%y0m?_ne~$0|<lcg_#E`|A-CW30TYpx%Yyj2m=U%?1h<23jG3$xghsmaui_zVUWEr z^FZY+vF>$<#ta9Ld#^Z(Fn}<~UYNP0&@-@@3v%x@M-c`P2H6WU4^*BL>)sDo%muZL zZa9iCfH25jn7O3T9x<5V0GeOF<tV}c!XSG|F%PB|R42gv2BSgq>vtSQ7(f_gFH9|| zG|W604XOt~W`Z!OX2H}u1d3wJ8-c>N#an~{gnz_fmdP-^_~;cGnDbGf^ibd}!T`bn zu?TZP<pXSt9G{sWIgmb>S{M!LQRI1xFo5t1By&OPiNzp&F!NwEC>(OUMHoPsAr9eQ z(Ads<c_s$X`Pl@`kHa1gS>7THARK{YE~s3G*-gk?kUp4N7!8`Q&hQpt0O1X2=EBkp zA#*|cVCKPSQ2mzXEy4i89Px;7AY>M@JV+nRJQxice^2oiVF2L-By&OOfmru~^uf%7 z(IEFGd5bWB@D3z%k=;Xx4blfQ4@QI1Z-Tc70|*NwAj09zV@`M;B4jQ|AIv-$4Vtfx z^A=$M;S3~m37Lf~57GxS4@QIB8{;j)0Kx~5%mvL?!_**~fsGB)2U829LG#s7-XaVj zERl!^2W<LriJeH4Xk~`p2?wJ=?#&7nVF2L*By&Oa1xyVt^I+mVeVFEg^KqyMLr$m& z1IS*OT2Q_D1!)WnCXS76m@Cnm2z4)v2F<^2X%t}qVTB|_IDp)%3RR2EEOas0eR?n& zRIandi7<dLvf7?Rp%z#iAdBN-+e6&|qe14rD-mG;VPri4Z$(?p6_^-6V{*vi*w~=< zcS<tEugH0nnEuL%WJrIKmgBlQDH5%qz9wi~4}@WEL?07_i4#l1!U8mYI3Y!%71R#} zjq8Ch%nWMT0W$~GZw8I)fiSi00F58wTXO)j59V(e4NCJcwoNJ|9l-e1roW_MHy^g< zAR-MRf0K`aA-02o0oS?~*f<CB9L<6>iPn^2#GD8$Z^6PJ<{y|iu{2B{D6N3{5+FWH zx<u<5Xn29#8b^d%LF)`adSQ4CXw5+uQwu1~!Q4VEw}Q+8m4_g^Hl$0m!on8h)_5Y^ z3JOb*UJ!O@l4uo~gjg>FE4x8<faGBqE)FfH2=U?i7#J8pWh{&j3R@5x<kkct-0G8# zNH=q!d-y^!BwAtP9w4(4@t6Z!AHlH<G9Cj`55hhf60MmJ+AKh3g3JTaAaR~jiB`}Y z4hVzzAdD-W!sc)0WFXvFu~57fZdWE|dlHl<i@Ze`Kp52S2ANMPj=*9rs9#v(Ey4i8 z44DY`fYQlxc_s$X-c&;NY`|hJXkA5_w+I6WgX|?_1~z$)EX;5KwI?gQMHoOBWG_q~ zD6N3p3p#TPCWebnz+x_FJx7(d2m=U%?8T)QpSVCarh7r{of>Zu1`r0>3)2rOGhq1} zCWea!_0M2xVKm6xCT|f25Z;l68gDQ)xXgozXJBzJC_U79i!gvN$UiW(JAwpSLH!}v z*fmTX8x3*~%ndLa<lY8v5e5(j*$dMLS|<Wi0~5nVgUZ%F*$}@zL2A>1$^@7m(7dL| zWbxLFCE~3bixBgg2|19m88oK}!mzxFUS7e(iKSuog2rHv<Uq<)P@4pVVP;Uv4sczQ zE71xn3qkb*2vge*m|Ma1Loa^|s9i#BJ3#Fc*cyy0xsdn-h2t$g28N^#28OrtObp29 z9)sjS7*@X{m+hc_I!I0?PolL4Y8J?xWT-h+AW1X~GY7do1La4MvXnfDR+yVW=A=N) z0p0Tnl1IicbCBzBP`L?H19B6H4KgPcYR(>z02+pwgWPTb^*7O!fw^f=bFi%ofUP-r zvKqC{V#t?hZS`ok0GSD@r$98wuo=w~tsp*#4a1<Y$7VLH&I-s!#8=32@m82!ps=3- zm3xPjH$i@fnGMRDHp|6ZT~>*=vaCSl%|H2&xC7-&5C*vcG$#m4i!l8#aS#pKmky#q zYZE{;=*%h*4N5m48pMa`1Le(x0!X}q@(c)r)PT-T#AXLb93&4~lK`SYX$VA5V1T4e zWIoIeP~JRJAkhknb5Py~VUV6#Sk?o;#6k38sF_Ql^jatlN^c-}5Fcg-%&nj_3i1O8 zgVb!rVFySYBoA790HQ%@4@8638h~hIKFkhK-keh?(Rv$cJ-~_eko5pLIMxGz=15`s zK{QBjdItjotXz-q294f<WFQ!}9zbM0YB~)mM5HZ{N>IFkXb?tM3lalin3@Nrm~}5G z4fT18Fn};<?L0_5sTeeWOK4sh=1&++j2$4qBF`)Ptb>FFv1WkWg>Db5ZU%)32qVj* z^O5C1Y|ywQhz9kQKr{&7;bUOPK#E6@7&69IZo$e?P(KE=ej216WKJd#=HMzvVQvDM zlSPC%$mKeytXq?Znyx@@%En_3Y(Chg1XUk+e?=8!K3D@St%A%%#!J>h;uBd6#17ah z4qjIdE9;Tt8{|Kb8W0A}+5TB4-uh-U#2nDL4oDn^L1S_=Kzpe{_gJF2g-~3B%m#%E z$SjV0iB?cQ21JAS`05wfeDIfIM7Y4r0qI4@$bLhXgUttn!eUM-!Yr7YkWz_Om>r-v zfTbgtJTBUz46_UXwL2$xi!gvNsEmN=1-ToS`(SEd^aL#Cg2taGd5bWBFvwn*T2km2 zSj+{vcZ#<N0|<lcg_#G+pTxS?p&T<DK<)Zz-XaVj46+wyE-Ca3EarmTJHuOq0fa&J z!psAW?-T3Z4_M3vxp$Vg2m=U%?1h<23hhyW84e)#&hZvu0AY~5F!Mm=7P0PKfW=&p zd*^wJFn}<~UYNP0&_A%43v%xQZxIGCu0Z4!P&<=Y_XbpAh68B4e37>Z0|<lcCB>aE zwJWfg3z}bD;w{1e!XSHLYDuE2Fx?B9UtQ)c!T`b`dr2}6Nii(UU^J*)1(^xLNXkfJ zHq=YB!p8MsG-$0HN1O-)2uD;Q;_XH}XDcgoER2vP9xa&j9H4X-7AnF3!W)px1^1^E zh}*vm(uY0{2O3`r2^C=gVUB8qdkMJ_SstVh-CR)m4GI-u0O15Ab3x?;Of9k**w`R_ zFtsom)S?Us6=4A39Z2S4(~nCGqz`5uj0WWkzfchd5EiIGgaaw%FGwHEJQxiM2cJ+8 z1`y6bGZ&@?mpftNAbl{kFd8%;>=i1)0Kx~5%zbl$x8(<s`<FrbVCKPSQ2pi+D#8H5 z619kMfVqVj8l(?q9*hQ!-?@c~Fo19YlDVXmzaV`u^I$Z{y)L053?O_0$y{RG2~z{o z2Qv>wgW}C8RD=P973vV-VDp3%KDP<ekBbKBgP8}TLG!^5p&|?*T!CaRE;F!+gY?17 zgV7-O+J%ZRfbaz*b3yaLFg4iBLKXw*gQ<nlp!r~%P!R?Y)~H8>gGZ)7D=3|T@*}bt z*w`MMFw03$AB`(cgaL#><tR)aXgrtLauU=&6ls9C30AIy%ps;dUC}`MeV%t3Xg>!9 z@-L{*1sW3oVOTi8#tcC6APf^HmImnoVURia<`QA%fz%>nP`v`<cQiuc2*#&2?SR94 zP+17FYe^Hr{(F2347nW)47k<?!1}hxV~rp)VkRN>FT?T%C~QD-Fbo%m*7Jn;Fnyr0 z7f?9};s-QKwElql2jtc~BHRj^lLP4m;Vp|KT3gmjwD!Ca2V+>f1l_GLabjtZ*&qz+ zV}jbCAT|iY!WQJ#d?MWX1}QEo8X^0azcfp<!up{gGYjyT1Dl_la|qHu2B`<(H_Z~Q z&+dQQ0x}b19*72s@0l#o3L5VOVGtjLam77stkb3ikzQ`>6K{ptwE#=I3^d;r5h}s} z!k~5=$b3@q4=m<_>dUB55e5(j*$Xohlukh9F34V(7%n=X6|)@)n(vAU6=48jkiEF{ z;uBwi#avMR6BjDN0Ky=9VfsPth2;a77*4tk)4iZ}Z$hXD0|<lc#i<vM#0D(pg4~-F zD#8H53~h+`2F*(m>t2p_?Cwnq6=4A32qbes`+@(-GclaU<4%|qNFU4%FdF3Elu!`{ z5C-`NrWTYJVQOGvxM<M2E0|gs4Kg<)RD=P9LH>d11-Tcd1}27!29;NH+96^16=@Ct zR3^amfaU;VHj1}e929Tu*pHY4VCaC9ccAfq5QgPV^zsTOPAm<x7gS!QbV#&<$|=y; zJP5<gpq3q=IRKD-pt2iO2ZJ!R?EtwI+}C4ZU=Zkpgf+;{`+N)xg&hnGptOa2Pa8-M zgkkj=a=8neJB#R)Xg$#ZF$-i)5!9R-kVZ5NGY7e@0p)FwGL|lhR+yVW<`hHCSqYLv z!!UD@>sJu_%tXXm9ay>p`59R|T%5%E6%;?9d;&6SLzhG=$lo9~$gL$%x9$T8pkbI> z7a)Z<h}|+#qSfV`I2gm-gr*lRPNG}E>6J|geC{vENKn{<Xpmb=p>Dki5<tT+xB7HJ z;u9nd>Z^cgbX*2C2itrfY%bB|Bx?QY(=E{&b$sqikeQ%56-0x~-LXWX6~qUzVHlJa zv6&64U*~iq-1y?Kcq_~<P+EKfmHUrWj)43QGaFQnTsSP=nsHpbb;c1yIpWa+Nz0%z z1cX6u0G;)Zo`zuJAR07>2%<rAhaehsUoMCS<s%Rc;=}9(#mkx=NID1QZx9Bl0o@&i z%?^+_NFFq22%<rG3PgkM`2^9(e3%`ebSlsbNuQu{3WPyw=U|!VgNcJ^&>SL&2F)FU z==BVc@&J_oV0@SzAh(wEO0<H~703@D3{tZlhaDhskUVJ45JZFW35Y%nwF8+Cvjfzg z1+l?-4Z4;9qz6>@f$Rs#!7xl5L|=!R2}<7}{(UTbm_E?{WuHEY)(1%Ql^SOu^OdzY z<|{#SZ!rBJ8l<<pgMk5-SFJ)(d$X|l%91mvd4Z)5k$yqufYJtt24QryATbbzsd<8B z4Krx}a$cwi0|<lGID^!aif#Ha+ajQ`k%CYW1`r0>ORAY5^;58z3mPjc3Kd}hVUWEb zb>v`JxWj1Bm@LRl5GKbwkRF!_nBf2#lPw7qVF2Mb{ityV(nAcMFa^_G&=^Kps0afH zgX|^79CS6H`CLNt%&_o*(dcGi<Ac&D@;vjJ(~vYwtQjD8p_@yMd1g>O4>R{69|J=L zQvQR9!)R=E8m!F$T7wFzhe2vV=2Q}44yf)1sRv<Ldmv_#L@UfqAakmSFbC9L0hs~9 zpz$gY4Z<KdfoPC9)kK(s+?E2>r$3PDZjd=3T!Y6P*nIVyNvLTWl*SWgLguS)^rFgv z%tXd4&~$+;24bgN7H<WGFRVR*oNhq=1E~RF(42D28S&O57a{2jl!rm$Fbo<q1eGD6 z@(<lDATgLaY&6JhP`H5PLb@edLH&9V4dUZ#!@%aNmmq};%p8zjbd2mbWI5P;H7G26 zreKC6%M^)Lm>r-v0EHK_eq8JqSjrMmKdd5DgaL#>WerR($lbWy2U7#19j0QIQJ^}Y zDpZ64ghBSg)RIEaz+x`Qy)~gC3?K}$7iJ!4zJyr!e!yZbsJ~wqD#8H5AbVlvl0th- z!wd(IdmBPU7(f_gFU&kr=A#y1F&E_Crce<E5C+)`GnW+l2NrWd?rjMbVE|!}y)g4Y z<sY%(8!#O+96;`E3l(7iVUWErb4j6BU@;fu-i}Za1`r0>3o{Q?&Jychh8fu1+Z8Ip z0Ky=9Vdj!TM_@4*<ldf85e5(j*$XodRGt&--VIpH1+|U(LPZ!r7-TQZTvBL`nV8`K znqQv~D#8H5AbUwM52hAWC&2s$qe1iQlR`xpKp12%Of9K2%sdzkss})3f-tFO!PIN4 z6UCTc2ep-%;zSrgc*ji4G8v{9ADyujb3O_*-uft3gaL#FW+BW4jkyRaFfnN0GY~2V z(uY2t4k~{i#ELM0a0ZgOP%T7JAbsfOg3|B3SP=#gK7eFy$`ej_m=Q7@qz~O((EQ|` zSP=#gmY9tQ2SR2c%Y*cxn+tO9tymET5H3J67c@T!Q;Tc{Ha18fOf8HC%}?Hl6=4A3 z6G-M_(~nE6Vva;BY)>bQ29=WqX(9|DtS|==4i{pXTg0GaI=IY(i7TAMG#3;OMQI`o zAPlk>rWQ2r46_?1hKv4VE7jTxbpwnBnQJmpgaL#vAi4L*ZDF`tT;{>V4{VcYh3zMW z(I9ibl!!2Zu*O_OIDC1^30Di#kBh!?3v+)hsGQu^D8c~3p#8Tny$$I~Edfx!!NhRU z2J<lUG3fsAZ?Pf_AbbPKy|~Q4Cf<R?Tu?ath!tS~VUWEreKKvlEwHo*6T?M6z+x^a zo&AaxVE|!}y}0z^6StU;84e)#{)rV~0AY~5F#Vu(Myz`$;4t@JtOx@LgY1Qw3##Xd zH5XKF!_>lPP<mj96JY>hki9T-NufdQZ<Pg*GzzPSK>CU4uXHSs0QYxjIj;L=0i>@9 z8rK71m>bc@#Ngu4d_af~@*@a?#t#D)(tdv?$SzR78MH?TgyHT3Ng!dkIEnrMjUVD$ za{x0J$to}tdCkF}g^+XrmY@N#1&8^tH3t%l5%xdkV_>N3U|_(tt_3#Efjmc(uvnt? z%zBAd&^QbT!}1AwT7iiZOT&T!lvY4}2@wCtVu{wAMG*Ib+*(hBTS4m#Kzd<VWP=3! z41JhesO46WIiT_dWLLowiB?$Hg526bgj+#j3DOI~EA~mWCY(dK6;|hh>;TEbFif0S z8m13q4yX?S<AcH$#0I&wkqEc)EP=!WNRP-9$odG8r4p^MaSxDq6CQJ5>mxQigp9|4 z)Ppe3Qi;|&k9G@?nIQ8(G)TN;qeLrc4hMumd=SQ!PGR#mF-s9{RJbeN3bX3~mUcC$ z{re<VgaL#>?QW3yq+*F>nDrZI{o}J(5e5(j*$XohlukGmn26fHT!6(~P`&vgR)hhB zLH5GT1&wRK(ltyB7kvVYxuE*(RjddD2!rf}=>??~kb8;QzpStvGaNuO7H?uj7(f_g zFU(w0=nGiP1%<=ASP=#g2H6WU4>VpvY&d}0Uof>W8Z@`|C02w1ge#UK(h(@$_!XEK zKyy|wyKvDOD=@<WRQ7*}6=48jkbhu$Ev5^!g8FZ;v1^z(HX7s}m^)!KsD1V+R)hhB zLH5G*f!a|Z_b!47;Gscf>z)-5zp_E=LXdJ$nE;|e7&NcB=bU(}zytBt3wIIonhGl+ zWix0_6NF)T6I9NC^uaJpoLCyB4>ShbvJz6Jg4!e?3^RjTc7W=d7b_)NL1iImz7d3} zZ3oP)p!xySCIMk;+W~5qfW`wrVK-$JBtAjxCwvSH%^eI3p!5Kma|VeaV_5x;T((#2 zgxni?XO%>&57aD>IW16gK=a4QW`Ni*bCByZQ2zrYr?Oh273L<8IjvB0K<8zH<dHGV z9OOD2l>cCAKyCuDLFTkU&B2y0VdfyWTR`IvAie0g9cm7?bpfz72R+ZlTaoo0SS``Y zaO<fB$V^Z@1){<72P9fSd@vhIfWjV|*|0iGU=1R^{yY+Ih1mrP`v|C<08-ur`5kIB z11N7kc_iNY=Baq=n#YK|xn~U|?m+nxgh6fqotptmi!l8#aS$EB07)lNP&y4tgVGI1 z9>j;~1LaMHwUBrP<rxqLsR7-sjm-{_I7l9}j~PUR(h!JlfZBn~huHzjn=NZ4T0wCR zYG;BlNDpWV9h)5>agaRdE^ZJFN?#xvwBH#-BlBT)z{~-qQIH=%7^D_dcEaRfYGL9a z8nm7PM1#^Eh+YTv2QnX~50p1!)=9KJMOqI~@EWonpcmw5m_jHGs>eWcq);xH0_pAO zU|@ii{nuhawJTT(Ou*Iy?0JQnPDR!s(iTV|DBeIc2&1b7iGeUo4Jf<`&HuvO1EWFu z31N_%kmrBDyo9)!STjKGLbn4}hl1P=!pQRId}KKg8`ORR(V#vJhz8+jd<+boNZ}0< zL&n(37g%`*>TiJ7IfK-L%;_S+99-oc%uOJ3x`{9cx%>r{Njac$3gi$Z+=Is)*u3qM z4XEh`v|lV^8)V-0#adK3B%{GhA834nIY`8h58~kU->@<nIle*ugDC~gtuA>b-a6$y zBwc{U>tS*r8Z?$#ktERyidS^EfW$y*aAA<ypl|`npI9x?3hHlwXb>M?Jph}xjX??* zm^mQ5=or~=$a1iGTTocAY{Cr3JsTxjVRnGx0G5uB&A`T9fMp*GsGZCcC&B>2pnWbd zeIR$^avw|$jQ)YeTu{G>FHVF3ghBSg)RIC6Y{qOSgWM|+C&B>2AbVlvf$}G@?p=Y! zTu?h%C{Ba{ghBSg%q5B5g5A9$aUu*L46+wy9;o~#*1Zu}%mukuEKY<0gc-JArV*Gu z_~;E-%msz7M4Si%2!rf}=?9ft#JZPbD`q%=+$$9)!T`b`dtv61LMLD`7vx@<I1vUA z2H6WU57Ztc*1bEhm<#If%EgH=fH25jn7O3T0^2ad0W=S)5GTR_!XSG|F%PB|RK~*m z2BSgqph|Hf3?K}$7p9g}8fG4h29>KIGeMYCvta6{{J@--0hJHmN<<hy7&LDKQ(N#r zxYa^|iNOFSfQNQDh&ew6N@p2qA`Bobv7Nkp0n(=mZA-&wQ2#tFO@sl23&=DVqz`5u zj0UCOlr#|r5I%uqE~tEfslgKjU@4G3m|7SOYWXFli7<e$!VdDn0i+LR9*hR%i-a^0 z1`w`5G8a@nNGUKen1Ee`p8)BDnFpgm;SiT5!T`b-kjw>@>o7I=O=VyJ>4T|-(V%g* zm^2Xv5Z2g<2nSF<Sc%Ae=OBGB^I$Y6{YIsUFo19alDUN3h%67%2Qv>wgXZxg(nJ_Q z_y&@>p#C<<y%xv@;9!IF!OVlvAoqr)i7<e$!7fBN;4lKKFi0QFJQxj%w~#au1`zH* zGIz@pPWYTOR>P14LHc0k!D!Gteo&eS0|-ArG8ai3K_*Ba%sdzka&JJI2m=UP>_&tG zXdWM?hLFJ^eK55!8Z?jZmnOmh!V{3pl~^m#3d$Ft{7A^$h})v@IceDZH7MTRl!!2Z z@Czh!Pq0JE$pAuzGB7ZJ+J`lJAby3F>mY5!w5K2Jq5XbLm%X%~D+2i!)aL^A-9Z=@ z4(R=Nm^iUC$XpNxnS*c64`v=nEiwkxD=_|ty^uJ9@u^L(z+wKI6Oj9zdG;ghf5FGV z(AUAhAO@`m(cJ>;+aiw%g4C=yhuCKf%NwAu0m;EIOq^I6rVlhm0;*>~{2luxS`+p` z+zWDRKM`&P&7Fbtg7JNc)&g#+R)sK0Fovz!KzA!loLCxcHUk3#sE-M1gTnZ*um!nw z0ugQvL5d5PCdfQm%mIm3SU(hG?nFH1z~<2${z3Z3AoU;|azLW>oaT=$ATvScfoPC8 z#|4R2h67Lx5@5g`_pmX^B_Q=swKc!QTaoQ5U}A*t0Rt%kg@?2P69Xp$0|ST#@nPaI z{}FDSgQZOeS`(9#Cc*&1Z;<Q+?eSDlU}6C6?E#sE4}<ifr#H}CPF9)-0|<lKk}&-f z)(f<P>RQ-%5lkE#4O&};ZZ4>f$x9Pq0AY}SVERC57p4{_hKmNJZG%IQ^ev8*2SMov zrUx{x%koyd_0AvhR-NC7aos70AbA5crVGNbJdB>UVdBKnFnd99_v4U6D=1Ba#@Rp^ zW(KwF0FCQ{>;vU<P<ai))V2fUR!}<-WY3brkgx`^U-B_9OzL1@0HrN#^O~@-4>^y5 z+GilWZw^be#z4&inKKz`PB};t4a3YqE|)-Q1f*=n5s6lqn?UAFftoWNB#DM$<{+2F zAhyIg#QF<Zx&!$cSvyReSQ@4m6hE-?&E=>>E6Cp<IgneYLfyI=B!GrtZZ$cA2yYPk z!dZz{7A{FJhPj1WZUv=R&^$HFDWI?gu|aN~26ZdwK2wkwGKRVJ0g_um?OJ3tF!pq) zIoRfKVDm#Ptdc16Ll2Hhv|e9Y$O1AGRQ`f!ka;W*C0apz5F3U;X%U;*u(H_T7$Q7- z{)@N5>;k353aFeSQaJ+hJIriQIa2apyj6o)vNeK1vX!IN8nnHW;m$EgS_YLNAPjOt zIF@~uFmVtKnim4mpmT0PbOr+=AHn!AdqMHya2%4(LHQemL25wv?xM#%OdLdm=7B&o zC{KatCa4|Ae3%`ebh_j?Bz=O)DG&zf>B8X;kT^&lG!F!#LHP|tgZ8k3Xk<Rj4v<?p zPDr$Z(iO-LAPiEw1cx0UagaP{9tcE(@(GCE0QCnlA7%%r?E_+i@)~Gv7=%H3Ky@F; zevljt!^A=K5vZA<^bO*l!NP~>1MNwDa6+Q>71A8k3l7OvCI&`^c{t{vK=U*({U92o zcSZ*T11t~wq@nhFU~^C=9H@C=#tB6F1(^d%8z35l(ba;)Kp3W`0>?V#k~9$p5C*Md z2B`;OP?-gD8;Fk&U%+B6Xnd(GO@sl2LH6R)k4sMD6y~@UsLfE3Cc*&1AbVkYL2Vpj z-P?e}+^RGY1`r0>3o{o~9ujNr4J_t@#(`?mL>NFAWG~EIQfPzInBf50A5oVk!T`b` zdr2`5rnUo%xuAY@Lz)N!2!rf}sU?MefW=%;I5ee+Fn}<~UQ*0MRtt*@7!4YC1(^xL z$m&R8PdI}azM#FtEomYQAZ&34HO~=i_MHou=7RPTx21_NfH25jV$DKU2P&Hh%_YOa z2Sy|7$HfMfEy#1pIqZ<KhgdT}?m{;k);9o^K_HAQkIqMy1F=D4njjj~J_FGp{F;w} zVJ1?!2@*rb*xDknwjyXfD5(7eQV%j`77^xv+FT&@APg!KK{TlE4s#R8oY_Q}18Qf2 z^nx&`Oaaj#4002Q2AMO52y>9zz@T<e&r!^@ITw#PusLaq^QihjX?)F9$eeTzS{(y& zA2L3|21yslVj#8(zho;Yd|~ZC<a7h_A4m-dgXWE8I3!zJcp>J1@-RpohC$<kpfUuM zKG59)5`(G3MuW@-g$qdT#Zie?P~ROygZTK`p0GLT59bi!0y77s7ab$}4OtF0Ck+aV z8KAKOWJv}FhJXtatuQ-4aR3T0G$mNMCKoZw5>Q>(ktV_b!l1GSrV-?BT<(LZfzdr! z%mvi}U1=f=APlk>rj``?2^Mof?(InvVF2Tch;Rnwb7I|Va|tsXKy8h_G!X_62H8uB zJ7H?4U@;fu-U(?U3?K}$7p9h!Ij1*R%mul3Qkn<@2!rf}nM(@oav3umK<=HACc*&1 zAbVlvfyzH(!*>oAb3yK%mL|dg!XSHL=8{5x!D24Ry))887(f_gFU&kpIZLd2eXd}J z1IWFz(nJ_Q7-TQZTvF&ISj+{vcTSoJ0|<lcg_#E`&xv*KA1vmA+D7xzL>NFAWG~EI zQs|JYnBf4LLtl_4!T`b`dr2`5rWRBu!2AZIL38Mf(nJ_Q7-TO@EvYojJQxkC2S8?m zFsWw2)Ym-2oI?kN?~4)<1`uYshA4MHcV?Ord1q$JZA^1PJ+?<BA`BoLgJdpfjLS-a zi2-?yC(M25w8Udfb3x_rtr8Ii5Z;1huF7M`To&@(H|XZU_#l0-xiJ_GnlrsoBEkT| zJl7H707}2w3QP=cFwJ=AJ=Zba3u-HWC=p=*;S?luPss7L8Y?g{_~S7TCI#Aa3Ueon z2DOzxm54BaFvwn*T2T1_a<3gs01plFC(Jw;4GQ0DB_a$UEOG-84xsb^x<l0gk9jaD zkUp4sFd9@oTqzM@0O1@Yb4l4lD{~Vwd_m@3C=p=*;Uh@qg63jjcEj9-iw3y|rWQtn z=8i9wh%kUK$X=LU(4GfSz5tb@Ffm*-$UQLgU^Hls_gskx0|=MgL=9gvBJ<k`cBxkM zxg=0HOsf`Q0O2#p=1vkIdM`0ZAG*09e@>|uVE|#3TL|}_V3dN-Gvo3<OngDLRO=!I zCI)#11_l@nDtAuJ6JY>hm^xDFBmXe>RD=5dI~qk8Kp3>=8fGTwZeds)z{GITpuOX; zJ>@VOlpc&GiZFn%&TT|Efc9z^A&rURG7}_z2TM5#ink{vA`Bo5Dn~);Kp51HBG$d2 zavP==MuX;rpOuI(fH25jkeQ@nQ2V>!4#cmpdI)3&G5wV*cO=059a@gZTilgs1@$#S zeQOYgxe<LV6DCe94e}!hgT{U5+@<|qNswKjeluu17KCB$q?SKG<G%RT6~OERxdR!4 z(h!XAaSxIXV0^06ILwEwD@eJIu>UO|1H=3d1_pH;`3^SDfjqYca_<gqsa8<<f-tO{ zLl0w^II%RyTo4AO6;NLS#1?oU(YgcbACOxY5aCt^B>#cT=uwnvZONAeW7vJ{=x&9H z6H9~41!2%Q0jQk-V()n%(FzM&kXsiL;np>1ZcX?m(K^Rg5{zNx54u}n;>6M*w}CLo zt)Mm-hz-J^um#Z|w=N>Wtq~6p>81y|mpI{}L@R9E17y}>Jm$dGK;+0m#$!P0K{(=} zMC;F+Pc1-Zg3JTaAn`L#C0apqZy*ffgD|di3Y&LZ@etw0I}(zuFuOiHlxW4a20|0M z1_DHb!Utprhz^iLbt5*tT2Q?p8l(rNH-iYhI#9hJ8d+}#lHLQ4u(#3fm54BaaK<Bq zUk|kNw!qQ@$Q}4Fs1E^C3!_18hzBJi3?K}$7p5Q7Mg#RR;$Z@KXpnng=D}#tde1v0 zA`Bo5>Vx3Xj#CPh|JOW*_*Da`oC2j=m?qGiX$_ZT>ltau)*ea3oT<PQ32^xVnlA-m zSo%TFQ!sI2X_&pBxGQ-A$@ido6NF)AP|FTbd3fWAL@Ox2g61+onA�+zKkgKxH}z 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%0De-VEBt9FI>jJ;9ADO@DL==z`#&i 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 CjnFRu 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) */