Skip to content

Commit

Permalink
Fix pretty-print implementation to not use transmute. (#541)
Browse files Browse the repository at this point in the history
  • Loading branch information
jpschorr authored Jan 31, 2025
1 parent b056bcf commit 2a3dd4b
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 66 deletions.
56 changes: 14 additions & 42 deletions partiql-ast/src/pretty.rs
Original file line number Diff line number Diff line change
Expand Up @@ -697,60 +697,32 @@ impl PrettyDoc for Struct {
D::Doc: Clone,
A: Clone,
{
let wrapped = self.fields.iter().map(|p| unsafe {
let x: &'b StructExprPair = std::mem::transmute(p);
x
});
pretty_seq(wrapped, "{", "}", ",", PRETTY_INDENT_MINOR_NEST, arena)
}
}

pub struct StructExprPair(pub ExprPair);

impl PrettyDoc for StructExprPair {
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
where
D: DocAllocator<'b, A>,
D::Doc: Clone,
A: Clone,
{
let k = self.0.first.pretty_doc(arena);
let v = self.0.second.pretty_doc(arena);
let sep = arena.text(": ");

k.append(sep).group().append(v).group()
}
}
let fields = self.fields.iter().map(|expr_pair| {
let k = expr_pair.first.pretty_doc(arena);
let v = expr_pair.second.pretty_doc(arena);
let sep = arena.text(": ");

impl PrettyDoc for StructLit {
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
where
D: DocAllocator<'b, A>,
D::Doc: Clone,
A: Clone,
{
let wrapped = self.fields.iter().map(|p| unsafe {
let x: &'b StructLitField = std::mem::transmute(p);
x
k.append(sep).group().append(v).group()
});
pretty_seq(wrapped, "{", "}", ",", PRETTY_INDENT_MINOR_NEST, arena)
pretty_seq_doc(fields, "{", None, "}", ",", PRETTY_INDENT_MINOR_NEST, arena)
}
}

pub struct StructLitField(pub LitField);

impl PrettyDoc for StructLitField {
impl PrettyDoc for StructLit {
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
where
D: DocAllocator<'b, A>,
D::Doc: Clone,
A: Clone,
{
let k = self.0.first.pretty_doc(arena);
let v = self.0.second.pretty_doc(arena);
let sep = arena.text(": ");
let fields = self.fields.iter().map(|expr_pair| {
let k = expr_pair.first.pretty_doc(arena);
let v = expr_pair.second.pretty_doc(arena);
let sep = arena.text(": ");

k.append(sep).group().append(v).group()
k.append(sep).group().append(v).group()
});
pretty_seq_doc(fields, "{", None, "}", ",", PRETTY_INDENT_MINOR_NEST, arena)
}
}

Expand Down
33 changes: 9 additions & 24 deletions partiql-value/src/pretty.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::{Bag, DateTime, List, Tuple, Value};
use partiql_common::pretty::{
pretty_prefixed_doc, pretty_seq, pretty_surrounded, PrettyDoc, PRETTY_INDENT_MINOR_NEST,
pretty_prefixed_doc, pretty_seq, pretty_seq_doc, pretty_surrounded, PrettyDoc,
PRETTY_INDENT_MINOR_NEST,
};
use pretty::{DocAllocator, DocBuilder};

Expand Down Expand Up @@ -84,36 +85,20 @@ impl PrettyDoc for Bag {
}

impl PrettyDoc for Tuple {
#[inline]
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
where
D: DocAllocator<'b, A>,
D::Doc: Clone,
A: Clone,
{
let wrapped = self.pairs().map(|p| unsafe {
let x: &'b StructValuePair<'b> = std::mem::transmute(&p);
x
});
pretty_seq(wrapped, "{", "}", ",", PRETTY_INDENT_MINOR_NEST, arena)
}
}
let seq = self.pairs().map(|(k, v)| {
let k = k.pretty_doc(arena);
let v = v.pretty_doc(arena);
let sep = arena.text(": ");

pub struct StructValuePair<'a>((&'a String, &'a Value));

impl PrettyDoc for StructValuePair<'_> {
fn pretty_doc<'b, D, A>(&'b self, arena: &'b D) -> DocBuilder<'b, D, A>
where
D: DocAllocator<'b, A>,
D::Doc: Clone,
A: Clone,
{
let (k, v) = self.0;
let k = k.pretty_doc(arena);
let v = v.pretty_doc(arena);
let sep = arena.text(": ");

k.append(sep).group().append(v).group()
k.append(sep).group().append(v).group()
});
pretty_seq_doc(seq, "{", None, "}", ",", PRETTY_INDENT_MINOR_NEST, arena)
}
}

Expand Down

1 comment on commit 2a3dd4b

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PartiQL (rust) Benchmark

Benchmark suite Current: 2a3dd4b Previous: b056bcf Ratio
arith_agg-avg 769814 ns/iter (± 8314) 757318 ns/iter (± 16002) 1.02
arith_agg-avg_distinct 878690 ns/iter (± 2966) 844086 ns/iter (± 9443) 1.04
arith_agg-count 826538 ns/iter (± 10833) 807409 ns/iter (± 42589) 1.02
arith_agg-count_distinct 870623 ns/iter (± 2881) 836927 ns/iter (± 12277) 1.04
arith_agg-min 824801 ns/iter (± 3057) 808410 ns/iter (± 6995) 1.02
arith_agg-min_distinct 878694 ns/iter (± 36343) 840825 ns/iter (± 3734) 1.05
arith_agg-max 830727 ns/iter (± 14819) 815584 ns/iter (± 4834) 1.02
arith_agg-max_distinct 883932 ns/iter (± 1838) 850107 ns/iter (± 3559) 1.04
arith_agg-sum 825535 ns/iter (± 2352) 812224 ns/iter (± 4057) 1.02
arith_agg-sum_distinct 878740 ns/iter (± 4897) 842331 ns/iter (± 14878) 1.04
arith_agg-avg-count-min-max-sum 992053 ns/iter (± 12382) 979063 ns/iter (± 12065) 1.01
arith_agg-avg-count-min-max-sum-group_by 1283717 ns/iter (± 14931) 1254376 ns/iter (± 7362) 1.02
arith_agg-avg-count-min-max-sum-group_by-group_as 1894899 ns/iter (± 11739) 1858137 ns/iter (± 18285) 1.02
arith_agg-avg_distinct-count_distinct-min_distinct-max_distinct-sum_distinct 1222616 ns/iter (± 22080) 1185559 ns/iter (± 23163) 1.03
arith_agg-avg_distinct-count_distinct-min_distinct-max_distinct-sum_distinct-group_by 1510808 ns/iter (± 14382) 1455563 ns/iter (± 19682) 1.04
arith_agg-avg_distinct-count_distinct-min_distinct-max_distinct-sum_distinct-group_by-group_as 2124163 ns/iter (± 11454) 2009789 ns/iter (± 8262) 1.06
parse-1 5271 ns/iter (± 76) 5508 ns/iter (± 13) 0.96
parse-15 46437 ns/iter (± 204) 46937 ns/iter (± 214) 0.99
parse-30 89384 ns/iter (± 2251) 91095 ns/iter (± 317) 0.98
compile-1 4183 ns/iter (± 19) 4314 ns/iter (± 127) 0.97
compile-15 30397 ns/iter (± 472) 31291 ns/iter (± 164) 0.97
compile-30 63226 ns/iter (± 359) 64400 ns/iter (± 451) 0.98
plan-1 67639 ns/iter (± 460) 70814 ns/iter (± 595) 0.96
plan-15 1052204 ns/iter (± 20267) 1101201 ns/iter (± 27461) 0.96
plan-30 2104378 ns/iter (± 18622) 2112687 ns/iter (± 31704) 1.00
eval-1 12341094 ns/iter (± 178903) 12113412 ns/iter (± 159946) 1.02
eval-15 78913822 ns/iter (± 323686) 78669131 ns/iter (± 244003) 1.00
eval-30 149710776 ns/iter (± 485303) 150325118 ns/iter (± 481405) 1.00
join 9608 ns/iter (± 28) 9754 ns/iter (± 410) 0.99
simple 2438 ns/iter (± 5) 2514 ns/iter (± 8) 0.97
simple-no 465 ns/iter (± 1) 505 ns/iter (± 4) 0.92
numbers 57 ns/iter (± 0) 57 ns/iter (± 0) 1
parse-simple 697 ns/iter (± 12) 689 ns/iter (± 1) 1.01
parse-ion 2349 ns/iter (± 8) 2324 ns/iter (± 18) 1.01
parse-group 7332 ns/iter (± 57) 7152 ns/iter (± 30) 1.03
parse-complex 19289 ns/iter (± 209) 18744 ns/iter (± 181) 1.03
parse-complex-fexpr 25980 ns/iter (± 127) 26076 ns/iter (± 187) 1.00

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.