Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
807 commits
Select commit Hold shift + click to select a range
6d5d0fe
Deliver NOTIFY outside of transactions only (#451)
levkk Sep 12, 2025
65339c5
Numeric rough draft, includes binary protocol (#365)
jaggederest Sep 12, 2025
01e84ed
Update CLAUDE.md with new test commands and guidelines (#452)
jaggederest Sep 12, 2025
b597d04
SIMD the vector calculations (#453)
jaggederest Sep 12, 2025
a065450
Move parsing outside lock lifetime (#456)
jaggederest Sep 12, 2025
a43ee41
Fix incorrect cross-shard error handling (#455)
levkk Sep 13, 2025
27062d8
Disable auto transactions by default (#459)
levkk Sep 13, 2025
6290b6e
Process extended protocol messages in the right order (#461)
levkk Sep 14, 2025
859c33d
fix: correct aggregate function matching in parser (#462)
Prabhat1308 Sep 14, 2025
8ecc1a3
Handle Close in order it was received (#463)
levkk Sep 14, 2025
5f93b49
Ignore DISCARD (#466)
levkk Sep 15, 2025
cc70ae4
Healthcheck endpoint, query parser fix (#470)
levkk Sep 15, 2025
43fc3a6
Log which table we fetch schema for (#476)
levkk Sep 17, 2025
d10e5dc
Tag 0.1.7 (#481)
levkk Sep 18, 2025
2145420
Add /* pgdog_role */ comment (#482)
levkk Sep 19, 2025
ad3c390
Handle SQLAlchemy empty queries better (#484)
levkk Sep 19, 2025
3d9a8c5
server_lifetime setting (#489)
levkk Sep 22, 2025
4efd054
Implement configcheck (#490)
levkk Sep 23, 2025
7cfa757
Fix dry run (#491)
levkk Sep 23, 2025
54cb1da
Fix comments with SET (#492)
levkk Sep 23, 2025
25b29e3
Disable LB host banning when no alternative targets available
ryanahall Sep 25, 2025
207c543
Fix #487 (#501)
levkk Sep 25, 2025
d2c3b94
More java tests! (#505)
levkk Sep 25, 2025
d8127d5
Release v0.1.8 (#506)
levkk Sep 25, 2025
203f942
Clear prepared statement cache on discard/deallocate all (#508)
ryanahall Sep 26, 2025
030ff82
On DISCARD ALL, reset client params for re-sync (#509)
ryanahall Sep 26, 2025
4d68e73
generate coverage + codecov (#504)
jaggederest Sep 26, 2025
9828725
Add AVG aggregate function coverage, expression parser that rides on …
jaggederest Sep 26, 2025
a3d45c3
Add pure-sql comparison run to integration (#507)
jaggederest Sep 27, 2025
e2a98bd
Add SQL cases for basic data types (#510)
jaggederest Sep 27, 2025
4c36c59
Fix direct-to-shard performance regression (#513)
levkk Sep 29, 2025
0216997
Rewrite bug fixes - old cache key, more efficient update (#516)
jaggederest Sep 30, 2025
a0eab84
Banning & connection pool fixes (#512)
levkk Oct 1, 2025
209ff94
Override admin in users.toml (#526)
levkk Oct 1, 2025
2938d0f
Use parsed AST instead of double-parsing SELECT stmt (#527)
levkk Oct 1, 2025
872b347
Add query parameter support for Database URL configuration (#525)
grk Oct 2, 2025
83461ff
Release 0.1.9 (#529)
levkk Oct 2, 2025
0ca1c20
Update README.md
levkk Oct 2, 2025
097c7fa
Support SCRAM via TLS for client connections (#530)
levkk Oct 2, 2025
1c6a3ab
Schema sync fixes and tests (#533)
levkk Oct 3, 2025
f664540
Add auth tests & plain auth for clients (#534)
levkk Oct 3, 2025
79e3447
swap to u16 on inbound and outbound paths (#522)
jaggederest Oct 3, 2025
6b1358f
TLS hot swap (#523)
jaggederest Oct 3, 2025
d7dd0c4
Fix duplicate host check warning (#535)
levkk Oct 5, 2025
4adc2a9
Correctly handle extended error state (#536)
levkk Oct 5, 2025
b5a61fb
Correct log message (#537)
levkk Oct 5, 2025
af95489
Aggregate stddev/variance (#503)
jaggederest Oct 6, 2025
df4f0b3
Incremental Test improvements (#511)
jaggederest Oct 6, 2025
02a3111
Avoid cloning AST until later in the rewrite process, where we need t…
jaggederest Oct 6, 2025
4bed715
Add hooks (#544)
levkk Oct 6, 2025
dd7ebd5
Add plugin unit/integration tests, optional for PR merge (#371)
jaggederest Oct 7, 2025
7973d16
Support savepoints (#547)
levkk Oct 7, 2025
9d9fcee
Fix: cancel backend sessions when shutdown timeout expires (#524)
KR-bluejay Oct 8, 2025
002a73d
Fix rollbacks with query parser disabled (#549)
levkk Oct 8, 2025
e1e8c8b
Annotate explain plans with routing decisions (#546)
jaggederest Oct 9, 2025
191ff84
Tag v0.1.10 (#551)
levkk Oct 9, 2025
6751506
Dont rewrite anon prepared statements by default (#556)
levkk Oct 10, 2025
9befe21
Include SSL cert in docker image (#557)
levkk Oct 12, 2025
74aa332
Add after_connected hook (#558)
levkk Oct 12, 2025
8989282
Use Bytes for Bind fields (#559)
levkk Oct 13, 2025
5f86f35
Another attempt at prep stmt fix (#561)
levkk Oct 15, 2025
c3a0c93
Prepared statement cache eviction (#562)
levkk Oct 16, 2025
e21787a
Sharding key updates (#555)
jaggederest Oct 16, 2025
58bdbf7
Close servers that havent finished reading/writing (#566)
levkk Oct 19, 2025
ae6c49d
Add more server tests (#568)
levkk Oct 20, 2025
baf0522
Identify client in query engine (#570)
levkk Oct 21, 2025
c476cd7
Dont alter publication during schema sync (#572)
levkk Oct 22, 2025
2954ca6
Primary key check (#573)
levkk Oct 22, 2025
ee63539
Tag 0.1.12 (#579)
levkk Oct 24, 2025
6ceb1e8
Build only pgdog in Dockerfile (#580)
levkk Oct 27, 2025
80d90ad
Server error stats (#581)
levkk Oct 28, 2025
a09564f
Track more errors in query engine (#582)
levkk Oct 28, 2025
8dcd201
Add include_primary_if_replica_banned rw_split strategy (#583)
levkk Oct 29, 2025
247c68e
Tag v0.1.13 (#588)
levkk Oct 29, 2025
7ce8422
Add cancellation safety to message reading (#591)
levkk Oct 30, 2025
7f59f00
Split sharded inserts to allow multirow insert into correct tables (#…
jaggederest Oct 30, 2025
cd2cbed
feat(docker): upgrade psql to 18 (#593)
mscrivo Oct 31, 2025
80efd6e
add tls_client_required setting (#587)
zxaos Oct 31, 2025
9fb178c
Reclaim space from buffer after every request (#592)
levkk Nov 1, 2025
910a13e
Profiling utils (#595)
levkk Nov 3, 2025
f3d88ca
Schema-based sharding (#596)
levkk Nov 6, 2025
df15c56
Config reload was delayed by one transaction (#598)
levkk Nov 7, 2025
b8fb259
Add connect_time and connect_count stats (#599)
levkk Nov 7, 2025
a9ad59c
Update `Dockerfile` to accept the pg version as a build argument (#601)
scottjacobsen Nov 11, 2025
80e401c
Copy partitioned table data (#602)
levkk Nov 12, 2025
bd4d22d
Create parse_queries_enabled configuration option. (#605)
mijoharas Nov 12, 2025
319a5e9
Add update/delete support to logical replication (#603)
levkk Nov 13, 2025
4c69308
Tag 0.1.15 (#607)
levkk Nov 13, 2025
71ab13e
Add --cutover flag to schema-sync (#608)
levkk Nov 13, 2025
5881df0
Add setting for controlling connection cleanup (#611)
levkk Nov 17, 2025
68a2270
Add statement mode (#612)
levkk Nov 17, 2025
6b670bf
Replica lag monitor (#613)
levkk Nov 18, 2025
8739651
Pool checkout tweak (#615)
levkk Nov 19, 2025
5e033ba
Automatic database role detection (#616)
levkk Nov 20, 2025
4917050
Omnisharded tables routing fix (#618)
levkk Nov 21, 2025
3d6db28
State::IdleInTransaction isn't updated until the end of a request (#617)
jaggederest Nov 21, 2025
96b3613
Omni routing and change to convergence for schema sharding (#620)
levkk Nov 21, 2025
ac8ab39
Add some test coverage (#622)
levkk Nov 21, 2025
2b185ec
Handle NULL sharding key in query router (#624)
levkk Nov 24, 2025
677a5b2
search_path schema-based sharding (#621)
levkk Nov 24, 2025
07c6f61
Client active status update (#626)
levkk Nov 24, 2025
020be53
[Schema] Handle IDENTITY columns (#627)
levkk Nov 25, 2025
5988572
fix: prepared statements with simple protocol not working (#628)
levkk Nov 25, 2025
22c1605
Fix: Preserve decimal/float values in INSERT and UPDATE statements (#…
phillipvanheerden Nov 25, 2025
009963f
fix: dropping identity column creation (#631)
levkk Nov 25, 2025
b6c4079
feat: sv_idle_xact, fix: multi-tuple insert fix (#632)
levkk Nov 25, 2025
1ad1809
fix: double checking for sharding key
levkk Nov 25, 2025
1ea157a
feat: track sv_idle_xact in OpenMetrics (#633)
levkk Nov 25, 2025
6671b6c
feat: globally unique ID generation without a database (#636)
levkk Nov 26, 2025
daf05de
fix: schema sharding (#641)
levkk Dec 2, 2025
4101a53
fix: flakey node id test
levkk Dec 2, 2025
51d034b
feat: handle Aurora in lsn monitor (#642)
levkk Dec 3, 2025
967dc5d
Fix aggregate group by count (#645)
mijoharas Dec 4, 2025
cad832b
fix: role detection; feat: set inside transactions (#647)
levkk Dec 4, 2025
1727978
v0.1.17
levkk Dec 4, 2025
4ede37f
feat: change server address logging format to include user (#650)
levkk Dec 4, 2025
0f9570d
fix: search_path overrides _all_ routing (#651)
levkk Dec 5, 2025
6a309aa
fix: protobuf stack overflow; feat: make stack size configurable for …
levkk Dec 5, 2025
26e25d1
fix: persist schema_path route for all commands, incl. set (#655)
levkk Dec 6, 2025
3fb9b3c
fix: time averages were completely wrong (#659)
levkk Dec 7, 2025
d7475a3
fix: prevent divizion by zero (#660)
levkk Dec 7, 2025
d58167f
feat: support subqueries for shard selection (#657)
levkk Dec 8, 2025
9acdaa8
fix: refactor of DELETE removed schema sharding (#661)
levkk Dec 8, 2025
a2b73ef
Multiple fixes (#662)
levkk Dec 9, 2025
6c10b45
feat: add reason for connection closing (#664)
levkk Dec 9, 2025
b74403b
feat: support target_session_attrs (partial) (#665)
levkk Dec 9, 2025
4634a5a
fix: target_session_attrs don't get passed in, use pgdog.role (#666)
levkk Dec 9, 2025
64bf8d0
fix: parameter encoding/decoding & set local (#669)
levkk Dec 10, 2025
22b367d
feat: log startup parameters in debug mode (#670)
levkk Dec 10, 2025
fdd8a9b
chore: add connect reason (#672)
levkk Dec 11, 2025
5ca6630
chore: log pool info on new connection creation (#673)
levkk Dec 11, 2025
cc2e168
Multiple fixes and refactor (#674)
levkk Dec 11, 2025
e191871
v0.1.18
levkk Dec 12, 2025
e90587d
chore: be slightly more defensive when checking if the pool is full (…
samaross Dec 12, 2025
6177475
fix: correctly quote empty parameter values (#678)
levkk Dec 14, 2025
633ee6c
fix: respect prepared_statements setting (#679)
levkk Dec 14, 2025
301785b
fix: parameter json encoding (#681)
levkk Dec 15, 2025
cc3a865
Mark protocol state in Error when out of sync detected (#668)
jbielick Dec 15, 2025
3488eb3
Recompute the parameters hash when the params are cleared (#682)
LexVar Dec 16, 2025
1436d34
Rewrite engine 3.0 (#676)
levkk Dec 18, 2025
afec4c2
chore: add param reset test & tag release (#683)
levkk Dec 18, 2025
946d078
fix: handle SET after query inside transaction correctly with schema …
levkk Dec 18, 2025
3f25037
v0.1.20
levkk Dec 19, 2025
5b9815b
fix: SET TRANSACTION was captured as a session parameter (#686)
levkk Dec 19, 2025
ddb06a7
fix: save SET parameter after a regular query inside transaction (#687)
levkk Dec 19, 2025
b4534c5
chore: add required tools via mise (#648)
mijoharas Dec 19, 2025
8693e23
Create SECURITY.md
levkk Dec 23, 2025
a8f7eba
multi: sharding key update improvements + bug fixes (#688)
levkk Dec 24, 2025
8735017
fix: handle expressions in shard key UPDATE statements (#692)
levkk Dec 24, 2025
983dd59
feat: make query parser optional for load balancing (#693)
levkk Dec 25, 2025
fd19aec
v0.1.21 (#694)
levkk Dec 25, 2025
71d3825
feat: client_idle_in_transaction_timeout (#696) (#697)
levkk Dec 30, 2025
341192e
fix: escape parameter values in SET queries (#698)
levkk Dec 31, 2025
562d3fc
feat: query parser backend without protobuf in pg_query (#699)
levkk Jan 2, 2026
dc2a703
v0.1.22 (#700)
levkk Jan 2, 2026
dbed379
fix: SET pgdog.sharding_key was ignoring schema sharding (#701)
levkk Jan 6, 2026
a595355
fix: least active connections was doing the opposite (#703)
levkk Jan 7, 2026
4eeb893
v0.1.23 (#704)
levkk Jan 8, 2026
4ec6d0f
fix: ErrorResponse re-used for interpreting NoticeResponse (#705)
levkk Jan 9, 2026
df1b32b
test: add NotificationResponse regression test (#706)
levkk Jan 9, 2026
d2fb4a9
fix: ensure config is TOML-serializable (#707)
levkk Jan 9, 2026
7ac3aad
fix: fix idle in transaction timeout test (#708)
levkk Jan 10, 2026
2790847
chore: add PartialEq to config (#710)
levkk Jan 13, 2026
a0f9f51
fix: prepared statements eviction CPU churn (#712)
levkk Jan 15, 2026
ceb79ec
Update readme (#713)
levkk Jan 16, 2026
61a5ad0
fix: update readme
levkk Jan 16, 2026
79d0d1b
More readme updates (#715)
levkk Jan 16, 2026
47857c3
fix: README, move monitoring section up one block
levkk Jan 17, 2026
39997b5
feat: add query_cache_parse_time metric (#716)
levkk Jan 17, 2026
089c06a
chore: remove unnecessary error enum variants and dependencies
levkk Jan 17, 2026
0eeeb52
refactor: move pool stats into its own crate too (#717)
levkk Jan 17, 2026
9c7886e
detect and retry admin-terminated connections during healthcheck (#718)
zacharyftw Jan 19, 2026
707f9a8
refactor: move client and server stats into pgdog-stats (#719)
levkk Jan 20, 2026
cfddc8f
fix: detect and handle pg_dump end of input COPY marker (#720)
levkk Jan 20, 2026
f0c1413
fix: handle null sharding key in COPY parser (#721)
levkk Jan 20, 2026
3dabbf7
fix: shard key updater didn't disconnect servers, causing routing con…
levkk Jan 21, 2026
434756d
feat: omnishard system catalogs by default (#723)
levkk Jan 21, 2026
5b95b6a
Default to omni (#725)
levkk Jan 22, 2026
06bb38d
Remove pgdog.unique_id() from Postgres. Add default sticky routing fo…
levkk Jan 23, 2026
600e9c2
feat: track server last sent/received (#728)
levkk Jan 23, 2026
b242c86
Users with multiple databases (#729)
levkk Jan 25, 2026
2636533
Handle INSERT ... SELECT for one row (#730)
levkk Jan 25, 2026
6ce67dc
feat: INSERT without column names, generated PRIMARY KEY in INSERTs (…
levkk Jan 26, 2026
c139395
feat: read/write pool stats (#732)
levkk Jan 28, 2026
7a55779
chore: EE hooks for the query parser (#733)
levkk Jan 28, 2026
349a767
feat: rewrite int to bigint if its a primary key during schema sync (…
levkk Jan 29, 2026
219d212
feat: system catalogs tweaks, feat: migrate FKs to bigint too (#735)
levkk Jan 29, 2026
267fb00
v0.1.27
levkk Jan 30, 2026
96ee4b6
Create initial comment removal function
Jan 30, 2026
3488d3f
Create initial comment removal function
dev-lew Jan 30, 2026
b0e92ca
fix: correctly handle integer -> bigint conversion (#736)
levkk Jan 31, 2026
7b1b73b
fix: averages reads writes (#737)
levkk Jan 31, 2026
f58258c
Change the implementation for remove_comments
Jan 31, 2026
28d2e9c
Change the implementation for remove_comments
dev-lew Jan 31, 2026
8f0000e
Merge remote-tracking branch 'upstream' into dev-lew/Remove-query-com…
Jan 31, 2026
435c11a
Merge remote-tracking branch 'upstream' into dev-lew/Remove-query-com…
dev-lew Jan 31, 2026
9b5a0bc
Rename variable for clarity
Jan 31, 2026
657ed99
Rename variable for clarity
dev-lew Jan 31, 2026
4e4a9ef
feat: make resharding copy format configurable (#739)
levkk Feb 2, 2026
371f752
fix: make sure child tables inherit parent table bigint type conversi…
levkk Feb 2, 2026
4e5c4c1
feat: add timestamp/timestamptz max support (#743)
levkk Feb 3, 2026
407fa83
fix: parsing composite types that cross a CopyData boundary (#744)
levkk Feb 3, 2026
d4dbe41
Upload untested except version
Feb 3, 2026
d604aab
Upload untested except version
dev-lew Feb 3, 2026
0319387
Simplify removal code
Feb 4, 2026
d546bbd
Simplify removal code
dev-lew Feb 4, 2026
212e143
Preserve non token characters
Feb 4, 2026
60daf49
Preserve non token characters
dev-lew Feb 4, 2026
11b76c9
fix: confusing tls connection indicator (#747)
bzp2010 Feb 4, 2026
d8f7440
feat: automatically reload config after ddl change in a sharded clust…
levkk Feb 4, 2026
1ace2e8
Merge remote-tracking branch 'upstream' into dev-lew/Remove-query-com…
Feb 4, 2026
b82090c
Merge remote-tracking branch 'upstream' into dev-lew/Remove-query-com…
dev-lew Feb 4, 2026
f80d1e7
Add retry logic in cache_impl.rs
Feb 4, 2026
b147671
Add retry logic in cache_impl.rs
dev-lew Feb 4, 2026
543820a
fix: omnishard fanout should be opaque (#752)
levkk Feb 5, 2026
d79461e
feat: omnisharded > sharded in config (#753)
levkk Feb 5, 2026
c6e0cf2
feat: default routing for list-based sharding (#754)
levkk Feb 5, 2026
4229378
fix: apply query_timeout to entire client/server exhange (#755)
levkk Feb 5, 2026
fba1523
v0.1.28 (#756)
levkk Feb 5, 2026
9860d64
feat: current settings exposed as metrics (#724) (#740)
Adi-Goll Feb 5, 2026
1972f1d
feat: implement cross-shard LIMIT (but not OFFSET, yet) (#757)
levkk Feb 6, 2026
fe745e1
Refactor according to comments
dev-lew Feb 7, 2026
f015a38
Refactor according to comments
dev-lew Feb 7, 2026
22c7453
Update some tests to use the new function
dev-lew Feb 9, 2026
b7cfef1
Update some tests to use the new function
dev-lew Feb 9, 2026
a5abacc
Remove random import
dev-lew Feb 9, 2026
17b9938
Remove random import
dev-lew Feb 9, 2026
6d4e812
Regexes no longer have to be public
dev-lew Feb 9, 2026
04bd1fe
Regexes no longer have to be public
dev-lew Feb 9, 2026
b039fee
fix: race condition with Sequelize, feat: support multiple SET statem…
levkk Feb 10, 2026
4680911
chore: prisma, sequelize tests, fix: close connections that haven't f…
levkk Feb 10, 2026
0995ef2
fix: handle PortalSuspended correctly (#763)
levkk Feb 11, 2026
db54e28
fix: put Sync into its own ClientRequest when spliced, feat: add clie…
levkk Feb 11, 2026
02efcaa
Implement ordering optimization
dev-lew Feb 11, 2026
fc5a5a2
Implement ordering optimization
dev-lew Feb 11, 2026
17f5c9f
v0.1.29
levkk Feb 12, 2026
5aedb11
feat: make schema serializable, add EE hook for when schema changes (…
levkk Feb 12, 2026
718da21
chore: add Hash, PartialEq to Schema (#767)
levkk Feb 12, 2026
61782e5
feat: add fk constraints to schema (#768)
levkk Feb 13, 2026
0f9a615
Update test suite
dev-lew Feb 14, 2026
f5074a1
Update test suite
dev-lew Feb 14, 2026
62202e3
Merge branch 'pgdogdev:main' into dev-lew/Remove-query-comments-#560
dev-lew Feb 14, 2026
f348714
Merge branch 'pgdogdev:main' into dev-lew/Remove-query-comments-#560
dev-lew Feb 14, 2026
bc0a07a
Remove duplicate function
dev-lew Feb 14, 2026
dea2f3b
Remove duplicate function
dev-lew Feb 14, 2026
b5c5149
Merge branch 'dev-lew/Remove-query-comments-#560' of github.com:dev-l…
dev-lew Feb 14, 2026
eb6166c
Merge branch 'dev-lew/Remove-query-comments-#560' of github.com:dev-l…
dev-lew Feb 14, 2026
c5f8bd3
Ensure cache key is a valid SQL query
dev-lew Feb 16, 2026
85a7c75
Ensure cache key is a valid SQL query
dev-lew Feb 16, 2026
787ae1e
Merge branch 'dev-lew/Remove-query-comments-#560' of github.com:dev-l…
dev-lew Feb 18, 2026
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
11 changes: 7 additions & 4 deletions pgdog/src/frontend/router/parser/cache/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@ use std::{collections::HashSet, ops::Deref};
use parking_lot::Mutex;
use std::sync::Arc;

use super::super::{
comment::comment, Error, Route, Shard, StatementRewrite, StatementRewriteContext, Table,
};
use super::super::{Error, Route, Shard, StatementRewrite, StatementRewriteContext, Table};
use super::{Fingerprint, Stats};
use crate::backend::schema::Schema;
use crate::frontend::router::parser::rewrite::statement::RewritePlan;
Expand Down Expand Up @@ -72,6 +70,8 @@ impl Ast {
schema: &ShardingSchema,
db_schema: &Schema,
prepared_statements: &mut PreparedStatements,
comment_shard: Option<Shard>,
comment_role: Option<Role>,
user: &str,
search_path: Option<&ParameterValue>,
) -> Result<Self, Error> {
Expand All @@ -81,7 +81,6 @@ impl Ast {
QueryParserEngine::PgQueryRaw => parse_raw(query),
}
.map_err(Error::PgQuery)?;
let (comment_shard, comment_role) = comment(query, schema)?;
let fingerprint =
Fingerprint::new(query, schema.query_parser_engine).map_err(Error::PgQuery)?;

Expand Down Expand Up @@ -125,12 +124,16 @@ impl Ast {
query: &BufferedQuery,
ctx: &super::AstContext<'_>,
prepared_statements: &mut PreparedStatements,
shard: Option<Shard>,
role: Option<Role>,
) -> Result<Self, Error> {
Self::new(
query,
&ctx.sharding_schema,
&ctx.db_schema,
prepared_statements,
shard,
role,
ctx.user,
ctx.search_path,
)
Expand Down
41 changes: 38 additions & 3 deletions pgdog/src/frontend/router/parser/cache/cache_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use lru::LruCache;
use once_cell::sync::Lazy;
use pg_query::normalize;
use pgdog_config::QueryParserEngine;
use std::borrow::Cow;
use std::collections::HashMap;
use std::time::Duration;

Expand All @@ -11,6 +12,7 @@ use tracing::debug;

use super::super::{Error, Route};
use super::{Ast, AstContext};
use crate::frontend::router::parser::comment;
use crate::frontend::{BufferedQuery, PreparedStatements};

static CACHE: Lazy<Cache> = Lazy::new(Cache::new);
Expand Down Expand Up @@ -97,6 +99,10 @@ impl Cache {
/// Parse a statement by either getting it from cache
/// or using pg_query parser.
///
/// In the event of cache miss, we retry after removing all comments except
/// for pgdog metadata. We retain it for correctness, since a query with
/// that metadata must not map to an identical query without it.
///
/// N.B. There is a race here that allows multiple threads to
/// parse the same query. That's better imo than locking the data structure
/// while we parse the query.
Expand All @@ -118,12 +124,38 @@ impl Cache {
}
}

let (maybe_shard, maybe_role, maybe_filtered_query) =
comment::parse_comment(&query, &ctx.sharding_schema)?;

let query_to_cache: Cow<'_, str>;

if let Some(filtered_query) = maybe_filtered_query {
query_to_cache = Cow::Owned(filtered_query);

// Check cache again after removing comments from query
let mut guard = self.inner.lock();

let ast = guard.queries.get_mut(&*query_to_cache).map(|entry| {
entry.stats.lock().hits += 1;
entry.clone()
});

if let Some(ast) = ast {
guard.stats.hits += 1;
return Ok(ast);
}
} else {
query_to_cache = Cow::Borrowed(query.query());
}

// Parse query without holding lock.
let entry = Ast::with_context(query, ctx, prepared_statements)?;
let entry = Ast::with_context(query, ctx, prepared_statements, maybe_shard, maybe_role)?;
let parse_time = entry.stats.lock().parse_time;

let mut guard = self.inner.lock();
guard.queries.put(query.query().to_string(), entry.clone());
guard
.queries
.put(query_to_cache.into_owned(), entry.clone());
guard.stats.misses += 1;
guard.stats.parse_time += parse_time;

Expand All @@ -138,7 +170,10 @@ impl Cache {
ctx: &AstContext<'_>,
prepared_statements: &mut PreparedStatements,
) -> Result<Ast, Error> {
let mut entry = Ast::with_context(query, ctx, prepared_statements)?;
let (maybe_shard, maybe_role, _) = comment::parse_comment(&query, &ctx.sharding_schema)?;

let mut entry =
Ast::with_context(query, ctx, prepared_statements, maybe_shard, maybe_role)?;
entry.cached = false;

let parse_time = entry.stats.lock().parse_time;
Expand Down
2 changes: 1 addition & 1 deletion pgdog/src/frontend/router/parser/cache/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ fn test_tables_list() {
"DELETE FROM private_schema.test",
"DROP TABLE private_schema.test",
] {
let ast = Ast::new(&BufferedQuery::Query(Query::new(q)), &ShardingSchema::default(), &db_schema, &mut prepared_statements, "", None).unwrap();
let ast = Ast::new(&BufferedQuery::Query(Query::new(q)), &ShardingSchema::default(), &db_schema, &mut prepared_statements, None, None, "", None).unwrap();
let tables = ast.tables();
println!("{:?}", tables);
}
Expand Down
Loading