Commit Graph

251 Commits

Author SHA1 Message Date
Bennett Clement
1df2ee6683 Fix real explain format 2024-07-16 13:29:47 +08:00
Pere Diaz Bou
0a7d0588d7 core: implement AND and OR + complex conditions.
this also fixes NULL print to empty string

Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-15 19:42:12 +02:00
jussisaurio
d1eded0e90 Test with sqlite3 executable in CI as well 2024-07-15 17:27:04 +03:00
jussisaurio
ea793e4126 Inner join, table aliases, qualified column names 2024-07-14 20:09:40 +03:00
Pekka Enberg
99a6ca4f2f Merge pull request #142 from imor/clippy_fixes 2024-07-14 20:00:10 +03:00
Bennett Clement
72f1cdd5c4 Fix pr comments 2024-07-14 23:03:01 +08:00
Raminder Singh
e4a9c5ce6e fix clippy warnings 2024-07-14 16:50:54 +05:30
Bennett Clement
a85f47310c Move where clause literal out of loop 2024-07-14 14:00:25 +08:00
Bennett Clement
e9647bf425 Fix comments display 2024-07-14 13:50:21 +08:00
Pekka Enberg
0f0b88cbe7 Merge pull request #140 from benclmnt/feat/improve-explain-comments 2024-07-14 08:10:37 +03:00
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
jussisaurio
b288ac2b89 Optimize where clause bytecode 2024-07-14 01:30:09 +03:00
jussisaurio
851aea212d add coalesce(), refactor/rename add_label() 2024-07-13 23:03:56 +03:00
Pekka Enberg
9458522164 Merge pull request #134 from Ramkarthik/add-group-concat 2024-07-13 20:28:11 +03:00
Pere Diaz Bou
7601045122 core: clear references on resolve 2024-07-13 19:04:00 +02:00
Pere Diaz Bou
d0f37969ce core: matrix of labelsXinsnref instead of hashmap 2024-07-13 18:54:33 +02:00
Pere Diaz Bou
be387eb31c core: labels system and limit refactor
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-13 18:54:33 +02:00
Ramkarthik Krishnamurthy
5dff56d18a Fixes it for both sides of the operator 2024-07-13 14:53:16 +05:30
Ramkarthik Krishnamurthy
0f7c88f5ad Fixes truncation of trailing zeros when converting float to string 2024-07-13 14:49:18 +05:30
Bennett Clement
30e4a70d07 ignore wasm compilation target 2024-07-13 15:17:18 +08:00
Ramkarthik Krishnamurthy
59c6429555 Fix invalid column names in aggregate function 2024-07-13 11:47:59 +05:30
Bennett Clement
26152e07e5 Use kqueue for Darwin IO 2024-07-13 09:44:03 +08:00
Ramkarthik Krishnamurthy
dddc0be88f Some refactoring 2024-07-13 02:46:37 +05:30
Ramkarthik Krishnamurthy
a303e6ad96 Implements string_agg and extends group_concat to work with column delimiters 2024-07-13 02:13:28 +05:30
Ramkarthik Krishnamurthy
9268560a51 Implements group concat aggregate function 2024-07-13 00:55:40 +05:30
김선우
6aabd919da Fix typo 2024-07-12 23:19:44 +09:00
Pekka Enberg
f1bca597cb Merge pull request #121 from jussisaurio/where-clauses
Basic where clause support
2024-07-12 08:21:38 +03:00
jussisaurio
1b0aa568a4 Basic where clause support 2024-07-12 00:26:32 +03:00
Bennett Clement
e377e09498 Fix avg(), total(), count() default value on empty set 2024-07-12 00:20:44 +08:00
Bennett Clement
8a9eb74f9b Implement total() aggregation function
- Returns 0.0 when called on non integer / non float columns
- Always returns floating point number
- fix: default for sum() should be NULL when there is no non-NULL row
  per docs
2024-07-11 23:40:55 +08:00
Ramkarthik Krishnamurthy
f038c1c7d2 Indent only the opcode value 2024-07-11 16:19:23 +05:30
Pekka Enberg
d8af1aa73b Format source code with cargo fmt 2024-07-11 10:43:34 +03:00
Pekka Enberg
d8078d5e19 Simplify LIMIT 0 handling in translate_select()
It's a special-case so let's make it special like SQLite does.
Simplifies the logic in `translate_select()` quite a bit.
2024-07-11 09:42:24 +03:00
Pekka Enberg
46e34daccd Merge pull request #115 from pereman2/real-affinity 2024-07-11 08:11:18 +03:00
Pere Diaz Bou
538d624770 core: apply Real affinity on columns stored as int
Values in sqlite3, as expected, can be stored in different formats to
optimize disk usage. In this case, a 79.0 float will be transformed to a
u8.

sqlite3 deals with this by adding a RealAffinity op after each column
that might need it. Therefore, in this pr we do exactly that :).

Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-10 21:21:49 +02:00
Pekka Enberg
5e47dfabaf Drop Select::from member field
It's not used anywhere.
2024-07-10 15:17:04 +03:00
Pekka Enberg
0316385150 Fold SelectContext to Select
We can use Select to keep track of loops and stuff. Having a separate
SelectContext just means we need to pass around more objects to
functions.
2024-07-10 15:09:30 +03:00
Pekka Enberg
f2b1971def Simplify AST type paths
The `sqlite3_parser` prefix is redundant.
2024-07-10 11:08:07 +03:00
Ramkarthik Krishnamurthy
ae68c96635 Indent EXPLAIN output like SQLite 2024-07-10 00:01:52 +05:30
Pere Diaz Bou
e557b7b9ee core: add comment for src_tables
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-09 18:48:26 +02:00
Pere Diaz Bou
61d0f877e3 core: create list of src tables
Instead of having divided "from table" and "join tables", we merge them
in to a list of `src_tables`.

Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-09 18:46:35 +02: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
46592e7b34 core: fix translate_expr args from new agg functions
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-09 18:10:18 +02:00
Pere Diaz Bou
110df3cff1 core: fix resolve table name from join
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com>
2024-07-09 18:08:16 +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
Ishan Jain
c171b63ec2 use O_DIRECT for file read operations 2024-07-09 11:41:20 +05:30
mazchew
fc0c3d539a add min aggregate function
add changes for all.test
2024-07-09 03:14:02 +08:00
mazchew
3f339d07d3 add max aggregate function 2024-07-09 02:45:34 +08:00
Kunal Singh
00c26286ce fix: lint warnings 2024-07-08 22:43:11 +05:30
Kunal Singh
fab8f1777a fix: unhandled empty args in aggregate function 2024-07-08 19:13:53 +05:30