Skip to content

Commit 63e57d5

Browse files
ok
1 parent b2ec636 commit 63e57d5

File tree

11 files changed

+115
-142
lines changed

11 files changed

+115
-142
lines changed

Cargo.lock

Lines changed: 8 additions & 120 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ biome_js_syntax = "0.5.7"
2323
biome_rowan = "0.5.7"
2424
biome_string_case = "0.5.8"
2525
bpaf = { version = "0.9.15", features = ["derive"] }
26+
criterion = "0.5"
2627
crossbeam = "0.8.4"
2728
enumflags2 = "0.7.11"
2829
ignore = "0.4.23"

crates/pgt_completions/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ sqlx.workspace = true
3131
tokio = { version = "1.41.1", features = ["full"] }
3232

3333
[dev-dependencies]
34-
criterion = "0.5.1"
34+
criterion.workspace = true
3535
pgt_test_utils.workspace = true
3636

3737
[lib]

crates/pgt_statement_splitter/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pgt_text_size.workspace = true
1919
regex.workspace = true
2020

2121
[dev-dependencies]
22-
criterion = "0.3"
22+
criterion.workspace = true
2323
ntest = "0.9.3"
2424

2525
[[bench]]

crates/pgt_typecheck/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ tree-sitter.workspace = true
2929
uuid = { version = "1.18.1", features = ["v4"] }
3030

3131
[dev-dependencies]
32+
criterion.workspace = true
3233
insta.workspace = true
3334
pgt_test_utils.workspace = true
3435

36+
[[bench]]
37+
harness = false
38+
name = "error_rewriting"
39+
3540
[lib]
3641
doctest = false
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use criterion::{black_box, criterion_group, criterion_main, Criterion};
2+
use pgt_typecheck::diagnostics::rewrite_error_message;
3+
use pgt_typecheck::IdentifierReplacement;
4+
5+
fn benchmark_error_rewriting(c: &mut Criterion) {
6+
let replacement = IdentifierReplacement {
7+
original_name: "user_id".to_string(),
8+
original_range: 0..7,
9+
default_value: "'00000000-0000-0000-0000-000000000000'".to_string(),
10+
type_name: "uuid".to_string(),
11+
};
12+
13+
// test case 1: matching the first pattern (most common case)
14+
c.bench_function("rewrite_invalid_input_syntax", |b| {
15+
b.iter(|| {
16+
rewrite_error_message(
17+
black_box(r#"invalid input syntax for type integer: "00000000-0000-0000-0000-000000000000""#),
18+
black_box(&replacement),
19+
)
20+
})
21+
});
22+
23+
// test case 2: matching the operator pattern
24+
c.bench_function("rewrite_operator_does_not_exist", |b| {
25+
b.iter(|| {
26+
rewrite_error_message(
27+
black_box("operator does not exist: integer + text"),
28+
black_box(&replacement),
29+
)
30+
})
31+
});
32+
33+
// test case 3: no pattern matches (fallback)
34+
c.bench_function("rewrite_fallback", |b| {
35+
b.iter(|| {
36+
rewrite_error_message(
37+
black_box("some other error message that doesn't match any pattern"),
38+
black_box(&replacement),
39+
)
40+
})
41+
});
42+
43+
// test case 4: longer error message with first pattern
44+
c.bench_function("rewrite_long_message", |b| {
45+
b.iter(|| {
46+
rewrite_error_message(
47+
black_box(r#"invalid input syntax for type timestamp: "00000000-0000-0000-0000-000000000000" at character 45"#),
48+
black_box(&replacement),
49+
)
50+
})
51+
});
52+
}
53+
54+
criterion_group!(benches, benchmark_error_rewriting);
55+
criterion_main!(benches);

crates/pgt_typecheck/src/diagnostics.rs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -116,20 +116,6 @@ static ERROR_RULES: Lazy<Vec<ErrorRewriteRule>> = Lazy::new(|| {
116116
)
117117
},
118118
},
119-
ErrorRewriteRule {
120-
pattern: Regex::new(
121-
r#"column "([^"]*)" is of type (\w+) but expression is of type (\w+)"#,
122-
)
123-
.unwrap(),
124-
rewrite: |caps, replacement| {
125-
let column = &caps[1];
126-
let expected_type = &caps[2];
127-
format!(
128-
"column `{}` expects {}, but `{}` is of type {}",
129-
column, expected_type, replacement.original_name, replacement.type_name
130-
)
131-
},
132-
},
133119
ErrorRewriteRule {
134120
pattern: Regex::new(r#"operator does not exist: (.+)"#).unwrap(),
135121
rewrite: |caps, replacement| {
@@ -144,7 +130,7 @@ static ERROR_RULES: Lazy<Vec<ErrorRewriteRule>> = Lazy::new(|| {
144130
});
145131

146132
/// Rewrites Postgres error messages to be more user-friendly
147-
fn rewrite_error_message(pg_error_message: &str, replacement: &IdentifierReplacement) -> String {
133+
pub fn rewrite_error_message(pg_error_message: &str, replacement: &IdentifierReplacement) -> String {
148134
// try each rule
149135
for rule in ERROR_RULES.iter() {
150136
if let Some(caps) = rule.pattern.captures(pg_error_message) {

crates/pgt_typecheck/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
mod diagnostics;
2-
mod typed_identifier;
1+
pub mod diagnostics;
2+
pub mod typed_identifier;
33

44
pub use diagnostics::TypecheckDiagnostic;
55
use diagnostics::create_type_error;
@@ -10,7 +10,7 @@ use sqlx::postgres::PgDatabaseError;
1010
pub use sqlx::postgres::PgSeverity;
1111
use sqlx::{Executor, PgPool};
1212
use typed_identifier::apply_identifiers;
13-
pub use typed_identifier::{IdentifierType, TypedIdentifier};
13+
pub use typed_identifier::{IdentifierReplacement, IdentifierType, TypedIdentifier};
1414

1515
#[derive(Debug)]
1616
pub struct TypecheckParams<'a> {

0 commit comments

Comments
 (0)