diff --git a/third_party/sqlite3/alter.shell.c b/third_party/sqlite3/alter.shell.c new file mode 100644 index 000000000..ed1d873b3 --- /dev/null +++ b/third_party/sqlite3/alter.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/alter.c" diff --git a/third_party/sqlite3/analyze.shell.c b/third_party/sqlite3/analyze.shell.c new file mode 100644 index 000000000..9ea40006c --- /dev/null +++ b/third_party/sqlite3/analyze.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/analyze.c" diff --git a/third_party/sqlite3/appendvfs.shell.c b/third_party/sqlite3/appendvfs.shell.c new file mode 100644 index 000000000..2b18660d5 --- /dev/null +++ b/third_party/sqlite3/appendvfs.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/appendvfs.c" diff --git a/third_party/sqlite3/attach.shell.c b/third_party/sqlite3/attach.shell.c new file mode 100644 index 000000000..dfe7d6d71 --- /dev/null +++ b/third_party/sqlite3/attach.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/attach.c" diff --git a/third_party/sqlite3/auth.shell.c b/third_party/sqlite3/auth.shell.c new file mode 100644 index 000000000..bbe9c2806 --- /dev/null +++ b/third_party/sqlite3/auth.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/auth.c" diff --git a/third_party/sqlite3/backup.shell.c b/third_party/sqlite3/backup.shell.c new file mode 100644 index 000000000..107773467 --- /dev/null +++ b/third_party/sqlite3/backup.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/backup.c" diff --git a/third_party/sqlite3/bitvec.shell.c b/third_party/sqlite3/bitvec.shell.c new file mode 100644 index 000000000..8cb4930a5 --- /dev/null +++ b/third_party/sqlite3/bitvec.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/bitvec.c" diff --git a/third_party/sqlite3/btmutex.shell.c b/third_party/sqlite3/btmutex.shell.c new file mode 100644 index 000000000..caa2b7eac --- /dev/null +++ b/third_party/sqlite3/btmutex.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/btmutex.c" diff --git a/third_party/sqlite3/btree.shell.c b/third_party/sqlite3/btree.shell.c new file mode 100644 index 000000000..2d435907d --- /dev/null +++ b/third_party/sqlite3/btree.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/btree.c" diff --git a/third_party/sqlite3/build.shell.c b/third_party/sqlite3/build.shell.c new file mode 100644 index 000000000..72dfebe73 --- /dev/null +++ b/third_party/sqlite3/build.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/build.c" diff --git a/third_party/sqlite3/callback.shell.c b/third_party/sqlite3/callback.shell.c new file mode 100644 index 000000000..de758a552 --- /dev/null +++ b/third_party/sqlite3/callback.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/callback.c" diff --git a/third_party/sqlite3/complete.shell.c b/third_party/sqlite3/complete.shell.c new file mode 100644 index 000000000..f27e9d9e7 --- /dev/null +++ b/third_party/sqlite3/complete.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/complete.c" diff --git a/third_party/sqlite3/completion.shell.c b/third_party/sqlite3/completion.shell.c new file mode 100644 index 000000000..7e168358a --- /dev/null +++ b/third_party/sqlite3/completion.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/completion.c" diff --git a/third_party/sqlite3/ctime.shell.c b/third_party/sqlite3/ctime.shell.c new file mode 100644 index 000000000..f7336a562 --- /dev/null +++ b/third_party/sqlite3/ctime.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/ctime.c" diff --git a/third_party/sqlite3/date.shell.c b/third_party/sqlite3/date.shell.c new file mode 100644 index 000000000..fc7f656ec --- /dev/null +++ b/third_party/sqlite3/date.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/date.c" diff --git a/third_party/sqlite3/dbdata.shell.c b/third_party/sqlite3/dbdata.shell.c new file mode 100644 index 000000000..49a5461e5 --- /dev/null +++ b/third_party/sqlite3/dbdata.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/dbdata.c" diff --git a/third_party/sqlite3/dbpage.shell.c b/third_party/sqlite3/dbpage.shell.c new file mode 100644 index 000000000..e0d6fb570 --- /dev/null +++ b/third_party/sqlite3/dbpage.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/dbpage.c" diff --git a/third_party/sqlite3/dbstat.shell.c b/third_party/sqlite3/dbstat.shell.c new file mode 100644 index 000000000..71c1471bc --- /dev/null +++ b/third_party/sqlite3/dbstat.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/dbstat.c" diff --git a/third_party/sqlite3/decimal.shell.c b/third_party/sqlite3/decimal.shell.c new file mode 100644 index 000000000..96118f74e --- /dev/null +++ b/third_party/sqlite3/decimal.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/decimal.c" diff --git a/third_party/sqlite3/delete.shell.c b/third_party/sqlite3/delete.shell.c new file mode 100644 index 000000000..20e73c4ae --- /dev/null +++ b/third_party/sqlite3/delete.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/delete.c" diff --git a/third_party/sqlite3/dog.py b/third_party/sqlite3/dog.py new file mode 100644 index 000000000..c43a69713 --- /dev/null +++ b/third_party/sqlite3/dog.py @@ -0,0 +1,120 @@ +sauce = ''' +alter +analyze +appendvfs +attach +auth +backup +bitvec +btmutex +btree +build +callback +complete +completion +ctime +date +dbdata +dbpage +dbstat +decimal +delete +expr +fault +fileio +fkey +fts3 +fts3_aux +fts3_expr +fts3_hash +fts3_icu +fts3_porter +fts3_snippet +fts3_tokenize_vtab +fts3_tokenizer +fts3_tokenizer1 +fts3_unicode +fts3_unicode2 +fts3_write +fts5 +func +global +hash +icu +ieee754 +insert +json +legacy +loadext +main +malloc +mem0 +mem1 +mem2 +mem3 +mem5 +memdb +memjournal +memtrace +mutex +mutex_noop +mutex_unix +notify +opcodes +os +os_unix +os_win +pager +parse +pcache +pcache1 +pragma +prepare +printf +random +resolve +rowset +rtree +select +series +shathree +shell +sqlar +sqlite3expert +sqlite3rbu +sqlite3session +status +stmt +table +threads +tokenize +treeview +trigger +uint +update +upsert +userauth +utf +util +vacuum +vdbe +vdbeapi +vdbeaux +vdbeblob +vdbemem +vdbesort +vdbetrace +vdbevtab +vtab +wal +walker +where +wherecode +whereexpr +window +zipfile +'''.split() + +for s in sauce: + with open('third_party/sqlite3/%s.shell.c' % (s), 'w') as f: + f.write('#include "third_party/sqlite3/%s.c"\n' % (s)) diff --git a/third_party/sqlite3/expr.shell.c b/third_party/sqlite3/expr.shell.c new file mode 100644 index 000000000..8441b1415 --- /dev/null +++ b/third_party/sqlite3/expr.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/expr.c" diff --git a/third_party/sqlite3/fault.shell.c b/third_party/sqlite3/fault.shell.c new file mode 100644 index 000000000..0f07bab5c --- /dev/null +++ b/third_party/sqlite3/fault.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fault.c" diff --git a/third_party/sqlite3/fileio.shell.c b/third_party/sqlite3/fileio.shell.c new file mode 100644 index 000000000..784b16498 --- /dev/null +++ b/third_party/sqlite3/fileio.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fileio.c" diff --git a/third_party/sqlite3/fkey.shell.c b/third_party/sqlite3/fkey.shell.c new file mode 100644 index 000000000..acf186d62 --- /dev/null +++ b/third_party/sqlite3/fkey.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fkey.c" diff --git a/third_party/sqlite3/fts3.shell.c b/third_party/sqlite3/fts3.shell.c new file mode 100644 index 000000000..616df65d6 --- /dev/null +++ b/third_party/sqlite3/fts3.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3.c" diff --git a/third_party/sqlite3/fts3_aux.shell.c b/third_party/sqlite3/fts3_aux.shell.c new file mode 100644 index 000000000..1ec3e53b0 --- /dev/null +++ b/third_party/sqlite3/fts3_aux.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_aux.c" diff --git a/third_party/sqlite3/fts3_expr.shell.c b/third_party/sqlite3/fts3_expr.shell.c new file mode 100644 index 000000000..f06d16ade --- /dev/null +++ b/third_party/sqlite3/fts3_expr.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_expr.c" diff --git a/third_party/sqlite3/fts3_hash.shell.c b/third_party/sqlite3/fts3_hash.shell.c new file mode 100644 index 000000000..fe05adf61 --- /dev/null +++ b/third_party/sqlite3/fts3_hash.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_hash.c" diff --git a/third_party/sqlite3/fts3_icu.shell.c b/third_party/sqlite3/fts3_icu.shell.c new file mode 100644 index 000000000..49b5c15ce --- /dev/null +++ b/third_party/sqlite3/fts3_icu.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_icu.c" diff --git a/third_party/sqlite3/fts3_porter.shell.c b/third_party/sqlite3/fts3_porter.shell.c new file mode 100644 index 000000000..1cff45cc1 --- /dev/null +++ b/third_party/sqlite3/fts3_porter.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_porter.c" diff --git a/third_party/sqlite3/fts3_snippet.shell.c b/third_party/sqlite3/fts3_snippet.shell.c new file mode 100644 index 000000000..99e77d1eb --- /dev/null +++ b/third_party/sqlite3/fts3_snippet.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_snippet.c" diff --git a/third_party/sqlite3/fts3_tokenize_vtab.shell.c b/third_party/sqlite3/fts3_tokenize_vtab.shell.c new file mode 100644 index 000000000..53bb0d44b --- /dev/null +++ b/third_party/sqlite3/fts3_tokenize_vtab.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_tokenize_vtab.c" diff --git a/third_party/sqlite3/fts3_tokenizer.shell.c b/third_party/sqlite3/fts3_tokenizer.shell.c new file mode 100644 index 000000000..354ab7e63 --- /dev/null +++ b/third_party/sqlite3/fts3_tokenizer.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_tokenizer.c" diff --git a/third_party/sqlite3/fts3_tokenizer1.shell.c b/third_party/sqlite3/fts3_tokenizer1.shell.c new file mode 100644 index 000000000..c4020ca1e --- /dev/null +++ b/third_party/sqlite3/fts3_tokenizer1.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_tokenizer1.c" diff --git a/third_party/sqlite3/fts3_unicode.shell.c b/third_party/sqlite3/fts3_unicode.shell.c new file mode 100644 index 000000000..2f95f2448 --- /dev/null +++ b/third_party/sqlite3/fts3_unicode.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_unicode.c" diff --git a/third_party/sqlite3/fts3_unicode2.shell.c b/third_party/sqlite3/fts3_unicode2.shell.c new file mode 100644 index 000000000..9da1a45fe --- /dev/null +++ b/third_party/sqlite3/fts3_unicode2.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_unicode2.c" diff --git a/third_party/sqlite3/fts3_write.c b/third_party/sqlite3/fts3_write.c index dd8b38600..1b6b371cd 100644 --- a/third_party/sqlite3/fts3_write.c +++ b/third_party/sqlite3/fts3_write.c @@ -21,6 +21,7 @@ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) #include "libc/assert.h" +#include "libc/mem/alg.h" #include "libc/mem/mem.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" diff --git a/third_party/sqlite3/fts3_write.shell.c b/third_party/sqlite3/fts3_write.shell.c new file mode 100644 index 000000000..655a490f6 --- /dev/null +++ b/third_party/sqlite3/fts3_write.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts3_write.c" diff --git a/third_party/sqlite3/fts5.c b/third_party/sqlite3/fts5.c index 46e62cb66..a628e8f86 100644 --- a/third_party/sqlite3/fts5.c +++ b/third_party/sqlite3/fts5.c @@ -608,6 +608,7 @@ struct fts5_api { SQLITE_EXTENSION_INIT1 #include "libc/assert.h" +#include "libc/math.h" #include "libc/str/str.h" #ifndef SQLITE_AMALGAMATION @@ -21097,7 +21098,7 @@ static int sqlite3Fts5TokenizerInit(fts5_api *pApi){ */ -#include +#include "libc/assert.h" diff --git a/third_party/sqlite3/fts5.shell.c b/third_party/sqlite3/fts5.shell.c new file mode 100644 index 000000000..09366eca9 --- /dev/null +++ b/third_party/sqlite3/fts5.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/fts5.c" diff --git a/third_party/sqlite3/func.shell.c b/third_party/sqlite3/func.shell.c new file mode 100644 index 000000000..a5fbce298 --- /dev/null +++ b/third_party/sqlite3/func.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/func.c" diff --git a/third_party/sqlite3/global.shell.c b/third_party/sqlite3/global.shell.c new file mode 100644 index 000000000..a1954d323 --- /dev/null +++ b/third_party/sqlite3/global.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/global.c" diff --git a/third_party/sqlite3/hash.shell.c b/third_party/sqlite3/hash.shell.c new file mode 100644 index 000000000..c7a83c94a --- /dev/null +++ b/third_party/sqlite3/hash.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/hash.c" diff --git a/third_party/sqlite3/icu.shell.c b/third_party/sqlite3/icu.shell.c new file mode 100644 index 000000000..31742ff8a --- /dev/null +++ b/third_party/sqlite3/icu.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/icu.c" diff --git a/third_party/sqlite3/ieee754.shell.c b/third_party/sqlite3/ieee754.shell.c new file mode 100644 index 000000000..a107e8fab --- /dev/null +++ b/third_party/sqlite3/ieee754.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/ieee754.c" diff --git a/third_party/sqlite3/insert.shell.c b/third_party/sqlite3/insert.shell.c new file mode 100644 index 000000000..4ede33db1 --- /dev/null +++ b/third_party/sqlite3/insert.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/insert.c" diff --git a/third_party/sqlite3/json.shell.c b/third_party/sqlite3/json.shell.c new file mode 100644 index 000000000..2a5c9e059 --- /dev/null +++ b/third_party/sqlite3/json.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/json.c" diff --git a/third_party/sqlite3/legacy.shell.c b/third_party/sqlite3/legacy.shell.c new file mode 100644 index 000000000..dd086fccb --- /dev/null +++ b/third_party/sqlite3/legacy.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/legacy.c" diff --git a/third_party/sqlite3/loadext.shell.c b/third_party/sqlite3/loadext.shell.c new file mode 100644 index 000000000..623c094ed --- /dev/null +++ b/third_party/sqlite3/loadext.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/loadext.c" diff --git a/third_party/sqlite3/main.shell.c b/third_party/sqlite3/main.shell.c new file mode 100644 index 000000000..9c64591ad --- /dev/null +++ b/third_party/sqlite3/main.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/main.c" diff --git a/third_party/sqlite3/malloc.shell.c b/third_party/sqlite3/malloc.shell.c new file mode 100644 index 000000000..1414533da --- /dev/null +++ b/third_party/sqlite3/malloc.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/malloc.c" diff --git a/third_party/sqlite3/mem0.shell.c b/third_party/sqlite3/mem0.shell.c new file mode 100644 index 000000000..e2359bdc9 --- /dev/null +++ b/third_party/sqlite3/mem0.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem0.c" diff --git a/third_party/sqlite3/mem1.shell.c b/third_party/sqlite3/mem1.shell.c new file mode 100644 index 000000000..184de31de --- /dev/null +++ b/third_party/sqlite3/mem1.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem1.c" diff --git a/third_party/sqlite3/mem2.shell.c b/third_party/sqlite3/mem2.shell.c new file mode 100644 index 000000000..82c610c14 --- /dev/null +++ b/third_party/sqlite3/mem2.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem2.c" diff --git a/third_party/sqlite3/mem3.shell.c b/third_party/sqlite3/mem3.shell.c new file mode 100644 index 000000000..2f3d9ca53 --- /dev/null +++ b/third_party/sqlite3/mem3.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem3.c" diff --git a/third_party/sqlite3/mem5.shell.c b/third_party/sqlite3/mem5.shell.c new file mode 100644 index 000000000..9ea6e5128 --- /dev/null +++ b/third_party/sqlite3/mem5.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mem5.c" diff --git a/third_party/sqlite3/memdb.shell.c b/third_party/sqlite3/memdb.shell.c new file mode 100644 index 000000000..ff2082835 --- /dev/null +++ b/third_party/sqlite3/memdb.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/memdb.c" diff --git a/third_party/sqlite3/memjournal.shell.c b/third_party/sqlite3/memjournal.shell.c new file mode 100644 index 000000000..7c49b3f91 --- /dev/null +++ b/third_party/sqlite3/memjournal.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/memjournal.c" diff --git a/third_party/sqlite3/memtrace.shell.c b/third_party/sqlite3/memtrace.shell.c new file mode 100644 index 000000000..6487dd70d --- /dev/null +++ b/third_party/sqlite3/memtrace.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/memtrace.c" diff --git a/third_party/sqlite3/mutex.shell.c b/third_party/sqlite3/mutex.shell.c new file mode 100644 index 000000000..891776fca --- /dev/null +++ b/third_party/sqlite3/mutex.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mutex.c" diff --git a/third_party/sqlite3/mutex_noop.shell.c b/third_party/sqlite3/mutex_noop.shell.c new file mode 100644 index 000000000..297e7ed14 --- /dev/null +++ b/third_party/sqlite3/mutex_noop.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mutex_noop.c" diff --git a/third_party/sqlite3/mutex_unix.shell.c b/third_party/sqlite3/mutex_unix.shell.c new file mode 100644 index 000000000..25631f19a --- /dev/null +++ b/third_party/sqlite3/mutex_unix.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/mutex_unix.c" diff --git a/third_party/sqlite3/notify.shell.c b/third_party/sqlite3/notify.shell.c new file mode 100644 index 000000000..e841089a6 --- /dev/null +++ b/third_party/sqlite3/notify.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/notify.c" diff --git a/third_party/sqlite3/opcodes.shell.c b/third_party/sqlite3/opcodes.shell.c new file mode 100644 index 000000000..d470da195 --- /dev/null +++ b/third_party/sqlite3/opcodes.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/opcodes.c" diff --git a/third_party/sqlite3/os.shell.c b/third_party/sqlite3/os.shell.c new file mode 100644 index 000000000..9d62ab209 --- /dev/null +++ b/third_party/sqlite3/os.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/os.c" diff --git a/third_party/sqlite3/os_unix.shell.c b/third_party/sqlite3/os_unix.shell.c new file mode 100644 index 000000000..f17c84ef9 --- /dev/null +++ b/third_party/sqlite3/os_unix.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/os_unix.c" diff --git a/third_party/sqlite3/os_win.shell.c b/third_party/sqlite3/os_win.shell.c new file mode 100644 index 000000000..7ae5fd5d4 --- /dev/null +++ b/third_party/sqlite3/os_win.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/os_win.c" diff --git a/third_party/sqlite3/pager.shell.c b/third_party/sqlite3/pager.shell.c new file mode 100644 index 000000000..94b752256 --- /dev/null +++ b/third_party/sqlite3/pager.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pager.c" diff --git a/third_party/sqlite3/parse.shell.c b/third_party/sqlite3/parse.shell.c new file mode 100644 index 000000000..93b0c0e22 --- /dev/null +++ b/third_party/sqlite3/parse.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/parse.c" diff --git a/third_party/sqlite3/pcache.shell.c b/third_party/sqlite3/pcache.shell.c new file mode 100644 index 000000000..fb7b604a0 --- /dev/null +++ b/third_party/sqlite3/pcache.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pcache.c" diff --git a/third_party/sqlite3/pcache1.shell.c b/third_party/sqlite3/pcache1.shell.c new file mode 100644 index 000000000..1fa0503d3 --- /dev/null +++ b/third_party/sqlite3/pcache1.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pcache1.c" diff --git a/third_party/sqlite3/pragma.shell.c b/third_party/sqlite3/pragma.shell.c new file mode 100644 index 000000000..bde2f2ceb --- /dev/null +++ b/third_party/sqlite3/pragma.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/pragma.c" diff --git a/third_party/sqlite3/prepare.shell.c b/third_party/sqlite3/prepare.shell.c new file mode 100644 index 000000000..dcb5f5110 --- /dev/null +++ b/third_party/sqlite3/prepare.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/prepare.c" diff --git a/third_party/sqlite3/printf.shell.c b/third_party/sqlite3/printf.shell.c new file mode 100644 index 000000000..bc4baee2d --- /dev/null +++ b/third_party/sqlite3/printf.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/printf.c" diff --git a/third_party/sqlite3/random.shell.c b/third_party/sqlite3/random.shell.c new file mode 100644 index 000000000..eb0b3ba3b --- /dev/null +++ b/third_party/sqlite3/random.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/random.c" diff --git a/third_party/sqlite3/resolve.shell.c b/third_party/sqlite3/resolve.shell.c new file mode 100644 index 000000000..a77164292 --- /dev/null +++ b/third_party/sqlite3/resolve.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/resolve.c" diff --git a/third_party/sqlite3/rowset.shell.c b/third_party/sqlite3/rowset.shell.c new file mode 100644 index 000000000..3c1a53986 --- /dev/null +++ b/third_party/sqlite3/rowset.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/rowset.c" diff --git a/third_party/sqlite3/rtree.shell.c b/third_party/sqlite3/rtree.shell.c new file mode 100644 index 000000000..396f59d20 --- /dev/null +++ b/third_party/sqlite3/rtree.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/rtree.c" diff --git a/third_party/sqlite3/select.shell.c b/third_party/sqlite3/select.shell.c new file mode 100644 index 000000000..be276a733 --- /dev/null +++ b/third_party/sqlite3/select.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/select.c" diff --git a/third_party/sqlite3/series.shell.c b/third_party/sqlite3/series.shell.c new file mode 100644 index 000000000..c2e84dcd7 --- /dev/null +++ b/third_party/sqlite3/series.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/series.c" diff --git a/third_party/sqlite3/shathree.shell.c b/third_party/sqlite3/shathree.shell.c new file mode 100644 index 000000000..88e565d30 --- /dev/null +++ b/third_party/sqlite3/shathree.shell.c @@ -0,0 +1 @@ +#include "third_party/sqlite3/shathree.c" diff --git a/third_party/sqlite3/shell.c b/third_party/sqlite3/shell.c index 0ef280bbd..36852ccf8 100644 --- a/third_party/sqlite3/shell.c +++ b/third_party/sqlite3/shell.c @@ -1053,14380 +1053,6 @@ static void shellAddSchemaName( sqlite3_result_value(pCtx, apVal[0]); } -/* -** The source code for several run-time loadable extensions is inserted -** below by the ../tool/mkshellc.tcl script. Before processing that included -** code, we need to override some macros to make the included program code -** work here in the middle of this regular program. -*/ -#define SQLITE_EXTENSION_INIT1 -#define SQLITE_EXTENSION_INIT2(X) (void)(X) - -#if defined(_WIN32) && defined(_MSC_VER) -/************************* Begin test_windirent.h ******************/ -/* -** 2015 November 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 declarations for most of the opendir() family of -** POSIX functions on Win32 using the MSVCRT. -*/ - -#if defined(_WIN32) && defined(_MSC_VER) && !defined(SQLITE_WINDIRENT_H) -#define SQLITE_WINDIRENT_H - -/* -** We need several data types from the Windows SDK header. -*/ - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -#include "windows.h" - -/* -** We need several support functions from the SQLite core. -*/ - -/* #include "sqlite3.h" */ - -/* -** We need several things from the ANSI and MSVCRT headers. -*/ - -#include -#include -#include -#include -#include -#include -#include - -/* -** We may need several defines that should have been in "sys/stat.h". -*/ - -#ifndef S_ISREG -#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) -#endif - -#ifndef S_ISDIR -#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#endif - -#ifndef S_ISLNK -#define S_ISLNK(mode) (0) -#endif - -/* -** We may need to provide the "mode_t" type. -*/ - -#ifndef MODE_T_DEFINED - #define MODE_T_DEFINED - typedef unsigned short mode_t; -#endif - -/* -** We may need to provide the "ino_t" type. -*/ - -#ifndef INO_T_DEFINED - #define INO_T_DEFINED - typedef unsigned short ino_t; -#endif - -/* -** We need to define "NAME_MAX" if it was not present in "limits.h". -*/ - -#ifndef NAME_MAX -# ifdef FILENAME_MAX -# define NAME_MAX (FILENAME_MAX) -# else -# define NAME_MAX (260) -# endif -#endif - -/* -** We need to define "NULL_INTPTR_T" and "BAD_INTPTR_T". -*/ - -#ifndef NULL_INTPTR_T -# define NULL_INTPTR_T ((intptr_t)(0)) -#endif - -#ifndef BAD_INTPTR_T -# define BAD_INTPTR_T ((intptr_t)(-1)) -#endif - -/* -** We need to provide the necessary structures and related types. -*/ - -#ifndef DIRENT_DEFINED -#define DIRENT_DEFINED -typedef struct DIRENT DIRENT; -typedef DIRENT *LPDIRENT; -struct DIRENT { - ino_t d_ino; /* Sequence number, do not use. */ - unsigned d_attributes; /* Win32 file attributes. */ - char d_name[NAME_MAX + 1]; /* Name within the directory. */ -}; -#endif - -#ifndef DIR_DEFINED -#define DIR_DEFINED -typedef struct DIR DIR; -typedef DIR *LPDIR; -struct DIR { - intptr_t d_handle; /* Value returned by "_findfirst". */ - DIRENT d_first; /* DIRENT constructed based on "_findfirst". */ - DIRENT d_next; /* DIRENT constructed based on "_findnext". */ -}; -#endif - -/* -** Provide a macro, for use by the implementation, to determine if a -** particular directory entry should be skipped over when searching for -** the next directory entry that should be returned by the readdir() or -** readdir_r() functions. -*/ - -#ifndef is_filtered -# define is_filtered(a) ((((a).attrib)&_A_HIDDEN) || (((a).attrib)&_A_SYSTEM)) -#endif - -/* -** Provide the function prototype for the POSIX compatiable getenv() -** function. This function is not thread-safe. -*/ - -extern const char *windirent_getenv(const char *name); - -/* -** Finally, we can provide the function prototypes for the opendir(), -** readdir(), readdir_r(), and closedir() POSIX functions. -*/ - -extern LPDIR opendir(const char *dirname); -extern LPDIRENT readdir(LPDIR dirp); -extern INT readdir_r(LPDIR dirp, LPDIRENT entry, LPDIRENT *result); -extern INT closedir(LPDIR dirp); - -#endif /* defined(WIN32) && defined(_MSC_VER) */ - -/************************* End test_windirent.h ********************/ -/************************* Begin test_windirent.c ******************/ -/* -** 2015 November 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 code to implement most of the opendir() family of -** POSIX functions on Win32 using the MSVCRT. -*/ - -#if defined(_WIN32) && defined(_MSC_VER) -/* #include "test_windirent.h" */ - -/* -** Implementation of the POSIX getenv() function using the Win32 API. -** This function is not thread-safe. -*/ -const char *windirent_getenv( - const char *name -){ - static char value[32768]; /* Maximum length, per MSDN */ - DWORD dwSize = sizeof(value) / sizeof(char); /* Size in chars */ - DWORD dwRet; /* Value returned by GetEnvironmentVariableA() */ - - memset(value, 0, sizeof(value)); - dwRet = GetEnvironmentVariableA(name, value, dwSize); - if( dwRet==0 || dwRet>dwSize ){ - /* - ** The function call to GetEnvironmentVariableA() failed -OR- - ** the buffer is not large enough. Either way, return NULL. - */ - return 0; - }else{ - /* - ** The function call to GetEnvironmentVariableA() succeeded - ** -AND- the buffer contains the entire value. - */ - return value; - } -} - -/* -** Implementation of the POSIX opendir() function using the MSVCRT. -*/ -LPDIR opendir( - const char *dirname -){ - struct _finddata_t data; - LPDIR dirp = (LPDIR)sqlite3_malloc(sizeof(DIR)); - SIZE_T namesize = sizeof(data.name) / sizeof(data.name[0]); - - if( dirp==NULL ) return NULL; - memset(dirp, 0, sizeof(DIR)); - - /* TODO: Remove this if Unix-style root paths are not used. */ - if( sqlite3_stricmp(dirname, "/")==0 ){ - dirname = windirent_getenv("SystemDrive"); - } - - memset(&data, 0, sizeof(struct _finddata_t)); - _snprintf(data.name, namesize, "%s\\*", dirname); - dirp->d_handle = _findfirst(data.name, &data); - - if( dirp->d_handle==BAD_INTPTR_T ){ - closedir(dirp); - return NULL; - } - - /* TODO: Remove this block to allow hidden and/or system files. */ - if( is_filtered(data) ){ -next: - - memset(&data, 0, sizeof(struct _finddata_t)); - if( _findnext(dirp->d_handle, &data)==-1 ){ - closedir(dirp); - return NULL; - } - - /* TODO: Remove this block to allow hidden and/or system files. */ - if( is_filtered(data) ) goto next; - } - - dirp->d_first.d_attributes = data.attrib; - strncpy(dirp->d_first.d_name, data.name, NAME_MAX); - dirp->d_first.d_name[NAME_MAX] = '\0'; - - return dirp; -} - -/* -** Implementation of the POSIX readdir() function using the MSVCRT. -*/ -LPDIRENT readdir( - LPDIR dirp -){ - struct _finddata_t data; - - if( dirp==NULL ) return NULL; - - if( dirp->d_first.d_ino==0 ){ - dirp->d_first.d_ino++; - dirp->d_next.d_ino++; - - return &dirp->d_first; - } - -next: - - memset(&data, 0, sizeof(struct _finddata_t)); - if( _findnext(dirp->d_handle, &data)==-1 ) return NULL; - - /* TODO: Remove this block to allow hidden and/or system files. */ - if( is_filtered(data) ) goto next; - - dirp->d_next.d_ino++; - dirp->d_next.d_attributes = data.attrib; - strncpy(dirp->d_next.d_name, data.name, NAME_MAX); - dirp->d_next.d_name[NAME_MAX] = '\0'; - - return &dirp->d_next; -} - -/* -** Implementation of the POSIX readdir_r() function using the MSVCRT. -*/ -INT readdir_r( - LPDIR dirp, - LPDIRENT entry, - LPDIRENT *result -){ - struct _finddata_t data; - - if( dirp==NULL ) return EBADF; - - if( dirp->d_first.d_ino==0 ){ - dirp->d_first.d_ino++; - dirp->d_next.d_ino++; - - entry->d_ino = dirp->d_first.d_ino; - entry->d_attributes = dirp->d_first.d_attributes; - strncpy(entry->d_name, dirp->d_first.d_name, NAME_MAX); - entry->d_name[NAME_MAX] = '\0'; - - *result = entry; - return 0; - } - -next: - - memset(&data, 0, sizeof(struct _finddata_t)); - if( _findnext(dirp->d_handle, &data)==-1 ){ - *result = NULL; - return ENOENT; - } - - /* TODO: Remove this block to allow hidden and/or system files. */ - if( is_filtered(data) ) goto next; - - entry->d_ino = (ino_t)-1; /* not available */ - entry->d_attributes = data.attrib; - strncpy(entry->d_name, data.name, NAME_MAX); - entry->d_name[NAME_MAX] = '\0'; - - *result = entry; - return 0; -} - -/* -** Implementation of the POSIX closedir() function using the MSVCRT. -*/ -INT closedir( - LPDIR dirp -){ - INT result = 0; - - if( dirp==NULL ) return EINVAL; - - if( dirp->d_handle!=NULL_INTPTR_T && dirp->d_handle!=BAD_INTPTR_T ){ - result = _findclose(dirp->d_handle); - } - - sqlite3_free(dirp); - return result; -} - -#endif /* defined(WIN32) && defined(_MSC_VER) */ - -/************************* End test_windirent.c ********************/ -#define dirent DIRENT -#endif -/************************* Begin ../ext/misc/memtrace.c ******************/ -/* -** 2019-01-21 -** -** 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 extension that uses the SQLITE_CONFIG_MALLOC -** mechanism to add a tracing layer on top of SQLite. If this extension -** is registered prior to sqlite3_initialize(), it will cause all memory -** allocation activities to be logged on standard output, or to some other -** FILE specified by the initializer. -** -** This file needs to be compiled into the application that uses it. -** -** This extension is used to implement the --memtrace option of the -** command-line shell. -*/ -#include "libc/assert.h" -#include "libc/stdio/stdio.h" -#include "libc/str/str.h" - -/* The original memory allocation routines */ -static sqlite3_mem_methods memtraceBase; -static FILE *memtraceOut; - -/* Methods that trace memory allocations */ -static void *memtraceMalloc(int n){ - if( memtraceOut ){ - fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", - memtraceBase.xRoundup(n)); - } - return memtraceBase.xMalloc(n); -} -static void memtraceFree(void *p){ - if( p==0 ) return; - if( memtraceOut ){ - fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); - } - memtraceBase.xFree(p); -} -static void *memtraceRealloc(void *p, int n){ - if( p==0 ) return memtraceMalloc(n); - if( n==0 ){ - memtraceFree(p); - return 0; - } - if( memtraceOut ){ - fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", - memtraceBase.xSize(p), memtraceBase.xRoundup(n)); - } - return memtraceBase.xRealloc(p, n); -} -static int memtraceSize(void *p){ - return memtraceBase.xSize(p); -} -static int memtraceRoundup(int n){ - return memtraceBase.xRoundup(n); -} -static int memtraceInit(void *p){ - return memtraceBase.xInit(p); -} -static void memtraceShutdown(void *p){ - memtraceBase.xShutdown(p); -} - -/* The substitute memory allocator */ -static sqlite3_mem_methods ersaztMethods = { - memtraceMalloc, - memtraceFree, - memtraceRealloc, - memtraceSize, - memtraceRoundup, - memtraceInit, - memtraceShutdown, - 0 -}; - -/* Begin tracing memory allocations to out. */ -int sqlite3MemTraceActivate(FILE *out){ - int rc = SQLITE_OK; - if( memtraceBase.xMalloc==0 ){ - rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); - if( rc==SQLITE_OK ){ - rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); - } - } - memtraceOut = out; - return rc; -} - -/* Deactivate memory tracing */ -int sqlite3MemTraceDeactivate(void){ - int rc = SQLITE_OK; - if( memtraceBase.xMalloc!=0 ){ - rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); - if( rc==SQLITE_OK ){ - memset(&memtraceBase, 0, sizeof(memtraceBase)); - } - } - memtraceOut = 0; - return rc; -} - -/************************* End ../ext/misc/memtrace.c ********************/ -/************************* Begin ../ext/misc/shathree.c ******************/ -/* -** 2017-03-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 SQLite extension implements functions that compute SHA3 hashes. -** Two SQL functions are implemented: -** -** sha3(X,SIZE) -** sha3_query(Y,SIZE) -** -** The sha3(X) function computes the SHA3 hash of the input X, or NULL if -** X is NULL. -** -** The sha3_query(Y) function evaluates all queries in the SQL statements of Y -** and returns a hash of their results. -** -** The SIZE argument is optional. If omitted, the SHA3-256 hash algorithm -** is used. If SIZE is included it must be one of the integers 224, 256, -** 384, or 512, to determine SHA3 hash variant that is computed. -*/ -/* #include "sqlite3ext.h" */ -SQLITE_EXTENSION_INIT1 -#include "libc/assert.h" -#include "libc/stdio/stdio.h" -#include "libc/str/str.h" - -#ifndef SQLITE_AMALGAMATION -/* typedef sqlite3_uint64 u64; */ -#endif /* SQLITE_AMALGAMATION */ - -/****************************************************************************** -** The Hash Engine -*/ -/* -** 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 -** -DSHA3_BYTEORDER=0 is set, then byte-order is determined -** at run-time. -*/ -#ifndef SHA3_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 SHA3_BYTEORDER 1234 -# elif defined(sparc) || defined(__ppc__) -# define SHA3_BYTEORDER 4321 -# else -# define SHA3_BYTEORDER 0 -# endif -#endif - - -/* -** State structure for a SHA3 hash in progress -*/ -typedef struct SHA3Context SHA3Context; -struct SHA3Context { - union { - u64 s[25]; /* Keccak state. 5x5 lines of 64 bits each */ - unsigned char x[1600]; /* ... or 1600 bytes */ - } u; - unsigned nRate; /* Bytes of input accepted per Keccak iteration */ - unsigned nLoaded; /* Input bytes loaded into u.x[] so far this cycle */ - unsigned ixMask; /* Insert next input into u.x[nLoaded^ixMask]. */ -}; - -/* -** A single step of the Keccak mixing function for a 1600-bit state -*/ -static void KeccakF1600Step(SHA3Context *p){ - int i; - u64 b0, b1, b2, b3, b4; - u64 c0, c1, c2, c3, c4; - u64 d0, d1, d2, d3, d4; - static const u64 RC[] = { - 0x0000000000000001ULL, 0x0000000000008082ULL, - 0x800000000000808aULL, 0x8000000080008000ULL, - 0x000000000000808bULL, 0x0000000080000001ULL, - 0x8000000080008081ULL, 0x8000000000008009ULL, - 0x000000000000008aULL, 0x0000000000000088ULL, - 0x0000000080008009ULL, 0x000000008000000aULL, - 0x000000008000808bULL, 0x800000000000008bULL, - 0x8000000000008089ULL, 0x8000000000008003ULL, - 0x8000000000008002ULL, 0x8000000000000080ULL, - 0x000000000000800aULL, 0x800000008000000aULL, - 0x8000000080008081ULL, 0x8000000000008080ULL, - 0x0000000080000001ULL, 0x8000000080008008ULL - }; -# define a00 (p->u.s[0]) -# define a01 (p->u.s[1]) -# define a02 (p->u.s[2]) -# define a03 (p->u.s[3]) -# define a04 (p->u.s[4]) -# define a10 (p->u.s[5]) -# define a11 (p->u.s[6]) -# define a12 (p->u.s[7]) -# define a13 (p->u.s[8]) -# define a14 (p->u.s[9]) -# define a20 (p->u.s[10]) -# define a21 (p->u.s[11]) -# define a22 (p->u.s[12]) -# define a23 (p->u.s[13]) -# define a24 (p->u.s[14]) -# define a30 (p->u.s[15]) -# define a31 (p->u.s[16]) -# define a32 (p->u.s[17]) -# define a33 (p->u.s[18]) -# define a34 (p->u.s[19]) -# define a40 (p->u.s[20]) -# define a41 (p->u.s[21]) -# define a42 (p->u.s[22]) -# define a43 (p->u.s[23]) -# define a44 (p->u.s[24]) -# define ROL64(a,x) ((a<>(64-x))) - - for(i=0; i<24; i+=4){ - c0 = a00^a10^a20^a30^a40; - c1 = a01^a11^a21^a31^a41; - c2 = a02^a12^a22^a32^a42; - c3 = a03^a13^a23^a33^a43; - c4 = a04^a14^a24^a34^a44; - d0 = c4^ROL64(c1, 1); - d1 = c0^ROL64(c2, 1); - d2 = c1^ROL64(c3, 1); - d3 = c2^ROL64(c4, 1); - d4 = c3^ROL64(c0, 1); - - b0 = (a00^d0); - b1 = ROL64((a11^d1), 44); - b2 = ROL64((a22^d2), 43); - b3 = ROL64((a33^d3), 21); - b4 = ROL64((a44^d4), 14); - a00 = b0 ^((~b1)& b2 ); - a00 ^= RC[i]; - a11 = b1 ^((~b2)& b3 ); - a22 = b2 ^((~b3)& b4 ); - a33 = b3 ^((~b4)& b0 ); - a44 = b4 ^((~b0)& b1 ); - - b2 = ROL64((a20^d0), 3); - b3 = ROL64((a31^d1), 45); - b4 = ROL64((a42^d2), 61); - b0 = ROL64((a03^d3), 28); - b1 = ROL64((a14^d4), 20); - a20 = b0 ^((~b1)& b2 ); - a31 = b1 ^((~b2)& b3 ); - a42 = b2 ^((~b3)& b4 ); - a03 = b3 ^((~b4)& b0 ); - a14 = b4 ^((~b0)& b1 ); - - b4 = ROL64((a40^d0), 18); - b0 = ROL64((a01^d1), 1); - b1 = ROL64((a12^d2), 6); - b2 = ROL64((a23^d3), 25); - b3 = ROL64((a34^d4), 8); - a40 = b0 ^((~b1)& b2 ); - a01 = b1 ^((~b2)& b3 ); - a12 = b2 ^((~b3)& b4 ); - a23 = b3 ^((~b4)& b0 ); - a34 = b4 ^((~b0)& b1 ); - - b1 = ROL64((a10^d0), 36); - b2 = ROL64((a21^d1), 10); - b3 = ROL64((a32^d2), 15); - b4 = ROL64((a43^d3), 56); - b0 = ROL64((a04^d4), 27); - a10 = b0 ^((~b1)& b2 ); - a21 = b1 ^((~b2)& b3 ); - a32 = b2 ^((~b3)& b4 ); - a43 = b3 ^((~b4)& b0 ); - a04 = b4 ^((~b0)& b1 ); - - b3 = ROL64((a30^d0), 41); - b4 = ROL64((a41^d1), 2); - b0 = ROL64((a02^d2), 62); - b1 = ROL64((a13^d3), 55); - b2 = ROL64((a24^d4), 39); - a30 = b0 ^((~b1)& b2 ); - a41 = b1 ^((~b2)& b3 ); - a02 = b2 ^((~b3)& b4 ); - a13 = b3 ^((~b4)& b0 ); - a24 = b4 ^((~b0)& b1 ); - - c0 = a00^a20^a40^a10^a30; - c1 = a11^a31^a01^a21^a41; - c2 = a22^a42^a12^a32^a02; - c3 = a33^a03^a23^a43^a13; - c4 = a44^a14^a34^a04^a24; - d0 = c4^ROL64(c1, 1); - d1 = c0^ROL64(c2, 1); - d2 = c1^ROL64(c3, 1); - d3 = c2^ROL64(c4, 1); - d4 = c3^ROL64(c0, 1); - - b0 = (a00^d0); - b1 = ROL64((a31^d1), 44); - b2 = ROL64((a12^d2), 43); - b3 = ROL64((a43^d3), 21); - b4 = ROL64((a24^d4), 14); - a00 = b0 ^((~b1)& b2 ); - a00 ^= RC[i+1]; - a31 = b1 ^((~b2)& b3 ); - a12 = b2 ^((~b3)& b4 ); - a43 = b3 ^((~b4)& b0 ); - a24 = b4 ^((~b0)& b1 ); - - b2 = ROL64((a40^d0), 3); - b3 = ROL64((a21^d1), 45); - b4 = ROL64((a02^d2), 61); - b0 = ROL64((a33^d3), 28); - b1 = ROL64((a14^d4), 20); - a40 = b0 ^((~b1)& b2 ); - a21 = b1 ^((~b2)& b3 ); - a02 = b2 ^((~b3)& b4 ); - a33 = b3 ^((~b4)& b0 ); - a14 = b4 ^((~b0)& b1 ); - - b4 = ROL64((a30^d0), 18); - b0 = ROL64((a11^d1), 1); - b1 = ROL64((a42^d2), 6); - b2 = ROL64((a23^d3), 25); - b3 = ROL64((a04^d4), 8); - a30 = b0 ^((~b1)& b2 ); - a11 = b1 ^((~b2)& b3 ); - a42 = b2 ^((~b3)& b4 ); - a23 = b3 ^((~b4)& b0 ); - a04 = b4 ^((~b0)& b1 ); - - b1 = ROL64((a20^d0), 36); - b2 = ROL64((a01^d1), 10); - b3 = ROL64((a32^d2), 15); - b4 = ROL64((a13^d3), 56); - b0 = ROL64((a44^d4), 27); - a20 = b0 ^((~b1)& b2 ); - a01 = b1 ^((~b2)& b3 ); - a32 = b2 ^((~b3)& b4 ); - a13 = b3 ^((~b4)& b0 ); - a44 = b4 ^((~b0)& b1 ); - - b3 = ROL64((a10^d0), 41); - b4 = ROL64((a41^d1), 2); - b0 = ROL64((a22^d2), 62); - b1 = ROL64((a03^d3), 55); - b2 = ROL64((a34^d4), 39); - a10 = b0 ^((~b1)& b2 ); - a41 = b1 ^((~b2)& b3 ); - a22 = b2 ^((~b3)& b4 ); - a03 = b3 ^((~b4)& b0 ); - a34 = b4 ^((~b0)& b1 ); - - c0 = a00^a40^a30^a20^a10; - c1 = a31^a21^a11^a01^a41; - c2 = a12^a02^a42^a32^a22; - c3 = a43^a33^a23^a13^a03; - c4 = a24^a14^a04^a44^a34; - d0 = c4^ROL64(c1, 1); - d1 = c0^ROL64(c2, 1); - d2 = c1^ROL64(c3, 1); - d3 = c2^ROL64(c4, 1); - d4 = c3^ROL64(c0, 1); - - b0 = (a00^d0); - b1 = ROL64((a21^d1), 44); - b2 = ROL64((a42^d2), 43); - b3 = ROL64((a13^d3), 21); - b4 = ROL64((a34^d4), 14); - a00 = b0 ^((~b1)& b2 ); - a00 ^= RC[i+2]; - a21 = b1 ^((~b2)& b3 ); - a42 = b2 ^((~b3)& b4 ); - a13 = b3 ^((~b4)& b0 ); - a34 = b4 ^((~b0)& b1 ); - - b2 = ROL64((a30^d0), 3); - b3 = ROL64((a01^d1), 45); - b4 = ROL64((a22^d2), 61); - b0 = ROL64((a43^d3), 28); - b1 = ROL64((a14^d4), 20); - a30 = b0 ^((~b1)& b2 ); - a01 = b1 ^((~b2)& b3 ); - a22 = b2 ^((~b3)& b4 ); - a43 = b3 ^((~b4)& b0 ); - a14 = b4 ^((~b0)& b1 ); - - b4 = ROL64((a10^d0), 18); - b0 = ROL64((a31^d1), 1); - b1 = ROL64((a02^d2), 6); - b2 = ROL64((a23^d3), 25); - b3 = ROL64((a44^d4), 8); - a10 = b0 ^((~b1)& b2 ); - a31 = b1 ^((~b2)& b3 ); - a02 = b2 ^((~b3)& b4 ); - a23 = b3 ^((~b4)& b0 ); - a44 = b4 ^((~b0)& b1 ); - - b1 = ROL64((a40^d0), 36); - b2 = ROL64((a11^d1), 10); - b3 = ROL64((a32^d2), 15); - b4 = ROL64((a03^d3), 56); - b0 = ROL64((a24^d4), 27); - a40 = b0 ^((~b1)& b2 ); - a11 = b1 ^((~b2)& b3 ); - a32 = b2 ^((~b3)& b4 ); - a03 = b3 ^((~b4)& b0 ); - a24 = b4 ^((~b0)& b1 ); - - b3 = ROL64((a20^d0), 41); - b4 = ROL64((a41^d1), 2); - b0 = ROL64((a12^d2), 62); - b1 = ROL64((a33^d3), 55); - b2 = ROL64((a04^d4), 39); - a20 = b0 ^((~b1)& b2 ); - a41 = b1 ^((~b2)& b3 ); - a12 = b2 ^((~b3)& b4 ); - a33 = b3 ^((~b4)& b0 ); - a04 = b4 ^((~b0)& b1 ); - - c0 = a00^a30^a10^a40^a20; - c1 = a21^a01^a31^a11^a41; - c2 = a42^a22^a02^a32^a12; - c3 = a13^a43^a23^a03^a33; - c4 = a34^a14^a44^a24^a04; - d0 = c4^ROL64(c1, 1); - d1 = c0^ROL64(c2, 1); - d2 = c1^ROL64(c3, 1); - d3 = c2^ROL64(c4, 1); - d4 = c3^ROL64(c0, 1); - - b0 = (a00^d0); - b1 = ROL64((a01^d1), 44); - b2 = ROL64((a02^d2), 43); - b3 = ROL64((a03^d3), 21); - b4 = ROL64((a04^d4), 14); - a00 = b0 ^((~b1)& b2 ); - a00 ^= RC[i+3]; - a01 = b1 ^((~b2)& b3 ); - a02 = b2 ^((~b3)& b4 ); - a03 = b3 ^((~b4)& b0 ); - a04 = b4 ^((~b0)& b1 ); - - b2 = ROL64((a10^d0), 3); - b3 = ROL64((a11^d1), 45); - b4 = ROL64((a12^d2), 61); - b0 = ROL64((a13^d3), 28); - b1 = ROL64((a14^d4), 20); - a10 = b0 ^((~b1)& b2 ); - a11 = b1 ^((~b2)& b3 ); - a12 = b2 ^((~b3)& b4 ); - a13 = b3 ^((~b4)& b0 ); - a14 = b4 ^((~b0)& b1 ); - - b4 = ROL64((a20^d0), 18); - b0 = ROL64((a21^d1), 1); - b1 = ROL64((a22^d2), 6); - b2 = ROL64((a23^d3), 25); - b3 = ROL64((a24^d4), 8); - a20 = b0 ^((~b1)& b2 ); - a21 = b1 ^((~b2)& b3 ); - a22 = b2 ^((~b3)& b4 ); - a23 = b3 ^((~b4)& b0 ); - a24 = b4 ^((~b0)& b1 ); - - b1 = ROL64((a30^d0), 36); - b2 = ROL64((a31^d1), 10); - b3 = ROL64((a32^d2), 15); - b4 = ROL64((a33^d3), 56); - b0 = ROL64((a34^d4), 27); - a30 = b0 ^((~b1)& b2 ); - a31 = b1 ^((~b2)& b3 ); - a32 = b2 ^((~b3)& b4 ); - a33 = b3 ^((~b4)& b0 ); - a34 = b4 ^((~b0)& b1 ); - - b3 = ROL64((a40^d0), 41); - b4 = ROL64((a41^d1), 2); - b0 = ROL64((a42^d2), 62); - b1 = ROL64((a43^d3), 55); - b2 = ROL64((a44^d4), 39); - a40 = b0 ^((~b1)& b2 ); - a41 = b1 ^((~b2)& b3 ); - a42 = b2 ^((~b3)& b4 ); - a43 = b3 ^((~b4)& b0 ); - a44 = b4 ^((~b0)& b1 ); - } -} - -/* -** Initialize a new hash. iSize determines the size of the hash -** in bits and should be one of 224, 256, 384, or 512. Or iSize -** can be zero to use the default hash size of 256 bits. -*/ -static void SHA3Init(SHA3Context *p, int iSize){ - memset(p, 0, sizeof(*p)); - if( iSize>=128 && iSize<=512 ){ - p->nRate = (1600 - ((iSize + 31)&~31)*2)/8; - }else{ - p->nRate = (1600 - 2*256)/8; - } -#if SHA3_BYTEORDER==1234 - /* Known to be little-endian at compile-time. No-op */ -#elif SHA3_BYTEORDER==4321 - p->ixMask = 7; /* Big-endian */ -#else - { - static unsigned int one = 1; - if( 1==*(unsigned char*)&one ){ - /* Little endian. No byte swapping. */ - p->ixMask = 0; - }else{ - /* Big endian. Byte swap. */ - p->ixMask = 7; - } - } -#endif -} - -/* -** Make consecutive calls to the SHA3Update function to add new content -** to the hash -*/ -static void SHA3Update( - SHA3Context *p, - const unsigned char *aData, - unsigned int nData -){ - unsigned int i = 0; - if( aData==0 ) return; -#if SHA3_BYTEORDER==1234 - if( (p->nLoaded % 8)==0 && ((aData - (const unsigned char*)0)&7)==0 ){ - for(; i+7u.s[p->nLoaded/8] ^= *(u64*)&aData[i]; - p->nLoaded += 8; - if( p->nLoaded>=p->nRate ){ - KeccakF1600Step(p); - p->nLoaded = 0; - } - } - } -#endif - for(; iu.x[p->nLoaded] ^= aData[i]; -#elif SHA3_BYTEORDER==4321 - p->u.x[p->nLoaded^0x07] ^= aData[i]; -#else - p->u.x[p->nLoaded^p->ixMask] ^= aData[i]; -#endif - p->nLoaded++; - if( p->nLoaded==p->nRate ){ - KeccakF1600Step(p); - p->nLoaded = 0; - } - } -} - -/* -** After all content has been added, invoke SHA3Final() to compute -** the final hash. The function returns a pointer to the binary -** hash value. -*/ -static unsigned char *SHA3Final(SHA3Context *p){ - unsigned int i; - if( p->nLoaded==p->nRate-1 ){ - const unsigned char c1 = 0x86; - SHA3Update(p, &c1, 1); - }else{ - const unsigned char c2 = 0x06; - const unsigned char c3 = 0x80; - SHA3Update(p, &c2, 1); - p->nLoaded = p->nRate - 1; - SHA3Update(p, &c3, 1); - } - for(i=0; inRate; i++){ - p->u.x[i+p->nRate] = p->u.x[i^p->ixMask]; - } - return &p->u.x[p->nRate]; -} -/* End of the hashing logic -*****************************************************************************/ - -/* -** Implementation of the sha3(X,SIZE) function. -** -** Return a BLOB which is the SIZE-bit SHA3 hash of X. The default -** size is 256. If X is a BLOB, it is hashed as is. -** For all other non-NULL types of input, X is converted into a UTF-8 string -** and the string is hashed without the trailing 0x00 terminator. The hash -** of a NULL value is NULL. -*/ -static void sha3Func( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - SHA3Context cx; - int eType = sqlite3_value_type(argv[0]); - int nByte = sqlite3_value_bytes(argv[0]); - int iSize; - if( argc==1 ){ - iSize = 256; - }else{ - iSize = sqlite3_value_int(argv[1]); - if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ - sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " - "384 512", -1); - return; - } - } - if( eType==SQLITE_NULL ) return; - SHA3Init(&cx, iSize); - if( eType==SQLITE_BLOB ){ - SHA3Update(&cx, sqlite3_value_blob(argv[0]), nByte); - }else{ - SHA3Update(&cx, sqlite3_value_text(argv[0]), nByte); - } - sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); -} - -/* Compute a string using sqlite3_vsnprintf() with a maximum length -** of 50 bytes and add it to the hash. -*/ -static void hash_step_vformat( - SHA3Context *p, /* Add content to this context */ - const char *zFormat, - ... -){ - va_list ap; - int n; - char zBuf[50]; - va_start(ap, zFormat); - sqlite3_vsnprintf(sizeof(zBuf),zBuf,zFormat,ap); - va_end(ap); - n = (int)strlen(zBuf); - SHA3Update(p, (unsigned char*)zBuf, n); -} - -/* -** Implementation of the sha3_query(SQL,SIZE) function. -** -** This function compiles and runs the SQL statement(s) given in the -** argument. The results are hashed using a SIZE-bit SHA3. The default -** size is 256. -** -** The format of the byte stream that is hashed is summarized as follows: -** -** S: -** R -** N -** I -** F -** B: -** T: -** -** is the original SQL text for each statement run and is -** the size of that text. The SQL text is UTF-8. A single R character -** occurs before the start of each row. N means a NULL value. -** I mean an 8-byte little-endian integer . F is a floating point -** number with an 8-byte little-endian IEEE floating point value . -** B means blobs of bytes. T means text rendered as -** bytes of UTF-8. The and values are expressed as an ASCII -** text integers. -** -** For each SQL statement in the X input, there is one S segment. Each -** S segment is followed by zero or more R segments, one for each row in the -** result set. After each R, there are one or more N, I, F, B, or T segments, -** one for each column in the result set. Segments are concatentated directly -** with no delimiters of any kind. -*/ -static void sha3QueryFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - sqlite3 *db = sqlite3_context_db_handle(context); - const char *zSql = (const char*)sqlite3_value_text(argv[0]); - sqlite3_stmt *pStmt = 0; - int nCol; /* Number of columns in the result set */ - int i; /* Loop counter */ - int rc; - int n; - const char *z; - SHA3Context cx; - int iSize; - - if( argc==1 ){ - iSize = 256; - }else{ - iSize = sqlite3_value_int(argv[1]); - if( iSize!=224 && iSize!=256 && iSize!=384 && iSize!=512 ){ - sqlite3_result_error(context, "SHA3 size should be one of: 224 256 " - "384 512", -1); - return; - } - } - if( zSql==0 ) return; - SHA3Init(&cx, iSize); - while( zSql[0] ){ - rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zSql); - if( rc ){ - char *zMsg = sqlite3_mprintf("error SQL statement [%s]: %s", - zSql, sqlite3_errmsg(db)); - sqlite3_finalize(pStmt); - sqlite3_result_error(context, zMsg, -1); - sqlite3_free(zMsg); - return; - } - if( !sqlite3_stmt_readonly(pStmt) ){ - char *zMsg = sqlite3_mprintf("non-query: [%s]", sqlite3_sql(pStmt)); - sqlite3_finalize(pStmt); - sqlite3_result_error(context, zMsg, -1); - sqlite3_free(zMsg); - return; - } - nCol = sqlite3_column_count(pStmt); - z = sqlite3_sql(pStmt); - if( z ){ - n = (int)strlen(z); - hash_step_vformat(&cx,"S%d:",n); - SHA3Update(&cx,(unsigned char*)z,n); - } - - /* Compute a hash over the result of the query */ - while( SQLITE_ROW==sqlite3_step(pStmt) ){ - SHA3Update(&cx,(const unsigned char*)"R",1); - for(i=0; i=1; j--){ - x[j] = u & 0xff; - u >>= 8; - } - x[0] = 'I'; - SHA3Update(&cx, x, 9); - break; - } - case SQLITE_FLOAT: { - sqlite3_uint64 u; - int j; - unsigned char x[9]; - double r = sqlite3_column_double(pStmt,i); - memcpy(&u, &r, 8); - for(j=8; j>=1; j--){ - x[j] = u & 0xff; - u >>= 8; - } - x[0] = 'F'; - SHA3Update(&cx,x,9); - break; - } - case SQLITE_TEXT: { - int n2 = sqlite3_column_bytes(pStmt, i); - const unsigned char *z2 = sqlite3_column_text(pStmt, i); - hash_step_vformat(&cx,"T%d:",n2); - SHA3Update(&cx, z2, n2); - break; - } - case SQLITE_BLOB: { - int n2 = sqlite3_column_bytes(pStmt, i); - const unsigned char *z2 = sqlite3_column_blob(pStmt, i); - hash_step_vformat(&cx,"B%d:",n2); - SHA3Update(&cx, z2, n2); - break; - } - } - } - } - sqlite3_finalize(pStmt); - } - sqlite3_result_blob(context, SHA3Final(&cx), iSize/8, SQLITE_TRANSIENT); -} - - -#ifdef _WIN32 - -#endif -int sqlite3_shathree_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ - int rc = SQLITE_OK; - SQLITE_EXTENSION_INIT2(pApi); - (void)pzErrMsg; /* Unused parameter */ - rc = sqlite3_create_function(db, "sha3", 1, - SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, - 0, sha3Func, 0, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "sha3", 2, - SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC, - 0, sha3Func, 0, 0); - } - if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "sha3_query", 1, - SQLITE_UTF8 | SQLITE_DIRECTONLY, - 0, sha3QueryFunc, 0, 0); - } - if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "sha3_query", 2, - SQLITE_UTF8 | SQLITE_DIRECTONLY, - 0, sha3QueryFunc, 0, 0); - } - return rc; -} - -/************************* End ../ext/misc/shathree.c ********************/ -/************************* Begin ../ext/misc/uint.c ******************/ -/* -** 2020-04-14 -** -** 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 the UINT collating sequence. -** -** UINT works like BINARY for text, except that embedded strings -** of digits compare in numeric order. -** -** * Leading zeros are handled properly, in the sense that -** they do not mess of the maginitude comparison of embedded -** strings of digits. "x00123y" is equal to "x123y". -** -** * Only unsigned integers are recognized. Plus and minus -** signs are ignored. Decimal points and exponential notation -** are ignored. -** -** * Embedded integers can be of arbitrary length. Comparison -** is *not* limited integers that can be expressed as a -** 64-bit machine integer. -*/ -/* #include "sqlite3ext.h" */ -SQLITE_EXTENSION_INIT1 -#include "libc/assert.h" -#include "libc/stdio/stdio.h" -#include "libc/str/str.h" - -/* -** Compare text in lexicographic order, except strings of digits -** compare in numeric order. -*/ -static int uintCollFunc( - void *notUsed, - int nKey1, const void *pKey1, - int nKey2, const void *pKey2 -){ - const unsigned char *zA = (const unsigned char*)pKey1; - const unsigned char *zB = (const unsigned char*)pKey2; - int i=0, j=0, x; - (void)notUsed; - while( ia); -} - -/* -** Destroy a Decimal object -*/ -static void decimal_free(Decimal *p){ - if( p ){ - decimal_clear(p); - sqlite3_free(p); - } -} - -/* -** Allocate a new Decimal object. Initialize it to the number given -** by the input string. -*/ -static Decimal *decimal_new( - sqlite3_context *pCtx, - sqlite3_value *pIn, - int nAlt, - const unsigned char *zAlt -){ - Decimal *p; - int n, i; - const unsigned char *zIn; - int iExp = 0; - p = sqlite3_malloc( sizeof(*p) ); - if( p==0 ) goto new_no_mem; - p->sign = 0; - p->oom = 0; - p->isInit = 1; - p->isNull = 0; - p->nDigit = 0; - p->nFrac = 0; - if( zAlt ){ - n = nAlt, - zIn = zAlt; - }else{ - if( sqlite3_value_type(pIn)==SQLITE_NULL ){ - p->a = 0; - p->isNull = 1; - return p; - } - n = sqlite3_value_bytes(pIn); - zIn = sqlite3_value_text(pIn); - } - p->a = sqlite3_malloc64( n+1 ); - if( p->a==0 ) goto new_no_mem; - for(i=0; isspace(zIn[i]); i++){} - if( zIn[i]=='-' ){ - p->sign = 1; - i++; - }else if( zIn[i]=='+' ){ - i++; - } - while( i='0' && c<='9' ){ - p->a[p->nDigit++] = c - '0'; - }else if( c=='.' ){ - p->nFrac = p->nDigit + 1; - }else if( c=='e' || c=='E' ){ - int j = i+1; - int neg = 0; - if( j>=n ) break; - if( zIn[j]=='-' ){ - neg = 1; - j++; - }else if( zIn[j]=='+' ){ - j++; - } - while( j='0' && zIn[j]<='9' ){ - iExp = iExp*10 + zIn[j] - '0'; - } - j++; - } - if( neg ) iExp = -iExp; - break; - } - i++; - } - if( p->nFrac ){ - p->nFrac = p->nDigit - (p->nFrac - 1); - } - if( iExp>0 ){ - if( p->nFrac>0 ){ - if( iExp<=p->nFrac ){ - p->nFrac -= iExp; - iExp = 0; - }else{ - iExp -= p->nFrac; - p->nFrac = 0; - } - } - if( iExp>0 ){ - p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); - if( p->a==0 ) goto new_no_mem; - memset(p->a+p->nDigit, 0, iExp); - p->nDigit += iExp; - } - }else if( iExp<0 ){ - int nExtra; - iExp = -iExp; - nExtra = p->nDigit - p->nFrac - 1; - if( nExtra ){ - if( nExtra>=iExp ){ - p->nFrac += iExp; - iExp = 0; - }else{ - iExp -= nExtra; - p->nFrac = p->nDigit - 1; - } - } - if( iExp>0 ){ - p->a = sqlite3_realloc64(p->a, p->nDigit + iExp + 1 ); - if( p->a==0 ) goto new_no_mem; - memmove(p->a+iExp, p->a, p->nDigit); - memset(p->a, 0, iExp); - p->nDigit += iExp; - p->nFrac += iExp; - } - } - return p; - -new_no_mem: - if( pCtx ) sqlite3_result_error_nomem(pCtx); - sqlite3_free(p); - return 0; -} - -/* -** Make the given Decimal the result. -*/ -static void decimal_result(sqlite3_context *pCtx, Decimal *p){ - char *z; - int i, j; - int n; - if( p==0 || p->oom ){ - sqlite3_result_error_nomem(pCtx); - return; - } - if( p->isNull ){ - sqlite3_result_null(pCtx); - return; - } - z = sqlite3_malloc( p->nDigit+4 ); - if( z==0 ){ - sqlite3_result_error_nomem(pCtx); - return; - } - i = 0; - if( p->nDigit==0 || (p->nDigit==1 && p->a[0]==0) ){ - p->sign = 0; - } - if( p->sign ){ - z[0] = '-'; - i = 1; - } - n = p->nDigit - p->nFrac; - if( n<=0 ){ - z[i++] = '0'; - } - j = 0; - while( n>1 && p->a[j]==0 ){ - j++; - n--; - } - while( n>0 ){ - z[i++] = p->a[j] + '0'; - j++; - n--; - } - if( p->nFrac ){ - z[i++] = '.'; - do{ - z[i++] = p->a[j] + '0'; - j++; - }while( jnDigit ); - } - z[i] = 0; - sqlite3_result_text(pCtx, z, i, sqlite3_free); -} - -/* -** SQL Function: decimal(X) -** -** Convert input X into decimal and then back into text -*/ -static void decimalFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - Decimal *p = decimal_new(context, argv[0], 0, 0); - UNUSED_PARAMETER(argc); - decimal_result(context, p); - decimal_free(p); -} - -/* -** Compare to Decimal objects. Return negative, 0, or positive if the -** first object is less than, equal to, or greater than the second. -** -** Preconditions for this routine: -** -** pA!=0 -** pA->isNull==0 -** pB!=0 -** pB->isNull==0 -*/ -static int decimal_cmp(const Decimal *pA, const Decimal *pB){ - int nASig, nBSig, rc, n; - if( pA->sign!=pB->sign ){ - return pA->sign ? -1 : +1; - } - if( pA->sign ){ - const Decimal *pTemp = pA; - pA = pB; - pB = pTemp; - } - nASig = pA->nDigit - pA->nFrac; - nBSig = pB->nDigit - pB->nFrac; - if( nASig!=nBSig ){ - return nASig - nBSig; - } - n = pA->nDigit; - if( n>pB->nDigit ) n = pB->nDigit; - rc = memcmp(pA->a, pB->a, n); - if( rc==0 ){ - rc = pA->nDigit - pB->nDigit; - } - return rc; -} - -/* -** SQL Function: decimal_cmp(X, Y) -** -** Return negative, zero, or positive if X is less then, equal to, or -** greater than Y. -*/ -static void decimalCmpFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - Decimal *pA = 0, *pB = 0; - int rc; - - UNUSED_PARAMETER(argc); - pA = decimal_new(context, argv[0], 0, 0); - if( pA==0 || pA->isNull ) goto cmp_done; - pB = decimal_new(context, argv[1], 0, 0); - if( pB==0 || pB->isNull ) goto cmp_done; - rc = decimal_cmp(pA, pB); - if( rc<0 ) rc = -1; - else if( rc>0 ) rc = +1; - sqlite3_result_int(context, rc); -cmp_done: - decimal_free(pA); - decimal_free(pB); -} - -/* -** Expand the Decimal so that it has a least nDigit digits and nFrac -** digits to the right of the decimal point. -*/ -static void decimal_expand(Decimal *p, int nDigit, int nFrac){ - int nAddSig; - int nAddFrac; - if( p==0 ) return; - nAddFrac = nFrac - p->nFrac; - nAddSig = (nDigit - p->nDigit) - nAddFrac; - if( nAddFrac==0 && nAddSig==0 ) return; - p->a = sqlite3_realloc64(p->a, nDigit+1); - if( p->a==0 ){ - p->oom = 1; - return; - } - if( nAddSig ){ - memmove(p->a+nAddSig, p->a, p->nDigit); - memset(p->a, 0, nAddSig); - p->nDigit += nAddSig; - } - if( nAddFrac ){ - memset(p->a+p->nDigit, 0, nAddFrac); - p->nDigit += nAddFrac; - p->nFrac += nAddFrac; - } -} - -/* -** Add the value pB into pA. -** -** Both pA and pB might become denormalized by this routine. -*/ -static void decimal_add(Decimal *pA, Decimal *pB){ - int nSig, nFrac, nDigit; - int i, rc; - if( pA==0 ){ - return; - } - if( pA->oom || pB==0 || pB->oom ){ - pA->oom = 1; - return; - } - if( pA->isNull || pB->isNull ){ - pA->isNull = 1; - return; - } - nSig = pA->nDigit - pA->nFrac; - if( nSig && pA->a[0]==0 ) nSig--; - if( nSignDigit-pB->nFrac ){ - nSig = pB->nDigit - pB->nFrac; - } - nFrac = pA->nFrac; - if( nFracnFrac ) nFrac = pB->nFrac; - nDigit = nSig + nFrac + 1; - decimal_expand(pA, nDigit, nFrac); - decimal_expand(pB, nDigit, nFrac); - if( pA->oom || pB->oom ){ - pA->oom = 1; - }else{ - if( pA->sign==pB->sign ){ - int carry = 0; - for(i=nDigit-1; i>=0; i--){ - int x = pA->a[i] + pB->a[i] + carry; - if( x>=10 ){ - carry = 1; - pA->a[i] = x - 10; - }else{ - carry = 0; - pA->a[i] = x; - } - } - }else{ - signed char *aA, *aB; - int borrow = 0; - rc = memcmp(pA->a, pB->a, nDigit); - if( rc<0 ){ - aA = pB->a; - aB = pA->a; - pA->sign = !pA->sign; - }else{ - aA = pA->a; - aB = pB->a; - } - for(i=nDigit-1; i>=0; i--){ - int x = aA[i] - aB[i] - borrow; - if( x<0 ){ - pA->a[i] = x+10; - borrow = 1; - }else{ - pA->a[i] = x; - borrow = 0; - } - } - } - } -} - -/* -** Compare text in decimal order. -*/ -static int decimalCollFunc( - void *notUsed, - int nKey1, const void *pKey1, - int nKey2, const void *pKey2 -){ - const unsigned char *zA = (const unsigned char*)pKey1; - const unsigned char *zB = (const unsigned char*)pKey2; - Decimal *pA = decimal_new(0, 0, nKey1, zA); - Decimal *pB = decimal_new(0, 0, nKey2, zB); - int rc; - UNUSED_PARAMETER(notUsed); - if( pA==0 || pB==0 ){ - rc = 0; - }else{ - rc = decimal_cmp(pA, pB); - } - decimal_free(pA); - decimal_free(pB); - return rc; -} - - -/* -** SQL Function: decimal_add(X, Y) -** decimal_sub(X, Y) -** -** Return the sum or difference of X and Y. -*/ -static void decimalAddFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - Decimal *pA = decimal_new(context, argv[0], 0, 0); - Decimal *pB = decimal_new(context, argv[1], 0, 0); - UNUSED_PARAMETER(argc); - decimal_add(pA, pB); - decimal_result(context, pA); - decimal_free(pA); - decimal_free(pB); -} -static void decimalSubFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - Decimal *pA = decimal_new(context, argv[0], 0, 0); - Decimal *pB = decimal_new(context, argv[1], 0, 0); - UNUSED_PARAMETER(argc); - if( pB ){ - pB->sign = !pB->sign; - decimal_add(pA, pB); - decimal_result(context, pA); - } - decimal_free(pA); - decimal_free(pB); -} - -/* Aggregate funcion: decimal_sum(X) -** -** Works like sum() except that it uses decimal arithmetic for unlimited -** precision. -*/ -static void decimalSumStep( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - Decimal *p; - Decimal *pArg; - UNUSED_PARAMETER(argc); - p = sqlite3_aggregate_context(context, sizeof(*p)); - if( p==0 ) return; - if( !p->isInit ){ - p->isInit = 1; - p->a = sqlite3_malloc(2); - if( p->a==0 ){ - p->oom = 1; - }else{ - p->a[0] = 0; - } - p->nDigit = 1; - p->nFrac = 0; - } - if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; - pArg = decimal_new(context, argv[0], 0, 0); - decimal_add(p, pArg); - decimal_free(pArg); -} -static void decimalSumInverse( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - Decimal *p; - Decimal *pArg; - UNUSED_PARAMETER(argc); - p = sqlite3_aggregate_context(context, sizeof(*p)); - if( p==0 ) return; - if( sqlite3_value_type(argv[0])==SQLITE_NULL ) return; - pArg = decimal_new(context, argv[0], 0, 0); - if( pArg ) pArg->sign = !pArg->sign; - decimal_add(p, pArg); - decimal_free(pArg); -} -static void decimalSumValue(sqlite3_context *context){ - Decimal *p = sqlite3_aggregate_context(context, 0); - if( p==0 ) return; - decimal_result(context, p); -} -static void decimalSumFinalize(sqlite3_context *context){ - Decimal *p = sqlite3_aggregate_context(context, 0); - if( p==0 ) return; - decimal_result(context, p); - decimal_clear(p); -} - -/* -** SQL Function: decimal_mul(X, Y) -** -** Return the product of X and Y. -** -** All significant digits after the decimal point are retained. -** Trailing zeros after the decimal point are omitted as long as -** the number of digits after the decimal point is no less than -** either the number of digits in either input. -*/ -static void decimalMulFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - Decimal *pA = decimal_new(context, argv[0], 0, 0); - Decimal *pB = decimal_new(context, argv[1], 0, 0); - signed char *acc = 0; - int i, j, k; - int minFrac; - UNUSED_PARAMETER(argc); - if( pA==0 || pA->oom || pA->isNull - || pB==0 || pB->oom || pB->isNull - ){ - goto mul_end; - } - acc = sqlite3_malloc64( pA->nDigit + pB->nDigit + 2 ); - if( acc==0 ){ - sqlite3_result_error_nomem(context); - goto mul_end; - } - memset(acc, 0, pA->nDigit + pB->nDigit + 2); - minFrac = pA->nFrac; - if( pB->nFracnFrac; - for(i=pA->nDigit-1; i>=0; i--){ - signed char f = pA->a[i]; - int carry = 0, x; - for(j=pB->nDigit-1, k=i+j+3; j>=0; j--, k--){ - x = acc[k] + f*pB->a[j] + carry; - acc[k] = x%10; - carry = x/10; - } - x = acc[k] + carry; - acc[k] = x%10; - acc[k-1] += x/10; - } - sqlite3_free(pA->a); - pA->a = acc; - acc = 0; - pA->nDigit += pB->nDigit + 2; - pA->nFrac += pB->nFrac; - pA->sign ^= pB->sign; - while( pA->nFrac>minFrac && pA->a[pA->nDigit-1]==0 ){ - pA->nFrac--; - pA->nDigit--; - } - decimal_result(context, pA); - -mul_end: - sqlite3_free(acc); - decimal_free(pA); - decimal_free(pB); -} - -#ifdef _WIN32 - -#endif -int sqlite3_decimal_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ - int rc = SQLITE_OK; - static const struct { - const char *zFuncName; - int nArg; - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); - } aFunc[] = { - { "decimal", 1, decimalFunc }, - { "decimal_cmp", 2, decimalCmpFunc }, - { "decimal_add", 2, decimalAddFunc }, - { "decimal_sub", 2, decimalSubFunc }, - { "decimal_mul", 2, decimalMulFunc }, - }; - unsigned int i; - (void)pzErrMsg; /* Unused parameter */ - - SQLITE_EXTENSION_INIT2(pApi); - - for(i=0; i 'ieee754(2,0)' -** ieee754(45.25) -> 'ieee754(181,-2)' -** ieee754(2, 0) -> 2.0 -** ieee754(181, -2) -> 45.25 -** -** Two additional functions break apart the one-argument ieee754() -** result into separate integer values: -** -** ieee754_mantissa(45.25) -> 181 -** ieee754_exponent(45.25) -> -2 -** -** These functions convert binary64 numbers into blobs and back again. -** -** ieee754_from_blob(x'3ff0000000000000') -> 1.0 -** ieee754_to_blob(1.0) -> x'3ff0000000000000' -** -** In all single-argument functions, if the argument is an 8-byte blob -** then that blob is interpreted as a big-endian binary64 value. -** -** -** EXACT DECIMAL REPRESENTATION OF BINARY64 VALUES -** ----------------------------------------------- -** -** This extension in combination with the separate 'decimal' extension -** can be used to compute the exact decimal representation of binary64 -** values. To begin, first compute a table of exponent values: -** -** CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT); -** WITH RECURSIVE c(x,v) AS ( -** VALUES(0,'1') -** UNION ALL -** SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1<=971 -** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; -** WITH RECURSIVE c(x,v) AS ( -** VALUES(-1,'0.5') -** UNION ALL -** SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1>=-1075 -** ) INSERT INTO pow2(x,v) SELECT x, v FROM c; -** -** Then, to compute the exact decimal representation of a floating -** point value (the value 47.49 is used in the example) do: -** -** WITH c(n) AS (VALUES(47.49)) -** ---------------^^^^^---- Replace with whatever you want -** SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v) -** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n); -** -** Here is a query to show various boundry values for the binary64 -** number format: -** -** WITH c(name,bin) AS (VALUES -** ('minimum positive value', x'0000000000000001'), -** ('maximum subnormal value', x'000fffffffffffff'), -** ('mininum positive nornal value', x'0010000000000000'), -** ('maximum value', x'7fefffffffffffff')) -** SELECT c.name, decimal_mul(ieee754_mantissa(c.bin),pow2.v) -** FROM pow2, c WHERE pow2.x=ieee754_exponent(c.bin); -** -*/ -/* #include "sqlite3ext.h" */ -SQLITE_EXTENSION_INIT1 -#include "libc/assert.h" -#include "libc/str/str.h" - -/* Mark a function parameter as unused, to suppress nuisance compiler -** warnings. */ -#ifndef UNUSED_PARAMETER -# define UNUSED_PARAMETER(X) (void)(X) -#endif - -/* -** Implementation of the ieee754() function -*/ -static void ieee754func( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - if( argc==1 ){ - sqlite3_int64 m, a; - double r; - int e; - int isNeg; - char zResult[100]; - assert( sizeof(m)==sizeof(r) ); - if( sqlite3_value_type(argv[0])==SQLITE_BLOB - && sqlite3_value_bytes(argv[0])==sizeof(r) - ){ - const unsigned char *x = sqlite3_value_blob(argv[0]); - unsigned int i; - sqlite3_uint64 v = 0; - for(i=0; i>52; - m = a & ((((sqlite3_int64)1)<<52)-1); - if( e==0 ){ - m <<= 1; - }else{ - m |= ((sqlite3_int64)1)<<52; - } - while( e<1075 && m>0 && (m&1)==0 ){ - m >>= 1; - e++; - } - if( isNeg ) m = -m; - } - switch( *(int*)sqlite3_user_data(context) ){ - case 0: - sqlite3_snprintf(sizeof(zResult), zResult, "ieee754(%lld,%d)", - m, e-1075); - sqlite3_result_text(context, zResult, -1, SQLITE_TRANSIENT); - break; - case 1: - sqlite3_result_int64(context, m); - break; - case 2: - sqlite3_result_int(context, e-1075); - break; - } - }else{ - sqlite3_int64 m, e, a; - double r; - int isNeg = 0; - m = sqlite3_value_int64(argv[0]); - e = sqlite3_value_int64(argv[1]); - - /* Limit the range of e. Ticket 22dea1cfdb9151e4 2021-03-02 */ - if( e>10000 ){ - e = 10000; - }else if( e<-10000 ){ - e = -10000; - } - - if( m<0 ){ - isNeg = 1; - m = -m; - if( m<0 ) return; - }else if( m==0 && e>-1000 && e<1000 ){ - sqlite3_result_double(context, 0.0); - return; - } - while( (m>>32)&0xffe00000 ){ - m >>= 1; - e++; - } - while( m!=0 && ((m>>32)&0xfff00000)==0 ){ - m <<= 1; - e--; - } - e += 1075; - if( e<=0 ){ - /* Subnormal */ - if( 1-e >= 64 ){ - m = 0; - }else{ - m >>= 1-e; - } - e = 0; - }else if( e>0x7ff ){ - e = 0x7ff; - } - a = m & ((((sqlite3_int64)1)<<52)-1); - a |= e<<52; - if( isNeg ) a |= ((sqlite3_uint64)1)<<63; - memcpy(&r, &a, sizeof(r)); - sqlite3_result_double(context, r); - } -} - -/* -** Functions to convert between blobs and floats. -*/ -static void ieee754func_from_blob( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - UNUSED_PARAMETER(argc); - if( sqlite3_value_type(argv[0])==SQLITE_BLOB - && sqlite3_value_bytes(argv[0])==sizeof(double) - ){ - double r; - const unsigned char *x = sqlite3_value_blob(argv[0]); - unsigned int i; - sqlite3_uint64 v = 0; - for(i=0; i>= 8; - } - sqlite3_result_blob(context, a, sizeof(r), SQLITE_TRANSIENT); - } -} - - -#ifdef _WIN32 - -#endif -int sqlite3_ieee_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ - static const struct { - char *zFName; - int nArg; - int iAux; - void (*xFunc)(sqlite3_context*,int,sqlite3_value**); - } aFunc[] = { - { "ieee754", 1, 0, ieee754func }, - { "ieee754", 2, 0, ieee754func }, - { "ieee754_mantissa", 1, 1, ieee754func }, - { "ieee754_exponent", 1, 2, ieee754func }, - { "ieee754_to_blob", 1, 0, ieee754func_to_blob }, - { "ieee754_from_blob", 1, 0, ieee754func_from_blob }, - - }; - unsigned int i; - int rc = SQLITE_OK; - SQLITE_EXTENSION_INIT2(pApi); - (void)pzErrMsg; /* Unused parameter */ - for(i=0; i