Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix: add dual id generators to reduce snapshot churn by kgutwin · Pull Request #6156 · PRQL/prql · GitHub
Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: add dual id generators to reduce snapshot churn by kgutwin · Pull Request #6156 · PRQL/prql · GitHub
Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: add dual id generators to reduce snapshot churn by kgutwin · Pull Request #6156 · PRQL/prql · GitHub
Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' fix: add dual id generators to reduce snapshot churn by kgutwin · Pull Request #6156 · PRQL/prql · GitHub
Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: add dual id generators to reduce snapshot churn by kgutwin · Pull Request #6156 · PRQL/prql · GitHub
Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix: add dual id generators to reduce snapshot churn by kgutwin · Pull Request #6156 · PRQL/prql · GitHub
Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); fix: add dual id generators to reduce snapshot churn by kgutwin · Pull Request #6156 · PRQL/prql · GitHub
Skip to content
Merged
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 numberDiff line numberDiff 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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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":123,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":124,"target_name":null}}],"inputs":[{"id":121,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":121,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":126},{"id":123,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[121],"parent":125},{"id":124,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[121],"parent":125},{"id":125,"kind":"Tuple","span":"1:16-31","children":[123,124],"parent":126},{"id":126,"kind":"TransformCall: Select","span":"1:9-31","children":[121,125]}],"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":8,"target_name":null}},{"Single":{"name":["a","gamma"],"target_id":9,"target_name":null}}],"inputs":[{"id":7,"name":"a","table":["default_db","a"]}]}]],"nodes":[{"id":7,"kind":"Ident","span":"1:0-6","ident":{"Ident":["default_db","a"]},"parent":11},{"id":8,"kind":"Ident","span":"1:18-22","ident":{"Ident":["this","a","beta"]},"targets":[7],"parent":10},{"id":9,"kind":"Ident","span":"1:24-29","ident":{"Ident":["this","a","gamma"]},"targets":[7],"parent":10},{"id":10,"kind":"Tuple","span":"1:16-31","children":[8,9],"parent":11},{"id":11,"kind":"TransformCall: Select","span":"1:9-31","children":[7,10]}],"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"}]}}"#
);
}
}
40 changes: 20 additions & 20 deletions prqlc/prqlc/src/cli/test.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -424,7 +424,7 @@ fn compare_directories(dir1: &Path, dir2: &Path) {
fn debug() {
assert_cmd_snapshot!(prqlc_command()
.args(["debug", "lineage"])
.pass_stdin("from tracks | select {artist, album}"), @r###"
.pass_stdin("from tracks | select {artist, album}"), @"
success: true
exit_code: 0
----- stdout -----
Expand All@@ -435,61 +435,61 @@ fn debug() {
name:
- tracks
- artist
target_id: 123
target_id: 8
target_name: null
- !Single
name:
- tracks
- album
target_id: 124
target_id: 9
target_name: null
inputs:
- id: 121
- id: 7
name: tracks
table:
- default_db
- tracks
nodes:
- id: 121
- id: 7
kind: Ident
span: 1:0-11
ident: !Ident
- default_db
- tracks
parent: 126
- id: 123
parent: 11
- id: 8
kind: Ident
span: 1:22-28
ident: !Ident
- this
- tracks
- artist
targets:
- 121
parent: 125
- id: 124
- 7
parent: 10
- id: 9
kind: Ident
span: 1:30-35
ident: !Ident
- this
- tracks
- album
targets:
- 121
parent: 125
- id: 125
- 7
parent: 10
- id: 10
kind: Tuple
span: 1:21-36
children:
- 123
- 124
parent: 126
- id: 126
- 8
- 9
parent: 11
- id: 11
kind: 'TransformCall: Select'
span: 1:14-36
children:
- 121
- 125
- 7
- 10
ast:
name: Project
stmts:
Expand DownExpand Up@@ -528,7 +528,7 @@ fn debug() {
span: 1:0-36

----- stderr -----
"###);
");

// Don't test the output of this, since on one min-versions check it had
// different results, and didn't repro on Mac. It having different results
Expand Down
2 changes: 2 additions & 0 deletions prqlc/prqlc/src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -457,6 +457,7 @@ impl SourceTree {
pub fn single(path: PathBuf, content: String) -> Self {
SourceTree {
sources: [(path.clone(), content)].into(),
// the std lib source ID is 0, so user-supplied sources are 1 or greater
source_ids: [(1, path)].into(),
root: None,
}
Expand All@@ -474,6 +475,7 @@ impl SourceTree {

for (index, (path, content)) in iter.into_iter().enumerate() {
res.sources.insert(path.clone(), content);
// the std lib source ID is 0, so user-supplied sources are 1 or greater
res.source_ids.insert((index + 1) as u16, path);
}
res
Expand Down
4 changes: 3 additions & 1 deletion prqlc/prqlc/src/semantic/mod.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,8 @@ use crate::WithErrorInfo;
use crate::{debug, parser};
use crate::{Error, Reason, Result};

pub const STD_LIB_SOURCE_ID: u16 = 0;

/// Runs semantic analysis on the query and lowers PL to RQ.
pub fn resolve_and_lower(
file_tree: pr::ModuleDef,
Expand DownExpand Up@@ -67,7 +69,7 @@ pub fn load_std_lib(module_tree: &mut pr::ModuleDef) {
let _suppressed = debug::log_suppress();

let std_source = include_str!("std.prql");
match parser::parse_source(std_source, 0) {
match parser::parse_source(std_source, STD_LIB_SOURCE_ID) {
Ok(stmts) => {
let stmt = pr::Stmt::new(pr::StmtKind::ModuleDef(pr::ModuleDef {
name: "std".to_string(),
Expand Down
11 changes: 9 additions & 2 deletions prqlc/prqlc/src/semantic/resolver/expr.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ use crate::ir::pl;
use crate::ir::pl::PlFold;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::resolver::{flatten, types, Resolver};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS};
use crate::semantic::{NS_INFER, NS_SELF, NS_THAT, NS_THIS, STD_LIB_SOURCE_ID};
use crate::utils::IdGenerator;
use crate::Result;
use crate::{Error, Reason, Span, WithErrorInfo};
Expand DownExpand Up@@ -62,7 +62,14 @@ impl pl::PlFold for Resolver<'_> {
return Ok(node);
}

let id = self.id.gen();
let id = if node
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
self.id.gen_sys()
} else {
self.id.gen()
};
let alias = node.alias.clone();
let span = node.span;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,21 +7,21 @@ columns:
name:
- employees
- name
target_id: 137
target_id: 21
target_name: ~
- Single:
name:
- employees
- salary
target_id: 138
target_id: 22
target_name: ~
inputs:
- id: 135
- id: 20
name: employees
table:
- default_db
- employees
- id: 124
- id: 10
name: managers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,18 +4,18 @@ expression: "resolve_lineage(r#\"\n from table_1\n join cu
---
columns:
- All:
input_id: 122
input_id: 8
except: []
- All:
input_id: 119
input_id: 5
except: []
inputs:
- id: 122
- id: 8
name: table_1
table:
- default_db
- table_1
- id: 119
- id: 5
name: customers
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- e
- emp_no
target_id: 132
target_id: 17
target_name: ~
- Single:
name:
- e
- gender
target_id: 133
target_id: 18
target_name: ~
- Single:
name:
- emp_salary
target_id: 151
target_id: 36
target_name: ~
inputs:
- id: 125
- id: 11
name: e
table:
- default_db
- employees
- id: 122
- id: 8
name: salaries
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,26 +7,26 @@ columns:
name:
- orders
- customer_no
target_id: 126
target_id: 11
target_name: ~
- Single:
name:
- orders
- gross
target_id: 127
target_id: 12
target_name: ~
- Single:
name:
- orders
- tax
target_id: 128
target_id: 13
target_name: ~
- Single:
name: ~
target_id: 129
target_id: 14
target_name: ~
inputs:
- id: 124
- id: 10
name: orders
table:
- default_db
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,10 +21,10 @@ TransformCall:
lineage:
columns:
- All:
input_id: 121
input_id: 7
except: []
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand DownExpand Up@@ -94,14 +94,14 @@ lineage:
name:
- c_invoice
- issued_at
target_id: 123
target_id: 8
target_name: ~
- Single:
name: ~
target_id: 139
target_id: 24
target_name: ~
inputs:
- id: 121
- id: 7
name: c_invoice
table:
- default_db
Expand Down
10 changes: 9 additions & 1 deletion prqlc/prqlc/src/semantic/resolver/stmt.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,14 +3,22 @@ use std::collections::HashMap;
use crate::ir::decl::{Decl, DeclKind, Module, TableDecl, TableExpr};
use crate::ir::pl::*;
use crate::pr::{Ty, TyKind, TyTupleField};
use crate::semantic::STD_LIB_SOURCE_ID;
use crate::Result;
use crate::WithErrorInfo;

impl super::Resolver<'_> {
// entry point to the resolver
pub fn fold_statements(&mut self, stmts: Vec<Stmt>) -> Result<()> {
for mut stmt in stmts {
stmt.id = Some(self.id.gen());
stmt.id = if stmt
.span
.is_some_and(|span| span.source_id == STD_LIB_SOURCE_ID)
{
Some(self.id.gen_sys())
} else {
Some(self.id.gen())
};
if let Some(span) = stmt.span {
self.root_mod.span_map.insert(stmt.id.unwrap(), span);
}
Expand Down
Loading
Loading