Commit Graph

182 Commits

Author SHA1 Message Date
Pere Diaz Bou
ab2fc3fb13 fix clippy arc warnings for now 2025-03-05 14:07:48 +01:00
Pere Diaz Bou
e4a8ee5402 move load extensions to Connection
Extensions are loaded per connection and not per database as per SQLite
behaviour. This also helps with removing locks.
2025-03-05 14:07:48 +01:00
Pere Diaz Bou
8daf7666d1 Make database Sync + Send 2025-03-05 14:07:48 +01:00
Zaid Humayun
23a904f38d Merge branch 'main' of https://github.com/tursodatabase/limbo 2025-03-01 01:18:45 +05:30
Pekka Enberg
7f2525ac27 Merge 'Implement create virtual table using vtab modules, more work on virtual tables' from Preston Thorpe
This PR started out as one to improve the API of extensions but I ended
up building on top of this quite a bit and it just kept going. Sorry
this one is so large but there wasn't really a good stopping point, as
it kept leaving stuff in broken states.
**VCreate**: Support for `CREATE VIRTUAL TABLE t USING vtab_module`
**VUpdate**: Support for `INSERT` and `DELETE` methods on virtual
tables.
Sqlite uses `xUpdate` function with the `VUpdate` opcode to handle all
insert/update/delete functionality in virtual tables..
have to just document that:
```
if args[0] == NULL:  INSERT args[1] the values in args[2..]

if args[1] == NULL: DELETE args[0]

if args[0] != NULL && len(args) > 2: Update values=args[2..]  rowid=args[0]
```
I know I asked @jussisaurio on discord about this already, but it just
sucked so bad that I added some internal translation so we could expose
a [nice API](https://github.com/tursodatabase/limbo/pull/996/files#diff-
3e8f8a660b11786745b48b528222d11671e9f19fa00a032a4eefb5412e8200d1R54) and
handle the logic ourselves while keeping with sqlite's opcodes.
I'll change it back if I have to, I just thought it was genuinely awful
to have to rely on comments to explain all that to extension authors.
The included extension is not meant to be a legitimately useful one, it
is there for testing purposes. I did something similar in #960 using a
test extension, so I figure when they are both merged, I will go back
and combine them into one since you can do many kinds at once, and that
way it will reduce the amount of crates and therefore compile time.
1. Remaining opcodes.
2. `UPDATE` (when we support the syntax)
3. `xConnect` - expose API for a DB connection to a vtab so it can
perform arbitrary queries.

Closes #996
2025-02-25 15:31:12 +02:00
Zaid Humayun
07efc9b902 DROP TABLE: index drop
added missing instructions to drop the indices for a table physically from btree pages in a loop
2025-02-19 21:46:26 +05:30
Zaid Humayun
dc2bb7cb9b DropTable: implementation complete
added helper methods to Schema to remove table and indices from in-memory structures
completed the implementation for DropTable using that
2025-02-19 21:46:26 +05:30
Jussi Saurio
89e48a16db Add affinity() function to Column 2025-02-18 10:56:30 +02:00
PThorpe92
9c8083231c Implement create virtual table and VUpdate opcode 2025-02-17 20:44:44 -05:00
Pekka Enberg
ac54c35f92 Switch to workspace dependencies
...makes it easier to specify a version, which is needed for `cargo publish`.
2025-02-12 17:28:04 +02:00
Doug Anderson444
0aa5de6d9f rm log, switch all to tracing 2025-02-11 09:03:36 -04:00
Jussi Saurio
358fda2ec7 sqlite3-parser: box the create table body 2025-02-09 12:42:53 +02:00
PThorpe92
d4c06545e1 Refactor vtable impl and remove Rc Refcell from module 2025-02-06 09:15:39 -05:00
Jussi Saurio
f5f77c0bd1 Initial virtual table implementation 2025-02-06 07:51:50 -05:00
Jussi Saurio
795576b2ec dont eagerly allocate result column name strings 2025-02-05 17:53:23 +02:00
Jussi Saurio
750a9c6463 assertions and small cleanups 2025-02-03 13:08:13 +02:00
Glauber Costa
249a8cf8d2 keep type information as a string in column metadata
SQLite holds on to it deeply, for example:

sqlite> create table a(a int);
sqlite> create table b(b integer);
sqlite> create table c(c glauber);

sqlite> pragma table_info=a;
0|a|INT|0||0
sqlite> pragma table_info=b;
0|b|INTEGER|0||0
sqlite> pragma table_info=c;
0|c|glauber|0||0

So we'll keep it as well so we can produce the same responses.
2025-01-30 19:53:36 -05:00
Glauber Costa
f1df43633a change type Display implementation to not show null
This is the behavior that things like pragma table_info seem to
expect.
2025-01-30 19:53:36 -05:00
Glauber Costa
69d3fbc797 keep track of notnull constraint on column creation 2025-01-30 17:04:12 -05:00
Glauber Costa
42f93e9bea add default type to Column definition 2025-01-30 16:45:57 -05:00
Jussi Saurio
9f44d2a7ac Remove unused Table::Index variant and unused Table methods 2025-01-11 17:07:30 +02:00
Jussi Saurio
9909539b9d Store cursor type (table,index,pseudo,sorter) when allocating cursor 2025-01-11 17:04:16 +02:00
Jussi Saurio
1b61749c0f feat/core/translate: create automatic index in CREATE TABLE when necessary 2025-01-04 13:54:44 +02:00
Jussi Saurio
2066475e03 feat: subqueries in FROM clause 2024-12-31 14:18:29 +02:00
adamnemecek
97647ff056 Clean up code to use Self
Closes #556
2024-12-29 10:07:38 +02:00
jussisaurio
961e57df94 Fix returning rowid instead of PK when PK is not a rowid alias 2024-12-14 15:51:08 +02:00
jussisaurio
cc902ed25d GROUP BY and ORDER BY mostly work 2024-11-26 17:31:51 +02:00
jussisaurio
daf5863932 manual fixes based on clippy suggestions 2024-10-13 12:19:04 +03:00
jussisaurio
f02da18acd index scan wip foo doesnt work yet 2024-10-05 18:25:04 +03:00
김선우
28884181be Fix clippy 2024-09-15 16:23:27 +09:00
jussisaurio
b6e88ca883 cargo clippy --fix --allow-dirty && cargo fmt 2024-09-15 09:35:39 +03:00
jussisaurio
a108dea825 GROUP BY 2024-09-14 16:14:45 +03:00
Ajaya Agrawal
84a1d29586 fix 2024-09-03 12:20:38 +05:30
Ajaya Agrawal
dcc99148d2 fix 2024-09-03 00:46:53 +05:30
Ajaya Agrawal
cb275feaa2 Index lookup support
Adds support for parsing index structure
2024-09-03 00:46:53 +05:30
gandeevanr
2b86f89d8d use the correct integer PK column idx as the row-id alias 2024-08-04 18:53:54 -07:00
Pere Diaz Bou
affe3443cc core: vbde coroutine generation with rowid insert 2024-07-31 17:25:01 +02:00
Pekka Enberg
351242561d Kill anyhow usage
Switch anyhow to explicit `LimboError` type using thiserror crate, which
lets us make error handling more structured.
2024-07-25 17:15:08 +03:00
jussisaurio
9eb68524e7 Upgrade sqlite3-parser #185 2024-07-24 14:05:39 +03:00
Bennett Clement
0bf0b41692 Use case insensitive lookup for table and column 2024-07-22 16:27:36 +08:00
Bennett Clement
4590c3cc7c Support select <columns> for order by operation 2024-07-22 00:28:27 +08:00
Bennett Clement
2e0d4c6fdb Implement basic ORDER BY
- Only SELECT * is supported
- Only ASC is supported
2024-07-22 00:28:00 +08:00
Bennett Clement
865b3a04e9 Implement orderby translation 2024-07-22 00:27:46 +08:00
jussisaurio
ea793e4126 Inner join, table aliases, qualified column names 2024-07-14 20:09:40 +03:00
Raminder Singh
e4a9c5ce6e fix clippy warnings 2024-07-14 16:50:54 +05:30
Bennett Clement
d64733c0b9 Improve explain comments
- Resolve cursor ID to table name and get column name from index
- Since we change the type of BranchOffset to i64, add assertions in
  Program.step() function
- opcode generation compatibility with sqlite: change register number to start from 1
- Improve Column,Rowid comment, Add DecrJumpZero comment, Fix Integer
  comment
- Fix typos in code comments
2024-07-14 11:35:22 +08:00
Pere Diaz Bou
d41319a837 core: remove hash for Table
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-09 18:14:32 +02:00
Pere Diaz Bou
0b0885325c core: refactor generation of table row read
In sqlite3 generating the loop to read multiple joined tables follows
the pattern:

```c
sqlite3WhereBegin();
sqlite3WhereEnd();
```

and this generates:
```
sqlite> explain select * from users, products;
addr  opcode         p1    p2    p3    p4             p5  comment
----  -------------  ----  ----  ----  -------------  --  -------------
0     Init           0     23    0                    0   Start at 23
1     OpenRead       0     2     0     10             0   root=2 iDb=0; users
2     OpenRead       1     3     0     3              0   root=3 iDb=0; products
3     Rewind         0     22    0                    0
4       Rewind         1     22    0                    0
5         Rowid          0     1     0                    0   r[1]=users.rowid
6         Column         0     1     2                    0   r[2]= cursor 0 column 1
7         Column         0     2     3                    0   r[3]= cursor 0 column 2
8         Column         0     3     4                    0   r[4]= cursor 0 column 3
9         Column         0     4     5                    0   r[5]= cursor 0 column 4
10        Column         0     5     6                    0   r[6]= cursor 0 column 5
11        Column         0     6     7                    0   r[7]= cursor 0 column 6
12        Column         0     7     8                    0   r[8]= cursor 0 column 7
13        Column         0     8     9                    0   r[9]= cursor 0 column 8
14        Column         0     9     10                   0   r[10]= cursor 0 column 9
15        Rowid          1     11    0                    0   r[11]=products.rowid
16        Column         1     1     12                   0   r[12]= cursor 1 column 1
17        Column         1     2     13                   0   r[13]= cursor 1 column 2
18        RealAffinity   13    0     0                    0
19        ResultRow      1     13    0                    0   output=r[1..13]
20      Next           1     5     0                    1
21    Next           0     4     0                    1
22    Halt           0     0     0                    0
23    Transaction    0     0     2     0              1   usesStmtJournal=0
24    Goto           0     1     0                    0
```

`sqlite3WhereBegin()` as the name represents, mainly does stuff with
`WHERE` expressions + loop generation. This is why I decided to change
the name to `translate_tables_begin` to try improve the naming.

In our case:
```rust
    translate_table_open_cursor(program, &mut context, select.from.as_ref().unwrap());
    translate_table_open_loop(program, &mut context, loop_index);
```

translates into:
```sql
> explain select * from users, products;
addr  opcode         p1    p2    p3    p4             p5  comment
----  -------------  ----  ----  ----  -------------  --  -------
0     Init           0     28    0       0   Start at 28
1     OpenReadAsync  0     2     0       0   root=2
2     OpenReadAwait  0     0     0       0
3     OpenReadAsync  1     3     0       0   root=3
4     OpenReadAwait  0     0     0       0
5     RewindAsync    0     0     0       0
6     RewindAwait    0     27    0       0
7     RewindAsync    1     0     0       0
8     RewindAwait    1     25    0       0
9     RowId          0     0     0       0
10    Column         0     1     1       0   r[1]= cursor 0 column 1
11    Column         0     2     2       0   r[2]= cursor 0 column 2
12    Column         0     3     3       0   r[3]= cursor 0 column 3
13    Column         0     4     4       0   r[4]= cursor 0 column 4
14    Column         0     5     5       0   r[5]= cursor 0 column 5
15    Column         0     6     6       0   r[6]= cursor 0 column 6
16    Column         0     7     7       0   r[7]= cursor 0 column 7
17    Column         0     8     8       0   r[8]= cursor 0 column 8
18    Column         0     9     9       0   r[9]= cursor 0 column 9
19    RowId          1     10    0       0
20    Column         1     1     11      0   r[11]= cursor 1 column 1
21    Column         1     2     12      0   r[12]= cursor 1 column 2
22    ResultRow      0     13    0       0   output=r[0..13]
23    NextAsync      1     0     0       0
24    NextAwait      1     8     0       0
25    NextAsync      0     0     0       0
26    NextAwait      0     6     0       0
27    Halt           0     0     0       0
28    Transaction    0     0     0       0
29    Goto           0     1     0       0
```

This works on as many joined tables but... it is ready to extend for
further join operations.

Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-09 18:08:16 +02:00
Kunal Singh
00c26286ce fix: lint warnings 2024-07-08 22:43:11 +05:30
Piotr Jastrzebski
4a9e0dfc4d Add tests for primary key
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 17:55:04 +02:00