PThorpe92
f223e66c82
Remove unused mut and fix merge conflict issues
2025-04-09 11:15:04 -04:00
PThorpe92
62d1447cd6
Adapt query plan to handle vatbs for updates
2025-04-09 11:15:02 -04:00
PThorpe92
0ffecb3021
Add comments to document update on vtabs
2025-04-09 11:06:41 -04:00
PThorpe92
b685086cad
Support UPDATE for virtual tables
2025-04-09 11:06:41 -04:00
Pekka Enberg
a4d9f70ef8
Merge 'Strict table support' from Ihor Andrianov
...
Closes #884
Support for
```CREATE TABLE test(id INTEGER) STRICT;```
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1268
2025-04-09 16:45:56 +03:00
Jussi Saurio
3124fca5b7
Dereference instead of explicit clone
2025-04-09 10:14:29 +03:00
Jussi Saurio
024c63f808
optimizer: remove ORDER BY if index can be used to satisfy the order
2025-04-09 10:14:29 +03:00
Jussi Saurio
a706b7160a
planner: support index backwards seeks and iteration
2025-04-09 10:14:29 +03:00
Jussi Saurio
ed929d2a0a
Merge 'Properly handle insertion of indexed columns' from Preston Thorpe
...
```console
limbo> create index p on products(price);
limbo> explain insert into products (name,price) values ('huh',32);
addr opcode p1 p2 p3 p4 p5 comment
---- ----------------- ---- ---- ---- ------------- -- -------
0 Init 0 17 0 0 Start at 17
1 OpenWriteAsync 0 273 0 0
2 OpenWriteAwait 0 0 0 0
3 String8 0 3 0 huh 0 r[3]='huh'
4 Integer 32 4 0 0 r[4]=32
5 OpenWriteAsync 1 297 0 0
6 OpenWriteAwait 0 0 0 0
7 NewRowId 0 1 0 0
8 MakeRecord 2 3 5 0 r[5]=mkrec(r[2..4])
9 InsertAsync 0 5 1 0
10 InsertAwait 0 0 0 0
11 Copy 4 6 0 0 r[6]=r[4]
12 Copy 1 7 0 0 r[7]=r[1]
13 MakeRecord 6 2 8 0 r[8]=mkrec(r[6..7])
14 IdxInsertAsync 1 8 6 0 key=r[8]
15 IdxInsertAwait 1 0 0 0
16 Halt 0 0 0 0
17 Transaction 0 1 0 0 write=true
18 Null 0 2 0 0 r[2]=NULL
19 Goto 0 1 0 0
```
When an insert happens, we need to be sure to insert into the index
btree as well.
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1265
2025-04-09 10:13:59 +03:00
PThorpe92
c15035caf8
Add module and vtab to schema after table is reopened with proper ext
2025-04-08 20:10:48 -04:00
PThorpe92
224f913ae7
Handle composite key indexes on insert
2025-04-08 08:55:14 -04:00
PThorpe92
878c987026
Remove is_null check from create index translation
2025-04-08 08:55:14 -04:00
PThorpe92
1f29307fe8
Support proper index handling when doing insertions
2025-04-08 08:55:14 -04:00
Ihor Andrianov
7c15465118
add TypeCheck insn to update
2025-04-07 20:02:14 +03:00
Ihor Andrianov
4a08b98bab
implemented strict table
2025-04-07 20:01:39 +03:00
Duncan Lutz
aa7c64cb19
feat: added likely scalar function
2025-04-06 23:14:30 -06:00
Jussi Saurio
c19e4fc69c
Merge 'Aggregation without group by produces incorrect results for scalars' from Ihor Andrianov
...
Closes #954
Before:
<img width="669" alt="Знімок екрана 2025-03-27 о 21 49 19"
src="https://github.com/user-
attachments/assets/d005e690-7dab-41e5-bc03-b574cade3965" />
After:
<img width="676" alt="Знімок екрана 2025-03-27 о 21 49 44"
src="https://github.com/user-
attachments/assets/1f4eb6bf-a238-496e-9fa4-32382799ef86" />
SQLite:
<img width="656" alt="Знімок екрана 2025-03-27 о 21 50 04"
src="https://github.com/user-
attachments/assets/3eca184e-6ea5-47c1-824f-51d11256a7af" />
Reviewed-by: Pere Diaz Bou <pere-altea@homail.com >
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1198
2025-04-06 20:00:30 +03:00
Preston Thorpe
62e0a137dd
Merge branch 'main' into update_offset
2025-04-06 12:34:23 -04:00
Pekka Enberg
2d3fd01f91
Merge 'Support Create Index' from Preston Thorpe
...
Closes #1193
```console
│limbo> explain create index idxp on products(price);
│addr opcode p1 p2 p3 p4 p5 comment
│---- ----------------- ---- ---- ---- ------------- -- -------
│0 Init 0 39 0 0 Start at 39
│1 CreateBtree 0 1 2 0 r[1]=root iDb=0 flags=2
│2 OpenWriteAsync 0 1 0 0
│3 OpenWriteAwait 0 0 0 0
│4 NewRowId 0 2 0 0
│5 String8 0 3 0 index 0 r[3]='index'
│6 String8 0 4 0 idxp 0 r[4]='idxp'
│7 String8 0 5 0 products 0 r[5]='products'
│8 Copy 1 6 1 0 r[6]=r[1]
│9 String8 0 7 0 CREATE INDEX idxp ON products (price) 0 r[7]='CREATE INDEX idxp ON products (price)'
│10 MakeRecord 3 5 8 0 r[8]=mkrec(r[3..7])
│11 InsertAsync 0 8 2 0
│12 InsertAwait 0 0 0 0
│13 SorterOpen 3 1 0 k(1,B) 0 cursor=3
│14 OpenPseudo 4 9 2 0 2 columns in r[9]
│15 OpenReadAsync 2 273 0 0 table=products, root=273
│16 OpenReadAwait 0 0 0 0
│17 RewindAsync 2 0 0 0
│18 RewindAwait 2 25 0 0 Rewind table products
│19 Column 2 2 10 0 r[10]=products.price
│20 RowId 2 11 0 0 r[11]=products.rowid
│21 MakeRecord 10 2 12 0 r[12]=mkrec(r[10..11])
│22 SorterInsert 3 12 0 0 0 key=r[12]
│23 NextAsync 2 0 0 0
│24 NextAwait 2 19 0 0
│25 OpenWriteAsync 1 1 0 0
│26 OpenWriteAwait 0 0 0 0
│27 SorterSort 3 33 0 0
│28 SorterData 3 13 4 0 r[13]=data
│29 SeekEnd 1 0 0 0
│30 IdxInsertAsync 1 13 0 0 key=r[13]
│31 IdxInsertAwait 1 0 0 0
│32 SorterNext 3 28 0 0
│33 Close 3 0 0 0
│34 Close 2 0 0 0
│35 Close 1 0 0 0
│36 ParseSchema 0 0 0 name = 'idxp' AND type = 'index' 0 name = 'idxp' AND type = 'index'
│37 Close 0 0 0 0
│38 Halt 0 0 0 0
│39 Transaction 0 1 0 0 write=true
│40 Goto 0 1 0 0
```
This will create the initial index btree and insert whatever relevant
records that need to be inserted, it doesn't handle the case of
inserting new index keys when normal records are created afterwards.
That will prob be added in next PR to keep this one concise.
Limbo will properly use the index in a subsequent query:

Creating a unique index on a column that has 2 existing identical rows:

Reviewed-by: Pere Diaz Bou <pere-altea@homail.com >
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1199
2025-04-06 19:32:36 +03:00
PThorpe92
c9edf71fb8
Support insert default values syntax
2025-04-05 21:27:21 -04:00
PThorpe92
007fbe8cc7
Fix unique index issue and prealloc in sql string for schema
2025-04-05 11:19:09 -04:00
PThorpe92
2c3fd509fe
Remove unused imports and consolidate ordering comparison
2025-04-05 11:19:09 -04:00
PThorpe92
e020ba3dfe
Add enum for interpreting a value as a register or literal for insns
2025-04-05 11:19:07 -04:00
PThorpe92
b0016a0ee2
Support create index with SeekEnd and IdxCreate opcode functionality
2025-04-05 11:15:36 -04:00
PThorpe92
4741544dfd
Add query translation for create index
2025-04-05 11:06:18 -04:00
Ihor Andrianov
0c9464e3fc
reduce vec allocations, add comments for magic ifs
2025-04-05 15:15:10 +03:00
PThorpe92
e3985b6994
Remove unused mut ref from emit_update_instructions for tx context
2025-04-04 12:51:37 -04:00
PThorpe92
13e084351d
Change parse_limit function to accept reference value to ast::Limit
2025-04-04 12:38:18 -04:00
PThorpe92
f6a64a7b15
Support OFFSET clause for LIMIT in UPDATE queries
2025-04-04 12:35:30 -04:00
Pekka Enberg
c3eaf47180
Merge 'Add support for default values in INSERT statements' from Diego Reis
...
While working on #494 I noticed that default values defined in schemas
weren't being applied.
Before:

Now:

Closes #1249
2025-04-04 08:59:44 +03:00
Diego Reis
43daba9942
core/translate: Add support for default values in INSERT statements
2025-04-04 01:32:13 -03:00
PThorpe92
ae2be30204
Move init label to proper place in create vtab translation
2025-04-03 20:22:14 -04:00
Ihor Andrianov
d4b8fa17f8
fix tests
2025-04-03 22:28:14 +03:00
Ihor Andrianov
34a132fcd3
fix output when group by is not part of resulting set
2025-04-03 22:28:13 +03:00
Ihor Andrianov
91ceab1626
improve naming and add comments for context
2025-04-03 22:28:13 +03:00
Ihor Andrianov
816cbacc9c
some smartie optimizations
2025-04-03 22:28:12 +03:00
Ihor Andrianov
2bcdd4e404
non group by cols are displayed in group by agg statements
2025-04-03 22:28:12 +03:00
Ihor Andrianov
4fd1dcdc73
small refine
2025-04-03 22:28:11 +03:00
Ihor Andrianov
36fe859d7d
create if only if non aggregate columns present
2025-04-03 22:28:11 +03:00
Ihor Andrianov
352fa6fd34
cargo fmt
2025-04-03 22:28:11 +03:00
Ihor Andrianov
b47c214a5e
fix aggregation functions without group by
2025-04-03 22:28:10 +03:00
Pekka Enberg
265457f175
Merge 'Don't emit Transaction for simple SELECT statements' from Diego Reis
...
First step to close #1226 .
Before:

After:

Reusing the same register is a bit trickier, I'm understanding how
SQLite does this optimization to apply here as well.
EDIT: Now we reuse the register and have the same number of bytecodes as
SQLite.

Reviewed-by: Pere Diaz Bou <pere-altea@homail.com >
Closes #1227
2025-04-02 18:12:20 +03:00
Diego Reis
3c531ac5ec
core/expr: Reuse register in binary expressions if they're equal
2025-04-02 09:15:41 -03:00
Diego Reis
86f8719b69
core/expr: Extract binary insn emission in a separate function
2025-04-02 09:14:01 -03:00
Diego Reis
fe37046536
core/emitter: Don't emit for statements that doesn't reference any tables
2025-04-02 08:59:52 -03:00
Diego Reis
6660a99003
core/emitter: Refactor the epilogue function to receive an enum
2025-04-02 08:56:19 -03:00
Pekka Enberg
6199c3994a
Merge 'Create plan for Update queries' from Preston Thorpe
...
closes #1186 , or at least works towards it by implementing an actual
Plan for update queries instead of translating everything inline. This
allows for actually using index's, rewriting const expressions, pushing
predicates instead of hardcoding a full scan in the translation.
### TODOs:
1. `RETURNING` clause/result columns
2. `OFFSET` clauses
3. on conflict
### LIMIT:
By supporting `LIMIT` directly in update queries, we'll have to put the
tests outside of the compatibility tests, maybe in the CLI tests.
Reviewed-by: Jussi Saurio <jussi.saurio@gmail.com >
Closes #1189
2025-04-01 17:33:32 +03:00
PThorpe92
211c9a0212
Remove From impl on iteration direction for sort order
2025-03-30 12:18:12 -04:00
PThorpe92
516e443a2b
Fix use index cursor id in emitter and prevent reinsert pk on update
2025-03-30 12:15:25 -04:00
PThorpe92
ff02d74afb
Fix update queries when limit is 0
2025-03-30 12:15:25 -04:00