26 ms·
What's New in SQLite 3.35
- gigatexal 6y agowith the returning clause it should be trivial to do cdc now, no?
- paulryanrogers 6y agoCDC?
- nalgeon 6y agoIsn't it done with triggers? SQLite supports them since long ago
- gunnarmorling 6y agoInteresting thought; with the client/server database model, RETURNING isn't relevant for CDC, which rather extracts changes from the transaction log, not scoped to any particular client session. But in the case of SQLite and its embedded way of running, one could indeed envision to use it for implementing some basic CDC functionality at the application level. It'd still lack metadata though like transaction ids, log file offset, etc.
- gigatexal 6y agoTrue that’s right. I was just highlighting the spin that SQLite puts on the returning idea. What a really cool feature and db
- p4bl0 6y agoI was already completely fan of SQLite, but some of these new features are the cherries on the cake =).
- 4ec0755f5522 6y agoOh that "returning" is nice; in current SQLite I'm doing a second query to get that: SELECT last_insert_rowid()
- edoceo 6y agoYea, this one and column removal are my two favourites. And it makes it easier to switch this and PG
- masklinn 6y agoEspecially since last_insert_rowid() can never be free of race condition, and is basically useless whenever ON CONFLICT is involved.
- scottlamb 6y ago> Especially since last_insert_rowid() can never be free of race condition I think that's overstating it. It's per-connection, not per-database. If you don't share connections between threads, it's fine. If you keep the connection locked / checked out for the span of the two statement, it's fine. You're probably doing the latter anyway if you use transactions. Returning looks nice, though! Particularly that it can return "one result row for each database row that is deleted, inserted, or updated" rather than just one.
- masklinn 6y ago> Returning looks nice, though! Particularly that it can return "one result row for each database row that is deleted, inserted, or updated" rather than just one. That… seems normal? Returning just one row would make no sense, how would even a trivial `RETURNING id` work otherwise?
- scottlamb 6y agoSure, but I'm comparing to last_insert_rowid(), which can't do that. Also, last_insert_rowid() (by definition) doesn't work with "without rowid" tables, where returning can.
- rphln 6y agoThis is pretty neat. Now that they added `exp`, I'm tempted to implement an autojumper using [frecency] in SQL. I tried it once before, but gave up specifically because of this IIRC. [frecency]: https://wiki.mozilla.org/User:Jesse/NewFrecency?title=User:Jesse/NewFrecency https://wiki.mozilla.org/User:Jesse/NewFrecency?title=User:J...
- marvel_boy 6y agoWhat is an autojumper?
- rphln 6y agoIt's a shell command that allows you to `cd` to places without having to type the whole path. Some implementations are https://github.com/wting/autojump https://github.com/wting/autojump and https://github.com/rupa/z https://github.com/rupa/z. A very simplified example: if you call `j pro`, the command should take you to the folder that best matches the name based on some criteria (in my case, one of them would be frecency). In my case, that would be my projects folder in another drive. The nifty thing about them is that you don't have to make those aliases manually -- the tool learns the directories you've visited over time. Of course, the tool could take you to the wrong path, but with a well made set of matching/prioritization rules, I've found it more useful than not.
- throw_m239339 6y ago> Column removal Wow, finally. I Love SQlite. It saved my a* in so much projects where I had to implement an ETL, I just spawned some in memory SQLite database instead of writing some painful custom code in Language X or Z over and over again. Also used it to generate static search results in a flat file blogging platform since it does have some full text search capabilities. And let's not even talk about custom functions, including custom aggregation functions, in any client language, directly in your application code...
- dmarlow 6y ago> Probably the second most popular source of user suffering. It was #1 for me! Finally indeed.
- asveikau 6y agoI would have guessed desire to be the #1 source of user suffering.
- iagovar 6y ago> I had to implement an ETL Buddy, google DuckDB, it's like OLAP SQLite. You'll thank me later.
- bondant 6y agoDoes someone here use DuckDB in production? Is it as stable as SQLite? The hosting company I have to work with has a very old version of SQLite installed on the server and they don't want to update it. So I was looking at whether I could replace it with DuckDB since it seems to be easy to install with pip.
- banana_giraffe 6y agoAnswering the question you didn't ask: pysqlite3-binary is a Linux only package in PyPI that includes a recent version of SQLite apsw is a cross-platform package, it brings in a modern version as well, and additionally exposes everything SQLite can do (useful for me, you can write VFS drivers in python for it). The version of apsw in pypi is hopelessly out of date, the homepage has more details on how to install the latest version.
- dmarlow 6y ago> To delete a column, SQLite have to completely overwrite the table - so the operation is not fast. But it’s still nice. Can someone with more knowledge/experience ELI5, please? Is this essentially how it's done in other db engines? TIA
- masklinn 6y agopostgresql does essentially nothing on a drop column, in part because it doesn't use fixed-size tuples: > The DROP COLUMN form does not physically remove the column, but simply makes it invisible to SQL operations. Subsequent insert and update operations in the table will store a null value for the column. Thus, dropping a column is quick but it will not immediately reduce the on-disk size of your table, as the space occupied by the dropped column is not reclaimed. The space will be reclaimed over time as existing rows are updated. but if you VACUUM FULL (or CLUSTER) it will immediately rewrite the entire table. Also note that storing a null means forcing a null bitmap for every row (even if it's not otherwise used).
- awestroke 6y agoIn postgresql: The DROP COLUMN form does not physically remove the column, but simply makes it invisible to SQL operations. Subsequent insert and update operations in the table will store a null value for the column. Thus, dropping a column is quick but it will not immediately reduce the on-disk size of your table, as the space occupied by the dropped column is not reclaimed. The space will be reclaimed over time as existing rows are updated.
- airstrike 6y ago> The space will be reclaimed over time as existing rows are updated. Or as you VACUUM, correct? I think it lets you specific a column name too
- masklinn 6y agoVACUUM just marks tuples as free spaces so they can be reused. This is part of > The space will be reclaimed over time as existing rows are updated. because of MVCC, updating a row really inserts a new row and the old one eventually becomes free space (once a vacuum comes around to marking it). VACCUM FULL, however, will rewrite the entire table.
- esturk 6y agoIs there a site equivalent to "caniuse.com" for all the different database features by product and version? If not, someone should build one. Often some DB would say they added feature X but what does that mean? Did they implement this in advance of other DBs or behind others?
- WrtCdEvrydy 6y agoThe issue is there's no database feature spec so you end up with each DB having it's own version of something.
- dragonwriter 6y ago> The issue is there's no database feature spec ISO/IEC 9075 disagrees.
- WrtCdEvrydy 6y agoYeah, that's the query language used in relational databases but find my the spec for "database encryption" or "database clustering"
- setr 6y agoThe SQL spec is barely comprehensive of the SQL dialects found “in the wild”, let alone the entirely independent and much more interesting set of non-table managing/querying features databases provide. It provides at best a baseline for comparison.. and a fairly shallow one at that
- nalgeon 6y agoMarkus Winand is doing something like that at https://modern-sql.com/ https://modern-sql.com/. But it's not nearly as extensive as caniuse.com
- scrollaway 6y agoThat's a really wonderful idea.
- 6y ago
- The_rationalist 6y agoIt's such a shame that webSQL died, I hope they will reconsider the decision in the next few years.
- slaymaker1907 6y agoI think an independent implementation would help. Personally, I think SQLite is a unique project which is of such high quality that independence is unimportant, but others do not see it that way.
- hajile 6y agoWe now have three steaming piles of indexedDB garbage that are still (last I checked) implemented on top of sqlite anyway. I don't see how anyone could think the world became a better place after the change.
- hajile 6y agoEven if they don't, I at least hope they'll provide an alternative. indexedDB is hardly usable let alone a replacement for anything.
- Felk 6y ago> SQLite is called ‘lite’ for a reason. If you need functions, add them yourself. Most people I know, myself included, pronounce it that way. But Richard Hipp, the creator of SQLite, actually pronounces it SQL-ite, like a mineral.
- airstrike 6y ago> actually pronounces it SQL-ite, like a mineral. Surprised you didn't say he pronounces it SQL-ite like an animal
- deleted 6y ago[deleted]
- u678u 6y agoIt seems there is no universal agreement so you can pronounce which way you want. https://english.stackexchange.com/questions/431329/what-is-the-correct-pronunciation-of-sqlite https://english.stackexchange.com/questions/431329/what-is-t...
- euroderf 6y agoWhy not "sklite"? Monosyllabic - lite, ya know.
- moonchild 6y ago> To delete a column, SQLite have to completely overwrite the table - so the operation is not fast. But it’s still nice. Yet another reason why column stores are superior to row stores.
- wayneftw 6y agoThis is not a problem for "row stores" though, it's specific to SQLite. As a matter of fact, any classical RDBMS can effectively store columns off-page and and most of them do just that in the case of large TEXT/JSON/BLOB columns. Column stores like Redshift, Snowflake, etc. are optimized for a much narrower set of use cases. The more widely used databases could do the same optimizations internally but that would make them much less useful.
- einnjo 6y agoI recently used SQLite in my side project [1]. Here's what I learned from using it: * Shaving the overhead of network calls for queries sped up my site significantly. * Most CI/CD providers include SQLite in their base linux images and setup in local envs is easy as well. Running tests against the actual database is simple. * Replication is not available out of the box. To share a database with multiple instances of your app you will have to use a shared storage volume or some of the available solutions at [2][3][4], but they each come with their caveats. [1] https://www.tendielist.com https://www.tendielist.com [2] http://litereplica.io http://litereplica.io [3] http://litesync.io http://litesync.io [4] https://bedrockdb.com https://bedrockdb.com
- tyingq 6y agoMore than replication, but dqlite might be worth a look as well. It is supposedly stable now that it was rewritten in C. https://dqlite.io/ https://dqlite.io/
- deknos 6y agoalso https://github.com/rqlite/rqlite https://github.com/rqlite/rqlite
- toddgruben 6y agoYou can add this one to the list https://litestream.io/ https://litestream.io/
- benbjohnson 6y agoLitestream author here. Let me know if you have any questions. It's built to run as a separate process and to be super easy to get up and running. We have a GitHub discussion board and an active Slack group as well if you need any help.
- gunnarmorling 6y agoHey, lead of Debezium here, a change data capture tool for a number of databases (not SQLite, though). Out of curiousity, how are you implementing change ingestion, is there some interface/API in SQLite which lets you do this? Or are you manually parsing its log files?
- deknos 6y agoDo joins now work in every way (full, inner, outer)?
- ketralnis 6y agoThey always have, haven't they? https://www.sqlite.org/lang_select.html https://www.sqlite.org/lang_select.html
- deknos 6y agonot according to https://www.sqlite.org/omitted.html https://www.sqlite.org/omitted.html
- simonw 6y agoIf you can do a LEFT OUTER JOIN I don't see that there's any benefit in being able to do RIGHT OUTER JOIN - surely you can change the table order yourself? It looks like you can emulate FULL OUTER JOIN by doing a UNION between two LEFT joins, see https://www.sqlitetutorial.net/sqlite-full-outer-join/ https://www.sqlitetutorial.net/sqlite-full-outer-join/
- deknos 6y agomy worries are more, if i use it, like everywhere, that at some point, some "ORM Layer" like for example hibernate will use the right outer join for something and then break since this is not implemented. and there are also a few other quirks where i am not sure, if some systems do not need them (grant/revoke is of course meaning less)
- aembleton 6y agoWouldn't the ORM layer have knowledge of the SQL language of your DB engine? I thought that was one of the big wins of using an ORM.
- 6y ago
- krat0sprakhar 6y agoWhat's the best way to run a service that uses SQLite in a serverless / container environment (e.g. Cloud Run). I'd love to use this for my personal projects and I'm not sure how to set this up in a container given their ephemeral nature.
- elamje 6y agoYou can check out Dokku, which is the open source, single server Heroku equivalent. You can mount a storage volume to the container and access it from your app running in Docker. Dokku makes it stupid simple, so it might be worth reading the source code to see how they do that.
- hectormalot 6y agoI use Dokku, but it also has a Postgres plugin which is basically just a few commands. That also gives you the niceties of dokku pg:backup etc. If you’re on Dokku anyway then that’s what I would recommend. For me, SQLite remains the perfect file format for command line tools.
- segf4ult 6y agoIf your app is in a Docker container, you need to have some way to mount a persistent volume for the database. AWS Fargate and fly.io both offer storage volumes.
- justsomeuser 6y agoI doubt you can have a writable filesystem with any server less offering. Serverless offerings force you to have all your state network accessible so that they can offer you horizontal scalability by using load balancers - so no writable+persistable file system that SQLite needs. What I do is use a normal VM on GCP, run my docker container on that, and write to a regionally replicated disk (so it is copied between zones on every write). Snapshots run hourly and are stored in GCP storage. This gets you high reliability (if you can have a few mins down time to reboot) but not horizontal scalability.
- benbjohnson 6y ago
- swlkr 6y agoThis release changes everything! My biggest complaints were no returning clause, and no drop column. That's it, now I can run sqlite in production without hesitation!
- deft 6y agoThis release looks amazing. I use sqlite in almost every one of my sideprojects because it works everywhere and I can just open a file to inspect my db state which is really useful when mashing and trying to decide on table formats etc. The column delete and RETURNING additions are godsends, someone else said it already but this makes replacing postgres a lot easier.
- ketralnis 6y agoYou can also read the release notes[0] which is pretty readable as always doesn't take the extra time to denigrate the work of this excellent and freely provided software [0]: https://sqlite.org/releaselog/3_35_0.html https://sqlite.org/releaselog/3_35_0.html
- samatman 6y ago`RETURNING` will substantially clean up my code, and I already have one migration which could have just been a `DROP COLUMN`, so this is great news. On the subject of "it's called 'lite' for a reason", my wishlist does include library functions for working with RFC3339 timestamps. SQLite already ships with a fairly large suite of JSON tools, which are optional to compile into the library, so there's precedent. Datetimes are of those things which is incredibly annoying to get right, and really belongs inside the database. RFC3339 timestamps are already well designed, since if you stick to UTC (and if you don't store timezone data separately you deserve those problems), lexical order is temporal order, but queries which would be rendered in English as "return all accounts where last payment is ninety days prior to `now`" isn't really possible with string comparisons. Also, with the JSON library, you can use a check constraint to fail if a string isn't valid JSON, another affordance I would love to have for datetimes. Grateful for what we just got, though! Just daydreaming...
- nalgeon 6y agoSQLite has ISO-8601 compatible date functions, isn't that enough? sqlite> select datetime('now', '-90 days'); 2020-12-12 21:44:22 https://sqlite.org/lang_datefunc.html https://sqlite.org/lang_datefunc.html
- rover0 6y agoWithout a timezone the time is meaningless for many purposes.
- pupdogg 6y agoWe store 8 million transactions a day in UTC...customer time zone is merely an integer offset stored alongside...simple and easy, what’s wrong with that?
- Osiris 6y agoThe customer's offset is always changing but I assume you mean you're storing the offset as it was at the moment of the transaction. How do you deal with the twice a year time offsets when a transaction occured first but shows up after because the clock rolled back an hour? Isn't it generally better to store to the full timezone like America/New_York?
- siscia 6y agoI am running zeeSQL.com a Redis module that embeds SQLite into Redis to provide SQL and secondary indexes (search by value) on top of Redis. This release it is the first one I am really excited about . As soon as I can allocate few minutes I will update the SQLite code of the software. The RETURNING makes a lot of queries and use cases an order of magnitude simpler.
- eigenvalue 6y agoI love SQLite. Some of the best, most reliable code out there made by a small handful of people who really care about excellence. I’m curious if anyone here as experience with DQlite (https://dqlite.io/ https://dqlite.io/ ) from Canonical. It’s basically a distributed version of SQLite that combines it with the RAFT consensus protocol. It’s sounds like a great idea and I’m considering it for a project I’m working on now, but I’d love to hear what people think of it in practice.
- zdkl 6y agoThere's a very similar project, https://github.com/rqlite/rqlite https://github.com/rqlite/rqlite which has always felt more pleasant me.
- IgorPartola 6y agoI don’t use SQLite as my main data store for any project that runs on a server because a dedicated DB server has advantages. But that doesn’t mean that I don’t use it for production use. Here is an example from a few years ago: I needed to pull in a large dataset from CSV (several dozen gigabytes), do a bunch of transforms on it, extract a small subset of data that I actually was interested in, and load that subset into the main DB. I needed to do this in a way where it wouldn’t bog down the main DB server (which stored less data than what was in the CSVs), and also in a way where I could potentially load diffs of the CSV files as updates. So the solution was that a dedicated job would run on a server where the SQLite database was used to load the CSVs and to manipulate the data with SQL because that was way more convenient than doing it with ad hoc objects in Python. Once done, extract rows from SQLite and load into Postgres. The local DB would stick around to use the diffs for incremental updates, but if it was lost it was easy to recreate it from the last full dataset. Not highly available but highly understandably, cheap, fast, and dead simple.
- chrisweekly 6y agoSounds like a job for lnav (https://lnav.org https://lnav.org), an awesome little CLI "mini-ETL" powertool with SQLite embedded.
- porker 6y agoInteresting, have you used it for more than log file analysis? A "mini-ETL" sounds exactly what I need each week.
- chrisweekly 6y agoI technically only used it for logfiles, but as a key part of a chain of scripts / utils forming a simple custom test automation suite I cobbled together. Having done that, I'd reach for it first for any ETL-like task given structured data on the order of a few hundred thousand or maybe a few million rows.
- pablobaz 6y ago
- polyrand 6y agoThe `RETURNING` is so awesome! I'm implementing a set of data structures on top of SQLite, one of them is a queue[0], and I had to do a transaction to lock a message and then return it, but this makes it easier. There's one little issue I keep finding with SQLite, and it's that most virtual servers / VM images ship with version 3.22.0, and upgrading often means building from source. In any case, SQLite is absolutely wonderful. My favorite way of building products is having a folder for all the DBs that I mount to docker-compose. This release makes it even better. [0] https://github.com/litements/litequeue https://github.com/litements/litequeue
- lusbuab 6y agoI guess you already know it, but: «SQLite is really easy to compile» by Julia Evans, see https://jvns.ca/blog/2019/10/28/sqlite-is-really-easy-to-compile/ https://jvns.ca/blog/2019/10/28/sqlite-is-really-easy-to-com...
- polyrand 6y agoYes, I’m aware. I usually compile it during a multi stage docker build. There’s also pysqlite3 for Python when I need the latest version. However, my issue is when I want to access the DBs from the CLI to check something. If I am using features from 3.34.0 (inside my app) I will not be able to use them outside of it. I guess I will have to add the SQLite compilation as an extra step in my base bootstrapping script when I create servers. I hope some day apt-get will give me the latest version by default.
- viraptor 6y agoOr build it in a launchpad ppa and configure it as a repository. You'll get the latest version from apt-get as expected.
- avinassh 6y agoI saw this on the homepage: > However, SQLite is incredibly powerful. It can scale to thousands of concurrent users with the correct settings I never thought SQLite can do something like this. How does one go about scaling it for thousands of users? Are these just reads or read, writes? Are there any known real world use cases where people are actually doing this in production?
- nojvek 6y agoReturning and column deletes are a big deal. This will make me return back to SQLite. One other huge issue is that sqllite doesn’t enforce schema. You can say that a column is an int but it will happily insert strings. That is a huge minefield. I want SQLite but with strict enforced scheme that errors when it encounters an incorrect type.
- simonw 6y agoHave you tried using the CHECK constraint mechanism for this? https://www.sqlitetutorial.net/sqlite-check-constraint/ https://www.sqlitetutorial.net/sqlite-check-constraint/
- riyadparvez 6y agoI am curious to know. Is there any reason why they don't support schema enforcement?
- simonw 6y agoI'd love to know that too. The FAQ says at https://sqlite.org/faq.html#q3 https://sqlite.org/faq.html#q3 says "This is a feature, not a bug" https://sqlite.org/datatype3.html https://sqlite.org/datatype3.html says "the dynamic typing in SQLite allows it to do things which are not possible in traditional rigidly typed databases"... but it doesn't expand on that point at all. My best guess is that this is a language culture thing. SQLite has a strong connection to the Tcl community - it started life as a Tcl extension: https://www.sqlite.org/tclsqlite.html https://www.sqlite.org/tclsqlite.html - and Tcl is a very dynamically typed language. Whatever the reasons, it's not going to change now: SQLite has extremely strong backwards-compatibility guarantees, and this is very much baked into how it works. As a dynamic language person this has never bothered me in the slightest, but it's definitely something that comes up a lot from people who are put off using SQLite because of it.
- radus 6y agoAwesome! SQLite, from my perspective at least is feature-complete! Anyone else have any notable missing features?
- pgwhalen 6y agoAs superb a piece of software as SQLite is, it's definitely still missing features that many would use. No FULL OUTER JOINs is maybe the most notable that I've encountered. https://www.sqlite.org/omitted.html https://www.sqlite.org/omitted.html
- simonw 6y agoI'm curious as to what you use FULL OUTER JOINS for - I've so far never felt the need for them in my own work but I'd love to understand what I'm missing out on.
- pgwhalen 6y agoThe one use case I’ve found recently is joining sparse time series data. In other words, when the tables you’re joining are “equally important” as opposed to one depending on the other.
- erezsh 6y agoThat's awesome. Can't wait for these features to reach the Sqlite lib on Python in 5 years.
- simonw 6y agoI've been using pysqlite3 which is a drop-in replacement compiled against a more recent version. pysqlite3-binary even gives you a (Linux-only) pre-compiled wheel. https://github.com/coleifer/pysqlite3 https://github.com/coleifer/pysqlite3
- erezsh 6y agoThere is also this, which seems pretty good: https://github.com/rogerbinns/apsw https://github.com/rogerbinns/apsw (haven't tried it yet)
- systems 6y agowhy isnt materialized CTE a default optimization in sql? why do we need to be explicit about it any trade off
- simonw 6y agoI think the changelog is a bit confusing on that point. I interpret it as meaning that CTE is a default optimization: "The default behavior was formerly NOT MATERIALIZED, but is now changed to MATERIALIZED for CTEs that are used more than once" The default was NOT MATERIALIZED only because previous versions of SQLite didn't have this feature at all. "now changed to MATERIALIZED for CTEs that are used more than once" means that the query planner DOES use this optimization by default if you don't do anything - the optimization only makes sense for CTEs that are used more than once in the same query.
- systems 6y agoI think the change introduced this syntax with history as materialized { .. } so you have to declare the CTE as materialized to get this optimization
- simonw 6y agoThat's not how I interpret the release notes, but I can see why they are being misunderstood like that (assuming I'm right in my interpretation).
- masklinn 6y ago> so you have to declare the CTE as materialized to get this optimization Not necessarily. You can get a materialized CTE if you request it regardless of its usage pattern, but you will also get one if the CTE is used more than once unless you suppress it.
- masklinn 6y ago> The default was NOT MATERIALIZED only because previous versions of SQLite didn't have this feature at all. The default was NOT MATERIALIZED because it's what the sqlite devs had selected whe they implemented CTEs. Pg did the exact opposite before the feature was added (and exposed to end-users): CTEs would always be MATERIALIZED. And similarly, with the introduction of [NOT] MATERIALIZED they changed the default in some cases: for pg if the CTE is non-recursive, has no side-effects, and is only referenced once, then it defaults to NOT MATERIALIZED.
- submeta 6y agoAnyone know how to get this version running on a Mac? Trying to brew upgrade it fails: sqlite is keg-only, which means it was not symlinked into /usr/local, because macOS already provides this software and installing another version in parallel can cause all kinds of trouble. And checking installed version: $ type sqlite3 sqlite3 is /usr/bin/sqlite3 $ sqlite3 SQLite version 3.28.0 2019-04-15 14:49:49 Enter ".help" for usage hints.
- re 6y agoYou can invoke it as `/usr/local/opt/sqlite/bin/sqlite3`. Or run `brew info sqlite3` to see how to add it to your path. https://docs.brew.sh/FAQ#what-does-keg-only-mean https://docs.brew.sh/FAQ#what-does-keg-only-mean
- submeta 6y agoOk, got it. Found out it was installed: $ mdfind -name sqlite3 | grep -E 'bin/sqlite3$' /usr/local/Cellar/sqlite/3.34.1/bin/sqlite3 /usr/bin/sqlite3 Just need to symlink it or add it to path. Or `brew link sqlite`. Thanks!
- bmn__ 6y agoAlso see: "SQLite now allows multiple recursive SELECT statements in a single recursive CTE" https://news.ycombinator.com/item?id=24843643 https://news.ycombinator.com/item?id=24843643
- polyrand 6y agoOne thing to note about the `RETURNING` clause is that it can't be used in subqueries[0] or CTEs. One thing I do with Postgres is using multiple CTEs with `RETURNING` clauses to have a query with many steps, without having to open a transaction and doing many queries. The SQLite documentation says it's something that they want to implement. Having that would be very nice. We could do complex queries all at once without having to lock the DB during the whole transaction. [0] https://sqlite.org/draft/lang_returning.html#limitations_and_caveats https://sqlite.org/draft/lang_returning.html#limitations_and...
- junippor 6y ago> SQLite is called ‘lite’ for a reason. If you need functions, add them yourself. Ok, lets say that SQLite developer believe this position has merit (they must've have, since they held it for 20 years, right?) So what changed now which led to you implementing such functions? Nothing changed, you just didn't _feel_ like doing it.
- simonw 6y agoThat's not a direct quote from the maintainers - the author of the post seems to have made it up. I imagine what changed is that the SQLite maintainers actively listen to their developer community, and decided it was finally time to prioritize that piece of work over other features.