Commit graph

115 commits

Author SHA1 Message Date
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
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