Pekka Enberg
ad70a240d4
Merge pull request #147 from benclmnt/feat/where-and
2024-07-16 21:35:01 +03:00
Pekka Enberg
c42647c352
Merge pull request #171 from pereman2/translate-ref
...
core: use references to ast instead of hard copies
2024-07-16 20:36:04 +03:00
Pere Diaz Bou
01b96abbac
core: use references to ast instead of hard copies
...
Signed-off-by: Pere Diaz Bou <pere-altea@hotmail.com >
2024-07-16 18:48:05 +02:00
Bennett Clement
3c4f2b07e6
Respect jump_if_true in like implementation
2024-07-16 18:17:37 +08:00
Bennett Clement
6f983702c3
Refactor if/ifnot implementation
2024-07-16 16:36:30 +08:00
Bennett Clement
05558527af
Implement like in where clause
2024-07-16 15:55:33 +08:00
Bennett Clement
2f738e0c8b
Implement like function
2024-07-16 15:23:52 +08:00
Bennett Clement
7858c350c5
Reintroduce overwritten optimization
2024-07-16 08:51:41 +08:00
Bennett Clement
4d077cf3e5
Implement std::cmp::PartialOrd for OwnedValue
2024-07-16 08:32:14 +08:00
Bennett Clement
fdf77cee2b
Merge branch 'main' of github.com:benclmnt/limbo into feat/where-and
2024-07-16 08:10:24 +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
Bennett Clement
d1288cacef
Implement where and
2024-07-15 23:19:46 +08: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
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
59c6429555
Fix invalid column names in aggregate function
2024-07-13 11:47:59 +05:30
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
jussisaurio
1b0aa568a4
Basic where clause support
2024-07-12 00:26:32 +03: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
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
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
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
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
Vivek Khatri
fe7c1b5b1d
Merge branch 'main' into add-agg-fn-count
2024-07-08 13:58:14 +05:30
Vivek
94358dc665
Add aggregate fn: count
2024-07-08 13:55:06 +05:30
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