sqlmath 2026.7.30__tar.gz → 2026.8.31__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/.ci.sh +22 -22
  2. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/CHANGELOG.md +9 -0
  3. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/PKG-INFO +10 -10
  4. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/README.md +9 -9
  5. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/jslint.mjs +1 -1
  6. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/jslint_ci.sh +74 -53
  7. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/package.json +1 -1
  8. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/pyproject.toml +1 -1
  9. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/setup.py +2 -2
  10. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/sqlmath/__init__.py +2 -2
  11. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/sqlmath.mjs +2 -1
  12. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/sqlmath_base.c +273 -225
  13. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/sqlmath_base.h +210 -69
  14. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/sqlmath_external_sqlite.c +6111 -2966
  15. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/test.mjs +340 -36
  16. sqlmath-2026.8.31/test_data_sinefit.csv +1013 -0
  17. sqlmath-2026.7.30/test_data_sinefit.csv +0 -1013
  18. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/.gitconfig +0 -0
  19. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/.github/workflows/ci.yml +0 -0
  20. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/.github/workflows/publish.yml +0 -0
  21. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/.github/workflows/publish_pypi_test.yml +0 -0
  22. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/.gitignore +0 -0
  23. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/.npmignore +0 -0
  24. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/LICENSE +0 -0
  25. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/MANIFEST.in +0 -0
  26. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/asset_image_folder_open_solid.svg +0 -0
  27. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/asset_image_github_brands.svg +0 -0
  28. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/asset_image_logo_256.html +0 -0
  29. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/asset_image_logo_256.png +0 -0
  30. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/asset_image_logo_256.svg +0 -0
  31. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/asset_sqlmath_external_rollup.js +0 -0
  32. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/cpplint.py +0 -0
  33. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/csslint.js +0 -0
  34. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/indent.exe +0 -0
  35. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/index.html +0 -0
  36. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/libiconv2.dll +0 -0
  37. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/libintl3.dll +0 -0
  38. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/sqlmath_browser.mjs +0 -0
  39. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/sqlmath_wrapper_wasm.js +0 -0
  40. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/test.py +0 -0
  41. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/test_lgbm_binary.test +0 -0
  42. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/test_lgbm_binary.train +0 -0
  43. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/test_lgbm_numpy.py +0 -0
  44. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/test_lgbm_preb.txt +0 -0
  45. {sqlmath-2026.7.30 → sqlmath-2026.8.31}/zlib.v1.3.1.vcpkg.x64-windows-static.lib +0 -0
@@ -54,7 +54,7 @@ process.stdout.write(`lib_lightgbm_${libPlatformArchExt()}`);
54
54
  "sqlmath/$(node -p '`libomp_${process.platform}_${process.arch}.dylib`')"
55
55
  ;;
56
56
  esac
57
- pip install lightgbm=="$(printf "v4.6.0" | sed "s|v||")"
57
+ pip install lightgbm=="$(printf "v4.7.0" | sed "s|v||")"
58
58
  cp "$(
59
59
  find "$(
60
60
  pip show lightgbm | grep Location | sed "s|Location: ||"
@@ -409,25 +409,6 @@ shCiEmsdkInstall() {(set -e
409
409
  # "$EMSDK/.null.c" -o "$EMSDK/.null_wasm.js"
410
410
  )}
411
411
 
412
- shIndentC() {(set -e
413
- # This function will indent/prettify c file.
414
- if (uname | grep -q "MING\|MSYS")
415
- then
416
- ./indent.exe \
417
- --blank-lines-after-commas \
418
- --braces-on-func-def-line \
419
- --break-function-decl-args \
420
- --break-function-decl-args-end \
421
- --dont-line-up-parentheses \
422
- --k-and-r-style \
423
- --line-length78 \
424
- --no-tabs \
425
- -bfde \
426
- "$@"
427
- dos2unix "$@"
428
- fi
429
- )}
430
-
431
412
  shCiLintCustom() {(set -e
432
413
  # This function will run custom-code to lint files.
433
414
  if [ "$GITHUB_ACTION" ]
@@ -530,13 +511,32 @@ require("assert")(require("./package.json").name !== "sqlmath");
530
511
  shPidListWait test "$PID_LIST"
531
512
  )}
532
513
 
514
+ shIndentC() {(set -e
515
+ # This function will indent/prettify c file.
516
+ if (uname | grep -q "MING\|MSYS")
517
+ then
518
+ ./indent.exe \
519
+ --blank-lines-after-commas \
520
+ --braces-on-func-def-line \
521
+ --break-function-decl-args \
522
+ --break-function-decl-args-end \
523
+ --dont-line-up-parentheses \
524
+ --k-and-r-style \
525
+ --line-length78 \
526
+ --no-tabs \
527
+ -bfde \
528
+ "$@"
529
+ dos2unix "$@"
530
+ fi
531
+ )}
532
+
533
533
  shSqlmathUpdate() {(set -e
534
534
  # This function will update files with ~/Documents/sqlmath/.
535
535
  . "$HOME/myci2.sh" && shMyciUpdate
536
536
  if [ "$PWD/" = "$HOME/Documents/sqlmath/" ]
537
537
  then
538
- DIR=sqlite-autoconf-3500400
539
- URL=https://www.sqlite.org/2025/sqlite-autoconf-3500400.tar.gz
538
+ DIR=sqlite-autoconf-3510300
539
+ URL=https://www.sqlite.org/2026/sqlite-autoconf-3510300.tar.gz
540
540
  # shRollupFetch
541
541
  if [ ! -d ".$DIR" ]
542
542
  then
@@ -7,6 +7,15 @@
7
7
  - sqlite - Add similar error-handling from builtin-sql-function PERCENTILE() into custom-sql-function QUANTILE().
8
8
  - none
9
9
 
10
+ # v2026.8.31
11
+ - jslint-ci - Update ci-shell-function shGitLsTree() to include sha256 hash of files.
12
+ - sqlmath - Cleanup c-function winSinefitSnr().
13
+ - sqlmath - Update sql-function WIN_SINEFIT2() argument modeSnr with bitmask, allowing selective sine-fit of each column, to avoid wasting cpu on columns that don't need it.
14
+ - lgbm - Upgrade to lightgbm-v4.7.0.
15
+ - sqlite - Upgrade to sqlite-v3.51.3.
16
+ - sqlmath - Remove obsolete sql-functions MEDIAN2(), QUANTILE(), superseded by sqlite-builtins.
17
+ - sqlmath - Fix c-header conflict between dlfcn.h and Python.h.
18
+
10
19
  # v2026.7.30
11
20
  - jslint-ecma - Add ES2015-feature for..of.
12
21
  - jslint - Change scope from scope_function to scope_block:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlmath
3
- Version: 2026.7.30
3
+ Version: 2026.8.31
4
4
  Summary: sqlite for data-science
5
5
  Author: Kai Zhu
6
6
  Requires-Python: >=3.10
@@ -34,7 +34,7 @@ Description-Content-Type: text/markdown
34
34
 
35
35
  # Status
36
36
 
37
- | Branch | [master<br>(v2026.7.30)](https://github.com/sqlmath/sqlmath/tree/master) | [beta<br>(Web Demo)](https://github.com/sqlmath/sqlmath/tree/beta) | [alpha<br>(Development)](https://github.com/sqlmath/sqlmath/tree/alpha) |
37
+ | Branch | [master<br>(v2026.8.31)](https://github.com/sqlmath/sqlmath/tree/master) | [beta<br>(Web Demo)](https://github.com/sqlmath/sqlmath/tree/beta) | [alpha<br>(Development)](https://github.com/sqlmath/sqlmath/tree/alpha) |
38
38
  |--:|:--:|:--:|:--:|
39
39
  | CI | [![ci](https://github.com/sqlmath/sqlmath/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/sqlmath/sqlmath/actions?query=branch%3Amaster) | [![ci](https://github.com/sqlmath/sqlmath/actions/workflows/ci.yml/badge.svg?branch=beta)](https://github.com/sqlmath/sqlmath/actions?query=branch%3Abeta) | [![ci](https://github.com/sqlmath/sqlmath/actions/workflows/ci.yml/badge.svg?branch=alpha)](https://github.com/sqlmath/sqlmath/actions?query=branch%3Aalpha) |
40
40
  | Coverage | [![coverage](https://sqlmath.github.io/sqlmath/branch-master/.artifact/coverage/coverage_badge.svg)](https://sqlmath.github.io/sqlmath/branch-master/.artifact/coverage/index.html) | [![coverage](https://sqlmath.github.io/sqlmath/branch-beta/.artifact/coverage/coverage_badge.svg)](https://sqlmath.github.io/sqlmath/branch-beta/.artifact/coverage/index.html) | [![coverage](https://sqlmath.github.io/sqlmath/branch-alpha/.artifact/coverage/coverage_badge.svg)](https://sqlmath.github.io/sqlmath/branch-alpha/.artifact/coverage/index.html) |
@@ -423,7 +423,7 @@ Full notebook with fraud detection, intraday trading signals, and model persiste
423
423
  **Kaggle Environment:**
424
424
  - Linux x64, Python 3.12, Node.js 24
425
425
  - Datasets: [Credit Card Fraud](https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud) (284K transactions), SPY intraday OHLCV
426
- - sqlmath installs via `pip install sqlmath==2026.7.30`
426
+ - sqlmath installs via `pip install sqlmath==2026.8.31`
427
427
 
428
428
 
429
429
  <br><br>
@@ -668,11 +668,11 @@ PORT=8080 sh jslint_ci.sh shHttpFileServer
668
668
  ```shell
669
669
  python -m build
670
670
  #
671
- twine upload --repository testpypi dist/sqlmath-2026.7.30*
672
- py -m pip install --index-url https://test.pypi.org/simple/ sqlmath==2026.7.30
671
+ twine upload --repository testpypi dist/sqlmath-2026.8.31*
672
+ py -m pip install --index-url https://test.pypi.org/simple/ sqlmath==2026.8.31
673
673
  #
674
- twine upload dist/sqlmath-2026.7.30*
675
- pip install sqlmath==2026.7.30
674
+ twine upload dist/sqlmath-2026.8.31*
675
+ pip install sqlmath==2026.8.31
676
676
  ```
677
677
 
678
678
 
@@ -683,11 +683,11 @@ pip install sqlmath==2026.7.30
683
683
  (set -e
684
684
  #
685
685
  # lgbm
686
- sh jslint_ci.sh shRollupUpgrade "v4.5.0" "v4.6.0" ".ci.sh sqlmath_base.h"
686
+ sh jslint_ci.sh shRollupUpgrade "v4.6.0" "v4.7.0" ".ci.sh sqlmath_base.h"
687
687
  #
688
688
  # sqlite
689
- sh jslint_ci.sh shRollupUpgrade "3.50.3" "3.50.4" ".ci.sh sqlmath_external_sqlite.c"
690
- sh jslint_ci.sh shRollupUpgrade "3500300" "3500400" ".ci.sh sqlmath_external_sqlite.c"
689
+ sh jslint_ci.sh shRollupUpgrade "3.50.4" "3.51.3" ".ci.sh sqlmath_external_sqlite.c"
690
+ sh jslint_ci.sh shRollupUpgrade "3500400" "3510300" ".ci.sh sqlmath_external_sqlite.c"
691
691
  #
692
692
  # shSqlmathUpdate
693
693
  read -p "Press Enter to shSqlmathUpdate:"
@@ -9,7 +9,7 @@
9
9
 
10
10
  # Status
11
11
 
12
- | Branch | [master<br>(v2026.7.30)](https://github.com/sqlmath/sqlmath/tree/master) | [beta<br>(Web Demo)](https://github.com/sqlmath/sqlmath/tree/beta) | [alpha<br>(Development)](https://github.com/sqlmath/sqlmath/tree/alpha) |
12
+ | Branch | [master<br>(v2026.8.31)](https://github.com/sqlmath/sqlmath/tree/master) | [beta<br>(Web Demo)](https://github.com/sqlmath/sqlmath/tree/beta) | [alpha<br>(Development)](https://github.com/sqlmath/sqlmath/tree/alpha) |
13
13
  |--:|:--:|:--:|:--:|
14
14
  | CI | [![ci](https://github.com/sqlmath/sqlmath/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/sqlmath/sqlmath/actions?query=branch%3Amaster) | [![ci](https://github.com/sqlmath/sqlmath/actions/workflows/ci.yml/badge.svg?branch=beta)](https://github.com/sqlmath/sqlmath/actions?query=branch%3Abeta) | [![ci](https://github.com/sqlmath/sqlmath/actions/workflows/ci.yml/badge.svg?branch=alpha)](https://github.com/sqlmath/sqlmath/actions?query=branch%3Aalpha) |
15
15
  | Coverage | [![coverage](https://sqlmath.github.io/sqlmath/branch-master/.artifact/coverage/coverage_badge.svg)](https://sqlmath.github.io/sqlmath/branch-master/.artifact/coverage/index.html) | [![coverage](https://sqlmath.github.io/sqlmath/branch-beta/.artifact/coverage/coverage_badge.svg)](https://sqlmath.github.io/sqlmath/branch-beta/.artifact/coverage/index.html) | [![coverage](https://sqlmath.github.io/sqlmath/branch-alpha/.artifact/coverage/coverage_badge.svg)](https://sqlmath.github.io/sqlmath/branch-alpha/.artifact/coverage/index.html) |
@@ -398,7 +398,7 @@ Full notebook with fraud detection, intraday trading signals, and model persiste
398
398
  **Kaggle Environment:**
399
399
  - Linux x64, Python 3.12, Node.js 24
400
400
  - Datasets: [Credit Card Fraud](https://www.kaggle.com/datasets/mlg-ulb/creditcardfraud) (284K transactions), SPY intraday OHLCV
401
- - sqlmath installs via `pip install sqlmath==2026.7.30`
401
+ - sqlmath installs via `pip install sqlmath==2026.8.31`
402
402
 
403
403
 
404
404
  <br><br>
@@ -643,11 +643,11 @@ PORT=8080 sh jslint_ci.sh shHttpFileServer
643
643
  ```shell
644
644
  python -m build
645
645
  #
646
- twine upload --repository testpypi dist/sqlmath-2026.7.30*
647
- py -m pip install --index-url https://test.pypi.org/simple/ sqlmath==2026.7.30
646
+ twine upload --repository testpypi dist/sqlmath-2026.8.31*
647
+ py -m pip install --index-url https://test.pypi.org/simple/ sqlmath==2026.8.31
648
648
  #
649
- twine upload dist/sqlmath-2026.7.30*
650
- pip install sqlmath==2026.7.30
649
+ twine upload dist/sqlmath-2026.8.31*
650
+ pip install sqlmath==2026.8.31
651
651
  ```
652
652
 
653
653
 
@@ -658,11 +658,11 @@ pip install sqlmath==2026.7.30
658
658
  (set -e
659
659
  #
660
660
  # lgbm
661
- sh jslint_ci.sh shRollupUpgrade "v4.5.0" "v4.6.0" ".ci.sh sqlmath_base.h"
661
+ sh jslint_ci.sh shRollupUpgrade "v4.6.0" "v4.7.0" ".ci.sh sqlmath_base.h"
662
662
  #
663
663
  # sqlite
664
- sh jslint_ci.sh shRollupUpgrade "3.50.3" "3.50.4" ".ci.sh sqlmath_external_sqlite.c"
665
- sh jslint_ci.sh shRollupUpgrade "3500300" "3500400" ".ci.sh sqlmath_external_sqlite.c"
664
+ sh jslint_ci.sh shRollupUpgrade "3.50.4" "3.51.3" ".ci.sh sqlmath_external_sqlite.c"
665
+ sh jslint_ci.sh shRollupUpgrade "3500400" "3510300" ".ci.sh sqlmath_external_sqlite.c"
666
666
  #
667
667
  # shSqlmathUpdate
668
668
  read -p "Press Enter to shSqlmathUpdate:"
@@ -435,7 +435,7 @@ const jslint_charset_ascii = ( //jslint-ignore-line
435
435
  + "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
436
436
  + "`abcdefghijklmnopqrstuvwxyz{|}~\u007f"
437
437
  );
438
- const jslint_edition = "v2026.7.30";
438
+ const jslint_edition = "v2026.8.31";
439
439
  const jslint_fudge = 1; // Fudge starting line and starting
440
440
  // ... column to 1.
441
441
  const jslint_global_dict_all = {
@@ -890,11 +890,16 @@ shGitInitBase() {(set -e
890
890
 
891
891
  shGitLsTree() {(set -e
892
892
  # This function will "git ls-tree" all files committed in HEAD.
893
+ # The sha256 column hashes the WORKING-TREE file, not the git blob,
894
+ # so it can be compared against a copy sent elsewhere with
895
+ # `sha256sum <file> | cut -c1-8`.
893
896
  # example usage:
894
897
  # shGitLsTree | sort -rk3 # sort by date
895
898
  # shGitLsTree | sort -rk4 # sort by size
896
899
  node --input-type=module --eval '
897
900
  import moduleChildProcess from "child_process";
901
+ import moduleCrypto from "crypto";
902
+ import moduleFs from "fs";
898
903
  (async function () {
899
904
  let result;
900
905
  // get file, mode, size
@@ -930,9 +935,21 @@ import moduleChildProcess from "child_process";
930
935
  mode: "755",
931
936
  size: 0
932
937
  });
933
- // get date
938
+ // get date, hash
934
939
  result.forEach(function (elem) {
935
940
  result[0].size += elem.size;
941
+ elem.hash = "sha256 ";
942
+ if (elem.file !== ".") {
943
+ try {
944
+ elem.hash = moduleCrypto.createHash(
945
+ "sha256"
946
+ ).update(
947
+ moduleFs.readFileSync(elem.file) //jslint-ignore-line
948
+ ).digest("hex").slice(0, 8);
949
+ } catch (ignore) {
950
+ elem.hash = "?".repeat(8);
951
+ }
952
+ }
936
953
  moduleChildProcess.spawn(
937
954
  "git",
938
955
  ["log", "--max-count=1", "--format=%at", elem.file],
@@ -956,6 +973,7 @@ import moduleChildProcess from "child_process";
956
973
  + " " + String(
957
974
  Math.ceil(elem.size / 1024)
958
975
  ).padStart(sizePad, " ") + " KB"
976
+ + " " + elem.hash
959
977
  + " " + elem.file
960
978
  + "\n"
961
979
  );
@@ -976,7 +994,8 @@ shGitSquashPop() {(set -e
976
994
  git add .
977
995
  # commit HEAD immediately after previous $COMMIT
978
996
  git commit --allow-empty -am "$MESSAGE" || true
979
- git log -n 4
997
+ printf "\n\n\n\n"
998
+ git --no-pager log -n 4
980
999
  )}
981
1000
 
982
1001
  shGithubCheckoutRemote() {(set -e
@@ -1131,6 +1150,20 @@ shGithubFileUpload() {(set -e
1131
1150
  shGithubFileDownloadUpload upload "$1" "$2"
1132
1151
  )}
1133
1152
 
1153
+ shGithubPrCleanup() {(set -e
1154
+ # This function will cleanup pull-request after merge.
1155
+ git checkout alpha
1156
+ git push . alpha:__pr_upstream_pre -f
1157
+ git fetch upstream beta
1158
+ # verify no diff between alpha..upstream/beta
1159
+ git --no-pager diff alpha..upstream/beta
1160
+ git reset upstream/beta
1161
+ git push . alpha:beta -f
1162
+ git push origin alpha beta -f
1163
+ sh jslint_ci.sh shMyciUpdate
1164
+ git push . alpha:__pr_upstream -f
1165
+ )}
1166
+
1134
1167
  shGithubPrCreate() {(set -e
1135
1168
  # This function will create-and-push a github-pull-commit to origin/alpha.
1136
1169
  node --input-type=module --eval '
@@ -1231,7 +1264,8 @@ import moduleFs from "fs";
1231
1264
  git push origin alpha -f
1232
1265
  shDirHttplinkValidate
1233
1266
  git push . HEAD:__pr_"${branchMerge}" -f
1234
- git log -n 4
1267
+ printf "\n\n\n\n"
1268
+ git --no-pager log -n 4
1235
1269
  )
1236
1270
  `)
1237
1271
  ],
@@ -1246,20 +1280,6 @@ import moduleFs from "fs";
1246
1280
  ' "$@" # '
1247
1281
  )}
1248
1282
 
1249
- shGithubPrCleanup() {(set -e
1250
- # This function will cleanup pull-request after merge.
1251
- git checkout alpha
1252
- git push . alpha:__pr_upstream_pre -f
1253
- git fetch upstream beta
1254
- # verify no diff between alpha..upstream/beta
1255
- git --no-pager diff alpha..upstream/beta
1256
- git reset upstream/beta
1257
- git push . alpha:beta -f
1258
- git push origin alpha beta -f
1259
- sh jslint_ci.sh shMyciUpdate
1260
- git push . alpha:__pr_upstream -f
1261
- )}
1262
-
1263
1283
  shGithubPrUpdatePrxxx() {(set -e
1264
1284
  # This function will update 'PR-xxx' placeholder in codebase
1265
1285
  # to next sequential github issue/pull number.
@@ -1295,7 +1315,8 @@ shGithubPrUpdatePrxxx() {(set -e
1295
1315
  git --no-pager diff
1296
1316
  git grep -Ei -e '^ *?(//|#) pr-xxx' || true
1297
1317
  git commit -am "- ci - Update 'PR-xxx' placeholder to '${PR_XXX}'."
1298
- git log -n 4
1318
+ printf "\n\n\n\n"
1319
+ git --no-pager log -n 4
1299
1320
  )}
1300
1321
 
1301
1322
  shGithubTokenExport() {
@@ -1765,41 +1786,6 @@ function objectDeepCopyWithKeysSorted(obj) {
1765
1786
  ' "$@" # '
1766
1787
  )}
1767
1788
 
1768
- shLintShell() {(set -e
1769
- if (! shellcheck --version >/dev/null 2>&1)
1770
- then
1771
- return
1772
- fi
1773
- FILE_LIST="$*"
1774
- OPTION=""
1775
- # https://www.shellcheck.net/wiki/
1776
- # SC1090 – Can't follow non-constant source.
1777
- # Use a directive to specify location
1778
- OPTION="$OPTION --exclude=SC1090"
1779
- # SC1091 – Not following: (error message here)
1780
- OPTION="$OPTION --exclude=SC1091"
1781
- # SC2016 – Expressions don't expand in single quotes,
1782
- # use double quotes for that.
1783
- OPTION="$OPTION --exclude=SC2016"
1784
- # SC2030 – Modification of var is local (to subshell caused by pipeline).
1785
- OPTION="$OPTION --exclude=SC2030"
1786
- # SC2031 – var was modified in a subshell. That change might be lost.
1787
- OPTION="$OPTION --exclude=SC2031"
1788
- # SC2119 – Use `foo "$@"` if function's `$1` should mean script's `$1`.
1789
- OPTION="$OPTION --exclude=SC2119"
1790
- # SC2115 – Use `"${var:?}"` to ensure this never expands to `/*` .
1791
- OPTION="$OPTION --exclude=SC2155"
1792
- EXIT_CODE=0
1793
- # shellcheck disable=SC2086
1794
- shellcheck $OPTION $FILE_LIST >/dev/null || EXIT_CODE="$?"
1795
- if [ "$EXIT_CODE" != 0 ]
1796
- then
1797
- # shellcheck disable=SC2086
1798
- shellcheck $OPTION $FILE_LIST | head -n 50
1799
- fi
1800
- return "$EXIT_CODE"
1801
- )}
1802
-
1803
1789
  shLintPython() {(set -e
1804
1790
  # This function will lint python file.
1805
1791
  # https://docs.astral.sh/ruff/rules/
@@ -1895,6 +1881,41 @@ shLintPython() {(set -e
1895
1881
  printf "lint successful\n\n"
1896
1882
  )}
1897
1883
 
1884
+ shLintShell() {(set -e
1885
+ if (! shellcheck --version >/dev/null 2>&1)
1886
+ then
1887
+ return
1888
+ fi
1889
+ FILE_LIST="$*"
1890
+ OPTION=""
1891
+ # https://www.shellcheck.net/wiki/
1892
+ # SC1090 – Can't follow non-constant source.
1893
+ # Use a directive to specify location
1894
+ OPTION="$OPTION --exclude=SC1090"
1895
+ # SC1091 – Not following: (error message here)
1896
+ OPTION="$OPTION --exclude=SC1091"
1897
+ # SC2016 – Expressions don't expand in single quotes,
1898
+ # use double quotes for that.
1899
+ OPTION="$OPTION --exclude=SC2016"
1900
+ # SC2030 – Modification of var is local (to subshell caused by pipeline).
1901
+ OPTION="$OPTION --exclude=SC2030"
1902
+ # SC2031 – var was modified in a subshell. That change might be lost.
1903
+ OPTION="$OPTION --exclude=SC2031"
1904
+ # SC2119 – Use `foo "$@"` if function's `$1` should mean script's `$1`.
1905
+ OPTION="$OPTION --exclude=SC2119"
1906
+ # SC2115 – Use `"${var:?}"` to ensure this never expands to `/*` .
1907
+ OPTION="$OPTION --exclude=SC2155"
1908
+ EXIT_CODE=0
1909
+ # shellcheck disable=SC2086
1910
+ shellcheck $OPTION $FILE_LIST >/dev/null || EXIT_CODE="$?"
1911
+ if [ "$EXIT_CODE" != 0 ]
1912
+ then
1913
+ # shellcheck disable=SC2086
1914
+ shellcheck $OPTION $FILE_LIST | head -n 50
1915
+ fi
1916
+ return "$EXIT_CODE"
1917
+ )}
1918
+
1898
1919
  shNpmPublishV0() {(set -e
1899
1920
  # This function will npm-publish name $1 with bare package.json.
1900
1921
  DIR=/tmp/shNpmPublishV0
@@ -32,5 +32,5 @@
32
32
  },
33
33
  "shCiArtifactUpload": 1,
34
34
  "shCiPublishNpm": 1,
35
- "version": "2026.7.30"
35
+ "version": "2026.8.31"
36
36
  }
@@ -9,7 +9,7 @@ backend-path = ["."]
9
9
  # https://peps.python.org/pep-0621/#example
10
10
  [project]
11
11
  name = "sqlmath"
12
- version = "2026.7.30"
12
+ version = "2026.8.31"
13
13
  description = "sqlite for data-science"
14
14
  authors = [{name = "Kai Zhu"}]
15
15
  maintainers = []
@@ -27,8 +27,8 @@ python setup.py bdist_wheel
27
27
  python setup.py build_ext
28
28
  """
29
29
 
30
- __version__ = "2026.7.30"
31
- __version_info__ = ("2026", "7", "30")
30
+ __version__ = "2026.8.31"
31
+ __version_info__ = ("2026", "8", "31")
32
32
 
33
33
  import asyncio
34
34
  import base64
@@ -21,8 +21,8 @@
21
21
 
22
22
  """sqlmath.py."""
23
23
 
24
- __version__ = "2026.7.30"
25
- __version_info__ = ("2026", "7", "30")
24
+ __version__ = "2026.8.31"
25
+ __version_info__ = ("2026", "8", "31")
26
26
 
27
27
  import csv
28
28
  import io
@@ -22,6 +22,7 @@
22
22
 
23
23
  /*
24
24
  sh one-liner:
25
+ npm_config_mode_test_save=1 npm run test && git diff
25
26
  sh jslint_ci.sh shCiBuildWasm
26
27
  sh jslint_ci.sh shSqlmathUpdate
27
28
  */
@@ -110,7 +111,7 @@ const SQLITE_OPEN_WAL = 0x00080000; /* VFS only */
110
111
 
111
112
  const DB_EXEC_PROFILE_DICT = {}; //jslint-ignore-line
112
113
  const DB_STATE = {};
113
- const version = "v2026.7.30";
114
+ const version = "v2026.8.31";
114
115
  let DB_EXEC_PROFILE_MODE;
115
116
  let DB_EXEC_PROFILE_SQL_LENGTH;
116
117
  let IS_BROWSER;