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
3 changes: 2 additions & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[submodule "libpg_query"]
path = libpg_query
url = https://github.com/pgdogdev/libpg_query
url = https://github.com/pganalyze/libpg_query
branch = 18-latest
10 changes: 6 additions & 4 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ fn main() {
let mut bindgen = bindgen
.allowlist_item("Node")
.allowlist_item("MemoryContext")
.allowlist_item("equal")
.allowlist_item("pg_query_init")
.allowlist_item("AllocSetContextCreateInternal")
.allowlist_item("ALLOCSET_DEFAULT_MINSIZE")
Expand Down Expand Up @@ -163,13 +164,14 @@ fn main() {
)
.file(out_dir.join("wrap_static_fns.c"))
.file(build_dir.join("copy_pg_error.c"))
// Unfortunately, the linker expects protobuf functions to be present
// even if we're never using them
.file(c_dir.join("vendor/protobuf-c/protobuf-c.c"))
.file(c_dir.join("vendor/upb/upb.c"))
.file(c_dir.join("vendor/upb/third_party/utf8_range/utf8_range.c"))
.file(c_dir.join("vendor/xxhash/xxhash.c"))
.file(c_dir.join("protobuf/pg_query.pb-c.c"))
.file(c_dir.join("protobuf/pg_query.upb_minitable.c"))
.include(&*c_dir)
.include(c_dir.join("vendor"))
.include(c_dir.join("vendor/upb"))
.include(c_dir.join("vendor/upb/third_party/utf8_range"))
.include(c_dir.join("src/postgres/include"))
.include(c_dir.join("src/include"))
.include(build_dir)
Expand Down
2 changes: 1 addition & 1 deletion libpg_query
Submodule libpg_query updated 78 files
+7 −2 .gitattributes
+1 −1 .github/workflows/ci.yml
+6 −0 .gitignore
+19 −0 CHANGELOG.md
+58 −12 Makefile
+10 −6 Makefile.msvc
+90 −24 README.md
+51 −0 benchmark/README.md
+101 −0 benchmark/bench_protobuf.c
+116 −0 benchmark/microbench_protobuf.c
+9 −20 examples/scan.c
+27 −0 patches/13_exprlocation_check_stack_depth.patch
+46 −0 patches/14_avoid_quadratic_memory_dotted_names.patch
+49 −1 pg_query.h
+575 −0 pg_query_scan_tokens.h
+0 −45,829 protobuf/pg_query.pb-c.c
+0 −13,036 protobuf/pg_query.pb-c.h
+71,226 −0 protobuf/pg_query.upb.h
+10,667 −0 protobuf/pg_query.upb_minitable.c
+310 −0 protobuf/pg_query.upb_minitable.h
+3 −0 scripts/extract_source.rb
+22 −100 scripts/generate_fingerprint_outfuncs.rb
+123 −66 scripts/generate_protobuf_and_funcs.rb
+149 −224 src/include/pg_query_fingerprint_defs.c
+1,363 −1,363 src/include/pg_query_outfuncs_defs.c
+1,887 −1,887 src/include/pg_query_readfuncs_defs.c
+567 −0 src/include/pg_query_scan_defs.c
+166 −0 src/pg_query.c
+18 −20 src/pg_query_deparse.c
+146 −9 src/pg_query_fingerprint.c
+1 −1 src/pg_query_fingerprint.h
+17 −0 src/pg_query_internal.h
+30 −1 src/pg_query_normalize.c
+5 −0 src/pg_query_outfuncs.h
+33 −16 src/pg_query_outfuncs_json.c
+224 −186 src/pg_query_outfuncs_protobuf.c
+73 −35 src/pg_query_outfuncs_protobuf_cpp.cc
+76 −4 src/pg_query_parse.c
+22 −3 src/pg_query_parse_plpgsql.c
+183 −110 src/pg_query_readfuncs_protobuf.c
+154 −54 src/pg_query_scan.c
+74 −103 src/pg_query_summary.c
+4 −0 src/postgres/src_backend_nodes_nodeFuncs.c
+17,664 −17,540 src/postgres/src_backend_parser_gram.c
+32 −1 src/postgres/src_backend_utils_misc_stack_depth.c
+379 −153 src/postgres_deparse.c
+4 −2 test/complex.c
+0 −1 test/deparse.c
+297 −0 test/deparse_depth.c
+33 −6 test/deparse_tests.c
+1 −1 test/fingerprint.c
+28 −2 test/fingerprint_opts.c
+56 −0 test/fingerprint_opts_tests.c
+59 −0 test/parse_plpgsql.c
+183 −14 test/scan.c
+1 −3 test/sql/deparse-depesz/08-selects.d/10-operators.psql
+1 −1 test/sql/deparse-depesz/08-selects.d/15-where.psql
+3 −4 test/sql/deparse/complex_depesz.sql
+180 −0 test/stack_depth.c
+0 −3,667 vendor/protobuf-c/protobuf-c.c
+0 −1,110 vendor/protobuf-c/protobuf-c.h
+32 −0 vendor/upb/LICENSE
+84 −0 vendor/upb/Makefile
+132 −0 vendor/upb/README
+1 −0 vendor/upb/VERSION
+20 −0 vendor/upb/patches/0001-decode-strings-as-bytes.patch
+53 −0 vendor/upb/patches/0002-force-inline-encoder-helpers.patch
+70 −0 vendor/upb/patches/0003-stack-depth-check.patch
+22 −0 vendor/upb/third_party/utf8_range/LICENSE
+207 −0 vendor/upb/third_party/utf8_range/utf8_range.c
+23 −0 vendor/upb/third_party/utf8_range/utf8_range.h
+117 −0 vendor/upb/third_party/utf8_range/utf8_range_neon.inc
+272 −0 vendor/upb/third_party/utf8_range/utf8_range_sse.inc
+30 −0 vendor/upb/third_party/utf8_range/utf8_validity.h
+10,763 −0 vendor/upb/upb.c
+9,619 −0 vendor/upb/upb/generated_code_support.h
+828 −0 vendor/upb/upb/port/def.inc
+96 −0 vendor/upb/upb/port/undef.inc
31 changes: 31 additions & 0 deletions src/deparse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,37 @@ fn test_deparse() {
run_test("SELECT (ts -> 'a') AT TIME ZONE tz FROM s");
run_test("SELECT ts AT TIME ZONE (a -> 'b') FROM s");
run_test("SELECT ts AT TIME ZONE (tz || 'x') FROM s");
run_test(
"SELECT ((summary ->> 'ts')::timestamptz AT TIME ZONE (summary -> 'stop' ->> 'tz'))::date AS d FROM s",
);
}

#[test]
fn deparse_ast() {
fn run_test(query: &str) {
let original = crate::parse(query).unwrap();
let stmt = original.first().unwrap();
let deparsed = deparse(stmt).unwrap();
let reparsed = crate::parse(deparsed.as_str()).unwrap();
let reparsed_stmt = reparsed.first().unwrap();

assert!(
unsafe {
crate::raw::equal(
std::ptr::from_ref(stmt).cast(),
std::ptr::from_ref(reparsed_stmt).cast(),
)
},
"{query}\n{}",
deparsed.as_str()
);
}

run_test("SELECT (a + b) * c FROM t");
run_test("SELECT a - (b - c) FROM t");
run_test("SELECT (a OR b) AND c FROM t");
run_test("SELECT (data -> 'stop') ->> 'tz' FROM t");
run_test("SELECT (ts AT TIME ZONE (tz || 'x'))::date FROM t");
run_test(
"SELECT ((summary ->> 'ts')::timestamptz AT TIME ZONE ((summary -> 'stop') ->> 'tz'))::date AS d FROM s",
);
Expand Down
Loading