File: changes.html

package info (click to toggle)
python-apsw 3.46.0.1-1
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,684 kB
  • sloc: python: 13,125; ansic: 12,334; javascript: 911; makefile: 10; sh: 7
file content (2209 lines) | stat: -rw-r--r-- 198,210 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./">
<head>
  <meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Change History &mdash; APSW 3.46.0.1 documentation</title>
      <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=72bcf2f2" />
      <link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
      <link rel="stylesheet" type="text/css" href="_static/apsw.css?v=3c7e2631" />

  
    <link rel="shortcut icon" href="_static/favicon.ico"/>
  <!--[if lt IE 9]>
    <script src="_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
        <script src="_static/jquery.js?v=5d32c60e"></script>
        <script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
        <script src="_static/documentation_options.js?v=d98f5d2b"></script>
        <script src="_static/doctools.js?v=9a2dae69"></script>
        <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
    <script src="_static/js/theme.js"></script>
    <link rel="author" title="About these documents" href="about.html" />
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="copyright" title="Copyright" href="copyright.html" />
    <link rel="prev" title="Copyright and License" href="copyright.html" /> 
</head>

<body class="wy-body-for-nav"> 
  <div class="wy-grid-for-nav">
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search" >

          
          
          <a href="index.html" class="icon icon-home">
            APSW
              <img src="_static/apswlogo.png" class="logo" alt="Logo"/>
          </a>
              <div class="version">
                3.46.0.1
              </div>
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
        </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="about.html">About</a></li>
<li class="toctree-l1"><a class="reference internal" href="tips.html">Tips</a></li>
<li class="toctree-l1"><a class="reference internal" href="example.html">Example/Tour</a></li>
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation and customization</a></li>
<li class="toctree-l1"><a class="reference internal" href="extensions.html">Extensions</a></li>
<li class="toctree-l1"><a class="reference internal" href="apsw.html">APSW Module</a></li>
<li class="toctree-l1"><a class="reference internal" href="connection.html">Connections to a database</a></li>
<li class="toctree-l1"><a class="reference internal" href="cursor.html">Cursors (executing SQL)</a></li>
<li class="toctree-l1"><a class="reference internal" href="blob.html">Blob Input/Output</a></li>
<li class="toctree-l1"><a class="reference internal" href="backup.html">Backup</a></li>
<li class="toctree-l1"><a class="reference internal" href="vtable.html">Virtual Tables</a></li>
<li class="toctree-l1"><a class="reference internal" href="vfs.html">Virtual File System (VFS)</a></li>
<li class="toctree-l1"><a class="reference internal" href="shell.html">Shell</a></li>
<li class="toctree-l1"><a class="reference internal" href="bestpractice.html">Best Practice</a></li>
<li class="toctree-l1"><a class="reference internal" href="ext.html">Various interesting and useful bits of functionality</a></li>
<li class="toctree-l1"><a class="reference internal" href="exceptions.html">Exceptions and Errors</a></li>
<li class="toctree-l1"><a class="reference internal" href="execution.html">Execution and tracing</a></li>
<li class="toctree-l1"><a class="reference internal" href="dbapi.html">DBAPI notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="pysqlite.html">sqlite3 module differences</a></li>
<li class="toctree-l1"><a class="reference internal" href="benchmarking.html">Benchmarking</a></li>
<li class="toctree-l1"><a class="reference internal" href="copyright.html">Copyright and License</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Change History</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#apsw-changes-by-version">APSW changes by version</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#id1">3.46.0.1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id2">3.46.0.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id3">3.45.3.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id4">3.45.2.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id5">3.45.1.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id6">3.45.0.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id7">3.44.2.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id8">3.44.0.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id9">3.43.2.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id10">3.43.1.1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id11">3.43.1.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id12">3.43.0.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id13">3.42.0.1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id14">3.42.0.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id15">3.41.2.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id16">3.41.0.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id17">3.40.1.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id18">3.40.0.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id19">3.39.4.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id20">3.39.3.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id21">3.39.2.1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id22">3.39.2.0</a></li>
<li class="toctree-l3"><a class="reference internal" href="#r1">3.38.5-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id23">3.38.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id24">3.37.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id25">3.36.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id26">3.35.4-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id27">3.34.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id28">3.33.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id29">3.32.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id30">3.31.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id31">3.30.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id32">3.29.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id33">3.28.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id34">3.27.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id35">3.26.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id36">3.25.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id37">3.24.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id38">3.23.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id39">3.22.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id40">3.21.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id41">3.20.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id42">3.19.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id43">3.18.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id44">3.17.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id45">3.16.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id46">3.15.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id47">3.15.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id48">3.15.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id49">3.14.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id50">3.13.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id51">3.12.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id52">3.11.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id53">3.11.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id54">3.9.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id55">3.8.11.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id56">3.8.10.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id57">3.8.9-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id58">3.8.8.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id59">3.8.8.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id60">3.8.7.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id61">3.8.7.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id62">3.8.7.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id63">3.8.6-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id64">3.8.5-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id65">3.8.4.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id66">3.8.4.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id67">3.8.4.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id68">3.8.3.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id69">3.8.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id70">3.8.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id71">3.8.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id72">3.8.0.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id73">3.8.0.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#r2">3.8.0-r2</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id74">3.8.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id75">3.7.17-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id76">3.7.16.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id77">3.7.16.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id78">3.7.16-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id79">3.7.15.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id80">3.7.15.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id81">3.7.15-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id82">3.7.14.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id83">3.7.14-r2</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id84">3.7.14-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id85">3.7.13-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id86">3.7.12.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id87">3.7.12-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id88">3.7.11-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id89">3.7.10-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id90">3.7.9-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id91">3.7.8-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id92">3.7.7.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id93">3.7.6.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id94">3.7.6.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id95">3.7.5-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id96">3.7.4-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id97">3.7.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id98">3.7.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id99">3.7.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id100">3.7.0.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id101">3.7.0-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id102">3.6.23.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id103">3.6.23-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id104">3.6.22-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id105">3.6.21-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id106">3.6.20-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id107">3.6.19-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id108">3.6.18-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id109">3.6.17-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id110">3.6.16-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id111">3.6.15-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id112">3.6.14.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id113">3.6.14.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id114">3.6.13-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id115">3.6.11-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id116">3.6.10-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id117">3.6.6.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id118">3.6.5-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id119">3.6.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id120">3.5.9-r2</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id121">3.5.9-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id122">3.3.13-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id123">3.3.10-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id124">3.3.9-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id126">3.3.8-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id127">3.3.7-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id128">3.3.5-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id129">3.2.7-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id130">3.2.2-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id131">3.2.1-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id132">3.1.3-r1</a></li>
<li class="toctree-l3"><a class="reference internal" href="#r3">3.0.8-r3</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id133">3.0.8-r2</a></li>
<li class="toctree-l3"><a class="reference internal" href="#id134">3.0.8-r1</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#renaming">Renaming</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="py-modindex.html">Module Index</a></li>
<li class="toctree-l1"><a class="reference internal" href="genindex.html">Index</a></li>
</ul>

        </div>
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="index.html">APSW</a>
      </nav>

      <div class="wy-nav-content">
        <div class="rst-content style-external-links">
          <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
      <li class="breadcrumb-item active">Change History</li>
      <li class="wy-breadcrumbs-aside">
            <a href="_sources/changes.rst.txt" rel="nofollow"> View page source</a>
      </li>
  </ul><div class="rst-breadcrumbs-buttons" role="navigation" aria-label="Sequential page navigation">
        <a href="copyright.html" class="btn btn-neutral float-left" title="Copyright and License" accesskey="p"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
  </div>
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
             
  <section id="change-history">
<h1>Change History<a class="headerlink" href="#change-history" title="Link to this heading"></a></h1>
<p>You may also be interested in the <a class="reference external" href="https://www.sqlite.org/chronology.html">SQLite release history</a> and <a class="reference external" href="https://devguide.python.org/versions/">Python release
history</a>.</p>
<section id="apsw-changes-by-version">
<h2>APSW changes by version<a class="headerlink" href="#apsw-changes-by-version" title="Link to this heading"></a></h2>
<section id="id1">
<h3>3.46.0.1<a class="headerlink" href="#id1" title="Link to this heading"></a></h3>
<p><a class="reference internal" href="ext.html#apsw.ext.query_info" title="apsw.ext.query_info"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.ext.query_info()</span></code></a> provides the count and names of bindings
parameters.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/528">APSW issue 528</a>)</p>
<p>Address how errors are handled in VFS xRandomness routine, that is
only called once by SQLite to seed its random number generator.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/526">APSW issue 526</a>)</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.vfsname" title="apsw.Connection.vfsname"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.vfsname()</span></code></a> and updated corresponding shell
command to get the diagnostic names of the vfs stack for the
connection.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/525">APSW issue 525</a>)</p>
<p>Do not cache <a class="reference internal" href="connection.html#apsw.Connection.pragma" title="apsw.Connection.pragma"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.pragma()</span></code></a> statements to avoid encryption
keys, or pragmas that run during prepare from being retained.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/522">APSW issue 522</a>)</p>
<p><a class="reference internal" href="connection.html#apsw.Connection.pragma" title="apsw.Connection.pragma"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.pragma()</span></code></a> adds keyword <code class="docutils literal notranslate"><span class="pre">schema</span></code> argument to run
pragma against attached databases.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/524">APSW issue 524</a>)</p>
</section>
<section id="id2">
<h3>3.46.0.0<a class="headerlink" href="#id2" title="Link to this heading"></a></h3>
<p>Adjusted <a class="reference external" href="https://docs.python.org/3/library/logging.html#levels">levels</a> in
<a class="reference internal" href="ext.html#apsw.ext.log_sqlite" title="apsw.ext.log_sqlite"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.ext.log_sqlite()</span></code></a> to be lower for some SQLite messages like
<cite>SQLITE_SCHEMA</cite> and <cite>SQLITE_NOTICE_RECOVER_WAL</cite> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/518">APSW issue 518</a>)</p>
<p>Previous source releases were signed with <a class="reference external" href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy">PGP</a>.  Starting with
this release <a class="reference external" href="https://www.sigstore.dev/">Sigstore’s</a> <a class="reference external" href="https://docs.sigstore.dev/signing/quickstart/">cosign tool</a> is used
(<a class="reference internal" href="install.html#verifydownload"><span class="std std-ref">instructions</span></a>). (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/512">APSW issue 512</a>)</p>
</section>
<section id="id3">
<h3>3.45.3.0<a class="headerlink" href="#id3" title="Link to this heading"></a></h3>
<p>No APSW changes.</p>
</section>
<section id="id4">
<h3>3.45.2.0<a class="headerlink" href="#id4" title="Link to this heading"></a></h3>
<p>Minor doc and tests change due to changed behaviour of
<a class="reference external" href="https://sqlite.org/c3ref/serialize.html">sqlite3_serialize</a> on an
empty database, used by <a class="reference internal" href="connection.html#apsw.Connection.serialize" title="apsw.Connection.serialize"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.serialize()</span></code></a>.</p>
</section>
<section id="id5">
<h3>3.45.1.0<a class="headerlink" href="#id5" title="Link to this heading"></a></h3>
<p>No APSW changes.</p>
</section>
<section id="id6">
<h3>3.45.0.0<a class="headerlink" href="#id6" title="Link to this heading"></a></h3>
<p>Correctly handle NULL/None VFS filenames (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/506">APSW issue 506</a>)</p>
</section>
<section id="id7">
<h3>3.44.2.0<a class="headerlink" href="#id7" title="Link to this heading"></a></h3>
<p>Added <cite>logger</cite> parameter to <a class="reference internal" href="ext.html#apsw.ext.log_sqlite" title="apsw.ext.log_sqlite"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.ext.log_sqlite()</span></code></a> to use a
specific <a class="reference external" href="https://docs.python.org/3/library/logging.html#logging.Logger" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">logging.Logger</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/493">APSW issue 493</a>)</p>
<p>Added <a class="reference internal" href="ext.html#apsw.ext.result_string" title="apsw.ext.result_string"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.ext.result_string()</span></code></a> to turn an result code into
a string, taking into account if it is extended or not.</p>
<p>Provide detail when C implemented objects are printed. For example
<a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">connections</span></code></a> include the filename.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/494">APSW issue 494</a>)</p>
<p>Added <a class="reference internal" href="vfs.html#apsw.URIFilename.parameters" title="apsw.URIFilename.parameters"><code class="xref py py-meth docutils literal notranslate"><span class="pre">URIFilename.parameters()</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/496">APSW issue 496</a>)</p>
<p><a class="reference internal" href="vfs.html#apsw.URIFilename" title="apsw.URIFilename"><code class="xref py py-class docutils literal notranslate"><span class="pre">URIFilename</span></code></a> are only valid for the duration of the
<a class="reference internal" href="vfs.html#apsw.VFS.xOpen" title="apsw.VFS.xOpen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFS.xOpen()</span></code></a> call.  If you save and use the object later you will
get an exception.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/501">APSW issue 501</a>)</p>
</section>
<section id="id8">
<h3>3.44.0.0<a class="headerlink" href="#id8" title="Link to this heading"></a></h3>
<p>Added virtual table <a class="reference internal" href="vtable.html#apsw.VTTable.Integrity" title="apsw.VTTable.Integrity"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTTable.Integrity()</span></code></a> support.</p>
<p>On 64 bit platforms with the amalgamation, <a class="reference external" href="https://www.sqlite.org/mmap.html">SQLITE_MAX_MMAP_SIZE</a> is set to 256 terabytes.
SQLite’s default limit is 2GB.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/491">APSW issue 491</a>)</p>
</section>
<section id="id9">
<h3>3.43.2.0<a class="headerlink" href="#id9" title="Link to this heading"></a></h3>
<p><a class="reference internal" href="connection.html#apsw.Connection.create_aggregate_function" title="apsw.Connection.create_aggregate_function"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_aggregate_function()</span></code></a> can take a class with step
and final methods. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/421">APSW issue 421</a>)</p>
<p>Corrected non <span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0008/"><strong>PEP 8</strong></a> <a class="reference internal" href="#renaming"><span class="std std-ref">compliant names</span></a>.  The old
names remain as aliases to the new ones, and your code will not break.</p>
</section>
<section id="id10">
<h3>3.43.1.1<a class="headerlink" href="#id10" title="Link to this heading"></a></h3>
<p><a class="reference internal" href="exceptions.html"><span class="doc">Exception</span></a> handling has been updated, with multiple
exceptions in the same SQLite control flow being chained together.
Previously more would have used the <a class="reference internal" href="exceptions.html#unraisable"><span class="std std-ref">unraisable</span></a>
mechanism.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/489">APSW issue 489</a>)</p>
<p>Only use alloca with msvc because it doesn’t support <a class="reference external" href="https://en.wikipedia.org/wiki/Variable-length_array">VLA</a>.  The arrays
are used for fastcall. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/487">APSW issue 487</a>)</p>
</section>
<section id="id11">
<h3>3.43.1.0<a class="headerlink" href="#id11" title="Link to this heading"></a></h3>
<p>All C code calling into Python and all C code called by Python uses
vectorcall / fastcall (see <span class="target" id="index-1"></span><a class="pep reference external" href="https://peps.python.org/pep-0590/"><strong>PEP 590</strong></a>) which reduces the overhead of
passing and receiving positional and keyword arguments. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/477">APSW issue 477</a>,
<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/446">APSW issue 446</a>):</p>
<ul class="simple">
<li><p>Conversion of arguments from Python values to C values drops generic
<a class="reference external" href="https://docs.python.org/3/c-api/arg.html#c.PyArg_ParseTupleAndKeywords">PyArg_ParseTupleAndKeywords</a>
in favour of direct processing which is more efficient and allows
better exception messages.</p></li>
<li><p>Running <a class="reference internal" href="benchmarking.html#speedtest"><span class="std std-ref">speedtest</span></a> with a VFS that inherits all methods went
from being 17% slower than pure SQLite to 2% slower.</p></li>
<li><p>A <a class="reference external" href="https://github.com/rogerbinns/apsw/blob/master/tools/vtbench.py">virtual table benchmark</a> takes 35%
less time.  (Remember that benchmarks are best case!)</p></li>
</ul>
<p>The <a class="reference internal" href="shell.html"><span class="doc">shell</span></a> JSON output modes have been fixed.  Mode
‘json’ outputs a json array, while mode ‘jsonl’ does newline delimited
json objects, aka <a class="reference external" href="https://jsonlines.org/">json lines</a>.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/483">APSW issue 483</a>)</p>
</section>
<section id="id12">
<h3>3.43.0.0<a class="headerlink" href="#id12" title="Link to this heading"></a></h3>
<p>This is the last version that supports Python 3.6 and Python 3.7 (both
end of life).  The policy as stated in the <a class="reference internal" href="about.html"><span class="doc">about</span></a> page
is that there will be one more APSW release after a Python version
goes end of life supporting that Python version.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/471">APSW issue 471</a>)</p>
<p>Added <a class="reference internal" href="bestpractice.html"><span class="doc">best practice</span></a> module (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/460">APSW issue 460</a>)</p>
<p><a class="reference internal" href="ext.html#apsw.ext.log_sqlite" title="apsw.ext.log_sqlite"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.log_sqlite()</span></code></a> outputs SQLite warnings at warning level.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/472">APSW issue 472</a>)</p>
<p><a class="reference external" href="https://sqlite.org/c3ref/stmt_explain.html">sqlite3_stmt_explain</a>
is wrapped available as a <cite>explain</cite> keyword parameter on
execute/executemany methods. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/474">APSW issue 474</a>)</p>
<p>Added documentation and <a class="reference internal" href="vfs.html#apsw.VFSFcntlPragma" title="apsw.VFSFcntlPragma"><code class="xref py py-class docutils literal notranslate"><span class="pre">helper</span> <span class="pre">class</span></code></a> for
implementing custom <a class="reference external" href="https://sqlite.org/pragma.html">pragmas</a> in
your own <a class="reference internal" href="vfs.html#vfs"><span class="std std-ref">Virtual File System (VFS)</span></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/464">APSW issue 464</a>)</p>
<p>Reduced overhead of the Column method when using
<a class="reference internal" href="ext.html#apsw.ext.make_virtual_module" title="apsw.ext.make_virtual_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.make_virtual_module()</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/465">APSW issue 465</a>)</p>
</section>
<section id="id13">
<h3>3.42.0.1<a class="headerlink" href="#id13" title="Link to this heading"></a></h3>
<p>Work with SQLite compiled with <a class="reference external" href="https://www.sqlite.org/compile.html#omit_deprecated">SQLITE_OMIT_DEPRECATED</a>.
<a class="reference internal" href="connection.html#apsw.Connection.set_profile" title="apsw.Connection.set_profile"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_profile()</span></code></a> was changed from using the deprecated
<a class="reference external" href="https://sqlite.org/c3ref/profile.html">sqlite3_profile</a> to
<a class="reference external" href="https://sqlite.org/c3ref/trace_v2.html">sqlite3_trace_v2</a> giving
the same results.  When including the amalgamation,
SQLITE_OMIT_DEPRECATED is defined. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/443">APSW issue 443</a>)</p>
<p><a class="reference internal" href="shell.html"><span class="doc">Shell</span></a> updates adding <a class="reference internal" href="shell.html#shell-commands"><span class="std std-ref">various commands</span></a>
to match the SQLite shell, as well as code and documentation
improvements. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/397">APSW issue 397</a>)</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.read" title="apsw.Connection.read"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.read()</span></code></a> and <a class="reference internal" href="ext.html#apsw.ext.dbinfo" title="apsw.ext.dbinfo"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.ext.dbinfo()</span></code></a> to provide
information from the database and journal/wal files.  The shell
command <a class="reference internal" href="shell.html#shell-cmd-dbinfo"><span class="std std-ref">.dbinfo</span></a> displays it.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.vfs_details" title="apsw.vfs_details"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.vfs_details()</span></code></a>.  The shell command
<a class="reference internal" href="shell.html#shell-cmd-vfslist"><span class="std std-ref">.vfslist</span></a> displays it.</p>
<p>Implemented <a class="reference external" href="https://sqlite.org/c3ref/vfs.html">VFS method xCurrentTimeInt64</a>.  The default SQLite VFS no
longer provide <code class="docutils literal notranslate"><span class="pre">xCurrentTime</span></code> (floating point version) if
<code class="docutils literal notranslate"><span class="pre">SQLITE_OMIT_DEPRECATED</span></code> is defined, so this is needed for
inheritance to work. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/451">APSW issue 451</a>)</p>
<p><strong>Backwards incompatible change</strong>: <em>VFS</em> If you override
<code class="docutils literal notranslate"><span class="pre">xCurrentTime</span></code>, then you will need to override <code class="docutils literal notranslate"><span class="pre">xCurrentTimeInt64</span></code>
in the same way, or <code class="docutils literal notranslate"><span class="pre">exclude</span></code> <code class="docutils literal notranslate"><span class="pre">xCurrentTimeInt64</span></code> in <a class="reference internal" href="vfs.html#apsw.VFS" title="apsw.VFS"><code class="xref py py-class docutils literal notranslate"><span class="pre">VFS</span></code></a>,
or use <code class="docutils literal notranslate"><span class="pre">iVersion</span></code> of <code class="docutils literal notranslate"><span class="pre">1</span></code>.</p>
<p><a class="reference internal" href="benchmarking.html#speedtest"><span class="std std-ref">speedtest</span></a> now shows summary statistics, and improved help text.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/444">APSW issue 444</a>)</p>
</section>
<section id="id14">
<h3>3.42.0.0<a class="headerlink" href="#id14" title="Link to this heading"></a></h3>
<p><a class="reference external" href="https://www.sqlite.org/compile.html#enable_column_metadata">SQLITE_ENABLE_COLUMN_METADATA</a> is
enabled when installing  APSW from <a class="reference external" href="https://pypi.org/project/apsw/">PyPI</a>
(binary or source). (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/435">APSW issue 435</a>)</p>
<p><a class="reference internal" href="apsw.html#type-stubs"><span class="std std-ref">Type stubs</span></a> and typing information in the
documentation use newer Python conventions such as <cite>|</cite> instead of
<cite>Union</cite> and <cite>list</cite> instead of <cite>typing.List</cite>, being more concise and
readable.  (A recent Python is required to use them, but they have no
effect at runtime.)  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/438">APSW issue 438</a>)</p>
<p>Shell: Errors when SQLite are preparing a statement now show the
relevant extract of the query, and where the error was detected.</p>
<p>Shell: Output modes table (ASCII line drawing, lots of sanitization),
box (Unicode line drawing) and qbox (box with quoted values) available.
Python 3.7+ (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/420">APSW issue 420</a>)</p>
<p>Shell: if started interactively then box is the default mode (list remains
the default in non-interactive)</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.pragma" title="apsw.Connection.pragma"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.pragma()</span></code></a> to execute pragmas
and get results. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/432">APSW issue 432</a>)</p>
<p>Added <a class="reference internal" href="cursor.html#apsw.Cursor.get" title="apsw.Cursor.get"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.get</span></code></a> returning query results with the
least amount of structure.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/389">APSW issue 389</a>)</p>
<p>Fixed execution tracers should return comment text for comment
only queries, and add <a class="reference internal" href="cursor.html#apsw.Cursor.has_vdbe" title="apsw.Cursor.has_vdbe"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.has_vdbe</span></code></a>. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/433">APSW issue 433</a>)</p>
<p>Ensure that all applicable options are implemented for
<a class="reference internal" href="apsw.html#apsw.config" title="apsw.config"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.config()</span></code></a>, <a class="reference internal" href="connection.html#apsw.Connection.config" title="apsw.Connection.config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.config()</span></code></a> and similar.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/431">APSW issue 431</a>)</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.sleep" title="apsw.sleep"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.sleep()</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/419">APSW issue 419</a>)</p>
<p>Strings for <a class="reference internal" href="vfs.html#apsw.VFS.xNextSystemCall" title="apsw.VFS.xNextSystemCall"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.VFS.xNextSystemCall()</span></code></a> are <a class="reference external" href="https://docs.python.org/3/c-api/unicode.html#c.PyUnicode_InternInPlace">interned</a>
avoiding memory leaks. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/430">APSW issue 430</a>)</p>
<p>Detect unbound recursion not handled by CPython, and handle better.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/425">APSW issue 425</a>)</p>
</section>
<section id="id15">
<h3>3.41.2.0<a class="headerlink" href="#id15" title="Link to this heading"></a></h3>
<p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/412">APSW issue 412</a> in <a class="reference internal" href="ext.html#apsw.ext.make_virtual_module" title="apsw.ext.make_virtual_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.make_virtual_module()</span></code></a>.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.connections" title="apsw.connections"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.connections()</span></code></a> to get all connections. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/416">APSW issue 416</a>)</p>
<p><a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.unraisablehook" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.unraisablehook()</span></code></a> is called correctly (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/410">APSW issue 410</a>)</p>
<p>Be stricter where <a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a> values are expected (eg
<a class="reference internal" href="vtable.html#apsw.VTTable.BestIndex" title="apsw.VTTable.BestIndex"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTTable.BestIndex()</span></code></a>), only accepting <a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> and
<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a>.  Previously you could for example supply strings and
lists, which were almost certainly unintended errors.</p>
</section>
<section id="id16">
<h3>3.41.0.0<a class="headerlink" href="#id16" title="Link to this heading"></a></h3>
<p><strong>Backwards incompatible change</strong>:  Bindings using a dictionary with a
missing key now result in a <a class="reference external" href="https://docs.python.org/3/library/exceptions.html#KeyError" title="(in Python v3.12)"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyError</span></code></a> exception.  You can use
<a class="reference internal" href="apsw.html#apsw.allow_missing_dict_bindings" title="apsw.allow_missing_dict_bindings"><code class="xref py py-meth docutils literal notranslate"><span class="pre">allow_missing_dict_bindings()</span></code></a> to restore the old behaviour.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/392">APSW issue 392</a>)</p>
<p>Virtual table updates:</p>
<ul class="simple">
<li><p><a class="reference internal" href="vtable.html#apsw.VTTable.BestIndexObject" title="apsw.VTTable.BestIndexObject"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTTable.BestIndexObject()</span></code></a> is now available which provides
<a class="reference internal" href="vtable.html#apsw.IndexInfo" title="apsw.IndexInfo"><code class="xref py py-class docutils literal notranslate"><span class="pre">IndexInfo</span></code></a> exposing full control (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/332">APSW issue 332</a>, <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/329">APSW issue 329</a>,
<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/278">APSW issue 278</a>, <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/188">APSW issue 188</a>)</p></li>
<li><p><a class="reference internal" href="vtable.html#apsw.IndexInfo.set_aConstraintUsage_in" title="apsw.IndexInfo.set_aConstraintUsage_in"><code class="xref py py-meth docutils literal notranslate"><span class="pre">IndexInfo.set_aConstraintUsage_in()</span></code></a> can have <em>in</em> values
passed all at once to <a class="reference internal" href="vtable.html#apsw.VTCursor.Filter" title="apsw.VTCursor.Filter"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTCursor.Filter()</span></code></a></p></li>
<li><p>Exceptions in <a class="reference internal" href="vtable.html#apsw.VTTable.FindFunction" title="apsw.VTTable.FindFunction"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTTable.FindFunction()</span></code></a> are now reported as
an <a class="reference internal" href="exceptions.html#unraisable"><span class="std std-ref">unraisable exception</span></a> because it isn’t
possible to tell SQLite about the error.</p></li>
<li><p><a class="reference internal" href="vtable.html#apsw.VTTable.FindFunction" title="apsw.VTTable.FindFunction"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTTable.FindFunction()</span></code></a> can now return (int, callable)
to allow for virtual table specific function overloads. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/269">APSW issue 269</a>)</p></li>
<li><p>Added <a class="reference internal" href="connection.html#apsw.Connection.vtab_config" title="apsw.Connection.vtab_config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.vtab_config()</span></code></a> and
<a class="reference internal" href="connection.html#apsw.Connection.vtab_on_conflict" title="apsw.Connection.vtab_on_conflict"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.vtab_on_conflict()</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/189">APSW issue 189</a>, <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/190">APSW issue 190</a>)</p></li>
<li><p><a class="reference internal" href="connection.html#apsw.Connection.create_module" title="apsw.Connection.create_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_module()</span></code></a> lets you have <a class="reference external" href="https://sqlite.org/vtab.html#eponymous_virtual_tables">eponymous</a>,
<a class="reference external" href="https://sqlite.org/vtab.html#eponymous_only_virtual_tables">eponymous_only</a>, and
read_only modules. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/196">APSW issue 196</a>)</p></li>
<li><p>Virtual table updates can avoid having to provide all column
values when only a subset are changing.  See <a class="reference internal" href="apsw.html#apsw.no_change" title="apsw.no_change"><code class="xref py py-attr docutils literal notranslate"><span class="pre">apsw.no_change</span></code></a>,
<a class="reference internal" href="connection.html#apsw.Connection.create_module" title="apsw.Connection.create_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_module()</span></code></a> <em>use_no_change</em> parameter,
<a class="reference internal" href="vtable.html#apsw.VTCursor.ColumnNoChange" title="apsw.VTCursor.ColumnNoChange"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTCursor.ColumnNoChange()</span></code></a> and <a class="reference internal" href="vtable.html#apsw.VTTable.UpdateChangeRow" title="apsw.VTTable.UpdateChangeRow"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VTTable.UpdateChangeRow()</span></code></a>
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/402">APSW issue 402</a>)</p></li>
<li><p>All <a class="reference external" href="https://www.sqlite.org/c3ref/module.html">virtual table methods</a>
are supported - added <em>iVersion</em> 2 and 3.  You can specify the
<em>iVersion</em> in <a class="reference internal" href="connection.html#apsw.Connection.create_module" title="apsw.Connection.create_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_module()</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/128">APSW issue 128</a>)</p></li>
<li><p><a class="reference internal" href="ext.html#apsw.ext.make_virtual_module" title="apsw.ext.make_virtual_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.make_virtual_module()</span></code></a> makes it very easy to turn
a Python function into a virtual table module.</p></li>
<li><p><a class="reference internal" href="ext.html#apsw.ext.generate_series" title="apsw.ext.generate_series"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.generate_series()</span></code></a> and <a class="reference internal" href="ext.html#apsw.ext.generate_series_sqlite" title="apsw.ext.generate_series_sqlite"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.generate_series_sqlite()</span></code></a>
added. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/380">APSW issue 380</a>)</p></li>
</ul>
<p><a class="reference internal" href="apsw.html#apsw.format_sql_value" title="apsw.format_sql_value"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.format_sql_value()</span></code></a> now outputs floating point NaN, positive
and negative infinity, and signed zero exactly as SQLite does (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/398">APSW issue 398</a>)</p>
<p>Added <a class="reference internal" href="ext.html#apsw.ext.format_query_table" title="apsw.ext.format_query_table"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.format_query_table()</span></code></a> for handy table output
with auto column sizes, colour, word wrap etc.</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.is_interrupted" title="apsw.Connection.is_interrupted"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.is_interrupted()</span></code></a>.</p>
</section>
<section id="id17">
<h3>3.40.1.0<a class="headerlink" href="#id17" title="Link to this heading"></a></h3>
<p>Implemented <a class="reference external" href="https://www.sqlite.org/windowfunctions.html#udfwinfunc">window functions</a>
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/292">APSW issue 292</a>)</p>
<p><a class="reference external" href="https://www.sqlite.org/c3ref/c_deterministic.html">Function flags</a>
can be specified to <a class="reference internal" href="connection.html#apsw.Connection.create_scalar_function" title="apsw.Connection.create_scalar_function"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_scalar_function()</span></code></a> and
<a class="reference internal" href="connection.html#apsw.Connection.create_aggregate_function" title="apsw.Connection.create_aggregate_function"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_aggregate_function()</span></code></a>. Added
<a class="reference internal" href="apsw.html#apsw.mapping_function_flags" title="apsw.mapping_function_flags"><code class="xref py py-attr docutils literal notranslate"><span class="pre">apsw.mapping_function_flags</span></code></a>. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/384">APSW issue 384</a>)</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.trace_v2" title="apsw.Connection.trace_v2"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.trace_v2()</span></code></a> with <a class="reference internal" href="apsw.html#apsw.mapping_trace_codes" title="apsw.mapping_trace_codes"><code class="xref py py-attr docutils literal notranslate"><span class="pre">apsw.mapping_trace_codes</span></code></a>
and <a class="reference internal" href="apsw.html#apsw.mapping_statement_status" title="apsw.mapping_statement_status"><code class="xref py py-attr docutils literal notranslate"><span class="pre">apsw.mapping_statement_status</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/383">APSW issue 383</a>)</p>
<p>Ensure all SQLite APIs are wrapped. <a class="reference internal" href="connection.html#apsw.Connection.system_errno" title="apsw.Connection.system_errno"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.system_errno</span></code></a>,
<a class="reference internal" href="apsw.html#apsw.strlike" title="apsw.strlike"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.strlike()</span></code></a>, <a class="reference internal" href="apsw.html#apsw.strglob" title="apsw.strglob"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.strglob()</span></code></a>, <a class="reference internal" href="apsw.html#apsw.stricmp" title="apsw.stricmp"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.stricmp()</span></code></a>,
<a class="reference internal" href="apsw.html#apsw.strnicmp" title="apsw.strnicmp"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.strnicmp()</span></code></a>, <a class="reference internal" href="connection.html#apsw.Connection.filename_wal" title="apsw.Connection.filename_wal"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.filename_wal</span></code></a>,
<a class="reference internal" href="connection.html#apsw.Connection.filename_journal" title="apsw.Connection.filename_journal"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.filename_journal</span></code></a>, <a class="reference internal" href="connection.html#apsw.Connection.table_exists" title="apsw.Connection.table_exists"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.table_exists()</span></code></a>,
<a class="reference internal" href="connection.html#apsw.Connection.column_metadata" title="apsw.Connection.column_metadata"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.column_metadata()</span></code></a>, <a class="reference internal" href="exceptions.html#apsw.Error.error_offset" title="apsw.Error.error_offset"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Error.error_offset</span></code></a>,
<a class="reference internal" href="connection.html#apsw.Connection.cache_flush" title="apsw.Connection.cache_flush"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.cache_flush()</span></code></a>, <a class="reference internal" href="connection.html#apsw.Connection.release_memory" title="apsw.Connection.release_memory"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.release_memory()</span></code></a>,
<a class="reference internal" href="apsw.html#apsw.hard_heap_limit" title="apsw.hard_heap_limit"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.hard_heap_limit()</span></code></a>. <a class="reference internal" href="connection.html#apsw.Connection.drop_modules" title="apsw.Connection.drop_modules"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.drop_modules()</span></code></a>
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/382">APSW issue 382</a>)</p>
<p>When an <a class="reference internal" href="exceptions.html#unraisable"><span class="std std-ref">unraisable exception</span></a> happens,
<a class="reference external" href="https://www.sqlite.org/c3ref/log.html">sqlite3_log</a> is now called
so you will have context within SQLite’s actions.  <a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.unraisablehook">sys.unraisablehook</a> is
now called first, and if it doesn’t exist then <a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.excepthook">sys.excepthook</a> as
before.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/385">APSW issue 385</a>)</p>
<p>When the wrong type is given for a function argument, the error
message now includes the parameter name and function signature.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/358">APSW issue 358</a>)</p>
<p>Let SQLite do size checking instead of APSW for strings and blobs.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/387">APSW issue 387</a>)</p>
<p>Added <a class="reference internal" href="ext.html#apsw.ext.log_sqlite" title="apsw.ext.log_sqlite"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.ext.log_sqlite()</span></code></a> which installs a handler that
forwards SQLite messages to the <a class="reference external" href="https://docs.python.org/3/library/logging.html">logging module</a>.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.set_default_vfs" title="apsw.set_default_vfs"><code class="xref py py-meth docutils literal notranslate"><span class="pre">set_default_vfs()</span></code></a> and <a class="reference internal" href="apsw.html#apsw.unregister_vfs" title="apsw.unregister_vfs"><code class="xref py py-meth docutils literal notranslate"><span class="pre">unregister_vfs()</span></code></a> taking vfs
names.  The test suite also unregisters <a class="reference external" href="https://www.sqlite.org/zipvfs/doc/trunk/www/index.wiki">ZipVFS</a>
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/394">APSW issue 394</a>)</p>
</section>
<section id="id18">
<h3>3.40.0.0<a class="headerlink" href="#id18" title="Link to this heading"></a></h3>
<p>Fixed regression in statement cache update (version 3.38.1-r1) where
trailing whitespace in queries would be incorrectly treated as
incomplete execution (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/376">APSW issue 376</a>)</p>
<p>Added <a class="reference internal" href="ext.html"><span class="doc">Various interesting and useful bits of functionality</span></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/369">APSW issue 369</a>)</p>
<p>Added more Pythonic attributes as an alternative to getters and
setters, including <a class="reference internal" href="connection.html#apsw.Connection.in_transaction" title="apsw.Connection.in_transaction"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.in_transaction</span></code></a>,
<a class="reference internal" href="connection.html#apsw.Connection.exec_trace" title="apsw.Connection.exec_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.exec_trace</span></code></a>, <a class="reference internal" href="connection.html#apsw.Connection.row_trace" title="apsw.Connection.row_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.row_trace</span></code></a>,
<a class="reference internal" href="cursor.html#apsw.Cursor.exec_trace" title="apsw.Cursor.exec_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.exec_trace</span></code></a>, <a class="reference internal" href="cursor.html#apsw.Cursor.row_trace" title="apsw.Cursor.row_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.row_trace</span></code></a>,
<a class="reference internal" href="cursor.html#apsw.Cursor.connection" title="apsw.Cursor.connection"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.connection</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/371">APSW issue 371</a>)</p>
<p>Completed: To the extent permitted by CPython APIs every item has the
same docstring as this documentation.  Every API can use named
parameters.  The <a class="reference external" href="https://github.com/rogerbinns/apsw/blob/master/apsw/__init__.pyi">type stubs</a>
cover everything including constants.  The type stubs also include
documentation for everything, which for example Visual Studio Code
displays as you type or hover.  There is a single source of
documentation in the source code, which is then automatically
extracted to make this documentation, docstrings, and docstrings in
the type stubs.</p>
<p><a class="reference internal" href="example.html"><span class="doc">Example/Tour</span></a> updated and appearance improved (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/367">APSW issue 367</a>).</p>
</section>
<section id="id19">
<h3>3.39.4.0<a class="headerlink" href="#id19" title="Link to this heading"></a></h3>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.cache_stats" title="apsw.Connection.cache_stats"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.cache_stats()</span></code></a> to provide more information about
the statement cache.</p>
<p><a class="reference internal" href="cursor.html#apsw.Cursor.execute" title="apsw.Cursor.execute"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.execute()</span></code></a> now uses <a class="reference external" href="https://sqlite.org/c3ref/prepare.html">sqlite_prepare_v3</a> which allows supplying
<a class="reference external" href="https://sqlite.org/c3ref/c_prepare_normalize.html#sqlitepreparenormalize">flags</a>.</p>
<p><a class="reference internal" href="cursor.html#apsw.Cursor.execute" title="apsw.Cursor.execute"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.execute()</span></code></a> has a new <cite>can_cache</cite> parameter to control
whether the query can use the statement cache.  One example use is
with <a class="reference internal" href="connection.html#apsw.Connection.set_authorizer" title="apsw.Connection.set_authorizer"><code class="xref py py-meth docutils literal notranslate"><span class="pre">authorizers</span></code></a> because they only
run during prepare, which doesn’t happen with already cached
statements.</p>
<p>(The <a class="reference internal" href="cursor.html#apsw.Cursor.execute" title="apsw.Cursor.execute"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.execute()</span></code></a> additional parameters are keyword only and
also present in <a class="reference internal" href="cursor.html#apsw.Cursor.executemany" title="apsw.Cursor.executemany"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.executemany()</span></code></a>, and the corresponding
<a class="reference internal" href="connection.html#apsw.Connection.execute" title="apsw.Connection.execute"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.execute()</span></code></a> and <a class="reference internal" href="connection.html#apsw.Connection.executemany" title="apsw.Connection.executemany"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.executemany()</span></code></a>
methods.)</p>
<p>Added <a class="reference internal" href="cursor.html#apsw.Cursor.is_readonly" title="apsw.Cursor.is_readonly"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.is_readonly</span></code></a>, <a class="reference internal" href="cursor.html#apsw.Cursor.is_explain" title="apsw.Cursor.is_explain"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.is_explain</span></code></a>, and
<a class="reference internal" href="cursor.html#apsw.Cursor.expanded_sql" title="apsw.Cursor.expanded_sql"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.expanded_sql</span></code></a>.</p>
<p>Updated processing named bindings so that types registered with
<a class="reference external" href="https://docs.python.org/3/library/collections.abc.html#collections.abc.Mapping" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.abc.Mapping</span></code></a> (such as
<a class="reference external" href="https://docs.python.org/3/library/collections.html#collections.UserDict" title="(in Python v3.12)"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.UserDict</span></code></a>) will also be treated as dictionaries.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/373">APSW issue 373</a>)</p>
</section>
<section id="id20">
<h3>3.39.3.0<a class="headerlink" href="#id20" title="Link to this heading"></a></h3>
<p>Test no longer fails if APSW was compiled without
SQLITE_ENABLE_COLUMN_METADATA but sqlite3 was separately compiled with
it.  APSW should be compiled with the same flags as sqlite3 to match
functionality and APIs. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/363">APSW issue 363</a>)</p>
<p><cite>–use-system-sqlite-config</cite> setup.py <cite>build_ext</cite> option added to
allow <a class="reference internal" href="install.html#matching-sqlite-options"><span class="std std-ref">build_ext</span></a>. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/364">APSW issue 364</a>)</p>
</section>
<section id="id21">
<h3>3.39.2.1<a class="headerlink" href="#id21" title="Link to this heading"></a></h3>
<p>PyPI now includes Python 3.11 builds.</p>
<p>Instead of using scripts, you can now run several tools directly:</p>
<ul class="simple">
<li><p><a class="reference internal" href="install.html#testing"><span class="std std-ref">tests</span></a>:  python3 <strong>-m apsw.tests</strong> <em>[options]</em></p></li>
<li><p><a class="reference internal" href="execution.html#apswtrace"><span class="std std-ref">tracer</span></a>:  python3 <strong>-m apsw.trace</strong> <em>[options]</em></p></li>
<li><p><a class="reference internal" href="benchmarking.html#speedtest"><span class="std std-ref">speed tester</span></a>:  python3 <strong>-m apsw.speedtest</strong> <em>[options]</em></p></li>
<li><p><a class="reference internal" href="shell.html#shell"><span class="std std-ref">shell</span></a>:  python3 <strong>-m apsw</strong> <em>[options]</em></p></li>
</ul>
<p>The shell class has moved from apsw.Shell to <a class="reference internal" href="shell.html#apsw.shell.Shell" title="apsw.shell.Shell"><code class="xref py py-class docutils literal notranslate"><span class="pre">apsw.shell.Shell</span></code></a>
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/356">APSW issue 356</a>).  You can still reference it via the old name (ie
existing code will not break, except on Python 3.6).</p>
<p><a class="reference internal" href="shell.html#shell"><span class="std std-ref">Shell</span></a>: On Windows the native console support for colour is now used
(previously a third party module was supported).</p>
<p>You <a class="reference internal" href="install.html#setup-build-flags"><span class="std std-ref">can use –definevalues in setup.py build_ext</span></a> to provide compiler defines used for configuring
SQLite. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/357">APSW issue 357</a>)</p>
<p>If SQLITE_ENABLE_COLUMN_METADATA is enabled then
<a class="reference internal" href="cursor.html#apsw.Cursor.description_full" title="apsw.Cursor.description_full"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.description_full</span></code></a> is available providing all the column
metadata available. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/354">APSW issue 354</a>)</p>
<p><a class="reference internal" href="connection.html#apsw.Connection.cursor_factory" title="apsw.Connection.cursor_factory"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.cursor_factory</span></code></a> attribute is now present and is used
when <a class="reference internal" href="connection.html#apsw.Connection.cursor" title="apsw.Connection.cursor"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.cursor()</span></code></a> is called.  Added
<a class="reference internal" href="connection.html#apsw.Connection.execute" title="apsw.Connection.execute"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.execute()</span></code></a> and <a class="reference internal" href="connection.html#apsw.Connection.executemany" title="apsw.Connection.executemany"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.executemany()</span></code></a> which
automatically obtain the underlying cursor.  See <a class="reference internal" href="tips.html#customizing-connection-cursor"><span class="std std-ref">customizing
connections and cursors</span></a> in the
<a class="reference internal" href="tips.html"><span class="doc">Tips</span></a>.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/361">APSW issue 361</a>)</p>
</section>
<section id="id22">
<h3>3.39.2.0<a class="headerlink" href="#id22" title="Link to this heading"></a></h3>
<p><strong>Version numbering scheme change:</strong> Instead of a <em>-r1</em> style suffix,
there is <em>.0</em> style suffix (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/340">APSW issue 340</a>)</p>
<p>Updated building for PyPI to include more compiled platforms,
including aarch64 (Linux) and universal (MacOS).  Windows binaries are
no longer separately provided since PyPI has them.</p>
<p>When the amalgamation is included into APSW, <a class="reference external" href="https://www.sqlite.org/limits.html#max_attached">SQLITE_MAX_ATTACHED</a> is set to 125 if
not defined, up from the default of 10.</p>
<p>Updated typing information stubs with more detail and include docstrings.
This is still ongoing, but core functionality is well covered.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/338">APSW issue 338</a>) (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/381">APSW issue 381</a>)</p>
<p>Corrected the <a class="reference internal" href="tips.html#diagnostics-tips"><span class="std std-ref">tips</span></a> log handler of extended
result code (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/342">APSW issue 342</a>)</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.db_names" title="apsw.Connection.db_names"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.db_names()</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/343">APSW issue 343</a>)</p>
</section>
<section id="r1">
<h3>3.38.5-r1<a class="headerlink" href="#r1" title="Link to this heading"></a></h3>
<p>APSW is now on PyPI, so you can:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">apsw</span>
</pre></div>
</div>
<p>(Thanks to several people behind the scenes who helped with the various pieces
to make this happen.)</p>
<p>Removed support for setup.py downloading the in-development (aka
fossil) version of SQLite.</p>
<p>Shell exit for –version etc cleanly exits (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/210">APSW issue 210</a>)</p>
<p>Python 3.11 (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/326">APSW issue 326</a>) now works.</p>
<p>PyPy3 compiles and mostly works (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/323">APSW issue 323</a>).</p>
</section>
<section id="id23">
<h3>3.38.1-r1<a class="headerlink" href="#id23" title="Link to this heading"></a></h3>
<p>All items now have full docstrings including type information.
(Previously just one line summaries).  Note the C implemented
functions and data (ie almost all of APSW) can’t provide the same
level of type information as regular Python code.</p>
<p>A pyi file is included which does provide all the typing
information in <a class="reference external" href="https://typing.readthedocs.io/en/latest/source/stubs.html">type stub</a> format,
and shown by most IDEs.</p>
<p>Removal of code, tests, and documentation only relevant to CPython
before 3.7.  (Python 3.6 does still work, but is end of life.)</p>
<p>Keyword arguments can be used everywhere.</p>
<p>The statement cache implementation changed from a dictionary to a
list.  This allows the cache to be used for the same query text
multiple times.  (The code is also a quarter of the size and simpler).</p>
<p>The default for setup.py’s fetch command is to get the SQLite version
corresponding to APSW’s release.  (Previously it got the latest release.)</p>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_INDEX_CONSTRAINT_OFFSET, SQLITE_INDEX_CONSTRAINT_LIMIT</p></li>
</ul>
</section>
<section id="id24">
<h3>3.37.0-r1<a class="headerlink" href="#id24" title="Link to this heading"></a></h3>
<p>Allow breaking of reference cycles between objects that contain a
<a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Connection</span></code></a> or <a class="reference internal" href="cursor.html#apsw.Cursor" title="apsw.Cursor"><code class="xref py py-obj docutils literal notranslate"><span class="pre">Cursor</span></code></a>, and also use callbacks from that
object (eg busy handler). (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/314">APSW issue 314</a>)</p>
<p>This is the last release supporting Python 2 and Python 3 before 3.7.
If you still use those Python versions then you should pin to this
APSW version.  (<a class="reference external" href="https://www.rogerbinns.com/blog/apsw-ending-python2early3.html">More information</a>).</p>
<p>Windows Python 3.10 binaries are available to download.  The .exe format
is no longer available with this Python version.</p>
<p>Fixed custom VFS extension loading failure could leave the error
message unterminated.</p>
<p>Updated size of mutex array used by the <a class="reference internal" href="apsw.html#apsw.fork_checker" title="apsw.fork_checker"><code class="xref py py-func docutils literal notranslate"><span class="pre">fork</span> <span class="pre">checker</span></code></a></p>
<p>Connections are opened with SQLITE_OPEN_EXRESCODE so open errors will
also include extended result codes.</p>
<p><a class="reference internal" href="connection.html#apsw.Connection.changes" title="apsw.Connection.changes"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.changes()</span></code></a> and <a class="reference internal" href="connection.html#apsw.Connection.total_changes" title="apsw.Connection.total_changes"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.total_changes()</span></code></a> use the
new SQLite APIs that return 64 bit values (ie can now return values
greater than 2 billion).</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.autovacuum_pages" title="apsw.Connection.autovacuum_pages"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.autovacuum_pages()</span></code></a>.</p>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_CONSTRAINT_DATATYPE, SQLITE_OPEN_EXRESCODE</p></li>
</ul>
</section>
<section id="id25">
<h3>3.36.0-r1<a class="headerlink" href="#id25" title="Link to this heading"></a></h3>
<p>Implemented <a class="reference internal" href="connection.html#apsw.Connection.serialize" title="apsw.Connection.serialize"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.serialize()</span></code></a> and
<a class="reference internal" href="connection.html#apsw.Connection.deserialize" title="apsw.Connection.deserialize"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.deserialize()</span></code></a>.  They turn a database into bytes, and
bytes into a database respectively.</p>
<p>Allow any subclass of VFS to implement WAL, not just direct
subclasses.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/311">APSW issue 311</a>)</p>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_FCNTL_EXTERNAL_READER, SQLITE_FCNTL_CKSM_FILE</p></li>
</ul>
</section>
<section id="id26">
<h3>3.35.4-r1<a class="headerlink" href="#id26" title="Link to this heading"></a></h3>
<p>Updates for SQLite download url (the year is part of the urls).</p>
<p>Added enable flag for built-in SQL math functions, and enable it
by default with –enable-all-extensions.</p>
<p>Use the newer buffer API for Python 3 (old API removed in Python
3.10).</p>
</section>
<section id="id27">
<h3>3.34.0-r1<a class="headerlink" href="#id27" title="Link to this heading"></a></h3>
<p>Windows MSI installer files are now provided in addition to the exe
files (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/294">APSW issue 294</a>), as well as wheels for Python 3.6+.  Python 3.9
binaries are also now available.  The wheels can be installed via pip.</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.txn_state" title="apsw.Connection.txn_state"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.txn_state()</span></code></a></p>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_IOERR_CORRUPTFS</p></li>
</ul>
</section>
<section id="id28">
<h3>3.33.0-r1<a class="headerlink" href="#id28" title="Link to this heading"></a></h3>
<p>Small performance improvement in string handling</p>
<p>apsw module exposes Cursor, Blob, and Backup types (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/273">APSW issue 273</a>)</p>
<p>pkg-config is used to detect <a class="reference external" href="https://unicode-org.github.io/icu/userguide/icu/howtouseicu.html">International Components for Unicode
(ICU) sdk</a>
when the <a class="reference external" href="https://www.sqlite.org/src/artifact?ci=trunk&amp;filename=ext/icu/README.txt">SQLite ICU extension</a>
is enabled.  It falls back to icu-config as before. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/268">APSW issue 268</a>).</p>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_OPEN_SUPER_JOURNAL</p></li>
</ul>
</section>
<section id="id29">
<h3>3.32.2-r1<a class="headerlink" href="#id29" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_IOERR_DATA, SQLITE_CORRUPT_INDEX, SQLITE_BUSY_TIMEOUT, SQLITE_FCNTL_CKPT_START,
SQLITE_FCNTL_RESERVE_BYTES</p></li>
</ul>
<p>Minor documentation updates</p>
</section>
<section id="id30">
<h3>3.31.1-r1<a class="headerlink" href="#id30" title="Link to this heading"></a></h3>
<p>Various updates due to year change</p>
<p>Fix deprecated universal newline use in shell (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/283">APSW issue 283</a>)</p>
<p>Shell now uses <cite>pragma function_list</cite> to get list of functions for tab completion</p>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_DBCONFIG_LEGACY_FILE_FORMAT,
SQLITE_CONSTRAINT_PINNED, SQLITE_OK_SYMLINK, SQLITE_CANTOPEN_SYMLINK,
SQLITE_FCNTL_CKPT_DONE, SQLITE_OPEN_NOFOLLOW, SQLITE_VTAB_DIRECTONLY</p></li>
</ul>
</section>
<section id="id31">
<h3>3.30.1-r1<a class="headerlink" href="#id31" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_DBCONFIG_ENABLE_VIEW</p></li>
</ul>
<p>Updated hashing of SQL statements (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/274">APSW issue 274</a>)</p>
<p>Python 3.8 Windows binaries available.</p>
</section>
<section id="id32">
<h3>3.29.0-r1<a class="headerlink" href="#id32" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_DBCONFIG_DQS_DML, SQLITE_DBCONFIG_DQS_DDL, SQLITE_DBCONFIG_LEGACY_ALTER_TABLE</p></li>
</ul>
<p>Updated <a class="reference internal" href="connection.html#apsw.Connection.config" title="apsw.Connection.config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.config()</span></code></a> with all current <a class="reference external" href="https://sqlite.org/c3ref/c_dbconfig_defensive.html">SQLITE_DBCONFIG</a> constants. Also fixes
<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/249">APSW issue 249</a>.</p>
</section>
<section id="id33">
<h3>3.28.0-r1<a class="headerlink" href="#id33" title="Link to this heading"></a></h3>
<p>Added constant:</p>
<ul class="simple">
<li><p>SQLITE_DBCONFIG_WRITABLE_SCHEMA</p></li>
</ul>
</section>
<section id="id34">
<h3>3.27.2-r1<a class="headerlink" href="#id34" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_CONFIG_MEMDB_MAXSIZE, SQLITE_FCNTL_SIZE_LIMIT</p></li>
</ul>
<p>Added support for the geopoly extension (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/253">APSW issue 253</a>)</p>
<p>Removed hash optimisation that isn’t useful any more (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/256">APSW issue 256</a>)</p>
</section>
<section id="id35">
<h3>3.26.0-r1<a class="headerlink" href="#id35" title="Link to this heading"></a></h3>
<p>Added constant:</p>
<ul class="simple">
<li><p>SQLITE_DBCONFIG_DEFENSIVE</p></li>
</ul>
</section>
<section id="id36">
<h3>3.25.2-r1<a class="headerlink" href="#id36" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_INDEX_CONSTRAINT_FUNCTION, SQLITE_CANTOPEN_DIRTYWAL, SQLITE_ERROR_SNAPSHOT, SQLITE_FCNTL_DATA_VERSION</p></li>
</ul>
<p>Shell output mode now has lines and columns for compatibility (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/214">APSW issue 214</a>)</p>
<p>Example now runs under both Python 2 and 3.</p>
</section>
<section id="id37">
<h3>3.24.0-r1<a class="headerlink" href="#id37" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_DBCONFIG_RESET_DATABASE, and support for it in <a class="reference internal" href="connection.html#apsw.Connection.config" title="apsw.Connection.config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.config()</span></code></a></p></li>
<li><p>SQLITE_LOCKED_VTAB, and SQLITE_CORRUPT_SEQUENCE extended result codes</p></li>
</ul>
<p>Added <a class="reference internal" href="apsw.html#apsw.keywords" title="apsw.keywords"><code class="xref py py-attr docutils literal notranslate"><span class="pre">keywords</span></code></a> and updated the shell to use it.</p>
<p>Python 3.7 Windows binaries are provided.</p>
</section>
<section id="id38">
<h3>3.23.1-r1<a class="headerlink" href="#id38" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_DBSTATUS_CACHE_SPILL, SQLITE_FCNTL_LOCK_TIMEOUT</p></li>
</ul>
</section>
<section id="id39">
<h3>3.22.0-r1<a class="headerlink" href="#id39" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_DBCONFIG_MAX</p></li>
<li><p>SQLITE_READONLY_CANTINIT, SQLITE_ERROR_RETRY, SQLITE_ERROR_MISSING_COLLSEQ, SQLITE_READONLY_DIRECTORY</p></li>
</ul>
</section>
<section id="id40">
<h3>3.21.0-r1<a class="headerlink" href="#id40" title="Link to this heading"></a></h3>
<p>Added constants:</p>
<ul class="simple">
<li><p>SQLITE_INDEX_CONSTRAINT_ISNULL, SQLITE_INDEX_CONSTRAINT_ISNOT,
SQLITE_INDEX_CONSTRAINT_ISNOTNULL, SQLITE_INDEX_CONSTRAINT_IS and
SQLITE_INDEX_CONSTRAINT_NE</p></li>
<li><p>SQLITE_CONFIG_SMALL_MALLOC</p></li>
<li><p>SQLITE_IOCAP_BATCH_ATOMIC</p></li>
<li><p>SQLITE_IOERR_ROLLBACK_ATOMIC, SQLITE_IOERR_COMMIT_ATOMIC and
SQLITE_IOERR_BEGIN_ATOMIC</p></li>
<li><p>SQLITE_FCNTL_COMMIT_ATOMIC_WRITE,  SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE and
SQLITE_FCNTL_BEGIN_ATOMIC_WRITE</p></li>
</ul>
<p>Many spelling fixes (thanks to Edward Betts for the review)</p>
</section>
<section id="id41">
<h3>3.20.1-r1<a class="headerlink" href="#id41" title="Link to this heading"></a></h3>
<p>Added <a class="reference external" href="https://www.sqlite.org/c3ref/c_dbconfig_enable_fkey.html">SQLITE_DBCONFIG_ENABLE_QPSG</a> constant.</p>
<p>Added shell .open command (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/240">APSW issue 240</a>)</p>
</section>
<section id="id42">
<h3>3.19.3-r1<a class="headerlink" href="#id42" title="Link to this heading"></a></h3>
<p>No APSW changes.</p>
</section>
<section id="id43">
<h3>3.18.0-r1<a class="headerlink" href="#id43" title="Link to this heading"></a></h3>
<p>Updated completions in shell (eg added pragmas).</p>
<p><a class="reference external" href="https://www.sqlite.org/rbu.html">Resumable Bulk Update (RBU)</a>
extension is now built by default for <code class="code docutils literal notranslate"><span class="pre">--enable-all-extensions</span></code>.</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.set_last_insert_rowid" title="apsw.Connection.set_last_insert_rowid"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_last_insert_rowid()</span></code></a>.</p>
</section>
<section id="id44">
<h3>3.17.0-r1<a class="headerlink" href="#id44" title="Link to this heading"></a></h3>
<p>No APSW changes.</p>
</section>
<section id="id45">
<h3>3.16.2-r1<a class="headerlink" href="#id45" title="Link to this heading"></a></h3>
<p>Python 3.6 builds added.</p>
<p>Added SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE and SQLITE_FCNTL_PDB constants.</p>
</section>
<section id="id46">
<h3>3.15.2-r1<a class="headerlink" href="#id46" title="Link to this heading"></a></h3>
<p>No APSW changes.</p>
</section>
<section id="id47">
<h3>3.15.1-r1<a class="headerlink" href="#id47" title="Link to this heading"></a></h3>
<p>Added SQLITE_FCNTL_WIN32_GET_HANDLE constant.</p>
</section>
<section id="id48">
<h3>3.15.0-r1<a class="headerlink" href="#id48" title="Link to this heading"></a></h3>
<p>Added SQLITE_DBCONFIG_MAINDBNAME constant.</p>
</section>
<section id="id49">
<h3>3.14.1-r1<a class="headerlink" href="#id49" title="Link to this heading"></a></h3>
<p>Added SQLITE_DBSTATUS_CACHE_USED_SHARED and SQLITE_OK_LOAD_PERMANENTLY constants.</p>
</section>
<section id="id50">
<h3>3.13.0-r1<a class="headerlink" href="#id50" title="Link to this heading"></a></h3>
<p>Added SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION constant.</p>
<p>Added a pip command line in the download page.</p>
</section>
<section id="id51">
<h3>3.12.2-r1<a class="headerlink" href="#id51" title="Link to this heading"></a></h3>
<p>Call <a class="reference external" href="https://www.python.org/dev/peps/pep-0393/#new-api">PyUnicode_READY</a> for
Python 3.3 onwards.  Fixes <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/208">APSW issue 208</a>, <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/132">APSW issue 132</a>, <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/168">APSW issue 168</a>.</p>
<p>SQLite 3.12 completely changed the semantics of <a class="reference internal" href="vfs.html#apsw.VFS.xGetLastError" title="apsw.VFS.xGetLastError"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFS.xGetLastError()</span></code></a> in an
incompatible way.  This required a rewrite of the relevant C, Python and test
code.  If you implement or use this method then you have to rewrite your code
too.  Also note that running the test suite from an earlier version of APSW
against this or future SQLite versions will result in consuming all memory, swap
or address space (an underlying integer changed meaning).</p>
<p>Added SQLITE_CONFIG_STMTJRNL_SPILL and SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
constants.</p>
<p>Added support for SQLITE_CONFIG_STMTJRNL_SPILL in <a class="reference internal" href="apsw.html#apsw.config" title="apsw.config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.config()</span></code></a>.</p>
</section>
<section id="id52">
<h3>3.11.1-r1<a class="headerlink" href="#id52" title="Link to this heading"></a></h3>
<p>setup.py attempts to use setuptools if present, before falling back to
distutils. This allows setuptools only commands such as bdist_wheel to work. You
can force use of distutils by setting the environment variable
APSW_FORCE_DISTUTILS to any value. Note that setuptools may also affect the
output file names. (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/207">APSW issue 207</a>)</p>
</section>
<section id="id53">
<h3>3.11.0-r1<a class="headerlink" href="#id53" title="Link to this heading"></a></h3>
<p>The shell dump command now outputs the page size and user version.  They were
both output before as comments.</p>
<p>Updated SQLite download logic for 2016 folder.</p>
<p>Updated VFS test suite due to changes in SQLite default VFS implemented methods.</p>
<p>Added SQLITE_INDEX_CONSTRAINT_LIKE, SQLITE_INDEX_CONSTRAINT_REGEXP,
SQLITE_INDEX_CONSTRAINT_GLOB, SQLITE_IOERR_AUTH, SQLITE_FCNTL_JOURNAL_POINTER,
and SQLITE_FCNTL_VFS_POINTER constants.</p>
<p>Allow <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> subclasses for backup api (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/199">APSW issue 199</a>).</p>
<p><a class="reference external" href="https://www.sqlite.org/fts5.html">FTS5</a> and <a class="reference external" href="https://www.sqlite.org/json1.html">JSON1</a> extensions are now built by default for
<code class="code docutils literal notranslate"><span class="pre">--enable-all-extensions</span></code>.  It is recommended you wait a few more
releases for these extensions to mature.</p>
<p>Added a mapping for <a class="reference external" href="https://sqlite.org/c3ref/c_index_scan_unique.html">virtual table scan flags</a></p>
<p>Use <a class="reference external" href="https://www.sqlite.org/compile.html#enable_api_armor">SQLITE_ENABLE_API_ARMOR</a> for extra error
checking.</p>
</section>
<section id="id54">
<h3>3.9.2-r1<a class="headerlink" href="#id54" title="Link to this heading"></a></h3>
<p>Added SQLITE_IOERR_VNODE constant.</p>
<p>Windows builds for Python 3.5 are now provided.</p>
</section>
<section id="id55">
<h3>3.8.11.1-r1<a class="headerlink" href="#id55" title="Link to this heading"></a></h3>
<p>Added SQLITE_FCNTL_RBU and SQLITE_FCNTL_ZIPVFS constants.</p>
<p>setup’s fetch command can now get arbitrary fossil versions.  For
example specify <code class="docutils literal notranslate"><span class="pre">fossil-e596a6b6</span></code>.</p>
<p>Update tests due to a change in Python 3.5 (exception returned with
invalid strings for system calls changed from TypeError to
ValueError).</p>
<p>Adjusted some internal detection related to the <a class="reference internal" href="apsw.html#apsw.fork_checker" title="apsw.fork_checker"><code class="xref py py-func docutils literal notranslate"><span class="pre">fork</span> <span class="pre">checker</span></code></a></p>
</section>
<section id="id56">
<h3>3.8.10.1-r1<a class="headerlink" href="#id56" title="Link to this heading"></a></h3>
<p>Added deterministic parameter to
<a class="reference internal" href="connection.html#apsw.Connection.create_scalar_function" title="apsw.Connection.create_scalar_function"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.create_scalar_function()</span></code></a> (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/187">APSW issue 187</a>)</p>
<p>Switched to new SQLite API returning 64 bit values for <a class="reference internal" href="apsw.html#apsw.status" title="apsw.status"><code class="xref py py-func docutils literal notranslate"><span class="pre">status()</span></code></a>
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/191">APSW issue 191</a>)</p>
</section>
<section id="id57">
<h3>3.8.9-r1<a class="headerlink" href="#id57" title="Link to this heading"></a></h3>
<p>Fixed column description caching which could be preserved between
multiple statements in the same execution (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/186">APSW issue 186</a>)</p>
<p>Updated documentation building tool to use new database of information
from the SQLite site.  This is simpler and more reliable.  (Previously
used site scraping.)</p>
<p>Added SQLITE_AUTH_USER, SQLITE_FCNTL_LAST_ERRNO,
SQLITE_FCNTL_WAL_BLOCK, SQLITE_FCNTL_GET_LOCKPROXYFILE, and
SQLITE_FCNTL_SET_LOCKPROXYFILE constants.</p>
<p>Removed SQLITE_GET_LOCKPROXYFILE, SQLITE_SET_LOCKPROXYFILE,
SQLITE_LAST_ERRNO file control constants.  These are deprecated - use
the versions with FCNTL in their name (eg
SQLITE_FCNTL_GET_LOCKPROXYFILE).</p>
<p>Added <a class="reference internal" href="apsw.html#sqliteconstants"><span class="std std-ref">mappings</span></a> for conflict resolution modes,
virtual table configuration options and xShmLock VFS flags.</p>
</section>
<section id="id58">
<h3>3.8.8.2-r1<a class="headerlink" href="#id58" title="Link to this heading"></a></h3>
<p>No APSW changes.</p>
</section>
<section id="id59">
<h3>3.8.8.1-r1<a class="headerlink" href="#id59" title="Link to this heading"></a></h3>
<p>The column description is now cached on first request during a query
so getting it is quick if called for every row.</p>
<p>Added SQLITE_CONFIG_PCACHE_HDRSZ and SQLITE_CONFIG_PMASZ constants, and
support for them in <a class="reference internal" href="apsw.html#apsw.config" title="apsw.config"><code class="xref py py-func docutils literal notranslate"><span class="pre">config()</span></code></a>.</p>
<p>Added SQLITE_CHECKPOINT_TRUNCATE constant.</p>
<p>Update year in various places to 2015.</p>
</section>
<section id="id60">
<h3>3.8.7.3-r1<a class="headerlink" href="#id60" title="Link to this heading"></a></h3>
<p>No APSW changes.</p>
</section>
<section id="id61">
<h3>3.8.7.2-r1<a class="headerlink" href="#id61" title="Link to this heading"></a></h3>
<p>Fixed parsing of icu-config flags</p>
</section>
<section id="id62">
<h3>3.8.7.1-r1<a class="headerlink" href="#id62" title="Link to this heading"></a></h3>
<p>Added SQLITE_LIMIT_WORKER_THREADS constant</p>
</section>
<section id="id63">
<h3>3.8.6-r1<a class="headerlink" href="#id63" title="Link to this heading"></a></h3>
<p>Updated test suite for Python 3.4 unittest garbage collection changes
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/164">APSW issue 164</a> <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/169">APSW issue 169</a>)</p>
<p>Using the recommended build option of
<strong>–enable-all-extensions</strong> turns on <a class="reference external" href="https://sqlite.org/compile.html#enable_stat4">STAT4</a>.  Windows binaries
include this too.</p>
</section>
<section id="id64">
<h3>3.8.5-r1<a class="headerlink" href="#id64" title="Link to this heading"></a></h3>
<p>Added SQLITE_IOCAP_IMMUTABLE and SQLITE_FCNTL_WIN32_SET_HANDLE
constants.</p>
</section>
<section id="id65">
<h3>3.8.4.3-r1<a class="headerlink" href="#id65" title="Link to this heading"></a></h3>
<p>Added <a class="reference internal" href="cursor.html#apsw.Cursor.fetchone" title="apsw.Cursor.fetchone"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.fetchone()</span></code></a></p>
</section>
<section id="id66">
<h3>3.8.4.2-r1<a class="headerlink" href="#id66" title="Link to this heading"></a></h3>
<p>No APSW code changes.  Rebuild due to updated SQLite version.</p>
</section>
<section id="id67">
<h3>3.8.4.1-r1<a class="headerlink" href="#id67" title="Link to this heading"></a></h3>
<p>Windows 64 bit binary builds for Python 3.3+ are back - thanks to
Mike C. Fletcher for <a class="reference external" href="http://vrplumber.com">pointing the way</a></p>
<p>Correct detection of current SQLite version from download page for
<code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> fetch command</p>
<p>Tested against Python 3.4 and binaries for Windows.</p>
</section>
<section id="id68">
<h3>3.8.3.1-r1<a class="headerlink" href="#id68" title="Link to this heading"></a></h3>
<p>Updated <a class="reference internal" href="shell.html"><span class="doc">Shell</span></a> completions for keywords, functions and pragmas.</p>
</section>
<section id="id69">
<h3>3.8.3-r1<a class="headerlink" href="#id69" title="Link to this heading"></a></h3>
<p>APSW is now hosted at Github - <a class="reference external" href="https://github.com/rogerbinns/apsw">https://github.com/rogerbinns/apsw</a></p>
<p>Added SQLITE_RECURSIVE, SQLITE_READONLY_DBMOVED,
SQLITE_FCNTL_COMMIT_PHASETWO, SQLITE_FCNTL_HAS_MOVED and
SQLITE_FCNTL_SYNC constants.</p>
</section>
<section id="id70">
<h3>3.8.2-r1<a class="headerlink" href="#id70" title="Link to this heading"></a></h3>
<p>Added SQLITE_CONFIG_WIN32_HEAPSIZE, SQLITE_CONSTRAINT_ROWID and
SQLITE_FCNTL_TRACE constants.</p>
</section>
<section id="id71">
<h3>3.8.1-r1<a class="headerlink" href="#id71" title="Link to this heading"></a></h3>
<p>Added SQLITE_CANTOPEN_CONVPATH and SQLITE_IOERR_CONVPATH extended
error codes.</p>
<p>Updated pysqlite urls to point to github.</p>
<p>Various minor build/download documentation updates.</p>
</section>
<section id="id72">
<h3>3.8.0.2-r1<a class="headerlink" href="#id72" title="Link to this heading"></a></h3>
<p>No APSW code changes.  Rebuild due to updated SQLite version.</p>
<p>Updated documentation tips to show how to <a class="reference internal" href="tips.html#diagnostics-tips"><span class="std std-ref">get detailed
diagnostics</span></a>.</p>
</section>
<section id="id73">
<h3>3.8.0.1-r1<a class="headerlink" href="#id73" title="Link to this heading"></a></h3>
<p>No APSW changes.  Rebuild due to updated SQLite version.</p>
<p>Windows binaries for Python 3.3 64 bit are no longer available as a
Visual Studio update obliterated the ability to compile them, and I
have no patience left to fight Microsoft’s tools.</p>
</section>
<section id="r2">
<h3>3.8.0-r2<a class="headerlink" href="#r2" title="Link to this heading"></a></h3>
<p>No APSW changes - updated checksums because SQLite changed the
released archive to address an autoconf issue on some platforms</p>
</section>
<section id="id74">
<h3>3.8.0-r1<a class="headerlink" href="#id74" title="Link to this heading"></a></h3>
<p>Windows binaries for Python 3.3 64 bit are now available after
managing to get several pieces of Microsoft software to cooperate.</p>
<p>Fixed shell dump issue when system routines (eg timestamp, username,
hostname) couldn’t automatically be promoted to unicode.  They are
used in comments in the output.  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/142">APSW issue 142</a>)</p>
<p>Added SQLITE_DBSTATUS_DEFERRED_FKS, SQLITE_IOERR_GETTEMPPATH,
SQLITE_WARNING_AUTOINDEX and SQLITE_BUSY_SNAPSHOT constants.</p>
</section>
<section id="id75">
<h3>3.7.17-r1<a class="headerlink" href="#id75" title="Link to this heading"></a></h3>
<p>Removed tests that checked directly calling VFS read/write with
negative offsets or amounts returns errors.  This version of SQLite no
longer returns errors in those circumstances and typically crashes
instead.</p>
<p>Various new constants.</p>
</section>
<section id="id76">
<h3>3.7.16.2-r1<a class="headerlink" href="#id76" title="Link to this heading"></a></h3>
<p>No APSW changes - just a binary rebuild.  Windows users are
recommended to upgrade their SQLite version.</p>
</section>
<section id="id77">
<h3>3.7.16.1-r1<a class="headerlink" href="#id77" title="Link to this heading"></a></h3>
<p>Updated tables of functions and pragmas in the <a class="reference internal" href="shell.html"><span class="doc">Shell</span></a> to match
current SQLite version.</p>
</section>
<section id="id78">
<h3>3.7.16-r1<a class="headerlink" href="#id78" title="Link to this heading"></a></h3>
<p>Adjust to different SQLite download URLs</p>
<p>Added SQLITE_CONSTRAINT_* and SQLITE_READONLY_ROLLBACK <a class="reference external" href="https://www.sqlite.org/c3ref/c_abort_rollback.html">extended error
codes</a></p>
<p>Removed CouchDB virtual table</p>
</section>
<section id="id79">
<h3>3.7.15.2-r1<a class="headerlink" href="#id79" title="Link to this heading"></a></h3>
<p>No APSW changes - binary rebuild to pickup new SQLite version</p>
</section>
<section id="id80">
<h3>3.7.15.1-r1<a class="headerlink" href="#id80" title="Link to this heading"></a></h3>
<p>Use https (SSL) for SQLite web site references (downloads and
documentation links).  On some platforms/versions/SSL libraries,
Python’s SSL module <a class="reference external" href="https://www.google.com/webhp?q=python%20ssl%20EOF%20occurred%20in%20violation%20of%20protocol">doesn’t work</a>
with the SQLite website so a fallback to http is used - the downloads
still have their checksum verified.</p>
</section>
<section id="id81">
<h3>3.7.15-r1<a class="headerlink" href="#id81" title="Link to this heading"></a></h3>
<p>Work around changed semantics for error handling when the VFS xDelete
method is asked to delete a file that does not exist.</p>
<p>Completely removed all <a class="reference external" href="https://sqlite.org/asyncvfs.html">AsyncVFS</a> related code.  This extension
is <a class="reference external" href="https://sqlite.org/src/info/3d548db7eb">no longer maintained nor supported</a> by the SQLite team.
<a class="reference external" href="https://sqlite.org/wal.html">WAL</a> is a good way of getting
similar functionality.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.config" title="apsw.config"><code class="xref py py-func docutils literal notranslate"><span class="pre">config()</span></code></a> support for SQLITE_CONFIG_COVERING_INDEX_SCAN.</p>
<p>Added several new constants: SQLITE_CONFIG_COVERING_INDEX_SCAN,
SQLITE_CONFIG_SQLLOG, SQLITE_FCNTL_BUSYHANDLER,
SQLITE_FCNTL_TEMPFILENAME, SQLITE_CANTOPEN_FULLPATH,
SQLITE_IOERR_DELETE_NOENT</p>
</section>
<section id="id82">
<h3>3.7.14.1-r1<a class="headerlink" href="#id82" title="Link to this heading"></a></h3>
<p>Updated setup and test suite so that all files are explicitly closed
instead of relying on garbage collection.</p>
<p>Added Windows binaries for Python 3.3.  (Only 32 bit as Python doesn’t
provide a free way of making 64 bit Windows binaries.)</p>
<p>Updated setup.py to work with changed SQLite download page formatting
when detecting latest version.</p>
<p>Due to a <a class="reference external" href="https://bugs.python.org/issue16145">Python 3.3.0 regression bug</a> using the csv output mode in the
shell can result in bad data or Python crashing.  The bug has been
fixed for Python 3.3.1 which is due in November 2012.</p>
</section>
<section id="id83">
<h3>3.7.14-r2<a class="headerlink" href="#id83" title="Link to this heading"></a></h3>
<p>Fixed an issue with the GIL in the destructor for functions.  The bug
would be encountered if you create a function with the same name as an
existing function and are using an upcoming version of Python (eg
2.7.4).  Thanks to Arfrever Frehtes Taifersar Arahesis for finding it
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/134">APSW issue 134</a>).</p>
<p>Added shell .print command to match upcoming SQLite shell changes.</p>
</section>
<section id="id84">
<h3>3.7.14-r1<a class="headerlink" href="#id84" title="Link to this heading"></a></h3>
<p>Added support for <a class="reference internal" href="connection.html#apsw.Connection.status" title="apsw.Connection.status"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.status()</span></code></a> (calls <a class="reference external" href="https://sqlite.org/c3ref/db_status.html">sqlite3_db_status</a>).</p>
<p>The legacy Windows <a class="reference external" href="https://en.wikipedia.org/wiki/Microsoft_Compiled_HTML_Help">Compiled Help Format</a>
documentation is no longer produced - the help compiler setup program
can’t cope with modern machines.</p>
</section>
<section id="id85">
<h3>3.7.13-r1<a class="headerlink" href="#id85" title="Link to this heading"></a></h3>
<p>Do not free a structure on failure to register a virtual table module
as SQLite does that anyway.</p>
<p>Added SQLITE_OPEN_MEMORY constant.</p>
</section>
<section id="id86">
<h3>3.7.12.1-r1<a class="headerlink" href="#id86" title="Link to this heading"></a></h3>
<p>No changes to APSW.  Binary rebuilds due to SQLite bugfixes.</p>
</section>
<section id="id87">
<h3>3.7.12-r1<a class="headerlink" href="#id87" title="Link to this heading"></a></h3>
<p>Re-enabled the asyncvfs.</p>
<p>Added <a class="reference internal" href="cursor.html#apsw.Cursor.description" title="apsw.Cursor.description"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.description</span></code></a> to make DB API interoperability a
little easier (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/131">APSW issue 131</a>).</p>
<p>Added SQLITE_DBSTATUS_CACHE_WRITE and SQLITE_CANTOPEN_ISDIR constants.</p>
</section>
<section id="id88">
<h3>3.7.11-r1<a class="headerlink" href="#id88" title="Link to this heading"></a></h3>
<p>Added SQLITE_ABORT_ROLLBACK and SQLITE_FCNTL_PRAGMA constants.</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.readonly" title="apsw.Connection.readonly"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.readonly()</span></code></a>.</p>
<p>Changed <a class="reference internal" href="connection.html#apsw.Connection.filename" title="apsw.Connection.filename"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.filename</span></code></a> which used to return the string
used to open the database and now returns the absolute pathname.</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.db_filename" title="apsw.Connection.db_filename"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.db_filename()</span></code></a>.</p>
</section>
<section id="id89">
<h3>3.7.10-r1<a class="headerlink" href="#id89" title="Link to this heading"></a></h3>
<p>The default sector size returned in VFS routines is 4,096 to match
SQLite’s new default.</p>
<p>Several links to SQLite tickets and documentation were updated
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/122">APSW issue 122</a>).</p>
<p>The async vfs is disabled due to a bug in its code that leads to
random memory reads when dealing with filenames.</p>
<p>Added SQLITE_CONFIG_GETPCACHE2, SQLITE_CONFIG_GETPCACHE2,
SQLITE_FCNTL_POWERSAFE_OVERWRITE, SQLITE_FCNTL_VFSNAME and
SQLITE_IOCAP_POWERSAFE_OVERWRITE constants.</p>
<p>Fix shell dumping when SQLite doesn’t strip trailing comments from
view declarations (<a class="reference external" href="https://sqlite.org/src/info/c04a8b8a4f">discussed here</a>)</p>
<p>Added a <a class="reference internal" href="vfs.html#apsw.URIFilename" title="apsw.URIFilename"><code class="xref py py-class docutils literal notranslate"><span class="pre">URIFilename</span></code></a> class to encapsulate how SQLite provides
URI parameters to VFS routines (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/124">APSW issue 124</a>).</p>
<p>Compatibility break: Depending on flags your VFS xOpen method may get
a <a class="reference internal" href="vfs.html#apsw.URIFilename" title="apsw.URIFilename"><code class="xref py py-class docutils literal notranslate"><span class="pre">URIFilename</span></code></a> or a string for the filename.  You can still
pass either to the <a class="reference internal" href="vfs.html#apsw.VFSFile" title="apsw.VFSFile"><code class="xref py py-class docutils literal notranslate"><span class="pre">VFSFile</span></code></a>.</p>
<p>Compatibility break: The <a class="reference internal" href="vfs.html"><span class="doc">Virtual File System (VFS)</span></a> code used to always run strings
you provided through <a class="reference internal" href="vfs.html#apsw.VFS.xFullPathname" title="apsw.VFS.xFullPathname"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFS.xFullPathname()</span></code></a>.  This isn’t possible
with URI pathnames so that code has been removed.  If you construct
filenames for <a class="reference internal" href="vfs.html#apsw.VFS.xOpen" title="apsw.VFS.xOpen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFS.xOpen()</span></code></a> directly (ie bypassing the SQLite
database open call) then you must call <a class="reference internal" href="vfs.html#apsw.VFS.xFullPathname" title="apsw.VFS.xFullPathname"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFS.xFullPathname()</span></code></a>
yourself first to ensure relative pathnames are turned into absolute
pathnames.  The SQLite API guarantees that filenames passed to
<a class="reference internal" href="vfs.html#apsw.VFS.xOpen" title="apsw.VFS.xOpen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFS.xOpen()</span></code></a> are exactly what was returned from
<a class="reference internal" href="vfs.html#apsw.VFS.xFullPathname" title="apsw.VFS.xFullPathname"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFS.xFullPathname()</span></code></a>.</p>
</section>
<section id="id90">
<h3>3.7.9-r1<a class="headerlink" href="#id90" title="Link to this heading"></a></h3>
<p>Added SQLITE_DBSTATUS_CACHE_HIT, SQLITE_DBSTATUS_CACHE_MISS and
SQLITE_FCNTL_OVERWRITE constants.</p>
</section>
<section id="id91">
<h3>3.7.8-r1<a class="headerlink" href="#id91" title="Link to this heading"></a></h3>
<p>Updated documentation and tests due to an undocumented change in VFS
xDelete semantics.</p>
<p>Added SQLITE3_FCNTL_PERSIST_WAL and SQLITE3_FCNTL_WIN32_AV_RETRY <a class="reference external" href="https://sqlite.org/c3ref/c_fcntl_chunk_size.html">file
controls</a>.</p>
<p>Wrapped sqlite3_sourceid (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/120">APSW issue 120</a>)</p>
</section>
<section id="id92">
<h3>3.7.7.1-r1<a class="headerlink" href="#id92" title="Link to this heading"></a></h3>
<p>Added <a class="reference external" href="https://sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfiguri">SQLITE_CONFIG_URI</a>
and support for it in <a class="reference internal" href="apsw.html#apsw.config" title="apsw.config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">config()</span></code></a>, and the open flag
<a class="reference external" href="https://sqlite.org/c3ref/c_open_autoproxy.html">SQLITE_OPEN_URI</a>.  This makes it
easy to use <a class="reference external" href="https://sqlite.org/uri.html">URI filenames</a>.</p>
<p>The <a class="reference internal" href="shell.html#shell"><span class="std std-ref">Shell</span></a> now uses <a class="reference external" href="https://sqlite.org/uri.html">URI filenames</a> by default.</p>
<p>New <a class="reference external" href="https://sqlite.org/c3ref/c_busy_recovery.html">extended error constants</a>:
SQLITE_CORRUPT_VTAB, SQLITE_IOERR_SEEK, SQLITE_IOERR_SHMMAP,
SQLITE_READONLY_CANTLOCK and SQLITE_READONLY_RECOVERY.</p>
<p>64 bit platforms
(<a class="reference external" href="https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models">LP64 - most non-Windows</a>)
and Python 2: The Python int type is returned for 64 bit integers
instead of Python long type.</p>
</section>
<section id="id93">
<h3>3.7.6.3-r1<a class="headerlink" href="#id93" title="Link to this heading"></a></h3>
<p>When invoking the shell by calling <a class="reference internal" href="shell.html#apsw.shell.main" title="apsw.shell.main"><code class="xref py py-func docutils literal notranslate"><span class="pre">apsw.shell.main()</span></code></a> it will not
become interactive if you supply SQL commands as command line
arguments.  This is to have the same behaviour as the SQLite shell
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/115">APSW issue 115</a>).</p>
<p>The shell has a <em>.find</em> command making it easy to search for values
across all columns of some or all tables.</p>
<p>The shell has a <em>.autoimport</em> command making it easy to import a data
file automatically deducing separators, column names and data types.</p>
<p>Detect attempted use of a cursor as input data for itself.</p>
</section>
<section id="id94">
<h3>3.7.6.2-r1<a class="headerlink" href="#id94" title="Link to this heading"></a></h3>
<p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/117">APSW issue 117</a> where the
shell could report an I/O error on changing output target for some
operating systems.  Thanks to Edzard Pasma for finding and diagnosing
this.</p>
<p>Added support for VFS version 3 which allows redirecting <a class="reference internal" href="vfs.html#apsw.VFS.xSetSystemCall" title="apsw.VFS.xSetSystemCall"><code class="xref py py-meth docutils literal notranslate"><span class="pre">system</span>
<span class="pre">calls</span></code></a> used by some VFS implementations (eg for
testing or sandboxing).</p>
<p><a class="reference internal" href="exceptions.html#apsw.NotFoundError" title="apsw.NotFoundError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">NotFoundError</span></code></a> exception added.</p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.config" title="apsw.Connection.config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.config()</span></code></a>.</p>
<p>Updated <a class="reference internal" href="connection.html#apsw.Connection.wal_checkpoint" title="apsw.Connection.wal_checkpoint"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.wal_checkpoint()</span></code></a> to use <a class="reference external" href="https://sqlite.org/c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2</a> which provides
more fine grained control over checkpointing and returns useful
information.</p>
</section>
<section id="id95">
<h3>3.7.5-r1<a class="headerlink" href="#id95" title="Link to this heading"></a></h3>
<p>Backwards incompatible change in SQLite 3.7.5 for handling of
<a class="reference internal" href="vfs.html#apsw.VFSFile.xFileControl" title="apsw.VFSFile.xFileControl"><code class="xref py py-meth docutils literal notranslate"><span class="pre">xFileControl()</span></code></a>.  If you implement this method in a VFS
then you must return True or False to indicate if the operation was
understood.  <a class="reference internal" href="connection.html#apsw.Connection.file_control" title="apsw.Connection.file_control"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.file_control()</span></code></a> now returns that value.
(Previously you could not tell the difference between an op being
understood and an error resulting, or the op not being understood at
all.)</p>
<p>Windows Python 3.2 binaries now available.</p>
</section>
<section id="id96">
<h3>3.7.4-r1<a class="headerlink" href="#id96" title="Link to this heading"></a></h3>
<p>Binary downloads for Windows 64 bit Python versions 2.6 and above
including Python 3 are now available.</p>
<p><a class="reference internal" href="apsw.html#apsw.soft_heap_limit" title="apsw.soft_heap_limit"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.soft_heap_limit()</span></code></a> now uses <a class="reference external" href="https://sqlite.org/c3ref/soft_heap_limit64.html">sqlite3_soft_heap_limit64</a> so you can
provide values larger than 2GB.  It is now also able to return the
previous value instead of None.</p>
<p>Improve getting shell timer information for 64 bit Windows.</p>
<p><a class="reference internal" href="blob.html#apsw.Blob.reopen" title="apsw.Blob.reopen"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Blob.reopen()</span></code></a> is implemented.</p>
<p>FTS4 is enabled and in the binary builds.  Note that it is an
augmentation of FTS3 rather than totally separate code and described
in the <a class="reference external" href="https://sqlite.org/fts3.html#fts4">SQLite documentation</a>.</p>
</section>
<section id="id97">
<h3>3.7.3-r1<a class="headerlink" href="#id97" title="Link to this heading"></a></h3>
<p>You can read blobs into pre-existing buffers using
<a class="reference internal" href="blob.html#apsw.Blob.read_into" title="apsw.Blob.read_into"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Blob.read_into()</span></code></a>.  (This is more efficient than allocating new
buffers as <a class="reference internal" href="blob.html#apsw.Blob.read" title="apsw.Blob.read"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Blob.read()</span></code></a> does and then copying.)  (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/109">APSW issue 109</a>).</p>
<p>Fixed bug with unicode output in CSV mode in the shell.</p>
<p><a class="reference external" href="https://sqlite.org/c3ref/create_function.html">sqlite_create_function_v2</a> now means that some
housekeeping APSW did can be pushed back onto SQLite and the
consequent deletion of some code</p>
</section>
<section id="id98">
<h3>3.7.2-r1<a class="headerlink" href="#id98" title="Link to this heading"></a></h3>
<p>No changes to APSW.  Upgrading to this version of SQLite is
<a class="reference external" href="https://sqlite.org/releaselog/3_7_2.html">recommended</a>.</p>
</section>
<section id="id99">
<h3>3.7.1-r1<a class="headerlink" href="#id99" title="Link to this heading"></a></h3>
<p>Updated various constants including <a class="reference external" href="https://sqlite.org/c3ref/c_fcntl_chunk_size.html">SQLITE_FCNTL_CHUNK_SIZE</a> used with
<a class="reference internal" href="connection.html#apsw.Connection.file_control" title="apsw.Connection.file_control"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.file_control()</span></code></a>.</p>
<p>Fixed Unicode output with some file objects from the shell (<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/108">APSW issue 108</a>).</p>
<p>With the shell, you can specify handling of characters not present in
the output encoding (eg replace to use ‘?’ or similar, ignore,
xmlcharrefreplace etc).  For example:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">.</span><span class="n">encoding</span> <span class="n">cp437</span><span class="p">:</span><span class="n">replace</span>
</pre></div>
</div>
</section>
<section id="id100">
<h3>3.7.0.1-r1<a class="headerlink" href="#id100" title="Link to this heading"></a></h3>
<p>Fixed issue when using a tracer and a context manager fails to commit.</p>
</section>
<section id="id101">
<h3>3.7.0-r1<a class="headerlink" href="#id101" title="Link to this heading"></a></h3>
<p>Added several new constants.</p>
<p><a class="reference external" href="https://sqlite.org/wal.html">Write Ahead Logging</a> is
<a class="reference internal" href="tips.html#wal"><span class="std std-ref">supported</span></a>.  You can make all databases automatically use
WAL mode if available by using <a class="reference internal" href="tips.html#wal"><span class="std std-ref">connection hooks</span></a>.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.format_sql_value" title="apsw.format_sql_value"><code class="xref py py-meth docutils literal notranslate"><span class="pre">format_sql_value()</span></code></a> for generating a SQL syntax string from
a value.  This is implemented in C and is significantly faster than
doing the same formatting in Python.</p>
<p>Using the above function and other tweaks the <a class="reference internal" href="shell.html#shell"><span class="std std-ref">Shell</span></a> dumper is
now three to four times faster.  Thanks to Nikolaus Rath for pointing
out the problem and providing test data.</p>
<p>The shell now does colour highlighting making it easy to visually
distinguish prompts, errors, headers and value types when outputting
to a terminal.  See the <cite>–no-colour</cite> argument and <strong>.colour</strong>
command.  Those of you in the two countries that have not adopted the
metric system may also omit the ‘u’.  For Windows users you won’t get
colour output unless you install <a class="reference external" href="https://pypi.python.org/pypi/colorama">colorama</a></p>
<p>When using the context manager (with statement) of a
<a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> and the exit commit had an error, then the
transaction is rolled back.  This could occur if SQLite had buffered
the transaction entirely in memory and a non-eager transaction lock
had been obtained.  Thanks to Geoff Ness for finding the problem.
(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/98">APSW issue 98</a>).</p>
<p>Fixed bug when an error is returned creating an instance of a virtual
table (eg an invalid column name).  Before the fix you would get the
previous error message or a crash.  Thanks to Jose Gomes for finding
the problem.  <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/103">APSW issue 103</a></p>
<p>There is now a PPA for Ubuntu users that is kept up to date with APSW
and SQLite at <a class="reference external" href="https://launchpad.net/~ubuntu-rogerbinns/+archive/apsw">https://launchpad.net/~ubuntu-rogerbinns/+archive/apsw</a>
which has the latest SQLite embedded statically inside (ie system
SQLite is ignored) and has all the extensions enabled: FTS3, RTree,
ICU, asyncvfs</p>
<p>If you open VFS files directly then the filename is always run through
xFullPathname first.  SQLite guarantees this behaviour but the
existing VFS code was not doing that for direct opens.  Opens from
SQLite were doing it.</p>
<p>Fixed error where <a class="reference internal" href="apsw.html#apsw.connection_hooks" title="apsw.connection_hooks"><code class="xref py py-attr docutils literal notranslate"><span class="pre">apsw.connection_hooks</span></code></a> were being run before
the <a class="reference internal" href="execution.html#statementcache"><span class="std std-ref">statement cache</span></a> was initialised which would
result in a crash if any hooks executed SQL code.</p>
</section>
<section id="id102">
<h3>3.6.23.1-r1<a class="headerlink" href="#id102" title="Link to this heading"></a></h3>
<p>Shell CSV output under Python 3.1 is corrected (work around Python 3.1
StringIO bug/incompatibility with other Python versions).</p>
<p>Simplified access to the shell’s <a class="reference internal" href="shell.html#apsw.shell.Shell.db" title="apsw.shell.Shell.db"><code class="xref py py-attr docutils literal notranslate"><span class="pre">database</span></code></a> from the
API.</p>
<p>Added a shell <a class="reference internal" href="example.html#example-shell"><span class="std std-ref">example</span></a>.</p>
</section>
<section id="id103">
<h3>3.6.23-r1<a class="headerlink" href="#id103" title="Link to this heading"></a></h3>
<p>If setup is downloading files and an error occurs then it retries up
to 5 times.</p>
<p>Added SQLITE_CONFIG_LOG and SQLITE_OPEN_AUTOPROXY constants.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.compile_options" title="apsw.compile_options"><code class="xref py py-attr docutils literal notranslate"><span class="pre">compile_options</span></code></a> which tells you what compilation defines
SQLite was compiled with.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.log" title="apsw.log"><code class="xref py py-meth docutils literal notranslate"><span class="pre">log()</span></code></a> to call the SQLite logging interface, and updated
<a class="reference internal" href="apsw.html#apsw.config" title="apsw.config"><code class="xref py py-meth docutils literal notranslate"><span class="pre">config()</span></code></a> so you can set log destination function.</p>
</section>
<section id="id104">
<h3>3.6.22-r1<a class="headerlink" href="#id104" title="Link to this heading"></a></h3>
<p>Made it possible to run distutils ‘sdist’ from an already produced
source that was made from ‘sdist’.  This was necessary for some Python
virtual package environments.  Note that the recursive result does not
include the HTML help as distutils has no way of including content in
a reparented location.  <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/89">APSW issue 89</a></p>
<p>Various settings are output as pragma statements when making a dump
such as page size, encoding, auto_vacuum etc.  The pragmas are
commented out.  <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/90">APSW issue 90</a></p>
</section>
<section id="id105">
<h3>3.6.21-r1<a class="headerlink" href="#id105" title="Link to this heading"></a></h3>
<p>Source and binary files are now digitally signed which means you can
verify they have not been tampered with.  See <a class="reference internal" href="install.html#verifydownload"><span class="std std-ref">Verifying your download</span></a>
for instructions.</p>
<p>The pragmas generated for a shell dump are emitted outside the
transaction as they have no effect inside the transaction.</p>
<p>Removed some unintentional logging code left in CouchDB virtual
table code.</p>
</section>
<section id="id106">
<h3>3.6.20-r1<a class="headerlink" href="#id106" title="Link to this heading"></a></h3>
<p>Support for Python 3.0 has been dropped as it has been <a class="reference external" href="https://www.python.org/download/releases/3.0.1/">end of lifed</a>.  Use Python 3.1
onwards.</p>
<p>Changes to how some statements are <a class="reference external" href="https://sqlite.org/c3ref/prepare.html">prepared</a> to allow the new RANGE and
LIKE optimisations with bound variables introduced in SQLite 3.6.20 to
be used.  See <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/85">APSW issue 85</a> for the long and gory details.</p>
<p>You can now access <a class="reference external" href="https://couchdb.apache.org">CouchDB</a> using a
virtual table.  This lets you easily bidirectionally transfer data
between SQLite and CouchDB as well as work on data in both sources at
the same time.  Other example uses are in the documentation.</p>
<p><a class="reference internal" href="shell.html#shell"><span class="std std-ref">Shell</span></a> changes:</p>
<ul class="simple">
<li><p>.dump command now outputs views in the order they were created
rather than alphabetical as views could reference each
other. <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/82">APSW issue 82</a></p></li>
<li><p>.dump command now outputs the <a class="reference external" href="https://sqlite.org/pragma.html#pragma_user_version">user_version</a> as a comment.  It is
used by some programs (such as Firefox) to keep track of the schema
version.</p></li>
<li><p>Can now output in <a class="reference external" href="https://json.org">JSON</a>.</p></li>
<li><p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/83">APSW issue 83</a> - exception if history file didn’t exist</p></li>
<li><p>You can right justify output in column mode by specifying negative
widths. <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/84">APSW issue 84</a></p></li>
<li><p>You no longer get a traceback doing completions if there is a
virtual table in the database but the module is not loaded.
<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/86">APSW issue 86</a></p></li>
<li><p>You can now get detailed tracebacks including local variables using
the “.exception ON” command.  This is useful when developing
virtual tables and similar functionality.</p></li>
<li><p>You can now terminate a SQL statement with “go” or “/” on a line
by itself.</p></li>
</ul>
</section>
<section id="id107">
<h3>3.6.19-r1<a class="headerlink" href="#id107" title="Link to this heading"></a></h3>
<p><strong>Backwards incompatible change</strong> Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/72">APSW issue 72</a> where APSW wasn’t
zero basing virtual table <a class="reference internal" href="vtable.html#apsw.VTTable.BestIndex" title="apsw.VTTable.BestIndex"><code class="xref py py-meth docutils literal notranslate"><span class="pre">BestIndex()</span></code></a> constraints
returned as documented.  If you have working BestIndex code then you
need to update it for this release.  Thanks to Lefteris for finding
this issue.</p>
<p><strong>Backwards incompatible change</strong> The <a class="reference internal" href="apsw.html#apsw.complete" title="apsw.complete"><code class="xref py py-meth docutils literal notranslate"><span class="pre">complete()</span></code></a> method
has moved from <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> to <a class="reference internal" href="apsw.html#module-apsw" title="apsw: Python access to SQLite database library"><code class="xref py py-mod docutils literal notranslate"><span class="pre">apsw</span></code></a> where it should have
been all along.  You should now call <a class="reference internal" href="apsw.html#apsw.complete" title="apsw.complete"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.complete()</span></code></a> instead.  (It
even had an example showing it to be part of the module and not a
specific connection!)</p>
<p>There is now an <a class="reference internal" href="shell.html#apsw.shell.Shell" title="apsw.shell.Shell"><code class="xref py py-class docutils literal notranslate"><span class="pre">interactive</span> <span class="pre">shell</span></code></a> very similar to
that <a class="reference external" href="https://sqlite.org/sqlite.html">provided by SQLite</a>.  You
can embed it in your own program, inherit from it to provide more
commands and output modes, or just run it like this:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python -c &quot;import apsw ; apsw.main()&quot;
</pre></div>
</div>
<p>Added the <a class="reference external" href="https://sqlite.org/c3ref/c_limit_attached.html">SQLITE_LIMIT_TRIGGER_DEPTH</a>,
<a class="reference external" href="https://sqlite.org/c3ref/c_open_autoproxy.html">SQLITE_OPEN_PRIVATECACHE</a> and
<a class="reference external" href="https://sqlite.org/c3ref/c_open_autoproxy.html">SQLITE_OPEN_SHAREDCACHE</a> constants.</p>
<p>The <code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> file now has the various options available made
applicable to appropriate commands only.  Read the <a class="reference internal" href="install.html#setup-py-flags"><span class="std std-ref">updated
documentation</span></a>.</p>
<p>You can now specify <cite>build –enable=stat2</cite> to <code class="file docutils literal notranslate"><span class="pre">setup.py</span></code>
to enable <a class="reference external" href="https://sqlite.org/compile.html#enable_stat2">advanced statistics gathering</a> for query
planning.</p>
<p><code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> can automatically fetch the asyncvfs
extension for you.  If the source is present when APSW is built then
it will be automatically included and <em>async_initialize</em> called.</p>
<p>A <a class="reference internal" href="apsw.html#apsw.fork_checker" title="apsw.fork_checker"><code class="xref py py-meth docutils literal notranslate"><span class="pre">fork_checker()</span></code></a> is available which turns on detection when you
have used SQLite objects across a fork (a <strong>very</strong> bad thing).  This
is possible on Unix like operating systems, especially if you use the
<a class="reference external" href="https://docs.python.org/3/library/multiprocessing.html">multiprocessing module</a>.</p>
<p>Extension loading is now compiled in by default when using the
amalgamation and compiled out when using existing libraries.  This is
more likely to match your machine.  You can use
<cite>–omit=load_extension</cite> or <cite>–enable=load_extension</cite>
to the build/build_ext commands to explicitly disable/enable extension
loading.  <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/67">APSW issue 67</a></p>
<p><code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> will now abort on a download that has no
checksum.  See <a class="reference internal" href="install.html#fetch-checksums"><span class="std std-ref">more information</span></a> on checksums.</p>
<p><a class="reference internal" href="install.html#setup-py-flags"><span class="std std-ref">setup.py</span></a> can also fetch the version of SQLite
currently under development before a release.  Use
<cite>–version=fossil</cite>.</p>
<p>Updated which code uses <a class="reference external" href="https://sqlite.org/c3ref/experimental.html">experimental SQLite APIs</a> based on changes in
SQLite.  The test suite will also work correctly with experimental on
or off.  (It is on by default.)</p>
</section>
<section id="id108">
<h3>3.6.18-r1<a class="headerlink" href="#id108" title="Link to this heading"></a></h3>
<p>The APSW license has been updated to allow you (at your option) to use
any <a class="reference external" href="https://opensource.org/licenses/alphabetical">OSI approved license</a>.</p>
<p>The <a class="reference internal" href="benchmarking.html#speedtest"><span class="std std-ref">speedtest</span></a> has been updated to (optionally) use unicode
characters and to (optionally) increase the sizes of data items.</p>
<p>Fixed error handling code to not record SQLite error strings in some
situations where it was not necessary.  This results in the code
executing a little faster.</p>
</section>
<section id="id109">
<h3>3.6.17-r1<a class="headerlink" href="#id109" title="Link to this heading"></a></h3>
<p>APSW has migrated from Subversion to <a class="reference external" href="https://en.wikipedia.org/wiki/Mercurial">Mercurial</a> for source code control.
Hosting remains at <a class="reference external" href="https://code.google.com/p/apsw/">Google Code</a></p>
<p>Updated a test due to VFS xUnlock errors now being ignored sometimes
by SQLite (cvstrac 3946).</p>
<p>The downloads page in the help didn’t mention the Windows Python 3.1
installer.</p>
<p>Running the test suite is now integrated into <code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> so you
can do the building and testing all in one go.  Sample command line:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ python setup.py install test
</pre></div>
</div>
<p>The test suite will now check the functionality of the FTS3, RTree and
ICU extensions if they were included.  (The Windows binary distribution
includes FTS3 and RTree by default.)</p>
<p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/55">APSW issue 55</a> where FTS3 was unintentionally omitted from the
Windows binary distribution.</p>
<p>Various documentation updates.</p>
</section>
<section id="id110">
<h3>3.6.16-r1<a class="headerlink" href="#id110" title="Link to this heading"></a></h3>
<p>Windows binary distribution includes Python 3.1.</p>
<p>Trivial tweaks to keep MSVC happy.</p>
</section>
<section id="id111">
<h3>3.6.15-r1<a class="headerlink" href="#id111" title="Link to this heading"></a></h3>
<p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/50">APSW issue 50</a> where <a class="reference internal" href="blob.html#apsw.Blob.read" title="apsw.Blob.read"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Blob.read()</span></code></a> was returning <em>None</em>
on end of file instead of the documented (and correct) empty
string/bytes.</p>
<p>Corrected spelling of option in <a class="reference internal" href="execution.html#apswtrace"><span class="std std-ref">apswtrace</span></a> and only
output CURSORFROM if SQL tracing is on.</p>
</section>
<section id="id112">
<h3>3.6.14.2-r1<a class="headerlink" href="#id112" title="Link to this heading"></a></h3>
<p>Updated test code because SQLite 3.6.15 returns a different error code
on trying to register a function with too many arguments (see
cvstrac 3875).</p>
</section>
<section id="id113">
<h3>3.6.14.1-r1<a class="headerlink" href="#id113" title="Link to this heading"></a></h3>
<p>Changed some internal symbol names so they won’t clash with similar
new ones used by SQLite in the amalgamation.</p>
<p>Added <a class="reference internal" href="apsw.html#apsw.using_amalgamation" title="apsw.using_amalgamation"><code class="xref py py-attr docutils literal notranslate"><span class="pre">apsw.using_amalgamation</span></code></a> so you can tell if APSW was
compiled using the <a class="reference external" href="https://www.sqlite.org/amalgamation.html">SQLite amalgamation</a>.  Using the
amalgamation means that SQLite shared libraries are not used and will
not affect your code.</p>
<p>Added a checksums file so that when <code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> downloads SQLite,
we know it hasn’t been tampered with.  (The <a class="reference internal" href="install.html#setup-py-flags"><span class="std std-ref">–fetch-sqlite</span></a> argument can be used to automatically download
SQLite.)</p>
</section>
<section id="id114">
<h3>3.6.13-r1<a class="headerlink" href="#id114" title="Link to this heading"></a></h3>
<p>Added SQLITE_LOCKED_SHAREDCACHE <a class="reference external" href="https://sqlite.org/c3ref/c_ioerr_access.html">extended error code</a>.</p>
<p>Updated tests as the VFS delete error handling code in SQLite now
returns the same high level error code between Windows and
non-Windows.</p>
<p>The CHM format help file produced by the Windows HTML Help Compiler is
viewable again under Windows HTML Help Viewer.</p>
</section>
<section id="id115">
<h3>3.6.11-r1<a class="headerlink" href="#id115" title="Link to this heading"></a></h3>
<p>You can now use the <a class="reference external" href="https://sqlite.org/backup.html">hot backup functionality</a> introduced in SQLite 3.6.11.</p>
<p>Updated a VFS test to reflect changes in SQLite underlying error
handling.  (Previously SQLite almost always returned <a class="reference internal" href="exceptions.html#apsw.FullError" title="apsw.FullError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">FullError</span></code></a>
on any write that had an error but now returns <a class="reference internal" href="exceptions.html#apsw.SQLError" title="apsw.SQLError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SQLError</span></code></a>.)</p>
<p>Changed close methods so that Connections can be released earlier.</p>
<p>In prior releases a <a class="reference internal" href="cursor.html#apsw.Cursor.close" title="apsw.Cursor.close"><code class="xref py py-meth docutils literal notranslate"><span class="pre">closed</span> <span class="pre">cursor</span></code></a> could still be used
(reincarnated).  That is no longer the case and you will get
<a class="reference internal" href="exceptions.html#apsw.CursorClosedError" title="apsw.CursorClosedError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">CursorClosedError</span></code></a>.</p>
</section>
<section id="id116">
<h3>3.6.10-r1<a class="headerlink" href="#id116" title="Link to this heading"></a></h3>
<p>You can use the database as a <a class="reference external" href="https://docs.python.org/3/reference/datamodel.html#with-statement-context-managers">context manager</a>
as defined in <span class="target" id="index-2"></span><a class="pep reference external" href="https://peps.python.org/pep-0343/"><strong>PEP 0343</strong></a>.  When you use <em>with</em> a transaction is
started.  If the block finishes with an exception then the transaction
is rolled back, otherwise it is committed.  See <a class="reference internal" href="connection.html#apsw.Connection.__enter__" title="apsw.Connection.__enter__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.__enter__()</span></code></a>
for an example.</p>
<p>Behind the scenes the <a class="reference external" href="https://sqlite.org/lang_savepoint.html">savepoint</a> functionality introduced
in SQLite 3.6.8 is used.  Consequently <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> <em>with</em>
blocks can be nested.  If you use Connection level <a class="reference internal" href="execution.html#executiontracer"><span class="std std-ref">execution
tracers</span></a> then they will be called with the savepoint
SQL statements.</p>
<p>You can also use <a class="reference internal" href="blob.html#apsw.Blob" title="apsw.Blob"><code class="xref py py-class docutils literal notranslate"><span class="pre">blobs</span></code></a> as a context manager which
ensures it is always closed when finished using it.  See
<a class="reference internal" href="blob.html#apsw.Blob.__enter__" title="apsw.Blob.__enter__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Blob.__enter__()</span></code></a> for an example.</p>
<p>Added <a class="reference internal" href="apsw.html#sqliteconstants"><span class="std std-ref">constants</span></a>:</p>
<blockquote>
<div><ul class="simple">
<li><p>SQLITE_SAVEPOINT (authorizer code)</p></li>
<li><p>SQLITE_IOERR_CLOSE (extended result code)</p></li>
<li><p>SQLITE_IOERR_DIR_CLOSE (extended result code)</p></li>
<li><p>New mapping: SQLITE_FCNTL_LOCKSTATE, SQLITE_GET_LOCKPROXYFILE, SQLITE_SET_LOCKPROXYFILE, SQLITE_LAST_ERRNO.  SQLite does not document the purpose of these except the first one.</p></li>
</ul>
</div></blockquote>
<p>Updated <a class="reference internal" href="vfs.html#vfs"><span class="std std-ref">Virtual File System (VFS)</span></a> test code.  SQLite’s routines that call
<a class="reference internal" href="vfs.html#apsw.VFSFile.xTruncate" title="apsw.VFSFile.xTruncate"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFSFile.xTruncate()</span></code></a> used to ignore errors but now return an
error to the caller.  <a class="reference internal" href="vfs.html#apsw.VFSFile.xFileControl" title="apsw.VFSFile.xFileControl"><code class="xref py py-meth docutils literal notranslate"><span class="pre">VFSFile.xFileControl()</span></code></a> is now called so a
user implemented one must call any base it inherits from for SQLite to
function normally.</p>
<p>Updated the xDlSym VFS routine to have the different but compatible
type signature as changed in SQLite 3.6.7 to deal with pedantic
compiler warnings.</p>
<p>Fixed bug in <a class="reference internal" href="execution.html#apswtrace"><span class="std std-ref">apswtrace</span></a> that could result in poorly
formatted times.  Leading comments are also stripped for queries
printed in the final reports.  You can also request subsets of the
reports.</p>
<p>The <a class="reference internal" href="benchmarking.html#speedtest"><span class="std std-ref">speedtest</span></a> script will now fallback to the Python builtin
sqlite3 module if it can’t find an externally installed pysqlite.</p>
</section>
<section id="id117">
<h3>3.6.6.2-r1<a class="headerlink" href="#id117" title="Link to this heading"></a></h3>
<p>Windows binary download for Python 3.0 is available.</p>
<p>Various changes in data structures and containers to reduce code size.</p>
<p>Changed the code to handle SQLite errors to only use Python
functionality and no operating system functionality (thread local
storage).  This also addresses <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/36">APSW issue 36</a> where Vista was not binary
compatible with XP.  Thanks to Rudolf Gaertner for assistance in
detecting and diagnosing this issue.</p>
<p><a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connections</span></code></a>, <a class="reference internal" href="cursor.html#apsw.Cursor" title="apsw.Cursor"><code class="xref py py-class docutils literal notranslate"><span class="pre">cursors</span></code></a> and
<a class="reference internal" href="blob.html#apsw.Blob" title="apsw.Blob"><code class="xref py py-class docutils literal notranslate"><span class="pre">blobs</span></code></a> can be used by <a class="reference external" href="https://docs.python.org/3/library/weakref.html">weak references</a>.</p>
<p>You can now install <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> wide <a class="reference internal" href="connection.html#apsw.Connection.set_exec_trace" title="apsw.Connection.set_exec_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">execution</span></code></a> and <a class="reference internal" href="connection.html#apsw.Connection.set_row_trace" title="apsw.Connection.set_row_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">row</span></code></a>
<a class="reference internal" href="execution.html#tracing"><span class="std std-ref">tracers</span></a>.</p>
<p>The callbacks for execution and row tracers have a different signature
to include the cursor the execution or row happened on.  This is a
backwards incompatible change.  See <a class="reference internal" href="execution.html#tracing"><span class="std std-ref">tracing</span></a> for
details.</p>
<p>Due to popular demand, added <a class="reference internal" href="cursor.html#apsw.Cursor.fetchall" title="apsw.Cursor.fetchall"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.fetchall()</span></code></a>.  This is a
longer way of typing <code class="docutils literal notranslate"><span class="pre">list(cursor)</span></code>.</p>
<p>Added attributes to the <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> class -
<a class="reference internal" href="connection.html#apsw.Connection.filename" title="apsw.Connection.filename"><code class="xref py py-attr docutils literal notranslate"><span class="pre">filename</span></code></a>, <a class="reference internal" href="connection.html#apsw.Connection.open_flags" title="apsw.Connection.open_flags"><code class="xref py py-attr docutils literal notranslate"><span class="pre">open_flags</span></code></a> and
<a class="reference internal" href="connection.html#apsw.Connection.open_vfs" title="apsw.Connection.open_vfs"><code class="xref py py-attr docutils literal notranslate"><span class="pre">open_vfs</span></code></a>.  These let you track how the database
was opened.</p>
<p>Added a <a class="reference internal" href="execution.html#apswtrace"><span class="std std-ref">apswtrace</span></a> script to allow easy SQL tracing
without having to modify your code.</p>
<p>Revert to using older SQLite APIs in order to work around
cvstrac 2158.  (This also saves a little bit of SQLite memory
usage).  The user visible effect was that you could get different
exceptions and error text depending on whether a query was already in
the <a class="reference internal" href="execution.html#statementcache"><span class="std std-ref">statement cache</span></a> or if you were
multi-threading.  As an example, if you have a query that used an
unknown collation then SQLite’s <a class="reference external" href="https://sqlite.org/c3ref/prepare.html">prepare</a> returns
<em>SQLITE_ERROR</em> with error text about the bad collation.  If a
query had already been prepared, the collation removed and then <a class="reference external" href="https://sqlite.org/c3ref/step.html">run</a> the new SQLite routines are
returning <em>SQLITE_SCHEMA</em> and generic <code class="docutils literal notranslate"><span class="pre">schema</span> <span class="pre">changed</span></code> error
text.  Changing user defined functions could also cause a previously
correct query to become invalid.</p>
</section>
<section id="id118">
<h3>3.6.5-r1<a class="headerlink" href="#id118" title="Link to this heading"></a></h3>
<p>The distribution now includes a <a class="reference internal" href="benchmarking.html#speedtest"><span class="std std-ref">speedtest</span></a> script.  You can use
this to see how APSW performs relative to pysqlite, or to track
performance differences between SQLite versions.  The underlying
queries are derived from <a class="reference external" href="https://sqlite.org/src/finfo?name=tool/mkspeedsql.tcl">SQLite’s speed test</a></p>
<p>The statement cache was completely rewritten.  It uses less memory and
scales significantly better.</p>
<p>It was possible to get a deadlock between the Python GIL and the
SQLite database mutex when using the same <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> across
multiple threads.  Fixed by releasing the GIL in more places and added
test that inspects the source to verify GIL/mutex handling.  Thanks to
amicitas reporting this as <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/31">APSW issue 31</a></p>
<p>SQLite’s API has been extended in 3.6.5 so that errors can be
retrieved in a thread safe manner.  APSW now uses this API.</p>
<p>As a consequence of the prior two changes it is now possible and safe
to use the same <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> across as many threads as you want
<a class="reference external" href="https://sqlite.org/threadsafe.html">concurrently</a>.</p>
<p>Documentation is now done using <a class="reference external" href="https://www.sphinx-doc.org/">Sphinx</a>
which was adopted by Python 2.6 and 3.  This has allowed for richer
documentation and more output formats such as PDF and <a class="reference external" href="https://en.wikipedia.org/wiki/Microsoft_Compiled_HTML_Help">Windows CHM</a> format.</p>
<p>The binary distribution for Windows includes the <a class="reference external" href="https://sqlite.org/fts3.html">full text search</a> (FTS) and <a class="reference external" href="https://sqlite.org/src/finfo?name=ext/rtree/README">Rtree</a> extensions.
See also <a class="reference internal" href="install.html#setup-py-flags"><span class="std std-ref">setup.py commands and their options</span></a>.</p>
<p>The source structure and files were reorganized to make it clearer
where things are implemented and to make automatic extraction of
documentation easier.</p>
</section>
<section id="id119">
<h3>3.6.3-r1<a class="headerlink" href="#id119" title="Link to this heading"></a></h3>
<p>You can now write your own <a class="reference internal" href="vfs.html#vfs"><span class="std std-ref">Virtual File System (VFS)</span></a> in Python. You can also inherit
from an existing VFS making it easy to augment or override small bits
of behaviour without having to code everything else. See the
<a class="reference internal" href="example.html#example-vfs"><span class="std std-ref">example</span></a> where database files are obfuscated by
XORing their contents.</p>
<p><code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> now takes an optional <cite>–fetch-sqlite[=ver]</cite>
argument to automatically download and use the latest SQLite
amalgamation (or a specified version). On non-Windows platforms it
will also work out what compile flags SQLite needs (for example
<em>HAVE_USLEEP</em>, <em>HAVE_LOCALTIME_R</em>). Several other
options to <code class="file docutils literal notranslate"><span class="pre">setup.py</span></code> are also available to control
enabling/omitting certains features and functionality. See
<a class="reference external" href="https://docs.python.org/3/extending/building.html#building" title="(in Python v3.12)"><span class="xref std std-ref">building</span></a> for further details.</p>
<p>APSW checks that SQLite was compiled to be <a class="reference external" href="https://sqlite.org/c3ref/threadsafe.html">threadsafe</a></p>
<p>Added new constants:</p>
<ul class="simple">
<li><p><em>SQLITE_IOERR_ACCESS</em>, <em>SQLITE_IOERR_CHECKRESERVEDLOCK</em> and <em>SQLITE_IOERR_LOCK</em> extended result codes</p></li>
<li><p><em>SQLITE_OPEN_NOMUTEX</em> and <em>SQLITE_OPEN_FULLMUTEX</em> open flags</p></li>
<li><p>Several new <em>SQLITE_CONFIG</em> and <em>SQLITE_STATUS</em> codes</p></li>
</ul>
<p>Wrapped several new SQLite apis:</p>
<ul class="simple">
<li><p><a class="reference external" href="https://sqlite.org/c3ref/config.html">sqlite3_config</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/initialize.html">sqlite3_initialize/sqlite3_shutdown</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/memory_highwater.html">sqlite3_memory_used/sqlite3_memory_highwater</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/status.html">sqlite3_status</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/soft_heap_limit.html">sqlite3_soft_heap_limit</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/release_memory.html">sqlite3_release_memory</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/randomness.html">sqlite3_randomness</a></p></li>
</ul>
<p>The following experimental apis are not wrapped as there is nothing
useful you can do with them (yet):</p>
<ul class="simple">
<li><p><a class="reference external" href="https://sqlite.org/c3ref/db_config.html">sqlite3_db_config</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/db_status.html">sqlite3_db_status</a></p></li>
</ul>
<p>Restored prior behaviour regarding Python ints and longs returning int
for numbers fitting in signed 32 bit. This only affects Python 2 as
Python 3 uses long exclusively. Thanks to Joe Pham for reporting this
as <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/24">APSW issue 24</a></p>
<p>Added <a class="reference internal" href="connection.html#apsw.Connection.sqlite3_pointer" title="apsw.Connection.sqlite3_pointer"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.sqlite3_pointer()</span></code></a> method to help with
<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/26">APSW issue 26</a></p>
</section>
<section id="id120">
<h3>3.5.9-r2<a class="headerlink" href="#id120" title="Link to this heading"></a></h3>
<p>APSW now works with Python 3 (you need 3.0b1 or later).</p>
<p>(<a class="reference external" href="https://github.com/rogerbinns/apsw/issues/17">APSW issue 17</a>)
Removed the <em>SQLITE_MAX_</em> constants since they could be
unreliable (eg APSW can’t tell what a shared library was compiled
with). A workaround is documented in <a class="reference internal" href="connection.html#apsw.Connection.limit" title="apsw.Connection.limit"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.limit()</span></code></a>.</p>
</section>
<section id="id121">
<h3>3.5.9-r1<a class="headerlink" href="#id121" title="Link to this heading"></a></h3>
<p>APSW is now hosted at https://code.google.com/p/apsw</p>
<p>You can use this with SQLite 3.5.9 onwards.</p>
<p>SQLite now provides the source all <a class="reference external" href="https://www.sqlite.org/amalgamation.html">amalgamated</a> into one file
which improves performance and makes compilation and linking of SQLite
far easier. The build instructions are updated.</p>
<p><em>SQLITE_COPY</em> authorizer code and <em>SQLITE_PROTOCOL</em>
error code are no longer used by SQLite, but the values are left in
apsw for backwards compatibility</p>
<p><em>SQLITE_IOERR_DELETE</em>, <em>SQLITE_IOERR_BLOCKED</em> and <em>SQLITE_IOERR_NOMEM</em></p>
<p><a class="reference internal" href="connection.html#apsw.Connection.interrupt" title="apsw.Connection.interrupt"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.interrupt()</span></code></a> can be called from any thread</p>
<p>SQLite has implementation limits on string and blob lengths (roughly
constrained to fitting within a signed 32 bit integer - less than 2GB)
which weren’t checked. Using a 64 bit Python 2.5+ (as I do) it would
have been possible to destroy memory and crash the
program. Consequently APSW has length checks to ensure it doesn’t
happen.  SQLite now has further <a class="reference external" href="https://sqlite.org/limits.html">limits checking</a> which cover other things as well
such as maximum number of virtual machine opcodes, maximum number of
variables etc. These are very useful if you are taking in SQL
statements from elsewhere. Call <a class="reference internal" href="connection.html#apsw.Connection.limit" title="apsw.Connection.limit"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.limit()</span></code></a></p>
<p>A rename method was added for virtual tables.</p>
<p>SQLite 3.5 removed the requirement that all operations on a connection
be done in the same thread. Consequently all code that enforced the
restriction has been removed from APSW.</p>
<p>You no longer have to call <a class="reference internal" href="connection.html#apsw.Connection.close" title="apsw.Connection.close"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.close()</span></code></a>. This was
previously a requirement to ensure that the correct thread was used
(destructors otherwise run in any thread). It is however still a good
idea to do so since you can catch exceptions when close is called
but not if you let the destructor do the closing.</p>
<p>SQLite now has incremental <a class="reference internal" href="blob.html#blobio"><span class="std std-ref">blob I/O</span></a></p>
<p><a class="reference external" href="https://github.com/rogerbinns/apsw/issues/4">APSW issue 4</a> which could lead to generic error messages was fixed in
SQLite 3.5.9.</p>
<p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/1">APSW issue 1</a> error in example code for virtual tables which caused
filename errors on Windows.</p>
<p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/15">APSW issue 15</a> releasing the GIL around calls to sqlite3_prepare.</p>
<p>Fixed <a class="reference external" href="https://github.com/rogerbinns/apsw/issues/7">APSW issue 7</a> ensuring that extension module filenames are
converted to utf8.</p>
<p>Use the <a class="reference external" href="https://sqlite.org/c3ref/open.html">sqlite3_open_v2</a>
interface which allows specifying which vfs to use. This release does
not allow you to write your own vfs as the SQLite vfs interface is
being changed for SQLite 3.6.</p>
<p>Used new SQLite functions that keep track of when virtual tables and
collations are no longer used so they can be released. Previously APSW
also had to keep track duplicating effort.</p>
<p>Improved test coverage a few more percent.</p>
<p>The statement cache now defaults to the same number of entries as
pysqlite (100). You can however specify more or less as needed.</p>
<p><a class="reference internal" href="connection.html#apsw.Connection.collation_needed" title="apsw.Connection.collation_needed"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.collation_needed()</span></code></a> was implemented.</p>
</section>
<section id="id122">
<h3>3.3.13-r1<a class="headerlink" href="#id122" title="Link to this heading"></a></h3>
<p>As of this release, APSW is now co-hosted with pysqlite meaning there
is one site to go to for your Python SQLite bindings. (Both projects
subsequently moved to Google Code.)</p>
<p>You can use this with SQLite 3.3.13 onwards. There were no API changes
in SQLite 3.3.10 to 3.3.13 although some internal bugs were fixed and
the 3.3.13 release is recommended over the earlier version.</p>
<p>Thanks to Ed Pasma for highlighting these issues:</p>
<ul class="simple">
<li><p><a class="reference internal" href="connection.html#apsw.Connection.interrupt" title="apsw.Connection.interrupt"><code class="xref py py-func docutils literal notranslate"><span class="pre">Connection.interrupt()</span></code></a> can be safely called from any thread.</p></li>
<li><p>Empty statements or those consisting entirely of whitespace do not
cause misuse errors (internally SQLite started returned NULL pointers
for those statements, and <a class="reference external" href="https://sqlite.org/c3ref/step.html">sqlite3_step</a> didn’t like being passed the
NULL pointer).</p></li>
<li><p>Changed special handling of <em>SQLITE_BUSY</em> error to be the same
as other errors. The special handling previously let you restart on
receiving busy, but also hung onto statements which could result in
other statements getting busy errors.</p></li>
</ul>
</section>
<section id="id123">
<h3>3.3.10-r1<a class="headerlink" href="#id123" title="Link to this heading"></a></h3>
<p>You can use this with SQLite 3.3.10 onwards.</p>
<p>Added a statement cache that works in conjunction with the
<a class="reference external" href="https://sqlite.org/c3ref/prepare.html">sqlite3_prepare_v2</a> API. A
few issues were exposed in SQLite and hence you must use SQLite 3.3.10
or later.</p>
</section>
<section id="id124">
<h3>3.3.9-r1<a class="headerlink" href="#id124" title="Link to this heading"></a></h3>
<p>You can use this with SQLite 3.3.9 onwards.</p>
<p>SQLite added <a class="reference external" href="https://sqlite.org/c3ref/prepare.html">sqlite3_prepare_v2</a> API. The net effect of this
API update is that you will not get SQLITE_SCHEMA any more. SQLite
will handle it internally.</p>
</section>
<section id="id126">
<h3>3.3.8-r1<a class="headerlink" href="#id126" title="Link to this heading"></a></h3>
<p>You can use this with SQLite 3.3.8 onwards. There was an incompatible
API change for virtual tables in SQLite 3.3.8.</p>
<p>Virtual tables updated for new api.</p>
<p>You must call <a class="reference internal" href="connection.html#apsw.Connection.close" title="apsw.Connection.close"><code class="xref py py-func docutils literal notranslate"><span class="pre">close()</span></code></a> on connections. You can
also call <a class="reference internal" href="cursor.html#apsw.Cursor.close" title="apsw.Cursor.close"><code class="xref py py-func docutils literal notranslate"><span class="pre">close()</span></code></a> on cursors, but it usually isn’t
necessary.</p>
<p>All strings are returned as unicode.</p>
<p><a class="reference external" href="https://docs.python.org/3/c-api/exceptions.html?highlight=pyerr_writeunraisable#c.PyErr_WriteUnraisable">PyErr_WriteUnraisable</a>
was used for errors in destructors. Unfortunately it is almost
completely useless, merely printing <em>str</em> of the object and exception.
This doesn’t help in finding where in your code the issue arose so you
could fix it. An internal APSW implementation generates a traceback
and calls <a class="reference external" href="https://docs.python.org/3/library/sys.html#sys.excepthook" title="(in Python v3.12)"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.excepthook()</span></code></a>, the default implementation of which
prints the exception and the traceback to sys.stderr.</p>
<blockquote>
<div><div class="admonition note">
<p class="admonition-title">Note</p>
<p>The line number reported in the traceback is often off by
1. This is because the destructors run “between” lines of
code and so the following line is reported as the current
location.</p>
</div>
</div></blockquote>
<p>Authorizer codes <em>SQLITE_CREATE_VTABLE</em>,
<em>SQLITE_DROP_VTABLE</em> and <em>SQLITE_FUNCTION</em> added.</p>
<p>SQLite <a class="reference external" href="https://www.sqlite.org/rescode.html#extrc">extended result codes</a> are
available - see <a class="reference internal" href="exceptions.html#exceptions"><span class="std std-ref">Exceptions and Errors</span></a> for more detail.</p>
<p><a class="reference internal" href="apsw.html#apsw.connection_hooks" title="apsw.connection_hooks"><code class="xref py py-data docutils literal notranslate"><span class="pre">apsw.connection_hooks</span></code></a> added so you can easily register functions,
virtual tables or similar items with each Connection as it is created.</p>
<p>Added <a class="reference internal" href="apsw.html#sqliteconstants"><span class="std std-ref">mapping dicts</span></a> which makes it easy to
map the various constants between strings and ints.</p>
</section>
<section id="id127">
<h3>3.3.7-r1<a class="headerlink" href="#id127" title="Link to this heading"></a></h3>
<p>Never released as 3.3.8 came along.</p>
<p>You can use this release against SQLite 3.3.7. There were no changes
in the SQLite 3.3.6 API from 3.3.5. In SQLite 3.3.7 an API was added
that allowed removing a chunk of duplicate code. Also added were
<a class="reference external" href="https://www.sqlite.org/vtab.html">Virtual Tables</a>
and loading of external modules (shared libraries).</p>
<p>APSW had the following changes:</p>
<ul class="simple">
<li><p>Even more test cases added (you can’t have too many tests :-)</p></li>
<li><p>When exceptions occur, dummy frames are added to the traceback in the
C code. This makes it a lot easier to tell why code was called if you
encounter an exception. See <a class="reference internal" href="exceptions.html#augmentedstacktraces"><span class="std std-ref">augmented stack traces</span></a> for details.</p></li>
<li><p>String values (traditional and Unicode) work correctly if they have
embedded NULL characters (ie not truncated at the NULL).</p></li>
<li><p>You can load SQLite shared library extensions.</p></li>
</ul>
</section>
<section id="id128">
<h3>3.3.5-r1<a class="headerlink" href="#id128" title="Link to this heading"></a></h3>
<p>You can use this release against any release of SQLite 3 from 3.3.5
onwards. A bug was also fixed when reporting an error during the
cleanup of an aggregate function if there had also been an error in
the step function.  (<a class="reference external" href="https://docs.python.org/3/c-api/exceptions.html?highlight=pyerr_writeunraisable#c.PyErr_WriteUnraisable">PyErr_WriteUnraisable(NULL)</a>
crashed on some versions of Python but not others.)</p>
<p>SQLite added several functions for returning metadata about result
column sets. You have to compile SQLite with
<em>SQLITE_ENABLE_COLUMN_METADATA</em> to get them. This is not the
default for SQLite. I don’t believe these are generally useful except
in some corner cases and so they aren’t wrapped. However please shout
if you do need them.  Note that <a class="reference internal" href="cursor.html#apsw.Cursor.get_description" title="apsw.Cursor.get_description"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.get_description()</span></code></a> will
already give you generally useful information. (Also see the <a class="reference external" href="https://sqlite.org/pragma.html">pragmas</a>)</p>
<p>The test code has been converted into using the unittest module. Run
<strong class="command">python tests.py -v</strong> to get the tests run. There should be no
errors.</p>
<p>Updated code to work correctly with new <a class="reference external" href="https://docs.python.org/3/c-api/intro.html#c.Py_ssize_t" title="(in Python v3.12)"><code class="xref c c-type docutils literal notranslate"><span class="pre">Py_ssize_t</span></code></a> introduced
in Python 2.5. See 64 bit hosts, Python 2.5+ for
more details on how Python and SQLite handle 64 bit sized items.</p>
<p>The following functions were added to SQLite and are wrapped. They are
all functions defined on the <a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a> object or <a class="reference internal" href="apsw.html#module-apsw" title="apsw: Python access to SQLite database library"><code class="xref py py-mod docutils literal notranslate"><span class="pre">apsw</span></code></a>
module:</p>
<ul class="simple">
<li><p><a class="reference external" href="https://sqlite.org/c3ref/update_hook.html">sqlite3_update_hook</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/commit_hook.html">sqlite3_rollback_hook</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/enable_shared_cache.html">sqlite3_enable_shared_cache</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/get_autocommit.html">sqlite3_get_autocommit</a></p></li>
<li><p><a class="reference external" href="https://sqlite.org/c3ref/profile.html">sqlite3_profile</a> This
callback is run at the end of each statement execution telling you how
long it took.</p></li>
</ul>
</section>
<section id="id129">
<h3>3.2.7-r1<a class="headerlink" href="#id129" title="Link to this heading"></a></h3>
<p>You can use this release against any release of SQLite 3.</p>
<p>SQLite 3.2.7 has several bug fixes. The undocumented experimental
function <em>sqlite3_profile</em> was added, but it not present in apsw
yet.</p>
<p>The author of pysqlite has improved it considerably since APSW was
originally written. The differences section has been updated to
reflect those improvements in pysqlite.</p>
<p><em>SQLITE_INTERNAL</em> and <em>SQLITE_NOTFOUND</em> error codes are
not used according to 3.2.7 header file. They are still present in
APSW for backwards compatibility.</p>
<p>Changed the build instructions so configure is run on non-Windows
platforms.</p>
<p>Fixed a bug caused by an overly helpful error message trying to tell
you how many bindings you supplied that crashed if you didn’t supply
any.</p>
<p>Changed when an error in the step function for an aggregate is
reported due to limitations in SQLite.</p>
</section>
<section id="id130">
<h3>3.2.2-r1<a class="headerlink" href="#id130" title="Link to this heading"></a></h3>
<p>You can use this release against any release of SQLite 3.</p>
<p>SQLite 3.2.2 API removed <em>sqlite3_global_recover</em>. That function
was not wrapped in APSW. Note that SQLite 3.2.2 contains a bug fix
that applies when you use 64 bit integer primary keys (32 bit ints are
fine).</p>
</section>
<section id="id131">
<h3>3.2.1-r1<a class="headerlink" href="#id131" title="Link to this heading"></a></h3>
<p>You can use this release against any release of SQLite 3.</p>
<p>There are no changes in APSW except to correct an error in the example
code (collations are registered against the connection not the cursor)</p>
<p>SQLite 3.2.1 had one addition in the stable C API, which was a new
function named <em>sqlite3_global_recover</em>. That function is not
applicable for wrapping in APSW.</p>
</section>
<section id="id132">
<h3>3.1.3-r1<a class="headerlink" href="#id132" title="Link to this heading"></a></h3>
<p>You can use this release against any release of SQLite 3.</p>
<p>The text string returned by apsw.Error used to say
“apsw.APSWException” and has been changed to “apsw.Error”.  This is
purely cosmetic and helps make clear what the class is. (The old
string was what the original class name was in an earlier version of
the code.)</p>
<p>Added <em>SQLITE_ALTER_TABLE</em> and <em>SQLITE_REINDEX</em>
constants for the authorizer function.  (These constants were
introduced in SQLite 3.1.3).</p>
<p>Changed various C++-isms into standard C (eg // comments and the
placing of some <em>CHECK_THREAD</em> macro calls).</p>
<p>Added module level function <a class="reference internal" href="apsw.html#apsw.apsw_version" title="apsw.apsw_version"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw_version()</span></code></a> which returns
the version of APSW.</p>
<p>SQLite 3.1.3 had no changes in the stable C API other than what is
mentioned above. There were some new experimental functions added
which are not currently documented on the SQLite website, which are
not wrapped by APSW.  Please contact me if you believe they will
remain in SQLite and you would like them wrapped:</p>
<ul class="simple">
<li><p><em>sqlite3_sleep</em> An alternative function which sleeps for a
specified number of milliseconds can be provided. By default SQLite
just uses the standard operating system call.</p></li>
<li><p><em>sqlite3_expired</em> This function is internal to statement
execution. It would apply to the implementation of
<a class="reference internal" href="cursor.html#apsw.Cursor.executemany" title="apsw.Cursor.executemany"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.executemany()</span></code></a> and could in theory provide a marginal
improvement in performance.</p></li>
<li><p>A global variable <em>sqlite3_temp_directory</em> can be used before
any databases are opened to set where temporary files are created. By
default SQLite just uses the standard operating system mechanisms.</p></li>
</ul>
</section>
<section id="r3">
<h3>3.0.8-r3<a class="headerlink" href="#r3" title="Link to this heading"></a></h3>
<p>There are no functional changes. The only changes were to correct some
variable names in the example code (they were cut and pasted from the
test code which used different names) and to make the source zip file
extract its contents into a sub-directory which is the more typical
way of packaging that sort of thing.</p>
</section>
<section id="id133">
<h3>3.0.8-r2<a class="headerlink" href="#id133" title="Link to this heading"></a></h3>
<p>All remaining functionality in the C API for SQLite 3.0.8 is now
available.</p>
<p>Finished this documentation.</p>
</section>
<section id="id134">
<h3>3.0.8-r1<a class="headerlink" href="#id134" title="Link to this heading"></a></h3>
<p>Initial release</p>
</section>
</section>
<section id="renaming">
<span id="id135"></span><h2>Renaming<a class="headerlink" href="#renaming" title="Link to this heading"></a></h2>
<p>Early APSW exposed some method and attribute names not complying with
Python naming conventions as documented in <span class="target" id="index-3"></span><a class="pep reference external" href="https://peps.python.org/pep-0008/"><strong>PEP 8</strong></a>.  For example
<code class="docutils literal notranslate"><span class="pre">exceptionfor</span></code> instead of <code class="docutils literal notranslate"><span class="pre">exception_for</span></code>.  This has now been
corrected with the compliant names being documented and used in
examples.  The old names are still available maintaining
<a class="reference internal" href="about.html#backcompat"><span class="std std-ref">backwards compatibility</span></a>.</p>
<p>The change happened in version 3.43.2.0.</p>
<table class="docutils align-default">
<thead>
<tr class="row-odd"><th class="head"><p>Class</p></th>
<th class="head"><p>Name</p></th>
<th class="head"><p>Old name</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><a class="reference internal" href="apsw.html#module-apsw" title="apsw: Python access to SQLite database library"><code class="xref py py-mod docutils literal notranslate"><span class="pre">apsw</span></code></a></p></td>
<td><p><a class="reference internal" href="apsw.html#apsw.apsw_version" title="apsw.apsw_version"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.apsw_version()</span></code></a></p></td>
<td><p><span class="target" id="index-4"></span>apswversion</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.enable_shared_cache" title="apsw.enable_shared_cache"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.enable_shared_cache()</span></code></a></p></td>
<td><p><span class="target" id="index-5"></span>enablesharedcache</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.exception_for" title="apsw.exception_for"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.exception_for()</span></code></a></p></td>
<td><p><span class="target" id="index-6"></span>exceptionfor</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.memory_high_water" title="apsw.memory_high_water"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.memory_high_water()</span></code></a></p></td>
<td><p><span class="target" id="index-7"></span>memoryhighwater</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.memory_used" title="apsw.memory_used"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.memory_used()</span></code></a></p></td>
<td><p><span class="target" id="index-8"></span>memoryused</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.release_memory" title="apsw.release_memory"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.release_memory()</span></code></a></p></td>
<td><p><span class="target" id="index-9"></span>releasememory</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.soft_heap_limit" title="apsw.soft_heap_limit"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.soft_heap_limit()</span></code></a></p></td>
<td><p><span class="target" id="index-10"></span>softheaplimit</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.sqlite_lib_version" title="apsw.sqlite_lib_version"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.sqlite_lib_version()</span></code></a></p></td>
<td><p><span class="target" id="index-11"></span>sqlitelibversion</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="apsw.html#apsw.vfs_names" title="apsw.vfs_names"><code class="xref py py-meth docutils literal notranslate"><span class="pre">apsw.vfs_names()</span></code></a></p></td>
<td><p><span class="target" id="index-12"></span>vfsnames</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="backup.html#apsw.Backup" title="apsw.Backup"><code class="xref py py-class docutils literal notranslate"><span class="pre">Backup</span></code></a></p></td>
<td><p><a class="reference internal" href="backup.html#apsw.Backup.page_count" title="apsw.Backup.page_count"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Backup.page_count</span></code></a></p></td>
<td><p><span class="target" id="index-13"></span>pagecount</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="blob.html#apsw.Blob" title="apsw.Blob"><code class="xref py py-class docutils literal notranslate"><span class="pre">Blob</span></code></a></p></td>
<td><p><a class="reference internal" href="blob.html#apsw.Blob.read_into" title="apsw.Blob.read_into"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Blob.read_into()</span></code></a></p></td>
<td><p><span class="target" id="index-14"></span>readinto</p></td>
</tr>
<tr class="row-odd"><td><p><a class="reference internal" href="connection.html#apsw.Connection" title="apsw.Connection"><code class="xref py py-class docutils literal notranslate"><span class="pre">Connection</span></code></a></p></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.blob_open" title="apsw.Connection.blob_open"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.blob_open()</span></code></a></p></td>
<td><p><span class="target" id="index-15"></span>blobopen</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.cache_flush" title="apsw.Connection.cache_flush"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.cache_flush()</span></code></a></p></td>
<td><p><span class="target" id="index-16"></span>cacheflush</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.collation_needed" title="apsw.Connection.collation_needed"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.collation_needed()</span></code></a></p></td>
<td><p><span class="target" id="index-17"></span>collationneeded</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.create_aggregate_function" title="apsw.Connection.create_aggregate_function"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_aggregate_function()</span></code></a></p></td>
<td><p><span class="target" id="index-18"></span>createaggregatefunction</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.create_collation" title="apsw.Connection.create_collation"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_collation()</span></code></a></p></td>
<td><p><span class="target" id="index-19"></span>createcollation</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.create_module" title="apsw.Connection.create_module"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_module()</span></code></a></p></td>
<td><p><span class="target" id="index-20"></span>createmodule</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.create_scalar_function" title="apsw.Connection.create_scalar_function"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.create_scalar_function()</span></code></a></p></td>
<td><p><span class="target" id="index-21"></span>createscalarfunction</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.enable_load_extension" title="apsw.Connection.enable_load_extension"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.enable_load_extension()</span></code></a></p></td>
<td><p><span class="target" id="index-22"></span>enableloadextension</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.exec_trace" title="apsw.Connection.exec_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.exec_trace</span></code></a></p></td>
<td><p><span class="target" id="index-23"></span>exectrace</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.file_control" title="apsw.Connection.file_control"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.file_control()</span></code></a></p></td>
<td><p><span class="target" id="index-24"></span>filecontrol</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.get_autocommit" title="apsw.Connection.get_autocommit"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.get_autocommit()</span></code></a></p></td>
<td><p><span class="target" id="index-25"></span>getautocommit</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.get_exec_trace" title="apsw.Connection.get_exec_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.get_exec_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-26"></span>getexectrace</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.get_row_trace" title="apsw.Connection.get_row_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.get_row_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-27"></span>getrowtrace</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.load_extension" title="apsw.Connection.load_extension"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.load_extension()</span></code></a></p></td>
<td><p><span class="target" id="index-28"></span>loadextension</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.overload_function" title="apsw.Connection.overload_function"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.overload_function()</span></code></a></p></td>
<td><p><span class="target" id="index-29"></span>overloadfunction</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.row_trace" title="apsw.Connection.row_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Connection.row_trace</span></code></a></p></td>
<td><p><span class="target" id="index-30"></span>rowtrace</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_authorizer" title="apsw.Connection.set_authorizer"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_authorizer()</span></code></a></p></td>
<td><p><span class="target" id="index-31"></span>setauthorizer</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_busy_handler" title="apsw.Connection.set_busy_handler"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_busy_handler()</span></code></a></p></td>
<td><p><span class="target" id="index-32"></span>setbusyhandler</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_busy_timeout" title="apsw.Connection.set_busy_timeout"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_busy_timeout()</span></code></a></p></td>
<td><p><span class="target" id="index-33"></span>setbusytimeout</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_commit_hook" title="apsw.Connection.set_commit_hook"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_commit_hook()</span></code></a></p></td>
<td><p><span class="target" id="index-34"></span>setcommithook</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_exec_trace" title="apsw.Connection.set_exec_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_exec_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-35"></span>setexectrace</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_profile" title="apsw.Connection.set_profile"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_profile()</span></code></a></p></td>
<td><p><span class="target" id="index-36"></span>setprofile</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_progress_handler" title="apsw.Connection.set_progress_handler"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_progress_handler()</span></code></a></p></td>
<td><p><span class="target" id="index-37"></span>setprogresshandler</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_rollback_hook" title="apsw.Connection.set_rollback_hook"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_rollback_hook()</span></code></a></p></td>
<td><p><span class="target" id="index-38"></span>setrollbackhook</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_row_trace" title="apsw.Connection.set_row_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_row_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-39"></span>setrowtrace</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_update_hook" title="apsw.Connection.set_update_hook"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_update_hook()</span></code></a></p></td>
<td><p><span class="target" id="index-40"></span>setupdatehook</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.set_wal_hook" title="apsw.Connection.set_wal_hook"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.set_wal_hook()</span></code></a></p></td>
<td><p><span class="target" id="index-41"></span>setwalhook</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.sqlite3_pointer" title="apsw.Connection.sqlite3_pointer"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.sqlite3_pointer()</span></code></a></p></td>
<td><p><span class="target" id="index-42"></span>sqlite3pointer</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="connection.html#apsw.Connection.total_changes" title="apsw.Connection.total_changes"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Connection.total_changes()</span></code></a></p></td>
<td><p><span class="target" id="index-43"></span>totalchanges</p></td>
</tr>
<tr class="row-even"><td><p><a class="reference internal" href="cursor.html#apsw.Cursor" title="apsw.Cursor"><code class="xref py py-class docutils literal notranslate"><span class="pre">Cursor</span></code></a></p></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.exec_trace" title="apsw.Cursor.exec_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.exec_trace</span></code></a></p></td>
<td><p><span class="target" id="index-44"></span>exectrace</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.get_connection" title="apsw.Cursor.get_connection"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.get_connection()</span></code></a></p></td>
<td><p><span class="target" id="index-45"></span>getconnection</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.get_description" title="apsw.Cursor.get_description"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.get_description()</span></code></a></p></td>
<td><p><span class="target" id="index-46"></span>getdescription</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.get_exec_trace" title="apsw.Cursor.get_exec_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.get_exec_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-47"></span>getexectrace</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.get_row_trace" title="apsw.Cursor.get_row_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.get_row_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-48"></span>getrowtrace</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.row_trace" title="apsw.Cursor.row_trace"><code class="xref py py-attr docutils literal notranslate"><span class="pre">Cursor.row_trace</span></code></a></p></td>
<td><p><span class="target" id="index-49"></span>rowtrace</p></td>
</tr>
<tr class="row-even"><td></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.set_exec_trace" title="apsw.Cursor.set_exec_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.set_exec_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-50"></span>setexectrace</p></td>
</tr>
<tr class="row-odd"><td></td>
<td><p><a class="reference internal" href="cursor.html#apsw.Cursor.set_row_trace" title="apsw.Cursor.set_row_trace"><code class="xref py py-meth docutils literal notranslate"><span class="pre">Cursor.set_row_trace()</span></code></a></p></td>
<td><p><span class="target" id="index-51"></span>setrowtrace</p></td>
</tr>
</tbody>
</table>
</section>
</section>


           </div>
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="copyright.html" class="btn btn-neutral float-left" title="Copyright and License" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; <a href="copyright.html">Copyright</a> 2004-2024, Roger Binns &lt;rogerb@rogerbinns.com&gt;.
      <span class="lastupdated">Last updated on Jun 16, 2024.
      </span></p>
  </div>

  Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
    provided by <a href="https://readthedocs.org">Read the Docs</a>.
   

</footer>
        </div>
      </div>
    </section>
  </div>
  <script>
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script> 

</body>
</html>