Commit Graph

154 Commits

Author SHA1 Message Date
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
Piotr Jastrzebski
77f50e7f7c Stop ignoring test_column_is_rowid_alias_single_integer_separate_primary_key_definition
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 17:55:04 +02:00
Piotr Jastrzebski
861716f343 Use BTreeTable::primary_key_column_names in column_is_rowid_alias
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 17:55:04 +02:00
Piotr Jastrzebski
f98c62bfb7 Setup BTreeTable::primary_key_column_names correctly
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 17:54:47 +02:00
Piotr Jastrzebski
6bf9fbb0de Add primary_key_column_names to BTreeTable
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 17:20:49 +02:00
Piotr Jastrzebski
828c4ce459 Add tests for BTreeTable::column_is_rowid_alias
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 15:14:38 +02:00
Piotr Jastrzebski
73e037afa2 Add tests for hes_rowid field
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 14:52:20 +02:00
Piotr Jastrzebski
50ecea0c86 Use has_rowid in column_is_rowid_alias
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 14:52:20 +02:00
Piotr Jastrzebski
2aa0a92955 Setup has_rowid correctly for BTreeTable
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 14:52:00 +02:00
Piotr Jastrzebski
9ddb0befc4 Add has_rowid field to BTreeTable
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 14:32:28 +02:00
Piotr Jastrzebski
708cae99b8 Simplify BTreeTable::to_sql
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 13:15:04 +02:00
Piotr Jastrzebski
8ce1c4a1ab Mark test code cfg(test) instead of allow(dead_code)
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 12:59:06 +02:00
Pekka Enberg
30ec86a81e Add sorter utility functions and opcodes
This adds basic in-memory sorting utility functions, similar to SQLite's
src/vdbesort.c. We need to improve this later with external sorting so
to support large data sets.

This also adds sorting functionality to the VDBE. Note that none of this
is wired to SQL translation yet so it's unused for now.
2024-07-07 13:56:55 +03:00
Pekka Enberg
dac8f4dcba Format source code with cargo fmt 2024-07-07 12:28:02 +03:00
Pekka Enberg
519e6b141f Add Table::column_is_rowid_alias() helper
We need to check for rowid alias elsewhere too with ORDER BY, for
example, so let's extract a small helper for that.
2024-07-07 12:27:08 +03:00
Piotr Jastrzebski
fdbd010d89 Remove incorrect Column::is_rowid_alias
Fixes #83

Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 10:06:45 +02:00
Piotr Jastrzebski
7b6c6ef9f1 Remove unneeded clone in add_table
Signed-off-by: Piotr Jastrzebski <haaawk@gmail.com>
2024-07-07 08:47:47 +02:00
Pere Diaz Bou
9242e5c671 core: fix agg function uppercase parsing
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-03 08:56:30 +02:00
Pekka Enberg
828fb813a8 core: Fix codegen for rowid alias
We should emit `Column` bytecode for a primary key, unless it is an alias for a rowid.
2024-06-21 13:10:21 +03:00
Pekka Enberg
8d4d2f32ee core: Fix INTEGER data type detection 2024-06-21 13:09:43 +03:00
Pekka Enberg
a3c4efc13a Random code cleanups 2024-06-08 08:38:11 +03:00
Pekka Enberg
a9eb6918d3 SELECT expression support 2024-03-28 19:41:21 +02:00
Pekka Enberg
9a73ded4fa Add a Cursor trait and use it
We need an abstract cursor trait to implement a sorter, for example.
2024-03-28 15:01:52 +02:00
Pekka Enberg
88f335db16 Fix SQL identifiers to be case insensitive
SQLite seems to treat everything as case insensitive so let's do that
too.

Fixes #37
2024-03-27 21:00:47 +02:00
Pekka Enberg
81f003d29f Extract create_table() function 2024-03-27 20:44:52 +02:00
Pekka Enberg
2c55cc797d cargo clippy --fix 2024-01-28 10:21:38 +02:00
Pekka Enberg
a2202ed31e Implement reading primary key columns 2023-09-10 13:19:17 +03:00
Pekka Enberg
25ab9afd65 Silence function not used warning 2023-09-10 12:43:08 +03:00
Pekka Enberg
0cdf54a8c7 Fix column affinity detection
As it turns out, column affinity is tricky in SQLite...

https://www.sqlite.org/datatype3.html#determination_of_column_affinity
2023-09-04 21:19:12 +03:00