Commit Graph

977 Commits

Author SHA1 Message Date
Charlie Vieth 89769f9b63
Fix exponential memory allocation in Exec and improve performance
This commit changes SQLiteConn.Exec to use the raw Go query string
instead of repeatedly converting it to a C string (which it would do for
every statement in the provided query). This yields a ~20% performance
improvement for a query containing one statement and a significantly
larger improvement when the query contains multiple statements as is
common when importing a SQL dump (our benchmark shows a 5x improvement
for handling 1k SQL statements).

Additionally, this commit improves the performance of Exec by 2x or more
and makes number and size of allocations constant when there are no bind
parameters (the performance improvement scales with the number of SQL
statements in the query). This is achieved by having the entire query
processed in C code thus requiring only one CGO call.

The speedup for Exec'ing single statement queries means that wrapping
simple statements in a transaction is now twice as fast.

This commit also improves the test coverage of Exec, which previously
failed to test that Exec could process multiple statements like INSERT.
It also adds some Exec specific benchmarks that highlight both the
improvements here and the overhead of using a cancellable Context.

This commit is a slimmed down and improved version of PR #1133:
  https://github.com/mattn/go-sqlite3/pull/1133

```
goos: darwin
goarch: arm64
pkg: github.com/mattn/go-sqlite3
cpu: Apple M1 Max
                                       │    b.txt     │                n.txt                │
                                       │    sec/op    │   sec/op     vs base                │
Suite/BenchmarkExec/Params-10             1.434µ ± 1%   1.186µ ± 0%  -17.27% (p=0.000 n=10)
Suite/BenchmarkExec/NoParams-10          1267.5n ± 0%   759.2n ± 1%  -40.10% (p=0.000 n=10)
Suite/BenchmarkExecContext/Params-10      2.886µ ± 0%   2.517µ ± 0%  -12.80% (p=0.000 n=10)
Suite/BenchmarkExecContext/NoParams-10    2.605µ ± 1%   1.829µ ± 1%  -29.81% (p=0.000 n=10)
Suite/BenchmarkExecStep-10               1852.6µ ± 1%   582.3µ ± 0%  -68.57% (p=0.000 n=10)
Suite/BenchmarkExecContextStep-10        3053.3µ ± 3%   582.0µ ± 0%  -80.94% (p=0.000 n=10)
Suite/BenchmarkExecTx-10                  4.126µ ± 2%   2.200µ ± 1%  -46.67% (p=0.000 n=10)
geomean                                   16.40µ        8.455µ       -48.44%

                                       │      b.txt      │                n.txt                │
                                       │      B/op       │    B/op     vs base                 │
Suite/BenchmarkExec/Params-10                 248.0 ± 0%   240.0 ± 0%    -3.23% (p=0.000 n=10)
Suite/BenchmarkExec/NoParams-10              128.00 ± 0%   64.00 ± 0%   -50.00% (p=0.000 n=10)
Suite/BenchmarkExecContext/Params-10          408.0 ± 0%   400.0 ± 0%    -1.96% (p=0.000 n=10)
Suite/BenchmarkExecContext/NoParams-10        288.0 ± 0%   208.0 ± 0%   -27.78% (p=0.000 n=10)
Suite/BenchmarkExecStep-10               5406674.50 ± 0%   64.00 ± 0%  -100.00% (p=0.000 n=10)
Suite/BenchmarkExecContextStep-10         5566758.5 ± 0%   208.0 ± 0%  -100.00% (p=0.000 n=10)
Suite/BenchmarkExecTx-10                      712.0 ± 0%   520.0 ± 0%   -26.97% (p=0.000 n=10)
geomean                                     4.899Ki        189.7        -96.22%

                                       │     b.txt     │               n.txt                │
                                       │   allocs/op   │ allocs/op   vs base                │
Suite/BenchmarkExec/Params-10              10.000 ± 0%   9.000 ± 0%  -10.00% (p=0.000 n=10)
Suite/BenchmarkExec/NoParams-10             7.000 ± 0%   4.000 ± 0%  -42.86% (p=0.000 n=10)
Suite/BenchmarkExecContext/Params-10        12.00 ± 0%   11.00 ± 0%   -8.33% (p=0.000 n=10)
Suite/BenchmarkExecContext/NoParams-10      9.000 ± 0%   6.000 ± 0%  -33.33% (p=0.000 n=10)
Suite/BenchmarkExecStep-10               7000.000 ± 0%   4.000 ± 0%  -99.94% (p=0.000 n=10)
Suite/BenchmarkExecContextStep-10        9001.000 ± 0%   6.000 ± 0%  -99.93% (p=0.000 n=10)
Suite/BenchmarkExecTx-10                    27.00 ± 0%   18.00 ± 0%  -33.33% (p=0.000 n=10)
geomean                                     74.60        7.224       -90.32%
```
2024-11-11 23:38:01 -05:00
Charlie Vieth cf831bd67e
test: add Exec tests and benchmarks 2024-11-08 21:10:22 -05:00
Charlie Vieth b3e6ac1fca
ci: fix icu4c on macos and CIFuzz test 2024-11-05 13:08:58 -05:00
Yasuhiro Matsumoto 82bc911e85 close statement when missing query arguments
fixes #1280
2024-10-04 23:58:44 +09:00
Yasuhiro Matsumoto 846fea6c14 Update amalgamation code to 3.46.1 2024-09-04 22:29:32 +09:00
Dustin Ward 3c0390b77c add support for libsqlite3 on z/OS 2024-05-01 22:59:32 +09:00
pomadev 18cdded900 fix: some typos 2024-02-22 14:15:27 +09:00
Yasuhiro Matsumoto 6ee3e6746e close channel 2024-02-03 02:00:28 +09:00
Yasuhiro Matsumoto 4702d9b5d6 Update amalgamation code to 3.45.1 2024-01-31 22:13:41 +09:00
Yasuhiro Matsumoto 64bbe6202c add example 2024-01-25 23:34:36 +09:00
Yasuhiro Matsumoto cdc8095814 Update amalgamation code to 3.45.0 2024-01-25 23:34:36 +09:00
Yasuhiro Matsumoto d3c33332c3 update go version 2024-01-25 22:55:22 +09:00
Yasuhiro Matsumoto 1f0dc0a0ef go fmt ./... 2024-01-25 22:55:22 +09:00
Yasuhiro Matsumoto c91bca4fb4 update go version to 1.19 2024-01-25 22:55:22 +09:00
leso-kn 00b02e0ba9 Fix musl build (#1164) 2023-12-15 10:23:24 +09:00
Diego Becciolini d9e2789502 temporary fix to make the job pass
use same workaround as https://github.com/authelia/authelia/pull/6404
before https://github.com/mattn/go-sqlite3/pull/1177 fixes the build
otherwise
2023-12-14 10:25:47 +09:00
Diego Becciolini c260ecf7e4 use locally checked out lib in the docker job
see https://github.com/mattn/go-sqlite3/pull/1177
2023-12-14 10:25:47 +09:00
Yasuhiro Matsumoto 9fd6f4ffd3 Update amalgamation code 2023-11-04 23:05:11 +09:00
Yasuhiro Matsumoto f08f1b6b9c Update amalgamation code 2023-06-01 08:32:35 +09:00
Partho Kumar Rajvor d366d8de4e Update README.md 2023-05-17 10:16:53 +09:00
Andrew Zhang edc3bb6955
Fix virtual table example. (#1149) 2023-04-05 22:46:26 -04:00
Denis Dmitriev 85a15a7254
Add build tags to support both x86 and ARM compilation on macOS (#1069)
* Add build tags to support both x86 and ARM compilation on macOS

* Documentation fix: command line for build under macOS

* Global replace 'macOS X' -> 'macOS'. Fix typo in -tags cmd line param

* `README.md`: fix all `--tags` -> `-tags`

---------

Co-authored-by: Denis Dmitriev <dmitriev@itspartner.net>
2023-02-23 00:00:03 -05:00
Connor Hindley 819cc0ddf2
Add go 1.20 to workflow matrix, remove 1.17 (#1136)
Closes #1129
2023-02-15 23:42:36 -05:00
Charlie Vieth 7ce62b2ade
Replace namedValue with driver.NamedValue to avoid copying exec/query args (#1128) 2023-02-11 17:14:42 -05:00
Philip O'Toole 1603038a4d
Add Serialize and Deserialize support (#1089)
Add support for Serialize and Deserialize, which wrap sqlite3_serialize and sqlite3_deserialize.
2022-11-17 08:03:02 -05:00
Philip O'Toole bce3773726 Update expected test output
Broken in https://github.com/mattn/go-sqlite3/pull/1085
2022-10-26 22:03:24 +09:00
Yasuhiro Matsumoto 31c761827c Update amalgamation code 2022-10-26 22:03:24 +09:00
David Vassallo 4b8633cceb
Updating vtable example, "BestIndex" method (#1099)
As it was, the vtable example will give an error when adding any kind of SQL constraint in the SQL statement. Updating the BestIndex method will ensure that adding SQL constraints will not result in errors

Signed-off-by: David Vassallo <davevassallo@gmail.com>

Signed-off-by: David Vassallo <davevassallo@gmail.com>
2022-10-18 19:04:52 -04:00
David Vassallo 0b3708425e
Update README.md to include vtable feature (#1100)
Added documentation for sqlite_vtable build tag to the README.
2022-10-18 18:31:09 -04:00
Luca Guidi 90900be5db Cross Compiling for Mac OS via `musl-cross`
# Enhancement

Update `README.md` with new instructions for Mac OS cross compiling.

# Why?

The current suggested solution `xgo` is no longer maintained (GitHub archived repository).

# Credits

Credits go to Pieter Claerhout (@pieterclaerhout) and his blog post: https://www.yellowduck.be/posts/cross-compile-a-go-package-which-uses-sqlite3
2022-09-18 22:34:48 +09:00
kkqy be28dec3df Golang's linker add mingwex and mingw32 automatically,so we don't need add them manually. 2022-09-18 22:20:58 +09:00
Levi Gruspe 17f6553f94
Add support for sqlite_math_functions tag (#1059)
Add support for SQLITE_ENABLE_MATH_FUNCTIONS compile-time option via the sqlite_math_functions build tag.

Co-authored-by: Dominik Kraus <dominik.kraus@nktek.de>
2022-09-17 10:45:46 -04:00
KiYugadgeter 7476442ed6 こんにちわ is wrong Japanse. The correct word is こんにちは 2022-09-04 18:00:08 +09:00
RewardedIvan da62659c58
Fix "ennviroment" (#1077)
Fix typo in README
2022-09-01 22:47:55 -04:00
Joshua Hull 4ef63c9c0d
Rollback on constraint failure (#1071)
Always rollback on a commit error
2022-09-01 22:45:11 -04:00
Joshua Hull f92b6bb2a1 Fix TestQueryer test to use exec for multistatement insertion 2022-09-02 00:14:06 +09:00
Joshua Hull d5355d86f9 Fix TestQueryer test 2022-09-02 00:14:06 +09:00
Yoshiki Shibukawa c8a114388a Update README to fix reference URL
R.I.P. godoc.org
2022-09-01 11:56:18 +09:00
Oliver Giles f1eef49b3f TestQueryer: actually check Rows returned
Fixes a test which did not correctly exercise the multi-statement
Queryer functionality
2022-08-16 21:24:19 +09:00
Ben Johnson a2e94c9d58 Add build tag to enable OSTRACE() logging
This commit adds the `sqlite_os_trace` build tag which sets the
`SQLITE_FORCE_OS_TRACE` and `SQLITE_DEBUG_OS_TRACE` compilation
flags. This produces verbose debugging output of every operating
system call made by SQLite.
2022-08-16 21:21:55 +09:00
Yasuhiro Matsumoto d8e192b752 Update amalgamation code 2022-08-16 16:16:48 +09:00
Bryan C. Mills 595e13285d Retract +incompatible releases
(For #965.)

This retraction will take effect when this commit is included in the
latest v1 release (presumably v1.14.11).
2022-08-16 14:22:03 +09:00
Aoang fd616a2f47 Update supported Go version to Go 1.19 2022-08-15 15:12:08 +09:00
Phil Eaton 3ccccfb4c9
Support returning any from callbacks (#1046)
Support returning any from callbacks
2022-05-29 21:06:43 -04:00
Kristóf Havasi b819467576 Add error checking in simple example for tx.Commit
Based on https://golang.org/pkg/database/sql/#Tx.Commit this function returns an error type.
So why not check it.
2022-05-28 23:40:45 +09:00
mattn 43dcd3131f Update _example/simple/Dockerfile 2022-05-18 11:53:00 +09:00
KEINOS c122302862 feat: simple example of Dockerfile w/ multi-stage build 2022-05-18 11:53:00 +09:00
Yasuhiro Matsumoto aa1e904220 Update amalgamation code 2022-05-13 11:15:23 +09:00
mattn adb060d295 Update .github/workflows/go.yaml 2022-05-13 10:44:42 +09:00
Aoang a68a2b7fc5 Update supported Golang version to Go 1.18 2022-05-13 10:44:42 +09:00