Commit Graph

785 Commits

Author SHA1 Message Date
Pekka Enberg
edf0f754f6 Merge 'More structured query planner' from Jussi Saurio
Reader's guide to this PR:

The aim is to have a more structured and maintainable approach to generating bytecode from the query AST so that different parts of the query processing pipeline have clearer responsibilities, so that developing new functionality is easier. E.g.:

- If you want to implement join reordering -> you do it in `Optimizer`
- If you want to implement `GROUP BY` -> you change `QueryPlanNode::Aggregate` to include it, parse it in `Planner` and handle the code generation for it in `Emitter`

The pipeline is:

`SQL text -> Parser -> Planner -> Optimizer -> Emitter`

and this pipeline generates:

`SQL text -> AST -> Logical Plan -> Optimized Logical Plan -> SQLite Bytecode`

---

Module structure:

`plan.rs`: defines the `Operator` enum. An `Operator` is a tree of other `Operators`, e.g. an `Operator::Join` has `left` and `right` children, etc.

`planner.rs`: Parses an `ast::Select` into a `Plan` which is mainly a wrapper for a root `Operator`

`optimizer.rs`: Makes a new `Plan` from an input `Plan` - does predicate pushdown, constant elimination and turns `Scan` nodes into `SeekRowId` nodes where applicable

`emitter.rs`: Generates bytecode instructions from an input `Plan`.

---

Adds feature `EXPLAIN QUERY PLAN <stmt>` which shows the logical query plan instead of the bytecode plan

---

Other changes:

- Almost everything from `select.rs` removed; things like `translate_aggregation()` moved to `expr.rs`
- `where_clause.rs` removed, some things from it like `translate_condition_expr()` moved to `expr.rs`
- i.e.: there is nothing _new_ in `expr.rs`, stuff just moved there

---

Concerns:

- Perf impact: there's a lot more indirection than before (`Operator`s are very "traditional" trees where they refer to other operators via Boxes etc)

Closes #281
2024-08-18 16:36:51 +03:00
Pekka Enberg
68357ccb55 Update CHANGELOG 2024-08-18 15:53:24 +03:00
Pekka Enberg
9654840e64 Merge 'Add support for quote scalar function' from Jean Arhancet
Add support for quote scalar function. Related issue: #144

Closes #294
2024-08-18 15:53:09 +03:00
jussisaurio
a79c0c5b34 BytecodeGenerator struct was unnecessary 2024-08-17 14:35:44 +03:00
jussisaurio
2b71a5802d tweak 2024-08-17 14:24:20 +03:00
jussisaurio
b7fbe57ca7 Move translate_table_columns to expr.rs 2024-08-17 14:16:56 +03:00
jussisaurio
05a6616803 BytecodeGenerator struct 2024-08-17 14:12:57 +03:00
jussisaurio
d7d195a618 Cleanup and improve emitter.rs docs 2024-08-17 13:56:59 +03:00
jussisaurio
e8c894e532 More flexible Emitter via stateful operators 2024-08-17 12:55:16 +03:00
JeanArhancet
b6c720c90a feat: add quote function 2024-08-17 09:28:14 +02:00
jussisaurio
d70eb6b3d7 fix seekrowid operator not emitting result when root 2024-08-17 09:16:24 +03:00
jussisaurio
69f549d2b9 remove unnecessary unwrap_or 2024-08-17 09:07:29 +03:00
jussisaurio
2e7f240bb5 use table_columns() for seekrowid result_columns() 2024-08-17 09:04:27 +03:00
jussisaurio
25033d280c more accurate variable name 2024-08-16 19:58:59 +03:00
jussisaurio
17cc3717c8 rebase 2024-08-16 19:43:29 +03:00
jussisaurio
069826820e Finish renaming node -> operator 2024-08-16 19:42:03 +03:00
jussisaurio
97dc98336c fix comment 2024-08-16 19:42:03 +03:00
jussisaurio
e7cc04e157 Operator comments 2024-08-16 19:42:03 +03:00
jussisaurio
4c016b042b comment about bitmasks 2024-08-16 19:42:03 +03:00
jussisaurio
1130ccf203 mutable out parameter 2024-08-16 19:42:03 +03:00
jussisaurio
2d35641b86 whitespace 2024-08-16 19:42:03 +03:00
jussisaurio
989066eedf remove duplicate test after rebase 2024-08-16 19:42:03 +03:00
jussisaurio
9ab08ee2e6 is_rowid_alias instead of primary_key 2024-08-16 19:42:03 +03:00
jussisaurio
2e32ca0bdb More structured query planner 2024-08-16 19:42:03 +03:00
Pekka Enberg
c2944f6eeb Merge 'Add support for concat scalar function' from Kim Seon Woo
Add support for concat scalar function

### EXPLAIN SELECT concat('a', 1.5, 'b')
![image](https://github.com/user-attachments/assets/628e0e81-91bc-4533-9091-ded99dd20e0e)

## Related issue
https://github.com/penberg/limbo/issues/144

Closes #291
2024-08-16 16:37:38 +03:00
Kim Seon Woo
48d3c05fb0 Rebase 2024-08-16 21:40:30 +09:00
Pekka Enberg
a5bdfb62b8 Bump cargo-dist to 0.21.0 2024-08-16 14:42:24 +03:00
Pekka Enberg
cad0cd66d0 Update CHANGELOG.md 2024-08-16 14:38:53 +03:00
Pekka Enberg
c9c0d2808c Merge 'Add support for ifnull scalar function' from Kim Seon Woo
Add support for `ifnull` scalar function

### EXPLAIN SELECT ifnull(null, 20);
![image](https://github.com/user-attachments/assets/e367638f-9d70-4dfc-989d-7290b842c2ec)

### Related issue
https://github.com/penberg/limbo/issues/144

Closes #290
2024-08-16 14:37:08 +03:00
Pekka Enberg
ba3acedbc8 Merge 'Add support for substr scalar function' from Kim Seon Woo
Add support for `substr` scalar function. We can reuse the `substring` logic which is already implemted.

## Related issue
https://github.com/penberg/limbo/issues/144

Closes #289
2024-08-16 14:36:55 +03:00
Pekka Enberg
4992d81a32 Merge 'Implement char function support' from Kim Seon Woo
Implement (scalar) char function support

### EXPLAIN SELECT char(108, 105);
![image](https://github.com/user-attachments/assets/c2270bbe-8a0b-43a0-af39-1198f6cbf88d)

### EXPLAIN SELECT char();
![image](https://github.com/user-attachments/assets/a705bd3b-bce8-4524-9d6d-a8b72e950a43)

### EXPLAIN SELECT char(null);
![image](https://github.com/user-attachments/assets/c65c395e-f2dd-42f8-b64a-45f20711d1ac)

### EXPLAIN SELECT char('a');
![image](https://github.com/user-attachments/assets/e7bfc05b-17b3-4c1b-9d8e-fe4c89614afc)

## Related Issue
https://github.com/penberg/limbo/issues/144

Closes #288
2024-08-16 14:36:32 +03:00
김선우
10d452de2a Nit 2024-08-16 09:27:38 +09:00
김선우
8fbcd10e0e Add support for ifnull scalar function 2024-08-16 09:25:04 +09:00
김선우
27d9af2bf4 Add support for substr scalar function 2024-08-16 08:26:42 +09:00
김선우
fe526e118e Nit 2024-08-16 06:43:55 +09:00
김선우
ced664621f Allow char function to have empty args 2024-08-16 06:33:18 +09:00
김선우
77c3d130f3 Add char function support 2024-08-16 06:26:06 +09:00
Pekka Enberg
39e77bac9f Merge 'Implement scala function substring(...) ' from Kim Seon Woo
Implement scala function `substring(x, y, z)` and `substring(x, y)`

### EXPLAIN SELECT substring('limbo', 3);
![image](https://github.com/user-attachments/assets/0138d802-c40e-4990-8657-05a0d54ee00f)

### EXPLAIN SELECT substring('limbo', 1, 2);
![image](https://github.com/user-attachments/assets/1babeb1b-f5ca-4b8f-ae19-c4f06b51d4b6)

### Related issue
https://github.com/penberg/limbo/issues/144

Closes #286
2024-08-15 19:45:22 +03:00
Pekka Enberg
a57870ed03 Merge 'Fix typo ' from Kim Seon Woo
Closes #287
2024-08-15 19:43:13 +03:00
Pekka Enberg
e30b5f1082 Commit updated Cargo.lock and sqlite3.h
Turns out the new cbindgen version generates slightly different
sqlite3.h so commit that to the tree. The version in Cargo.lock also
changed so let's check in that too.
2024-08-15 19:42:10 +03:00
김선우
ac440495bd Nit 2024-08-15 18:59:46 +09:00
김선우
28bd0275c0 Run cargo fmt, clippy 2024-08-15 18:56:02 +09:00
김선우
aff13de125 Nit 2024-08-15 18:50:40 +09:00
김선우
dc48c2e71d Add substring scala function with 2 arg 2024-08-15 18:47:32 +09:00
김선우
3fa3c5c002 Add substr scala function 2024-08-15 18:27:18 +09:00
Pekka Enberg
08c1e13679 Merge 'Handle count(*)' from Vegard Stikbakke
This PR adds support for `count(*)`. I did not find any other functions than `count` which expect a `*` argument yet, but I'm sure there are some?

Surprisingly (to me) I did not need to make any changes to `translate_expr`, only to `analyze_expr`.

```
limbo> SELECT count(id) FROM users;
2
limbo> SELECT count(*) FROM users;
2
limbo> SELECT count(*) FROM users where id = 1;
1
limbo> SELECT count(id) FROM users where id = 1;
1
```

Other aggregation functions such as sum fail, since they expect a specific column:
```
limbo> select sum(*) from users;
Parse error: sum bad number of arguments
```

Closes #285
2024-08-11 16:57:18 +03:00
Vegard Stikbakke
e54fd83f49 Handle FunctionCallStar in analyze_expr 2024-08-11 13:59:49 +02:00
Pekka Enberg
f75b43f28e Merge 'Add to sqlite3 static lib to cargo dist bundle' from Pekka Enberg
Closes #222
2024-08-11 12:22:28 +03:00
Pekka Enberg
f633fc91cf sqlite3: Add to cargo dist bundle 2024-08-11 12:14:43 +03:00
Pekka Enberg
3f96b1d798 Merge 'Initial pass on Python API' from Jean Arhancet
This pull request introduces the initial setup for the Python bindings
(#248).

- Setup Configuration: Added the Python binding stack, including the
  `pyo3 `crates, `pyproject.toml`, `build.rs`, and other necessary
  files.

- Database Class: Implemented the Database class with a constructor to
  establish a connection and a query function to execute SQL queries.

- Testing: Created `database.db` with a sample users table and two
  entries, as outlined in README.md, and added three pytest functions to
  validate the Python output.

Closes #276
2024-08-11 12:09:27 +03:00