id,node_id,number,state,locked,title,user,user_label,body,created_at,updated_at,closed_at,merged_at,merge_commit_sha,assignee,assignee_label,milestone,milestone_label,draft,head,base,author_association,repo,repo_label,url,merged_by,merged_by_label,auto_merge
1083804914,PR_kwDOCGYnMM5AmYzy,499,open,0,feat: recreate fts triggers after table transform,7908073,chapmanjacobd,"https://github.com/simonw/sqlite-utils/pull/498

<!-- readthedocs-preview sqlite-utils start -->
----
:books: Documentation preview :books:: https://sqlite-utils--499.org.readthedocs.build/en/499/

<!-- readthedocs-preview sqlite-utils end -->

alternatively, `self.disable_fts()`",2022-10-11T20:35:39Z,2022-10-26T17:54:51Z,,,6c71562a7a21ab93541a14453961ce3d6abca3cc,,,,,0,a25e83841f2703afb08aff4589cb559ae9060776,d792dad1cf5f16525da81b1e162fb71d469995f3,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/499,,,
1105985162,PR_kwDOCGYnMM5B6_6K,508,closed,0,Allow surrogates in parameters,7908073,chapmanjacobd,"closes #507

https://dwheeler.com/essays/fixing-unix-linux-filenames.html

<!-- readthedocs-preview sqlite-utils start -->
----
:books: Documentation preview :books:: https://sqlite-utils--508.org.readthedocs.build/en/508/

<!-- readthedocs-preview sqlite-utils end -->",2022-10-31T22:11:49Z,2022-11-17T15:11:16Z,2022-10-31T22:55:36Z,,3b551597240d9a6058b1c3c720073120db213678,,,,,0,43a8c4c91fc22fb6bea07846f144072b0d047f4e,529110e7d8c4a6b1bbf5fb61f2e29d72aa95a611,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/508,,,
1173049178,PR_kwDOCGYnMM5F609a,519,closed,0,Fixes breaking DEFAULT values,13819005,rhoboro,"Fixes #509, Fixes #336

Thanks for the great library!
I fixed a bug that `sqlite-utils transform` breaks DEFAULT values.
All tests already present passed  with no changes, and I added some tests for this PR.

In #509 case, fixed here.

```shell
$ sqlite3 test.db << EOF
CREATE TABLE mytable (
    col1 TEXT DEFAULT 'foo',
    col2 TEXT DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW'))
)
EOF

$ sqlite3 test.db ""SELECT sql FROM sqlite_master WHERE name = 'mytable';""
CREATE TABLE mytable (
    col1 TEXT DEFAULT 'foo',
    col2 TEXT DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW'))
)

$ sqlite3 test.db ""INSERT INTO mytable DEFAULT VALUES; SELECT * FROM mytable;""
foo|2022-12-21 01:15:39.669

$ sqlite-utils transform test.db mytable --rename col1 renamedcol1
$ sqlite3 test.db ""SELECT sql FROM sqlite_master WHERE name = 'mytable';""
CREATE TABLE ""mytable"" (
   [renamedcol1] TEXT DEFAULT 'foo',
   [col2] TEXT DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW'))  # ← Non-String Value
)

$ sqlite3 test.db ""INSERT INTO mytable DEFAULT VALUES; SELECT * FROM mytable;""
foo|2022-12-21 01:15:39.669
foo|2022-12-21 01:15:56.432
```

And #336 case also fixed.
Special values are described [here](https://www.sqlite.org/lang_createtable.html).

> 3.2. The DEFAULT clause
> ... A default value may also be one of the special case-independent keywords CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP.

```shell
$ echo 'create table bar (baz text, created_at timestamp default CURRENT_TIMESTAMP)' | sqlite3 foo.db
$ sqlite3 foo.db
SQLite version 3.39.5 2022-10-14 20:58:05
Enter "".help"" for usage hints.
sqlite> .schema bar
CREATE TABLE bar (baz text, created_at timestamp default CURRENT_TIMESTAMP);
sqlite> .exit

$ sqlite-utils transform foo.db bar --column-order baz
$ sqlite3 foo.db
SQLite version 3.39.5 2022-10-14 20:58:05
Enter "".help"" for usage hints.
sqlite> .schema bar
CREATE TABLE IF NOT EXISTS ""bar"" (
   [baz] TEXT,
   [created_at] FLOAT DEFAULT CURRENT_TIMESTAMP
);
sqlite> .exit

$ sqlite-utils transform foo.db bar --column-order baz
$ sqlite3 foo.db
SQLite version 3.39.5 2022-10-14 20:58:05
Enter "".help"" for usage hints.
sqlite> .schema bar
CREATE TABLE IF NOT EXISTS ""bar"" (
   [baz] TEXT,
   [created_at] FLOAT DEFAULT CURRENT_TIMESTAMP  # ← Non-String Value
);
```


<!-- readthedocs-preview sqlite-utils start -->
----
:books: Documentation preview :books:: https://sqlite-utils--519.org.readthedocs.build/en/519/

<!-- readthedocs-preview sqlite-utils end -->",2022-12-21T01:27:52Z,2023-05-08T21:13:37Z,2023-05-08T21:13:37Z,2023-05-08T21:13:37Z,6500fed8b2085869b9714ce3a08c30f61dc829ad,,,,,0,5e5c262fab69eb3c470afa57fc52d3d7d8beee7a,fc221f9b62ed8624b1d2098e564f525c84497969,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/519,,,
1445438054,PR_kwDOCGYnMM5WJ6Jm,573,closed,0,feat: Implement a prepare_connection plugin hook,15178711,asg017,"Just like the [Datasette prepare_connection hook](https://docs.datasette.io/en/stable/plugin_hooks.html#prepare-connection-conn-database-datasette), this PR adds a similar hook for the `sqlite-utils` plugin system. 

The sole argument is `conn`, since I don't believe a `database` or `datasette` argument would be relevant here. 

I want to do this so I can release `sqlite-utils` plugins for my [SQLite extensions](https://github.com/asg017/sqlite-ecosystem), similar to the Datasette plugins I've release for them. 

An example plugin: https://gist.github.com/asg017/d7cdf0d56e2be87efda28cebee27fa3c

```bash
$ sqlite-utils install https://gist.github.com/asg017/d7cdf0d56e2be87efda28cebee27fa3c/archive/5f5ad549a40860787629c69ca120a08c32519e99.zip

$ sqlite-utils memory 'select hello(""alex"") as response'
[{""response"": ""Hello, alex!""}]
```
Refs:
- #574 

<!-- readthedocs-preview sqlite-utils start -->
----
:books: Documentation preview :books:: https://sqlite-utils--573.org.readthedocs.build/en/573/

<!-- readthedocs-preview sqlite-utils end -->",2023-07-22T22:48:44Z,2023-07-22T22:59:09Z,2023-07-22T22:59:09Z,2023-07-22T22:59:09Z,3f80a026983d3e634f05a46f2a6da162b5139dd9,,,,,0,faf398fe075f60929337d3cd0f12309fc4229a3c,091c63cfbf7b40e99e2017a3c37619c7689cc447,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/573,,,
593805804,MDExOlB1bGxSZXF1ZXN0NTkzODA1ODA0,247,closed,0,FTS quote functionality from datasette,16001974,DeNeutoy,"Addresses #246 - this is a bit of a kludge because it doesn't actually *validate* the FTS string, just makes sure that it will not crash when executed, but I figured that building a query parser is a bit out of the scope of sqlite-utils and if you actually want to use the query language, you probably need to parse that yourself.
",2021-03-16T11:17:34Z,2021-08-18T18:43:12Z,2021-08-18T18:43:12Z,2021-08-18T18:43:11Z,53fec0d8639d2a66e322d05e1fcc8f34caa57815,,,,,0,af989af658e23be0077f226292594226103b063d,1fe73c898b44695052f1a9ca832818d50cecf662,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/247,,,
1608050242,PR_kwDOCGYnMM5f2OZC,604,closed,0,Add more STRICT table support,16437338,tkhattra,"- https://github.com/simonw/sqlite-utils/issues/344#issuecomment-982014776

Make `table.transform()` preserve STRICT mode.

<!-- readthedocs-preview sqlite-utils start -->
----
:books: Documentation preview :books:: https://sqlite-utils--604.org.readthedocs.build/en/604/

<!-- readthedocs-preview sqlite-utils end -->",2023-11-19T19:38:53Z,2023-12-08T05:17:20Z,2023-12-08T05:05:27Z,2023-12-08T05:05:27Z,1500c19bd0f31b2e7f28a5ec2d7bfa133a2e4d4c,,,,,0,61c6e26cf922c70b65b161473723ff9d869a04a5,9286c1ba432e890b1bb4b2a1f847b15364c1fa18,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/604,,,
395258687,MDExOlB1bGxSZXF1ZXN0Mzk1MjU4Njg3,96,closed,0,Add type conversion for Panda's Timestamp,32605365,b0b5h4rp13,"Add type conversion for Panda's Timestamp, if Panda library is present in system
(thanks for this project, I was about to do the same thing from scratch)",2020-03-29T14:13:09Z,2020-03-31T04:40:49Z,2020-03-31T04:40:48Z,2020-03-31T04:40:48Z,8ea626e5fcdc4c9e52f615c6347e68173805f8b4,,,,,0,16ebbd2d494caabd0eeb502f8a944614b464bb12,22250a9c735077d6f365b73bf824e6c67b122c83,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/96,,,
1586779743,PR_kwDOCGYnMM5elFZf,600,closed,0,Add spatialite arm64 linux path,37802088,MikeCoats,"According to both [Debian](https://packages.debian.org/bookworm/arm64/libsqlite3-mod-spatialite/filelist) and [Ubuntu](https://packages.ubuntu.com/mantic/arm64/libsqlite3-mod-spatialite/filelist), the correct “target triple” for arm64 is `aarch64-linux-gnu`, so we should be looking in `/usr/lib/aarch64-linux-gnu` for `mod_spatialite.so`.

I can confirm that on both of my Debian arm64 SBCs, `libsqlite3-mod-spatialite` installs to that path.

```
$ ls -l /usr/lib/*/*spatial*
lrwxrwxrwx 1 root root      23 Dec  1  2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so -> mod_spatialite.so.7.1.0
lrwxrwxrwx 1 root root      23 Dec  1  2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so.7 -> mod_spatialite.so.7.1.0
-rw-r--r-- 1 root root 7348584 Dec  1  2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so.7.1.0
```

This is a set of before and after snippets of pytest’s output for this PR.

### Before

```
$ pytest
tests/test_get.py ......                                                 [ 73%]
tests/test_gis.py ssssssssssss                                           [ 75%]
tests/test_hypothesis.py ....                                            [ 75%]
```

### After

```
$ pytest
tests/test_get.py ......                                                 [ 73%]
tests/test_gis.py ............                                           [ 75%]
tests/test_hypothesis.py ....                                            [ 75%]
```


Issue: #599

<!-- readthedocs-preview sqlite-utils start -->
----
:books: Documentation preview :books:: https://sqlite-utils--600.org.readthedocs.build/en/600/

<!-- readthedocs-preview sqlite-utils end -->",2023-11-03T22:23:26Z,2023-11-04T00:34:33Z,2023-11-04T00:31:49Z,2023-11-04T00:31:49Z,b92ea4793ce4dcb73cf762aae634ab72f65ec50f,,,,,0,b1a60766a4150268557c4445297087a3f076be01,622c3a5a7dd53a09c029e2af40c2643fe7579340,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/600,,,
560204306,MDExOlB1bGxSZXF1ZXN0NTYwMjA0MzA2,224,closed,0,Add fts offset docs.,37962604,polyrand,"The limit can be passed as a string to the query builder to have an offset. I have tested it using the shorthand `limit=f""15, 30""`, the standard syntax should work too.",2021-01-22T20:50:58Z,2021-02-14T19:31:06Z,2021-02-14T19:31:06Z,,4d6ff040770119fb2c1bcbc97678d9deca752f2f,,,,,0,341f50d2d95ba1d69ad64ba8c0ec0ffa9a68d063,36dc7e3909a44878681c266b90f9be76ac749f2d,NONE,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/224,,,
1050417981,PR_kwDOCGYnMM4-nBs9,486,closed,0,"progressbar for inserts/upserts of all fileformats, closes #485",99098079,MischaU8,"

<!-- readthedocs-preview sqlite-utils start -->
----
:books: Documentation preview :books:: https://sqlite-utils--486.org.readthedocs.build/en/486/

<!-- readthedocs-preview sqlite-utils end -->",2022-09-08T14:58:02Z,2022-09-15T20:40:03Z,2022-09-15T20:37:51Z,2022-09-15T20:37:51Z,0b315d3fa83c1584eaeec32f24912898621e437a,,,,,0,d5db749480aaf8518e611ff55da186cadf6c63bc,d9b9e075f07a20f1137cd2e34ed5d3f1a3db4ad8,CONTRIBUTOR,140912432,sqlite-utils,https://github.com/simonw/sqlite-utils/pull/486,,,