Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions prqlc/bindings/prqlc-python/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,15 +232,15 @@ mod test {
fn debug_prql_lineage() {
assert_snapshot!(
debug::prql_lineage(r#"from a | select { beta, gamma }"#).unwrap(),
@r#"{"frames":[["1:9-31",{"columns":[{"Single":{"name":["a","beta"],"target_id":121,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":122,"target_name":null}}],"inputs":[{"id":119,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":119,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":124},{"id":121,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[119],"parent":123},{"id":122,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[119],"parent":123},{"id":123,"kind":"Tuple","span":"1:16-31","children":[121,122],"parent":124},{"id":124,"kind":"TransformCall: Select","span":"1:9-31","children":[119,123]}],"ast":{"name":"Project","stmts":[{"VarDef":{"kind":"Main","name":"main","value":{"Pipeline":{"exprs":[{"FuncCall":{"name":{"Ident":["from"],"span":"1:0-4"},"args":[{"Ident":["a"],"span":"1:5-6"}]},"span":"1:0-6"},{"FuncCall":{"name":{"Ident":["select"],"span":"1:9-15"},"args":[{"Tuple":[{"Ident":["beta"],"span":"1:18-22"},{"Ident":["gamma"],"span":"1:24-29"}],"span":"1:16-31"}]},"span":"1:9-31"}]},"span":"1:0-31"}},"span":"1:0-31"}]}}"#
@r#"{"frames":[["1:9-31",{"columns":[{"Single":{"name":["a","beta"],"target_id":122,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":123,"target_name":null}}],"inputs":[{"id":120,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":120,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":125},{"id":122,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[120],"parent":124},{"id":123,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[120],"parent":124},{"id":124,"kind":"Tuple","span":"1:16-31","children":[122,123],"parent":125},{"id":125,"kind":"TransformCall: Select","span":"1:9-31","children":[120,124]}],"ast":{"name":"Project","stmts":[{"VarDef":{"kind":"Main","name":"main","value":{"Pipeline":{"exprs":[{"FuncCall":{"name":{"Ident":["from"],"span":"1:0-4"},"args":[{"Ident":["a"],"span":"1:5-6"}]},"span":"1:0-6"},{"FuncCall":{"name":{"Ident":["select"],"span":"1:9-15"},"args":[{"Tuple":[{"Ident":["beta"],"span":"1:18-22"},{"Ident":["gamma"],"span":"1:24-29"}],"span":"1:16-31"}]},"span":"1:9-31"}]},"span":"1:0-31"}},"span":"1:0-31"}]}}"#
);
}

#[test]
fn debug_pl_to_lineage() {
assert_snapshot!(
prql_to_pl(r#"from a | select { beta, gamma }"#).and_then(|x| debug::pl_to_lineage(&x)).unwrap(),
@r#"{"frames":[["1:9-31",{"columns":[{"Single":{"name":["a","beta"],"target_id":121,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":122,"target_name":null}}],"inputs":[{"id":119,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":119,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":124},{"id":121,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[119],"parent":123},{"id":122,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[119],"parent":123},{"id":123,"kind":"Tuple","span":"1:16-31","children":[121,122],"parent":124},{"id":124,"kind":"TransformCall: Select","span":"1:9-31","children":[119,123]}],"ast":{"name":"Project","stmts":[{"VarDef":{"kind":"Main","name":"main","value":{"Pipeline":{"exprs":[{"FuncCall":{"name":{"Ident":["from"],"span":"1:0-4"},"args":[{"Ident":["a"],"span":"1:5-6"}]},"span":"1:0-6"},{"FuncCall":{"name":{"Ident":["select"],"span":"1:9-15"},"args":[{"Tuple":[{"Ident":["beta"],"span":"1:18-22"},{"Ident":["gamma"],"span":"1:24-29"}],"span":"1:16-31"}]},"span":"1:9-31"}]},"span":"1:0-31"}},"span":"1:0-31"}]}}"#
@r#"{"frames":[["1:9-31",{"columns":[{"Single":{"name":["a","beta"],"target_id":122,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":123,"target_name":null}}],"inputs":[{"id":120,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":120,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":125},{"id":122,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[120],"parent":124},{"id":123,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[120],"parent":124},{"id":124,"kind":"Tuple","span":"1:16-31","children":[122,123],"parent":125},{"id":125,"kind":"TransformCall: Select","span":"1:9-31","children":[120,124]}],"ast":{"name":"Project","stmts":[{"VarDef":{"kind":"Main","name":"main","value":{"Pipeline":{"exprs":[{"FuncCall":{"name":{"Ident":["from"],"span":"1:0-4"},"args":[{"Ident":["a"],"span":"1:5-6"}]},"span":"1:0-6"},{"FuncCall":{"name":{"Ident":["select"],"span":"1:9-15"},"args":[{"Tuple":[{"Ident":["beta"],"span":"1:18-22"},{"Ident":["gamma"],"span":"1:24-29"}],"span":"1:16-31"}]},"span":"1:9-31"}]},"span":"1:0-31"}},"span":"1:0-31"}]}}"#
);
}
}
34 changes: 17 additions & 17 deletions prqlc/prqlc/src/cli/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -434,61 +434,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 121
target_id: 122
target_name: null
- !Single
name:
- tracks
- album
target_id: 122
target_id: 123
target_name: null
inputs:
- id: 119
- id: 120
name: tracks
table:
- default_db
- tracks
nodes:
- id: 119
- id: 120
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 124
- id: 121
parent: 125
- id: 122
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 119
parent: 123
- id: 122
- 120
parent: 124
- id: 123
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 119
parent: 123
- id: 123
- 120
parent: 124
- id: 124
kind: Tuple
span: 1:21-36
children:
- 121
- 122
parent: 124
- id: 124
- 123
parent: 125
- id: 125
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 119
- 123
- 120
- 124
ast:
name: Project
stmts:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 135
target_id: 136
target_name: ~
- Single:
name:
- employees
- salary
target_id: 136
target_id: 137
target_name: ~
inputs:
- id: 133
- id: 134
name: employees
table:
- default_db
- employees
- id: 122
- id: 123
name: managers
table:
- default_db
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
---
source: prqlc/prqlc/src/semantic/resolver/mod.rs
assertion_line: 190
expression: "resolve_lineage(r#\"\n from table_1\n join customers (==customer_no)\n \"#).unwrap()"
---
columns:
- All:
input_id: 120
input_id: 121
except: []
- All:
input_id: 117
input_id: 118
except: []
inputs:
- id: 120
- id: 121
name: table_1
table:
- default_db
- table_1
- id: 117
- id: 118
name: customers
table:
- default_db
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,32 @@
---
source: prqlc/prqlc/src/semantic/resolver/mod.rs
assertion_line: 198
expression: "resolve_lineage(r#\"\n from e = employees\n join salaries (==emp_no)\n group {e.emp_no, e.gender} (\n aggregate {\n emp_salary = average salaries.salary\n }\n )\n \"#).unwrap()"
---
columns:
- Single:
name:
- e
- emp_no
target_id: 130
target_id: 131
target_name: ~
- Single:
name:
- e
- gender
target_id: 131
target_id: 132
target_name: ~
- Single:
name:
- emp_salary
target_id: 149
target_id: 150
target_name: ~
inputs:
- id: 123
- id: 124
name: e
table:
- default_db
- employees
- id: 120
- id: 121
name: salaries
table:
- default_db
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 124
target_id: 125
target_name: ~
- Single:
name:
- orders
- gross
target_id: 125
target_id: 126
target_name: ~
- Single:
name:
- orders
- tax
target_id: 126
target_id: 127
target_name: ~
- Single:
name: ~
target_id: 127
target_id: 128
target_name: ~
inputs:
- id: 122
- id: 123
name: orders
table:
- default_db
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 119
input_id: 120
except: []
inputs:
- id: 119
- id: 120
name: c_invoice
table:
- default_db
Expand Down Expand Up @@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 121
target_id: 122
target_name: ~
- Single:
name: ~
target_id: 137
target_id: 138
target_name: ~
inputs:
- id: 119
- id: 120
name: c_invoice
table:
- default_db
Expand Down
1 change: 1 addition & 0 deletions prqlc/prqlc/src/semantic/std.prql
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ module date {
let to_text = format<text> column -> <text> internal std.date.to_text
let diff = `noresolve.unit` start end -> <int> internal std.date.diff
let trunc = unit<text> column -> internal std.date.trunc
let to_start_of_interval = amount<int> `noresolve.unit` column -> internal std.date.to_start_of_interval
}

## File-reading functions, primarily for DuckDB
Expand Down
8 changes: 8 additions & 0 deletions prqlc/prqlc/src/sql/std.sql.prql
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ module date {
# BigQuery: https://cloud.google.com/bigquery/docs/reference/standard-sql/date_functions#date_trunc
# Snowflake: https://docs.snowflake.com/en/sql-reference/functions/date_trunc
let trunc = unit column -> s"DATE_TRUNC({unit:0}, {column:0})"
let to_start_of_interval = amount unit column -> null
}

# Source-reading functions, primarily for DuckDB
Expand Down Expand Up @@ -229,6 +230,7 @@ module bigquery {
let diff = unit start end -> s"DATE_DIFF({end:0}, {start:0}, {unit:0})"
# BigQuery requires parentheses for CURRENT_TIMESTAMP
let now = -> s"CURRENT_TIMESTAMP()"
let to_start_of_interval = amount unit column -> s"TIMESTAMP_BUCKET(CAST({column:0} AS TIMESTAMP), INTERVAL {amount:0} {unit:0})"
}

let regex_search = text pattern -> s"REGEXP_CONTAINS({text:0}, {pattern:0})"
Expand All @@ -250,6 +252,8 @@ module clickhouse {
let diff = unit start end -> s"dateDiff('{unit:0}', {start:0}, {end:0})"
# Clickhouse uses now() for current timestamp
let now = -> s"now()"
# https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions#toStartOfInterval
let to_start_of_interval = amount unit column -> s"toStartOfInterval({column:0}, INTERVAL {amount:0} {unit:0})"
}

let regex_search = text pattern -> s"match({text:0}, {pattern:0})"
Expand Down Expand Up @@ -278,6 +282,7 @@ module duckdb {
let to_text = format column -> s"strftime({column:0}, {format:0})"
# https://duckdb.org/docs/sql/functions/date
let diff = unit start end -> s"datediff('{unit:0}', {start:0}, {end:0})"
let to_start_of_interval = amount unit column -> s"time_bucket(INTERVAL '{amount:0} {unit:0}', {column:0})"
}

let regex_search = text pattern -> s"REGEXP_MATCHES({text:0}, {pattern:0})"
Expand Down Expand Up @@ -309,6 +314,7 @@ module mssql {
module date {
# https://learn.microsoft.com/en-us/sql/t-sql/functions/format-transact-sql
let to_text = format column -> s"FORMAT({column:0}, {format:0})"
let to_start_of_interval = amount unit column -> null
}

let regex_search = text pattern -> null
Expand All @@ -334,6 +340,7 @@ module mysql {
let now = -> s"NOW()"
# https://dev.mysql.com/doc/refman/8.4/en/date-and-time-functions.html#function_date-trunc
let trunc = unit column -> s"DATE_TRUNC({unit:0}, {column:0})"
let to_start_of_interval = amount unit column -> null
}

# 'c' for case-sensitive
Expand Down Expand Up @@ -366,6 +373,7 @@ module postgres {
let to_text = format column -> s"TO_CHAR({column:0}, {format:0})"
# PostgreSQL has no built-in DATEDIFF equivalent
let diff = unit start end -> null
let to_start_of_interval = amount unit column -> s"date_bin('{amount:0} {unit:0}', {column:0}, TIMESTAMP '1970-01-01 00:00:00')"
}

@{binding_strength=9}
Expand Down
Loading
Loading